asp-lib 1.0.14 → 1.0.16

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 (64) hide show
  1. package/esm2022/lib/asp-lib.module.mjs +14 -8
  2. package/esm2022/lib/assign-roles/assign-roles.component.mjs +5 -4
  3. package/esm2022/lib/basic-item/basic-item.component.mjs +2 -2
  4. package/esm2022/lib/checkbox/checkbox.component.mjs +2 -2
  5. package/esm2022/lib/checkbox-field/checkbox-field.component.mjs +2 -2
  6. package/esm2022/lib/company-dropdown/company-dropdown.component.mjs +3 -3
  7. package/esm2022/lib/dropdown/dropdown.component.mjs +9 -4
  8. package/esm2022/lib/entity-admin/entity-admin.component.mjs +378 -0
  9. package/esm2022/lib/form/form.component.mjs +24 -6
  10. package/esm2022/lib/form-2/form-2.component.mjs +3 -5
  11. package/esm2022/lib/header/header.component.mjs +12 -3
  12. package/esm2022/lib/input/input.component.mjs +9 -3
  13. package/esm2022/lib/interfaces/interfaces.mjs +34 -1
  14. package/esm2022/lib/items-selector/items-selector.component.mjs +42 -22
  15. package/esm2022/lib/items-viewer/items-viewer.component.mjs +61 -33
  16. package/esm2022/lib/list/list.component.mjs +2 -2
  17. package/esm2022/lib/loader/loader.component.mjs +2 -2
  18. package/esm2022/lib/menu/menu.component.mjs +8 -3
  19. package/esm2022/lib/menu-admin/menu-admin.component.mjs +4 -3
  20. package/esm2022/lib/modules-admin/modules-admin.component.mjs +5 -5
  21. package/esm2022/lib/move-menu-option/move-menu-option.component.mjs +2 -2
  22. package/esm2022/lib/multi-option-dialog/multi-option-dialog.component.mjs +2 -2
  23. package/esm2022/lib/nested-items-selector/nested-items-selector.component.mjs +189 -0
  24. package/esm2022/lib/notifications/notifications.component.mjs +3 -3
  25. package/esm2022/lib/pipes/translate.pipe.mjs +118 -0
  26. package/esm2022/lib/radio-button/radio-button.component.mjs +2 -2
  27. package/esm2022/lib/radio-group/radio-group.component.mjs +4 -3
  28. package/esm2022/lib/recents-dropdown/recents-dropdown.component.mjs +3 -3
  29. package/esm2022/lib/resource-actions/resource-actions.component.mjs +4 -3
  30. package/esm2022/lib/role-card/role-card.component.mjs +4 -3
  31. package/esm2022/lib/role-info/role-info.component.mjs +4 -3
  32. package/esm2022/lib/security-admin/security-admin.component.mjs +48 -63
  33. package/esm2022/lib/select/select.component.mjs +4 -3
  34. package/esm2022/lib/services/security-admin.service.mjs +39 -54
  35. package/esm2022/lib/snackbar/snackbar.component.mjs +2 -2
  36. package/esm2022/lib/translate.pipe.mjs +16 -0
  37. package/esm2022/lib/tree/tree.component.mjs +2 -2
  38. package/esm2022/lib/user-dropdown/user-dropdown.component.mjs +3 -3
  39. package/esm2022/lib/utils/utils.mjs +15 -0
  40. package/esm2022/public-api.mjs +2 -2
  41. package/fesm2022/asp-lib.mjs +759 -315
  42. package/fesm2022/asp-lib.mjs.map +1 -1
  43. package/lib/asp-lib.module.d.ts +20 -18
  44. package/lib/dropdown/dropdown.component.d.ts +3 -2
  45. package/lib/entity-admin/entity-admin.component.d.ts +92 -0
  46. package/lib/form/form.component.d.ts +2 -0
  47. package/lib/header/header.component.d.ts +4 -1
  48. package/lib/input/input.component.d.ts +3 -1
  49. package/lib/interfaces/interfaces.d.ts +48 -29
  50. package/lib/items-selector/items-selector.component.d.ts +13 -6
  51. package/lib/items-viewer/items-viewer.component.d.ts +9 -2
  52. package/lib/menu/menu.component.d.ts +2 -1
  53. package/lib/modules-admin/modules-admin.component.d.ts +1 -1
  54. package/lib/nested-items-selector/nested-items-selector.component.d.ts +57 -0
  55. package/lib/pipes/translate.pipe.d.ts +11 -0
  56. package/lib/security-admin/security-admin.component.d.ts +5 -6
  57. package/lib/services/security-admin.service.d.ts +8 -18
  58. package/lib/translate.pipe.d.ts +7 -0
  59. package/lib/utils/utils.d.ts +3 -0
  60. package/package.json +1 -1
  61. package/public-api.d.ts +1 -1
  62. package/src/lib/assets/theme.scss +115 -104
  63. package/esm2022/lib/users-admin/users-admin.component.mjs +0 -292
  64. package/lib/users-admin/users-admin.component.d.ts +0 -72
