@firestitch/app-acl 12.3.0 → 12.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/app/components/acl-entries/acl-entries.component.d.ts +32 -32
  2. package/app/components/acl-entry/acl-entry.component.d.ts +29 -29
  3. package/app/components/acl-object-roles/acl-object-roles.component.d.ts +18 -18
  4. package/app/components/acl-permission-popover/acl-permission-popover.component.d.ts +12 -12
  5. package/app/components/acl-role/acl-role.component.d.ts +46 -46
  6. package/app/components/acl-role-popover/acl-role-popover.component.d.ts +13 -13
  7. package/app/components/acl-roles/acl-roles.component.d.ts +35 -35
  8. package/app/consts/acl-role-accesses.d.ts +5 -5
  9. package/app/enums/acl-role-access.d.ts +6 -6
  10. package/app/fs-app-acl.module.d.ts +31 -31
  11. package/app/injectors/app-acl-config.injector.d.ts +2 -2
  12. package/app/interfaces/acl-entry-data.d.ts +11 -11
  13. package/app/interfaces/acl-entry.d.ts +18 -18
  14. package/app/interfaces/acl-level.d.ts +3 -3
  15. package/app/interfaces/acl-object-entry.d.ts +11 -11
  16. package/app/interfaces/acl-object-role.d.ts +6 -6
  17. package/app/interfaces/acl-object.d.ts +4 -4
  18. package/app/interfaces/acl-permission.d.ts +7 -7
  19. package/app/interfaces/acl-role.d.ts +15 -15
  20. package/app/interfaces/app-acl-config.d.ts +7 -7
  21. package/app/interfaces/name-value.d.ts +4 -4
  22. package/app/services/app-acl.service.d.ts +18 -18
  23. package/bundles/firestitch-app-acl.umd.js +1151 -1154
  24. package/bundles/firestitch-app-acl.umd.js.map +1 -1
  25. package/esm2015/app/components/acl-entries/acl-entries.component.js +165 -165
  26. package/esm2015/app/components/acl-entry/acl-entry.component.js +90 -93
  27. package/esm2015/app/components/acl-object-roles/acl-object-roles.component.js +56 -56
  28. package/esm2015/app/components/acl-permission-popover/acl-permission-popover.component.js +32 -32
  29. package/esm2015/app/components/acl-role/acl-role.component.js +201 -201
  30. package/esm2015/app/components/acl-role-popover/acl-role-popover.component.js +37 -37
  31. package/esm2015/app/components/acl-roles/acl-roles.component.js +145 -145
  32. package/esm2015/app/consts/acl-role-accesses.js +7 -7
  33. package/esm2015/app/enums/acl-role-access.js +7 -7
  34. package/esm2015/app/fs-app-acl.module.js +123 -123
  35. package/esm2015/app/injectors/app-acl-config.injector.js +2 -2
  36. package/esm2015/app/interfaces/acl-entry-data.js +1 -1
  37. package/esm2015/app/interfaces/acl-entry.js +1 -1
  38. package/esm2015/app/interfaces/acl-level.js +1 -1
  39. package/esm2015/app/interfaces/acl-object-entry.js +1 -1
  40. package/esm2015/app/interfaces/acl-object-role.js +1 -1
  41. package/esm2015/app/interfaces/acl-object.js +1 -1
  42. package/esm2015/app/interfaces/acl-permission.js +1 -1
  43. package/esm2015/app/interfaces/acl-role.js +1 -1
  44. package/esm2015/app/interfaces/app-acl-config.js +1 -1
  45. package/esm2015/app/interfaces/name-value.js +1 -1
  46. package/esm2015/app/services/app-acl.service.js +77 -77
  47. package/esm2015/firestitch-app-acl.js +4 -4
  48. package/esm2015/public_api.js +10 -10
  49. package/fesm2015/firestitch-app-acl.js +793 -796
  50. package/fesm2015/firestitch-app-acl.js.map +1 -1
  51. package/firestitch-app-acl.d.ts +5 -5
  52. package/package.json +1 -1
  53. package/public_api.d.ts +20 -20
