angular-weblineindia-date-picker
Version:
Date Picker component built in AngularJS to select date and time. Supports Angular 9 version.
319 lines • 39.7 kB
JavaScript
import { __decorate } from "tslib";
import { ECalendarValue } from '../../types/calendar-value-enum';
import { Injectable } from '@angular/core';
import * as momentNs from 'moment';
import * as i0 from "@angular/core";
var moment = momentNs;
var UtilsService = /** @class */ (function () {
function UtilsService() {
}
UtilsService.debounce = function (func, wait) {
var timeout;
return function () {
var context = this, args = arguments;
timeout = clearTimeout(timeout);
setTimeout(function () {
func.apply(context, args);
}, wait);
};
};
;
UtilsService.prototype.createArray = function (size) {
return new Array(size).fill(1);
};
UtilsService.prototype.convertToMoment = function (date, format) {
if (!date) {
return null;
}
else if (typeof date === 'string') {
return moment(date, format);
}
else {
return date.clone();
}
};
UtilsService.prototype.isDateValid = function (date, format) {
if (date === '') {
return true;
}
return moment(date, format, true).isValid();
};
// todo:: add unit test
UtilsService.prototype.getDefaultDisplayDate = function (current, selected, allowMultiSelect, minDate) {
if (current) {
return current.clone();
}
else if (minDate && minDate.isAfter(moment())) {
return minDate.clone();
}
else if (allowMultiSelect) {
if (selected && selected[selected.length]) {
return selected[selected.length].clone();
}
}
else if (selected && selected[0]) {
return selected[0].clone();
}
return moment();
};
// todo:: add unit test
UtilsService.prototype.getInputType = function (value, allowMultiSelect) {
if (Array.isArray(value)) {
if (!value.length) {
return ECalendarValue.MomentArr;
}
else if (typeof value[0] === 'string') {
return ECalendarValue.StringArr;
}
else if (moment.isMoment(value[0])) {
return ECalendarValue.MomentArr;
}
}
else {
if (typeof value === 'string') {
return ECalendarValue.String;
}
else if (moment.isMoment(value)) {
return ECalendarValue.Moment;
}
}
return allowMultiSelect ? ECalendarValue.MomentArr : ECalendarValue.Moment;
};
// todo:: add unit test
UtilsService.prototype.convertToMomentArray = function (value, config) {
var retVal;
switch (this.getInputType(value, config.allowMultiSelect)) {
case (ECalendarValue.String):
retVal = value ? [moment(value, config.format, true)] : [];
break;
case (ECalendarValue.StringArr):
retVal = value.map(function (v) { return v ? moment(v, config.format, true) : null; }).filter(Boolean);
break;
case (ECalendarValue.Moment):
retVal = value ? [value.clone()] : [];
break;
case (ECalendarValue.MomentArr):
retVal = (value || []).map(function (v) { return v.clone(); });
break;
default:
retVal = [];
}
return retVal;
};
// todo:: add unit test
UtilsService.prototype.convertFromMomentArray = function (format, value, convertTo) {
switch (convertTo) {
case (ECalendarValue.String):
return value[0] && value[0].format(format);
case (ECalendarValue.StringArr):
return value.filter(Boolean).map(function (v) { return v.format(format); });
case (ECalendarValue.Moment):
return value[0] ? value[0].clone() : value[0];
case (ECalendarValue.MomentArr):
return value ? value.map(function (v) { return v.clone(); }) : value;
default:
return value;
}
};
UtilsService.prototype.convertToString = function (value, format) {
var _this = this;
var tmpVal;
if (typeof value === 'string') {
tmpVal = [value];
}
else if (Array.isArray(value)) {
if (value.length) {
tmpVal = value.map(function (v) {
return _this.convertToMoment(v, format).format(format);
});
}
else {
tmpVal = value;
}
}
else if (moment.isMoment(value)) {
tmpVal = [value.format(format)];
}
else {
return '';
}
return tmpVal.filter(Boolean).join(' | ');
};
// todo:: add unit test
UtilsService.prototype.clearUndefined = function (obj) {
if (!obj) {
return obj;
}
Object.keys(obj).forEach(function (key) { return (obj[key] === undefined) && delete obj[key]; });
return obj;
};
UtilsService.prototype.updateSelected = function (isMultiple, currentlySelected, date, granularity) {
if (granularity === void 0) { granularity = 'day'; }
if (isMultiple) {
return !date.selected
? currentlySelected.concat([date.date])
: currentlySelected.filter(function (d) { return !d.isSame(date.date, granularity); });
}
else {
return !date.selected ? [date.date] : [];
}
};
UtilsService.prototype.closestParent = function (element, selector) {
if (!element) {
return undefined;
}
var match = element.querySelector(selector);
return match || this.closestParent(element.parentElement, selector);
};
UtilsService.prototype.onlyTime = function (m) {
return m && moment.isMoment(m) && moment(m.format('HH:mm:ss'), 'HH:mm:ss');
};
UtilsService.prototype.granularityFromType = function (calendarType) {
switch (calendarType) {
case 'time':
return 'second';
case 'daytime':
return 'second';
default:
return calendarType;
}
};
UtilsService.prototype.createValidator = function (_a, format, calendarType) {
var _this = this;
var minDate = _a.minDate, maxDate = _a.maxDate, minTime = _a.minTime, maxTime = _a.maxTime;
var isValid;
var value;
var validators = [];
var granularity = this.granularityFromType(calendarType);
if (minDate) {
var md_1 = this.convertToMoment(minDate, format);
validators.push({
key: 'minDate',
isValid: function () {
var _isValid = value.every(function (val) { return val.isSameOrAfter(md_1, granularity); });
isValid = isValid ? _isValid : false;
return _isValid;
}
});
}
if (maxDate) {
var md_2 = this.convertToMoment(maxDate, format);
validators.push({
key: 'maxDate',
isValid: function () {
var _isValid = value.every(function (val) { return val.isSameOrBefore(md_2, granularity); });
isValid = isValid ? _isValid : false;
return _isValid;
}
});
}
if (minTime) {
var md_3 = this.onlyTime(this.convertToMoment(minTime, format));
validators.push({
key: 'minTime',
isValid: function () {
var _isValid = value.every(function (val) { return _this.onlyTime(val).isSameOrAfter(md_3); });
isValid = isValid ? _isValid : false;
return _isValid;
}
});
}
if (maxTime) {
var md_4 = this.onlyTime(this.convertToMoment(maxTime, format));
validators.push({
key: 'maxTime',
isValid: function () {
var _isValid = value.every(function (val) { return _this.onlyTime(val).isSameOrBefore(md_4); });
isValid = isValid ? _isValid : false;
return _isValid;
}
});
}
return function (inputVal) {
isValid = true;
value = _this.convertToMomentArray(inputVal, {
format: format,
allowMultiSelect: true
}).filter(Boolean);
if (!value.every(function (val) { return val.isValid(); })) {
return {
format: {
given: inputVal
}
};
}
var errors = validators.reduce(function (map, err) {
if (!err.isValid()) {
map[err.key] = {
given: value
};
}
return map;
}, {});
return !isValid ? errors : null;
};
};
UtilsService.prototype.datesStringToStringArray = function (value) {
return (value || '').split('|').map(function (m) { return m.trim(); }).filter(Boolean);
};
UtilsService.prototype.getValidMomentArray = function (value, format) {
var _this = this;
return this.datesStringToStringArray(value)
.filter(function (d) { return _this.isDateValid(d, format); })
.map(function (d) { return moment(d, format); });
};
UtilsService.prototype.shouldShowCurrent = function (showGoToCurrent, mode, min, max) {
return showGoToCurrent &&
mode !== 'time' &&
this.isDateInRange(moment(), min, max);
};
UtilsService.prototype.isDateInRange = function (date, from, to) {
return date.isBetween(from, to, 'day', '[]');
};
UtilsService.prototype.convertPropsToMoment = function (obj, format, props) {
var _this = this;
props.forEach(function (prop) {
if (obj.hasOwnProperty(prop)) {
obj[prop] = _this.convertToMoment(obj[prop], format);
}
});
};
UtilsService.prototype.shouldResetCurrentView = function (prevConf, currentConf) {
if (prevConf && currentConf) {
if (!prevConf.min && currentConf.min) {
return true;
}
else if (prevConf.min && currentConf.min && !prevConf.min.isSame(currentConf.min, 'd')) {
return true;
}
else if (!prevConf.max && currentConf.max) {
return true;
}
else if (prevConf.max && currentConf.max && !prevConf.max.isSame(currentConf.max, 'd')) {
return true;
}
return false;
}
return false;
};
UtilsService.prototype.getNativeElement = function (elem) {
if (!elem) {
return null;
}
else if (typeof elem === 'string') {
return document.querySelector(elem);
}
else {
return elem;
}
};
UtilsService.ɵprov = i0.ɵɵdefineInjectable({ factory: function UtilsService_Factory() { return new UtilsService(); }, token: UtilsService, providedIn: "root" });
UtilsService = __decorate([
Injectable({
providedIn: 'root'
})
], UtilsService);
return UtilsService;
}());
export { UtilsService };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nMi1kYXRlLXBpY2tlci8iLCJzb3VyY2VzIjpbImNvbW1vbi9zZXJ2aWNlcy91dGlscy91dGlscy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFFL0QsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEtBQUssUUFBUSxNQUFNLFFBQVEsQ0FBQzs7QUFRbkMsSUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDO0FBWXhCO0lBQUE7S0F5VUM7SUF4VVEscUJBQVEsR0FBZixVQUFnQixJQUFjLEVBQUUsSUFBWTtRQUMxQyxJQUFJLE9BQU8sQ0FBQztRQUNaLE9BQU87WUFDTCxJQUFNLE9BQU8sR0FBRyxJQUFJLEVBQUUsSUFBSSxHQUFHLFNBQVMsQ0FBQztZQUN2QyxPQUFPLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hDLFVBQVUsQ0FBQztnQkFDVCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM1QixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDWCxDQUFDLENBQUM7SUFDSixDQUFDO0lBQUEsQ0FBQztJQUVGLGtDQUFXLEdBQVgsVUFBWSxJQUFZO1FBQ3RCLE9BQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxzQ0FBZSxHQUFmLFVBQWdCLElBQXlCLEVBQUUsTUFBYztRQUN2RCxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1QsT0FBTyxJQUFJLENBQUM7U0FDYjthQUFNLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO1lBQ25DLE9BQU8sTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztTQUM3QjthQUFNO1lB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Q2I7aUJBQU0sSUFBSSxRQUFRLENBQUMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFO2dCQUN4RixPQUFPLElBQUksQ0FBQzthQUNiO1lBRUQsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELHVDQUFnQixHQUFoQixVQUFpQixJQUEwQjtRQUN6QyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1QsT0FBTyxJQUFJLENBQUM7U0FDYjthQUFNLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO1lBQ25DLE9BQW9CLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDbEQ7YUFBTTtZQUNMLE9BQU8sSUFBSSxDQUFDO1NBQ2I7SUFDSCxDQUFDOztJQXhVVSxZQUFZO1FBSHhCLFVBQVUsQ0FBQztZQUNWLFVBQVUsRUFBRSxNQUFNO1NBQ25CLENBQUM7T0FDVyxZQUFZLENBeVV4Qjt1QkFoV0Q7Q0FnV0MsQUF6VUQsSUF5VUM7U0F6VVksWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RUNhbGVuZGFyVmFsdWV9IGZyb20gJy4uLy4uL3R5cGVzL2NhbGVuZGFyLXZhbHVlLWVudW0nO1xuaW1wb3J0IHtTaW5nbGVDYWxlbmRhclZhbHVlfSBmcm9tICcuLi8uLi90eXBlcy9zaW5nbGUtY2FsZW5kYXItdmFsdWUnO1xuaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCAqIGFzIG1vbWVudE5zIGZyb20gJ21vbWVudCc7XG5pbXBvcnQge01vbWVudCwgdW5pdE9mVGltZX0gZnJvbSAnbW9tZW50JztcbmltcG9ydCB7Q2FsZW5kYXJWYWx1ZX0gZnJvbSAnLi4vLi4vdHlwZXMvY2FsZW5kYXItdmFsdWUnO1xuaW1wb3J0IHtJRGF0ZX0gZnJvbSAnLi4vLi4vbW9kZWxzL2RhdGUubW9kZWwnO1xuaW1wb3J0IHtDYWxlbmRhck1vZGV9IGZyb20gJy4uLy4uL3R5cGVzL2NhbGVuZGFyLW1vZGUnO1xuaW1wb3J0IHtEYXRlVmFsaWRhdG9yfSBmcm9tICcuLi8uLi90eXBlcy92YWxpZGF0b3IudHlwZSc7XG5pbXBvcnQge0lDYWxlbmRhckludGVybmFsfSBmcm9tICcuLi8uLi9tb2RlbHMvY2FsZW5kYXIubW9kZWwnO1xuXG5jb25zdCBtb21lbnQgPSBtb21lbnROcztcblxuZXhwb3J0IGludGVyZmFjZSBEYXRlTGltaXRzIHtcbiAgbWluRGF0ZT86IFNpbmdsZUNhbGVuZGFyVmFsdWU7XG4gIG1heERhdGU/OiBTaW5nbGVDYWxlbmRhclZhbHVlO1xuICBtaW5UaW1lPzogU2luZ2xlQ2FsZW5kYXJWYWx1ZTtcbiAgbWF4VGltZT86IFNpbmdsZUNhbGVuZGFyVmFsdWU7XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFV0aWxzU2VydmljZSB7XG4gIHN0YXRpYyBkZWJvdW5jZShmdW5jOiBGdW5jdGlvbiwgd2FpdDogbnVtYmVyKSB7XG4gICAgbGV0IHRpbWVvdXQ7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgdGltZW91dCA9IGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgfSwgd2FpdCk7XG4gICAgfTtcbiAgfTtcblxuICBjcmVhdGVBcnJheShzaXplOiBudW1iZXIpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIG5ldyBBcnJheShzaXplKS5maWxsKDEpO1xuICB9XG5cbiAgY29udmVydFRvTW9tZW50KGRhdGU6IFNpbmdsZUNhbGVuZGFyVmFsdWUsIGZvcm1hdDogc3RyaW5nKTogTW9tZW50IHtcbiAgICBpZiAoIWRhdGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGRhdGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gbW9tZW50KGRhdGUsIGZvcm1hdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBkYXRlLmNsb25lKCk7XG4gICAgfVxuICB9XG5cbiAgaXNEYXRlVmFsaWQoZGF0ZTogc3RyaW5nLCBmb3JtYXQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmIChkYXRlID09PSAnJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vbWVudChkYXRlLCBmb3JtYXQsIHRydWUpLmlzVmFsaWQoKTtcbiAgfVxuXG4gIC8vIHRvZG86OiBhZGQgdW5pdCB0ZXN0XG4gIGdldERlZmF1bHREaXNwbGF5RGF0ZShjdXJyZW50OiBNb21lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZDogTW9tZW50W10sXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd011bHRpU2VsZWN0OiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWluRGF0ZTogTW9tZW50KTogTW9tZW50IHtcbiAgICBpZiAoY3VycmVudCkge1xuICAgICAgcmV0dXJuIGN1cnJlbnQuY2xvbmUoKTtcbiAgICB9IGVsc2UgaWYgKG1pbkRhdGUgJiYgbWluRGF0ZS5pc0FmdGVyKG1vbWVudCgpKSkge1xuICAgICAgcmV0dXJuIG1pbkRhdGUuY2xvbmUoKTtcbiAgICB9IGVsc2UgaWYgKGFsbG93TXVsdGlTZWxlY3QpIHtcbiAgICAgIGlmIChzZWxlY3RlZCAmJiBzZWxlY3RlZFtzZWxlY3RlZC5sZW5ndGhdKSB7XG4gICAgICAgIHJldHVybiBzZWxlY3RlZFtzZWxlY3RlZC5sZW5ndGhdLmNsb25lKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzZWxlY3RlZCAmJiBzZWxlY3RlZFswXSkge1xuICAgICAgcmV0dXJuIHNlbGVjdGVkWzBdLmNsb25lKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vbWVudCgpO1xuICB9XG5cbiAgLy8gdG9kbzo6IGFkZCB1bml0IHRlc3RcbiAgZ2V0SW5wdXRUeXBlKHZhbHVlOiBDYWxlbmRhclZhbHVlLCBhbGxvd011bHRpU2VsZWN0OiBib29sZWFuKTogRUNhbGVuZGFyVmFsdWUge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgaWYgKCF2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIEVDYWxlbmRhclZhbHVlLk1vbWVudEFycjtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlWzBdID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gRUNhbGVuZGFyVmFsdWUuU3RyaW5nQXJyO1xuICAgICAgfSBlbHNlIGlmIChtb21lbnQuaXNNb21lbnQodmFsdWVbMF0pKSB7XG4gICAgICAgIHJldHVybiBFQ2FsZW5kYXJWYWx1ZS5Nb21lbnRBcnI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBFQ2FsZW5kYXJWYWx1ZS5TdHJpbmc7XG4gICAgICB9IGVsc2UgaWYgKG1vbWVudC5pc01vbWVudCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIEVDYWxlbmRhclZhbHVlLk1vbWVudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYWxsb3dNdWx0aVNlbGVjdCA/IEVDYWxlbmRhclZhbHVlLk1vbWVudEFyciA6IEVDYWxlbmRhclZhbHVlLk1vbWVudDtcbiAgfVxuXG4gIC8vIHRvZG86OiBhZGQgdW5pdCB0ZXN0XG4gIGNvbnZlcnRUb01vbWVudEFycmF5KHZhbHVlOiBDYWxlbmRhclZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICBjb25maWc6IHthbGxvd011bHRpU2VsZWN0PzogYm9vbGVhbiwgZm9ybWF0Pzogc3RyaW5nfSk6IE1vbWVudFtdIHtcbiAgICBsZXQgcmV0VmFsOiBNb21lbnRbXTtcbiAgICBzd2l0Y2ggKHRoaXMuZ2V0SW5wdXRUeXBlKHZhbHVlLCBjb25maWcuYWxsb3dNdWx0aVNlbGVjdCkpIHtcbiAgICAgIGNhc2UgKEVDYWxlbmRhclZhbHVlLlN0cmluZyk6XG4gICAgICAgIHJldFZhbCA9IHZhbHVlID8gW21vbWVudCg8c3RyaW5nPnZhbHVlLCBjb25maWcuZm9ybWF0LCB0cnVlKV0gOiBbXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIChFQ2FsZW5kYXJWYWx1ZS5TdHJpbmdBcnIpOlxuICAgICAgICByZXRWYWwgPSAoPHN0cmluZ1tdPnZhbHVlKS5tYXAodiA9PiB2ID8gbW9tZW50KHYsIGNvbmZpZy5mb3JtYXQsIHRydWUpIDogbnVsbCkuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgKEVDYWxlbmRhclZhbHVlLk1vbWVudCk6XG4gICAgICAgIHJldFZhbCA9IHZhbHVlID8gWyg8TW9tZW50PnZhbHVlKS5jbG9uZSgpXSA6IFtdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgKEVDYWxlbmRhclZhbHVlLk1vbWVudEFycik6XG4gICAgICAgIHJldFZhbCA9ICg8TW9tZW50W10+dmFsdWUgfHwgW10pLm1hcCh2ID0+IHYuY2xvbmUoKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0VmFsID0gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldFZhbDtcbiAgfVxuXG4gIC8vIHRvZG86OiBhZGQgdW5pdCB0ZXN0XG4gIGNvbnZlcnRGcm9tTW9tZW50QXJyYXkoZm9ybWF0OiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IE1vbWVudFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUbzogRUNhbGVuZGFyVmFsdWUpOiBDYWxlbmRhclZhbHVlIHtcbiAgICBzd2l0Y2ggKGNvbnZlcnRUbykge1xuICAgICAgY2FzZSAoRUNhbGVuZGFyVmFsdWUuU3RyaW5nKTpcbiAgICAgICAgcmV0dXJuIHZhbHVlWzBdICYmIHZhbHVlWzBdLmZvcm1hdChmb3JtYXQpO1xuICAgICAgY2FzZSAoRUNhbGVuZGFyVmFsdWUuU3RyaW5nQXJyKTpcbiAgICAgICAgcmV0dXJuIHZhbHVlLmZpbHRlcihCb29sZWFuKS5tYXAodiA9PiB2LmZvcm1hdChmb3JtYXQpKTtcbiAgICAgIGNhc2UgKEVDYWxlbmRhclZhbHVlLk1vbWVudCk6XG4gICAgICAgIHJldHVybiB2YWx1ZVswXSA/IHZhbHVlWzBdLmNsb25lKCkgOiB2YWx1ZVswXTtcbiAgICAgIGNhc2UgKEVDYWxlbmRhclZhbHVlLk1vbWVudEFycik6XG4gICAgICAgIHJldHVybiB2YWx1ZSA/IHZhbHVlLm1hcCh2ID0+IHYuY2xvbmUoKSkgOiB2YWx1ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBjb252ZXJ0VG9TdHJpbmcodmFsdWU6IENhbGVuZGFyVmFsdWUsIGZvcm1hdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgdG1wVmFsOiBzdHJpbmdbXTtcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0bXBWYWwgPSBbdmFsdWVdO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGlmICh2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgdG1wVmFsID0gKDxTaW5nbGVDYWxlbmRhclZhbHVlW10+dmFsdWUpLm1hcCgodikgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRUb01vbWVudCh2LCBmb3JtYXQpLmZvcm1hdChmb3JtYXQpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRtcFZhbCA9IDxzdHJpbmdbXT52YWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG1vbWVudC5pc01vbWVudCh2YWx1ZSkpIHtcbiAgICAgIHRtcFZhbCA9IFt2YWx1ZS5mb3JtYXQoZm9ybWF0KV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gdG1wVmFsLmZpbHRlcihCb29sZWFuKS5qb2luKCcgfCAnKTtcbiAgfVxuXG4gIC8vIHRvZG86OiBhZGQgdW5pdCB0ZXN0XG4gIGNsZWFyVW5kZWZpbmVkPFQ+KG9iajogVCk6IFQge1xuICAgIGlmICghb2JqKSB7XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH1cblxuICAgIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaCgoa2V5KSA9PiAob2JqW2tleV0gPT09IHVuZGVmaW5lZCkgJiYgZGVsZXRlIG9ialtrZXldKTtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgdXBkYXRlU2VsZWN0ZWQoaXNNdWx0aXBsZTogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgY3VycmVudGx5U2VsZWN0ZWQ6IE1vbWVudFtdLFxuICAgICAgICAgICAgICAgICBkYXRlOiBJRGF0ZSxcbiAgICAgICAgICAgICAgICAgZ3JhbnVsYXJpdHk6IHVuaXRPZlRpbWUuQmFzZSA9ICdkYXknKTogTW9tZW50W10ge1xuICAgIGlmIChpc011bHRpcGxlKSB7XG4gICAgICByZXR1cm4gIWRhdGUuc2VsZWN0ZWRcbiAgICAgICAgPyBjdXJyZW50bHlTZWxlY3RlZC5jb25jYXQoW2RhdGUuZGF0ZV0pXG4gICAgICAgIDogY3VycmVudGx5U2VsZWN0ZWQuZmlsdGVyKGQgPT4gIWQuaXNTYW1lKGRhdGUuZGF0ZSwgZ3JhbnVsYXJpdHkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICFkYXRlLnNlbGVjdGVkID8gW2RhdGUuZGF0ZV0gOiBbXTtcbiAgICB9XG4gIH1cblxuICBjbG9zZXN0UGFyZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBzZWxlY3Rvcjogc3RyaW5nKTogSFRNTEVsZW1lbnQge1xuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgbWF0Y2ggPSA8SFRNTEVsZW1lbnQ+ZWxlbWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICByZXR1cm4gbWF0Y2ggfHwgdGhpcy5jbG9zZXN0UGFyZW50KGVsZW1lbnQucGFyZW50RWxlbWVudCwgc2VsZWN0b3IpO1xuICB9XG5cbiAgb25seVRpbWUobTogTW9tZW50KTogTW9tZW50IHtcbiAgICByZXR1cm4gbSAmJiBtb21lbnQuaXNNb21lbnQobSkgJiYgbW9tZW50KG0uZm9ybWF0KCdISDptbTpzcycpLCAnSEg6bW06c3MnKTtcbiAgfVxuXG4gIGdyYW51bGFyaXR5RnJvbVR5cGUoY2FsZW5kYXJUeXBlOiBDYWxlbmRhck1vZGUpOiB1bml0T2ZUaW1lLkJhc2Uge1xuICAgIHN3aXRjaCAoY2FsZW5kYXJUeXBlKSB7XG4gICAgICBjYXNlICd0aW1lJzpcbiAgICAgICAgcmV0dXJuICdzZWNvbmQnO1xuICAgICAgY2FzZSAnZGF5dGltZSc6XG4gICAgICAgIHJldHVybiAnc2Vjb25kJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBjYWxlbmRhclR5cGU7XG4gICAgfVxuICB9XG5cbiAgY3JlYXRlVmFsaWRhdG9yKHttaW5EYXRlLCBtYXhEYXRlLCBtaW5UaW1lLCBtYXhUaW1lfTogRGF0ZUxpbWl0cyxcbiAgICAgICAgICAgICAgICAgIGZvcm1hdDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgY2FsZW5kYXJUeXBlOiBDYWxlbmRhck1vZGUpOiBEYXRlVmFsaWRhdG9yIHtcbiAgICBsZXQgaXNWYWxpZDogYm9vbGVhbjtcbiAgICBsZXQgdmFsdWU6IE1vbWVudFtdO1xuICAgIGNvbnN0IHZhbGlkYXRvcnMgPSBbXTtcbiAgICBjb25zdCBncmFudWxhcml0eSA9IHRoaXMuZ3JhbnVsYXJpdHlGcm9tVHlwZShjYWxlbmRhclR5cGUpO1xuXG4gICAgaWYgKG1pbkRhdGUpIHtcbiAgICAgIGNvbnN0IG1kID0gdGhpcy5jb252ZXJ0VG9Nb21lbnQobWluRGF0ZSwgZm9ybWF0KTtcbiAgICAgIHZhbGlkYXRvcnMucHVzaCh7XG4gICAgICAgIGtleTogJ21pbkRhdGUnLFxuICAgICAgICBpc1ZhbGlkOiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgX2lzVmFsaWQgPSB2YWx1ZS5ldmVyeSh2YWwgPT4gdmFsLmlzU2FtZU9yQWZ0ZXIobWQsIGdyYW51bGFyaXR5KSk7XG4gICAgICAgICAgaXNWYWxpZCA9IGlzVmFsaWQgPyBfaXNWYWxpZCA6IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBfaXNWYWxpZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKG1heERhdGUpIHtcbiAgICAgIGNvbnN0IG1kID0gdGhpcy5jb252ZXJ0VG9Nb21lbnQobWF4RGF0ZSwgZm9ybWF0KTtcbiAgICAgIHZhbGlkYXRvcnMucHVzaCh7XG4gICAgICAgIGtleTogJ21heERhdGUnLFxuICAgICAgICBpc1ZhbGlkOiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgX2lzVmFsaWQgPSB2YWx1ZS5ldmVyeSh2YWwgPT4gdmFsLmlzU2FtZU9yQmVmb3JlKG1kLCBncmFudWxhcml0eSkpO1xuICAgICAgICAgIGlzVmFsaWQgPSBpc1ZhbGlkID8gX2lzVmFsaWQgOiBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gX2lzVmFsaWQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChtaW5UaW1lKSB7XG4gICAgICBjb25zdCBtZCA9IHRoaXMub25seVRpbWUodGhpcy5jb252ZXJ0VG9Nb21lbnQobWluVGltZSwgZm9ybWF0KSk7XG4gICAgICB2YWxpZGF0b3JzLnB1c2goe1xuICAgICAgICBrZXk6ICdtaW5UaW1lJyxcbiAgICAgICAgaXNWYWxpZDogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IF9pc1ZhbGlkID0gdmFsdWUuZXZlcnkodmFsID0+IHRoaXMub25seVRpbWUodmFsKS5pc1NhbWVPckFmdGVyKG1kKSk7XG4gICAgICAgICAgaXNWYWxpZCA9IGlzVmFsaWQgPyBfaXNWYWxpZCA6IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBfaXNWYWxpZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKG1heFRpbWUpIHtcbiAgICAgIGNvbnN0IG1kID0gdGhpcy5vbmx5VGltZSh0aGlzLmNvbnZlcnRUb01vbWVudChtYXhUaW1lLCBmb3JtYXQpKTtcbiAgICAgIHZhbGlkYXRvcnMucHVzaCh7XG4gICAgICAgIGtleTogJ21heFRpbWUnLFxuICAgICAgICBpc1ZhbGlkOiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgX2lzVmFsaWQgPSB2YWx1ZS5ldmVyeSh2YWwgPT4gdGhpcy5vbmx5VGltZSh2YWwpLmlzU2FtZU9yQmVmb3JlKG1kKSk7XG4gICAgICAgICAgaXNWYWxpZCA9IGlzVmFsaWQgPyBfaXNWYWxpZCA6IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBfaXNWYWxpZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChpbnB1dFZhbDogQ2FsZW5kYXJWYWx1ZSkgPT4ge1xuICAgICAgaXNWYWxpZCA9IHRydWU7XG5cbiAgICAgIHZhbHVlID0gdGhpcy5jb252ZXJ0VG9Nb21lbnRBcnJheShpbnB1dFZhbCwge1xuICAgICAgICBmb3JtYXQsXG4gICAgICAgIGFsbG93TXVsdGlTZWxlY3Q6IHRydWVcbiAgICAgIH0pLmZpbHRlcihCb29sZWFuKTtcblxuICAgICAgaWYgKCF2YWx1ZS5ldmVyeSh2YWwgPT4gdmFsLmlzVmFsaWQoKSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBmb3JtYXQ6IHtcbiAgICAgICAgICAgIGdpdmVuOiBpbnB1dFZhbFxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXJyb3JzID0gdmFsaWRhdG9ycy5yZWR1Y2UoKG1hcCwgZXJyKSA9PiB7XG4gICAgICAgIGlmICghZXJyLmlzVmFsaWQoKSkge1xuICAgICAgICAgIG1hcFtlcnIua2V5XSA9IHtcbiAgICAgICAgICAgIGdpdmVuOiB2YWx1ZVxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgfSwge30pO1xuXG4gICAgICByZXR1cm4gIWlzVmFsaWQgPyBlcnJvcnMgOiBudWxsO1xuICAgIH07XG4gIH1cblxuICBkYXRlc1N0cmluZ1RvU3RyaW5nQXJyYXkodmFsdWU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gKHZhbHVlIHx8ICcnKS5zcGxpdCgnfCcpLm1hcChtID0+IG0udHJpbSgpKS5maWx0ZXIoQm9vbGVhbik7XG4gIH1cblxuICBnZXRWYWxpZE1vbWVudEFycmF5KHZhbHVlOiBzdHJpbmcsIGZvcm1hdDogc3RyaW5nKTogTW9tZW50W10ge1xuICAgIHJldHVybiB0aGlzLmRhdGVzU3RyaW5nVG9TdHJpbmdBcnJheSh2YWx1ZSlcbiAgICAgIC5maWx0ZXIoZCA9PiB0aGlzLmlzRGF0ZVZhbGlkKGQsIGZvcm1hdCkpXG4gICAgICAubWFwKGQgPT4gbW9tZW50KGQsIGZvcm1hdCkpO1xuICB9XG5cbiAgc2hvdWxkU2hvd0N1cnJlbnQoc2hvd0dvVG9DdXJyZW50OiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICBtb2RlOiBDYWxlbmRhck1vZGUsXG4gICAgICAgICAgICAgICAgICAgIG1pbjogTW9tZW50LFxuICAgICAgICAgICAgICAgICAgICBtYXg6IE1vbWVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzaG93R29Ub0N1cnJlbnQgJiZcbiAgICAgIG1vZGUgIT09ICd0aW1lJyAmJlxuICAgICAgdGhpcy5pc0RhdGVJblJhbmdlKG1vbWVudCgpLCBtaW4sIG1heCk7XG4gIH1cblxuICBpc0RhdGVJblJhbmdlKGRhdGU6IE1vbWVudCwgZnJvbTogTW9tZW50LCB0bzogTW9tZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGRhdGUuaXNCZXR3ZWVuKGZyb20sIHRvLCAnZGF5JywgJ1tdJyk7XG4gIH1cblxuICBjb252ZXJ0UHJvcHNUb01vbWVudChvYmo6IHtba2V5OiBzdHJpbmddOiBhbnl9LCBmb3JtYXQ6IHN0cmluZywgcHJvcHM6IHN0cmluZ1tdKSB7XG4gICAgcHJvcHMuZm9yRWFjaCgocHJvcCkgPT4ge1xuICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgICBvYmpbcHJvcF0gPSB0aGlzLmNvbnZlcnRUb01vbWVudChvYmpbcHJvcF0sIGZvcm1hdCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzaG91bGRSZXNldEN1cnJlbnRWaWV3PFQgZXh0ZW5kcyBJQ2FsZW5kYXJJbnRlcm5hbD4ocHJldkNvbmY6IFQsIGN1cnJlbnRDb25mOiBUKTogYm9vbGVhbiB7XG4gICAgaWYgKHByZXZDb25mICYmIGN1cnJlbnRDb25mKSB7XG4gICAgICBpZiAoIXByZXZDb25mLm1pbiAmJiBjdXJyZW50Q29uZi5taW4pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHByZXZDb25mLm1pbiAmJiBjdXJyZW50Q29uZi5taW4gJiYgIXByZXZDb25mLm1pbi5pc1NhbWUoY3VycmVudENvbmYubWluLCAnZCcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIGlmICghcHJldkNvbmYubWF4ICYmIGN1cnJlbnRDb25mLm1heCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAocHJldkNvbmYubWF4ICYmIGN1cnJlbnRDb25mLm1heCAmJiAhcHJldkNvbmYubWF4LmlzU2FtZShjdXJyZW50Q29uZi5tYXgsICdkJykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXROYXRpdmVFbGVtZW50KGVsZW06IEhUTUxFbGVtZW50IHwgc3RyaW5nKTogSFRNTEVsZW1lbnQge1xuICAgIGlmICghZWxlbSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZWxlbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiA8SFRNTEVsZW1lbnQ+ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbGVtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsZW07XG4gICAgfVxuICB9XG59XG4iXX0=