UNPKG

angular-fixed-header-table

Version:

angular-Fixed-Header-table is A simple solution for fixed header in any table.

221 lines (220 loc) 30.2 kB
import { Directive, Input } from '@angular/core'; import * as i0 from "@angular/core"; /* - in constactor, to detect change with RouteReuseStrategy - then add in subscribe pageUpdated private router: Router router.events.subscribe((evt) => { if (!(evt instanceof NavigationEnd)) { return; } this.pageUpdated = !this.pageUpdated; }); */ export class BassFixedHeaderDirective { constructor(el, renderer) { this.el = el; this.renderer = renderer; this.stopFixed = false; this.theadPaddingTopBottom = '0.45rem'; this.theadPaddingLeftRight = '1rem'; this.onBodyscroll = (e) => { this.scroll(); }; } ngOnInit() { if (!this.stopFixed) { setTimeout(() => { this.inIt(); }, 1000); } } ngOnChanges(changes) { if (this.z2table && !this.stopFixed) { setTimeout(() => { this.changes(changes); }, 1000); } } ngOnDestroy() { if (!this.stopFixed) { this.removeTheadToFixedItems(); window.removeEventListener('scroll', this.onBodyscroll, true); } } inIt() { this.z2tableinit(); // get event on body/window scroll window.addEventListener('scroll', this.onBodyscroll, true); // called 2 times because the wired behavie of table wjen style attr added to Element this.checkPaddingAndTHSize(); this.checkPaddingAndTHSize(); this.scroll(); } changes(changes) { if (changes.pageDestored) { this.removeTheadToFixedItems(); this.scroll(); } else { this.checkPaddingAndTHSize(); this.scroll(); } } checkPaddingAndTHSize() { const scrollFound = this.containerHasHorizontalScrollbar(); if (!scrollFound) { // no scroll,,, small caoumns setTimeout(() => { this.changeThSizes(); }, 500); this.z2table.style.tableLayout = 'fixed'; } else { // tslint:disable-next-line:prefer-for-of for (let index = 0; index < this.z2tableTHeadTr.children.length; index++) { const oldTh = this.z2tableTHeadTr.children[index]; oldTh.removeAttribute('style'); } } } containerHasHorizontalScrollbar() { const hasHorizontalScrollbar = this.el.nativeElement.scrollWidth > this.el.nativeElement.clientWidth; if (hasHorizontalScrollbar === false) { return false; } else { return true; } } z2tableinit() { this.z2table = document.querySelector('#' + this.tableId); this.z2tableTHead = document.querySelector('#' + this.tableTHeadId); this.z2tableTHeadTr = document.querySelector('#' + this.tableTHeadTrId); this.z2tableTBody = document.querySelector('#' + this.tableTBodyId); if (!this.z2table) { console.log('loooook table id not found..........'); } else { this.z2table.style.tableLayout = 'fixed'; this.z2table.style.width = 'max-content'; } if (!this.z2tableTHead) { console.log('loooook table thead id not found..........'); } if (!this.z2tableTHeadTr) { console.log('loooook table thead tr not found..........'); } } scroll() { // tthis check because of tabs cache const table = document.querySelector('#' + this.tableId); if (this.z2table && table) { const bounding = this.z2table.getBoundingClientRect(); const tableOffsetTop = this.z2table.offsetTop; const windowOffset = window.pageYOffset; const tHeadHeight = this.z2tableTHead.clientHeight; const pos2 = document.documentElement.scrollTop; if (this.z2tableTHead) { // page at end // console.log('nnn', (window.innerHeight + window.scrollY) >= document.body.offsetHeight); if ((windowOffset + tHeadHeight) > (tableOffsetTop)) { if ((window.scrollY) > (tableOffsetTop)) { this.z2tableTHead.classList.add('z2TblScroll'); this.addTheadToFixedItems(); } } else { this.z2tableTHead.classList.remove('z2TblScroll'); this.removeTheadToFixedItems(); } } } } changeThSizes() { if (this.z2tableTBody && this.z2tableTBody.children && this.z2tableTBody.children.length >= 1) { // tslint:disable-next-line:prefer-for-of for (let index = 0; index < this.z2tableTHeadTr.children.length; index++) { const oldTd = this.z2tableTBody.children[0].children[index]; const oldTh = this.z2tableTHeadTr.children[index]; if (!oldTh.hasAttribute('hidden')) { let orPadding = 0; // beacause border-right const elStyles = window.getComputedStyle(oldTh); orPadding = orPadding + Number(elStyles.paddingLeft.replace('px', '')) + Number(elStyles.paddingRight.replace('px', '')) + Number(elStyles.marginLeft.replace('px', '')) + Number(elStyles.marginRight.replace('px', '')); if (oldTd && oldTd.clientWidth) { const newWeidth = oldTd.clientWidth - orPadding; if (newWeidth !== 0) { const styles = 'min-width: ' + newWeidth + 'px !important;'; oldTh.setAttribute('style', styles); } } } } } } addTheadToFixedItems() { const fixedItems = document.getElementById('fixedItems'); const fixedItemsStyle = 'height:0px;display: block;'; fixedItems?.setAttribute('style', fixedItemsStyle); const itemsEl = fixedItems?.querySelector('#' + this.tableId); if (!itemsEl) { const containerDiv = this.renderer.createElement('div'); containerDiv.id = this.tableId; containerDiv.classList.add('z2table-container'); const containerDivStyle = 'width: ' + this.el.nativeElement.clientWidth + 'px'; containerDiv.setAttribute('style', containerDivStyle); const tableDiv = this.renderer.createElement('div'); const tableDivStyle = 'width: inherit'; tableDiv.setAttribute('style', tableDivStyle); this.renderer.appendChild(tableDiv, this.z2tableTHead); this.renderer.appendChild(containerDiv, tableDiv); this.renderer.appendChild(fixedItems, containerDiv); this.z2tableTHead.scrollLeft = this.el.nativeElement.scrollLeft; } else { const containerDiv = itemsEl; containerDiv.style.display = 'block'; this.renderer.appendChild(containerDiv.lastChild, this.z2tableTHead); this.z2tableTHead.scrollLeft = this.el.nativeElement.scrollLeft; } } removeTheadToFixedItems() { const fixedItems = document.getElementById('fixedItems'); if (fixedItems && fixedItems.firstChild) { this.renderer.appendChild(this.z2table, this.z2tableTHead); // tslint:disable-next-line:prefer-for-of for (let index = 0; index < fixedItems.children.length; index++) { const element = fixedItems.children[index]; element.remove(); } fixedItems.setAttribute('style', 'display: none;overflow:hidden !important'); } } } BassFixedHeaderDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: BassFixedHeaderDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); BassFixedHeaderDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.0.3", type: BassFixedHeaderDirective, selector: "[bassFixedHeader]", inputs: { tableId: "tableId", tableTHeadId: "tableTHeadId", tableTBodyId: "tableTBodyId", tableTHeadTrId: "tableTHeadTrId", pageUpdated: "pageUpdated", pageDestored: "pageDestored", stopFixed: "stopFixed" }, usesOnChanges: true, ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: BassFixedHeaderDirective, decorators: [{ type: Directive, args: [{ selector: '[bassFixedHeader]' }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { tableId: [{ type: Input }], tableTHeadId: [{ type: Input }], tableTBodyId: [{ type: Input }], tableTHeadTrId: [{ type: Input }], pageUpdated: [{ type: Input }], pageDestored: [{ type: Input }], stopFixed: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzc0ZpeGVkSGVhZGVyLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItZml4ZWQtaGVhZGVyLXRhYmxlL3NyYy9saWIvQmFzc0ZpeGVkSGVhZGVyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFNVSxNQUFNLGVBQWUsQ0FBQzs7QUFLdkM7Ozs7Ozs7Ozs7O0VBV0U7QUFDRixNQUFNLE9BQU8sd0JBQXdCO0lBaUJuQyxZQUFvQixFQUFjLEVBQVUsUUFBbUI7UUFBM0MsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVc7UUFWdEQsY0FBUyxHQUFZLEtBQUssQ0FBQztRQU9wQywwQkFBcUIsR0FBRyxTQUFTLENBQUM7UUFDbEMsMEJBQXFCLEdBQUcsTUFBTSxDQUFDO1FBbUcvQixpQkFBWSxHQUFHLENBQUMsQ0FBTSxFQUFRLEVBQUU7WUFDOUIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2hCLENBQUMsQ0FBQTtJQW5Ha0UsQ0FBQztJQUVwRSxRQUFRO1FBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbkIsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDWixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDaEIsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ1Y7SUFDSCxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbkMsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3hCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNWO0lBQ0gsQ0FBQztJQUdELFdBQVc7UUFDVCxJQUFJ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O1lBRTNELHlDQUF5QztZQUN6QyxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQy9ELE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzNDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQzthQUNsQjtZQUVELFVBQVUsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLDBDQUEwQyxDQUFDLENBQUM7U0FDOUU7SUFDSCxDQUFDOztxSEFqT1Usd0JBQXdCO3lHQUF4Qix3QkFBd0I7MkZBQXhCLHdCQUF3QjtrQkFmcEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsbUJBQW1CO2lCQUM5Qjt5SEFjVSxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIERpcmVjdGl2ZSxcclxuICBJbnB1dCxcclxuICBFbGVtZW50UmVmLFxyXG4gIFJlbmRlcmVyMixcclxuICBPbkluaXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tiYXNzRml4ZWRIZWFkZXJdJ1xyXG59KVxyXG4vKlxyXG4tIGluIGNvbnN0YWN0b3IsIHRvIGRldGVjdCBjaGFuZ2Ugd2l0aCBSb3V0ZVJldXNlU3RyYXRlZ3lcclxuLSB0aGVuIGFkZCBpbiBzdWJzY3JpYmUgcGFnZVVwZGF0ZWRcclxuXHJcbnByaXZhdGUgcm91dGVyOiBSb3V0ZXJcclxucm91dGVyLmV2ZW50cy5zdWJzY3JpYmUoKGV2dCkgPT4ge1xyXG4gIGlmICghKGV2dCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICB9XHJcbiAgdGhpcy5wYWdlVXBkYXRlZCA9ICF0aGlzLnBhZ2VVcGRhdGVkO1xyXG59KTtcclxuKi9cclxuZXhwb3J0IGNsYXNzIEJhc3NGaXhlZEhlYWRlckRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xyXG4gIEBJbnB1dCgpIHRhYmxlSWQ6IHN0cmluZztcclxuICBASW5wdXQoKSB0YWJsZVRIZWFkSWQ6IHN0cmluZztcclxuICBASW5wdXQoKSB0YWJsZVRCb2R5SWQ6IHN0cmluZztcclxuICBASW5wdXQoKSB0YWJsZVRIZWFkVHJJZDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHBhZ2VVcGRhdGVkOiBib29sZWFuOyAvLyBmaXJlIHRvIHJlc2l6ZSBzY3JvbGwgdWVzIChwYWdlVXBkYXRlZCA9ICFwYWdlVXBkYXRlZClcclxuICBASW5wdXQoKSBwYWdlRGVzdG9yZWQ6IGJvb2xlYW47IC8vIGZpcmUgdG8gcmVtb3ZlIGhlYWRlciB3aGVuIHRhYiBjaGFuZ2UgPT4gKFwid2l0aCBjYWNoZVwiKVxyXG4gIEBJbnB1dCgpIHN0b3BGaXhlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICB6MnRhYmxlOiBIVE1MRWxlbWVudDtcclxuICB6MnRhYmxlVEhlYWRUcjogSFRNTEVsZW1lbnQ7XHJcbiAgejJ0YWJsZVRIZWFkOiBIVE1MRWxlbWVudDtcclxuICB6MnRhYmxlVEJvZHk6IEhUTUxFbGVtZW50O1xyXG5cclxuICB0aGVhZFBhZGRpbmdUb3BCb3R0b20gPSAnMC40NXJlbSc7XHJcbiAgdGhlYWRQYWRkaW5nTGVmdFJpZ2h0ID0gJzFyZW0nO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBFbGVtZW50UmVmLCBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGlmICghdGhpcy5zdG9wRml4ZWQpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmluSXQoKTtcclxuICAgICAgfSwgMTAwMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBpZiAodGhpcy56MnRhYmxlICYmICF0aGlzLnN0b3BGaXhlZCkge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmNoYW5nZXMoY2hhbmdlcyk7XHJcbiAgICAgIH0sIDEwMDApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgaWYgKCF0aGlzLnN0b3BGaXhlZCkge1xyXG4gICAgICB0aGlzLnJlbW92ZVRoZWFkVG9GaXhlZEl0ZW1zKCk7XHJcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLm9uQm9keXNjcm9sbCwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbkl0KCkge1xyXG5cclxuICAgIHRoaXMuejJ0YWJsZWluaXQoKTtcclxuXHJcbiAgICAvLyBnZXQgZXZlbnQgb24gYm9keS93aW5kb3cgc2Nyb2xsXHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5vbkJvZHlzY3JvbGwsIHRydWUpO1xyXG5cclxuICAgIC8vIGNhbGxlZCAyIHRpbWVzIGJlY2F1c2UgdGhlIHdpcmVkIGJlaGF2aWUgb2YgdGFibGUgd2plbiBzdHlsZSBhdHRyIGFkZGVkIHRvIEVsZW1lbnRcclxuICAgIHRoaXMuY2hlY2tQYWRkaW5nQW5kVEhTaXplKCk7XHJcbiAgICB0aGlzLmNoZWNrUGFkZGluZ0FuZFRIU2l6ZSgpO1xyXG4gICAgdGhpcy5zY3JvbGwoKTtcclxuICB9XHJcblxyXG4gIGNoYW5nZXMoY2hhbmdlczogYW55KSB7XHJcbiAgICBpZiAoY2hhbmdlcy5wYWdlRGVzdG9yZWQpIHtcclxuICAgICAgdGhpcy5yZW1vdmVUaGVhZFRvRml4ZWRJdGVtcygpO1xyXG4gICAgICB0aGlzLnNjcm9sbCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jaGVja1BhZGRpbmdBbmRUSFNpemUoKTtcclxuICAgICAgdGhpcy5zY3JvbGwoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNoZWNrUGFkZGluZ0FuZFRIU2l6ZSgpIHtcclxuICAgIGNvbnN0IHNjcm9sbEZvdW5kID0gdGhpcy5jb250YWluZXJIYXNIb3Jpem9udGFsU2Nyb2xsYmFyKCk7XHJcbiAgICBpZiAoIXNjcm9sbEZvdW5kKSB7XHJcbiAgICAgIC8vIG5vIHNjcm9sbCwsLCBzbWFsbCBjYW91bW5zXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2hhbmdlVGhTaXplcygpO1xyXG4gICAgICB9LCA1MDApO1xyXG4gICAgICB0aGlzLnoydGFibGUuc3R5bGUudGFibGVMYXlvdXQgPSAnZml4ZWQnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgIFxyXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpwcmVmZXItZm9yLW9mXHJcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuejJ0YWJsZVRIZWFkVHIuY2hpbGRyZW4ubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgICBjb25zdCBvbGRUaCA9IHRoaXMuejJ0YWJsZVRIZWFkVHIuY2hpbGRyZW5baW5kZXhdIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgb2xkVGgucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnRhaW5lckhhc0hvcml6b250YWxTY3JvbGxiYXIoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBoYXNIb3Jpem9udGFsU2Nyb2xsYmFyID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnNjcm9sbFdpZHRoID4gdGhpcy5lbC5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoO1xyXG4gICAgaWYgKGhhc0hvcml6b250YWxTY3JvbGxiYXIgPT09IGZhbHNlKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgejJ0YWJsZWluaXQoKSB7XHJcbiAgICB0aGlzLnoydGFibGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjJyArIHRoaXMudGFibGVJZCkgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICB0aGlzLnoydGFibGVUSGVhZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyMnICsgdGhpcy50YWJsZVRIZWFkSWQpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgdGhpcy56MnRhYmxlVEhlYWRUciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyMnICsgdGhpcy50YWJsZVRIZWFkVHJJZCkgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICB0aGlzLnoydGFibGVUQm9keSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyMnICsgdGhpcy50YWJsZVRCb2R5SWQpIGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgIGlmICghdGhpcy56MnRhYmxlKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdsb29vb29rIHRhYmxlIGlkIG5vdCBmb3VuZC4uLi4uLi4uLi4nKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuejJ0YWJsZS5zdHlsZS50YWJsZUxheW91dCA9ICdmaXhlZCc7XHJcbiAgICAgIHRoaXMuejJ0YWJsZS5zdHlsZS53aWR0aCA9ICdtYXgtY29udGVudCc7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGlmICghdGhpcy56MnRhYmxlVEhlYWQpIHtcclxuICAgICAgY29uc29sZS5sb2coJ2xvb29vb2sgdGFibGUgdGhlYWQgaWQgbm90IGZvdW5kLi4uLi4uLi4uLicpO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnoydGFibGVUSGVhZFRyKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdsb29vb29rIHRhYmxlIHRoZWFkIHRyIG5vdCBmb3VuZC4uLi4uLi4uLi4nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQm9keXNjcm9sbCA9IChlOiBhbnkpOiB2b2lkID0+IHtcclxuICAgIHRoaXMuc2Nyb2xsKCk7XHJcbiAgfVxyXG5cclxuICBzY3JvbGwoKSB7XHJcbiAgICAvLyB0dGhpcyBjaGVjayBiZWNhdXNlIG9mIHRhYnMgY2FjaGVcclxuICAgIGNvbnN0IHRhYmxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignIycgKyB0aGlzLnRhYmxlSWQpO1xyXG4gICAgaWYgKHRoaXMuejJ0YWJsZSAmJiB0YWJsZSkge1xyXG5cclxuICAgICAgY29uc3QgYm91bmRpbmcgPSB0aGlzLnoydGFibGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgIGNvbnN0IHRhYmxlT2Zmc2V0VG9wID0gdGhpcy56MnRhYmxlLm9mZnNldFRvcDtcclxuICAgICAgY29uc3Qgd2luZG93T2Zmc2V0ID0gd2luZG93LnBhZ2VZT2Zmc2V0O1xyXG4gICAgICBjb25zdCB0SGVhZEhlaWdodCA9IHRoaXMuejJ0YWJsZVRIZWFkLmNsaWVudEhlaWdodDtcclxuICAgICAgY29uc3QgcG9zMiA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A7XHJcblxyXG4gICAgICBpZiAodGhpcy56MnRhYmxlVEhlYWQpIHtcclxuXHJcbiAgICAgICAgLy8gcGFnZSBhdCBlbmRcclxuICAgICAgICAvLyBjb25zb2xlLmxvZygnbm5uJywgKHdpbmRvdy5pbm5lckhlaWdodCArIHdpbmRvdy5zY3JvbGxZKSA+PSBkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCk7XHJcblxyXG4gICAgICAgIGlmICgod2luZG93T2Zmc2V0ICsgdEhlYWRIZWlnaHQpID4gKCB0YWJsZU9mZnNldFRvcCApKSB7XHJcbiAgICAgICAgICBpZiAoKHdpbmRvdy5zY3JvbGxZKSA+ICggdGFibGVPZmZzZXRUb3AgKSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuejJ0YWJsZVRIZWFkLmNsYXNzTGlzdC5hZGQoJ3oyVGJsU2Nyb2xsJyk7XHJcbiAgICAgICAgICAgICAgdGhpcy5hZGRUaGVhZFRvRml4ZWRJdGVtcygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnoydGFibGVUSGVhZC5jbGFzc0xpc3QucmVtb3ZlKCd6MlRibFNjcm9sbCcpO1xyXG4gICAgICAgICAgdGhpcy5yZW1vdmVUaGVhZFRvRml4ZWRJdGVtcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2hhbmdlVGhTaXplcygpIHtcclxuICAgICAgaWYgKHRoaXMuejJ0YWJsZVRCb2R5ICYmIHRoaXMuejJ0YWJsZVRCb2R5LmNoaWxkcmVuICYmIHRoaXMuejJ0YWJsZVRCb2R5LmNoaWxkcmVuLmxlbmd0aCA+PSAxKSB7XHJcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnByZWZlci1mb3Itb2ZcclxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy56MnRhYmxlVEhlYWRUci5jaGlsZHJlbi5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICAgIGNvbnN0IG9sZFRkID0gdGhpcy56MnRhYmxlVEJvZHkuY2hpbGRyZW5bMF0uY2hpbGRyZW5baW5kZXhdIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgY29uc3Qgb2xkVGggPSB0aGlzLnoydGFibGVUSGVhZFRyLmNoaWxkcmVuW2luZGV4XSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgIGlmICghb2xkVGguaGFzQXR0cmlidXRlKCdoaWRkZW4nKSkge1xyXG5cclxuICAgICAgICAgICAgbGV0IG9yUGFkZGluZyA9IDA7IC8vIGJlYWNhdXNlIGJvcmRlci1yaWdodFxyXG4gICAgICAgICAgICBjb25zdCBlbFN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG9sZFRoKTtcclxuICAgICAgICAgICAgb3JQYWRkaW5nID0gb3JQYWRkaW5nXHJcbiAgICAgICAgICAgICsgTnVtYmVyKGVsU3R5bGVzLnBhZGRpbmdMZWZ0LnJlcGxhY2UoJ3B4JywgJycpKVxyXG4gICAgICAgICAgICArIE51bWJlcihlbFN0eWxlcy5wYWRkaW5nUmlnaHQucmVwbGFjZSgncHgnLCAnJykpXHJcbiAgICAgICAgICAgICsgTnVtYmVyKGVsU3R5bGVzLm1hcmdpbkxlZnQucmVwbGFjZSgncHgnLCAnJykpXHJcbiAgICAgICAgICAgICsgTnVtYmVyKGVsU3R5bGVzLm1hcmdpblJpZ2h0LnJlcGxhY2UoJ3B4JywgJycpKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChvbGRUZCAmJiBvbGRUZC5jbGllbnRXaWR0aCkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IG5ld1dlaWR0aCA9IG9sZFRkLmNsaWVudFdpZHRoICAtIG9yUGFkZGluZztcclxuICAgICAgICAgICAgICBpZiAobmV3V2VpZHRoICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdHlsZXMgPSAnbWluLXdpZHRoOiAnICsgbmV3V2VpZHRoICsgJ3B4ICFpbXBvcnRhbnQ7JztcclxuICAgICAgICAgICAgICAgIG9sZFRoLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBzdHlsZXMpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRUaGVhZFRvRml4ZWRJdGVtcygpIHtcclxuICAgIGNvbnN0IGZpeGVkSXRlbXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZml4ZWRJdGVtcycpO1xyXG4gICAgY29uc3QgZml4ZWRJdGVtc1N0eWxlID0gJ2hlaWdodDowcHg7ZGlzcGxheTogYmxvY2s7JztcclxuICAgIGZpeGVkSXRlbXM/LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBmaXhlZEl0ZW1zU3R5bGUpO1xyXG5cclxuICAgIGNvbnN0IGl0ZW1zRWwgPSBmaXhlZEl0ZW1zPy5xdWVyeVNlbGVjdG9yKCcjJyArIHRoaXMudGFibGVJZCk7XHJcbiAgICBpZiAoIWl0ZW1zRWwpIHtcclxuXHJcbiAgICAgIGNvbnN0IGNvbnRhaW5lckRpdiA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2JykgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgIGNvbnRhaW5lckRpdi5pZCA9ICB0aGlzLnRhYmxlSWQ7XHJcbiAgICAgIGNvbnRhaW5lckRpdi5jbGFzc0xpc3QuYWRkKCd6MnRhYmxlLWNvbnRhaW5lcicpO1xyXG4gICAgICBjb25zdCBjb250YWluZXJEaXZTdHlsZSA9ICAnd2lkdGg6ICcgKyB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGggKyAncHgnO1xyXG4gICAgICBjb250YWluZXJEaXYuc2V0QXR0cmlidXRlKCdzdHlsZScsIGNvbnRhaW5lckRpdlN0eWxlKTtcclxuXHJcbiAgICAgIGNvbnN0IHRhYmxlRGl2ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKSBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgIGNvbnN0IHRhYmxlRGl2U3R5bGUgPSAgJ3dpZHRoOiBpbmhlcml0JztcclxuICAgICAgdGFibGVEaXYuc2V0QXR0cmlidXRlKCdzdHlsZScsIHRhYmxlRGl2U3R5bGUpO1xyXG5cclxuICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0YWJsZURpdiwgdGhpcy56MnRhYmxlVEhlYWQpO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGNvbnRhaW5lckRpdiwgdGFibGVEaXYpO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGZpeGVkSXRlbXMsIGNvbnRhaW5lckRpdik7XHJcblxyXG4gICAgICB0aGlzLnoydGFibGVUSGVhZC5zY3JvbGxMZWZ0ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQ7XHJcblxyXG4gICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGNvbnRhaW5lckRpdiA9IGl0ZW1zRWw7XHJcbiAgICAgIChjb250YWluZXJEaXYgYXMgSFRNTEVsZW1lbnQpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGNvbnRhaW5lckRpdi5sYXN0Q2hpbGQsIHRoaXMuejJ0YWJsZVRIZWFkKTtcclxuXHJcbiAgICAgIHRoaXMuejJ0YWJsZVRIZWFkLnNjcm9sbExlZnQgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdDtcclxuICAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlVGhlYWRUb0ZpeGVkSXRlbXMoKSB7XHJcbiAgICBjb25zdCBmaXhlZEl0ZW1zID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpeGVkSXRlbXMnKTtcclxuICAgIGlmIChmaXhlZEl0ZW1zICYmIGZpeGVkSXRlbXMuZmlyc3RDaGlsZCkge1xyXG5cclxuICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLnoydGFibGUsIHRoaXMuejJ0YWJsZVRIZWFkKTtcclxuXHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpwcmVmZXItZm9yLW9mXHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBmaXhlZEl0ZW1zLmNoaWxkcmVuLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBmaXhlZEl0ZW1zLmNoaWxkcmVuW2luZGV4XTtcclxuICAgICAgICBlbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmaXhlZEl0ZW1zLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnZGlzcGxheTogbm9uZTtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudCcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuXHJcbiJdfQ==