@techextensor/tab-core-utility 2.2.181 → 2.2.184

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 (73) hide show
  1. package/esm2022/index.mjs +5 -1
  2. package/esm2022/lib/tab-core-utility/app/constants/api-constants.mjs +24 -13
  3. package/esm2022/lib/tab-core-utility/app/constants/common.mjs +14 -50
  4. package/esm2022/lib/tab-core-utility/app/constants/storage-constants.mjs +2 -2
  5. package/esm2022/lib/tab-core-utility/app/crud/tab-crud.service.mjs +38 -49
  6. package/esm2022/lib/tab-core-utility/app/crud/tab-delete.service.mjs +81 -30
  7. package/esm2022/lib/tab-core-utility/app/crud/tab-formio.service.mjs +141 -12
  8. package/esm2022/lib/tab-core-utility/app/crud/tab-get.service.mjs +136 -35
  9. package/esm2022/lib/tab-core-utility/app/crud/tab-insert.service.mjs +89 -38
  10. package/esm2022/lib/tab-core-utility/app/crud/tab-update.service.mjs +152 -131
  11. package/esm2022/lib/tab-core-utility/app/enums/query.enum.mjs +7 -7
  12. package/esm2022/lib/tab-core-utility/app/helpers/common/app.helpers.mjs +6 -17
  13. package/esm2022/lib/tab-core-utility/app/helpers/common/dsq.helpers.mjs +9 -11
  14. package/esm2022/lib/tab-core-utility/app/helpers/common/meta-data.helpers.mjs +13 -13
  15. package/esm2022/lib/tab-core-utility/app/helpers/common/req-res.helpers.mjs +7 -45
  16. package/esm2022/lib/tab-core-utility/app/helpers/common/where-clause.helpers.mjs +79 -76
  17. package/esm2022/lib/tab-core-utility/app/helpers/response.adapter.mjs +38 -0
  18. package/esm2022/lib/tab-core-utility/app/helpers/screen/grid.helpers.mjs +8 -4
  19. package/esm2022/lib/tab-core-utility/app/helpers/screen/screen.helpers.mjs +8 -33
  20. package/esm2022/lib/tab-core-utility/app/interfaces/common.interface.mjs +1 -1
  21. package/esm2022/lib/tab-core-utility/app/interfaces/signalr.interface.mjs +42 -0
  22. package/esm2022/lib/tab-core-utility/app/models/api-query.class.mjs +39 -1
  23. package/esm2022/lib/tab-core-utility/app/models/app-field.model.mjs +36 -7
  24. package/esm2022/lib/tab-core-utility/app/models/app-object.model.mjs +84 -47
  25. package/esm2022/lib/tab-core-utility/app/models/app-screen.model.mjs +24 -13
  26. package/esm2022/lib/tab-core-utility/app/models/data-source-query.model.mjs +57 -23
  27. package/esm2022/lib/tab-core-utility/app/models/filter.model.mjs +21 -10
  28. package/esm2022/lib/tab-core-utility/app/models/parameter.model.mjs +12 -6
  29. package/esm2022/lib/tab-core-utility/app/models/sort.model.mjs +11 -4
  30. package/esm2022/lib/tab-core-utility/app/utils/json.util.mjs +17 -16
  31. package/esm2022/lib/tab-core-utility/app/utils/req-res.util.mjs +1 -55
  32. package/esm2022/lib/tab-core-utility/app/utils/tab-app.util.mjs +1 -164
  33. package/esm2022/lib/tab-core-utility/core/http-client/api.service.mjs +63 -1
  34. package/esm2022/lib/tab-core-utility/core/service/signalr/operation-tracker.service.mjs +82 -0
  35. package/esm2022/lib/tab-core-utility/core/service/signalr/signalr-infrastructure.service.mjs +252 -0
  36. package/esm2022/lib/tab-core-utility/core/service/signalr/signalr.service.mjs +207 -0
  37. package/index.d.ts +4 -0
  38. package/lib/tab-core-utility/app/constants/api-constants.d.ts +13 -10
  39. package/lib/tab-core-utility/app/constants/common.d.ts +9 -0
  40. package/lib/tab-core-utility/app/constants/storage-constants.d.ts +1 -1
  41. package/lib/tab-core-utility/app/crud/tab-crud.service.d.ts +8 -1
  42. package/lib/tab-core-utility/app/crud/tab-delete.service.d.ts +20 -10
  43. package/lib/tab-core-utility/app/crud/tab-formio.service.d.ts +33 -6
  44. package/lib/tab-core-utility/app/crud/tab-get.service.d.ts +45 -3
  45. package/lib/tab-core-utility/app/crud/tab-insert.service.d.ts +16 -21
  46. package/lib/tab-core-utility/app/crud/tab-update.service.d.ts +34 -19
  47. package/lib/tab-core-utility/app/enums/query.enum.d.ts +3 -6
  48. package/lib/tab-core-utility/app/helpers/common/app.helpers.d.ts +3 -8
  49. package/lib/tab-core-utility/app/helpers/common/dsq.helpers.d.ts +3 -0
  50. package/lib/tab-core-utility/app/helpers/common/meta-data.helpers.d.ts +3 -3
  51. package/lib/tab-core-utility/app/helpers/common/req-res.helpers.d.ts +7 -51
  52. package/lib/tab-core-utility/app/helpers/common/where-clause.helpers.d.ts +1 -0
  53. package/lib/tab-core-utility/app/helpers/response.adapter.d.ts +22 -0
  54. package/lib/tab-core-utility/app/helpers/screen/grid.helpers.d.ts +2 -1
  55. package/lib/tab-core-utility/app/helpers/screen/screen.helpers.d.ts +1 -0
  56. package/lib/tab-core-utility/app/interfaces/common.interface.d.ts +50 -2
  57. package/lib/tab-core-utility/app/interfaces/signalr.interface.d.ts +80 -0
  58. package/lib/tab-core-utility/app/models/api-query.class.d.ts +54 -9
  59. package/lib/tab-core-utility/app/models/app-field.model.d.ts +4 -2
  60. package/lib/tab-core-utility/app/models/app-object.model.d.ts +5 -3
  61. package/lib/tab-core-utility/app/models/app-screen.model.d.ts +2 -2
  62. package/lib/tab-core-utility/app/models/data-source-query.model.d.ts +7 -2
  63. package/lib/tab-core-utility/app/models/filter.model.d.ts +2 -2
  64. package/lib/tab-core-utility/app/models/parameter.model.d.ts +2 -2
  65. package/lib/tab-core-utility/app/models/sort.model.d.ts +1 -1
  66. package/lib/tab-core-utility/app/utils/json.util.d.ts +3 -2
  67. package/lib/tab-core-utility/app/utils/req-res.util.d.ts +1 -9
  68. package/lib/tab-core-utility/app/utils/tab-app.util.d.ts +0 -61
  69. package/lib/tab-core-utility/core/http-client/api.service.d.ts +37 -0
  70. package/lib/tab-core-utility/core/service/signalr/operation-tracker.service.d.ts +40 -0
  71. package/lib/tab-core-utility/core/service/signalr/signalr-infrastructure.service.d.ts +68 -0
  72. package/lib/tab-core-utility/core/service/signalr/signalr.service.d.ts +122 -0
  73. package/package.json +3 -2
@@ -1,21 +1,26 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
2
  import { Injectable, inject } from "@angular/core";
3
- import { DSQHelper } from "../helpers/common/dsq.helpers";
3
+ import { of, throwError } from 'rxjs';
4
+ import { switchMap, map, catchError } from 'rxjs/operators';
4
5
  import { ScreenHelper } from "../helpers/screen/screen.helpers";
5
6
  import { WhereClauseHelper } from "../helpers/common/where-clause.helpers";
6
7
  import { RequestResponseHelper } from "../helpers/common/req-res.helpers";
8
+ import { MetadataHelper } from "../helpers/common/meta-data.helpers";
7
9
  import { AppObject } from "../models/app-object.class";
8
- import { getAppObject, getAppObjectFromSystemDBTableName, getDataFromDataSourceQueryID } from "../utils/tab-app.util";
9
- import { getEditRecordId, getPrimaryKeyFields } from "../utils/req-res.util";
10
+ import { getEditRecordId, getPrimaryKeyFields, getHeaders } from "../utils/req-res.util";
10
11
  import { APIFilterCriteria } from "../models/api-query.class";
11
- import { QueryType } from "../enums/query.enum";
12
+ import { ApiService } from '../../core/http-client/api.service';
13
+ import { SignalRService } from '../../core/service/signalr/signalr.service';
14
+ import { API, APIServices } from '../constants/api-constants';
12
15
  import * as i0 from "@angular/core";
13
16
  export class TabDeleteService {
14
17
  constructor() {
15
- this.dsqHelper = inject(DSQHelper);
16
18
  this.screenHelper = inject(ScreenHelper);
17
19
  this.whereClauseHelper = inject(WhereClauseHelper);
18
20
  this.requestResponseHelper = inject(RequestResponseHelper);
21
+ this.apiService = inject(ApiService);
22
+ this.signalRService = inject(SignalRService);
23
+ this.metadataHelper = inject(MetadataHelper);
19
24
  }
20
25
  /**
21
26
  * Deletes a record based on the given screen ID, data, and object ID.
@@ -27,32 +32,33 @@ export class TabDeleteService {
27
32
  deleteRecord(screenId, data, objectIDToSave) {
28
33
  let fields;
29
34
  let appObject = new AppObject();
30
- let crudTableName;
35
+ let crudTableName = '';
31
36
  if (screenId) {
32
37
  // Retrieve screen information and fields
33
38
  const screen = this.screenHelper.getScreen(screenId);
34
- const screenDataSource = getDataFromDataSourceQueryID(screen.DataSourceQuery);
35
- appObject = getAppObject(screenDataSource.ObjectID_Tosave);
36
- crudTableName = appObject.SystemDBTableName;
37
- fields = screenDataSource?.Fields?.map((field) => {
38
- const appField = appObject?.Fields?.find((f) => f?.ID?.toLowerCase() === field?.AppFieldID?.toLowerCase()) ?? {};
39
+ const screenDataSource = this.metadataHelper.getDataSourceQueryByIdOrName(screen.DataSourceQuery);
40
+ const appObjectModel = this.metadataHelper.getAppObjectByIdOrName(screenDataSource?.ObjectID_Tosave || '');
41
+ appObject = appObjectModel?.toJSON();
42
+ crudTableName = appObjectModel?.SystemDBTableName ?? '';
43
+ fields = screenDataSource?.fields()?.map((field) => {
39
44
  return {
40
45
  ...field,
41
- Field: appField
46
+ Field: field.Field
42
47
  };
43
48
  });
44
49
  }
45
50
  if (objectIDToSave) {
46
51
  // Retrieve fields based on object ID
47
52
  fields = [];
48
- appObject = getAppObject(objectIDToSave);
49
- appObject.Fields.forEach(element => {
53
+ const appObjectModel = this.metadataHelper.getAppObjectByIdOrName(objectIDToSave);
54
+ appObject = appObjectModel?.toJSON();
55
+ appObjectModel?.fields().forEach(element => {
50
56
  fields.push({ Field: element });
51
57
  });
52
- crudTableName = appObject.SystemDBTableName;
58
+ crudTableName = appObjectModel?.SystemDBTableName ?? '';
53
59
  }
54
60
  const primaryKeyFields = getPrimaryKeyFields(appObject);
55
- if (appObject) {
61
+ if (appObject && crudTableName) {
56
62
  let whereClause = APIFilterCriteria;
57
63
  if (primaryKeyFields && primaryKeyFields.length > 1) {
58
64
  // Bind where clause for delete operation with multiple primary keys
@@ -82,18 +88,64 @@ export class TabDeleteService {
82
88
  return this.delete(dataObj);
83
89
  }
84
90
  /**
85
- * Executes the delete operation.
86
- * @param data The delete query payload.
87
- * @returns An Observable emitting the response of the delete operation.
91
+ * Executes the delete operation using new /records/delete endpoint with SYNC/ASYNC support
92
+ * @param data The delete query payload (NEW format: { entityName, whereClause })
93
+ * @param headers Optional headers
94
+ * @returns An Observable emitting the response of the delete operation
88
95
  */
89
96
  delete(data, headers) {
90
- // Display delete confirmation popup
91
- // const deleteConfirmation = this.deleteRecordPopup();
92
- // if (deleteConfirmation) {
93
- return this.dsqHelper.executeQuery(data, QueryType.Delete, headers);
94
- // } else {
95
- // return null;
96
- // }
97
+ // Data is already in NEW format: { entityName, whereClause }
98
+ const header = getHeaders(headers);
99
+ // DELETE to new endpoint with body
100
+ return this.apiService.deleteFromService(APIServices.crudService, API.recordsDelete, data, header).pipe(switchMap((response) => {
101
+ if (!response?.IsSuccess) {
102
+ console.error('[TabDeleteService] Delete failed:', response?.Errors);
103
+ return of(response);
104
+ }
105
+ // CASE 1: SYNC - Has result immediately
106
+ if (response?.Result?.length) {
107
+ return of(response);
108
+ }
109
+ // CASE 2: ASYNC - Has correlationId
110
+ else if (response?.CorrelationId) {
111
+ return this.handleAsyncDelete(response);
112
+ }
113
+ // CASE 3: Unknown response format
114
+ return of(response);
115
+ }), catchError((error) => {
116
+ console.error('[TabDeleteService] Delete error:', error);
117
+ return throwError(() => error);
118
+ }));
119
+ }
120
+ /**
121
+ * Handle async delete - wait for SignalR notification
122
+ * @param response Initial response with correlationId
123
+ * @returns Observable with result from SignalR notification
124
+ */
125
+ handleAsyncDelete(response) {
126
+ const correlationId = response?.CorrelationId;
127
+ if (!correlationId) {
128
+ console.error('[TabDeleteService] Missing correlationId in async response');
129
+ return of(response);
130
+ }
131
+ // Wait for SignalR notification with matching correlationId
132
+ return this.signalRService.waitForOperation(correlationId).pipe(map((notification) => {
133
+ // Check if operation succeeded
134
+ if (!notification.isSuccess) {
135
+ throw new Error(notification.errorMessage || 'Delete operation failed');
136
+ }
137
+ // Return response with result from notification
138
+ return {
139
+ ...response,
140
+ Result: notification.recordId,
141
+ RecordAffectted: notification.affectedRecords || 0
142
+ };
143
+ }), catchError((error) => {
144
+ if (error.message === 'Operation timed out') {
145
+ return throwError(() => new Error('Delete operation timed out. The operation may still complete in the background. Please refresh to see the result.'));
146
+ }
147
+ return throwError(() => error);
148
+ }));
97
149
  }
98
150
  /**
99
151
  * Displays a delete confirmation popup.
@@ -116,7 +168,8 @@ export class TabDeleteService {
116
168
  */
117
169
  deleteMultipleRecordByTable(tableName, values) {
118
170
  // Retrieve app object and primary key fields
119
- const appObject = getAppObjectFromSystemDBTableName(tableName);
171
+ const appObjectModel = this.metadataHelper.getAllAppObjects(obj => obj.SystemDBTableName === tableName)[0];
172
+ const appObject = appObjectModel?.toJSON();
120
173
  const primaryKeyFields = getPrimaryKeyFields(appObject);
121
174
  // Generate values array from data
122
175
  const valueArray = this.generateValuesArrayFromData(values, primaryKeyFields[0]?.FieldName);
@@ -133,8 +186,6 @@ export class TabDeleteService {
133
186
  * @returns An Observable emitting the response of the delete operation.
134
187
  */
135
188
  deleteMultipleRecordByTableWithoutPrimaryKey(tableName, values, headers) {
136
- // Retrieve app object and primary key fields
137
- const appObject = getAppObjectFromSystemDBTableName(tableName);
138
189
  // Generate values array from data
139
190
  const valueArray = this.generateValuesArrayFromDataWithoutPrimaryKey(values);
140
191
  // Bind where clause for delete operation using IN operator by table
@@ -194,4 +245,4 @@ export class TabDeleteService {
194
245
  type: Injectable,
195
246
  args: [{ providedIn: 'root' }]
196
247
  }], null, null); })();
