ngx-scrollbar-v8
Version:
Custom overlay-scrollbars with native scrolling mechanism.
331 lines • 22.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Directive, ElementRef, Inject, PLATFORM_ID } from '@angular/core';
import { isPlatformBrowser } from '@angular/common';
import { supportsScrollBehavior } from '@angular/cdk/platform';
import { from, of, animationFrameScheduler } from 'rxjs';
/**
* @record
*/
export function SmoothScrollOptions() { }
if (false) {
/** @type {?|undefined} */
SmoothScrollOptions.prototype.top;
/** @type {?|undefined} */
SmoothScrollOptions.prototype.left;
/** @type {?} */
SmoothScrollOptions.prototype.offsetTop;
/** @type {?} */
SmoothScrollOptions.prototype.offsetLeft;
/** @type {?} */
SmoothScrollOptions.prototype.duration;
/** @type {?} */
SmoothScrollOptions.prototype.scrollFunc;
/** @type {?} */
SmoothScrollOptions.prototype.easeFunc;
}
/**
* @record
*/
export function ScrollToOptions() { }
if (false) {
/** @type {?|undefined} */
ScrollToOptions.prototype.top;
/** @type {?|undefined} */
ScrollToOptions.prototype.left;
/** @type {?|undefined} */
ScrollToOptions.prototype.duration;
/** @type {?|undefined} */
ScrollToOptions.prototype.easeFunc;
}
var SmoothScroll = /** @class */ (function () {
function SmoothScroll(_platform, el) {
this._platform = _platform;
this.view = el.nativeElement;
}
/**
* @private
* @param {?} left
* @param {?} top
* @return {?}
*/
SmoothScroll.prototype.scrollFunc = /**
* @private
* @param {?} left
* @param {?} top
* @return {?}
*/
function (left, top) {
if (supportsScrollBehavior()) {
this.view.scrollTo({ top: top, left: left });
}
else {
this.view.scrollTop = top;
this.view.scrollLeft = left;
}
};
/**
* @param {?} options
* @return {?}
*/
SmoothScroll.prototype.scrollTo = /**
* @param {?} options
* @return {?}
*/
function (options) {
var _this = this;
// Avoid SSR error
if (isPlatformBrowser(this._platform)) {
/** @type {?} */
var scrollFunc = (/**
* @param {?} left
* @param {?} top
* @return {?}
*/
function (left, top) {
if (supportsScrollBehavior()) {
_this.view.scrollTo({ top: top, left: left });
}
else {
_this.view.scrollTop = top;
_this.view.scrollLeft = left;
}
});
if (options.duration) {
/** @type {?} */
var smoothScrollOptions = {
top: options.top,
left: options.left,
duration: options.duration,
easeFunc: options.easeFunc || easeInOutQuad,
offsetTop: this.view.scrollTop,
offsetLeft: this.view.scrollLeft,
scrollFunc: scrollFunc
};
return from(smoothScroll(smoothScrollOptions));
}
this.scrollFunc(options.left, options.top);
}
return of();
};
/**
* @param {?} selector
* @param {?=} offset
* @param {?=} duration
* @param {?=} easeFunc
* @return {?}
*/
SmoothScroll.prototype.scrollToElement = /**
* @param {?} selector
* @param {?=} offset
* @param {?=} duration
* @param {?=} easeFunc
* @return {?}
*/
function (selector, offset, duration, easeFunc) {
if (offset === void 0) { offset = 0; }
/** @type {?} */
var target = this.view.querySelector(selector);
return target ? this.scrollTo({ left: target.offsetLeft, top: target.offsetTop - offset, duration: duration, easeFunc: easeFunc }) : of();
};
/**
* @param {?} left
* @param {?=} duration
* @param {?=} easeFunc
* @return {?}
*/
SmoothScroll.prototype.scrollXTo = /**
* @param {?} left
* @param {?=} duration
* @param {?=} easeFunc
* @return {?}
*/
function (left, duration, easeFunc) {
return this.scrollTo({ left: left, duration: duration, easeFunc: easeFunc });
};
/**
* @param {?} top
* @param {?=} duration
* @param {?=} easeFunc
* @return {?}
*/
SmoothScroll.prototype.scrollYTo = /**
* @param {?} top
* @param {?=} duration
* @param {?=} easeFunc
* @return {?}
*/
function (top, duration, easeFunc) {
return this.scrollTo({ top: top, duration: duration, easeFunc: easeFunc });
};
/**
* @param {?=} duration
* @param {?=} easeFunc
* @return {?}
*/
SmoothScroll.prototype.scrollToTop = /**
* @param {?=} duration
* @param {?=} easeFunc
* @return {?}
*/
function (duration, easeFunc) {
return this.scrollYTo(0, duration, easeFunc);
};
/**
* @param {?=} duration
* @param {?=} easeFunc
* @return {?}
*/
SmoothScroll.prototype.scrollToBottom = /**
* @param {?=} duration
* @param {?=} easeFunc
* @return {?}
*/
function (duration, easeFunc) {
return this.scrollYTo(this.view.scrollHeight - this.view.clientHeight, duration, easeFunc);
};
/**
* @param {?=} duration
* @param {?=} easeFunc
* @return {?}
*/
SmoothScroll.prototype.scrollToRight = /**
* @param {?=} duration
* @param {?=} easeFunc
* @return {?}
*/
function (duration, easeFunc) {
return this.scrollXTo(this.view.scrollWidth, duration, easeFunc);
};
/**
* @param {?=} duration
* @param {?=} easeFunc
* @return {?}
*/
SmoothScroll.prototype.scrollToLeft = /**
* @param {?=} duration
* @param {?=} easeFunc
* @return {?}
*/
function (duration, easeFunc) {
return this.scrollXTo(0, duration, easeFunc);
};
SmoothScroll.decorators = [
{ type: Directive, args: [{
selector: '[smoothScroll], [smooth-scroll]'
},] }
];
/** @nocollapse */
SmoothScroll.ctorParameters = function () { return [
{ type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] },
{ type: ElementRef }
]; };
return SmoothScroll;
}());
export { SmoothScroll };
if (false) {
/**
* @type {?}
* @private
*/
SmoothScroll.prototype.view;
/**
* @type {?}
* @private
*/
SmoothScroll.prototype._platform;
}
/**
* @param {?} options
* @return {?}
*/
export function smoothScroll(options) {
return new Promise((/**
* @param {?} resolve
* @return {?}
*/
function (resolve) {
/** @type {?} */
var currentTime = 0;
/** @type {?} */
var increment = 10;
/** @type {?} */
var valX = options.offsetLeft;
/** @type {?} */
var valY = options.offsetTop;
/** @type {?} */
var animateScroll = (/**
* @return {?}
*/
function () {
// increment the time
currentTime += increment;
// find the value with the easing function
if (typeof options.left !== 'undefined') {
/** @type {?} */
var deltaX = options.left - options.offsetLeft;
valX = options.easeFunc(currentTime, options.offsetLeft, deltaX, options.duration);
}
if (typeof options.top !== 'undefined') {
/** @type {?} */
var deltaY = options.top - options.offsetTop;
valY = options.easeFunc(currentTime, options.offsetTop, deltaY, options.duration);
}
// scroll to position
options.scrollFunc(valX, valY);
// do the animation unless its over
if (currentTime < options.duration) {
animationFrameScheduler.schedule(animateScroll);
}
else {
resolve();
}
});
animateScroll();
}));
}
// easing functions http://goo.gl/5HLl8
/**
* @param {?} t
* @param {?} b
* @param {?} c
* @param {?} d
* @return {?}
*/
export function easeInOutQuad(t, b, c, d) {
t /= d / 2;
if (t < 1) {
return (c / 2) * t * t + b;
}
t--;
return (-c / 2) * (t * (t - 2) - 1) + b;
}
/**
* @param {?} t
* @param {?} b
* @param {?} c
* @param {?} d
* @return {?}
*/
export function easeInCubic(t, b, c, d) {
/** @type {?} */
var tc = (t /= d) * t * t;
return b + c * tc;
}
/**
* @param {?} t
* @param {?} b
* @param {?} c
* @param {?} d
* @return {?}
*/
export function inOutQuintic(t, b, c, d) {
/** @type {?} */
var ts = (t /= d) * t;
/** @type {?} */
var tc = ts * t;
return b + c * (6 * tc * ts + -15 * ts * ts + 10 * tc);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21vb3RoLXNjcm9sbC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1zY3JvbGxiYXIvIiwic291cmNlcyI6WyJzbW9vdGgtc2Nyb2xsL3Ntb290aC1zY3JvbGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0UsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0QsT0FBTyxFQUFjLElBQUksRUFBRSxFQUFFLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7QUFJckUseUNBUUM7OztJQVBDLGtDQUFhOztJQUNiLG1DQUFjOztJQUNkLHdDQUFrQjs7SUFDbEIseUNBQW1COztJQUNuQix1Q0FBaUI7O0lBQ2pCLHlDQUFnRDs7SUFDaEQsdUNBQStCOzs7OztBQUdqQyxxQ0FLQzs7O0lBSkMsOEJBQWE7O0lBQ2IsK0JBQWM7O0lBQ2QsbUNBQWtCOztJQUNsQixtQ0FBZ0M7O0FBR2xDO0lBT0Usc0JBQXlDLFNBQWlCLEVBQzlDLEVBQWM7UUFEZSxjQUFTLEdBQVQsU0FBUyxDQUFRO1FBRXhELElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLGFBQWEsQ0FBQztJQUMvQixDQUFDOzs7Ozs7O0lBRU8saUNBQVU7Ozs7OztJQUFsQixVQUFtQixJQUFZLEVBQUUsR0FBVztRQUMxQyxJQUFJLHNCQUFzQixFQUFFLEVBQUU7WUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBQyxHQUFHLEtBQUEsRUFBRSxJQUFJLE1BQUEsRUFBQyxDQUFDLENBQUM7U0FDakM7YUFBTTtZQUNMLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQztZQUMxQixJQUFJLENBQUMsSUFBSSxD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Ozs7Ozs7OztBQUVELE1BQU0sVUFBVSxXQUFXLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxDQUFTLEVBQUUsQ0FBUzs7UUFDOUQsRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO0lBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDcEIsQ0FBQzs7Ozs7Ozs7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsQ0FBUyxFQUFFLENBQVM7O1FBQy9ELEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDOztRQUNyQixFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDYixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUN6RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBJbmplY3QsIFBMQVRGT1JNX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBzdXBwb3J0c1Njcm9sbEJlaGF2aW9yIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BsYXRmb3JtJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGZyb20sIG9mLCBhbmltYXRpb25GcmFtZVNjaGVkdWxlciB9IGZyb20gJ3J4anMnO1xuXG5leHBvcnQgdHlwZSBTbW9vdGhTY3JvbGxFYXNlRnVuYyA9ICh0OiBudW1iZXIsIHM6IG51bWJlciwgYzogbnVtYmVyLCBkOiBudW1iZXIpID0+IG51bWJlcjtcblxuZXhwb3J0IGludGVyZmFjZSBTbW9vdGhTY3JvbGxPcHRpb25zIHtcbiAgdG9wPzogbnVtYmVyO1xuICBsZWZ0PzogbnVtYmVyO1xuICBvZmZzZXRUb3A6IG51bWJlcjtcbiAgb2Zmc2V0TGVmdDogbnVtYmVyO1xuICBkdXJhdGlvbjogbnVtYmVyO1xuICBzY3JvbGxGdW5jOiAodG9wOiBudW1iZXIsIGxlZnQ6IG51bWJlcikgPT4gdm9pZDtcbiAgZWFzZUZ1bmM6IFNtb290aFNjcm9sbEVhc2VGdW5jO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNjcm9sbFRvT3B0aW9ucyB7XG4gIHRvcD86IG51bWJlcjtcbiAgbGVmdD86IG51bWJlcjtcbiAgZHVyYXRpb24/OiBudW1iZXI7XG4gIGVhc2VGdW5jPzogU21vb3RoU2Nyb2xsRWFzZUZ1bmM7XG59XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tzbW9vdGhTY3JvbGxdLCBbc21vb3RoLXNjcm9sbF0nXG59KVxuZXhwb3J0IGNsYXNzIFNtb290aFNjcm9sbCB7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB2aWV3OiBIVE1MRWxlbWVudDtcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIF9wbGF0Zm9ybTogT2JqZWN0LFxuICAgICAgICAgICAgICBlbDogRWxlbWVudFJlZikge1xuICAgIHRoaXMudmlldyA9IGVsLm5hdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIHNjcm9sbEZ1bmMobGVmdDogbnVtYmVyLCB0b3A6IG51bWJlcikge1xuICAgIGlmIChzdXBwb3J0c1Njcm9sbEJlaGF2aW9yKCkpIHtcbiAgICAgIHRoaXMudmlldy5zY3JvbGxUbyh7dG9wLCBsZWZ0fSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmlldy5zY3JvbGxUb3AgPSB0b3A7XG4gICAgICB0aGlzLnZpZXcuc2Nyb2xsTGVmdCA9IGxlZnQ7XG4gICAgfVxuICB9XG5cbiAgc2Nyb2xsVG8ob3B0aW9uczogU2Nyb2xsVG9PcHRpb25zKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgLy8gQXZvaWQgU1NSIGVycm9yXG4gICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMuX3BsYXRmb3JtKSkge1xuICAgICAgY29uc3Qgc2Nyb2xsRnVuYyA9IChsZWZ0OiBudW1iZXIsIHRvcDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGlmIChzdXBwb3J0c1Njcm9sbEJlaGF2aW9yKCkpIHtcbiAgICAgICAgICB0aGlzLnZpZXcuc2Nyb2xsVG8oe3RvcCwgbGVmdH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudmlldy5zY3JvbGxUb3AgPSB0b3A7XG4gICAgICAgICAgdGhpcy52aWV3LnNjcm9sbExlZnQgPSBsZWZ0O1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgaWYgKG9wdGlvbnMuZHVyYXRpb24pIHtcbiAgICAgICAgY29uc3Qgc21vb3RoU2Nyb2xsT3B0aW9uczogU21vb3RoU2Nyb2xsT3B0aW9ucyA9IHtcbiAgICAgICAgICB0b3A6IG9wdGlvbnMudG9wLFxuICAgICAgICAgIGxlZnQ6IG9wdGlvbnMubGVmdCxcbiAgICAgICAgICBkdXJhdGlvbjogb3B0aW9ucy5kdXJhdGlvbixcbiAgICAgICAgICBlYXNlRnVuYzogb3B0aW9ucy5lYXNlRnVuYyB8fCBlYXNlSW5PdXRRdWFkLFxuICAgICAgICAgIG9mZnNldFRvcDogdGhpcy52aWV3LnNjcm9sbFRvcCxcbiAgICAgICAgICBvZmZzZXRMZWZ0OiB0aGlzLnZpZXcuc2Nyb2xsTGVmdCxcbiAgICAgICAgICBzY3JvbGxGdW5jXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBmcm9tKHNtb290aFNjcm9sbChzbW9vdGhTY3JvbGxPcHRpb25zKSk7XG4gICAgICB9XG4gICAgICB0aGlzLnNjcm9sbEZ1bmMob3B0aW9ucy5sZWZ0LCBvcHRpb25zLnRvcCk7XG4gICAgfVxuICAgIHJldHVybiBvZjx2b2lkPigpO1xuICB9XG5cbiAgc2Nyb2xsVG9FbGVtZW50KHNlbGVjdG9yOiBzdHJpbmcsIG9mZnNldCA9IDAsIGR1cmF0aW9uPzogbnVtYmVyLCBlYXNlRnVuYz86IFNtb290aFNjcm9sbEVhc2VGdW5jKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgY29uc3QgdGFyZ2V0OiBIVE1MRWxlbWVudCA9IHRoaXMudmlldy5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICByZXR1cm4gdGFyZ2V0ID8gdGhpcy5zY3JvbGxUbyh7bGVmdDogdGFyZ2V0Lm9mZnNldExlZnQsIHRvcDogdGFyZ2V0Lm9mZnNldFRvcCAtIG9mZnNldCwgZHVyYXRpb24sIGVhc2VGdW5jfSkgOiBvZjx2b2lkPigpO1xuICB9XG5cbiAgc2Nyb2xsWFRvKGxlZnQ6IG51bWJlciwgZHVyYXRpb24/OiBudW1iZXIsIGVhc2VGdW5jPzogU21vb3RoU2Nyb2xsRWFzZUZ1bmMpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5zY3JvbGxUbyh7bGVmdCwgZHVyYXRpb24sIGVhc2VGdW5jfSk7XG4gIH1cblxuICBzY3JvbGxZVG8odG9wOiBudW1iZXIsIGR1cmF0aW9uPzogbnVtYmVyLCBlYXNlRnVuYz86IFNtb290aFNjcm9sbEVhc2VGdW5jKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuc2Nyb2xsVG8oe3RvcCwgZHVyYXRpb24sIGVhc2VGdW5jfSk7XG4gIH1cblxuICBzY3JvbGxUb1RvcChkdXJhdGlvbj86IG51bWJlciwgZWFzZUZ1bmM/OiBTbW9vdGhTY3JvbGxFYXNlRnVuYyk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnNjcm9sbFlUbygwLCBkdXJhdGlvbiwgZWFzZUZ1bmMpO1xuICB9XG5cbiAgc2Nyb2xsVG9Cb3R0b20oZHVyYXRpb24/OiBudW1iZXIsIGVhc2VGdW5jPzogU21vb3RoU2Nyb2xsRWFzZUZ1bmMpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5zY3JvbGxZVG8odGhpcy52aWV3LnNjcm9sbEhlaWdodCAtIHRoaXMudmlldy5jbGllbnRIZWlnaHQsIGR1cmF0aW9uLCBlYXNlRnVuYyk7XG4gIH1cblxuICBzY3JvbGxUb1JpZ2h0KGR1cmF0aW9uPzogbnVtYmVyLCBlYXNlRnVuYz86IFNtb290aFNjcm9sbEVhc2VGdW5jKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuc2Nyb2xsWFRvKHRoaXMudmlldy5zY3JvbGxXaWR0aCwgZHVyYXRpb24sIGVhc2VGdW5jKTtcbiAgfVxuXG4gIHNjcm9sbFRvTGVmdChkdXJhdGlvbj86IG51bWJlciwgZWFzZUZ1bmM/OiBTbW9vdGhTY3JvbGxFYXNlRnVuYyk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnNjcm9sbFhUbygwLCBkdXJhdGlvbiwgZWFzZUZ1bmMpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzbW9vdGhTY3JvbGwob3B0aW9uczogU21vb3RoU2Nyb2xsT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgbGV0IGN1cnJlbnRUaW1lID0gMDtcbiAgICBjb25zdCBpbmNyZW1lbnQgPSAxMDtcbiAgICBsZXQgdmFsWCA9IG9wdGlvbnMub2Zmc2V0TGVmdDtcbiAgICBsZXQgdmFsWSA9IG9wdGlvbnMub2Zmc2V0VG9wO1xuXG4gICAgY29uc3QgYW5pbWF0ZVNjcm9sbCA9ICgpID0+IHtcbiAgICAgIC8vIGluY3JlbWVudCB0aGUgdGltZVxuICAgICAgY3VycmVudFRpbWUgKz0gaW5jcmVtZW50O1xuICAgICAgLy8gZmluZCB0aGUgdmFsdWUgd2l0aCB0aGUgZWFzaW5nIGZ1bmN0aW9uXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnMubGVmdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc3QgZGVsdGFYID0gb3B0aW9ucy5sZWZ0IC0gb3B0aW9ucy5vZmZzZXRMZWZ0O1xuICAgICAgICB2YWxYID0gb3B0aW9ucy5lYXNlRnVuYyhjdXJyZW50VGltZSwgb3B0aW9ucy5vZmZzZXRMZWZ0LCBkZWx0YVgsIG9wdGlvbnMuZHVyYXRpb24pO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnRvcCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc3QgZGVsdGFZID0gb3B0aW9ucy50b3AgLSBvcHRpb25zLm9mZnNldFRvcDtcbiAgICAgICAgdmFsWSA9IG9wdGlvbnMuZWFzZUZ1bmMoY3VycmVudFRpbWUsIG9wdGlvbnMub2Zmc2V0VG9wLCBkZWx0YVksIG9wdGlvbnMuZHVyYXRpb24pO1xuICAgICAgfVxuICAgICAgLy8gc2Nyb2xsIHRvIHBvc2l0aW9uXG4gICAgICBvcHRpb25zLnNjcm9sbEZ1bmModmFsWCwgdmFsWSk7XG4gICAgICAvLyBkbyB0aGUgYW5pbWF0aW9uIHVubGVzcyBpdHMgb3ZlclxuICAgICAgaWYgKGN1cnJlbnRUaW1lIDwgb3B0aW9ucy5kdXJhdGlvbikge1xuICAgICAgICBhbmltYXRpb25GcmFtZVNjaGVkdWxlci5zY2hlZHVsZShhbmltYXRlU2Nyb2xsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGFuaW1hdGVTY3JvbGwoKTtcbiAgfSk7XG59XG5cbi8vIGVhc2luZyBmdW5jdGlvbnMgaHR0cDovL2dvby5nbC81SExsOFxuZXhwb3J0IGZ1bmN0aW9uIGVhc2VJbk91dFF1YWQodDogbnVtYmVyLCBiOiBudW1iZXIsIGM6IG51bWJlciwgZDogbnVtYmVyKSB7XG4gIHQgLz0gZCAvIDI7XG4gIGlmICh0IDwgMSkge1xuICAgIHJldHVybiAoYyAvIDIpICogdCAqIHQgKyBiO1xuICB9XG4gIHQtLTtcbiAgcmV0dXJuICgtYyAvIDIpICogKHQgKiAodCAtIDIpIC0gMSkgKyBiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZWFzZUluQ3ViaWModDogbnVtYmVyLCBiOiBudW1iZXIsIGM6IG51bWJlciwgZDogbnVtYmVyKSB7XG4gIGNvbnN0IHRjID0gKHQgLz0gZCkgKiB0ICogdDtcbiAgcmV0dXJuIGIgKyBjICogdGM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbk91dFF1aW50aWModDogbnVtYmVyLCBiOiBudW1iZXIsIGM6IG51bWJlciwgZDogbnVtYmVyKSB7XG4gIGNvbnN0IHRzID0gKHQgLz0gZCkgKiB0LFxuICAgIHRjID0gdHMgKiB0O1xuICByZXR1cm4gYiArIGMgKiAoNiAqIHRjICogdHMgKyAtMTUgKiB0cyAqIHRzICsgMTAgKiB0Yyk7XG59XG4iXX0=