design-angular-kit
Version:
Un toolkit Angular conforme alle linee guida di design per i servizi web della PA
162 lines • 19.5 kB
JavaScript
import { shareReplay, takeWhile, timer } from 'rxjs';
import { map } from 'rxjs/operators';
export class ItDateUtils {
/**
* Add seconds to date
* @param date the date
* @param seconds seconds to add
*/
static addSeconds(date, seconds) {
const newDate = new Date(date.valueOf());
newDate.setSeconds(date.getSeconds() + seconds);
return newDate;
}
/**
* Add minutes to date
* @param date the date
* @param minutes minutes to add
*/
static addMinutes(date, minutes) {
const newDate = new Date(date.valueOf());
newDate.setMinutes(date.getMinutes() + minutes);
return newDate;
}
/**
* Add hours to date
* @param date the date
* @param hours hours to add
*/
static addHours(date, hours) {
const newDate = new Date(date.valueOf());
newDate.setHours(date.getHours() + hours);
return newDate;
}
/**
* Add days to date
* @param date the date
* @param days days to add
*/
static addDays(date, days) {
const newDate = new Date(date.valueOf());
newDate.setDate(date.getDate() + days);
return newDate;
}
/**
* Add years to date
* @param date the date
* @param months months to add
*/
static addMonths(date, months) {
const newDate = new Date(date.valueOf());
newDate.setMonth(date.getMonth() + months);
return newDate;
}
/**
* Add years to date
* @param date the date
* @param years years to add
*/
static addYears(date, years) {
const newDate = new Date(date.valueOf());
newDate.setFullYear(date.getFullYear() + years);
return newDate;
}
/**
* Calculate number of days between two date
* @param startDate
* @param endDate
* @param absolute return unsigned result
*/
static countDays(startDate, endDate, absolute = false) {
const differenceInTime = endDate.getTime() - startDate.getTime();
const diff = absolute ? Math.abs(differenceInTime) : differenceInTime;
return Math.ceil(diff / (1000 * 3600 * 24));
}
/**
* Check if string is a date with iso format
* @param value the string
*/
static isIsoString(value) {
if (!value || !/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z/.test(value)) {
return false;
}
const d = new Date(value);
return !!d && !isNaN(d.getTime()) && d.toISOString() === value;
}
/**
* Convert iso string to Date
* @param isoString the iso string
*/
static isoStringToDate(isoString) {
return isoString ? new Date(Date.parse(isoString)) : null;
}
/**
* Remove time from an iso date string
* @param isoString the iso string
*/
static isoStringRemoveTime(isoString) {
let date = ItDateUtils.isoStringToDate(isoString);
if (!date) {
return isoString;
}
const offset = date.getTimezoneOffset();
date = new Date(date.getTime() - offset * 60 * 1000);
return date.toISOString().substring(0, isoString.indexOf('T'));
}
/**
* Set iso string hours to 0 and format correctly the date (consider timezone offset)
* @example '2024-03-04T23:00:00.000Z' -> '2024-03-05T00:00:00.000Z'
* @param isoString the iso string
*/
static isoStringSetZeroTime(isoString) {
let date = ItDateUtils.isoStringToDate(isoString);
if (!date) {
return isoString;
}
const offset = date.getTimezoneOffset();
date = new Date(date.getTime() - offset * 60 * 1000);
date.setUTCHours(0, 0, 0, 0);
return date.toISOString();
}
/**
* Calculate the date time left and return the string format [d h m s]
* @param endDate
*/
static timeLeftString(endDate) {
const endTime = endDate.getTime();
return timer(0, 1000).pipe(map(() => Math.floor((endTime - new Date().getTime()) / 1000)), takeWhile(delta => delta >= 0), map(delta => {
const arrayResult = [];
const days = Math.floor(delta / 60 / 60 / 24);
if (days > 0) {
arrayResult.push(days + 'd');
}
delta -= days * 60 * 60 * 24;
const hours = Math.floor(delta / 60 / 60) % 24;
if (hours > 0) {
arrayResult.push(hours + 'h');
}
delta -= hours * 60 * 60;
const minutes = Math.floor(delta / 60) % 60;
arrayResult.push(minutes + 'm');
delta -= minutes * 60;
const seconds = delta % 60;
arrayResult.push(seconds + 's');
return arrayResult.join(' ');
}), shareReplay(1));
}
/**
* Calculate the next day of week
* @param dayOfWeek Day of week 0=Sunday, 1=Monday...4=Thursday...
* @param hour the specif hour
* @param minute the specific minute
*/
static nextWeekDayAndTime(dayOfWeek, hour = 0, minute = 0) {
const now = new Date();
const result = new Date(now.getFullYear(), now.getMonth(), now.getDate() + ((7 + dayOfWeek - now.getDay()) % 7), hour, minute, 0, 0);
if (result < now) {
result.setDate(result.getDate() + 7);
}
return result;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL3V0aWxzL2RhdGUtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLFdBQVcsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVyQyxNQUFNLE9BQU8sV0FBVztJQUN0Qjs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFVLEVBQUUsT0FBZTtRQUNsRCxNQUFNLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN6QyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQztRQUNoRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBVSxFQUFFLE9BQWU7UUFDbEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDekMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFDaEQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQVUsRUFBRSxLQUFhO1FBQzlDLE1BQU0sT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDO1FBQzFDLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFVLEVBQUUsSUFBWTtRQUM1QyxNQUFNLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN6QyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUN2QyxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBVSxFQUFFLE1BQWM7UUFDaEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDekMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUM7UUFDM0MsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQVUsRUFBRSxLQUFhO1FBQzlDLE1BQU0sT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDO1FBQ2hELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBZSxFQUFFLE9BQWEsRUFBRSxXQUFvQixLQUFLO1FBQy9FLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxHQUFHLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNqRSxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUM7UUFDdEUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFvQjtRQUM1QyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsNENBQTRDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDeEUsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsTUFBTSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxLQUFLLENBQUM7SUFDakUsQ0FBQztJQUVEOzs7T0FHRztJQUNJLE1BQU0sQ0FBQyxlQUFlLENBQUMsU0FBd0I7UUFDcEQsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzVELENBQUM7SUFFRDs7O09BR0c7SUFDSSxNQUFNLENBQUMsbUJBQW1CLENBQUMsU0FBaUI7UUFDakQsSUFBSSxJQUFJLEdBQUcsV0FBVyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDeEMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxNQUFNLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ3JELE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLG9CQUFvQixDQUFDLFNBQWlCO1FBQ2xELElBQUksSUFBSSxHQUFHLFdBQVcsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3hDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsTUFBTSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzdCLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQWE7UUFDeEMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2xDLE9BQU8sS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQ3hCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUM5RCxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLEVBQzlCLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNWLE1BQU0sV0FBVyxHQUFrQixFQUFFLENBQUM7WUFDdEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUM5QyxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDYixXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztZQUMvQixDQUFDO1lBQ0QsS0FBSyxJQUFJLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUM3QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQy9DLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNkLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQ2hDLENBQUM7WUFFRCxLQUFLLElBQUksS0FBSyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDekIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQzVDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBRWhDLEtBQUssSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sT0FBTyxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDM0IsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFFaEMsT0FBTyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLENBQUMsQ0FBQyxFQUNGLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FDZixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLGtCQUFrQixDQUFDLFNBQWlCLEVBQUUsSUFBSSxHQUFHLENBQUMsRUFBRSxNQUFNLEdBQUcsQ0FBQztRQUN0RSxNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsRUFBRSxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRXJJLElBQUksTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlLCBzaGFyZVJlcGxheSwgdGFrZVdoaWxlLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5leHBvcnQgY2xhc3MgSXREYXRlVXRpbHMge1xuICAvKipcbiAgICogQWRkIHNlY29uZHMgdG8gZGF0ZVxuICAgKiBAcGFyYW0gZGF0ZSB0aGUgZGF0ZVxuICAgKiBAcGFyYW0gc2Vjb25kcyBzZWNvbmRzIHRvIGFkZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhZGRTZWNvbmRzKGRhdGU6IERhdGUsIHNlY29uZHM6IG51bWJlcik6IERhdGUge1xuICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZShkYXRlLnZhbHVlT2YoKSk7XG4gICAgbmV3RGF0ZS5zZXRTZWNvbmRzKGRhdGUuZ2V0U2Vjb25kcygpICsgc2Vjb25kcyk7XG4gICAgcmV0dXJuIG5ld0RhdGU7XG4gIH1cblxuICAvKipcbiAgICogQWRkIG1pbnV0ZXMgdG8gZGF0ZVxuICAgKiBAcGFyYW0gZGF0ZSB0aGUgZGF0ZVxuICAgKiBAcGFyYW0gbWludXRlcyBtaW51dGVzIHRvIGFkZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhZGRNaW51dGVzKGRhdGU6IERhdGUsIG1pbnV0ZXM6IG51bWJlcik6IERhdGUge1xuICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZShkYXRlLnZhbHVlT2YoKSk7XG4gICAgbmV3RGF0ZS5zZXRNaW51dGVzKGRhdGUuZ2V0TWludXRlcygpICsgbWludXRlcyk7XG4gICAgcmV0dXJuIG5ld0RhdGU7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGhvdXJzIHRvIGRhdGVcbiAgICogQHBhcmFtIGRhdGUgdGhlIGRhdGVcbiAgICogQHBhcmFtIGhvdXJzIGhvdXJzIHRvIGFkZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhZGRIb3VycyhkYXRlOiBEYXRlLCBob3VyczogbnVtYmVyKTogRGF0ZSB7XG4gICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKGRhdGUudmFsdWVPZigpKTtcbiAgICBuZXdEYXRlLnNldEhvdXJzKGRhdGUuZ2V0SG91cnMoKSArIGhvdXJzKTtcbiAgICByZXR1cm4gbmV3RGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgZGF5cyB0byBkYXRlXG4gICAqIEBwYXJhbSBkYXRlIHRoZSBkYXRlXG4gICAqIEBwYXJhbSBkYXlzIGRheXMgdG8gYWRkXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFkZERheXMoZGF0ZTogRGF0ZSwgZGF5czogbnVtYmVyKTogRGF0ZSB7XG4gICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKGRhdGUudmFsdWVPZigpKTtcbiAgICBuZXdEYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyBkYXlzKTtcbiAgICByZXR1cm4gbmV3RGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgeWVhcnMgdG8gZGF0ZVxuICAgKiBAcGFyYW0gZGF0ZSB0aGUgZGF0ZVxuICAgKiBAcGFyYW0gbW9udGhzIG1vbnRocyB0byBhZGRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYWRkTW9udGhzKGRhdGU6IERhdGUsIG1vbnRoczogbnVtYmVyKTogRGF0ZSB7XG4gICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKGRhdGUudmFsdWVPZigpKTtcbiAgICBuZXdEYXRlLnNldE1vbnRoKGRhdGUuZ2V0TW9udGgoKSArIG1vbnRocyk7XG4gICAgcmV0dXJuIG5ld0RhdGU7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHllYXJzIHRvIGRhdGVcbiAgICogQHBhcmFtIGRhdGUgdGhlIGRhdGVcbiAgICogQHBhcmFtIHllYXJzIHllYXJzIHRvIGFkZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhZGRZZWFycyhkYXRlOiBEYXRlLCB5ZWFyczogbnVtYmVyKTogRGF0ZSB7XG4gICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKGRhdGUudmFsdWVPZigpKTtcbiAgICBuZXdEYXRlLnNldEZ1bGxZZWFyKGRhdGUuZ2V0RnVsbFllYXIoKSArIHllYXJzKTtcbiAgICByZXR1cm4gbmV3RGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgbnVtYmVyIG9mIGRheXMgYmV0d2VlbiB0d28gZGF0ZVxuICAgKiBAcGFyYW0gc3RhcnREYXRlXG4gICAqIEBwYXJhbSBlbmREYXRlXG4gICAqIEBwYXJhbSBhYnNvbHV0ZSByZXR1cm4gdW5zaWduZWQgcmVzdWx0XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNvdW50RGF5cyhzdGFydERhdGU6IERhdGUsIGVuZERhdGU6IERhdGUsIGFic29sdXRlOiBib29sZWFuID0gZmFsc2UpOiBudW1iZXIge1xuICAgIGNvbnN0IGRpZmZlcmVuY2VJblRpbWUgPSBlbmREYXRlLmdldFRpbWUoKSAtIHN0YXJ0RGF0ZS5nZXRUaW1lKCk7XG4gICAgY29uc3QgZGlmZiA9IGFic29sdXRlID8gTWF0aC5hYnMoZGlmZmVyZW5jZUluVGltZSkgOiBkaWZmZXJlbmNlSW5UaW1lO1xuICAgIHJldHVybiBNYXRoLmNlaWwoZGlmZiAvICgxMDAwICogMzYwMCAqIDI0KSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgc3RyaW5nIGlzIGEgZGF0ZSB3aXRoIGlzbyBmb3JtYXRcbiAgICogQHBhcmFtIHZhbHVlIHRoZSBzdHJpbmdcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaXNJc29TdHJpbmcodmFsdWU6IHN0cmluZyB8IG51bGwpOiBib29sZWFuIHtcbiAgICBpZiAoIXZhbHVlIHx8ICEvXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0uXFxkezN9Wi8udGVzdCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICByZXR1cm4gISFkICYmICFpc05hTihkLmdldFRpbWUoKSkgJiYgZC50b0lTT1N0cmluZygpID09PSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGlzbyBzdHJpbmcgdG8gRGF0ZVxuICAgKiBAcGFyYW0gaXNvU3RyaW5nIHRoZSBpc28gc3RyaW5nXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlzb1N0cmluZ1RvRGF0ZShpc29TdHJpbmc6IHN0cmluZyB8IG51bGwpOiBEYXRlIHwgbnVsbCB7XG4gICAgcmV0dXJuIGlzb1N0cmluZyA/IG5ldyBEYXRlKERhdGUucGFyc2UoaXNvU3RyaW5nKSkgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB0aW1lIGZyb20gYW4gaXNvIGRhdGUgc3RyaW5nXG4gICAqIEBwYXJhbSBpc29TdHJpbmcgdGhlIGlzbyBzdHJpbmdcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaXNvU3RyaW5nUmVtb3ZlVGltZShpc29TdHJpbmc6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGRhdGUgPSBJdERhdGVVdGlscy5pc29TdHJpbmdUb0RhdGUoaXNvU3RyaW5nKTtcbiAgICBpZiAoIWRhdGUpIHtcbiAgICAgIHJldHVybiBpc29TdHJpbmc7XG4gICAgfVxuICAgIGNvbnN0IG9mZnNldCA9IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICBkYXRlID0gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkgLSBvZmZzZXQgKiA2MCAqIDEwMDApO1xuICAgIHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKCkuc3Vic3RyaW5nKDAsIGlzb1N0cmluZy5pbmRleE9mKCdUJykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBpc28gc3RyaW5nIGhvdXJzIHRvIDAgYW5kIGZvcm1hdCBjb3JyZWN0bHkgdGhlIGRhdGUgKGNvbnNpZGVyIHRpbWV6b25lIG9mZnNldClcbiAgICogQGV4YW1wbGUgJzIwMjQtMDMtMDRUMjM6MDA6MDAuMDAwWicgLT4gJzIwMjQtMDMtMDVUMDA6MDA6MDAuMDAwWidcbiAgICogQHBhcmFtIGlzb1N0cmluZyB0aGUgaXNvIHN0cmluZ1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpc29TdHJpbmdTZXRaZXJvVGltZShpc29TdHJpbmc6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGRhdGUgPSBJdERhdGVVdGlscy5pc29TdHJpbmdUb0RhdGUoaXNvU3RyaW5nKTtcbiAgICBpZiAoIWRhdGUpIHtcbiAgICAgIHJldHVybiBpc29TdHJpbmc7XG4gICAgfVxuICAgIGNvbnN0IG9mZnNldCA9IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICBkYXRlID0gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkgLSBvZmZzZXQgKiA2MCAqIDEwMDApO1xuICAgIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7XG4gICAgcmV0dXJuIGRhdGUudG9JU09TdHJpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgdGhlIGRhdGUgdGltZSBsZWZ0IGFuZCByZXR1cm4gdGhlIHN0cmluZyBmb3JtYXQgW2QgaCBtIHNdXG4gICAqIEBwYXJhbSBlbmREYXRlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHRpbWVMZWZ0U3RyaW5nKGVuZERhdGU6IERhdGUpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIGNvbnN0IGVuZFRpbWUgPSBlbmREYXRlLmdldFRpbWUoKTtcbiAgICByZXR1cm4gdGltZXIoMCwgMTAwMCkucGlwZShcbiAgICAgIG1hcCgoKSA9PiBNYXRoLmZsb29yKChlbmRUaW1lIC0gbmV3IERhdGUoKS5nZXRUaW1lKCkpIC8gMTAwMCkpLFxuICAgICAgdGFrZVdoaWxlKGRlbHRhID0+IGRlbHRhID49IDApLFxuICAgICAgbWFwKGRlbHRhID0+IHtcbiAgICAgICAgY29uc3QgYXJyYXlSZXN1bHQ6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICAgICAgY29uc3QgZGF5cyA9IE1hdGguZmxvb3IoZGVsdGEgLyA2MCAvIDYwIC8gMjQpO1xuICAgICAgICBpZiAoZGF5cyA+IDApIHtcbiAgICAgICAgICBhcnJheVJlc3VsdC5wdXNoKGRheXMgKyAnZCcpO1xuICAgICAgICB9XG4gICAgICAgIGRlbHRhIC09IGRheXMgKiA2MCAqIDYwICogMjQ7XG4gICAgICAgIGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcihkZWx0YSAvIDYwIC8gNjApICUgMjQ7XG4gICAgICAgIGlmIChob3VycyA+IDApIHtcbiAgICAgICAgICBhcnJheVJlc3VsdC5wdXNoKGhvdXJzICsgJ2gnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbHRhIC09IGhvdXJzICogNjAgKiA2MDtcbiAgICAgICAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3IoZGVsdGEgLyA2MCkgJSA2MDtcbiAgICAgICAgYXJyYXlSZXN1bHQucHVzaChtaW51dGVzICsgJ20nKTtcblxuICAgICAgICBkZWx0YSAtPSBtaW51dGVzICogNjA7XG4gICAgICAgIGNvbnN0IHNlY29uZHMgPSBkZWx0YSAlIDYwO1xuICAgICAgICBhcnJheVJlc3VsdC5wdXNoKHNlY29uZHMgKyAncycpO1xuXG4gICAgICAgIHJldHVybiBhcnJheVJlc3VsdC5qb2luKCcgJyk7XG4gICAgICB9KSxcbiAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgdGhlIG5leHQgZGF5IG9mIHdlZWtcbiAgICogQHBhcmFtIGRheU9mV2VlayBEYXkgb2Ygd2VlayAwPVN1bmRheSwgMT1Nb25kYXkuLi40PVRodXJzZGF5Li4uXG4gICAqIEBwYXJhbSBob3VyIHRoZSBzcGVjaWYgaG91clxuICAgKiBAcGFyYW0gbWludXRlIHRoZSBzcGVjaWZpYyBtaW51dGVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbmV4dFdlZWtEYXlBbmRUaW1lKGRheU9mV2VlazogbnVtYmVyLCBob3VyID0gMCwgbWludXRlID0gMCk6IERhdGUge1xuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IERhdGUobm93LmdldEZ1bGxZZWFyKCksIG5vdy5nZXRNb250aCgpLCBub3cuZ2V0RGF0ZSgpICsgKCg3ICsgZGF5T2ZXZWVrIC0gbm93LmdldERheSgpKSAlIDcpLCBob3VyLCBtaW51dGUsIDAsIDApO1xuXG4gICAgaWYgKHJlc3VsdCA8IG5vdykge1xuICAgICAgcmVzdWx0LnNldERhdGUocmVzdWx0LmdldERhdGUoKSArIDcpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiJdfQ==