fundamental-ngx
Version:
SAP Fiori Fundamentals, implemented in Angular
635 lines • 52.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, EventEmitter, forwardRef, Input, Output, ViewEncapsulation } from '@angular/core';
import { TimeObject } from './time-object';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { TimeI18nLabels } from './i18n/time-i18n-labels';
var TimeComponent = /** @class */ (function () {
function TimeComponent(timeI18nLabels) {
this.timeI18nLabels = timeI18nLabels;
/**
* \@Input When set to true, uses the 24 hour clock (hours ranging from 0 to 23)
* and does not display a period control.
*/
this.meridian = false;
/**
* \@Input When set to false, does not set the input field to invalid state on invalid entry.
*/
this.validate = true;
/**
* \@Input When set to false, hides the buttons that increment and decrement the corresponding input.
*/
this.spinners = true;
/**
* \@Input When set to false, hides the input for seconds.
*/
this.displaySeconds = true;
/**
* \@Input An object that contains three integer properties: 'hour' (ranging from 0 to 23),
* 'minute' (ranging from 0 to 59), and 'second' (ranging from 0 to 59). This is the model the component consumes. Example:
*
* ```json
* { hour: 12, minute: 0, second: 0 }
* ```
*
*/
this.time = { hour: 0, minute: 0, second: 0 };
/**
* @hidden
*/
this.focusArrowLeft = new EventEmitter();
/**
* @hidden
*/
this.onChange = (/**
* @param {?} time
* @return {?}
*/
function (time) { });
/**
* @hidden
*/
this.onTouched = (/**
* @return {?}
*/
function () { });
}
/** @hidden */
/**
* @hidden
* @return {?}
*/
TimeComponent.prototype.setDisplayedHour = /**
* @hidden
* @return {?}
*/
function () {
if (this.time.hour === 0) {
this.displayedHour = 12;
this.period = 'am';
}
else if (this.time.hour > 12) {
this.displayedHour = this.time.hour - 12;
this.period = 'pm';
}
else if (this.time.hour === 12) {
this.displayedHour = 12;
this.period = 'pm';
}
else {
this.displayedHour = this.time.hour;
this.period = 'am';
}
this.oldPeriod = this.period;
};
/** @hidden */
/**
* @hidden
* @return {?}
*/
TimeComponent.prototype.displayedHourChanged = /**
* @hidden
* @return {?}
*/
function () {
if (this.displayedHour === null && this.time) {
this.time.hour = null;
}
else {
if (this.period === 'am') {
if (this.displayedHour === 12) {
this.time.hour = 0;
}
else {
this.time.hour = this.displayedHour;
}
}
else if (this.period === 'pm') {
if (this.displayedHour === 12) {
this.time.hour = this.displayedHour;
}
else {
this.time.hour = this.displayedHour + 12;
}
}
}
this.onChange(this.time);
};
/** @hidden */
/**
* @hidden
* @param {?} inputType
* @return {?}
*/
TimeComponent.prototype.inputBlur = /**
* @hidden
* @param {?} inputType
* @return {?}
*/
function (inputType) {
if (inputType === 'hour') {
if (this.meridian) {
this.time.hour = Math.round(this.time.hour);
if (this.displayedHour === 0) {
this.time.hour = 0;
this.setDisplayedHour();
this.onChange(this.time);
}
else if (this.displayedHour > 12 && this.displayedHour < 24) {
if (this.period === 'pm') {
this.time.hour = this.displayedHour - 12;
}
this.setDisplayedHour();
this.onChange(this.time);
}
else if (this.displayedHour >= 24) {
this.displayedHour = this.displayedHour % 12;
this.displayedHourChanged();
}
else if (this.displayedHour < 0) {
this.displayedHour = (this.displayedHour * -1) % 12;
this.displayedHourChanged();
}
}
else {
this.time.hour = Math.round(this.time.hour) % 24;
if (this.time.hour < 0) {
this.time.hour = this.time.hour * -1;
this.onChange(this.time);
}
}
}
else if (inputType === 'minute') {
this.time.minute = Math.round(this.time.minute) % 60;
if (this.time.minute < 0) {
this.time.minute = this.time.minute * -1;
}
this.onChange(this.time);
}
else if (inputType === 'second') {
this.time.second = Math.round(this.time.second) % 60;
if (this.time.second < 0) {
this.time.second = this.time.second * -1;
}
this.onChange(this.time);
}
else if (inputType === 'period') {
if (this.period !== 'am' && this.period !== 'pm') {
this.setDisplayedHour();
this.onChange(this.time);
}
}
};
/** @hidden */
/**
* @hidden
* @return {?}
*/
TimeComponent.prototype.ngOnChanges = /**
* @hidden
* @return {?}
*/
function () {
if (this.meridian) {
this.setDisplayedHour();
}
else {
this.displayedHour = this.time.hour;
}
};
/** Increases the hour value by one. */
/**
* Increases the hour value by one.
* @return {?}
*/
TimeComponent.prototype.increaseHour = /**
* Increases the hour value by one.
* @return {?}
*/
function () {
if (this.time.hour === null) {
this.time.hour = 0;
}
else if (this.time.hour === 23) {
this.time.hour = 0;
}
else {
this.time.hour = this.time.hour + 1;
}
if (this.meridian) {
this.setDisplayedHour();
}
this.onChange(this.time);
};
/** Decreases the hour value by one. */
/**
* Decreases the hour value by one.
* @return {?}
*/
TimeComponent.prototype.decreaseHour = /**
* Decreases the hour value by one.
* @return {?}
*/
function () {
if (this.time.hour === null) {
this.time.hour = 0;
}
else if (this.time.hour === 0) {
this.time.hour = 23;
}
else {
this.time.hour = this.time.hour - 1;
}
if (this.meridian) {
this.setDisplayedHour();
}
this.onChange(this.time);
};
/** Increases the minute value by one. */
/**
* Increases the minute value by one.
* @return {?}
*/
TimeComponent.prototype.increaseMinute = /**
* Increases the minute value by one.
* @return {?}
*/
function () {
if (this.time.minute === null) {
this.time.minute = 0;
}
else if (this.time.minute === 59) {
this.time.minute = 0;
this.increaseHour();
}
else {
this.time.minute = this.time.minute + 1;
}
this.onChange(this.time);
};
/** Decreases the minute value by one. */
/**
* Decreases the minute value by one.
* @return {?}
*/
TimeComponent.prototype.decreaseMinute = /**
* Decreases the minute value by one.
* @return {?}
*/
function () {
if (this.time.minute === null) {
this.time.minute = 0;
}
else if (this.time.minute === 0) {
this.time.minute = 59;
this.decreaseHour();
}
else {
this.time.minute = this.time.minute - 1;
}
this.onChange(this.time);
};
/** Increases the second value by one. */
/**
* Increases the second value by one.
* @return {?}
*/
TimeComponent.prototype.increaseSecond = /**
* Increases the second value by one.
* @return {?}
*/
function () {
if (this.displaySeconds) {
if (this.time.second === null) {
this.time.second = 0;
}
else if (this.time.second === 59) {
this.time.second = 0;
this.increaseMinute();
}
else {
this.time.second = this.time.second + 1;
}
}
this.onChange(this.time);
};
/** Decreases the second value by one. */
/**
* Decreases the second value by one.
* @return {?}
*/
TimeComponent.prototype.decreaseSecond = /**
* Decreases the second value by one.
* @return {?}
*/
function () {
if (this.displaySeconds) {
if (this.time.second === null) {
this.time.second = 0;
}
else if (this.time.second === 0) {
this.time.second = 59;
this.decreaseMinute();
}
else {
this.time.second = this.time.second - 1;
}
}
this.onChange(this.time);
};
/** Toggles the period (am/pm). */
/**
* Toggles the period (am/pm).
* @return {?}
*/
TimeComponent.prototype.togglePeriod = /**
* Toggles the period (am/pm).
* @return {?}
*/
function () {
if (this.time.hour < 24 && this.time.hour >= 0) {
if (this.period === 'am') {
this.period = 'pm';
this.periodModelChange();
}
else if (this.period === 'pm') {
this.period = 'am';
this.periodModelChange();
}
}
};
/** @hidden */
/**
* @hidden
* @return {?}
*/
TimeComponent.prototype.hourModelChange = /**
* @hidden
* @return {?}
*/
function () {
if (this.meridian) {
if (!(this.time.hour > 12 || this.time.hour < 0) || !this.validate) {
this.onChange(this.time);
}
}
else {
if (!(this.time.hour > 23 || this.time.hour < 0) || !this.validate) {
this.onChange(this.time);
}
}
};
/** @hidden */
/**
* @hidden
* @return {?}
*/
TimeComponent.prototype.minuteModelChange = /**
* @hidden
* @return {?}
*/
function () {
if (!(this.time.minute > 59 || this.time.minute < 0) || !this.validate) {
this.onChange(this.time);
}
};
/** @hidden */
/**
* @hidden
* @return {?}
*/
TimeComponent.prototype.secondModelChange = /**
* @hidden
* @return {?}
*/
function () {
if (!(this.time.second > 59 || this.time.second < 0) || !this.validate) {
this.onChange(this.time);
}
};
/** @hidden */
/**
* @hidden
* @return {?}
*/
TimeComponent.prototype.periodModelChange = /**
* @hidden
* @return {?}
*/
function () {
this.period = this.period.toLowerCase();
if (this.period !== 'am' && this.period !== 'pm') {
this.periodInvalid = true;
}
else if (this.time.hour < 24 && this.time.hour >= 0) {
if (this.oldPeriod === 'am' && this.period === 'pm') {
this.time.hour = this.time.hour + 12;
}
else if (this.oldPeriod === 'pm' && this.period === 'am') {
if (this.time.hour === null) {
this.time.hour = 0;
}
else {
this.time.hour = this.time.hour - 12;
}
}
this.periodInvalid = false;
this.onChange(this.time);
}
this.setDisplayedHour();
};
/** @hidden */
/**
* @hidden
* @param {?} fn
* @return {?}
*/
TimeComponent.prototype.registerOnChange = /**
* @hidden
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onChange = fn;
};
/** @hidden */
/**
* @hidden
* @param {?} fn
* @return {?}
*/
TimeComponent.prototype.registerOnTouched = /**
* @hidden
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onTouched = fn;
};
/** @hidden */
/**
* @hidden
* @param {?} isDisabled
* @return {?}
*/
TimeComponent.prototype.setDisabledState = /**
* @hidden
* @param {?} isDisabled
* @return {?}
*/
function (isDisabled) {
this.disabled = isDisabled;
};
/** @hidden */
/**
* @hidden
* @param {?} time
* @return {?}
*/
TimeComponent.prototype.writeValue = /**
* @hidden
* @param {?} time
* @return {?}
*/
function (time) {
if (!time) {
return;
}
this.time = time;
this.setDisplayedHour();
};
/** @hidden */
/**
* @hidden
* @param {?} event
* @return {?}
*/
TimeComponent.prototype.lastButtonKeydown = /**
* @hidden
* @param {?} event
* @return {?}
*/
function (event) {
if (event.code === 'Tab' && !event.shiftKey) {
event.preventDefault();
this.focusArrowLeft.emit();
}
};
TimeComponent.decorators = [
{ type: Component, args: [{
selector: 'fd-time',
template: "<div class=\"fd-time__item\">\n <div class=\"fd-time__control\">\n <button *ngIf=\"spinners\"\n [ngClass]=\"{'is-disabled': disabled}\"\n (click)=\"increaseHour()\"\n type=\"button\"\n class=\" fd-button--light fd-button--xs sap-icon--navigation-up-arrow\"\n [attr.aria-label]=\"timeI18nLabels?.increaseHoursLabel\"></button>\n </div>\n <div class=\"fd-time__input\">\n <input *ngIf=\"meridian\"\n (blur)=\"inputBlur('hour')\"\n [ngClass]=\"{'is-disabled': disabled, 'is-invalid': ((displayedHour > 12 || displayedHour < 0) && validate)}\"\n [(ngModel)]=\"displayedHour\"\n (keyup)=\"displayedHourChanged()\"\n class=\"fd-form__control\"\n type=\"number\"\n placeholder=\"hh\"\n [attr.aria-label]=\"timeI18nLabels?.hoursLabel\"/>\n <input *ngIf=\"!meridian\"\n (blur)=\"inputBlur('hour')\"\n [ngClass]=\"{'is-disabled': disabled, 'is-invalid': ((time.hour > 23 || time.hour < 0) && validate)}\"\n [(ngModel)]=\"time.hour\"\n (ngModelChange)=\"hourModelChange()\"\n class=\"fd-form__control\"\n type=\"number\"\n placeholder=\"hh\"\n [attr.aria-label]=\"timeI18nLabels?.hoursLabel\"/>\n </div>\n <div class=\"fd-time__control\">\n <button *ngIf=\"spinners\"\n [ngClass]=\"{'is-disabled': disabled}\"\n (click)=\"decreaseHour()\"\n type=\"button\"\n class=\" fd-button--light fd-button--xs sap-icon--navigation-down-arrow\"\n [attr.aria-label]=\"timeI18nLabels?.decreaseHoursLabel\"></button>\n </div>\n</div>\n\n<div class=\"fd-time__item\">\n <div class=\"fd-time__control\">\n <button *ngIf=\"spinners\"\n [ngClass]=\"{'is-disabled': disabled}\"\n (click)=\"increaseMinute()\"\n type=\"button\"\n class=\" fd-button--light fd-button--xs sap-icon--navigation-up-arrow\"\n [attr.aria-label]=\"timeI18nLabels?.increaseMinutesLabel\"></button>\n </div>\n <div class=\"fd-time__input\">\n <input [(ngModel)]=\"time.minute\"\n (ngModelChange)=\"minuteModelChange()\"\n (blur)=\"inputBlur('minute')\"\n [ngClass]=\"{'is-disabled': disabled, 'is-invalid': ((time.minute > 59 || time.minute < 0) && validate)}\"\n class=\"fd-form__control\"\n type=\"number\"\n placeholder=\"mm\"\n [attr.aria-label]=\"timeI18nLabels?.minutesLabel\"/>\n </div>\n <div class=\"fd-time__control\">\n <button *ngIf=\"spinners\"\n [ngClass]=\"{'is-disabled': disabled}\"\n (click)=\"decreaseMinute()\"\n type=\"button\"\n class=\" fd-button--light fd-button--xs sap-icon--navigation-down-arrow\"\n [attr.aria-label]=\"timeI18nLabels?.decreaseMinutesLabel\"></button>\n </div>\n</div>\n<div *ngIf=\"displaySeconds\"\n class=\"fd-time__item\">\n <div class=\"fd-time__control\">\n <button *ngIf=\"spinners\"\n [ngClass]=\"{'is-disabled': disabled}\"\n (click)=\"increaseSecond()\"\n type=\"button\"\n class=\" fd-button--light fd-button--xs sap-icon--navigation-up-arrow\"\n [attr.aria-label]=\"timeI18nLabels?.increaseSecondsLabel\"></button>\n </div>\n <div class=\"fd-time__input\">\n <input [(ngModel)]=\"time.second\"\n (ngModelChange)=\"secondModelChange()\"\n (blur)=\"inputBlur('second')\"\n [ngClass]=\"{'is-disabled': disabled, 'is-invalid': ((time.second > 59 || time.second < 0) && validate)}\"\n class=\"fd-form__control\"\n type=\"number\"\n placeholder=\"ss\"\n (keydown)=\"!meridian && !spinners ? lastButtonKeydown($event) : ''\"\n [attr.aria-label]=\"timeI18nLabels?.secondsLabel\"/>\n </div>\n <div class=\"fd-time__control\">\n <button *ngIf=\"spinners\"\n [ngClass]=\"{'is-disabled': disabled}\"\n (click)=\"decreaseSecond()\"\n type=\"button\"\n class=\" fd-button--light fd-button--xs sap-icon--navigation-down-arrow\"\n [attr.aria-label]=\"timeI18nLabels?.decreaseSecondsLabel\"\n (keydown)=\"!meridian ? lastButtonKeydown($event) : ''\"></button>\n </div>\n</div>\n<div *ngIf=\"meridian\"\n class=\"fd-time__item\">\n <div class=\"fd-time__control\">\n <button *ngIf=\"spinners\"\n [ngClass]=\"{'is-disabled': disabled}\"\n (click)=\"togglePeriod()\"\n type=\"button\"\n class=\" fd-button--light fd-button--xs sap-icon--navigation-up-arrow\"\n [attr.aria-label]=\"timeI18nLabels?.increasePeriodLabel\"></button>\n </div>\n <div class=\"fd-time__input\">\n <input [(ngModel)]=\"period\"\n [ngClass]=\"{'is-disabled': disabled, 'is-invalid': periodInvalid}\"\n class=\"fd-form__control\"\n (blur)=\"inputBlur('period')\"\n (ngModelChange)=\"periodModelChange()\"\n type=\"text\"\n placeholder=\"am\"\n [attr.aria-label]=\"timeI18nLabels?.periodLabel\"/>\n </div>\n <div class=\"fd-time__control\">\n <button *ngIf=\"spinners\"\n [ngClass]=\"{'is-disabled': disabled}\"\n (click)=\"togglePeriod()\"\n type=\"button\"\n class=\" fd-button--light fd-button--xs sap-icon--navigation-down-arrow\"\n [attr.aria-label]=\"timeI18nLabels?.decreasePeriodLabel\"\n (keydown)=\"lastButtonKeydown($event)\"></button>\n </div>\n</div>\n",
host: {
'(blur)': 'onTouched()',
class: 'fd-time fd-has-display-block'
},
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
function () { return TimeComponent; })),
multi: true
}
],
encapsulation: ViewEncapsulation.None,
styles: ["input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}"]
}] }
];
/** @nocollapse */
TimeComponent.ctorParameters = function () { return [
{ type: TimeI18nLabels }
]; };
TimeComponent.propDecorators = {
meridian: [{ type: Input }],
validate: [{ type: Input }],
disabled: [{ type: Input }],
spinners: [{ type: Input }],
displaySeconds: [{ type: Input }],
time: [{ type: Input }],
focusArrowLeft: [{ type: Output }],
setDisplayedHour: [{ type: Input }]
};
return TimeComponent;
}());
export { TimeComponent };
if (false) {
/**
* \@Input When set to true, uses the 24 hour clock (hours ranging from 0 to 23)
* and does not display a period control.
* @type {?}
*/
TimeComponent.prototype.meridian;
/**
* \@Input When set to false, does not set the input field to invalid state on invalid entry.
* @type {?}
*/
TimeComponent.prototype.validate;
/**
* \@Input Disables the component.
* @type {?}
*/
TimeComponent.prototype.disabled;
/**
* \@Input When set to false, hides the buttons that increment and decrement the corresponding input.
* @type {?}
*/
TimeComponent.prototype.spinners;
/**
* \@Input When set to false, hides the input for seconds.
* @type {?}
*/
TimeComponent.prototype.displaySeconds;
/**
* \@Input An object that contains three integer properties: 'hour' (ranging from 0 to 23),
* 'minute' (ranging from 0 to 59), and 'second' (ranging from 0 to 59). This is the model the component consumes. Example:
*
* ```json
* { hour: 12, minute: 0, second: 0 }
* ```
*
* @type {?}
*/
TimeComponent.prototype.time;
/**
* @hidden
* @type {?}
*/
TimeComponent.prototype.focusArrowLeft;
/**
* @hidden
* @type {?}
*/
TimeComponent.prototype.period;
/**
* @hidden
* @type {?}
*/
TimeComponent.prototype.oldPeriod;
/**
* @hidden
* @type {?}
*/
TimeComponent.prototype.periodInvalid;
/**
* @hidden
* @type {?}
*/
TimeComponent.prototype.displayedHour;
/**
* @hidden
* @type {?}
*/
TimeComponent.prototype.onChange;
/**
* @hidden
* @type {?}
*/
TimeComponent.prototype.onTouched;
/** @type {?} */
TimeComponent.prototype.timeI18nLabels;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9mdW5kYW1lbnRhbC1uZ3gvIiwic291cmNlcyI6WyJsaWIvdGltZS90aW1lLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBSXpEO0lBeVZJLHVCQUFtQixjQUE4QjtRQUE5QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7Ozs7O1FBcFV4QyxhQUFRLEdBQVksS0FBSyxDQUFDOzs7O1FBRzFCLGFBQVEsR0FBWSxJQUFJLENBQUM7Ozs7UUFNekIsYUFBUSxHQUFZLElBQUksQ0FBQzs7OztRQUd6QixtQkFBYyxHQUFZLElBQUksQ0FBQzs7Ozs7Ozs7OztRQVd4QyxTQUFJLEdBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDOzs7O1FBSXJELG1CQUFjLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7Ozs7UUFrQzVELGFBQVE7Ozs7UUFBRyxVQUFDLElBQWdCLElBQU0sQ0FBQyxFQUFDOzs7O1FBRXBDLGNBQVM7OztRQUFHLGNBQU8sQ0FBQyxFQUFDO0lBcVErQixDQUFDO0lBM1JyRCxjQUFjOzs7OztJQUVkLHdDQUFnQjs7OztJQURoQjtRQUVJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1lBQ3RCLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1lBQ3hC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QUksRUFBRTt3QkFDRixRQUFRLEVBQUUsYUFBYTt3QkFDdkIsS0FBSyxFQUFFLDhCQUE4QjtxQkFDeEM7b0JBQ0QsU0FBUyxFQUFFO3dCQUNQOzRCQUNJLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVOzs7NEJBQUMsY0FBTSxPQUFBLGFBQWEsRUFBYixDQUFhLEVBQUM7NEJBQzVDLEtBQUssRUFBRSxJQUFJO3lCQUNkO3FCQUNKO29CQUNELGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJOztpQkFDeEM7Ozs7Z0JBcEJRLGNBQWM7OzsyQkF5QmxCLEtBQUs7MkJBR0wsS0FBSzsyQkFHTCxLQUFLOzJCQUdMLEtBQUs7aUNBR0wsS0FBSzt1QkFVTCxLQUFLO2lDQUlMLE1BQU07bUNBZ0JOLEtBQUs7O0lBMlJWLG9CQUFDO0NBQUEsQUExVkQsSUEwVkM7U0F6VVksYUFBYTs7Ozs7OztJQUl0QixpQ0FBbUM7Ozs7O0lBR25DLGlDQUFrQzs7Ozs7SUFHbEMsaUNBQTJCOzs7OztJQUczQixpQ0FBa0M7Ozs7O0lBR2xDLHVDQUF3Qzs7Ozs7Ozs7Ozs7SUFVeEMsNkJBQ3FEOzs7OztJQUdyRCx1Q0FDNEQ7Ozs7O0lBRzVELCtCQUFlOzs7OztJQUdmLGtDQUFrQjs7Ozs7SUFHbEIsc0NBQXVCOzs7OztJQUd2QixzQ0FBc0I7Ozs7O0lBc0J0QixpQ0FBb0M7Ozs7O0lBRXBDLGtDQUFxQjs7SUFxUVQsdUNBQXFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIGZvcndhcmRSZWYsIElucHV0LCBPbkNoYW5nZXMsIE91dHB1dCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRpbWVPYmplY3QgfSBmcm9tICcuL3RpbWUtb2JqZWN0JztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFRpbWVJMThuTGFiZWxzIH0gZnJvbSAnLi9pMThuL3RpbWUtaTE4bi1sYWJlbHMnO1xuaW1wb3J0IHsgRGF0ZUZvcm1hdFBhcnNlciB9IGZyb20gJy4uL2NhbGVuZGFyL2Zvcm1hdC9kYXRlLXBhcnNlcic7XG5pbXBvcnQgeyBUaW1lRm9ybWF0UGFyc2VyIH0gZnJvbSAnLi4vdGltZS1waWNrZXIvZm9ybWF0L3RpbWUtcGFyc2VyJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdmZC10aW1lJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vdGltZS5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vdGltZS5jb21wb25lbnQuc2NzcyddLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJyhibHVyKSc6ICdvblRvdWNoZWQoKScsXG4gICAgICAgIGNsYXNzOiAnZmQtdGltZSBmZC1oYXMtZGlzcGxheS1ibG9jaydcbiAgICB9LFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFRpbWVDb21wb25lbnQpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWVcbiAgICAgICAgfVxuICAgIF0sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBUaW1lQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG5cbiAgICAvKiogQElucHV0IFdoZW4gc2V0IHRvIHRydWUsIHVzZXMgdGhlIDI0IGhvdXIgY2xvY2sgKGhvdXJzIHJhbmdpbmcgZnJvbSAwIHRvIDIzKVxuICAgICAqIGFuZCBkb2VzIG5vdCBkaXNwbGF5IGEgcGVyaW9kIGNvbnRyb2wuICovXG4gICAgQElucHV0KCkgbWVyaWRpYW46IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKiBASW5wdXQgV2hlbiBzZXQgdG8gZmFsc2UsIGRvZXMgbm90IHNldCB0aGUgaW5wdXQgZmllbGQgdG8gaW52YWxpZCBzdGF0ZSBvbiBpbnZhbGlkIGVudHJ5LiAqL1xuICAgIEBJbnB1dCgpIHZhbGlkYXRlOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKiBASW5wdXQgRGlzYWJsZXMgdGhlIGNvbXBvbmVudC4gKi9cbiAgICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbjtcblxuICAgIC8qKiBASW5wdXQgV2hlbiBzZXQgdG8gZmFsc2UsIGhpZGVzIHRoZSBidXR0b25zIHRoYXQgaW5jcmVtZW50IGFuZCBkZWNyZW1lbnQgdGhlIGNvcnJlc3BvbmRpbmcgaW5wdXQuICovXG4gICAgQElucHV0KCkgc3Bpbm5lcnM6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqIEBJbnB1dCBXaGVuIHNldCB0byBmYWxzZSwgaGlkZXMgdGhlIGlucHV0IGZvciBzZWNvbmRzLiAqL1xuICAgIEBJbnB1dCgpIGRpc3BsYXlTZWNvbmRzOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIEBJbnB1dCBBbiBvYmplY3QgdGhhdCBjb250YWlucyB0aHJlZSBpbnRlZ2VyIHByb3BlcnRpZXM6ICdob3VyJyAocmFuZ2luZyBmcm9tIDAgdG8gMjMpLFxuICAgICAqICdtaW51dGUnIChyYW5naW5nIGZyb20gMCB0byA1OSksIGFuZCAnc2Vjb25kJyAocmFuZ2luZyBmcm9tIDAgdG8gNTkpLiBUaGlzIGlzIHRoZSBtb2RlbCB0aGUgY29tcG9uZW50IGNvbnN1bWVzLiBFeGFtcGxlOlxuICAgICAqXG4gICAgICogYGBganNvblxuICAgICAqIHsgaG91cjogMTIsIG1pbnV0ZTogMCwgc2Vjb25kOiAwIH1cbiAgICAgKiBgYGBcbiAgICAgKiAqL1xuICAgIEBJbnB1dCgpXG4gICAgdGltZTogVGltZU9iamVjdCA9IHsgaG91cjogMCwgbWludXRlOiAwLCBzZWNvbmQ6IDAgfTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQE91dHB1dCgpXG4gICAgZm9jdXNBcnJvd0xlZnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHBlcmlvZDogc3RyaW5nO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBvbGRQZXJpb2Q6IHN0cmluZztcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcGVyaW9kSW52YWxpZDogYm9vbGVhbjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgZGlzcGxheWVkSG91cjogbnVtYmVyO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBASW5wdXQoKVxuICAgIHNldERpc3BsYXllZEhvdXIoKSB7XG4gICAgICAgIGlmICh0aGlzLnRpbWUuaG91ciA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRIb3VyID0gMTI7XG4gICAgICAgICAgICB0aGlzLnBlcmlvZCA9ICdhbSc7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy50aW1lLmhvdXIgPiAxMikge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRIb3VyID0gdGhpcy50aW1lLmhvdXIgLSAxMjtcbiAgICAgICAgICAgIHRoaXMucGVyaW9kID0gJ3BtJztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnRpbWUuaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkSG91ciA9IDEyO1xuICAgICAgICAgICAgdGhpcy5wZXJpb2QgPSAncG0nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRIb3VyID0gdGhpcy50aW1lLmhvdXI7XG4gICAgICAgICAgICB0aGlzLnBlcmlvZCA9ICdhbSc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vbGRQZXJpb2QgPSB0aGlzLnBlcmlvZDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG9uQ2hhbmdlID0gKHRpbWU6IFRpbWVPYmplY3QpID0+IHt9O1xuICAgIC8qKiBAaGlkZGVuICovXG4gICAgb25Ub3VjaGVkID0gKCkgPT4ge307XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGRpc3BsYXllZEhvdXJDaGFuZ2VkKCkge1xuICAgICAgICBpZiAodGhpcy5kaXNwbGF5ZWRIb3VyID09PSBudWxsICYmIHRoaXMudGltZSkge1xuICAgICAgICAgICAgdGhpcy50aW1lLmhvdXIgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMucGVyaW9kID09PSAnYW0nKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGlzcGxheWVkSG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lLmhvdXIgPSAwO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGltZS5ob3VyID0gdGhpcy5kaXNwbGF5ZWRIb3VyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wZXJpb2QgPT09ICdwbScpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kaXNwbGF5ZWRIb3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWUuaG91ciA9IHRoaXMuZGlzcGxheWVkSG91cjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWUuaG91ciA9IHRoaXMuZGlzcGxheWVkSG91ciArIDEyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudGltZSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBpbnB1dEJsdXIoaW5wdXRUeXBlKSB7XG4gICAgICAgIGlmIChpbnB1dFR5cGUgPT09ICdob3VyJykge1xuICAgICAgICAgICAgaWYgKHRoaXMubWVyaWRpYW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWUuaG91ciA9IE1hdGgucm91bmQodGhpcy50aW1lLmhvdXIpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRpc3BsYXllZEhvdXIgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lLmhvdXIgPSAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldERpc3BsYXllZEhvdXIoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLnRpbWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kaXNwbGF5ZWRIb3VyID4gMTIgJiYgdGhpcy5kaXNwbGF5ZWRIb3VyIDwgMjQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGVyaW9kID09PSAncG0nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWUuaG91ciA9IHRoaXMuZGlzcGxheWVkSG91ciAtIDEyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0RGlzcGxheWVkSG91cigpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudGltZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRpc3BsYXllZEhvdXIgPj0gMjQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRIb3VyID0gdGhpcy5kaXNwbGF5ZWRIb3VyICUgMTI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkSG91ckNoYW5nZWQoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGlzcGxheWVkSG91ciA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRIb3VyID0gKHRoaXMuZGlzcGxheWVkSG91ciAqIC0xKSAlIDEyO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXllZEhvdXJDaGFuZ2VkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWUuaG91ciA9IE1hdGgucm91bmQodGhpcy50aW1lLmhvdXIpICUgMjQ7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudGltZS5ob3VyIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWUuaG91ciA9IHRoaXMudGltZS5ob3VyICogLTE7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy50aW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXRUeXBlID09PSAnbWludXRlJykge1xuICAgICAgICAgICAgdGhpcy50aW1lLm1pbnV0ZSA9IE1hdGgucm91bmQodGhpcy50aW1lLm1pbnV0ZSkgJSA2MDtcbiAgICAgICAgICAgIGlmICh0aGlzLnRpbWUubWludXRlIDwgMCkge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZS5taW51dGUgPSB0aGlzLnRpbWUubWludXRlICogLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudGltZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXRUeXBlID09PSAnc2Vjb25kJykge1xuICAgICAgICAgICAgdGhpcy50aW1lLnNlY29uZCA9IE1hdGgucm91bmQodGhpcy50aW1lLnNlY29uZCkgJSA2MDtcbiAgICAgICAgICAgIGlmICh0aGlzLnRpbWUuc2Vjb25kIDwgMCkge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZS5zZWNvbmQgPSB0aGlzLnRpbWUuc2Vjb25kICogLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudGltZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXRUeXBlID09PSAncGVyaW9kJykge1xuICAgICAgICAgICAgaWYgKHRoaXMucGVyaW9kICE9PSAnYW0nICYmIHRoaXMucGVyaW9kICE9PSAncG0nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXREaXNwbGF5ZWRIb3VyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLnRpbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uQ2hhbmdlcygpIHtcbiAgICAgICAgaWYgKHRoaXMubWVyaWRpYW4pIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RGlzcGxheWVkSG91cigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRIb3VyID0gdGhpcy50aW1lLmhvdXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogSW5jcmVhc2VzIHRoZSBob3VyIHZhbHVlIGJ5IG9uZS4gKi9cbiAgICBpbmNyZWFzZUhvdXIoKSB7XG4gICAgICAgIGlmICh0aGlzLnRpbWUuaG91ciA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy50aW1lLmhvdXIgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudGltZS5ob3VyID09PSAyMykge1xuICAgICAgICAgICAgdGhpcy50aW1lLmhvdXIgPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50aW1lLmhvdXIgPSB0aGlzLnRpbWUuaG91ciArIDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWVyaWRpYW4pIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RGlzcGxheWVkSG91cigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy50aW1lKTtcbiAgICB9XG5cbiAgICAvKiogRGVjcmVhc2VzIHRoZSBob3VyIHZhbHVlIGJ5IG9uZS4gKi9cbiAgICBkZWNyZWFzZUhvdXIoKSB7XG4gICAgICAgIGlmICh0aGlzLnRpbWUuaG91ciA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy50aW1lLmhvdXIgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudGltZS5ob3VyID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnRpbWUuaG91ciA9IDIzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50aW1lLmhvdXIgPSB0aGlzLnRpbWUuaG91ciAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWVyaWRpYW4pIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RGlzcGxheWVkSG91cigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy50aW1lKTtcbiAgICB9XG5cbiAgICAvKiogSW5jcmVhc2VzIHRoZSBtaW51dGUgdmFsdWUgYnkgb25lLiAqL1xuICAgIGluY3JlYXNlTWludXRlKCkge1xuICAgICAgICBpZiAodGhpcy50aW1lLm1pbnV0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy50aW1lLm1pbnV0ZSA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy50aW1lLm1pbnV0ZSA9PT0gNTkpIHtcbiAgICAgICAgICAgIHRoaXMudGltZS5taW51dGUgPSAwO1xuICAgICAgICAgICAgdGhpcy5pbmNyZWFzZUhvdXIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudGltZS5taW51dGUgPSB0aGlzLnRpbWUubWludXRlICsgMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudGltZSk7XG4gICAgfVxuXG4gICAgLyoqIERlY3JlYXNlcyB0aGUgbWludXRlIHZhbHVlIGJ5IG9uZS4gKi9cbiAgICBkZWNyZWFzZU1pbnV0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMudGltZS5taW51dGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMudGltZS5taW51dGUgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudGltZS5taW51dGUgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMudGltZS5taW51dGUgPSA1OTtcbiAgICAgICAgICAgIHRoaXMuZGVjcmVhc2VIb3VyKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRpbWUubWludXRlID0gdGhpcy50aW1lLm1pbnV0ZSAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLnRpbWUpO1xuICAgIH1cblxuICAgIC8qKiBJbmNyZWFzZXMgdGhlIHNlY29uZCB2YWx1ZSBieSBvbmUuICovXG4gICAgaW5jcmVhc2VTZWNvbmQoKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc3BsYXlTZWNvbmRzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy50aW1lLnNlY29uZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZS5zZWNvbmQgPSAwO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnRpbWUuc2Vjb25kID09PSA1OSkge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZS5zZWNvbmQgPSAwO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5jcmVhc2VNaW51dGUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy50aW1lLnNlY29uZCA9IHRoaXMudGltZS5zZWNvbmQgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy50aW1lKTtcbiAgICB9XG5cbiAgICAvKiogRGVjcmVhc2VzIHRoZSBzZWNvbmQgdmFsdWUgYnkgb25lLiAqL1xuICAgIGRlY3JlYXNlU2Vjb25kKCkge1xuICAgICAgICBpZiAodGhpcy5kaXNwbGF5U2Vjb25kcykge1xuICAgICAgICAgICAgaWYgKHRoaXMudGltZS5zZWNvbmQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWUuc2Vjb25kID0gMDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy50aW1lLnNlY29uZCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZS5zZWNvbmQgPSA1OTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlY3JlYXNlTWludXRlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZS5zZWNvbmQgPSB0aGlzLnRpbWUuc2Vjb25kIC0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudGltZSk7XG4gICAgfVxuXG4gICAgLyoqIFRvZ2dsZXMgdGhlIHBlcmlvZCAoYW0vcG0pLiAqL1xuICAgIHRvZ2dsZVBlcmlvZCgpIHtcbiAgICAgICAgaWYgKHRoaXMudGltZS5ob3VyIDwgMjQgJiYgdGhpcy50aW1lLmhvdXIgPj0gMCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucGVyaW9kID09PSAnYW0nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wZXJpb2QgPSAncG0nO1xuICAgICAgICAgICAgICAgIHRoaXMucGVyaW9kTW9kZWxDaGFuZ2UoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wZXJpb2QgPT09ICdwbScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBlcmlvZCA9ICdhbSc7XG4gICAgICAgICAgICAgICAgdGhpcy5wZXJpb2RNb2RlbENoYW5nZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBob3VyTW9kZWxDaGFuZ2UoKSB7XG4gICAgICAgIGlmICh0aGlzLm1lcmlkaWFuKSB7XG4gICAgICAgICAgICBpZiAoISh0aGlzLnRpbWUuaG91ciA+IDEyIHx8IHRoaXMudGltZS5ob3VyIDwgMCkgfHwgIXRoaXMudmFsaWRhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudGltZSk7XG4gICAgICAgICAgIC