197
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLWRlbGV0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9kYXRhLWFjY2Vzcy9zcmMvbGliL3RhYi1jb3JlLXV0aWxpdHkvYXBwL2NydWQvdGFiLWRlbGV0ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUV2RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxTQUFTLEVBQWEsTUFBTSw0QkFBNEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLGlDQUFpQyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdEgsT0FBTyxFQUFFLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzdFLE9BQU8sRUFBa0IsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7O0FBTWhELE1BQU0sT0FBTyxnQkFBZ0I7SUFEN0I7UUFFbUIsY0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5QixpQkFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNwQyxzQkFBaUIsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUM5QywwQkFBcUIsR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztLQWlMeEU7SUEv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SUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO1lBQy9CLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sVUFBVSxDQUFBO0lBQ25CLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsNENBQTRDLENBQUMsU0FBYztRQUN6RCxNQUFNLFVBQVUsR0FBUSxFQUFFLENBQUM7UUFDM0IsMERBQTBEO1FBQzFELElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsQyw4Q0FBOEM7WUFDOUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQVksRUFBRSxLQUFhLEVBQUUsRUFBRTtnQkFDaEQsa0NBQWtDO2dCQUNsQyxJQUFJLE9BQU8sSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFDM0MsaURBQWlEO29CQUNqRCxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUU7d0JBQy9DLCtFQUErRTt3QkFDL0UsVUFBVSxDQUFDLElBQUksQ0FBQzs0QkFDZCxHQUFHLEVBQUUsR0FBRzs0QkFDUixLQUFLLEVBQUUsS0FBSzs0QkFDWixPQUFPLEVBQUUsS0FBSzt5QkFDZixDQUFDLENBQUM7b0JBQ0wsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7aUZBcExVLGdCQUFnQjt1RUFBaEIsZ0JBQWdCLFdBQWhCLGdCQUFnQixtQkFESCxNQUFNOztpRkFDbkIsZ0JBQWdCO2NBRDVCLFVBQVU7ZUFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXHJcblxyXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBEU1FIZWxwZXIgfSBmcm9tIFwiLi4vaGVscGVycy9jb21tb24vZHNxLmhlbHBlcnNcIjtcclxuaW1wb3J0IHsgU2NyZWVuSGVscGVyIH0gZnJvbSBcIi4uL2hlbHBlcnMvc2NyZWVuL3NjcmVlbi5oZWxwZXJzXCI7XHJcbmltcG9ydCB7IFdoZXJlQ2xhdXNlSGVscGVyIH0gZnJvbSBcIi4uL2hlbHBlcnMvY29tbW9uL3doZXJlLWNsYXVzZS5oZWxwZXJzXCI7XHJcbmltcG9ydCB7IFJlcXVlc3RSZXNwb25zZUhlbHBlciB9IGZyb20gXCIuLi9oZWxwZXJzL2NvbW1vbi9yZXEtcmVzLmhlbHBlcnNcIjtcclxuaW1wb3J0IHsgQXBwT2JqZWN0LCBBcHBTY3JlZW4gfSBmcm9tIFwiLi4vbW9kZWxzL2FwcC1vYmplY3QuY2xhc3NcIjtcclxuaW1wb3J0IHsgZ2V0QXBwT2JqZWN0LCBnZXRBcHBPYmplY3RGcm9tU3lzdGVtREJUYWJsZU5hbWUsIGdldERhdGFGcm9tRGF0YVNvdXJjZVF1ZXJ5SUQgfSBmcm9tIFwiLi4vdXRpbHMvdGFiLWFwcC51dGlsXCI7XHJcbmltcG9ydCB7IGdldEVkaXRSZWNvcmRJZCwgZ2V0UHJpbWFyeUtleUZpZWxkcyB9IGZyb20gXCIuLi91dGlscy9yZXEtcmVzLnV0aWxcIjtcclxuaW1wb3J0IHsgQVBJRGVsZXRlUXVlcnksIEFQSUZpbHRlckNyaXRlcmlhIH0gZnJvbSBcIi4uL21vZGVscy9hcGktcXVlcnkuY2xhc3NcIjtcclxuaW1wb3J0IHsgUXVlcnlUeXBlIH0gZnJvbSBcIi4uL2VudW1zL3F1ZXJ5LmVudW1cIjtcclxuXHJcblxyXG5cclxuXHJcbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXHJcbmV4cG9ydCBjbGFzcyBUYWJEZWxldGVTZXJ2aWNlIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRzcUhlbHBlciA9IGluamVjdChEU1FIZWxwZXIpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2NyZWVuSGVscGVyID0gaW5qZWN0KFNjcmVlbkhlbHBlcik7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB3aGVyZUNsYXVzZUhlbHBlciA9IGluamVjdChXaGVyZUNsYXVzZUhlbHBlcik7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZXF1ZXN0UmVzcG9uc2VIZWxwZXIgPSBpbmplY3QoUmVxdWVzdFJlc3BvbnNlSGVscGVyKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRGVsZXRlcyBhIHJlY29yZCBiYXNlZCBvbiB0aGUgZ2l2ZW4gc2NyZWVuIElELCBkYXRhLCBhbmQgb2JqZWN0IElELlxyXG4gICAqIEBwYXJhbSBzY3JlZW5JZCBUaGUgSUQgb2YgdGhlIHNjcmVlbi5cclxuICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSBvZiB0aGUgcmVjb3JkIHRvIGRlbGV0ZS5cclxuICAgKiBAcGFyYW0gb2JqZWN0SURUb1NhdmUgVGhlIG9iamVjdCBJRCBvZiB0aGUgcmVjb3JkIHRvIHNhdmUuXHJcbiAgICogQHJldHVybnMgQW4gT2JzZXJ2YWJsZSBlbWl0dGluZyB0aGUgcmVzcG9uc2Ugb2YgdGhlIGRlbGV0ZSBvcGVyYXRpb24uXHJcbiAgICovXHJcbiAgZGVsZXRlUmVjb3JkKHNjcmVlbklkOiBzdHJpbmcsIGRhdGE6IGFueSwgb2JqZWN0SURUb1NhdmU6IGFueSkge1xyXG4gICAgbGV0IGZpZWxkcztcclxuICAgIGxldCBhcHBPYmplY3Q6IEFwcE9iamVjdCA9IG5ldyBBcHBPYmplY3QoKTtcclxuICAgIGxldCBjcnVkVGFibGVOYW1lO1xyXG4gICAgaWYgKHNjcmVlbklkKSB7XHJcbiAgICAgIC8vIFJldHJpZXZlIHNjcmVlbiBpbmZvcm1hdGlvbiBhbmQgZmllbGRzXHJcbiAgICAgIGNvbnN0IHNjcmVlbjogQXBwU2NyZWVuID0gdGhpcy5zY3JlZW5IZWxwZXIuZ2V0U2NyZWVuKHNjcmVlbklkKTtcclxuICAgICAgY29uc3Qgc2NyZWVuRGF0YVNvdXJjZSA9IGdldERhdGFGcm9tRGF0YVNvdXJjZVF1ZXJ5SUQoc2NyZWVuLkRhdGFTb3VyY2VRdWVyeSk7XHJcbiAgICAgIGFwcE9iamVjdCA9IGdldEFwcE9iamVjdChzY3JlZW5EYXRhU291cmNlLk9iamVjdElEX1Rvc2F2ZSk7XHJcbiAgICAgIGNydWRUYWJsZU5hbWUgPSBhcHBPYmplY3QuU3lzdGVtREJUYWJsZU5hbWU7XHJcbiAgICAgIGZpZWxkcyA9IHNjcmVlbkRhdGFTb3VyY2U/LkZpZWxkcz8ubWFwKChmaWVsZDogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgYXBwRmllbGQgPSBhcHBPYmplY3Q/LkZpZWxkcz8uZmluZCgoZjogYW55KSA9PiBmPy5JRD8udG9Mb3dlckNhc2UoKSA9PT0gZmllbGQ/LkFwcEZpZWxkSUQ/LnRvTG93ZXJDYXNlKCkpID8/IHt9O1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAuLi5maWVsZCxcclxuICAgICAgICAgIEZpZWxkOiBhcHBGaWVsZFxyXG4gICAgICAgIH07XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKG9iamVjdElEVG9TYXZlKSB7XHJcbiAgICAgIC8vIFJldHJpZXZlIGZpZWxkcyBiYXNlZCBvbiBvYmplY3QgSURcclxuICAgICAgZmllbGRzID0gW107XHJcbiAgICAgIGFwcE9iamVjdCA9IGdldEFwcE9iamVjdChvYmplY3RJRFRvU2F2ZSk7XHJcbiAgICAgIGFwcE9iamVjdC5GaWVsZHMuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICBmaWVsZHMucHVzaCh7IEZpZWxkOiBlbGVtZW50IH0pXHJcbiAgICAgIH0pO1xyXG4gICAgICBjcnVkVGFibGVOYW1lID0gYXBwT2JqZWN0LlN5c3RlbURCVGFibGVOYW1lO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcHJpbWFyeUtleUZpZWxkczogYW55ID0gZ2V0UHJpbWFyeUtleUZpZWxkcyhhcHBPYmplY3QpO1xyXG4gICAgaWYgKGFwcE9iamVjdCkge1xyXG4gICAgICBsZXQgd2hlcmVDbGF1c2U6IGFueSA9IEFQSUZpbHRlckNyaXRlcmlhO1xyXG4gICAgICBpZiAocHJpbWFyeUtleUZpZWxkcyAmJiBwcmltYXJ5S2V5RmllbGRzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAvLyBCaW5kIHdoZXJlIGNsYXVzZSBmb3IgZGVsZXRlIG9wZXJhdGlvbiB3aXRoIG11bHRpcGxlIHByaW1hcnkga2V5c1xyXG4gICAgICAgIHdoZXJlQ2xhdXNlID0gdGhpcy53aGVyZUNsYXVzZUhlbHBlci5iaW5kV2hlcmVDbGF1c2VGb3JEZWxldGVXaXRoTXVsdGlwbGVQcmltYXJ5S2V5cyhkYXRhLmRhdGEsIHByaW1hcnlLZXlGaWVsZHMsIGNydWRUYWJsZU5hbWUpO1xyXG4gICAgICB9IGVsc2UgaWYgKHByaW1hcnlLZXlGaWVsZHMgJiYgcHJpbWFyeUtleUZpZWxkcy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAvLyBCaW5kIHdoZXJlIGNsYXVzZSBmb3IgZGVsZXRlIG9wZXJhdGlvbiB3aXRoIHNpbmdsZSBwcmltYXJ5IGtleVxyXG4gICAgICAgIGNvbnN0IHJlY29yZElkID0gZ2V0RWRpdFJlY29yZElkKGRhdGEuZGF0YSwgcHJpbWFyeUtleUZpZWxkc1swXT8uRmllbGROYW1lKTtcclxuICAgICAgICB3aGVyZUNsYXVzZSA9IHRoaXMud2hlcmVDbGF1c2VIZWxwZXIuYmluZFdoZXJlQ2xhdXNlRm9yRGVsZXRlKGZpZWxkcywgcmVjb3JkSWQsIHByaW1hcnlLZXlGaWVsZHNbMF0/LkZpZWxkTmFtZSwgY3J1ZFRhYmxlTmFtZSk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgZGF0YU9iaiA9IHRoaXMucmVxdWVzdFJlc3BvbnNlSGVscGVyLmRlbGV0ZVBheWxvYWQoY3J1ZFRhYmxlTmFtZSwgd2hlcmVDbGF1c2UpO1xyXG4gICAgICByZXR1cm4gdGhpcy5kZWxldGUoZGF0YU9iaik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlbGV0ZXMgYSByZWNvcmQgYnkgdGhlIHNwZWNpZmllZCB0YWJsZSBuYW1lIGFuZCBwcmltYXJ5IGtleSB2YWx1ZS5cclxuICAgKiBAcGFyYW0gdGFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS5cclxuICAgKiBAcGFyYW0gcHJpbWFyeUtleSBUaGUgcHJpbWFyeSBrZXkgZmllbGQuXHJcbiAgICogQHBhcmFtIHByaW1hcnlLZXlWYWx1ZSBUaGUgdmFsdWUgb2YgdGhlIHByaW1hcnkga2V5LlxyXG4gICAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgZW1pdHRpbmcgdGhlIHJlc3BvbnNlIG9mIHRoZSBkZWxldGUgb3BlcmF0aW9uLlxyXG4gICAqL1xyXG4gIGRlbGV0ZVJlY29yZEJ5VGFibGUodGFibGVOYW1lOiBzdHJpbmcsIHByaW1hcnlLZXk6IHN0cmluZywgcHJpbWFyeUtleVZhbHVlOiBzdHJpbmcpIHtcclxuICAgIC8vIEJpbmQgd2hlcmUgY2xhdXNlIGZvciBkZWxldGUgb3BlcmF0aW9uIGJ5IHRhYmxlXHJcbiAgICBjb25zdCB3aGVyZUNsYXVzZTogQVBJRmlsdGVyQ3JpdGVyaWEgPSB0aGlzLndoZXJlQ2xhdXNlSGVscGVyLmJpbmRXaGVyZUNsYXVzZUZvckRlbGV0ZUJ5VGFibGUodGFibGVOYW1lLCBwcmltYXJ5S2V5LCBwcmltYXJ5S2V5VmFsdWUpO1xyXG4gICAgY29uc3QgZGF0YU9iaiA9IHRoaXMucmVxdWVzdFJlc3BvbnNlSGVscGVyLmRlbGV0ZVBheWxvYWQodGFibGVOYW1lLCB3aGVyZUNsYXVzZSk7XHJcbiAgICByZXR1cm4gdGhpcy5kZWxldGUoZGF0YU9iaik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFeGVjdXRlcyB0aGUgZGVsZXRlIG9wZXJhdGlvbi5cclxuICAgKiBAcGFyYW0gZGF0YSBUaGUgZGVsZXRlIHF1ZXJ5IHBheWxvYWQuXHJcbiAgICogQHJldHVybnMgQW4gT2JzZXJ2YWJsZSBlbWl0dGluZyB0aGUgcmVzcG9uc2Ugb2YgdGhlIGRlbGV0ZSBvcGVyYXRpb24uXHJcbiAgICovXHJcbiAgZGVsZXRlKGRhdGE6IEFQSURlbGV0ZVF1ZXJ5ICwgaGVhZGVycz86IGFueSkge1xyXG4gICAgLy8gRGlzcGxheSBkZWxldGUgY29uZmlybWF0aW9uIHBvcHVwXHJcbiAgICAvLyBjb25zdCBkZWxldGVDb25maXJtYXRpb24gPSB0aGlzLmRlbGV0ZVJlY29yZFBvcHVwKCk7XHJcbiAgICAvLyBpZiAoZGVsZXRlQ29uZmlybWF0aW9uKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmRzcUhlbHBlci5leGVjdXRlUXVlcnkoZGF0YSwgUXVlcnlUeXBlLkRlbGV0ZSAsIGhlYWRlcnMpO1xyXG4gICAgLy8gfSBlbHNlIHtcclxuICAgICAgLy8gcmV0dXJuIG51bGw7XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEaXNwbGF5cyBhIGRlbGV0ZSBjb25maXJtYXRpb24gcG9wdXAuXHJcbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdXNlciBjb25maXJtcyB0aGUgZGVsZXRlIG9wZXJhdGlvbiwgb3RoZXJ3aXNlIGZhbHNlLlxyXG4gICAqL1xyXG4gIGRlbGV0ZVJlY29yZFBvcHVwKCkge1xyXG4gICAgY29uc3QgdGV4dCA9IFwiWW91IGFyZSBnb2luZyB0byBkZWxldGUgc2VsZWN0ZWQgcmVjb3JkLiBBcmUgeW91IHN1cmUgd2FudCB0byBkZWxldGUgdGhlIHNhbWU/XCI7XHJcbiAgICBpZiAoY29uZmlybSh0ZXh0KSA9PSB0cnVlKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVsZXRlcyBtdWx0aXBsZSByZWNvcmRzIGJ5IHRhYmxlIG5hbWUgYW5kIHZhbHVlcy5cclxuICAgKiBAcGFyYW0gdGFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS5cclxuICAgKiBAcGFyYW0gdmFsdWVzIFRoZSB2YWx1ZXMgb2YgdGhlIHJlY29yZHMgdG8gZGVsZXRlLlxyXG4gICAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgZW1pdHRpbmcgdGhlIHJlc3BvbnNlIG9mIHRoZSBkZWxldGUgb3BlcmF0aW9uLlxyXG4gICAqL1xyXG4gIGRlbGV0ZU11bHRpcGxlUmVjb3JkQnlUYWJsZSh0YWJsZU5hbWU6IHN0cmluZywgdmFsdWVzOiBhbnkpIHtcclxuICAgIC8vIFJldHJpZXZlIGFwcCBvYmplY3QgYW5kIHByaW1hcnkga2V5IGZpZWxkc1xyXG4gICAgY29uc3QgYXBwT2JqZWN0ID0gZ2V0QXBwT2JqZWN0RnJvbVN5c3RlbURCVGFibGVOYW1lKHRhYmxlTmFtZSk7XHJcbiAgICBjb25zdCBwcmltYXJ5S2V5RmllbGRzOiBhbnkgPSBnZXRQcmltYXJ5S2V5RmllbGRzKGFwcE9iamVjdCk7XHJcbiAgICAvLyBHZW5lcmF0ZSB2YWx1ZXMgYXJyYXkgZnJvbSBkYXRhXHJcbiAgICBjb25zdCB2YWx1ZUFycmF5ID0gdGhpcy5nZW5lcmF0ZVZhbHVlc0FycmF5RnJvbURhdGEodmFsdWVzLCBwcmltYXJ5S2V5RmllbGRzWzBdPy5GaWVsZE5hbWUpXHJcbiAgICAvLyBCaW5kIHdoZXJlIGNsYXVzZSBmb3IgZGVsZXRlIG9wZXJhdGlvbiB1c2luZyBJTiBvcGVyYXRvciBieSB0YWJsZVxyXG4gICAgY29uc3Qgd2hlcmVDbGF1c2U6IEFQSUZpbHRlckNyaXRlcmlhID0gdGhpcy53aGVyZUNsYXVzZUhlbHBlci5iaW5kV2hlcmVDbGF1c2VGb3JEZWxldGVVc2luZ0luT3BlcmF0b3JCeVRhYmxlKHRhYmxlTmFtZSwgcHJpbWFyeUtleUZpZWxkc1swXT8uRmllbGROYW1lLCB2YWx1ZUFycmF5KTtcclxuICAgIGNvbnN0IGRhdGFPYmogPSB0aGlzLnJlcXVlc3RSZXNwb25zZUhlbHBlci5kZWxldGVQYXlsb2FkKHRhYmxlTmFtZSwgd2hlcmVDbGF1c2UpO1xyXG4gICAgcmV0dXJuIHRoaXMuZGVsZXRlKGRhdGFPYmopO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVsZXRlcyBtdWx0aXBsZSByZWNvcmRzIGZyb20gdGhlIHNwZWNpZmllZCB0YWJsZSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgZGF0YSBhcnJheS5cclxuICAgKiBUaGUgZGF0YSBhcnJheSBzaG91bGQgY29udGFpbiBrZXktdmFsdWUgcGFpcnMgd2l0aG91dCBwcmltYXJ5IGtleSBpbmZvcm1hdGlvbi5cclxuICAgKiBAcGFyYW0gdGFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS5cclxuICAgKiBAcGFyYW0gdmFsdWVzIFRoZSBhcnJheSBvZiBkYXRhIG9iamVjdHMgdG8gZGVsZXRlLlxyXG4gICAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgZW1pdHRpbmcgdGhlIHJlc3BvbnNlIG9mIHRoZSBkZWxldGUgb3BlcmF0aW9uLlxyXG4gICAqL1xyXG4gIGRlbGV0ZU11bHRpcGxlUmVjb3JkQnlUYWJsZVdpdGhvdXRQcmltYXJ5S2V5KHRhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZXM6IGFueSAsIGhlYWRlcnM/OiBhbnkpIHtcclxuICAgIC8vIFJldHJpZXZlIGFwcCBvYmplY3QgYW5kIHByaW1hcnkga2V5IGZpZWxkc1xyXG4gICAgY29uc3QgYXBwT2JqZWN0ID0gZ2V0QXBwT2JqZWN0RnJvbVN5c3RlbURCVGFibGVOYW1lKHRhYmxlTmFtZSk7XHJcbiAgICAvLyBHZW5lcmF0ZSB2YWx1ZXMgYXJyYXkgZnJvbSBkYXRhXHJcbiAgICBjb25zdCB2YWx1ZUFycmF5ID0gdGhpcy5nZW5lcmF0ZVZhbHVlc0FycmF5RnJvbURhdGFXaXRob3V0UHJpbWFyeUtleSh2YWx1ZXMpOyAgICBcclxuICAgIC8vIEJpbmQgd2hlcmUgY2xhdXNlIGZvciBkZWxldGUgb3BlcmF0aW9uIHVzaW5nIElOIG9wZXJhdG9yIGJ5IHRhYmxlXHJcbiAgICBjb25zdCB3aGVyZUNsYXVzZTogQVBJRmlsdGVyQ3JpdGVyaWEgPSB0aGlzLndoZXJlQ2xhdXNlSGVscGVyLmJpbmRXaGVyZUNsYXVzZUZvckR5bmFtaWNEZWxldGUodGFibGVOYW1lLCB2YWx1ZUFycmF5KTtcclxuICAgIGNvbnN0IGRhdGFPYmogPSB0aGlzLnJlcXVlc3RSZXNwb25zZUhlbHBlci5kZWxldGVQYXlsb2FkKHRhYmxlTmFtZSwgd2hlcmVDbGF1c2UpO1xyXG4gICAgcmV0dXJuIHRoaXMuZGVsZXRlKGRhdGFPYmosIGhlYWRlcnMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGVzIGEgdmFsdWVzIGFycmF5IGZyb20gdGhlIGRhdGEuXHJcbiAgICogQHBhcmFtIGRhdGFBcnJheSBUaGUgYXJyYXkgb2YgZGF0YS5cclxuICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgdG8gZXh0cmFjdCBmcm9tIGVhY2ggZWxlbWVudC5cclxuICAgKiBAcmV0dXJucyBUaGUgYXJyYXkgb2YgdmFsdWVzLlxyXG4gICAqL1xyXG4gIGdlbmVyYXRlVmFsdWVzQXJyYXlGcm9tRGF0YShkYXRhQXJyYXk6IGFueSwga2V5OiBhbnkpIHtcclxuICAgIGNvbnN0IHZhbHVlQXJyYXk6IGFueSA9IFtdXHJcbiAgICBpZiAoZGF0YUFycmF5ICYmIGRhdGFBcnJheS5sZW5ndGgpIHtcclxuICAgICAgZGF0YUFycmF5LmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgIHZhbHVlQXJyYXkucHVzaChlbGVtZW50W2tleV0pXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlQXJyYXlcclxuICB9XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGVzIGFuIGFycmF5IG9mIHZhbHVlcyBmcm9tIHRoZSBwcm92aWRlZCBkYXRhIGFycmF5LlxyXG4gICAqIEVhY2ggZW50cnkgaW4gdGhlIHJldHVybmVkIGFycmF5IGluY2x1ZGVzIGtleS12YWx1ZSBwYWlycyBmcm9tIHRoZSBkYXRhIG9iamVjdHMsXHJcbiAgICogYW5kIGFuIGFzc29jaWF0ZWQgR3JvdXBJRCBpbmRpY2F0aW5nIHRoZSBpbmRleCBvZiB0aGUgZGF0YSBvYmplY3QuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIGRhdGFBcnJheSBBbiBhcnJheSBvZiBkYXRhIG9iamVjdHMuXHJcbiAgICogQHJldHVybnMgQW4gYXJyYXkgY29udGFpbmluZyBvYmplY3RzIHdpdGgga2V5cywgdmFsdWVzLCBhbmQgZ3JvdXAgaW5kaWNlcy5cclxuICAgKi9cclxuICBnZW5lcmF0ZVZhbHVlc0FycmF5RnJvbURhdGFXaXRob3V0UHJpbWFyeUtleShkYXRhQXJyYXk6IGFueSkge1xyXG4gICAgY29uc3QgdmFsdWVBcnJheTogYW55ID0gW107XHJcbiAgICAvLyBDaGVjayBpZiB0aGUgaW5wdXQgZGF0YSBhcnJheSBpcyB2YWxpZCBhbmQgaGFzIGVsZW1lbnRzXHJcbiAgICBpZiAoZGF0YUFycmF5ICYmIGRhdGFBcnJheS5sZW5ndGgpIHtcclxuICAgICAgLy8gSXRlcmF0ZSBvdmVyIGVhY2ggZWxlbWVudCBpbiB0aGUgZGF0YSBhcnJheVxyXG4gICAgICBkYXRhQXJyYXkuZm9yRWFjaCgoZWxlbWVudDogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgLy8gRW5zdXJlIHRoZSBlbGVtZW50IGlzIGFuIG9iamVjdFxyXG4gICAgICAgIGlmIChlbGVtZW50ICYmIHR5cGVvZiBlbGVtZW50ID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGVhY2gga2V5LXZhbHVlIHBhaXIgaW4gdGhlIG9iamVjdFxyXG4gICAgICAgICAgT2JqZWN0LmVudHJpZXMoZWxlbWVudCkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIFB1c2ggYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGtleSwgdmFsdWUsIGFuZCBpbmRleCBhcyBHcm91cElEIHRvIHZhbHVlQXJyYXlcclxuICAgICAgICAgICAgdmFsdWVBcnJheS5wdXNoKHsgXHJcbiAgICAgICAgICAgICAga2V5OiBrZXksXHJcbiAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxyXG4gICAgICAgICAgICAgIEdyb3VwSUQ6IGluZGV4XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiB2YWx1ZUFycmF5O1xyXG4gIH1cclxufVxyXG4iXX0=
248
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLWRlbGV0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9kYXRhLWFjY2Vzcy9zcmMvbGliL3RhYi1jb3JlLXV0aWxpdHkvYXBwL2NydWQvdGFiLWRlbGV0ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUV2RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQWMsRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDaEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDM0UsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDMUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxTQUFTLEVBQWEsTUFBTSw0QkFBNEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzlELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDNUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7QUFJOUQsTUFBTSxPQUFPLGdCQUFnQjtJQUQ3QjtRQUVtQixpQkFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZ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ZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xyXG5cclxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgc3dpdGNoTWFwLCBtYXAsIGNhdGNoRXJyb3IgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFNjcmVlbkhlbHBlciB9IGZyb20gXCIuLi9oZWxwZXJzL3NjcmVlbi9zY3JlZW4uaGVscGVyc1wiO1xyXG5pbXBvcnQgeyBXaGVyZUNsYXVzZUhlbHBlciB9IGZyb20gXCIuLi9oZWxwZXJzL2NvbW1vbi93aGVyZS1jbGF1c2UuaGVscGVyc1wiO1xyXG5pbXBvcnQgeyBSZXF1ZXN0UmVzcG9uc2VIZWxwZXIgfSBmcm9tIFwiLi4vaGVscGVycy9jb21tb24vcmVxLXJlcy5oZWxwZXJzXCI7XHJcbmltcG9ydCB7IE1ldGFkYXRhSGVscGVyIH0gZnJvbSBcIi4uL2hlbHBlcnMvY29tbW9uL21ldGEtZGF0YS5oZWxwZXJzXCI7XHJcbmltcG9ydCB7IEFwcE9iamVjdCwgQXBwU2NyZWVuIH0gZnJvbSBcIi4uL21vZGVscy9hcHAtb2JqZWN0LmNsYXNzXCI7XHJcbmltcG9ydCB7IGdldEVkaXRSZWNvcmRJZCwgZ2V0UHJpbWFyeUtleUZpZWxkcywgZ2V0SGVhZGVycyB9IGZyb20gXCIuLi91dGlscy9yZXEtcmVzLnV0aWxcIjtcclxuaW1wb3J0IHsgQVBJRmlsdGVyQ3JpdGVyaWEgfSBmcm9tIFwiLi4vbW9kZWxzL2FwaS1xdWVyeS5jbGFzc1wiO1xyXG5pbXBvcnQgeyBBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9odHRwLWNsaWVudC9hcGkuc2VydmljZSc7XHJcbmltcG9ydCB7IFNpZ25hbFJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlL3NpZ25hbHIvc2lnbmFsci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQVBJLCBBUElTZXJ2aWNlcyB9IGZyb20gJy4uL2NvbnN0YW50cy9hcGktY29uc3RhbnRzJztcclxuaW1wb3J0IHsgQ29tbW9uQXBpUmVzcG9uc2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NvbW1vbi5pbnRlcmZhY2UnO1xyXG5cclxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcclxuZXhwb3J0IGNsYXNzIFRhYkRlbGV0ZVNlcnZpY2Uge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2NyZWVuSGVscGVyID0gaW5qZWN0KFNjcmVlbkhlbHBlcik7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB3aGVyZUNsYXVzZUhlbHBlciA9IGluamVjdChXaGVyZUNsYXVzZUhlbHBlcik7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZXF1ZXN0UmVzcG9uc2VIZWxwZXIgPSBpbmplY3QoUmVxdWVzdFJlc3BvbnNlSGVscGVyKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGFwaVNlcnZpY2UgPSBpbmplY3QoQXBpU2VydmljZSk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzaWduYWxSU2VydmljZSA9IGluamVjdChTaWduYWxSU2VydmljZSk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBtZXRhZGF0YUhlbHBlciA9IGluamVjdChNZXRhZGF0YUhlbHBlcik7XHJcblxyXG4gIC8qKlxyXG4gICAqIERlbGV0ZXMgYSByZWNvcmQgYmFzZWQgb24gdGhlIGdpdmVuIHNjcmVlbiBJRCwgZGF0YSwgYW5kIG9iamVjdCBJRC5cclxuICAgKiBAcGFyYW0gc2NyZWVuSWQgVGhlIElEIG9mIHRoZSBzY3JlZW4uXHJcbiAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgb2YgdGhlIHJlY29yZCB0byBkZWxldGUuXHJcbiAgICogQHBhcmFtIG9iamVjdElEVG9TYXZlIFRoZSBvYmplY3QgSUQgb2YgdGhlIHJlY29yZCB0byBzYXZlLlxyXG4gICAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgZW1pdHRpbmcgdGhlIHJlc3BvbnNlIG9mIHRoZSBkZWxldGUgb3BlcmF0aW9uLlxyXG4gICAqL1xyXG4gIGRlbGV0ZVJlY29yZChzY3JlZW5JZDogc3RyaW5nLCBkYXRhOiBhbnksIG9iamVjdElEVG9TYXZlOiBhbnkpIHtcclxuICAgIGxldCBmaWVsZHM7XHJcbiAgICBsZXQgYXBwT2JqZWN0OiBBcHBPYmplY3QgPSBuZXcgQXBwT2JqZWN0KCk7XHJcbiAgICBsZXQgY3J1ZFRhYmxlTmFtZSA9ICcnO1xyXG4gICAgaWYgKHNjcmVlbklkKSB7XHJcbiAgICAgIC8vIFJldHJpZXZlIHNjcmVlbiBpbmZvcm1hdGlvbiBhbmQgZmllbGRzXHJcbiAgICAgIGNvbnN0IHNjcmVlbjogQXBwU2NyZWVuID0gdGhpcy5zY3JlZW5IZWxwZXIuZ2V0U2NyZWVuKHNjcmVlbklkKTtcclxuICAgICAgY29uc3Qgc2NyZWVuRGF0YVNvdXJjZSA9IHRoaXMubWV0YWRhdGFIZWxwZXIuZ2V0RGF0YVNvdXJjZVF1ZXJ5QnlJZE9yTmFtZShzY3JlZW4uRGF0YVNvdXJjZVF1ZXJ5KTtcclxuICAgICAgY29uc3QgYXBwT2JqZWN0TW9kZWwgPSB0aGlzLm1ldGFkYXRhSGVscGVyLmdldEFwcE9iamVjdEJ5SWRPck5hbWUoc2NyZWVuRGF0YVNvdXJjZT8uT2JqZWN0SURfVG9zYXZlIHx8ICcnKTtcclxuICAgICAgYXBwT2JqZWN0ID0gYXBwT2JqZWN0TW9kZWw/LnRvSlNPTigpO1xyXG4gICAgICBjcnVkVGFibGVOYW1lID0gYXBwT2JqZWN0TW9kZWw/LlN5c3RlbURCVGFibGVOYW1lID8/ICcnO1xyXG4gICAgICBmaWVsZHMgPSBzY3JlZW5EYXRhU291cmNlPy5maWVsZHMoKT8ubWFwKChmaWVsZDogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIC4uLmZpZWxkLFxyXG4gICAgICAgICAgRmllbGQ6IGZpZWxkLkZpZWxkXHJcbiAgICAgICAgfTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBpZiAob2JqZWN0SURUb1NhdmUpIHtcclxuICAgICAgLy8gUmV0cmlldmUgZmllbGRzIGJhc2VkIG9uIG9iamVjdCBJRFxyXG4gICAgICBmaWVsZHMgPSBbXTtcclxuICAgICAgY29uc3QgYXBwT2JqZWN0TW9kZWwgPSB0aGlzLm1ldGFkYXRhSGVscGVyLmdldEFwcE9iamVjdEJ5SWRPck5hbWUob2JqZWN0SURUb1NhdmUpO1xyXG4gICAgICBhcHBPYmplY3QgPSBhcHBPYmplY3RNb2RlbD8udG9KU09OKCk7XHJcbiAgICAgIGFwcE9iamVjdE1vZGVsPy5maWVsZHMoKS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgIGZpZWxkcy5wdXNoKHsgRmllbGQ6IGVsZW1lbnQgfSlcclxuICAgICAgfSk7XHJcbiAgICAgIGNydWRUYWJsZU5hbWUgPSBhcHBPYmplY3RNb2RlbD8uU3lzdGVtREJUYWJsZU5hbWUgPz8gJyc7XHJcbiAgICB9XHJcbiAgICBjb25zdCBwcmltYXJ5S2V5RmllbGRzOiBhbnkgPSBnZXRQcmltYXJ5S2V5RmllbGRzKGFwcE9iamVjdCk7XHJcbiAgICBpZiAoYXBwT2JqZWN0ICYmIGNydWRUYWJsZU5hbWUpIHtcclxuICAgICAgbGV0IHdoZXJlQ2xhdXNlOiBhbnkgPSBBUElGaWx0ZXJDcml0ZXJpYTtcclxuICAgICAgaWYgKHByaW1hcnlLZXlGaWVsZHMgJiYgcHJpbWFyeUtleUZpZWxkcy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgLy8gQmluZCB3aGVyZSBjbGF1c2UgZm9yIGRlbGV0ZSBvcGVyYXRpb24gd2l0aCBtdWx0aXBsZSBwcmltYXJ5IGtleXNcclxuICAgICAgICB3aGVyZUNsYXVzZSA9IHRoaXMud2hlcmVDbGF1c2VIZWxwZXIuYmluZFdoZXJlQ2xhdXNlRm9yRGVsZXRlV2l0aE11bHRpcGxlUHJpbWFyeUtleXMoZGF0YS5kYXRhLCBwcmltYXJ5S2V5RmllbGRzLCBjcnVkVGFibGVOYW1lKTtcclxuICAgICAgfSBlbHNlIGlmIChwcmltYXJ5S2V5RmllbGRzICYmIHByaW1hcnlLZXlGaWVsZHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgLy8gQmluZCB3aGVyZSBjbGF1c2UgZm9yIGRlbGV0ZSBvcGVyYXRpb24gd2l0aCBzaW5nbGUgcHJpbWFyeSBrZXlcclxuICAgICAgICBjb25zdCByZWNvcmRJZCA9IGdldEVkaXRSZWNvcmRJZChkYXRhLmRhdGEsIHByaW1hcnlLZXlGaWVsZHNbMF0/LkZpZWxkTmFtZSk7XHJcbiAgICAgICAgd2hlcmVDbGF1c2UgPSB0aGlzLndoZXJlQ2xhdXNlSGVscGVyLmJpbmRXaGVyZUNsYXVzZUZvckRlbGV0ZShmaWVsZHMsIHJlY29yZElkLCBwcmltYXJ5S2V5RmllbGRzWzBdPy5GaWVsZE5hbWUsIGNydWRUYWJsZU5hbWUpO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGRhdGFPYmogPSB0aGlzLnJlcXVlc3RSZXNwb25zZUhlbHBlci5kZWxldGVQYXlsb2FkKGNydWRUYWJsZU5hbWUsIHdoZXJlQ2xhdXNlKTtcclxuICAgICAgcmV0dXJuIHRoaXMuZGVsZXRlKGRhdGFPYmopO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWxldGVzIGEgcmVjb3JkIGJ5IHRoZSBzcGVjaWZpZWQgdGFibGUgbmFtZSBhbmQgcHJpbWFyeSBrZXkgdmFsdWUuXHJcbiAgICogQHBhcmFtIHRhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgdGFibGUuXHJcbiAgICogQHBhcmFtIHByaW1hcnlLZXkgVGhlIHByaW1hcnkga2V5IGZpZWxkLlxyXG4gICAqIEBwYXJhbSBwcmltYXJ5S2V5VmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBwcmltYXJ5IGtleS5cclxuICAgKiBAcmV0dXJucyBBbiBPYnNlcnZhYmxlIGVtaXR0aW5nIHRoZSByZXNwb25zZSBvZiB0aGUgZGVsZXRlIG9wZXJhdGlvbi5cclxuICAgKi9cclxuICBkZWxldGVSZWNvcmRCeVRhYmxlKHRhYmxlTmFtZTogc3RyaW5nLCBwcmltYXJ5S2V5OiBzdHJpbmcsIHByaW1hcnlLZXlWYWx1ZTogc3RyaW5nKSB7XHJcbiAgICAvLyBCaW5kIHdoZXJlIGNsYXVzZSBmb3IgZGVsZXRlIG9wZXJhdGlvbiBieSB0YWJsZVxyXG4gICAgY29uc3Qgd2hlcmVDbGF1c2U6IEFQSUZpbHRlckNyaXRlcmlhID0gdGhpcy53aGVyZUNsYXVzZUhlbHBlci5iaW5kV2hlcmVDbGF1c2VGb3JEZWxldGVCeVRhYmxlKHRhYmxlTmFtZSwgcHJpbWFyeUtleSwgcHJpbWFyeUtleVZhbHVlKTtcclxuICAgIGNvbnN0IGRhdGFPYmogPSB0aGlzLnJlcXVlc3RSZXNwb25zZUhlbHBlci5kZWxldGVQYXlsb2FkKHRhYmxlTmFtZSwgd2hlcmVDbGF1c2UpO1xyXG4gICAgcmV0dXJuIHRoaXMuZGVsZXRlKGRhdGFPYmopO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXhlY3V0ZXMgdGhlIGRlbGV0ZSBvcGVyYXRpb24gdXNpbmcgbmV3IC9yZWNvcmRzL2RlbGV0ZSBlbmRwb2ludCB3aXRoIFNZTkMvQVNZTkMgc3VwcG9ydFxyXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBkZWxldGUgcXVlcnkgcGF5bG9hZCAoTkVXIGZvcm1hdDogeyBlbnRpdHlOYW1lLCB3aGVyZUNsYXVzZSB9KVxyXG4gICAqIEBwYXJhbSBoZWFkZXJzIE9wdGlvbmFsIGhlYWRlcnNcclxuICAgKiBAcmV0dXJucyBBbiBPYnNlcnZhYmxlIGVtaXR0aW5nIHRoZSByZXNwb25zZSBvZiB0aGUgZGVsZXRlIG9wZXJhdGlvblxyXG4gICAqL1xyXG4gIGRlbGV0ZShkYXRhOiBhbnksIGhlYWRlcnM/OiBhbnkpOiBPYnNlcnZhYmxlPENvbW1vbkFwaVJlc3BvbnNlPiB7XHJcbiAgICAvLyBEYXRhIGlzIGFscmVhZHkgaW4gTkVXIGZvcm1hdDogeyBlbnRpdHlOYW1lLCB3aGVyZUNsYXVzZSB9XHJcbiAgICBjb25zdCBoZWFkZXIgPSBnZXRIZWFkZXJzKGhlYWRlcnMpO1xyXG5cclxuICAgIC8vIERFTEVURSB0byBuZXcgZW5kcG9pbnQgd2l0aCBib2R5XHJcbiAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlLmRlbGV0ZUZyb21TZXJ2aWNlKFxyXG4gICAgICBBUElTZXJ2aWNlcy5jcnVkU2VydmljZSxcclxuICAgICAgQVBJLnJlY29yZHNEZWxldGUsXHJcbiAgICAgIGRhdGEsXHJcbiAgICAgIGhlYWRlclxyXG4gICAgKS5waXBlKFxyXG4gICAgICBzd2l0Y2hNYXAoKHJlc3BvbnNlOiBDb21tb25BcGlSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIGlmICghcmVzcG9uc2U/LklzU3VjY2Vzcykge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignW1RhYkRlbGV0ZVNlcnZpY2VdIERlbGV0ZSBmYWlsZWQ6JywgcmVzcG9uc2U/LkVycm9ycyk7XHJcbiAgICAgICAgICByZXR1cm4gb2YocmVzcG9uc2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ0FTRSAxOiBTWU5DIC0gSGFzIHJlc3VsdCBpbW1lZGlhdGVseVxyXG4gICAgICAgIGlmIChyZXNwb25zZT8uUmVzdWx0Py5sZW5ndGgpIHtcclxuICAgICAgICAgIHJldHVybiBvZihyZXNwb25zZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBDQVNFIDI6IEFTWU5DIC0gSGFzIGNvcnJlbGF0aW9uSWRcclxuICAgICAgICBlbHNlIGlmIChyZXNwb25zZT8uQ29ycmVsYXRpb25JZCkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlQXN5bmNEZWxldGUocmVzcG9uc2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ0FTRSAzOiBVbmtub3duIHJlc3BvbnNlIGZvcm1hdFxyXG4gICAgICAgIHJldHVybiBvZihyZXNwb25zZSk7XHJcbiAgICAgIH0pLFxyXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUYWJEZWxldGVTZXJ2aWNlXSBEZWxldGUgZXJyb3I6JywgZXJyb3IpO1xyXG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgYXN5bmMgZGVsZXRlIC0gd2FpdCBmb3IgU2lnbmFsUiBub3RpZmljYXRpb25cclxuICAgKiBAcGFyYW0gcmVzcG9uc2UgSW5pdGlhbCByZXNwb25zZSB3aXRoIGNvcnJlbGF0aW9uSWRcclxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIHdpdGggcmVzdWx0IGZyb20gU2lnbmFsUiBub3RpZmljYXRpb25cclxuICAgKi9cclxuICBwcml2YXRlIGhhbmRsZUFzeW5jRGVsZXRlKHJlc3BvbnNlOiBDb21tb25BcGlSZXNwb25zZSk6IE9ic2VydmFibGU8Q29tbW9uQXBpUmVzcG9uc2U+IHtcclxuICAgIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSByZXNwb25zZT8uQ29ycmVsYXRpb25JZDtcclxuXHJcbiAgICBpZiAoIWNvcnJlbGF0aW9uSWQpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignW1RhYkRlbGV0ZVNlcnZpY2VdIE1pc3NpbmcgY29ycmVsYXRpb25JZCBpbiBhc3luYyByZXNwb25zZScpO1xyXG4gICAgICByZXR1cm4gb2YocmVzcG9uc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFdhaXQgZm9yIFNpZ25hbFIgbm90aWZpY2F0aW9uIHdpdGggbWF0Y2hpbmcgY29ycmVsYXRpb25JZFxyXG4gICAgcmV0dXJuIHRoaXMuc2lnbmFsUlNlcnZpY2Uud2FpdEZvck9wZXJhdGlvbihjb3JyZWxhdGlvbklkKS5waXBlKFxyXG4gICAgICBtYXAoKG5vdGlmaWNhdGlvbikgPT4ge1xyXG4gICAgICAgIC8vIENoZWNrIGlmIG9wZXJhdGlvbiBzdWNjZWVkZWRcclxuICAgICAgICBpZiAoIW5vdGlmaWNhdGlvbi5pc1N1Y2Nlc3MpIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihub3RpZmljYXRpb24uZXJyb3JNZXNzYWdlIHx8ICdEZWxldGUgb3BlcmF0aW9uIGZhaWxlZCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gUmV0dXJuIHJlc3BvbnNlIHdpdGggcmVzdWx0IGZyb20gbm90aWZpY2F0aW9uXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIC4uLnJlc3BvbnNlLFxyXG4gICAgICAgICAgUmVzdWx0OiBub3RpZmljYXRpb24ucmVjb3JkSWQsXHJcbiAgICAgICAgICBSZWNvcmRBZmZlY3R0ZWQ6IG5vdGlmaWNhdGlvbi5hZmZlY3RlZFJlY29yZHMgfHwgMFxyXG4gICAgICAgIH07XHJcbiAgICAgIH0pLFxyXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgIGlmIChlcnJvci5tZXNzYWdlID09PSAnT3BlcmF0aW9uIHRpbWVkIG91dCcpIHtcclxuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcihcclxuICAgICAgICAgICAgJ0RlbGV0ZSBvcGVyYXRpb24gdGltZWQgb3V0LiBUaGUgb3BlcmF0aW9uIG1heSBzdGlsbCBjb21wbGV0ZSBpbiB0aGUgYmFja2dyb3VuZC4gUGxlYXNlIHJlZnJlc2ggdG8gc2VlIHRoZSByZXN1bHQuJ1xyXG4gICAgICAgICAgKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEaXNwbGF5cyBhIGRlbGV0ZSBjb25maXJtYXRpb24gcG9wdXAuXHJcbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdXNlciBjb25maXJtcyB0aGUgZGVsZXRlIG9wZXJhdGlvbiwgb3RoZXJ3aXNlIGZhbHNlLlxyXG4gICAqL1xyXG4gIGRlbGV0ZVJlY29yZFBvcHVwKCkge1xyXG4gICAgY29uc3QgdGV4dCA9IFwiWW91IGFyZSBnb2luZyB0byBkZWxldGUgc2VsZWN0ZWQgcmVjb3JkLiBBcmUgeW91IHN1cmUgd2FudCB0byBkZWxldGUgdGhlIHNhbWU/XCI7XHJcbiAgICBpZiAoY29uZmlybSh0ZXh0KSA9PSB0cnVlKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVsZXRlcyBtdWx0aXBsZSByZWNvcmRzIGJ5IHRhYmxlIG5hbWUgYW5kIHZhbHVlcy5cclxuICAgKiBAcGFyYW0gdGFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS5cclxuICAgKiBAcGFyYW0gdmFsdWVzIFRoZSB2YWx1ZXMgb2YgdGhlIHJlY29yZHMgdG8gZGVsZXRlLlxyXG4gICAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgZW1pdHRpbmcgdGhlIHJlc3BvbnNlIG9mIHRoZSBkZWxldGUgb3BlcmF0aW9uLlxyXG4gICAqL1xyXG4gIGRlbGV0ZU11bHRpcGxlUmVjb3JkQnlUYWJsZSh0YWJsZU5hbWU6IHN0cmluZywgdmFsdWVzOiBhbnkpIHtcclxuICAgIC8vIFJldHJpZXZlIGFwcCBvYmplY3QgYW5kIHByaW1hcnkga2V5IGZpZWxkc1xyXG4gICAgY29uc3QgYXBwT2JqZWN0TW9kZWwgPSB0aGlzLm1ldGFkYXRhSGVscGVyLmdldEFsbEFwcE9iamVjdHMob2JqID0+IG9iai5TeXN0ZW1EQlRhYmxlTmFtZSA9PT0gdGFibGVOYW1lKVswXTtcclxuICAgIGNvbnN0IGFwcE9iamVjdCA9IGFwcE9iamVjdE1vZGVsPy50b0pTT04oKTtcclxuICAgIGNvbnN0IHByaW1hcnlLZXlGaWVsZHM6IGFueSA9IGdldFByaW1hcnlLZXlGaWVsZHMoYXBwT2JqZWN0KTtcclxuICAgIC8vIEdlbmVyYXRlIHZhbHVlcyBhcnJheSBmcm9tIGRhdGFcclxuICAgIGNvbnN0IHZhbHVlQXJyYXkgPSB0aGlzLmdlbmVyYXRlVmFsdWVzQXJyYXlGcm9tRGF0YSh2YWx1ZXMsIHByaW1hcnlLZXlGaWVsZHNbMF0/LkZpZWxkTmFtZSlcclxuICAgIC8vIEJpbmQgd2hlcmUgY2xhdXNlIGZvciBkZWxldGUgb3BlcmF0aW9uIHVzaW5nIElOIG9wZXJhdG9yIGJ5IHRhYmxlXHJcbiAgICBjb25zdCB3aGVyZUNsYXVzZTogQVBJRmlsdGVyQ3JpdGVyaWEgPSB0aGlzLndoZXJlQ2xhdXNlSGVscGVyLmJpbmRXaGVyZUNsYXVzZUZvckRlbGV0ZVVzaW5nSW5PcGVyYXRvckJ5VGFibGUodGFibGVOYW1lLCBwcmltYXJ5S2V5RmllbGRzWzBdPy5GaWVsZE5hbWUsIHZhbHVlQXJyYXkpO1xyXG4gICAgY29uc3QgZGF0YU9iaiA9IHRoaXMucmVxdWVzdFJlc3BvbnNlSGVscGVyLmRlbGV0ZVBheWxvYWQodGFibGVOYW1lLCB3aGVyZUNsYXVzZSk7XHJcbiAgICByZXR1cm4gdGhpcy5kZWxldGUoZGF0YU9iaik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWxldGVzIG11bHRpcGxlIHJlY29yZHMgZnJvbSB0aGUgc3BlY2lmaWVkIHRhYmxlIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBkYXRhIGFycmF5LlxyXG4gICAqIFRoZSBkYXRhIGFycmF5IHNob3VsZCBjb250YWluIGtleS12YWx1ZSBwYWlycyB3aXRob3V0IHByaW1hcnkga2V5IGluZm9ybWF0aW9uLlxyXG4gICAqIEBwYXJhbSB0YWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHRhYmxlLlxyXG4gICAqIEBwYXJhbSB2YWx1ZXMgVGhlIGFycmF5IG9mIGRhdGEgb2JqZWN0cyB0byBkZWxldGUuXHJcbiAgICogQHJldHVybnMgQW4gT2JzZXJ2YWJsZSBlbWl0dGluZyB0aGUgcmVzcG9uc2Ugb2YgdGhlIGRlbGV0ZSBvcGVyYXRpb24uXHJcbiAgICovXHJcbiAgZGVsZXRlTXVsdGlwbGVSZWNvcmRCeVRhYmxlV2l0aG91dFByaW1hcnlLZXkodGFibGVOYW1lOiBzdHJpbmcsIHZhbHVlczogYW55ICwgaGVhZGVycz86IGFueSkge1xyXG4gICAgLy8gR2VuZXJhdGUgdmFsdWVzIGFycmF5IGZyb20gZGF0YVxyXG4gICAgY29uc3QgdmFsdWVBcnJheSA9IHRoaXMuZ2VuZXJhdGVWYWx1ZXNBcnJheUZyb21EYXRhV2l0aG91dFByaW1hcnlLZXkodmFsdWVzKTsgICAgXHJcbiAgICAvLyBCaW5kIHdoZXJlIGNsYXVzZSBmb3IgZGVsZXRlIG9wZXJhdGlvbiB1c2luZyBJTiBvcGVyYXRvciBieSB0YWJsZVxyXG4gICAgY29uc3Qgd2hlcmVDbGF1c2U6IEFQSUZpbHRlckNyaXRlcmlhID0gdGhpcy53aGVyZUNsYXVzZUhlbHBlci5iaW5kV2hlcmVDbGF1c2VGb3JEeW5hbWljRGVsZXRlKHRhYmxlTmFtZSwgdmFsdWVBcnJheSk7XHJcbiAgICBjb25zdCBkYXRhT2JqID0gdGhpcy5yZXF1ZXN0UmVzcG9uc2VIZWxwZXIuZGVsZXRlUGF5bG9hZCh0YWJsZU5hbWUsIHdoZXJlQ2xhdXNlKTtcclxuICAgIHJldHVybiB0aGlzLmRlbGV0ZShkYXRhT2JqLCBoZWFkZXJzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlcyBhIHZhbHVlcyBhcnJheSBmcm9tIHRoZSBkYXRhLlxyXG4gICAqIEBwYXJhbSBkYXRhQXJyYXkgVGhlIGFycmF5IG9mIGRhdGEuXHJcbiAgICogQHBhcmFtIGtleSBUaGUga2V5IHRvIGV4dHJhY3QgZnJvbSBlYWNoIGVsZW1lbnQuXHJcbiAgICogQHJldHVybnMgVGhlIGFycmF5IG9mIHZhbHVlcy5cclxuICAgKi9cclxuICBnZW5lcmF0ZVZhbHVlc0FycmF5RnJvbURhdGEoZGF0YUFycmF5OiBhbnksIGtleTogYW55KSB7XHJcbiAgICBjb25zdCB2YWx1ZUFycmF5OiBhbnkgPSBbXVxyXG4gICAgaWYgKGRhdGFBcnJheSAmJiBkYXRhQXJyYXkubGVuZ3RoKSB7XHJcbiAgICAgIGRhdGFBcnJheS5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcclxuICAgICAgICB2YWx1ZUFycmF5LnB1c2goZWxlbWVudFtrZXldKVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiB2YWx1ZUFycmF5XHJcbiAgfVxyXG4gIFxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlcyBhbiBhcnJheSBvZiB2YWx1ZXMgZnJvbSB0aGUgcHJvdmlkZWQgZGF0YSBhcnJheS5cclxuICAgKiBFYWNoIGVudHJ5IGluIHRoZSByZXR1cm5lZCBhcnJheSBpbmNsdWRlcyBrZXktdmFsdWUgcGFpcnMgZnJvbSB0aGUgZGF0YSBvYmplY3RzLFxyXG4gICAqIGFuZCBhbiBhc3NvY2lhdGVkIEdyb3VwSUQgaW5kaWNhdGluZyB0aGUgaW5kZXggb2YgdGhlIGRhdGEgb2JqZWN0LlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBkYXRhQXJyYXkgQW4gYXJyYXkgb2YgZGF0YSBvYmplY3RzLlxyXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IGNvbnRhaW5pbmcgb2JqZWN0cyB3aXRoIGtleXMsIHZhbHVlcywgYW5kIGdyb3VwIGluZGljZXMuXHJcbiAgICovXHJcbiAgZ2VuZXJhdGVWYWx1ZXNBcnJheUZyb21EYXRhV2l0aG91dFByaW1hcnlLZXkoZGF0YUFycmF5OiBhbnkpIHtcclxuICAgIGNvbnN0IHZhbHVlQXJyYXk6IGFueSA9IFtdO1xyXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGlucHV0IGRhdGEgYXJyYXkgaXMgdmFsaWQgYW5kIGhhcyBlbGVtZW50c1xyXG4gICAgaWYgKGRhdGFBcnJheSAmJiBkYXRhQXJyYXkubGVuZ3RoKSB7XHJcbiAgICAgIC8vIEl0ZXJhdGUgb3ZlciBlYWNoIGVsZW1lbnQgaW4gdGhlIGRhdGEgYXJyYXlcclxuICAgICAgZGF0YUFycmF5LmZvckVhY2goKGVsZW1lbnQ6IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgIC8vIEVuc3VyZSB0aGUgZWxlbWVudCBpcyBhbiBvYmplY3RcclxuICAgICAgICBpZiAoZWxlbWVudCAmJiB0eXBlb2YgZWxlbWVudCA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBlYWNoIGtleS12YWx1ZSBwYWlyIGluIHRoZSBvYmplY3RcclxuICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGVsZW1lbnQpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xyXG4gICAgICAgICAgICAvLyBQdXNoIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBrZXksIHZhbHVlLCBhbmQgaW5kZXggYXMgR3JvdXBJRCB0byB2YWx1ZUFycmF5XHJcbiAgICAgICAgICAgIHZhbHVlQXJyYXkucHVzaCh7IFxyXG4gICAgICAgICAgICAgIGtleToga2V5LFxyXG4gICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcclxuICAgICAgICAgICAgICBHcm91cElEOiBpbmRleFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWVBcnJheTtcclxuICB9XHJcbn1cclxuIl19
@@ -1,42 +1,171 @@
1
1
  import { Injectable, inject } from "@angular/core";
