UNPKG

ag-grid-angular

Version:
112 lines 17.6 kB
import { ViewContainerRef } from '@angular/core'; import { Component, Injectable, inject } from '@angular/core'; import { BaseComponentWrapper, _removeFromParent } from 'ag-grid-community'; import * as i0 from "@angular/core"; // To speed up the removal of custom components we create a number of shards to contain them. // Removing a single component calls a function within Angular called removeFromArray. // This is a lot faster if the array is smaller. export class AgComponentContainer { constructor() { this.vcr = inject(ViewContainerRef); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AgComponentContainer, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AgComponentContainer, selector: "ag-component-container", ngImport: i0, template: '', isInline: true }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AgComponentContainer, decorators: [{ type: Component, args: [{ selector: 'ag-component-container', template: '', }] }] }); const NUM_SHARDS = 16; let shardIdx = 0; function createComponentContainers(vcr) { const containerMap = new Map(); for (let i = 0; i < NUM_SHARDS; i++) { const container = vcr.createComponent(AgComponentContainer); containerMap.set(i, container); _removeFromParent(container.location.nativeElement); } return containerMap; } export class AngularFrameworkComponentWrapper extends BaseComponentWrapper { setViewContainerRef(viewContainerRef, angularFrameworkOverrides) { this.viewContainerRef = viewContainerRef; this.angularFrameworkOverrides = angularFrameworkOverrides; } createWrapper(OriginalConstructor) { const angularFrameworkOverrides = this.angularFrameworkOverrides; const that = this; that.compShards ??= createComponentContainers(this.viewContainerRef); class DynamicAgNg2Component extends BaseGuiComponent { init(params) { angularFrameworkOverrides.runInsideAngular(() => { super.init(params); this._componentRef.changeDetectorRef.detectChanges(); }); } createComponent() { return that.createComponent(OriginalConstructor); } hasMethod(name) { return wrapper.getFrameworkComponentInstance()[name] != null; } callMethod(name, args) { const componentRef = this.getFrameworkComponentInstance(); const methodCall = componentRef[name]; // Special case for `doesFilterPass` as it's called very often and current implementation has // this filter logic as part of the component when really it is just part of the filter model. if (name === 'doesFilterPass') { return methodCall.apply(componentRef, args); } return angularFrameworkOverrides.runInsideAngular(() => methodCall.apply(componentRef, args)); } addMethod(name, callback) { wrapper[name] = callback; } } const wrapper = new DynamicAgNg2Component(); return wrapper; } createComponent(componentType) { shardIdx = (shardIdx + 1) % NUM_SHARDS; const container = this.compShards.get(shardIdx); return container.instance.vcr.createComponent(componentType); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AngularFrameworkComponentWrapper, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AngularFrameworkComponentWrapper }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AngularFrameworkComponentWrapper, decorators: [{ type: Injectable }] }); class BaseGuiComponent { init(params) { this._params = params; this._componentRef = this.createComponent(); this._agAwareComponent = this._componentRef.instance; this._frameworkComponentInstance = this._componentRef.instance; this._eGui = this._componentRef.location.nativeElement; // Angular appends the component to the DOM, so remove it _removeFromParent(this._eGui); this._agAwareComponent.agInit(this._params); } getGui() { return this._eGui; } /** `getGui()` returns the `ng-component` element. This returns the actual root element. */ getRootElement() { const firstChild = this._eGui.firstChild; return firstChild; } destroy() { if (this._frameworkComponentInstance && typeof this._frameworkComponentInstance.destroy === 'function') { this._frameworkComponentInstance.destroy(); } this._componentRef?.destroy(); } getFrameworkComponentInstance() { return this._frameworkComponentInstance; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhckZyYW1ld29ya0NvbXBvbmVudFdyYXBwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hZy1ncmlkLWFuZ3VsYXIvc3JjL2xpYi9hbmd1bGFyRnJhbWV3b3JrQ29tcG9uZW50V3JhcHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzlELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDOztBQUs1RSw2RkFBNkY7QUFDN0Ysc0ZBQXNGO0FBQ3RGLGdEQUFnRDtBQUtoRCxNQUFNLE9BQU8sb0JBQW9CO0lBSmpDO1FBS1csUUFBRyxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0tBQ3pDOytHQUZZLG9CQUFvQjttR0FBcEIsb0JBQW9CLDhEQUZuQixFQUFFOzs0RkFFSCxvQkFBb0I7a0JBSmhDLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLHdCQUF3QjtvQkFDbEMsUUFBUSxFQUFFLEVBQUU7aUJBQ2Y7O0FBSUQsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDO0FBQ3RCLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztBQUVqQixTQUFTLHlCQUF5QixDQUFDLEdBQXFCO0lBQ3BELE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxFQUE4QyxDQUFDO0lBQzNFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDakMsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQzVELFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxD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SSxDQUFDLDJCQUEyQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDO1FBQy9ELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDO1FBQ3ZELHlEQUF5RDtRQUN6RCxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFOUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVNLE1BQU07UUFDVCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUVELDJGQUEyRjtJQUNwRixjQUFjO1FBQ2pCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO1FBQ3pDLE9BQU8sVUFBeUIsQ0FBQztJQUNyQyxDQUFDO0lBRU0sT0FBTztRQUNWLElBQUksSUFBSSxDQUFDLDJCQUEyQixJQUFJLE9BQU8sSUFBSSxDQUFDLDJCQUEyQixDQUFDLE9BQU8sS0FBSyxVQUFVLEVBQUU7WUFDcEcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQzlDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRU0sNkJBQTZCO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLDJCQUEyQixDQUFDO0lBQzVDLENBQUM7Q0FHSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29tcG9uZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21wb25lbnQsIEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgdHlwZSB7IEZyYW1ld29ya0NvbXBvbmVudFdyYXBwZXIsIFdyYXBwYWJsZUludGVyZmFjZSB9IGZyb20gJ2FnLWdyaWQtY29tbXVuaXR5JztcbmltcG9ydCB7IEJhc2VDb21wb25lbnRXcmFwcGVyLCBfcmVtb3ZlRnJvbVBhcmVudCB9IGZyb20gJ2FnLWdyaWQtY29tbXVuaXR5JztcblxuaW1wb3J0IHR5cGUgeyBBbmd1bGFyRnJhbWV3b3JrT3ZlcnJpZGVzIH0gZnJvbSAnLi9hbmd1bGFyRnJhbWV3b3JrT3ZlcnJpZGVzJztcbmltcG9ydCB0eXBlIHsgQWdGcmFtZXdvcmtDb21wb25lbnQgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuXG4vLyBUbyBzcGVlZCB1cCB0aGUgcmVtb3ZhbCBvZiBjdXN0b20gY29tcG9uZW50cyB3ZSBjcmVhdGUgYSBudW1iZXIgb2Ygc2hhcmRzIHRvIGNvbnRhaW4gdGhlbS5cbi8vIFJlbW92aW5nIGEgc2luZ2xlIGNvbXBvbmVudCBjYWxscyBhIGZ1bmN0aW9uIHdpdGhpbiBBbmd1bGFyIGNhbGxlZCByZW1vdmVGcm9tQXJyYXkuXG4vLyBUaGlzIGlzIGEgbG90IGZhc3RlciBpZiB0aGUgYXJyYXkgaXMgc21hbGxlci5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYWctY29tcG9uZW50LWNvbnRhaW5lcicsXG4gICAgdGVtcGxhdGU6ICcnLFxufSlcbmV4cG9ydCBjbGFzcyBBZ0NvbXBvbmVudENvbnRhaW5lciB7XG4gICAgcHVibGljIHZjciA9IGluamVjdChWaWV3Q29udGFpbmVyUmVmKTtcbn1cbmNvbnN0IE5VTV9TSEFSRFMgPSAxNjtcbmxldCBzaGFyZElkeCA9IDA7XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudENvbnRhaW5lcnModmNyOiBWaWV3Q29udGFpbmVyUmVmKTogTWFwPG51bWJlciwgQ29tcG9uZW50UmVmPEFnQ29tcG9uZW50Q29udGFpbmVyPj4ge1xuICAgIGNvbnN0IGNvbnRhaW5lck1hcCA9IG5ldyBNYXA8bnVtYmVyLCBDb21wb25lbnRSZWY8QWdDb21wb25lbnRDb250YWluZXI+PigpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTlVNX1NIQVJEUzsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHZjci5jcmVhdGVDb21wb25lbnQoQWdDb21wb25lbnRDb250YWluZXIpO1xuICAgICAgICBjb250YWluZXJNYXAuc2V0KGksIGNvbnRhaW5lcik7XG4gICAgICAgIF9yZW1vdmVGcm9tUGFyZW50KGNvbnRhaW5lci5sb2NhdGlvbi5uYXRpdmVFbGVtZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRhaW5lck1hcDtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEFuZ3VsYXJGcmFtZXdvcmtDb21wb25lbnRXcmFwcGVyXG4gICAgZXh0ZW5kcyBCYXNlQ29tcG9uZW50V3JhcHBlcjxXcmFwcGFibGVJbnRlcmZhY2U+XG4gICAgaW1wbGVtZW50cyBGcmFtZXdvcmtDb21wb25lbnRXcmFwcGVyXG57XG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmO1xuICAgIHByaXZhdGUgYW5ndWxhckZyYW1ld29ya092ZXJyaWRlczogQW5ndWxhckZyYW1ld29ya092ZXJyaWRlcztcbiAgICBwcml2YXRlIGNvbXBTaGFyZHM6IE1hcDxudW1iZXIsIENvbXBvbmVudFJlZjxBZ0NvbXBvbmVudENvbnRhaW5lcj4+O1xuXG4gICAgcHVibGljIHNldFZpZXdDb250YWluZXJSZWYoXG4gICAgICAgIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgICAgIGFuZ3VsYXJGcmFtZXdvcmtPdmVycmlkZXM6IEFuZ3VsYXJGcmFtZXdvcmtPdmVycmlkZXNcbiAgICApIHtcbiAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyUmVmID0gdmlld0NvbnRhaW5lclJlZjtcbiAgICAgICAgdGhpcy5hbmd1bGFyRnJhbWV3b3JrT3ZlcnJpZGVzID0gYW5ndWxhckZyYW1ld29ya092ZXJyaWRlcztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY3JlYXRlV3JhcHBlcihPcmlnaW5hbENvbnN0cnVjdG9yOiB7IG5ldyAoKTogYW55IH0pOiBXcmFwcGFibGVJbnRlcmZhY2Uge1xuICAgICAgICBjb25zdCBhbmd1bGFyRnJhbWV3b3JrT3ZlcnJpZGVzID0gdGhpcy5hbmd1bGFyRnJhbWV3b3JrT3ZlcnJpZGVzO1xuICAgICAgICBjb25zdCB0aGF0ID0gdGhpcztcbiAgICAgICAgdGhhdC5jb21wU2hhcmRzID8/PSBjcmVhdGVDb21wb25lbnRDb250YWluZXJzKHRoaXMudmlld0NvbnRhaW5lclJlZik7XG5cbiAgICAgICAgY2xhc3MgRHluYW1pY0FnTmcyQ29tcG9uZW50XG4gICAgICAgICAgICBleHRlbmRzIEJhc2VHdWlDb21wb25lbnQ8YW55LCBBZ0ZyYW1ld29ya0NvbXBvbmVudDxhbnk+PlxuICAgICAgICAgICAgaW1wbGVtZW50cyBXcmFwcGFibGVJbnRlcmZhY2VcbiAgICAgICAge1xuICAgICAgICAgICAgb3ZlcnJpZGUgaW5pdChwYXJhbXM6IGFueSk6IHZvaWQge1xuICAgICAgICAgICAgICAgIGFuZ3VsYXJGcmFtZXdvcmtPdmVycmlkZXMucnVuSW5zaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHN1cGVyLmluaXQocGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50UmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHJvdGVjdGVkIGNyZWF0ZUNvbXBvbmVudCgpOiBDb21wb25lbnRSZWY8QWdGcmFtZXdvcmtDb21wb25lbnQ8YW55Pj4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGF0LmNyZWF0ZUNvbXBvbmVudChPcmlnaW5hbENvbnN0cnVjdG9yKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaGFzTWV0aG9kKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVyLmdldEZyYW1ld29ya0NvbXBvbmVudEluc3RhbmNlKClbbmFtZV0gIT0gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FsbE1ldGhvZChuYW1lOiBzdHJpbmcsIGFyZ3M6IElBcmd1bWVudHMpOiB2b2lkIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRSZWYgPSB0aGlzLmdldEZyYW1ld29ya0NvbXBvbmVudEluc3RhbmNlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbWV0aG9kQ2FsbCA9IGNvbXBvbmVudFJlZltuYW1lXTtcbiAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGBkb2VzRmlsdGVyUGFzc2AgYXMgaXQncyBjYWxsZWQgdmVyeSBvZnRlbiBhbmQgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBoYXNcbiAgICAgICAgICAgICAgICAvLyB0aGlzIGZpbHRlciBsb2dpYyBhcyBwYXJ0IG9mIHRoZSBjb21wb25lbnQgd2hlbiByZWFsbHkgaXQgaXMganVzdCBwYXJ0IG9mIHRoZSBmaWx0ZXIgbW9kZWwuXG4gICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdkb2VzRmlsdGVyUGFzcycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZENhbGwuYXBwbHkoY29tcG9uZW50UmVmLCBhcmdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFuZ3VsYXJGcmFtZXdvcmtPdmVycmlkZXMucnVuSW5zaWRlQW5ndWxhcigoKSA9PiBtZXRob2RDYWxsLmFwcGx5KGNvbXBvbmVudFJlZiwgYXJncykpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhZGRNZXRob2QobmFtZTogc3RyaW5nLCBjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpOiB2b2lkIHtcbiAgICAgICAgICAgICAgICAod3JhcHBlciBhcyBhbnkpW25hbWVdID0gY2FsbGJhY2s7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgd3JhcHBlciA9IG5ldyBEeW5hbWljQWdOZzJDb21wb25lbnQoKTtcbiAgICAgICAgcmV0dXJuIHdyYXBwZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZUNvbXBvbmVudDxUPihjb21wb25lbnRUeXBlOiB7IG5ldyAoLi4uYXJnczogYW55W10pOiBUIH0pOiBDb21wb25lbnRSZWY8VD4ge1xuICAgICAgICBzaGFyZElkeCA9IChzaGFyZElkeCArIDEpICUgTlVNX1NIQVJEUztcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jb21wU2hhcmRzLmdldChzaGFyZElkeCkhO1xuICAgICAgICByZXR1cm4gY29udGFpbmVyLmluc3RhbmNlLnZjci5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50VHlwZSk7XG4gICAgfVxufVxuXG5hYnN0cmFjdCBjbGFzcyBCYXNlR3VpQ29tcG9uZW50PFAsIFQgZXh0ZW5kcyBBZ0ZyYW1ld29ya0NvbXBvbmVudDxQPj4ge1xuICAgIHByb3RlY3RlZCBfcGFyYW1zOiBQO1xuICAgIHByb3RlY3RlZCBfZUd1aTogSFRNTEVsZW1lbnQ7XG4gICAgcHJvdGVjdGVkIF9jb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxUPjtcbiAgICBwcm90ZWN0ZWQgX2FnQXdhcmVDb21wb25lbnQ6IFQ7XG4gICAgcHJvdGVjdGVkIF9mcmFtZXdvcmtDb21wb25lbnRJbnN0YW5jZTogYW55OyAvLyB0aGUgdXNlcnMgY29tcG9uZW50IC0gZm9yIGFjY2Vzc2luZyBtZXRob2RzIHRoZXkgY3JlYXRlXG5cbiAgICBwcm90ZWN0ZWQgaW5pdChwYXJhbXM6IFApOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fcGFyYW1zID0gcGFyYW1zO1xuXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudFJlZiA9IHRoaXMuY3JlYXRlQ29tcG9uZW50KCk7XG4gICAgICAgIHRoaXMuX2FnQXdhcmVDb21wb25lbnQgPSB0aGlzLl9jb21wb25lbnRSZWYuaW5zdGFuY2U7XG4gICAgICAgIHRoaXMuX2ZyYW1ld29ya0NvbXBvbmVudEluc3RhbmNlID0gdGhpcy5fY29tcG9uZW50UmVmLmluc3RhbmNlO1xuICAgICAgICB0aGlzLl9lR3VpID0gdGhpcy5fY29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIC8vIEFuZ3VsYXIgYXBwZW5kcyB0aGUgY29tcG9uZW50IHRvIHRoZSBET00sIHNvIHJlbW92ZSBpdFxuICAgICAgICBfcmVtb3ZlRnJvbVBhcmVudCh0aGlzLl9lR3VpKTtcblxuICAgICAgICB0aGlzLl9hZ0F3YXJlQ29tcG9uZW50LmFnSW5pdCh0aGlzLl9wYXJhbXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRHdWkoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5fZUd1aTtcbiAgICB9XG5cbiAgICAvKiogYGdldEd1aSgpYCByZXR1cm5zIHRoZSBgbmctY29tcG9uZW50YCBlbGVtZW50LiBUaGlzIHJldHVybnMgdGhlIGFjdHVhbCByb290IGVsZW1lbnQuICovXG4gICAgcHVibGljIGdldFJvb3RFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgY29uc3QgZmlyc3RDaGlsZCA9IHRoaXMuX2VHdWkuZmlyc3RDaGlsZDtcbiAgICAgICAgcmV0dXJuIGZpcnN0Q2hpbGQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9mcmFtZXdvcmtDb21wb25lbnRJbnN0YW5jZSAmJiB0eXBlb2YgdGhpcy5fZnJhbWV3b3JrQ29tcG9uZW50SW5zdGFuY2UuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5fZnJhbWV3b3JrQ29tcG9uZW50SW5zdGFuY2UuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NvbXBvbmVudFJlZj8uZGVzdHJveSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGcmFtZXdvcmtDb21wb25lbnRJbnN0YW5jZSgpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZnJhbWV3b3JrQ29tcG9uZW50SW5zdGFuY2U7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IGNyZWF0ZUNvbXBvbmVudCgpOiBDb21wb25lbnRSZWY8VD47XG59XG4iXX0=