@@ -1,166 +1,166 @@
1
- import { takeUntil, map } from 'rxjs/operators';
2
- import { Component, ViewChild, Input } from '@angular/core';
3
- import { MatDialog } from '@angular/material/dialog';
4
- import { Subject, Observable } from 'rxjs';
5
- import { sortBy, groupBy, forOwn } from 'lodash-es';
6
- import { FsListComponent } from '@firestitch/list';
7
- import { FsPrompt } from '@firestitch/prompt';
8
- import { FsAppAclService } from '../../services/app-acl.service';
9
- import { FsAclEntryComponent } from '../acl-entry/acl-entry.component';
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "../../services/app-acl.service";
12
- import * as i2 from "@angular/material/dialog";
13
- import * as i3 from "@firestitch/prompt";
14
- import * as i4 from "@firestitch/list";
15
- import * as i5 from "@firestitch/badge";
16
- import * as i6 from "../acl-role-popover/acl-role-popover.component";
17
- import * as i7 from "@angular/common";
18
- import * as i8 from "@angular/flex-layout/flex";
19
- export class FsAclEntriesComponent {
20
- constructor(_appAclService, _dialog, _confirm) {
21
- this._appAclService = _appAclService;
22
- this._dialog = _dialog;
23
- this._confirm = _confirm;
24
- this.environmentShow = true;
25
- this.environmentLabel = 'Environment';
26
- this.actions = [];
27
- this.aclEntriesList = null;
28
- this.aclEntriesConfig = null;
29
- this.permissions = [];
30
- this._destroy$ = new Subject();
31
- }
32
- ngOnInit() {
33
- this._appAclService.getPermissions()
34
- .subscribe(response => {
35
- this.permissions = response;
36
- });
37
- this.aclEntriesConfig = {
38
- status: false,
39
- paging: false,
40
- actions: this.actions,
41
- rowActions: [
42
- {
43
- label: 'Remove All Roles',
44
- click: (aclObjectEntry) => {
45
- this._confirm
46
- .confirm({
47
- title: 'Remove All Roles',
48
- template: 'Are you sure you would like to remove all roles?',
49
- }).subscribe(() => {
50
- const data = this._appAclService.output(Object.assign(Object.assign({}, aclObjectEntry), { aclEntries: [] }));
51
- this.saveAclObjectEntry(data)
52
- .subscribe(() => {
53
- this.aclEntriesList.reload();
54
- });
55
- });
56
- }
57
- }
58
- ],
59
- fetch: () => {
60
- return new Observable((observer) => {
61
- this.loadAclEntries({
62
- aclRoles: true,
63
- aclRolePermissions: true,
64
- objects: true,
65
- aclRoleState: 'active',
66
- })
67
- .pipe(map((response) => this._appAclService.input(response)))
68
- .subscribe((aclEntries) => {
69
- const objects = aclEntries.reduce((items, item) => {
70
- if (item.object) {
71
- items[item.object.id] = item.object;
72
- }
73
- return items;
74
- }, {});
75
- const environments = aclEntries.reduce((items, item) => {
76
- if (item.environment) {
77
- items[item.environment.id] = item.environment;
78
- }
79
- return items;
80
- }, {});
81
- let aclObjectEntry = [];
82
- const grouped = groupBy(aclEntries, (item) => {
83
- return [item.aclRole.level, item.environmentId, item.objectId];
84
- });
85
- forOwn(grouped, (group, key) => {
86
- key = key.split(',');
87
- aclObjectEntry.push({
88
- object: objects[key[2]],
89
- level: key[0],
90
- environmentId: key[1] ? parseInt(key[1]) : null,
91
- environment: environments[key[1]],
92
- aclEntries: group,
93
- });
94
- });
95
- const hasApp = aclObjectEntry.some((item) => {
96
- return item.aclEntries.some((entry) => {
97
- return !entry.objectId;
98
- });
99
- });
100
- if (!hasApp) {
101
- aclObjectEntry.unshift({
102
- object: null, aclEntries: [],
103
- level: 'app',
104
- environmentId: null,
105
- });
106
- }
107
- aclObjectEntry = sortBy(aclObjectEntry, (item) => {
108
- return item.object ? item.level : '';
109
- });
110
- observer.next({ data: aclObjectEntry });
111
- observer.complete();
112
- });
113
- });
114
- },
115
- };
116
- }
117
- update(aclObjectEntry) {
118
- const data = {
119
- aclObjectEntry: aclObjectEntry,
120
- required: false,
121
- loadAclRoles: this.loadAclRoles,
122
- saveAclObjectEntry: this.saveAclObjectEntry
123
- };
124
- this._dialog.open(FsAclEntryComponent, {
125
- data: data
126
- })
127
- .afterClosed()
128
- .pipe(takeUntil(this._destroy$))
129
- .subscribe(() => {
130
- this.aclEntriesList.reload();
131
- });
132
- }
133
- ngOnDestroy() {
134
- this._destroy$.next();
135
- this._destroy$.complete();
136
- }
137
- reload() {
138
- this.aclEntriesList.reload();
139
- }
140
- }
141
- FsAclEntriesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsAclEntriesComponent, deps: [{ token: i1.FsAppAclService }, { token: i2.MatDialog }, { token: i3.FsPrompt }], target: i0.ɵɵFactoryTarget.Component });
142
- FsAclEntriesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: FsAclEntriesComponent, selector: "fs-acl-entries", inputs: { loadAclEntries: "loadAclEntries", loadAclRoles: "loadAclRoles", saveAclObjectEntry: "saveAclObjectEntry", environmentShow: "environmentShow", environmentLabel: "environmentLabel", actions: "actions" }, viewQueries: [{ propertyName: "aclEntriesList", first: true, predicate: FsListComponent, descendants: true }], ngImport: i0, template: "\n<fs-list [config]=\"aclEntriesConfig\">\n <fs-list-column>\n <ng-template fs-list-header>Context</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n <div\n *ngIf=\"row.object; else elseObject\"\n fxLayout=\"row\"\n fxLayoutAlign=\"start center\"\n fxLayoutGap=\"10px\">\n <fs-badge *ngIf=\"row.object.imageUrl\" shape=\"circle\" image=\"{{ row.object.imageUrl }}\"></fs-badge>\n <span>\n <div><small>{{ row.object.className }}</small></div>\n <a (click)=\"update(row)\">{{ row.object.name }}</a>\n </span>\n </div>\n\n <ng-template #elseObject>\n <a (click)=\"update(row)\">App</a>\n </ng-template>\n </ng-template>\n </fs-list-column>\n\n <fs-list-column [show]=\"environmentShow\">\n <ng-template fs-list-header>{{environmentLabel}}</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n {{row.environment?.name}}\n </ng-template>\n </fs-list-column>\n\n <fs-list-column>\n <ng-template fs-list-header>Roles</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n <div fxLayout=\"column\" fxLayoutGap=\"10px\">\n <div div *ngFor=\"let aclEntry of row.aclEntries\">\n <ng-container [ngSwitch]=\"row.level\">\n <ng-container *ngSwitchCase=\"'app'\">\n <fs-acl-role-popover [aclRole]=\"aclEntry.aclRole\" objectName=\"App\">{{aclEntry.aclRole.name}}</fs-acl-role-popover>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <ng-container *ngIf=\"row.object\">\n <fs-acl-role-popover [aclRole]=\"aclEntry.aclRole\">{{aclEntry.aclRole.name}}</fs-acl-role-popover>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </ng-template>\n </fs-list-column>\n</fs-list>\n", styles: [""], components: [{ type: i4.FsListComponent, selector: "fs-list", inputs: ["config", "loaderLines"], outputs: ["filtersReady"] }, { type: i5.FsBadgeComponent, selector: "fs-badge", inputs: ["color", "text", "tooltip", "size", "shape", "image", "icon", "iconSize", "iconColor", "backgroundSize"] }, { type: i6.FsAclRolePopoverComponent, selector: "fs-acl-role-popover", inputs: ["aclRole", "objectName"] }], directives: [{ type: i4.FsListColumnDirective, selector: "fs-list-column", inputs: ["show", "title", "name", "customize", "sortable", "sortableDefault", "direction", "align", "width", "class"] }, { type: i4.FsListHeaderDirective, selector: "[fs-list-header]", inputs: ["colspan", "align", "class"] }, { type: i4.FsListCellDirective, selector: "[fs-list-cell]", inputs: ["colspan", "align", "class"] }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i8.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i8.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i7.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i7.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i7.NgSwitchDefault, selector: "[ngSwitchDefault]" }] });
143
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsAclEntriesComponent, decorators: [{
144
- type: Component,
145
- args: [{
146
- selector: 'fs-acl-entries',
147
- templateUrl: './acl-entries.component.html',
148
- styleUrls: ['./acl-entries.component.scss']
149
- }]
150
- }], ctorParameters: function () { return [{ type: i1.FsAppAclService }, { type: i2.MatDialog }, { type: i3.FsPrompt }]; }, propDecorators: { loadAclEntries: [{
151
- type: Input
152
- }], loadAclRoles: [{
153
- type: Input
154
- }], saveAclObjectEntry: [{
155
- type: Input
156
- }], environmentShow: [{
157
- type: Input
158
- }], environmentLabel: [{
159
- type: Input
160
- }], actions: [{
161
- type: Input
162
- }], aclEntriesList: [{
163
- type: ViewChild,
164
- args: [FsListComponent]
165
- }] } });
1
+ import { takeUntil, map } from 'rxjs/operators';
2
+ import { Component, ViewChild, Input } from '@angular/core';
3
+ import { MatDialog } from '@angular/material/dialog';
4
+ import { Subject, Observable } from 'rxjs';
5
+ import { sortBy, groupBy, forOwn } from 'lodash-es';
6
+ import { FsListComponent } from '@firestitch/list';
7
+ import { FsPrompt } from '@firestitch/prompt';
8
+ import { FsAppAclService } from '../../services/app-acl.service';
9
+ import { FsAclEntryComponent } from '../acl-entry/acl-entry.component';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "../../services/app-acl.service";
12
+ import * as i2 from "@angular/material/dialog";
13
+ import * as i3 from "@firestitch/prompt";
14
+ import * as i4 from "@firestitch/list";
15
+ import * as i5 from "@firestitch/badge";
16
+ import * as i6 from "../acl-role-popover/acl-role-popover.component";
17
+ import * as i7 from "@angular/common";
18
+ import * as i8 from "@angular/flex-layout/flex";
19
+ export class FsAclEntriesComponent {
20
+ constructor(_appAclService, _dialog, _confirm) {
21
+ this._appAclService = _appAclService;
22
+ this._dialog = _dialog;
23
+ this._confirm = _confirm;
24
+ this.environmentShow = true;
25
+ this.environmentLabel = 'Environment';
26
+ this.actions = [];
27
+ this.aclEntriesList = null;
28
+ this.aclEntriesConfig = null;
29
+ this.permissions = [];
30
+ this._destroy$ = new Subject();
31
+ }
32
+ ngOnInit() {
33
+ this._appAclService.getPermissions()
34
+ .subscribe(response => {
35
+ this.permissions = response;
36
+ });
37
+ this.aclEntriesConfig = {
38
+ status: false,
39
+ paging: false,
40
+ actions: this.actions,
41
+ rowActions: [
42
+ {
43
+ label: 'Remove All Roles',
44
+ click: (aclObjectEntry) => {
45
+ this._confirm
46
+ .confirm({
47
+ title: 'Remove All Roles',
48
+ template: 'Are you sure you would like to remove all roles?',
49
+ }).subscribe(() => {
50
+ const data = this._appAclService.output(Object.assign(Object.assign({}, aclObjectEntry), { aclEntries: [] }));
51
+ this.saveAclObjectEntry(data)
52
+ .subscribe(() => {
53
+ this.aclEntriesList.reload();
54
+ });
55
+ });
56
+ }
57
+ }
58
+ ],
59
+ fetch: () => {
60
+ return new Observable((observer) => {
61
+ this.loadAclEntries({
62
+ aclRoles: true,
63
+ aclRolePermissions: true,
64
+ objects: true,
65
+ aclRoleState: 'active',
66
+ })
67
+ .pipe(map((response) => this._appAclService.input(response)))
68
+ .subscribe((aclEntries) => {
69
+ const objects = aclEntries.reduce((items, item) => {
70
+ if (item.object) {
71
+ items[item.object.id] = item.object;
72
+ }
73
+ return items;
74
+ }, {});
75
+ const environments = aclEntries.reduce((items, item) => {
76
+ if (item.environment) {
77
+ items[item.environment.id] = item.environment;
78
+ }
79
+ return items;
80
+ }, {});
81
+ let aclObjectEntry = [];
82
+ const grouped = groupBy(aclEntries, (item) => {
83
+ return [item.aclRole.level, item.environmentId, item.objectId];
84
+ });
85
+ forOwn(grouped, (group, key) => {
86
+ key = key.split(',');
87
+ aclObjectEntry.push({
88
+ object: objects[key[2]],
89
+ level: key[0],
90
+ environmentId: key[1] ? parseInt(key[1]) : null,
91
+ environment: environments[key[1]],
92
+ aclEntries: group,
93
+ });
94
+ });
95
+ const hasApp = aclObjectEntry.some((item) => {
96
+ return item.aclEntries.some((entry) => {
97
+ return !entry.objectId;
98
+ });
99
+ });
100
+ if (!hasApp) {
101
+ aclObjectEntry.unshift({
102
+ object: null, aclEntries: [],
103
+ level: 'app',
104
+ environmentId: null,
105
+ });
106
+ }
107
+ aclObjectEntry = sortBy(aclObjectEntry, (item) => {
108
+ return item.object ? item.level : '';
109
+ });
110
+ observer.next({ data: aclObjectEntry });
111
+ observer.complete();
112
+ });
113
+ });
114
+ },
115
+ };
116
+ }
117
+ update(aclObjectEntry) {
118
+ const data = {
119
+ aclObjectEntry: aclObjectEntry,
120
+ required: false,
121
+ loadAclRoles: this.loadAclRoles,
122
+ saveAclObjectEntry: this.saveAclObjectEntry
123
+ };
124
+ this._dialog.open(FsAclEntryComponent, {
125
+ data: data
126
+ })
127
+ .afterClosed()
128
+ .pipe(takeUntil(this._destroy$))
129
+ .subscribe(() => {
130
+ this.aclEntriesList.reload();
131
+ });
132
+ }
133
+ ngOnDestroy() {
134
+ this._destroy$.next();
135
+ this._destroy$.complete();
136
+ }
137
+ reload() {
138
+ this.aclEntriesList.reload();
139
+ }
140
+ }
141
+ FsAclEntriesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsAclEntriesComponent, deps: [{ token: i1.FsAppAclService }, { token: i2.MatDialog }, { token: i3.FsPrompt }], target: i0.ɵɵFactoryTarget.Component });
142
+ FsAclEntriesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: FsAclEntriesComponent, selector: "fs-acl-entries", inputs: { loadAclEntries: "loadAclEntries", loadAclRoles: "loadAclRoles", saveAclObjectEntry: "saveAclObjectEntry", environmentShow: "environmentShow", environmentLabel: "environmentLabel", actions: "actions" }, viewQueries: [{ propertyName: "aclEntriesList", first: true, predicate: FsListComponent, descendants: true }], ngImport: i0, template: "\n<fs-list [config]=\"aclEntriesConfig\">\n <fs-list-column>\n <ng-template fs-list-header>Context</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n <div\n *ngIf=\"row.object; else elseObject\"\n fxLayout=\"row\"\n fxLayoutAlign=\"start center\"\n fxLayoutGap=\"10px\">\n <fs-badge *ngIf=\"row.object.imageUrl\" shape=\"circle\" image=\"{{ row.object.imageUrl }}\"></fs-badge>\n <span>\n <div><small>{{ row.object.className }}</small></div>\n <a (click)=\"update(row)\">{{ row.object.name }}</a>\n </span>\n </div>\n\n <ng-template #elseObject>\n <a (click)=\"update(row)\">App</a>\n </ng-template>\n </ng-template>\n </fs-list-column>\n\n <fs-list-column [show]=\"environmentShow\">\n <ng-template fs-list-header>{{environmentLabel}}</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n {{row.environment?.name}}\n </ng-template>\n </fs-list-column>\n\n <fs-list-column>\n <ng-template fs-list-header>Roles</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n <div fxLayout=\"column\" fxLayoutGap=\"10px\">\n <div div *ngFor=\"let aclEntry of row.aclEntries\">\n <ng-container [ngSwitch]=\"row.level\">\n <ng-container *ngSwitchCase=\"'app'\">\n <fs-acl-role-popover [aclRole]=\"aclEntry.aclRole\" objectName=\"App\">{{aclEntry.aclRole.name}}</fs-acl-role-popover>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <ng-container *ngIf=\"row.object\">\n <fs-acl-role-popover [aclRole]=\"aclEntry.aclRole\">{{aclEntry.aclRole.name}}</fs-acl-role-popover>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </ng-template>\n </fs-list-column>\n</fs-list>\n", styles: [""], components: [{ type: i4.FsListComponent, selector: "fs-list", inputs: ["config", "loaderLines"], outputs: ["filtersReady"] }, { type: i5.FsBadgeComponent, selector: "fs-badge", inputs: ["color", "text", "tooltip", "size", "shape", "image", "icon", "iconSize", "iconColor", "backgroundSize"] }, { type: i6.FsAclRolePopoverComponent, selector: "fs-acl-role-popover", inputs: ["aclRole", "objectName"] }], directives: [{ type: i4.FsListColumnDirective, selector: "fs-list-column", inputs: ["show", "title", "name", "customize", "sortable", "sortableDefault", "direction", "align", "width", "class"] }, { type: i4.FsListHeaderDirective, selector: "[fs-list-header]", inputs: ["colspan", "align", "class"] }, { type: i4.FsListCellDirective, selector: "[fs-list-cell]", inputs: ["colspan", "align", "class"] }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i8.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i8.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i7.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i7.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i7.NgSwitchDefault, selector: "[ngSwitchDefault]" }] });
143
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsAclEntriesComponent, decorators: [{
144
+ type: Component,
145
+ args: [{
146
+ selector: 'fs-acl-entries',
147
+ templateUrl: './acl-entries.component.html',
148
+ styleUrls: ['./acl-entries.component.scss']
149
+ }]
150
+ }], ctorParameters: function () { return [{ type: i1.FsAppAclService }, { type: i2.MatDialog }, { type: i3.FsPrompt }]; }, propDecorators: { loadAclEntries: [{
151
+ type: Input
152
+ }], loadAclRoles: [{
153
+ type: Input
154
+ }], saveAclObjectEntry: [{
155
+ type: Input
156
+ }], environmentShow: [{
157
+ type: Input
158
+ }], environmentLabel: [{
159
+ type: Input
160
+ }], actions: [{
161
+ type: Input
162
+ }], aclEntriesList: [{
163
+ type: ViewChild,
164
+ args: [FsListComponent]
165
+ }] } });
166
166
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNsLWVudHJpZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb21wb25lbnRzL2FjbC1lbnRyaWVzL2FjbC1lbnRyaWVzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy9hY2wtZW50cmllcy9hY2wtZW50cmllcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxTQUFTLEVBQVUsU0FBUyxFQUFhLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFckQsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXBELE9BQU8sRUFBZ0IsZUFBZSxFQUFnQixNQUFNLGtCQUFrQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU5QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFLakUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7Ozs7Ozs7Ozs7QUFRdkUsTUFBTSxPQUFPLHFCQUFxQjtJQWlCaEMsWUFDbUIsY0FBK0IsRUFDL0IsT0FBa0IsRUFDM0IsUUFBa0I7UUFGVCxtQkFBYyxHQUFkLGNBQWMsQ0FBaUI7UUFDL0IsWUFBTyxHQUFQLE9BQU8sQ0FBVztRQUMzQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBZlosb0JBQWUsR0FBRyxJQUFJLENBQUM7UUFDdkIscUJBQWdCLEdBQUcsYUFBYSxDQUFDO1FB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QWUsZ0RDakM1QixtMkRBa0RBOzRGRDFCYSxxQkFBcUI7a0JBTGpDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGdCQUFnQjtvQkFDMUIsV0FBVyxFQUFFLDhCQUE4QjtvQkFDM0MsU0FBUyxFQUFFLENBQUMsOEJBQThCLENBQUM7aUJBQzVDO3FKQUdpQixjQUFjO3NCQUE3QixLQUFLO2dCQUNVLFlBQVk7c0JBQTNCLEtBQUs7Z0JBQ1Usa0JBQWtCO3NCQUFqQyxLQUFLO2dCQUNVLGVBQWU7c0JBQTlCLEtBQUs7Z0JBQ1UsZ0JBQWdCO3NCQUEvQixLQUFLO2dCQUNVLE9BQU87c0JBQXRCLEtBQUs7Z0JBR0MsY0FBYztzQkFEcEIsU0FBUzt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdGFrZVVudGlsLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgVmlld0NoaWxkLCBPbkRlc3Ryb3ksIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuXG5pbXBvcnQgeyBTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IHNvcnRCeSwgZ3JvdXBCeSwgZm9yT3duIH0gZnJvbSAnbG9kYXNoLWVzJztcblxuaW1wb3J0IHsgRnNMaXN0QWN0aW9uLCBGc0xpc3RDb21wb25lbnQsIEZzTGlzdENvbmZpZyB9IGZyb20gJ0BmaXJlc3RpdGNoL2xpc3QnO1xuaW1wb3J0IHsgRnNQcm9tcHQgfSBmcm9tICdAZmlyZXN0aXRjaC9wcm9tcHQnO1xuXG5pbXBvcnQgeyBGc0FwcEFjbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hcHAtYWNsLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWNsRW50cnlEYXRhIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9hY2wtZW50cnktZGF0YSc7XG5pbXBvcnQgeyBBY2xFbnRyeSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvYWNsLWVudHJ5JztcbmltcG9ydCB7IEFjbFJvbGUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2FjbC1yb2xlJztcbmltcG9ydCB7IEFjbE9iamVjdEVudHJ5IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9hY2wtb2JqZWN0LWVudHJ5JztcbmltcG9ydCB7IEZzQWNsRW50cnlDb21wb25lbnQgfSBmcm9tICcuLi9hY2wtZW50cnkvYWNsLWVudHJ5LmNvbXBvbmVudCc7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZnMtYWNsLWVudHJpZXMnLFxuICB0ZW1wbGF0ZVVybDogJy4vYWNsLWVudHJpZXMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9hY2wtZW50cmllcy5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEZzQWNsRW50cmllc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICBASW5wdXQoKSBwdWJsaWMgbG9hZEFjbEVudHJpZXM6IChxdWVyeTogYW55KSA9PiBPYnNlcnZhYmxlPEFjbEVudHJ5W10+O1xuICBASW5wdXQoKSBwdWJsaWMgbG9hZEFjbFJvbGVzOiAocXVlcnk6IGFueSkgPT4gT2JzZXJ2YWJsZTxBY2xSb2xlW10+O1xuICBASW5wdXQoKSBwdWJsaWMgc2F2ZUFjbE9iamVjdEVudHJ5OiAoYWNsT2JqZWN0RW50cnk6IEFjbE9iamVjdEVudHJ5KSA9PiBPYnNlcnZhYmxlPGFueT47XG4gIEBJbnB1dCgpIHB1YmxpYyBlbnZpcm9ubWVudFNob3cgPSB0cnVlO1xuICBASW5wdXQoKSBwdWJsaWMgZW52aXJvbm1lbnRMYWJlbCA9ICdFbnZpcm9ubWVudCc7XG4gIEBJbnB1dCgpIHB1YmxpYyBhY3Rpb25zOiBGc0xpc3RBY3Rpb25bXSA9IFtdO1xuXG4gIEBWaWV3Q2hpbGQoRnNMaXN0Q29tcG9uZW50KVxuICBwdWJsaWMgYWNsRW50cmllc0xpc3Q6IEZzTGlzdENvbXBvbmVudCA9IG51bGw7XG5cbiAgcHVibGljIGFjbEVudHJpZXNDb25maWc6IEZzTGlzdENvbmZpZyA9IG51bGw7XG4gIHB1YmxpYyBwZXJtaXNzaW9uczogYW55W10gPSBbXTtcblxuICBwcml2YXRlIF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfYXBwQWNsU2VydmljZTogRnNBcHBBY2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2RpYWxvZzogTWF0RGlhbG9nLFxuICAgIHByaXZhdGUgX2NvbmZpcm06IEZzUHJvbXB0LFxuICApIHt9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX2FwcEFjbFNlcnZpY2UuZ2V0UGVybWlzc2lvbnMoKVxuICAgICAgLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSByZXNwb25zZTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5hY2xFbnRyaWVzQ29uZmlnID0ge1xuICAgICAgc3RhdHVzOiBmYWxzZSxcbiAgICAgIHBhZ2luZzogZmFsc2UsXG4gICAgICBhY3Rpb25zOiB0aGlzLmFjdGlvbnMsXG4gICAgICByb3dBY3Rpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ1JlbW92ZSBBbGwgUm9sZXMnLFxuICAgICAgICAgIGNsaWNrOiAoYWNsT2JqZWN0RW50cnk6IEFjbE9iamVjdEVudHJ5KSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9jb25maXJtXG4gICAgICAgICAgICAgIC5jb25maXJtKHtcbiAgICAgICAgICAgICAgICB0aXRsZTogJ1JlbW92ZSBBbGwgUm9sZXMnLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiAnQXJlIHlvdSBzdXJlIHlvdSB3b3VsZCBsaWtlIHRvIHJlbW92ZSBhbGwgcm9sZXM/JyxcbiAgICAgICAgICAgICAgfSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5fYXBwQWNsU2VydmljZS5vdXRwdXQoeyAuLi5hY2xPYmplY3RFbnRyeSwgYWNsRW50cmllczogW10gfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlQWNsT2JqZWN0RW50cnkoZGF0YSlcbiAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjbEVudHJpZXNMaXN0LnJlbG9hZCgpO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIGZldGNoOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXIpID0+IHtcbiAgICAgICAgICB0aGlzLmxvYWRBY2xFbnRyaWVzKHtcbiAgICAgICAgICAgIGFjbFJvbGVzOiB0cnVlLFxuICAgICAgICAgICAgYWNsUm9sZVBlcm1pc3Npb25zOiB0cnVlLFxuICAgICAgICAgICAgb2JqZWN0czogdHJ1ZSxcbiAgICAgICAgICAgIGFjbFJvbGVTdGF0ZTogJ2FjdGl2ZScsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB0aGlzLl9hcHBBY2xTZXJ2aWNlLmlucHV0KHJlc3BvbnNlKSksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChhY2xFbnRyaWVzOiBBY2xFbnRyeVtdKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IG9iamVjdHMgPSBhY2xFbnRyaWVzLnJlZHVjZSgoaXRlbXMsIGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5vYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgIGl0ZW1zW2l0ZW0ub2JqZWN0LmlkXSA9IGl0ZW0ub2JqZWN0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbXM7XG4gICAgICAgICAgICAgIH0sIHt9KTtcblxuICAgICAgICAgICAgICBjb25zdCBlbnZpcm9ubWVudHMgPSBhY2xFbnRyaWVzLnJlZHVjZSgoaXRlbXMsIGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5lbnZpcm9ubWVudCkge1xuICAgICAgICAgICAgICAgICAgaXRlbXNbaXRlbS5lbnZpcm9ubWVudC5pZF0gPSBpdGVtLmVudmlyb25tZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbXM7XG4gICAgICAgICAgICAgIH0sIHt9KTtcblxuICAgICAgICAgICAgICBsZXQgYWNsT2JqZWN0RW50cnk6IEFjbE9iamVjdEVudHJ5W10gPSBbXTtcbiAgICAgICAgICAgICAgY29uc3QgZ3JvdXBlZCA9IGdyb3VwQnkoYWNsRW50cmllcywgKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW2l0ZW0uYWNsUm9sZS5sZXZlbCwgaXRlbS5lbnZpcm9ubWVudElkLCBpdGVtLm9iamVjdElkXTtcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgZm9yT3duKGdyb3VwZWQsIChncm91cCwga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAga2V5ID0ga2V5LnNwbGl0KCcsJyk7XG4gICAgICAgICAgICAgICAgYWNsT2JqZWN0RW50cnkucHVzaCh7XG4gICAgICAgICAgICAgICAgICBvYmplY3Q6IG9iamVjdHNba2V5WzJdXSxcbiAgICAgICAgICAgICAgICAgIGxldmVsOiBrZXlbMF0sXG4gICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudElkOiBrZXlbMV0gPyBwYXJzZUludChrZXlbMV0pIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50OiBlbnZpcm9ubWVudHNba2V5WzFdXSxcbiAgICAgICAgICAgICAgICAgIGFjbEVudHJpZXM6IGdyb3VwLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBjb25zdCBoYXNBcHAgPSBhY2xPYmplY3RFbnRyeS5zb21lKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uYWNsRW50cmllcy5zb21lKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuICFlbnRyeS5vYmplY3RJZDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgaWYgKCFoYXNBcHApIHtcbiAgICAgICAgICAgICAgICBhY2xPYmplY3RFbnRyeS51bnNoaWZ0KHtcbiAgICAgICAgICAgICAgICAgIG9iamVjdDogbnVsbCwgYWNsRW50cmllczogW10sXG4gICAgICAgICAgICAgICAgICBsZXZlbDogJ2FwcCcsXG4gICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudElkOiBudWxsLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYWNsT2JqZWN0RW50cnkgPSBzb3J0QnkoYWNsT2JqZWN0RW50cnksIChpdGVtOiBBY2xPYmplY3RFbnRyeSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLm9iamVjdCA/IGl0ZW0ubGV2ZWwgOiAnJztcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh7IGRhdGE6IGFjbE9iamVjdEVudHJ5IH0pO1xuICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZShhY2xPYmplY3RFbnRyeTogQWNsT2JqZWN0RW50cnkpIHtcblxuICAgIGNvbnN0IGRhdGE6IEFjbEVudHJ5RGF0YSA9IHtcbiAgICAgIGFjbE9iamVjdEVudHJ5OiBhY2xPYmplY3RFbnRyeSxcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIGxvYWRBY2xSb2xlczogdGhpcy5sb2FkQWNsUm9sZXMsXG4gICAgICBzYXZlQWNsT2JqZWN0RW50cnk6IHRoaXMuc2F2ZUFjbE9iamVjdEVudHJ5XG4gICAgfVxuXG4gICAgdGhpcy5fZGlhbG9nLm9wZW4oRnNBY2xFbnRyeUNvbXBvbmVudCwge1xuICAgICAgZGF0YTogZGF0YVxuICAgIH0pXG4gICAgICAuYWZ0ZXJDbG9zZWQoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5hY2xFbnRyaWVzTGlzdC5yZWxvYWQoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLl9kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHVibGljIHJlbG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLmFjbEVudHJpZXNMaXN0LnJlbG9hZCgpO1xuICB9XG5cbn1cbiIsIlxuPGZzLWxpc3QgW2NvbmZpZ109XCJhY2xFbnRyaWVzQ29uZmlnXCI+XG4gIDxmcy1saXN0LWNvbHVtbj5cbiAgICA8bmctdGVtcGxhdGUgZnMtbGlzdC1oZWFkZXI+Q29udGV4dDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlIGZzLWxpc3QtY2VsbCBsZXQtcm93PVwicm93XCI+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwicm93Lm9iamVjdDsgZWxzZSBlbHNlT2JqZWN0XCJcbiAgICAgICAgZnhMYXlvdXQ9XCJyb3dcIlxuICAgICAgICBmeExheW91dEFsaWduPVwic3RhcnQgY2VudGVyXCJcbiAgICAgICAgZnhMYXlvdXRHYXA9XCIxMHB4XCI+XG4gICAgICAgICAgPGZzLWJhZGdlICpuZ0lmPVwicm93Lm9iamVjdC5pbWFnZVVybFwiIHNoYXBlPVwiY2lyY2xlXCIgaW1hZ2U9XCJ7eyByb3cub2JqZWN0LmltYWdlVXJsIH19XCI+PC9mcy1iYWRnZT5cbiAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgIDxkaXY+PHNtYWxsPnt7IHJvdy5vYmplY3QuY2xhc3NOYW1lIH19PC9zbWFsbD48L2Rpdj5cbiAgICAgICAgICAgIDxhIChjbGljayk9XCJ1cGRhdGUocm93KVwiPnt7IHJvdy5vYmplY3QubmFtZSB9fTwvYT5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPG5nLXRlbXBsYXRlICNlbHNlT2JqZWN0PlxuICAgICAgICA8YSAoY2xpY2spPVwidXBkYXRlKHJvdylcIj5BcHA8L2E+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZnMtbGlzdC1jb2x1bW4+XG5cbiAgPGZzLWxpc3QtY29sdW1uIFtzaG93XT1cImVudmlyb25tZW50U2hvd1wiPlxuICAgIDxuZy10ZW1wbGF0ZSBmcy1saXN0LWhlYWRlcj57e2Vudmlyb25tZW50TGFiZWx9fTwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlIGZzLWxpc3QtY2VsbCBsZXQtcm93PVwicm93XCI+XG4gICAgICB7e3Jvdy5lbnZpcm9ubWVudD8ubmFtZX19XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9mcy1saXN0LWNvbHVtbj5cblxuICA8ZnMtbGlzdC1jb2x1bW4+XG4gICAgPG5nLXRlbXBsYXRlIGZzLWxpc3QtaGVhZGVyPlJvbGVzPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgZnMtbGlzdC1jZWxsIGxldC1yb3c9XCJyb3dcIj5cbiAgICAgIDxkaXYgZnhMYXlvdXQ9XCJjb2x1bW5cIiBmeExheW91dEdhcD1cIjEwcHhcIj5cbiAgICAgICAgPGRpdiBkaXYgKm5nRm9yPVwibGV0IGFjbEVudHJ5IG9mIHJvdy5hY2xFbnRyaWVzXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwicm93LmxldmVsXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYXBwJ1wiPlxuICAgICAgICAgICAgICA8ZnMtYWNsLXJvbGUtcG9wb3ZlciBbYWNsUm9sZV09XCJhY2xFbnRyeS5hY2xSb2xlXCIgb2JqZWN0TmFtZT1cIkFwcFwiPnt7YWNsRW50cnkuYWNsUm9sZS5uYW1lfX08L2ZzLWFjbC1yb2xlLXBvcG92ZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdD5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJvdy5vYmplY3RcIj5cbiAgICAgICAgICAgICAgICA8ZnMtYWNsLXJvbGUtcG9wb3ZlciBbYWNsUm9sZV09XCJhY2xFbnRyeS5hY2xSb2xlXCI+e3thY2xFbnRyeS5hY2xSb2xlLm5hbWV9fTwvZnMtYWNsLXJvbGUtcG9wb3Zlcj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L2ZzLWxpc3QtY29sdW1uPlxuPC9mcy1saXN0PlxuIl19