UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

191 lines 25 kB
import { Pipe } from '@angular/core'; import { aggregationType as AggregationTypeEnum } from '@c8y/client'; import * as i0 from "@angular/core"; /** * A pipe that adjusts the aggregated time range based on the aggregation type. * * ```html * '9:00' | adjustAggregatedTimeRange: config.aggregation (e.g.:HOURLY) * ``` * The output will be '9:00-10:00'. */ export class AdjustAggregatedTimeRangePipe { /** * Transforms the input time based on the aggregation type. * @param inputTime The input time string. * @param aggregationType The type of aggregation (optional). * @returns The transformed time string. */ transform(inputTime, aggregationType) { if (!aggregationType) { return inputTime; } if (aggregationType === AggregationTypeEnum.DAILY) { return ''; } const date = this.createDateFromInput(inputTime); const isTwelveHoursFormat = this.isTwelveHoursFormat(inputTime); switch (aggregationType) { case AggregationTypeEnum.HOURLY: return this.getHourlyTimeRange(date, isTwelveHoursFormat); case AggregationTypeEnum.MINUTELY: return this.getMinutelyTimeRange(date, isTwelveHoursFormat); default: throw new Error('Unsupported aggregation type'); } } /** * Creates a date object from the input time string. * @param inputTime The input time string. * @returns The created Date object. */ createDateFromInput(inputTime) { const defaultDate = '1970-01-01 '; const isPM = /PM/i.test(inputTime); const cleanedTime = inputTime.replace(/AM|PM/i, '').trim(); this.validateTimeFormat(cleanedTime, inputTime); const dateTimeString = `${defaultDate}${cleanedTime}`; const date = new Date(dateTimeString); if (isNaN(date.getTime())) { throw new Error('Invalid input time'); } return this.adjustForPMTime(date, isPM); } /** * Validates if the time string matches the required format and has valid values. * @param time The time string to validate. * @param originalInput The original input string (including AM/PM if present). * @throws Error if the time format is invalid or values are out of range. */ validateTimeFormat(time, originalInput) { const parts = time.split(':'); this.validateTimeParts(parts); const [hoursStr, minutesStr, secondsStr] = parts; this.validateTimeDigits(hoursStr, minutesStr, secondsStr); const { hours, minutes, seconds } = this.parseTimeComponents(hoursStr, minutesStr, secondsStr); this.validateTimeRanges(hours, minutes, seconds); this.validateTimeFormat24Hour(hours, originalInput); } validateTimeParts(parts) { if (parts.length < 2 || parts.length > 3) { throw new Error('Invalid input time'); } } validateTimeDigits(hoursStr, minutesStr, secondsStr) { if (!this.isValidNumberString(hoursStr) || !this.isValidNumberString(minutesStr) || (secondsStr !== undefined && !this.isValidNumberString(secondsStr))) { throw new Error('Invalid input time'); } } parseTimeComponents(hoursStr, minutesStr, secondsStr) { return { hours: Number(hoursStr), minutes: Number(minutesStr), seconds: secondsStr ? Number(secondsStr) : 0 }; } validateTimeRanges(hours, minutes, seconds) { if (hours > 23 || hours < 0 || minutes > 59 || minutes < 0 || seconds > 59 || seconds < 0) { throw new Error('Invalid input time'); } } validateTimeFormat24Hour(hours, originalInput) { if (hours > 12 && this.hasAmPm(originalInput)) { throw new Error('Invalid input time'); } } /** * Checks if string contains only digits and is 1-2 characters long. * @param value String to check * @returns boolean indicating if string is valid */ isValidNumberString(value) { return (value.length > 0 && value.length <= 2 && value.split('').every(char => char >= '0' && char <= '9')); } /** * Checks if the input time has AM/PM markers. * @param input The input time string to check. * @returns boolean indicating if the input contains AM/PM. */ hasAmPm(input) { return /AM|PM/i.test(input); } /** * Adjusts the date for PM times by adding 12 hours when necessary. * @param date The date object to adjust. * @param isPM Boolean indicating if the time is PM. * @returns The adjusted Date object. */ adjustForPMTime(date, isPM) { const hours = date.getHours(); if (isPM && hours < 12) { date.setHours(hours + 12); } else if (!isPM && hours === 12) { date.setHours(0); } return date; } /** * Checks if the input time is in twelve hours format. * @param inputTime The input time string. * @returns True if the input time is in twelve hours format, false otherwise. */ isTwelveHoursFormat(inputTime) { return /AM|PM/i.test(inputTime); } /** * Gets the hourly time range for the given date. * @param date The date object. * @param twelveHoursFormat Indicates whether to use twelve hours format. * @returns The hourly time range string. */ getHourlyTimeRange(date, twelveHoursFormat) { const nextHour = new Date(date.getTime()); nextHour.setHours(date.getHours() + 1); return `${this.formatTime(date, twelveHoursFormat, true)}-${this.formatTime(nextHour, twelveHoursFormat, true)}`; } /** * Gets the minutely time range for the given date. * @param date The date object. * @param twelveHoursFormat Indicates whether to use twelve hours format. * @returns The minutely time range string. */ getMinutelyTimeRange(date, twelveHoursFormat) { const nextMinute = new Date(date.getTime()); nextMinute.setMinutes(date.getMinutes() + 1); return `${this.formatTime(date, twelveHoursFormat, false)}-${this.formatTime(nextMinute, twelveHoursFormat, false)}`; } /** * Formats the given date into a time string. * @param date The date to format. * @param usePeriod Indicates whether to include the period (AM/PM) in the formatted time. * @param useHourOnly Indicates whether to include only the hour part in the formatted time. * @returns The formatted time string. */ formatTime(date, usePeriod, useHourOnly) { const hours = date.getHours(); const minutes = date.getMinutes().toString().padStart(2, '0'); if (usePeriod) { const period = hours >= 12 ? 'PM' : 'AM'; const formattedHours = hours % 12 === 0 ? 12 : hours % 12; return `${formattedHours}:${useHourOnly ? '00' : minutes} ${period}`; } else { return `${hours.toString().padStart(2, '0')}:${useHourOnly ? '00' : minutes}`; } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AdjustAggregatedTimeRangePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); } static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: AdjustAggregatedTimeRangePipe, isStandalone: true, name: "adjustAggregatedTimeRange" }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AdjustAggregatedTimeRangePipe, decorators: [{ type: Pipe, args: [{ name: 'adjustAggregatedTimeRange', standalone: true }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRqdXN0LWFnZ3JlZ2F0ZWQtdGltZS1yYW5nZS5waXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vd2lkZ2V0cy9pbXBsZW1lbnRhdGlvbnMvZGF0YXBvaW50cy10YWJsZS9kYXRhcG9pbnRzLXRhYmxlLXZpZXcvYWRqdXN0LWFnZ3JlZ2F0ZWQtdGltZS1yYW5nZS5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ3BELE9BQU8sRUFBRSxlQUFlLElBQUksbUJBQW1CLEVBQUUsTUFBTSxhQUFhLENBQUM7O0FBR3JFOzs7Ozs7O0dBT0c7QUFLSCxNQUFNLE9BQU8sNkJBQTZCO0lBQ3hDOzs7OztPQUtHO0lBQ0gsU0FBUyxDQUFDLFNBQWlCLEVBQUUsZUFBbUM7UUFDOUQsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3JCLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRCxJQUFJLGVBQWUsS0FBSyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsRCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFFRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakQsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFaEUsUUFBUSxlQUFlLEVBQUUsQ0FBQztZQUN4QixLQUFLLG1CQUFtQixDQUFDLE1BQU07Z0JBQzdCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1lBQzVELEtBQUssbUJBQW1CLENBQUMsUUFBUTtnQkFDL0IsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7WUFDOUQ7Z0JBQ0UsTUFBTSxJQUFJLEtBQUss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LEVBQUUsU0FBa0IsRUFBRSxXQUFvQjtRQUNyRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDOUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDOUQsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLE1BQU0sTUFBTSxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ3pDLE1BQU0sY0FBYyxHQUFHLEtBQUssR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDMUQsT0FBTyxHQUFHLGNBQWMsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ3ZFLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNoRixDQUFDO0lBQ0gsQ0FBQzsrR0FqTVUsNkJBQTZCOzZHQUE3Qiw2QkFBNkI7OzRGQUE3Qiw2QkFBNkI7a0JBSnpDLElBQUk7bUJBQUM7b0JBQ0osSUFBSSxFQUFFLDJCQUEyQjtvQkFDakMsVUFBVSxFQUFFLElBQUk7aUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgYWdncmVnYXRpb25UeXBlIGFzIEFnZ3JlZ2F0aW9uVHlwZUVudW0gfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBBZ2dyZWdhdGlvbk9wdGlvbiB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuXG4vKipcbiAqIEEgcGlwZSB0aGF0IGFkanVzdHMgdGhlIGFnZ3JlZ2F0ZWQgdGltZSByYW5nZSBiYXNlZCBvbiB0aGUgYWdncmVnYXRpb24gdHlwZS5cbiAqXG4gKiBgYGBodG1sXG4gKiAnOTowMCcgfCBhZGp1c3RBZ2dyZWdhdGVkVGltZVJhbmdlOiBjb25maWcuYWdncmVnYXRpb24gKGUuZy46SE9VUkxZKVxuICogYGBgXG4gKiBUaGUgb3V0cHV0IHdpbGwgYmUgJzk6MDAtMTA6MDAnLlxuICovXG5AUGlwZSh7XG4gIG5hbWU6ICdhZGp1c3RBZ2dyZWdhdGVkVGltZVJhbmdlJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBBZGp1c3RBZ2dyZWdhdGVkVGltZVJhbmdlUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICAvKipcbiAgICogVHJhbnNmb3JtcyB0aGUgaW5wdXQgdGltZSBiYXNlZCBvbiB0aGUgYWdncmVnYXRpb24gdHlwZS5cbiAgICogQHBhcmFtIGlucHV0VGltZSBUaGUgaW5wdXQgdGltZSBzdHJpbmcuXG4gICAqIEBwYXJhbSBhZ2dyZWdhdGlvblR5cGUgVGhlIHR5cGUgb2YgYWdncmVnYXRpb24gKG9wdGlvbmFsKS5cbiAgICogQHJldHVybnMgVGhlIHRyYW5zZm9ybWVkIHRpbWUgc3RyaW5nLlxuICAgKi9cbiAgdHJhbnNmb3JtKGlucHV0VGltZTogc3RyaW5nLCBhZ2dyZWdhdGlvblR5cGU/OiBBZ2dyZWdhdGlvbk9wdGlvbik6IHN0cmluZyB7XG4gICAgaWYgKCFhZ2dyZWdhdGlvblR5cGUpIHtcbiAgICAgIHJldHVybiBpbnB1dFRpbWU7XG4gICAgfVxuXG4gICAgaWYgKGFnZ3JlZ2F0aW9uVHlwZSA9PT0gQWdncmVnYXRpb25UeXBlRW51bS5EQUlMWSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGUgPSB0aGlzLmNyZWF0ZURhdGVGcm9tSW5wdXQoaW5wdXRUaW1lKTtcbiAgICBjb25zdCBpc1R3ZWx2ZUhvdXJzRm9ybWF0ID0gdGhpcy5pc1R3ZWx2ZUhvdXJzRm9ybWF0KGlucHV0VGltZSk7XG5cbiAgICBzd2l0Y2ggKGFnZ3JlZ2F0aW9uVHlwZSkge1xuICAgICAgY2FzZSBBZ2dyZWdhdGlvblR5cGVFbnVtLkhPVVJMWTpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SG91cmx5VGltZVJhbmdlKGRhdGUsIGlzVHdlbHZlSG91cnNGb3JtYXQpO1xuICAgICAgY2FzZSBBZ2dyZWdhdGlvblR5cGVFbnVtLk1JTlVURUxZOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRNaW51dGVseVRpbWVSYW5nZShkYXRlLCBpc1R3ZWx2ZUhvdXJzRm9ybWF0KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgYWdncmVnYXRpb24gdHlwZScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZGF0ZSBvYmplY3QgZnJvbSB0aGUgaW5wdXQgdGltZSBzdHJpbmcuXG4gICAqIEBwYXJhbSBpbnB1dFRpbWUgVGhlIGlucHV0IHRpbWUgc3RyaW5nLlxuICAgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBEYXRlIG9iamVjdC5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRGF0ZUZyb21JbnB1dChpbnB1dFRpbWU6IHN0cmluZyk6IERhdGUge1xuICAgIGNvbnN0IGRlZmF1bHREYXRlID0gJzE5NzAtMDEtMDEgJztcbiAgICBjb25zdCBpc1BNID0gL1BNL2kudGVzdChpbnB1dFRpbWUpO1xuICAgIGNvbnN0IGNsZWFuZWRUaW1lID0gaW5wdXRUaW1lLnJlcGxhY2UoL0FNfFBNL2ksICcnKS50cmltKCk7XG5cbiAgICB0aGlzLnZhbGlkYXRlVGltZUZvcm1hdChjbGVhbmVkVGltZSwgaW5wdXRUaW1lKTtcblxuICAgIGNvbnN0IGRhdGVUaW1lU3RyaW5nID0gYCR7ZGVmYXVsdERhdGV9JHtjbGVhbmVkVGltZX1gO1xuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShkYXRlVGltZVN0cmluZyk7XG5cbiAgICBpZiAoaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaW5wdXQgdGltZScpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmFkanVzdEZvclBNVGltZShkYXRlLCBpc1BNKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgaWYgdGhlIHRpbWUgc3RyaW5nIG1hdGNoZXMgdGhlIHJlcXVpcmVkIGZvcm1hdCBhbmQgaGFzIHZhbGlkIHZhbHVlcy5cbiAgICogQHBhcmFtIHRpbWUgVGhlIHRpbWUgc3RyaW5nIHRvIHZhbGlkYXRlLlxuICAgKiBAcGFyYW0gb3JpZ2luYWxJbnB1dCBUaGUgb3JpZ2luYWwgaW5wdXQgc3RyaW5nIChpbmNsdWRpbmcgQU0vUE0gaWYgcHJlc2VudCkuXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIHRpbWUgZm9ybWF0IGlzIGludmFsaWQgb3IgdmFsdWVzIGFyZSBvdXQgb2YgcmFuZ2UuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlVGltZUZvcm1hdCh0aW1lOiBzdHJpbmcsIG9yaWdpbmFsSW5wdXQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHBhcnRzID0gdGltZS5zcGxpdCgnOicpO1xuICAgIHRoaXMudmFsaWRhdGVUaW1lUGFydHMocGFydHMpO1xuXG4gICAgY29uc3QgW2hvdXJzU3RyLCBtaW51dGVzU3RyLCBzZWNvbmRzU3RyXSA9IHBhcnRzO1xuICAgIHRoaXMudmFsaWRhdGVUaW1lRGlnaXRzKGhvdXJzU3RyLCBtaW51dGVzU3RyLCBzZWNvbmRzU3RyKTtcblxuICAgIGNvbnN0IHsgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMgfSA9IHRoaXMucGFyc2VUaW1lQ29tcG9uZW50cyhob3Vyc1N0ciwgbWludXRlc1N0ciwgc2Vjb25kc1N0cik7XG4gICAgdGhpcy52YWxpZGF0ZVRpbWVSYW5nZXMoaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMpO1xuICAgIHRoaXMudmFsaWRhdGVUaW1lRm9ybWF0MjRIb3VyKGhvdXJzLCBvcmlnaW5hbElucHV0KTtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVUaW1lUGFydHMocGFydHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA8IDIgfHwgcGFydHMubGVuZ3RoID4gMykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGlucHV0IHRpbWUnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlVGltZURpZ2l0cyhob3Vyc1N0cjogc3RyaW5nLCBtaW51dGVzU3RyOiBzdHJpbmcsIHNlY29uZHNTdHI/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5pc1ZhbGlkTnVtYmVyU3RyaW5nKGhvdXJzU3RyKSB8fFxuICAgICAgIXRoaXMuaXNWYWxpZE51bWJlclN0cmluZyhtaW51dGVzU3RyKSB8fFxuICAgICAgKHNlY29uZHNTdHIgIT09IHVuZGVmaW5lZCAmJiAhdGhpcy5pc1ZhbGlkTnVtYmVyU3RyaW5nKHNlY29uZHNTdHIpKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGlucHV0IHRpbWUnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBhcnNlVGltZUNvbXBvbmVudHMoaG91cnNTdHI6IHN0cmluZywgbWludXRlc1N0cjogc3RyaW5nLCBzZWNvbmRzU3RyPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhvdXJzOiBOdW1iZXIoaG91cnNTdHIpLFxuICAgICAgbWludXRlczogTnVtYmVyKG1pbnV0ZXNTdHIpLFxuICAgICAgc2Vjb25kczogc2Vjb25kc1N0ciA/IE51bWJlcihzZWNvbmRzU3RyKSA6IDBcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVRpbWVSYW5nZXMoaG91cnM6IG51bWJlciwgbWludXRlczogbnVtYmVyLCBzZWNvbmRzOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoaG91cnMgPiAyMyB8fCBob3VycyA8IDAgfHwgbWludXRlcyA+IDU5IHx8IG1pbnV0ZXMgPCAwIHx8IHNlY29uZHMgPiA1OSB8fCBzZWNvbmRzIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGlucHV0IHRpbWUnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlVGltZUZvcm1hdDI0SG91cihob3VyczogbnVtYmVyLCBvcmlnaW5hbElucHV0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoaG91cnMgPiAxMiAmJiB0aGlzLmhhc0FtUG0ob3JpZ2luYWxJbnB1dCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBpbnB1dCB0aW1lJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBzdHJpbmcgY29udGFpbnMgb25seSBkaWdpdHMgYW5kIGlzIDEtMiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqIEBwYXJhbSB2YWx1ZSBTdHJpbmcgdG8gY2hlY2tcbiAgICogQHJldHVybnMgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHN0cmluZyBpcyB2YWxpZFxuICAgKi9cbiAgcHJpdmF0ZSBpc1ZhbGlkTnVtYmVyU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdmFsdWUubGVuZ3RoID4gMCAmJlxuICAgICAgdmFsdWUubGVuZ3RoIDw9IDIgJiZcbiAgICAgIHZhbHVlLnNwbGl0KCcnKS5ldmVyeShjaGFyID0+IGNoYXIgPj0gJzAnICYmIGNoYXIgPD0gJzknKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBpbnB1dCB0aW1lIGhhcyBBTS9QTSBtYXJrZXJzLlxuICAgKiBAcGFyYW0gaW5wdXQgVGhlIGlucHV0IHRpbWUgc3RyaW5nIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIGlucHV0IGNvbnRhaW5zIEFNL1BNLlxuICAgKi9cbiAgcHJpdmF0ZSBoYXNBbVBtKGlucHV0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gL0FNfFBNL2kudGVzdChpbnB1dCk7XG4gIH1cblxuICAvKipcbiAgICogQWRqdXN0cyB0aGUgZGF0ZSBmb3IgUE0gdGltZXMgYnkgYWRkaW5nIDEyIGhvdXJzIHdoZW4gbmVjZXNzYXJ5LlxuICAgKiBAcGFyYW0gZGF0ZSBUaGUgZGF0ZSBvYmplY3QgdG8gYWRqdXN0LlxuICAgKiBAcGFyYW0gaXNQTSBCb29sZWFuIGluZGljYXRpbmcgaWYgdGhlIHRpbWUgaXMgUE0uXG4gICAqIEByZXR1cm5zIFRoZSBhZGp1c3RlZCBEYXRlIG9iamVjdC5cbiAgICovXG4gIHByaXZhdGUgYWRqdXN0Rm9yUE1UaW1lKGRhdGU6IERhdGUsIGlzUE06IGJvb2xlYW4pOiBEYXRlIHtcbiAgICBjb25zdCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKTtcbiAgICBpZiAoaXNQTSAmJiBob3VycyA8IDEyKSB7XG4gICAgICBkYXRlLnNldEhvdXJzKGhvdXJzICsgMTIpO1xuICAgIH0gZWxzZSBpZiAoIWlzUE0gJiYgaG91cnMgPT09IDEyKSB7XG4gICAgICBkYXRlLnNldEhvdXJzKDApO1xuICAgIH1cbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGlucHV0IHRpbWUgaXMgaW4gdHdlbHZlIGhvdXJzIGZvcm1hdC5cbiAgICogQHBhcmFtIGlucHV0VGltZSBUaGUgaW5wdXQgdGltZSBzdHJpbmcuXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGlucHV0IHRpbWUgaXMgaW4gdHdlbHZlIGhvdXJzIGZvcm1hdCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHJpdmF0ZSBpc1R3ZWx2ZUhvdXJzRm9ybWF0KGlucHV0VGltZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIC9BTXxQTS9pLnRlc3QoaW5wdXRUaW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBob3VybHkgdGltZSByYW5nZSBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gICAqIEBwYXJhbSBkYXRlIFRoZSBkYXRlIG9iamVjdC5cbiAgICogQHBhcmFtIHR3ZWx2ZUhvdXJzRm9ybWF0IEluZGljYXRlcyB3aGV0aGVyIHRvIHVzZSB0d2VsdmUgaG91cnMgZm9ybWF0LlxuICAgKiBAcmV0dXJucyBUaGUgaG91cmx5IHRpbWUgcmFuZ2Ugc3RyaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRIb3VybHlUaW1lUmFuZ2UoZGF0ZTogRGF0ZSwgdHdlbHZlSG91cnNGb3JtYXQ6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIGNvbnN0IG5leHRIb3VyID0gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkpO1xuICAgIG5leHRIb3VyLnNldEhvdXJzKGRhdGUuZ2V0SG91cnMoKSArIDEpO1xuICAgIHJldHVybiBgJHt0aGlzLmZvcm1hdFRpbWUoZGF0ZSwgdHdlbHZlSG91cnNGb3JtYXQsIHRydWUpfS0ke3RoaXMuZm9ybWF0VGltZShuZXh0SG91ciwgdHdlbHZlSG91cnNGb3JtYXQsIHRydWUpfWA7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbWludXRlbHkgdGltZSByYW5nZSBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gICAqIEBwYXJhbSBkYXRlIFRoZSBkYXRlIG9iamVjdC5cbiAgICogQHBhcmFtIHR3ZWx2ZUhvdXJzRm9ybWF0IEluZGljYXRlcyB3aGV0aGVyIHRvIHVzZSB0d2VsdmUgaG91cnMgZm9ybWF0LlxuICAgKiBAcmV0dXJucyBUaGUgbWludXRlbHkgdGltZSByYW5nZSBzdHJpbmcuXG4gICAqL1xuICBwcml2YXRlIGdldE1pbnV0ZWx5VGltZVJhbmdlKGRhdGU6IERhdGUsIHR3ZWx2ZUhvdXJzRm9ybWF0OiBib29sZWFuKTogc3RyaW5nIHtcbiAgICBjb25zdCBuZXh0TWludXRlID0gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkpO1xuICAgIG5leHRNaW51dGUuc2V0TWludXRlcyhkYXRlLmdldE1pbnV0ZXMoKSArIDEpO1xuICAgIHJldHVybiBgJHt0aGlzLmZvcm1hdFRpbWUoZGF0ZSwgdHdlbHZlSG91cnNGb3JtYXQsIGZhbHNlKX0tJHt0aGlzLmZvcm1hdFRpbWUobmV4dE1pbnV0ZSwgdHdlbHZlSG91cnNGb3JtYXQsIGZhbHNlKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgdGhlIGdpdmVuIGRhdGUgaW50byBhIHRpbWUgc3RyaW5nLlxuICAgKiBAcGFyYW0gZGF0ZSBUaGUgZGF0ZSB0byBmb3JtYXQuXG4gICAqIEBwYXJhbSB1c2VQZXJpb2QgSW5kaWNhdGVzIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgcGVyaW9kIChBTS9QTSkgaW4gdGhlIGZvcm1hdHRlZCB0aW1lLlxuICAgKiBAcGFyYW0gdXNlSG91ck9ubHkgSW5kaWNhdGVzIHdoZXRoZXIgdG8gaW5jbHVkZSBvbmx5IHRoZSBob3VyIHBhcnQgaW4gdGhlIGZvcm1hdHRlZCB0aW1lLlxuICAgKiBAcmV0dXJucyBUaGUgZm9ybWF0dGVkIHRpbWUgc3RyaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXRUaW1lKGRhdGU6IERhdGUsIHVzZVBlcmlvZDogYm9vbGVhbiwgdXNlSG91ck9ubHk6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIGNvbnN0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpO1xuICAgIGNvbnN0IG1pbnV0ZXMgPSBkYXRlLmdldE1pbnV0ZXMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgaWYgKHVzZVBlcmlvZCkge1xuICAgICAgY29uc3QgcGVyaW9kID0gaG91cnMgPj0gMTIgPyAnUE0nIDogJ0FNJztcbiAgICAgIGNvbnN0IGZvcm1hdHRlZEhvdXJzID0gaG91cnMgJSAxMiA9PT0gMCA/IDEyIDogaG91cnMgJSAxMjtcbiAgICAgIHJldHVybiBgJHtmb3JtYXR0ZWRIb3Vyc306JHt1c2VIb3VyT25seSA/ICcwMCcgOiBtaW51dGVzfSAke3BlcmlvZH1gO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYCR7aG91cnMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfToke3VzZUhvdXJPbmx5ID8gJzAwJyA6IG1pbnV0ZXN9YDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==