@doku-dev/doku-fragment
Version:
A new Angular UI library that moving away from Bootstrap and built from scratch.
189 lines • 26 kB
JavaScript
import { Directive, HostBinding, Inject, Input, Optional, } from '@angular/core';
import { ReplaySubject, filter, fromEvent, startWith, takeUntil } from 'rxjs';
import { DokuTable } from './table.directive';
import * as i0 from "@angular/core";
import * as i1 from "./table.directive";
export var DokuStickyColumnPosition;
(function (DokuStickyColumnPosition) {
DokuStickyColumnPosition["Left"] = "left";
DokuStickyColumnPosition["Right"] = "right";
})(DokuStickyColumnPosition || (DokuStickyColumnPosition = {}));
export class DokuTableStickyColumn {
constructor(elementRef, renderer, ngZone, dokuTable) {
this.elementRef = elementRef;
this.renderer = renderer;
this.ngZone = ngZone;
this.dokuTable = dokuTable;
this.destroy$ = new ReplaySubject();
}
get element() {
return this.elementRef.nativeElement;
}
get isStickyLeft() {
return this.position === DokuStickyColumnPosition.Left;
}
get isStickyRight() {
return this.position === DokuStickyColumnPosition.Right;
}
ngOnChanges(changes) {
if (changes['position']?.previousValue !== changes['position']?.currentValue) {
this.ngZone.runOutsideAngular(() => {
this.observer?.disconnect();
setTimeout(() => {
if (this.isStickyRight)
this.handleDynamicStyleRight();
if (this.isStickyLeft)
this.handleDynamicStyleLeft();
}, 0);
});
}
}
ngAfterViewInit() {
// Giving delay to detect table container being initialized.
setTimeout(() => {
this.watchTableContainerScrollEvent();
}, 0);
}
ngOnDestroy() {
this.observer?.disconnect();
this.destroy$.next(true);
this.destroy$.complete();
}
handleDynamicStyleRight() {
// Get next sticky column
const nextStickyColumn = this.element.nextElementSibling;
if (!nextStickyColumn)
return;
if (!nextStickyColumn.classList.contains('d-table-sticky-column-right'))
return;
this.observer = new ResizeObserver(() => {
// If has next sticky column, get the width of the column.
const nextStickyColumnWidth = this.getSiblingElementClientWidth(nextStickyColumn, 'next');
// Set the start `right` point of the current sticky column
// from the next sticky column width.
const rightValue = nextStickyColumnWidth + 'px';
this.renderer.setStyle(this.element, 'right', rightValue);
});
if (this.element.parentElement) {
this.observer.observe(this.element.parentElement);
}
}
handleDynamicStyleLeft() {
// Get previous sticky column
const prevStickyColumn = this.element.previousElementSibling;
if (!prevStickyColumn)
return;
// if (prevStickyColumn.classList.contains('d-table-sticky-column-left')) return;
this.observer = new ResizeObserver(() => {
// If has previous sticky column, get the width of the column.
const prevStickyColumnWidth = this.getSiblingElementClientWidth(prevStickyColumn, 'previous');
// Set the start `left` point of the current sticky column
// from the prev sticky column width.
const leftValue = prevStickyColumnWidth + 'px';
this.renderer.setStyle(this.element, 'left', leftValue);
});
if (this.element.parentElement) {
this.observer.observe(this.element.parentElement);
}
}
getSiblingElementClientWidth(nextElement, siblingPosition) {
const sibling = siblingPosition === 'previous'
? nextElement.previousElementSibling
: nextElement.nextElementSibling;
if (sibling) {
const siblingClientWidth = this.getSiblingElementClientWidth(sibling, siblingPosition);
return nextElement.getBoundingClientRect().width + siblingClientWidth;
}
return nextElement.getBoundingClientRect().width;
}
watchTableContainerScrollEvent() {
this.ngZone.runOutsideAngular(() => {
const tableElement = this.dokuTable?.['elementRef'].nativeElement;
const tableContainerElement = this.dokuTable?.['containerElement'];
if (!tableContainerElement || !tableElement)
return;
fromEvent(tableContainerElement, 'scroll')
.pipe(startWith(new Event('scroll')), filter(() => !!this.position), takeUntil(this.destroy$))
.subscribe(() => {
this.handleStickyLeftShadow(tableElement, tableContainerElement);
this.handleStickyRightShadow(tableElement, tableContainerElement);
});
});
}
handleStickyLeftShadow(_, tableContainerElement) {
if (!this.isLastStickyColumn())
return;
if (this.position !== DokuStickyColumnPosition.Left)
return;
tableContainerElement.scrollLeft > 0
? this.toggleShadowClass('add')
: this.toggleShadowClass('remove');
}
handleStickyRightShadow(tableElement, tableContainerElement) {
if (!this.isLastStickyColumn())
return;
if (this.position !== DokuStickyColumnPosition.Right)
return;
// Don't need to provide the shadow because the table element has no more columns to scroll.
if (tableElement.clientWidth < tableContainerElement.clientWidth)
return;
const offsetWidth = tableElement.clientWidth - tableContainerElement.clientWidth;
const offsetScroll = offsetWidth - tableContainerElement.scrollLeft;
// Giving check offset to 0.5 because the client width value is rounded to nearest integer.
offsetScroll > 0.5 ? this.toggleShadowClass('add') : this.toggleShadowClass('remove');
}
/**
* Check whether this column is the last sticky column.
*
* For the `left` position, will check if no sticky column after.
* For the `right` position, will check if no sticky column before.
*/
isLastStickyColumn() {
if (this.isStickyLeft) {
const nextElement = this.element.nextElementSibling;
if (nextElement?.classList.contains('d-table-sticky-column-left'))
return false;
return true;
}
if (this.isStickyRight) {
const prevElement = this.element.previousElementSibling;
if (prevElement?.classList.contains('d-table-sticky-column-right'))
return false;
return true;
}
return false;
}
toggleShadowClass(type) {
if (type === 'add') {
this.renderer.addClass(this.element, 'd-table-sticky-column-shadow');
}
if (type === 'remove') {
this.renderer.removeClass(this.element, 'd-table-sticky-column-shadow');
}
}
}
DokuTableStickyColumn.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuTableStickyColumn, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.NgZone }, { token: DokuTable, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
DokuTableStickyColumn.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.9", type: DokuTableStickyColumn, isStandalone: true, selector: "th[doku-sticky-column], td[doku-sticky-column]", inputs: { position: ["doku-sticky-column", "position"] }, host: { properties: { "class.d-table-sticky-column-left": "this.isStickyLeft", "class.d-table-sticky-column-right": "this.isStickyRight" } }, exportAs: ["dokuStickyColumn"], usesOnChanges: true, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuTableStickyColumn, decorators: [{
type: Directive,
args: [{
selector: 'th[doku-sticky-column], td[doku-sticky-column]',
exportAs: 'dokuStickyColumn',
standalone: true,
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.NgZone }, { type: i1.DokuTable, decorators: [{
type: Optional
}, {
type: Inject,
args: [DokuTable]
}] }]; }, propDecorators: { position: [{
type: Input,
args: ['doku-sticky-column']
}], isStickyLeft: [{
type: HostBinding,
args: ['class.d-table-sticky-column-left']
}], isStickyRight: [{
type: HostBinding,
args: ['class.d-table-sticky-column-right']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtc3RpY2t5LWNvbHVtbi5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kb2t1LWZyYWdtZW50L3NyYy9saWIvdGFibGUvdGFibGUtc3RpY2t5LWNvbHVtbi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxXQUFXLEVBQ1gsTUFBTSxFQUNOLEtBQUssRUFJTCxRQUFRLEdBR1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7QUFFOUMsTUFBTSxDQUFOLElBQVksd0JBR1g7QUFIRCxXQUFZLHdCQUF3QjtJQUNsQyx5Q0FBYSxDQUFBO0lBQ2IsMkNBQWUsQ0FBQTtBQUNqQixDQUFDLEVBSFcsd0JBQXdCLEtBQXhCLHdCQUF3QixRQUduQztBQU9ELE1BQU0sT0FBTyxxQkFBcUI7SUFNaEMsWUFDVSxVQUFzQixFQUN0QixRQUFtQixFQUNuQixNQUFjLEVBQ2lCLFNBQXFCO1FBSHBELGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2lCLGNBQVMsR0FBVCxTQUFTLENBQVk7UUFOdEQsYUFBUSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7SUFPcEMsQ0FBQztJQUVKLElBQWMsT0FBTztRQUNuQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxJQUNjLFlBQVk7UUFDeEIsT0FBTyxJQUFJLENBQUMsUUFBUSxLQUFLLHdCQUF3QixDQUFDLElBQUksQ0FBQztJQUN6RCxDQUFDO0lBRUQsSUFD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MEJBV0ksUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxTQUFTOzRDQVRGLFFBQVE7c0JBQXBDLEtBQUs7dUJBQUMsb0JBQW9CO2dCQWlCYixZQUFZO3NCQUR6QixXQUFXO3VCQUFDLGtDQUFrQztnQkFNakMsYUFBYTtzQkFEMUIsV0FBVzt1QkFBQyxtQ0FBbUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPcHRpb25hbCxcbiAgUmVuZGVyZXIyLFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJlcGxheVN1YmplY3QsIGZpbHRlciwgZnJvbUV2ZW50LCBzdGFydFdpdGgsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRG9rdVRhYmxlIH0gZnJvbSAnLi90YWJsZS5kaXJlY3RpdmUnO1xuXG5leHBvcnQgZW51bSBEb2t1U3RpY2t5Q29sdW1uUG9zaXRpb24ge1xuICBMZWZ0ID0gJ2xlZnQnLFxuICBSaWdodCA9ICdyaWdodCcsXG59XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ3RoW2Rva3Utc3RpY2t5LWNvbHVtbl0sIHRkW2Rva3Utc3RpY2t5LWNvbHVtbl0nLFxuICBleHBvcnRBczogJ2Rva3VTdGlja3lDb2x1bW4nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBEb2t1VGFibGVTdGlja3lDb2x1bW4gaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBJbnB1dCgnZG9rdS1zdGlja3ktY29sdW1uJykgcG9zaXRpb24/OiBEb2t1U3RpY2t5Q29sdW1uUG9zaXRpb247XG5cbiAgcHJpdmF0ZSBvYnNlcnZlcj86IFJlc2l6ZU9ic2VydmVyO1xuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFJlcGxheVN1YmplY3QoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChEb2t1VGFibGUpIHByaXZhdGUgZG9rdVRhYmxlPzogRG9rdVRhYmxlXG4gICkge31cblxuICBwcm90ZWN0ZWQgZ2V0IGVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZC10YWJsZS1zdGlja3ktY29sdW1uLWxlZnQnKVxuICBwcm90ZWN0ZWQgZ2V0IGlzU3RpY2t5TGVmdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wb3NpdGlvbiA9PT0gRG9rdVN0aWNreUNvbHVtblBvc2l0aW9uLkxlZnQ7XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmQtdGFibGUtc3RpY2t5LWNvbHVtbi1yaWdodCcpXG4gIHByb3RlY3RlZCBnZXQgaXNTdGlja3lSaWdodCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wb3NpdGlvbiA9PT0gRG9rdVN0aWNreUNvbHVtblBvc2l0aW9uLlJpZ2h0O1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydwb3NpdGlvbiddPy5wcmV2aW91c1ZhbHVlICE9PSBjaGFuZ2VzWydwb3NpdGlvbiddPy5jdXJyZW50VmFsdWUpIHtcbiAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgdGhpcy5vYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmlzU3RpY2t5UmlnaHQpIHRoaXMuaGFuZGxlRHluYW1pY1N0eWxlUmlnaHQoKTtcbiAgICAgICAgICBpZiAodGhpcy5pc1N0aWNreUxlZnQpIHRoaXMuaGFuZGxlRHluYW1pY1N0eWxlTGVmdCgpO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAvLyBHaXZpbmcgZGVsYXkgdG8gZGV0ZWN0IHRhYmxlIGNvbnRhaW5lciBiZWluZyBpbml0aWFsaXplZC5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMud2F0Y2hUYWJsZUNvbnRhaW5lclNjcm9sbEV2ZW50KCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLm9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRHluYW1pY1N0eWxlUmlnaHQoKSB7XG4gICAgLy8gR2V0IG5leHQgc3RpY2t5IGNvbHVtblxuICAgIGNvbnN0IG5leHRTdGlja3lDb2x1bW4gPSB0aGlzLmVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgIGlmICghbmV4dFN0aWNreUNvbHVtbikgcmV0dXJuO1xuICAgIGlmICghbmV4dFN0aWNreUNvbHVtbi5jbGFzc0xpc3QuY29udGFpbnMoJ2QtdGFibGUtc3RpY2t5LWNvbHVtbi1yaWdodCcpKSByZXR1cm47XG5cbiAgICB0aGlzLm9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcbiAgICAgIC8vIElmIGhhcyBuZXh0IHN0aWNreSBjb2x1bW4sIGdldCB0aGUgd2lkdGggb2YgdGhlIGNvbHVtbi5cbiAgICAgIGNvbnN0IG5leHRTdGlja3lDb2x1bW5XaWR0aCA9IHRoaXMuZ2V0U2libGluZ0VsZW1lbnRDbGllbnRXaWR0aChuZXh0U3RpY2t5Q29sdW1uLCAnbmV4dCcpO1xuXG4gICAgICAvLyBTZXQgdGhlIHN0YXJ0IGByaWdodGAgcG9pbnQgb2YgdGhlIGN1cnJlbnQgc3RpY2t5IGNvbHVtblxuICAgICAgLy8gZnJvbSB0aGUgbmV4dCBzdGlja3kgY29sdW1uIHdpZHRoLlxuICAgICAgY29uc3QgcmlnaHRWYWx1ZSA9IG5leHRTdGlja3lDb2x1bW5XaWR0aCArICdweCc7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWxlbWVudCwgJ3JpZ2h0JywgcmlnaHRWYWx1ZSk7XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5lbGVtZW50LnBhcmVudEVsZW1lbnQpIHtcbiAgICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmVsZW1lbnQucGFyZW50RWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVEeW5hbWljU3R5bGVMZWZ0KCkge1xuICAgIC8vIEdldCBwcmV2aW91cyBzdGlja3kgY29sdW1uXG4gICAgY29uc3QgcHJldlN0aWNreUNvbHVtbiA9IHRoaXMuZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgIGlmICghcHJldlN0aWNreUNvbHVtbikgcmV0dXJuO1xuICAgIC8vIGlmIChwcmV2U3RpY2t5Q29sdW1uLmNsYXNzTGlzdC5jb250YWlucygnZC10YWJsZS1zdGlja3ktY29sdW1uLWxlZnQnKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5vYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICAvLyBJZiBoYXMgcHJldmlvdXMgc3RpY2t5IGNvbHVtbiwgZ2V0IHRoZSB3aWR0aCBvZiB0aGUgY29sdW1uLlxuICAgICAgY29uc3QgcHJldlN0aWNreUNvbHVtbldpZHRoID0gdGhpcy5nZXRTaWJsaW5nRWxlbWVudENsaWVudFdpZHRoKHByZXZTdGlja3lDb2x1bW4sICdwcmV2aW91cycpO1xuXG4gICAgICAvLyBTZXQgdGhlIHN0YXJ0IGBsZWZ0YCBwb2ludCBvZiB0aGUgY3VycmVudCBzdGlja3kgY29sdW1uXG4gICAgICAvLyBmcm9tIHRoZSBwcmV2IHN0aWNreSBjb2x1bW4gd2lkdGguXG4gICAgICBjb25zdCBsZWZ0VmFsdWUgPSBwcmV2U3RpY2t5Q29sdW1uV2lkdGggKyAncHgnO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsZW1lbnQsICdsZWZ0JywgbGVmdFZhbHVlKTtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmVsZW1lbnQucGFyZW50RWxlbWVudCkge1xuICAgICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKHRoaXMuZWxlbWVudC5wYXJlbnRFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFNpYmxpbmdFbGVtZW50Q2xpZW50V2lkdGgoXG4gICAgbmV4dEVsZW1lbnQ6IEVsZW1lbnQsXG4gICAgc2libGluZ1Bvc2l0aW9uOiAncHJldmlvdXMnIHwgJ25leHQnXG4gICk6IG51bWJlciB7XG4gICAgY29uc3Qgc2libGluZyA9XG4gICAgICBzaWJsaW5nUG9zaXRpb24gPT09ICdwcmV2aW91cydcbiAgICAgICAgPyAobmV4dEVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZyBhcyBFbGVtZW50KVxuICAgICAgICA6IChuZXh0RWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcgYXMgRWxlbWVudCk7XG5cbiAgICBpZiAoc2libGluZykge1xuICAgICAgY29uc3Qgc2libGluZ0NsaWVudFdpZHRoID0gdGhpcy5nZXRTaWJsaW5nRWxlbWVudENsaWVudFdpZHRoKHNpYmxpbmcsIHNpYmxpbmdQb3NpdGlvbik7XG4gICAgICByZXR1cm4gbmV4dEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggKyBzaWJsaW5nQ2xpZW50V2lkdGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICB9XG5cbiAgcHJpdmF0ZSB3YXRjaFRhYmxlQ29udGFpbmVyU2Nyb2xsRXZlbnQoKSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgY29uc3QgdGFibGVFbGVtZW50OiBIVE1MVGFibGVFbGVtZW50ID0gdGhpcy5kb2t1VGFibGU/LlsnZWxlbWVudFJlZiddLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBjb25zdCB0YWJsZUNvbnRhaW5lckVsZW1lbnQgPSB0aGlzLmRva3VUYWJsZT8uWydjb250YWluZXJFbGVtZW50J107XG5cbiAgICAgIGlmICghdGFibGVDb250YWluZXJFbGVtZW50IHx8ICF0YWJsZUVsZW1lbnQpIHJldHVybjtcblxuICAgICAgZnJvbUV2ZW50KHRhYmxlQ29udGFpbmVyRWxlbWVudCwgJ3Njcm9sbCcpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHN0YXJ0V2l0aChuZXcgRXZlbnQoJ3Njcm9sbCcpKSxcbiAgICAgICAgICBmaWx0ZXIoKCkgPT4gISF0aGlzLnBvc2l0aW9uKSxcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmhhbmRsZVN0aWNreUxlZnRTaGFkb3codGFibGVFbGVtZW50LCB0YWJsZUNvbnRhaW5lckVsZW1lbnQpO1xuICAgICAgICAgIHRoaXMuaGFuZGxlU3RpY2t5UmlnaHRTaGFkb3codGFibGVFbGVtZW50LCB0YWJsZUNvbnRhaW5lckVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlU3RpY2t5TGVmdFNoYWRvdyhfOiBIVE1MVGFibGVFbGVtZW50LCB0YWJsZUNvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKCF0aGlzLmlzTGFzdFN0aWNreUNvbHVtbigpKSByZXR1cm47XG4gICAgaWYgKHRoaXMucG9zaXRpb24gIT09IERva3VTdGlja3lDb2x1bW5Qb3NpdGlvbi5MZWZ0KSByZXR1cm47XG5cbiAgICB0YWJsZUNvbnRhaW5lckVsZW1lbnQuc2Nyb2xsTGVmdCA+IDBcbiAgICAgID8gdGhpcy50b2dnbGVTaGFkb3dDbGFzcygnYWRkJylcbiAgICAgIDogdGhpcy50b2dnbGVTaGFkb3dDbGFzcygncmVtb3ZlJyk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVN0aWNreVJpZ2h0U2hhZG93KFxuICAgIHRhYmxlRWxlbWVudDogSFRNTFRhYmxlRWxlbWVudCxcbiAgICB0YWJsZUNvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50XG4gICkge1xuICAgIGlmICghdGhpcy5pc0xhc3RTdGlja3lDb2x1bW4oKSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnBvc2l0aW9uICE9PSBEb2t1U3RpY2t5Q29sdW1uUG9zaXRpb24uUmlnaHQpIHJldHVybjtcblxuICAgIC8vIERvbid0IG5lZWQgdG8gcHJvdmlkZSB0aGUgc2hhZG93IGJlY2F1c2UgdGhlIHRhYmxlIGVsZW1lbnQgaGFzIG5vIG1vcmUgY29sdW1ucyB0byBzY3JvbGwuXG4gICAgaWYgKHRhYmxlRWxlbWVudC5jbGllbnRXaWR0aCA8IHRhYmxlQ29udGFpbmVyRWxlbWVudC5jbGllbnRXaWR0aCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2Zmc2V0V2lkdGggPSB0YWJsZUVsZW1lbnQuY2xpZW50V2lkdGggLSB0YWJsZUNvbnRhaW5lckVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgY29uc3Qgb2Zmc2V0U2Nyb2xsID0gb2Zmc2V0V2lkdGggLSB0YWJsZUNvbnRhaW5lckVsZW1lbnQuc2Nyb2xsTGVmdDtcblxuICAgIC8vIEdpdmluZyBjaGVjayBvZmZzZXQgdG8gMC41IGJlY2F1c2UgdGhlIGNsaWVudCB3aWR0aCB2YWx1ZSBpcyByb3VuZGVkIHRvIG5lYXJlc3QgaW50ZWdlci5cbiAgICBvZmZzZXRTY3JvbGwgPiAwLjUgPyB0aGlzLnRvZ2dsZVNoYWRvd0NsYXNzKCdhZGQnKSA6IHRoaXMudG9nZ2xlU2hhZG93Q2xhc3MoJ3JlbW92ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHdoZXRoZXIgdGhpcyBjb2x1bW4gaXMgdGhlIGxhc3Qgc3RpY2t5IGNvbHVtbi5cbiAgICpcbiAgICogRm9yIHRoZSBgbGVmdGAgcG9zaXRpb24sIHdpbGwgY2hlY2sgaWYgbm8gc3RpY2t5IGNvbHVtbiBhZnRlci5cbiAgICogRm9yIHRoZSBgcmlnaHRgIHBvc2l0aW9uLCB3aWxsIGNoZWNrIGlmIG5vIHN0aWNreSBjb2x1bW4gYmVmb3JlLlxuICAgKi9cbiAgcHJpdmF0ZSBpc0xhc3RTdGlja3lDb2x1bW4oKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNTdGlja3lMZWZ0KSB7XG4gICAgICBjb25zdCBuZXh0RWxlbWVudCA9IHRoaXMuZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICBpZiAobmV4dEVsZW1lbnQ/LmNsYXNzTGlzdC5jb250YWlucygnZC10YWJsZS1zdGlja3ktY29sdW1uLWxlZnQnKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNTdGlja3lSaWdodCkge1xuICAgICAgY29uc3QgcHJldkVsZW1lbnQgPSB0aGlzLmVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICAgIGlmIChwcmV2RWxlbWVudD8uY2xhc3NMaXN0LmNvbnRhaW5zKCdkLXRhYmxlLXN0aWNreS1jb2x1bW4tcmlnaHQnKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSB0b2dnbGVTaGFkb3dDbGFzcyh0eXBlOiAnYWRkJyB8ICdyZW1vdmUnKTogdm9pZCB7XG4gICAgaWYgKHR5cGUgPT09ICdhZGQnKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWxlbWVudCwgJ2QtdGFibGUtc3RpY2t5LWNvbHVtbi1zaGFkb3cnKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gJ3JlbW92ZScpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbGVtZW50LCAnZC10YWJsZS1zdGlja3ktY29sdW1uLXNoYWRvdycpO1xuICAgIH1cbiAgfVxufVxuIl19