@singleton-i18n/angular-client
Version:
Singleton client code for Angular 10.
571 lines • 72.9 kB
JavaScript
/*
* Copyright 2019-2021 VMware, Inc.
* SPDX-License-Identifier: EPL-2.0
*/
import { Injectable } from '@angular/core';
export class DateFormatter {
constructor() { }
/**
* Convert number or string to standard time
* @param date
* @return instance of Date or origin string
*/
getStandardTime(date) {
const NUMBER_STRING = /^-?\d+$/;
if (typeof date === 'string') {
date = NUMBER_STRING.test(date) ? toInt(date) : getDateByString(date);
}
if (typeof date === 'number') {
date = new Date(date);
}
return date;
}
/**
* Get locale date time from standard date string
* @return Formatted locale date time string
*/
getformattedString(date, pattern, localeData, minusSign = '-', timezone) {
this.localeData = localeData;
const rules = this.getRulesByPattern(pattern, localeData);
const parts = this.patternFilter(rules);
let dateTimezoneOffset = date.getTimezoneOffset();
if (timezone) {
dateTimezoneOffset = timezoneToOffset(timezone, dateTimezoneOffset);
date = convertTimezoneToLocal(date, timezone);
}
let text = '';
parts.forEach(value => {
const fn = this.getFormatFunctionByRule(value, minusSign);
text += fn ? fn(date, dateTimezoneOffset)
: value === '\'\'' ? '\'' : value.replace(/(^'|'$)/g, '').replace(/''/g, '\'');
});
return text;
}
getRulesByPattern(pattern, localeData) {
this.localeData = localeData;
return this.getRules(pattern) ? this.getRules(pattern) : pattern;
}
/**
* Get rules from pattern by type
* @return The function to get locale string
*/
getRules(pattern) {
let rules;
switch (pattern) {
case 'shortTime':
rules = this.getRulesInPattern('time', 'short');
break;
case 'mediumTime':
rules = this.getRulesInPattern('time', 'medium');
break;
case 'longTime':
rules = this.getRulesInPattern('time', 'long');
break;
case 'fullTime':
rules = this.getRulesInPattern('time', 'full');
break;
case 'shortDate':
rules = this.getRulesInPattern('date', 'short');
break;
case 'mediumDate':
rules = this.getRulesInPattern('date', 'medium');
break;
case 'longDate':
rules = this.getRulesInPattern('date', 'long');
break;
case 'fullDate':
rules = this.getRulesInPattern('date', 'full');
break;
case 'short':
const shortDate = this.getRulesInPattern('date', 'short');
const shortTime = this.getRulesInPattern('time', 'short');
rules = this.formatDateTimeRules('short', [shortTime, shortDate]);
break;
case 'medium':
const mediumDate = this.getRulesInPattern('date', 'medium');
const mediumTime = this.getRulesInPattern('time', 'medium');
rules = this.formatDateTimeRules('medium', [mediumTime, mediumDate]);
break;
case 'full':
const fullDate = this.getRulesInPattern('date', 'full');
const fullTime = this.getRulesInPattern('time', 'full');
rules = this.formatDateTimeRules('full', [fullTime, fullDate]);
break;
case 'long':
const longDate = this.getRulesInPattern('date', 'long');
const longTime = this.getRulesInPattern('time', 'long');
rules = this.formatDateTimeRules('long', [longTime, longDate]);
break;
default:
rules = this.getRulesInPattern('dateTime', pattern);
}
return rules;
}
getRulesInPattern(name, type) {
const rules = name !== 'dateTime' ? this.localeData[name + 'Formats'][type]
: this.localeData[name + 'Formats']['availableFormats'][type];
return rules;
}
/**
* The date-time pattern shows how to combine separate patterns for date (represented by {1})
* and time (represented by {0}) into a single pattern.
*/
formatDateTimeRules(type, rulesArray) {
const format = this.localeData.dateTimeFormats[type];
const rules = format.replace(/\{([^}]+)}/g, function (match, key) {
return (rulesArray != null && key in rulesArray) ? rulesArray[key] : match;
});
return rules;
}
/**
* Get locale date string from pattern
*/
dateStrGetter(name, width, type = 'format') {
return (date) => {
let text = '';
switch (name) {
case 'Day':
text = this.getLocaleString(date, name, width, type);
break;
case 'Month':
text = this.getLocaleString(date, name, width, type);
break;
case 'dayPeriods':
text = this.getDaysPeriods(date, name, width);
break;
case 'eras':
text = this.getEras(date, name, width);
break;
}
return text;
};
}
getLocaleString(date, name, width, type = 'format') {
const firstLetter = type.slice(0, 1);
type = type.replace(firstLetter, firstLetter.toUpperCase());
const namestr = name + 's';
const patternName = namestr.toLowerCase() + type;
const value = getPartOfDate(date, name);
const pattern = this.localeData[patternName][width];
return pattern[value];
}
/**
* Get periods of the day
*/
getDaysPeriods(date, name, width) {
const pattern = this.localeData.dayPeriodsFormat[width];
return date.getHours() < 12 ? pattern[0] : pattern[1];
}
/**
* Get eras
*/
getEras(date, name, width) {
const pattern = this.localeData.eras[width];
return date.getFullYear() < 0 ? pattern[0] : pattern[1];
}
/**
* Convert pattern string to pattern array
*/
patternFilter(pattern) {
let parts = [], match;
const mainWord = 'GyMLwWdEahHKmsSzZO', wordRange = 'G{1,5}|y{1,4}|M{1,5}|L{1,5}|w{1,2}|W{1}|d{1,2}|E{1,6}|a{1,5}|h{1,2}|H{1,2}|K{1,2}|m{1,2}|s{1,2}|S{1,3}|z{1,4}|Z{1,5}|O{1,4}';
const reg = `((?:[^` + mainWord + `']+)|(?:'(?:[^']|'')*')|(?:` + wordRange + '))([\\s\\S]*)';
const DATE_FORMATS_SPLIT = new RegExp(reg);
while (pattern) {
match = DATE_FORMATS_SPLIT.exec(pattern);
if (match) {
parts = this.concat(parts, match, 1);
pattern = parts.pop();
}
else {
parts.push(pattern);
pattern = null;
}
}
return parts;
}
concat(array1, array2, index) {
return array1.concat([].slice.call(array2, index));
}
/**
* Corresponding function of the rule
*/
getFormatFunctionByRule(rule, minusSign) {
let fn = null;
switch (rule) {
// Era string for the current date
case 'G':
case 'GG':
case 'GGG':
fn = this.dateStrGetter('eras', 'abbreviated');
break;
case 'GGGG':
fn = this.dateStrGetter('eras', 'wide');
break;
case 'GGGGG':
fn = this.dateStrGetter('eras', 'narrow');
break;
// Calendar year (numeric).
case 'y':
fn = dateGetter('FullYear', 1, 0, false, true);
break;
case 'yy':
fn = dateGetter('FullYear', 2, 0, true, true);
break;
case 'yyy':
fn = dateGetter('FullYear', 3, 0, false, true);
break;
case 'yyyy':
fn = dateGetter('FullYear', 4, 0, false, true);
break;
// Month number/name, format style (intended to be used in conjunction with ‘d’ for day number).
case 'M':
case 'L':
fn = dateGetter('Month', 1, 1);
break;
case 'MM':
case 'LL':
fn = dateGetter('Month', 2, 1);
break;
case 'MMM':
fn = this.dateStrGetter('Month', 'abbreviated');
break;
case 'MMMM':
fn = this.dateStrGetter('Month', 'wide');
break;
case 'MMMMM':
fn = this.dateStrGetter('Month', 'narrow');
break;
// Stand-Alone Month number/name (intended to be used without ‘d’ for day number).
case 'LLL':
fn = this.dateStrGetter('Month', 'abbreviated', 'standalone');
break;
case 'LLLL':
fn = this.dateStrGetter('Month', 'wide', 'standalone');
break;
case 'LLLLL':
fn = this.dateStrGetter('Month', 'narrow', 'standalone');
break;
// Week of Year (numeric).
case 'w':
fn = weekGetter(1);
break;
case 'ww':
fn = weekGetter(2);
break;
// Week of Month (numeric)
case 'W':
fn = weekGetter(1, true);
break;
// Day of month (numeric).
case 'd':
fn = dateGetter('Date', 1);
break;
case 'dd':
fn = dateGetter('Date', 2);
break;
// Day of week name, format style.
case 'E':
case 'EE':
case 'EEE':
fn = this.dateStrGetter('Day', 'abbreviated');
break;
case 'EEEE':
fn = this.dateStrGetter('Day', 'wide');
break;
case 'EEEEE':
fn = this.dateStrGetter('Day', 'narrow');
break;
case 'EEEEEE':
fn = this.dateStrGetter('Day', 'short');
break;
// AM, PM
case 'a':
case 'aa':
case 'aaa':
fn = this.dateStrGetter('dayPeriods', 'abbreviated');
break;
case 'aaaa':
fn = this.dateStrGetter('dayPeriods', 'wide');
break;
case 'aaaaa':
fn = this.dateStrGetter('dayPeriods', 'narrow');
break;
// Hour [1-12].
case 'h':
fn = dateGetter('Hours', 1, -12);
break;
case 'hh':
fn = dateGetter('Hours', 2, -12);
break;
// Hour [0-23].
case 'H':
fn = dateGetter('Hours', 1);
break;
case 'HH':
fn = dateGetter('Hours', 2);
break;
// Hour K [0-11]
case 'K':
fn = dateGetter('Hours', 1, -13);
break;
case 'KK':
fn = dateGetter('Hours', 2, -13);
break;
// Minute (numeric).
case 'm':
fn = dateGetter('Minutes', 1);
break;
case 'mm':
fn = dateGetter('Minutes', 2);
break;
// Second (numeric).
case 's':
fn = dateGetter('Seconds', 1);
break;
case 'ss':
fn = dateGetter('Seconds', 2);
break;
// Fractional second padded
case 'S':
fn = dateGetter('Milliseconds', 1);
break;
case 'SS':
fn = dateGetter('Milliseconds', 2);
break;
case 'SSS':
fn = dateGetter('Milliseconds', 3);
break;
// Timezone ISO8601 short format (-0430)
case 'Z':
case 'ZZ':
case 'ZZZ':
fn = timeZoneGetter('short', minusSign);
break;
case 'ZZZZZ':
fn = timeZoneGetter('extended', minusSign);
break;
// Timezone GMT short format (GMT+4)
case 'O':
case 'OO':
case 'OOO':
case 'z':
case 'zz':
case 'zzz':
fn = timeZoneGetter('shortGMT', minusSign);
break;
case 'OOOO':
case 'ZZZZ':
case 'zzzz':
fn = timeZoneGetter('long', minusSign);
break;
default:
return null;
}
return fn;
}
}
DateFormatter.decorators = [
{ type: Injectable }
];
DateFormatter.ctorParameters = () => [];
/**
* Format date from iso8601 time string
*/
function IsoToDate(match) {
const date = new Date(0), dateSetter = match[8] ? date.setUTCFullYear : date.setFullYear, timeSetter = match[8] ? date.setUTCHours : date.setHours;
let tzHour = 0, tzMin = 0;
if (match[9]) {
tzHour = toInt(match[9] + match[10]);
tzMin = toInt(match[9] + match[11]);
}
dateSetter.call(date, toInt(match[1]), toInt(match[2]) - 1, toInt(match[3]));
const h = toInt(match[4] || 0) - tzHour;
const m = toInt(match[5] || 0) - tzMin;
const s = toInt(match[6] || 0);
const ms = Math.round(parseFloat('0.' + (match[7] || 0)) * 1000);
timeSetter.call(date, h, m, s, ms);
return date;
}
function padNumber(num, digits, trim, negWrap) {
const ZERO_CHAR = '0';
let neg = '';
if (num < 0 || (negWrap && num <= 0)) {
if (negWrap) {
num = -num + 1;
}
else {
num = -num;
neg = '-';
}
}
num = '' + num;
while (num.length < digits) {
num = ZERO_CHAR + num;
}
if (trim) {
num = num.substr(num.length - digits);
}
return neg + num;
}
/**
* Convert string to standard date string
* @param dateString eg '2017,12,06' R_ISO8601_STR-> '2015/06/15T09:03:01+0900'
* @return Date / string
*/
function getDateByString(dateString) {
let string;
const isIE = navigator.userAgent.indexOf('Trident');
const isSafari = navigator.userAgent.indexOf('Safari') > -1 && navigator.userAgent.indexOf('Chrome') < 0;
string = dateString.indexOf('/') ? dateString.replace(/\//g, '-') : dateString;
if ((isSafari || isIE) && string.indexOf('T') < 0) {
string = string.replace(/-/g, '/');
}
let match;
const R_ISO8601_STR = /^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;
if ((match = string.match(R_ISO8601_STR))) {
return IsoToDate(match);
}
else {
const date = new Date(string);
if (date.toString() === 'Invalid Date') {
return dateString;
}
return date;
}
}
/**
* Get date string from date
* @param name
* @param size
* @param offset
* @param trim
* @param negWrap
*/
function dateGetter(name, size, offset, trim, negWrap) {
offset = offset || 0;
return function (date) {
let value = getPartOfDate(date, name);
if (offset > 0 || value > -offset) {
value += offset;
}
if (value === 0 && offset === -12) {
value = 12;
}
return padNumber(value, size, trim, negWrap);
};
}
function getPartOfDate(date, name) {
switch (name) {
case 'FullYear':
return date.getFullYear();
case 'Month':
return date.getMonth();
case 'Date':
return date.getDate();
case 'Hours':
return date.getHours();
case 'Minutes':
return date.getMinutes();
case 'Seconds':
return date.getSeconds();
case 'Milliseconds':
return date.getMilliseconds();
case 'Day':
return date.getDay();
default:
throw new Error(`Unknown DateType value "${name}".`);
}
}
/**
* Get time difference from timezone
*/
function timezoneToOffset(timezone, fallback) {
// Support military time zone Z
// Date.parse not support to handle military time zone in Firefox.
// TODO: Need better support for time zones, offset/time zone names/other abbreviations
if (timezone === 'Z') {
return 0;
}
const ALL_COLONS = /:/g;
// Support: IE 9-11 only, Edge 13-15+
// IE/Edge do not "understand" colon (`:`) in timezone
timezone = timezone.replace(ALL_COLONS, '');
const requestedTimezoneOffset = Date.parse('Jan 01, 1970 00:00:00 ' + timezone) / 60000;
const isNaN = Number.isNaN || function isNumberNaN(num) {
return num !== num;
};
return isNaN(requestedTimezoneOffset) ? fallback : requestedTimezoneOffset;
}
function convertTimezoneToLocal(date, timezone) {
// get Time difference between local time and GMT
const dateTimezoneOffset = date.getTimezoneOffset();
// get Time difference between timezone time and GMT
const timezoneOffset = timezoneToOffset(timezone, dateTimezoneOffset);
return addDateMinutes(date, -1 * (timezoneOffset - dateTimezoneOffset));
}
/**
*Returns a date formatter that transforms a date and an offset into a timezone with ISO8601 or
* GMT format depending on the width (eg: short = +0430, short:GMT = GMT+4, long = GMT+04:30)
*/
function timeZoneGetter(type, minusSign) {
return (date, offset) => {
const zone = -1 * offset;
const hours = zone > 0 ? Math.floor(zone / 60) : Math.ceil(zone / 60);
switch (type) {
case 'short':
return ((zone >= 0) ? '+' : '') + padNumber(hours, 2) +
padNumber(Math.abs(zone % 60), 2);
case 'shortGMT':
return 'GMT' + ((zone >= 0) ? '+' : '') + padNumber(hours, 1);
case 'long':
return 'GMT' + ((zone >= 0) ? '+' : '') + padNumber(hours, 2) + ':' +
padNumber(Math.abs(zone % 60), 2);
case 'extended':
if (offset === 0) {
return 'Z';
}
else {
return ((zone >= 0) ? '+' : '') + padNumber(hours, 2) + ':' +
padNumber(Math.abs(zone % 60), 2);
}
}
};
}
function addDateMinutes(date, minutes) {
date = new Date(date.getTime());
date.setMinutes(date.getMinutes() + minutes);
return date;
}
function getFirstThursdayOfYear(year) {
// 0 = index of January
const dayOfWeekOnFirst = (new Date(year, 0, 1)).getDay();
// 4 = index of Thursday (+1 to account for 1st = 5)
// 11 = index of *next* Thursday (+1 account for 1st = 12)
return new Date(year, 0, ((dayOfWeekOnFirst <= 4) ? 5 : 12) - dayOfWeekOnFirst);
}
function getThursdayThisWeek(datetime) {
return new Date(datetime.getFullYear(), datetime.getMonth(),
// 4 = index of Thursday
datetime.getDate() + (4 - datetime.getDay()));
}
function weekGetter(size, isWeek = false) {
return function (date) {
let result;
if (isWeek) {
const nbDaysBefore1stDayOfMonth = new Date(date.getFullYear(), date.getMonth(), 1).getDay() - 1;
const today = date.getDate();
result = 1 + Math.floor((today + nbDaysBefore1stDayOfMonth) / 7);
}
else {
const firstThurs = getFirstThursdayOfYear(date.getFullYear()), thisThurs = getThursdayThisWeek(date);
const diff = +thisThurs - +firstThurs;
result = 1 + Math.round(diff / 6.048e8); // 6.048e8 ms per week
}
return padNumber(result, size);
};
}
function toInt(str) {
return parseInt(str, 10);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS5mb3JtYXR0ZXIuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvcmxpZ2VuZy9Qcm9qZWN0cy9EZXZvcHMvQ2xpZW50X0FuZ3VsYXJfR2l0SHViX05wbWpzL3ZpcC9jaS9wdWIyb3JnL0NsaWVudF9Bbmd1bGFyX0dpdEh1Yl9OcG1qcy9zaW5nbGV0b24vcHJvamVjdHMvYW5ndWxhci1jbGllbnQvIiwic291cmNlcyI6WyJzcmMvZm9ybWF0dGVycy9kYXRlLmZvcm1hdHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNDLE1BQU0sT0FBTyxhQUFhO0lBRXRCLGdCQUFlLENBQUM7SUFDaEI7Ozs7TUFJRTtJQUNLLGVBQWUsQ0FBQyxJQUFTO1FBQzVCLE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQztRQUNoQyxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUMxQixJQUFJLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDekU7UUFDRCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUMxQixJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDekI7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksa0JBQWtCLENBQUMsSUFBVSxFQUFFLE9BQWUsRUFBRSxVQUFlLEVBQUUsWUFBb0IsR0FBRyxFQUFFLFFBQWlCO1FBQzlHLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDMUQsTUFBTSxLQUFLLEdB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Q0FBQyxDQUFDLENBQUMsc0JBQXNCO1NBQ2xFO1FBQ0QsT0FBTyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUMsQ0FBQztBQUNOLENBQUM7QUFFRCxTQUFTLEtBQUssQ0FBQyxHQUFXO0lBQ3RCLE9BQU8sUUFBUSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDE5LTIwMjEgVk13YXJlLCBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEYXRlRm9ybWF0dGVyIHtcbiAgICBwcml2YXRlIGxvY2FsZURhdGE6IGFueTtcbiAgICBjb25zdHJ1Y3RvcigpIHt9XG4gICAgLyoqXG4gICAgICogQ29udmVydCBudW1iZXIgb3Igc3RyaW5nIHRvIHN0YW5kYXJkIHRpbWVcbiAgICAgKiBAcGFyYW0gZGF0ZVxuICAgICAqIEByZXR1cm4gaW5zdGFuY2Ugb2YgRGF0ZSBvciBvcmlnaW4gc3RyaW5nXG4gICAgKi9cbiAgICBwdWJsaWMgZ2V0U3RhbmRhcmRUaW1lKGRhdGU6IGFueSApOiBhbnkge1xuICAgICAgICBjb25zdCBOVU1CRVJfU1RSSU5HID0gL14tP1xcZCskLztcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZGF0ZSA9IE5VTUJFUl9TVFJJTkcudGVzdChkYXRlKSA/IHRvSW50KGRhdGUpIDogZ2V0RGF0ZUJ5U3RyaW5nKGRhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZGF0ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZShkYXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgbG9jYWxlIGRhdGUgdGltZSBmcm9tIHN0YW5kYXJkIGRhdGUgc3RyaW5nXG4gICAgICogQHJldHVybiBGb3JtYXR0ZWQgbG9jYWxlIGRhdGUgdGltZSBzdHJpbmdcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Zm9ybWF0dGVkU3RyaW5nKGRhdGU6IERhdGUsIHBhdHRlcm46IHN0cmluZywgbG9jYWxlRGF0YTogYW55LCBtaW51c1NpZ246IHN0cmluZyA9ICctJywgdGltZXpvbmU/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICB0aGlzLmxvY2FsZURhdGEgPSBsb2NhbGVEYXRhO1xuICAgICAgICBjb25zdCBydWxlcyA9IHRoaXMuZ2V0UnVsZXNCeVBhdHRlcm4ocGF0dGVybiwgbG9jYWxlRGF0YSk7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gdGhpcy5wYXR0ZXJuRmlsdGVyKHJ1bGVzKTtcbiAgICAgICAgbGV0IGRhdGVUaW1lem9uZU9mZnNldCA9IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICAgICAgaWYgKHRpbWV6b25lKSB7XG4gICAgICAgICAgICBkYXRlVGltZXpvbmVPZmZzZXQgPSB0aW1lem9uZVRvT2Zmc2V0KHRpbWV6b25lLCBkYXRlVGltZXpvbmVPZmZzZXQpO1xuICAgICAgICAgICAgZGF0ZSA9IGNvbnZlcnRUaW1lem9uZVRvTG9jYWwoZGF0ZSwgdGltZXpvbmUpO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0ZXh0ID0gJyc7XG4gICAgICAgIHBhcnRzLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICAgICAgY29uc3QgZm4gPSB0aGlzLmdldEZvcm1hdEZ1bmN0aW9uQnlSdWxlKHZhbHVlLCBtaW51c1NpZ24pO1xuICAgICAgICAgICAgdGV4dCArPSBmbiA/IGZuKGRhdGUsIGRhdGVUaW1lem9uZU9mZnNldClcbiAgICAgICAgICAgIDogdmFsdWUgPT09ICdcXCdcXCcnID8gJ1xcJycgOiB2YWx1ZS5yZXBsYWNlKC8oXid8JyQpL2csICcnKS5yZXBsYWNlKC8nJy9nLCAnXFwnJyk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UnVsZXNCeVBhdHRlcm4ocGF0dGVybjogc3RyaW5nLCBsb2NhbGVEYXRhOiBhbnkpIHtcbiAgICAgICAgdGhpcy5sb2NhbGVEYXRhID0gbG9jYWxlRGF0YTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UnVsZXMocGF0dGVybikgPyB0aGlzLmdldFJ1bGVzKHBhdHRlcm4pIDogcGF0dGVybjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgcnVsZXMgZnJvbSBwYXR0ZXJuIGJ5IHR5cGVcbiAgICAgKiBAcmV0dXJuIFRoZSBmdW5jdGlvbiB0byBnZXQgbG9jYWxlIHN0cmluZ1xuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0UnVsZXMocGF0dGVybjogc3RyaW5nKTogc3RyaW5nfHVuZGVmaW5lZCB7XG4gICAgICAgIGxldCBydWxlcztcbiAgICAgICAgc3dpdGNoIChwYXR0ZXJuKSB7XG4gICAgICAgICAgICBjYXNlICdzaG9ydFRpbWUnOiBydWxlcyA9IHRoaXMuZ2V0UnVsZXNJblBhdHRlcm4oJ3RpbWUnLCAnc2hvcnQnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbWVkaXVtVGltZSc6IHJ1bGVzID0gdGhpcy5nZXRSdWxlc0luUGF0dGVybigndGltZScsICdtZWRpdW0nKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbG9uZ1RpbWUnOiBydWxlcyA9IHRoaXMuZ2V0UnVsZXNJblBhdHRlcm4oJ3RpbWUnLCAnbG9uZycpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdmdWxsVGltZSc6IHJ1bGVzID0gdGhpcy5nZXRSdWxlc0luUGF0dGVybigndGltZScsICdmdWxsJyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3Nob3J0RGF0ZSc6IHJ1bGVzID0gdGhpcy5nZXRSdWxlc0luUGF0dGVybignZGF0ZScsICdzaG9ydCcpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtZWRpdW1EYXRlJzogcnVsZXMgPSB0aGlzLmdldFJ1bGVzSW5QYXR0ZXJuKCdkYXRlJywgJ21lZGl1bScpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdsb25nRGF0ZSc6IHJ1bGVzID0gdGhpcy5nZXRSdWxlc0luUGF0dGVybignZGF0ZScsICdsb25nJyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2Z1bGxEYXRlJzogcnVsZXMgPSB0aGlzLmdldFJ1bGVzSW5QYXR0ZXJuKCdkYXRlJywgJ2Z1bGwnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnc2hvcnQnOlxuICAgICAgICAgICAgICAgIGNvbnN0IHNob3J0RGF0ZSA9IHRoaXMuZ2V0UnVsZXNJblBhdHRlcm4oJ2RhdGUnLCAnc2hvcnQnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzaG9ydFRpbWUgPSB0aGlzLmdldFJ1bGVzSW5QYXR0ZXJuKCd0aW1lJywgJ3Nob3J0Jyk7XG4gICAgICAgICAgICAgICAgcnVsZXMgPSB0aGlzLmZvcm1hdERhdGVUaW1lUnVsZXMoICdzaG9ydCcsIFtzaG9ydFRpbWUsIHNob3J0RGF0ZV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtZWRpdW0nOlxuICAgICAgICAgICAgICAgIGNvbnN0IG1lZGl1bURhdGUgPSB0aGlzLmdldFJ1bGVzSW5QYXR0ZXJuKCdkYXRlJywgJ21lZGl1bScpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lZGl1bVRpbWUgPSB0aGlzLmdldFJ1bGVzSW5QYXR0ZXJuKCd0aW1lJywgJ21lZGl1bScpO1xuICAgICAgICAgICAgICAgIHJ1bGVzID0gdGhpcy5mb3JtYXREYXRlVGltZVJ1bGVzKCAnbWVkaXVtJywgW21lZGl1bVRpbWUsIG1lZGl1bURhdGVdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZnVsbCc6XG4gICAgICAgICAgICAgICAgY29uc3QgZnVsbERhdGUgPSB0aGlzLmdldFJ1bGVzSW5QYXR0ZXJuKCdkYXRlJywgJ2Z1bGwnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmdWxsVGltZSA9IHRoaXMuZ2V0UnVsZXNJblBhdHRlcm4oJ3RpbWUnLCAnZnVsbCcpO1xuICAgICAgICAgICAgICAgIHJ1bGVzID0gdGhpcy5mb3JtYXREYXRlVGltZVJ1bGVzKCAnZnVsbCcsIFtmdWxsVGltZSwgZnVsbERhdGVdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbG9uZyc6XG4gICAgICAgICAgICAgICAgY29uc3QgbG9uZ0RhdGUgPSB0aGlzLmdldFJ1bGVzSW5QYXR0ZXJuKCdkYXRlJywgJ2xvbmcnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBsb25nVGltZSA9IHRoaXMuZ2V0UnVsZXNJblBhdHRlcm4oJ3RpbWUnLCAnbG9uZycpO1xuICAgICAgICAgICAgICAgIHJ1bGVzID0gdGhpcy5mb3JtYXREYXRlVGltZVJ1bGVzKCAnbG9uZycsIFtsb25nVGltZSwgbG9uZ0RhdGVdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBydWxlcyA9IHRoaXMuZ2V0UnVsZXNJblBhdHRlcm4oJ2RhdG