UNPKG

ng-timeparser

Version:

[![npm version](https://badge.fury.io/js/ng-timeparser.svg)](https://badge.fury.io/js/ng-timeparser) [![Build Status](https://travis-ci.org/feeloor/ng-timeparser.svg?branch=master)](https://travis-ci.org/feeloor/ng-timeparser)

193 lines (192 loc) 21.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import { Injectable } from '@angular/core'; export class TimeParserService { constructor() { } /** * 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 {?} */ parseTime(inputTime, militaryTime = false) { let /** @type {?} */ returnTime = ''; let /** @type {?} */ correctFormat = false; let /** @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 {?} */ makeTime4Digit(time) { let /** @type {?} */ preAMorPM = ''; let /** @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 {?} */ addColonIfMissing(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 {?} */ addAMorPM(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: Injectable }, ]; /** @nocollapse */ TimeParserService.ctorParameters = () => []; function TimeParserService_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ TimeParserService.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ TimeParserService.ctorParameters; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1wYXJzZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXRpbWVwYXJzZXIvIiwic291cmNlcyI6WyJzcmMvYXBwL3RpbWUtcGFyc2VyL3NlcnZpY2VzL3RpbWUtcGFyc2VyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHM0MsTUFBTTtJQUVKLGlCQUFpQjs7Ozs7OztJQU9WLFNBQVMsQ0FBQyxTQUFpQixFQUFFLGVBQXdCLEtBQUs7UUFDL0QscUJBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNwQixxQkFBSSxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzFCLHFCQUFJLElBQUksR0FBRyxTQUFTLENBQUM7O1FBR3JCLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUNsQixFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7O2dCQUV0RixhQUFhLEdBQUcsS0FBSyxDQUFDO2dCQUN0QixJQUFJLEdBQUcsRUFBRSxDQUFDO2FBQ1g7WUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDOztnQkFFOUQsYUFBYSxHQUFHLElBQUksQ0FBQztnQkFDckIsSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUNuQztZQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQywwQkFBMEIs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Q0FBQztTQUMzQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04sTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQztTQUMzQzs7OztZQTdKSixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVGltZVBhcnNlclNlcnZpY2Uge1xuXG4gIGNvbnN0cnVjdG9yKCkgeyB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBnaXZlbiB0aW1lLXN0cmluZyB0byBhIGNvcnJlY3QgNCBkaWdpdCB0aW1lIG9yIGVtcHR5IGlmIGl0J3MgYW4gaW52YWxpZCB0aW1lXG4gICAqIEBwYXJhbSBpbnB1dFRpbWUgVGltZS1zdHJpbmcgdG8gcGFyc2VcbiAgICogQHBhcmFtIG1pbGl0YXJ5VGltZSBVc2UgbWlsaXRhcnkgdGltZSAoMjQgaG91ciBmb3JtYXQpXG4gICAqL1xuICBwdWJsaWMgcGFyc2VUaW1lKGlucHV0VGltZTogc3RyaW5nLCBtaWxpdGFyeVRpbWU6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XG4gICAgbGV0IHJldHVyblRpbWUgPSAnJztcbiAgICBsZXQgY29ycmVjdEZvcm1hdCA9IGZhbHNlO1xuICAgIGxldCB0aW1lID0gaW5wdXRUaW1lO1xuXG4gICAgLy8gRW5nbGlzaCAoMTIgaG91cnMgcGF0dGVybilcbiAgICBpZiAoIW1pbGl0YXJ5VGltZSkge1xuICAgICAgaWYgKG5ldyBSZWdFeHAoL15bMi05XVswLTldLiokLykudGVzdCh0aW1lKSAmJiAodGltZS5tYXRjaCgvXFxkL2cpIHx8IFtdKS5sZW5ndGggIT09IDMpIHtcbiAgICAgICAgLy8gTWF0Y2hlcyAyMiBvciAyMiBQTSBidXQgbm90IDMyMSBvciAzMjEgUE0vQU1cbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IGZhbHNlO1xuICAgICAgICB0aW1lID0gJyc7XG4gICAgICB9IGVsc2UgaWYgKG5ldyBSZWdFeHAoL15bMC0xXVswLTldOlswLTVdWzAtOV0uKiQvKS50ZXN0KHRpbWUpKSB7XG4gICAgICAgIC8vIE1hdGNoZXMgZm9yIGV4YW1wbGUgMDc6MzAgb3IgMDc6MzAgUE0vQU1cbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IHRydWU7XG4gICAgICAgIHRpbWUgPSB0aGlzLmFkZEFNb3JQTSh0aW1lLCAwLCA1KTtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTFdWzAtOV1bMC01XVswLTldLiokLykudGVzdCh0aW1lKSkge1xuICAgICAgICAvLyBNYXRjaGVzIGZvciBleGFtcGxlIDA3MzAgb3IgMDczMCBQTS9BTVxuICAgICAgICBjb3JyZWN0Rm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgdGltZSA9IHRoaXMuYWRkQU1vclBNKHRpbWUsIDAsIDQpO1xuICAgICAgfSBlbHNlIGlmIChuZXcgUmVnRXhwKC9eWzAtOV06WzAtNV1bMC05XS4qJC8pLnRlc3QodGltZSkpIHtcbiAgICAgICAgLy8gTWF0Y2hlcyBmb3IgZXhhbXBsZSA5OjMzIGFuZCA5OjMzIFBNL0FNXG4gICAgICAgIGNvcnJlY3RGb3JtYXQgPSB0cnVlO1xuICAgICAgICB0aW1lID0gYDAke3RoaXMuYWRkQU1vclBNKHRpbWUsIDAsIDQpfWA7XG4gICAgICB9IGVsc2UgaWYgKG5ldyBSZWdFeHAoL15bMC05XVswLTVdWzAtOV0uKiQvKS50ZXN0KHRpbWUpKSB7XG4gICAgICAgIC8vIE1hdGNoZXMgZm9yIGV4YW1wbGUgOTMzIGFuZCA5MzMgUE0vQU1cbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IHRydWU7XG4gICAgICAgIHRpbWUgPSBgMCR7dGhpcy5hZGRBTW9yUE0odGltZSwgMCwgMyl9YDtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTFdWzAtMl0uKiQvKS50ZXN0KHRpbWUpKSB7XG4gICAgICAgIC8vIE1hdGNoZXMgMTIgb3IgMTIgUE0vQU1cbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IHRydWU7XG4gICAgICAgIHRpbWUgPSB0aGlzLmFkZEFNb3JQTSh0aW1lLCAwLCAyKTtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTldLiokLykudGVzdCh0aW1lKSkge1xuICAgICAgICAvLyBNYXRjaGVzIGZvciBleGFtcGxlIDMgYW5kIDMgUE0vQU1cbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IHRydWU7XG4gICAgICAgIHRpbWUgPSB0aGlzLmFkZEFNb3JQTSh0aW1lLCAwLCAxKTtcbiAgICAgIH1cbiAgICAgIC8vIEZyZW5jaCAvIE1pbGl0YXJ5IFRpbWUgKDI0IGhvdXJzIHBhdHRlcm4pXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChuZXcgUmVnRXhwKC9eWzAtMl1bMC05XTpbMC01XVswLTldJC8pLnRlc3QodGltZSkpIHtcbiAgICAgICAgLy8gTWF0Y2hlcyAxNzozMFxuICAgICAgICBjb3JyZWN0Rm9ybWF0ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTJdWzAtOV1bMC01XVswLTldJC8pLnRlc3QodGltZSkpIHtcbiAgICAgICAgLy8gTWF0Y2hlcyAxNzMwXG4gICAgICAgIGNvcnJlY3RGb3JtYXQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChuZXcgUmVnRXhwKC9eWzAtMl1bMC05XTpbMC01XSQvKS50ZXN0KHRpbWUpKSB7XG4gICAgICAgIC8vIE1hdGNoZXMgMjI6M1xuICAgICAgICBjb3JyZWN0Rm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgdGltZSA9IGAke3RpbWV9MGA7XG4gICAgICB9IGVsc2UgaWYgKG5ldyBSZWdFeHAoL15bMC0yXVswLTldWzAtNV0kLykudGVzdCh0aW1lKSkge1xuICAgICAgICAvLyBNYXRjaGVzIDIyM1xuICAgICAgICBjb3JyZWN0Rm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgdGltZSA9IGAke3RpbWV9MGA7XG4gICAgICB9IGVsc2UgaWYgKG5ldyBSZWdFeHAoL15bMC05XTpbMC01XVswLTldJC8pLnRlc3QodGltZSkpIHtcbiAgICAgICAgLy8gTWF0Y2hlcyA3OjMwXG4gICAgICAgIGNvcnJlY3RGb3JtYXQgPSB0cnVlO1xuICAgICAgICB0aW1lID0gYDAke3RpbWV9YDtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTldWzAtNV1bMC05XSQvKS50ZXN0KHRpbWUpKSB7XG4gICAgICAgIC8vIE1hdGNoZXMgNzMwXG4gICAgICAgIGNvcnJlY3RGb3JtYXQgPSB0cnVlO1xuICAgICAgICB0aW1lID0gYDAke3RpbWV9YDtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTJdWzAtOV0vKS50ZXN0KHRpbWUpKSB7XG4gICAgICAgIC8vIE1hdGNoZXMgMTlcbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IHRydWU7XG4gICAgICAgIHRpbWUgPSBgJHt0aW1lfTAwYDtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTldLykudGVzdCh0aW1lKSkge1xuICAgICAgICAvLyBNYXRjaGVzIDlcbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IHRydWU7XG4gICAgICAgIHRpbWUgPSBgMCR7dGltZX0wMGA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHJldHVybiBkYXRhXG4gICAgaWYgKGNvcnJlY3RGb3JtYXQpIHtcbiAgICAgIHRpbWUgPSB0aW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgICB0aW1lID0gdGhpcy5tYWtlVGltZTREaWdpdCh0aW1lKTtcbiAgICAgIHJldHVyblRpbWUgPSB0aGlzLmFkZENvbG9uSWZNaXNzaW5nKHRpbWUpO1xuXG4gICAgICBpZiAobWlsaXRhcnlUaW1lKSB7XG4gICAgICAgIHJldHVyblRpbWUgPSByZXR1cm5UaW1lLnN1YnN0cmluZygwLCA1KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuVGltZSA9ICcnO1xuICAgIH1cblxuICAgIHJldHVybiByZXR1cm5UaW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBhIHZhbGlkIHRpbWUgdG8gYSA0IGRpZ2l0IHRpbWVcbiAgICogRm9yIGV4YW1wbGUgNCBQTSB0byAwNDowMCBQTSBvciA0OjMwIFBNIHRvIDA0OjMwIFBNXG4gICAqIEBwYXJhbSB0aW1lIFRpbWUtc3RyaW5nIHRvIHBhcnNlIHRvIDQgZGlnaXRcbiAgICovXG4gIHByaXZhdGUgbWFrZVRpbWU0RGlnaXQodGltZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgcHJlQU1vclBNID0gJyc7XG4gICAgbGV0IHBhcnNlZCA9IHRpbWU7XG5cbiAgICAvLyBHZXQgYW55IGV4aXN0aW5nIEFNL1BNXG4gICAgaWYgKG5ldyBSZWdFeHAoL1BNL2kpLnRlc3QodGltZSkpIHtcbiAgICAgIHByZUFNb3JQTSA9ICdQTSc7XG4gICAgICBwYXJzZWQgPSBwYXJzZWQucmVwbGFjZSgvUE0vaSwgJycpO1xuICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvQU0vaSkudGVzdCh0aW1lKSkge1xuICAgICAgcHJlQU1vclBNID0gJ0FNJztcbiAgICAgIHBhcnNlZCA9IHBhcnNlZC5yZXBsYWNlKC9BTS9pLCAnJyk7XG4gICAgfVxuXG4gICAgcGFyc2VkID0gcGFyc2VkLnJlcGxhY2UoJzonLCAnJyk7XG4gICAgcGFyc2VkID0gcGFyc2VkLnJlcGxhY2UoLyAvZywgJycpO1xuICAgIGlmIChwYXJzZWQubGVuZ3RoID09PSAxKSB7XG4gICAgICBwYXJzZWQgPSBgMCR7cGFyc2VkfTAwYDtcbiAgICB9IGVsc2UgaWYgKHBhcnNlZC5sZW5ndGggPT09IDIpIHtcbiAgICAgIHBhcnNlZCA9IGAke3BhcnNlZH0wMGA7XG4gICAgfSBlbHNlIGlmIChwYXJzZWQubGVuZ3RoID09PSAzKSB7XG4gICAgICBpZiAobmV3IFJlZ0V4cCgvXlswLTFdWzAtOV1bMC01XS8pLnRlc3QocGFyc2VkKSkge1xuICAgICAgICBwYXJzZWQgPSBgJHtwYXJzZWR9MGA7XG4gICAgICB9IGVsc2UgaWYgKG5ldyBSZWdFeHAoL15bMC05XVswLTVdWzAtOV0vKS50ZXN0KHBhcnNlZCkpIHtcbiAgICAgICAgcGFyc2VkID0gYDAke3BhcnNlZH1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBgJHtwYXJzZWR9JHtwcmVBTW9yUE0gPyAnICcgKyBwcmVBTW9yUE0gOiAnJ31gO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb2xvbiBpZiBpdCdzIG1pc3NpbmcgdG8gZ2l2ZW4gdGltZS1zdHJpbmdcbiAgICogRm9yIGV4YW1wbGUgMDQwMCB0byAwNDowMFxuICAgKiBAcGFyYW0gdGltZSBUaW1lLXN0cmluZyB0byBhZGQgbWlzc2luZyBjb2xvbiB0b1xuICAgKi9cbiAgcHJpdmF0ZSBhZGRDb2xvbklmTWlzc2luZyh0aW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0aW1lLmluZGV4T2YoJzonKSA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBgJHt0aW1lLnN1YnN0cmluZygwLCAyKX06JHt0aW1lLnN1YnN0cmluZygyKX1gO1xuICAgIH1cbiAgICByZXR1cm4gdGltZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyBzdGFydCBhbmQgZW5kIG9mIHRpbWUtc3RyaW5nIGFuZCB0aGVuIGFkZHMgY29ycmVjdCBBTS9QTVxuICAgKiBAcGFyYW0gdGltZSBUaW1lLXN0cmluZyB0byBhZGQgQU0gb3IgUE0gdG9vXG4gICAqIEBwYXJhbSBzdGFydCBXaGVyZSB0aW1lIHN0YXJ0cyBpbiBzdHJpbmdcbiAgICogQHBhcmFtIGVuZCBXaGVyZSB0aW1lIGVuZHMgaW4gc3RyaW5nXG4gICAqL1xuICBwcml2YXRlIGFkZEFNb3JQTSh0aW1lOiBzdHJpbmcsIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAobmV3IFJlZ0V4cCgvUE0vaSkudGVzdCh0aW1lKSkge1xuICAgICAgcmV0dXJuIGAke3RpbWUuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpfSBQTWA7XG4gICAgfSBlbHNlIGlmIChuZXcgUmVnRXhwKC9BTS9pKS50ZXN0KHRpbWUpKSB7XG4gICAgICByZXR1cm4gYCR7dGltZS5zdWJzdHJpbmcoc3RhcnQsIGVuZCl9IEFNYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGAke3RpbWUuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpfSBQTWA7XG4gICAgfVxuICB9XG59XG4iXX0=