ng19-date-picker
Version:
https://github.com/vlio20/angular-datepicker
324 lines • 39.8 kB
JavaScript
import { ECalendarValue } from '../../types/calendar-value-enum';
import { ElementRef, Injectable } from '@angular/core';
import { dayjsRef } from '../../dayjs/dayjs.ref';
import * as i0 from "@angular/core";
export class UtilsService {
static debounce(func, wait) {
let timeout;
return function () {
const context = this, args = arguments;
timeout = clearTimeout(timeout);
setTimeout(() => {
func.apply(context, args);
}, wait);
};
}
;
createArray(size) {
return new Array(size).fill(1);
}
convertToDayjs(date, format) {
if (!date) {
return null;
}
else if (typeof date === 'string') {
return dayjsRef(date, format);
}
else {
return dayjsRef(date.toDate());
}
}
isDateValid(date, format) {
if (date === '') {
return true;
}
return dayjsRef(date, format, true).isValid();
}
// todo:: add unit test
getDefaultDisplayDate(current, selected, allowMultiSelect, minDate) {
if (current) {
return dayjsRef(current.toDate());
}
else if (minDate && minDate.isAfter(dayjsRef())) {
return dayjsRef(minDate.toDate());
}
else if (allowMultiSelect) {
if (selected && selected[selected.length]) {
return dayjsRef(selected[selected.length].toDate());
}
}
else if (selected && selected[0]) {
return dayjsRef(selected[0].toDate());
}
return dayjsRef();
}
// todo:: add unit test
getInputType(value, allowMultiSelect) {
if (Array.isArray(value)) {
if (!value.length) {
return ECalendarValue.DayjsArr;
}
else if (typeof value[0] === 'string') {
return ECalendarValue.StringArr;
}
else if (dayjsRef.isDayjs(value[0])) {
return ECalendarValue.DayjsArr;
}
}
else {
if (typeof value === 'string') {
return ECalendarValue.String;
}
else if (dayjsRef.isDayjs(value)) {
return ECalendarValue.Dayjs;
}
}
return allowMultiSelect ? ECalendarValue.DayjsArr : ECalendarValue.Dayjs;
}
// todo:: add unit test
convertToDayjsArray(value, config) {
let retVal;
switch (this.getInputType(value, config.allowMultiSelect)) {
case (ECalendarValue.String):
retVal = value ? [dayjsRef(value, config.format, true)] : [];
break;
case (ECalendarValue.StringArr):
retVal = value.map(v => v ? dayjsRef(v, config.format, true) : null).filter(Boolean);
break;
case (ECalendarValue.Dayjs):
retVal = value ? [dayjsRef(value.toDate())] : [];
break;
case (ECalendarValue.DayjsArr):
retVal = (value || []).map(v => dayjsRef(v.toDate()));
break;
default:
retVal = [];
}
return retVal;
}
// todo:: add unit test
convertFromDayjsArray(format, value, convertTo) {
switch (convertTo) {
case (ECalendarValue.String):
return value[0] && value[0].format(format);
case (ECalendarValue.StringArr):
return value.filter(Boolean).map(v => v.format(format));
case (ECalendarValue.Dayjs):
return value[0] ? dayjsRef(value[0].toDate()) : value[0];
case (ECalendarValue.DayjsArr):
return value ? value.map(v => dayjsRef(v.toDate())) : value;
default:
return value;
}
}
convertToString(value, format) {
let tmpVal;
if (typeof value === 'string') {
tmpVal = [value];
}
else if (Array.isArray(value)) {
if (value.length) {
tmpVal = value.map((v) => {
return this.convertToDayjs(v, format).format(format);
});
}
else {
tmpVal = value;
}
}
else if (dayjsRef.isDayjs(value)) {
tmpVal = [value.format(format)];
}
else {
return '';
}
return tmpVal.filter(Boolean).join(' | ');
}
// todo:: add unit test
clearUndefined(obj) {
if (!obj) {
return obj;
}
Object.keys(obj).forEach((key) => (obj[key] === undefined) && delete obj[key]);
return obj;
}
updateSelected(isMultiple, currentlySelected, date, granularity = 'day') {
if (isMultiple) {
return !date.selected
? currentlySelected.concat([date.date])
: currentlySelected.filter(d => !d.isSame(date.date, granularity));
}
else {
return !date.selected ? [date.date] : [];
}
}
closestParent(element, selector) {
if (!element) {
return undefined;
}
const match = element.querySelector(selector);
return match || this.closestParent(element.parentElement, selector);
}
onlyTime(m) {
return m && dayjsRef.isDayjs(m) && dayjsRef(m.format('HH:mm:ss'), 'HH:mm:ss');
}
granularityFromType(calendarType) {
switch (calendarType) {
case 'time':
return 'second';
case 'daytime':
return 'second';
default:
return calendarType;
}
}
createValidator({ minDate, maxDate, minTime, maxTime }, format, calendarType) {
let isValid;
let value;
const validators = [];
const granularity = this.granularityFromType(calendarType);
if (minDate) {
const md = this.convertToDayjs(minDate, format);
validators.push({
key: 'minDate',
isValid: () => {
const _isValid = value.every(val => val.isSameOrAfter(md, granularity));
isValid = isValid ? _isValid : false;
return _isValid;
}
});
}
if (maxDate) {
const md = this.convertToDayjs(maxDate, format);
validators.push({
key: 'maxDate',
isValid: () => {
const _isValid = value.every(val => val.isSameOrBefore(md, granularity));
isValid = isValid ? _isValid : false;
return _isValid;
}
});
}
if (minTime) {
const md = this.onlyTime(this.convertToDayjs(minTime, format));
validators.push({
key: 'minTime',
isValid: () => {
const _isValid = value.every(val => this.onlyTime(val).isSameOrAfter(md));
isValid = isValid ? _isValid : false;
return _isValid;
}
});
}
if (maxTime) {
const md = this.onlyTime(this.convertToDayjs(maxTime, format));
validators.push({
key: 'maxTime',
isValid: () => {
const _isValid = value.every(val => this.onlyTime(val).isSameOrBefore(md));
isValid = isValid ? _isValid : false;
return _isValid;
}
});
}
return (inputVal) => {
isValid = true;
value = this.convertToDayjsArray(inputVal, {
format,
allowMultiSelect: true
}).filter(Boolean);
if (!value.every(val => val.isValid())) {
return {
format: {
given: inputVal
}
};
}
const errors = validators.reduce((map, err) => {
if (!err.isValid()) {
map[err.key] = {
given: value
};
}
return map;
}, {});
return !isValid ? errors : null;
};
}
datesStringToStringArray(value) {
return (value || '').split('|').map(m => m.trim()).filter(Boolean);
}
getValidDayjsArray(value, format) {
return this.datesStringToStringArray(value)
.filter(d => this.isDateValid(d, format))
.map(d => dayjsRef(d, format));
}
shouldShowCurrent(showGoToCurrent, mode, min, max) {
return showGoToCurrent &&
mode !== 'time' &&
this.isDateInRange(dayjsRef(), min, max);
}
isDateInRange(date, from, to) {
if (!date) {
return false;
}
if (!from && !to) {
return true;
}
if (!from && to) {
return date.isSameOrBefore(to);
}
if (from && !to) {
return date.isSameOrAfter(from);
}
return date.isBetween(from, to, 'day', '[]');
}
convertPropsToDayjs(obj, format, props) {
props.forEach((prop) => {
if (obj.hasOwnProperty(prop)) {
obj[prop] = this.convertToDayjs(obj[prop], format);
}
});
}
shouldResetCurrentView(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;
}
getNativeElement(elem) {
if (!elem) {
return null;
}
else if (typeof elem === 'string') {
return document.querySelector(elem);
}
else if (elem instanceof ElementRef) {
return elem.nativeElement;
}
else {
return elem;
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: UtilsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: UtilsService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: UtilsService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nMi1kYXRlLXBpY2tlci9zcmMvbGliL2NvbW1vbi9zZXJ2aWNlcy91dGlscy91dGlscy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUUvRCxPQUFPLEVBQUMsVUFBVSxFQUFFLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQVFyRCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7O0FBWS9DLE1BQU0sT0FBTyxZQUFZO0lBQ3ZCLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBYyxFQUFFLElBQVk7UUFDMUMsSUFBSSxPQUFPLENBQUM7UUFDWixPQUFPO1lBQ0wsTUFBTSxPQUFPLEdBQUcsSUFBSSxFQUFFLElBQUksR0FBRyxTQUFTLENBQUM7WUFDdkMsT0FBTyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNoQyxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzVCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNYLENBQUMsQ0FBQztJQUNKLENBQUM7SUFBQSxDQUFDO0lBRUYsV0FBVyxDQUFDLElBQVk7UUFDdEIsT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELGNBQWMsQ0FBQyxJQUF5QixFQUFFLE1BQWM7UUFDdEQsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNULE9BQU8sSUFBSSxDQUFDO1NBQ2I7YUFBTSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUNuQyxPQUFPLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxD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QVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUU7Z0JBQ3hGLE9BQU8sSUFBSSxDQUFDO2FBQ2I7aUJBQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksV0FBVyxDQUFDLEdBQUcsRUFBRTtnQkFDM0MsT0FBTyxJQUFJLENBQUM7YUFDYjtpQkFBTSxJQUFJLFFBQVEsQ0FBQyxHQUFHLElBQUksV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUU7Z0JBQ3hGLE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFFRCxPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsSUFBdUM7UUFDdEQsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNULE9BQU8sSUFBSSxDQUFDO1NBQ2I7YUFBTSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUNuQyxPQUFPLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDckM7YUFBTSxJQUFJLElBQUksWUFBWSxVQUFVLEVBQUU7WUFDckMsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO1NBQzNCO2FBQU07WUFDTCxPQUFPLElBQUksQ0FBQztTQUNiO0lBQ0gsQ0FBQzs4R0ExVlUsWUFBWTtrSEFBWixZQUFZLGNBRlgsTUFBTTs7MkZBRVAsWUFBWTtrQkFIeEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0VDYWxlbmRhclZhbHVlfSBmcm9tICcuLi8uLi90eXBlcy9jYWxlbmRhci12YWx1ZS1lbnVtJztcbmltcG9ydCB7U2luZ2xlQ2FsZW5kYXJWYWx1ZX0gZnJvbSAnLi4vLi4vdHlwZXMvc2luZ2xlLWNhbGVuZGFyLXZhbHVlJztcbmltcG9ydCB7RWxlbWVudFJlZiwgSW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7RGF5anMsIFVuaXRUeXBlfSBmcm9tICdkYXlqcyc7XG5pbXBvcnQge0NhbGVuZGFyVmFsdWV9IGZyb20gJy4uLy4uL3R5cGVzL2NhbGVuZGFyLXZhbHVlJztcbmltcG9ydCB7SURhdGV9IGZyb20gJy4uLy4uL21vZGVscy9kYXRlLm1vZGVsJztcbmltcG9ydCB7Q2FsZW5kYXJNb2RlfSBmcm9tICcuLi8uLi90eXBlcy9jYWxlbmRhci1tb2RlJztcbmltcG9ydCB7RGF0ZVZhbGlkYXRvcn0gZnJvbSAnLi4vLi4vdHlwZXMvdmFsaWRhdG9yLnR5cGUnO1xuaW1wb3J0IHtJQ2FsZW5kYXJJbnRlcm5hbH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NhbGVuZGFyLm1vZGVsJztcbmltcG9ydCB7ZGF5anNSZWZ9IGZyb20gJy4uLy4uL2RheWpzL2RheWpzLnJlZic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0ZUxpbWl0cyB7XG4gIG1pbkRhdGU/OiBTaW5nbGVDYWxlbmRhclZhbHVlO1xuICBtYXhEYXRlPzogU2luZ2xlQ2FsZW5kYXJWYWx1ZTtcbiAgbWluVGltZT86IFNpbmdsZUNhbGVuZGFyVmFsdWU7XG4gIG1heFRpbWU/OiBTaW5nbGVDYWxlbmRhclZhbHVlO1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBVdGlsc1NlcnZpY2Uge1xuICBzdGF0aWMgZGVib3VuY2UoZnVuYzogRnVuY3Rpb24sIHdhaXQ6IG51bWJlcikge1xuICAgIGxldCB0aW1lb3V0O1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjb250ZXh0ID0gdGhpcywgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgIHRpbWVvdXQgPSBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgIH0sIHdhaXQpO1xuICAgIH07XG4gIH07XG5cbiAgY3JlYXRlQXJyYXkoc2l6ZTogbnVtYmVyKTogbnVtYmVyW10ge1xuICAgIHJldHVybiBuZXcgQXJyYXkoc2l6ZSkuZmlsbCgxKTtcbiAgfVxuXG4gIGNvbnZlcnRUb0RheWpzKGRhdGU6IFNpbmdsZUNhbGVuZGFyVmFsdWUsIGZvcm1hdDogc3RyaW5nKTogRGF5anMge1xuICAgIGlmICghZGF0ZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBkYXlqc1JlZihkYXRlLCBmb3JtYXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZGF5anNSZWYoZGF0ZS50b0RhdGUoKSk7XG4gICAgfVxuICB9XG5cbiAgaXNEYXRlVmFsaWQoZGF0ZTogc3RyaW5nLCBmb3JtYXQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmIChkYXRlID09PSAnJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRheWpzUmVmKGRhdGUsIGZvcm1hdCwgdHJ1ZSkuaXNWYWxpZCgpO1xuICB9XG5cbiAgLy8gdG9kbzo6IGFkZCB1bml0IHRlc3RcbiAgZ2V0RGVmYXVsdERpc3BsYXlEYXRlKGN1cnJlbnQ6IERheWpzLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IERheWpzW10sXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd011bHRpU2VsZWN0OiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWluRGF0ZTogRGF5anMpOiBEYXlqcyB7XG4gICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgIHJldHVybiBkYXlqc1JlZihjdXJyZW50LnRvRGF0ZSgpKTtcbiAgICB9IGVsc2UgaWYgKG1pbkRhdGUgJiYgbWluRGF0ZS5pc0FmdGVyKGRheWpzUmVmKCkpKSB7XG4gICAgICByZXR1cm4gZGF5anNSZWYobWluRGF0ZS50b0RhdGUoKSk7XG4gICAgfSBlbHNlIGlmIChhbGxvd011bHRpU2VsZWN0KSB7XG4gICAgICBpZiAoc2VsZWN0ZWQgJiYgc2VsZWN0ZWRbc2VsZWN0ZWQubGVuZ3RoXSkge1xuICAgICAgICByZXR1cm4gZGF5anNSZWYoc2VsZWN0ZWRbc2VsZWN0ZWQubGVuZ3RoXS50b0RhdGUoKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzZWxlY3RlZCAmJiBzZWxlY3RlZFswXSkge1xuICAgICAgcmV0dXJuIGRheWpzUmVmKHNlbGVjdGVkWzBdLnRvRGF0ZSgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF5anNSZWYoKTtcbiAgfVxuXG4gIC8vIHRvZG86OiBhZGQgdW5pdCB0ZXN0XG4gIGdldElucHV0VHlwZSh2YWx1ZTogQ2FsZW5kYXJWYWx1ZSwgYWxsb3dNdWx0aVNlbGVjdDogYm9vbGVhbik6IEVDYWxlbmRhclZhbHVlIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGlmICghdmFsdWUubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBFQ2FsZW5kYXJWYWx1ZS5EYXlqc0FycjtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlWzBdID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gRUNhbGVuZGFyVmFsdWUuU3RyaW5nQXJyO1xuICAgICAgfSBlbHNlIGlmIChkYXlqc1JlZi5pc0RheWpzKHZhbHVlWzBdKSkge1xuICAgICAgICByZXR1cm4gRUNhbGVuZGFyVmFsdWUuRGF5anNBcnI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBFQ2FsZW5kYXJWYWx1ZS5TdHJpbmc7XG4gICAgICB9IGVsc2UgaWYgKGRheWpzUmVmLmlzRGF5anModmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBFQ2FsZW5kYXJWYWx1ZS5EYXlqcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYWxsb3dNdWx0aVNlbGVjdCA/IEVDYWxlbmRhclZhbHVlLkRheWpzQXJyIDogRUNhbGVuZGFyVmFsdWUuRGF5anM7XG4gIH1cblxuICAvLyB0b2RvOjogYWRkIHVuaXQgdGVzdFxuICBjb252ZXJ0VG9EYXlqc0FycmF5KHZhbHVlOiBDYWxlbmRhclZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZzogeyBhbGxvd011bHRpU2VsZWN0PzogYm9vbGVhbiwgZm9ybWF0Pzogc3RyaW5nIH0pOiBEYXlqc1tdIHtcbiAgICBsZXQgcmV0VmFsOiBEYXlqc1tdO1xuICAgIHN3aXRjaCAodGhpcy5nZXRJbnB1dFR5cGUodmFsdWUsIGNvbmZpZy5hbGxvd011bHRpU2VsZWN0KSkge1xuICAgICAgY2FzZSAoRUNhbGVuZGFyVmFsdWUuU3RyaW5nKTpcbiAgICAgICAgcmV0VmFsID0gdmFsdWUgPyBbZGF5anNSZWYoPHN0cmluZz52YWx1ZSwgY29uZmlnLmZvcm1hdCwgdHJ1ZSldIDogW107XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAoRUNhbGVuZGFyVmFsdWUuU3RyaW5nQXJyKTpcbiAgICAgICAgcmV0VmFsID0gKDxzdHJpbmdbXT52YWx1ZSkubWFwKHYgPT4gdiA/IGRheWpzUmVmKHYsIGNvbmZpZy5mb3JtYXQsIHRydWUpIDogbnVsbCkuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgKEVDYWxlbmRhclZhbHVlLkRheWpzKTpcbiAgICAgICAgcmV0VmFsID0gdmFsdWUgPyBbZGF5anNSZWYoKDxEYXlqcz52YWx1ZSkudG9EYXRlKCkpXSA6IFtdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgKEVDYWxlbmRhclZhbHVlLkRheWpzQXJyKTpcbiAgICAgICAgcmV0VmFsID0gKDxEYXlqc1tdPnZhbHVlIHx8IFtdKS5tYXAodiA9PiBkYXlqc1JlZih2LnRvRGF0ZSgpKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0VmFsID0gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldFZhbDtcbiAgfVxuXG4gIC8vIHRvZG86OiBhZGQgdW5pdCB0ZXN0XG4gIGNvbnZlcnRGcm9tRGF5anNBcnJheShmb3JtYXQ6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBEYXlqc1tdLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydFRvOiBFQ2FsZW5kYXJWYWx1ZSk6IENhbGVuZGFyVmFsdWUge1xuICAgIHN3aXRjaCAoY29udmVydFRvKSB7XG4gICAgICBjYXNlIChFQ2FsZW5kYXJWYWx1ZS5TdHJpbmcpOlxuICAgICAgICByZXR1cm4gdmFsdWVbMF0gJiYgdmFsdWVbMF0uZm9ybWF0KGZvcm1hdCk7XG4gICAgICBjYXNlIChFQ2FsZW5kYXJWYWx1ZS5TdHJpbmdBcnIpOlxuICAgICAgICByZXR1cm4gdmFsdWUuZmlsdGVyKEJvb2xlYW4pLm1hcCh2ID0+IHYuZm9ybWF0KGZvcm1hdCkpO1xuICAgICAgY2FzZSAoRUNhbGVuZGFyVmFsdWUuRGF5anMpOlxuICAgICAgICByZXR1cm4gdmFsdWVbMF0gPyBkYXlqc1JlZih2YWx1ZVswXS50b0RhdGUoKSkgOiB2YWx1ZVswXTtcbiAgICAgIGNhc2UgKEVDYWxlbmRhclZhbHVlLkRheWpzQXJyKTpcbiAgICAgICAgcmV0dXJuIHZhbHVlID8gdmFsdWUubWFwKHYgPT4gZGF5anNSZWYodi50b0RhdGUoKSkpIDogdmFsdWU7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgY29udmVydFRvU3RyaW5nKHZhbHVlOiBDYWxlbmRhclZhbHVlLCBmb3JtYXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IHRtcFZhbDogc3RyaW5nW107XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgdG1wVmFsID0gW3ZhbHVlXTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBpZiAodmFsdWUubGVuZ3RoKSB7XG4gICAgICAgIHRtcFZhbCA9ICg8U2luZ2xlQ2FsZW5kYXJWYWx1ZVtdPnZhbHVlKS5tYXAoKHYpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0VG9EYXlqcyh2LCBmb3JtYXQpLmZvcm1hdChmb3JtYXQpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRtcFZhbCA9IDxzdHJpbmdbXT52YWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRheWpzUmVmLmlzRGF5anModmFsdWUpKSB7XG4gICAgICB0bXBWYWwgPSBbdmFsdWUuZm9ybWF0KGZvcm1hdCldO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRtcFZhbC5maWx0ZXIoQm9vbGVhbikuam9pbignIHwgJyk7XG4gIH1cblxuICAvLyB0b2RvOjogYWRkIHVuaXQgdGVzdFxuICBjbGVhclVuZGVmaW5lZDxUPihvYmo6IFQpOiBUIHtcbiAgICBpZiAoIW9iaikge1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG5cbiAgICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goKGtleSkgPT4gKG9ialtrZXldID09PSB1bmRlZmluZWQpICYmIGRlbGV0ZSBvYmpba2V5XSk7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHVwZGF0ZVNlbGVjdGVkKGlzTXVsdGlwbGU6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgIGN1cnJlbnRseVNlbGVjdGVkOiBEYXlqc1tdLFxuICAgICAgICAgICAgICAgICBkYXRlOiBJRGF0ZSxcbiAgICAgICAgICAgICAgICAgZ3JhbnVsYXJpdHk6IFVuaXRUeXBlID0gJ2RheScpOiBEYXlqc1tdIHtcbiAgICBpZiAoaXNNdWx0aXBsZSkge1xuICAgICAgcmV0dXJuICFkYXRlLnNlbGVjdGVkXG4gICAgICAgID8gY3VycmVudGx5U2VsZWN0ZWQuY29uY2F0KFtkYXRlLmRhdGVdKVxuICAgICAgICA6IGN1cnJlbnRseVNlbGVjdGVkLmZpbHRlcihkID0+ICFkLmlzU2FtZShkYXRlLmRhdGUsIGdyYW51bGFyaXR5KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAhZGF0ZS5zZWxlY3RlZCA/IFtkYXRlLmRhdGVdIDogW107XG4gICAgfVxuICB9XG5cbiAgY2xvc2VzdFBhcmVudChlbGVtZW50OiBIVE1MRWxlbWVudCwgc2VsZWN0b3I6IHN0cmluZyk6IEhUTUxFbGVtZW50IHtcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IG1hdGNoID0gPEhUTUxFbGVtZW50PmVsZW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgcmV0dXJuIG1hdGNoIHx8IHRoaXMuY2xvc2VzdFBhcmVudChlbGVtZW50LnBhcmVudEVsZW1lbnQsIHNlbGVjdG9yKTtcbiAgfVxuXG4gIG9ubHlUaW1lKG06IERheWpzKTogRGF5anMge1xuICAgIHJldHVybiBtICYmIGRheWpzUmVmLmlzRGF5anMobSkgJiYgZGF5anNSZWYobS5mb3JtYXQoJ0hIOm1tOnNzJyksICdISDptbTpzcycpO1xuICB9XG5cbiAgZ3JhbnVsYXJpdHlGcm9tVHlwZShjYWxlbmRhclR5cGU6IENhbGVuZGFyTW9kZSk6IFVuaXRUeXBlIHtcbiAgICBzd2l0Y2ggKGNhbGVuZGFyVHlwZSkge1xuICAgICAgY2FzZSAndGltZSc6XG4gICAgICAgIHJldHVybiAnc2Vjb25kJztcbiAgICAgIGNhc2UgJ2RheXRpbWUnOlxuICAgICAgICByZXR1cm4gJ3NlY29uZCc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gY2FsZW5kYXJUeXBlO1xuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZVZhbGlkYXRvcih7bWluRGF0ZSwgbWF4RGF0ZSwgbWluVGltZSwgbWF4VGltZX06IERhdGVMaW1pdHMsXG4gICAgICAgICAgICAgICAgICBmb3JtYXQ6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgIGNhbGVuZGFyVHlwZTogQ2FsZW5kYXJNb2RlKTogRGF0ZVZhbGlkYXRvciB7XG4gICAgbGV0IGlzVmFsaWQ6IGJvb2xlYW47XG4gICAgbGV0IHZhbHVlOiBEYXlqc1tdO1xuICAgIGNvbnN0IHZhbGlkYXRvcnMgPSBbXTtcbiAgICBjb25zdCBncmFudWxhcml0eSA9IHRoaXMuZ3JhbnVsYXJpdHlGcm9tVHlwZShjYWxlbmRhclR5cGUpO1xuXG4gICAgaWYgKG1pbkRhdGUpIHtcbiAgICAgIGNvbnN0IG1kID0gdGhpcy5jb252ZXJ0VG9EYXlqcyhtaW5EYXRlLCBmb3JtYXQpO1xuICAgICAgdmFsaWRhdG9ycy5wdXNoKHtcbiAgICAgICAga2V5OiAnbWluRGF0ZScsXG4gICAgICAgIGlzVmFsaWQ6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBfaXNWYWxpZCA9IHZhbHVlLmV2ZXJ5KHZhbCA9PiB2YWwuaXNTYW1lT3JBZnRlcihtZCwgZ3JhbnVsYXJpdHkpKTtcbiAgICAgICAgICBpc1ZhbGlkID0gaXNWYWxpZCA/IF9pc1ZhbGlkIDogZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIF9pc1ZhbGlkO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAobWF4RGF0ZSkge1xuICAgICAgY29uc3QgbWQgPSB0aGlzLmNvbnZlcnRUb0RheWpzKG1heERhdGUsIGZvcm1hdCk7XG4gICAgICB2YWxpZGF0b3JzLnB1c2goe1xuICAgICAgICBrZXk6ICdtYXhEYXRlJyxcbiAgICAgICAgaXNWYWxpZDogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IF9pc1ZhbGlkID0gdmFsdWUuZXZlcnkodmFsID0+IHZhbC5pc1NhbWVPckJlZm9yZShtZCwgZ3JhbnVsYXJpdHkpKTtcbiAgICAgICAgICBpc1ZhbGlkID0gaXNWYWxpZCA/IF9pc1ZhbGlkIDogZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIF9pc1ZhbGlkO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAobWluVGltZSkge1xuICAgICAgY29uc3QgbWQgPSB0aGlzLm9ubHlUaW1lKHRoaXMuY29udmVydFRvRGF5anMobWluVGltZSwgZm9ybWF0KSk7XG4gICAgICB2YWxpZGF0b3JzLnB1c2goe1xuICAgICAgICBrZXk6ICdtaW5UaW1lJyxcbiAgICAgICAgaXNWYWxpZDogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IF9pc1ZhbGlkID0gdmFsdWUuZXZlcnkodmFsID0+IHRoaXMub25seVRpbWUodmFsKS5pc1NhbWVPckFmdGVyKG1kKSk7XG4gICAgICAgICAgaXNWYWxpZCA9IGlzVmFsaWQgPyBfaXNWYWxpZCA6IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBfaXNWYWxpZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKG1heFRpbWUpIHtcbiAgICAgIGNvbnN0IG1kID0gdGhpcy5vbmx5VGltZSh0aGlzLmNvbnZlcnRUb0RheWpzKG1heFRpbWUsIGZvcm1hdCkpO1xuICAgICAgdmFsaWRhdG9ycy5wdXNoKHtcbiAgICAgICAga2V5OiAnbWF4VGltZScsXG4gICAgICAgIGlzVmFsaWQ6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBfaXNWYWxpZCA9IHZhbHVlLmV2ZXJ5KHZhbCA9PiB0aGlzLm9ubHlUaW1lKHZhbCkuaXNTYW1lT3JCZWZvcmUobWQpKTtcbiAgICAgICAgICBpc1ZhbGlkID0gaXNWYWxpZCA/IF9pc1ZhbGlkIDogZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIF9pc1ZhbGlkO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gKGlucHV0VmFsOiBDYWxlbmRhclZhbHVlKSA9PiB7XG4gICAgICBpc1ZhbGlkID0gdHJ1ZTtcblxuICAgICAgdmFsdWUgPSB0aGlzLmNvbnZlcnRUb0RheWpzQXJyYXkoaW5wdXRWYWwsIHtcbiAgICAgICAgZm9ybWF0LFxuICAgICAgICBhbGxvd011bHRpU2VsZWN0OiB0cnVlXG4gICAgICB9KS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICAgIGlmICghdmFsdWUuZXZlcnkodmFsID0+IHZhbC5pc1ZhbGlkKCkpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZm9ybWF0OiB7XG4gICAgICAgICAgICBnaXZlbjogaW5wdXRWYWxcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVycm9ycyA9IHZhbGlkYXRvcnMucmVkdWNlKChtYXAsIGVycikgPT4ge1xuICAgICAgICBpZiAoIWVyci5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICBtYXBbZXJyLmtleV0gPSB7XG4gICAgICAgICAgICBnaXZlbjogdmFsdWVcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgIH0sIHt9KTtcblxuICAgICAgcmV0dXJuICFpc1ZhbGlkID8gZXJyb3JzIDogbnVsbDtcbiAgICB9O1xuICB9XG5cbiAgZGF0ZXNTdHJpbmdUb1N0cmluZ0FycmF5KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuICh2YWx1ZSB8fCAnJykuc3BsaXQoJ3wnKS5tYXAobSA9PiBtLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pO1xuICB9XG5cbiAgZ2V0VmFsaWREYXlqc0FycmF5KHZhbHVlOiBzdHJpbmcsIGZvcm1hdDogc3RyaW5nKTogRGF5anNbXSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0ZXNTdHJpbmdUb1N0cmluZ0FycmF5KHZhbHVlKVxuICAgICAgLmZpbHRlcihkID0+IHRoaXMuaXNEYXRlVmFsaWQoZCwgZm9ybWF0KSlcbiAgICAgIC5tYXAoZCA9PiBkYXlqc1JlZihkLCBmb3JtYXQpKTtcbiAgfVxuXG4gIHNob3VsZFNob3dDdXJyZW50KHNob3dHb1RvQ3VycmVudDogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgbW9kZTogQ2FsZW5kYXJNb2RlLFxuICAgICAgICAgICAgICAgICAgICBtaW46IERheWpzLFxuICAgICAgICAgICAgICAgICAgICBtYXg6IERheWpzKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHNob3dHb1RvQ3VycmVudCAmJlxuICAgICAgbW9kZSAhPT0gJ3RpbWUnICYmXG4gICAgICB0aGlzLmlzRGF0ZUluUmFuZ2UoZGF5anNSZWYoKSwgbWluLCBtYXgpO1xuICB9XG5cbiAgaXNEYXRlSW5SYW5nZShkYXRlOiBEYXlqcywgZnJvbTogRGF5anMsIHRvOiBEYXlqcyk6IGJvb2xlYW4ge1xuICAgIGlmICghZGF0ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghZnJvbSAmJiAhdG8pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICghZnJvbSAmJiB0bykge1xuICAgICAgcmV0dXJuIGRhdGUuaXNTYW1lT3JCZWZvcmUodG8pO1xuICAgIH1cblxuICAgIGlmIChmcm9tICYmICF0bykge1xuICAgICAgcmV0dXJuIGRhdGUuaXNTYW1lT3JBZnRlcihmcm9tKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0ZS5pc0JldHdlZW4oZnJvbSwgdG8sICdkYXknLCAnW10nKTtcbiAgfVxuXG4gIGNvbnZlcnRQcm9wc1RvRGF5anMob2JqOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBmb3JtYXQ6IHN0cmluZywgcHJvcHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgcHJvcHMuZm9yRWFjaCgocHJvcCkgPT4ge1xuICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgICBvYmpbcHJvcF0gPSB0aGlzLmNvbnZlcnRUb0RheWpzKG9ialtwcm9wXSwgZm9ybWF0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNob3VsZFJlc2V0Q3VycmVudFZpZXc8VCBleHRlbmRzIElDYWxlbmRhckludGVybmFsPihwcmV2Q29uZjogVCwgY3VycmVudENvbmY6IFQpOiBib29sZWFuIHtcbiAgICBpZiAocHJldkNvbmYgJiYgY3VycmVudENvbmYpIHtcbiAgICAgIGlmICghcHJldkNvbmYubWluICYmIGN1cnJlbnRDb25mLm1pbikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAocHJldkNvbmYubWluICYmIGN1cnJlbnRDb25mLm1pbiAmJiAhcHJldkNvbmYubWluLmlzU2FtZShjdXJyZW50Q29uZi5taW4sICdkJykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2UgaWYgKCFwcmV2Q29uZi5tYXggJiYgY3VycmVudENvbmYubWF4KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChwcmV2Q29uZi5tYXggJiYgY3VycmVudENvbmYubWF4ICYmICFwcmV2Q29uZi5tYXguaXNTYW1lKGN1cnJlbnRDb25mLm1heCwgJ2QnKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldE5hdGl2ZUVsZW1lbnQoZWxlbTogSFRNTEVsZW1lbnQgfCBzdHJpbmcgfCBFbGVtZW50UmVmKTogSFRNTEVsZW1lbnQge1xuICAgIGlmICghZWxlbSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZWxlbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsZW0pO1xuICAgIH0gZWxzZSBpZiAoZWxlbSBpbnN0YW5jZW9mIEVsZW1lbnRSZWYpIHtcbiAgICAgIHJldHVybiBlbGVtLm5hdGl2ZUVsZW1lbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbGVtO1xuICAgIH1cbiAgfVxufVxuIl19