ng-timeparser
Version:
[](https://badge.fury.io/js/ng-timeparser) [](https://travis-ci.org/feeloor/ng-timeparser)
312 lines (300 loc) • 28.5 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common')) :
typeof define === 'function' && define.amd ? define('ng-timeparser', ['exports', '@angular/core', '@angular/common'], factory) :
(factory((global['ng-timeparser'] = {}),global.ng.core,global.ng.common));
}(this, (function (exports,core,common) { 'use strict';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var TimeParserService = (function () {
function TimeParserService() {
}
/**
* Parses given time-string to a correct 4 digit time or empty if it's an invalid time
* @param {?} inputTime Time-string to parse
* @param {?=} militaryTime Use military time (24 hour format)
* @return {?}
*/
TimeParserService.prototype.parseTime = /**
* Parses given time-string to a correct 4 digit time or empty if it's an invalid time
* @param {?} inputTime Time-string to parse
* @param {?=} militaryTime Use military time (24 hour format)
* @return {?}
*/
function (inputTime, militaryTime) {
if (militaryTime === void 0) {
militaryTime = false;
}
var /** @type {?} */ returnTime = '';
var /** @type {?} */ correctFormat = false;
var /** @type {?} */ time = inputTime;
// English (12 hours pattern)
if (!militaryTime) {
if (new RegExp(/^[2-9][0-9].*$/).test(time) && (time.match(/\d/g) || []).length !== 3) {
// Matches 22 or 22 PM but not 321 or 321 PM/AM
correctFormat = false;
time = '';
}
else if (new RegExp(/^[0-1][0-9]:[0-5][0-9].*$/).test(time)) {
// Matches for example 07:30 or 07:30 PM/AM
correctFormat = true;
time = this.addAMorPM(time, 0, 5);
}
else if (new RegExp(/^[0-1][0-9][0-5][0-9].*$/).test(time)) {
// Matches for example 0730 or 0730 PM/AM
correctFormat = true;
time = this.addAMorPM(time, 0, 4);
}
else if (new RegExp(/^[0-9]:[0-5][0-9].*$/).test(time)) {
// Matches for example 9:33 and 9:33 PM/AM
correctFormat = true;
time = "0" + this.addAMorPM(time, 0, 4);
}
else if (new RegExp(/^[0-9][0-5][0-9].*$/).test(time)) {
// Matches for example 933 and 933 PM/AM
correctFormat = true;
time = "0" + this.addAMorPM(time, 0, 3);
}
else if (new RegExp(/^[0-1][0-2].*$/).test(time)) {
// Matches 12 or 12 PM/AM
correctFormat = true;
time = this.addAMorPM(time, 0, 2);
}
else if (new RegExp(/^[0-9].*$/).test(time)) {
// Matches for example 3 and 3 PM/AM
correctFormat = true;
time = this.addAMorPM(time, 0, 1);
}
// French / Military Time (24 hours pattern)
}
else {
if (new RegExp(/^[0-2][0-9]:[0-5][0-9]$/).test(time)) {
// Matches 17:30
correctFormat = true;
}
else if (new RegExp(/^[0-2][0-9][0-5][0-9]$/).test(time)) {
// Matches 1730
correctFormat = true;
}
else if (new RegExp(/^[0-2][0-9]:[0-5]$/).test(time)) {
// Matches 22:3
correctFormat = true;
time = time + "0";
}
else if (new RegExp(/^[0-2][0-9][0-5]$/).test(time)) {
// Matches 223
correctFormat = true;
time = time + "0";
}
else if (new RegExp(/^[0-9]:[0-5][0-9]$/).test(time)) {
// Matches 7:30
correctFormat = true;
time = "0" + time;
}
else if (new RegExp(/^[0-9][0-5][0-9]$/).test(time)) {
// Matches 730
correctFormat = true;
time = "0" + time;
}
else if (new RegExp(/^[0-2][0-9]/).test(time)) {
// Matches 19
correctFormat = true;
time = time + "00";
}
else if (new RegExp(/^[0-9]/).test(time)) {
// Matches 9
correctFormat = true;
time = "0" + time + "00";
}
}
// Create return data
if (correctFormat) {
time = time.toUpperCase();
time = this.makeTime4Digit(time);
returnTime = this.addColonIfMissing(time);
if (militaryTime) {
returnTime = returnTime.substring(0, 5);
}
}
else {
returnTime = '';
}
return returnTime;
};
/**
* Parses a valid time to a 4 digit time
* For example 4 PM to 04:00 PM or 4:30 PM to 04:30 PM
* @param {?} time Time-string to parse to 4 digit
* @return {?}
*/
TimeParserService.prototype.makeTime4Digit = /**
* Parses a valid time to a 4 digit time
* For example 4 PM to 04:00 PM or 4:30 PM to 04:30 PM
* @param {?} time Time-string to parse to 4 digit
* @return {?}
*/
function (time) {
var /** @type {?} */ preAMorPM = '';
var /** @type {?} */ parsed = time;
// Get any existing AM/PM
if (new RegExp(/PM/i).test(time)) {
preAMorPM = 'PM';
parsed = parsed.replace(/PM/i, '');
}
else if (new RegExp(/AM/i).test(time)) {
preAMorPM = 'AM';
parsed = parsed.replace(/AM/i, '');
}
parsed = parsed.replace(':', '');
parsed = parsed.replace(/ /g, '');
if (parsed.length === 1) {
parsed = "0" + parsed + "00";
}
else if (parsed.length === 2) {
parsed = parsed + "00";
}
else if (parsed.length === 3) {
if (new RegExp(/^[0-1][0-9][0-5]/).test(parsed)) {
parsed = parsed + "0";
}
else if (new RegExp(/^[0-9][0-5][0-9]/).test(parsed)) {
parsed = "0" + parsed;
}
}
return "" + parsed + (preAMorPM ? ' ' + preAMorPM : '');
};
/**
* Adds a colon if it's missing to given time-string
* For example 0400 to 04:00
* @param {?} time Time-string to add missing colon to
* @return {?}
*/
TimeParserService.prototype.addColonIfMissing = /**
* Adds a colon if it's missing to given time-string
* For example 0400 to 04:00
* @param {?} time Time-string to add missing colon to
* @return {?}
*/
function (time) {
if (time.indexOf(':') === -1) {
return time.substring(0, 2) + ":" + time.substring(2);
}
return time;
};
/**
* Takes start and end of time-string and then adds correct AM/PM
* @param {?} time Time-string to add AM or PM too
* @param {?} start Where time starts in string
* @param {?} end Where time ends in string
* @return {?}
*/
TimeParserService.prototype.addAMorPM = /**
* Takes start and end of time-string and then adds correct AM/PM
* @param {?} time Time-string to add AM or PM too
* @param {?} start Where time starts in string
* @param {?} end Where time ends in string
* @return {?}
*/
function (time, start, end) {
if (new RegExp(/PM/i).test(time)) {
return time.substring(start, end) + " PM";
}
else if (new RegExp(/AM/i).test(time)) {
return time.substring(start, end) + " AM";
}
else {
return time.substring(start, end) + " PM";
}
};
TimeParserService.decorators = [
{ type: core.Injectable },
];
/** @nocollapse */
TimeParserService.ctorParameters = function () { return []; };
return TimeParserService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var TimeParserDirective = (function () {
function TimeParserDirective(timeParserService) {
this.timeParserService = timeParserService;
this.ngModelChange = new core.EventEmitter();
this.militaryTime = this.militaryTime || false;
}
/**
* @param {?} event
* @return {?}
*/
TimeParserDirective.prototype.onBlur = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.ngModelChange.emit(this.timeParserService.parseTime(event.target.value, this.militaryTime));
};
TimeParserDirective.decorators = [
{ type: core.Directive, args: [{
selector: '[timeParser]'
},] },
];
/** @nocollapse */
TimeParserDirective.ctorParameters = function () {
return [
{ type: TimeParserService, },
];
};
TimeParserDirective.propDecorators = {
"militaryTime": [{ type: core.Input },],
"ngModelChange": [{ type: core.Output },],
"onBlur": [{ type: core.HostListener, args: ['blur', ['$event'],] },],
};
return TimeParserDirective;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var TimeParserModule = (function () {
function TimeParserModule() {
}
TimeParserModule.decorators = [
{ type: core.NgModule, args: [{
imports: [
common.CommonModule
],
declarations: [TimeParserDirective],
providers: [TimeParserService],
exports: [TimeParserDirective]
},] },
];
return TimeParserModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
exports.TimeParserDirective = TimeParserDirective;
exports.TimeParserService = TimeParserService;
exports.TimeParserModule = TimeParserModule;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctdGltZXBhcnNlci51bWQuanMubWFwIiwic291cmNlcyI6WyJuZzovL25nLXRpbWVwYXJzZXIvc3JjL2FwcC90aW1lLXBhcnNlci9zZXJ2aWNlcy90aW1lLXBhcnNlci5zZXJ2aWNlLnRzIiwibmc6Ly9uZy10aW1lcGFyc2VyL3NyYy9hcHAvdGltZS1wYXJzZXIvZGlyZWN0aXZlcy90aW1lLXBhcnNlci5kaXJlY3RpdmUudHMiLCJuZzovL25nLXRpbWVwYXJzZXIvc3JjL2FwcC90aW1lLXBhcnNlci90aW1lLXBhcnNlci5tb2R1bGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVGltZVBhcnNlclNlcnZpY2Uge1xuXG4gIGNvbnN0cnVjdG9yKCkgeyB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBnaXZlbiB0aW1lLXN0cmluZyB0byBhIGNvcnJlY3QgNCBkaWdpdCB0aW1lIG9yIGVtcHR5IGlmIGl0J3MgYW4gaW52YWxpZCB0aW1lXG4gICAqIEBwYXJhbSBpbnB1dFRpbWUgVGltZS1zdHJpbmcgdG8gcGFyc2VcbiAgICogQHBhcmFtIG1pbGl0YXJ5VGltZSBVc2UgbWlsaXRhcnkgdGltZSAoMjQgaG91ciBmb3JtYXQpXG4gICAqL1xuICBwdWJsaWMgcGFyc2VUaW1lKGlucHV0VGltZTogc3RyaW5nLCBtaWxpdGFyeVRpbWU6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XG4gICAgbGV0IHJldHVyblRpbWUgPSAnJztcbiAgICBsZXQgY29ycmVjdEZvcm1hdCA9IGZhbHNlO1xuICAgIGxldCB0aW1lID0gaW5wdXRUaW1lO1xuXG4gICAgLy8gRW5nbGlzaCAoMTIgaG91cnMgcGF0dGVybilcbiAgICBpZiAoIW1pbGl0YXJ5VGltZSkge1xuICAgICAgaWYgKG5ldyBSZWdFeHAoL15bMi05XVswLTldLiokLykudGVzdCh0aW1lKSAmJiAodGltZS5tYXRjaCgvXFxkL2cpIHx8IFtdKS5sZW5ndGggIT09IDMpIHtcbiAgICAgICAgLy8gTWF0Y2hlcyAyMiBvciAyMiBQTSBidXQgbm90IDMyMSBvciAzMjEgUE0vQU1cbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IGZhbHNlO1xuICAgICAgICB0aW1lID0gJyc7XG4gICAgICB9IGVsc2UgaWYgKG5ldyBSZWdFeHAoL15bMC0xXVswLTldOlswLTVdWzAtOV0uKiQvKS50ZXN0KHRpbWUpKSB7XG4gICAgICAgIC8vIE1hdGNoZXMgZm9yIGV4YW1wbGUgMDc6MzAgb3IgMDc6MzAgUE0vQU1cbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IHRydWU7XG4gICAgICAgIHRpbWUgPSB0aGlzLmFkZEFNb3JQTSh0aW1lLCAwLCA1KTtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTFdWzAtOV1bMC01XVswLTldLiokLykudGVzdCh0aW1lKSkge1xuICAgICAgICAvLyBNYXRjaGVzIGZvciBleGFtcGxlIDA3MzAgb3IgMDczMCBQTS9BTVxuICAgICAgICBjb3JyZWN0Rm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgdGltZSA9IHRoaXMuYWRkQU1vclBNKHRpbWUsIDAsIDQpO1xuICAgICAgfSBlbHNlIGlmIChuZXcgUmVnRXhwKC9eWzAtOV06WzAtNV1bMC05XS4qJC8pLnRlc3QodGltZSkpIHtcbiAgICAgICAgLy8gTWF0Y2hlcyBmb3IgZXhhbXBsZSA5OjMzIGFuZCA5OjMzIFBNL0FNXG4gICAgICAgIGNvcnJlY3RGb3JtYXQgPSB0cnVlO1xuICAgICAgICB0aW1lID0gYDAke3RoaXMuYWRkQU1vclBNKHRpbWUsIDAsIDQpfWA7XG4gICAgICB9IGVsc2UgaWYgKG5ldyBSZWdFeHAoL15bMC05XVswLTVdWzAtOV0uKiQvKS50ZXN0KHRpbWUpKSB7XG4gICAgICAgIC8vIE1hdGNoZXMgZm9yIGV4YW1wbGUgOTMzIGFuZCA5MzMgUE0vQU1cbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IHRydWU7XG4gICAgICAgIHRpbWUgPSBgMCR7dGhpcy5hZGRBTW9yUE0odGltZSwgMCwgMyl9YDtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTFdWzAtMl0uKiQvKS50ZXN0KHRpbWUpKSB7XG4gICAgICAgIC8vIE1hdGNoZXMgMTIgb3IgMTIgUE0vQU1cbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IHRydWU7XG4gICAgICAgIHRpbWUgPSB0aGlzLmFkZEFNb3JQTSh0aW1lLCAwLCAyKTtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTldLiokLykudGVzdCh0aW1lKSkge1xuICAgICAgICAvLyBNYXRjaGVzIGZvciBleGFtcGxlIDMgYW5kIDMgUE0vQU1cbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IHRydWU7XG4gICAgICAgIHRpbWUgPSB0aGlzLmFkZEFNb3JQTSh0aW1lLCAwLCAxKTtcbiAgICAgIH1cbiAgICAgIC8vIEZyZW5jaCAvIE1pbGl0YXJ5IFRpbWUgKDI0IGhvdXJzIHBhdHRlcm4pXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChuZXcgUmVnRXhwKC9eWzAtMl1bMC05XTpbMC01XVswLTldJC8pLnRlc3QodGltZSkpIHtcbiAgICAgICAgLy8gTWF0Y2hlcyAxNzozMFxuICAgICAgICBjb3JyZWN0Rm9ybWF0ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTJdWzAtOV1bMC01XVswLTldJC8pLnRlc3QodGltZSkpIHtcbiAgICAgICAgLy8gTWF0Y2hlcyAxNzMwXG4gICAgICAgIGNvcnJlY3RGb3JtYXQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChuZXcgUmVnRXhwKC9eWzAtMl1bMC05XTpbMC01XSQvKS50ZXN0KHRpbWUpKSB7XG4gICAgICAgIC8vIE1hdGNoZXMgMjI6M1xuICAgICAgICBjb3JyZWN0Rm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgdGltZSA9IGAke3RpbWV9MGA7XG4gICAgICB9IGVsc2UgaWYgKG5ldyBSZWdFeHAoL15bMC0yXVswLTldWzAtNV0kLykudGVzdCh0aW1lKSkge1xuICAgICAgICAvLyBNYXRjaGVzIDIyM1xuICAgICAgICBjb3JyZWN0Rm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgdGltZSA9IGAke3RpbWV9MGA7XG4gICAgICB9IGVsc2UgaWYgKG5ldyBSZWdFeHAoL15bMC05XTpbMC01XVswLTldJC8pLnRlc3QodGltZSkpIHtcbiAgICAgICAgLy8gTWF0Y2hlcyA3OjMwXG4gICAgICAgIGNvcnJlY3RGb3JtYXQgPSB0cnVlO1xuICAgICAgICB0aW1lID0gYDAke3RpbWV9YDtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTldWzAtNV1bMC05XSQvKS50ZXN0KHRpbWUpKSB7XG4gICAgICAgIC8vIE1hdGNoZXMgNzMwXG4gICAgICAgIGNvcnJlY3RGb3JtYXQgPSB0cnVlO1xuICAgICAgICB0aW1lID0gYDAke3RpbWV9YDtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTJdWzAtOV0vKS50ZXN0KHRpbWUpKSB7XG4gICAgICAgIC8vIE1hdGNoZXMgMTlcbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IHRydWU7XG4gICAgICAgIHRpbWUgPSBgJHt0aW1lfTAwYDtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTldLykudGVzdCh0aW1lKSkge1xuICAgICAgICAvLyBNYXRjaGVzIDlcbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IHRydWU7XG4gICAgICAgIHRpbWUgPSBgMCR7dGltZX0wMGA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHJldHVybiBkYXRhXG4gICAgaWYgKGNvcnJlY3RGb3JtYXQpIHtcbiAgICAgIHRpbWUgPSB0aW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgICB0aW1lID0gdGhpcy5tYWtlVGltZTREaWdpdCh0aW1lKTtcbiAgICAgIHJldHVyblRpbWUgPSB0aGlzLmFkZENvbG9uSWZNaXNzaW5nKHRpbWUpO1xuXG4gICAgICBpZiAobWlsaXRhcnlUaW1lKSB7XG4gICAgICAgIHJldHVyblRpbWUgPSByZXR1cm5UaW1lLnN1YnN0cmluZygwLCA1KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuVGltZSA9ICcnO1xuICAgIH1cblxuICAgIHJldHVybiByZXR1cm5UaW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBhIHZhbGlkIHRpbWUgdG8gYSA0IGRpZ2l0IHRpbWVcbiAgICogRm9yIGV4YW1wbGUgNCBQTSB0byAwNDowMCBQTSBvciA0OjMwIFBNIHRvIDA0OjMwIFBNXG4gICAqIEBwYXJhbSB0aW1lIFRpbWUtc3RyaW5nIHRvIHBhcnNlIHRvIDQgZGlnaXRcbiAgICovXG4gIHByaXZhdGUgbWFrZVRpbWU0RGlnaXQodGltZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgcHJlQU1vclBNID0gJyc7XG4gICAgbGV0IHBhcnNlZCA9IHRpbWU7XG5cbiAgICAvLyBHZXQgYW55IGV4aXN0aW5nIEFNL1BNXG4gICAgaWYgKG5ldyBSZWdFeHAoL1BNL2kpLnRlc3QodGltZSkpIHtcbiAgICAgIHByZUFNb3JQTSA9ICdQTSc7XG4gICAgICBwYXJzZWQgPSBwYXJzZWQucmVwbGFjZSgvUE0vaSwgJycpO1xuICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvQU0vaSkudGVzdCh0aW1lKSkge1xuICAgICAgcHJlQU1vclBNID0gJ0FNJztcbiAgICAgIHBhcnNlZCA9IHBhcnNlZC5yZXBsYWNlKC9BTS9pLCAnJyk7XG4gICAgfVxuXG4gICAgcGFyc2VkID0gcGFyc2VkLnJlcGxhY2UoJzonLCAnJyk7XG4gICAgcGFyc2VkID0gcGFyc2VkLnJlcGxhY2UoLyAvZywgJycpO1xuICAgIGlmIChwYXJzZWQubGVuZ3RoID09PSAxKSB7XG4gICAgICBwYXJzZWQgPSBgMCR7cGFyc2VkfTAwYDtcbiAgICB9IGVsc2UgaWYgKHBhcnNlZC5sZW5ndGggPT09IDIpIHtcbiAgICAgIHBhcnNlZCA9IGAke3BhcnNlZH0wMGA7XG4gICAgfSBlbHNlIGlmIChwYXJzZWQubGVuZ3RoID09PSAzKSB7XG4gICAgICBpZiAobmV3IFJlZ0V4cCgvXlswLTFdWzAtOV1bMC01XS8pLnRlc3QocGFyc2VkKSkge1xuICAgICAgICBwYXJzZWQgPSBgJHtwYXJzZWR9MGA7XG4gICAgICB9IGVsc2UgaWYgKG5ldyBSZWdFeHAoL15bMC05XVswLTVdWzAtOV0vKS50ZXN0KHBhcnNlZCkpIHtcbiAgICAgICAgcGFyc2VkID0gYDAke3BhcnNlZH1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBgJHtwYXJzZWR9JHtwcmVBTW9yUE0gPyAnICcgKyBwcmVBTW9yUE0gOiAnJ31gO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb2xvbiBpZiBpdCdzIG1pc3NpbmcgdG8gZ2l2ZW4gdGltZS1zdHJpbmdcbiAgICogRm9yIGV4YW1wbGUgMDQwMCB0byAwNDowMFxuICAgKiBAcGFyYW0gdGltZSBUaW1lLXN0cmluZyB0byBhZGQgbWlzc2luZyBjb2xvbiB0b1xuICAgKi9cbiAgcHJpdmF0ZSBhZGRDb2xvbklmTWlzc2luZyh0aW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0aW1lLmluZGV4T2YoJzonKSA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBgJHt0aW1lLnN1YnN0cmluZygwLCAyKX06JHt0aW1lLnN1YnN0cmluZygyKX1gO1xuICAgIH1cbiAgICByZXR1cm4gdGltZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyBzdGFydCBhbmQgZW5kIG9mIHRpbWUtc3RyaW5nIGFuZCB0aGVuIGFkZHMgY29ycmVjdCBBTS9QTVxuICAgKiBAcGFyYW0gdGltZSBUaW1lLXN0cmluZyB0byBhZGQgQU0gb3IgUE0gdG9vXG4gICAqIEBwYXJhbSBzdGFydCBXaGVyZSB0aW1lIHN0YXJ0cyBpbiBzdHJpbmdcbiAgICogQHBhcmFtIGVuZCBXaGVyZSB0aW1lIGVuZHMgaW4gc3RyaW5nXG4gICAqL1xuICBwcml2YXRlIGFkZEFNb3JQTSh0aW1lOiBzdHJpbmcsIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAobmV3IFJlZ0V4cCgvUE0vaSkudGVzdCh0aW1lKSkge1xuICAgICAgcmV0dXJuIGAke3RpbWUuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpfSBQTWA7XG4gICAgfSBlbHNlIGlmIChuZXcgUmVnRXhwKC9BTS9pKS50ZXN0KHRpbWUpKSB7XG4gICAgICByZXR1cm4gYCR7dGltZS5zdWJzdHJpbmcoc3RhcnQsIGVuZCl9IEFNYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGAke3RpbWUuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpfSBQTWA7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBEaXJlY3RpdmUsIEhvc3RMaXN0ZW5lciwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFRpbWVQYXJzZXJTZXJ2aWNlIH0gZnJvbSAnLi8uLi9zZXJ2aWNlcyc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1t0aW1lUGFyc2VyXSdcbn0pXG5leHBvcnQgY2xhc3MgVGltZVBhcnNlckRpcmVjdGl2ZSB7XG4gIEBJbnB1dCgpIG1pbGl0YXJ5VGltZTogYm9vbGVhbjtcbiAgQE91dHB1dCgpIG5nTW9kZWxDaGFuZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSB0aW1lUGFyc2VyU2VydmljZTogVGltZVBhcnNlclNlcnZpY2UpIHtcbiAgICB0aGlzLm1pbGl0YXJ5VGltZSA9IHRoaXMubWlsaXRhcnlUaW1lIHx8IGZhbHNlO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignYmx1cicsIFsnJGV2ZW50J10pIG9uQmx1cihldmVudCkge1xuICAgIHRoaXMubmdNb2RlbENoYW5nZS5lbWl0KHRoaXMudGltZVBhcnNlclNlcnZpY2UucGFyc2VUaW1lKGV2ZW50LnRhcmdldC52YWx1ZSwgdGhpcy5taWxpdGFyeVRpbWUpKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmltcG9ydCB7IFRpbWVQYXJzZXJTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBUaW1lUGFyc2VyRGlyZWN0aXZlIH0gZnJvbSAnLi9kaXJlY3RpdmVzJztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZVxuICBdLFxuICBkZWNsYXJhdGlvbnM6IFtUaW1lUGFyc2VyRGlyZWN0aXZlXSxcbiAgcHJvdmlkZXJzOiBbVGltZVBhcnNlclNlcnZpY2VdLFxuICBleHBvcnRzOiBbVGltZVBhcnNlckRpcmVjdGl2ZV1cbn0pXG5leHBvcnQgY2xhc3MgVGltZVBhcnNlck1vZHVsZSB7IH1cbiJdLCJuYW1lcyI6WyJJbmplY3RhYmxlIiwiRXZlbnRFbWl0dGVyIiwiRGlyZWN0aXZlIiwiSW5wdXQiLCJPdXRwdXQiLCJIb3N0TGlzdGVuZXIiLCJOZ01vZHVsZSIsIkNvbW1vbk1vZHVsZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBO1FBS0U7U0FBaUI7Ozs7Ozs7UUFPVixxQ0FBUzs7Ozs7O3NCQUFDLFNBQWlCLEVBQUUsWUFBNkI7Z0JBQTdCLDZCQUFBO29CQUFBLG9CQUE2Qjs7Z0JBQy9ELHFCQUFJLFVBQVUsR0FBRyxFQUFFLENBQUM7Z0JBQ3BCLHFCQUFJLGFBQWEsR0FBRyxLQUFLLENBQUM7Z0JBQzFCLHFCQUFJLElBQUksR0FBRyxTQUFTLENBQUM7O2dCQUdyQixJQUFJLENBQUMsWUFBWSxFQUFFO29CQUNqQixJQUFJLElBQUksTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFF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