asp-lib 1.0.13 → 1.0.15

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 (70) hide show
  1. package/esm2022/lib/application-menu/application-menu.component.mjs +3 -3
  2. package/esm2022/lib/asp-lib.module.mjs +24 -8
  3. package/esm2022/lib/assign-roles/assign-roles.component.mjs +6 -5
  4. package/esm2022/lib/basic-item/basic-item.component.mjs +3 -3
  5. package/esm2022/lib/checkbox/checkbox.component.mjs +3 -3
  6. package/esm2022/lib/checkbox-field/checkbox-field.component.mjs +3 -3
  7. package/esm2022/lib/company-dropdown/company-dropdown.component.mjs +3 -3
  8. package/esm2022/lib/dropdown/dropdown.component.mjs +3 -3
  9. package/esm2022/lib/entity-admin/entity-admin.component.mjs +378 -0
  10. package/esm2022/lib/form/form.component.mjs +30 -6
  11. package/esm2022/lib/form-2/form-2.component.mjs +83 -0
  12. package/esm2022/lib/header/header.component.mjs +3 -3
  13. package/esm2022/lib/input/input.component.mjs +9 -3
  14. package/esm2022/lib/interfaces/interfaces.mjs +34 -1
  15. package/esm2022/lib/items-selector/items-selector.component.mjs +42 -22
  16. package/esm2022/lib/items-viewer/items-viewer.component.mjs +64 -34
  17. package/esm2022/lib/list/list.component.mjs +3 -3
  18. package/esm2022/lib/loader/loader.component.mjs +3 -3
  19. package/esm2022/lib/menu/menu.component.mjs +3 -3
  20. package/esm2022/lib/menu-admin/menu-admin.component.mjs +4 -3
  21. package/esm2022/lib/modules-admin/modules-admin.component.mjs +92 -0
  22. package/esm2022/lib/move-menu-option/move-menu-option.component.mjs +3 -3
  23. package/esm2022/lib/multi-option-dialog/multi-option-dialog.component.mjs +3 -3
  24. package/esm2022/lib/nested-items-selector/nested-items-selector.component.mjs +189 -0
  25. package/esm2022/lib/notifications/notifications.component.mjs +3 -3
  26. package/esm2022/lib/pipes/translate.pipe.mjs +118 -0
  27. package/esm2022/lib/radio-button/radio-button.component.mjs +3 -3
  28. package/esm2022/lib/radio-group/radio-group.component.mjs +4 -3
  29. package/esm2022/lib/recents-dropdown/recents-dropdown.component.mjs +3 -3
  30. package/esm2022/lib/resource-actions/resource-actions.component.mjs +4 -3
  31. package/esm2022/lib/role-card/role-card.component.mjs +4 -3
  32. package/esm2022/lib/role-info/role-info.component.mjs +4 -3
  33. package/esm2022/lib/security-admin/security-admin.component.mjs +50 -127
  34. package/esm2022/lib/select/select.component.mjs +4 -3
  35. package/esm2022/lib/services/security-admin.service.mjs +81 -86
  36. package/esm2022/lib/snackbar/snackbar.component.mjs +3 -3
  37. package/esm2022/lib/translate.pipe.mjs +16 -0
  38. package/esm2022/lib/tree/tree.component.mjs +3 -3
  39. package/esm2022/lib/user-dropdown/user-dropdown.component.mjs +3 -3
  40. package/esm2022/lib/utils/utils.mjs +15 -0
  41. package/esm2022/public-api.mjs +2 -2
  42. package/fesm2022/asp-lib.mjs +972 -415
  43. package/fesm2022/asp-lib.mjs.map +1 -1
  44. package/lib/asp-lib.module.d.ts +22 -17
  45. package/lib/entity-admin/entity-admin.component.d.ts +92 -0
  46. package/lib/form/form.component.d.ts +4 -0
  47. package/lib/form-2/form-2.component.d.ts +24 -0
  48. package/lib/input/input.component.d.ts +3 -1
  49. package/lib/interfaces/interfaces.d.ts +51 -3
  50. package/lib/items-selector/items-selector.component.d.ts +13 -6
  51. package/lib/items-viewer/items-viewer.component.d.ts +10 -3
  52. package/lib/modules-admin/modules-admin.component.d.ts +39 -0
  53. package/lib/nested-items-selector/nested-items-selector.component.d.ts +57 -0
  54. package/lib/pipes/translate.pipe.d.ts +11 -0
  55. package/lib/security-admin/security-admin.component.d.ts +7 -30
  56. package/lib/services/security-admin.service.d.ts +13 -37
  57. package/lib/translate.pipe.d.ts +7 -0
  58. package/lib/utils/utils.d.ts +3 -0
  59. package/package.json +3 -2
  60. package/public-api.d.ts +1 -1
  61. package/src/lib/assets/fonts/fonts/asp-lib-icons.eot +0 -0
  62. package/src/lib/assets/fonts/fonts/asp-lib-icons.svg +48 -46
  63. package/src/lib/assets/fonts/fonts/asp-lib-icons.ttf +0 -0
  64. package/src/lib/assets/fonts/fonts/asp-lib-icons.woff +0 -0
  65. package/src/lib/assets/fonts/selection.json +1 -1
  66. package/src/lib/assets/fonts/style.css +144 -144
  67. package/src/lib/assets/theme.scss +139 -0
  68. package/esm2022/lib/users-admin/users-admin.component.mjs +0 -283
  69. package/lib/users-admin/users-admin.component.d.ts +0 -72
  70. package/src/lib/assets/theme.css +0 -126
@@ -1,5 +1,6 @@
1
1
  import { Injectable } from '@angular/core';
2
- import { Subject } from 'rxjs';
2
+ import { from, map, mergeMap, of, reduce, Subject, switchMap } from 'rxjs';
3
+ import { defaultSwitchMapper } from '../utils/utils';
3
4
  import * as i0 from "@angular/core";
4
5
  import * as i1 from "@angular/common/http";