@@ -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,27 +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 = '';
44
27
  this.endpoints = {};
28
+ this.language = 'en';
45
29
  this.theme = 'default';
46
30
  this.msgLabel = { "User": "Usuario", "Customer": "Empresa", "Role": "Rol" };
31
+ this.blockCreationFor = new Set(["Customer"]);
47
32
  this.reloadByEntity = {
48
33
  "User": new Subject(),
49
34
  "Customer": new Subject(),
@@ -56,74 +41,74 @@ export class SecurityAdminService {
56
41
  subject.subscribe({ next: (item) => this.selectedItem = item });
57
42
  }
58
43
  }
44
+ setLanguage(language) {
45
+ this.language = language;
46
+ }
59
47
  setSecurityEndpoints(endpoints) {
60
48
  this.endpoints = endpoints;
61
49
  }
62
50
  getRoles() {
63
- return this.http.get(this.endpoints.listRolesEndpoint ?? '');
51
+ return this.http.get(this.endpoints.listRoles?.url ?? '');
64
52
  }
65
53
  deleteMenuOption(option) {
66
- return this.http.get(`${this.endpoints.deleteMenuOptionEndpoint ?? ''}?optionId=${option.id}`);
54
+ return this.http.get(`${this.endpoints.deleteMenuOption?.url ?? ''}?optionId=${option.id}`);
67
55
  }
68
56
  setTheme(theme) {
69
57
  this.theme = Boolean(theme) ? theme : 'default';
70
58
  }
71
59
  getActions(roleId, resourceId) {
72
- return this.http.get(`${this.endpoints.actionsByRoleAndResourceEndpoint == ''}?roleId=${roleId}&resourceId=${resourceId}`);
60
+ return this.http.get(`${this.endpoints.actionsByRoleAndResource?.url ?? ''}?roleId=${roleId}&resourceId=${resourceId}`);
73
61
  }
74
- // setDeleteMenuOptionEndpoint(endpoint: string){
75
- // this.deleteMenuOptionEndpoint = endpoint;
76
- // }
77
62
  getResourcesByRole(roleId) {
78
- return this.http.get(`${this.endpoints.resourcesByRoleEndpoint ?? ''}?roledId=${roleId}`);
63
+ return this.http.get(`${this.endpoints.resourcesByRole?.url ?? ''}?roledId=${roleId}`);
79
64
  }
80
- // setListUsersEndpoint(endpoint: string) {
81
- // this.listUsersEndpoint = endpoint;
82
- // }
83
65
  setMenuOptionFormComponent(component) {
84
66
  this.menuOptionFormComponent = component;
85
67
  }
86
- // setUsersByRoleEndpoint(endpoint: string) {
87
- // this.usersByRoleEndpoint = endpoint;
88
- // }
89
- // setCustomersByRoleEndpoint(endpoint: string) {
90
- // this.customersByRoleEndpoint = endpoint;
91
- // }
92
- // setSaveMenuOptionEndpoint(endpoint: string) {
93
- // this.saveMenuOptionEndpoint = endpoint;
94
- // }
95
- // setGetMenuTreeEndpoint(endpoint: string) { this.getMenuTreeEndpoint = endpoint }
96
- // setAssignRoleUsersEndpoint(endpoint: string) { this.assignRoleUsersEndpoint = endpoint }
97
- // setAssignRoleCustomersEndpoint(endpoint: string) {
98
- // this.assignRoleCustomersEndpoint = endpoint;
99
- // }
100
68
  saveMenuOption(option) {
101
- return this.http.post(this.endpoints.saveMenuOptionEndpoint ?? '', { ...option, id: option.id > -1 ? option.id : null });
69
+ return this.http.post(this.endpoints.saveMenuOption?.url ?? '', { ...option, id: option.id > -1 ? option.id : null });
102
70
  }
103
71
  // getUsers(page: number = 1, pageSize: number = 10) {
104
72
  // return this.http.get(`this.listUsersEndpoint?page=${page}&pageSize=${pageSize}`);
105
73
  // }
106
74
  getAssignedRoles(id, type) {
107
- return this.http.get(`${type === "User" ? (this.endpoints.rolesByUserEndpoint ?? '') : (this.endpoints.rolesByCustomerEndpoint ?? '')}?${paramNames[type]}=${id}`);
75
+ return this.http.get(`${type === "User" ? (this.endpoints.rolesByUser?.url ?? '') : (this.endpoints.rolesByCustomer ?? '')}?${paramNames[type]}=${id}`);
108
76
  }
