UNPKG

angular-firebase-authorizator

Version:

Beta version of authorizator for angular linked to firebase, it creates a model in firestore to assign permissions to users an roles, and creates a view to update this permissions

148 lines 23.1 kB
import { __decorate, __metadata, __param } from "tslib"; import { Component, Inject, ViewChild } from '@angular/core'; import { FormGroup, FormControl, Validators } from '@angular/forms'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { MatSelect } from '@angular/material/select'; import { AuthorizatorService } from '../../../services/authorizator.service'; import { BehaviorSubject } from 'rxjs'; import { DataSource } from '@angular/cdk/table'; export class UsersDatabase { constructor() { this.dataChange = new BehaviorSubject([]); } get data() { return this.dataChange.value; } } export class UsersDataSource extends DataSource { constructor(usersDatabase) { super(); this.usersDatabase = usersDatabase; } connect() { return this.usersDatabase.dataChange; } disconnect() { } } let UpsertRoleComponent = class UpsertRoleComponent { constructor(data, authorizatorservice, dialogRef) { this.data = data; this.authorizatorservice = authorizatorservice; this.dialogRef = dialogRef; this.displayedColumns = ['remove', 'user']; this.usersDatabase = new UsersDatabase(); this.users = []; this.roleUsers = []; this.roleForm = new FormGroup({ name: new FormControl(null, [Validators.required]), description: new FormControl(null), }); } ngOnInit() { this.usersDataSource = new UsersDataSource(this.usersDatabase); this.authorizatorservice.getUsers(this.data.rootFirebasePath).then(users => { if (users) { this.users = users.sort((prev, curr) => { if (prev.data.name > curr.data.name) { return 1; } if (prev.data.name < curr.data.name) { return -1; } return 0; }); this.roleUsers = this.users.filter(user => this.data && this.data.role && this.data.role.data.users.findIndex(usr => usr === user.id) > -1); if (this.roleUsers) { this.roleUsers = this.roleUsers.sort((prev, curr) => { if (prev.data.name > curr.data.name) { return 1; } if (prev.data.name < curr.data.name) { return -1; } return 0; }); this.usersDatabase.dataChange.next(this.roleUsers); } } }); if (this.data.role) { this.roleForm.controls.name.setValue(this.data.role.data.name); this.roleForm.controls.description.setValue(this.data.role.data.description); } } onAddUserToRole() { const existUser = this.roleUsers.findIndex(roleUser => roleUser.id === this.selectUser.value); if (existUser === -1) { this.roleUsers.push(this.users.find(user => user.id === this.selectUser.value)); this.roleUsers = this.roleUsers.sort((prev, curr) => { if (prev.data.name > curr.data.name) { return 1; } if (prev.data.name < curr.data.name) { return -1; } return 0; }); this.usersDatabase.dataChange.next(this.roleUsers); } } onRemoveUserFromRole(user) { const userIndex = this.roleUsers.findIndex(roleUser => roleUser.id === user.id); if (userIndex > -1) { this.roleUsers.splice(userIndex, 1); this.usersDatabase.dataChange.next(this.roleUsers); } } onSubmitRole() { if (this.roleForm.valid) { const roleToAdd = { id: this.data.role ? this.data.role.id : null, data: { name: this.roleForm.controls.name.value, description: this.roleForm.controls.description.value, users: this.roleUsers.map(user => user.id), permissions: null } }; if (roleToAdd.id) { this.authorizatorservice.updateRole(this.data.rootFirebasePath, roleToAdd).then(() => { this.dialogRef.close(roleToAdd); }).catch(error => { this.roleForm.controls.name.setErrors({ defaulterror: true }); }); } else { this.authorizatorservice.addRole(this.data.rootFirebasePath, roleToAdd).then(() => { this.dialogRef.close(roleToAdd); }).catch(error => { if (error.key === 'exists') { this.roleForm.controls.name.setErrors({ exists: true }); } else { this.roleForm.controls.name.setErrors({ defaulterror: true }); } }); } } } }; UpsertRoleComponent.ctorParameters = () => [ { type: undefined, decorators: [{ type: Inject, args: [MAT_DIALOG_DATA,] }] }, { type: AuthorizatorService }, { type: MatDialogRef } ]; __decorate([ ViewChild('selectUser'), __metadata("design:type", MatSelect) ], UpsertRoleComponent.prototype, "selectUser", void 0); UpsertRoleComponent = __decorate([ Component({ selector: 'lib-upsert-role', template: "<form [formGroup]=\"roleForm\" (ngSubmit)=\"onSubmitRole()\" method=\"post\">\n <h1 mat-dialog-title>{{data.role ? 'Edit Role' : 'Add Role'}}</h1>\n <div mat-dialog-content>\n <mat-form-field style=\"width: 100%;\">\n <input matInput cdkFocusInitial placeholder=\"Name\" formControlName=\"name\" maxlength=\"30\">\n <mat-error *ngIf=\"roleForm.controls['name'].hasError('required')\">Mandatory field</mat-error>\n <mat-error *ngIf=\"roleForm.controls['name'].hasError('exists')\">Email already exists</mat-error>\n <mat-error *ngIf=\"roleForm.controls['name'].hasError('defaulterror')\">Error updating role</mat-error>\n </mat-form-field>\n <mat-form-field style=\"width: 100%;\">\n <input matInput cdkFocusInitial placeholder=\"Description\" formControlName=\"description\" maxlength=\"150\">\n </mat-form-field>\n <table style=\"width: 100%;\">\n <tr>\n <th style=\"width: 100%;\">\n <mat-form-field style=\"width: 100%;\">\n <mat-label>User</mat-label>\n <mat-select #selectUser>\n <mat-option *ngFor=\"let user of users\" [value]=\"user.id\">\n {{user.data.name || user.data.email}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </th>\n <th>\n <button type=\"button\" [disabled]=\"!this.selectUser.value\" mat-raised-button (click)=\"onAddUserToRole()\">\n <mat-icon color=\"primary\">person_add</mat-icon> Add User\n </button>\n </th>\n </tr>\n </table>\n <table mat-table [dataSource]=\"usersDataSource\" style=\"width: 100%;\">\n \n <!-- Remove Column -->\n <ng-container matColumnDef=\"remove\">\n <th mat-header-cell *matHeaderCellDef [ngClass]=\"'icon-column'\"></th>\n <td mat-cell *matCellDef=\"let user\" [ngClass]=\"'icon-column'\">\n <button mat-icon-button (click)=\"onRemoveUserFromRole(user)\">\n <mat-icon color=\"primary\" aria-label=\"Remove user\">delete</mat-icon>\n </button>\n </td>\n </ng-container>\n \n <!-- User Column -->\n <ng-container matColumnDef=\"user\">\n <th mat-header-cell *matHeaderCellDef [ngClass]=\"'users-column'\"> User </th>\n <td mat-cell *matCellDef=\"let user\" [ngClass]=\"'users-column'\">\n <div>{{user.data.name}}</div>\n <div>{{user.data.email}}</div>\n </td>\n </ng-container>\n \n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n </div>\n <div mat-dialog-actions>\n <button mat-button [mat-dialog-close]>Close</button>\n <button mat-raised-button color=\"primary\" type=\"submit\" [disabled]=\"!roleForm.valid\">{{data.role ? 'Update' : 'Add'}}</button>\n </div>\n</form>\n ", styles: [".mat-dialog-actions{-webkit-box-pack:end;justify-content:flex-end}"] }), __param(0, Inject(MAT_DIALOG_DATA)), __metadata("design:paramtypes", [Object, AuthorizatorService, MatDialogRef]) ], UpsertRoleComponent); export { UpsertRoleComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBzZXJ0LXJvbGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhci1maXJlYmFzZS1hdXRob3JpemF0b3IvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9yb2xlcy91cHNlcnQtcm9sZS91cHNlcnQtcm9sZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVyRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM3RSxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQU9oRCxNQUFNLE9BQU8sYUFBYTtJQUl4QjtRQUhBLGVBQVUsR0FBK0IsSUFBSSxlQUFlLENBQVksRUFBRSxDQUFDLENBQUM7SUFHNUQsQ0FBQztJQUZqQixJQUFJLElBQUksS0FBZ0IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Q0FHeEQ7QUFFRCxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxVQUFlO0lBQ2xELFlBQW9CLGFBQTRCO1FBQzlDLEtBQUssRUFBRSxDQUFDO1FBRFUsa0JBQWEsR0FBYixhQUFhLENBQWU7SUFFaEQsQ0FBQztJQUVELE9BQU87UUFDTCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxVQUFVLEtBQUksQ0FBQztDQUNoQjtBQU9ELElB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QzNCLHEyRkFBMkM7O0tBRTVDLENBQUM7SUFjRyxXQUFBLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQTs2Q0FDSyxtQkFBbUI7UUFDOUIsWUFBWTtHQWZyQixtQkFBbUIsQ0E2Ry9CO1NBN0dZLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbmplY3QsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUm9sZU9iaiB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvcm9sZS1vYmonO1xuaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtQ29udHJvbCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE1hdFNlbGVjdCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5pbXBvcnQgeyBBdXRob3JpemF0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYXV0aG9yaXphdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBVc2VyT2JqIH0gZnJvbSAnLi4vLi4vLi4vY2xhc3Nlcy91c2VyLW9iaic7XG5pbXBvcnQgeyBEYXRhU291cmNlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3RhYmxlJztcblxuZXhwb3J0IGludGVyZmFjZSBEaWFsb2dEYXRhIHtcbiAgcm9sZTogUm9sZU9iajtcbiAgcm9vdEZpcmViYXNlUGF0aDogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgVXNlcnNEYXRhYmFzZSB7XG4gIGRhdGFDaGFuZ2U6IEJlaGF2aW9yU3ViamVjdDxVc2VyT2JqW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxVc2VyT2JqW10+KFtdKTtcbiAgZ2V0IGRhdGEoKTogVXNlck9ialtdIHsgcmV0dXJuIHRoaXMuZGF0YUNoYW5nZS52YWx1ZTsgfVxuXG4gIGNvbnN0cnVjdG9yKCkgeyB9XG59XG5cbmV4cG9ydCBjbGFzcyBVc2Vyc0RhdGFTb3VyY2UgZXh0ZW5kcyBEYXRhU291cmNlPGFueT4ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHVzZXJzRGF0YWJhc2U6IFVzZXJzRGF0YWJhc2UpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgY29ubmVjdCgpOiBPYnNlcnZhYmxlPFVzZXJPYmpbXT4ge1xuICAgIHJldHVybiB0aGlzLnVzZXJzRGF0YWJhc2UuZGF0YUNoYW5nZTtcbiAgfVxuXG4gIGRpc2Nvbm5lY3QoKSB7fVxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItdXBzZXJ0LXJvbGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vdXBzZXJ0LXJvbGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi91cHNlcnQtcm9sZS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFVwc2VydFJvbGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwdWJsaWMgZGlzcGxheWVkQ29sdW1ucyA9IFsncmVtb3ZlJywgJ3VzZXInXTtcbiAgcHJpdmF0ZSB1c2Vyc0RhdGFiYXNlID0gbmV3IFVzZXJzRGF0YWJhc2UoKTtcbiAgcHVibGljIHVzZXJzRGF0YVNvdXJjZTogVXNlcnNEYXRhU291cmNlIHwgbnVsbDtcbiAgcHVibGljIHVzZXJzOiBVc2VyT2JqW10gPSBbXTtcbiAgcHVibGljIHJvbGVVc2VyczogVXNlck9ialtdID0gW107XG4gIEBWaWV3Q2hpbGQoJ3NlbGVjdFVzZXInKSBwdWJsaWMgc2VsZWN0VXNlcjogTWF0U2VsZWN0O1xuXG4gIHB1YmxpYyByb2xlRm9ybSA9IG5ldyBGb3JtR3JvdXAoe1xuICAgIG5hbWU6IG5ldyBGb3JtQ29udHJvbChudWxsLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxuICAgIGRlc2NyaXB0aW9uOiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXG4gIH0pO1xuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHVibGljIGRhdGE6IERpYWxvZ0RhdGEsXG4gICAgcHJpdmF0ZSBhdXRob3JpemF0b3JzZXJ2aWNlOiBBdXRob3JpemF0b3JTZXJ2aWNlLFxuICAgIHB1YmxpYyBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxVcHNlcnRSb2xlQ29tcG9uZW50PlxuICApIHsgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMudXNlcnNEYXRhU291cmNlID0gbmV3IFVzZXJzRGF0YVNvdXJjZSh0aGlzLnVzZXJzRGF0YWJhc2UpO1xuICAgIHRoaXMuYXV0aG9yaXphdG9yc2VydmljZS5nZXRVc2Vycyh0aGlzLmRhdGEucm9vdEZpcmViYXNlUGF0aCkudGhlbih1c2VycyA9PiB7XG4gICAgICBpZiAodXNlcnMpIHtcbiAgICAgICAgdGhpcy51c2VycyA9IHVzZXJzLnNvcnQoKHByZXYsIGN1cnIpID0+IHtcbiAgICAgICAgICBpZiAocHJldi5kYXRhLm5hbWUgPiBjdXJyLmRhdGEubmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwcmV2LmRhdGEubmFtZSA8IGN1cnIuZGF0YS5uYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yb2xlVXNlcnMgPSB0aGlzLnVzZXJzLmZpbHRlcihcbiAgICAgICAgICB1c2VyID0+IHRoaXMuZGF0YSAmJiB0aGlzLmRhdGEucm9sZSAmJiB0aGlzLmRhdGEucm9sZS5kYXRhLnVzZXJzLmZpbmRJbmRleCh1c3IgPT4gdXNyID09PSB1c2VyLmlkKSA+IC0xXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0aGlzLnJvbGVVc2Vycykge1xuICAgICAgICAgIHRoaXMucm9sZVVzZXJzID0gdGhpcy5yb2xlVXNlcnMuc29ydCgocHJldiwgY3VycikgPT4ge1xuICAgICAgICAgICAgaWYgKHByZXYuZGF0YS5uYW1lID4gY3Vyci5kYXRhLm5hbWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJldi5kYXRhLm5hbWUgPCBjdXJyLmRhdGEubmFtZSkge1xuICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnVzZXJzRGF0YWJhc2UuZGF0YUNoYW5nZS5uZXh0KHRoaXMucm9sZVVzZXJzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICh0aGlzLmRhdGEucm9sZSkge1xuICAgICAgdGhpcy5yb2xlRm9ybS5jb250cm9scy5uYW1lLnNldFZhbHVlKHRoaXMuZGF0YS5yb2xlLmRhdGEubmFtZSk7XG4gICAgICB0aGlzLnJvbGVGb3JtLmNvbnRyb2xzLmRlc2NyaXB0aW9uLnNldFZhbHVlKHRoaXMuZGF0YS5yb2xlLmRhdGEuZGVzY3JpcHRpb24pO1xuICAgIH1cbiAgfVxuXG4gIG9uQWRkVXNlclRvUm9sZSgpIHtcbiAgICBjb25zdCBleGlzdFVzZXIgPSB0aGlzLnJvbGVVc2Vycy5maW5kSW5kZXgocm9sZVVzZXIgPT4gcm9sZVVzZXIuaWQgPT09IHRoaXMuc2VsZWN0VXNlci52YWx1ZSk7XG4gICAgaWYgKGV4aXN0VXNlciA9PT0gLTEpIHtcbiAgICAgIHRoaXMucm9sZVVzZXJzLnB1c2godGhpcy51c2Vycy5maW5kKHVzZXIgPT4gdXNlci5pZCA9PT0gdGhpcy5zZWxlY3RVc2VyLnZhbHVlKSk7XG4gICAgICB0aGlzLnJvbGVVc2VycyA9IHRoaXMucm9sZVVzZXJzLnNvcnQoKHByZXYsIGN1cnIpID0+IHtcbiAgICAgICAgaWYgKHByZXYuZGF0YS5uYW1lID4gY3Vyci5kYXRhLm5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJldi5kYXRhLm5hbWUgPCBjdXJyLmRhdGEubmFtZSkge1xuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0pO1xuICAgICAgdGhpcy51c2Vyc0RhdGFiYXNlLmRhdGFDaGFuZ2UubmV4dCh0aGlzLnJvbGVVc2Vycyk7XG4gICAgfVxuICB9XG5cbiAgb25SZW1vdmVVc2VyRnJvbVJvbGUodXNlcjogVXNlck9iaikge1xuICAgIGNvbnN0IHVzZXJJbmRleCA9IHRoaXMucm9sZVVzZXJzLmZpbmRJbmRleChyb2xlVXNlciA9PiByb2xlVXNlci5pZCA9PT0gdXNlci5pZCk7XG4gICAgaWYgKHVzZXJJbmRleCA+IC0xKSB7XG4gICAgICB0aGlzLnJvbGVVc2Vycy5zcGxpY2UodXNlckluZGV4LCAxKTtcbiAgICAgIHRoaXMudXNlcnNEYXRhYmFzZS5kYXRhQ2hhbmdlLm5leHQodGhpcy5yb2xlVXNlcnMpO1xuICAgIH1cbiAgfVxuXG4gIG9uU3VibWl0Um9sZSgpIHtcbiAgICBpZiAodGhpcy5yb2xlRm9ybS52YWxpZCkge1xuICAgICAgY29uc3Qgcm9sZVRvQWRkOiBSb2xlT2JqID0ge1xuICAgICAgICBpZDogdGhpcy5kYXRhLnJvbGUgPyB0aGlzLmRhdGEucm9sZS5pZCA6IG51bGwsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBuYW1lOiB0aGlzLnJvbGVGb3JtLmNvbnRyb2xzLm5hbWUudmFsdWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHRoaXMucm9sZUZvcm0uY29udHJvbHMuZGVzY3JpcHRpb24udmFsdWUsXG4gICAgICAgICAgdXNlcnM6IHRoaXMucm9sZVVzZXJzLm1hcCh1c2VyID0+IHVzZXIuaWQpLFxuICAgICAgICAgIHBlcm1pc3Npb25zOiBudWxsXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBpZiAocm9sZVRvQWRkLmlkKSB7XG4gICAgICAgIHRoaXMuYXV0aG9yaXphdG9yc2VydmljZS51cGRhdGVSb2xlKHRoaXMuZGF0YS5yb290RmlyZWJhc2VQYXRoLCByb2xlVG9BZGQpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHJvbGVUb0FkZCk7XG4gICAgICAgIH0pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICB0aGlzLnJvbGVGb3JtLmNvbnRyb2xzLm5hbWUuc2V0RXJyb3JzKHsgZGVmYXVsdGVycm9yOiB0cnVlIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYXV0aG9yaXphdG9yc2VydmljZS5hZGRSb2xlKHRoaXMuZGF0YS5yb290RmlyZWJhc2VQYXRoLCByb2xlVG9BZGQpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHJvbGVUb0FkZCk7XG4gICAgICAgIH0pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3Iua2V5ID09PSAnZXhpc3RzJykge1xuICAgICAgICAgICAgdGhpcy5yb2xlRm9ybS5jb250cm9scy5uYW1lLnNldEVycm9ycyh7IGV4aXN0czogdHJ1ZSB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yb2xlRm9ybS5jb250cm9scy5uYW1lLnNldEVycm9ycyh7IGRlZmF1bHRlcnJvcjogdHJ1ZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19