@energycap/energycap-billcapture-sdk-angular 1.0.2-internal-20240104-2210

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 (37) hide show
  1. package/api/api.d.ts +9 -0
  2. package/api/billCaptureAPI.service.d.ts +162 -0
  3. package/api/sample.service.d.ts +81 -0
  4. package/api/upload.service.d.ts +55 -0
  5. package/api/version.service.d.ts +48 -0
  6. package/api.module.d.ts +11 -0
  7. package/configuration.d.ts +21 -0
  8. package/esm2020/api/api.mjs +10 -0
  9. package/esm2020/api/billCaptureAPI.service.mjs +454 -0
  10. package/esm2020/api/sample.service.mjs +233 -0
  11. package/esm2020/api/upload.service.mjs +160 -0
  12. package/esm2020/api/version.service.mjs +143 -0
  13. package/esm2020/api.module.mjs +30 -0
  14. package/esm2020/configuration.mjs +23 -0
  15. package/esm2020/energycap-energycap-billcapture-sdk-angular.mjs +5 -0
  16. package/esm2020/model/aPIFilter.mjs +14 -0
  17. package/esm2020/model/aPIOrderBy.mjs +14 -0
  18. package/esm2020/model/clientChildDTO.mjs +14 -0
  19. package/esm2020/model/getClientsResponse.mjs +14 -0
  20. package/esm2020/model/models.mjs +6 -0
  21. package/esm2020/model/uploadResponseDTO.mjs +14 -0
  22. package/esm2020/public-api.mjs +6 -0
  23. package/esm2020/variables.mjs +9 -0
  24. package/fesm2015/energycap-energycap-billcapture-sdk-angular.mjs +1103 -0
  25. package/fesm2015/energycap-energycap-billcapture-sdk-angular.mjs.map +1 -0
  26. package/fesm2020/energycap-energycap-billcapture-sdk-angular.mjs +1095 -0
  27. package/fesm2020/energycap-energycap-billcapture-sdk-angular.mjs.map +1 -0
  28. package/index.d.ts +5 -0
  29. package/model/aPIFilter.d.ts +13 -0
  30. package/model/aPIOrderBy.d.ts +13 -0
  31. package/model/clientChildDTO.d.ts +33 -0
  32. package/model/getClientsResponse.d.ts +16 -0
  33. package/model/models.d.ts +5 -0
  34. package/model/uploadResponseDTO.d.ts +51 -0
  35. package/package.json +33 -0
  36. package/public-api.d.ts +5 -0
  37. package/variables.d.ts +8 -0