109
77
  assignRoles(id, roles, type) {
110
- return this.http.post(type === "User" ? (this.endpoints.assignUserRoleEndpoint ?? '') : (this.endpoints.assignCustomerRoleEndpoint ?? ''), {
78
+ return this.http.post(type === "User" ? (this.endpoints.assignUserRole?.url ?? '') : (this.endpoints.assignCustomerRole?.url ?? ''), {
111
79
  [paramNames[type]]: id,
112
80
  roles
113
81
  });
114
82
  }
115
83
  assignRoleUsers(roleId, users) {
116
- return this.http.post(this.endpoints.assignRoleUsersEndpoint ?? '', {
84
+ return this.http.post(this.endpoints.assignRoleUsers?.url ?? '', {
117
85
  roleId,
118
86
  users
119
87
  });
120
88
  }
121
89
  assignRoleCustomers(roleId, customers) {
122
- return this.http.post(this.endpoints.assignRoleCustomersEndpoint ?? '', {
90
+ return this.http.post(this.endpoints.assignRoleCustomers?.url ?? '', {
123
91
  roleId,
124
92
  customers
125
93
  });
126
94
  }
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
+ }
127
112
  // setRolesByUserEndpoint(endpoint: string) {
128
113
  // this.rolesByUserEndpoint = endpoint;
129
114
  // }
@@ -167,19 +152,19 @@ export class SecurityAdminService {
167
152
  return this.http.post(endpoint, updatedItem);
168
153
  }
169
154
  assignResource(roleId, resources) {
170
- return this.http.post(this.endpoints.assignResourceEndpoint ?? '', { roleId, resources });
155
+ return this.http.post(this.endpoints.assignResource?.url ?? '', { roleId, resources });
171
156
  }
172
157
  savePermissions(permissions) {
173
- return this.http.post(this.endpoints.savePermissionsEndpoint ?? '', permissions);
158
+ return this.http.post(this.endpoints.savePermissions?.url ?? '', permissions);
174
159
  }
175
160
  getMenuTree() {
176
- return this.http.get(this.endpoints.getMenuTreeEndpoint ?? '');
161
+ return this.http.get(this.endpoints.getMenuTree?.url ?? '');
177
162
  }
178
163
  getAppModules() {
179
- return this.http.get(this.endpoints.listModulesEndpoint ?? '');
164
+ return this.http.get(this.endpoints.listModules?.url ?? '');
180
165
  }
181
166
  saveModule(module) {
182
- return this.http.post(this.endpoints.createModuleEndpoint ?? '', module);
167
+ return this.http.post(this.endpoints.createModule?.url ?? '', module);
183
168
  }
184
169
  reloadEntity(entityName) {
185
170
  this.reloadSubject.next(entityName);
@@ -193,4 +178,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
193
178
  providedIn: 'root'
194
179
  }]
195
180
  }], ctorParameters: function () { return [{ type: i1.HttpClient }]; } });
