UNPKG

@universis/common

Version:

Universis - common directives and services

162 lines (161 loc) 16.5 kB
import { Injectable, Component, Input } from '@angular/core'; import { Router } from '@angular/router'; import { HttpErrorResponse } from '@angular/common/http'; import { BsModalService, BsModalRef } from 'ngx-bootstrap/modal'; import { TranslateService } from '@ngx-translate/core'; export class ErrorModalComponent { constructor(_translateService, bsModalRef, _router) { this._translateService = _translateService; this.bsModalRef = bsModalRef; this._router = _router; this.continueLink = '/'; this.iconClass = 'far fa-frown'; this.buttonText = 'Error.Continue'; this.language = this._translateService.currentLang; } hide() { this.bsModalRef.hide(); if (this.continueLink == null) { return Promise.resolve(); } if (this.continueLink === '.') { return Promise.resolve(); } return this._router.navigate([this.continueLink]); } ngOnInit() { // get last error const error = this.error; // 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.continueLink = error.continue; } this._translateService.get(this.code).subscribe((translation) => { if (translation) { this.title = translation.title; this.message = (this.error instanceof HttpErrorResponse && this.error.error && this.error.error.message) ? this.error.error.message : translation.message; } else { this._translateService.get('E500').subscribe((result) => { this.title = result.title; this.message = (this.error instanceof HttpErrorResponse && this.error.error && this.error.error.message) ? this.error.error.message : translation.message; }); } }); } } ErrorModalComponent.decorators = [ { type: Component, args: [{ selector: 'universis-error-modal', template: ` <div class="modal-header text-center"> <button type="button" class="close pull-right" aria-label="Close" (click)="hide()"> <span aria-hidden="true">&times;</span> </button> </div> <div class="modal-body mt-0 mb-0 text-center"> <div class="text-center"> <div class="icon-circle icon-circle-danger"> <i class="fa fa-times"></i> </div> <div class="font-2xl font-weight-bold mt-2"> {{title}} </div> <p class="mt-2"> {{message}} </p> </div> </div> <div class="modal-footer"> <button [lang]="language" type="button" (click)="hide()" class="btn btn-gray-100 btn-ok text-uppercase" [translate]="buttonText"></button> </div> `, styles: [` .btn-ok { font-size: 16px; } `] }] } ]; /** @nocollapse */ ErrorModalComponent.ctorParameters = () => [ { type: TranslateService }, { type: BsModalRef }, { type: Router } ]; ErrorModalComponent.propDecorators = { continueLink: [{ type: Input }], message: [{ type: Input }], title: [{ type: Input }], iconClass: [{ type: Input }], buttonText: [{ type: Input }], error: [{ type: Input }] }; export class ErrorService { constructor(_router, _modalService) { this._router = _router; this._modalService = _modalService; // } /** * @param {*} error * @returns {Promise<boolean>} */ navigateToError(error) { this.setLastError(error); // if error is an instance of HttpErrorResponse if (error instanceof HttpErrorResponse) { if (error && error.error && error.error.statusCode) { return this._router.navigate(['/error', error.error.statusCode]); } // navigate to specific error e.g. /error/401 // this will allow application to override specific error pages and show custom errors return this._router.navigate(['/error', error.status]); } // otherwise show default error component return this._router.navigate(['/error']); } showError(error, options) { const initialState = Object.assign({ error: error }, options); this._modalService.show(ErrorModalComponent, { initialState }); } /** * Sets last application error * @param {*=} err * @return ErrorService */ setLastError(err) { this._lastError = err; return this; } /** * Gets last application error * @return {any} */ getLastError() { return this._lastError; } } ErrorService.decorators = [ { type: Injectable } ]; /** @nocollapse */ ErrorService.ctorParameters = () => [ { type: Router }, { type: BsModalService } ]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B1bml2ZXJzaXMvY29tbW9uLyIsInNvdXJjZXMiOlsiZXJyb3IvZXJyb3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUF3Q3JELE1BQU07SUFXSixZQUFzQixpQkFBbUMsRUFDcEMsVUFBc0IsRUFDckIsT0FBZTtRQUZmLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBa0I7UUFDcEMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUNyQixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBVDVCLGlCQUFZLEdBQUcsR0FBRyxDQUFDO1FBR25CLGNBQVMsR0FBRyxjQUFjLENBQUM7UUFDM0IsZUFBVSxHQUFHLGdCQUFnQixDQUFDO1FBTXJDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQztJQUNyRCxDQUFDO0lBRUgsSUFBSTtRQUNBLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkIsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksRUFBRTtZQUM3QixPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUMxQjtRQUNELElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxHQUFHLEVBQUU7WUFDN0IsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDMUI7UUFDRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELFFBQVE7UUFFTixpQkFBaUI7UUFDakIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN6Qiw0QkFBNEI7UUFDNUIsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUMzQyxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7U0FDeEI7YUFBTSxJQUFJLEtBQUssSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssUUFBUSxFQUFFO1lBQzFFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztTQUNwRDthQUFNO1lBQ0wsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUM7U0FDcEI7UUFDRCxJQUFJLEtBQUssSUFBSSxPQUFPLEtBQUssQ0FBQyxRQUFRLEtBQUssUUFBUSxFQUFFO1lBQy9DLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztTQUNwQztRQUVELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQzlELElBQUksV0FBVyxFQUFFO2dCQUNmLElBQUksQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQztnQkFDL0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLFlBQVksaUJBQWlCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO29CQUN0RyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDO2FBQ3BEO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7b0JBQ3RELElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztvQkFDMUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLFlBQVksaUJBQWlCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO3dCQUN0RyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDO2dCQUNyRCxDQUFDLENBQUMsQ0FBQzthQUNKO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOzs7WUF6RkosU0FBUyxTQUFFO2dCQUNWLFFBQVEsRUFBRSx1QkFBdUI7Z0JBQ2pDLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1QlQ7eUJBQVc7Ozs7R0FJWDthQUNDOzs7O1lBdENLLGdCQUFnQjtZQURBLFVBQVU7WUFGMUIsTUFBTTs7OzJCQStDVixLQUFLO3NCQUNMLEtBQUs7b0JBQ0wsS0FBSzt3QkFDTCxLQUFLO3lCQUNMLEtBQUs7b0JBQ0wsS0FBSzs7QUFxRFYsTUFBTTtJQUlKLFlBQW9CLE9BQWUsRUFBVSxhQUE2QjtRQUF0RCxZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQVUsa0JBQWEsR0FBYixhQUFhLENBQWdCO1FBQ3hFLEVBQUU7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZUFBZSxDQUFDLEtBQUs7UUFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QiwrQ0FBK0M7UUFDL0MsSUFBSSxLQUFLLFlBQVksaUJBQWlCLEVBQUU7WUFDdEMsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRTtnQkFDbEQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7YUFDbEU7WUFDRCw2Q0FBNkM7WUFDN0Msc0ZBQXNGO1lBQ3RGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7U0FDeEQ7UUFDRCx5Q0FBeUM7UUFDekMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELFNBQVMsQ0FBQyxLQUFVLEVBQUUsT0FBK0I7UUFDbkQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUNqQyxLQUFLLEVBQUUsS0FBSztTQUNiLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDWixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxFQUFDLFlBQVksRUFBQyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxZQUFZLENBQUMsR0FBUztRQUNwQixJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQztRQUN0QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7O09BR0c7SUFDSCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7OztZQW5ERixVQUFVOzs7O1lBeEdGLE1BQU07WUFFTixjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgQ29tcG9uZW50LCBPbkluaXQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtIdHRwRXJyb3JSZXNwb25zZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQnNNb2RhbFNlcnZpY2UsIEJzTW9kYWxSZWYgfSBmcm9tICduZ3gtYm9vdHN0cmFwL21vZGFsJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIFNob3dFcnJvck1vZGFsT3B0aW9ucyB7XG4gIGNvbnRpbnVlTGluaz86IHN0cmluZztcbiAgYnV0dG9uVGV4dD86IHN0cmluZztcbiAgaWNvbkNsYXNzPzogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KCB7XG4gIHNlbGVjdG9yOiAndW5pdmVyc2lzLWVycm9yLW1vZGFsJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyIHRleHQtY2VudGVyXCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlIHB1bGwtcmlnaHRcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiAoY2xpY2spPVwiaGlkZSgpXCI+XG4gICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBtdC0wIG1iLTAgdGV4dC1jZW50ZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb24tY2lyY2xlIGljb24tY2lyY2xlLWRhbmdlclwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdGltZXNcIj48L2k+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LTJ4bCBmb250LXdlaWdodC1ib2xkIG10LTJcIj5cbiAgICAgICAgICAgICAge3t0aXRsZX19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwibXQtMlwiPlxuICAgICAgICAgICAgIHt7bWVzc2FnZX19XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cbiAgICAgIDxidXR0b24gW2xhbmddPVwibGFuZ3VhZ2VcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImhpZGUoKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1ncmF5LTEwMCBidG4tb2sgdGV4dC11cHBlcmNhc2VcIiBbdHJhbnNsYXRlXT1cImJ1dHRvblRleHRcIj48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgYCwgc3R5bGVzOiBbYFxuICAuYnRuLW9rIHtcbiAgICBmb250LXNpemU6IDE2cHg7XG4gIH1cbiAgYF1cbiAgIH0pXG5cbiAgZXhwb3J0IGNsYXNzIEVycm9yTW9kYWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gICAgcHVibGljIGNvZGU7XG4gICAgcHVibGljIGxhbmd1YWdlO1xuICAgIEBJbnB1dCgpIGNvbnRpbnVlTGluayA9ICcvJztcbiAgICBASW5wdXQoKSBtZXNzYWdlOiBzdHJpbmc7XG4gICAgQElucHV0KCkgdGl0bGU6IHN0cmluZztcbiAgICBASW5wdXQoKSBpY29uQ2xhc3MgPSAnZmFyIGZhLWZyb3duJztcbiAgICBASW5wdXQoKSBidXR0b25UZXh0ID0gJ0Vycm9yLkNvbnRpbnVlJztcbiAgICBASW5wdXQoKSBlcnJvcjogYW55O1xuXG4gICAgY29uc3RydWN0b3IgKCBwcml2YXRlIF90cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgcHVibGljIGJzTW9kYWxSZWY6IEJzTW9kYWxSZWYsXG4gICAgICAgICAgICAgICAgICBwcml2YXRlIF9yb3V0ZXI6IFJvdXRlciApIHtcbiAgICAgIHRoaXMubGFuZ3VhZ2UgPSB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmN1cnJlbnRMYW5nO1xuICAgIH1cblxuICBoaWRlKCkge1xuICAgICAgdGhpcy5ic01vZGFsUmVmLmhpZGUoKTtcbiAgICAgIGlmICh0aGlzLmNvbnRpbnVlTGluayA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRpbnVlTGluayA9PT0gJy4nKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoW3RoaXMuY29udGludWVMaW5rXSk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG5cbiAgICAgIC8vIGdldCBsYXN0IGVycm9yXG4gICAgICBjb25zdCBlcnJvciA9IHRoaXMuZXJyb3I7XG4gICAgICAvLyBjaGVjayBlcnJvci5jb2RlIHByb3BlcnR5XG4gICAgICBpZiAoZXJyb3IgJiYgdHlwZW9mIGVycm9yLmNvZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMuY29kZSA9IGVycm9yLmNvZGU7XG4gICAgICB9IGVsc2UgaWYgKGVycm9yICYmIHR5cGVvZiAoZXJyb3Iuc3RhdHVzIHx8IGVycm9yLnN0YXR1c0NvZGUpID09PSAnbnVtYmVyJykge1xuICAgICAgICB0aGlzLmNvZGUgPSBgRSR7ZXJyb3Iuc3RhdHVzIHx8IGVycm9yLnN0YXR1c0NvZGV9YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29kZSA9ICdFNTAwJztcbiAgICAgIH1cbiAgICAgIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IuY29udGludWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMuY29udGludWVMaW5rID0gZXJyb3IuY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuZ2V0KHRoaXMuY29kZSkuc3Vic2NyaWJlKCh0cmFuc2xhdGlvbikgPT4ge1xuICAgICAgICBpZiAodHJhbnNsYXRpb24pIHtcbiAgICAgICAgICB0aGlzLnRpdGxlID0gdHJhbnNsYXRpb24udGl0bGU7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlID0gKHRoaXMuZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSAmJiB0aGlzLmVycm9yLmVycm9yICYmIHRoaXMuZXJyb3IuZXJyb3IubWVzc2FnZSlcbiAgICAgICAgICAgID8gdGhpcy5lcnJvci5lcnJvci5tZXNzYWdlIDogdHJhbnNsYXRpb24ubWVzc2FnZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmdldCgnRTUwMCcpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRpdGxlID0gcmVzdWx0LnRpdGxlO1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gKHRoaXMuZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSAmJiB0aGlzLmVycm9yLmVycm9yICYmIHRoaXMuZXJyb3IuZXJyb3IubWVzc2FnZSlcbiAgICAgICAgICAgICAgPyB0aGlzLmVycm9yLmVycm9yLm1lc3NhZ2UgOiB0cmFuc2xhdGlvbi5tZXNzYWdlO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRXJyb3JTZXJ2aWNlIHtcblxuICBwcml2YXRlIF9sYXN0RXJyb3I6IGFueTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9yb3V0ZXI6IFJvdXRlciwgcHJpdmF0ZSBfbW9kYWxTZXJ2aWNlOiBCc01vZGFsU2VydmljZSkge1xuICAgIC8vXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsqfSBlcnJvclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIG5hdmlnYXRlVG9FcnJvcihlcnJvcikge1xuICAgIHRoaXMuc2V0TGFzdEVycm9yKGVycm9yKTtcbiAgICAvLyBpZiBlcnJvciBpcyBhbiBpbnN0YW5jZSBvZiBIdHRwRXJyb3JSZXNwb25zZVxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlKSB7XG4gICAgICBpZiAoZXJyb3IgJiYgZXJyb3IuZXJyb3IgJiYgZXJyb3IuZXJyb3Iuc3RhdHVzQ29kZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm91dGVyLm5hdmlnYXRlKFsnL2Vycm9yJywgZXJyb3IuZXJyb3Iuc3RhdHVzQ29kZV0pO1xuICAgICAgfVxuICAgICAgLy8gbmF2aWdhdGUgdG8gc3BlY2lmaWMgZXJyb3IgZS5nLiAvZXJyb3IvNDAxXG4gICAgICAvLyB0aGlzIHdpbGwgYWxsb3cgYXBwbGljYXRpb24gdG8gb3ZlcnJpZGUgc3BlY2lmaWMgZXJyb3IgcGFnZXMgYW5kIHNob3cgY3VzdG9tIGVycm9yc1xuICAgICAgcmV0dXJuIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZShbJy9lcnJvcicsIGVycm9yLnN0YXR1c10pO1xuICAgIH1cbiAgICAvLyBvdGhlcndpc2Ugc2hvdyBkZWZhdWx0IGVycm9yIGNvbXBvbmVudFxuICAgIHJldHVybiB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoWycvZXJyb3InXSk7XG4gIH1cblxuICBzaG93RXJyb3IoZXJyb3I6IGFueSwgb3B0aW9ucz86IFNob3dFcnJvck1vZGFsT3B0aW9ucykge1xuICAgIGNvbnN0IGluaXRpYWxTdGF0ZSA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgZXJyb3I6IGVycm9yXG4gICAgfSwgb3B0aW9ucyk7XG4gICAgdGhpcy5fbW9kYWxTZXJ2aWNlLnNob3coRXJyb3JNb2RhbENvbXBvbmVudCwge2luaXRpYWxTdGF0ZX0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgbGFzdCBhcHBsaWNhdGlvbiBlcnJvclxuICAgKiBAcGFyYW0geyo9fSBlcnJcbiAgICogQHJldHVybiBFcnJvclNlcnZpY2VcbiAgICovXG4gIHNldExhc3RFcnJvcihlcnI/OiBhbnkpIHtcbiAgICB0aGlzLl9sYXN0RXJyb3IgPSBlcnI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBsYXN0IGFwcGxpY2F0aW9uIGVycm9yXG4gICAqIEByZXR1cm4ge2FueX1cbiAgICovXG4gIGdldExhc3RFcnJvcigpIHtcbiAgICByZXR1cm4gdGhpcy5fbGFzdEVycm9yO1xuICB9XG5cbn1cbiJdfQ==