ngx-autosize
Version:
Directive that automatically adjusts textarea height to fit content
188 lines • 26.9 kB
JavaScript
import { HostListener, Directive, Input, Output, EventEmitter } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "./window-ref.service";
const MAX_LOOKUP_RETRIES = 3;
export class AutosizeDirective {
constructor(element, _window, _zone) {
this.element = element;
this._window = _window;
this._zone = _zone;
this.onlyGrow = false;
this.useImportant = false;
this.resized = new EventEmitter();
this.autosize = true;
this.retries = 0;
this._destroyed = false;
if (this.element.nativeElement.tagName !== 'TEXTAREA') {
this._findNestedTextArea();
}
else {
this.textAreaEl = this.element.nativeElement;
this.textAreaEl.style['overflow-y'] = 'hidden';
this._onTextAreaFound();
}
}
set minRows(value) {
this._minRows = +value;
if (this.textAreaEl) {
this.textAreaEl.rows = this._minRows;
}
}
;
set _autosize(autosize) {
this.autosize = typeof autosize === 'boolean'
? autosize
: true;
}
;
onInput(textArea) {
this.adjust();
}
ngOnDestroy() {
this._destroyed = true;
if (this._windowResizeHandler) {
this._window.nativeWindow.removeEventListener('resize', this._windowResizeHandler, false);
}
}
ngAfterContentChecked() {
this.adjust();
}
ngOnChanges(changes) {
this.adjust(true);
}
_findNestedTextArea() {
this.textAreaEl = this.element.nativeElement.querySelector('TEXTAREA');
if (!this.textAreaEl && this.element.nativeElement.shadowRoot) {
this.textAreaEl = this.element.nativeElement.shadowRoot.querySelector('TEXTAREA');
}
if (!this.textAreaEl) {
if (this.retries >= MAX_LOOKUP_RETRIES) {
console.warn('ngx-autosize: textarea not found');
}
else {
this.retries++;
setTimeout(() => {
this._findNestedTextArea();
}, 100);
}
return;
}
this.textAreaEl.style['overflow-y'] = 'hidden';
this._onTextAreaFound();
}
_onTextAreaFound() {
this._addWindowResizeHandler();
setTimeout(() => {
this.adjust();
});
}
_addWindowResizeHandler() {
this._windowResizeHandler = debounce(() => {
this._zone.run(() => {
this.adjust();
});
}, 200);
this._zone.runOutsideAngular(() => {
this._window.nativeWindow.addEventListener('resize', this._windowResizeHandler, false);
});
}
adjust(inputsChanged = false) {
if (this.autosize && !this._destroyed && this.textAreaEl && this.textAreaEl.parentNode) {
const currentText = this.textAreaEl.value;
if (inputsChanged === false &&
currentText === this._oldContent &&
this.textAreaEl.offsetWidth === this._oldWidth) {
return;
}
this._oldContent = currentText;
this._oldWidth = this.textAreaEl.offsetWidth;
const clone = this.textAreaEl.cloneNode(true);
const parent = this.textAreaEl.parentNode;
clone.style.width = this.textAreaEl.offsetWidth + 'px';
clone.style.visibility = 'hidden';
clone.style.position = 'absolute';
clone.textContent = currentText;
parent.appendChild(clone);
clone.style['overflow-y'] = 'hidden';
clone.style.height = 'auto';
let height = clone.scrollHeight;
// add into height top and bottom borders' width
let computedStyle = this._window.nativeWindow.getComputedStyle(clone, null);
height += parseInt(computedStyle.getPropertyValue('border-top-width'));
height += parseInt(computedStyle.getPropertyValue('border-bottom-width'));
if (computedStyle.getPropertyValue('box-sizing') === 'content-box') {
height -= parseInt(computedStyle.getPropertyValue('padding-top'));
height -= parseInt(computedStyle.getPropertyValue('padding-bottom'));
}
const oldHeight = this.textAreaEl.offsetHeight;
const willGrow = height > oldHeight;
if (this.onlyGrow === false || willGrow) {
const lineHeight = this._getLineHeight();
const rowsCount = height / lineHeight;
if (this._minRows && this._minRows >= rowsCount) {
height = this._minRows * lineHeight;
}
else if (this.maxRows && this.maxRows <= rowsCount) {
// never shrink the textarea if onlyGrow is true
const maxHeight = this.maxRows * lineHeight;
height = this.onlyGrow ? Math.max(maxHeight, oldHeight) : maxHeight;
this.textAreaEl.style['overflow-y'] = 'auto';
}
else {
this.textAreaEl.style['overflow-y'] = 'hidden';
}
const heightStyle = height + 'px';
const important = this.useImportant ? 'important' : '';
this.textAreaEl.style.setProperty('height', heightStyle, important);
this.resized.emit(height);
}
parent.removeChild(clone);
}
}
_getLineHeight() {
let lineHeight = parseInt(this.textAreaEl.style.lineHeight, 10);
if (isNaN(lineHeight) && this._window.nativeWindow.getComputedStyle) {
const styles = this._window.nativeWindow.getComputedStyle(this.textAreaEl);
lineHeight = parseInt(styles.lineHeight, 10);
}
if (isNaN(lineHeight)) {
const fontSize = this._window.nativeWindow.getComputedStyle(this.textAreaEl, null).getPropertyValue('font-size');
lineHeight = Math.floor(parseInt(fontSize.replace('px', ''), 10) * 1.5);
}
return lineHeight;
}
}
AutosizeDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: AutosizeDirective, deps: [{ token: i0.ElementRef }, { token: i1.WindowRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive });
AutosizeDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.1", type: AutosizeDirective, selector: "[autosize]", inputs: { minRows: "minRows", _autosize: ["autosize", "_autosize"], maxRows: "maxRows", onlyGrow: "onlyGrow", useImportant: "useImportant" }, outputs: { resized: "resized" }, host: { listeners: { "input": "onInput($event.target)" } }, usesOnChanges: true, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: AutosizeDirective, decorators: [{
type: Directive,
args: [{
selector: '[autosize]'
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.WindowRef }, { type: i0.NgZone }]; }, propDecorators: { minRows: [{
type: Input
}], _autosize: [{
type: Input,
args: ['autosize']
}], maxRows: [{
type: Input
}], onlyGrow: [{
type: Input
}], useImportant: [{
type: Input
}], resized: [{
type: Output
}], onInput: [{
type: HostListener,
args: ['input', ['$event.target']]
}] } });
function debounce(func, timeout) {
let timer;
return (...args) => {
clearTimeout(timer);
timer = setTimeout(() => {
func(...args);
}, timeout);
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b3NpemUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWF1dG9zaXplL3NyYy9saWIvYXV0b3NpemUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxZQUFZLEVBQ1osU0FBUyxFQUNULEtBQUssRUFDOEMsTUFBTSxFQUFFLFlBQVksRUFDeEUsTUFBTSxlQUFlLENBQUM7OztBQUd2QixNQUFNLGtCQUFrQixHQUFHLENBQUMsQ0FBQztBQU03QixNQUFNLE9BQU8saUJBQWlCO0lBcUMxQixZQUNXLE9BQW1CLEVBQ2xCLE9BQWtCLEVBQ2xCLEtBQWE7UUFGZCxZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQ2xCLFlBQU8sR0FBUCxPQUFPLENBQVc7UUFDbEIsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQXZCaEIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUVwQixZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUV2QyxhQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLFlBQU8sR0FBRyxDQUFDLENBQUM7UUFPWixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBWXZCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsT0FBTyxLQUFLLFVBQVUsRUFBRTtZQUNuRCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztTQUU5QjthQUFNO1lBQ0gsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztZQUM3QyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsR0FBRyxRQUFRLENBQUM7WUFDL0MsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7U0FDM0I7SUFDTCxDQUFDO0lBakRELElBQ0ksT0FBTyxDQUFDLEtBQWE7UUFDckIsSUFBSSxDQUFDLFFB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bnQiOlsiaW1wb3J0IHtcbiAgRWxlbWVudFJlZixcbiAgSG9zdExpc3RlbmVyLFxuICBEaXJlY3RpdmUsXG4gIElucHV0LFxuICBOZ1pvbmUsIE9uRGVzdHJveSwgT25DaGFuZ2VzLCBBZnRlckNvbnRlbnRDaGVja2VkLCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgU2ltcGxlQ2hhbmdlc1xufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7V2luZG93UmVmfSBmcm9tICcuL3dpbmRvdy1yZWYuc2VydmljZSc7XG5cbmNvbnN0IE1BWF9MT09LVVBfUkVUUklFUyA9IDM7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW2F1dG9zaXplXSdcbn0pXG5cbmV4cG9ydCBjbGFzcyBBdXRvc2l6ZURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uRGVzdHJveSwgT25DaGFuZ2VzLCBBZnRlckNvbnRlbnRDaGVja2VkIHtcbiAgICBASW5wdXQoKVxuICAgIHNldCBtaW5Sb3dzKHZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fbWluUm93cyA9ICt2YWx1ZTtcbiAgICAgICAgaWYgKHRoaXMudGV4dEFyZWFFbCkge1xuICAgICAgICAgICAgdGhpcy50ZXh0QXJlYUVsLnJvd3MgPSB0aGlzLl9taW5Sb3dzO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBASW5wdXQoJ2F1dG9zaXplJylcbiAgICBzZXQgX2F1dG9zaXplKGF1dG9zaXplOiBib29sZWFuIHwgc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuYXV0b3NpemUgPSB0eXBlb2YgYXV0b3NpemUgPT09ICdib29sZWFuJ1xuICAgICAgICAgICAgPyBhdXRvc2l6ZVxuICAgICAgICAgICAgOiB0cnVlO1xuICAgIH07XG4gICAgcHJpdmF0ZSBfbWluUm93cyE6IG51bWJlcjtcblxuICAgIEBJbnB1dCgpIG1heFJvd3MhOiBudW1iZXI7XG4gICAgQElucHV0KCkgb25seUdyb3cgPSBmYWxzZTtcbiAgICBASW5wdXQoKSB1c2VJbXBvcnRhbnQgPSBmYWxzZTtcblxuICAgIEBPdXRwdXQoKSByZXNpemVkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgICBwcml2YXRlIGF1dG9zaXplID0gdHJ1ZTtcbiAgICBwcml2YXRlIHJldHJpZXMgPSAwO1xuICAgIHByaXZhdGUgdGV4dEFyZWFFbDogYW55O1xuXG4gICAgcHJpdmF0ZSBfb2xkQ29udGVudCE6IHN0cmluZztcbiAgICBwcml2YXRlIF9vbGRXaWR0aCE6IG51bWJlcjtcblxuICAgIHByaXZhdGUgX3dpbmRvd1Jlc2l6ZUhhbmRsZXIhOiAoLi4uYXJnczogQXJyYXk8YW55PikgPT4gYW55O1xuICAgIHByaXZhdGUgX2Rlc3Ryb3llZCA9IGZhbHNlO1xuXG4gICAgQEhvc3RMaXN0ZW5lcignaW5wdXQnLCBbJyRldmVudC50YXJnZXQnXSlcbiAgICBvbklucHV0KHRleHRBcmVhOiBIVE1MVGV4dEFyZWFFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuYWRqdXN0KCk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBlbGVtZW50OiBFbGVtZW50UmVmLFxuICAgICAgICBwcml2YXRlIF93aW5kb3c6IFdpbmRvd1JlZixcbiAgICAgICAgcHJpdmF0ZSBfem9uZTogTmdab25lXG4gICAgKSB7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC50YWdOYW1lICE9PSAnVEVYVEFSRUEnKSB7XG4gICAgICAgICAgICB0aGlzLl9maW5kTmVzdGVkVGV4dEFyZWEoKTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50ZXh0QXJlYUVsID0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLnRleHRBcmVhRWwuc3R5bGVbJ292ZXJmbG93LXknXSA9ICdoaWRkZW4nO1xuICAgICAgICAgICAgdGhpcy5fb25UZXh0QXJlYUZvdW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuX3dpbmRvd1Jlc2l6ZUhhbmRsZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3dpbmRvdy5uYXRpdmVXaW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5fd2luZG93UmVzaXplSGFuZGxlciwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdBZnRlckNvbnRlbnRDaGVja2VkKCkge1xuICAgICAgICB0aGlzLmFkanVzdCgpO1xuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgdGhpcy5hZGp1c3QodHJ1ZSk7XG4gICAgfVxuXG4gICAgX2ZpbmROZXN0ZWRUZXh0QXJlYSgpIHtcbiAgICAgICAgdGhpcy50ZXh0QXJlYUVsID0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignVEVYVEFSRUEnKTtcblxuICAgICAgICBpZiAoIXRoaXMudGV4dEFyZWFFbCAmJiB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5zaGFkb3dSb290KSB7XG4gICAgICAgICAgICB0aGlzLnRleHRBcmVhRWwgPSB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ1RFWFRBUkVBJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMudGV4dEFyZWFFbCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucmV0cmllcyA+PSBNQVhfTE9PS1VQX1JFVFJJRVMpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ25neC1hdXRvc2l6ZTogdGV4dGFyZWEgbm90IGZvdW5kJyk7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXRyaWVzKys7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpbmROZXN0ZWRUZXh0QXJlYSgpO1xuICAgICAgICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRleHRBcmVhRWwuc3R5bGVbJ292ZXJmbG93LXknXSA9ICdoaWRkZW4nO1xuICAgICAgICB0aGlzLl9vblRleHRBcmVhRm91bmQoKTtcblxuICAgIH1cblxuICAgIF9vblRleHRBcmVhRm91bmQoKSB7XG4gICAgICAgIHRoaXMuX2FkZFdpbmRvd1Jlc2l6ZUhhbmRsZXIoKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFkanVzdCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfYWRkV2luZG93UmVzaXplSGFuZGxlcigpIHtcbiAgICAgICAgdGhpcy5fd2luZG93UmVzaXplSGFuZGxlciA9IGRlYm91bmNlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkanVzdCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIDIwMCk7XG5cbiAgICAgICAgdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl93aW5kb3cubmF0aXZlV2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX3dpbmRvd1Jlc2l6ZUhhbmRsZXIsIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYWRqdXN0KGlucHV0c0NoYW5nZWQgPSBmYWxzZSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5hdXRvc2l6ZSAmJiAhdGhpcy5fZGVzdHJveWVkICYmIHRoaXMudGV4dEFyZWFFbCAmJiB0aGlzLnRleHRBcmVhRWwucGFyZW50Tm9kZSkge1xuXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50VGV4dCA9IHRoaXMudGV4dEFyZWFFbC52YWx1ZTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGlucHV0c0NoYW5nZWQgPT09IGZhbHNlICYmXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQgPT09IHRoaXMuX29sZENvbnRlbnQgJiZcbiAgICAgICAgICAgICAgICB0aGlzLnRleHRBcmVhRWwub2Zmc2V0V2lkdGggPT09IHRoaXMuX29sZFdpZHRoXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX29sZENvbnRlbnQgPSBjdXJyZW50VGV4dDtcbiAgICAgICAgICAgIHRoaXMuX29sZFdpZHRoID0gdGhpcy50ZXh0QXJlYUVsLm9mZnNldFdpZHRoO1xuXG4gICAgICAgICAgICBjb25zdCBjbG9uZSA9IHRoaXMudGV4dEFyZWFFbC5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnRleHRBcmVhRWwucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIGNsb25lLnN0eWxlLndpZHRoID0gdGhpcy50ZXh0QXJlYUVsLm9mZnNldFdpZHRoICsgJ3B4JztcbiAgICAgICAgICAgIGNsb25lLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgICAgIGNsb25lLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgICAgIGNsb25lLnRleHRDb250ZW50ID0gY3VycmVudFRleHQ7XG5cbiAgICAgICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChjbG9uZSk7XG5cbiAgICAgICAgICAgIGNsb25lLnN0eWxlWydvdmVyZmxvdy15J10gPSAnaGlkZGVuJztcbiAgICAgICAgICAgIGNsb25lLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcblxuICAgICAgICAgICAgbGV0IGhlaWdodCA9IGNsb25lLnNjcm9sbEhlaWdodDtcblxuICAgICAgICAgICAgLy8gYWRkIGludG8gaGVpZ2h0IHRvcCBhbmQgYm90dG9tIGJvcmRlcnMnIHdpZHRoXG4gICAgICAgICAgICBsZXQgY29tcHV0ZWRTdHlsZSA9IHRoaXMuX3dpbmRvdy5uYXRpdmVXaW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjbG9uZSwgbnVsbCk7XG4gICAgICAgICAgICBoZWlnaHQgKz0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdib3JkZXItdG9wLXdpZHRoJykpO1xuICAgICAgICAgICAgaGVpZ2h0ICs9IHBhcnNlSW50KGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnYm9yZGVyLWJvdHRvbS13aWR0aCcpKTtcblxuICAgICAgICAgICAgaWYgKGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnYm94LXNpemluZycpID09PSAnY29udGVudC1ib3gnKSB7XG4gICAgICAgICAgICAgICAgaGVpZ2h0IC09IHBhcnNlSW50KGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgncGFkZGluZy10b3AnKSk7XG4gICAgICAgICAgICAgICAgaGVpZ2h0IC09IHBhcnNlSW50KGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgncGFkZGluZy1ib3R0b20nKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG9sZEhlaWdodCA9IHRoaXMudGV4dEFyZWFFbC5vZmZzZXRIZWlnaHQ7XG4gICAgICAgICAgICBjb25zdCB3aWxsR3JvdyA9IGhlaWdodCA+IG9sZEhlaWdodDtcblxuICAgICAgICAgICAgaWYgKHRoaXMub25seUdyb3cgPT09IGZhbHNlIHx8IHdpbGxHcm93KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGluZUhlaWdodCA9IHRoaXMuX2dldExpbmVIZWlnaHQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByb3dzQ291bnQgPSBoZWlnaHQgLyBsaW5lSGVpZ2h0O1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX21pblJvd3MgJiYgdGhpcy5fbWluUm93cyA+PSByb3dzQ291bnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5fbWluUm93cyAqIGxpbmVIZWlnaHQ7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubWF4Um93cyAmJiB0aGlzLm1heFJvd3MgPD0gcm93c0NvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5ldmVyIHNocmluayB0aGUgdGV4dGFyZWEgaWYgb25seUdyb3cgaXMgdHJ1ZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXhIZWlnaHQgPSB0aGlzLm1heFJvd3MgKiBsaW5lSGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSB0aGlzLm9ubHlHcm93ID8gTWF0aC5tYXgobWF4SGVpZ2h0LCBvbGRIZWlnaHQpOiBtYXhIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dEFyZWFFbC5zdHlsZVsnb3ZlcmZsb3cteSddID0gJ2F1dG8nO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0QXJlYUVsLnN0eWxlWydvdmVyZmxvdy15J10gPSAnaGlkZGVuJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBoZWlnaHRTdHlsZSA9IGhlaWdodCArICdweCc7XG4gICAgICAgICAgICAgICAgY29uc3QgaW1wb3J0YW50ID0gdGhpcy51c2VJbXBvcnRhbnQgPyAnaW1wb3J0YW50JyA6ICcnO1xuXG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0QXJlYUVsLnN0eWxlLnNldFByb3BlcnR5KCdoZWlnaHQnLCBoZWlnaHRTdHlsZSwgaW1wb3J0YW50KTtcblxuICAgICAgICAgICAgICAgIHRoaXMucmVzaXplZC5lbWl0KGhlaWdodCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChjbG9uZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRMaW5lSGVpZ2h0KCkge1xuICAgICAgICBsZXQgbGluZUhlaWdodCA9IHBhcnNlSW50KHRoaXMudGV4dEFyZWFFbC5zdHlsZS5saW5lSGVpZ2h0LCAxMCk7XG4gICAgICAgIGlmIChpc05hTihsaW5lSGVpZ2h0KSAmJiB0aGlzLl93aW5kb3cubmF0aXZlV2luZG93LmdldENvbXB1dGVkU3R5bGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IHRoaXMuX3dpbmRvdy5uYXRpdmVXaW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLnRleHRBcmVhRWwpO1xuICAgICAgICAgICAgbGluZUhlaWdodCA9IHBhcnNlSW50KHN0eWxlcy5saW5lSGVpZ2h0LCAxMCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNOYU4obGluZUhlaWdodCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvbnRTaXplID0gdGhpcy5fd2luZG93Lm5hdGl2ZVdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMudGV4dEFyZWFFbCwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZSgnZm9udC1zaXplJyk7XG4gICAgICAgICAgICBsaW5lSGVpZ2h0ID0gTWF0aC5mbG9vcihwYXJzZUludChmb250U2l6ZS5yZXBsYWNlKCdweCcsICcnKSwgMTApICogMS41KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsaW5lSGVpZ2h0O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZGVib3VuY2U8UGFyYW1zIGV4dGVuZHMgQXJyYXk8YW55Pj4oZnVuYzogKC4uLmFyZ3M6IFBhcmFtcykgPT4gYW55LCB0aW1lb3V0OiBudW1iZXIpOiAoLi4uYXJnczogUGFyYW1zKSA9PiB2b2lkIHtcbiAgbGV0IHRpbWVyOiBudW1iZXI7XG4gIHJldHVybiAoLi4uYXJnczogUGFyYW1zKSA9PiB7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVyKVxuICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBmdW5jKC4uLmFyZ3MpXG4gICAgfSwgdGltZW91dClcbiAgfVxufVxuXG4vLyBmdW5jdGlvbiBEZWJvdW5jZShmdW5jOiBhbnksIHdhaXQ6IG51bWJlciwgaW1tZWRpYXRlID0gZmFsc2UpIHtcbi8vICAgICBsZXQgdGltZW91dDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuLy8gICAgIHJldHVybiAoKSA9PiB7XG4vLyAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzO1xuLy8gICAgICAgICBjb25zdCBhcmdzID0gYXJndW1lbnRzO1xuLy8gICAgICAgICBjb25zdCBsYXRlciA9IGZ1bmN0aW9uICgpIHtcbi8vICAgICAgICAgICAgIHRpbWVvdXQgPSB1bmRlZmluZWQ7XG4vLyAgICAgICAgICAgICBpZiAoIWltbWVkaWF0ZSkge1xuLy8gICAgICAgICAgICAgICAgIGZ1bmMuYXBwbHkodGhpcywgYXJncyk7XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH07XG4vLyAgICAgICAgIGNvbnN0IGNhbGxOb3cgPSBpbW1lZGlhdGUgJiYgIXRpbWVvdXQ7XG4vLyAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbi8vICAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHdhaXQpO1xuLy8gICAgICAgICBpZiAoY2FsbE5vdykge1xuLy8gICAgICAgICAgICAgZnVuYy5hcHBseSh0aGlzLCBhcmdzKTtcbi8vICAgICAgICAgfVxuLy8gICAgIH07XG4vLyB9XG4iXX0=