UNPKG

@deliverysolutions/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 19.3 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: "15.2.9", ngImport: i0, type: NgxPowerBiComponent, deps: [{ token: i1.NgxPowerBiService }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ NgxPowerBiComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", 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: "15.2.9", 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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WUFDakMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTztTQUMzQyxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxLQUFLLENBQUMsT0FBb0IsRUFBRSxNQUErQjtRQUNqRTs7V0FFRztRQUVILElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFnQixDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxPQUFvQjtRQUN4QixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztJQUN4QixDQUFDOzttSUFsS1UsbUJBQW1CO3VIQUFuQixtQkFBbUIsNFlBSHBCLGlFQUFpRTsyRkFHaEUsbUJBQW1CO2tCQUwvQixTQUFTOytCQUNFLHVCQUF1QixZQUN2QixpRUFBaUU7d0dBS2xFLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLEVBQUU7c0JBQVYsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDSSxRQUFRO3NCQUFqQixNQUFNO2dCQUN3QyxtQkFBbUI7c0JBQWpFLFNBQVM7dUJBQUMsa0JBQWtCLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgcGJpIGZyb20gJ3Bvd2VyYmktY2xpZW50JztcbmltcG9ydCAqIGFzIG1vZGVscyBmcm9tICdwb3dlcmJpLW1vZGVscyc7XG5cbmltcG9ydCB7IE5neFBvd2VyQmlTZXJ2aWNlIH0gZnJvbSAnLi9uZ3gtcG93ZXJiaS5zZXJ2aWNlJztcblxuZXhwb3J0IGNvbnN0IGVudW0gVG9rZW5UeXBlIHtcbiAgQWFkID0gJ0FhZCcsXG4gIEVtYmVkID0gJ0VtYmVkJ1xufVxuXG5leHBvcnQgY29uc3QgZW51bSBSZXBvcnRUeXBlIHtcbiAgRGFzaGJvYXJkID0gJ0Rhc2hib2FyZCcsXG4gIFJlcG9ydCA9ICdSZXBvcnQnLFxuICBUaWxlID0gJ1RpbGUnXG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1wb3dlcmJpLWNvbXBvbmVudCcsXG4gIHRlbXBsYXRlOiAnPGRpdiAjbmd4UG93ZXJCaUlGcmFtZSBzdHlsZT1cImhlaWdodDoxMDAlOyB3aWR0aDogMTAwJTtcIj48L2Rpdj4nLFxuICBzdHlsZXM6IFtdXG59KVxuZXhwb3J0IGNsYXNzIE5neFBvd2VyQmlDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIC8vIFB1YmxpYyBwcm9wZXJ0aWVzXG4gIEBJbnB1dCgpIGFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHRva2VuVHlwZTogVG9rZW5UeXBlO1xuICBASW5wdXQoKSBlbWJlZFVybDogc3RyaW5nO1xuICBASW5wdXQoKSBpZDogc3RyaW5nO1xuICBASW5wdXQoKSB0eXBlOiBSZXBvcnRUeXBlO1xuICBASW5wdXQoKSBuYW1lOiBzdHJpbmc7XG4gIEBJbnB1dCgpIG9wdGlvbnM6IG1vZGVscy5JU2V0dGluZ3M7XG4gIEBPdXRwdXQoKSBlbWJlZGRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAVmlld0NoaWxkKCduZ3hQb3dlckJpSUZyYW1lJywge3N0YXRpYzogdHJ1ZX0pIG5neFBvd2VyQmlJRnJhbWVSZWY6IEVsZW1lbnRSZWY7XG5cbiAgLy8gUHJpdmF0ZSBmaWVsZHNcbiAgcHJpdmF0ZSBjb21wb25lbnQ6IHBiaS5FbWJlZDtcbiAgcHJpdmF0ZSBwb3dlckJpU2VydmljZTogTmd4UG93ZXJCaVNlcnZpY2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBuZ3hQb3dlckJpU2VydmljZTogTmd4UG93ZXJCaVNlcnZpY2UpIHtcbiAgICB0aGlzLnBvd2VyQmlTZXJ2aWNlID0gbmd4UG93ZXJCaVNlcnZpY2U7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgLy8gRW1iZWQgdGhlIHJlcG9ydCBpbnNpZGUgdGhlIHZpZXcgY2hpbGQgdGhhdCB3ZSBoYXZlIGZldGNoZWQgZnJvbSB0aGUgRE9NXG4gICAgaWYgKFxuICAgICAgdGhpcy5uZ3hQb3dlckJpSUZyYW1lUmVmLm5hdGl2ZUVsZW1lbnQgJiZcbiAgICAgIHRoaXMudmFsaWRhdGVSZXF1aXJlZEF0dHJpYnV0ZXMoKVxuICAgICkge1xuICAgICAgdGhpcy5lbWJlZCh0aGlzLm5neFBvd2VyQmlJRnJhbWVSZWYubmF0aXZlRWxlbWVudCwgdGhpcy5nZXRDb25maWcoKSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmICghdGhpcy5uZ3hQb3dlckJpSUZyYW1lUmVmKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGFjY2Vzc1Rva2VuLFxuICAgICAgdG9rZW5UeXBlLFxuICAgICAgZW1iZWRVcmwsXG4gICAgICBpZCxcbiAgICAgIHR5cGUsXG4gICAgICBuYW1lLFxuICAgICAgb3B0aW9uc1xuICAgIH0gPSBjaGFuZ2VzO1xuXG4gICAgLy8gVE9ETzogVmFsaWRhdGUgdGhlc2UgY29uZGl0aW9uc1xuICAgIC8qaWYgKFxuICAgICAgKGFjY2Vzc1Rva2VuLnByZXZpb3VzVmFsdWUgIT09IHVuZGVmaW5lZCB8fCBhY2Nlc3NUb2tlbi5wcmV2aW91c1ZhbHVlID09PSBhY2Nlc3NUb2tlbi5jdXJyZW50VmFsdWUpICYmXG4gICAgICBlbWJlZFVybC5wcmV2aW91c1ZhbHVlID09PSBlbWJlZFVybC5jdXJyZW50VmFsdWVcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9Ki9cblxuICAgIGlmICh0aGlzLnZhbGlkYXRlUmVxdWlyZWRBdHRyaWJ1dGVzKCkpIHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlnKFxuICAgICAgICBhY2Nlc3NUb2tlbiAmJiBhY2Nlc3NUb2tlbi5jdXJyZW50VmFsdWUsXG4gICAgICAgIHRva2VuVHlwZSAmJiB0b2tlblR5cGUuY3VycmVudFZhbHVlLFxuICAgICAgICBlbWJlZFVybCAmJiBlbWJlZFVybC5jdXJyZW50VmFsdWUsXG4gICAgICAgIGlkICYmIGlkLmN1cnJlbnRWYWx1ZSxcbiAgICAgICAgdHlwZSAmJiB0eXBlLmN1cnJlbnRWYWx1ZSxcbiAgICAgICAgbmFtZSAmJiBuYW1lLmN1cnJlbnRWYWx1ZSxcbiAgICAgICAgb3B0aW9ucyAmJiBvcHRpb25zLmN1cnJlbnRWYWx1ZVxuICAgICAgKTtcbiAgICAgIHRoaXMuZW1iZWQodGhpcy5uZ3hQb3dlckJpSUZyYW1lUmVmLm5hdGl2ZUVsZW1lbnQsIGNvbmZpZyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbXBvbmVudCkge1xuICAgICAgdGhpcy5yZXNldCh0aGlzLm5neFBvd2VyQmlJRnJhbWVSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuY29tcG9uZW50KSB7XG4gICAgICB0aGlzLnJlc2V0KHRoaXMubmd4UG93ZXJCaUlGcmFtZVJlZi5uYXRpdmVFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlIHJlcXVpcmVkIGF0dHJpYnV0ZXMgKGVtYmVkVXJsIGFuZCBhY2Nlc3NUb2tlbiBhcmUgdmFsaWQgYmVmb3JlIGF0dGVtcHRpbmcgdG8gZW1iZWQpXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlUmVxdWlyZWRBdHRyaWJ1dGVzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0eXBlb2YgdGhpcy5lbWJlZFVybCA9PT0gJ3N0cmluZycgJiZcbiAgICAgIHRoaXMuZW1iZWRVcmwubGVuZ3RoID4gMCAmJlxuICAgICAgKHR5cGVvZiB0aGlzLmFjY2Vzc1Rva2VuID09PSAnc3RyaW5nJyAmJiB0aGlzLmFjY2Vzc1Rva2VuLmxlbmd0aCA+IDApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG1vZGVsIGNsYXNzIGNvbXBhdGlibGUgdG9rZW4gZW51bSBmcm9tIG91ciB0b2tlbiB0eXBlIGVudW1cbiAgICogQHBhcmFtIHRva2VuVHlwZSAtIFRva2VuIHR5cGUgaW4gb3VyIGN1c3RvbSBlbnVtIGZvcm1hdFxuICAgKiBAcmV0dXJucyBUb2tlbiB0eXBlIGluIHBvd2VyYmktbW9kZWxzLlRva2VuVHlwZSBlbnVtIGZvcm1hdFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRUb2tlblR5cGUodG9rZW5UeXBlOiBUb2tlblR5cGUpOiBtb2RlbHMuVG9rZW5UeXBlIHtcbiAgICBpZiAodG9rZW5UeXBlKSB7XG4gICAgICBzd2l0Y2ggKHRva2VuVHlwZSkge1xuICAgICAgICBjYXNlIFRva2VuVHlwZS5BYWQ6XG4gICAgICAgICAgcmV0dXJuIG1vZGVscy5Ub2tlblR5cGUuQWFkO1xuICAgICAgICBjYXNlIFRva2VuVHlwZS5FbWJlZDpcbiAgICAgICAgICByZXR1cm4gbW9kZWxzLlRva2VuVHlwZS5FbWJlZDtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gbW9kZWxzLlRva2VuVHlwZS5BYWQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGRlZmF1bHQgaXMgQUFEXG4gICAgICByZXR1cm4gbW9kZWxzLlRva2VuVHlwZS5BYWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gZW1iZWQgY29uZmlndXJhdGlvbiBvYmplY3QuXG4gICAqIEBwYXJhbSBhY2Nlc3NUb2tlbiAtIEFjY2VzcyB0b2tlbiByZXF1aXJlZCB0byBlbWJlZCBhIGNvbXBvbmVudFxuICAgKiBAcGFyYW0gdG9rZW5UeXBlIC0gdHlwZSBvZiBhY2Nlc3NUb2tlbjogQWFkIG9yIEVtYmVkXG4gICAqIEBwYXJhbSBlbWJlZFVybCAtIEVtYmVkIFVSTCBvYnRhaW5lZCB0aHJvdWdoIFBvd2VyIEJJIFJFU1QgQVBJIG9yIFBvcnRhbFxuICAgKiBAcGFyYW0gaWQgLSBjb21wb25lbnQvZWxlbWVudCBHVUlEXG4gICAqIEBwYXJhbSB0eXBlIC0gdHlwZSBvZiBlbWJlZGRlZCBjb21wb25lbnQgZS5nLiAnZGFzaGJvYXJkLCByZXBvcnQgb3IgdGlsZSdcbiAgICogQHBhcmFtIG5hbWUgLSBuYW1lIG9mIHRoZSBlbWJlZGRlZCBjb21wb25lbnRcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBFbWJlZCBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICogQHJldHVybnMgRW1iZWQgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICovXG4gIHByaXZhdGUgZ2V0Q29uZmlnKFxuICAgIGFjY2Vzc1Rva2VuPzogc3RyaW5nLFxuICAgIHRva2VuVHlwZT86IFRva2VuVHlwZSxcbiAgICBlbWJlZFVybD86IHN0cmluZyxcbiAgICBpZD86IHN0cmluZyxcbiAgICB0eXBlPzogUmVwb3J0VHlwZSxcbiAgICBuYW1lPzogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBtb2RlbHMuSVNldHRpbmdzXG4gICk6IHBiaS5JRW1iZWRDb25maWd1cmF0aW9uIHtcbiAgICAvLyBGb3IgbnVsbCBhcmd1bWVudHMgLSB1c2UgdGhlIGluaXRpYWwgdmFsdWVcbiAgICAvLyBGb3Igc3BlY2lmaWVkIGFyZ3VtZW50cyAtIHVzZSB0aGUgY3VycmVudCB2YWx1ZVxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiB0eXBlID8gdHlwZSA6IHRoaXMudHlwZSA/IHRoaXMudHlwZSA6IFJlcG9ydFR5cGUuUmVwb3J0LFxuICAgICAgZW1iZWRVcmw6IGVtYmVkVXJsID8gZW1iZWRVcmwgOiB0aGlzLmVtYmVkVXJsLFxuICAgICAgYWNjZXNzVG9rZW46IGFjY2Vzc1Rva2VuID8gYWNjZXNzVG9rZW4gOiB0aGlzLmFjY2Vzc1Rva2VuLFxuICAgICAgdG9rZW5UeXBlOiB0b2tlblR5cGVcbiAgICAgICAgPyB0aGlzLmdldFRva2VuVHlwZSh0b2tlblR5cGUpXG4gICAgICAgIDogdGhpcy5nZXRUb2tlblR5cGUodGhpcy50b2tlblR5cGUpLFxuICAgICAgaWQ6IGlkID8gaWQgOiB0aGlzLmlkLFxuICAgICAgdW5pcXVlSWQ6IG5hbWUgPyBuYW1lIDogdGhpcy5uYW1lLFxuICAgICAgc2V0dGluZ3M6IG9wdGlvbnMgPyBvcHRpb25zIDogdGhpcy5vcHRpb25zXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhbiBIVE1MRWxlbWVudCwgY29uc3RydWN0IGFuIGVtYmVkIGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gYXR0cmlidXRlcyBhbmQgcGFzcyB0byBzZXJ2aWNlLlxuICAgKiBAcGFyYW0gZWxlbWVudCAtIG5hdGl2ZSBlbGVtZW50IHdoZXJlIHRoZSBlbWJlZGRpbmcgbmVlZHMgdG8gYmUgZG9uZVxuICAgKiBAcGFyYW0gY29uZmlnIC0gY29uZmlndXJhdGlvbiB0byBiZSBlbWJlZGRlZFxuICAgKi9cbiAgcHJpdmF0ZSBlbWJlZChlbGVtZW50OiBIVE1MRWxlbWVudCwgY29uZmlnOiBwYmkuSUVtYmVkQ29uZmlndXJhdGlvbikge1xuICAgIC8qaWYgKHRoaXMub3B0aW9ucykge1xuICAgICAgY29uc3QgbmV3Q29uZmlnID0geyBjb25maWcsIC4uLnRoaXMub3B0aW9ucyB9O1xuICAgIH0qL1xuXG4gICAgdGhpcy5jb21wb25lbnQgPSB0aGlzLnBvd2VyQmlTZXJ2aWNlLmVtYmVkKGVsZW1lbnQsIGNvbmZpZyk7XG4gICAgdGhpcy5lbWJlZGRlZC5lbWl0KHRoaXMuY29tcG9uZW50IGFzIGFueSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhlIGNvbXBvbmVudCB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSBET00uXG4gICAqIEBwYXJhbSBlbGVtZW50IC0gbmF0aXZlIGVsZW1lbnQgd2hlcmUgdGhlIGVtYmVkZGVkIHdhcyBtYWRlXG4gICAqL1xuICByZXNldChlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMucG93ZXJCaVNlcnZpY2UucmVzZXQoZWxlbWVudCk7XG4gICAgdGhpcy5jb21wb25lbnQgPSBudWxsO1xuICB9XG59XG4iXX0=