ngx-gem-spaas
Version:
This library contains services, components, images and styles to provide a unified look and way-of-working throughout GEM SPaaS.
90 lines • 19.4 kB
JavaScript
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { timer } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { BaseComponent } from "../base/base.component";
import * as i0 from "@angular/core";
import * as i1 from "../_services/config.service";
import * as i2 from "../_services/embed-mode.service";
import * as i3 from "../_services/okta.service";
import * as i4 from "@angular/material/progress-bar";
import * as i5 from "../bg/bg.component";
import * as i6 from "@angular/common";
export class IntroComponent extends BaseComponent {
constructor(configService, embedModeService, oktaService) {
super();
this.configService = configService;
this.embedModeService = embedModeService;
this.oktaService = oktaService;
this.introText = 'all good, loading your data';
this.checkingAccessText = 'checking your access';
this.tryAgainButtonTitle = 'try again';
this.contactGuardButtonTitle = 'contact guard';
this.goToSnowButtonTitle = 'request access in Snow';
this.bgImg = 'employee_solar';
this.isDone = false;
this.introDone = new EventEmitter();
this.oktaError = null;
this.userReceived = false;
this.isIframe = false;
this.config = this.configService.getConfig();
this.isIframe = this.embedModeService.getEmbedMode().isIframe();
this.onUserInfo();
this.onOktaError();
}
onUserInfo() {
this.oktaService.onNewUserInfo()
.pipe(takeUntil(this.onDestroy$))
.subscribe((user) => {
if (user?.email) {
this.userReceived = true;
// emit that all is well, so the screen can already start rendering
this.introDone.emit(true);
// and only hide the okta itself after n ms
timer(1400)
.pipe(takeUntil(this.onDestroy$))
.subscribe(() => {
this.isDone = true;
});
}
});
}
onOktaError() {
this.oktaService.onNewOktaError()
.pipe(takeUntil(this.onDestroy$))
.subscribe((error) => {
this.oktaError = error;
});
}
oktaTryAgain() {
this.oktaService.forceRetry();
}
contactGuard() {
const body = 'Following error was received trying to sign in to ' + this.config?.cleanAppName + ':\r\n\r\n' +
JSON.stringify(this.oktaError);
window.location.href = `mailto:5939.com?subject=Okta sign-in error for ${this.config?.cleanAppName}&body=${encodeURIComponent(body)}`;
}
goToSnow() {
window.open('https://gemprod.service-now.com/gem', '_blank');
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: IntroComponent, deps: [{ token: i1.ConfigService }, { token: i2.EmbedModeService }, { token: i3.OktaService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: IntroComponent, selector: "spaas-okta-intro", inputs: { introText: "introText", checkingAccessText: "checkingAccessText", tryAgainButtonTitle: "tryAgainButtonTitle", contactGuardButtonTitle: "contactGuardButtonTitle", goToSnowButtonTitle: "goToSnowButtonTitle", bgImg: "bgImg" }, outputs: { introDone: "introDone" }, usesInheritance: true, ngImport: i0, template: "@if (!isDone) {\r\n <div [class.in-iframe]=\"isIframe\"\r\n class=\"intro\">\r\n @if (!isIframe) {\r\n <div class=\"half-screen flex col center\">\r\n <!-- LOGO -->\r\n <div class=\"half-screen__logo flex center\">\r\n <svg viewBox=\"0 0 512 256\">\r\n <use [attr.xlink:href]=\"'../../assets/images/logo-engie.svg#svg1'\"></use>\r\n </svg>\r\n </div>\r\n @if (oktaError) {\r\n <!-- HAS OKTA ERROR -->\r\n <div class=\"txt-center\">\r\n <div class=\"txt-bold\">Bumped into an error:</div>\r\n <div>{{ oktaError.message }}</div>\r\n <div class=\"flex center pad-big-top column-gap-10\">\r\n <button (click)=\"oktaTryAgain()\" class=\"primary\">\r\n {{ tryAgainButtonTitle }}\r\n </button>\r\n @if ((oktaError.errorCode | lowercase) === 'access_denied') {\r\n <button (click)=\"goToSnow()\" class=\"error\">\r\n {{ goToSnowButtonTitle }}\r\n </button>\r\n } @else {\r\n <button (click)=\"contactGuard()\" class=\"error\">\r\n {{ contactGuardButtonTitle }}\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n } @else {\r\n <!-- NO OKTA ERROR -->\r\n <div class=\"txt-center pad-big-bottom\">\r\n <div class=\"pad-big-bottom\">\r\n {{ userReceived ? introText : checkingAccessText }}\r\n </div>\r\n <mat-progress-bar [mode]=\"'indeterminate'\"></mat-progress-bar>\r\n </div>\r\n }\r\n </div>\r\n <spaas-bg [bgImg]=\"bgImg\"></spaas-bg>\r\n } @else {\r\n <div>\r\n loading embedded {{ config.cleanAppName }}\r\n <mat-progress-bar [mode]=\"'indeterminate'\"></mat-progress-bar>\r\n </div>\r\n }\r\n </div>\r\n}\r\n", styles: [".intro{background-color:hsla(var(--bg-h),var(--bg-s),var(--bg-l),1);height:100vh;left:0;position:fixed;top:0;width:100%;z-index:9999}.intro.in-iframe{display:flex;flex-flow:column;font-family:BebasNeue,Lato,Arial,sans-serif;font-size:18px;justify-content:center;text-align:center}.intro.in-iframe>div{margin:auto;width:344px}\n"], dependencies: [{ kind: "component", type: i4.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i5.BgComponent, selector: "spaas-bg", inputs: ["bgX", "bgY", "bgPortrait", "bgImg", "bgAnimate"] }, { kind: "pipe", type: i6.LowerCasePipe, name: "lowercase" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: IntroComponent, decorators: [{
type: Component,
args: [{ selector: 'spaas-okta-intro', template: "@if (!isDone) {\r\n <div [class.in-iframe]=\"isIframe\"\r\n class=\"intro\">\r\n @if (!isIframe) {\r\n <div class=\"half-screen flex col center\">\r\n <!-- LOGO -->\r\n <div class=\"half-screen__logo flex center\">\r\n <svg viewBox=\"0 0 512 256\">\r\n <use [attr.xlink:href]=\"'../../assets/images/logo-engie.svg#svg1'\"></use>\r\n </svg>\r\n </div>\r\n @if (oktaError) {\r\n <!-- HAS OKTA ERROR -->\r\n <div class=\"txt-center\">\r\n <div class=\"txt-bold\">Bumped into an error:</div>\r\n <div>{{ oktaError.message }}</div>\r\n <div class=\"flex center pad-big-top column-gap-10\">\r\n <button (click)=\"oktaTryAgain()\" class=\"primary\">\r\n {{ tryAgainButtonTitle }}\r\n </button>\r\n @if ((oktaError.errorCode | lowercase) === 'access_denied') {\r\n <button (click)=\"goToSnow()\" class=\"error\">\r\n {{ goToSnowButtonTitle }}\r\n </button>\r\n } @else {\r\n <button (click)=\"contactGuard()\" class=\"error\">\r\n {{ contactGuardButtonTitle }}\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n } @else {\r\n <!-- NO OKTA ERROR -->\r\n <div class=\"txt-center pad-big-bottom\">\r\n <div class=\"pad-big-bottom\">\r\n {{ userReceived ? introText : checkingAccessText }}\r\n </div>\r\n <mat-progress-bar [mode]=\"'indeterminate'\"></mat-progress-bar>\r\n </div>\r\n }\r\n </div>\r\n <spaas-bg [bgImg]=\"bgImg\"></spaas-bg>\r\n } @else {\r\n <div>\r\n loading embedded {{ config.cleanAppName }}\r\n <mat-progress-bar [mode]=\"'indeterminate'\"></mat-progress-bar>\r\n </div>\r\n }\r\n </div>\r\n}\r\n", styles: [".intro{background-color:hsla(var(--bg-h),var(--bg-s),var(--bg-l),1);height:100vh;left:0;position:fixed;top:0;width:100%;z-index:9999}.intro.in-iframe{display:flex;flex-flow:column;font-family:BebasNeue,Lato,Arial,sans-serif;font-size:18px;justify-content:center;text-align:center}.intro.in-iframe>div{margin:auto;width:344px}\n"] }]
}], ctorParameters: () => [{ type: i1.ConfigService }, { type: i2.EmbedModeService }, { type: i3.OktaService }], propDecorators: { introText: [{
type: Input
}], checkingAccessText: [{
type: Input
}], tryAgainButtonTitle: [{
type: Input
}], contactGuardButtonTitle: [{
type: Input
}], goToSnowButtonTitle: [{
type: Input
}], bgImg: [{
type: Input
}], introDone: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50cm8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWdlbS1zcGFhcy9zcmMvaW50cm8vaW50cm8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWdlbS1zcGFhcy9zcmMvaW50cm8vaW50cm8uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNyRSxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzNCLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUd6QyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7Ozs7Ozs7O0FBWXJELE1BQU0sT0FBTyxjQUFlLFNBQVEsYUFBYTtJQWtCL0MsWUFDVSxhQUE0QixFQUM1QixnQkFBa0MsRUFDbEMsV0FBd0I7UUFFaEMsS0FBSyxFQUFFLENBQUM7UUFKQSxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBbkJ6QixjQUFTLEdBQUcsNkJBQTZCLENBQUM7UUFDMUMsdUJBQWtCLEdBQUcsc0JBQXNCLENBQUM7UUFDNUMsd0JBQW1CLEdBQUcsV0FBVyxDQUFDO1FBQ2xDLDRCQUF1QixHQUFHLGVBQWUsQ0FBQztRQUMxQyx3QkFBbUIsR0FBRyx3QkFBd0IsQ0FBQztRQUMvQyxVQUFLLEdBQVcsZ0JBQWdCLENBQUM7UUFFMUMsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUNFLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBRXpELGNBQVMsR0FBc0IsSUFBSSxDQUFDO1FBQ3BDLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBRXJCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFTZixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDN0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRU8sVUFBVTtRQUNoQixJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRTthQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUNoQyxTQUFTLENBQ1IsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNQLElBQUksSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO2dCQUNoQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztnQkFDekIsbUVBQW1FO2dCQUNuRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDMUIsMkNBQTJDO2dCQUMzQyxLQUFLLENBQUMsSUFBSSxDQUFDO3FCQUNSLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO3FCQUNoQyxTQUFTLENBQUMsR0FBRyxFQUFFO29CQUNkLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO2dCQUNyQixDQUFDLENBQUMsQ0FBQztZQUNQLENBQUM7UUFDSCxDQUFDLENBQ0YsQ0FBQztJQUNOLENBQUM7SUFFTyxXQUFXO1FBQ2pCLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFO2FBQzlCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ2hDLFNBQVMsQ0FDUixDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1IsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDekIsQ0FBQyxDQUNGLENBQUM7SUFDTixDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVELFlBQVk7UUFDVixNQUFNLElBQUksR0FBRyxvREFBb0QsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLFlBQVksR0FBRyxXQUFXO1lBQ3pHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLHdEQUF3RCxJQUFJLENBQUMsTUFBTSxFQUFFLFlBQVksU0FBUyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO0lBQzlJLENBQUM7SUFFRCxRQUFRO1FBQ1AsTUFBTSxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM5RCxDQUFDOytHQXhFVSxjQUFjO21HQUFkLGNBQWMsOFZDakIzQiw0NURBa0RBOzs0RkRqQ2EsY0FBYztrQkFOMUIsU0FBUzsrQkFDRSxrQkFBa0I7MklBT25CLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyx1QkFBdUI7c0JBQS9CLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFHVyxTQUFTO3NCQUF6QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7dGltZXJ9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge3Rha2VVbnRpbH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQge09rdGFTZXJ2aWNlfSBmcm9tIFwiLi4vX3NlcnZpY2VzL29rdGEuc2VydmljZVwiO1xyXG5pbXBvcnQge0JnVHlwZX0gZnJvbSBcIi4uL19tb2RlbHMvYmcubW9kZWxcIjtcclxuaW1wb3J0IHtCYXNlQ29tcG9uZW50fSBmcm9tIFwiLi4vYmFzZS9iYXNlLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge0VtYmVkTW9kZVNlcnZpY2V9IGZyb20gXCIuLi9fc2VydmljZXMvZW1iZWQtbW9kZS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7Q29uZmlnU2VydmljZX0gZnJvbSBcIi4uL19zZXJ2aWNlcy9jb25maWcuc2VydmljZVwiO1xyXG5pbXBvcnQge1NwYWFzRXh0Q29uZmlnTW9kZWx9IGZyb20gXCIuLi9fbW9kZWxzL2NvbmZpZy5tb2RlbFwiO1xyXG5pbXBvcnQge09BdXRoRXJyb3J9IGZyb20gXCJAb2t0YS9va3RhLWF1dGgtanNcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc3BhYXMtb2t0YS1pbnRybycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2ludHJvLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9pbnRyby5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgSW50cm9Db21wb25lbnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcclxuXHJcbiAgQElucHV0KCkgaW50cm9UZXh0ID0gJ2FsbCBnb29kLCBsb2FkaW5nIHlvdXIgZGF0YSc7XHJcbiAgQElucHV0KCkgY2hlY2tpbmdBY2Nlc3NUZXh0ID0gJ2NoZWNraW5nIHlvdXIgYWNjZXNzJztcclxuICBASW5wdXQoKSB0cnlBZ2FpbkJ1dHRvblRpdGxlID0gJ3RyeSBhZ2Fpbic7XHJcbiAgQElucHV0KCkgY29udGFjdEd1YXJkQnV0dG9uVGl0bGUgPSAnY29udGFjdCBndWFyZCc7XHJcbiAgQElucHV0KCkgZ29Ub1Nub3dCdXR0b25UaXRsZSA9ICdyZXF1ZXN0IGFjY2VzcyBpbiBTbm93JztcclxuICBASW5wdXQoKSBiZ0ltZzogQmdUeXBlID0gJ2VtcGxveWVlX3NvbGFyJztcclxuXHJcbiAgaXNEb25lID0gZmFsc2U7XHJcbiAgQE91dHB1dCgpIHB1YmxpYyBpbnRyb0RvbmUgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcblxyXG4gIG9rdGFFcnJvcjogT0F1dGhFcnJvciB8IG51bGwgPSBudWxsO1xyXG4gIHVzZXJSZWNlaXZlZCA9IGZhbHNlO1xyXG5cclxuICBpc0lmcmFtZSA9IGZhbHNlO1xyXG4gIGNvbmZpZzogU3BhYXNFeHRDb25maWdNb2RlbDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGNvbmZpZ1NlcnZpY2U6IENvbmZpZ1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGVtYmVkTW9kZVNlcnZpY2U6IEVtYmVkTW9kZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG9rdGFTZXJ2aWNlOiBPa3RhU2VydmljZSxcclxuICApIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMuY29uZmlnU2VydmljZS5nZXRDb25maWcoKTtcclxuICAgIHRoaXMuaXNJZnJhbWUgPSB0aGlzLmVtYmVkTW9kZVNlcnZpY2UuZ2V0RW1iZWRNb2RlKCkuaXNJZnJhbWUoKTtcclxuICAgIHRoaXMub25Vc2VySW5mbygpO1xyXG4gICAgdGhpcy5vbk9rdGFFcnJvcigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvblVzZXJJbmZvKCk6IHZvaWQge1xyXG4gICAgdGhpcy5va3RhU2VydmljZS5vbk5ld1VzZXJJbmZvKClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMub25EZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoXHJcbiAgICAgICAgKHVzZXIpID0+IHtcclxuICAgICAgICAgIGlmICh1c2VyPy5lbWFpbCkge1xyXG4gICAgICAgICAgICB0aGlzLnVzZXJSZWNlaXZlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIC8vIGVtaXQgdGhhdCBhbGwgaXMgd2VsbCwgc28gdGhlIHNjcmVlbiBjYW4gYWxyZWFkeSBzdGFydCByZW5kZXJpbmdcclxuICAgICAgICAgICAgdGhpcy5pbnRyb0RvbmUuZW1pdCh0cnVlKTtcclxuICAgICAgICAgICAgLy8gYW5kIG9ubHkgaGlkZSB0aGUgb2t0YSBpdHNlbGYgYWZ0ZXIgbiBtc1xyXG4gICAgICAgICAgICB0aW1lcigxNDAwKVxyXG4gICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSQpKVxyXG4gICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0RvbmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25Pa3RhRXJyb3IoKTogdm9pZCB7XHJcbiAgICB0aGlzLm9rdGFTZXJ2aWNlLm9uTmV3T2t0YUVycm9yKClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMub25EZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoXHJcbiAgICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm9rdGFFcnJvciA9IGVycm9yO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIG9rdGFUcnlBZ2FpbigpOiB2b2lkIHtcclxuICAgIHRoaXMub2t0YVNlcnZpY2UuZm9yY2VSZXRyeSgpO1xyXG4gIH1cclxuXHJcbiAgY29udGFjdEd1YXJkKCk6IHZvaWQge1xyXG4gICAgY29uc3QgYm9keSA9ICdGb2xsb3dpbmcgZXJyb3Igd2FzIHJlY2VpdmVkIHRyeWluZyB0byBzaWduIGluIHRvICcgKyB0aGlzLmNvbmZpZz8uY2xlYW5BcHBOYW1lICsgJzpcXHJcXG5cXHJcXG4nICtcclxuICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5va3RhRXJyb3IpO1xyXG4gICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBgbWFpbHRvOjU5MzlAZW5naWUuY29tP3N1YmplY3Q9T2t0YSBzaWduLWluIGVycm9yIGZvciAke3RoaXMuY29uZmlnPy5jbGVhbkFwcE5hbWV9JmJvZHk9JHtlbmNvZGVVUklDb21wb25lbnQoYm9keSl9YDtcclxuICB9XHJcblxyXG4gIGdvVG9Tbm93KCk6IHZvaWQge1xyXG4gICB3aW5kb3cub3BlbignaHR0cHM6Ly9nZW1wcm9kLnNlcnZpY2Utbm93LmNvbS9nZW0nLCAnX2JsYW5rJyk7XHJcbiAgfVxyXG5cclxufVxyXG4iLCJAaWYgKCFpc0RvbmUpIHtcclxuICA8ZGl2IFtjbGFzcy5pbi1pZnJhbWVdPVwiaXNJZnJhbWVcIlxyXG4gICAgICAgY2xhc3M9XCJpbnRyb1wiPlxyXG4gICAgQGlmICghaXNJZnJhbWUpIHtcclxuICAgICAgPGRpdiBjbGFzcz1cImhhbGYtc2NyZWVuIGZsZXggY29sIGNlbnRlclwiPlxyXG4gICAgICAgIDwhLS0gTE9HTyAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGFsZi1zY3JlZW5fX2xvZ28gZmxleCBjZW50ZXJcIj5cclxuICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCA1MTIgMjU2XCI+XHJcbiAgICAgICAgICAgIDx1c2UgW2F0dHIueGxpbms6aHJlZl09XCInLi4vLi4vYXNzZXRzL2ltYWdlcy9sb2dvLWVuZ2llLnN2ZyNzdmcxJ1wiPjwvdXNlPlxyXG4gICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgQGlmIChva3RhRXJyb3IpIHtcclxuICAgICAgICAgIDwhLS0gSEFTIE9LVEEgRVJST1IgLS0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidHh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHh0LWJvbGRcIj5CdW1wZWQgaW50byBhbiBlcnJvcjo8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdj57eyBva3RhRXJyb3IubWVzc2FnZSB9fTwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBjZW50ZXIgcGFkLWJpZy10b3AgY29sdW1uLWdhcC0xMFwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm9rdGFUcnlBZ2FpbigpXCIgY2xhc3M9XCJwcmltYXJ5XCI+XHJcbiAgICAgICAgICAgICAgICB7eyB0cnlBZ2FpbkJ1dHRvblRpdGxlIH19XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgQGlmICgob2t0YUVycm9yLmVycm9yQ29kZSB8IGxvd2VyY2FzZSkgPT09ICdhY2Nlc3NfZGVuaWVkJykge1xyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZ29Ub1Nub3coKVwiIGNsYXNzPVwiZXJyb3JcIj5cclxuICAgICAgICAgICAgICAgICAge3sgZ29Ub1Nub3dCdXR0b25UaXRsZSB9fVxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJjb250YWN0R3VhcmQoKVwiIGNsYXNzPVwiZXJyb3JcIj5cclxuICAgICAgICAgICAgICAgICAge3sgY29udGFjdEd1YXJkQnV0dG9uVGl0bGUgfX1cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgIDwhLS0gTk8gT0tUQSBFUlJPUiAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0eHQtY2VudGVyIHBhZC1iaWctYm90dG9tXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYWQtYmlnLWJvdHRvbVwiPlxyXG4gICAgICAgICAgICAgIHt7IHVzZXJSZWNlaXZlZCA/IGludHJvVGV4dCA6IGNoZWNraW5nQWNjZXNzVGV4dCB9fVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPG1hdC1wcm9ncmVzcy1iYXIgW21vZGVdPVwiJ2luZGV0ZXJtaW5hdGUnXCI+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPHNwYWFzLWJnIFtiZ0ltZ109XCJiZ0ltZ1wiPjwvc3BhYXMtYmc+XHJcbiAgICB9IEBlbHNlIHtcclxuICAgICAgPGRpdj5cclxuICAgICAgICBsb2FkaW5nIGVtYmVkZGVkIHt7IGNvbmZpZy5jbGVhbkFwcE5hbWUgfX1cclxuICAgICAgICA8bWF0LXByb2dyZXNzLWJhciBbbW9kZV09XCInaW5kZXRlcm1pbmF0ZSdcIj48L21hdC1wcm9ncmVzcy1iYXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG4gIDwvZGl2PlxyXG59XHJcbiJdfQ==