@doku-dev/doku-fragment
Version:
A new Angular UI library that moving away from Bootstrap and built from scratch.
249 lines • 35.7 kB
JavaScript
import { Directive, EventEmitter, HostBinding, Input, Output, } from '@angular/core';
import { ReplaySubject, distinctUntilChanged, fromEvent, shareReplay, takeUntil } from 'rxjs';
import { TemplateUtil } from './template.util';
import * as i0 from "@angular/core";
export class DokuTable {
constructor(elementRef, renderer, ngZone, envInjector, appRef, injector) {
this.elementRef = elementRef;
this.renderer = renderer;
this.ngZone = ngZone;
this.envInjector = envInjector;
this.appRef = appRef;
this.injector = injector;
/**
* Listen for column sort changes.
*/
this.sortChange = new EventEmitter();
this._sortChange = new EventEmitter();
this.sortChange$ = this._sortChange.asObservable().pipe(shareReplay());
this.destroy$ = new ReplaySubject();
}
get classes() {
return ['d-table'];
}
get totalColumn() {
return this.elementRef.nativeElement.querySelectorAll('thead tr th').length;
}
ngOnInit() {
this._sortChange
.asObservable()
.pipe(distinctUntilChanged((previous, current) => previous.activeSorter === current.activeSorter), takeUntil(this.destroy$))
.subscribe((props) => {
const emitEvent = props?.options?.emitEvent ?? true;
if (emitEvent)
this.sortChange.emit(props?.activeSorter);
});
}
ngOnDestroy() {
this.containerElement = undefined;
this.filledElement = undefined;
this.noDataElement = undefined;
this.noDataContentRef?.destroy();
this.loadingElement = undefined;
this.loadingContentRef?.destroy();
this.errorElement = undefined;
this.errorContentRef?.destroy();
this.destroy$.next(true);
this.destroy$.complete();
}
ngOnChanges(changes) {
const activeSorter = changes['activeSorter'];
if (activeSorter?.previousValue !== activeSorter?.currentValue) {
setTimeout(() => this._sortChange.emit({ activeSorter: activeSorter?.currentValue }), 0);
}
const status = changes['status'];
if (status?.previousValue !== status?.currentValue) {
this.handleBodyVisibilityByStatus();
}
const customNoData = changes['customNoData'];
if (customNoData?.previousValue !== customNoData?.currentValue) {
this.handleCustomNoData();
}
const customLoading = changes['customLoading'];
if (customLoading?.previousValue !== customLoading?.currentValue) {
this.handleCustomLoading();
}
const customError = changes['customError'];
if (customError?.previousValue !== customError?.currentValue) {
this.handleCustomError();
}
}
ngAfterViewInit() {
this.containerElement = this.createContainer();
const parentNode = this.elementRef.nativeElement.parentNode;
// Insert container element before the table element.
this.renderer.insertBefore(parentNode, this.containerElement, this.elementRef.nativeElement);
// Remove the table element.
this.renderer.removeChild(parentNode, this.elementRef.nativeElement);
// Append the table element inside the container element.
this.renderer.appendChild(this.containerElement, this.elementRef.nativeElement);
// Assign filled tbody to variable
this.filledElement = this.elementRef.nativeElement.querySelector('tbody');
// Append others tbody (no data, loading)
this.initNoDataElement();
this.initLoadingElement();
this.initErrorElement();
// Handle table body visibility
this.handleBodyVisibilityByStatus();
// Handle resize when window resized
this.onResize();
}
/**
* Change active sorter programmatically.
* @param activeSorter Value of the active sorter. Provide `undefined` to clear sorter.
* @param options.emitEvent Whether to emit an event for `sortChange`. Default is `true`.
*/
changeActiveSorter(activeSorter, options) {
this.activeSorter = activeSorter;
this._sortChange.emit({ activeSorter, options });
}
onResize() {
this.ngZone.runOutsideAngular(() => {
fromEvent(window, 'resize')
.pipe(takeUntil(this.destroy$))
.subscribe(() => {
this.resizeNoDataElementWidth();
this.resizeLoadingElementWidth();
this.resizeErrorElementWidth();
});
});
}
createContainer() {
const element = this.renderer.createElement('div');
this.renderer.addClass(element, 'd-table-container');
return element;
}
initNoDataElement() {
this.noDataElement = TemplateUtil.createNoDataElement({
renderer: this.renderer,
totalColumn: this.totalColumn,
});
this.renderer.insertBefore(this.elementRef.nativeElement, this.noDataElement.bodyElement, this.filledElement);
this.handleCustomNoData();
this.resizeNoDataElementWidth();
}
handleCustomNoData() {
if (!this.noDataElement)
return;
this.noDataContentRef?.destroy();
TemplateUtil.updateNoDataContent({
appRef: this.appRef,
noDataElement: this.noDataElement,
renderer: this.renderer,
content: this.customNoData,
injector: this.injector,
});
}
resizeNoDataElementWidth() {
if (!this.noDataElement)
return;
const containerWidth = this.containerElement?.clientWidth
? this.containerElement.clientWidth + 'px'
: '100%';
this.noDataElement.contentElement.style.width = containerWidth;
}
initLoadingElement() {
this.loadingElement = TemplateUtil.createLoadingElement({
renderer: this.renderer,
totalColumn: this.totalColumn,
applicationRef: this.appRef,
environmentInjector: this.envInjector,
});
this.renderer.insertBefore(this.elementRef.nativeElement, this.loadingElement.bodyElement, this.filledElement);
this.handleCustomLoading();
this.resizeLoadingElementWidth();
}
resizeLoadingElementWidth() {
if (!this.loadingElement)
return;
const containerWidth = this.containerElement?.clientWidth
? this.containerElement.clientWidth + 'px'
: '100%';
this.loadingElement.contentElement.style.width = containerWidth;
}
handleCustomLoading() {
if (!this.loadingElement)
return;
this.loadingContentRef?.destroy();
TemplateUtil.updateLoadingContent({
appRef: this.appRef,
envInjector: this.envInjector,
loadingElement: this.loadingElement,
renderer: this.renderer,
content: this.customLoading,
injector: this.injector,
});
}
initErrorElement() {
this.errorElement = TemplateUtil.createErrorElement({
renderer: this.renderer,
totalColumn: this.totalColumn,
});
this.renderer.insertBefore(this.elementRef.nativeElement, this.errorElement.bodyElement, this.filledElement);
this.handleCustomError();
this.resizeErrorElementWidth();
}
handleCustomError() {
if (!this.errorElement)
return;
this.errorContentRef?.destroy();
TemplateUtil.updateErrorContent({
appRef: this.appRef,
errorElement: this.errorElement,
renderer: this.renderer,
content: this.customError,
injector: this.injector,
});
}
resizeErrorElementWidth() {
if (!this.errorElement)
return;
const containerWidth = this.containerElement?.clientWidth
? this.containerElement.clientWidth + 'px'
: '100%';
this.errorElement.contentElement.style.width = containerWidth;
}
handleBodyVisibilityByStatus() {
if (!this.filledElement || !this.noDataElement || !this.loadingElement || !this.errorElement) {
return;
}
this.filledElement.style.display = 'none';
this.noDataElement.bodyElement.style.display = 'none';
this.loadingElement.bodyElement.style.display = 'none';
this.errorElement.bodyElement.style.display = 'none';
if (this.status === 'loading')
this.loadingElement.bodyElement.style.display = '';
if (this.status === 'empty')
this.noDataElement.bodyElement.style.display = '';
if (this.status === 'error')
this.errorElement.bodyElement.style.display = '';
if (!this.status)
this.filledElement.style.display = '';
}
}
DokuTable.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuTable, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.NgZone }, { token: i0.EnvironmentInjector }, { token: i0.ApplicationRef }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Directive });
DokuTable.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.9", type: DokuTable, isStandalone: true, selector: "[doku-table]", inputs: { activeSorter: "activeSorter", status: "status", customNoData: "customNoData", customLoading: "customLoading", customError: "customError" }, outputs: { sortChange: "sortChange" }, host: { properties: { "class": "this.classes" } }, exportAs: ["dokuTable"], usesOnChanges: true, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuTable, decorators: [{
type: Directive,
args: [{
selector: '[doku-table]',
exportAs: 'dokuTable',
standalone: true,
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.NgZone }, { type: i0.EnvironmentInjector }, { type: i0.ApplicationRef }, { type: i0.Injector }]; }, propDecorators: { activeSorter: [{
type: Input
}], status: [{
type: Input
}], customNoData: [{
type: Input
}], customLoading: [{
type: Input
}], customError: [{
type: Input
}], sortChange: [{
type: Output
}], classes: [{
type: HostBinding,
args: ['class']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZG9rdS1mcmFnbWVudC9zcmMvbGliL3RhYmxlL3RhYmxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBR0wsU0FBUyxFQUdULFlBQVksRUFDWixXQUFXLEVBRVgsS0FBSyxFQUtMLE1BQU0sR0FJUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsYUFBYSxFQUFFLG9CQUFvQixFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTlGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7QUFPL0MsTUFBTSxPQUFPLFNBQVM7SUErRHBCLFlBQ1UsVUFBc0IsRUFDdEIsUUFBbUIsRUFDbkIsTUFBYyxFQUNkLFdBQWdDLEVBQ2hDLE1BQXNCLEVBQ3RCLFFBQWtCO1FBTGxCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsZ0JBQVcsR0FBWCxXQUFXLENBQXFCO1FBQ2hDLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBQ3RCLGFBQVEsR0FBUixRQUFRLENBQVU7UUE5QjVCOztXQUVHO1FBRUgsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFnQyxDQUFDO1FBRXBELGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBR3BDLENBQUM7UUFDSyxnQkFBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFZcEUsYUFBUSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7SUFTcEMsQ0FBQztJQUVKLElBQ2MsT0FBTztRQUNuQixPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDckIsQ0FB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LENBQUM7UUFFckQsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVM7WUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNsRixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssT0FBTztZQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQy9FLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxPQUFPO1lBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDOUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztJQUMxRCxDQUFDOztzR0FyVFUsU0FBUzswRkFBVCxTQUFTOzJGQUFULFNBQVM7a0JBTHJCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGNBQWM7b0JBQ3hCLFFBQVEsRUFBRSxXQUFXO29CQUNyQixVQUFVLEVBQUUsSUFBSTtpQkFDakI7b09BTVUsWUFBWTtzQkFBcEIsS0FBSztnQkFhRyxNQUFNO3NCQUFkLEtBQUs7Z0JBT0csWUFBWTtzQkFBcEIsS0FBSztnQkFPRyxhQUFhO3NCQUFyQixLQUFLO2dCQUtHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBTU4sVUFBVTtzQkFEVCxNQUFNO2dCQStCTyxPQUFPO3NCQURwQixXQUFXO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ0NsYXNzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIEFwcGxpY2F0aW9uUmVmLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEVudmlyb25tZW50SW5qZWN0b3IsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmcsXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFJlbmRlcmVyMixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmVwbGF5U3ViamVjdCwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZyb21FdmVudCwgc2hhcmVSZXBsYXksIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRG9rdUFjdGl2ZVNvcnRlciB9IGZyb20gJy4vdGFibGUuaW50ZXJmYWNlJztcbmltcG9ydCB7IFRlbXBsYXRlVXRpbCB9IGZyb20gJy4vdGVtcGxhdGUudXRpbCc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tkb2t1LXRhYmxlXScsXG4gIGV4cG9ydEFzOiAnZG9rdVRhYmxlJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgRG9rdVRhYmxlIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCB7XG4gIC8qKlxuICAgKiBJbml0aWFsIGFjdGl2ZSBzb3J0ZXIgZm9yIGNvbHVtbi5cbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXG4gICAqL1xuICBASW5wdXQoKSBhY3RpdmVTb3J0ZXI/OiBEb2t1QWN0aXZlU29ydGVyO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhdHVzIG9mIHRoZSBkYXRhLlxuICAgKlxuICAgKiAtIGBsb2FkaW5nYCwgd2lsbCBzaG93IGxvYWRpbmcgY29udGVudCBvbiB0aGUgdGFibGUgYm9keVxuICAgKiAtIGBlbXB0eWAsIHdpbGwgc2hvdyBubyBkYXRhIGNvbnRlbnQgb24gdGhlIHRhYmxlIGJvZHlcbiAgICogLSBgZXJyb3JgLCB3aWxsIHNob3cgZXJyb3IgY29udGVudCBvbiB0aGUgdGFibGUgYm9keVxuICAgKlxuICAgKiBJZiBzdGF0dXMgaXMgYHVuZGVmaW5lZGAsIGl0IG1lYW5zIGRhdGEgaXMgcHJvdmlkZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxuICAgKi9cbiAgQElucHV0KCkgc3RhdHVzPzogJ2xvYWRpbmcnIHwgJ2VtcHR5JyB8ICdlcnJvcic7XG5cbiAgLyoqXG4gICAqIEN1c3RvbSB0ZXh0IG9yIHRlbXBsYXRlIG9uIHRoZSB0YWJsZSBib2R5IHdoZW4gc3RhdHVzIGlzIGBlbXB0eWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxuICAgKi9cbiAgQElucHV0KCkgY3VzdG9tTm9EYXRhPzogc3RyaW5nIHwgVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgLyoqXG4gICAqIEN1c3RvbSB0ZXh0IG9yIHRlbXBsYXRlIG9uIHRoZSB0YWJsZSBib2R5IHdoZW4gc3RhdHVzIGlzIGBsb2FkaW5nYC5cbiAgICpcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXG4gICAqL1xuICBASW5wdXQoKSBjdXN0b21Mb2FkaW5nPzogc3RyaW5nIHwgVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgLyoqXG4gICAqIEN1c3RvbSB0ZXh0IG9yIHRlbXBsYXRlIG9uIHRoZSB0YWJsZSBib2R5IHdoZW4gc3RhdHVzIGlzIGBlcnJvcmAuXG4gICAqL1xuICBASW5wdXQoKSBjdXN0b21FcnJvcj86IHN0cmluZyB8IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBMaXN0ZW4gZm9yIGNvbHVtbiBzb3J0IGNoYW5nZXMuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgc29ydENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RG9rdUFjdGl2ZVNvcnRlciB8IHVuZGVmaW5lZD4oKTtcblxuICBwcm90ZWN0ZWQgX3NvcnRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICBhY3RpdmVTb3J0ZXI/OiBEb2t1QWN0aXZlU29ydGVyIHwgdW5kZWZpbmVkO1xuICAgIG9wdGlvbnM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfTtcbiAgfT4oKTtcbiAgcHJvdGVjdGVkIHNvcnRDaGFuZ2UkID0gdGhpcy5fc29ydENoYW5nZS5hc09ic2VydmFibGUoKS5waXBlKHNoYXJlUmVwbGF5KCkpO1xuXG4gIHByaXZhdGUgY29udGFpbmVyRWxlbWVudD86IEhUTUxEaXZFbGVtZW50O1xuXG4gIHByaXZhdGUgZmlsbGVkRWxlbWVudD86IEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50O1xuICBwcml2YXRlIG5vRGF0YUVsZW1lbnQ/OiBSZXR1cm5UeXBlPHR5cGVvZiBUZW1wbGF0ZVV0aWwuY3JlYXRlTm9EYXRhRWxlbWVudD47XG4gIHByaXZhdGUgbm9EYXRhQ29udGVudFJlZj86IFJldHVyblR5cGU8dHlwZW9mIFRlbXBsYXRlVXRpbC51cGRhdGVOb0RhdGFDb250ZW50PjtcbiAgcHJpdmF0ZSBsb2FkaW5nRWxlbWVudD86IFJldHVyblR5cGU8dHlwZW9mIFRlbXBsYXRlVXRpbC5jcmVhdGVMb2FkaW5nRWxlbWVudD47XG4gIHByaXZhdGUgbG9hZGluZ0NvbnRlbnRSZWY/OiBSZXR1cm5UeXBlPHR5cGVvZiBUZW1wbGF0ZVV0aWwudXBkYXRlTG9hZGluZ0NvbnRlbnQ+O1xuICBwcml2YXRlIGVycm9yRWxlbWVudD86IFJldHVyblR5cGU8dHlwZW9mIFRlbXBsYXRlVXRpbC5jcmVhdGVFcnJvckVsZW1lbnQ+O1xuICBwcml2YXRlIGVycm9yQ29udGVudFJlZj86IFJldHVyblR5cGU8dHlwZW9mIFRlbXBsYXRlVXRpbC51cGRhdGVFcnJvckNvbnRlbnQ+O1xuXG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgUmVwbGF5U3ViamVjdCgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIGVudkluamVjdG9yOiBFbnZpcm9ubWVudEluamVjdG9yLFxuICAgIHByaXZhdGUgYXBwUmVmOiBBcHBsaWNhdGlvblJlZixcbiAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvclxuICApIHt9XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcycpXG4gIHByb3RlY3RlZCBnZXQgY2xhc3NlcygpOiBOZ0NsYXNzWyduZ0NsYXNzJ10ge1xuICAgIHJldHVybiBbJ2QtdGFibGUnXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgdG90YWxDb2x1bW4oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5xdWVyeVNlbGVjdG9yQWxsKCd0aGVhZCB0ciB0aCcpLmxlbmd0aDtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX3NvcnRDaGFuZ2VcbiAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwcmV2aW91cywgY3VycmVudCkgPT4gcHJldmlvdXMuYWN0aXZlU29ydGVyID09PSBjdXJyZW50LmFjdGl2ZVNvcnRlciksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgocHJvcHMpID0+IHtcbiAgICAgICAgY29uc3QgZW1pdEV2ZW50ID0gcHJvcHM/Lm9wdGlvbnM/LmVtaXRFdmVudCA/PyB0cnVlO1xuICAgICAgICBpZiAoZW1pdEV2ZW50KSB0aGlzLnNvcnRDaGFuZ2UuZW1pdChwcm9wcz8uYWN0aXZlU29ydGVyKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jb250YWluZXJFbGVtZW50ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZmlsbGVkRWxlbWVudCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm5vRGF0YUVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5ub0RhdGFDb250ZW50UmVmPy5kZXN0cm95KCk7XG4gICAgdGhpcy5sb2FkaW5nRWxlbWVudCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmxvYWRpbmdDb250ZW50UmVmPy5kZXN0cm95KCk7XG4gICAgdGhpcy5lcnJvckVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5lcnJvckNvbnRlbnRSZWY/LmRlc3Ryb3koKTtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2ZVNvcnRlciA9IGNoYW5nZXNbJ2FjdGl2ZVNvcnRlciddO1xuICAgIGlmIChhY3RpdmVTb3J0ZXI/LnByZXZpb3VzVmFsdWUgIT09IGFjdGl2ZVNvcnRlcj8uY3VycmVudFZhbHVlKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX3NvcnRDaGFuZ2UuZW1pdCh7IGFjdGl2ZVNvcnRlcjogYWN0aXZlU29ydGVyPy5jdXJyZW50VmFsdWUgfSksIDApO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXR1cyA9IGNoYW5nZXNbJ3N0YXR1cyddO1xuICAgIGlmIChzdGF0dXM/LnByZXZpb3VzVmFsdWUgIT09IHN0YXR1cz8uY3VycmVudFZhbHVlKSB7XG4gICAgICB0aGlzLmhhbmRsZUJvZHlWaXNpYmlsaXR5QnlTdGF0dXMoKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXN0b21Ob0RhdGEgPSBjaGFuZ2VzWydjdXN0b21Ob0RhdGEnXTtcbiAgICBpZiAoY3VzdG9tTm9EYXRhPy5wcmV2aW91c1ZhbHVlICE9PSBjdXN0b21Ob0RhdGE/LmN1cnJlbnRWYWx1ZSkge1xuICAgICAgdGhpcy5oYW5kbGVDdXN0b21Ob0RhdGEoKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXN0b21Mb2FkaW5nID0gY2hhbmdlc1snY3VzdG9tTG9hZGluZyddO1xuICAgIGlmIChjdXN0b21Mb2FkaW5nPy5wcmV2aW91c1ZhbHVlICE9PSBjdXN0b21Mb2FkaW5nPy5jdXJyZW50VmFsdWUpIHtcbiAgICAgIHRoaXMuaGFuZGxlQ3VzdG9tTG9hZGluZygpO1xuICAgIH1cblxuICAgIGNvbnN0IGN1c3RvbUVycm9yID0gY2hhbmdlc1snY3VzdG9tRXJyb3InXTtcbiAgICBpZiAoY3VzdG9tRXJyb3I/LnByZXZpb3VzVmFsdWUgIT09IGN1c3RvbUVycm9yPy5jdXJyZW50VmFsdWUpIHtcbiAgICAgIHRoaXMuaGFuZGxlQ3VzdG9tRXJyb3IoKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5jb250YWluZXJFbGVtZW50ID0gdGhpcy5jcmVhdGVDb250YWluZXIoKTtcbiAgICBjb25zdCBwYXJlbnROb2RlID0gKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5wYXJlbnROb2RlO1xuXG4gICAgLy8gSW5zZXJ0IGNvbnRhaW5lciBlbGVtZW50IGJlZm9yZSB0aGUgdGFibGUgZWxlbWVudC5cbiAgICB0aGlzLnJlbmRlcmVyLmluc2VydEJlZm9yZShwYXJlbnROb2RlLCB0aGlzLmNvbnRhaW5lckVsZW1lbnQsIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcblxuICAgIC8vIFJlbW92ZSB0aGUgdGFibGUgZWxlbWVudC5cbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKHBhcmVudE5vZGUsIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcblxuICAgIC8vIEFwcGVuZCB0aGUgdGFibGUgZWxlbWVudCBpbnNpZGUgdGhlIGNvbnRhaW5lciBlbGVtZW50LlxuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5jb250YWluZXJFbGVtZW50LCB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG5cbiAgICAvLyBBc3NpZ24gZmlsbGVkIHRib2R5IHRvIHZhcmlhYmxlXG4gICAgdGhpcy5maWxsZWRFbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcigndGJvZHknKTtcblxuICAgIC8vIEFwcGVuZCBvdGhlcnMgdGJvZHkgKG5vIGRhdGEsIGxvYWRpbmcpXG4gICAgdGhpcy5pbml0Tm9EYXRhRWxlbWVudCgpO1xuICAgIHRoaXMuaW5pdExvYWRpbmdFbGVtZW50KCk7XG4gICAgdGhpcy5pbml0RXJyb3JFbGVtZW50KCk7XG5cbiAgICAvLyBIYW5kbGUgdGFibGUgYm9keSB2aXNpYmlsaXR5XG4gICAgdGhpcy5oYW5kbGVCb2R5VmlzaWJpbGl0eUJ5U3RhdHVzKCk7XG5cbiAgICAvLyBIYW5kbGUgcmVzaXplIHdoZW4gd2luZG93IHJlc2l6ZWRcbiAgICB0aGlzLm9uUmVzaXplKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlIGFjdGl2ZSBzb3J0ZXIgcHJvZ3JhbW1hdGljYWxseS5cbiAgICogQHBhcmFtIGFjdGl2ZVNvcnRlciBWYWx1ZSBvZiB0aGUgYWN0aXZlIHNvcnRlci4gUHJvdmlkZSBgdW5kZWZpbmVkYCB0byBjbGVhciBzb3J0ZXIuXG4gICAqIEBwYXJhbSBvcHRpb25zLmVtaXRFdmVudCBXaGV0aGVyIHRvIGVtaXQgYW4gZXZlbnQgZm9yIGBzb3J0Q2hhbmdlYC4gRGVmYXVsdCBpcyBgdHJ1ZWAuXG4gICAqL1xuICBjaGFuZ2VBY3RpdmVTb3J0ZXIoYWN0aXZlU29ydGVyPzogRG9rdUFjdGl2ZVNvcnRlciwgb3B0aW9ucz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG4gICAgdGhpcy5hY3RpdmVTb3J0ZXIgPSBhY3RpdmVTb3J0ZXI7XG4gICAgdGhpcy5fc29ydENoYW5nZS5lbWl0KHsgYWN0aXZlU29ydGVyLCBvcHRpb25zIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBvblJlc2l6ZSgpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBmcm9tRXZlbnQod2luZG93LCAncmVzaXplJylcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnJlc2l6ZU5vRGF0YUVsZW1lbnRXaWR0aCgpO1xuICAgICAgICAgIHRoaXMucmVzaXplTG9hZGluZ0VsZW1lbnRXaWR0aCgpO1xuICAgICAgICAgIHRoaXMucmVzaXplRXJyb3JFbGVtZW50V2lkdGgoKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNvbnRhaW5lcigpIHtcbiAgICBjb25zdCBlbGVtZW50OiBIVE1MRGl2RWxlbWVudCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhlbGVtZW50LCAnZC10YWJsZS1jb250YWluZXInKTtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdE5vRGF0YUVsZW1lbnQoKSB7XG4gICAgdGhpcy5ub0RhdGFFbGVtZW50ID0gVGVtcGxhdGVVdGlsLmNyZWF0ZU5vRGF0YUVsZW1lbnQoe1xuICAgICAgcmVuZGVyZXI6IHRoaXMucmVuZGVyZXIsXG4gICAgICB0b3RhbENvbHVtbjogdGhpcy50b3RhbENvbHVtbixcbiAgICB9KTtcbiAgICB0aGlzLnJlbmRlcmVyLmluc2VydEJlZm9yZShcbiAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgdGhpcy5ub0RhdGFFbGVtZW50LmJvZHlFbGVtZW50LFxuICAgICAgdGhpcy5maWxsZWRFbGVtZW50XG4gICAgKTtcbiAgICB0aGlzLmhhbmRsZUN1c3RvbU5vRGF0YSgpO1xuICAgIHRoaXMucmVzaXplTm9EYXRhRWxlbWVudFdpZHRoKCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUN1c3RvbU5vRGF0YSgpIHtcbiAgICBpZiAoIXRoaXMubm9EYXRhRWxlbWVudCkgcmV0dXJuO1xuICAgIHRoaXMubm9EYXRhQ29udGVudFJlZj8uZGVzdHJveSgpO1xuICAgIFRlbXBsYXRlVXRpbC51cGRhdGVOb0RhdGFDb250ZW50KHtcbiAgICAgIGFwcFJlZjogdGhpcy5hcHBSZWYsXG4gICAgICBub0RhdGFFbGVtZW50OiB0aGlzLm5vRGF0YUVsZW1lbnQsXG4gICAgICByZW5kZXJlcjogdGhpcy5yZW5kZXJlcixcbiAgICAgIGNvbnRlbnQ6IHRoaXMuY3VzdG9tTm9EYXRhLFxuICAgICAgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlc2l6ZU5vRGF0YUVsZW1lbnRXaWR0aCgpIHtcbiAgICBpZiAoIXRoaXMubm9EYXRhRWxlbWVudCkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gdGhpcy5jb250YWluZXJFbGVtZW50Py5jbGllbnRXaWR0aFxuICAgICAgPyB0aGlzLmNvbnRhaW5lckVsZW1lbnQuY2xpZW50V2lkdGggKyAncHgnXG4gICAgICA6ICcxMDAlJztcbiAgICB0aGlzLm5vRGF0YUVsZW1lbnQuY29udGVudEVsZW1lbnQuc3R5bGUud2lkdGggPSBjb250YWluZXJXaWR0aDtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdExvYWRpbmdFbGVtZW50KCkge1xuICAgIHRoaXMubG9hZGluZ0VsZW1lbnQgPSBUZW1wbGF0ZVV0aWwuY3JlYXRlTG9hZGluZ0VsZW1lbnQoe1xuICAgICAgcmVuZGVyZXI6IHRoaXMucmVuZGVyZXIsXG4gICAgICB0b3RhbENvbHVtbjogdGhpcy50b3RhbENvbHVtbixcbiAgICAgIGFwcGxpY2F0aW9uUmVmOiB0aGlzLmFwcFJlZixcbiAgICAgIGVudmlyb25tZW50SW5qZWN0b3I6IHRoaXMuZW52SW5qZWN0b3IsXG4gICAgfSk7XG4gICAgdGhpcy5yZW5kZXJlci5pbnNlcnRCZWZvcmUoXG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgIHRoaXMubG9hZGluZ0VsZW1lbnQuYm9keUVsZW1lbnQsXG4gICAgICB0aGlzLmZpbGxlZEVsZW1lbnRcbiAgICApO1xuICAgIHRoaXMuaGFuZGxlQ3VzdG9tTG9hZGluZygpO1xuICAgIHRoaXMucmVzaXplTG9hZGluZ0VsZW1lbnRXaWR0aCgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNpemVMb2FkaW5nRWxlbWVudFdpZHRoKCkge1xuICAgIGlmICghdGhpcy5sb2FkaW5nRWxlbWVudCkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gdGhpcy5jb250YWluZXJFbGVtZW50Py5jbGllbnRXaWR0aFxuICAgICAgPyB0aGlzLmNvbnRhaW5lckVsZW1lbnQuY2xpZW50V2lkdGggKyAncHgnXG4gICAgICA6ICcxMDAlJztcbiAgICB0aGlzLmxvYWRpbmdFbGVtZW50LmNvbnRlbnRFbGVtZW50LnN0eWxlLndpZHRoID0gY29udGFpbmVyV2lkdGg7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUN1c3RvbUxvYWRpbmcoKSB7XG4gICAgaWYgKCF0aGlzLmxvYWRpbmdFbGVtZW50KSByZXR1cm47XG4gICAgdGhpcy5sb2FkaW5nQ29udGVudFJlZj8uZGVzdHJveSgpO1xuICAgIFRlbXBsYXRlVXRpbC51cGRhdGVMb2FkaW5nQ29udGVudCh7XG4gICAgICBhcHBSZWY6IHRoaXMuYXBwUmVmLFxuICAgICAgZW52SW5qZWN0b3I6IHRoaXMuZW52SW5qZWN0b3IsXG4gICAgICBsb2FkaW5nRWxlbWVudDogdGhpcy5sb2FkaW5nRWxlbWVudCxcbiAgICAgIHJlbmRlcmVyOiB0aGlzLnJlbmRlcmVyLFxuICAgICAgY29udGVudDogdGhpcy5jdXN0b21Mb2FkaW5nLFxuICAgICAgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRFcnJvckVsZW1lbnQoKSB7XG4gICAgdGhpcy5lcnJvckVsZW1lbnQgPSBUZW1wbGF0ZVV0aWwuY3JlYXRlRXJyb3JFbGVtZW50KHtcbiAgICAgIHJlbmRlcmVyOiB0aGlzLnJlbmRlcmVyLFxuICAgICAgdG90YWxDb2x1bW46IHRoaXMudG90YWxDb2x1bW4sXG4gICAgfSk7XG4gICAgdGhpcy5yZW5kZXJlci5pbnNlcnRCZWZvcmUoXG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgIHRoaXMuZXJyb3JFbGVtZW50LmJvZHlFbGVtZW50LFxuICAgICAgdGhpcy5maWxsZWRFbGVtZW50XG4gICAgKTtcbiAgICB0aGlzLmhhbmRsZUN1c3RvbUVycm9yKCk7XG4gICAgdGhpcy5yZXNpemVFcnJvckVsZW1lbnRXaWR0aCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDdXN0b21FcnJvcigpIHtcbiAgICBpZiAoIXRoaXMuZXJyb3JFbGVtZW50KSByZXR1cm47XG4gICAgdGhpcy5lcnJvckNvbnRlbnRSZWY/LmRlc3Ryb3koKTtcbiAgICBUZW1wbGF0ZVV0aWwudXBkYXRlRXJyb3JDb250ZW50KHtcbiAgICAgIGFwcFJlZjogdGhpcy5hcHBSZWYsXG4gICAgICBlcnJvckVsZW1lbnQ6IHRoaXMuZXJyb3JFbGVtZW50LFxuICAgICAgcmVuZGVyZXI6IHRoaXMucmVuZGVyZXIsXG4gICAgICBjb250ZW50OiB0aGlzLmN1c3RvbUVycm9yLFxuICAgICAgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlc2l6ZUVycm9yRWxlbWVudFdpZHRoKCkge1xuICAgIGlmICghdGhpcy5lcnJvckVsZW1lbnQpIHJldHVybjtcbiAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IHRoaXMuY29udGFpbmVyRWxlbWVudD8uY2xpZW50V2lkdGhcbiAgICAgID8gdGhpcy5jb250YWluZXJFbGVtZW50LmNsaWVudFdpZHRoICsgJ3B4J1xuICAgICAgOiAnMTAwJSc7XG4gICAgdGhpcy5lcnJvckVsZW1lbnQuY29udGVudEVsZW1lbnQuc3R5bGUud2lkdGggPSBjb250YWluZXJXaWR0aDtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQm9keVZpc2liaWxpdHlCeVN0YXR1cygpIHtcbiAgICBpZiAoIXRoaXMuZmlsbGVkRWxlbWVudCB8fCAhdGhpcy5ub0RhdGFFbGVtZW50IHx8ICF0aGlzLmxvYWRpbmdFbGVtZW50IHx8ICF0aGlzLmVycm9yRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZmlsbGVkRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHRoaXMubm9EYXRhRWxlbWVudC5ib2R5RWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHRoaXMubG9hZGluZ0VsZW1lbnQuYm9keUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB0aGlzLmVycm9yRWxlbWVudC5ib2R5RWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgaWYgKHRoaXMuc3RhdHVzID09PSAnbG9hZGluZycpIHRoaXMubG9hZGluZ0VsZW1lbnQuYm9keUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gJ2VtcHR5JykgdGhpcy5ub0RhdGFFbGVtZW50LmJvZHlFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICBpZiAodGhpcy5zdGF0dXMgPT09ICdlcnJvcicpIHRoaXMuZXJyb3JFbGVtZW50LmJvZHlFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICBpZiAoIXRoaXMuc3RhdHVzKSB0aGlzLmZpbGxlZEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICcnO1xuICB9XG59XG4iXX0=