5
6
  const paramNames = {
@@ -23,26 +24,11 @@ export class SecurityAdminService {
23
24
  this.selectedCustomerSubject = new Subject();
24
25
  this.selectedRoleSubject = new Subject();
25
26
  this.reloadSubject = new Subject();
26
- this.usersByCustomerEndpoint = '';
27
- this.assignResourceEndpoint = '';
28
- this.getActionsEndpoint = '';
29
- this.savePermissionsEndpoint = '';
30
- this.listRolesEndpoint = '';
31
- this.resourcesByRoleEndpoint = '';
32
- this.rolesByUserEndpoint = '';
33
- this.getMenuTreeEndpoint = '';
34
- this.saveMenuOptionEndpoint = '';
35
- this.deleteMenuOptionEndpoint = '';
36
- this.assignUserRoleEndpoint = '';
37
- this.rolesByCustomerEndpoint = '';
38
- this.assignCustomerRoleEndpoint = '';
39
- this.usersByRoleEndpoint = '';
40
- this.customersByRoleEndpoint = '';
41
- this.listUsersEndpoint = '';
42
- this.assignRoleUsersEndpoint = '';
43
- this.assignRoleCustomersEndpoint = '';
27
+ this.endpoints = {};
28
+ this.language = 'en';
44
29
  this.theme = 'default';
45
- this.msgLabel = { "User": "Usuario", "Customer": "Cliente", "Role": "Rol" };
30
+ this.msgLabel = { "User": "Usuario", "Customer": "Empresa", "Role": "Rol" };
31
+ this.blockCreationFor = new Set(["Customer"]);
46
32
  this.reloadByEntity = {
47
33
  "User": new Subject(),
48
34
  "Customer": new Subject(),
@@ -55,101 +41,104 @@ export class SecurityAdminService {
55
41
  subject.subscribe({ next: (item) => this.selectedItem = item });
56
42
  }
57
43
  }
44
+ setLanguage(language) {
45
+ this.language = language;
46
+ }
47
+ setSecurityEndpoints(endpoints) {
48
+ this.endpoints = endpoints;
49
+ }
58
50
  getRoles() {
59
- return this.http.get(this.listRolesEndpoint);
51
+ return this.http.get(this.endpoints.listRoles?.url ?? '');
60
52
  }
61
53
  deleteMenuOption(option) {
62
- return this.http.get(`${this.deleteMenuOptionEndpoint}?optionId=${option.id}`);
54
+ return this.http.get(`${this.endpoints.deleteMenuOption?.url ?? ''}?optionId=${option.id}`);
63
55
  }
64
56
  setTheme(theme) {
65
57
  this.theme = Boolean(theme) ? theme : 'default';
66
58
  }
67
59
  getActions(roleId, resourceId) {
68
- return this.http.get(`${this.getActionsEndpoint}?roleId=${roleId}&resourceId=${resourceId}`);
69
- }
70
- setDeleteMenuOptionEndpoint(endpoint) {
71
- this.deleteMenuOptionEndpoint = endpoint;
60
+ return this.http.get(`${this.endpoints.actionsByRoleAndResource?.url ?? ''}?roleId=${roleId}&resourceId=${resourceId}`);
72
61
  }
73
62
  getResourcesByRole(roleId) {
74
- return this.http.get(`${this.resourcesByRoleEndpoint}?roledId=${roleId}`);
75
- }
76
- setListUsersEndpoint(endpoint) {
77
- this.listUsersEndpoint = endpoint;
63
+ return this.http.get(`${this.endpoints.resourcesByRole?.url ?? ''}?roledId=${roleId}`);
78
64
  }
79
65
  setMenuOptionFormComponent(component) {
80
66
  this.menuOptionFormComponent = component;
81
67
  }
82
- setUsersByRoleEndpoint(endpoint) {
83
- this.usersByRoleEndpoint = endpoint;
84
- }
85
- setCustomersByRoleEndpoint(endpoint) {
86
- this.customersByRoleEndpoint = endpoint;
87
- }
88
- setSaveMenuOptionEndpoint(endpoint) {
89
- this.saveMenuOptionEndpoint = endpoint;
90
- }
91
- setGetMenuTreeEndpoint(endpoint) { this.getMenuTreeEndpoint = endpoint; }
92
- setAssignRoleUsersEndpoint(endpoint) { this.assignRoleUsersEndpoint = endpoint; }
93
- setAssignRoleCustomersEndpoint(endpoint) {
94
- this.assignRoleCustomersEndpoint = endpoint;
95
- }
96
68
  saveMenuOption(option) {
97
- return this.http.post(this.saveMenuOptionEndpoint, { ...option, id: option.id > -1 ? option.id : null });
98
- }
99
- getUsers(page = 1, pageSize = 10) {
100
- return this.http.get(`this.listUsersEndpoint?page=${page}&pageSize=${pageSize}`);
69
+ return this.http.post(this.endpoints.saveMenuOption?.url ?? '', { ...option, id: option.id > -1 ? option.id : null });
101
70
  }
71
+ // getUsers(page: number = 1, pageSize: number = 10) {
72
+ // return this.http.get(`this.listUsersEndpoint?page=${page}&pageSize=${pageSize}`);
73
+ // }
102
74
  getAssignedRoles(id, type) {
103
- return this.http.get(`${type === "User" ? this.rolesByUserEndpoint : this.rolesByCustomerEndpoint}?${paramNames[type]}=${id}`);
75
+ return this.http.get(`${type === "User" ? (this.endpoints.rolesByUser?.url ?? '') : (this.endpoints.rolesByCustomer ?? '')}?${paramNames[type]}=${id}`);
104
76
  }
105
77
  assignRoles(id, roles, type) {
106
- return this.http.post(type === "User" ? this.assignUserRoleEndpoint : this.assignCustomerRoleEndpoint, {
78
+ return this.http.post(type === "User" ? (this.endpoints.assignUserRole?.url ?? '') : (this.endpoints.assignCustomerRole?.url ?? ''), {
107
79
  [paramNames[type]]: id,
108
80
  roles
109
81
  });
110
82
  }
111
83
  assignRoleUsers(roleId, users) {
112
- return this.http.post(this.assignRoleUsersEndpoint, {
84
+ return this.http.post(this.endpoints.assignRoleUsers?.url ?? '', {
113
85
  roleId,
114
86
  users
115
87
  });
116
88
  }
117
89
  assignRoleCustomers(roleId, customers) {
118
- return this.http.post(this.assignRoleCustomersEndpoint, {
90
+ return this.http.post(this.endpoints.assignRoleCustomers?.url ?? '', {
119
91
  roleId,
120
92
  customers
121
93
  });
122
94
  }
123
- setRolesByUserEndpoint(endpoint) {
124
- this.rolesByUserEndpoint = endpoint;
125
- }
126
- setAssignUserRoleEndpoint(endpoint) {
127
- this.assignUserRoleEndpoint = endpoint;
128
- }
129
- setRolesByCustomerEndpoint(endpoint) {
130
- this.rolesByCustomerEndpoint = endpoint;
131
- }
132
- setAssignCustomerRoleEndpoint(endpoint) {
133
- this.assignCustomerRoleEndpoint = endpoint;
134
- }
135
- setSavePermissionsEndpoint(endpoint) {
136
- this.savePermissionsEndpoint = endpoint;
137
- }
138
- setUsersByCustomerEndpoint(endpoint) {
139
- this.usersByCustomerEndpoint = endpoint;
140
- }
141
- setListRolesEndpoint(endpoint) {
142
- this.listRolesEndpoint = endpoint;
143
- }
144
- setAssignResourceEndpoint(endpoint) {
145
- this.assignResourceEndpoint = endpoint;
146
- }
147
- setResourcesByRoleEndpoint(endpoint) {
148
- this.resourcesByRoleEndpoint = endpoint;
149
- }
150
- setActionsByRoleAndResourceEndpoint(endpoint) {
151
- this.getActionsEndpoint = endpoint;
152
- }
95
+ // assignUserCustomers(userId: number, customers: any[]) {
96
+ // return this.http.post(this.endpoints.assignUserCustomers?.url ?? '', {userId, customers})
97
+ // }
98
+ // assignUserAgencies(userId: number, agencies: any[]) {
99
+ // return this.http.post(this.endpoints.assignUserAgencies?.url ?? '', {userId, agencies})
100
+ // }
101
+ assignUserCustomerAndAgencies(userId, customers, agencies) {
102
+ return this.endpoints.assignUserCustomers?.onRequest({ userId, customers, agencies });
103
+ }
104
+ assignCustomerUsers(customerId, users) {
105
+ return this.endpoints.assignCustomerUsers?.onRequest({ customerId, users });
106
+ }
107
+ getUserRolesByCustomers(user) {
108
+ return this.http.get(`${this.endpoints.customersByUser?.url}${this.endpoints.customersByUser?.queryParams?.(user)}`).pipe(switchMap(this.endpoints.customersByUser?.responseMapping ?? defaultSwitchMapper), switchMap((response) => {
109
+ return from(Array.from(new Set(response.load))).pipe(mergeMap(customerId => this.http.get(`${this.endpoints.rolesByCustomer?.url}${this.endpoints.rolesByCustomer?.queryParams?.({ id: customerId })}`)), reduce((acc, curr) => acc.concat(curr), []), map(newLoad => ({ ...response, load: newLoad })));
110
+ }), switchMap((response2) => of({ ...response2, load: response2.load.map((response3) => response3.load).flat() })));
111
+ }
112
+ // setRolesByUserEndpoint(endpoint: string) {
113
+ // this.rolesByUserEndpoint = endpoint;
114
+ // }
115
+ // setAssignUserRoleEndpoint(endpoint: string) {
116
+ // this.assignUserRoleEndpoint = endpoint;
117
+ // }
118
+ // setRolesByCustomerEndpoint(endpoint: string) {
119
+ // this.rolesByCustomerEndpoint = endpoint;
120
+ // }
121
+ // setAssignCustomerRoleEndpoint(endpoint: string) {
122
+ // this.assignCustomerRoleEndpoint = endpoint;
123
+ // }
124
+ // setSavePermissionsEndpoint(endpoint: string) {
125
+ // this.savePermissionsEndpoint = endpoint;
126
+ // }
127
+ // setUsersByCustomerEndpoint(endpoint: string) {
128
+ // this.usersByCustomerEndpoint = endpoint;
129
+ // }
130
+ // setListRolesEndpoint(endpoint: string) {
131
+ // this.listRolesEndpoint = endpoint;
132
+ // }
133
+ // setAssignResourceEndpoint(endpoint: string) {
134
+ // this.assignResourceEndpoint = endpoint;
135
+ // }
136
+ // setResourcesByRoleEndpoint(endpoint: string) {
137
+ // this.resourcesByRoleEndpoint = endpoint;
138
+ // }
139
+ // setActionsByRoleAndResourceEndpoint(endpoint: string) {
140
+ // this.getActionsEndpoint = endpoint;
141
+ // }
153
142
  selectUser(user) {
154
143
  this.selectedUserSubject.next(user);
155
144
  }
@@ -163,13 +152,19 @@ export class SecurityAdminService {
163
152
  return this.http.post(endpoint, updatedItem);
164
153
  }
165
154
  assignResource(roleId, resources) {
166
- return this.http.post(this.assignResourceEndpoint, { roleId, resources });
155
+ return this.http.post(this.endpoints.assignResource?.url ?? '', { roleId, resources });
167
156
  }
168
157
  savePermissions(permissions) {
169
- return this.http.post(this.savePermissionsEndpoint, permissions);
158
+ return this.http.post(this.endpoints.savePermissions?.url ?? '', permissions);
170
159
  }
171
160
  getMenuTree() {
172
- return this.http.get(this.getMenuTreeEndpoint);
161
+ return this.http.get(this.endpoints.getMenuTree?.url ?? '');
162
+ }
163
+ getAppModules() {
164
+ return this.http.get(this.endpoints.listModules?.url ?? '');
165
+ }
166
+ saveModule(module) {
167
+ return this.http.post(this.endpoints.createModule?.url ?? '', module);
173
168
  }
174
169
  reloadEntity(entityName) {
175
170
  this.reloadSubject.next(entityName);
@@ -183,4 +178,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
183
178
  providedIn: 'root'
184
179
  }]
185
180
  }], ctorParameters: function () { return [{ type: i1.HttpClient }]; } });
186
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHktYWRtaW4uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FzcC1saWIvc3JjL2xpYi9zZXJ2aWNlcy9zZWN1cml0eS1hZG1pbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQVEsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQzs7O0FBRzNDLE1BQU0sVUFBVSxHQUFHO0lBQ2xCLFFBQVEsRUFBRSxZQUFZO0lBQ3RCLElBQUksRUFBRSxRQUFRO0NBQ2QsQ0FBQTtBQUtELE1BQU0sT0FBTyxvQkFBb0I7SUF1Q2hDLElBQUksVUFBVSxLQUFLLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQSxDQUFDLENBQUM7SUFDdkQsSUFBSSxjQUFjLEtBQUssT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFBLENBQUMsQ0FBQztJQUMvRCxJQUFJLFVBQVUsS0FBSyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUEsQ0FBQyxDQUFDO0lBRXZELElBQUksUUFBUTtRQUNYLE9BQU8sQ0FBQztZQUNQLE1BQU0sRUFBRSxJQUFJLENBQUMsbUJBQW1CO1lBQ2hDLFVBQVUsRUFBRSxJQUFJLENBQUMsdUJBQXVCO1lBQ3hDLE1BQU0sRUFBRSxJQUFJLENBQUMsbUJBQW1CO1NBQ2hDLENBQUMsQ0FBQTtJQUNILENBQUM7SUFFRCxZQUFvQixJQUFnQjtRQUFoQixTQUFJLEdBQUosSUFBSSxDQUFZO1FBakRwQyx3QkFBbUIsR0FBRyxJQUFJLE9BQU8sRUFBTyxDQUFDO1FBQ3pDLDRCQUF1QixHQUFHLElBQUksT0FBTyxFQUFPLENBQUM7UUFDN0Msd0JBQW1CLEdBQUcsSUFBSSxPQUFPLEVBQU8sQ0FBQztRQUN6QyxrQkFBYSxHQUFHLElB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UUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxjQUFjLENBQUMsTUFBYyxFQUFFLFNBQWdCO1FBQzlDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVELGVBQWUsQ0FBQyxXQUFrQjtRQUNqQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQsV0FBVztRQUNWLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELFlBQVksQ0FBQyxVQUF3QztRQUNwRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNyQyxDQUFDOytHQXJOVyxvQkFBb0I7bUhBQXBCLG9CQUFvQixjQUZwQixNQUFNOzs0RkFFTixvQkFBb0I7a0JBSGhDLFVBQVU7bUJBQUM7b0JBQ1gsVUFBVSxFQUFFLE1BQU07aUJBQ2xCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFNuYWNrYmFyU2VydmljZSB9IGZyb20gJy4vc25hY2tiYXIuc2VydmljZSc7XHJcblxyXG5jb25zdCBwYXJhbU5hbWVzID0ge1xyXG5cdEN1c3RvbWVyOiBcImN1c3RvbWVySWRcIixcclxuXHRVc2VyOiBcInVzZXJJZFwiXHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuXHRwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFNlY3VyaXR5QWRtaW5TZXJ2aWNlIHtcclxuXHJcblx0c2VsZWN0ZWRVc2VyU3ViamVjdCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcclxuXHRzZWxlY3RlZEN1c3RvbWVyU3ViamVjdCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcclxuXHRzZWxlY3RlZFJvbGVTdWJqZWN0ID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG5cdHJlbG9hZFN1YmplY3QgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XHJcblx0dXNlcnNCeUN1c3RvbWVyRW5kcG9pbnQ6IHN0cmluZyA9ICcnO1xyXG5cdGFzc2lnblJlc291cmNlRW5kcG9pbnQ6IHN0cmluZyA9ICcnO1xyXG5cdGdldEFjdGlvbnNFbmRwb2ludDogc3RyaW5nID0gJyc7XHJcblx0c2F2ZVBlcm1pc3Npb25zRW5kcG9pbnQ6IHN0cmluZyA9ICcnO1xyXG5cdGxpc3RSb2xlc0VuZHBvaW50OiBzdHJpbmcgPSAnJztcclxuXHRyZXNvdXJjZXNCeVJvbGVFbmRwb2ludDogc3RyaW5nID0gJyc7XHJcblx0cm9sZXNCeVVzZXJFbmRwb2ludDogc3RyaW5nID0gJyc7XHJcblx0Z2V0TWVudVRyZWVFbmRwb2ludDogc3RyaW5nID0gJyc7XHJcblx0c2F2ZU1lbnVPcHRpb25FbmRwb2ludDogc3RyaW5nID0gJyc7XHJcblx0ZGVsZXRlTWVudU9wdGlvbkVuZHBvaW50OiBzdHJpbmcgPSAnJztcclxuXHJcblx0YXNzaWduVXNlclJvbGVFbmRwb2ludDogc3RyaW5nID0gJyc7XHJcblx0cm9sZXNCeUN1c3RvbWVyRW5kcG9pbnQ6IHN0cmluZyA9ICcnO1xyXG5cdGFzc2lnbkN1c3RvbWVyUm9sZUVuZHBvaW50OiBzdHJpbmcgPSAnJztcclxuXHR1c2Vyc0J5Um9sZUVuZHBvaW50OiBzdHJpbmcgPSAnJztcclxuXHRjdXN0b21lcnNCeVJvbGVFbmRwb2ludDogc3RyaW5nID0gJyc7XHJcblx0bWVudU9wdGlvbkZvcm1Db21wb25lbnQ/OiBUeXBlPGFueT47XHJcblxyXG5cdGxpc3RVc2Vyc0VuZHBvaW50OiBzdHJpbmcgPSAnJztcclxuXHRhc3NpZ25Sb2xlVXNlcnNFbmRwb2ludDogc3RyaW5nID0gJyc7XHJcblx0YXNzaWduUm9sZUN1c3RvbWVyc0VuZHBvaW50OiBzdHJpbmcgPSAnJztcclxuXHJcblx0c2VsZWN0ZWRJdGVtOiBhbnk7XHJcblx0dGhlbWU6IHN0cmluZyA9ICdkZWZhdWx0JztcclxuXHJcblx0bXNnTGFiZWwgPSB7IFwiVXNlclwiOiBcIlVzdWFyaW9cIiwgXCJDdXN0b21lclwiOiBcIkNsaWVudGVcIiwgXCJSb2xlXCI6IFwiUm9sXCIgfVxyXG5cclxuXHRyZWxvYWRCeUVudGl0eSA9IHtcclxuXHRcdFwiVXNlclwiOiBuZXcgU3ViamVjdDxib29sZWFuPigpLFxyXG5cdFx0XCJDdXN0b21lclwiOiBuZXcgU3ViamVjdDxib29sZWFuPigpLFxyXG5cdFx0XCJSb2xlXCI6IG5ldyBTdWJqZWN0PGJvb2xlYW4+KClcclxuXHR9XHJcblxyXG5cdGdldCB1c2VyUmVsb2FkKCkgeyByZXR1cm4gdGhpcy5yZWxvYWRCeUVudGl0eVsnVXNlciddIH1cclxuXHRnZXQgY3VzdG9tZXJSZWxvYWQoKSB7IHJldHVybiB0aGlzLnJlbG9hZEJ5RW50aXR5WydDdXN0b21lciddIH1cclxuXHRnZXQgcm9sZVJlbG9hZCgpIHsgcmV0dXJuIHRoaXMucmVsb2FkQnlFbnRpdHlbJ1JvbGUnXSB9XHJcblxyXG5cdGdldCBzdWJqZWN0cygpIHtcclxuXHRcdHJldHVybiAoe1xyXG5cdFx0XHRcIlVzZXJcIjogdGhpcy5zZWxlY3RlZFVzZXJTdWJqZWN0LFxyXG5cdFx0XHRcIkN1c3RvbWVyXCI6IHRoaXMuc2VsZWN0ZWRDdXN0b21lclN1YmplY3QsXHJcblx0XHRcdFwiUm9sZVwiOiB0aGlzLnNlbGVjdGVkUm9sZVN1YmplY3RcclxuXHRcdH0pXHJcblx0fVxyXG5cclxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQpIHtcclxuXHRcdHRoaXMucmVsb2FkU3ViamVjdC5zdWJzY3JpYmUoe1xyXG5cdFx0XHRuZXh0OiAoZW50aXR5TmFtZTogYW55KSA9PiB7IHRoaXMucmVsb2FkQnlFbnRpdHlbZW50aXR5TmFtZSBhcyBcIlVzZXJcIiB8IFwiQ3VzdG9tZXJcIiB8IFwiUm9sZVwiXT8ubmV4dCh0cnVlKSB9XHJcblx0XHR9KVxyXG5cdFx0Zm9yIChsZXQgc3ViamVjdCBvZiBPYmplY3QudmFsdWVzKHRoaXMuc3ViamVjdHMpKSB7XHJcblx0XHRcdHN1YmplY3Quc3Vic2NyaWJlKHsgbmV4dDogKGl0ZW0pID0+IHRoaXMuc2VsZWN0ZWRJdGVtID0gaXRlbSB9KTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGdldFJvbGVzKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5saXN0Um9sZXNFbmRwb2ludCk7XHJcblx0fVxyXG5cclxuXHRkZWxldGVNZW51T3B0aW9uKG9wdGlvbjogYW55KXtcclxuXHRcdHJldHVybiB0aGlzLmh0dHAuZ2V0KGAke3RoaXMuZGVsZXRlTWVudU9wdGlvbkVuZHBvaW50fT9vcHRpb25JZD0ke29wdGlvbi5pZH1gKVxyXG5cdH1cclxuXHJcblx0c2V0VGhlbWUodGhlbWU6IHN0cmluZyl7XHJcblx0XHR0aGlzLnRoZW1lID0gQm9vbGVhbih0aGVtZSkgPyB0aGVtZSA6ICdkZWZhdWx0JztcclxuXHR9XHJcblxyXG5cdGdldEFjdGlvbnMocm9sZUlkOiBudW1iZXIsIHJlc291cmNlSWQ6IG51bWJlcikge1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cC5nZXQoYCR7dGhpcy5nZXRBY3Rpb25zRW5kcG9pbnR9P3JvbGVJZD0ke3JvbGVJZH0mcmVzb3VyY2VJZD0ke3Jlc291cmNlSWR9YCk7XHJcblx0fVxyXG5cclxuXHRzZXREZWxldGVNZW51T3B0aW9uRW5kcG9pbnQoZW5kcG9pbnQ6IHN0cmluZyl7XHJcblx0XHR0aGlzLmRlbGV0ZU1lbnVPcHRpb25FbmRwb2ludCA9IGVuZHBvaW50O1xyXG5cdH1cclxuXHJcblx0Z2V0UmVzb3VyY2VzQnlSb2xlKHJvbGVJZDogbnVtYmVyKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5odHRwLmdldChgJHt0aGlzLnJlc291cmNlc0J5Um9sZUVuZHBvaW50fT9yb2xlZElkPSR7cm9sZUlkfWApO1xyXG5cdH1cclxuXHJcblx0c2V0TGlzdFVzZXJzRW5kcG9pbnQoZW5kcG9pbnQ6IHN0cmluZykge1xyXG5cdFx0dGhpcy5saXN0VXNlcnNFbmRwb2ludCA9IGVuZHBvaW50O1xyXG5cdH1cclxuXHJcblx0c2V0TWVudU9wdGlvbkZvcm1Db21wb25lbnQoY29tcG9uZW50PzogVHlwZTxhbnk+KXtcclxuXHRcdHRoaXMubWVudU9wdGlvbkZvcm1Db21wb25lbnQgPSBjb21wb25lbnQ7XHJcblx0fVxyXG5cclxuXHRzZXRVc2Vyc0J5Um9sZUVuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpIHtcclxuXHRcdHRoaXMudXNlcnNCeVJvbGVFbmRwb2ludCA9IGVuZHBvaW50O1xyXG5cdH1cclxuXHRzZXRDdXN0b21lcnNCeVJvbGVFbmRwb2ludChlbmRwb2ludDogc3RyaW5nKSB7XHJcblx0XHR0aGlzLmN1c3RvbWVyc0J5Um9sZUVuZHBvaW50ID0gZW5kcG9pbnQ7XHJcblx0fVxyXG5cclxuXHRzZXRTYXZlTWVudU9wdGlvbkVuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpIHtcclxuXHRcdHRoaXMuc2F2ZU1lbnVPcHRpb25FbmRwb2ludCA9IGVuZHBvaW50O1xyXG5cdH1cclxuXHJcblx0c2V0R2V0TWVudVRyZWVFbmRwb2ludChlbmRwb2ludDogc3RyaW5nKSB7IHRoaXMuZ2V0TWVudVRyZWVFbmRwb2ludCA9IGVuZHBvaW50IH1cclxuXHRzZXRBc3NpZ25Sb2xlVXNlcnNFbmRwb2ludChlbmRwb2ludDogc3RyaW5nKSB7IHRoaXMuYXNzaWduUm9sZVVzZXJzRW5kcG9pbnQgPSBlbmRwb2ludCB9XHJcblx0c2V0QXNzaWduUm9sZUN1c3RvbWVyc0VuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpIHtcclxuXHRcdHRoaXMuYXNzaWduUm9sZUN1c3RvbWVyc0VuZHBvaW50ID0gZW5kcG9pbnQ7XHJcblx0fVxyXG5cclxuXHRzYXZlTWVudU9wdGlvbihvcHRpb246IGFueSkge1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cC5wb3N0KHRoaXMuc2F2ZU1lbnVPcHRpb25FbmRwb2ludCwgey4uLm9wdGlvbiwgaWQ6IG9wdGlvbi5pZCA+IC0xID8gb3B0aW9uLmlkOiBudWxsfSk7XHJcblx0fVxyXG5cclxuXHRnZXRVc2VycyhwYWdlOiBudW1iZXIgPSAxLCBwYWdlU2l6ZTogbnVtYmVyID0gMTApIHtcclxuXHRcdHJldHVybiB0aGlzLmh0dHAuZ2V0KGB0aGlzLmxpc3RVc2Vyc0VuZHBvaW50P3BhZ2U9JHtwYWdlfSZwYWdlU2l6ZT0ke3BhZ2VTaXplfWApO1xyXG5cdH1cclxuXHJcblx0Z2V0QXNzaWduZWRSb2xlcyhpZDogbnVtYmVyLCB0eXBlOiBcIlVzZXJcIiB8IFwiQ3VzdG9tZXJcIikge1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cC5nZXQoYCR7dHlwZSA9PT0gXCJVc2VyXCIgPyB0aGlzLnJvbGVzQnlVc2VyRW5kcG9pbnQgOiB0aGlzLnJvbGVzQnlDdXN0b21lckVuZHBvaW50fT8ke3BhcmFtTmFtZXNbdHlwZV19PSR7aWR9YCk7XHJcblx0fVxyXG5cclxuXHRhc3NpZ25Sb2xlcyhpZDogbnVtYmVyLCByb2xlczogYW55W10sIHR5cGU6IFwiVXNlclwiIHwgXCJDdXN0b21lclwiKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5odHRwLnBvc3QodHlwZSA9PT0gXCJVc2VyXCIgPyB0aGlzLmFzc2lnblVzZXJSb2xlRW5kcG9pbnQgOiB0aGlzLmFzc2lnbkN1c3RvbWVyUm9sZUVuZHBvaW50LCB7XHJcblx0XHRcdFtwYXJhbU5hbWVzW3R5cGVdXTogaWQsXHJcblx0XHRcdHJvbGVzXHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdGFzc2lnblJvbGVVc2Vycyhyb2xlSWQ6IG51bWJlciwgdXNlcnM6IGFueVtdKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5odHRwLnBvc3QodGhpcy5hc3NpZ25Sb2xlVXNlcnNFbmRwb2ludCwge1xyXG5cdFx0XHRyb2xlSWQsXHJcblx0XHRcdHVzZXJzXHJcblx0XHR9KVxyXG5cdH1cclxuXHJcblx0YXNzaWduUm9sZUN1c3RvbWVycyhyb2xlSWQ6IG51bWJlciwgY3VzdG9tZXJzOiBhbnlbXSkge1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cC5wb3N0KHRoaXMuYXNzaWduUm9sZUN1c3RvbWVyc0VuZHBvaW50LCB7XHJcblx0XHRcdHJvbGVJZCxcclxuXHRcdFx0Y3VzdG9tZXJzXHJcblx0XHR9KVxyXG5cdH1cclxuXHJcblx0c2V0Um9sZXNCeVVzZXJFbmRwb2ludChlbmRwb2ludDogc3RyaW5nKSB7XHJcblx0XHR0aGlzLnJvbGVzQnlVc2VyRW5kcG9pbnQgPSBlbmRwb2ludDtcclxuXHR9XHJcblxyXG5cdHNldEFzc2lnblVzZXJSb2xlRW5kcG9pbnQoZW5kcG9pbnQ6IHN0cmluZykge1xyXG5cdFx0dGhpcy5hc3NpZ25Vc2VyUm9sZUVuZHBvaW50ID0gZW5kcG9pbnQ7XHJcblx0fVxyXG5cclxuXHRzZXRSb2xlc0J5Q3VzdG9tZXJFbmRwb2ludChlbmRwb2ludDogc3RyaW5nKSB7XHJcblx0XHR0aGlzLnJvbGVzQnlDdXN0b21lckVuZHBvaW50ID0gZW5kcG9pbnQ7XHJcblx0fVxyXG5cclxuXHRzZXRBc3NpZ25DdXN0b21lclJvbGVFbmRwb2ludChlbmRwb2ludDogc3RyaW5nKSB7XHJcblx0XHR0aGlzLmFzc2lnbkN1c3RvbWVyUm9sZUVuZHBvaW50ID0gZW5kcG9pbnQ7XHJcblx0fVxyXG5cclxuXHRzZXRTYXZlUGVybWlzc2lvbnNFbmRwb2ludChlbmRwb2ludDogc3RyaW5nKSB7XHJcblx0XHR0aGlzLnNhdmVQZXJtaXNzaW9uc0VuZHBvaW50ID0gZW5kcG9pbnQ7XHJcblx0fVxyXG5cclxuXHRzZXRVc2Vyc0J5Q3VzdG9tZXJFbmRwb2ludChlbmRwb2ludDogc3RyaW5nKSB7XHJcblx0XHR0aGlzLnVzZXJzQnlDdXN0b21lckVuZHBvaW50ID0gZW5kcG9pbnQ7XHJcblx0fVxyXG5cclxuXHRzZXRMaXN0Um9sZXNFbmRwb2ludChlbmRwb2ludDogc3RyaW5nKSB7XHJcblx0XHR0aGlzLmxpc3RSb2xlc0VuZHBvaW50ID0gZW5kcG9pbnQ7XHJcblx0fVxyXG5cclxuXHRzZXRBc3NpZ25SZXNvdXJjZUVuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpIHtcclxuXHRcdHRoaXMuYXNzaWduUmVzb3VyY2VFbmRwb2ludCA9IGVuZHBvaW50O1xyXG5cdH1cclxuXHJcblx0c2V0UmVzb3VyY2VzQnlSb2xlRW5kcG9pbnQoZW5kcG9pbnQ6IHN0cmluZykge1xyXG5cdFx0dGhpcy5yZXNvdXJjZXNCeVJvbGVFbmRwb2ludCA9IGVuZHBvaW50O1xyXG5cdH1cclxuXHJcblx0c2V0QWN0aW9uc0J5Um9sZUFuZFJlc291cmNlRW5kcG9pbnQoZW5kcG9pbnQ6IHN0cmluZykge1xyXG5cdFx0dGhpcy5nZXRBY3Rpb25zRW5kcG9pbnQgPSBlbmRwb2ludDtcclxuXHR9XHJcblxyXG5cdHNlbGVjdFVzZXIodXNlcjogYW55KSB7XHJcblx0XHR0aGlzLnNlbGVjdGVkVXNlclN1YmplY3QubmV4dCh1c2VyKTtcclxuXHR9XHJcblxyXG5cdHNlbGVjdEN1c3RvbWVyKGN1c3RvbWVyOiBhbnkpIHtcclxuXHRcdHRoaXMuc2VsZWN0ZWRDdXN0b21lclN1YmplY3QubmV4dChjdXN0b21lcik7XHJcblx0fVxyXG5cclxuXHRzZWxlY3RSb2xlKHJvbGU6IGFueSkge1xyXG5cclxuXHRcdHRoaXMuc2VsZWN0ZWRSb2xlU3ViamVjdC5uZXh0KHJvbGUpO1xyXG5cdH1cclxuXHJcblx0c2F2ZUl0ZW0oZW5kcG9pbnQ6IHN0cmluZywgdXBkYXRlZEl0ZW06IGFueSkge1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cC5wb3N0KGVuZHBvaW50LCB1cGRhdGVkSXRlbSk7XHJcblx0fVxyXG5cclxuXHRhc3NpZ25SZXNvdXJjZShyb2xlSWQ6IG51bWJlciwgcmVzb3VyY2VzOiBhbnlbXSkge1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cC5wb3N0KHRoaXMuYXNzaWduUmVzb3VyY2VFbmRwb2ludCwgeyByb2xlSWQsIHJlc291cmNlcyB9KTtcclxuXHR9XHJcblxyXG5cdHNhdmVQZXJtaXNzaW9ucyhwZXJtaXNzaW9uczogYW55W10pIHtcclxuXHRcdHJldHVybiB0aGlzLmh0dHAucG9zdCh0aGlzLnNhdmVQZXJtaXNzaW9uc0VuZHBvaW50LCBwZXJtaXNzaW9ucyk7XHJcblx0fVxyXG5cclxuXHRnZXRNZW51VHJlZSgpe1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5nZXRNZW51VHJlZUVuZHBvaW50KTtcclxuXHR9XHJcblxyXG5cdHJlbG9hZEVudGl0eShlbnRpdHlOYW1lOiBcIlVzZXJcIiB8IFwiQ3VzdG9tZXJcIiB8IFwiUm9sZVwiKSB7XHJcblx0XHR0aGlzLnJlbG9hZFN1YmplY3QubmV4dChlbnRpdHlOYW1lKTtcclxuXHR9XHJcbn1cclxuIl19
181
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHktYWRtaW4uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FzcC1saWIvc3JjL2xpYi9zZXJ2aWNlcy9zZWN1cml0eS1hZG1pbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQVEsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBVyxNQUFNLE1BQU0sQ0FBQztBQUdoRyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBRXJELE1BQU0sVUFBVSxHQUFHO0lBQ2xCLFFBQVEsRUFBRSxZQUFZO0lBQ3RCLElBQUksRUFBRSxRQUFRO0NBQ2QsQ0FBQTtBQUtELE1BQU0sT0FBTyxvQkFBb0I7SUFvQmhDLElBQUksVUFBVSxLQUFLLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQSxDQUFDLENBQUM7SUFDdkQsSUFBSSxjQUFjLEtBQUssT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFBLENBQUMsQ0FBQztJQUMvRCxJQUFJLFVBQVUsS0FBSyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUEsQ0FBQyxDQUFDO0lBRXZELElBQUksUUFBUTtRQUNYLE9BQU8sQ0FBQztZQUNQLE1BQU0sRUFBRSxJQUFJLENBQUMsbUJBQW1CO1lBQ2hDLFVBQVUsRUFBRSxJQUFJLENBQUMsdUJBQXVCO1lBQ3hDLE1BQU0sRUFBRSxJQUFJLENBQUMsbUJBQW1CO1NBQ2hDLENBQUMsQ0FBQTtJQUNILENBQUM7SUFFRCxZQUFvQixJQUFnQjtRQUFoQixTQUFJLEdBQUosSUFBSSxDQUFZO1FBOUJwQyx3QkFBbUIsR0FBRyxJQUFJLE9BQU8s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LElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRCxhQUFhO1FBQ1osT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVELFVBQVUsQ0FBQyxNQUFXO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsR0FBRyxJQUFJLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQsWUFBWSxDQUFDLFVBQXdDO1FBQ3BELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7K0dBM05XLG9CQUFvQjttSEFBcEIsb0JBQW9CLGNBRnBCLE1BQU07OzRGQUVOLG9CQUFvQjtrQkFIaEMsVUFBVTttQkFBQztvQkFDWCxVQUFVLEVBQUUsTUFBTTtpQkFDbEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGZyb20sIG1hcCwgbWVyZ2VNYXAsIE9ic2VydmFibGUsIG9mLCByZWR1Y2UsIFN1YmplY3QsIHN3aXRjaE1hcCwgdG9BcnJheSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBTbmFja2JhclNlcnZpY2UgfSBmcm9tICcuL3NuYWNrYmFyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTZWN1cml0eUVuZHBvaW50cyB9IGZyb20gJy4uL2ludGVyZmFjZXMvaW50ZXJmYWNlcyc7XHJcbmltcG9ydCB7IGRlZmF1bHRTd2l0Y2hNYXBwZXIgfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcblxyXG5jb25zdCBwYXJhbU5hbWVzID0ge1xyXG5cdEN1c3RvbWVyOiBcImN1c3RvbWVySWRcIixcclxuXHRVc2VyOiBcInVzZXJJZFwiXHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuXHRwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFNlY3VyaXR5QWRtaW5TZXJ2aWNlIHtcclxuXHJcblx0c2VsZWN0ZWRVc2VyU3ViamVjdCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcclxuXHRzZWxlY3RlZEN1c3RvbWVyU3ViamVjdCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcclxuXHRzZWxlY3RlZFJvbGVTdWJqZWN0ID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG5cdHJlbG9hZFN1YmplY3QgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XHJcblx0bWVudU9wdGlvbkZvcm1Db21wb25lbnQ/OiBUeXBlPGFueT47XHJcblx0ZW5kcG9pbnRzOiBTZWN1cml0eUVuZHBvaW50cyA9IHt9O1xyXG5cdGxhbmd1YWdlOiBzdHJpbmcgPSAnZW4nO1xyXG5cdHNlbGVjdGVkSXRlbTogYW55O1xyXG5cdHRoZW1lOiBzdHJpbmcgPSAnZGVmYXVsdCc7XHJcblx0bXNnTGFiZWwgPSB7IFwiVXNlclwiOiBcIlVzdWFyaW9cIiwgXCJDdXN0b21lclwiOiBcIkVtcHJlc2FcIiwgXCJSb2xlXCI6IFwiUm9sXCIgfTtcclxuXHRibG9ja0NyZWF0aW9uRm9yOiBTZXQ8XCJVc2VyXCJ8XCJDdXN0b21lclwifFwiUm9sZVwiPiA9IG5ldyBTZXQoW1wiQ3VzdG9tZXJcIl0pO1xyXG5cclxuXHRyZWxvYWRCeUVudGl0eSA9IHtcclxuXHRcdFwiVXNlclwiOiBuZXcgU3ViamVjdDxib29sZWFuPigpLFxyXG5cdFx0XCJDdXN0b21lclwiOiBuZXcgU3ViamVjdDxib29sZWFuPigpLFxyXG5cdFx0XCJSb2xlXCI6IG5ldyBTdWJqZWN0PGJvb2xlYW4+KClcclxuXHR9XHJcblxyXG5cdGdldCB1c2VyUmVsb2FkKCkgeyByZXR1cm4gdGhpcy5yZWxvYWRCeUVudGl0eVsnVXNlciddIH1cclxuXHRnZXQgY3VzdG9tZXJSZWxvYWQoKSB7IHJldHVybiB0aGlzLnJlbG9hZEJ5RW50aXR5WydDdXN0b21lciddIH1cclxuXHRnZXQgcm9sZVJlbG9hZCgpIHsgcmV0dXJuIHRoaXMucmVsb2FkQnlFbnRpdHlbJ1JvbGUnXSB9XHJcblxyXG5cdGdldCBzdWJqZWN0cygpIHtcclxuXHRcdHJldHVybiAoe1xyXG5cdFx0XHRcIlVzZXJcIjogdGhpcy5zZWxlY3RlZFVzZXJTdWJqZWN0LFxyXG5cdFx0XHRcIkN1c3RvbWVyXCI6IHRoaXMuc2VsZWN0ZWRDdXN0b21lclN1YmplY3QsXHJcblx0XHRcdFwiUm9sZVwiOiB0aGlzLnNlbGVjdGVkUm9sZVN1YmplY3RcclxuXHRcdH0pXHJcblx0fVxyXG5cclxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQpIHtcclxuXHRcdHRoaXMucmVsb2FkU3ViamVjdC5zdWJzY3JpYmUoe1xyXG5cdFx0XHRuZXh0OiAoZW50aXR5TmFtZTogYW55KSA9PiB7IHRoaXMucmVsb2FkQnlFbnRpdHlbZW50aXR5TmFtZSBhcyBcIlVzZXJcIiB8IFwiQ3VzdG9tZXJcIiB8IFwiUm9sZVwiXT8ubmV4dCh0cnVlKSB9XHJcblx0XHR9KVxyXG5cdFx0Zm9yIChsZXQgc3ViamVjdCBvZiBPYmplY3QudmFsdWVzKHRoaXMuc3ViamVjdHMpKSB7XHJcblx0XHRcdHN1YmplY3Quc3Vic2NyaWJlKHsgbmV4dDogKGl0ZW0pID0+IHRoaXMuc2VsZWN0ZWRJdGVtID0gaXRlbSB9KTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHNldExhbmd1YWdlKGxhbmd1YWdlOiBzdHJpbmcpIHtcclxuXHRcdHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZTtcclxuXHR9XHJcblxyXG5cdHNldFNlY3VyaXR5RW5kcG9pbnRzKGVuZHBvaW50czogU2VjdXJpdHlFbmRwb2ludHMpIHtcclxuXHRcdHRoaXMuZW5kcG9pbnRzID0gZW5kcG9pbnRzO1xyXG5cdH1cclxuXHJcblx0Z2V0Um9sZXMoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5odHRwLmdldCh0aGlzLmVuZHBvaW50cy5saXN0Um9sZXM/LnVybCA/PyAnJyk7XHJcblx0fVxyXG5cclxuXHRkZWxldGVNZW51T3B0aW9uKG9wdGlvbjogYW55KSB7XHJcblx0XHRyZXR1cm4gdGhpcy5odHRwLmdldChgJHt0aGlzLmVuZHBvaW50cy5kZWxldGVNZW51T3B0aW9uPy51cmwgPz8gJyd9P29wdGlvbklkPSR7b3B0aW9uLmlkfWApXHJcblx0fVxyXG5cclxuXHRzZXRUaGVtZSh0aGVtZTogc3RyaW5nKSB7XHJcblx0XHR0aGlzLnRoZW1lID0gQm9vbGVhbih0aGVtZSkgPyB0aGVtZSA6ICdkZWZhdWx0JztcclxuXHR9XHJcblxyXG5cdGdldEFjdGlvbnMocm9sZUlkOiBudW1iZXIsIHJlc291cmNlSWQ6IG51bWJlcikge1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cC5nZXQoYCR7dGhpcy5lbmRwb2ludHMuYWN0aW9uc0J5Um9sZUFuZFJlc291cmNlPy51cmwgPz8gJyd9P3JvbGVJZD0ke3JvbGVJZH0mcmVzb3VyY2VJZD0ke3Jlc291cmNlSWR9YCk7XHJcblx0fVxyXG5cclxuXHRnZXRSZXNvdXJjZXNCeVJvbGUocm9sZUlkOiBudW1iZXIpIHtcclxuXHRcdHJldHVybiB0aGlzLmh0dHAuZ2V0KGAke3RoaXMuZW5kcG9pbnRzLnJlc291cmNlc0J5Um9sZT8udXJsID8/ICcnfT9yb2xlZElkPSR7cm9sZUlkfWApO1xyXG5cdH1cclxuXHJcblx0c2V0TWVudU9wdGlvbkZvcm1Db21wb25lbnQoY29tcG9uZW50PzogVHlwZTxhbnk+KSB7XHJcblx0XHR0aGlzLm1lbnVPcHRpb25Gb3JtQ29tcG9uZW50ID0gY29tcG9uZW50O1xyXG5cdH1cclxuXHJcblxyXG5cdHNhdmVNZW51T3B0aW9uKG9wdGlvbjogYW55KSB7XHJcblx0XHRyZXR1cm4gdGhpcy5odHRwLnBvc3QodGhpcy5lbmRwb2ludHMuc2F2ZU1lbnVPcHRpb24/LnVybCA/PyAnJywgeyAuLi5vcHRpb24sIGlkOiBvcHRpb24uaWQgPiAtMSA/IG9wdGlvbi5pZCA6IG51bGwgfSk7XHJcblx0fVxyXG5cclxuXHQvLyBnZXRVc2VycyhwYWdlOiBudW1iZXIgPSAxLCBwYWdlU2l6ZTogbnVtYmVyID0gMTApIHtcclxuXHQvLyBcdHJldHVybiB0aGlzLmh0dHAuZ2V0KGB0aGlzLmxpc3RVc2Vyc0VuZHBvaW50P3BhZ2U9JHtwYWdlfSZwYWdlU2l6ZT0ke3BhZ2VTaXplfWApO1xyXG5cdC8vIH1cclxuXHJcblx0Z2V0QXNzaWduZWRSb2xlcyhpZDogbnVtYmVyLCB0eXBlOiBcIlVzZXJcIiB8IFwiQ3VzdG9tZXJcIikge1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cC5nZXQoYCR7dHlwZSA9PT0gXCJVc2VyXCIgPyAodGhpcy5lbmRwb2ludHMucm9sZXNCeVVzZXI/LnVybCA/PyAnJykgOiAodGhpcy5lbmRwb2ludHMucm9sZXNCeUN1c3RvbWVyID8/ICcnKX0/JHtwYXJhbU5hbWVzW3R5cGVdfT0ke2lkfWApO1xyXG5cdH1cclxuXHJcblx0YXNzaWduUm9sZXMoaWQ6IG51bWJlciwgcm9sZXM6IGFueVtdLCB0eXBlOiBcIlVzZXJcIiB8IFwiQ3VzdG9tZXJcIikge1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cC5wb3N0KHR5cGUgPT09IFwiVXNlclwiID8gKHRoaXMuZW5kcG9pbnRzLmFzc2lnblVzZXJSb2xlPy51cmwgPz8gJycpIDogKHRoaXMuZW5kcG9pbnRzLmFzc2lnbkN1c3RvbWVyUm9sZT8udXJsID8/ICcnKSwge1xyXG5cdFx0XHRbcGFyYW1OYW1lc1t0eXBlXV06IGlkLFxyXG5cdFx0XHRyb2xlc1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRhc3NpZ25Sb2xlVXNlcnMocm9sZUlkOiBudW1iZXIsIHVzZXJzOiBhbnlbXSkge1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cC5wb3N0KHRoaXMuZW5kcG9pbnRzLmFzc2lnblJvbGVVc2Vycz8udXJsID8/ICcnLCB7XHJcblx0XHRcdHJvbGVJZCxcclxuXHRcdFx0dXNlcnNcclxuXHRcdH0pXHJcblx0fVxyXG5cclxuXHRhc3NpZ25Sb2xlQ3VzdG9tZXJzKHJvbGVJZDogbnVtYmVyLCBjdXN0b21lcnM6IGFueVtdKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5odHRwLnBvc3QodGhpcy5lbmRwb2ludHMuYXNzaWduUm9sZUN1c3RvbWVycz8udXJsID8/ICcnLCB7XHJcblx0XHRcdHJvbGVJZCxcclxuXHRcdFx0Y3VzdG9tZXJzXHJcblx0XHR9KVxyXG5cdH1cclxuXHJcblx0Ly8gYXNzaWduVXNlckN1c3RvbWVycyh1c2VySWQ6IG51bWJlciwgY3VzdG9tZXJzOiBhbnlbXSkge1xyXG5cdC8vIFx0cmV0dXJuIHRoaXMuaHR0cC5wb3N0KHRoaXMuZW5kcG9pbnRzLmFzc2lnblVzZXJDdXN0b21lcnM/LnVybCA/PyAnJywge3VzZXJJZCwgY3VzdG9tZXJzfSlcclxuXHQvLyB9XHJcblxyXG5cdC8vIGFzc2lnblVzZXJBZ2VuY2llcyh1c2VySWQ6IG51bWJlciwgYWdlbmNpZXM6IGFueVtdKSB7XHJcblx0Ly8gXHRyZXR1cm4gdGhpcy5odHRwLnBvc3QodGhpcy5lbmRwb2ludHMuYXNzaWduVXNlckFnZW5jaWVzPy51cmwgPz8gJycsIHt1c2VySWQsIGFnZW5jaWVzfSlcclxuXHQvLyB9XHJcblxyXG5cclxuXHRhc3NpZ25Vc2VyQ3VzdG9tZXJBbmRBZ2VuY2llcyh1c2VySWQ6IG51bWJlciwgY3VzdG9tZXJzOiBhbnlbXSwgYWdlbmNpZXM6IHsgW2N1c3RvbWVySWQ6IG51bWJlcl06IGFueVtdIH0pIHtcclxuXHRcdHJldHVybiB0aGlzLmVuZHBvaW50cy5hc3NpZ25Vc2VyQ3VzdG9tZXJzPy5vblJlcXVlc3Qoe3VzZXJJZCwgY3VzdG9tZXJzLCBhZ2VuY2llc30pO1xyXG5cdH1cclxuXHJcblx0YXNzaWduQ3VzdG9tZXJVc2VycyhjdXN0b21lcklkOiBudW1iZXIsIHVzZXJzOiBhbnlbXSkge1xyXG5cdFx0cmV0dXJuIHRoaXMuZW5kcG9pbnRzLmFzc2lnbkN1c3RvbWVyVXNlcnM/Lm9uUmVxdWVzdCh7Y3VzdG9tZXJJZCwgdXNlcnN9KTtcclxuXHR9XHJcblxyXG5cdGdldFVzZXJSb2xlc0J5Q3VzdG9tZXJzKHVzZXI6IGFueSkge1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cC5nZXQoYCR7dGhpcy5lbmRwb2ludHMuY3VzdG9tZXJzQnlVc2VyPy51cmx9JHt0aGlzLmVuZHBvaW50cy5jdXN0b21lcnNCeVVzZXI/LnF1ZXJ5UGFyYW1zPy4odXNlcil9YCkucGlwZShcclxuXHRcdFx0c3dpdGNoTWFwKHRoaXMuZW5kcG9pbnRzLmN1c3RvbWVyc0J5VXNlcj8ucmVzcG9uc2VNYXBwaW5nID8/IGRlZmF1bHRTd2l0Y2hNYXBwZXIpLFxyXG5cdFx0XHRzd2l0Y2hNYXAoKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuXHRcdFx0XHRyZXR1cm4gZnJvbShBcnJheS5mcm9tKG5ldyBTZXQocmVzcG9uc2UubG9hZCkpKS5waXBlKFxyXG5cdFx0XHRcdFx0bWVyZ2VNYXAoXHJcblx0XHRcdFx0XHRcdGN1c3RvbWVySWQgPT4gdGhpcy5odHRwLmdldChgJHt0aGlzLmVuZHBvaW50cy5yb2xlc0J5Q3VzdG9tZXI/LnVybH0ke3RoaXMuZW5kcG9pbnRzLnJvbGVzQnlDdXN0b21lcj8ucXVlcnlQYXJhbXM/Lih7IGlkOiBjdXN0b21lcklkIH0pfWApXHJcblx0XHRcdFx0XHQpLFxyXG5cdFx0XHRcdFx0cmVkdWNlKChhY2M6IGFueSwgY3VycjogYW55KSA9PiBhY2MuY29uY2F0KGN1cnIpLCBbXSksXHJcblx0XHRcdFx0XHRtYXAobmV3TG9hZCA9PiAoeyAuLi5yZXNwb25zZSwgbG9hZDogbmV3TG9hZCB9KSlcclxuXHRcdFx0XHQpXHJcblx0XHRcdH0pLFxyXG5cdFx0XHRzd2l0Y2hNYXAoKHJlc3BvbnNlMikgPT4gb2Yoey4uLnJlc3BvbnNlMiwgbG9hZDogcmVzcG9uc2UyLmxvYWQubWFwKChyZXNwb25zZTM6IGFueSkgPT4gcmVzcG9uc2UzLmxvYWQpLmZsYXQoKX0pKVxyXG5cdFx0KVxyXG5cdH1cclxuXHJcblx0Ly8gc2V0Um9sZXNCeVVzZXJFbmRwb2ludChlbmRwb2ludDogc3RyaW5nKSB7XHJcblx0Ly8gXHR0aGlzLnJvbGVzQnlVc2VyRW5kcG9pbnQgPSBlbmRwb2ludDtcclxuXHQvLyB9XHJcblxyXG5cdC8vIHNldEFzc2lnblVzZXJSb2xlRW5kcG9pbnQoZW5kcG9pbnQ6IHN0cmluZykge1xyXG5cdC8vIFx0dGhpcy5hc3NpZ25Vc2VyUm9sZUVuZHBvaW50ID0gZW5kcG9pbnQ7XHJcblx0Ly8gfVxyXG5cclxuXHQvLyBzZXRSb2xlc0J5Q3VzdG9tZXJFbmRwb2ludChlbmRwb2ludDogc3RyaW5nKSB7XHJcblx0Ly8gXHR0aGlzLnJvbGVzQnlDdXN0b21lckVuZHBvaW50ID0gZW5kcG9pbnQ7XHJcblx0Ly8gfVxyXG5cclxuXHQvLyBzZXRBc3NpZ25DdXN0b21lclJvbGVFbmRwb2ludChlbmRwb2ludDogc3RyaW5nKSB7XHJcblx0Ly8gXHR0aGlzLmFzc2lnbkN1c3RvbWVyUm9sZUVuZHBvaW50ID0gZW5kcG9pbnQ7XHJcblx0Ly8gfVxyXG5cclxuXHQvLyBzZXRTYXZlUGVybWlzc2lvbnNFbmRwb2ludChlbmRwb2ludDogc3RyaW5nKSB7XHJcblx0Ly8gXHR0aGlzLnNhdmVQZXJtaXNzaW9uc0VuZHBvaW50ID0gZW5kcG9pbnQ7XHJcblx0Ly8gfVxyXG5cclxuXHQvLyBzZXRVc2Vyc0J5Q3VzdG9tZXJFbmRwb2ludChlbmRwb2ludDogc3RyaW5nKSB7XHJcblx0Ly8gXHR0aGlzLnVzZXJzQnlDdXN0b21lckVuZHBvaW50ID0gZW5kcG9pbnQ7XHJcblx0Ly8gfVxyXG5cclxuXHQvLyBzZXRMaXN0Um9sZXNFbmRwb2ludChlbmRwb2ludDogc3RyaW5nKSB7XHJcblx0Ly8gXHR0aGlzLmxpc3RSb2xlc0VuZHBvaW50ID0gZW5kcG9pbnQ7XHJcblx0Ly8gfVxyXG5cclxuXHQvLyBzZXRBc3NpZ25SZXNvdXJjZUVuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpIHtcclxuXHQvLyBcdHRoaXMuYXNzaWduUmVzb3VyY2VFbmRwb2ludCA9IGVuZHBvaW50O1xyXG5cdC8vIH1cclxuXHJcblx0Ly8gc2V0UmVzb3VyY2VzQnlSb2xlRW5kcG9pbnQoZW5kcG9pbnQ6IHN0cmluZykge1xyXG5cdC8vIFx0dGhpcy5yZXNvdXJjZXNCeVJvbGVFbmRwb2ludCA9IGVuZHBvaW50O1xyXG5cdC8vIH1cclxuXHJcblx0Ly8gc2V0QWN0aW9uc0J5Um9sZUFuZFJlc291cmNlRW5kcG9pbnQoZW5kcG9pbnQ6IHN0cmluZykge1xyXG5cdC8vIFx0dGhpcy5nZXRBY3Rpb25zRW5kcG9pbnQgPSBlbmRwb2ludDtcclxuXHQvLyB9XHJcblxyXG5cdHNlbGVjdFVzZXIodXNlcjogYW55KSB7XHJcblx0XHR0aGlzLnNlbGVjdGVkVXNlclN1YmplY3QubmV4dCh1c2VyKTtcclxuXHR9XHJcblxyXG5cdHNlbGVjdEN1c3RvbWVyKGN1c3RvbWVyOiBhbnkpIHtcclxuXHRcdHRoaXMuc2VsZWN0ZWRDdXN0b21lclN1YmplY3QubmV4dChjdXN0b21lcik7XHJcblx0fVxyXG5cclxuXHRzZWxlY3RSb2xlKHJvbGU6IGFueSkge1xyXG5cclxuXHRcdHRoaXMuc2VsZWN0ZWRSb2xlU3ViamVjdC5uZXh0KHJvbGUpO1xyXG5cdH1cclxuXHJcblx0c2F2ZUl0ZW0oZW5kcG9pbnQ6IHN0cmluZywgdXBkYXRlZEl0ZW06IGFueSkge1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cC5wb3N0KGVuZHBvaW50LCB1cGRhdGVkSXRlbSk7XHJcblx0fVxyXG5cclxuXHRhc3NpZ25SZXNvdXJjZShyb2xlSWQ6IG51bWJlciwgcmVzb3VyY2VzOiBhbnlbXSkge1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cC5wb3N0KHRoaXMuZW5kcG9pbnRzLmFzc2lnblJlc291cmNlPy51cmwgPz8gJycsIHsgcm9sZUlkLCByZXNvdXJjZXMgfSk7XHJcblx0fVxyXG5cclxuXHRzYXZlUGVybWlzc2lvbnMocGVybWlzc2lvbnM6IGFueVtdKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5odHRwLnBvc3QodGhpcy5lbmRwb2ludHMuc2F2ZVBlcm1pc3Npb25zPy51cmwgPz8gJycsIHBlcm1pc3Npb25zKTtcclxuXHR9XHJcblxyXG5cdGdldE1lbnVUcmVlKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5lbmRwb2ludHMuZ2V0TWVudVRyZWU/LnVybCA/PyAnJyk7XHJcblx0fVxyXG5cclxuXHRnZXRBcHBNb2R1bGVzKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5lbmRwb2ludHMubGlzdE1vZHVsZXM/LnVybCA/PyAnJyk7XHJcblx0fVxyXG5cclxuXHRzYXZlTW9kdWxlKG1vZHVsZTogYW55KSB7XHJcblx0XHRyZXR1cm4gdGhpcy5odHRwLnBvc3QodGhpcy5lbmRwb2ludHMuY3JlYXRlTW9kdWxlPy51cmwgPz8gJycsIG1vZHVsZSk7XHJcblx0fVxyXG5cclxuXHRyZWxvYWRFbnRpdHkoZW50aXR5TmFtZTogXCJVc2VyXCIgfCBcIkN1c3RvbWVyXCIgfCBcIlJvbGVcIikge1xyXG5cdFx0dGhpcy5yZWxvYWRTdWJqZWN0Lm5leHQoZW50aXR5TmFtZSk7XHJcblx0fVxyXG59XHJcbiJdfQ==