@@ -0,0 +1,454 @@
1
+ /**
2
+ * BillCapture.API
3
+ * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
4
+ *
5
+ * OpenAPI spec version: 1.0
6
+ *
7
+ *
8
+ * NOTE: This class is auto generated by the swagger code generator program.
9
+ * https://github.com/swagger-api/swagger-codegen.git
10
+ * Do not edit the class manually.
11
+ */
12
+ /* tslint:disable:no-unused-variable member-ordering */
13
+ import { Inject, Injectable, Optional } from '@angular/core';
14
+ import { HttpHeaders, HttpParams } from '@angular/common/http';
15
+ import { map } from 'rxjs/operators';
16
+ import { BASE_PATH } from '../variables';
17
+ import { Configuration } from '../configuration';
18
+ import * as i0 from "@angular/core";
19
+ import * as i1 from "@angular/common/http";
20
+ import * as i2 from "../configuration";
21
+ const RequestMethod = {
22
+ Get: 'get',
23
+ Post: 'post',
24
+ Put: 'put',
25
+ Delete: 'delete',
26
+ Options: 'options',
27
+ Head: 'head',
28
+ Patch: 'patch'
29
+ };
30
+ export class BillCaptureAPIService {
31
+ constructor(http, basePath, configuration) {
32
+ this.http = http;
33
+ this.basePath = 'https://localhost';
34
+ this.defaultHeaders = new HttpHeaders();
35
+ this.configuration = new Configuration();
36
+ if (basePath) {
37
+ this.basePath = basePath;
38
+ }
39
+ if (configuration) {
40
+ this.configuration = configuration;
41
+ this.basePath = basePath || configuration.basePath || this.basePath;
42
+ }
43
+ }
44
+ /**
45
+ *
46
+ * Extends object by coping non-existing properties.
47
+ * @param objA object to be extended
48
+ * @param objB source object
49
+ */
50
+ extendObj(objA, objB) {
51
+ for (let key in objB) {
52
+ if (objB.hasOwnProperty(key)) {
53
+ objA[key] = objB[key];
54
+ }
55
+ }
56
+ return objA;
57
+ }
58
+ /**
59
+ * @param consumes string[] mime-types
60
+ * @return true: consumes contains 'multipart/form-data', false: otherwise
61
+ */
62
+ canConsumeForm(consumes) {
63
+ const form = 'multipart/form-data';
64
+ for (let consume of consumes) {
65
+ if (form === consume) {
66
+ return true;
67
+ }
68
+ }
69
+ return false;
70
+ }
71
+ /**
72
+ *
73
+ *
74
+ */
75
+ apiBatchPartialbatchesPost(extraHttpRequestParams, extraHttpRequestHeaders) {
76
+ return this.apiBatchPartialbatchesPostWithHttpInfo(extraHttpRequestParams, extraHttpRequestHeaders)
77
+ .pipe(map((response) => {
78
+ if (response.status === 204) {
79
+ return undefined;
80
+ }
81
+ else {
82
+ return response.body;
83
+ }
84
+ }));
85
+ }
86
+ /**
87
+ *
88
+ *
89
+ */
90
+ apiFrontdoorPickupPost(extraHttpRequestParams, extraHttpRequestHeaders) {
91
+ return this.apiFrontdoorPickupPostWithHttpInfo(extraHttpRequestParams, extraHttpRequestHeaders)
92
+ .pipe(map((response) => {
93
+ if (response.status === 204) {
94
+ return undefined;
95
+ }
96
+ else {
97
+ return response.body;
98
+ }
99
+ }));
100
+ }
101
+ /**
102
+ *
103
+ *
104
+ * @param partnerId
105
+ */
106
+ apiPartnerPartnerIdPickupPost(partnerId, extraHttpRequestParams, extraHttpRequestHeaders) {
107
+ return this.apiPartnerPartnerIdPickupPostWithHttpInfo(partnerId, extraHttpRequestParams, extraHttpRequestHeaders)
108
+ .pipe(map((response) => {
109
+ if (response.status === 204) {
110
+ return undefined;
111
+ }
112
+ else {
113
+ return response.body;
114
+ }
115
+ }));
116
+ }
117
+ /**
118
+ *
119
+ *
120
+ */
121
+ apiPartnerPullPost(extraHttpRequestParams, extraHttpRequestHeaders) {
122
+ return this.apiPartnerPullPostWithHttpInfo(extraHttpRequestParams, extraHttpRequestHeaders)
123
+ .pipe(map((response) => {
124
+ if (response.status === 204) {
125
+ return undefined;
126
+ }
127
+ else {
128
+ return response.body;
129
+ }
130
+ }));
131
+ }
132
+ /**
133
+ *
134
+ *
135
+ * @param vendorId
136
+ */
137
+ apiVendorVendorIdClientFileChildrenReprocessPut(vendorId, extraHttpRequestParams, extraHttpRequestHeaders) {
138
+ return this.apiVendorVendorIdClientFileChildrenReprocessPutWithHttpInfo(vendorId, extraHttpRequestParams, extraHttpRequestHeaders)
139
+ .pipe(map((response) => {
140
+ if (response.status === 204) {
141
+ return undefined;
142
+ }
143
+ else {
144
+ return response.body;
145
+ }
146
+ }));
147
+ }
148
+ /**
149
+ *
150
+ *
151
+ */
152
+ apiVersionGet(extraHttpRequestParams, extraHttpRequestHeaders) {
153
+ return this.apiVersionGetWithHttpInfo(extraHttpRequestParams, extraHttpRequestHeaders)
154
+ .pipe(map((response) => {
155
+ if (response.status === 204) {
156
+ return undefined;
157
+ }
158
+ else {
159
+ return response.body;
160
+ }
161
+ }));
162
+ }
163
+ /**
164
+ *
165
+ *
166
+ */
167
+ apiBatchPartialbatchesPostWithHttpInfo(extraHttpRequestParams, extraHttpRequestHeaders) {
168
+ const path = this.basePath + '/api/batch/partialbatches';
169
+ let queryParameters;
170
+ if (extraHttpRequestParams) {
171
+ if (typeof extraHttpRequestParams.search === 'string') {
172
+ queryParameters = new HttpParams({ fromString: extraHttpRequestParams.search });
173
+ }
174
+ else {
175
+ queryParameters = new HttpParams({ fromObject: extraHttpRequestParams.search });
176
+ }
177
+ }
178
+ else {
179
+ queryParameters = new HttpParams();
180
+ }
181
+ let headers = new HttpHeaders();
182
+ this.defaultHeaders.keys().forEach(key => {
183
+ headers = headers.set(key, this.defaultHeaders.getAll(key));
184
+ });
185
+ if (extraHttpRequestHeaders) {
186
+ Object.entries(extraHttpRequestHeaders).forEach(([key, value]) => {
187
+ headers = headers.set(key, value);
188
+ });
189
+ }
190
+ // to determine the Accept header
191
+ let produces = [];
192
+ if (this.configuration.apiKeys["Authorization"]) {
193
+ headers = headers.set('Authorization', this.configuration.apiKeys["Authorization"]);
194
+ }
195
+ if (this.configuration.apiKeys["ECI-PUBLIC-DASHBOARD-KEY"]) {
196
+ headers = headers.set('ECI-PUBLIC-DASHBOARD-KEY', this.configuration.apiKeys["ECI-PUBLIC-DASHBOARD-KEY"]);
197
+ }
198
+ const consumes = [];
199
+ let requestOptions = {
200
+ headers: headers,
201
+ params: queryParameters,
202
+ withCredentials: this.configuration.withCredentials,
203
+ observe: 'response'
204
+ };
205
+ return this.http.request(RequestMethod.Post, path, requestOptions);
206
+ }
207
+ /**
208
+ *
209
+ *
210
+ */
211
+ apiFrontdoorPickupPostWithHttpInfo(extraHttpRequestParams, extraHttpRequestHeaders) {
212
+ const path = this.basePath + '/api/frontdoor/pickup';
213
+ let queryParameters;
214
+ if (extraHttpRequestParams) {
215
+ if (typeof extraHttpRequestParams.search === 'string') {
216
+ queryParameters = new HttpParams({ fromString: extraHttpRequestParams.search });
217
+ }
218
+ else {
219
+ queryParameters = new HttpParams({ fromObject: extraHttpRequestParams.search });
220
+ }
221
+ }
222
+ else {
223
+ queryParameters = new HttpParams();
224
+ }
225
+ let headers = new HttpHeaders();
226
+ this.defaultHeaders.keys().forEach(key => {
227
+ headers = headers.set(key, this.defaultHeaders.getAll(key));
228
+ });
229
+ if (extraHttpRequestHeaders) {
230
+ Object.entries(extraHttpRequestHeaders).forEach(([key, value]) => {
231
+ headers = headers.set(key, value);
232
+ });
233
+ }
234
+ // to determine the Accept header
235
+ let produces = [];
236
+ if (this.configuration.apiKeys["Authorization"]) {
237
+ headers = headers.set('Authorization', this.configuration.apiKeys["Authorization"]);
238
+ }
239
+ if (this.configuration.apiKeys["ECI-PUBLIC-DASHBOARD-KEY"]) {
240
+ headers = headers.set('ECI-PUBLIC-DASHBOARD-KEY', this.configuration.apiKeys["ECI-PUBLIC-DASHBOARD-KEY"]);
241
+ }
242
+ const consumes = [];
243
+ let requestOptions = {
244
+ headers: headers,
245
+ params: queryParameters,
246
+ withCredentials: this.configuration.withCredentials,
247
+ observe: 'response'
248
+ };
249
+ return this.http.request(RequestMethod.Post, path, requestOptions);
250
+ }
251
+ /**
252
+ *
253
+ *
254
+ * @param partnerId
255
+ */
256
+ apiPartnerPartnerIdPickupPostWithHttpInfo(partnerId, extraHttpRequestParams, extraHttpRequestHeaders) {
257
+ const path = this.basePath + '/api/partner/${partnerId}/pickup'
258
+ .replace('${' + 'partnerId' + '}', String(partnerId));
259
+ let queryParameters;
260
+ if (extraHttpRequestParams) {
261
+ if (typeof extraHttpRequestParams.search === 'string') {
262
+ queryParameters = new HttpParams({ fromString: extraHttpRequestParams.search });
263
+ }
264
+ else {
265
+ queryParameters = new HttpParams({ fromObject: extraHttpRequestParams.search });
266
+ }
267
+ }
268
+ else {
269
+ queryParameters = new HttpParams();
270
+ }
271
+ let headers = new HttpHeaders();
272
+ this.defaultHeaders.keys().forEach(key => {
273
+ headers = headers.set(key, this.defaultHeaders.getAll(key));
274
+ });
275
+ if (extraHttpRequestHeaders) {
276
+ Object.entries(extraHttpRequestHeaders).forEach(([key, value]) => {
277
+ headers = headers.set(key, value);
278
+ });
279
+ }
280
+ // verify required parameter 'partnerId' is not null or undefined
281
+ if (partnerId === null || partnerId === undefined) {
282
+ throw new Error('Required parameter partnerId was null or undefined when calling apiPartnerPartnerIdPickupPost.');
283
+ }
284
+ // to determine the Accept header
285
+ let produces = [];
286
+ if (this.configuration.apiKeys["Authorization"]) {
287
+ headers = headers.set('Authorization', this.configuration.apiKeys["Authorization"]);
288
+ }
289
+ if (this.configuration.apiKeys["ECI-PUBLIC-DASHBOARD-KEY"]) {
290
+ headers = headers.set('ECI-PUBLIC-DASHBOARD-KEY', this.configuration.apiKeys["ECI-PUBLIC-DASHBOARD-KEY"]);
291
+ }
292
+ const consumes = [];
293
+ let requestOptions = {
294
+ headers: headers,
295
+ params: queryParameters,
296
+ withCredentials: this.configuration.withCredentials,
297
+ observe: 'response'
298
+ };
299
+ return this.http.request(RequestMethod.Post, path, requestOptions);
300
+ }
301
+ /**
302
+ *
303
+ *
304
+ */
305
+ apiPartnerPullPostWithHttpInfo(extraHttpRequestParams, extraHttpRequestHeaders) {
306
+ const path = this.basePath + '/api/partner/pull';
307
+ let queryParameters;
308
+ if (extraHttpRequestParams) {
309
+ if (typeof extraHttpRequestParams.search === 'string') {
310
+ queryParameters = new HttpParams({ fromString: extraHttpRequestParams.search });
311
+ }
312
+ else {
313
+ queryParameters = new HttpParams({ fromObject: extraHttpRequestParams.search });
314
+ }
315
+ }
316
+ else {
317
+ queryParameters = new HttpParams();
318
+ }
319
+ let headers = new HttpHeaders();
320
+ this.defaultHeaders.keys().forEach(key => {
321
+ headers = headers.set(key, this.defaultHeaders.getAll(key));
322
+ });
323
+ if (extraHttpRequestHeaders) {
324
+ Object.entries(extraHttpRequestHeaders).forEach(([key, value]) => {
325
+ headers = headers.set(key, value);
326
+ });
327
+ }
328
+ // to determine the Accept header
329
+ let produces = [];
330
+ if (this.configuration.apiKeys["Authorization"]) {
331
+ headers = headers.set('Authorization', this.configuration.apiKeys["Authorization"]);
332
+ }
333
+ if (this.configuration.apiKeys["ECI-PUBLIC-DASHBOARD-KEY"]) {
334
+ headers = headers.set('ECI-PUBLIC-DASHBOARD-KEY', this.configuration.apiKeys["ECI-PUBLIC-DASHBOARD-KEY"]);
335
+ }
336
+ const consumes = [];
337
+ let requestOptions = {
338
+ headers: headers,
339
+ params: queryParameters,
340
+ withCredentials: this.configuration.withCredentials,
341
+ observe: 'response'
342
+ };
343
+ return this.http.request(RequestMethod.Post, path, requestOptions);
344
+ }
345
+ /**
346
+ *
347
+ *
348
+ * @param vendorId
349
+ */
350
+ apiVendorVendorIdClientFileChildrenReprocessPutWithHttpInfo(vendorId, extraHttpRequestParams, extraHttpRequestHeaders) {
351
+ const path = this.basePath + '/api/vendor/${vendorId}/clientFileChildren/reprocess'
352
+ .replace('${' + 'vendorId' + '}', String(vendorId));
353
+ let queryParameters;
354
+ if (extraHttpRequestParams) {
355
+ if (typeof extraHttpRequestParams.search === 'string') {
356
+ queryParameters = new HttpParams({ fromString: extraHttpRequestParams.search });
357
+ }
358
+ else {
359
+ queryParameters = new HttpParams({ fromObject: extraHttpRequestParams.search });
360
+ }
361
+ }
362
+ else {
363
+ queryParameters = new HttpParams();
364
+ }
365
+ let headers = new HttpHeaders();
366
+ this.defaultHeaders.keys().forEach(key => {
367
+ headers = headers.set(key, this.defaultHeaders.getAll(key));
368
+ });
369
+ if (extraHttpRequestHeaders) {
370
+ Object.entries(extraHttpRequestHeaders).forEach(([key, value]) => {
371
+ headers = headers.set(key, value);
372
+ });
373
+ }
374
+ // verify required parameter 'vendorId' is not null or undefined
375
+ if (vendorId === null || vendorId === undefined) {
376
+ throw new Error('Required parameter vendorId was null or undefined when calling apiVendorVendorIdClientFileChildrenReprocessPut.');
377
+ }
378
+ // to determine the Accept header
379
+ let produces = [];
380
+ if (this.configuration.apiKeys["Authorization"]) {
381
+ headers = headers.set('Authorization', this.configuration.apiKeys["Authorization"]);
382
+ }
383
+ if (this.configuration.apiKeys["ECI-PUBLIC-DASHBOARD-KEY"]) {
384
+ headers = headers.set('ECI-PUBLIC-DASHBOARD-KEY', this.configuration.apiKeys["ECI-PUBLIC-DASHBOARD-KEY"]);
385
+ }
386
+ const consumes = [];
387
+ let requestOptions = {
388
+ headers: headers,
389
+ params: queryParameters,
390
+ withCredentials: this.configuration.withCredentials,
391
+ observe: 'response'
392
+ };
393
+ return this.http.request(RequestMethod.Put, path, requestOptions);
394
+ }
395
+ /**
396
+ *
397
+ *
398
+ */
399
+ apiVersionGetWithHttpInfo(extraHttpRequestParams, extraHttpRequestHeaders) {
400
+ const path = this.basePath + '/api/version';
401
+ let queryParameters;
402
+ if (extraHttpRequestParams) {
403
+ if (typeof extraHttpRequestParams.search === 'string') {
404
+ queryParameters = new HttpParams({ fromString: extraHttpRequestParams.search });
405
+ }
406
+ else {
407
+ queryParameters = new HttpParams({ fromObject: extraHttpRequestParams.search });
408
+ }
409
+ }
410
+ else {
411
+ queryParameters = new HttpParams();
412
+ }
413
+ let headers = new HttpHeaders();
414
+ this.defaultHeaders.keys().forEach(key => {
415
+ headers = headers.set(key, this.defaultHeaders.getAll(key));
416
+ });
417
+ if (extraHttpRequestHeaders) {
418
+ Object.entries(extraHttpRequestHeaders).forEach(([key, value]) => {
419
+ headers = headers.set(key, value);
420
+ });
421
+ }
422
+ // to determine the Accept header
423
+ let produces = [
424
+ 'text/plain'
425
+ ];
426
+ if (this.configuration.apiKeys["Authorization"]) {
427
+ headers = headers.set('Authorization', this.configuration.apiKeys["Authorization"]);
428
+ }
429
+ if (this.configuration.apiKeys["ECI-PUBLIC-DASHBOARD-KEY"]) {
430
+ headers = headers.set('ECI-PUBLIC-DASHBOARD-KEY', this.configuration.apiKeys["ECI-PUBLIC-DASHBOARD-KEY"]);
431
+ }
432
+ const consumes = [];
433
+ let requestOptions = {
434
+ headers: headers,
435
+ params: queryParameters,
436
+ withCredentials: this.configuration.withCredentials,
437
+ observe: 'response'
438
+ };
439
+ return this.http.request(RequestMethod.Get, path, requestOptions);
440
+ }
441
+ }
442
+ BillCaptureAPIService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: BillCaptureAPIService, deps: [{ token: i1.HttpClient }, { token: BASE_PATH, optional: true }, { token: i2.Configuration, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
443
+ BillCaptureAPIService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: BillCaptureAPIService });
444
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: BillCaptureAPIService, decorators: [{
445
+ type: Injectable
446
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: undefined, decorators: [{
447
+ type: Optional
448
+ }, {
449
+ type: Inject,
450
+ args: [BASE_PATH]
451
+ }] }, { type: i2.Configuration, decorators: [{
452
+ type: Optional
453
+ }] }]; } });
454
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlsbENhcHR1cmVBUEkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2FwaS9iaWxsQ2FwdHVyZUFQSS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFFSCx1REFBdUQ7QUFFdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQTJCLGVBQWUsQ0FBQztBQUNsRixPQUFPLEVBQWMsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFvQixzQkFBc0IsQ0FBQztBQUl6RixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQW9ELGdCQUFnQixDQUFDO0FBR25GLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBOEMsY0FBYyxDQUFDO0FBR2pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBMEMsa0JBQWtCLENBQUM7Ozs7QUFFckYsTUFBTSxhQUFhLEdBQUc7SUFDbEIsR0FBRyxFQUFFLEtBQUs7SUFDVixJQUFJLEVBQUUsTUFBTTtJQUNaLEdBQUcsRUFBRSxLQUFLO0lBQ1YsTUFBTSxFQUFFLFFBQVE7SUFDaEIsT0FBTyxFQUFFLFNBQVM7SUFDbEIsSUFBSSxFQUFFLE1BQU07SUFDWixLQUFLLEVBQUUsT0FBTztDQUNqQixDQUFDO0FBSUYsTUFBTSxPQUFPLHFCQUFxQjtJQU05QixZQUFzQixJQUFnQixFQUFnQyxRQUFnQixFQUFjLGFBQTRCO1FBQTFHLFNBQUksR0FBSixJQUFJLENBQVk7UUFKNUIsYUFBUSxHQUFHLG1CQUFtQixDQUFDO1FBQ2xDLG1CQUFjLEdBQWdCLElBQUksV0FBVyxFQUFFLENBQUM7UUFDaEQsa0JBQWEsR0FBa0IsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUd0RCxJQUFJLFFBQVEsRUFBRTtZQUNWLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1NBQzVCO1FBQ0QsSUFBSSxhQUFhLEVBQUU7WUFDZixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEs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LFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQmlsbENhcHR1cmUuQVBJXHJcbiAqIE5vIGRlc2NyaXB0aW9uIHByb3ZpZGVkIChnZW5lcmF0ZWQgYnkgU3dhZ2dlciBDb2RlZ2VuIGh0dHBzOi8vZ2l0aHViLmNvbS9zd2FnZ2VyLWFwaS9zd2FnZ2VyLWNvZGVnZW4pXHJcbiAqXHJcbiAqIE9wZW5BUEkgc3BlYyB2ZXJzaW9uOiAxLjBcclxuICogXHJcbiAqXHJcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHN3YWdnZXIgY29kZSBnZW5lcmF0b3IgcHJvZ3JhbS5cclxuICogaHR0cHM6Ly9naXRodWIuY29tL3N3YWdnZXItYXBpL3N3YWdnZXItY29kZWdlbi5naXRcclxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxyXG4gKi9cclxuXHJcbi8qIHRzbGludDpkaXNhYmxlOm5vLXVudXNlZC12YXJpYWJsZSBtZW1iZXItb3JkZXJpbmcgKi9cclxuXHJcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSAgICAgICAgICAgICAgICAgICAgICBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMsIEh0dHBQYXJhbXMgfSAgICAgICAgICAgICAgIGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgSHR0cFJlc3BvbnNlIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuXHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgbWFwIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcblxyXG5pbXBvcnQgeyBCQVNFX1BBVEggfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAnLi4vdmFyaWFibGVzJztcclxuaW1wb3J0IHsgQ09MTEVDVElPTl9GT1JNQVRTIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gJy4uL3ZhcmlhYmxlcyc7XHJcblxyXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAnLi4vY29uZmlndXJhdGlvbic7XHJcblxyXG5jb25zdCBSZXF1ZXN0TWV0aG9kID0ge1xyXG4gICAgR2V0OiAnZ2V0JyxcclxuICAgIFBvc3Q6ICdwb3N0JyxcclxuICAgIFB1dDogJ3B1dCcsXHJcbiAgICBEZWxldGU6ICdkZWxldGUnLFxyXG4gICAgT3B0aW9uczogJ29wdGlvbnMnLFxyXG4gICAgSGVhZDogJ2hlYWQnLFxyXG4gICAgUGF0Y2g6ICdwYXRjaCdcclxufTtcclxuXHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBCaWxsQ2FwdHVyZUFQSVNlcnZpY2Uge1xyXG5cclxuICAgIHByb3RlY3RlZCBiYXNlUGF0aCA9ICdodHRwczovL2xvY2FsaG9zdCc7XHJcbiAgICBwdWJsaWMgZGVmYXVsdEhlYWRlcnM6IEh0dHBIZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XHJcbiAgICBwdWJsaWMgY29uZmlndXJhdGlvbjogQ29uZmlndXJhdGlvbiA9IG5ldyBDb25maWd1cmF0aW9uKCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIGh0dHA6IEh0dHBDbGllbnQsIEBPcHRpb25hbCgpQEluamVjdChCQVNFX1BBVEgpIGJhc2VQYXRoOiBzdHJpbmcsIEBPcHRpb25hbCgpIGNvbmZpZ3VyYXRpb246IENvbmZpZ3VyYXRpb24pIHtcclxuICAgICAgICBpZiAoYmFzZVBhdGgpIHtcclxuICAgICAgICAgICAgdGhpcy5iYXNlUGF0aCA9IGJhc2VQYXRoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uO1xyXG5cdFx0XHR0aGlzLmJhc2VQYXRoID0gYmFzZVBhdGggfHwgY29uZmlndXJhdGlvbi5iYXNlUGF0aCB8fCB0aGlzLmJhc2VQYXRoO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFxyXG4gICAgICogRXh0ZW5kcyBvYmplY3QgYnkgY29waW5nIG5vbi1leGlzdGluZyBwcm9wZXJ0aWVzLlxyXG4gICAgICogQHBhcmFtIG9iakEgb2JqZWN0IHRvIGJlIGV4dGVuZGVkXHJcbiAgICAgKiBAcGFyYW0gb2JqQiBzb3VyY2Ugb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZXh0ZW5kT2JqPFQxLFQyPihvYmpBOiBUMSwgb2JqQjogVDIpIHtcclxuICAgICAgICBmb3IobGV0IGtleSBpbiBvYmpCKXtcclxuICAgICAgICAgICAgaWYob2JqQi5oYXNPd25Qcm9wZXJ0eShrZXkpKXtcclxuICAgICAgICAgICAgICAgIChvYmpBIGFzIGFueSlba2V5XSA9IChvYmpCIGFzIGFueSlba2V5XTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gPFQxJlQyPm9iakE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0gY29uc3VtZXMgc3RyaW5nW10gbWltZS10eXBlc1xyXG4gICAgICogQHJldHVybiB0cnVlOiBjb25zdW1lcyBjb250YWlucyAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScsIGZhbHNlOiBvdGhlcndpc2VcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjYW5Db25zdW1lRm9ybShjb25zdW1lczogc3RyaW5nW10pOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBmb3JtID0gJ211bHRpcGFydC9mb3JtLWRhdGEnO1xyXG4gICAgICAgIGZvciAobGV0IGNvbnN1bWUgb2YgY29uc3VtZXMpIHtcclxuICAgICAgICAgICAgaWYgKGZvcm0gPT09IGNvbnN1bWUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFxyXG4gICAgICogXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhcGlCYXRjaFBhcnRpYWxiYXRjaGVzUG9zdChleHRyYUh0dHBSZXF1ZXN0UGFyYW1zPzoge3NlYXJjaDogc3RyaW5nIHwge1twYXJhbTogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW10gfSB9LCBleHRyYUh0dHBSZXF1ZXN0SGVhZGVycz86IHtbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXX0pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFwaUJhdGNoUGFydGlhbGJhdGNoZXNQb3N0V2l0aEh0dHBJbmZvKGV4dHJhSHR0cFJlcXVlc3RQYXJhbXMsIGV4dHJhSHR0cFJlcXVlc3RIZWFkZXJzKVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIG1hcCgocmVzcG9uc2U6IEh0dHBSZXNwb25zZTxhbnk+KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjA0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmJvZHk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogXHJcbiAgICAgKiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFwaUZyb250ZG9vclBpY2t1cFBvc3QoZXh0cmFIdHRwUmVxdWVzdFBhcmFtcz86IHtzZWFyY2g6IHN0cmluZyB8IHtbcGFyYW06IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdIH0gfSwgZXh0cmFIdHRwUmVxdWVzdEhlYWRlcnM/OiB7W2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW119KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hcGlGcm9udGRvb3JQaWNrdXBQb3N0V2l0aEh0dHBJbmZvKGV4dHJhSHR0cFJlcXVlc3RQYXJhbXMsIGV4dHJhSHR0cFJlcXVlc3RIZWFkZXJzKVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIG1hcCgocmVzcG9uc2U6IEh0dHBSZXNwb25zZTxhbnk+KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjA0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmJvZHk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBwYXJ0bmVySWQgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhcGlQYXJ0bmVyUGFydG5lcklkUGlja3VwUG9zdChwYXJ0bmVySWQ6IHN0cmluZywgZXh0cmFIdHRwUmVxdWVzdFBhcmFtcz86IHtzZWFyY2g6IHN0cmluZyB8IHtbcGFyYW06IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdIH0gfSwgZXh0cmFIdHRwUmVxdWVzdEhlYWRlcnM/OiB7W2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW119KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hcGlQYXJ0bmVyUGFydG5lcklkUGlja3VwUG9zdFdpdGhIdHRwSW5mbyhwYXJ0bmVySWQsIGV4dHJhSHR0cFJlcXVlc3RQYXJhbXMsIGV4dHJhSHR0cFJlcXVlc3RIZWFkZXJzKVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIG1hcCgocmVzcG9uc2U6IEh0dHBSZXNwb25zZTxhbnk+KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjA0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmJvZHk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogXHJcbiAgICAgKiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFwaVBhcnRuZXJQdWxsUG9zdChleHRyYUh0dHBSZXF1ZXN0UGFyYW1zPzoge3NlYXJjaDogc3RyaW5nIHwge1twYXJhbTogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW10gfSB9LCBleHRyYUh0dHBSZXF1ZXN0SGVhZGVycz86IHtbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXX0pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFwaVBhcnRuZXJQdWxsUG9zdFdpdGhIdHRwSW5mbyhleHRyYUh0dHBSZXF1ZXN0UGFyYW1zLCBleHRyYUh0dHBSZXF1ZXN0SGVhZGVycylcclxuICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICBtYXAoKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2U8YW55PikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwNCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5ib2R5O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIClcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gdmVuZG9ySWQgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhcGlWZW5kb3JWZW5kb3JJZENsaWVudEZpbGVDaGlsZHJlblJlcHJvY2Vzc1B1dCh2ZW5kb3JJZDogbnVtYmVyLCBleHRyYUh0dHBSZXF1ZXN0UGFyYW1zPzoge3NlYXJjaDogc3RyaW5nIHwge1twYXJhbTogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW10gfSB9LCBleHRyYUh0dHBSZXF1ZXN0SGVhZGVycz86IHtbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXX0pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFwaVZlbmRvclZlbmRvcklkQ2xpZW50RmlsZUNoaWxkcmVuUmVwcm9jZXNzUHV0V2l0aEh0dHBJbmZvKHZlbmRvcklkLCBleHRyYUh0dHBSZXF1ZXN0UGFyYW1zLCBleHRyYUh0dHBSZXF1ZXN0SGVhZGVycylcclxuICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICBtYXAoKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2U8YW55PikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwNCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5ib2R5O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIClcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFxyXG4gICAgICogXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhcGlWZXJzaW9uR2V0KGV4dHJhSHR0cFJlcXVlc3RQYXJhbXM/OiB7c2VhcmNoOiBzdHJpbmcgfCB7W3BhcmFtOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXSB9IH0sIGV4dHJhSHR0cFJlcXVlc3RIZWFkZXJzPzoge1toZWFkZXI6IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdfSk6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBpVmVyc2lvbkdldFdpdGhIdHRwSW5mbyhleHRyYUh0dHBSZXF1ZXN0UGFyYW1zLCBleHRyYUh0dHBSZXF1ZXN0SGVhZGVycylcclxuICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICBtYXAoKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2U8c3RyaW5nPikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwNCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5ib2R5O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIClcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBcclxuICAgICAqIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXBpQmF0Y2hQYXJ0aWFsYmF0Y2hlc1Bvc3RXaXRoSHR0cEluZm8oZXh0cmFIdHRwUmVxdWVzdFBhcmFtcz86IHtzZWFyY2g6IHN0cmluZyB8IHtbcGFyYW06IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdIH0gfSwgZXh0cmFIdHRwUmVxdWVzdEhlYWRlcnM/OiB7W2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW119KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8YW55Pj4ge1xyXG4gICAgICAgIGNvbnN0IHBhdGggPSB0aGlzLmJhc2VQYXRoICsgJy9hcGkvYmF0Y2gvcGFydGlhbGJhdGNoZXMnO1xyXG5cclxuICAgICAgICBsZXQgcXVlcnlQYXJhbWV0ZXJzOiBIdHRwUGFyYW1zO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChleHRyYUh0dHBSZXF1ZXN0UGFyYW1zKSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZXh0cmFIdHRwUmVxdWVzdFBhcmFtcy5zZWFyY2ggPT09ICdzdHJpbmcnKSB7IFxyXG4gICAgICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2Zyb21TdHJpbmc6IGV4dHJhSHR0cFJlcXVlc3RQYXJhbXMuc2VhcmNofSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBxdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZnJvbU9iamVjdDogZXh0cmFIdHRwUmVxdWVzdFBhcmFtcy5zZWFyY2h9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpO1xyXG4gICAgICAgIHRoaXMuZGVmYXVsdEhlYWRlcnMua2V5cygpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KGtleSwgdGhpcy5kZWZhdWx0SGVhZGVycy5nZXRBbGwoa2V5KSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmIChleHRyYUh0dHBSZXF1ZXN0SGVhZGVycykge1xyXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhleHRyYUh0dHBSZXF1ZXN0SGVhZGVycykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoa2V5LCB2YWx1ZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxyXG4gICAgICAgIGxldCBwcm9kdWNlczogc3RyaW5nW10gPSBbXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5hcGlLZXlzW1wiQXV0aG9yaXphdGlvblwiXSkge1xyXG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmNvbmZpZ3VyYXRpb24uYXBpS2V5c1tcIkF1dGhvcml6YXRpb25cIl0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5hcGlLZXlzW1wiRUNJLVBVQkxJQy1EQVNIQk9BUkQtS0VZXCJdKSB7XHJcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnRUNJLVBVQkxJQy1EQVNIQk9BUkQtS0VZJywgdGhpcy5jb25maWd1cmF0aW9uLmFwaUtleXNbXCJFQ0ktUFVCTElDLURBU0hCT0FSRC1LRVlcIl0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuXHJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xyXG4gICAgICAgIF07XHJcblxyXG4gICAgICAgIGxldCByZXF1ZXN0T3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcclxuICAgICAgICAgICAgcGFyYW1zOiBxdWVyeVBhcmFtZXRlcnMsXHJcbiAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczp0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxyXG4gICAgICAgICAgICBvYnNlcnZlOiAncmVzcG9uc2UnIGFzICdyZXNwb25zZSdcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdDxhbnk+KFJlcXVlc3RNZXRob2QuUG9zdCwgcGF0aCwgcmVxdWVzdE9wdGlvbnMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogXHJcbiAgICAgKiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFwaUZyb250ZG9vclBpY2t1cFBvc3RXaXRoSHR0cEluZm8oZXh0cmFIdHRwUmVxdWVzdFBhcmFtcz86IHtzZWFyY2g6IHN0cmluZyB8IHtbcGFyYW06IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdIH0gfSwgZXh0cmFIdHRwUmVxdWVzdEhlYWRlcnM/OiB7W2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW119KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8YW55Pj4ge1xyXG4gICAgICAgIGNvbnN0IHBhdGggPSB0aGlzLmJhc2VQYXRoICsgJy9hcGkvZnJvbnRkb29yL3BpY2t1cCc7XHJcblxyXG4gICAgICAgIGxldCBxdWVyeVBhcmFtZXRlcnM6IEh0dHBQYXJhbXM7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKGV4dHJhSHR0cFJlcXVlc3RQYXJhbXMpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBleHRyYUh0dHBSZXF1ZXN0UGFyYW1zLnNlYXJjaCA9PT0gJ3N0cmluZycpIHsgXHJcbiAgICAgICAgICAgICAgICBxdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZnJvbVN0cmluZzogZXh0cmFIdHRwUmVxdWVzdFBhcmFtcy5zZWFyY2h9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtmcm9tT2JqZWN0OiBleHRyYUh0dHBSZXF1ZXN0UGFyYW1zLnNlYXJjaH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XHJcbiAgICAgICAgdGhpcy5kZWZhdWx0SGVhZGVycy5rZXlzKCkuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoa2V5LCB0aGlzLmRlZmF1bHRIZWFkZXJzLmdldEFsbChrZXkpKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKGV4dHJhSHR0cFJlcXVlc3RIZWFkZXJzKSB7XHJcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGV4dHJhSHR0cFJlcXVlc3RIZWFkZXJzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcclxuICAgICAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldChrZXksIHZhbHVlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXHJcbiAgICAgICAgbGV0IHByb2R1Y2VzOiBzdHJpbmdbXSA9IFtcclxuICAgICAgICBdO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLmFwaUtleXNbXCJBdXRob3JpemF0aW9uXCJdKSB7XHJcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuY29uZmlndXJhdGlvbi5hcGlLZXlzW1wiQXV0aG9yaXphdGlvblwiXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLmFwaUtleXNbXCJFQ0ktUFVCTElDLURBU0hCT0FSRC1LRVlcIl0pIHtcclxuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdFQ0ktUFVCTElDLURBU0hCT0FSRC1LRVknLCB0aGlzLmNvbmZpZ3VyYXRpb24uYXBpS2V5c1tcIkVDSS1QVUJMSUMtREFTSEJPQVJELUtFWVwiXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG5cclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgbGV0IHJlcXVlc3RPcHRpb25zID0ge1xyXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxyXG4gICAgICAgICAgICBwYXJhbXM6IHF1ZXJ5UGFyYW1ldGVycyxcclxuICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOnRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXHJcbiAgICAgICAgICAgIG9ic2VydmU6ICdyZXNwb25zZScgYXMgJ3Jlc3BvbnNlJ1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0PGFueT4oUmVxdWVzdE1ldGhvZC5Qb3N0LCBwYXRoLCByZXF1ZXN0T3B0aW9ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHBhcnRuZXJJZCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFwaVBhcnRuZXJQYXJ0bmVySWRQaWNrdXBQb3N0V2l0aEh0dHBJbmZvKHBhcnRuZXJJZDogc3RyaW5nLCBleHRyYUh0dHBSZXF1ZXN0UGFyYW1zPzoge3NlYXJjaDogc3RyaW5nIHwge1twYXJhbTogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW10gfSB9LCBleHRyYUh0dHBSZXF1ZXN0SGVhZGVycz86IHtbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXX0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxhbnk+PiB7XHJcbiAgICAgICAgY29uc3QgcGF0aCA9IHRoaXMuYmFzZVBhdGggKyAnL2FwaS9wYXJ0bmVyLyR7cGFydG5lcklkfS9waWNrdXAnXHJcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoJyR7JyArICdwYXJ0bmVySWQnICsgJ30nLCBTdHJpbmcocGFydG5lcklkKSk7XHJcblxyXG4gICAgICAgIGxldCBxdWVyeVBhcmFtZXRlcnM6IEh0dHBQYXJhbXM7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKGV4dHJhSHR0cFJlcXVlc3RQYXJhbXMpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBleHRyYUh0dHBSZXF1ZXN0UGFyYW1zLnNlYXJjaCA9PT0gJ3N0cmluZycpIHsgXHJcbiAgICAgICAgICAgICAgICBxdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZnJvbVN0cmluZzogZXh0cmFIdHRwUmVxdWVzdFBhcmFtcy5zZWFyY2h9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtmcm9tT2JqZWN0OiBleHRyYUh0dHBSZXF1ZXN0UGFyYW1zLnNlYXJjaH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XHJcbiAgICAgICAgdGhpcy5kZWZhdWx0SGVhZGVycy5rZXlzKCkuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoa2V5LCB0aGlzLmRlZmF1bHRIZWFkZXJzLmdldEFsbChrZXkpKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKGV4dHJhSHR0cFJlcXVlc3RIZWFkZXJzKSB7XHJcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGV4dHJhSHR0cFJlcXVlc3RIZWFkZXJzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcclxuICAgICAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldChrZXksIHZhbHVlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXJ0bmVySWQnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxyXG4gICAgICAgIGlmIChwYXJ0bmVySWQgPT09IG51bGwgfHwgcGFydG5lcklkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgcGFydG5lcklkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgYXBpUGFydG5lclBhcnRuZXJJZFBpY2t1cFBvc3QuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcclxuICAgICAgICBsZXQgcHJvZHVjZXM6IHN0cmluZ1tdID0gW1xyXG4gICAgICAgIF07XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uYXBpS2V5c1tcIkF1dGhvcml6YXRpb25cIl0pIHtcclxuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5jb25maWd1cmF0aW9uLmFwaUtleXNbXCJBdXRob3JpemF0aW9uXCJdKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uYXBpS2V5c1tcIkVDSS1QVUJMSUMtREFTSEJPQVJELUtFWVwiXSkge1xyXG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0VDSS1QVUJMSUMtREFTSEJPQVJELUtFWScsIHRoaXMuY29uZmlndXJhdGlvbi5hcGlLZXlzW1wiRUNJLVBVQkxJQy1EQVNIQk9BUkQtS0VZXCJdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcclxuICAgICAgICBdO1xyXG5cclxuICAgICAgICBsZXQgcmVxdWVzdE9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXHJcbiAgICAgICAgICAgIHBhcmFtczogcXVlcnlQYXJhbWV0ZXJzLFxyXG4gICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6dGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcclxuICAgICAgICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyBhcyAncmVzcG9uc2UnXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3Q8YW55PihSZXF1ZXN0TWV0aG9kLlBvc3QsIHBhdGgsIHJlcXVlc3RPcHRpb25zKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFxyXG4gICAgICogXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhcGlQYXJ0bmVyUHVsbFBvc3RXaXRoSHR0cEluZm8oZXh0cmFIdHRwUmVxdWVzdFBhcmFtcz86IHtzZWFyY2g6IHN0cmluZyB8IHtbcGFyYW06IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdIH0gfSwgZXh0cmFIdHRwUmVxdWVzdEhlYWRlcnM/OiB7W2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW119KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8YW55Pj4ge1xyXG4gICAgICAgIGNvbnN0IHBhdGggPSB0aGlzLmJhc2VQYXRoICsgJy9hcGkvcGFydG5lci9wdWxsJztcclxuXHJcbiAgICAgICAgbGV0IHF1ZXJ5UGFyYW1ldGVyczogSHR0cFBhcmFtcztcclxuICAgICAgICBcclxuICAgICAgICBpZiAoZXh0cmFIdHRwUmVxdWVzdFBhcmFtcykge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGV4dHJhSHR0cFJlcXVlc3RQYXJhbXMuc2VhcmNoID09PSAnc3RyaW5nJykgeyBcclxuICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtmcm9tU3RyaW5nOiBleHRyYUh0dHBSZXF1ZXN0UGFyYW1zLnNlYXJjaH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2Zyb21PYmplY3Q6IGV4dHJhSHR0cFJlcXVlc3RQYXJhbXMuc2VhcmNofSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBxdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcclxuICAgICAgICB0aGlzLmRlZmF1bHRIZWFkZXJzLmtleXMoKS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldChrZXksIHRoaXMuZGVmYXVsdEhlYWRlcnMuZ2V0QWxsKGtleSkpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAoZXh0cmFIdHRwUmVxdWVzdEhlYWRlcnMpIHtcclxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoZXh0cmFIdHRwUmVxdWVzdEhlYWRlcnMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KGtleSwgdmFsdWUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcclxuICAgICAgICBsZXQgcHJvZHVjZXM6IHN0cmluZ1tdID0gW1xyXG4gICAgICAgIF07XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uYXBpS2V5c1tcIkF1dGhvcml6YXRpb25cIl0pIHtcclxuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5jb25maWd1cmF0aW9uLmFwaUtleXNbXCJBdXRob3JpemF0aW9uXCJdKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uYXBpS2V5c1tcIkVDSS1QVUJMSUMtREFTSEJPQVJELUtFWVwiXSkge1xyXG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0VDSS1QVUJMSUMtREFTSEJPQVJELUtFWScsIHRoaXMuY29uZmlndXJhdGlvbi5hcGlLZXlzW1wiRUNJLVBVQkxJQy1EQVNIQk9BUkQtS0VZXCJdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcclxuICAgICAgICBdO1xyXG5cclxuICAgICAgICBsZXQgcmVxdWVzdE9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXHJcbiAgICAgICAgICAgIHBhcmFtczogcXVlcnlQYXJhbWV0ZXJzLFxyXG4gICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6dGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcclxuICAgICAgICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyBhcyAncmVzcG9uc2UnXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3Q8YW55PihSZXF1ZXN0TWV0aG9kLlBvc3QsIHBhdGgsIHJlcXVlc3RPcHRpb25zKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gdmVuZG9ySWQgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhcGlWZW5kb3JWZW5kb3JJZENsaWVudEZpbGVDaGlsZHJlblJlcHJvY2Vzc1B1dFdpdGhIdHRwSW5mbyh2ZW5kb3JJZDogbnVtYmVyLCBleHRyYUh0dHBSZXF1ZXN0UGFyYW1zPzoge3NlYXJjaDogc3RyaW5nIHwge1twYXJhbTogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW10gfSB9LCBleHRyYUh0dHBSZXF1ZXN0SGVhZGVycz86IHtbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXX0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxhbnk+PiB7XHJcbiAgICAgICAgY29uc3QgcGF0aCA9IHRoaXMuYmFzZVBhdGggKyAnL2FwaS92ZW5kb3IvJHt2ZW5kb3JJZH0vY2xpZW50RmlsZUNoaWxkcmVuL3JlcHJvY2VzcydcclxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgnJHsnICsgJ3ZlbmRvcklkJyArICd9JywgU3RyaW5nKHZlbmRvcklkKSk7XHJcblxyXG4gICAgICAgIGxldCBxdWVyeVBhcmFtZXRlcnM6IEh0dHBQYXJhbXM7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKGV4dHJhSHR0cFJlcXVlc3RQYXJhbXMpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBleHRyYUh0dHBSZXF1ZXN0UGFyYW1zLnNlYXJjaCA9PT0gJ3N0cmluZycpIHsgXHJcbiAgICAgICAgICAgICAgICBxdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZnJvbVN0cmluZzogZXh0cmFIdHRwUmVxdWVzdFBhcmFtcy5zZWFyY2h9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtmcm9tT2JqZWN0OiBleHRyYUh0dHBSZXF1ZXN0UGFyYW1zLnNlYXJjaH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XHJcbiAgICAgICAgdGhpcy5kZWZhdWx0SGVhZGVycy5rZXlzKCkuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoa2V5LCB0aGlzLmRlZmF1bHRIZWFkZXJzLmdldEFsbChrZXkpKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKGV4dHJhSHR0cFJlcXVlc3RIZWFkZXJzKSB7XHJcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGV4dHJhSHR0cFJlcXVlc3RIZWFkZXJzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcclxuICAgICAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldChrZXksIHZhbHVlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd2ZW5kb3JJZCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXHJcbiAgICAgICAgaWYgKHZlbmRvcklkID09PSBudWxsIHx8IHZlbmRvcklkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgdmVuZG9ySWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBhcGlWZW5kb3JWZW5kb3JJZENsaWVudEZpbGVDaGlsZHJlblJlcHJvY2Vzc1B1dC4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxyXG4gICAgICAgIGxldCBwcm9kdWNlczogc3RyaW5nW10gPSBbXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5hcGlLZXlzW1wiQXV0aG9yaXphdGlvblwiXSkge1xyXG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmNvbmZpZ3VyYXRpb24uYXBpS2V5c1tcIkF1dGhvcml6YXRpb25cIl0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5hcGlLZXlzW1wiRUNJLVBVQkxJQy1EQVNIQk9BUkQtS0VZXCJdKSB7XHJcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnRUNJLVBVQkxJQy1EQVNIQk9BUkQtS0VZJywgdGhpcy5jb25maWd1cmF0aW9uLmFwaUtleXNbXCJFQ0ktUFVCTElDLURBU0hCT0FSRC1LRVlcIl0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuXHJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xyXG4gICAgICAgIF07XHJcblxyXG4gICAgICAgIGxldCByZXF1ZXN0T3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcclxuICAgICAgICAgICAgcGFyYW1zOiBxdWVyeVBhcmFtZXRlcnMsXHJcbiAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczp0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxyXG4gICAgICAgICAgICBvYnNlcnZlOiAncmVzcG9uc2UnIGFzICdyZXNwb25zZSdcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdDxhbnk+KFJlcXVlc3RNZXRob2QuUHV0LCBwYXRoLCByZXF1ZXN0T3B0aW9ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBcclxuICAgICAqIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXBpVmVyc2lvbkdldFdpdGhIdHRwSW5mbyhleHRyYUh0dHBSZXF1ZXN0UGFyYW1zPzoge3NlYXJjaDogc3RyaW5nIHwge1twYXJhbTogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW10gfSB9LCBleHRyYUh0dHBSZXF1ZXN0SGVhZGVycz86IHtbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXX0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxzdHJpbmc+PiB7XHJcbiAgICAgICAgY29uc3QgcGF0aCA9IHRoaXMuYmFzZVBhdGggKyAnL2FwaS92ZXJzaW9uJztcclxuXHJcbiAgICAgICAgbGV0IHF1ZXJ5UGFyYW1ldGVyczogSHR0cFBhcmFtcztcclxuICAgICAgICBcclxuICAgICAgICBpZiAoZXh0cmFIdHRwUmVxdWVzdFBhcmFtcykge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGV4dHJhSHR0cFJlcXVlc3RQYXJhbXMuc2VhcmNoID09PSAnc3RyaW5nJykgeyBcclxuICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtmcm9tU3RyaW5nOiBleHRyYUh0dHBSZXF1ZXN0UGFyYW1zLnNlYXJjaH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2Zyb21PYmplY3Q6IGV4dHJhSHR0cFJlcXVlc3RQYXJhbXMuc2VhcmNofSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBxdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcclxuICAgICAgICB0aGlzLmRlZmF1bHRIZWFkZXJzLmtleXMoKS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldChrZXksIHRoaXMuZGVmYXVsdEhlYWRlcnMuZ2V0QWxsKGtleSkpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAoZXh0cmFIdHRwUmVxdWVzdEhlYWRlcnMpIHtcclxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoZXh0cmFIdHRwUmVxdWVzdEhlYWRlcnMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KGtleSwgdmFsdWUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcclxuICAgICAgICBsZXQgcHJvZHVjZXM6IHN0cmluZ1tdID0gW1xyXG4gICAgICAgICAgICAndGV4dC9wbGFpbidcclxuICAgICAgICBdO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLmFwaUtleXNbXCJBdXRob3JpemF0aW9uXCJdKSB7XHJcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuY29uZmlndXJhdGlvbi5hcGlLZXlzW1wiQXV0aG9yaXphdGlvblwiXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLmFwaUtleXNbXCJFQ0ktUFVCTElDLURBU0hCT0FSRC1LRVlcIl0pIHtcclxuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdFQ0ktUFVCTElDLURBU0hCT0FSRC1LRVknLCB0aGlzLmNvbmZpZ3VyYXRpb24uYXBpS2V5c1tcIkVDSS1QVUJMSUMtREFTSEJPQVJELUtFWVwiXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG5cclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgbGV0IHJlcXVlc3RPcHRpb25zID0ge1xyXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxyXG4gICAgICAgICAgICBwYXJhbXM6IHF1ZXJ5UGFyYW1ldGVycyxcclxuICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOnRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXHJcbiAgICAgICAgICAgIG9ic2VydmU6ICdyZXNwb25zZScgYXMgJ3Jlc3BvbnNlJ1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0PHN0cmluZz4oUmVxdWVzdE1ldGhvZC5HZXQsIHBhdGgsIHJlcXVlc3RPcHRpb25zKTtcclxuICAgIH1cclxuXHJcbn1cclxuIl19