@techextensor/tab-core-utility 2.2.187 → 2.2.188
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.
- package/esm2022/index.mjs +5 -1
- package/esm2022/lib/tab-core-utility/app/constants/api-constants.mjs +27 -15
- package/esm2022/lib/tab-core-utility/app/constants/common.mjs +14 -50
- package/esm2022/lib/tab-core-utility/app/constants/storage-constants.mjs +2 -2
- package/esm2022/lib/tab-core-utility/app/crud/tab-crud.service.mjs +38 -49
- package/esm2022/lib/tab-core-utility/app/crud/tab-delete.service.mjs +84 -30
- package/esm2022/lib/tab-core-utility/app/crud/tab-formio.service.mjs +141 -12
- package/esm2022/lib/tab-core-utility/app/crud/tab-get.service.mjs +136 -35
- package/esm2022/lib/tab-core-utility/app/crud/tab-insert.service.mjs +89 -38
- package/esm2022/lib/tab-core-utility/app/crud/tab-update.service.mjs +158 -131
- package/esm2022/lib/tab-core-utility/app/enums/query.enum.mjs +7 -7
- package/esm2022/lib/tab-core-utility/app/helpers/common/app.helpers.mjs +26 -19
- package/esm2022/lib/tab-core-utility/app/helpers/common/dsq.helpers.mjs +9 -11
- package/esm2022/lib/tab-core-utility/app/helpers/common/meta-data.helpers.mjs +13 -13
- package/esm2022/lib/tab-core-utility/app/helpers/common/req-res.helpers.mjs +7 -45
- package/esm2022/lib/tab-core-utility/app/helpers/common/where-clause.helpers.mjs +79 -76
- package/esm2022/lib/tab-core-utility/app/helpers/response.adapter.mjs +38 -0
- package/esm2022/lib/tab-core-utility/app/helpers/screen/grid.helpers.mjs +8 -4
- package/esm2022/lib/tab-core-utility/app/helpers/screen/screen.helpers.mjs +8 -33
- package/esm2022/lib/tab-core-utility/app/interfaces/common.interface.mjs +1 -1
- package/esm2022/lib/tab-core-utility/app/interfaces/signalr.interface.mjs +42 -0
- package/esm2022/lib/tab-core-utility/app/models/api-query.class.mjs +39 -1
- package/esm2022/lib/tab-core-utility/app/models/app-field.model.mjs +36 -7
- package/esm2022/lib/tab-core-utility/app/models/app-object.model.mjs +84 -47
- package/esm2022/lib/tab-core-utility/app/models/app-screen.model.mjs +24 -13
- package/esm2022/lib/tab-core-utility/app/models/data-source-query.model.mjs +57 -23
- package/esm2022/lib/tab-core-utility/app/models/filter.model.mjs +21 -10
- package/esm2022/lib/tab-core-utility/app/models/parameter.model.mjs +12 -6
- package/esm2022/lib/tab-core-utility/app/models/sort.model.mjs +11 -4
- package/esm2022/lib/tab-core-utility/app/utils/json.util.mjs +17 -16
- package/esm2022/lib/tab-core-utility/app/utils/req-res.util.mjs +1 -55
- package/esm2022/lib/tab-core-utility/app/utils/tab-app.util.mjs +1 -164
- package/esm2022/lib/tab-core-utility/core/http-client/api.service.mjs +78 -1
- package/esm2022/lib/tab-core-utility/core/service/signalr/operation-tracker.service.mjs +90 -0
- package/esm2022/lib/tab-core-utility/core/service/signalr/signalr-infrastructure.service.mjs +268 -0
- package/esm2022/lib/tab-core-utility/core/service/signalr/signalr.service.mjs +207 -0
- package/index.d.ts +4 -0
- package/lib/tab-core-utility/app/constants/api-constants.d.ts +15 -12
- package/lib/tab-core-utility/app/constants/common.d.ts +9 -0
- package/lib/tab-core-utility/app/constants/storage-constants.d.ts +1 -1
- package/lib/tab-core-utility/app/crud/tab-crud.service.d.ts +8 -1
- package/lib/tab-core-utility/app/crud/tab-delete.service.d.ts +20 -10
- package/lib/tab-core-utility/app/crud/tab-formio.service.d.ts +33 -6
- package/lib/tab-core-utility/app/crud/tab-get.service.d.ts +45 -3
- package/lib/tab-core-utility/app/crud/tab-insert.service.d.ts +16 -21
- package/lib/tab-core-utility/app/crud/tab-update.service.d.ts +34 -19
- package/lib/tab-core-utility/app/enums/query.enum.d.ts +3 -6
- package/lib/tab-core-utility/app/helpers/common/app.helpers.d.ts +5 -8
- package/lib/tab-core-utility/app/helpers/common/dsq.helpers.d.ts +3 -0
- package/lib/tab-core-utility/app/helpers/common/meta-data.helpers.d.ts +3 -3
- package/lib/tab-core-utility/app/helpers/common/req-res.helpers.d.ts +7 -51
- package/lib/tab-core-utility/app/helpers/common/where-clause.helpers.d.ts +1 -0
- package/lib/tab-core-utility/app/helpers/response.adapter.d.ts +22 -0
- package/lib/tab-core-utility/app/helpers/screen/grid.helpers.d.ts +2 -1
- package/lib/tab-core-utility/app/helpers/screen/screen.helpers.d.ts +1 -0
- package/lib/tab-core-utility/app/interfaces/common.interface.d.ts +51 -2
- package/lib/tab-core-utility/app/interfaces/signalr.interface.d.ts +84 -0
- package/lib/tab-core-utility/app/models/api-query.class.d.ts +54 -9
- package/lib/tab-core-utility/app/models/app-field.model.d.ts +4 -2
- package/lib/tab-core-utility/app/models/app-object.model.d.ts +5 -3
- package/lib/tab-core-utility/app/models/app-screen.model.d.ts +2 -2
- package/lib/tab-core-utility/app/models/data-source-query.model.d.ts +7 -2
- package/lib/tab-core-utility/app/models/filter.model.d.ts +2 -2
- package/lib/tab-core-utility/app/models/parameter.model.d.ts +2 -2
- package/lib/tab-core-utility/app/models/sort.model.d.ts +1 -1
- package/lib/tab-core-utility/app/utils/json.util.d.ts +3 -2
- package/lib/tab-core-utility/app/utils/req-res.util.d.ts +1 -9
- package/lib/tab-core-utility/app/utils/tab-app.util.d.ts +0 -61
- package/lib/tab-core-utility/core/http-client/api.service.d.ts +46 -0
- package/lib/tab-core-utility/core/service/signalr/operation-tracker.service.d.ts +40 -0
- package/lib/tab-core-utility/core/service/signalr/signalr-infrastructure.service.d.ts +73 -0
- package/lib/tab-core-utility/core/service/signalr/signalr.service.d.ts +122 -0
- package/package.json +3 -2
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
import { Injectable, inject } from '@angular/core';
|
|
3
3
|
import { ApiService } from '../../core/http-client/api.service';
|
|
4
4
|
import { DSQHelper } from '../helpers/common/dsq.helpers';
|
|
5
|
+
import { MetadataHelper } from '../helpers/common/meta-data.helpers';
|
|
5
6
|
import { getHeaders } from '../utils/req-res.util';
|
|
6
|
-
import { API } from '../constants/api-constants';
|
|
7
|
-
import {
|
|
7
|
+
import { API, APIServices } from '../constants/api-constants';
|
|
8
|
+
import { CRUDFilter, CRUDPager, CRUDSelectPayload, CRUDSort, CRUDWhereClause } from '../models/api-query.class';
|
|
8
9
|
import { FilterValueType } from '../enums/dsq.enum';
|
|
9
|
-
import { QueryType } from '../enums/query.enum';
|
|
10
10
|
import { AppObjectsConstants, DataSourceQueriesConstants, } from '../constants/app-object-constants';
|
|
11
11
|
import { switchMap } from 'rxjs';
|
|
12
12
|
import * as i0 from "@angular/core";
|
|
@@ -14,15 +14,18 @@ export class TabGetService {
|
|
|
14
14
|
constructor() {
|
|
15
15
|
this.apiService = inject(ApiService);
|
|
16
16
|
this.dsqHelper = inject(DSQHelper);
|
|
17
|
+
this.metadataHelper = inject(MetadataHelper);
|
|
17
18
|
}
|
|
18
19
|
/**
|
|
19
20
|
* Execute RAW DSQ with Name
|
|
21
|
+
* NEW: Uses new backend endpoint and CRUD microservice
|
|
20
22
|
* @param data - Object containing AppObjectName and DSQName
|
|
21
23
|
* @returns Response from the API
|
|
22
24
|
*/
|
|
23
25
|
executeRAWDSQWithName(data, headers) {
|
|
24
26
|
const header = getHeaders(headers);
|
|
25
|
-
|
|
27
|
+
// NEW API: POST /Queries/execute/{objectName}/{dsqName} via CRUD service
|
|
28
|
+
return this.apiService.postToService(APIServices.crudService, `${API.QueriesExecute}/${data.AppObjectName}/${data.DSQName}`, data, header);
|
|
26
29
|
}
|
|
27
30
|
/**
|
|
28
31
|
* Get Record
|
|
@@ -49,17 +52,17 @@ export class TabGetService {
|
|
|
49
52
|
// return null;
|
|
50
53
|
// }
|
|
51
54
|
/**
|
|
52
|
-
* Get History
|
|
55
|
+
* Get History from Kibana microservice
|
|
53
56
|
* @param appObjectId - ID of the application object
|
|
54
57
|
* @param recordIds - Array of record IDs
|
|
55
58
|
* @returns Response from the API
|
|
56
59
|
*/
|
|
57
60
|
getHistory(payload) {
|
|
58
|
-
const appObjectName =
|
|
61
|
+
const appObjectName = this.metadataHelper.getAppObjectByIdOrName(payload.appObjectId)?.ObjectName;
|
|
59
62
|
const headers = getHeaders();
|
|
60
|
-
return this.apiService.
|
|
61
|
-
ObjectName: appObjectName,
|
|
63
|
+
return this.apiService.postToService(APIServices.kibanaService, API.auditGetHistory, {
|
|
62
64
|
RecordIds: payload.recordIds,
|
|
65
|
+
entityName: appObjectName
|
|
63
66
|
}, headers);
|
|
64
67
|
}
|
|
65
68
|
/**
|
|
@@ -73,25 +76,44 @@ export class TabGetService {
|
|
|
73
76
|
}
|
|
74
77
|
/**
|
|
75
78
|
* Executes a select query with optional parameters
|
|
76
|
-
*
|
|
79
|
+
* NEW: Uses new CRUD microservice endpoint with transformed payload
|
|
80
|
+
* @param data - The select query data (old format)
|
|
77
81
|
* @param parameters - Optional parameters to be applied to the query
|
|
82
|
+
* @param additionalConfig - Optional additional configuration
|
|
78
83
|
* @returns Result of the select query execution
|
|
79
84
|
*/
|
|
80
85
|
selectExecutor(data, parameters, additionalConfig) {
|
|
86
|
+
// Prepare query data with parameters and config
|
|
87
|
+
const preparedData = this.prepareSelectQueryData(data, parameters, additionalConfig);
|
|
88
|
+
// Transform to new CRUD API payload format
|
|
89
|
+
const crudPayload = this.transformToCRUDPayload(preparedData);
|
|
90
|
+
// Call new CRUD microservice endpoint
|
|
91
|
+
const headers = getHeaders();
|
|
92
|
+
return this.apiService.postToService(APIServices.crudService, API.QueriesSelect, crudPayload, headers);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Prepares select query data by applying parameters and additional configuration
|
|
96
|
+
* @param data - The select query data
|
|
97
|
+
* @param parameters - Optional parameters to replace in filters
|
|
98
|
+
* @param additionalConfig - Optional additional configuration to merge
|
|
99
|
+
* @returns Prepared APISelectQuery with parameters applied
|
|
100
|
+
*/
|
|
101
|
+
prepareSelectQueryData(data, parameters, additionalConfig) {
|
|
102
|
+
// Initialize WhereClause if parameters provided
|
|
81
103
|
if (parameters && Object.keys(parameters).length) {
|
|
82
|
-
data.WhereClause.
|
|
83
|
-
data.WhereClause.
|
|
104
|
+
data.WhereClause.filterLogic = data.WhereClause.filterLogic || '[]';
|
|
105
|
+
data.WhereClause.filters = data.WhereClause.filters || [];
|
|
84
106
|
data.WhereClause.SQLQuery = data.WhereClause.SQLQuery || '';
|
|
85
107
|
/**
|
|
86
108
|
* Replaces values from parameters if matched and in format of {{key}}.
|
|
87
|
-
* Example: if filter.
|
|
88
|
-
* this._value.parameters.userId is 123, then filter.
|
|
109
|
+
* Example: if filter.value is "{{userId}}" and
|
|
110
|
+
* this._value.parameters.userId is 123, then filter.value will be replaced with
|
|
89
111
|
* "123".
|
|
90
112
|
*/
|
|
91
|
-
data.WhereClause.
|
|
92
|
-
// filter.
|
|
93
|
-
if (filter.
|
|
94
|
-
// filter.
|
|
113
|
+
data.WhereClause.filters.forEach((filter) => {
|
|
114
|
+
// filter.valueType is 1 (literal)
|
|
115
|
+
if (filter.value && filter.valueType == FilterValueType.Literal) {
|
|
116
|
+
// filter.value = filter.value.replace(
|
|
95
117
|
// /{{([^}]+)}}/g,
|
|
96
118
|
// (match: string, key: string) => {
|
|
97
119
|
// const value = parameters[key];
|
|
@@ -101,25 +123,104 @@ export class TabGetService {
|
|
|
101
123
|
}
|
|
102
124
|
// if valueType = 2 (Parameters)
|
|
103
125
|
// then we need to replace the value with parameters and change the valueType to 1 (Literal)
|
|
104
|
-
else if (filter.
|
|
105
|
-
filter.
|
|
126
|
+
else if (filter.valueType == FilterValueType.Parameter) {
|
|
127
|
+
filter.value = filter.value.replace(/([^}]+)/g, (match, key) => {
|
|
106
128
|
const value = parameters[key];
|
|
107
129
|
return value !== undefined ? value : null;
|
|
108
130
|
});
|
|
109
|
-
filter.
|
|
131
|
+
filter.valueType = FilterValueType.Literal;
|
|
110
132
|
}
|
|
111
133
|
});
|
|
112
|
-
(data?.WhereClause?.
|
|
113
|
-
if (element.
|
|
114
|
-
parameters[element.
|
|
115
|
-
element.
|
|
134
|
+
(data?.WhereClause?.filters || []).forEach((element) => {
|
|
135
|
+
if (element.valueType === FilterValueType.Parameter &&
|
|
136
|
+
parameters[element.fieldName]) {
|
|
137
|
+
element.value = parameters[element.fieldName];
|
|
116
138
|
}
|
|
117
139
|
});
|
|
118
140
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
141
|
+
return data;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Transforms old APISelectQuery format to new CRUD API format
|
|
145
|
+
* @param apiSelectQuery - The old format select query
|
|
146
|
+
* @returns CRUDSelectPayload - The new format payload
|
|
147
|
+
*/
|
|
148
|
+
transformToCRUDPayload(apiSelectQuery) {
|
|
149
|
+
const payload = new CRUDSelectPayload();
|
|
150
|
+
// Basic properties transformation
|
|
151
|
+
payload.EntityName = this.getEntityName(apiSelectQuery.QueryObjectID);
|
|
152
|
+
payload.SelectedFields = apiSelectQuery.ResultField_AppfieldIds || [];
|
|
153
|
+
payload.Distinct = apiSelectQuery.Distinct || false;
|
|
154
|
+
// Transform complex properties
|
|
155
|
+
payload.includes = this.transformJoinsToIncludes(apiSelectQuery.Joins);
|
|
156
|
+
payload.Pager = this.transformPager(apiSelectQuery.TopCount);
|
|
157
|
+
payload.whereClause = this.transformWhereClause(apiSelectQuery.WhereClause);
|
|
158
|
+
payload.Sort = this.transformSort(apiSelectQuery.Sort);
|
|
159
|
+
return payload;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Gets entity name from QueryObjectID
|
|
163
|
+
*/
|
|
164
|
+
getEntityName(queryObjectId) {
|
|
165
|
+
const appObject = this.metadataHelper.getAppObjectByIdOrName(queryObjectId);
|
|
166
|
+
return appObject?.ObjectName || queryObjectId;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Transforms Joins to includes array
|
|
170
|
+
*/
|
|
171
|
+
transformJoinsToIncludes(joins) {
|
|
172
|
+
if (!joins || joins.length === 0)
|
|
173
|
+
return undefined;
|
|
174
|
+
return joins.map((join) => join.Relationship?.childDetails?.LookupObject || join);
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Transforms TopCount to Pager object
|
|
178
|
+
*/
|
|
179
|
+
transformPager(topCount) {
|
|
180
|
+
if (!topCount)
|
|
181
|
+
return undefined;
|
|
182
|
+
const pager = new CRUDPager();
|
|
183
|
+
pager.pageNumber = 1;
|
|
184
|
+
pager.pageSize = topCount;
|
|
185
|
+
pager.returnTotalCount = true;
|
|
186
|
+
return pager;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Transforms WhereClause to new format
|
|
190
|
+
*/
|
|
191
|
+
transformWhereClause(whereClause) {
|
|
192
|
+
if (!whereClause?.Filters || whereClause.Filters.length === 0)
|
|
193
|
+
return undefined;
|
|
194
|
+
const crudWhereClause = new CRUDWhereClause();
|
|
195
|
+
crudWhereClause.filters = whereClause.Filters.map((filter) => this.transformFilter(filter));
|
|
196
|
+
return crudWhereClause;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Transforms a single filter to new format
|
|
200
|
+
*/
|
|
201
|
+
transformFilter(filter) {
|
|
202
|
+
const crudFilter = new CRUDFilter();
|
|
203
|
+
crudFilter.fieldName = filter.FieldID;
|
|
204
|
+
crudFilter.operator = filter.RelationalOperator;
|
|
205
|
+
crudFilter.value = filter.Value || filter.value;
|
|
206
|
+
crudFilter.valueType = filter.ValueType;
|
|
207
|
+
crudFilter.conjunction = filter.ConjuctionClause;
|
|
208
|
+
crudFilter.groupId = filter.GroupID;
|
|
209
|
+
crudFilter.sequence = filter.Sequence;
|
|
210
|
+
return crudFilter;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Transforms Sort array to new format
|
|
214
|
+
*/
|
|
215
|
+
transformSort(sorts) {
|
|
216
|
+
if (!sorts || sorts.length === 0)
|
|
217
|
+
return undefined;
|
|
218
|
+
return sorts.map((sort) => {
|
|
219
|
+
const crudSort = new CRUDSort();
|
|
220
|
+
crudSort.FieldName = sort.FieldID;
|
|
221
|
+
crudSort.Direction = sort.SortSequence;
|
|
222
|
+
return crudSort;
|
|
223
|
+
});
|
|
123
224
|
}
|
|
124
225
|
/**
|
|
125
226
|
* Executes a select query by its ID, using the provided parameters.
|
|
@@ -137,15 +238,15 @@ export class TabGetService {
|
|
|
137
238
|
ID: selectQueryId,
|
|
138
239
|
},
|
|
139
240
|
}).pipe(switchMap((res) => {
|
|
140
|
-
if (res.
|
|
241
|
+
if (res.IsSuccess && res.Result.length) {
|
|
141
242
|
const Configuration = JSON.parse(res.Result[0].Configuration || '{}');
|
|
142
|
-
if (Configuration.WhereClause?.
|
|
143
|
-
Configuration.WhereClause.
|
|
243
|
+
if (Configuration.WhereClause?.filters) {
|
|
244
|
+
Configuration.WhereClause.filters = this.removeWhereClauseForEmptyParams(Configuration.WhereClause.filters, parameters || {});
|
|
144
245
|
}
|
|
145
246
|
return this.selectExecutor(Configuration, parameters, additionalConfig);
|
|
146
247
|
}
|
|
147
248
|
else {
|
|
148
|
-
throw new Error(res.Message);
|
|
249
|
+
throw new Error(res.Message || 'Failed to fetch select query configuration.');
|
|
149
250
|
}
|
|
150
251
|
}));
|
|
151
252
|
}
|
|
@@ -180,14 +281,14 @@ export class TabGetService {
|
|
|
180
281
|
// return null;
|
|
181
282
|
// }
|
|
182
283
|
/**
|
|
183
|
-
* Get Search Data
|
|
284
|
+
* Get Search Data from Kibana microservice
|
|
184
285
|
* @param searchQuery - Search Query string
|
|
185
286
|
* @param limit - Limit of search results
|
|
186
287
|
* @returns Response from the API
|
|
187
288
|
*/
|
|
188
289
|
getSearchData(payload, params) {
|
|
189
290
|
const headers = getHeaders();
|
|
190
|
-
return this.apiService.
|
|
291
|
+
return this.apiService.getFromService(APIServices.kibanaService, `${API.globalSearch}?searchQuery=${payload.searchQuery}&limit=${payload.limit}${payload?.appObjectId ? `&appObjectId=${payload.appObjectId}` : ''}`, params, headers);
|
|
191
292
|
}
|
|
192
293
|
/**
|
|
193
294
|
* Executes an HTTP request with the specified method, URL, headers, and body.
|
|
@@ -234,4 +335,4 @@ export class TabGetService {
|
|
|
234
335
|
type: Injectable,
|
|
235
336
|
args: [{ providedIn: 'root' }]
|
|
236
337
|
}], null, null); })();
|
|
237
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLWdldC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9kYXRhLWFjY2Vzcy9zcmMvbGliL3RhYi1jb3JlLXV0aWxpdHkvYXBwL2NydWQvdGFiLWdldC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUV2RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDaEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzFELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXJELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxFQUNMLG1CQUFtQixFQUNuQiwwQkFBMEIsR0FDM0IsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzQyxPQUFPLEVBQWMsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUk3QyxNQUFNLE9BQU8sYUFBYTtJQUQxQjtRQUVtQixlQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hDLGNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7S0FpUGhEO0lBL09DOzs7O09BSUc7SUFDSCxxQkFBcUIsQ0FBQyxJQUFTLEVBQUMsT0FBWTtRQUMxQyxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FDekIsR0FBRyxHQUFHLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUNyRCxJQUFJLEVBQ0osTUFBTSxDQUNQLENBQUM7SUFDTixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFNBQVMsQ0FBQyxNQUFXO1FBQ25CLE1BQU0sT0FBTyxHQUFHLFVBQVUsRUFBRSxDQUFDO1FBQzdCLElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNsRSxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsTUFBTTtJQUNOLHFCQUFxQjtJQUNyQix3Q0FBd0M7SUFDeEMsb0NBQW9DO0lBQ3BDLE1BQU07SUFDTixrQ0FBa0M7SUFDbEMsa0NBQWtDO0lBQ2xDLG1CQUFtQjtJQUNuQiwrRUFBK0U7SUFDL0UsTUFBTTtJQUNOLGlCQUFpQjtJQUNqQixJQUFJO0lBRUo7Ozs7O09BS0c7SUFDSCxVQUFVLENBQUMsT0FBNEI7UUFDckMsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxVQUFVLENBQUM7UUFDcEUsTUFBTSxPQUFPLEdBQUcsVUFBVSxFQUFFLENBQUM7UUFDN0IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUMvQyxVQUFVLEVBQUUsYUFBYTtZQUN6QixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7U0FDN0IsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNkLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsV0FBVyxDQUFDLElBQXVCO1FBQ2pDLE1BQU0sT0FBTyxHQUFHLFVBQVUsRUFBRSxDQUFDO1FBQzdCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGNBQWMsQ0FBQyxJQUFvQixFQUFFLFVBQWdCLEVBQUUsZ0JBQXNCO1FBQzNFLElBQUksVUFBVSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDO1lBQ3BFLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztZQUMxRCxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUM7WUFDNUQ7Ozs7O2VBS0c7WUFDSCxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFXLEVBQUUsRUFBRTtnQkFDL0Msa0NBQWtDO2dCQUNsQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLFNBQVMsSUFBSSxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ2hFLHVDQUF1QztvQkFDdkMsb0JBQW9CO29CQUNwQixzQ0FBc0M7b0JBQ3RDLHFDQUFxQztvQkFDckMsaURBQWlEO29CQUNqRCxNQUFNO29CQUNOLEtBQUs7Z0JBQ1AsQ0FBQztnQkFDRCxnQ0FBZ0M7Z0JBQ2hDLDRGQUE0RjtxQkFDdkYsSUFBSSxNQUFNLENBQUMsU0FBUyxJQUFJLGVBQWUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFDdkQsTUFBTSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FDakMsVUFBVSxFQUNWLENBQUMsS0FBYSxFQUFFLEdBQVcsRUFBRSxFQUFFO3dCQUM3QixNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQzlCLE9BQU8sS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7b0JBQzVDLENBQUMsQ0FDRixDQUFDO29CQUNGLE1BQU0sQ0FBQyxTQUFTLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQztnQkFDN0MsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0gsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFZLEVBQUUsRUFBRTtnQkFDMUQsSUFDRSxPQUFPLENBQUMsU0FBUyxLQUFLLGVBQWUsQ0FBQyxTQUFTO29CQUMvQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUMzQixDQUFDO29CQUNELE9BQU8sQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDOUMsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELElBQUcsZ0JBQWdCLElBQUksT0FBTyxnQkFBZ0IsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM1RCxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxHQUFHLGdCQUFnQixFQUFFLENBQUM7UUFDMUMsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQWtDLENBQUM7SUFDOUYsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxzQkFBc0IsQ0FBQyxhQUFxQixFQUFFLFVBQWdCLEVBQUUsZ0JBQXNCO1FBQ3BGLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDO1lBQ2hDLGFBQWEsRUFBRSxtQkFBbUIsQ0FBQyxZQUFZO1lBQy9DLE9BQU8sRUFBRSwwQkFBMEIsQ0FBQyxtQkFBbUI7WUFDdkQsU0FBUyxFQUFFO2dCQUNULEVBQUUsRUFBRSxhQUFhO2FBQ2xCO1NBQ0YsQ0FBQyxDQUFDLElBQUksQ0FDTCxTQUFTLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUNyQixJQUFJLEdBQUcsQ0FBQyxVQUFVLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQzdCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLENBQUM7Z0JBQ3RFLElBQUksYUFBYSxDQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsQ0FBQztvQkFDdkMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLCtCQUErQixDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDaEksQ0FBQztnQkFDRCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzFFLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMvQixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFDRCwrQkFBK0IsQ0FBQyxPQUFjLEVBQUUsVUFBK0I7UUFDN0UsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBVyxFQUFFLEVBQUU7WUFDbEMsSUFBSSxNQUFNLENBQUMsU0FBUyxLQUFLLGVBQWUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDakQsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztnQkFDbkMsSUFBSSxhQUFhLElBQUksVUFBVSxJQUFJLFVBQVUsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztvQkFDbEUsT0FBTyxLQUFLLENBQUMsQ0FBQyxnQkFBZ0I7Z0JBQ2xDLENBQUM7WUFDTCxDQUFDO1lBQ0QsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxTQUFTLEtBQUssZUFBZSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUMvRixPQUFPLEtBQUssQ0FBQyxDQUFDLGdCQUFnQjtZQUNsQyxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUMsQ0FBQyxjQUFjO1FBQy9CLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU07SUFDTiw0Q0FBNEM7SUFDNUMseUNBQXlDO0lBQ3pDLG9DQUFvQztJQUNwQyxNQUFNO0lBQ04saUVBQWlFO0lBQ2pFLGtDQUFrQztJQUNsQyxtQkFBbUI7SUFDbkIsbUNBQW1DO0lBQ25DLG1DQUFtQztJQUNuQyx3Q0FBd0M7SUFDeEMsZ0JBQWdCO0lBQ2hCLFNBQVM7SUFDVCxNQUFNO0lBQ04saUJBQWlCO0lBQ2pCLElBQUk7SUFFSjs7Ozs7T0FLRztJQUNILGFBQWEsQ0FBQyxPQUEwQixFQUFFLE1BQVk7UUFDcEQsTUFBTSxPQUFPLEdBQUcsVUFBVSxFQUFFLENBQUM7UUFDN0IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FDeEIsR0FBRyxHQUFHLENBQUMsTUFBTSxnQkFBZ0IsT0FBTyxDQUFDLFdBQVcsVUFBVSxPQUFPLENBQUMsS0FBSyxHQUFHLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUM3SSxNQUFNLEVBQ04sT0FBTyxDQUNSLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxrQkFBa0IsQ0FBQyxPQUFrQztRQUNuRCxNQUFNLE9BQU8sR0FBRztZQUNkLEdBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQztZQUMzQixvQkFBb0IsRUFBRSxNQUFNO1lBQzVCLGFBQWEsRUFBRSxNQUFNO1lBQ3JCLHFCQUFxQixFQUFFLE1BQU07U0FDOUIsQ0FBQztRQUNGLElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUM1QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7YUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksTUFBTSxFQUFFLENBQUM7WUFDcEMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQy9FLENBQUM7YUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksS0FBSyxFQUFFLENBQUM7WUFDbkMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzlFLENBQUM7YUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksUUFBUSxFQUFFLENBQUM7WUFDdEMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNuRSxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxtQkFBbUIsQ0FBQyxtQkFBMkI7UUFDN0MsTUFBTSxPQUFPLEdBQUcsVUFBVSxFQUFFLENBQUM7UUFDN0IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FDeEIsR0FBRyxHQUFHLENBQUMsbUJBQW1CLFlBQVksbUJBQW1CLEVBQUUsRUFDM0QsU0FBUyxFQUNULE9BQU8sQ0FDUixDQUFDO0lBQ0osQ0FBQzs4RUFsUFUsYUFBYTt1RUFBYixhQUFhLFdBQWIsYUFBYSxtQkFEQSxNQUFNOztpRkFDbkIsYUFBYTtjQUR6QixVQUFVO2VBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xyXG5cclxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFwaVNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL2h0dHAtY2xpZW50L2FwaS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRFNRSGVscGVyIH0gZnJvbSAnLi4vaGVscGVycy9jb21tb24vZHNxLmhlbHBlcnMnO1xyXG5pbXBvcnQgeyBnZXRIZWFkZXJzIH0gZnJvbSAnLi4vdXRpbHMvcmVxLXJlcy51dGlsJztcclxuaW1wb3J0IHsgQVBJIH0gZnJvbSAnLi4vY29uc3RhbnRzL2FwaS1jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBnZXRBcHBPYmplY3QgfSBmcm9tICcuLi91dGlscy90YWItYXBwLnV0aWwnO1xyXG5pbXBvcnQgeyBBUElTZWxlY3RRdWVyeSB9IGZyb20gJy4uL21vZGVscy9hcGktcXVlcnkuY2xhc3MnO1xyXG5pbXBvcnQgeyBGaWx0ZXJWYWx1ZVR5cGUgfSBmcm9tICcuLi9lbnVtcy9kc3EuZW51bSc7XHJcbmltcG9ydCB7IFF1ZXJ5VHlwZSB9IGZyb20gJy4uL2VudW1zL3F1ZXJ5LmVudW0nO1xyXG5pbXBvcnQge1xyXG4gIEFwcE9iamVjdHNDb25zdGFudHMsXHJcbiAgRGF0YVNvdXJjZVF1ZXJpZXNDb25zdGFudHMsXHJcbn0gZnJvbSAnLi4vY29uc3RhbnRzL2FwcC1vYmplY3QtY29uc3RhbnRzJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IENvbW1vbkFwaVJlc3BvbnNlLCBIdHRwRXhlY3V0ZVJlcXVlc3RQYXlsb2FkLCBJbXByb3REYXRhUGF5bG9hZCwgUmNvcmRIaXN0b3J5UGF5bG9hZCwgU2VhcmNoRGF0YVBheWxvYWQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NvbW1vbi5pbnRlcmZhY2UnO1xyXG5cclxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcclxuZXhwb3J0IGNsYXNzIFRhYkdldFNlcnZpY2Uge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYXBpU2VydmljZSA9IGluamVjdChBcGlTZXJ2aWNlKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRzcUhlbHBlciA9IGluamVjdChEU1FIZWxwZXIpO1xyXG5cclxuICAvKipcclxuICAgKiBFeGVjdXRlIFJBVyBEU1Egd2l0aCBOYW1lXHJcbiAgICogQHBhcmFtIGRhdGEgLSBPYmplY3QgY29udGFpbmluZyBBcHBPYmplY3ROYW1lIGFuZCBEU1FOYW1lXHJcbiAgICogQHJldHVybnMgUmVzcG9uc2UgZnJvbSB0aGUgQVBJXHJcbiAgICovXHJcbiAgZXhlY3V0ZVJBV0RTUVdpdGhOYW1lKGRhdGE6IGFueSxoZWFkZXJzPzphbnkpOiBhbnkge1xyXG4gICAgY29uc3QgaGVhZGVyID0gZ2V0SGVhZGVycyhoZWFkZXJzKTtcclxuICAgICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5wb3N0KFxyXG4gICAgICAgIGAke0FQSS5nZXREU1F9LyR7ZGF0YS5BcHBPYmplY3ROYW1lfS8ke2RhdGEuRFNRTmFtZX1gLFxyXG4gICAgICAgIGRhdGEsXHJcbiAgICAgICAgaGVhZGVyXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgUmVjb3JkXHJcbiAgICogQHBhcmFtIHBhcmFtcyAtIFBhcmFtZXRlcnMgZm9yIHRoZSByZXF1ZXN0XHJcbiAgICogQHJldHVybnMgUmVzcG9uc2UgZnJvbSB0aGUgQVBJXHJcbiAgICovXHJcbiAgZ2V0UmVjb3JkKHBhcmFtczogYW55KTogYW55IHtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSBnZXRIZWFkZXJzKCk7XHJcbiAgICBpZiAoaGVhZGVycykge1xyXG4gICAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlLmdldChgJHtBUEkuZ2V0cmVjb3JkfWAsIHBhcmFtcywgaGVhZGVycyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vIC8qKlxyXG4gIC8vICAqIEV4ZWN1dGUgUmF3IFNRTFxyXG4gIC8vICAqIEBwYXJhbSBkYXRhIC0gRGF0YSBmb3IgdGhlIHJlcXVlc3RcclxuICAvLyAgKiBAcmV0dXJucyBSZXNwb25zZSBmcm9tIHRoZSBBUElcclxuICAvLyAgKi9cclxuICAvLyBleGVjdXRlUmF3U3FsKGRhdGE6IGFueSk6IGFueSB7XHJcbiAgLy8gICBjb25zdCBoZWFkZXJzID0gZ2V0SGVhZGVycygpO1xyXG4gIC8vICAgaWYgKGhlYWRlcnMpIHtcclxuICAvLyAgICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5wb3N0KGAke0FQSS5yYXdTUUx9P3F1ZXJ5PSR7ZGF0YX1gLCAnJywgaGVhZGVycyk7XHJcbiAgLy8gICB9XHJcbiAgLy8gICByZXR1cm4gbnVsbDtcclxuICAvLyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBIaXN0b3J5XHJcbiAgICogQHBhcmFtIGFwcE9iamVjdElkIC0gSUQgb2YgdGhlIGFwcGxpY2F0aW9uIG9iamVjdFxyXG4gICAqIEBwYXJhbSByZWNvcmRJZHMgLSBBcnJheSBvZiByZWNvcmQgSURzXHJcbiAgICogQHJldHVybnMgUmVzcG9uc2UgZnJvbSB0aGUgQVBJXHJcbiAgICovXHJcbiAgZ2V0SGlzdG9yeShwYXlsb2FkOiBSY29yZEhpc3RvcnlQYXlsb2FkKTogT2JzZXJ2YWJsZTxDb21tb25BcGlSZXNwb25zZT4ge1xyXG4gICAgY29uc3QgYXBwT2JqZWN0TmFtZSA9IGdldEFwcE9iamVjdChwYXlsb2FkLmFwcE9iamVjdElkKT8uT2JqZWN0TmFtZTtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSBnZXRIZWFkZXJzKCk7XHJcbiAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlLnBvc3QoYCR7QVBJLmdldEhpc3Rvcnl9YCwge1xyXG4gICAgICBPYmplY3ROYW1lOiBhcHBPYmplY3ROYW1lLFxyXG4gICAgICBSZWNvcmRJZHM6IHBheWxvYWQucmVjb3JkSWRzLFxyXG4gICAgfSwgaGVhZGVycyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQTUpBWSBJbXBvcnRcclxuICAgKiBAcGFyYW0gZGF0YSAtIERhdGEgZm9yIFBNSkFZIGltcG9ydFxyXG4gICAqIEByZXR1cm5zIFJlc3BvbnNlIGZyb20gdGhlIEFQSVxyXG4gICAqL1xyXG4gIHBtamF5SW1wb3J0KGRhdGE6IEltcHJvdERhdGFQYXlsb2FkKTogYW55IHtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSBnZXRIZWFkZXJzKCk7XHJcbiAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlLnBvc3QoYCR7QVBJLnBtamF5SW1wb3J0fWAsIGRhdGEsIGhlYWRlcnMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXhlY3V0ZXMgYSBzZWxlY3QgcXVlcnkgd2l0aCBvcHRpb25hbCBwYXJhbWV0ZXJzXHJcbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgc2VsZWN0IHF1ZXJ5IGRhdGFcclxuICAgKiBAcGFyYW0gcGFyYW1ldGVycyAtIE9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gYmUgYXBwbGllZCB0byB0aGUgcXVlcnlcclxuICAgKiBAcmV0dXJucyBSZXN1bHQgb2YgdGhlIHNlbGVjdCBxdWVyeSBleGVjdXRpb25cclxuICAgKi9cclxuICBzZWxlY3RFeGVjdXRvcihkYXRhOiBBUElTZWxlY3RRdWVyeSwgcGFyYW1ldGVycz86IGFueSwgYWRkaXRpb25hbENvbmZpZz86IGFueSk6IE9ic2VydmFibGU8Q29tbW9uQXBpUmVzcG9uc2U+IHtcclxuICAgIGlmIChwYXJhbWV0ZXJzICYmIE9iamVjdC5rZXlzKHBhcmFtZXRlcnMpLmxlbmd0aCkge1xyXG4gICAgICBkYXRhLldoZXJlQ2xhdXNlLkZpbHRlckxvZ2ljID0gZGF0YS5XaGVyZUNsYXVzZS5GaWx0ZXJMb2dpYyB8fCAnW10nO1xyXG4gICAgICBkYXRhLldoZXJlQ2xhdXNlLkZpbHRlcnMgPSBkYXRhLldoZXJlQ2xhdXNlLkZpbHRlcnMgfHwgW107XHJcbiAgICAgIGRhdGEuV2hlcmVDbGF1c2UuU1FMUXVlcnkgPSBkYXRhLldoZXJlQ2xhdXNlLlNRTFF1ZXJ5IHx8ICcnO1xyXG4gICAgICAvKipcclxuICAgICAgICogUmVwbGFjZXMgdmFsdWVzIGZyb20gcGFyYW1ldGVycyBpZiBtYXRjaGVkIGFuZCBpbiBmb3JtYXQgb2Yge3trZXl9fS5cclxuICAgICAgICogRXhhbXBsZTogaWYgZmlsdGVyLlZhbHVlIGlzIFwie3t1c2VySWR9fVwiIGFuZFxyXG4gICAgICAgKiB0aGlzLl92YWx1ZS5wYXJhbWV0ZXJzLnVzZXJJZCBpcyAxMjMsIHRoZW4gZmlsdGVyLlZhbHVlIHdpbGwgYmUgcmVwbGFjZWQgd2l0aFxyXG4gICAgICAgKiBcIjEyM1wiLlxyXG4gICAgICAgKi9cclxuICAgICAgZGF0YS5XaGVyZUNsYXVzZS5GaWx0ZXJzLmZvckVhY2goKGZpbHRlcjogYW55KSA9PiB7XHJcbiAgICAgICAgLy8gZmlsdGVyLlZhbHVlVHlwZSBpcyAxIChsaXRlcmFsKVxyXG4gICAgICAgIGlmIChmaWx0ZXIuVmFsdWUgJiYgZmlsdGVyLlZhbHVlVHlwZSA9PSBGaWx0ZXJWYWx1ZVR5cGUuTGl0ZXJhbCkge1xyXG4gICAgICAgICAgLy8gZmlsdGVyLlZhbHVlID0gZmlsdGVyLlZhbHVlLnJlcGxhY2UoXHJcbiAgICAgICAgICAvLyAgIC97eyhbXn1dKyl9fS9nLFxyXG4gICAgICAgICAgLy8gICAobWF0Y2g6IHN0cmluZywga2V5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIC8vICAgICBjb25zdCB2YWx1ZSA9IHBhcmFtZXRlcnNba2V5XTtcclxuICAgICAgICAgIC8vICAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDogbnVsbDtcclxuICAgICAgICAgIC8vICAgfVxyXG4gICAgICAgICAgLy8gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYgdmFsdWVUeXBlID0gMiAoUGFyYW1ldGVycylcclxuICAgICAgICAvLyB0aGVuIHdlIG5lZWQgdG8gcmVwbGFjZSB0aGUgdmFsdWUgd2l0aCBwYXJhbWV0ZXJzIGFuZCBjaGFuZ2UgdGhlIHZhbHVlVHlwZSB0byAxIChMaXRlcmFsKVxyXG4gICAgICAgIGVsc2UgaWYgKGZpbHRlci5WYWx1ZVR5cGUgPT0gRmlsdGVyVmFsdWVUeXBlLlBhcmFtZXRlcikge1xyXG4gICAgICAgICAgZmlsdGVyLlZhbHVlID0gZmlsdGVyLlZhbHVlLnJlcGxhY2UoXHJcbiAgICAgICAgICAgIC8oW159XSspL2csXHJcbiAgICAgICAgICAgIChtYXRjaDogc3RyaW5nLCBrZXk6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFyYW1ldGVyc1trZXldO1xyXG4gICAgICAgICAgICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgZmlsdGVyLlZhbHVlVHlwZSA9IEZpbHRlclZhbHVlVHlwZS5MaXRlcmFsO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIChkYXRhPy5XaGVyZUNsYXVzZT8uRmlsdGVycyB8fCBbXSkuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgZWxlbWVudC5WYWx1ZVR5cGUgPT09IEZpbHRlclZhbHVlVHlwZS5QYXJhbWV0ZXIgJiZcclxuICAgICAgICAgIHBhcmFtZXRlcnNbZWxlbWVudC5GaWVsZElEXVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgZWxlbWVudC5WYWx1ZSA9IHBhcmFtZXRlcnNbZWxlbWVudC5GaWVsZElEXTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmKGFkZGl0aW9uYWxDb25maWcgJiYgdHlwZW9mIGFkZGl0aW9uYWxDb25maWcgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgIGRhdGEgPSB7IC4uLmRhdGEsIC4uLmFkZGl0aW9uYWxDb25maWcgfTsgIFxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmRzcUhlbHBlci5leGVjdXRlUXVlcnkoZGF0YSwgUXVlcnlUeXBlLlNlbGVjdCkgYXMgT2JzZXJ2YWJsZTxDb21tb25BcGlSZXNwb25zZT47XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFeGVjdXRlcyBhIHNlbGVjdCBxdWVyeSBieSBpdHMgSUQsIHVzaW5nIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHNlbGVjdFF1ZXJ5SWQgLSBUaGUgSUQgb2YgdGhlIHNlbGVjdCBxdWVyeSB0byBiZSBleGVjdXRlZC5cclxuICAgKiBAcGFyYW0gcGFyYW1ldGVycyAtIE9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gYmUgYXBwbGllZCB0byB0aGUgcXVlcnkuXHJcbiAgICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGUgc2VsZWN0IHF1ZXJ5IGV4ZWN1dGlvbi5cclxuICAgKiBAdGhyb3dzIEFuIGVycm9yIGlmIHRoZSBBUEkgcmVzcG9uc2Ugc3RhdHVzIGNvZGUgaXMgbm90ICcyMDAnLlxyXG4gICAqL1xyXG4gIGV4ZWN1dGVTZWxlY3RRdWVyeUJ5SWQoc2VsZWN0UXVlcnlJZDogc3RyaW5nLCBwYXJhbWV0ZXJzPzogYW55LCBhZGRpdGlvbmFsQ29uZmlnPzogYW55KTogT2JzZXJ2YWJsZTxDb21tb25BcGlSZXNwb25zZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVJBV0RTUVdpdGhOYW1lKHtcclxuICAgICAgQXBwT2JqZWN0TmFtZTogQXBwT2JqZWN0c0NvbnN0YW50cy5UQUJEX1F1ZXJpZXMsXHJcbiAgICAgIERTUU5hbWU6IERhdGFTb3VyY2VRdWVyaWVzQ29uc3RhbnRzLkRldGFpbF9UQUJEX1F1ZXJpZXMsXHJcbiAgICAgIFJlcXRva2Vuczoge1xyXG4gICAgICAgIElEOiBzZWxlY3RRdWVyeUlkLFxyXG4gICAgICB9LFxyXG4gICAgfSkucGlwZShcclxuICAgICAgc3dpdGNoTWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMuU3RhdHVzQ29kZSA9PT0gJzIwMCcpIHtcclxuICAgICAgICAgIGNvbnN0IENvbmZpZ3VyYXRpb24gPSBKU09OLnBhcnNlKHJlcy5SZXN1bHRbMF0uQ29uZmlndXJhdGlvbiB8fCAne30nKTtcclxuICAgICAgICAgIGlmIChDb25maWd1cmF0aW9uLldoZXJlQ2xhdXNlPy5GaWx0ZXJzKSB7XHJcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24uV2hlcmVDbGF1c2UuRmlsdGVycyA9IHRoaXMucmVtb3ZlV2hlcmVDbGF1c2VGb3JFbXB0eVBhcmFtcyhDb25maWd1cmF0aW9uLldoZXJlQ2xhdXNlLkZpbHRlcnMsIHBhcmFtZXRlcnMgfHwge30pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0RXhlY3V0b3IoQ29uZmlndXJhdGlvbiwgcGFyYW1ldGVycywgYWRkaXRpb25hbENvbmZpZyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihyZXMuTWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcbiAgcmVtb3ZlV2hlcmVDbGF1c2VGb3JFbXB0eVBhcmFtcyhmaWx0ZXJzOiBhbnlbXSwgcGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgYW55Pik6IGFueVtdIHtcclxuICAgIHJldHVybiBmaWx0ZXJzLmZpbHRlcigoZmlsdGVyOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoZmlsdGVyLlZhbHVlVHlwZSA9PT0gRmlsdGVyVmFsdWVUeXBlLlBhcmFtZXRlcikge1xyXG4gICAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJOYW1lID0gZmlsdGVyLlZhbHVlO1xyXG4gICAgICAgICAgICBpZiAocGFyYW1ldGVyTmFtZSBpbiBwYXJhbWV0ZXJzICYmIHBhcmFtZXRlcnNbcGFyYW1ldGVyTmFtZV0gPT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIFJlbW92ZSBmaWx0ZXJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoT2JqZWN0LmtleXMocGFyYW1ldGVycyB8fCB7fSkubGVuZ3RoID09PSAwICYmIGZpbHRlci5WYWx1ZVR5cGUgPT09IEZpbHRlclZhbHVlVHlwZS5QYXJhbWV0ZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBSZW1vdmUgZmlsdGVyXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlOyAvLyBLZWVwIGZpbHRlclxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIFxyXG4gIC8vIC8qKlxyXG4gIC8vICAqIEdldCBSZXNvdXJjZSBMYW5ndWFnZSBCeSBMYW5ndWFnZSBDb2RlXHJcbiAgLy8gICogQHBhcmFtIGxhbmd1YWdlQ29kZSAtIExhbmd1YWdlIENvZGVcclxuICAvLyAgKiBAcmV0dXJucyBSZXNwb25zZSBmcm9tIHRoZSBBUElcclxuICAvLyAgKi9cclxuICAvLyBnZXRSZXNvdXJjZUxhbmd1YWdlQnlMYW5ndWFnZUNvZGUobGFuZ3VhZ2VDb2RlOiBudW1iZXIpOiBhbnkge1xyXG4gIC8vICAgY29uc3QgaGVhZGVycyA9IGdldEhlYWRlcnMoKTtcclxuICAvLyAgIGlmIChoZWFkZXJzKSB7XHJcbiAgLy8gICAgIHJldHVybiB0aGlzLmFwaVNlcnZpY2UucG9zdChcclxuICAvLyAgICAgICBgJHtBUEkubGFuZ3VhZ2VSZXNvdXJjZX1gLFxyXG4gIC8vICAgICAgIHsgTGFuZ3VhZ2VDb2RlOiBsYW5ndWFnZUNvZGUgfSxcclxuICAvLyAgICAgICBoZWFkZXJzXHJcbiAgLy8gICAgICk7XHJcbiAgLy8gICB9XHJcbiAgLy8gICByZXR1cm4gbnVsbDtcclxuICAvLyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBTZWFyY2ggRGF0YVxyXG4gICAqIEBwYXJhbSBzZWFyY2hRdWVyeSAtIFNlYXJjaCBRdWVyeSBzdHJpbmdcclxuICAgKiBAcGFyYW0gbGltaXQgLSBMaW1pdCBvZiBzZWFyY2ggcmVzdWx0c1xyXG4gICAqIEByZXR1cm5zIFJlc3BvbnNlIGZyb20gdGhlIEFQSVxyXG4gICAqL1xyXG4gIGdldFNlYXJjaERhdGEocGF5bG9hZDogU2VhcmNoRGF0YVBheWxvYWQsIHBhcmFtcz86IGFueSk6IE9ic2VydmFibGU8Q29tbW9uQXBpUmVzcG9uc2U+IHtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSBnZXRIZWFkZXJzKCk7XHJcbiAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlLmdldChcclxuICAgICAgYCR7QVBJLnNlYXJjaH0/c2VhcmNoUXVlcnk9JHtwYXlsb2FkLnNlYXJjaFF1ZXJ5fSZsaW1pdD0ke3BheWxvYWQubGltaXR9JHtwYXlsb2FkPy5hcHBPYmplY3RJZCA/IGAmYXBwT2JqZWN0SWQ9JHtwYXlsb2FkLmFwcE9iamVjdElkfWAgOiAnJ31gLFxyXG4gICAgICBwYXJhbXMsXHJcbiAgICAgIGhlYWRlcnNcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFeGVjdXRlcyBhbiBIVFRQIHJlcXVlc3Qgd2l0aCB0aGUgc3BlY2lmaWVkIG1ldGhvZCwgVVJMLCBoZWFkZXJzLCBhbmQgYm9keS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBmdWxsVXJsIC1UaGUgZnVsbCBVUkwgb2YgdGhlIHJlcXVlc3QgY29udGFpbmluZyB0aGUgcXVlcnkgcGFyYW1ldGVycy5cclxuICAgKiBAcGFyYW0gbWV0aG9kIC0gVGhlIEhUVFAgbWV0aG9kIHRvIGJlIHVzZWQgKCdHRVQnLCAnUE9TVCcsICdQVVQnLCAnREVMRVRFJykuXHJcbiAgICogQHBhcmFtIGhlYWRlcnMgLSBUaGUgaGVhZGVycyB0byBpbmNsdWRlIGluIHRoZSByZXF1ZXN0LlxyXG4gICAqIEBwYXJhbSBib2R5IC0gVGhlIGJvZHkgY29udGVudCBmb3IgbWV0aG9kcyBsaWtlIFBPU1QgYW5kIFBVVC5cclxuICAgKiBAcmV0dXJucyBUaGUgQVBJIHJlc3BvbnNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlcXVlc3QuXHJcbiAgICovXHJcbiAgZXhlY3V0ZUh0dHBSZXF1ZXN0KHBheWxvYWQ6IEh0dHBFeGVjdXRlUmVxdWVzdFBheWxvYWQpOiBhbnkge1xyXG4gICAgY29uc3QgaGVhZGVycyA9IHtcclxuICAgICAgLi4uKHBheWxvYWQ/LmhlYWRlcnMgfHwge30pLFxyXG4gICAgICAnWC1Ta2lwLUludGVyY2VwdG9yJzogJ3RydWUnLFxyXG4gICAgICAnWC1Ta2lwLUF1dGgnOiAndHJ1ZScsXHJcbiAgICAgICdYLVRyYWNrLUFQSS1EZXRhaWxzJzogJ3RydWUnLFxyXG4gICAgfTtcclxuICAgIGlmIChwYXlsb2FkLm1ldGhvZCA9PSAnR0VUJykge1xyXG4gICAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlLmdldEJ5VXJsKHBheWxvYWQuZnVsbFVybCwgeyBoZWFkZXJzIH0pO1xyXG4gICAgfSBlbHNlIGlmIChwYXlsb2FkLm1ldGhvZCA9PSAnUE9TVCcpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5wb3N0QnlVcmwocGF5bG9hZC5mdWxsVXJsLCBwYXlsb2FkLmJvZHksIHsgaGVhZGVycyB9KTtcclxuICAgIH0gZWxzZSBpZiAocGF5bG9hZC5tZXRob2QgPT0gJ1BVVCcpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5wdXRCeVVybChwYXlsb2FkLmZ1bGxVcmwsIHBheWxvYWQuYm9keSwgeyBoZWFkZXJzIH0pO1xyXG4gICAgfSBlbHNlIGlmIChwYXlsb2FkLm1ldGhvZCA9PSAnREVMRVRFJykge1xyXG4gICAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlLmRlbGV0ZUJ5VXJsKHBheWxvYWQuZnVsbFVybCwgeyBoZWFkZXJzIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGVzIGFuIEhUVFAgUmVxdWVzdCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgRGF0YVNvdXJjZVF1ZXJ5IG5hbWVcclxuICAgKiBAcGFyYW0gUXVlcnlOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIERhdGFTb3VyY2VRdWVyeVxyXG4gICAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIGdlbmVyYXRlZCBIVFRQIHJlcXVlc3RcclxuICAgKi9cclxuICBnZW5lcmF0ZUh0dHBSZXF1ZXN0KGRhdGFTb3VyY2VRdWVyeU5hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8Q29tbW9uQXBpUmVzcG9uc2U+IHtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSBnZXRIZWFkZXJzKCk7XHJcbiAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlLmdldChcclxuICAgICAgYCR7QVBJLkdlbmVyYXRlSHR0cFJlcXVlc3R9P2RzcU5hbWU9JHtkYXRhU291cmNlUXVlcnlOYW1lfWAsXHJcbiAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgaGVhZGVyc1xyXG4gICAgKTtcclxuICB9XHJcbn1cclxuIl19
|
|
338
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLWdldC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9kYXRhLWFjY2Vzcy9zcmMvbGliL3RhYi1jb3JlLXV0aWxpdHkvYXBwL2NydWQvdGFiLWdldC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUV2RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDaEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzFELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBQWtCLFVBQVUsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2hJLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLDBCQUEwQixHQUMzQixNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFBYyxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBSTdDLE1BQU0sT0FBTyxhQUFhO0lBRDFCO1FBRW1CLGVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEMsY0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5QixtQkFBYyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztLQWlYMUQ7SUEvV0M7Ozs7O09BS0c7SUFDSCxxQkFBcUIsQ0FBQyxJQUFT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dUVBQWIsYUFBYSxXQUFiLGFBQWEsbUJBREEsTUFBTTs7aUZBQ25CLGFBQWE7Y0FEekIsVUFBVTtlQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cclxuXHJcbmltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9odHRwLWNsaWVudC9hcGkuc2VydmljZSc7XHJcbmltcG9ydCB7IERTUUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcnMvY29tbW9uL2RzcS5oZWxwZXJzJztcclxuaW1wb3J0IHsgTWV0YWRhdGFIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJzL2NvbW1vbi9tZXRhLWRhdGEuaGVscGVycyc7XHJcbmltcG9ydCB7IGdldEhlYWRlcnMgfSBmcm9tICcuLi91dGlscy9yZXEtcmVzLnV0aWwnO1xyXG5pbXBvcnQgeyBBUEksIEFQSVNlcnZpY2VzIH0gZnJvbSAnLi4vY29uc3RhbnRzL2FwaS1jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBBUElTZWxlY3RRdWVyeSwgQ1JVREZpbHRlciwgQ1JVRFBhZ2VyLCBDUlVEU2VsZWN0UGF5bG9hZCwgQ1JVRFNvcnQsIENSVURXaGVyZUNsYXVzZSB9IGZyb20gJy4uL21vZGVscy9hcGktcXVlcnkuY2xhc3MnO1xyXG5pbXBvcnQgeyBGaWx0ZXJWYWx1ZVR5cGUgfSBmcm9tICcuLi9lbnVtcy9kc3EuZW51bSc7XHJcbmltcG9ydCB7XHJcbiAgQXBwT2JqZWN0c0NvbnN0YW50cyxcclxuICBEYXRhU291cmNlUXVlcmllc0NvbnN0YW50cyxcclxufSBmcm9tICcuLi9jb25zdGFudHMvYXBwLW9iamVjdC1jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQ29tbW9uQXBpUmVzcG9uc2UsIEh0dHBFeGVjdXRlUmVxdWVzdFBheWxvYWQsIEltcHJvdERhdGFQYXlsb2FkLCBSY29yZEhpc3RvcnlQYXlsb2FkLCBTZWFyY2hEYXRhUGF5bG9hZCB9IGZyb20gJy4uL2ludGVyZmFjZXMvY29tbW9uLmludGVyZmFjZSc7XHJcblxyXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxyXG5leHBvcnQgY2xhc3MgVGFiR2V0U2VydmljZSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhcGlTZXJ2aWNlID0gaW5qZWN0KEFwaVNlcnZpY2UpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZHNxSGVscGVyID0gaW5qZWN0KERTUUhlbHBlcik7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBtZXRhZGF0YUhlbHBlciA9IGluamVjdChNZXRhZGF0YUhlbHBlcik7XHJcblxyXG4gIC8qKlxyXG4gICAqIEV4ZWN1dGUgUkFXIERTUSB3aXRoIE5hbWVcclxuICAgKiBORVc6IFVzZXMgbmV3IGJhY2tlbmQgZW5kcG9pbnQgYW5kIENSVUQgbWljcm9zZXJ2aWNlXHJcbiAgICogQHBhcmFtIGRhdGEgLSBPYmplY3QgY29udGFpbmluZyBBcHBPYmplY3ROYW1lIGFuZCBEU1FOYW1lXHJcbiAgICogQHJldHVybnMgUmVzcG9uc2UgZnJvbSB0aGUgQVBJXHJcbiAgICovXHJcbiAgZXhlY3V0ZVJBV0RTUVdpdGhOYW1lKGRhdGE6IGFueSwgaGVhZGVycz86IGFueSk6IGFueSB7XHJcbiAgICBjb25zdCBoZWFkZXIgPSBnZXRIZWFkZXJzKGhlYWRlcnMpO1xyXG4gICAgLy8gTkVXIEFQSTogUE9TVCAvUXVlcmllcy9leGVjdXRlL3tvYmplY3ROYW1lfS97ZHNxTmFtZX0gdmlhIENSVUQgc2VydmljZVxyXG4gICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5wb3N0VG9TZXJ2aWNlKFxyXG4gICAgICBBUElTZXJ2aWNlcy5jcnVkU2VydmljZSxcclxuICAgICAgYCR7QVBJLlF1ZXJpZXNFeGVjdXRlfS8ke2RhdGEuQXBwT2JqZWN0TmFtZX0vJHtkYXRhLkRTUU5hbWV9YCxcclxuICAgICAgZGF0YSxcclxuICAgICAgaGVhZGVyXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IFJlY29yZFxyXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBQYXJhbWV0ZXJzIGZvciB0aGUgcmVxdWVzdFxyXG4gICAqIEByZXR1cm5zIFJlc3BvbnNlIGZyb20gdGhlIEFQSVxyXG4gICAqL1xyXG4gIGdldFJlY29yZChwYXJhbXM6IGFueSk6IGFueSB7XHJcbiAgICBjb25zdCBoZWFkZXJzID0gZ2V0SGVhZGVycygpO1xyXG4gICAgaWYgKGhlYWRlcnMpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5nZXQoYCR7QVBJLmdldHJlY29yZH1gLCBwYXJhbXMsIGhlYWRlcnMpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvLyAvKipcclxuICAvLyAgKiBFeGVjdXRlIFJhdyBTUUxcclxuICAvLyAgKiBAcGFyYW0gZGF0YSAtIERhdGEgZm9yIHRoZSByZXF1ZXN0XHJcbiAgLy8gICogQHJldHVybnMgUmVzcG9uc2UgZnJvbSB0aGUgQVBJXHJcbiAgLy8gICovXHJcbiAgLy8gZXhlY3V0ZVJhd1NxbChkYXRhOiBhbnkpOiBhbnkge1xyXG4gIC8vICAgY29uc3QgaGVhZGVycyA9IGdldEhlYWRlcnMoKTtcclxuICAvLyAgIGlmIChoZWFkZXJzKSB7XHJcbiAgLy8gICAgIHJldHVybiB0aGlzLmFwaVNlcnZpY2UucG9zdChgJHtBUEkucmF3U1FMfT9xdWVyeT0ke2RhdGF9YCwgJycsIGhlYWRlcnMpO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgcmV0dXJuIG51bGw7XHJcbiAgLy8gfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgSGlzdG9yeSBmcm9tIEtpYmFuYSBtaWNyb3NlcnZpY2VcclxuICAgKiBAcGFyYW0gYXBwT2JqZWN0SWQgLSBJRCBvZiB0aGUgYXBwbGljYXRpb24gb2JqZWN0XHJcbiAgICogQHBhcmFtIHJlY29yZElkcyAtIEFycmF5IG9mIHJlY29yZCBJRHNcclxuICAgKiBAcmV0dXJucyBSZXNwb25zZSBmcm9tIHRoZSBBUElcclxuICAgKi9cclxuICBnZXRIaXN0b3J5KHBheWxvYWQ6IFJjb3JkSGlzdG9yeVBheWxvYWQpOiBPYnNlcnZhYmxlPENvbW1vbkFwaVJlc3BvbnNlPiB7XHJcbiAgICBjb25zdCBhcHBPYmplY3ROYW1lID0gdGhpcy5tZXRhZGF0YUhlbHBlci5nZXRBcHBPYmplY3RCeUlkT3JOYW1lKHBheWxvYWQuYXBwT2JqZWN0SWQpPy5PYmplY3ROYW1lO1xyXG4gICAgY29uc3QgaGVhZGVycyA9IGdldEhlYWRlcnMoKTtcclxuICAgIHJldHVybiB0aGlzLmFwaVNlcnZpY2UucG9zdFRvU2VydmljZShcclxuICAgICAgQVBJU2VydmljZXMua2liYW5hU2VydmljZSxcclxuICAgICAgQVBJLmF1ZGl0R2V0SGlzdG9yeSxcclxuICAgICAge1xyXG4gICAgICAgIFJlY29yZElkczogcGF5bG9hZC5yZWNvcmRJZHMsXHJcbiAgICAgICAgZW50aXR5TmFtZTogYXBwT2JqZWN0TmFtZVxyXG4gICAgICB9LFxyXG4gICAgICBoZWFkZXJzXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUE1KQVkgSW1wb3J0XHJcbiAgICogQHBhcmFtIGRhdGEgLSBEYXRhIGZvciBQTUpBWSBpbXBvcnRcclxuICAgKiBAcmV0dXJucyBSZXNwb25zZSBmcm9tIHRoZSBBUElcclxuICAgKi9cclxuICBwbWpheUltcG9ydChkYXRhOiBJbXByb3REYXRhUGF5bG9hZCk6IGFueSB7XHJcbiAgICBjb25zdCBoZWFkZXJzID0gZ2V0SGVhZGVycygpO1xyXG4gICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5wb3N0KGAke0FQSS5wbWpheUltcG9ydH1gLCBkYXRhLCBoZWFkZXJzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEV4ZWN1dGVzIGEgc2VsZWN0IHF1ZXJ5IHdpdGggb3B0aW9uYWwgcGFyYW1ldGVyc1xyXG4gICAqIE5FVzogVXNlcyBuZXcgQ1JVRCBtaWNyb3NlcnZpY2UgZW5kcG9pbnQgd2l0aCB0cmFuc2Zvcm1lZCBwYXlsb2FkXHJcbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgc2VsZWN0IHF1ZXJ5IGRhdGEgKG9sZCBmb3JtYXQpXHJcbiAgICogQHBhcmFtIHBhcmFtZXRlcnMgLSBPcHRpb25hbCBwYXJhbWV0ZXJzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIHF1ZXJ5XHJcbiAgICogQHBhcmFtIGFkZGl0aW9uYWxDb25maWcgLSBPcHRpb25hbCBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb25cclxuICAgKiBAcmV0dXJucyBSZXN1bHQgb2YgdGhlIHNlbGVjdCBxdWVyeSBleGVjdXRpb25cclxuICAgKi9cclxuICBzZWxlY3RFeGVjdXRvcihkYXRhOiBBUElTZWxlY3RRdWVyeSwgcGFyYW1ldGVycz86IGFueSwgYWRkaXRpb25hbENvbmZpZz86IGFueSk6IE9ic2VydmFibGU8Q29tbW9uQXBpUmVzcG9uc2U+IHtcclxuICAgIC8vIFByZXBhcmUgcXVlcnkgZGF0YSB3aXRoIHBhcmFtZXRlcnMgYW5kIGNvbmZpZ1xyXG4gICAgY29uc3QgcHJlcGFyZWREYXRhOiBhbnkgPSB0aGlzLnByZXBhcmVTZWxlY3RRdWVyeURhdGEoZGF0YSwgcGFyYW1ldGVycywgYWRkaXRpb25hbENvbmZpZyk7XHJcblxyXG4gICAgLy8gVHJhbnNmb3JtIHRvIG5ldyBDUlVEIEFQSSBwYXlsb2FkIGZvcm1hdFxyXG4gICAgY29uc3QgY3J1ZFBheWxvYWQgPSB0aGlzLnRyYW5zZm9ybVRvQ1JVRFBheWxvYWQocHJlcGFyZWREYXRhKTtcclxuXHJcbiAgICAvLyBDYWxsIG5ldyBDUlVEIG1pY3Jvc2VydmljZSBlbmRwb2ludFxyXG4gICAgY29uc3QgaGVhZGVycyA9IGdldEhlYWRlcnMoKTtcclxuICAgIHJldHVybiB0aGlzLmFwaVNlcnZpY2UucG9zdFRvU2VydmljZShcclxuICAgICAgQVBJU2VydmljZXMuY3J1ZFNlcnZpY2UsXHJcbiAgICAgIEFQSS5RdWVyaWVzU2VsZWN0LFxyXG4gICAgICBjcnVkUGF5bG9hZCxcclxuICAgICAgaGVhZGVyc1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFByZXBhcmVzIHNlbGVjdCBxdWVyeSBkYXRhIGJ5IGFwcGx5aW5nIHBhcmFtZXRlcnMgYW5kIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvblxyXG4gICAqIEBwYXJhbSBkYXRhIC0gVGhlIHNlbGVjdCBxdWVyeSBkYXRhXHJcbiAgICogQHBhcmFtIHBhcmFtZXRlcnMgLSBPcHRpb25hbCBwYXJhbWV0ZXJzIHRvIHJlcGxhY2UgaW4gZmlsdGVyc1xyXG4gICAqIEBwYXJhbSBhZGRpdGlvbmFsQ29uZmlnIC0gT3B0aW9uYWwgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uIHRvIG1lcmdlXHJcbiAgICogQHJldHVybnMgUHJlcGFyZWQgQVBJU2VsZWN0UXVlcnkgd2l0aCBwYXJhbWV0ZXJzIGFwcGxpZWRcclxuICAgKi9cclxuICBwcml2YXRlIHByZXBhcmVTZWxlY3RRdWVyeURhdGEoZGF0YTogQVBJU2VsZWN0UXVlcnksIHBhcmFtZXRlcnM/OiBhbnksIGFkZGl0aW9uYWxDb25maWc/OiBhbnkpIHtcclxuICAgIC8vIEluaXRpYWxpemUgV2hlcmVDbGF1c2UgaWYgcGFyYW1ldGVycyBwcm92aWRlZFxyXG4gICAgaWYgKHBhcmFtZXRlcnMgJiYgT2JqZWN0LmtleXMocGFyYW1ldGVycykubGVuZ3RoKSB7XHJcbiAgICAgIGRhdGEuV2hlcmVDbGF1c2UuZmlsdGVyTG9naWMgPSBkYXRhLldoZXJlQ2xhdXNlLmZpbHRlckxvZ2ljIHx8ICdbXSc7XHJcbiAgICAgIGRhdGEuV2hlcmVDbGF1c2UuZmlsdGVycyA9IGRhdGEuV2hlcmVDbGF1c2UuZmlsdGVycyB8fCBbXTtcclxuICAgICAgZGF0YS5XaGVyZUNsYXVzZS5TUUxRdWVyeSA9IGRhdGEuV2hlcmVDbGF1c2UuU1FMUXVlcnkgfHwgJyc7XHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiBSZXBsYWNlcyB2YWx1ZXMgZnJvbSBwYXJhbWV0ZXJzIGlmIG1hdGNoZWQgYW5kIGluIGZvcm1hdCBvZiB7e2tleX19LlxyXG4gICAgICAgKiBFeGFtcGxlOiBpZiBmaWx0ZXIudmFsdWUgaXMgXCJ7e3VzZXJJZH19XCIgYW5kXHJcbiAgICAgICAqIHRoaXMuX3ZhbHVlLnBhcmFtZXRlcnMudXNlcklkIGlzIDEyMywgdGhlbiBmaWx0ZXIudmFsdWUgd2lsbCBiZSByZXBsYWNlZCB3aXRoXHJcbiAgICAgICAqIFwiMTIzXCIuXHJcbiAgICAgICAqL1xyXG4gICAgICBkYXRhLldoZXJlQ2xhdXNlLmZpbHRlcnMuZm9yRWFjaCgoZmlsdGVyOiBhbnkpID0+IHtcclxuICAgICAgICAvLyBmaWx0ZXIudmFsdWVUeXBlIGlzIDEgKGxpdGVyYWwpXHJcbiAgICAgICAgaWYgKGZpbHRlci52YWx1ZSAmJiBmaWx0ZXIudmFsdWVUeXBlID09IEZpbHRlclZhbHVlVHlwZS5MaXRlcmFsKSB7XHJcbiAgICAgICAgICAvLyBmaWx0ZXIudmFsdWUgPSBmaWx0ZXIudmFsdWUucmVwbGFjZShcclxuICAgICAgICAgIC8vICAgL3t7KFtefV0rKX19L2csXHJcbiAgICAgICAgICAvLyAgIChtYXRjaDogc3RyaW5nLCBrZXk6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgLy8gICAgIGNvbnN0IHZhbHVlID0gcGFyYW1ldGVyc1trZXldO1xyXG4gICAgICAgICAgLy8gICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiBudWxsO1xyXG4gICAgICAgICAgLy8gICB9XHJcbiAgICAgICAgICAvLyApO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpZiB2YWx1ZVR5cGUgPSAyIChQYXJhbWV0ZXJzKVxyXG4gICAgICAgIC8vIHRoZW4gd2UgbmVlZCB0byByZXBsYWNlIHRoZSB2YWx1ZSB3aXRoIHBhcmFtZXRlcnMgYW5kIGNoYW5nZSB0aGUgdmFsdWVUeXBlIHRvIDEgKExpdGVyYWwpXHJcbiAgICAgICAgZWxzZSBpZiAoZmlsdGVyLnZhbHVlVHlwZSA9PSBGaWx0ZXJWYWx1ZVR5cGUuUGFyYW1ldGVyKSB7XHJcbiAgICAgICAgICBmaWx0ZXIudmFsdWUgPSBmaWx0ZXIudmFsdWUucmVwbGFjZShcclxuICAgICAgICAgICAgLyhbXn1dKykvZyxcclxuICAgICAgICAgICAgKG1hdGNoOiBzdHJpbmcsIGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJhbWV0ZXJzW2tleV07XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBmaWx0ZXIudmFsdWVUeXBlID0gRmlsdGVyVmFsdWVUeXBlLkxpdGVyYWw7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgKGRhdGE/LldoZXJlQ2xhdXNlPy5maWx0ZXJzIHx8IFtdKS5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBlbGVtZW50LnZhbHVlVHlwZSA9PT0gRmlsdGVyVmFsdWVUeXBlLlBhcmFtZXRlciAmJlxyXG4gICAgICAgICAgcGFyYW1ldGVyc1tlbGVtZW50LmZpZWxkTmFtZV1cclxuICAgICAgICApIHtcclxuICAgICAgICAgIGVsZW1lbnQudmFsdWUgPSBwYXJhbWV0ZXJzW2VsZW1lbnQuZmllbGROYW1lXTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBkYXRhO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHJhbnNmb3JtcyBvbGQgQVBJU2VsZWN0UXVlcnkgZm9ybWF0IHRvIG5ldyBDUlVEIEFQSSBmb3JtYXRcclxuICAgKiBAcGFyYW0gYXBpU2VsZWN0UXVlcnkgLSBUaGUgb2xkIGZvcm1hdCBzZWxlY3QgcXVlcnlcclxuICAgKiBAcmV0dXJucyBDUlVEU2VsZWN0UGF5bG9hZCAtIFRoZSBuZXcgZm9ybWF0IHBheWxvYWRcclxuICAgKi9cclxuICBwcml2YXRlIHRyYW5zZm9ybVRvQ1JVRFBheWxvYWQoYXBpU2VsZWN0UXVlcnk6IEFQSVNlbGVjdFF1ZXJ5KTogQ1JVRFNlbGVjdFBheWxvYWQge1xyXG4gICAgY29uc3QgcGF5bG9hZCA9IG5ldyBDUlVEU2VsZWN0UGF5bG9hZCgpO1xyXG5cclxuICAgIC8vIEJhc2ljIHByb3BlcnRpZXMgdHJhbnNmb3JtYXRpb25cclxuICAgIHBheWxvYWQuRW50aXR5TmFtZSA9IHRoaXMuZ2V0RW50aXR5TmFtZShhcGlTZWxlY3RRdWVyeS5RdWVyeU9iamVjdElEKTtcclxuICAgIHBheWxvYWQuU2VsZWN0ZWRGaWVsZHMgPSBhcGlTZWxlY3RRdWVyeS5SZXN1bHRGaWVsZF9BcHBmaWVsZElkcyB8fCBbXTtcclxuICAgIHBheWxvYWQuRGlzdGluY3QgPSBhcGlTZWxlY3RRdWVyeS5EaXN0aW5jdCB8fCBmYWxzZTtcclxuXHJcbiAgICAvLyBUcmFuc2Zvcm0gY29tcGxleCBwcm9wZXJ0aWVzXHJcbiAgICBwYXlsb2FkLmluY2x1ZGVzID0gdGhpcy50cmFuc2Zvcm1Kb2luc1RvSW5jbHVkZXMoYXBpU2VsZWN0UXVlcnkuSm9pbnMpO1xyXG4gICAgcGF5bG9hZC5QYWdlciA9IHRoaXMudHJhbnNmb3JtUGFnZXIoYXBpU2VsZWN0UXVlcnkuVG9wQ291bnQpO1xyXG4gICAgcGF5bG9hZC53aGVyZUNsYXVzZSA9IHRoaXMudHJhbnNmb3JtV2hlcmVDbGF1c2UoYXBpU2VsZWN0UXVlcnkuV2hlcmVDbGF1c2UpO1xyXG4gICAgcGF5bG9hZC5Tb3J0ID0gdGhpcy50cmFuc2Zvcm1Tb3J0KGFwaVNlbGVjdFF1ZXJ5LlNvcnQpO1xyXG5cclxuICAgIHJldHVybiBwYXlsb2FkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0cyBlbnRpdHkgbmFtZSBmcm9tIFF1ZXJ5T2JqZWN0SURcclxuICAgKi9cclxuICBwcml2YXRlIGdldEVudGl0eU5hbWUocXVlcnlPYmplY3RJZDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGFwcE9iamVjdCA9IHRoaXMubWV0YWRhdGFIZWxwZXIuZ2V0QXBwT2JqZWN0QnlJZE9yTmFtZShxdWVyeU9iamVjdElkKTtcclxuICAgIHJldHVybiBhcHBPYmplY3Q/Lk9iamVjdE5hbWUgfHwgcXVlcnlPYmplY3RJZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRyYW5zZm9ybXMgSm9pbnMgdG8gaW5jbHVkZXMgYXJyYXlcclxuICAgKi9cclxuICBwcml2YXRlIHRyYW5zZm9ybUpvaW5zVG9JbmNsdWRlcyhqb2lucz86IGFueVtdKTogYW55W10gfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKCFqb2lucyB8fCBqb2lucy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XHJcblxyXG4gICAgcmV0dXJuIGpvaW5zLm1hcCgoam9pbjogYW55KSA9PlxyXG4gICAgICBqb2luLlJlbGF0aW9uc2hpcD8uY2hpbGREZXRhaWxzPy5Mb29rdXBPYmplY3QgfHwgam9pblxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRyYW5zZm9ybXMgVG9wQ291bnQgdG8gUGFnZXIgb2JqZWN0XHJcbiAgICovXHJcbiAgcHJpdmF0ZSB0cmFuc2Zvcm1QYWdlcih0b3BDb3VudD86IG51bWJlcik6IENSVURQYWdlciB8IHVuZGVmaW5lZCB7XHJcbiAgICBpZiAoIXRvcENvdW50KSByZXR1cm4gdW5kZWZpbmVkO1xyXG5cclxuICAgIGNvbnN0IHBhZ2VyID0gbmV3IENSVURQYWdlcigpO1xyXG4gICAgcGFnZXIucGFnZU51bWJlciA9IDE7XHJcbiAgICBwYWdlci5wYWdlU2l6ZSA9IHRvcENvdW50O1xyXG4gICAgcGFnZXIucmV0dXJuVG90YWxDb3VudCA9IHRydWU7XHJcbiAgICByZXR1cm4gcGFnZXI7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUcmFuc2Zvcm1zIFdoZXJlQ2xhdXNlIHRvIG5ldyBmb3JtYXRcclxuICAgKi9cclxuICBwcml2YXRlIHRyYW5zZm9ybVdoZXJlQ2xhdXNlKHdoZXJlQ2xhdXNlPzogYW55KTogQ1JVRFdoZXJlQ2xhdXNlIHwgdW5kZWZpbmVkIHtcclxuICAgIGlmICghd2hlcmVDbGF1c2U/LkZpbHRlcnMgfHwgd2hlcmVDbGF1c2UuRmlsdGVycy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XHJcblxyXG4gICAgY29uc3QgY3J1ZFdoZXJlQ2xhdXNlID0gbmV3IENSVURXaGVyZUNsYXVzZSgpO1xyXG4gICAgY3J1ZFdoZXJlQ2xhdXNlLmZpbHRlcnMgPSB3aGVyZUNsYXVzZS5GaWx0ZXJzLm1hcCgoZmlsdGVyOiBhbnkpID0+XHJcbiAgICAgIHRoaXMudHJhbnNmb3JtRmlsdGVyKGZpbHRlcilcclxuICAgICk7XHJcbiAgICByZXR1cm4gY3J1ZFdoZXJlQ2xhdXNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHJhbnNmb3JtcyBhIHNpbmdsZSBmaWx0ZXIgdG8gbmV3IGZvcm1hdFxyXG4gICAqL1xyXG4gIHByaXZhdGUgdHJhbnNmb3JtRmlsdGVyKGZpbHRlcjogYW55KTogQ1JVREZpbHRlciB7XHJcbiAgICBjb25zdCBjcnVkRmlsdGVyID0gbmV3IENSVURGaWx0ZXIoKTtcclxuICAgIGNydWRGaWx0ZXIuZmllbGROYW1lID0gZmlsdGVyLkZpZWxkSUQ7XHJcbiAgICBjcnVkRmlsdGVyLm9wZXJhdG9yID0gZmlsdGVyLlJlbGF0aW9uYWxPcGVyYXRvcjtcclxuICAgIGNydWRGaWx0ZXIudmFsdWUgPSBmaWx0ZXIuVmFsdWUgfHwgZmlsdGVyLnZhbHVlO1xyXG4gICAgY3J1ZEZpbHRlci52YWx1ZVR5cGUgPSBmaWx0ZXIuVmFsdWVUeXBlO1xyXG4gICAgY3J1ZEZpbHRlci5jb25qdW5jdGlvbiA9IGZpbHRlci5Db25qdWN0aW9uQ2xhdXNlO1xyXG4gICAgY3J1ZEZpbHRlci5ncm91cElkID0gZmlsdGVyLkdyb3VwSUQ7XHJcbiAgICBjcnVkRmlsdGVyLnNlcXVlbmNlID0gZmlsdGVyLlNlcXVlbmNlO1xyXG4gICAgcmV0dXJuIGNydWRGaWx0ZXI7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUcmFuc2Zvcm1zIFNvcnQgYXJyYXkgdG8gbmV3IGZvcm1hdFxyXG4gICAqL1xyXG4gIHByaXZhdGUgdHJhbnNmb3JtU29ydChzb3J0cz86IGFueVtdKTogQ1JVRFNvcnRbXSB8IHVuZGVmaW5lZCB7XHJcbiAgICBpZiAoIXNvcnRzIHx8IHNvcnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcclxuXHJcbiAgICByZXR1cm4gc29ydHMubWFwKChzb3J0OiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgY3J1ZFNvcnQgPSBuZXcgQ1JVRFNvcnQoKTtcclxuICAgICAgY3J1ZFNvcnQuRmllbGROYW1lID0gc29ydC5GaWVsZElEO1xyXG4gICAgICBjcnVkU29ydC5EaXJlY3Rpb24gPSBzb3J0LlNvcnRTZXF1ZW5jZTtcclxuICAgICAgcmV0dXJuIGNydWRTb3J0O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFeGVjdXRlcyBhIHNlbGVjdCBxdWVyeSBieSBpdHMgSUQsIHVzaW5nIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHNlbGVjdFF1ZXJ5SWQgLSBUaGUgSUQgb2YgdGhlIHNlbGVjdCBxdWVyeSB0byBiZSBleGVjdXRlZC5cclxuICAgKiBAcGFyYW0gcGFyYW1ldGVycyAtIE9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gYmUgYXBwbGllZCB0byB0aGUgcXVlcnkuXHJcbiAgICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGUgc2VsZWN0IHF1ZXJ5IGV4ZWN1dGlvbi5cclxuICAgKiBAdGhyb3dzIEFuIGVycm9yIGlmIHRoZSBBUEkgcmVzcG9uc2Ugc3RhdHVzIGNvZGUgaXMgbm90ICcyMDAnLlxyXG4gICAqL1xyXG4gIGV4ZWN1dGVTZWxlY3RRdWVyeUJ5SWQoc2VsZWN0UXVlcnlJZDogc3RyaW5nLCBwYXJhbWV0ZXJzPzogYW55LCBhZGRpdGlvbmFsQ29uZmlnPzogYW55KTogT2JzZXJ2YWJsZTxDb21tb25BcGlSZXNwb25zZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVJBV0RTUVdpdGhOYW1lKHtcclxuICAgICAgQXBwT2JqZWN0TmFtZTogQXBwT2JqZWN0c0NvbnN0YW50cy5UQUJEX1F1ZXJpZXMsXHJcbiAgICAgIERTUU5hbWU6IERhdGFTb3VyY2VRdWVyaWVzQ29uc3RhbnRzLkRldGFpbF9UQUJEX1F1ZXJpZXMsXHJcbiAgICAgIFJlcXRva2Vuczoge1xyXG4gICAgICAgIElEOiBzZWxlY3RRdWVyeUlkLFxyXG4gICAgICB9LFxyXG4gICAgfSkucGlwZShcclxuICAgICAgc3dpdGNoTWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMuSXNTdWNjZXNzICYmIHJlcy5SZXN1bHQubGVuZ3RoKSB7XHJcbiAgICAgICAgICBjb25zdCBDb25maWd1cmF0aW9uID0gSlNPTi5wYXJzZShyZXMuUmVzdWx0WzBdLkNvbmZpZ3VyYXRpb24gfHwgJ3t9Jyk7XHJcbiAgICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5XaGVyZUNsYXVzZT8uZmlsdGVycykge1xyXG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLldoZXJlQ2xhdXNlLmZpbHRlcnMgPSB0aGlzLnJlbW92ZVdoZXJlQ2xhdXNlRm9yRW1wdHlQYXJhbXMoQ29uZmlndXJhdGlvbi5XaGVyZUNsYXVzZS5maWx0ZXJzLCBwYXJhbWV0ZXJzIHx8IHt9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdEV4ZWN1dG9yKENvbmZpZ3VyYXRpb24sIHBhcmFtZXRlcnMsIGFkZGl0aW9uYWxDb25maWcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVzLk1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byBmZXRjaCBzZWxlY3QgcXVlcnkgY29uZmlndXJhdGlvbi4nKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuICByZW1vdmVXaGVyZUNsYXVzZUZvckVtcHR5UGFyYW1zKGZpbHRlcnM6IGFueVtdLCBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogYW55W10ge1xyXG4gICAgcmV0dXJuIGZpbHRlcnMuZmlsdGVyKChmaWx0ZXI6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoZmlsdGVyLlZhbHVlVHlwZSA9PT0gRmlsdGVyVmFsdWVUeXBlLlBhcmFtZXRlcikge1xyXG4gICAgICAgIGNvbnN0IHBhcmFtZXRlck5hbWUgPSBmaWx0ZXIuVmFsdWU7XHJcbiAgICAgICAgaWYgKHBhcmFtZXRlck5hbWUgaW4gcGFyYW1ldGVycyAmJiBwYXJhbWV0ZXJzW3BhcmFtZXRlck5hbWVdID09PSAnJykge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBSZW1vdmUgZmlsdGVyXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChPYmplY3Qua2V5cyhwYXJhbWV0ZXJzIHx8IHt9KS5sZW5ndGggPT09IDAgJiYgZmlsdGVyLlZhbHVlVHlwZSA9PT0gRmlsdGVyVmFsdWVUeXBlLlBhcmFtZXRlcikge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gUmVtb3ZlIGZpbHRlclxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0cnVlOyAvLyBLZWVwIGZpbHRlclxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyAvKipcclxuICAvLyAgKiBHZXQgUmVzb3VyY2UgTGFuZ3VhZ2UgQnkgTGFuZ3VhZ2UgQ29kZVxyXG4gIC8vICAqIEBwYXJhbSBsYW5ndWFnZUNvZGUgLSBMYW5ndWFnZSBDb2RlXHJcbiAgLy8gICogQHJldHVybnMgUmVzcG9uc2UgZnJvbSB0aGUgQVBJXHJcbiAgLy8gICovXHJcbiAgLy8gZ2V0UmVzb3VyY2VMYW5ndWFnZUJ5TGFuZ3VhZ2VDb2RlKGxhbmd1YWdlQ29kZTogbnVtYmVyKTogYW55IHtcclxuICAvLyAgIGNvbnN0IGhlYWRlcnMgPSBnZXRIZWFkZXJzKCk7XHJcbiAgLy8gICBpZiAoaGVhZGVycykge1xyXG4gIC8vICAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlLnBvc3QoXHJcbiAgLy8gICAgICAgYCR7QVBJLmxhbmd1YWdlUmVzb3VyY2V9YCxcclxuICAvLyAgICAgICB7IExhbmd1YWdlQ29kZTogbGFuZ3VhZ2VDb2RlIH0sXHJcbiAgLy8gICAgICAgaGVhZGVyc1xyXG4gIC8vICAgICApO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgcmV0dXJuIG51bGw7XHJcbiAgLy8gfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgU2VhcmNoIERhdGEgZnJvbSBLaWJhbmEgbWljcm9zZXJ2aWNlXHJcbiAgICogQHBhcmFtIHNlYXJjaFF1ZXJ5IC0gU2VhcmNoIFF1ZXJ5IHN0cmluZ1xyXG4gICAqIEBwYXJhbSBsaW1pdCAtIExpbWl0IG9mIHNlYXJjaCByZXN1bHRzXHJcbiAgICogQHJldHVybnMgUmVzcG9uc2UgZnJvbSB0aGUgQVBJXHJcbiAgICovXHJcbiAgZ2V0U2VhcmNoRGF0YShwYXlsb2FkOiBTZWFyY2hEYXRhUGF5bG9hZCwgcGFyYW1zPzogYW55KTogT2JzZXJ2YWJsZTxDb21tb25BcGlSZXNwb25zZT4ge1xyXG4gICAgY29uc3QgaGVhZGVycyA9IGdldEhlYWRlcnMoKTtcclxuICAgIHJldHVybiB0aGlzLmFwaVNlcnZpY2UuZ2V0RnJvbVNlcnZpY2UoXHJcbiAgICAgIEFQSVNlcnZpY2VzLmtpYmFuYVNlcnZpY2UsXHJcbiAgICAgIGAke0FQSS5nbG9iYWxTZWFyY2h9P3NlYXJjaFF1ZXJ5PSR7cGF5bG9hZC5zZWFyY2hRdWVyeX0mbGltaXQ9JHtwYXlsb2FkLmxpbWl0fSR7cGF5bG9hZD8uYXBwT2JqZWN0SWQgPyBgJmFwcE9iamVjdElkPSR7cGF5bG9hZC5hcHBPYmplY3RJZH1gIDogJyd9YCxcclxuICAgICAgcGFyYW1zLFxyXG4gICAgICBoZWFkZXJzXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXhlY3V0ZXMgYW4gSFRUUCByZXF1ZXN0IHdpdGggdGhlIHNwZWNpZmllZCBtZXRob2QsIFVSTCwgaGVhZGVycywgYW5kIGJvZHkuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gZnVsbFVybCAtVGhlIGZ1bGwgVVJMIG9mIHRoZSByZXF1ZXN0IGNvbnRhaW5pbmcgdGhlIHF1ZXJ5IHBhcmFtZXRlcnMuXHJcbiAgICogQHBhcmFtIG1ldGhvZCAtIFRoZSBIVFRQIG1ldGhvZCB0byBiZSB1c2VkICgnR0VUJywgJ1BPU1QnLCAnUFVUJywgJ0RFTEVURScpLlxyXG4gICAqIEBwYXJhbSBoZWFkZXJzIC0gVGhlIGhlYWRlcnMgdG8gaW5jbHVkZSBpbiB0aGUgcmVxdWVzdC5cclxuICAgKiBAcGFyYW0gYm9keSAtIFRoZSBib2R5IGNvbnRlbnQgZm9yIG1ldGhvZHMgbGlrZSBQT1NUIGFuZCBQVVQuXHJcbiAgICogQHJldHVybnMgVGhlIEFQSSByZXNwb25zZSBjb3JyZXNwb25kaW5nIHRvIHRoZSByZXF1ZXN0LlxyXG4gICAqL1xyXG4gIGV4ZWN1dGVIdHRwUmVxdWVzdChwYXlsb2FkOiBIdHRwRXhlY3V0ZVJlcXVlc3RQYXlsb2FkKTogYW55IHtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSB7XHJcbiAgICAgIC4uLihwYXlsb2FkPy5oZWFkZXJzIHx8IHt9KSxcclxuICAgICAgJ1gtU2tpcC1JbnRlcmNlcHRvcic6ICd0cnVlJyxcclxuICAgICAgJ1gtU2tpcC1BdXRoJzogJ3RydWUnLFxyXG4gICAgICAnWC1UcmFjay1BUEktRGV0YWlscyc6ICd0cnVlJyxcclxuICAgIH07XHJcbiAgICBpZiAocGF5bG9hZC5tZXRob2QgPT0gJ0dFVCcpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5nZXRCeVVybChwYXlsb2FkLmZ1bGxVcmwsIHsgaGVhZGVycyB9KTtcclxuICAgIH0gZWxzZSBpZiAocGF5bG9hZC5tZXRob2QgPT0gJ1BPU1QnKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmFwaVNlcnZpY2UucG9zdEJ5VXJsKHBheWxvYWQuZnVsbFVybCwgcGF5bG9hZC5ib2R5LCB7IGhlYWRlcnMgfSk7XHJcbiAgICB9IGVsc2UgaWYgKHBheWxvYWQubWV0aG9kID09ICdQVVQnKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmFwaVNlcnZpY2UucHV0QnlVcmwocGF5bG9hZC5mdWxsVXJsLCBwYXlsb2FkLmJvZHksIHsgaGVhZGVycyB9KTtcclxuICAgIH0gZWxzZSBpZiAocGF5bG9hZC5tZXRob2QgPT0gJ0RFTEVURScpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5kZWxldGVCeVVybChwYXlsb2FkLmZ1bGxVcmwsIHsgaGVhZGVycyB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlcyBhbiBIVFRQIFJlcXVlc3QgYmFzZWQgb24gdGhlIHByb3ZpZGVkIERhdGFTb3VyY2VRdWVyeSBuYW1lXHJcbiAgICogQHBhcmFtIFF1ZXJ5TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBEYXRhU291cmNlUXVlcnlcclxuICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSBnZW5lcmF0ZWQgSFRUUCByZXF1ZXN0XHJcbiAgICovXHJcbiAgZ2VuZXJhdGVIdHRwUmVxdWVzdChkYXRhU291cmNlUXVlcnlOYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPENvbW1vbkFwaVJlc3BvbnNlPiB7XHJcbiAgICBjb25zdCBoZWFkZXJzID0gZ2V0SGVhZGVycygpO1xyXG4gICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5nZXQoXHJcbiAgICAgIGAke0FQSS5HZW5lcmF0ZUh0dHBSZXF1ZXN0fT9kc3FOYW1lPSR7ZGF0YVNvdXJjZVF1ZXJ5TmFtZX1gLFxyXG4gICAgICB1bmRlZmluZWQsXHJcbiAgICAgIGhlYWRlcnNcclxuICAgICk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
2
|
import { Injectable, inject } from '@angular/core';
|
|
3
|
-
import {
|
|
3
|
+
import { of, throwError } from 'rxjs';
|
|
4
|
+
import { switchMap, map, catchError } from 'rxjs/operators';
|
|
4
5
|
import { ScreenHelper } from '../helpers/screen/screen.helpers';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
6
|
+
import { MetadataHelper } from '../helpers/common/meta-data.helpers';
|
|
7
|
+
import { syncAppObjectFields } from '../utils/tab-app.util';
|
|
8
|
+
import { getPrimaryKeyFields, removeMultiplePrimaryKey, removePrimaryKey, getHeaders } from '../utils/req-res.util';
|
|
9
|
+
import { removeBlankValue, createDynamicData } from '../utils/json.util';
|
|
10
|
+
import { ApiService } from '../../core/http-client/api.service';
|
|
11
|
+
import { SignalRService } from '../../core/service/signalr/signalr.service';
|
|
12
|
+
import { API, APIServices } from '../constants/api-constants';
|
|
11
13
|
import * as i0 from "@angular/core";
|
|
12
14
|
export class TabInsertService {
|
|
13
15
|
constructor() {
|
|
14
|
-
this.dsqHelper = inject(DSQHelper);
|
|
15
16
|
this.screenHelper = inject(ScreenHelper);
|
|
16
|
-
this.
|
|
17
|
-
this.
|
|
17
|
+
this.apiService = inject(ApiService);
|
|
18
|
+
this.signalRService = inject(SignalRService);
|
|
19
|
+
this.metadataHelper = inject(MetadataHelper);
|
|
18
20
|
}
|
|
19
21
|
/**
|
|
20
22
|
* Inserts data by screen ID.
|
|
@@ -24,28 +26,28 @@ export class TabInsertService {
|
|
|
24
26
|
*/
|
|
25
27
|
insertByScreenId(screenId, data) {
|
|
26
28
|
const screen = this.screenHelper.getScreen(screenId);
|
|
27
|
-
const screenDataSource =
|
|
28
|
-
return this.insertByObjectId(screenDataSource
|
|
29
|
+
const screenDataSource = this.metadataHelper.getDataSourceQueryByIdOrName(screen.DataSourceQuery);
|
|
30
|
+
return this.insertByObjectId(screenDataSource?.ObjectID || '', data);
|
|
29
31
|
}
|
|
30
32
|
/**
|
|
31
|
-
*
|
|
32
|
-
* @param objectId The ID of the object
|
|
33
|
-
* @param data The data to insert
|
|
34
|
-
* @
|
|
33
|
+
* Insert using /records/insert endpoint with SYNC/ASYNC support
|
|
34
|
+
* @param objectId The ID of the object
|
|
35
|
+
* @param data The data to insert
|
|
36
|
+
* @param headers Optional headers
|
|
37
|
+
* @returns Observable with insertedId
|
|
35
38
|
*/
|
|
36
39
|
insertByObjectId(objectId, data, headers) {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
prepareInsert(appObject, data, headers) {
|
|
47
|
-
const crudTableName = appObject.SystemDBTableName;
|
|
40
|
+
// Get AppObject metadata
|
|
41
|
+
const appObjectModel = this.metadataHelper.getAppObjectByIdOrName(objectId);
|
|
42
|
+
const appObject = appObjectModel?.toJSON();
|
|
43
|
+
if (!appObjectModel?.ID) {
|
|
44
|
+
return throwError(() => new Error(`AppObject not found: ${objectId}`));
|
|
45
|
+
}
|
|
46
|
+
// Get entity name (table name)
|
|
47
|
+
const entityName = appObjectModel.SystemDBTableName;
|
|
48
|
+
// Sync and filter data
|
|
48
49
|
syncAppObjectFields(data.data, appObject);
|
|
50
|
+
// Remove primary keys
|
|
49
51
|
const PrimaryKeyFields = getPrimaryKeyFields(appObject);
|
|
50
52
|
if (PrimaryKeyFields && PrimaryKeyFields.length === 1) {
|
|
51
53
|
removePrimaryKey(data.data, PrimaryKeyFields[0]?.FieldName);
|
|
@@ -53,19 +55,68 @@ export class TabInsertService {
|
|
|
53
55
|
else if (PrimaryKeyFields && PrimaryKeyFields.length > 1) {
|
|
54
56
|
removeMultiplePrimaryKey(data.data, PrimaryKeyFields);
|
|
55
57
|
}
|
|
56
|
-
|
|
57
|
-
const
|
|
58
|
-
removeBlankValue(
|
|
59
|
-
|
|
60
|
-
|
|
58
|
+
// Remove blank values
|
|
59
|
+
const filteredData = { ...data.data };
|
|
60
|
+
removeBlankValue(filteredData);
|
|
61
|
+
// Transform to new API format using createDynamicData utility
|
|
62
|
+
const requestBody = {
|
|
63
|
+
entityName: entityName,
|
|
64
|
+
fields: createDynamicData(filteredData)
|
|
65
|
+
};
|
|
66
|
+
const header = getHeaders(headers);
|
|
67
|
+
// POST to new endpoint
|
|
68
|
+
return this.apiService.postToService(APIServices.crudService, API.recordsInsert, requestBody, header).pipe(switchMap((response) => {
|
|
69
|
+
if (!response?.IsSuccess) {
|
|
70
|
+
console.error('[TabInsertService] Insert failed:', response?.Errors);
|
|
71
|
+
return of(response);
|
|
72
|
+
}
|
|
73
|
+
// CASE 1: SYNC - Has insertedId immediately
|
|
74
|
+
if (response?.Result?.length) {
|
|
75
|
+
return of({
|
|
76
|
+
...response,
|
|
77
|
+
Result: response?.Result?.[0]
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
// CASE 2: ASYNC - Has correlationId
|
|
81
|
+
else if (response?.CorrelationId) {
|
|
82
|
+
return this.handleAsyncInsert(response);
|
|
83
|
+
}
|
|
84
|
+
// CASE 3: Unknown response format
|
|
85
|
+
return of(response);
|
|
86
|
+
}), catchError((error) => {
|
|
87
|
+
console.error('[TabInsertService] Insert error:', error);
|
|
88
|
+
return throwError(() => error);
|
|
89
|
+
}));
|
|
61
90
|
}
|
|
62
91
|
/**
|
|
63
|
-
*
|
|
64
|
-
* @param
|
|
65
|
-
* @returns
|
|
92
|
+
* Handle async insert - wait for SignalR notification
|
|
93
|
+
* @param response Initial response with correlationId
|
|
94
|
+
* @returns Observable with insertedId from SignalR notification
|
|
66
95
|
*/
|
|
67
|
-
|
|
68
|
-
|
|
96
|
+
handleAsyncInsert(response) {
|
|
97
|
+
const correlationId = response?.CorrelationId;
|
|
98
|
+
if (!correlationId) {
|
|
99
|
+
console.error('[TabInsertService] Missing correlationId in async response');
|
|
100
|
+
return of(response);
|
|
101
|
+
}
|
|
102
|
+
// Wait for SignalR notification with matching correlationId
|
|
103
|
+
return this.signalRService.waitForOperation(correlationId).pipe(map((notification) => {
|
|
104
|
+
// Check if operation succeeded
|
|
105
|
+
if (!notification.isSuccess) {
|
|
106
|
+
throw new Error(notification.errorMessage || 'Insert operation failed');
|
|
107
|
+
}
|
|
108
|
+
// Return response with insertedId from notification (match old API format)
|
|
109
|
+
return {
|
|
110
|
+
...response,
|
|
111
|
+
Result: notification.result?.[0],
|
|
112
|
+
RecordAffectted: notification.affectedRecords || 1
|
|
113
|
+
};
|
|
114
|
+
}), catchError((error) => {
|
|
115
|
+
if (error.message === 'Operation timed out') {
|
|
116
|
+
return throwError(() => new Error('Insert operation timed out. The operation may still complete in the background. Please refresh to see the result.'));
|
|
117
|
+
}
|
|
118
|
+
return throwError(() => error);
|
|
119
|
+
}));
|
|
69
120
|
}
|
|
70
121
|
static { this.ɵfac = function TabInsertService_Factory(t) { return new (t || TabInsertService)(); }; }
|
|
71
122
|
static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: TabInsertService, factory: TabInsertService.ɵfac, providedIn: 'root' }); }
|
|
@@ -74,4 +125,4 @@ export class TabInsertService {
|
|
|
74
125
|
type: Injectable,
|
|
75
126
|
args: [{ providedIn: 'root' }]
|
|
76
127
|
}], null, null); })();
|
|
77
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLWluc2VydC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9kYXRhLWFjY2Vzcy9zcmMvbGliL3RhYi1jb3JlLXV0aWxpdHkvYXBwL2NydWQvdGFiLWluc2VydC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsNEJBQTRCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV4RyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV4RyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7O0FBSWhELE1BQU0sT0FBTyxnQkFBZ0I7SUFEN0I7UUFFbUIsY0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5QixpQkFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNwQyxzQkFBaUIsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUM5QywwQkFBcUIsR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztLQXVEeEU7SUFyREM7Ozs7O09BS0c7SUFDSCxnQkFBZ0IsQ0FBQyxRQUFnQixFQUFFLElBQVM7UUFDMUMsTUFBTSxNQUFNLEdBQWMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEUsTUFBTSxnQkFBZ0IsR0FBRyw0QkFBNEIsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDOUUsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGdCQUFnQixDQUFDLFFBQWdCLEVBQUUsSUFBUyxFQUFFLE9BQWE7UUFDekQsTUFBTSxTQUFTLEdBQWMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFHLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGFBQWEsQ0FBQyxTQUFvQixFQUFFLElBQVMsRUFBRyxPQUFhO1FBQzNELE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQztRQUNsRCxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sZ0JBQWdCLEdBQUcsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEQsSUFBSSxnQkFBZ0IsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdEQsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUM5RCxDQUFDO2FBQU0sSUFBSSxnQkFBZ0IsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDM0Qsd0JBQXdCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFDRCxNQUFNLFdBQVcsR0FBc0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDekYsTUFBTSxPQUFPLEdBQVEsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xELGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNyRyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFHLE9BQU8sQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLElBQVMsRUFBRyxPQUFhO1FBQzlCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdEUsQ0FBQztpRkExRFUsZ0JBQWdCO3VFQUFoQixnQkFBZ0IsV0FBaEIsZ0JBQWdCLG1CQURILE1BQU07O2lGQUNuQixnQkFBZ0I7Y0FENUIsVUFBVTtlQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cclxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERTUUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcnMvY29tbW9uL2RzcS5oZWxwZXJzJztcclxuaW1wb3J0IHsgU2NyZWVuSGVscGVyIH0gZnJvbSAnLi4vaGVscGVycy9zY3JlZW4vc2NyZWVuLmhlbHBlcnMnO1xyXG5pbXBvcnQgeyBXaGVyZUNsYXVzZUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcnMvY29tbW9uL3doZXJlLWNsYXVzZS5oZWxwZXJzJztcclxuaW1wb3J0IHsgUmVxdWVzdFJlc3BvbnNlSGVscGVyIH0gZnJvbSAnLi4vaGVscGVycy9jb21tb24vcmVxLXJlcy5oZWxwZXJzJztcclxuaW1wb3J0IHsgZ2V0QXBwT2JqZWN0LCBnZXREYXRhRnJvbURhdGFTb3VyY2VRdWVyeUlELCBzeW5jQXBwT2JqZWN0RmllbGRzIH0gZnJvbSAnLi4vdXRpbHMvdGFiLWFwcC51dGlsJztcclxuaW1wb3J0IHsgQXBwT2JqZWN0LCBBcHBTY3JlZW4gfSBmcm9tICcuLi9tb2RlbHMvYXBwLW9iamVjdC5jbGFzcyc7XHJcbmltcG9ydCB7IGdldFByaW1hcnlLZXlGaWVsZHMsIHJlbW92ZU11bHRpcGxlUHJpbWFyeUtleSwgcmVtb3ZlUHJpbWFyeUtleSB9IGZyb20gJy4uL3V0aWxzL3JlcS1yZXMudXRpbCc7XHJcbmltcG9ydCB7IEFQSUZpbHRlckNyaXRlcmlhIH0gZnJvbSAnLi4vbW9kZWxzL2FwaS1xdWVyeS5jbGFzcyc7XHJcbmltcG9ydCB7IGNyZWF0ZUR5bmFtaWNEYXRhLCByZW1vdmVCbGFua1ZhbHVlIH0gZnJvbSAnLi4vdXRpbHMvanNvbi51dGlsJztcclxuaW1wb3J0IHsgUXVlcnlUeXBlIH0gZnJvbSAnLi4vZW51bXMvcXVlcnkuZW51bSc7XHJcblxyXG5cclxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcclxuZXhwb3J0IGNsYXNzIFRhYkluc2VydFNlcnZpY2Uge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZHNxSGVscGVyID0gaW5qZWN0KERTUUhlbHBlcik7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzY3JlZW5IZWxwZXIgPSBpbmplY3QoU2NyZWVuSGVscGVyKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHdoZXJlQ2xhdXNlSGVscGVyID0gaW5qZWN0KFdoZXJlQ2xhdXNlSGVscGVyKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHJlcXVlc3RSZXNwb25zZUhlbHBlciA9IGluamVjdChSZXF1ZXN0UmVzcG9uc2VIZWxwZXIpO1xyXG5cclxuICAvKipcclxuICAgKiBJbnNlcnRzIGRhdGEgYnkgc2NyZWVuIElELlxyXG4gICAqIEBwYXJhbSBzY3JlZW5JZCBUaGUgSUQgb2YgdGhlIHNjcmVlbi5cclxuICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byBpbnNlcnQuXHJcbiAgICogQHJldHVybnMgQW4gT2JzZXJ2YWJsZSB3aXRoIHRoZSBpbnNlcnQgcmVzdWx0LlxyXG4gICAqL1xyXG4gIGluc2VydEJ5U2NyZWVuSWQoc2NyZWVuSWQ6IHN0cmluZywgZGF0YTogYW55KSB7XHJcbiAgICBjb25zdCBzY3JlZW46IEFwcFNjcmVlbiA9IHRoaXMuc2NyZWVuSGVscGVyLmdldFNjcmVlbihzY3JlZW5JZCk7XHJcbiAgICBjb25zdCBzY3JlZW5EYXRhU291cmNlID0gZ2V0RGF0YUZyb21EYXRhU291cmNlUXVlcnlJRChzY3JlZW4uRGF0YVNvdXJjZVF1ZXJ5KTtcclxuICAgIHJldHVybiB0aGlzLmluc2VydEJ5T2JqZWN0SWQoc2NyZWVuRGF0YVNvdXJjZS5PYmplY3RJRF9Ub3NhdmUsIGRhdGEpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5zZXJ0cyBkYXRhIGJ5IG9iamVjdCBJRC5cclxuICAgKiBAcGFyYW0gb2JqZWN0SWQgVGhlIElEIG9mIHRoZSBvYmplY3QuXHJcbiAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gaW5zZXJ0LlxyXG4gICAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgd2l0aCB0aGUgaW5zZXJ0IHJlc3VsdC5cclxuICAgKi9cclxuICBpbnNlcnRCeU9iamVjdElkKG9iamVjdElkOiBzdHJpbmcsIGRhdGE6IGFueSwgaGVhZGVycz86IGFueSkge1xyXG4gICAgY29uc3QgYXBwT2JqZWN0OiBBcHBPYmplY3QgPSBnZXRBcHBPYmplY3Qob2JqZWN0SWQpO1xyXG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZUluc2VydChhcHBPYmplY3QsIGRhdGEgLCBoZWFkZXJzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFByZXBhcmVzIGRhdGEgZm9yIGluc2VydGlvbi5cclxuICAgKiBAcGFyYW0gYXBwT2JqZWN0IFRoZSBhcHAgb2JqZWN0LlxyXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIGluc2VydC5cclxuICAgKiBAcmV0dXJucyBBbiBPYnNlcnZhYmxlIHdpdGggdGhlIHByZXBhcmVkIGRhdGEuXHJcbiAgICovXHJcbiAgcHJlcGFyZUluc2VydChhcHBPYmplY3Q6IEFwcE9iamVjdCwgZGF0YTogYW55ICwgaGVhZGVycz86IGFueSkge1xyXG4gICAgY29uc3QgY3J1ZFRhYmxlTmFtZSA9IGFwcE9iamVjdC5TeXN0ZW1EQlRhYmxlTmFtZTtcclxuICAgIHN5bmNBcHBPYmplY3RGaWVsZHMoZGF0YS5kYXRhLCBhcHBPYmplY3QpO1xyXG4gICAgY29uc3QgUHJpbWFyeUtleUZpZWxkcyA9IGdldFByaW1hcnlLZXlGaWVsZHMoYXBwT2JqZWN0KTtcclxuICAgIGlmIChQcmltYXJ5S2V5RmllbGRzICYmIFByaW1hcnlLZXlGaWVsZHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIHJlbW92ZVByaW1hcnlLZXkoZGF0YS5kYXRhLCBQcmltYXJ5S2V5RmllbGRzWzBdPy5GaWVsZE5hbWUpO1xyXG4gICAgfSBlbHNlIGlmIChQcmltYXJ5S2V5RmllbGRzICYmIFByaW1hcnlLZXlGaWVsZHMubGVuZ3RoID4gMSkge1xyXG4gICAgICByZW1vdmVNdWx0aXBsZVByaW1hcnlLZXkoZGF0YS5kYXRhLCBQcmltYXJ5S2V5RmllbGRzKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHdoZXJlQ2xhdXNlOiBBUElGaWx0ZXJDcml0ZXJpYSA9IHRoaXMud2hlcmVDbGF1c2VIZWxwZXIuYmluZFdoZXJlQ2xhdXNlRm9ySW5zZXJ0KCk7XHJcbiAgICBjb25zdCBkYXRhT2JqOiBhbnkgPSBjcmVhdGVEeW5hbWljRGF0YShkYXRhLmRhdGEpO1xyXG4gICAgcmVtb3ZlQmxhbmtWYWx1ZShkYXRhT2JqKTtcclxuICAgIGNvbnN0IHJlcXVlc3RQYXlsb2FkID0gdGhpcy5yZXF1ZXN0UmVzcG9uc2VIZWxwZXIuaW5zZXJ0UGF5bG9hZChjcnVkVGFibGVOYW1lLCB3aGVyZUNsYXVzZSwgZGF0YU9iaik7XHJcbiAgICByZXR1cm4gdGhpcy5pbnNlcnQocmVxdWVzdFBheWxvYWQgLCBoZWFkZXJzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluc2VydHMgZGF0YS5cclxuICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byBpbnNlcnQuXHJcbiAgICogQHJldHVybnMgQW4gT2JzZXJ2YWJsZSB3aXRoIHRoZSBpbnNlcnQgcmVzdWx0LlxyXG4gICAqL1xyXG4gIGluc2VydChkYXRhOiBhbnkgLCBoZWFkZXJzPzogYW55KSB7XHJcbiAgICByZXR1cm4gdGhpcy5kc3FIZWxwZXIuZXhlY3V0ZVF1ZXJ5KGRhdGEsIFF1ZXJ5VHlwZS5JbnNlcnQsIGhlYWRlcnMpO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
128
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLWluc2VydC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9kYXRhLWFjY2Vzcy9zcmMvbGliL3RhYi1jb3JlLXV0aWxpdHkvYXBwL2NydWQvdGFiLWluc2VydC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQWMsRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDaEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTVELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSx3QkFBd0IsRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNwSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDaEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0FBSzlELE1BQU0sT0FBTyxnQkFBZ0I7SUFEN0I7UUFFbUIsaUJBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDcEMsZUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoQyxtQkFB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LEdBQUcsUUFBUTtnQkFDWCxNQUFNLEVBQUUsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDaEMsZUFBZSxFQUFFLFlBQVksQ0FBQyxlQUFlLElBQUksQ0FBQzthQUNuRCxDQUFDO1FBQ0osQ0FBQyxDQUFDLEVBQ0YsVUFBVSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDbkIsSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLHFCQUFxQixFQUFFLENBQUM7Z0JBQzVDLE9BQU8sVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksS0FBSyxDQUMvQixtSEFBbUgsQ0FDcEgsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUNELE9BQU8sVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO2lGQXJJVSxnQkFBZ0I7dUVBQWhCLGdCQUFnQixXQUFoQixnQkFBZ0IsbUJBREgsTUFBTTs7aUZBQ25CLGdCQUFnQjtjQUQ1QixVQUFVO2VBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgc3dpdGNoTWFwLCBtYXAsIGNhdGNoRXJyb3IgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFNjcmVlbkhlbHBlciB9IGZyb20gJy4uL2hlbHBlcnMvc2NyZWVuL3NjcmVlbi5oZWxwZXJzJztcclxuaW1wb3J0IHsgTWV0YWRhdGFIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJzL2NvbW1vbi9tZXRhLWRhdGEuaGVscGVycyc7XHJcbmltcG9ydCB7IHN5bmNBcHBPYmplY3RGaWVsZHMgfSBmcm9tICcuLi91dGlscy90YWItYXBwLnV0aWwnO1xyXG5pbXBvcnQgeyBBcHBPYmplY3QsIEFwcFNjcmVlbiB9IGZyb20gJy4uL21vZGVscy9hcHAtb2JqZWN0LmNsYXNzJztcclxuaW1wb3J0IHsgZ2V0UHJpbWFyeUtleUZpZWxkcywgcmVtb3ZlTXVsdGlwbGVQcmltYXJ5S2V5LCByZW1vdmVQcmltYXJ5S2V5LCBnZXRIZWFkZXJzIH0gZnJvbSAnLi4vdXRpbHMvcmVxLXJlcy51dGlsJztcclxuaW1wb3J0IHsgcmVtb3ZlQmxhbmtWYWx1ZSwgY3JlYXRlRHluYW1pY0RhdGEgfSBmcm9tICcuLi91dGlscy9qc29uLnV0aWwnO1xyXG5pbXBvcnQgeyBBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9odHRwLWNsaWVudC9hcGkuc2VydmljZSc7XHJcbmltcG9ydCB7IFNpZ25hbFJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlL3NpZ25hbHIvc2lnbmFsci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQVBJLCBBUElTZXJ2aWNlcyB9IGZyb20gJy4uL2NvbnN0YW50cy9hcGktY29uc3RhbnRzJztcclxuaW1wb3J0IHsgQ29tbW9uQXBpUmVzcG9uc2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NvbW1vbi5pbnRlcmZhY2UnO1xyXG5cclxuXHJcbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXHJcbmV4cG9ydCBjbGFzcyBUYWJJbnNlcnRTZXJ2aWNlIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IHNjcmVlbkhlbHBlciA9IGluamVjdChTY3JlZW5IZWxwZXIpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYXBpU2VydmljZSA9IGluamVjdChBcGlTZXJ2aWNlKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHNpZ25hbFJTZXJ2aWNlID0gaW5qZWN0KFNpZ25hbFJTZXJ2aWNlKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IG1ldGFkYXRhSGVscGVyID0gaW5qZWN0KE1ldGFkYXRhSGVscGVyKTtcclxuXHJcbiAgLyoqXHJcbiAgICogSW5zZXJ0cyBkYXRhIGJ5IHNjcmVlbiBJRC5cclxuICAgKiBAcGFyYW0gc2NyZWVuSWQgVGhlIElEIG9mIHRoZSBzY3JlZW4uXHJcbiAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gaW5zZXJ0LlxyXG4gICAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgd2l0aCB0aGUgaW5zZXJ0IHJlc3VsdC5cclxuICAgKi9cclxuICBpbnNlcnRCeVNjcmVlbklkKHNjcmVlbklkOiBzdHJpbmcsIGRhdGE6IGFueSkge1xyXG4gICAgY29uc3Qgc2NyZWVuOiBBcHBTY3JlZW4gPSB0aGlzLnNjcmVlbkhlbHBlci5nZXRTY3JlZW4oc2NyZWVuSWQpO1xyXG4gICAgY29uc3Qgc2NyZWVuRGF0YVNvdXJjZSA9IHRoaXMubWV0YWRhdGFIZWxwZXIuZ2V0RGF0YVNvdXJjZVF1ZXJ5QnlJZE9yTmFtZShzY3JlZW4uRGF0YVNvdXJjZVF1ZXJ5KTtcclxuICAgIHJldHVybiB0aGlzLmluc2VydEJ5T2JqZWN0SWQoc2NyZWVuRGF0YVNvdXJjZT8uT2JqZWN0SUQgfHwgJycsIGRhdGEpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5zZXJ0IHVzaW5nIC9yZWNvcmRzL2luc2VydCBlbmRwb2ludCB3aXRoIFNZTkMvQVNZTkMgc3VwcG9ydFxyXG4gICAqIEBwYXJhbSBvYmplY3RJZCBUaGUgSUQgb2YgdGhlIG9iamVjdFxyXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIGluc2VydFxyXG4gICAqIEBwYXJhbSBoZWFkZXJzIE9wdGlvbmFsIGhlYWRlcnNcclxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIHdpdGggaW5zZXJ0ZWRJZFxyXG4gICAqL1xyXG4gIGluc2VydEJ5T2JqZWN0SWQob2JqZWN0SWQ6IHN0cmluZywgZGF0YTogYW55LCBoZWFkZXJzPzogYW55KTogT2JzZXJ2YWJsZTxDb21tb25BcGlSZXNwb25zZT4ge1xyXG4gICAgLy8gR2V0IEFwcE9iamVjdCBtZXRhZGF0YVxyXG4gICAgY29uc3QgYXBwT2JqZWN0TW9kZWwgPSB0aGlzLm1ldGFkYXRhSGVscGVyLmdldEFwcE9iamVjdEJ5SWRPck5hbWUob2JqZWN0SWQpO1xyXG4gICAgY29uc3QgYXBwT2JqZWN0OiBBcHBPYmplY3QgPSBhcHBPYmplY3RNb2RlbD8udG9KU09OKCk7XHJcblxyXG4gICAgaWYgKCFhcHBPYmplY3RNb2RlbD8uSUQpIHtcclxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKGBBcHBPYmplY3Qgbm90IGZvdW5kOiAke29iamVjdElkfWApKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBHZXQgZW50aXR5IG5hbWUgKHRhYmxlIG5hbWUpXHJcbiAgICBjb25zdCBlbnRpdHlOYW1lID0gYXBwT2JqZWN0TW9kZWwuU3lzdGVtREJUYWJsZU5hbWU7XHJcblxyXG4gICAgLy8gU3luYyBhbmQgZmlsdGVyIGRhdGFcclxuICAgIHN5bmNBcHBPYmplY3RGaWVsZHMoZGF0YS5kYXRhLCBhcHBPYmplY3QpO1xyXG5cclxuICAgIC8vIFJlbW92ZSBwcmltYXJ5IGtleXNcclxuICAgIGNvbnN0IFByaW1hcnlLZXlGaWVsZHMgPSBnZXRQcmltYXJ5S2V5RmllbGRzKGFwcE9iamVjdCk7XHJcbiAgICBpZiAoUHJpbWFyeUtleUZpZWxkcyAmJiBQcmltYXJ5S2V5RmllbGRzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICByZW1vdmVQcmltYXJ5S2V5KGRhdGEuZGF0YSwgUHJpbWFyeUtleUZpZWxkc1swXT8uRmllbGROYW1lKTtcclxuICAgIH0gZWxzZSBpZiAoUHJpbWFyeUtleUZpZWxkcyAmJiBQcmltYXJ5S2V5RmllbGRzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgcmVtb3ZlTXVsdGlwbGVQcmltYXJ5S2V5KGRhdGEuZGF0YSwgUHJpbWFyeUtleUZpZWxkcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVtb3ZlIGJsYW5rIHZhbHVlc1xyXG4gICAgY29uc3QgZmlsdGVyZWREYXRhID0geyAuLi5kYXRhLmRhdGEgfTtcclxuICAgIHJlbW92ZUJsYW5rVmFsdWUoZmlsdGVyZWREYXRhKTtcclxuXHJcbiAgICAvLyBUcmFuc2Zvcm0gdG8gbmV3IEFQSSBmb3JtYXQgdXNpbmcgY3JlYXRlRHluYW1pY0RhdGEgdXRpbGl0eVxyXG4gICAgY29uc3QgcmVxdWVzdEJvZHkgPSB7XHJcbiAgICAgIGVudGl0eU5hbWU6IGVudGl0eU5hbWUsXHJcbiAgICAgIGZpZWxkczogY3JlYXRlRHluYW1pY0RhdGEoZmlsdGVyZWREYXRhKVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBoZWFkZXIgPSBnZXRIZWFkZXJzKGhlYWRlcnMpO1xyXG5cclxuICAgIC8vIFBPU1QgdG8gbmV3IGVuZHBvaW50XHJcbiAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlLnBvc3RUb1NlcnZpY2UoXHJcbiAgICAgIEFQSVNlcnZpY2VzLmNydWRTZXJ2aWNlLFxyXG4gICAgICBBUEkucmVjb3Jkc0luc2VydCxcclxuICAgICAgcmVxdWVzdEJvZHksXHJcbiAgICAgIGhlYWRlclxyXG4gICAgKS5waXBlKFxyXG4gICAgICBzd2l0Y2hNYXAoKHJlc3BvbnNlOiBDb21tb25BcGlSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIGlmICghcmVzcG9uc2U/LklzU3VjY2Vzcykge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignW1RhYkluc2VydFNlcnZpY2VdIEluc2VydCBmYWlsZWQ6JywgcmVzcG9uc2U/LkVycm9ycyk7XHJcbiAgICAgICAgICByZXR1cm4gb2YocmVzcG9uc2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ0FTRSAxOiBTWU5DIC0gSGFzIGluc2VydGVkSWQgaW1tZWRpYXRlbHlcclxuICAgICAgICBpZiAocmVzcG9uc2U/LlJlc3VsdD8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICByZXR1cm4gb2Yoe1xyXG4gICAgICAgICAgICAuLi5yZXNwb25zZSxcclxuICAgICAgICAgICAgUmVzdWx0OiByZXNwb25zZT8uUmVzdWx0Py5bMF1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ0FTRSAyOiBBU1lOQyAtIEhhcyBjb3JyZWxhdGlvbklkXHJcbiAgICAgICAgZWxzZSBpZiAocmVzcG9uc2U/LkNvcnJlbGF0aW9uSWQpIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUFzeW5jSW5zZXJ0KHJlc3BvbnNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIENBU0UgMzogVW5rbm93biByZXNwb25zZSBmb3JtYXRcclxuICAgICAgICByZXR1cm4gb2YocmVzcG9uc2UpO1xyXG4gICAgICB9KSxcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdbVGFiSW5zZXJ0U2VydmljZV0gSW5zZXJ0IGVycm9yOicsIGVycm9yKTtcclxuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIGFzeW5jIGluc2VydCAtIHdhaXQgZm9yIFNpZ25hbFIgbm90aWZpY2F0aW9uXHJcbiAgICogQHBhcmFtIHJlc3BvbnNlIEluaXRpYWwgcmVzcG9uc2Ugd2l0aCBjb3JyZWxhdGlvbklkXHJcbiAgICogQHJldHVybnMgT2JzZXJ2YWJsZSB3aXRoIGluc2VydGVkSWQgZnJvbSBTaWduYWxSIG5vdGlmaWNhdGlvblxyXG4gICAqL1xyXG4gIHByaXZhdGUgaGFuZGxlQXN5bmNJbnNlcnQocmVzcG9uc2U6IENvbW1vbkFwaVJlc3BvbnNlKTogT2JzZXJ2YWJsZTxDb21tb25BcGlSZXNwb25zZT4ge1xyXG4gICAgY29uc3QgY29ycmVsYXRpb25JZCA9IHJlc3BvbnNlPy5Db3JyZWxhdGlvbklkO1xyXG5cclxuICAgIGlmICghY29ycmVsYXRpb25JZCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdbVGFiSW5zZXJ0U2VydmljZV0gTWlzc2luZyBjb3JyZWxhdGlvbklkIGluIGFzeW5jIHJlc3BvbnNlJyk7XHJcbiAgICAgIHJldHVybiBvZihyZXNwb25zZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gV2FpdCBmb3IgU2lnbmFsUiBub3RpZmljYXRpb24gd2l0aCBtYXRjaGluZyBjb3JyZWxhdGlvbklkXHJcbiAgICByZXR1cm4gdGhpcy5zaWduYWxSU2VydmljZS53YWl0Rm9yT3BlcmF0aW9uKGNvcnJlbGF0aW9uSWQpLnBpcGUoXHJcbiAgICAgIG1hcCgobm90aWZpY2F0aW9uKSA9PiB7XHJcbiAgICAgICAgLy8gQ2hlY2sgaWYgb3BlcmF0aW9uIHN1Y2NlZWRlZFxyXG4gICAgICAgIGlmICghbm90aWZpY2F0aW9uLmlzU3VjY2Vzcykge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG5vdGlmaWNhdGlvbi5lcnJvck1lc3NhZ2UgfHwgJ0luc2VydCBvcGVyYXRpb24gZmFpbGVkJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBSZXR1cm4gcmVzcG9uc2Ugd2l0aCBpbnNlcnRlZElkIGZyb20gbm90aWZpY2F0aW9uIChtYXRjaCBvbGQgQVBJIGZvcm1hdClcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgLi4ucmVzcG9uc2UsXHJcbiAgICAgICAgICBSZXN1bHQ6IG5vdGlmaWNhdGlvbi5yZXN1bHQ/LlswXSxcclxuICAgICAgICAgIFJlY29yZEFmZmVjdHRlZDogbm90aWZpY2F0aW9uLmFmZmVjdGVkUmVjb3JkcyB8fCAxXHJcbiAgICAgICAgfTtcclxuICAgICAgfSksXHJcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgaWYgKGVycm9yLm1lc3NhZ2UgPT09ICdPcGVyYXRpb24gdGltZWQgb3V0Jykge1xyXG4gICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKFxyXG4gICAgICAgICAgICAnSW5zZXJ0IG9wZXJhdGlvbiB0aW1lZCBvdXQuIFRoZSBvcGVyYXRpb24gbWF5IHN0aWxsIGNvbXBsZXRlIGluIHRoZSBiYWNrZ3JvdW5kLiBQbGVhc2UgcmVmcmVzaCB0byBzZWUgdGhlIHJlc3VsdC4nXHJcbiAgICAgICAgICApKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcbn0iXX0=
|