196
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHktYWRtaW4uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FzcC1saWIvc3JjL2xpYi9zZXJ2aWNlcy9zZWN1cml0eS1hZG1pbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQVEsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQzs7O0FBSTNDLE1BQU0sVUFBVSxHQUFHO0lBQ2xCLFFBQVEsRUFBRSxZQUFZO0lBQ3RCLElBQUksRUFBRSxRQUFRO0NBQ2QsQ0FBQTtBQUtELE1BQU0sT0FBTyxvQkFBb0I7SUF5Q2hDLElBQUksVUFBVSxLQUFLLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQSxDQUFDLENBQUM7SUFDdkQsSUFBSSxjQUFjLEtBQUssT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFBLENBQUMsQ0FBQztJQUMvRCxJQUFJLFVBQVUsS0FBSyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUEsQ0FBQyxDQUFDO0lBRXZELElBQUksUUFBUTtRQUNYLE9BQU8sQ0FBQztZQUNQLE1BQU0sRUFBRSxJQUFJLENBQUMsbUJBQW1CO1lBQ2hDLFVBQVUsRUFBRSxJQUFJLENBQUMsdUJBQXVCO1lBQ3hDLE1BQU0sRUFBRSxJQUFJLENBQUMsbUJBQW1CO1NBQ2hDLENBQUMsQ0FBQTtJQUNILENBQUM7SUFFRCxZQUFvQixJQUFnQjtRQUFoQixTQUFJLEdBQUosSUFBSSxDQUFZO1FBbkRwQyx3QkFBbUIsR0FBRyxJQUFJLE9BQU8sRUFBTyxDQUFDO1FBQ3pDLDRCQUF1QixHQUFHLElBQUksT0FBTyxFQUFPLENBQUM7UUFDN0Msd0JBQW1CLEdBQUcsSUFBSSxPQUFPLEVBQU8sQ0FBQztRQUN6QyxrQkFBYSxHQUFHLElB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Q0FBQztJQUVELGFBQWE7UUFDWixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsbUJBQW1CLElBQUksRUFBRSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVELFVBQVUsQ0FBQyxNQUFXO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsSUFBSSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVELFlBQVksQ0FBQyxVQUF3QztRQUNwRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNyQyxDQUFDOytHQW5PVyxvQkFBb0I7bUhBQXBCLG9CQUFvQixjQUZwQixNQUFNOzs0RkFFTixvQkFBb0I7a0JBSGhDLFVBQVU7bUJBQUM7b0JBQ1gsVUFBVSxFQUFFLE1BQU07aUJBQ2xCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFNuYWNrYmFyU2VydmljZSB9IGZyb20gJy4vc25hY2tiYXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFNlY3VyaXR5RW5kcG9pbnRzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9pbnRlcmZhY2VzJztcclxuXHJcbmNvbnN0IHBhcmFtTmFtZXMgPSB7XHJcblx0Q3VzdG9tZXI6IFwiY3VzdG9tZXJJZFwiLFxyXG5cdFVzZXI6IFwidXNlcklkXCJcclxufVxyXG5cclxuQEluamVjdGFibGUoe1xyXG5cdHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU2VjdXJpdHlBZG1pblNlcnZpY2Uge1xyXG5cclxuXHRzZWxlY3RlZFVzZXJTdWJqZWN0ID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG5cdHNlbGVjdGVkQ3VzdG9tZXJTdWJqZWN0ID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG5cdHNlbGVjdGVkUm9sZVN1YmplY3QgPSBuZXcgU3ViamVjdDxhbnk+KCk7XHJcblx0cmVsb2FkU3ViamVjdCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcclxuXHR1c2Vyc0J5Q3VzdG9tZXJFbmRwb2ludDogc3RyaW5nID0gJyc7XHJcblx0YXNzaWduUmVzb3VyY2VFbmRwb2ludDogc3RyaW5nID0gJyc7XHJcblx0Z2V0QWN0aW9uc0VuZHBvaW50OiBzdHJpbmcgPSAnJztcclxuXHRzYXZlUGVybWlzc2lvbnNFbmRwb2ludDogc3RyaW5nID0gJyc7XHJcblx0bGlzdFJvbGVzRW5kcG9pbnQ6IHN0cmluZyA9ICcnO1xyXG5cdHJlc291cmNlc0J5Um9sZUVuZHBvaW50OiBzdHJpbmcgPSAnJztcclxuXHRyb2xlc0J5VXNlckVuZHBvaW50OiBzdHJpbmcgPSAnJztcclxuXHRnZXRNZW51VHJlZUVuZHBvaW50OiBzdHJpbmcgPSAnJztcclxuXHRzYXZlTWVudU9wdGlvbkVuZHBvaW50OiBzdHJpbmcgPSAnJztcclxuXHRkZWxldGVNZW51T3B0aW9uRW5kcG9pbnQ6IHN0cmluZyA9ICcnO1xyXG5cclxuXHRhc3NpZ25Vc2VyUm9sZUVuZHBvaW50OiBzdHJpbmcgPSAnJztcclxuXHRyb2xlc0J5Q3VzdG9tZXJFbmRwb2ludDogc3RyaW5nID0gJyc7XHJcblx0YXNzaWduQ3VzdG9tZXJSb2xlRW5kcG9pbnQ6IHN0cmluZyA9ICcnO1xyXG5cdHVzZXJzQnlSb2xlRW5kcG9pbnQ6IHN0cmluZyA9ICcnO1xyXG5cdGN1c3RvbWVyc0J5Um9sZUVuZHBvaW50OiBzdHJpbmcgPSAnJztcclxuXHRtZW51T3B0aW9uRm9ybUNvbXBvbmVudD86IFR5cGU8YW55PjtcclxuXHJcblx0bGlzdFVzZXJzRW5kcG9pbnQ6IHN0cmluZyA9ICcnO1xyXG5cdGFzc2lnblJvbGVVc2Vyc0VuZHBvaW50OiBzdHJpbmcgPSAnJztcclxuXHRhc3NpZ25Sb2xlQ3VzdG9tZXJzRW5kcG9pbnQ6IHN0cmluZyA9ICcnO1xyXG5cclxuXHRlbmRwb2ludHM6IFNlY3VyaXR5RW5kcG9pbnRzID0ge307XHJcblxyXG5cdHNlbGVjdGVkSXRlbTogYW55O1xyXG5cdHRoZW1lOiBzdHJpbmcgPSAnZGVmYXVsdCc7XHJcblxyXG5cdG1zZ0xhYmVsID0geyBcIlVzZXJcIjogXCJVc3VhcmlvXCIsIFwiQ3VzdG9tZXJcIjogXCJFbXByZXNhXCIsIFwiUm9sZVwiOiBcIlJvbFwiIH1cclxuXHJcblx0cmVsb2FkQnlFbnRpdHkgPSB7XHJcblx0XHRcIlVzZXJcIjogbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKSxcclxuXHRcdFwiQ3VzdG9tZXJcIjogbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKSxcclxuXHRcdFwiUm9sZVwiOiBuZXcgU3ViamVjdDxib29sZWFuPigpXHJcblx0fVxyXG5cclxuXHRnZXQgdXNlclJlbG9hZCgpIHsgcmV0dXJuIHRoaXMucmVsb2FkQnlFbnRpdHlbJ1VzZXInXSB9XHJcblx0Z2V0IGN1c3RvbWVyUmVsb2FkKCkgeyByZXR1cm4gdGhpcy5yZWxvYWRCeUVudGl0eVsnQ3VzdG9tZXInXSB9XHJcblx0Z2V0IHJvbGVSZWxvYWQoKSB7IHJldHVybiB0aGlzLnJlbG9hZEJ5RW50aXR5WydSb2xlJ10gfVxyXG5cclxuXHRnZXQgc3ViamVjdHMoKSB7XHJcblx0XHRyZXR1cm4gKHtcclxuXHRcdFx0XCJVc2VyXCI6IHRoaXMuc2VsZWN0ZWRVc2VyU3ViamVjdCxcclxuXHRcdFx0XCJDdXN0b21lclwiOiB0aGlzLnNlbGVjdGVkQ3VzdG9tZXJTdWJqZWN0LFxyXG5cdFx0XHRcIlJvbGVcIjogdGhpcy5zZWxlY3RlZFJvbGVTdWJqZWN0XHJcblx0XHR9KVxyXG5cdH1cclxuXHJcblx0Y29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50KSB7XHJcblx0XHR0aGlzLnJlbG9hZFN1YmplY3Quc3Vic2NyaWJlKHtcclxuXHRcdFx0bmV4dDogKGVudGl0eU5hbWU6IGFueSkgPT4geyB0aGlzLnJlbG9hZEJ5RW50aXR5W2VudGl0eU5hbWUgYXMgXCJVc2VyXCIgfCBcIkN1c3RvbWVyXCIgfCBcIlJvbGVcIl0/Lm5leHQodHJ1ZSkgfVxyXG5cdFx0fSlcclxuXHRcdGZvciAobGV0IHN1YmplY3Qgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLnN1YmplY3RzKSkge1xyXG5cdFx0XHRzdWJqZWN0LnN1YnNjcmliZSh7IG5leHQ6IChpdGVtKSA9PiB0aGlzLnNlbGVjdGVkSXRlbSA9IGl0ZW0gfSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRzZXRTZWN1cml0eUVuZHBvaW50cyhlbmRwb2ludHM6IFNlY3VyaXR5RW5kcG9pbnRzKXtcclxuXHRcdHRoaXMuZW5kcG9pbnRzID0gZW5kcG9pbnRzO1xyXG5cdH1cclxuXHJcblx0Z2V0Um9sZXMoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5odHRwLmdldCh0aGlzLmVuZHBvaW50cy5saXN0Um9sZXNFbmRwb2ludCA/PyAnJyk7XHJcblx0fVxyXG5cclxuXHRkZWxldGVNZW51T3B0aW9uKG9wdGlvbjogYW55KXtcclxuXHRcdHJldHVybiB0aGlzLmh0dHAuZ2V0KGAke3RoaXMuZW5kcG9pbnRzLmRlbGV0ZU1lbnVPcHRpb25FbmRwb2ludCA/PyAnJ30/b3B0aW9uSWQ9JHtvcHRpb24uaWR9YClcclxuXHR9XHJcblxyXG5cdHNldFRoZW1lKHRoZW1lOiBzdHJpbmcpe1xyXG5cdFx0dGhpcy50aGVtZSA9IEJvb2xlYW4odGhlbWUpID8gdGhlbWUgOiAnZGVmYXVsdCc7XHJcblx0fVxyXG5cclxuXHRnZXRBY3Rpb25zKHJvbGVJZDogbnVtYmVyLCByZXNvdXJjZUlkOiBudW1iZXIpIHtcclxuXHRcdHJldHVybiB0aGlzLmh0dHAuZ2V0KGAke3RoaXMuZW5kcG9pbnRzLmFjdGlvbnNCeVJvbGVBbmRSZXNvdXJjZUVuZHBvaW50ID09ICcnfT9yb2xlSWQ9JHtyb2xlSWR9JnJlc291cmNlSWQ9JHtyZXNvdXJjZUlkfWApO1xyXG5cdH1cclxuXHJcblx0Ly8gc2V0RGVsZXRlTWVudU9wdGlvbkVuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpe1xyXG5cdC8vIFx0dGhpcy5kZWxldGVNZW51T3B0aW9uRW5kcG9pbnQgPSBlbmRwb2ludDtcclxuXHQvLyB9XHJcblxyXG5cdGdldFJlc291cmNlc0J5Um9sZShyb2xlSWQ6IG51bWJlcikge1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cC5nZXQoYCR7dGhpcy5lbmRwb2ludHMucmVzb3VyY2VzQnlSb2xlRW5kcG9pbnQgPz8gJyd9P3JvbGVkSWQ9JHtyb2xlSWR9YCk7XHJcblx0fVxyXG5cclxuXHQvLyBzZXRMaXN0VXNlcnNFbmRwb2ludChlbmRwb2ludDogc3RyaW5nKSB7XHJcblx0Ly8gXHR0aGlzLmxpc3RVc2Vyc0VuZHBvaW50ID0gZW5kcG9pbnQ7XHJcblx0Ly8gfVxyXG5cclxuXHRzZXRNZW51T3B0aW9uRm9ybUNvbXBvbmVudChjb21wb25lbnQ/OiBUeXBlPGFueT4pe1xyXG5cdFx0dGhpcy5tZW51T3B0aW9uRm9ybUNvbXBvbmVudCA9IGNvbXBvbmVudDtcclxuXHR9XHJcblxyXG5cdC8vIHNldFVzZXJzQnlSb2xlRW5kcG9pbnQoZW5kcG9pbnQ6IHN0cmluZykge1xyXG5cdC8vIFx0dGhpcy51c2Vyc0J5Um9sZUVuZHBvaW50ID0gZW5kcG9pbnQ7XHJcblx0Ly8gfVxyXG5cdC8vIHNldEN1c3RvbWVyc0J5Um9sZUVuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpIHtcclxuXHQvLyBcdHRoaXMuY3VzdG9tZXJzQnlSb2xlRW5kcG9pbnQgPSBlbmRwb2ludDtcclxuXHQvLyB9XHJcblxyXG5cdC8vIHNldFNhdmVNZW51T3B0aW9uRW5kcG9pbnQoZW5kcG9pbnQ6IHN0cmluZykge1xyXG5cdC8vIFx0dGhpcy5zYXZlTWVudU9wdGlvbkVuZHBvaW50ID0gZW5kcG9pbnQ7XHJcblx0Ly8gfVxyXG5cclxuXHQvLyBzZXRHZXRNZW51VHJlZUVuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpIHsgdGhpcy5nZXRNZW51VHJlZUVuZHBvaW50ID0gZW5kcG9pbnQgfVxyXG5cdC8vIHNldEFzc2lnblJvbGVVc2Vyc0VuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpIHsgdGhpcy5hc3NpZ25Sb2xlVXNlcnNFbmRwb2ludCA9IGVuZHBvaW50IH1cclxuXHQvLyBzZXRBc3NpZ25Sb2xlQ3VzdG9tZXJzRW5kcG9pbnQoZW5kcG9pbnQ6IHN0cmluZykge1xyXG5cdC8vIFx0dGhpcy5hc3NpZ25Sb2xlQ3VzdG9tZXJzRW5kcG9pbnQgPSBlbmRwb2ludDtcclxuXHQvLyB9XHJcblxyXG5cdHNhdmVNZW51T3B0aW9uKG9wdGlvbjogYW55KSB7XHJcblx0XHRyZXR1cm4gdGhpcy5odHRwLnBvc3QodGhpcy5lbmRwb2ludHMuc2F2ZU1lbnVPcHRpb25FbmRwb2ludCA/PyAnJywgey4uLm9wdGlvbiwgaWQ6IG9wdGlvbi5pZCA+IC0xID8gb3B0aW9uLmlkOiBudWxsfSk7XHJcblx0fVxyXG5cclxuXHQvLyBnZXRVc2VycyhwYWdlOiBudW1iZXIgPSAxLCBwYWdlU2l6ZTogbnVtYmVyID0gMTApIHtcclxuXHQvLyBcdHJldHVybiB0aGlzLmh0dHAuZ2V0KGB0aGlzLmxpc3RVc2Vyc0VuZHBvaW50P3BhZ2U9JHtwYWdlfSZwYWdlU2l6ZT0ke3BhZ2VTaXplfWApO1xyXG5cdC8vIH1cclxuXHJcblx0Z2V0QXNzaWduZWRSb2xlcyhpZDogbnVtYmVyLCB0eXBlOiBcIlVzZXJcIiB8IFwiQ3VzdG9tZXJcIikge1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cC5nZXQoYCR7dHlwZSA9PT0gXCJVc2VyXCIgPyAodGhpcy5lbmRwb2ludHMucm9sZXNCeVVzZXJFbmRwb2ludCA/PyAnJykgOiAodGhpcy5lbmRwb2ludHMucm9sZXNCeUN1c3RvbWVyRW5kcG9pbnQgPz8gJycpfT8ke3BhcmFtTmFtZXNbdHlwZV19PSR7aWR9YCk7XHJcblx0fVxyXG5cclxuXHRhc3NpZ25Sb2xlcyhpZDogbnVtYmVyLCByb2xlczogYW55W10sIHR5cGU6IFwiVXNlclwiIHwgXCJDdXN0b21lclwiKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5odHRwLnBvc3QodHlwZSA9PT0gXCJVc2VyXCIgPyAodGhpcy5lbmRwb2ludHMuYXNzaWduVXNlclJvbGVFbmRwb2ludCA/PyAnJykgOiAodGhpcy5lbmRwb2ludHMuYXNzaWduQ3VzdG9tZXJSb2xlRW5kcG9pbnQgPz8gJycpLCB7XHJcblx0XHRcdFtwYXJhbU5hbWVzW3R5cGVdXTogaWQsXHJcblx0XHRcdHJvbGVzXHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdGFzc2lnblJvbGVVc2Vycyhyb2xlSWQ6IG51bWJlciwgdXNlcnM6IGFueVtdKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5odHRwLnBvc3QodGhpcy5lbmRwb2ludHMuYXNzaWduUm9sZVVzZXJzRW5kcG9pbnQgPz8gJycsIHtcclxuXHRcdFx0cm9sZUlkLFxyXG5cdFx0XHR1c2Vyc1xyXG5cdFx0fSlcclxuXHR9XHJcblxyXG5cdGFzc2lnblJvbGVDdXN0b21lcnMocm9sZUlkOiBudW1iZXIsIGN1c3RvbWVyczogYW55W10pIHtcclxuXHRcdHJldHVybiB0aGlzLmh0dHAucG9zdCh0aGlzLmVuZHBvaW50cy5hc3NpZ25Sb2xlQ3VzdG9tZXJzRW5kcG9pbnQgPz8gJycsIHtcclxuXHRcdFx0cm9sZUlkLFxyXG5cdFx0XHRjdXN0b21lcnNcclxuXHRcdH0pXHJcblx0fVxyXG5cclxuXHQvLyBzZXRSb2xlc0J5VXNlckVuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpIHtcclxuXHQvLyBcdHRoaXMucm9sZXNCeVVzZXJFbmRwb2ludCA9IGVuZHBvaW50O1xyXG5cdC8vIH1cclxuXHJcblx0Ly8gc2V0QXNzaWduVXNlclJvbGVFbmRwb2ludChlbmRwb2ludDogc3RyaW5nKSB7XHJcblx0Ly8gXHR0aGlzLmFzc2lnblVzZXJSb2xlRW5kcG9pbnQgPSBlbmRwb2ludDtcclxuXHQvLyB9XHJcblxyXG5cdC8vIHNldFJvbGVzQnlDdXN0b21lckVuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpIHtcclxuXHQvLyBcdHRoaXMucm9sZXNCeUN1c3RvbWVyRW5kcG9pbnQgPSBlbmRwb2ludDtcclxuXHQvLyB9XHJcblxyXG5cdC8vIHNldEFzc2lnbkN1c3RvbWVyUm9sZUVuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpIHtcclxuXHQvLyBcdHRoaXMuYXNzaWduQ3VzdG9tZXJSb2xlRW5kcG9pbnQgPSBlbmRwb2ludDtcclxuXHQvLyB9XHJcblxyXG5cdC8vIHNldFNhdmVQZXJtaXNzaW9uc0VuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpIHtcclxuXHQvLyBcdHRoaXMuc2F2ZVBlcm1pc3Npb25zRW5kcG9pbnQgPSBlbmRwb2ludDtcclxuXHQvLyB9XHJcblxyXG5cdC8vIHNldFVzZXJzQnlDdXN0b21lckVuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpIHtcclxuXHQvLyBcdHRoaXMudXNlcnNCeUN1c3RvbWVyRW5kcG9pbnQgPSBlbmRwb2ludDtcclxuXHQvLyB9XHJcblxyXG5cdC8vIHNldExpc3RSb2xlc0VuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpIHtcclxuXHQvLyBcdHRoaXMubGlzdFJvbGVzRW5kcG9pbnQgPSBlbmRwb2ludDtcclxuXHQvLyB9XHJcblxyXG5cdC8vIHNldEFzc2lnblJlc291cmNlRW5kcG9pbnQoZW5kcG9pbnQ6IHN0cmluZykge1xyXG5cdC8vIFx0dGhpcy5hc3NpZ25SZXNvdXJjZUVuZHBvaW50ID0gZW5kcG9pbnQ7XHJcblx0Ly8gfVxyXG5cclxuXHQvLyBzZXRSZXNvdXJjZXNCeVJvbGVFbmRwb2ludChlbmRwb2ludDogc3RyaW5nKSB7XHJcblx0Ly8gXHR0aGlzLnJlc291cmNlc0J5Um9sZUVuZHBvaW50ID0gZW5kcG9pbnQ7XHJcblx0Ly8gfVxyXG5cclxuXHQvLyBzZXRBY3Rpb25zQnlSb2xlQW5kUmVzb3VyY2VFbmRwb2ludChlbmRwb2ludDogc3RyaW5nKSB7XHJcblx0Ly8gXHR0aGlzLmdldEFjdGlvbnNFbmRwb2ludCA9IGVuZHBvaW50O1xyXG5cdC8vIH1cclxuXHJcblx0c2VsZWN0VXNlcih1c2VyOiBhbnkpIHtcclxuXHRcdHRoaXMuc2VsZWN0ZWRVc2VyU3ViamVjdC5uZXh0KHVzZXIpO1xyXG5cdH1cclxuXHJcblx0c2VsZWN0Q3VzdG9tZXIoY3VzdG9tZXI6IGFueSkge1xyXG5cdFx0dGhpcy5zZWxlY3RlZEN1c3RvbWVyU3ViamVjdC5uZXh0KGN1c3RvbWVyKTtcclxuXHR9XHJcblxyXG5cdHNlbGVjdFJvbGUocm9sZTogYW55KSB7XHJcblxyXG5cdFx0dGhpcy5zZWxlY3RlZFJvbGVTdWJqZWN0Lm5leHQocm9sZSk7XHJcblx0fVxyXG5cclxuXHRzYXZlSXRlbShlbmRwb2ludDogc3RyaW5nLCB1cGRhdGVkSXRlbTogYW55KSB7XHJcblx0XHRyZXR1cm4gdGhpcy5odHRwLnBvc3QoZW5kcG9pbnQsIHVwZGF0ZWRJdGVtKTtcclxuXHR9XHJcblxyXG5cdGFzc2lnblJlc291cmNlKHJvbGVJZDogbnVtYmVyLCByZXNvdXJjZXM6IGFueVtdKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5odHRwLnBvc3QodGhpcy5lbmRwb2ludHMuYXNzaWduUmVzb3VyY2VFbmRwb2ludCA/PyAnJywgeyByb2xlSWQsIHJlc291cmNlcyB9KTtcclxuXHR9XHJcblxyXG5cdHNhdmVQZXJtaXNzaW9ucyhwZXJtaXNzaW9uczogYW55W10pIHtcclxuXHRcdHJldHVybiB0aGlzLmh0dHAucG9zdCh0aGlzLmVuZHBvaW50cy5zYXZlUGVybWlzc2lvbnNFbmRwb2ludCA/PyAnJywgcGVybWlzc2lvbnMpO1xyXG5cdH1cclxuXHJcblx0Z2V0TWVudVRyZWUoKXtcclxuXHRcdHJldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuZW5kcG9pbnRzLmdldE1lbnVUcmVlRW5kcG9pbnQgPz8gJycpO1xyXG5cdH1cclxuXHJcblx0Z2V0QXBwTW9kdWxlcygpe1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5lbmRwb2ludHMubGlzdE1vZHVsZXNFbmRwb2ludCA/PyAnJyk7XHJcblx0fVxyXG5cclxuXHRzYXZlTW9kdWxlKG1vZHVsZTogYW55KSB7XHJcblx0XHRyZXR1cm4gdGhpcy5odHRwLnBvc3QodGhpcy5lbmRwb2ludHMuY3JlYXRlTW9kdWxlRW5kcG9pbnQgPz8gJycsIG1vZHVsZSk7XHJcblx0fVxyXG5cclxuXHRyZWxvYWRFbnRpdHkoZW50aXR5TmFtZTogXCJVc2VyXCIgfCBcIkN1c3RvbWVyXCIgfCBcIlJvbGVcIikge1xyXG5cdFx0dGhpcy5yZWxvYWRTdWJqZWN0Lm5leHQoZW50aXR5TmFtZSk7XHJcblx0fVxyXG59XHJcbiJdfQ==
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==