ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
488 lines • 46.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { DateModels } from '../date/DataTypes';
import { formatDate } from '../util';
import defaultLocale from '../locale/zh_CN';
/**
* @record
*/
export function DatepickerStateType() { }
if (false) {
/** @type {?} */
DatepickerStateType.prototype.months;
}
var CalendarDatePickerBaseComponent = /** @class */ (function () {
function CalendarDatePickerBaseComponent() {
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 = (/**
* @param {?=} date
* @return {?}
*/
function (date) {
if (!date) {
return 0;
}
return +new Date(date.getFullYear(), date.getMonth(), date.getDate());
});
this.genWeekData = (/**
* @param {?} firstDate
* @return {?}
*/
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: DateModels.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 = (/**
* @param {?} startDate
* @param {?=} endDate
* @param {?=} clear
* @return {?}
*/
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((/**
* @param {?} m
* @return {?}
*/
function (m) {
return m.firstDate >= startMonthDate && m.firstDate <= endMonthDate;
}))
.forEach((/**
* @param {?} m
* @return {?}
*/
function (m) {
m.weeks.forEach((/**
* @param {?} w
* @return {?}
*/
function (w) {
return w
.filter((/**
* @param {?} d
* @return {?}
*/
function (d) {
if (!endDateTick) {
return d.tick && _this.inDate(startDateTick, d.tick);
}
else {
return d.tick && d.tick >= startDateTick && d.tick <= endDateTick;
}
}))
.forEach((/**
* @param {?} d
* @return {?}
*/
function (d) {
/** @type {?} */
var oldValue = d.selected;
if (clear) {
d.selected = DateModels.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 = DateModels.SelectType.Single;
}
else if (!endDateTick) {
d.selected = DateModels.SelectType.Only;
}
else if (startDateTick !== endDateTick) {
d.selected = DateModels.SelectType.Start;
}
else {
d.selected = DateModels.SelectType.All;
}
}
else if (_this.inDate(endDateTick, d.tick)) {
d.selected = DateModels.SelectType.End;
}
else {
d.selected = DateModels.SelectType.Middle;
}
}
needUpdate = needUpdate || d.selected !== oldValue;
}));
}));
if (needUpdate && m.componentRef) {
m.componentRef.updateWeeks();
}
}));
if (unuseable.length > 0) {
if (onSelectHasDisableDate) {
onSelectHasDisableDate(unuseable.map((/**
* @param {?} tick
* @return {?}
*/
function (tick) { return new Date(tick); })));
}
else {
console.warn('Unusable date. You can handle by onSelectHasDisableDate.', unuseable);
}
}
});
this.computeVisible = (/**
* @param {?} clientHeight
* @param {?} scrollTop
* @return {?}
*/
function (clientHeight, scrollTop) {
/** @type {?} */
var needUpdate = false;
/** @type {?} */
var MAX_VIEW_PORT = clientHeight * 2;
/** @type {?} */
var MIN_VIEW_PORT = clientHeight;
// 大缓冲区外过滤规则
/** @type {?} */
var filterFunc = (/**
* @param {?} vm
* @return {?}
*/
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((/**
* @param {?} a
* @param {?} b
* @return {?}
*/
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 {
if (_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 = (/**
* @return {?}
*/
function () {
// let timer: any;
/** @type {?} */
var clientHeight = 0;
/** @type {?} */
var scrollTop = 0;
return (/**
* @param {?} data
* @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 = (/**
* @param {?} day
* @return {?}
*/
function (day) {
if (!day.tick) {
return;
}
if (_this.props.onCellClick) {
_this.props.onCellClick(new Date(day.tick));
}
});
}
/**
* @return {?}
*/
CalendarDatePickerBaseComponent.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++) {
if (this.canLoadNext()) {
this.genMonthData(defaultDate, i);
}
}
this.visibleMonth = tslib_1.__spread(this.state.months);
};
/**
* @param {?} oldValue
* @param {?} newValue
* @return {?}
*/
CalendarDatePickerBaseComponent.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 {?}
*/
CalendarDatePickerBaseComponent.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 {?}
*/
CalendarDatePickerBaseComponent.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 {?}
*/
CalendarDatePickerBaseComponent.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 {?}
*/
CalendarDatePickerBaseComponent.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 {?}
*/
CalendarDatePickerBaseComponent.prototype.inDate = /**
* @param {?} date
* @param {?} tick
* @return {?}
*/
function (date, tick) {
return date <= tick && tick < date + 24 * 3600000;
};
return CalendarDatePickerBaseComponent;
}());
export { CalendarDatePickerBaseComponent };
if (false) {
/** @type {?} */
CalendarDatePickerBaseComponent.prototype.props;
/** @type {?} */
CalendarDatePickerBaseComponent.prototype.state;
/** @type {?} */
CalendarDatePickerBaseComponent.prototype.visibleMonth;
/** @type {?} */
CalendarDatePickerBaseComponent.prototype.genMonthComponent;
/** @type {?} */
CalendarDatePickerBaseComponent.prototype.getDateWithoutTime;
/** @type {?} */
CalendarDatePickerBaseComponent.prototype.genWeekData;
/** @type {?} */
CalendarDatePickerBaseComponent.prototype.selectDateRange;
/** @type {?} */
CalendarDatePickerBaseComponent.prototype.computeVisible;
/** @type {?} */
CalendarDatePickerBaseComponent.prototype.createOnScroll;
/** @type {?} */
CalendarDatePickerBaseComponent.prototype.baseOnCellClick;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5iYXNlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlLyIsInNvdXJjZXMiOlsiY2FsZW5kYXIvZGF0ZXBpY2tlci9kYXRlcGlja2VyLmJhc2UuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDckMsT0FBTyxhQUFhLE1BQU0saUJBQWlCLENBQUM7Ozs7QUFFNUMseUNBRUM7OztJQURDLHFDQUErQjs7QUFHakM7SUFpQkU7UUFBQSxpQkFBZ0I7UUFoQmhCLFVBQUssR0FBRyxtQkFBQTtZQUNOLFNBQVMsRUFBRSxjQUFjO1lBQ3pCLFFBQVEsRUFBRSxLQUFLO1lBQ2YsV0FBVyxFQUFFLEtBQUs7WUFDbEIsV0FBVyxFQUFFLElBQUksSUFBSSxFQUFFO1lBQ3ZCLFlBQVksRUFBRSxDQUFDO1lBQ2YsTUFBTSxFQUFFLGFBQWE7U0FDdEIsRUFBdUIsQ0FBQztRQUV6QixVQUFLLEdBQVE7WUFDWCxNQUFNLEVBQUUsRUFBRTtTQUNYLENBQUM7UUFFRixpQkFBWSxHQUEyQixFQUFFLENBQUM7UUF1RDFDLHVCQUFrQjs7OztRQUFHLFVBQUMsSUFBVztZQUMvQixJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNULE9BQU8sQ0FBQyxDQUFDO2FBQ1Y7WUFDRCxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN4RSxDQUFDLEVBQUE7UUFFRCxnQkFBVzs7OztRQUFHLFVBQUMsU0FBZTs7Z0JBQ3RCLFdBQVcsR0FBRyxLQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSSxDQUFDLEtBQUssQ0FBQyxP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QUFLLE9BQUE7U0FDTixFQUF3QjtRQUN6QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QyxJQUFJLFFBQVEsSUFBSSxDQUFDLEVBQUU7WUFDakIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzlCO2FBQU07WUFDTCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDakM7UUFDSyxJQUFBLGVBQW1DLEVBQWpDLHdCQUFTLEVBQUUsb0JBQXNCO1FBQ3pDLElBQUksU0FBUyxFQUFFO1lBQ2IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDMUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Ozs7OztJQUVELGdEQUFNOzs7OztJQUFOLFVBQU8sSUFBWSxFQUFFLElBQVk7UUFDL0IsT0FBTyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUNwRCxDQUFDO0lBZ0tILHNDQUFDO0FBQUQsQ0FBQyxBQWpURCxJQWlUQzs7OztJQWhUQyxnREFPeUI7O0lBRXpCLGdEQUVFOztJQUVGLHVEQUEwQzs7SUFDMUMsNERBQWdDOztJQXNEaEMsNkRBS0M7O0lBRUQsc0RBbUNDOztJQW9DRCwwREFvRUM7O0lBRUQseURBa0RDOztJQUVELHlEQTBCQzs7SUFFRCwwREFPQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGVNb2RlbHMgfSBmcm9tICcuLi9kYXRlL0RhdGFUeXBlcyc7XG5pbXBvcnQgeyBEYXRlcGlja2VyUHJvcHNUeXBlIH0gZnJvbSAnLi9kYXRlcGlja2VyLnByb3BzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBmb3JtYXREYXRlIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgZGVmYXVsdExvY2FsZSBmcm9tICcuLi9sb2NhbGUvemhfQ04nO1xuXG5leHBvcnQgaW50ZXJmYWNlIERhdGVwaWNrZXJTdGF0ZVR5cGUge1xuICBtb250aHM6IERhdGVNb2RlbHMuTW9udGhEYXRhW107XG59XG5cbmV4cG9ydCBjbGFzcyBDYWxlbmRhckRhdGVQaWNrZXJCYXNlQ29tcG9uZW50IHtcbiAgcHJvcHMgPSB7XG4gICAgcHJlZml4Q2xzOiAncm1jLWNhbGVuZGFyJyxcbiAgICBpbmZpbml0ZTogZmFsc2UsXG4gICAgaW5maW5pdGVPcHQ6IGZhbHNlLFxuICAgIGRlZmF1bHREYXRlOiBuZXcgRGF0ZSgpLFxuICAgIGluaXRhbE1vbnRoczogNixcbiAgICBsb2NhbGU6IGRlZmF1bHRMb2NhbGVcbiAgfSBhcyBEYXRlcGlja2VyUHJvcHNUeXBlO1xuXG4gIHN0YXRlOiBhbnkgPSB7XG4gICAgbW9udGhzOiBbXVxuICB9O1xuXG4gIHZpc2libGVNb250aDogRGF0ZU1vZGVscy5Nb250aERhdGFbXSA9IFtdO1xuICBnZW5Nb250aENvbXBvbmVudDogKGRhdGEpID0+IHt9O1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBpbml0KCkge1xuICAgIGNvbnN0IHsgaW5pdGFsTW9udGhzID0gNiwgZGVmYXVsdERhdGUgfSA9IHRoaXMucHJvcHM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbml0YWxNb250aHM7IGkrKykge1xuICAgICAgaWYgKHRoaXMuY2FuTG9hZE5leHQoKSkge1xuICAgICAgICB0aGlzLmdlbk1vbnRoRGF0YShkZWZhdWx0RGF0ZSwgaSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMudmlzaWJsZU1vbnRoID0gWy4uLnRoaXMuc3RhdGUubW9udGhzXTtcbiAgfVxuXG4gIHJlY2VpdmVQcm9wcyhvbGRWYWx1ZTogRGF0ZXBpY2tlclByb3BzVHlwZSwgbmV3VmFsdWU6IERhdGVwaWNrZXJQcm9wc1R5cGUpIHtcbiAgICBpZiAob2xkVmFsdWUgJiYgbmV3VmFsdWUpIHtcbiAgICAgIGlmIChvbGRWYWx1ZS5zdGFydERhdGUgIT09IG5ld1ZhbHVlLnN0YXJ0RGF0ZSB8fCBvbGRWYWx1ZS5lbmREYXRlICE9PSBuZXdWYWx1ZS5lbmREYXRlKSB7XG4gICAgICAgIGlmIChvbGRWYWx1ZS5zdGFydERhdGUpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdERhdGVSYW5nZShvbGRWYWx1ZS5zdGFydERhdGUsIG9sZFZhbHVlLmVuZERhdGUsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXdWYWx1ZS5zdGFydERhdGUpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdERhdGVSYW5nZShuZXdWYWx1ZS5zdGFydERhdGUsIG5ld1ZhbHVlLmVuZERhdGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0TW9udGhEYXRlKGRhdGUgPSBuZXcgRGF0ZSgpLCBhZGRNb250aCA9IDApIHtcbiAgICBjb25zdCB5ID0gZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgbSA9IGRhdGUuZ2V0TW9udGgoKTtcbiAgICByZXR1cm4ge1xuICAgICAgZmlyc3REYXRlOiBuZXcgRGF0ZSh5LCBtICsgYWRkTW9udGgsIDEpLFxuICAgICAgbGFzdERhdGU6IG5ldyBEYXRlKHksIG0gKyAxICsgYWRkTW9udGgsIDApXG4gICAgfTtcbiAgfVxuXG4gIGNhbkxvYWRQcmV2KCkge1xuICAgIGNvbnN0IHsgbWluRGF0ZSB9ID0gdGhpcy5wcm9wcztcbiAgICByZXR1cm4gKFxuICAgICAgIW1pbkRhdGUgfHxcbiAgICAgIHRoaXMuc3RhdGUubW9udGhzLmxlbmd0aCA8PSAwIHx8XG4gICAgICArdGhpcy5nZXRNb250aERhdGUobWluRGF0ZSkuZmlyc3REYXRlIDwgK3RoaXMuc3RhdGUubW9udGhzWzBdLmZpcnN0RGF0ZVxuICAgICk7XG4gIH1cblxuICBjYW5Mb2FkTmV4dCgpIHtcbiAgICBjb25zdCB7IG1heERhdGUgfSA9IHRoaXMucHJvcHM7XG4gICAgcmV0dXJuIChcbiAgICAgICFtYXhEYXRlIHx8XG4gICAgICB0aGlzLnN0YXRlLm1vbnRocy5sZW5ndGggPD0gMCB8fFxuICAgICAgK3RoaXMuZ2V0TW9udGhEYXRlKG1heERhdGUpLmZpcnN0RGF0ZSA+ICt0aGlzLnN0YXRlLm1vbnRoc1t0aGlzLnN0YXRlLm1vbnRocy5sZW5ndGggLSAxXS5maXJzdERhdGVcbiAgICApO1xuICB9XG5cbiAgZ2V0RGF0ZVdpdGhvdXRUaW1lID0gKGRhdGU/OiBEYXRlKSA9PiB7XG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgcmV0dXJuICtuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF0ZS5nZXREYXRlKCkpO1xuICB9XG5cbiAgZ2VuV2Vla0RhdGEgPSAoZmlyc3REYXRlOiBEYXRlKSA9PiB7XG4gICAgY29uc3QgbWluRGF0ZVRpbWUgPSB0aGlzLmdldERhdGVXaXRob3V0VGltZSh0aGlzLnByb3BzLm1pbkRhdGUpO1xuICAgIGNvbnN0IG1heERhdGVUaW1lID0gdGhpcy5nZXREYXRlV2l0aG91dFRpbWUodGhpcy5wcm9wcy5tYXhEYXRlKSB8fCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG5cbiAgICBjb25zdCB3ZWVrczogRGF0ZU1vZGVscy5DZWxsRGF0YVtdW10gPSBbXTtcbiAgICBjb25zdCBuZXh0TW9udGggPSB0aGlzLmdldE1vbnRoRGF0ZShmaXJzdERhdGUsIDEpLmZpcnN0RGF0ZTtcbiAgICBsZXQgY3VycmVudERheSA9IGZpcnN0RGF0ZTtcbiAgICBsZXQgY3VycmVudFdlZWs6IERhdGVNb2RlbHMuQ2VsbERhdGFbXSA9IFtdO1xuICAgIHdlZWtzLnB1c2goY3VycmVudFdlZWspO1xuXG4gICAgbGV0IHN0YXJ0V2Vla2RheSA9IGN1cnJlbnREYXkuZ2V0RGF5KCk7XG4gICAgaWYgKHN0YXJ0V2Vla2RheSA+IDApIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhcnRXZWVrZGF5OyBpKyspIHtcbiAgICAgICAgY3VycmVudFdlZWsucHVzaCh7fSBhcyBEYXRlTW9kZWxzLkNlbGxEYXRhKTtcbiAgICAgIH1cbiAgICB9XG4gICAgd2hpbGUgKGN1cnJlbnREYXkgPCBuZXh0TW9udGgpIHtcbiAgICAgIGlmIChjdXJyZW50V2Vlay5sZW5ndGggPT09IDcpIHtcbiAgICAgICAgY3VycmVudFdlZWsgPSBbXTtcbiAgICAgICAgd2Vla3MucHVzaChjdXJyZW50V2Vlayk7XG4gICAgICB9XG4gICAgICBjb25zdCBkYXlPZk1vbnRoID0gY3VycmVudERheS5nZXREYXRlKCk7XG4gICAgICBjb25zdCB0aWNrID0gK2N1cnJlbnREYXk7XG4gICAgICBjdXJyZW50V2Vlay5wdXNoKHtcbiAgICAgICAgdGljayxcbiAgICAgICAgZGF5T2ZNb250aCxcbiAgICAgICAgc2VsZWN0ZWQ6IERhdGVNb2RlbHMuU2VsZWN0VHlwZS5Ob25lLFxuICAgICAgICBpc0ZpcnN0T2ZNb250aDogZGF5T2ZNb250aCA9PT0gMSxcbiAgICAgICAgaXNMYXN0T2ZNb250aDogZmFsc2UsXG4gICAgICAgIG91dE9mRGF0ZTogdGljayA8IG1pbkRhdGVUaW1lIHx8IHRpY2sgPiBtYXhEYXRlVGltZVxuICAgICAgfSk7XG4gICAgICBjdXJyZW50RGF5ID0gbmV3IERhdGUoY3VycmVudERheS5nZXRUaW1lKCkgKyAzNjAwICogMjQgKiAxMDAwKTtcbiAgICB9XG4gICAgY3VycmVudFdlZWtbY3VycmVudFdlZWsubGVuZ3RoIC0gMV0uaXNMYXN0T2ZNb250aCA9IHRydWU7XG4gICAgcmV0dXJuIHdlZWtzO1xuICB9XG5cbiAgZ2VuTW9udGhEYXRhKGRhdGU/OiBEYXRlLCBhZGRNb250aDogbnVtYmVyID0gMCkge1xuICAgIGlmICghZGF0ZSkge1xuICAgICAgZGF0ZSA9IGFkZE1vbnRoID49IDAgPyB0aGlzLnN0YXRlLm1vbnRoc1t0aGlzLnN0YXRlLm1vbnRocy5sZW5ndGggLSAxXS5maXJzdERhdGUgOiB0aGlzLnN0YXRlLm1vbnRoc1swXS5maXJzdERhdGU7XG4gICAgfVxuICAgIGlmICghZGF0ZSkge1xuICAgICAgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgfVxuICAgIGNvbnN0IHsgbG9jYWxlIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHsgZmlyc3REYXRlLCBsYXN0RGF0ZSB9ID0gdGhpcy5nZXRNb250aERhdGUoZGF0ZSwgYWRkTW9udGgpO1xuICAgIGNvbnN0IHdlZWtzID0gdGhpcy5nZW5XZWVrRGF0YShmaXJzdERhdGUpO1xuICAgIGNvbnN0IHRpdGxlID0gZm9ybWF0RGF0ZShmaXJzdERhdGUsIGxvY2FsZSA/IGxvY2FsZS5tb250aFRpdGxlIDogJ3l5eXkvTU0nLCB0aGlzLnByb3BzLmxvY2FsZSk7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIHRpdGxlLFxuICAgICAgZmlyc3REYXRlLFxuICAgICAgbGFzdERhdGUsXG4gICAgICB3ZWVrc1xuICAgIH0gYXMgRGF0ZU1vZGVscy5Nb250aERhdGE7XG4gICAgZGF0YS5jb21wb25lbnQgPSB0aGlzLmdlbk1vbnRoQ29tcG9uZW50KGRhdGEpO1xuICAgIGlmIChhZGRNb250aCA+PSAwKSB7XG4gICAgICB0aGlzLnN0YXRlLm1vbnRocy5wdXNoKGRhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YXRlLm1vbnRocy51bnNoaWZ0KGRhdGEpO1xuICAgIH1cbiAgICBjb25zdCB7IHN0YXJ0RGF0ZSwgZW5kRGF0ZSB9ID0gdGhpcy5wcm9wcztcbiAgICBpZiAoc3RhcnREYXRlKSB7XG4gICAgICB0aGlzLnNlbGVjdERhdGVSYW5nZShzdGFydERhdGUsIGVuZERhdGUpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGluRGF0ZShkYXRlOiBudW1iZXIsIHRpY2s6IG51bWJlcikge1xuICAgIHJldHVybiBkYXRlIDw9IHRpY2sgJiYgdGljayA8IGRhdGUgKyAyNCAqIDM2MDAwMDA7XG4gIH1cblxuICBzZWxlY3REYXRlUmFuZ2UgPSAoc3RhcnREYXRlOiBEYXRlLCBlbmREYXRlPzogRGF0ZSwgY2xlYXIgPSBmYWxzZSkgPT4ge1xuICAgIGNvbnN0IHsgZ2V0RGF0ZUV4dHJhLCB0eXBlLCBvblNlbGVjdEhhc0Rpc2FibGVEYXRlIH0gPSB0aGlzLnByb3BzO1xuICAgIGlmICh0eXBlID09PSAnb25lJykge1xuICAgICAgZW5kRGF0ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgdGltZTEgPSB0aGlzLmdldERhdGVXaXRob3V0VGltZShzdGFydERhdGUpLFxuICAgICAgdGltZTIgPSB0aGlzLmdldERhdGVXaXRob3V0VGltZShlbmREYXRlKTtcbiAgICBjb25zdCBzdGFydERhdGVUaWNrID0gIXRpbWUyIHx8IHRpbWUxIDwgdGltZTIgPyB0aW1lMSA6IHRpbWUyO1xuICAgIGNvbnN0IGVuZERhdGVUaWNrID0gdGltZTIgJiYgdGltZTEgPiB0aW1lMiA/IHRpbWUxIDogdGltZTI7XG5cbiAgICBjb25zdCBzdGFydE1vbnRoRGF0ZSA9IHRoaXMuZ2V0TW9udGhEYXRlKG5ldyBEYXRlKHN0YXJ0RGF0ZVRpY2spKS5maXJzdERhdGU7XG4gICAgY29uc3QgZW5kTW9udGhEYXRlID0gZW5kRGF0ZVRpY2sgPyBuZXcgRGF0ZShlbmREYXRlVGljaykgOiB0aGlzLmdldE1vbnRoRGF0ZShuZXcgRGF0ZShzdGFydERhdGVUaWNrKSkubGFzdERhdGU7XG5cbiAgICBsZXQgdW51c2VhYmxlOiBudW1iZXJbXSA9IFtdLFxuICAgICAgbmVlZFVwZGF0ZSA9IGZhbHNlO1xuICAgIHRoaXMuc3RhdGUubW9udGhzXG4gICAgICAuZmlsdGVyKG0gPT4ge1xuICAgICAgICByZXR1cm4gbS5maXJzdERhdGUgPj0gc3RhcnRNb250aERhdGUgJiYgbS5maXJzdERhdGUgPD0gZW5kTW9udGhEYXRlO1xuICAgICAgfSlcbiAgICAgIC5mb3JFYWNoKG0gPT4ge1xuICAgICAgICBtLndlZWtzLmZvckVhY2godyA9PlxuICAgICAgICAgIHdcbiAgICAgICAgICAgIC5maWx0ZXIoZCA9PiB7XG4gICAgICAgICAgICAgIGlmICghZW5kRGF0ZVRpY2spIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZC50aWNrICYmIHRoaXMuaW5EYXRlKHN0YXJ0RGF0ZVRpY2ssIGQudGljayk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGQudGljayAmJiBkLnRpY2sgPj0gc3RhcnREYXRlVGljayAmJiBkLnRpY2sgPD0gZW5kRGF0ZVRpY2s7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuZm9yRWFjaChkID0+IHtcbiAgICAgICAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSBkLnNlbGVjdGVkO1xuICAgICAgICAgICAgICBpZiAoY2xlYXIpIHtcbiAgICAgICAgICAgICAgICBkLnNlbGVjdGVkID0gRGF0ZU1vZGVscy5TZWxlY3RUeXBlLk5vbmU7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5mbyA9IChnZXREYXRlRXh0cmEgJiYgZ2V0RGF0ZUV4dHJhKG5ldyBEYXRlKGQudGljaykpKSB8fCB7fTtcbiAgICAgICAgICAgICAgICBpZiAoZC5vdXRPZkRhdGUgfHwgaW5mby5kaXNhYmxlKSB7XG4gICAgICAgICAgICAgICAgICB1bnVzZWFibGUucHVzaChkLnRpY2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbkRhdGUoc3RhcnREYXRlVGljaywgZC50aWNrKSkge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdvbmUnKSB7XG4gICAgICAgICAgICAgICAgICAgIGQuc2VsZWN0ZWQgPSBEYXRlTW9kZWxzLlNlbGVjdFR5cGUuU2luZ2xlO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZW5kRGF0ZVRpY2spIHtcbiAgICAgICAgICAgICAgICAgICAgZC5zZWxlY3RlZCA9IERhdGVNb2RlbHMuU2VsZWN0VHlwZS5Pbmx5O1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFydERhdGVUaWNrICE9PSBlbmREYXRlVGljaykge1xuICAgICAgICAgICAgICAgICAgICBkLnNlbGVjdGVkID0gRGF0ZU1vZGVscy5TZWxlY3RUeXBlLlN0YXJ0O1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZC5zZWxlY3RlZCA9IERhdGVNb2RlbHMuU2VsZWN0VHlwZS5BbGw7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmluRGF0ZShlbmREYXRlVGljaywgZC50aWNrKSkge1xuICAgICAgICAgICAgICAgICAgZC5zZWxlY3RlZCA9IERhdGVNb2RlbHMuU2VsZWN0VHlwZS5FbmQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGQuc2VsZWN0ZWQgPSBEYXRlTW9kZWxzLlNlbGVjdFR5cGUuTWlkZGxlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBuZWVkVXBkYXRlID0gbmVlZFVwZGF0ZSB8fCBkLnNlbGVjdGVkICE9PSBvbGRWYWx1ZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIGlmIChuZWVkVXBkYXRlICYmIG0uY29tcG9uZW50UmVmKSB7XG4gICAgICAgICAgbS5jb21wb25lbnRSZWYudXBkYXRlV2Vla3MoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgaWYgKHVudXNlYWJsZS5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAob25TZWxlY3RIYXNEaXNhYmxlRGF0ZSkge1xuICAgICAgICBvblNlbGVjdEhhc0Rpc2FibGVEYXRlKHVudXNlYWJsZS5tYXAodGljayA9PiBuZXcgRGF0ZSh0aWNrKSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdVbnVzYWJsZSBkYXRlLiBZb3UgY2FuIGhhbmRsZSBieSBvblNlbGVjdEhhc0Rpc2FibGVEYXRlLicsIHVudXNlYWJsZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29tcHV0ZVZpc2libGUgPSAoY2xpZW50SGVpZ2h0OiBudW1iZXIsIHNjcm9sbFRvcDogbnVtYmVyKSA9PiB7XG4gICAgbGV0IG5lZWRVcGRhdGUgPSBmYWxzZTtcbiAgICBjb25zdCBNQVhfVklFV19QT1JUID0gY2xpZW50SGVpZ2h0ICogMjtcbiAgICBjb25zdCBNSU5fVklFV19QT1JUID0gY2xpZW50SGVpZ2h0O1xuXG4gICAgLy8g5aSn57yT5Yay5Yy65aSW6L+H5ruk6KeE5YiZXG4gICAgY29uc3QgZmlsdGVyRnVuYyA9ICh2bTogRGF0ZU1vZGVscy5Nb250aERhdGEpID0+XG4gICAgICB2bS55ICYmXG4gICAgICB2bS5oZWlnaHQgJiZcbiAgICAgICh2bS55ICsgdm0uaGVpZ2h0ID4gc2Nyb2xsVG9wIC0gTUFYX1ZJRVdfUE9SVCAmJiB2bS55IDwgc2Nyb2xsVG9wICsgY2xpZW50SGVpZ2h0ICsgTUFYX1ZJRVdfUE9SVCk7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5pbmZpbml0ZU9wdCAmJiB0aGlzLnZpc2libGVNb250aC5sZW5ndGggPiAxMikge1xuICAgICAgdGhpcy52aXNpYmxlTW9udGggPSB0aGlzLnZpc2libGVNb250aC5maWx0ZXIoZmlsdGVyRnVuYykuc29ydCgoYSwgYikgPT4gK2EuZmlyc3REYXRlIC0gK2IuZmlyc3REYXRlKTtcbiAgICB9XG5cbiAgICAvLyDlvZPlsI/nvJPlhrLljLrkuI3mu6Hml7bloavlhYVcbiAgICBpZiAodGhpcy52aXNpYmxlTW9udGgubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbGFzdCA9IHRoaXMudmlzaWJsZU1vbnRoW3RoaXMudmlzaWJsZU1vbnRoLmxlbmd0aCAtIDFdO1xuICAgICAgaWYgKGxhc3QueSAhPT0gdW5kZWZpbmVkICYmIGxhc3QuaGVpZ2h0ICYmIGxhc3QueSArIGxhc3QuaGVpZ2h0IDwgc2Nyb2xsVG9wICsgY2xpZW50SGVpZ2h0ICsgTUlOX1ZJRVdfUE9SVCkge1xuICAgICAgICBjb25zdCBsYXN0SW5kZXggPSB0aGlzLnN0YXRlLm1vbnRocy5pbmRleE9mKGxhc3QpO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSAyOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IGxhc3RJbmRleCArIGk7XG4gICAgICAgICAgaWYgKGluZGV4IDwgdGhpcy5zdGF0ZS5tb250aHMubGVuZ3RoICYmIHRoaXMudmlzaWJsZU1vbnRoLmluZGV4T2YodGhpcy5zdGF0ZS5tb250aHNbaW5kZXhdKSA8IDApIHtcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZU1vbnRoLnB1c2godGhpcy5zdGF0ZS5tb250aHNbaW5kZXhdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2FuTG9hZE5leHQoKSkge1xuICAgICAgICAgICAgICB0aGlzLmdlbk1vbnRoRGF0YSh1bmRlZmluZWQsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBuZWVkVXBkYXRlID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlyc3QgPSB0aGlzLnZpc2libGVNb250aFswXTtcbiAgICAgIGlmIChmaXJzdC55ICE9PSB1bmRlZmluZWQgJiYgZmlyc3QuaGVpZ2h0ICYmIGZpcnN0LnkgPiBzY3JvbGxUb3AgLSBNSU5fVklFV19QT1JUKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0SW5kZXggPSB0aGlzLnN0YXRlLm1vbnRocy5pbmRleE9mKGZpcnN0KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gMjsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBmaXJzdEluZGV4IC0gaTtcbiAgICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiB0aGlzLnZpc2libGVNb250aC5pbmRleE9mKHRoaXMuc3RhdGUubW9udGhzW2luZGV4XSkgPCAwKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2libGVNb250aC51bnNoaWZ0KHRoaXMuc3RhdGUubW9udGhzW2luZGV4XSk7XG4gICAgICAgICAgICBuZWVkVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUubW9udGhzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudmlzaWJsZU1vbnRoID0gdGhpcy5zdGF0ZS5tb250aHMuZmlsdGVyKGZpbHRlckZ1bmMpO1xuICAgICAgbmVlZFVwZGF0ZSA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5lZWRVcGRhdGU7XG4gIH1cblxuICBjcmVhdGVPblNjcm9sbCA9ICgpID0+IHtcbiAgICAvLyBsZXQgdGltZXI6IGFueTtcbiAgICBsZXQgY2xpZW50SGVpZ2h0ID0gMCxcbiAgICAgIHNjcm9sbFRvcCA9IDA7XG5cbiAgICByZXR1cm4gKGRhdGE6IHsgZnVsbDogbnVtYmVyOyBjbGllbnQ6IG51bWJlcjsgdG9wOiBudW1iZXIgfSkgPT4ge1xuICAgICAgY29uc3QgeyBjbGllbnQsIHRvcCB9ID0gZGF0YTtcbiAgICAgIGNsaWVudEhlaWdodCA9IGNsaWVudDtcbiAgICAgIHNjcm9sbFRvcCA9IHRvcDtcblxuICAgICAgdGhpcy5jb21wdXRlVmlzaWJsZShjbGllbnRIZWlnaHQsIHNjcm9sbFRvcCk7XG5cbiAgICAgIC8vIOS7peS4iuaWueazleebruWJjeaXoOmXrumimO+8jOWmguaenOWQjue7reacieaAp+iDvemXrumimO+8jOaUueeUqOWmguS4i+aWueazle+8jOS9huS7peS4i+aWueazleS8muWvvOiHtOWIt+aWsOeojeW+ruW7tui/n+eOsOixoVxuXG4gICAgICAvLyBpZiAodGltZXIpIHtcbiAgICAgIC8vICAgcmV0dXJuO1xuICAgICAgLy8gfVxuICAgICAgLy9cbiAgICAgIC8vIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAvLyAgIHRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgLy9cbiAgICAgIC8vICAgaWYgKHRoaXMuY29tcHV0ZVZpc2libGUoY2xpZW50SGVpZ2h0LCBzY3JvbGxUb3ApKSB7XG4gICAgICAvLyAgICAgY29uc29sZS5sb2coJ3VwZGF0ZSBkb20nKTtcbiAgICAgIC8vICAgfVxuICAgICAgLy8gfSwgNTApO1xuICAgIH07XG4gIH1cblxuICBiYXNlT25DZWxsQ2xpY2sgPSAoZGF5OiBEYXRlTW9kZWxzLkNlbGxEYXRhKSA9PiB7XG4gICAgaWYgKCFkYXkudGljaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5wcm9wcy5vbkNlbGxDbGljaykge1xuICAgICAgdGhpcy5wcm9wcy5vbkNlbGxDbGljayhuZXcgRGF0ZShkYXkudGljaykpO1xuICAgIH1cbiAgfVxufVxuIl19