UNPKG

ngx-powerbi

Version:

TypeScript library for embedding Power BI assets (reports/dashboards/tiles) in your application. This TypeScript library is built on top of the official powerbi-client library provided by Microsoft.

145 lines 20 kB
import { Component, ElementRef, EventEmitter, Input, Output, ViewChild, } from '@angular/core'; import * as models from 'powerbi-models'; import { NgxPowerBiService } from './ngx-powerbi.service'; import * as i0 from "@angular/core"; import * as i1 from "./ngx-powerbi.service"; export class NgxPowerBiComponent { constructor(ngxPowerBiService) { this.ngxPowerBiService = ngxPowerBiService; this.embedded = new EventEmitter(); this.powerBiService = ngxPowerBiService; } ngAfterViewInit() { // Embed the report inside the view child that we have fetched from the DOM if (this.ngxPowerBiIFrameRef.nativeElement && this.validateRequiredAttributes()) { this.embed(this.ngxPowerBiIFrameRef.nativeElement, this.getConfig()); } } ngOnChanges(changes) { if (!this.ngxPowerBiIFrameRef) { return; } const { accessToken, tokenType, embedUrl, id, type, name, options } = changes; // TODO: Validate these conditions /*if ( (accessToken.previousValue !== undefined || accessToken.previousValue === accessToken.currentValue) && embedUrl.previousValue === embedUrl.currentValue ) { return; }*/ if (this.validateRequiredAttributes()) { const config = this.getConfig(accessToken && accessToken.currentValue, tokenType && tokenType.currentValue, embedUrl && embedUrl.currentValue, id && id.currentValue, type && type.currentValue, name && name.currentValue, options && options.currentValue); this.embed(this.ngxPowerBiIFrameRef.nativeElement, config); } else if (this.component) { this.reset(this.ngxPowerBiIFrameRef.nativeElement); } } ngOnDestroy() { if (this.component) { this.reset(this.ngxPowerBiIFrameRef.nativeElement); } } /** * Ensure required attributes (embedUrl and accessToken are valid before attempting to embed) */ validateRequiredAttributes() { return (typeof this.embedUrl === 'string' && this.embedUrl.length > 0 && (typeof this.accessToken === 'string' && this.accessToken.length > 0)); } /** * Get the model class compatible token enum from our token type enum * @param tokenType - Token type in our custom enum format * @returns Token type in powerbi-models.TokenType enum format */ getTokenType(tokenType) { if (tokenType) { switch (tokenType) { case "Aad" /* TokenType.Aad */: return models.TokenType.Aad; case "Embed" /* TokenType.Embed */: return models.TokenType.Embed; default: return models.TokenType.Aad; } } else { // default is AAD return models.TokenType.Aad; } } /** * Returns an embed configuration object. * @param accessToken - Access token required to embed a component * @param tokenType - type of accessToken: Aad or Embed * @param embedUrl - Embed URL obtained through Power BI REST API or Portal * @param id - component/element GUID * @param type - type of embedded component e.g. 'dashboard, report or tile' * @param name - name of the embedded component * @param options - Embed configuration options * @returns Embed configuration object */ getConfig(accessToken, tokenType, embedUrl, id, type, name, options) { // For null arguments - use the initial value // For specified arguments - use the current value return { type: type ? type : this.type ? this.type : "Report" /* ReportType.Report */, embedUrl: embedUrl ? embedUrl : this.embedUrl, accessToken: accessToken ? accessToken : this.accessToken, tokenType: tokenType ? this.getTokenType(tokenType) : this.getTokenType(this.tokenType), id: id ? id : this.id, uniqueId: name ? name : this.name, settings: options ? options : this.options }; } /** * Given an HTMLElement, construct an embed configuration based on attributes and pass to service. * @param element - native element where the embedding needs to be done * @param config - configuration to be embedded */ embed(element, config) { /*if (this.options) { const newConfig = { config, ...this.options }; }*/ this.component = this.powerBiService.embed(element, config); this.embedded.emit(this.component); } /** * Reset the component that has been removed from DOM. * @param element - native element where the embedded was made */ reset(element) { this.powerBiService.reset(element); this.component = null; } } /** @nocollapse */ NgxPowerBiComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: NgxPowerBiComponent, deps: [{ token: i1.NgxPowerBiService }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ NgxPowerBiComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: NgxPowerBiComponent, selector: "ngx-powerbi-component", inputs: { accessToken: "accessToken", tokenType: "tokenType", embedUrl: "embedUrl", id: "id", type: "type", name: "name", options: "options" }, outputs: { embedded: "embedded" }, viewQueries: [{ propertyName: "ngxPowerBiIFrameRef", first: true, predicate: ["ngxPowerBiIFrame"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: '<div #ngxPowerBiIFrame style="height:100%; width: 100%;"></div>', isInline: true }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: NgxPowerBiComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-powerbi-component', template: '<div #ngxPowerBiIFrame style="height:100%; width: 100%;"></div>' }] }], ctorParameters: function () { return [{ type: i1.NgxPowerBiService }]; }, propDecorators: { accessToken: [{ type: Input }], tokenType: [{ type: Input }], embedUrl: [{ type: Input }], id: [{ type: Input }], type: [{ type: Input }], name: [{ type: Input }], options: [{ type: Input }], embedded: [{ type: Output }], ngxPowerBiIFrameRef: [{ type: ViewChild, args: ['ngxPowerBiIFrame', { static: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXBvd2VyYmkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXBvd2VyYmkvc3JjL2xpYi9uZ3gtcG93ZXJiaS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFJTCxNQUFNLEVBRU4sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sS0FBSyxNQUFNLE1BQU0sZ0JBQWdCLENBQUM7QUFFekMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7OztBQWtCMUQsTUFBTSxPQUFPLG1CQUFtQjtJQWdCOUIsWUFBb0IsaUJBQW9DO1FBQXBDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFQOUMsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFROUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxpQkFBaUIsQ0FBQztJQUMxQyxDQUFDO0lBRUQsZUFBZTtRQUNiLDJFQUEyRTtRQUMzRSxJQUNFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhO1lBQ3RDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxFQUNqQztZQUNBLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztTQUN0RTtJQUNILENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUM3QixPQUFPO1NBQ1I7UUFDRCxNQUFNLEVBQ0osV0FBVyxFQUNYLFNBQVMsRUFDVCxRQUFRLEVBQ1IsRUFBRSxFQUNGLElBQUksRUFDSixJQUFJLEVBQ0osT0FBTyxFQUNSLEdBQUcsT0FBTyxDQUFDO1FBRVosa0NBQWtDO1FBQ2xDOzs7OztXQUtH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WUFDakMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTztTQUMzQyxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxLQUFLLENBQUMsT0FBb0IsRUFBRSxNQUErQjtRQUNqRTs7V0FFRztRQUVILElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFnQixDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxPQUFvQjtRQUN4QixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztJQUN4QixDQUFDOzttSUFsS1UsbUJBQW1CO3VIQUFuQixtQkFBbUIsNFlBSHBCLGlFQUFpRTsyRkFHaEUsbUJBQW1CO2tCQUwvQixTQUFTOytCQUNFLHVCQUF1QixZQUN2QixpRUFBaUU7d0dBS2xFLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLEVBQUU7c0JBQVYsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDSSxRQUFRO3NCQUFqQixNQUFNO2dCQUN3QyxtQkFBbUI7c0JBQWpFLFNBQVM7dUJBQUMsa0JBQWtCLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIE91dHB1dCxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIFZpZXdDaGlsZCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0ICogYXMgcGJpIGZyb20gJ3Bvd2VyYmktY2xpZW50JztcclxuaW1wb3J0ICogYXMgbW9kZWxzIGZyb20gJ3Bvd2VyYmktbW9kZWxzJztcclxuXHJcbmltcG9ydCB7IE5neFBvd2VyQmlTZXJ2aWNlIH0gZnJvbSAnLi9uZ3gtcG93ZXJiaS5zZXJ2aWNlJztcclxuXHJcbmV4cG9ydCBjb25zdCBlbnVtIFRva2VuVHlwZSB7XHJcbiAgQWFkID0gJ0FhZCcsXHJcbiAgRW1iZWQgPSAnRW1iZWQnXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBlbnVtIFJlcG9ydFR5cGUge1xyXG4gIERhc2hib2FyZCA9ICdEYXNoYm9hcmQnLFxyXG4gIFJlcG9ydCA9ICdSZXBvcnQnLFxyXG4gIFRpbGUgPSAnVGlsZSdcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduZ3gtcG93ZXJiaS1jb21wb25lbnQnLFxyXG4gIHRlbXBsYXRlOiAnPGRpdiAjbmd4UG93ZXJCaUlGcmFtZSBzdHlsZT1cImhlaWdodDoxMDAlOyB3aWR0aDogMTAwJTtcIj48L2Rpdj4nLFxyXG4gIHN0eWxlczogW11cclxufSlcclxuZXhwb3J0IGNsYXNzIE5neFBvd2VyQmlDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XHJcbiAgLy8gUHVibGljIHByb3BlcnRpZXNcclxuICBASW5wdXQoKSBhY2Nlc3NUb2tlbjogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHRva2VuVHlwZTogVG9rZW5UeXBlO1xyXG4gIEBJbnB1dCgpIGVtYmVkVXJsOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgaWQ6IHN0cmluZztcclxuICBASW5wdXQoKSB0eXBlOiBSZXBvcnRUeXBlO1xyXG4gIEBJbnB1dCgpIG5hbWU6IHN0cmluZztcclxuICBASW5wdXQoKSBvcHRpb25zOiBtb2RlbHMuSVNldHRpbmdzO1xyXG4gIEBPdXRwdXQoKSBlbWJlZGRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xyXG4gIEBWaWV3Q2hpbGQoJ25neFBvd2VyQmlJRnJhbWUnLCB7c3RhdGljOiB0cnVlfSkgbmd4UG93ZXJCaUlGcmFtZVJlZjogRWxlbWVudFJlZjtcclxuXHJcbiAgLy8gUHJpdmF0ZSBmaWVsZHNcclxuICBwcml2YXRlIGNvbXBvbmVudDogcGJpLkVtYmVkO1xyXG4gIHByaXZhdGUgcG93ZXJCaVNlcnZpY2U6IE5neFBvd2VyQmlTZXJ2aWNlO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG5neFBvd2VyQmlTZXJ2aWNlOiBOZ3hQb3dlckJpU2VydmljZSkge1xyXG4gICAgdGhpcy5wb3dlckJpU2VydmljZSA9IG5neFBvd2VyQmlTZXJ2aWNlO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgLy8gRW1iZWQgdGhlIHJlcG9ydCBpbnNpZGUgdGhlIHZpZXcgY2hpbGQgdGhhdCB3ZSBoYXZlIGZldGNoZWQgZnJvbSB0aGUgRE9NXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMubmd4UG93ZXJCaUlGcmFtZVJlZi5uYXRpdmVFbGVtZW50ICYmXHJcbiAgICAgIHRoaXMudmFsaWRhdGVSZXF1aXJlZEF0dHJpYnV0ZXMoKVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuZW1iZWQodGhpcy5uZ3hQb3dlckJpSUZyYW1lUmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMuZ2V0Q29uZmlnKCkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKCF0aGlzLm5neFBvd2VyQmlJRnJhbWVSZWYpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3Qge1xyXG4gICAgICBhY2Nlc3NUb2tlbixcclxuICAgICAgdG9rZW5UeXBlLFxyXG4gICAgICBlbWJlZFVybCxcclxuICAgICAgaWQsXHJcbiAgICAgIHR5cGUsXHJcbiAgICAgIG5hbWUsXHJcbiAgICAgIG9wdGlvbnNcclxuICAgIH0gPSBjaGFuZ2VzO1xyXG5cclxuICAgIC8vIFRPRE86IFZhbGlkYXRlIHRoZXNlIGNvbmRpdGlvbnNcclxuICAgIC8qaWYgKFxyXG4gICAgICAoYWNjZXNzVG9rZW4ucHJldmlvdXNWYWx1ZSAhPT0gdW5kZWZpbmVkIHx8IGFjY2Vzc1Rva2VuLnByZXZpb3VzVmFsdWUgPT09IGFjY2Vzc1Rva2VuLmN1cnJlbnRWYWx1ZSkgJiZcclxuICAgICAgZW1iZWRVcmwucHJldmlvdXNWYWx1ZSA9PT0gZW1iZWRVcmwuY3VycmVudFZhbHVlXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfSovXHJcblxyXG4gICAgaWYgKHRoaXMudmFsaWRhdGVSZXF1aXJlZEF0dHJpYnV0ZXMoKSkge1xyXG4gICAgICBjb25zdCBjb25maWcgPSB0aGlzLmdldENvbmZpZyhcclxuICAgICAgICBhY2Nlc3NUb2tlbiAmJiBhY2Nlc3NUb2tlbi5jdXJyZW50VmFsdWUsXHJcbiAgICAgICAgdG9rZW5UeXBlICYmIHRva2VuVHlwZS5jdXJyZW50VmFsdWUsXHJcbiAgICAgICAgZW1iZWRVcmwgJiYgZW1iZWRVcmwuY3VycmVudFZhbHVlLFxyXG4gICAgICAgIGlkICYmIGlkLmN1cnJlbnRWYWx1ZSxcclxuICAgICAgICB0eXBlICYmIHR5cGUuY3VycmVudFZhbHVlLFxyXG4gICAgICAgIG5hbWUgJiYgbmFtZS5jdXJyZW50VmFsdWUsXHJcbiAgICAgICAgb3B0aW9ucyAmJiBvcHRpb25zLmN1cnJlbnRWYWx1ZVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmVtYmVkKHRoaXMubmd4UG93ZXJCaUlGcmFtZVJlZi5uYXRpdmVFbGVtZW50LCBjb25maWcpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbXBvbmVudCkge1xyXG4gICAgICB0aGlzLnJlc2V0KHRoaXMubmd4UG93ZXJCaUlGcmFtZVJlZi5uYXRpdmVFbGVtZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgaWYgKHRoaXMuY29tcG9uZW50KSB7XHJcbiAgICAgIHRoaXMucmVzZXQodGhpcy5uZ3hQb3dlckJpSUZyYW1lUmVmLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW5zdXJlIHJlcXVpcmVkIGF0dHJpYnV0ZXMgKGVtYmVkVXJsIGFuZCBhY2Nlc3NUb2tlbiBhcmUgdmFsaWQgYmVmb3JlIGF0dGVtcHRpbmcgdG8gZW1iZWQpXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB2YWxpZGF0ZVJlcXVpcmVkQXR0cmlidXRlcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHR5cGVvZiB0aGlzLmVtYmVkVXJsID09PSAnc3RyaW5nJyAmJlxyXG4gICAgICB0aGlzLmVtYmVkVXJsLmxlbmd0aCA+IDAgJiZcclxuICAgICAgKHR5cGVvZiB0aGlzLmFjY2Vzc1Rva2VuID09PSAnc3RyaW5nJyAmJiB0aGlzLmFjY2Vzc1Rva2VuLmxlbmd0aCA+IDApXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBtb2RlbCBjbGFzcyBjb21wYXRpYmxlIHRva2VuIGVudW0gZnJvbSBvdXIgdG9rZW4gdHlwZSBlbnVtXHJcbiAgICogQHBhcmFtIHRva2VuVHlwZSAtIFRva2VuIHR5cGUgaW4gb3VyIGN1c3RvbSBlbnVtIGZvcm1hdFxyXG4gICAqIEByZXR1cm5zIFRva2VuIHR5cGUgaW4gcG93ZXJiaS1tb2RlbHMuVG9rZW5UeXBlIGVudW0gZm9ybWF0XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRUb2tlblR5cGUodG9rZW5UeXBlOiBUb2tlblR5cGUpOiBtb2RlbHMuVG9rZW5UeXBlIHtcclxuICAgIGlmICh0b2tlblR5cGUpIHtcclxuICAgICAgc3dpdGNoICh0b2tlblR5cGUpIHtcclxuICAgICAgICBjYXNlIFRva2VuVHlwZS5BYWQ6XHJcbiAgICAgICAgICByZXR1cm4gbW9kZWxzLlRva2VuVHlwZS5BYWQ7XHJcbiAgICAgICAgY2FzZSBUb2tlblR5cGUuRW1iZWQ6XHJcbiAgICAgICAgICByZXR1cm4gbW9kZWxzLlRva2VuVHlwZS5FbWJlZDtcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgcmV0dXJuIG1vZGVscy5Ub2tlblR5cGUuQWFkO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBkZWZhdWx0IGlzIEFBRFxyXG4gICAgICByZXR1cm4gbW9kZWxzLlRva2VuVHlwZS5BYWQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIGFuIGVtYmVkIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG4gICAqIEBwYXJhbSBhY2Nlc3NUb2tlbiAtIEFjY2VzcyB0b2tlbiByZXF1aXJlZCB0byBlbWJlZCBhIGNvbXBvbmVudFxyXG4gICAqIEBwYXJhbSB0b2tlblR5cGUgLSB0eXBlIG9mIGFjY2Vzc1Rva2VuOiBBYWQgb3IgRW1iZWRcclxuICAgKiBAcGFyYW0gZW1iZWRVcmwgLSBFbWJlZCBVUkwgb2J0YWluZWQgdGhyb3VnaCBQb3dlciBCSSBSRVNUIEFQSSBvciBQb3J0YWxcclxuICAgKiBAcGFyYW0gaWQgLSBjb21wb25lbnQvZWxlbWVudCBHVUlEXHJcbiAgICogQHBhcmFtIHR5cGUgLSB0eXBlIG9mIGVtYmVkZGVkIGNvbXBvbmVudCBlLmcuICdkYXNoYm9hcmQsIHJlcG9ydCBvciB0aWxlJ1xyXG4gICAqIEBwYXJhbSBuYW1lIC0gbmFtZSBvZiB0aGUgZW1iZWRkZWQgY29tcG9uZW50XHJcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBFbWJlZCBjb25maWd1cmF0aW9uIG9wdGlvbnNcclxuICAgKiBAcmV0dXJucyBFbWJlZCBjb25maWd1cmF0aW9uIG9iamVjdFxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0Q29uZmlnKFxyXG4gICAgYWNjZXNzVG9rZW4/OiBzdHJpbmcsXHJcbiAgICB0b2tlblR5cGU/OiBUb2tlblR5cGUsXHJcbiAgICBlbWJlZFVybD86IHN0cmluZyxcclxuICAgIGlkPzogc3RyaW5nLFxyXG4gICAgdHlwZT86IFJlcG9ydFR5cGUsXHJcbiAgICBuYW1lPzogc3RyaW5nLFxyXG4gICAgb3B0aW9ucz86IG1vZGVscy5JU2V0dGluZ3NcclxuICApOiBwYmkuSUVtYmVkQ29uZmlndXJhdGlvbiB7XHJcbiAgICAvLyBGb3IgbnVsbCBhcmd1bWVudHMgLSB1c2UgdGhlIGluaXRpYWwgdmFsdWVcclxuICAgIC8vIEZvciBzcGVjaWZpZWQgYXJndW1lbnRzIC0gdXNlIHRoZSBjdXJyZW50IHZhbHVlXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0eXBlOiB0eXBlID8gdHlwZSA6IHRoaXMudHlwZSA/IHRoaXMudHlwZSA6IFJlcG9ydFR5cGUuUmVwb3J0LFxyXG4gICAgICBlbWJlZFVybDogZW1iZWRVcmwgPyBlbWJlZFVybCA6IHRoaXMuZW1iZWRVcmwsXHJcbiAgICAgIGFjY2Vzc1Rva2VuOiBhY2Nlc3NUb2tlbiA/IGFjY2Vzc1Rva2VuIDogdGhpcy5hY2Nlc3NUb2tlbixcclxuICAgICAgdG9rZW5UeXBlOiB0b2tlblR5cGVcclxuICAgICAgICA/IHRoaXMuZ2V0VG9rZW5UeXBlKHRva2VuVHlwZSlcclxuICAgICAgICA6IHRoaXMuZ2V0VG9rZW5UeXBlKHRoaXMudG9rZW5UeXBlKSxcclxuICAgICAgaWQ6IGlkID8gaWQgOiB0aGlzLmlkLFxyXG4gICAgICB1bmlxdWVJZDogbmFtZSA/IG5hbWUgOiB0aGlzLm5hbWUsXHJcbiAgICAgIHNldHRpbmdzOiBvcHRpb25zID8gb3B0aW9ucyA6IHRoaXMub3B0aW9uc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdpdmVuIGFuIEhUTUxFbGVtZW50LCBjb25zdHJ1Y3QgYW4gZW1iZWQgY29uZmlndXJhdGlvbiBiYXNlZCBvbiBhdHRyaWJ1dGVzIGFuZCBwYXNzIHRvIHNlcnZpY2UuXHJcbiAgICogQHBhcmFtIGVsZW1lbnQgLSBuYXRpdmUgZWxlbWVudCB3aGVyZSB0aGUgZW1iZWRkaW5nIG5lZWRzIHRvIGJlIGRvbmVcclxuICAgKiBAcGFyYW0gY29uZmlnIC0gY29uZmlndXJhdGlvbiB0byBiZSBlbWJlZGRlZFxyXG4gICAqL1xyXG4gIHByaXZhdGUgZW1iZWQoZWxlbWVudDogSFRNTEVsZW1lbnQsIGNvbmZpZzogcGJpLklFbWJlZENvbmZpZ3VyYXRpb24pIHtcclxuICAgIC8qaWYgKHRoaXMub3B0aW9ucykge1xyXG4gICAgICBjb25zdCBuZXdDb25maWcgPSB7IGNvbmZpZywgLi4udGhpcy5vcHRpb25zIH07XHJcbiAgICB9Ki9cclxuXHJcbiAgICB0aGlzLmNvbXBvbmVudCA9IHRoaXMucG93ZXJCaVNlcnZpY2UuZW1iZWQoZWxlbWVudCwgY29uZmlnKTtcclxuICAgIHRoaXMuZW1iZWRkZWQuZW1pdCh0aGlzLmNvbXBvbmVudCBhcyBhbnkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzZXQgdGhlIGNvbXBvbmVudCB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSBET00uXHJcbiAgICogQHBhcmFtIGVsZW1lbnQgLSBuYXRpdmUgZWxlbWVudCB3aGVyZSB0aGUgZW1iZWRkZWQgd2FzIG1hZGVcclxuICAgKi9cclxuICByZXNldChlbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG4gICAgdGhpcy5wb3dlckJpU2VydmljZS5yZXNldChlbGVtZW50KTtcclxuICAgIHRoaXMuY29tcG9uZW50ID0gbnVsbDtcclxuICB9XHJcbn1cclxuIl19