2
2
  import { ApiService } from "../../core/http-client/api.service";
3
3
  import { getHeaders } from "../utils/req-res.util";
4
- import { API } from "../constants/api-constants";
4
+ import { API, APIServices } from "../constants/api-constants";
5
+ import { of, throwError } from "rxjs";
6
+ import { switchMap, map, catchError } from "rxjs/operators";
7
+ import { ConjuctionClause, FilterValueType, RelationalOperator } from "../enums/dsq.enum";
8
+ import { SignalRService } from "../../core/service/signalr/signalr.service";
5
9
  import * as i0 from "@angular/core";
6
10
  export class TabFormioService {
7
11
  constructor() {
8
12
  this.apiService = inject(ApiService);
13
+ this.signalRService = inject(SignalRService);
9
14
  }
10
15
  /**
11
16
  * Fetches screen data from the server based on the screen ID and optional configuration.
17
+ * NEW: Uses metadata service endpoint - returns new API format directly
12
18
  *
13
19
  * @param screenId - The ID of the screen to retrieve.
14
20
  * @param config - Optional configuration including layoutId and version.
15
21
  * @param params - Additional parameters for the API call.
16
- * @returns The screen data if headers are available, otherwise null.
22
+ * @returns The screen data in new API format (camelCase)
17
23
  */
18
24
  getScreen(screenId, config, params) {
19
25
  // Retrieve headers for the API request
20
26
  const headers = getHeaders();
21
- // Construct the API endpoint with the screenId and optional configuration
22
- return this.apiService.get(`${API.getScreen}?screenId=${screenId}${config?.layoutId ? `&layoutId=${config?.layoutId}` : ''}${config?.version ? `&version=${config?.version}` : ''}`, params, headers);
27
+ // NEW API: GET /screen/{screenId} via metadata service
28
+ // Query params: layoutId, version (if provided)
29
+ let endpoint = `${API.screen}/${screenId}`;
30
+ const queryParams = [];
31
+ if (config?.layoutId) {
32
+ queryParams.push(`layoutId=${config.layoutId}`);
33
+ }
34
+ if (config?.version) {
35
+ queryParams.push(`version=${config.version}`);
36
+ }
37
+ if (queryParams.length > 0) {
38
+ endpoint += `?${queryParams.join('&')}`;
39
+ }
40
+ return this.apiService.getFromService(APIServices.metadataService, endpoint, params, headers);
23
41
  }
24
42
  /**
25
43
  * Retrieves the submission data from the server.
26
- * @param data - Object containing screenId and reqtokens
27
- * @returns A Subject emitting the submission data or undefined.
44
+ * NEW: Uses formio service endpoint - returns new API format directly
45
+ *
46
+ * @param screenId - The ID of the screen to retrieve data for
47
+ * @param requestPayload - Request payload containing Reqtokens and other parameters
48
+ * @returns The screen data in new API format (camelCase)
28
49
  */
29
50
  getScreenData(screenId, requestPayload) {
30
51
  const headers = getHeaders();
31
- return this.apiService.post(`${API.getScreenData}/${screenId}`, requestPayload, headers);
52
+ // NEW API: POST /formio/screendata/{screenId} via formio service
53
+ return this.apiService.postToService(APIServices.formioService, `${API.screenData}/${screenId}`, requestPayload, headers);
32
54
  }
33
55
  /**
34
- * Called when the form is submitted.
35
- * @param data Object containing submission data.
36
- */
56
+ * Process form request - handles both SYNC and ASYNC operations transparently
57
+ *
58
+ * SYNC Operation: Backend returns insertedId immediately → Fetch full record → Return
59
+ * ASYNC Operation: Backend returns correlationId → Wait for SignalR notification → Fetch full record → Return
60
+ *
61
+ * Developer code stays the same for both cases - platform handles complexity
62
+ *
63
+ * @param data Object containing submission data (ScreenId, Data)
64
+ * @returns Observable with full record data (always returns complete record)
65
+ */
37
66
  processRequest(data) {
38
67
  const headers = getHeaders();
39
- return this.apiService.post(`${API.processRequest}`, data, headers);
68
+ return this.apiService.postToService(APIServices.formioService, `${API.processRequest}`, data, headers).pipe(switchMap((response) => {
69
+ // Check for success
70
+ if (!response?.IsSuccess) {
71
+ console.error('[TabFormioService] ProcessRequest failed:', response?.Errors);
72
+ return of(response);
73
+ }
74
+ // CASE 1: SYNC - Has insertedId immediately (not null)
75
+ if (response?.Result?.insertedId) {
76
+ return this.handleSyncOperation(response);
77
+ }
78
+ // CASE 2: ASYNC - Has CorrelationId and insertedId is null
79
+ else if (response?.CorrelationId) {
80
+ return this.handleAsyncOperation(response);
81
+ }
82
+ // CASE 3: Other response (return as-is)
83
+ return of(response);
84
+ }), catchError((error) => {
85
+ console.error('[TabFormioService] ProcessRequest error:', error);
86
+ return throwError(() => error);
87
+ }));
88
+ }
89
+ /**
90
+ * Handle SYNC operation - fetch full record immediately
91
+ */
92
+ handleSyncOperation(response) {
93
+ const { insertedId, objectName, primaryKeyField } = response?.Result || {};
94
+ if (!objectName || !insertedId) {
95
+ console.error('[TabFormioService] Missing objectName or insertedId in sync response');
96
+ return of(response);
97
+ }
98
+ const pkField = primaryKeyField || 'Id'; // Default to 'Id' if not provided
99
+ return this.fetchFullRecord(objectName, insertedId, pkField).pipe(map((fullRecord) => ({
100
+ ...response,
101
+ Result: fullRecord
102
+ })), catchError((error) => {
103
+ console.error('[TabFormioService] Failed to fetch full record:', error);
104
+ // Return partial response if fetch fails
105
+ return of(response);
106
+ }));
107
+ }
108
+ /**
109
+ * Handle ASYNC operation - wait for SignalR notification, then fetch full record
110
+ */
111
+ handleAsyncOperation(response) {
112
+ const correlationId = response?.CorrelationId;
113
+ const primaryKeyField = response?.Result?.primaryKeyField || 'Id'; // Get from original response
114
+ if (!correlationId) {
115
+ console.error('[TabFormioService] Missing correlationId in async response');
116
+ return of(response);
117
+ }
118
+ // Wait for SignalR notification with matching correlationId
119
+ return this.signalRService.waitForOperation(correlationId).pipe(switchMap((notification) => {
120
+ // Check if operation succeeded
121
+ if (!notification.isSuccess) {
122
+ return throwError(() => new Error(notification.errorMessage || 'Operation failed'));
123
+ }
124
+ // Fetch full record using recordId from notification
125
+ return this.fetchFullRecord(notification.entityName, notification.recordId, primaryKeyField);
126
+ }),
127
+ // Build normalized response
128
+ map((fullRecord) => ({
129
+ ...response,
130
+ Result: fullRecord
131
+ })),
132
+ // Handle errors (timeout, fetch failure, etc.)
133
+ catchError((error) => {
134
+ if (error.message === 'Operation timed out') {
135
+ return throwError(() => new Error('Operation timed out. The operation may still complete in the background. Please refresh to see the result.'));
136
+ }
137
+ return throwError(() => error);
138
+ }));
139
+ }
140
+ /**
141
+ * Fetch full record from CRUD service
142
+ * @param objectName - Entity/Table name
143
+ * @param recordId - Record ID to fetch
144
+ * @param primaryKeyField - Primary key field name (defaults to 'Id')
145
+ */
146
+ fetchFullRecord(objectName, recordId, primaryKeyField = 'Id') {
147
+ return this.apiService.postToService(APIServices.crudService, API.QueriesSelect, {
148
+ EntityName: objectName,
149
+ ResultField_AppfieldIds: ['*'],
150
+ whereClause: {
151
+ filters: [
152
+ {
153
+ fieldName: primaryKeyField, // Use dynamic primary key field
154
+ operator: RelationalOperator.EqualTo,
155
+ value: recordId,
156
+ valueType: FilterValueType.Literal,
157
+ conjunction: ConjuctionClause.AND,
158
+ groupId: 0,
159
+ sequence: 1
160
+ }
161
+ ]
162
+ },
163
+ }).pipe(map((selectResponse) => {
164
+ if (selectResponse?.Result && selectResponse?.Result?.length) {
165
+ return selectResponse.Result[0];
166
+ }
167
+ throw new Error('Record not found after operation');
168
+ }));
40
169
  }
41
170
  /**
42
171
  * Retrieves the formIO components for the given appObjectId and type.
@@ -56,4 +185,4 @@ export class TabFormioService {
56
185
  type: Injectable,
57
186
  args: [{ providedIn: 'root' }]
58
187
  }], null, null); })();
59
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLWZvcm1pby5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9kYXRhLWFjY2Vzcy9zcmMvbGliL3RhYi1jb3JlLXV0aWxpdHkvYXBwL2NydWQvdGFiLWZvcm1pby5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQU1qRCxNQUFNLE9BQU8sZ0JBQWdCO0lBRDdCO1FBRW1CLGVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7S0ErRGxEO0lBN0RDOzs7Ozs7O09BT0c7SUFDSCxTQUFTLENBQUMsUUFBZ0IsRUFBRSxNQUF3QixFQUFFLE1BQVk7UUFDaEUsdUNBQXVDO1FBQ3ZDLE1BQU0sT0FBTyxHQUFHLFVBQVUsRUFBRSxDQUFDO1FBQzdCLDBFQUEwRTtRQUMxRSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUN4QixHQUFHLEdBQUcsQ0FBQyxTQUFTLGFBQWEsUUFBUSxHQUFHLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLGFBQWEsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsWUFBWSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUN4SixNQUFNLEVBQ04sT0FBTyxDQUNSLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGFBQWEsQ0FBQyxRQUFnQixFQUFFLGNBQW1CO1FBQ2pELE1BQU0sT0FBTyxHQUFHLFVBQVUsRUFBRSxDQUFDO1FBQzdCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQ3pCLEdBQUcsR0FBRyxDQUFDLGFBQWEsSUFBSSxRQUFRLEVBQUUsRUFDbEMsY0FBYyxFQUNkLE9BQU8sQ0FDUixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7TUFHRTtJQUNGLGNBQWMsQ0FBQyxJQUEyQjtRQUN4QyxNQUFNLE9BQU8sR0FBRyxVQUFVLEVBQUUsQ0FBQztRQUM3QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUN6QixHQUFHLEdBQUcsQ0FBQyxjQUFjLEVBQUUsRUFDdkIsSUFBSSxFQUNKLE9BQU8sQ0FDUixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILHFCQUFxQixDQUFDLFdBQW1CLEVBQUUsSUFBNEIsRUFBRSxNQUFZO1FBQ25GLE1BQU0sT0FBTyxHQUFHLFVBQVUsRUFBRSxDQUFDO1FBQzdCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQ3hCLEdBQUcsR0FBRyxDQUFDLHFCQUFxQixnQkFBZ0IsV0FBVyxTQUFTLElBQUksRUFBRSxFQUN0RSxNQUFNLEVBQ04sT0FBTyxDQUNSLENBQUM7SUFDSixDQUFDO2lGQS9EVSxnQkFBZ0I7dUVBQWhCLGdCQUFnQixXQUFoQixnQkFBZ0IsbUJBREgsTUFBTTs7aUZBQ25CLGdCQUFnQjtjQUQ1QixVQUFVO2VBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgQXBpU2VydmljZSB9IGZyb20gXCIuLi8uLi9jb3JlL2h0dHAtY2xpZW50L2FwaS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IGdldEhlYWRlcnMgfSBmcm9tIFwiLi4vdXRpbHMvcmVxLXJlcy51dGlsXCI7XHJcbmltcG9ydCB7IEFQSSB9IGZyb20gXCIuLi9jb25zdGFudHMvYXBpLWNvbnN0YW50c1wiO1xyXG5pbXBvcnQgeyBDb21tb25BcGlSZXNwb25zZSwgR2V0U2NyZWVuQ29uZmlnLCBQcm9jZXNzUmVxdWVzdFBheWxvYWQgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9jb21tb24uaW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBCdWlsZEZvcm1Db21wb25lbnRUeXBlIH0gZnJvbSBcIi4uL2VudW1zL2NvbW1vbi5lbnVtXCI7XHJcblxyXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxyXG5leHBvcnQgY2xhc3MgVGFiRm9ybWlvU2VydmljZSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhcGlTZXJ2aWNlID0gaW5qZWN0KEFwaVNlcnZpY2UpO1xyXG5cclxuICAvKipcclxuICAgKiBGZXRjaGVzIHNjcmVlbiBkYXRhIGZyb20gdGhlIHNlcnZlciBiYXNlZCBvbiB0aGUgc2NyZWVuIElEIGFuZCBvcHRpb25hbCBjb25maWd1cmF0aW9uLlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBzY3JlZW5JZCAtIFRoZSBJRCBvZiB0aGUgc2NyZWVuIHRvIHJldHJpZXZlLlxyXG4gICAqIEBwYXJhbSBjb25maWcgLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIGluY2x1ZGluZyBsYXlvdXRJZCBhbmQgdmVyc2lvbi5cclxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQWRkaXRpb25hbCBwYXJhbWV0ZXJzIGZvciB0aGUgQVBJIGNhbGwuXHJcbiAgICogQHJldHVybnMgVGhlIHNjcmVlbiBkYXRhIGlmIGhlYWRlcnMgYXJlIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIG51bGwuXHJcbiAgICovXHJcbiAgZ2V0U2NyZWVuKHNjcmVlbklkOiBzdHJpbmcsIGNvbmZpZz86IEdldFNjcmVlbkNvbmZpZywgcGFyYW1zPzogYW55KTogT2JzZXJ2YWJsZTxDb21tb25BcGlSZXNwb25zZT4ge1xyXG4gICAgLy8gUmV0cmlldmUgaGVhZGVycyBmb3IgdGhlIEFQSSByZXF1ZXN0XHJcbiAgICBjb25zdCBoZWFkZXJzID0gZ2V0SGVhZGVycygpO1xyXG4gICAgLy8gQ29uc3RydWN0IHRoZSBBUEkgZW5kcG9pbnQgd2l0aCB0aGUgc2NyZWVuSWQgYW5kIG9wdGlvbmFsIGNvbmZpZ3VyYXRpb25cclxuICAgIHJldHVybiB0aGlzLmFwaVNlcnZpY2UuZ2V0KFxyXG4gICAgICBgJHtBUEkuZ2V0U2NyZWVufT9zY3JlZW5JZD0ke3NjcmVlbklkfSR7Y29uZmlnPy5sYXlvdXRJZCA/IGAmbGF5b3V0SWQ9JHtjb25maWc/LmxheW91dElkfWAgOiAnJ30ke2NvbmZpZz8udmVyc2lvbiA/IGAmdmVyc2lvbj0ke2NvbmZpZz8udmVyc2lvbn1gIDogJyd9YCxcclxuICAgICAgcGFyYW1zLFxyXG4gICAgICBoZWFkZXJzXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmVzIHRoZSBzdWJtaXNzaW9uIGRhdGEgZnJvbSB0aGUgc2VydmVyLlxyXG4gICAqIEBwYXJhbSBkYXRhIC0gT2JqZWN0IGNvbnRhaW5pbmcgc2NyZWVuSWQgYW5kIHJlcXRva2Vuc1xyXG4gICAqIEByZXR1cm5zIEEgU3ViamVjdCBlbWl0dGluZyB0aGUgc3VibWlzc2lvbiBkYXRhIG9yIHVuZGVmaW5lZC5cclxuICAgKi9cclxuICBnZXRTY3JlZW5EYXRhKHNjcmVlbklkOiBzdHJpbmcsIHJlcXVlc3RQYXlsb2FkOiBhbnkpOiBPYnNlcnZhYmxlPENvbW1vbkFwaVJlc3BvbnNlPiB7XHJcbiAgICBjb25zdCBoZWFkZXJzID0gZ2V0SGVhZGVycygpO1xyXG4gICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5wb3N0KFxyXG4gICAgICBgJHtBUEkuZ2V0U2NyZWVuRGF0YX0vJHtzY3JlZW5JZH1gLFxyXG4gICAgICByZXF1ZXN0UGF5bG9hZCxcclxuICAgICAgaGVhZGVyc1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogQ2FsbGVkIHdoZW4gdGhlIGZvcm0gaXMgc3VibWl0dGVkLlxyXG4gICogQHBhcmFtIGRhdGEgT2JqZWN0IGNvbnRhaW5pbmcgc3VibWlzc2lvbiBkYXRhLlxyXG4gICovXHJcbiAgcHJvY2Vzc1JlcXVlc3QoZGF0YTogUHJvY2Vzc1JlcXVlc3RQYXlsb2FkKTogT2JzZXJ2YWJsZTxDb21tb25BcGlSZXNwb25zZT4ge1xyXG4gICAgY29uc3QgaGVhZGVycyA9IGdldEhlYWRlcnMoKTtcclxuICAgIHJldHVybiB0aGlzLmFwaVNlcnZpY2UucG9zdChcclxuICAgICAgYCR7QVBJLnByb2Nlc3NSZXF1ZXN0fWAsXHJcbiAgICAgIGRhdGEsXHJcbiAgICAgIGhlYWRlcnNcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZXMgdGhlIGZvcm1JTyBjb21wb25lbnRzIGZvciB0aGUgZ2l2ZW4gYXBwT2JqZWN0SWQgYW5kIHR5cGUuXHJcbiAgICogQHBhcmFtIGFwcE9iamVjdElkIC0gVGhlIElEIG9mIHRoZSBhcHAgb2JqZWN0LlxyXG4gICAqIEBwYXJhbSB0eXBlIC0gVGhlIHR5cGUgb2YgdGhlIGNvbXBvbmVudHMgdG8gcmV0cmlldmUuIENhbiBiZSBlaXRoZXIgJ0NvbW1vbkZpbHRlcicgb3IgJ0J1bGtVcGRhdGUnXHJcbiAgICogQHBhcmFtIHBhcmFtcyAtIEFkZGl0aW9uYWwgcGFyYW1ldGVycyBmb3IgdGhlIEFQSSBjYWxsLlxyXG4gICAqIEByZXR1cm5zIFRoZSBmb3JtSU8gY29tcG9uZW50cyBpbiB0aGUgcmVzcG9uc2UgYm9keS5cclxuICAgKi9cclxuICBidWlsZEZvcm1JT0NvbXBvbmVudHMoYXBwT2JqZWN0SWQ6IHN0cmluZywgdHlwZTogQnVpbGRGb3JtQ29tcG9uZW50VHlwZSwgcGFyYW1zPzogYW55KTogT2JzZXJ2YWJsZTxDb21tb25BcGlSZXNwb25zZT4ge1xyXG4gICAgY29uc3QgaGVhZGVycyA9IGdldEhlYWRlcnMoKTtcclxuICAgIHJldHVybiB0aGlzLmFwaVNlcnZpY2UuZ2V0KFxyXG4gICAgICBgJHtBUEkuQnVpbGRGb3JtSU9Db21wb25lbnRzfT9hcHBPYmplY3RJZD0ke2FwcE9iamVjdElkfSZUeXBlPSR7dHlwZX1gLFxyXG4gICAgICBwYXJhbXMsXHJcbiAgICAgIGhlYWRlcnNcclxuICAgICk7XHJcbiAgfVxyXG59Il19
188
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLWZvcm1pby5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9kYXRhLWFjY2Vzcy9zcmMvbGliL3RhYi1jb3JlLXV0aWxpdHkvYXBwL2NydWQvdGFiLWZvcm1pby5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUU5RCxPQUFPLEVBQWMsRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU1RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDMUYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRDQUE0QyxDQUFDOztBQUc1RSxNQUFNLE9BQU8sZ0JBQWdCO0lBRDdCO1FBRW1CLGVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEMsbUJBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7S0FzTzFEO0lBcE9DOzs7Ozs7OztPQVFHO0lBQ0gsU0FBUyxDQUFDLFFBQWdCLEVBQUUsTUFBd0IsRUFBRSxNQUFZO1FBQ2hFLHVDQUF1QztRQUN2QyxNQUFNLE9BQU8sR0FBRyxVQUFVLEVBQUUsQ0FBQztRQUU3Qix1REFBdUQ7UUFDdkQsZ0RBQWdEO1FBQ2hELElBQUksUUFBUSxHQUFHLEdBQUcsR0FBRyxDQUFDLE1B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UTt3QkFDZixTQUFTLEVBQUUsZUFBZSxDQUFDLE9BQU87d0JBQ2xDLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxHQUFHO3dCQUNqQyxPQUFPLEVBQUUsQ0FBQzt3QkFDVixRQUFRLEVBQUUsQ0FBQztxQkFDWjtpQkFDRjthQUNGO1NBQ0YsQ0FBQyxDQUFDLElBQUksQ0FDTCxHQUFHLENBQUMsQ0FBQyxjQUFpQyxFQUFFLEVBQUU7WUFDeEMsSUFBSSxjQUFjLEVBQUUsTUFBTSxJQUFJLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7Z0JBQzdELE9BQU8sY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQyxDQUFDO1lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1FBQ3RELENBQUMsQ0FBQyxDQUNILENBQUM7SUFDTixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gscUJBQXFCLENBQUMsV0FBbUIsRUFBRSxJQUE0QixFQUFFLE1BQVk7UUFDbkYsTUFBTSxPQUFPLEdBQUcsVUFBVSxFQUFFLENBQUM7UUFDN0IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FDeEIsR0FBRyxHQUFHLENBQUMscUJBQXFCLGdCQUFnQixXQUFXLFNBQVMsSUFBSSxFQUFFLEVBQ3RFLE1BQU0sRUFDTixPQUFPLENBQ1IsQ0FBQztJQUNKLENBQUM7aUZBdk9VLGdCQUFnQjt1RUFBaEIsZ0JBQWdCLFdBQWhCLGdCQUFnQixtQkFESCxNQUFNOztpRkFDbkIsZ0JBQWdCO2NBRDVCLFVBQVU7ZUFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBBcGlTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL2NvcmUvaHR0cC1jbGllbnQvYXBpLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgZ2V0SGVhZGVycyB9IGZyb20gXCIuLi91dGlscy9yZXEtcmVzLnV0aWxcIjtcclxuaW1wb3J0IHsgQVBJLCBBUElTZXJ2aWNlcyB9IGZyb20gXCIuLi9jb25zdGFudHMvYXBpLWNvbnN0YW50c1wiO1xyXG5pbXBvcnQgeyBDb21tb25BcGlSZXNwb25zZSwgR2V0U2NyZWVuQ29uZmlnLCBQcm9jZXNzUmVxdWVzdFBheWxvYWQgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9jb21tb24uaW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCB0aHJvd0Vycm9yIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgc3dpdGNoTWFwLCBtYXAsIGNhdGNoRXJyb3IgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuaW1wb3J0IHsgQnVpbGRGb3JtQ29tcG9uZW50VHlwZSB9IGZyb20gXCIuLi9lbnVtcy9jb21tb24uZW51bVwiO1xyXG5pbXBvcnQgeyBDb25qdWN0aW9uQ2xhdXNlLCBGaWx0ZXJWYWx1ZVR5cGUsIFJlbGF0aW9uYWxPcGVyYXRvciB9IGZyb20gXCIuLi9lbnVtcy9kc3EuZW51bVwiO1xyXG5pbXBvcnQgeyBTaWduYWxSU2VydmljZSB9IGZyb20gXCIuLi8uLi9jb3JlL3NlcnZpY2Uvc2lnbmFsci9zaWduYWxyLnNlcnZpY2VcIjtcclxuXHJcbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXHJcbmV4cG9ydCBjbGFzcyBUYWJGb3JtaW9TZXJ2aWNlIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGFwaVNlcnZpY2UgPSBpbmplY3QoQXBpU2VydmljZSk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzaWduYWxSU2VydmljZSA9IGluamVjdChTaWduYWxSU2VydmljZSk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEZldGNoZXMgc2NyZWVuIGRhdGEgZnJvbSB0aGUgc2VydmVyIGJhc2VkIG9uIHRoZSBzY3JlZW4gSUQgYW5kIG9wdGlvbmFsIGNvbmZpZ3VyYXRpb24uXHJcbiAgICogTkVXOiBVc2VzIG1ldGFkYXRhIHNlcnZpY2UgZW5kcG9pbnQgLSByZXR1cm5zIG5ldyBBUEkgZm9ybWF0IGRpcmVjdGx5XHJcbiAgICpcclxuICAgKiBAcGFyYW0gc2NyZWVuSWQgLSBUaGUgSUQgb2YgdGhlIHNjcmVlbiB0byByZXRyaWV2ZS5cclxuICAgKiBAcGFyYW0gY29uZmlnIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBpbmNsdWRpbmcgbGF5b3V0SWQgYW5kIHZlcnNpb24uXHJcbiAgICogQHBhcmFtIHBhcmFtcyAtIEFkZGl0aW9uYWwgcGFyYW1ldGVycyBmb3IgdGhlIEFQSSBjYWxsLlxyXG4gICAqIEByZXR1cm5zIFRoZSBzY3JlZW4gZGF0YSBpbiBuZXcgQVBJIGZvcm1hdCAoY2FtZWxDYXNlKVxyXG4gICAqL1xyXG4gIGdldFNjcmVlbihzY3JlZW5JZDogc3RyaW5nLCBjb25maWc/OiBHZXRTY3JlZW5Db25maWcsIHBhcmFtcz86IGFueSk6IE9ic2VydmFibGU8Q29tbW9uQXBpUmVzcG9uc2U+IHtcclxuICAgIC8vIFJldHJpZXZlIGhlYWRlcnMgZm9yIHRoZSBBUEkgcmVxdWVzdFxyXG4gICAgY29uc3QgaGVhZGVycyA9IGdldEhlYWRlcnMoKTtcclxuXHJcbiAgICAvLyBORVcgQVBJOiBHRVQgL3NjcmVlbi97c2NyZWVuSWR9IHZpYSBtZXRhZGF0YSBzZXJ2aWNlXHJcbiAgICAvLyBRdWVyeSBwYXJhbXM6IGxheW91dElkLCB2ZXJzaW9uIChpZiBwcm92aWRlZClcclxuICAgIGxldCBlbmRwb2ludCA9IGAke0FQSS5zY3JlZW59LyR7c2NyZWVuSWR9YDtcclxuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAgIGlmIChjb25maWc/LmxheW91dElkKSB7XHJcbiAgICAgIHF1ZXJ5UGFyYW1zLnB1c2goYGxheW91dElkPSR7Y29uZmlnLmxheW91dElkfWApO1xyXG4gICAgfVxyXG4gICAgaWYgKGNvbmZpZz8udmVyc2lvbikge1xyXG4gICAgICBxdWVyeVBhcmFtcy5wdXNoKGB2ZXJzaW9uPSR7Y29uZmlnLnZlcnNpb259YCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHF1ZXJ5UGFyYW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgZW5kcG9pbnQgKz0gYD8ke3F1ZXJ5UGFyYW1zLmpvaW4oJyYnKX1gO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmFwaVNlcnZpY2UuZ2V0RnJvbVNlcnZpY2UoXHJcbiAgICAgIEFQSVNlcnZpY2VzLm1ldGFkYXRhU2VydmljZSxcclxuICAgICAgZW5kcG9pbnQsXHJcbiAgICAgIHBhcmFtcyxcclxuICAgICAgaGVhZGVyc1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyB0aGUgc3VibWlzc2lvbiBkYXRhIGZyb20gdGhlIHNlcnZlci5cclxuICAgKiBORVc6IFVzZXMgZm9ybWlvIHNlcnZpY2UgZW5kcG9pbnQgLSByZXR1cm5zIG5ldyBBUEkgZm9ybWF0IGRpcmVjdGx5XHJcbiAgICpcclxuICAgKiBAcGFyYW0gc2NyZWVuSWQgLSBUaGUgSUQgb2YgdGhlIHNjcmVlbiB0byByZXRyaWV2ZSBkYXRhIGZvclxyXG4gICAqIEBwYXJhbSByZXF1ZXN0UGF5bG9hZCAtIFJlcXVlc3QgcGF5bG9hZCBjb250YWluaW5nIFJlcXRva2VucyBhbmQgb3RoZXIgcGFyYW1ldGVyc1xyXG4gICAqIEByZXR1cm5zIFRoZSBzY3JlZW4gZGF0YSBpbiBuZXcgQVBJIGZvcm1hdCAoY2FtZWxDYXNlKVxyXG4gICAqL1xyXG4gIGdldFNjcmVlbkRhdGEoc2NyZWVuSWQ6IHN0cmluZywgcmVxdWVzdFBheWxvYWQ6IGFueSk6IE9ic2VydmFibGU8Q29tbW9uQXBpUmVzcG9uc2U+IHtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSBnZXRIZWFkZXJzKCk7XHJcblxyXG4gICAgLy8gTkVXIEFQSTogUE9TVCAvZm9ybWlvL3NjcmVlbmRhdGEve3NjcmVlbklkfSB2aWEgZm9ybWlvIHNlcnZpY2VcclxuICAgIHJldHVybiB0aGlzLmFwaVNlcnZpY2UucG9zdFRvU2VydmljZShcclxuICAgICAgQVBJU2VydmljZXMuZm9ybWlvU2VydmljZSxcclxuICAgICAgYCR7QVBJLnNjcmVlbkRhdGF9LyR7c2NyZWVuSWR9YCxcclxuICAgICAgcmVxdWVzdFBheWxvYWQsXHJcbiAgICAgIGhlYWRlcnNcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQcm9jZXNzIGZvcm0gcmVxdWVzdCAtIGhhbmRsZXMgYm90aCBTWU5DIGFuZCBBU1lOQyBvcGVyYXRpb25zIHRyYW5zcGFyZW50bHlcclxuICAgKlxyXG4gICAqIFNZTkMgT3BlcmF0aW9uOiBCYWNrZW5kIHJldHVybnMgaW5zZXJ0ZWRJZCBpbW1lZGlhdGVseSDihpIgRmV0Y2ggZnVsbCByZWNvcmQg4oaSIFJldHVyblxyXG4gICAqIEFTWU5DIE9wZXJhdGlvbjogQmFja2VuZCByZXR1cm5zIGNvcnJlbGF0aW9uSWQg4oaSIFdhaXQgZm9yIFNpZ25hbFIgbm90aWZpY2F0aW9uIOKGkiBGZXRjaCBmdWxsIHJlY29yZCDihpIgUmV0dXJuXHJcbiAgICpcclxuICAgKiBEZXZlbG9wZXIgY29kZSBzdGF5cyB0aGUgc2FtZSBmb3IgYm90aCBjYXNlcyAtIHBsYXRmb3JtIGhhbmRsZXMgY29tcGxleGl0eVxyXG4gICAqXHJcbiAgICogQHBhcmFtIGRhdGEgT2JqZWN0IGNvbnRhaW5pbmcgc3VibWlzc2lvbiBkYXRhIChTY3JlZW5JZCwgRGF0YSlcclxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIHdpdGggZnVsbCByZWNvcmQgZGF0YSAoYWx3YXlzIHJldHVybnMgY29tcGxldGUgcmVjb3JkKVxyXG4gICAqL1xyXG4gIHByb2Nlc3NSZXF1ZXN0KGRhdGE6IFByb2Nlc3NSZXF1ZXN0UGF5bG9hZCk6IE9ic2VydmFibGU8Q29tbW9uQXBpUmVzcG9uc2U+IHtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSBnZXRIZWFkZXJzKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5wb3N0VG9TZXJ2aWNlKFxyXG4gICAgICBBUElTZXJ2aWNlcy5mb3JtaW9TZXJ2aWNlLFxyXG4gICAgICBgJHtBUEkucHJvY2Vzc1JlcXVlc3R9YCxcclxuICAgICAgZGF0YSxcclxuICAgICAgaGVhZGVyc1xyXG4gICAgKS5waXBlKFxyXG4gICAgICBzd2l0Y2hNYXAoKHJlc3BvbnNlOiBDb21tb25BcGlSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIC8vIENoZWNrIGZvciBzdWNjZXNzXHJcbiAgICAgICAgaWYgKCFyZXNwb25zZT8uSXNTdWNjZXNzKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdbVGFiRm9ybWlvU2VydmljZV0gUHJvY2Vzc1JlcXVlc3QgZmFpbGVkOicsIHJlc3BvbnNlPy5FcnJvcnMpO1xyXG4gICAgICAgICAgcmV0dXJuIG9mKHJlc3BvbnNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIENBU0UgMTogU1lOQyAtIEhhcyBpbnNlcnRlZElkIGltbWVkaWF0ZWx5IChub3QgbnVsbClcclxuICAgICAgICBpZiAocmVzcG9uc2U/LlJlc3VsdD8uaW5zZXJ0ZWRJZCkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlU3luY09wZXJhdGlvbihyZXNwb25zZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBDQVNFIDI6IEFTWU5DIC0gSGFzIENvcnJlbGF0aW9uSWQgYW5kIGluc2VydGVkSWQgaXMgbnVsbFxyXG4gICAgICAgIGVsc2UgaWYgKHJlc3BvbnNlPy5Db3JyZWxhdGlvbklkKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVBc3luY09wZXJhdGlvbihyZXNwb25zZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBDQVNFIDM6IE90aGVyIHJlc3BvbnNlIChyZXR1cm4gYXMtaXMpXHJcbiAgICAgICAgcmV0dXJuIG9mKHJlc3BvbnNlKTtcclxuICAgICAgfSksXHJcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignW1RhYkZvcm1pb1NlcnZpY2VdIFByb2Nlc3NSZXF1ZXN0IGVycm9yOicsIGVycm9yKTtcclxuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIFNZTkMgb3BlcmF0aW9uIC0gZmV0Y2ggZnVsbCByZWNvcmQgaW1tZWRpYXRlbHlcclxuICAgKi9cclxuICBwcml2YXRlIGhhbmRsZVN5bmNPcGVyYXRpb24ocmVzcG9uc2U6IENvbW1vbkFwaVJlc3BvbnNlKTogT2JzZXJ2YWJsZTxDb21tb25BcGlSZXNwb25zZT4ge1xyXG4gICAgY29uc3QgeyBpbnNlcnRlZElkLCBvYmplY3ROYW1lLCBwcmltYXJ5S2V5RmllbGQgfSA9IHJlc3BvbnNlPy5SZXN1bHQgfHwge307XHJcblxyXG4gICAgaWYgKCFvYmplY3ROYW1lIHx8ICFpbnNlcnRlZElkKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUYWJGb3JtaW9TZXJ2aWNlXSBNaXNzaW5nIG9iamVjdE5hbWUgb3IgaW5zZXJ0ZWRJZCBpbiBzeW5jIHJlc3BvbnNlJyk7XHJcbiAgICAgIHJldHVybiBvZihyZXNwb25zZSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcGtGaWVsZCA9IHByaW1hcnlLZXlGaWVsZCB8fCAnSWQnOyAvLyBEZWZhdWx0IHRvICdJZCcgaWYgbm90IHByb3ZpZGVkXHJcblxyXG4gICAgcmV0dXJuIHRoaXMuZmV0Y2hGdWxsUmVjb3JkKG9iamVjdE5hbWUsIGluc2VydGVkSWQsIHBrRmllbGQpLnBpcGUoXHJcbiAgICAgIG1hcCgoZnVsbFJlY29yZCkgPT4gKHtcclxuICAgICAgICAuLi5yZXNwb25zZSxcclxuICAgICAgICBSZXN1bHQ6IGZ1bGxSZWNvcmRcclxuICAgICAgfSkpLFxyXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUYWJGb3JtaW9TZXJ2aWNlXSBGYWlsZWQgdG8gZmV0Y2ggZnVsbCByZWNvcmQ6JywgZXJyb3IpO1xyXG4gICAgICAgIC8vIFJldHVybiBwYXJ0aWFsIHJlc3BvbnNlIGlmIGZldGNoIGZhaWxzXHJcbiAgICAgICAgcmV0dXJuIG9mKHJlc3BvbnNlKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgQVNZTkMgb3BlcmF0aW9uIC0gd2FpdCBmb3IgU2lnbmFsUiBub3RpZmljYXRpb24sIHRoZW4gZmV0Y2ggZnVsbCByZWNvcmRcclxuICAgKi9cclxuICBwcml2YXRlIGhhbmRsZUFzeW5jT3BlcmF0aW9uKHJlc3BvbnNlOiBDb21tb25BcGlSZXNwb25zZSk6IE9ic2VydmFibGU8Q29tbW9uQXBpUmVzcG9uc2U+IHtcclxuICAgIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSByZXNwb25zZT8uQ29ycmVsYXRpb25JZDtcclxuICAgIGNvbnN0IHByaW1hcnlLZXlGaWVsZCA9IHJlc3BvbnNlPy5SZXN1bHQ/LnByaW1hcnlLZXlGaWVsZCB8fCAnSWQnOyAvLyBHZXQgZnJvbSBvcmlnaW5hbCByZXNwb25zZVxyXG5cclxuICAgIGlmICghY29ycmVsYXRpb25JZCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdbVGFiRm9ybWlvU2VydmljZV0gTWlzc2luZyBjb3JyZWxhdGlvbklkIGluIGFzeW5jIHJlc3BvbnNlJyk7XHJcbiAgICAgIHJldHVybiBvZihyZXNwb25zZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gV2FpdCBmb3IgU2lnbmFsUiBub3RpZmljYXRpb24gd2l0aCBtYXRjaGluZyBjb3JyZWxhdGlvbklkXHJcbiAgICByZXR1cm4gdGhpcy5zaWduYWxSU2VydmljZS53YWl0Rm9yT3BlcmF0aW9uKGNvcnJlbGF0aW9uSWQpLnBpcGUoXHJcbiAgICAgIHN3aXRjaE1hcCgobm90aWZpY2F0aW9uKSA9PiB7XHJcbiAgICAgICAgLy8gQ2hlY2sgaWYgb3BlcmF0aW9uIHN1Y2NlZWRlZFxyXG4gICAgICAgIGlmICghbm90aWZpY2F0aW9uLmlzU3VjY2Vzcykge1xyXG4gICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoXHJcbiAgICAgICAgICAgICgpID0+IG5ldyBFcnJvcihub3RpZmljYXRpb24uZXJyb3JNZXNzYWdlIHx8ICdPcGVyYXRpb24gZmFpbGVkJylcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBGZXRjaCBmdWxsIHJlY29yZCB1c2luZyByZWNvcmRJZCBmcm9tIG5vdGlmaWNhdGlvblxyXG4gICAgICAgIHJldHVybiB0aGlzLmZldGNoRnVsbFJlY29yZChub3RpZmljYXRpb24uZW50aXR5TmFtZSwgbm90aWZpY2F0aW9uLnJlY29yZElkLCBwcmltYXJ5S2V5RmllbGQpO1xyXG4gICAgICB9KSxcclxuXHJcbiAgICAgIC8vIEJ1aWxkIG5vcm1hbGl6ZWQgcmVzcG9uc2VcclxuICAgICAgbWFwKChmdWxsUmVjb3JkKSA9PiAoe1xyXG4gICAgICAgIC4uLnJlc3BvbnNlLFxyXG4gICAgICAgIFJlc3VsdDogZnVsbFJlY29yZFxyXG4gICAgICB9KSksXHJcblxyXG4gICAgICAvLyBIYW5kbGUgZXJyb3JzICh0aW1lb3V0LCBmZXRjaCBmYWlsdXJlLCBldGMuKVxyXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgIGlmIChlcnJvci5tZXNzYWdlID09PSAnT3BlcmF0aW9uIHRpbWVkIG91dCcpIHtcclxuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxyXG4gICAgICAgICAgICAoKSA9PlxyXG4gICAgICAgICAgICAgIG5ldyBFcnJvcihcclxuICAgICAgICAgICAgICAgICdPcGVyYXRpb24gdGltZWQgb3V0LiBUaGUgb3BlcmF0aW9uIG1heSBzdGlsbCBjb21wbGV0ZSBpbiB0aGUgYmFja2dyb3VuZC4gUGxlYXNlIHJlZnJlc2ggdG8gc2VlIHRoZSByZXN1bHQuJ1xyXG4gICAgICAgICAgICAgIClcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGZXRjaCBmdWxsIHJlY29yZCBmcm9tIENSVUQgc2VydmljZVxyXG4gICAqIEBwYXJhbSBvYmplY3ROYW1lIC0gRW50aXR5L1RhYmxlIG5hbWVcclxuICAgKiBAcGFyYW0gcmVjb3JkSWQgLSBSZWNvcmQgSUQgdG8gZmV0Y2hcclxuICAgKiBAcGFyYW0gcHJpbWFyeUtleUZpZWxkIC0gUHJpbWFyeSBrZXkgZmllbGQgbmFtZSAoZGVmYXVsdHMgdG8gJ0lkJylcclxuICAgKi9cclxuICBwcml2YXRlIGZldGNoRnVsbFJlY29yZChvYmplY3ROYW1lOiBzdHJpbmcsIHJlY29yZElkOiBzdHJpbmcsIHByaW1hcnlLZXlGaWVsZCA9ICdJZCcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5wb3N0VG9TZXJ2aWNlKFxyXG4gICAgICBBUElTZXJ2aWNlcy5jcnVkU2VydmljZSxcclxuICAgICAgQVBJLlF1ZXJpZXNTZWxlY3QsXHJcbiAgICAgIHtcclxuICAgICAgICBFbnRpdHlOYW1lOiBvYmplY3ROYW1lLFxyXG4gICAgICAgIFJlc3VsdEZpZWxkX0FwcGZpZWxkSWRzOiBbJyonXSxcclxuICAgICAgICB3aGVyZUNsYXVzZToge1xyXG4gICAgICAgICAgZmlsdGVyczogW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgZmllbGROYW1lOiBwcmltYXJ5S2V5RmllbGQsIC8vIFVzZSBkeW5hbWljIHByaW1hcnkga2V5IGZpZWxkXHJcbiAgICAgICAgICAgICAgb3BlcmF0b3I6IFJlbGF0aW9uYWxPcGVyYXRvci5FcXVhbFRvLFxyXG4gICAgICAgICAgICAgIHZhbHVlOiByZWNvcmRJZCxcclxuICAgICAgICAgICAgICB2YWx1ZVR5cGU6IEZpbHRlclZhbHVlVHlwZS5MaXRlcmFsLFxyXG4gICAgICAgICAgICAgIGNvbmp1bmN0aW9uOiBDb25qdWN0aW9uQ2xhdXNlLkFORCxcclxuICAgICAgICAgICAgICBncm91cElkOiAwLFxyXG4gICAgICAgICAgICAgIHNlcXVlbmNlOiAxXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIF1cclxuICAgICAgICB9LFxyXG4gICAgICB9KS5waXBlKFxyXG4gICAgICAgIG1hcCgoc2VsZWN0UmVzcG9uc2U6IENvbW1vbkFwaVJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoc2VsZWN0UmVzcG9uc2U/LlJlc3VsdCAmJiBzZWxlY3RSZXNwb25zZT8uUmVzdWx0Py5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdFJlc3BvbnNlLlJlc3VsdFswXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVjb3JkIG5vdCBmb3VuZCBhZnRlciBvcGVyYXRpb24nKTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmVzIHRoZSBmb3JtSU8gY29tcG9uZW50cyBmb3IgdGhlIGdpdmVuIGFwcE9iamVjdElkIGFuZCB0eXBlLlxyXG4gICAqIEBwYXJhbSBhcHBPYmplY3RJZCAtIFRoZSBJRCBvZiB0aGUgYXBwIG9iamVjdC5cclxuICAgKiBAcGFyYW0gdHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBjb21wb25lbnRzIHRvIHJldHJpZXZlLiBDYW4gYmUgZWl0aGVyICdDb21tb25GaWx0ZXInIG9yICdCdWxrVXBkYXRlJ1xyXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBBZGRpdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHRoZSBBUEkgY2FsbC5cclxuICAgKiBAcmV0dXJucyBUaGUgZm9ybUlPIGNvbXBvbmVudHMgaW4gdGhlIHJlc3BvbnNlIGJvZHkuXHJcbiAgICovXHJcbiAgYnVpbGRGb3JtSU9Db21wb25lbnRzKGFwcE9iamVjdElkOiBzdHJpbmcsIHR5cGU6IEJ1aWxkRm9ybUNvbXBvbmVudFR5cGUsIHBhcmFtcz86IGFueSk6IE9ic2VydmFibGU8Q29tbW9uQXBpUmVzcG9uc2U+IHtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSBnZXRIZWFkZXJzKCk7XHJcbiAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlLmdldChcclxuICAgICAgYCR7QVBJLkJ1aWxkRm9ybUlPQ29tcG9uZW50c30/YXBwT2JqZWN0SWQ9JHthcHBPYmplY3RJZH0mVHlwZT0ke3R5cGV9YCxcclxuICAgICAgcGFyYW1zLFxyXG4gICAgICBoZWFkZXJzXHJcbiAgICApO1xyXG4gIH1cclxufSJdfQ==