@universis/common
Version:
Universis - common directives and services
140 lines (139 loc) • 20.8 kB
JavaScript
import { Component, Renderer2, ViewEncapsulation } from '@angular/core';
import { ErrorService } from '../../error.service';
import { TranslateService } from '@ngx-translate/core';
import { ActivatedRoute, Router } from '@angular/router';
export class ErrorBaseComponent {
constructor(_errorService, _translateService, _renderer) {
this._errorService = _errorService;
this._translateService = _translateService;
this._renderer = _renderer;
this.isUserLoggedIn = false;
// hide universis-spinner
const spinnerElement = document.body.getElementsByTagName('universis-spinner')[0];
if (spinnerElement) {
this._renderer.setStyle(spinnerElement, 'display', 'none');
}
// user logged in
this.isUserLoggedIn = (sessionStorage.getItem('currentUser') != null);
// add center content classes
this._renderer.addClass(document.body, 'flex-row');
this._renderer.addClass(document.body, 'align-items-center');
// get last error
const error = this._errorService.getLastError();
// check error.code property
if (error && typeof error.code === 'string') {
this.code = error.code;
}
else if (error && typeof (error.status || error.statusCode) === 'number') {
this.code = `E${error.status || error.statusCode}`;
}
else {
this.code = 'E500';
}
if (error && typeof error.continue === 'string') {
this.continue = error.continue;
}
else {
this.continue = '/';
}
// check if continue link is an absolute URL
this.continueLinkIsAbsolute = this.continueIsAbsolute();
this.action = 'Error.Continue';
}
get displayCode() {
if (/^E(\d+)\.?(\d+)?$/g.test(this.code)) {
return this.code;
}
return 'E500';
}
ngOnInit() {
this._translateService.get(this.code).subscribe((translation) => {
if (translation) {
this.title = translation.title;
this.message = translation.message;
}
else {
this._translateService.get('E500').subscribe((result) => {
this.title = result.title;
this.message = result.message;
});
}
});
}
continueIsAbsolute() {
const regex = new RegExp('^((https?|ftps?):\\/\\/)([\\da-z.-]+)\\.([a-z.]{2,6})([\\/\\w .-]*)*\\/?$');
// returns true if the continue link is absolute
return regex.test(this.continue);
}
ngOnDestroy() {
// remove center content classes
this._renderer.removeClass(document.body, 'flex-row');
this._renderer.removeClass(document.body, 'align-items-center');
}
}
ErrorBaseComponent.decorators = [
{ type: Component, args: [{
selector: 'universis-error-base',
template: "<nav class=\"navbar navbar-expand navbar-light bg-light\" id=\"errorNav\">\n <div class=\"collapse navbar-collapse\">\n <ul class=\"navbar-nav ml-auto\">\n <li class=\"nav-item\">\n <a class=\"nav-link\" [routerLink]=\"['/auth/logout']\" routerLinkActive=\"router-link-active\" [translate]=\"'Error.Logout'\"></a>\n </li>\n </ul>\n </div>\n</nav>\n\n<div class=\"container error-container\">\n <div class=\"col-md-8 col-sm-10 col-xs-10\">\n <div class=\"d-flex flex-row justify-content-center\">\n <i class=\"far fa-frown fa-10x text-secondary\" [title]=displayCode></i>\n </div>\n <div class=\"d-flex flex-row justify-content-center\">\n <div class=\"px-4 py-md-3\">\n <h3 class=\"pt-3 text-center\">{{title}}</h3>\n <h5 class=\"text-muted text-center\">{{message}}</h5>\n <div class=\"text-center pt-4\">\n <ng-container *ngIf = \"continueLinkIsAbsolute\">\n <a [attr.href]=\"continue\" [translate]=\"action\" class=\"btn btn-light rounded\"></a>\n </ng-container>\n <ng-container *ngIf = \"!continueLinkIsAbsolute\">\n <a [routerLink]=\"continue\" [translate]=\"action\" class=\"btn btn-light rounded\"></a>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n\n",
encapsulation: ViewEncapsulation.None,
styles: [".m-error nav{position:fixed;width:100%;z-index:1}.error-container{position:absolute;height:100%;width:100%;padding:0;margin:-8px 0 0 -8px;display:flex;align-items:center;justify-content:center;max-width:none}@media (max-width:575.98px){.border-none{border-style:none!important}}@media (max-width:767.98px){.border-sm-none{border-style:none!important}}@media (max-width:991.98px){.border-md-none{border-style:none!important}}@media (max-width:1199.98px){.border-lg-none{border-style:none!important}}.border-xl-none{border-style:none!important}#errorNav{position:fixed;width:100%;z-index:2}"]
}] }
];
/** @nocollapse */
ErrorBaseComponent.ctorParameters = () => [
{ type: ErrorService },
{ type: TranslateService },
{ type: Renderer2 }
];
export class HttpErrorComponent extends ErrorBaseComponent {
constructor(_errorService, _translateService, _router, _route, _renderer) {
super(_errorService, _translateService, _renderer);
this._errorService = _errorService;
this._translateService = _translateService;
this._router = _router;
this._route = _route;
this._renderer = _renderer;
}
ngOnInit() {
// get params and query params
this._route.params.subscribe((params) => {
if (params.status) {
this.code = `E${params.status}`;
}
this._route.queryParams.subscribe((queryParams) => {
if (queryParams.continue) {
this.continue = queryParams.continue;
// check if continue link is an absolute URL
this.continueLinkIsAbsolute = this.continueIsAbsolute();
}
if (queryParams.action) {
this.action = queryParams.action;
}
this._translateService.get(this.code || 'E500').subscribe((translation) => {
if (translation) {
this.title = translation.title;
this.message = translation.message;
}
});
});
});
}
}
HttpErrorComponent.decorators = [
{ type: Component, args: [{
// tslint:disable-next-line:component-selector
selector: '.m-error.m-error--http',
template: "<nav class=\"navbar navbar-expand navbar-light bg-light\" id=\"errorNav\">\n <div class=\"collapse navbar-collapse\">\n <ul class=\"navbar-nav ml-auto\">\n <li class=\"nav-item\">\n <a class=\"nav-link\" [routerLink]=\"['/auth/logout']\" routerLinkActive=\"router-link-active\" [translate]=\"'Error.Logout'\"></a>\n </li>\n </ul>\n </div>\n</nav>\n\n<div class=\"container error-container\">\n <div class=\"col-md-8 col-sm-10 col-xs-10\">\n <div class=\"d-flex flex-row justify-content-center\">\n <i class=\"far fa-frown fa-10x text-secondary\" [title]=displayCode></i>\n </div>\n <div class=\"d-flex flex-row justify-content-center\">\n <div class=\"px-4 py-md-3\">\n <h3 class=\"pt-3 text-center\">{{title}}</h3>\n <h5 class=\"text-muted text-center\">{{message}}</h5>\n <div class=\"text-center pt-4\">\n <ng-container *ngIf = \"continueLinkIsAbsolute\">\n <a [attr.href]=\"continue\" [translate]=\"action\" class=\"btn btn-light rounded\"></a>\n </ng-container>\n <ng-container *ngIf = \"!continueLinkIsAbsolute\">\n <a [routerLink]=\"continue\" [translate]=\"action\" class=\"btn btn-light rounded\"></a>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n\n",
encapsulation: ViewEncapsulation.None,
styles: [".m-error nav{position:fixed;width:100%;z-index:1}.error-container{position:absolute;height:100%;width:100%;padding:0;margin:-8px 0 0 -8px;display:flex;align-items:center;justify-content:center;max-width:none}@media (max-width:575.98px){.border-none{border-style:none!important}}@media (max-width:767.98px){.border-sm-none{border-style:none!important}}@media (max-width:991.98px){.border-md-none{border-style:none!important}}@media (max-width:1199.98px){.border-lg-none{border-style:none!important}}.border-xl-none{border-style:none!important}#errorNav{position:fixed;width:100%;z-index:2}"]
}] }
];
/** @nocollapse */
HttpErrorComponent.ctorParameters = () => [
{ type: ErrorService },
{ type: TranslateService },
{ type: Router },
{ type: ActivatedRoute },
{ type: Renderer2 }
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3ItYmFzZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AdW5pdmVyc2lzL2NvbW1vbi8iLCJzb3VyY2VzIjpbImVycm9yL2NvbXBvbmVudHMvZXJyb3ItYmFzZS9lcnJvci1iYXNlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFxQixTQUFTLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDekYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFRekQsTUFBTTtJQVdKLFlBQXNCLGFBQTJCLEVBQzdCLGlCQUFtQyxFQUNqQyxTQUFvQjtRQUZwQixrQkFBYSxHQUFiLGFBQWEsQ0FBYztRQUM3QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQWtCO1FBQ2pDLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFWbkMsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFXMUIseUJBQXlCO1FBQ3pCLE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRixJQUFJLGNBQWMsRUFBRTtZQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQzVEO1FBQ0QsaUJBQWlCO1FBQ2pCLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQ3RFLDZCQUE2QjtRQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFF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QUFFO29CQUN4RSxJQUFJLFdBQVcsRUFBRTt3QkFDZixJQUFJLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUM7d0JBQy9CLElBQUksQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQztxQkFDcEM7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7O1lBdkNGLFNBQVMsU0FBQztnQkFDVCw4Q0FBOEM7Z0JBQzlDLFFBQVEsRUFBRSx3QkFBd0I7Z0JBQ2xDLHEvQ0FBMEM7Z0JBQzFDLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJOzthQUV0Qzs7OztZQWpHUSxZQUFZO1lBQ1osZ0JBQWdCO1lBQ0EsTUFBTTtZQUF0QixjQUFjO1lBSGUsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCwgUmVuZGVyZXIyLCBWaWV3RW5jYXBzdWxhdGlvbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFcnJvclNlcnZpY2UgfSBmcm9tICcuLi8uLi9lcnJvci5zZXJ2aWNlJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd1bml2ZXJzaXMtZXJyb3ItYmFzZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9lcnJvci1iYXNlLmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgc3R5bGVVcmxzOiBbJy4vZXJyb3ItYmFzZS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEVycm9yQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuXG4gIHB1YmxpYyBpc1VzZXJMb2dnZWRJbiA9IGZhbHNlO1xuICBwdWJsaWMgY29kZTogc3RyaW5nO1xuICBwdWJsaWMgdGl0bGU6IHN0cmluZztcbiAgcHVibGljIG1lc3NhZ2U6IHN0cmluZztcbiAgcHVibGljIGNvbnRpbnVlOiBzdHJpbmc7XG4gIHB1YmxpYyBhY3Rpb246IHN0cmluZztcbiAgcHVibGljIGNvbnRpbnVlTGlua0lzQWJzb2x1dGU6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIF9lcnJvclNlcnZpY2U6IEVycm9yU2VydmljZSxcbiAgICAgICAgICAgIHByb3RlY3RlZCBfdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIF9yZW5kZXJlcjogUmVuZGVyZXIyKSB7XG4gICAgICAvLyBoaWRlIHVuaXZlcnNpcy1zcGlubmVyXG4gICAgICBjb25zdCBzcGlubmVyRWxlbWVudCA9IGRvY3VtZW50LmJvZHkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3VuaXZlcnNpcy1zcGlubmVyJylbMF07XG4gICAgICBpZiAoc3Bpbm5lckVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0U3R5bGUoc3Bpbm5lckVsZW1lbnQsICdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgIH1cbiAgICAgIC8vIHVzZXIgbG9nZ2VkIGluXG4gICAgICB0aGlzLmlzVXNlckxvZ2dlZEluID0gKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2N1cnJlbnRVc2VyJykgIT0gbnVsbCk7XG4gICAgICAvLyBhZGQgY2VudGVyIGNvbnRlbnQgY2xhc3Nlc1xuICAgICAgdGhpcy5fcmVuZGVyZXIuYWRkQ2xhc3MoZG9jdW1lbnQuYm9keSwgJ2ZsZXgtcm93Jyk7XG4gICAgICB0aGlzLl9yZW5kZXJlci5hZGRDbGFzcyhkb2N1bWVudC5ib2R5LCAnYWxpZ24taXRlbXMtY2VudGVyJyk7XG4gICAgLy8gZ2V0IGxhc3QgZXJyb3JcbiAgICBjb25zdCBlcnJvciA9IHRoaXMuX2Vycm9yU2VydmljZS5nZXRMYXN0RXJyb3IoKTtcbiAgICAvLyBjaGVjayBlcnJvci5jb2RlIHByb3BlcnR5XG4gICAgaWYgKGVycm9yICYmIHR5cGVvZiBlcnJvci5jb2RlID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5jb2RlID0gZXJyb3IuY29kZTtcbiAgICB9IGVsc2UgaWYgKGVycm9yICYmIHR5cGVvZiAoZXJyb3Iuc3RhdHVzIHx8IGVycm9yLnN0YXR1c0NvZGUpID09PSAnbnVtYmVyJykge1xuICAgICAgdGhpcy5jb2RlID0gYEUke2Vycm9yLnN0YXR1cyB8fCBlcnJvci5zdGF0dXNDb2RlfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29kZSA9ICdFNTAwJztcbiAgICB9XG4gICAgaWYgKGVycm9yICYmIHR5cGVvZiBlcnJvci5jb250aW51ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuY29udGludWUgPSBlcnJvci5jb250aW51ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb250aW51ZSA9ICcvJztcbiAgICB9XG4gICAgLy8gY2hlY2sgaWYgY29udGludWUgbGluayBpcyBhbiBhYnNvbHV0ZSBVUkxcbiAgICB0aGlzLmNvbnRpbnVlTGlua0lzQWJzb2x1dGUgPSB0aGlzLmNvbnRpbnVlSXNBYnNvbHV0ZSgpO1xuICAgIHRoaXMuYWN0aW9uID0gJ0Vycm9yLkNvbnRpbnVlJztcblxuICB9XG5cbiAgICBnZXQgZGlzcGxheUNvZGUoKSB7XG4gICAgICAgIGlmICgvXkUoXFxkKylcXC4/KFxcZCspPyQvZy50ZXN0KHRoaXMuY29kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdFNTAwJztcbiAgICB9XG5cbiAgbmdPbkluaXQoKSB7XG5cblxuICAgIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuZ2V0KHRoaXMuY29kZSkuc3Vic2NyaWJlKCh0cmFuc2xhdGlvbikgPT4ge1xuICAgICAgaWYgKHRyYW5zbGF0aW9uKSB7XG4gICAgICAgIHRoaXMudGl0bGUgPSB0cmFuc2xhdGlvbi50aXRsZTtcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gdHJhbnNsYXRpb24ubWVzc2FnZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuZ2V0KCdFNTAwJykuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgICAgICB0aGlzLnRpdGxlID0gcmVzdWx0LnRpdGxlO1xuICAgICAgICAgIHRoaXMubWVzc2FnZSA9IHJlc3VsdC5tZXNzYWdlO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gICAgY29udGludWVJc0Fic29sdXRlKCk6IGJvb2xlYW4ge1xuICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKCdeKChodHRwcz98ZnRwcz8pOlxcXFwvXFxcXC8pKFtcXFxcZGEtei4tXSspXFxcXC4oW2Etei5dezIsNn0pKFtcXFxcL1xcXFx3IC4tXSopKlxcXFwvPyQnKTtcbiAgICAgIC8vIHJldHVybnMgdHJ1ZSBpZiB0aGUgY29udGludWUgbGluayBpcyBhYnNvbHV0ZVxuICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QodGhpcy5jb250aW51ZSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAvLyByZW1vdmUgY2VudGVyIGNvbnRlbnQgY2xhc3Nlc1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5yZW1vdmVDbGFzcyhkb2N1bWVudC5ib2R5LCAnZmxleC1yb3cnKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIucmVtb3ZlQ2xhc3MoZG9jdW1lbnQuYm9keSwgJ2FsaWduLWl0ZW1zLWNlbnRlcicpO1xuICAgIH1cbn1cblxuQENvbXBvbmVudCh7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpjb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICcubS1lcnJvci5tLWVycm9yLS1odHRwJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Vycm9yLWJhc2UuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBzdHlsZVVybHM6IFsnLi9lcnJvci1iYXNlLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgSHR0cEVycm9yQ29tcG9uZW50IGV4dGVuZHMgRXJyb3JCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgX2Vycm9yU2VydmljZTogRXJyb3JTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBfdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIF9yb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIF9yb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgICAgICAgICAgIHByb3RlY3RlZCBfcmVuZGVyZXI6IFJlbmRlcmVyMikge1xuICAgIHN1cGVyKF9lcnJvclNlcnZpY2UsIF90cmFuc2xhdGVTZXJ2aWNlLCBfcmVuZGVyZXIpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgLy8gZ2V0IHBhcmFtcyBhbmQgcXVlcnkgcGFyYW1zXG4gICAgdGhpcy5fcm91dGUucGFyYW1zLnN1YnNjcmliZSgocGFyYW1zKSA9PiB7XG4gICAgICBpZiAocGFyYW1zLnN0YXR1cykge1xuICAgICAgICB0aGlzLmNvZGUgPSBgRSR7cGFyYW1zLnN0YXR1c31gO1xuICAgICAgfVxuICAgICAgdGhpcy5fcm91dGUucXVlcnlQYXJhbXMuc3Vic2NyaWJlKChxdWVyeVBhcmFtcykgPT4ge1xuICAgICAgICBpZiAocXVlcnlQYXJhbXMuY29udGludWUpIHtcbiAgICAgICAgICB0aGlzLmNvbnRpbnVlID0gcXVlcnlQYXJhbXMuY29udGludWU7XG4gICAgICAgICAgLy8gY2hlY2sgaWYgY29udGludWUgbGluayBpcyBhbiBhYnNvbHV0ZSBVUkxcbiAgICAgICAgICB0aGlzLmNvbnRpbnVlTGlua0lzQWJzb2x1dGUgPSB0aGlzLmNvbnRpbnVlSXNBYnNvbHV0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChxdWVyeVBhcmFtcy5hY3Rpb24pIHtcbiAgICAgICAgICB0aGlzLmFjdGlvbiA9IHF1ZXJ5UGFyYW1zLmFjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmdldCh0aGlzLmNvZGUgfHwgJ0U1MDAnKS5zdWJzY3JpYmUoKHRyYW5zbGF0aW9uKSA9PiB7XG4gICAgICAgICAgaWYgKHRyYW5zbGF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnRpdGxlID0gdHJhbnNsYXRpb24udGl0bGU7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSB0cmFuc2xhdGlvbi5tZXNzYWdlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuIl19