@vgroup/dialbox 0.0.2 → 0.0.4

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.
@@ -0,0 +1,1185 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { HttpParams } from '@angular/common/http';
3
+ import { HttpHeaders } from "@angular/common/http";
4
+ import { BehaviorSubject, throwError } from 'rxjs';
5
+ import { environment } from "../environments/environments";
6
+ import { catchError, map, switchMap } from 'rxjs/operators';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/common/http";
9
+ import * as i2 from "./ip-address.service";
10
+ export class ExtensionService {
11
+ setCallSid(callSid, recordCall) {
12
+ this.callSid = callSid;
13
+ this.recordCall = recordCall;
14
+ }
15
+ getCallSid() {
16
+ return {
17
+ callSid: this.callSid,
18
+ recordCall: this.recordCall
19
+ };
20
+ }
21
+ setCallerId(callerId) {
22
+ this.callerIdSubject.next(callerId);
23
+ }
24
+ constructor(http, ipAddressService) {
25
+ this.http = http;
26
+ this.ipAddressService = ipAddressService;
27
+ this.callSid = '';
28
+ this.messageSource = new BehaviorSubject('');
29
+ this.channelId = environment.channelId;
30
+ this.currentMessage = this.messageSource.asObservable();
31
+ this.platform = 'web';
32
+ this.dedicatedStateSource = new BehaviorSubject('');
33
+ this.dedicatedState = this.dedicatedStateSource.asObservable();
34
+ this.callerIdStateSource = new BehaviorSubject('');
35
+ this.callerIdState = this.callerIdStateSource.asObservable();
36
+ this.sendSmsSource = new BehaviorSubject('');
37
+ this.sendMessage = this.sendSmsSource.asObservable();
38
+ this.draftSmsSource = new BehaviorSubject('');
39
+ this.draftMessage = this.draftSmsSource.asObservable();
40
+ this.isInputFocus$ = new BehaviorSubject(false);
41
+ this.token = localStorage.getItem('ext_token') || '';
42
+ this.isNewContactAdded = new BehaviorSubject(false);
43
+ this.isProfileUpdated = new BehaviorSubject(false);
44
+ this.callerIdSubject = new BehaviorSubject(null);
45
+ this.callerId$ = this.callerIdSubject.asObservable();
46
+ }
47
+ changeMessage(message) {
48
+ this.messageSource.next(message);
49
+ }
50
+ GetUserUsage(token) {
51
+ const params = {
52
+ 'Content-Type': 'application/json',
53
+ 'Auth-Key': "Bearer " + token
54
+ };
55
+ const httpOptions = { headers: new HttpHeaders(params) };
56
+ return this.http.get(environment.apiUrl + '/utilities/ext/usage', httpOptions);
57
+ }
58
+ GetUserProfile(token, data) {
59
+ const params = {
60
+ 'Content-Type': 'application/json',
61
+ 'Auth-Key': "Bearer " + token
62
+ };
63
+ const httpOptions = { headers: new HttpHeaders(params) };
64
+ return this.http.post(environment.apiUrl + '/utilities/ext/user', data, httpOptions);
65
+ }
66
+ UpdateProfile(userProfile, token) {
67
+ const userProfileObj = {
68
+ "billingAddress1": userProfile.billingAddress1,
69
+ "billingAddress2": userProfile.billingAddress2,
70
+ "billingCityid": userProfile.billingCity,
71
+ "billingCountryid": userProfile.billingCountry,
72
+ "billingStateid": userProfile.billingState,
73
+ "billingZipid": userProfile.billingZip,
74
+ "email": userProfile.email,
75
+ "mobile": userProfile.mobile,
76
+ "countrycode": userProfile.countrycode,
77
+ "timezone": userProfile.timezone,
78
+ "firstname": userProfile.firstname,
79
+ "lastname": userProfile.lastname,
80
+ "shippingAddress1": (userProfile.shippingAddress1 !== null && userProfile.shippingAddress1 !== undefined && userProfile.shippingAddress1 !== "") ? userProfile.shippingAddress1 : userProfile.billingAddress1,
81
+ "shippingAddress2": (userProfile.shippingAddress2 !== null && userProfile.shippingAddress2 !== undefined && userProfile.shippingAddress2 !== "") ? userProfile.shippingAddress2 : userProfile.billingAddress2,
82
+ "shippingCityid": (userProfile.shippingCity !== null && userProfile.shippingCity !== undefined && userProfile.shippingCity !== "") ? userProfile.shippingCity : userProfile.billingCity,
83
+ "shippingCountryid": (userProfile.shippingCountry !== null && userProfile.shippingCountry !== undefined && userProfile.shippingCountry !== "") ? userProfile.shippingCountry : userProfile.billingCountry,
84
+ "shippingStateid": (userProfile.shippingState !== null && userProfile.shippingState !== undefined && userProfile.shippingState !== "") ? userProfile.shippingState : userProfile.billingState,
85
+ "shippingZipid": (userProfile.shippingZip !== null && userProfile.shippingZip !== undefined && userProfile.shippingZip !== "") ? userProfile.shippingZip : userProfile.billingZip,
86
+ "imageId": (userProfile.imageId),
87
+ "imageName": (userProfile.imageName),
88
+ "companyName": userProfile.companyName,
89
+ "companySize": userProfile.companySize,
90
+ "companyFirstName": userProfile.companyFirstName,
91
+ "companyLastName": userProfile.companyLastName,
92
+ "companyContactNumber": userProfile.companyContactNumber
93
+ };
94
+ const params = {
95
+ 'Content-Type': 'application/json',
96
+ 'Auth-Key': "Bearer " + token
97
+ };
98
+ const httpOptions = { headers: new HttpHeaders(params) };
99
+ return this.http.put(environment.apiUrl + '/utilities/ext/update', userProfileObj, httpOptions);
100
+ }
101
+ deleteProfilePhoto(token) {
102
+ const params = {
103
+ 'Auth-Key': "Bearer " + token
104
+ };
105
+ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Auth-Key': "Bearer " + token }) };
106
+ return this.http.post(environment.apiUrl + '/utilities/ext/delete/profile/photo', params, httpOptions);
107
+ }
108
+ getOtpCode(countryCode, number, mode, token) {
109
+ const params = {
110
+ 'Content-Type': 'application/json',
111
+ 'Auth-Key': "Bearer " + token
112
+ };
113
+ const numberObj = {
114
+ "countrycode": countryCode,
115
+ "number": number,
116
+ "mode": mode
117
+ };
118
+ const httpOptions = { headers: new HttpHeaders(params) };
119
+ return this.http.post(environment.apiUrl + '/utilities/ext/sms/otp', numberObj, httpOptions);
120
+ }
121
+ getVerifyMobile(countryName, countrycode, number, otp, token) {
122
+ const params = {
123
+ 'Content-Type': 'application/json',
124
+ 'Auth-Key': "Bearer " + token
125
+ };
126
+ const verifyObj = {
127
+ "countryName": countryName,
128
+ "countrycode": countrycode,
129
+ "number": number,
130
+ "otp": otp
131
+ };
132
+ const httpOptions = { headers: new HttpHeaders(params) };
133
+ return this.http.post(environment.apiUrl + '/utilities/ext/sms/verify/otp', verifyObj, httpOptions);
134
+ }
135
+ connectWithStripe(token) {
136
+ const params = {
137
+ 'Auth-Key': "Bearer " + token
138
+ };
139
+ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Auth-Key': "Bearer " + token }) };
140
+ return this.http.post(environment.apiUrl + '/utilities/ext/stripe/connect', params, httpOptions);
141
+ }
142
+ connectWithStripeRedirection(redirection, token) {
143
+ const params = {
144
+ 'Auth-Key': "Bearer " + token,
145
+ "redirection": redirection
146
+ };
147
+ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Auth-Key': "Bearer " + token }) };
148
+ return this.http.post(environment.apiUrl + `/utilities/ext/stripe/connect/${redirection}`, params, httpOptions);
149
+ }
150
+ validateStripeSession(sessionId, token) {
151
+ const params = {
152
+ 'Content-Type': 'application/json',
153
+ 'Auth-Key': "Bearer " + token
154
+ };
155
+ const data = {
156
+ "sessionid": sessionId,
157
+ };
158
+ const httpOptions = { headers: new HttpHeaders(params) };
159
+ return this.http.post(environment.apiUrl + '/utilities/ext/validate/session', data, httpOptions);
160
+ }
161
+ loadPaymentMethods(token) {
162
+ const params = {
163
+ 'Content-Type': 'application/json',
164
+ 'Auth-Key': "Bearer " + token
165
+ };
166
+ const httpOptions = { headers: new HttpHeaders(params) };
167
+ return this.http.get(environment.apiUrl + '/utilities/ext/payment/methods', httpOptions);
168
+ }
169
+ setPaymentDefaultMethod(paymentMethodId, token) {
170
+ const params = {
171
+ 'Content-Type': 'application/json',
172
+ 'Auth-Key': "Bearer " + token
173
+ };
174
+ const data = {
175
+ "methodid": paymentMethodId,
176
+ };
177
+ const httpOptions = { headers: new HttpHeaders(params) };
178
+ return this.http.post(environment.apiUrl + '/utilities/ext/update/default', data, httpOptions);
179
+ }
180
+ sendEmailVerifyLink(emailval, token) {
181
+ const params = {
182
+ 'Auth-Key': "Bearer " + token,
183
+ "email": emailval
184
+ };
185
+ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Auth-Key': "Bearer " + token }) };
186
+ return this.http.post(environment.apiUrl + '/utilities/ext/verify/email', params, httpOptions);
187
+ }
188
+ VerifyEmailLink(key) {
189
+ const keyobj = { "key": key };
190
+ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json' }) };
191
+ return this.http.post(environment.apiUrl + '/utilities/ext/ur/verify/request', keyobj, httpOptions);
192
+ }
193
+ DeleteMethod(paymentMethodId, token) {
194
+ const params = {
195
+ 'Content-Type': 'application/json',
196
+ 'Auth-Key': "Bearer " + token
197
+ };
198
+ const data = {
199
+ "methodid": paymentMethodId,
200
+ };
201
+ const httpOptions = { headers: new HttpHeaders(params) };
202
+ return this.http.post(environment.apiUrl + '/utilities/ext/detach/method', data, httpOptions);
203
+ }
204
+ VerifySession(token) {
205
+ const params = {
206
+ 'Content-Type': 'application/json',
207
+ 'Auth-Key': "Bearer " + token
208
+ };
209
+ const httpOptions = { headers: new HttpHeaders(params) };
210
+ return this.http.get(environment.apiUrl + '/utilities/ext/verify/session', httpOptions);
211
+ }
212
+ GetAllCountryList() {
213
+ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json' }) };
214
+ return this.http.get(environment.apiUrl + '/global/master/ur/countrylist', httpOptions);
215
+ }
216
+ GetAllStateList(_countryId) {
217
+ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json' }) };
218
+ return this.http.get(environment.apiUrl + '/global/master/ur/statelist/' + _countryId, httpOptions);
219
+ }
220
+ LogoutUser(authKey) {
221
+ const auth = { "Auth-Key": authKey };
222
+ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Auth-Key': authKey }) };
223
+ return this.http.post(environment.apiUrl + '/client/user/logout', auth, httpOptions);
224
+ }
225
+ purchasedNumber(token) {
226
+ const params = {
227
+ 'Content-Type': 'application/json',
228
+ 'Auth-Key': "Bearer " + token
229
+ };
230
+ const httpOptions = { headers: new HttpHeaders(params) };
231
+ return this.http.get(environment.apiUrl + '/utilities/softphone/view/purchased/number', httpOptions);
232
+ }
233
+ availableNumber(token, dtModel) {
234
+ const params = {
235
+ 'Content-Type': 'application/json;charset=UTF-8',
236
+ 'Auth-Key': "Bearer " + token
237
+ };
238
+ const httpOptions = { headers: new HttpHeaders(params) };
239
+ return this.http.post(environment.apiUrl + '/utilities/softphone/available/number', dtModel, httpOptions);
240
+ }
241
+ urAvailableNumber(token, dtModel) {
242
+ const params = {
243
+ 'Content-Type': 'application/json;charset=UTF-8',
244
+ };
245
+ const httpOptions = { headers: new HttpHeaders(params) };
246
+ return this.http.post(environment.apiUrl + '/utilities/softphone/ur/available/number', dtModel, httpOptions);
247
+ }
248
+ stagingNumber(token, dtModel) {
249
+ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json' }) };
250
+ return this.http.post(environment.apiUrl + '/utilities/ext/ur/save/staging/number', dtModel, httpOptions);
251
+ }
252
+ saveCompanyDetail(dtModel) {
253
+ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json' }) };
254
+ return this.http.post(environment.apiUrl + '/utilities/ext/ur/signup/company/details', dtModel, httpOptions);
255
+ }
256
+ saveAddressInfo(dtModel) {
257
+ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json' }) };
258
+ return this.http.post(environment.apiUrl + '/utilities/ext/ur/signup/address', dtModel, httpOptions);
259
+ }
260
+ saveStripeInfo(userId) {
261
+ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json' }) };
262
+ return this.http.post(environment.apiUrl + '/utilities/ext/ur/stripe/connect/' + userId, httpOptions);
263
+ }
264
+ saveCardInfo(dtModel) {
265
+ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json' }) };
266
+ return this.http.post(environment.apiUrl + '/utilities/ext/ur/save/card/info', dtModel, httpOptions);
267
+ }
268
+ deleteCard(dtModel) {
269
+ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json' }) };
270
+ return this.http.post(environment.apiUrl + '/utilities/ext/ur/delete/saved/card', dtModel, httpOptions);
271
+ }
272
+ purchasePlan(dtModel) {
273
+ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json' }) };
274
+ return this.http.post(environment.apiUrl + '/utilities/softphone/ur/purchase/signup/number', dtModel, httpOptions);
275
+ }
276
+ getUserStagingInfo(data) {
277
+ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json' }) };
278
+ return this.http.post(environment.apiUrl + '/utilities/ext/ur/signup/staging', data, httpOptions);
279
+ }
280
+ costCheckOut(token, cost) {
281
+ const params = {
282
+ 'Content-Type': 'application/json',
283
+ 'Auth-Key': "Bearer " + token
284
+ };
285
+ const httpOptions = { headers: new HttpHeaders(params) };
286
+ return this.http.get(environment.apiUrl + '/utilities/softphone/number/checkout/' + cost, httpOptions);
287
+ }
288
+ buyNumber(token, dtModel) {
289
+ const params = {
290
+ 'Content-Type': 'application/json',
291
+ 'Auth-Key': "Bearer " + token
292
+ };
293
+ const httpOptions = { headers: new HttpHeaders(params) };
294
+ return this.http.post(environment.apiUrl + '/utilities/softphone/purchase/number', dtModel, httpOptions);
295
+ }
296
+ fetchCallerId(token) {
297
+ const params = {
298
+ 'Content-Type': 'application/json',
299
+ 'Auth-Key': "Bearer " + token
300
+ };
301
+ const httpOptions = { headers: new HttpHeaders(params) };
302
+ return this.http.get(environment.apiUrl + '/utilities/softphone/fetch/callerid', httpOptions);
303
+ }
304
+ updateNumberLabel(token, dtModel) {
305
+ const params = {
306
+ 'Content-Type': 'application/json',
307
+ 'Auth-Key': "Bearer " + token
308
+ };
309
+ const httpOptions = { headers: new HttpHeaders(params) };
310
+ return this.http.put(environment.apiUrl + '/utilities/softphone/update/number/label', dtModel, httpOptions);
311
+ }
312
+ releaseNumber(token, twilioNum) {
313
+ const params = {
314
+ 'Content-Type': 'application/json',
315
+ 'Auth-Key': "Bearer " + token
316
+ };
317
+ const httpOptions = { headers: new HttpHeaders(params) };
318
+ // return this.http.post<[]>(environment.apiUrl + '/utilities/softphone/delete/twilio/number', httpOptions);
319
+ return this.http.get(environment.apiUrl + '/utilities/softphone/delete/twilio/number/' + twilioNum, httpOptions);
320
+ }
321
+ // Call forwarding api's
322
+ sendOTP(token, dtModel) {
323
+ const params = {
324
+ 'Content-Type': 'application/json',
325
+ 'Auth-Key': "Bearer " + token
326
+ };
327
+ const httpOptions = { headers: new HttpHeaders(params) };
328
+ return this.http.post(environment.apiUrl + '/utilities/ext/send/otp', dtModel, httpOptions);
329
+ }
330
+ verifyOTP(token, dtModel) {
331
+ const params = {
332
+ 'Content-Type': 'application/json',
333
+ 'Auth-Key': "Bearer " + token
334
+ };
335
+ const httpOptions = { headers: new HttpHeaders(params) };
336
+ return this.http.post(environment.apiUrl + '/utilities/ext/verify/otp', dtModel, httpOptions);
337
+ }
338
+ updateCallForwarding(token, dtModel) {
339
+ const params = {
340
+ 'Content-Type': 'application/json',
341
+ 'Auth-Key': "Bearer " + token
342
+ };
343
+ const httpOptions = { headers: new HttpHeaders(params) };
344
+ return this.http.post(environment.apiUrl + '/utilities/softphone/configure/call/forwarding', dtModel, httpOptions);
345
+ }
346
+ getSingleNumForwardingSetting(token, number) {
347
+ const params = {
348
+ 'Content-Type': 'application/json',
349
+ 'Auth-Key': "Bearer " + token
350
+ };
351
+ const httpOptions = { headers: new HttpHeaders(params) };
352
+ return this.http.get(environment.apiUrl + '/utilities/softphone/view/call/forwarding/' + number, httpOptions);
353
+ }
354
+ deleteCallForwarding(token, dtModel) {
355
+ const params = {
356
+ 'Content-Type': 'application/json',
357
+ 'Auth-Key': "Bearer " + token
358
+ };
359
+ const httpOptions = { headers: new HttpHeaders(params) };
360
+ return this.http.post(environment.apiUrl + '/utilities/softphone/call/forwarding/action', dtModel, httpOptions);
361
+ }
362
+ //calling prefernece api
363
+ displayID(token) {
364
+ const params = {
365
+ 'Content-Type': 'application/json',
366
+ 'Auth-Key': "Bearer " + token
367
+ };
368
+ const httpOptions = { headers: new HttpHeaders(params) };
369
+ return this.http.get(environment.apiUrl + '/utilities/softphone/display/callerids', httpOptions);
370
+ }
371
+ verifyNumber(token, dtModel) {
372
+ const params = {
373
+ 'Content-Type': 'application/json',
374
+ 'Auth-Key': "Bearer " + token
375
+ };
376
+ const httpOptions = { headers: new HttpHeaders(params) };
377
+ return this.http.post(environment.apiUrl + '/utilities/softphone/add/callerid', dtModel, httpOptions);
378
+ }
379
+ verifyStatus(token, dtModel) {
380
+ const params = {
381
+ 'Content-Type': 'application/json',
382
+ 'Auth-Key': "Bearer " + token
383
+ };
384
+ const httpOptions = { headers: new HttpHeaders(params) };
385
+ return this.http.get(environment.apiUrl + '/utilities/softphone/callerid/status/' + dtModel, httpOptions);
386
+ }
387
+ existingListmakeCallerID(token, dtModel) {
388
+ const params = {
389
+ 'Content-Type': 'application/json',
390
+ 'Auth-Key': "Bearer " + token
391
+ };
392
+ const httpOptions = { headers: new HttpHeaders(params) };
393
+ return this.http.post(environment.apiUrl + '/utilities/softphone/make/callerid', dtModel, httpOptions);
394
+ }
395
+ makeCallerID(token, dtModel, number) {
396
+ const params = {
397
+ 'Content-Type': 'application/json',
398
+ 'Auth-Key': "Bearer " + token
399
+ };
400
+ const httpOptions = { headers: new HttpHeaders(params) };
401
+ return this.http.post(environment.apiUrl + `/utilities/softphone/markas/callerid/${number}`, dtModel, httpOptions);
402
+ }
403
+ deleteCallerID(token, dtModel, id) {
404
+ const params = {
405
+ 'Content-Type': 'application/json',
406
+ 'Auth-Key': "Bearer " + token
407
+ };
408
+ const httpOptions = { headers: new HttpHeaders(params) };
409
+ return this.http.post(environment.apiUrl + `/utilities/softphone/delete/callerid/${id}`, dtModel, httpOptions);
410
+ }
411
+ deregisterCallerID(token, dtModel, id) {
412
+ const params = {
413
+ 'Content-Type': 'application/json',
414
+ 'Auth-Key': "Bearer " + token
415
+ };
416
+ const httpOptions = { headers: new HttpHeaders(params) };
417
+ return this.http.post(environment.apiUrl + `/utilities/softphone/deregister/callerid/${id}`, dtModel, httpOptions);
418
+ }
419
+ updateCallerIDLabel(token, dtModel) {
420
+ const params = {
421
+ 'Content-Type': 'application/json',
422
+ 'Auth-Key': "Bearer " + token
423
+ };
424
+ const httpOptions = { headers: new HttpHeaders(params) };
425
+ return this.http.put(environment.apiUrl + '/utilities/softphone/update/callerid/label', dtModel, httpOptions);
426
+ }
427
+ initiateCall(payload) {
428
+ return this.fetchBlockedCountries().pipe(switchMap(blockedCountries => {
429
+ return this.ipAddressService.getIpAddressInfo().pipe(switchMap(ipAddressInfo => {
430
+ const params = {
431
+ 'Content-Type': 'application/json',
432
+ 'Auth-Key': 'Bearer ' + localStorage.getItem('ext_token'),
433
+ 'ip-address': ipAddressInfo.ip,
434
+ 'ip-country': ipAddressInfo.address.country,
435
+ };
436
+ payload = { ...payload, proxy: ipAddressInfo.proxy.toString() };
437
+ const httpOptions = { headers: new HttpHeaders(params) };
438
+ return this.http.post(environment.apiUrl + '/utilities/ext/ur/initiate/call', payload, httpOptions).pipe(catchError(error => {
439
+ return throwError(error);
440
+ }));
441
+ }), catchError(error => {
442
+ // Catch error from getIpAddressInfo
443
+ return throwError(error);
444
+ }));
445
+ }));
446
+ }
447
+ fetchBlockedCountries() {
448
+ return this.http.get(environment.apiUrl + '/global/master/ur/blacklisted/countrylist').pipe(map(response => {
449
+ if (response.response === 'Success' && Array.isArray(response.countries)) {
450
+ return response.countries.map((country) => country.isocode);
451
+ }
452
+ else {
453
+ throw new Error('Unable to fetch blocked countries');
454
+ }
455
+ }));
456
+ }
457
+ // initiateCall(payload: any): Observable<any> {
458
+ // return this.ipAddressService.getIpAddressInfo().pipe(
459
+ // switchMap(ipAddressInfo => {
460
+ // const params = {
461
+ // 'Content-Type': 'application/json',
462
+ // 'Auth-Key': 'Bearer ' + localStorage.getItem('ext_token'),
463
+ // 'ip-address': ipAddressInfo.ip,
464
+ // 'ip-country': ipAddressInfo.address.country
465
+ // };
466
+ // const httpOptions = { headers: new HttpHeaders(params) };
467
+ // return this.http.post<[]>(environment.apiUrl + '/utilities/ext/ur/initiate/call', payload, httpOptions);
468
+ // })
469
+ // );
470
+ // }
471
+ getIncomingCallToken() {
472
+ const params = {
473
+ 'Content-Type': 'application/json',
474
+ 'Auth-Key': "Bearer " + localStorage.getItem('ext_token')
475
+ };
476
+ const httpOptions = { headers: new HttpHeaders(params) };
477
+ return this.http.get(environment.apiUrl + '/utilities/twilio/incomingcall/token/web', httpOptions);
478
+ }
479
+ getOutgoingCallToken(payload) {
480
+ const params = {
481
+ 'Content-Type': 'application/json',
482
+ 'Auth-Key': "Bearer " + localStorage.getItem('ext_token'),
483
+ 'c2c-request': window.location.hostname
484
+ };
485
+ const httpOptions = { headers: new HttpHeaders(params) };
486
+ return this.http.post(environment.apiUrl + '/utilities/ext/ur/generate/token', payload, httpOptions);
487
+ }
488
+ getCallRecording(callSid) {
489
+ const headers = new HttpHeaders({
490
+ 'Content-Type': 'application/json',
491
+ 'Auth-Key': 'Bearer ' + localStorage.getItem('ext_token')
492
+ });
493
+ const httpOptions = { headers: headers };
494
+ return this.http.post(environment.apiUrl + '/utilities/twilio/call/callrecording?callSid=' + callSid, {}, httpOptions);
495
+ }
496
+ pauseOrResumeRecording(callSid, status) {
497
+ const headers = new HttpHeaders({
498
+ 'Content-Type': 'application/json',
499
+ 'Auth-Key': 'Bearer ' + localStorage.getItem('ext_token')
500
+ });
501
+ const httpOptions = { headers: headers };
502
+ return this.http.post(environment.apiUrl + `/utilities/twilio/update/recording/status?callSid=${callSid}&status=${status}`, {}, httpOptions);
503
+ }
504
+ getCallStatus(callAuthId) {
505
+ const headers = new HttpHeaders({
506
+ 'Content-Type': 'application/json',
507
+ 'Auth-Key': 'Bearer ' + localStorage.getItem('ext_token')
508
+ });
509
+ const httpOptions = { headers: headers };
510
+ return this.http.get(environment.apiUrl + `/utilities/twilio/call/status/${callAuthId}`, httpOptions);
511
+ }
512
+ //sms api
513
+ sendSms(c2c_latlong, c2c_request, dtModel) {
514
+ return this.fetchBlockedCountries().pipe(switchMap(blockedCountries => {
515
+ return this.ipAddressService.getIpAddressInfo().pipe(switchMap((ipAddressInfo) => {
516
+ if (blockedCountries.includes(ipAddressInfo.address.countryCode)) {
517
+ return throwError({ message: ['User from blocked country'] });
518
+ }
519
+ else {
520
+ const params = {
521
+ 'Content-Type': 'application/json',
522
+ 'c2c-latlong': c2c_latlong,
523
+ 'c2c-request': c2c_request,
524
+ 'ip-address': ipAddressInfo.ip,
525
+ 'ip-country': ipAddressInfo.address.country,
526
+ };
527
+ dtModel = { ...dtModel, proxy: ipAddressInfo.proxy.toString() };
528
+ const httpOptions = { headers: new HttpHeaders(params) };
529
+ return this.http.post(environment.apiUrl + '/utilities/ext/ur/send/sms', dtModel, httpOptions).pipe(catchError(error => {
530
+ // Handle HTTP errors here if needed
531
+ return throwError(error);
532
+ }));
533
+ }
534
+ }), catchError(error => {
535
+ // Catch error from getIpAddressInfo
536
+ return throwError(error);
537
+ }));
538
+ }), catchError(error => {
539
+ // Catch error from fetchBlockedCountries
540
+ return throwError(error);
541
+ }));
542
+ }
543
+ // sendSms(c2c_latlong: string, c2c_request: string, dtModel: any): Observable<any> {
544
+ // return this.ipAddressService.getIpAddressInfo().pipe(
545
+ // switchMap(ipAddressInfo => {
546
+ // const params = {
547
+ // 'Content-Type': 'application/json',
548
+ // 'c2c-latlong': c2c_latlong,
549
+ // 'c2c-request': c2c_request,
550
+ // 'ip-address': ipAddressInfo.ip,
551
+ // 'ip-country': ipAddressInfo.address.country
552
+ // };
553
+ // const httpOptions = { headers: new HttpHeaders(params) };
554
+ // return this.http.post<[]>(environment.apiUrl + '/utilities/ext/ur/send/sms', dtModel, httpOptions);
555
+ // })
556
+ // );
557
+ // }
558
+ readContacts(token) {
559
+ const params = {
560
+ 'Content-Type': 'application/json',
561
+ 'Auth-Key': "Bearer " + token
562
+ };
563
+ const httpOptions = { headers: new HttpHeaders(params) };
564
+ return this.http.get(environment.apiUrl + '/utilities/phonebook/read/contacts', httpOptions);
565
+ }
566
+ sentSMS(token, pageSize, pageIndex) {
567
+ const headers = {
568
+ 'Content-Type': 'application/json',
569
+ 'Auth-Key': "Bearer " + token,
570
+ };
571
+ let params = new HttpParams();
572
+ params = params.set('size', pageSize || '10');
573
+ params = params.set('page', pageIndex || '1');
574
+ const httpOptions = { headers, params };
575
+ return this.http.get(environment.apiUrl + '/utilities/sms/sent/', httpOptions);
576
+ }
577
+ deleteSMS(token, recordIds, dtModel) {
578
+ const params = {
579
+ 'Content-Type': 'application/json',
580
+ 'Auth-Key': "Bearer " + token
581
+ };
582
+ const httpOptions = { headers: new HttpHeaders(params) };
583
+ return this.http.post(environment.apiUrl + `/utilities/sms/delete/${recordIds}`, dtModel, httpOptions);
584
+ }
585
+ // inboxSMS(token: string) {
586
+ // const params = {
587
+ // 'Content-Type': 'application/json',
588
+ // 'Auth-Key': "Bearer " + token
589
+ // }
590
+ // const httpOptions = { headers: new HttpHeaders(params) };
591
+ // return this.http.get<[]>(environment.apiUrl + '/utilities/sms/inbox', httpOptions);
592
+ // }
593
+ inboxSMS(token, page, size) {
594
+ const params = new HttpParams()
595
+ .set('page', page.toString())
596
+ .set('size', size.toString());
597
+ const httpOptions = {
598
+ headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Auth-Key': 'Bearer ' + token }),
599
+ params: params
600
+ };
601
+ return this.http.get(environment.apiUrl + '/utilities/sms/inbox', httpOptions);
602
+ }
603
+ readInboxStatus(token, recordId, dtModel) {
604
+ const params = {
605
+ 'Content-Type': 'application/json',
606
+ 'Auth-Key': "Bearer " + token
607
+ };
608
+ const httpOptions = { headers: new HttpHeaders(params) };
609
+ return this.http.post(environment.apiUrl + `/utilities/sms/markas/read/${recordId}`, dtModel, httpOptions);
610
+ }
611
+ markAsFavourite(token, recordIds, dtModel) {
612
+ const params = {
613
+ 'Content-Type': 'application/json',
614
+ 'Auth-Key': "Bearer " + token
615
+ };
616
+ const httpOptions = { headers: new HttpHeaders(params) };
617
+ return this.http.post(environment.apiUrl + `/utilities/sms/mark/favourite/${recordIds}`, dtModel, httpOptions);
618
+ }
619
+ markAsUnFavourite(token, recordIds, dtModel) {
620
+ const params = {
621
+ 'Content-Type': 'application/json',
622
+ 'Auth-Key': "Bearer " + token
623
+ };
624
+ const httpOptions = { headers: new HttpHeaders(params) };
625
+ return this.http.post(environment.apiUrl + `/utilities/sms/mark/unfavourite/${recordIds}`, dtModel, httpOptions);
626
+ }
627
+ viewfavouriteSMS(token, page, size) {
628
+ const params = new HttpParams()
629
+ .set('page', page.toString())
630
+ .set('size', size.toString());
631
+ const httpOptions = {
632
+ headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Auth-Key': 'Bearer ' + token }),
633
+ params: params
634
+ };
635
+ return this.http.get(environment.apiUrl + '/utilities/sms/view/favourite', httpOptions);
636
+ }
637
+ saveDraft(token, dtModel) {
638
+ const params = {
639
+ 'Content-Type': 'application/json',
640
+ 'Auth-Key': "Bearer " + token
641
+ };
642
+ const httpOptions = { headers: new HttpHeaders(params) };
643
+ return this.http.post(environment.apiUrl + '/utilities/sms/save/draft', dtModel, httpOptions);
644
+ }
645
+ viewDraft(token, page, size) {
646
+ const params = new HttpParams()
647
+ .set('page', page.toString())
648
+ .set('size', size.toString());
649
+ const httpOptions = {
650
+ headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Auth-Key': 'Bearer ' + token }),
651
+ params: params
652
+ };
653
+ return this.http.get(environment.apiUrl + '/utilities/sms/view/draft', httpOptions);
654
+ }
655
+ deleteDraftSMS(token, draftIds, dtModel) {
656
+ const params = {
657
+ 'Content-Type': 'application/json',
658
+ 'Auth-Key': "Bearer " + token
659
+ };
660
+ const httpOptions = { headers: new HttpHeaders(params) };
661
+ return this.http.post(environment.apiUrl + `/utilities/sms/delete/draft/${draftIds}`, dtModel, httpOptions);
662
+ }
663
+ //Address Book
664
+ viewContactLists(token) {
665
+ const params = {
666
+ 'Content-Type': 'application/json',
667
+ 'Auth-Key': "Bearer " + token
668
+ };
669
+ const httpOptions = { headers: new HttpHeaders(params) };
670
+ return this.http.get(environment.apiUrl + '/utilities/phonebook/read/contacts', httpOptions);
671
+ }
672
+ deleteContact(token, phonebookid, dtModel) {
673
+ const params = {
674
+ 'Content-Type': 'application/json',
675
+ 'Auth-Key': "Bearer " + token
676
+ };
677
+ const httpOptions = { headers: new HttpHeaders(params) };
678
+ return this.http.post(environment.apiUrl + `/utilities/phonebook/delete/contact/${phonebookid}`, dtModel, httpOptions);
679
+ }
680
+ updateFavContacts(token, dtModel) {
681
+ const params = {
682
+ 'Content-Type': 'application/json',
683
+ 'Auth-Key': "Bearer " + token
684
+ };
685
+ const httpOptions = { headers: new HttpHeaders(params) };
686
+ return this.http.post(environment.apiUrl + '/utilities/phonebook/update/favourite', dtModel, httpOptions);
687
+ }
688
+ // saveContacts(token: string, dtModel: any){
689
+ // const params = {
690
+ // 'Content-Type': 'application/json',
691
+ // 'Auth-Key': "Bearer " + token
692
+ // }
693
+ // const httpOptions = { headers: new HttpHeaders(params) };
694
+ // return this.http.post<[]>(environment.apiUrl + '/utilities/phonebook/add/contacts/manually',dtModel, httpOptions);
695
+ // }
696
+ uploadImage(token, dtModel) {
697
+ const params = {
698
+ //'Content-Type': 'multipart/form-data',
699
+ 'Auth-Key': "Bearer " + token
700
+ };
701
+ const httpOptions = { headers: new HttpHeaders(params) };
702
+ return this.http.post(environment.apiUrl + '/utilities/phonebook/upload/photo', dtModel, httpOptions);
703
+ }
704
+ //Call Histroy
705
+ recentCallHistory(token, page, size) {
706
+ const params = new HttpParams()
707
+ .set('page', page.toString())
708
+ .set('size', size.toString());
709
+ const httpOptions = {
710
+ headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Auth-Key': 'Bearer ' + token }),
711
+ params: params
712
+ };
713
+ return this.http.get(environment.apiUrl + '/utilities/phonebook/recent/calls', httpOptions);
714
+ }
715
+ deleteCalls(token, recordId, dtModel) {
716
+ const params = {
717
+ 'Content-Type': 'application/json',
718
+ 'Auth-Key': "Bearer " + token
719
+ };
720
+ const httpOptions = { headers: new HttpHeaders(params) };
721
+ return this.http.post(environment.apiUrl + `/utilities/phonebook/delete/calls/${recordId}`, dtModel, httpOptions);
722
+ }
723
+ //SMS History
724
+ recentSMSHistory(token, page, size) {
725
+ const params = new HttpParams()
726
+ .set('page', page.toString())
727
+ .set('size', size.toString());
728
+ const httpOptions = {
729
+ headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Auth-Key': 'Bearer ' + token }),
730
+ params: params
731
+ };
732
+ return this.http.get(environment.apiUrl + '/utilities/sms/history', httpOptions);
733
+ }
734
+ getRecentVoiceRecordingData(token, filterData, page, size) {
735
+ const params = new HttpParams()
736
+ .set('page', page.toString())
737
+ .set('size', size.toString());
738
+ const httpOptions = {
739
+ headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Auth-Key': 'Bearer ' + token }),
740
+ params: params
741
+ };
742
+ const filterObj = {};
743
+ return this.http.post(environment.apiUrl + '/utilities/phonebook/recent/voicerecording', filterData, httpOptions);
744
+ }
745
+ // save voice mail recording
746
+ saveVoiceMailReocrding(token, recordingData) {
747
+ const httpOptions = {
748
+ headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Auth-Key': 'Bearer ' + token }),
749
+ // params: params
750
+ };
751
+ return this.http.post(environment.apiUrl + '/utilities/phonebook/update/recording', recordingData, httpOptions);
752
+ }
753
+ deleteVoiceRecording(token, recordingId) {
754
+ const httpOptions = {
755
+ headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Auth-Key': 'Bearer ' + token }),
756
+ // params: params
757
+ };
758
+ return this.http.delete(environment.apiUrl + `/utilities/phonebook/delete/voicerecordings/${recordingId}`, httpOptions);
759
+ }
760
+ markAsVoiceRecording(token, recordingId, dtModel) {
761
+ const httpOptions = {
762
+ headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Auth-Key': 'Bearer ' + token }),
763
+ };
764
+ return this.http.post(environment.apiUrl + `/utilities/phonebook/markas/voicemail/read/${recordingId}`, dtModel, httpOptions);
765
+ }
766
+ editContactById(token, id) {
767
+ const params = {
768
+ 'Content-Type': 'application/json',
769
+ 'Auth-Key': "Bearer " + token
770
+ };
771
+ const httpOptions = { headers: new HttpHeaders(params) };
772
+ return this.http.get(environment.apiUrl + '/utilities/phonebook/search/contactid/' + id, httpOptions);
773
+ }
774
+ updateContacts(token, dtModel) {
775
+ const params = {
776
+ 'Content-Type': 'application/json',
777
+ 'Auth-Key': "Bearer " + token
778
+ };
779
+ const httpOptions = { headers: new HttpHeaders(params) };
780
+ return this.http.post(environment.apiUrl + '/utilities/phonebook/update/contact', dtModel, httpOptions);
781
+ }
782
+ uploadPhoto(payload) {
783
+ let httpOptions = {
784
+ headers: new HttpHeaders({
785
+ 'Auth-Key': "Bearer " + localStorage.getItem('ext_token')
786
+ })
787
+ };
788
+ return this.http.post(environment.apiUrl + '/utilities/phonebook/upload/photo', payload, httpOptions);
789
+ }
790
+ saveContacts(token, payload) {
791
+ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Auth-Key': "Bearer " + token }) };
792
+ return this.http.post(environment.apiUrl + '/utilities/phonebook/add/contacts/manually', payload, httpOptions);
793
+ }
794
+ //Dowload csv template
795
+ downloadCsvTemplate(token) {
796
+ const params = {
797
+ 'Content-Type': 'application/json',
798
+ 'Auth-Key': "Bearer " + token
799
+ };
800
+ const httpOptions = { headers: new HttpHeaders(params) };
801
+ return this.http.get(environment.apiUrl + '/utilities/phonebook/download/csv', httpOptions);
802
+ }
803
+ //Upload csv contacts
804
+ updateCSVContacts(token, dtModel) {
805
+ const params = {
806
+ 'Content-Type': 'application/json',
807
+ 'Auth-Key': "Bearer " + token
808
+ };
809
+ const httpOptions = { headers: new HttpHeaders(params) };
810
+ return this.http.post(environment.apiUrl + '/utilities/phonebook/add/contacts', dtModel, httpOptions);
811
+ }
812
+ //City list
813
+ GetAllCityList(_countryId, _stateName) {
814
+ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json' }) };
815
+ return this.http.get(environment.apiUrl + '/global/master/ur/citylist/' + _countryId + '/' + _stateName, httpOptions);
816
+ }
817
+ //zip list
818
+ GetAllZipList(dataModel) {
819
+ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json' }) };
820
+ return this.http.post(environment.apiUrl + '/global/master/ur/postalcodes', dataModel, httpOptions);
821
+ }
822
+ //Get all invoices
823
+ GetInvoices(viewType, token) {
824
+ const params = {
825
+ 'Content-Type': 'application/json',
826
+ 'Auth-Key': "Bearer " + token
827
+ };
828
+ const httpOptions = { headers: new HttpHeaders(params) };
829
+ return this.http.get(environment.apiUrl + '/utilities/billing/invoices/' + viewType, httpOptions);
830
+ }
831
+ DownloadInvoice(invoiceId, token) {
832
+ const httpOptions = {
833
+ responseType: 'blob',
834
+ headers: new HttpHeaders({
835
+ 'Content-Type': 'application/json',
836
+ 'Auth-Key': "Bearer " + token
837
+ })
838
+ };
839
+ return this.http.get(environment.apiUrl + '/utilities/billing/invoice/file/' + invoiceId, httpOptions);
840
+ }
841
+ GetInvoice(invoiceId) {
842
+ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json' }) };
843
+ return this.http.get(environment.apiUrl + '/utilities/billing/invoice/' + invoiceId, httpOptions);
844
+ }
845
+ //Billing summary
846
+ GetBillingSummary(token) {
847
+ const params = {
848
+ 'Content-Type': 'application/json',
849
+ 'Auth-Key': "Bearer " + token
850
+ };
851
+ const httpOptions = { headers: new HttpHeaders(params) };
852
+ return this.http.get(environment.apiUrl + '/utilities/billing/summary', httpOptions);
853
+ }
854
+ //Billing Plan & Pricing
855
+ GetAllPlans(token) {
856
+ const params = {
857
+ 'Content-Type': 'application/json',
858
+ 'Auth-Key': "Bearer " + token
859
+ };
860
+ const httpOptions = { headers: new HttpHeaders(params) };
861
+ return this.http.get(environment.apiUrl + '/utilities/billing/tiers', httpOptions);
862
+ }
863
+ //Pay Now
864
+ payNow(invoiceId, cardId, token) {
865
+ const params = {
866
+ 'Content-Type': 'application/json',
867
+ 'Auth-Key': "Bearer " + token
868
+ };
869
+ const data = {
870
+ "invoiceId": invoiceId,
871
+ "cardId": cardId
872
+ };
873
+ const httpOptions = { headers: new HttpHeaders(params) };
874
+ return this.http.post(environment.apiUrl + `/utilities/billing/pay/invoice/${invoiceId}/${cardId}`, data, httpOptions);
875
+ }
876
+ confirmInvoicePayment(customerId, token) {
877
+ const params = {
878
+ 'Content-Type': 'application/json',
879
+ 'Auth-Key': "Bearer " + token
880
+ };
881
+ const httpOptions = { headers: new HttpHeaders(params) };
882
+ return this.http.post(environment.apiUrl + `/utilities/billing/invoice/confirmation/${customerId}`, {}, httpOptions);
883
+ }
884
+ loadStripeMethods(sessionid, token) {
885
+ const params = {
886
+ 'Content-Type': 'application/json',
887
+ 'Auth-Key': "Bearer " + token
888
+ };
889
+ const httpOptions = { headers: new HttpHeaders(params) };
890
+ return this.http.get(environment.apiUrl + '/utilities/ext/duplicate/card/' + sessionid, httpOptions);
891
+ }
892
+ logOut(authKey) {
893
+ const auth = { "Auth-Key": authKey };
894
+ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Auth-Key': "Bearer " + authKey }) };
895
+ return this.http.post(environment.apiUrl + '/utilities/ext/logout', {}, httpOptions);
896
+ }
897
+ registerFCMToken(payload) {
898
+ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Auth-Key': "Bearer " + localStorage.getItem('ext_token') }) };
899
+ return this.http.post(environment.apiUrl + '/firebase/register/device', payload, httpOptions);
900
+ }
901
+ getNotificationList(pageIndex, pageSize) {
902
+ let params = new HttpParams();
903
+ params = params.set('size', pageSize || '10');
904
+ params = params.set('page', pageIndex || '1');
905
+ const headers = { 'Content-Type': 'application/json', 'Auth-Key': "Bearer " + localStorage.getItem('ext_token') };
906
+ const httpOptions = { headers, params };
907
+ return this.http.get(environment.apiUrl + '/utilities/sms/stored/notification', httpOptions);
908
+ }
909
+ getTotalUnreadCount() {
910
+ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Auth-Key': "Bearer " + localStorage.getItem('ext_token') }) };
911
+ return this.http.get(environment.apiUrl + '/utilities/sms/notification/count', httpOptions);
912
+ }
913
+ markNotification(payload) {
914
+ //const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Auth-Key': "Bearer " + localStorage.getItem('ext_token') }) };
915
+ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json' }) };
916
+ return this.http.post(environment.apiUrl + '/firebase/ur/markas/seen/' + payload.notificationId + '/' + payload.status, {}, httpOptions);
917
+ }
918
+ deleteNotification(payload) {
919
+ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Auth-Key': "Bearer " + localStorage.getItem('ext_token') }) };
920
+ return this.http.post(environment.apiUrl + '/firebase/markas/seen/' + payload.notificationId + '/' + payload.status, {}, httpOptions);
921
+ }
922
+ getVoicemailDetails(recordId, token) {
923
+ const params = {
924
+ 'Content-Type': 'application/json',
925
+ 'Auth-Key': "Bearer " + token
926
+ };
927
+ const httpOptions = { headers: new HttpHeaders(params) };
928
+ return this.http.get(environment.apiUrl + `/utilities/phonebook/play/voicerecordings/${recordId}`, httpOptions);
929
+ }
930
+ deleteNotifications(token, notificationIds) {
931
+ const params = {
932
+ 'Content-Type': 'application/json',
933
+ 'Auth-Key': "Bearer " + token
934
+ };
935
+ const httpOptions = { headers: new HttpHeaders(params) };
936
+ return this.http.get(environment.apiUrl + `/utilities/sms/delete/notification/${notificationIds}`, httpOptions);
937
+ }
938
+ getReports(filterData, pageIndex, pageSize) {
939
+ const filterObj = {
940
+ accountStatus: filterData.accountStatus || "",
941
+ dateType: filterData.dateType || "",
942
+ fieldType: filterData.fieldType || "",
943
+ fieldValue: filterData.fieldValue || "",
944
+ fromDate: filterData.fromDate || "",
945
+ pendingDues: filterData.pendingDues,
946
+ toDate: filterData.toDate || "",
947
+ };
948
+ const params = new HttpParams()
949
+ .set('page', pageIndex?.toString() || '1')
950
+ .set('size', pageSize?.toString() || '10');
951
+ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Auth-Key': "Bearer " + localStorage.getItem('ext_token') }),
952
+ params: params };
953
+ return this.http.post(environment.apiUrl + '/utilities/report/user/details', filterObj, httpOptions);
954
+ }
955
+ getReportsFilter() {
956
+ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Auth-Key': "Bearer " + localStorage.getItem('ext_token') }) };
957
+ return this.http.get(environment.apiUrl + '/utilities/report/dropdown', httpOptions);
958
+ }
959
+ getSyncReportData() {
960
+ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Auth-Key': 'Bearer ' + localStorage.getItem('ext_token') }) };
961
+ return this.http.post(environment.apiUrl + '/utilities/report/update/cache', {}, httpOptions);
962
+ }
963
+ getDownloadCSV(filterData, pageIndex, pageSize) {
964
+ const filterObj = {
965
+ accountStatus: filterData.accountStatus || "",
966
+ dateType: filterData.dateType || "",
967
+ fieldType: filterData.fieldType || "",
968
+ fieldValue: filterData.fieldValue || "",
969
+ fromDate: filterData.fromDate || "",
970
+ pendingDues: filterData.pendingDues,
971
+ toDate: filterData.toDate || "",
972
+ };
973
+ const params = new HttpParams()
974
+ .set('page', pageIndex > 0 ? pageIndex.toString() : '1')
975
+ .set('size', pageSize.toString());
976
+ const httpOptions = { headers: new HttpHeaders({ 'Auth-Key': "Bearer " + localStorage.getItem('ext_token') }), params: params };
977
+ return this.http.post(environment.apiUrl + '/utilities/report/csv/download', filterObj, httpOptions);
978
+ }
979
+ getDeleteFile(filePathValue) {
980
+ const httpOptions = {
981
+ body: { filePath: filePathValue },
982
+ headers: new HttpHeaders({ 'Auth-Key': "Bearer " + localStorage.getItem('ext_token') })
983
+ };
984
+ return this.http.post(environment.apiUrl + '/utilities/report/download/complete', httpOptions);
985
+ }
986
+ getDownloadPDF(filterData, pageIndex, pageSize) {
987
+ const filterObj = {
988
+ accountStatus: filterData.accountStatus || "",
989
+ dateType: filterData.dateType || "",
990
+ fieldType: filterData.fieldType || "",
991
+ fieldValue: filterData.fieldValue || "",
992
+ fromDate: filterData.fromDate || "",
993
+ pendingDues: filterData.pendingDues,
994
+ toDate: filterData.toDate || "",
995
+ };
996
+ const params = new HttpParams()
997
+ .set('page', pageIndex > 0 ? pageIndex.toString() : '1')
998
+ .set('size', pageSize.toString());
999
+ const httpOptions = { headers: new HttpHeaders({ 'Auth-Key': "Bearer " + localStorage.getItem('ext_token') }), params: params };
1000
+ return this.http.post(environment.apiUrl + '/utilities/report/pdf/download', filterObj, httpOptions);
1001
+ }
1002
+ getSuspendCategoriesData() {
1003
+ const httpOptions = {
1004
+ headers: new HttpHeaders({ 'Auth-Key': "Bearer " + localStorage.getItem('ext_token') })
1005
+ };
1006
+ return this.http.get(environment.apiUrl + '/utilities/report/suspend/category/dropdown', httpOptions);
1007
+ }
1008
+ getUserDetailsForSuspend(userIds) {
1009
+ const httpOptions = {
1010
+ headers: new HttpHeaders({ 'Auth-Key': "Bearer " + localStorage.getItem('ext_token') })
1011
+ };
1012
+ return this.http.post(`${environment.apiUrl}/admin/suspension/data/${encodeURIComponent(userIds)}`, null, httpOptions);
1013
+ }
1014
+ suspendUsers(userData) {
1015
+ const httpOptions = {
1016
+ headers: new HttpHeaders({ 'Auth-Key': "Bearer " + localStorage.getItem('ext_token') })
1017
+ };
1018
+ return this.http.post(`${environment.apiUrl}/admin/suspend/user`, userData, httpOptions);
1019
+ }
1020
+ resumeUser(userData) {
1021
+ const httpOptions = {
1022
+ headers: new HttpHeaders({ 'Auth-Key': "Bearer " + localStorage.getItem('ext_token') })
1023
+ };
1024
+ return this.http.post(`${environment.apiUrl}/admin/resume/user`, userData, httpOptions);
1025
+ }
1026
+ resumeUnpaidUsers(userData) {
1027
+ const httpOptions = {
1028
+ headers: new HttpHeaders({ 'Auth-Key': "Bearer " + localStorage.getItem('ext_token') })
1029
+ };
1030
+ return this.http.post(`${environment.apiUrl}/admin/resume/unpaid/user`, userData, httpOptions);
1031
+ }
1032
+ deleteUser(userData) {
1033
+ const httpOptions = {
1034
+ headers: new HttpHeaders({ 'Auth-Key': "Bearer " + localStorage.getItem('ext_token') })
1035
+ };
1036
+ return this.http.post(`${environment.apiUrl}/admin/delete/user`, userData, httpOptions);
1037
+ }
1038
+ deleteUserAccount() {
1039
+ const httpOptions = {
1040
+ headers: new HttpHeaders({ 'Auth-Key': "Bearer " + localStorage.getItem('ext_token') })
1041
+ };
1042
+ // return this.http.post<any[]>(`${environment.apiUrl}/utilities/ext/delete/user/`, userData, httpOptions);
1043
+ return this.ipAddressService.getIpAddressInfo().pipe(switchMap((ipAddressInfo) => {
1044
+ return this.http.post(`${environment.apiUrl}/utilities/ext/delete/user/${this.platform}/${ipAddressInfo.ip}`, null, httpOptions);
1045
+ }), catchError((error) => {
1046
+ // Properly catch errors
1047
+ return throwError(error);
1048
+ }));
1049
+ }
1050
+ getIPDetailsForCall(recordId, callStatus) {
1051
+ return this.ipAddressService.getIpAddressInfo().pipe(switchMap((ipAddressInfo) => {
1052
+ const IpObj = {
1053
+ 'ipAddress': ipAddressInfo.ip,
1054
+ 'ipCountry': ipAddressInfo.address.country,
1055
+ 'recordId': recordId,
1056
+ 'callStatus': callStatus,
1057
+ };
1058
+ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Auth-Key': "Bearer " + localStorage.getItem('ext_token') }) };
1059
+ return this.http.post(environment.apiUrl + '/utilities/twilio/incoming/call/ip', IpObj, httpOptions).pipe(catchError(postError => {
1060
+ // console.log('Error during HTTP POST request:', postError);
1061
+ return throwError(postError);
1062
+ }));
1063
+ }), catchError(ipError => {
1064
+ // console.log('Error fetching IP address info:', ipError);
1065
+ return throwError(ipError);
1066
+ }));
1067
+ }
1068
+ getIPDetailsForSMS(recordId) {
1069
+ return this.ipAddressService.getIpAddressInfo().pipe(switchMap((ipAddressInfo) => {
1070
+ const IpObj = {
1071
+ 'ipAddress': ipAddressInfo.ip,
1072
+ 'ipCountry': ipAddressInfo.address.country,
1073
+ 'recordId': recordId,
1074
+ };
1075
+ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Auth-Key': "Bearer " + localStorage.getItem('ext_token') }) };
1076
+ return this.http.post(environment.apiUrl + '/utilities/twilio/inbound/sms/ip', IpObj, httpOptions);
1077
+ }, catchError(error => {
1078
+ // Catch error from getIpAddressInfo
1079
+ return throwError(error);
1080
+ })));
1081
+ }
1082
+ GetAllAvailableCountryList() {
1083
+ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json' }) };
1084
+ return this.http.get(environment.apiUrl + '/global/master/ur/dedicated/countrylist');
1085
+ // return this.http.get<string>(environment.apiUrl + '/global/master/ur/countrylist', httpOptions);
1086
+ }
1087
+ getUserSettings() {
1088
+ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Auth-Key': 'Bearer ' + localStorage.getItem('ext_token') }) };
1089
+ return this.http.get(environment.apiUrl + '/utilities/ext/settings', httpOptions);
1090
+ }
1091
+ updateDialCodePreference(settings) {
1092
+ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Auth-Key': 'Bearer ' + localStorage.getItem('ext_token') }) };
1093
+ return this.http.put(environment.apiUrl + '/utilities/ext/update/settings', settings, httpOptions);
1094
+ }
1095
+ updateLongPressTime(time) {
1096
+ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Auth-Key': 'Bearer ' + localStorage.getItem('ext_token') }) };
1097
+ return this.http.put(environment.apiUrl + '/utilities/ext/update/longpress/' + time, {}, httpOptions);
1098
+ }
1099
+ exportToCSV() {
1100
+ const httpOptions = { headers: new HttpHeaders({ 'Auth-Key': 'Bearer ' + localStorage.getItem('ext_token') }), responseType: 'blob' };
1101
+ return this.http.get(environment.apiUrl + '/utilities/phonebook/download/contacts', httpOptions);
1102
+ }
1103
+ getDialPreferenceNums() {
1104
+ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Auth-Key': 'Bearer ' + localStorage.getItem('ext_token') }) };
1105
+ return this.http.get(environment.apiUrl + '/utilities/ext/dial/preference/dropdown', httpOptions);
1106
+ }
1107
+ updateVASSettings(token, dtModel) {
1108
+ const params = {
1109
+ 'Content-Type': 'application/json',
1110
+ 'Auth-Key': "Bearer " + token
1111
+ };
1112
+ const httpOptions = { headers: new HttpHeaders(params) };
1113
+ return this.http.post(environment.apiUrl + '/utilities/ext/value/added/service', dtModel, httpOptions);
1114
+ }
1115
+ updateVoiceMailSettings(token, dtModel) {
1116
+ const params = {
1117
+ 'Content-Type': 'application/json',
1118
+ 'Auth-Key': "Bearer " + token
1119
+ };
1120
+ const httpOptions = { headers: new HttpHeaders(params) };
1121
+ return this.http.post(environment.apiUrl + '/utilities/ext/update/voicemail/setting', dtModel, httpOptions);
1122
+ }
1123
+ updateVoiceRecordSettings(token, dtModel) {
1124
+ const params = {
1125
+ 'Content-Type': 'application/json',
1126
+ 'Auth-Key': "Bearer " + token
1127
+ };
1128
+ const httpOptions = { headers: new HttpHeaders(params) };
1129
+ return this.http.post(environment.apiUrl + '/utilities/ext/update/call/recording/setting', dtModel, httpOptions);
1130
+ }
1131
+ getManualLinks(deviceType) {
1132
+ return `${environment.apiUrl}/landing/support/ur/user/manual/${deviceType}`;
1133
+ }
1134
+ updateSignupProfile(body) {
1135
+ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Auth-Key': 'Bearer ' + localStorage.getItem('ext_token') }) };
1136
+ return this.http.put(environment.apiUrl + '/utilities/ext/ur/update/signup/profile', body, httpOptions);
1137
+ }
1138
+ getAdminSettings() {
1139
+ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Auth-Key': "Bearer " + localStorage.getItem('ext_token') }) };
1140
+ return this.http.get(environment.apiUrl + '/admin/settings', httpOptions);
1141
+ }
1142
+ updateActions(token, dtModel) {
1143
+ const params = {
1144
+ 'Content-Type': 'application/json',
1145
+ 'Auth-Key': "Bearer " + token
1146
+ };
1147
+ const httpOptions = { headers: new HttpHeaders(params) };
1148
+ return this.http.post(environment.apiUrl + '/admin/change/settings', dtModel, httpOptions);
1149
+ }
1150
+ updateValueAddedServices(token, dtModel) {
1151
+ const params = {
1152
+ 'Content-Type': 'application/json',
1153
+ 'Auth-Key': "Bearer " + token
1154
+ };
1155
+ const httpOptions = { headers: new HttpHeaders(params) };
1156
+ return this.http.post(environment.apiUrl + '/admin/value/added/service', dtModel, httpOptions);
1157
+ }
1158
+ deleteAdminUsers(token, userIds) {
1159
+ const httpOptions = {
1160
+ headers: new HttpHeaders({
1161
+ 'Content-Type': 'application/json',
1162
+ 'Auth-Key': 'Bearer ' + token
1163
+ })
1164
+ };
1165
+ return this.http.delete(environment.apiUrl + `/admin/delete/value/usage/${userIds}`, httpOptions);
1166
+ }
1167
+ getUserInformation(twilioAuthId) {
1168
+ const httpOptions = {
1169
+ headers: new HttpHeaders({
1170
+ 'Content-Type': 'application/json',
1171
+ 'Auth-Key': 'Bearer ' + this.token
1172
+ })
1173
+ };
1174
+ return this.http.get(environment.apiUrl + '/utilities/twilio/c2c/information/' + twilioAuthId, httpOptions);
1175
+ }
1176
+ }
1177
+ ExtensionService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ExtensionService, deps: [{ token: i1.HttpClient }, { token: i2.IpAddressService }], target: i0.ɵɵFactoryTarget.Injectable });
1178
+ ExtensionService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ExtensionService, providedIn: 'root' });
1179
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ExtensionService, decorators: [{
1180
+ type: Injectable,
1181
+ args: [{
1182
+ providedIn: 'root'
1183
+ }]
1184
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.IpAddressService }]; } });
1185
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5zaW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kaWFsYm94L3NyYy9saWIvc2VydmljZS9leHRlbnNpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBYyxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUM3RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBYyxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzNELE9BQU8sRUFBRSxVQUFVLEVBQWdCLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQU0xRSxNQUFNLE9BQU8sZ0JBQWdCO0lBRzNCLFVBQVUsQ0FBQyxPQUFlLEVBQUUsVUFBZTtRQUN6QyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUMvQixDQUFDO0lBQ0QsVUFBVTtRQUNSLE9BQU87WUFDTCxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1NBQzVCLENBQUM7SUFDSixDQUFDO0lBNkJELFdBQVcsQ0FBQyxRQUFhO1FBQ3ZCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxZQUFvQixJQUFnQixFQUMxQixnQkFBa0M7UUFEeEIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUMxQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBN0NwQyxZQUFPLEdBQVcsRUFBRSxDQUFDO1FBYXRCLGtCQUFh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QUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBYSxFQUFFLE9BQWU7UUFDN0MsTUFBTSxXQUFXLEdBQUc7WUFDbEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUN2QixjQUFjLEVBQUUsa0JBQWtCO2dCQUNsQyxVQUFVLEVBQUUsU0FBUyxHQUFHLEtBQUs7YUFDOUIsQ0FBQztTQUNILENBQUM7UUFDRixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFLLFdBQVcsQ0FBQyxNQUFNLEdBQUcsNkJBQTZCLE9BQU8sRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3hHLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxZQUFvQjtRQUNyQyxNQUFNLFdBQVcsR0FBRztZQUNsQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUM7Z0JBQ3ZCLGNBQWMsRUFBRSxrQkFBa0I7Z0JBQ2xDLFVBQVUsRUFBRSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUs7YUFDbkMsQ0FBQztTQUNILENBQUM7UUFDRixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFLLFdBQVcsQ0FBQyxNQUFNLEdBQUcsb0NBQW9DLEdBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ2hILENBQUM7OzhHQTN5Q1UsZ0JBQWdCO2tIQUFoQixnQkFBZ0IsY0FGZixNQUFNOzRGQUVQLGdCQUFnQjtrQkFINUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCdcclxuaW1wb3J0IHsgSHR0cEhlYWRlcnMgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGVudmlyb25tZW50IH0gZnJvbSBcIi4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudHNcIjtcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZGVib3VuY2VUaW1lLCBtYXAsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgSXBBZGRyZXNzU2VydmljZSB9IGZyb20gJy4vaXAtYWRkcmVzcy5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEV4dGVuc2lvblNlcnZpY2Uge1xyXG4gIHByaXZhdGUgY2FsbFNpZDogc3RyaW5nID0gJyc7XHJcbiAgcHJpdmF0ZSByZWNvcmRDYWxsOiBhbnk7XHJcbiAgc2V0Q2FsbFNpZChjYWxsU2lkOiBzdHJpbmcsIHJlY29yZENhbGw6IGFueSkge1xyXG4gICAgdGhpcy5jYWxsU2lkID0gY2FsbFNpZDtcclxuICAgIHRoaXMucmVjb3JkQ2FsbCA9IHJlY29yZENhbGw7XHJcbiAgfVxyXG4gIGdldENhbGxTaWQoKTogeyBjYWxsU2lkOiBzdHJpbmc7IHJlY29yZENhbGw6IGFueSB9IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGNhbGxTaWQ6IHRoaXMuY2FsbFNpZCxcclxuICAgICAgcmVjb3JkQ2FsbDogdGhpcy5yZWNvcmRDYWxsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG1lc3NhZ2VTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4oJycpO1xyXG4gIHByaXZhdGUgY2hhbm5lbElkID0gZW52aXJvbm1lbnQuY2hhbm5lbElkO1xyXG4gIGN1cnJlbnRNZXNzYWdlID0gdGhpcy5tZXNzYWdlU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIFxyXG4gcGxhdGZvcm09J3dlYic7XHJcblxyXG4gIHB1YmxpYyBkZWRpY2F0ZWRTdGF0ZVNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PignJyk7XHJcbiAgZGVkaWNhdGVkU3RhdGUgPSB0aGlzLmRlZGljYXRlZFN0YXRlU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuXHJcbiAgcHVibGljIGNhbGxlcklkU3RhdGVTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4oJycpO1xyXG4gIGNhbGxlcklkU3RhdGUgPSB0aGlzLmNhbGxlcklkU3RhdGVTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHB1YmxpYyBzZW5kU21zU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KCcnKTtcclxuICBzZW5kTWVzc2FnZSA9IHRoaXMuc2VuZFNtc1NvdXJjZS5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHVibGljIGRyYWZ0U21zU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KCcnKTtcclxuICBkcmFmdE1lc3NhZ2UgPSB0aGlzLmRyYWZ0U21zU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwdWJsaWMgaXNJbnB1dEZvY3VzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIHRva2VuOiBzdHJpbmcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJykgfHwgJyc7XHJcbiAgaXNOZXdDb250YWN0QWRkZWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICBpc1Byb2ZpbGVVcGRhdGVkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcblxyXG4gIHByaXZhdGUgY2FsbGVySWRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KG51bGwpO1xyXG4gIGNhbGxlcklkJCA9IHRoaXMuY2FsbGVySWRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBzZXRDYWxsZXJJZChjYWxsZXJJZDogYW55KSB7XHJcbiAgICB0aGlzLmNhbGxlcklkU3ViamVjdC5uZXh0KGNhbGxlcklkKTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcclxuICAgIHByaXZhdGUgaXBBZGRyZXNzU2VydmljZTogSXBBZGRyZXNzU2VydmljZVxyXG4gICAgKVxyXG4gICAgeyB9XHJcblxyXG4gIGNoYW5nZU1lc3NhZ2UobWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLm1lc3NhZ2VTb3VyY2UubmV4dChtZXNzYWdlKVxyXG4gIH1cclxuXHJcbiAgR2V0VXNlclVzYWdlKHRva2VuOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFtdPiB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgdG9rZW5cclxuICAgIH1cclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMocGFyYW1zKSB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL2V4dC91c2FnZScsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcblxyXG4gIEdldFVzZXJQcm9maWxlKHRva2VuOiBzdHJpbmcsIGRhdGE6YW55KTogT2JzZXJ2YWJsZTxbXT4ge1xyXG4gICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIHRva2VuXHJcbiAgICB9XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHBhcmFtcykgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvZXh0L3VzZXInLCBkYXRhLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuXHJcbiAgVXBkYXRlUHJvZmlsZSh1c2VyUHJvZmlsZTogYW55LCB0b2tlbjogc3RyaW5nKTogT2JzZXJ2YWJsZTxbXT4ge1xyXG4gICAgY29uc3QgdXNlclByb2ZpbGVPYmogPSB7XHJcbiAgICAgIFwiYmlsbGluZ0FkZHJlc3MxXCI6IHVzZXJQcm9maWxlLmJpbGxpbmdBZGRyZXNzMSxcclxuICAgICAgXCJiaWxsaW5nQWRkcmVzczJcIjogdXNlclByb2ZpbGUuYmlsbGluZ0FkZHJlc3MyLFxyXG4gICAgICBcImJpbGxpbmdDaXR5aWRcIjogdXNlclByb2ZpbGUuYmlsbGluZ0NpdHksXHJcbiAgICAgIFwiYmlsbGluZ0NvdW50cnlpZFwiOiB1c2VyUHJvZmlsZS5iaWxsaW5nQ291bnRyeSxcclxuICAgICAgXCJiaWxsaW5nU3RhdGVpZFwiOiB1c2VyUHJvZmlsZS5iaWxsaW5nU3RhdGUsXHJcbiAgICAgIFwiYmlsbGluZ1ppcGlkXCI6IHVzZXJQcm9maWxlLmJpbGxpbmdaaXAsXHJcbiAgICAgIFwiZW1haWxcIjogdXNlclByb2ZpbGUuZW1haWwsXHJcbiAgICAgIFwibW9iaWxlXCI6IHVzZXJQcm9maWxlLm1vYmlsZSxcclxuICAgICAgXCJjb3VudHJ5Y29kZVwiOiB1c2VyUHJvZmlsZS5jb3VudHJ5Y29kZSxcclxuICAgICAgXCJ0aW1lem9uZVwiOiB1c2VyUHJvZmlsZS50aW1lem9uZSxcclxuICAgICAgXCJmaXJzdG5hbWVcIjogdXNlclByb2ZpbGUuZmlyc3RuYW1lLFxyXG4gICAgICBcImxhc3RuYW1lXCI6IHVzZXJQcm9maWxlLmxhc3RuYW1lLFxyXG4gICAgICBcInNoaXBwaW5nQWRkcmVzczFcIjogKHVzZXJQcm9maWxlLnNoaXBwaW5nQWRkcmVzczEgIT09IG51bGwgJiYgdXNlclByb2ZpbGUuc2hpcHBpbmdBZGRyZXNzMSAhPT0gdW5kZWZpbmVkICYmIHVzZXJQcm9maWxlLnNoaXBwaW5nQWRkcmVzczEgIT09IFwiXCIpID8gdXNlclByb2ZpbGUuc2hpcHBpbmdBZGRyZXNzMSA6IHVzZXJQcm9maWxlLmJpbGxpbmdBZGRyZXNzMSxcclxuICAgICAgXCJzaGlwcGluZ0FkZHJlc3MyXCI6ICh1c2VyUHJvZmlsZS5zaGlwcGluZ0FkZHJlc3MyICE9PSBudWxsICYmIHVzZXJQcm9maWxlLnNoaXBwaW5nQWRkcmVzczIgIT09IHVuZGVmaW5lZCAmJiB1c2VyUHJvZmlsZS5zaGlwcGluZ0FkZHJlc3MyICE9PSBcIlwiKSA/IHVzZXJQcm9maWxlLnNoaXBwaW5nQWRkcmVzczIgOiB1c2VyUHJvZmlsZS5iaWxsaW5nQWRkcmVzczIsXHJcbiAgICAgIFwic2hpcHBpbmdDaXR5aWRcIjogKHVzZXJQcm9maWxlLnNoaXBwaW5nQ2l0eSAhPT0gbnVsbCAmJiB1c2VyUHJvZmlsZS5zaGlwcGluZ0NpdHkgIT09IHVuZGVmaW5lZCAmJiB1c2VyUHJvZmlsZS5zaGlwcGluZ0NpdHkgIT09IFwiXCIpID8gdXNlclByb2ZpbGUuc2hpcHBpbmdDaXR5IDogdXNlclByb2ZpbGUuYmlsbGluZ0NpdHksXHJcbiAgICAgIFwic2hpcHBpbmdDb3VudHJ5aWRcIjogKHVzZXJQcm9maWxlLnNoaXBwaW5nQ291bnRyeSAhPT0gbnVsbCAmJiB1c2VyUHJvZmlsZS5zaGlwcGluZ0NvdW50cnkgIT09IHVuZGVmaW5lZCAmJiB1c2VyUHJvZmlsZS5zaGlwcGluZ0NvdW50cnkgIT09IFwiXCIpID8gdXNlclByb2ZpbGUuc2hpcHBpbmdDb3VudHJ5IDogdXNlclByb2ZpbGUuYmlsbGluZ0NvdW50cnksXHJcbiAgICAgIFwic2hpcHBpbmdTdGF0ZWlkXCI6ICh1c2VyUHJvZmlsZS5zaGlwcGluZ1N0YXRlICE9PSBudWxsICYmIHVzZXJQcm9maWxlLnNoaXBwaW5nU3RhdGUgIT09IHVuZGVmaW5lZCAmJiB1c2VyUHJvZmlsZS5zaGlwcGluZ1N0YXRlICE9PSBcIlwiKSA/IHVzZXJQcm9maWxlLnNoaXBwaW5nU3RhdGUgOiB1c2VyUHJvZmlsZS5iaWxsaW5nU3RhdGUsXHJcbiAgICAgIFwic2hpcHBpbmdaaXBpZFwiOiAodXNlclByb2ZpbGUuc2hpcHBpbmdaaXAgIT09IG51bGwgJiYgdXNlclByb2ZpbGUuc2hpcHBpbmdaaXAgIT09IHVuZGVmaW5lZCAmJiB1c2VyUHJvZmlsZS5zaGlwcGluZ1ppcCAhPT0gXCJcIikgPyB1c2VyUHJvZmlsZS5zaGlwcGluZ1ppcCA6IHVzZXJQcm9maWxlLmJpbGxpbmdaaXAsXHJcbiAgICAgIFwiaW1hZ2VJZFwiOiAodXNlclByb2ZpbGUuaW1hZ2VJZCksXHJcbiAgICAgIFwiaW1hZ2VOYW1lXCI6ICh1c2VyUHJvZmlsZS5pbWFnZU5hbWUpLFxyXG4gICAgICBcImNvbXBhbnlOYW1lXCI6IHVzZXJQcm9maWxlLmNvbXBhbnlOYW1lLCBcclxuICAgICAgXCJjb21wYW55U2l6ZVwiOiB1c2VyUHJvZmlsZS5jb21wYW55U2l6ZSwgIFxyXG4gICAgICBcImNvbXBhbnlGaXJzdE5hbWVcIjogdXNlclByb2ZpbGUuY29tcGFueUZpcnN0TmFtZSwgIFxyXG4gICAgICBcImNvbXBhbnlMYXN0TmFtZVwiOiB1c2VyUHJvZmlsZS5jb21wYW55TGFzdE5hbWUsICBcclxuICAgICAgXCJjb21wYW55Q29udGFjdE51bWJlclwiOiB1c2VyUHJvZmlsZS5jb21wYW55Q29udGFjdE51bWJlclxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgdG9rZW5cclxuICAgIH1cclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMocGFyYW1zKSB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL2V4dC91cGRhdGUnLCB1c2VyUHJvZmlsZU9iaiwgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuICBkZWxldGVQcm9maWxlUGhvdG8odG9rZW46IHN0cmluZyk6IE9ic2VydmFibGU8W10+IHtcclxuICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyB0b2tlblxyXG4gICAgfVxyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgdG9rZW4gfSkgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvZXh0L2RlbGV0ZS9wcm9maWxlL3Bob3RvJywgcGFyYW1zLCBodHRwT3B0aW9ucyk7XHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0T3RwQ29kZShjb3VudHJ5Q29kZTogc3RyaW5nLCBudW1iZXI6IHN0cmluZywgbW9kZSA6IHN0cmluZywgdG9rZW46IHN0cmluZyl7XHJcblxyXG5cclxuICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyB0b2tlblxyXG4gICAgfVxyXG4gICAgY29uc3QgbnVtYmVyT2JqID0ge1xyXG4gICAgICBcImNvdW50cnljb2RlXCI6IGNvdW50cnlDb2RlLFxyXG4gICAgICBcIm51bWJlclwiOiBudW1iZXIsXHJcbiAgICAgIFwibW9kZVwiIDogbW9kZVxyXG4gICAgfVxyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyhwYXJhbXMpIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL2V4dC9zbXMvb3RwJywgbnVtYmVyT2JqLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG4gIGdldFZlcmlmeU1vYmlsZShjb3VudHJ5TmFtZTogc3RyaW5nLCBjb3VudHJ5Y29kZTogc3RyaW5nLCBudW1iZXI6IHN0cmluZywgb3RwOiBzdHJpbmcsdG9rZW46IHN0cmluZyl7XHJcbiAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgdG9rZW5cclxuICAgIH1cclxuICAgIGNvbnN0IHZlcmlmeU9iaiA9IHtcclxuICAgICAgXCJjb3VudHJ5TmFtZVwiOiBjb3VudHJ5TmFtZSxcclxuICAgICAgXCJjb3VudHJ5Y29kZVwiOiBjb3VudHJ5Y29kZSxcclxuICAgICAgXCJudW1iZXJcIjogbnVtYmVyLFxyXG4gICAgICBcIm90cFwiOiBvdHBcclxuICAgIH1cclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMocGFyYW1zKSB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9leHQvc21zL3ZlcmlmeS9vdHAnLCB2ZXJpZnlPYmosaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuICBjb25uZWN0V2l0aFN0cmlwZSh0b2tlbjogc3RyaW5nKTogT2JzZXJ2YWJsZTxbXT4ge1xyXG4gICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIHRva2VuXHJcbiAgICB9XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyB0b2tlbiB9KSB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9leHQvc3RyaXBlL2Nvbm5lY3QnLCBwYXJhbXMsIGh0dHBPcHRpb25zKTtcclxuXHJcbiAgfVxyXG5cclxuICBjb25uZWN0V2l0aFN0cmlwZVJlZGlyZWN0aW9uKHJlZGlyZWN0aW9uOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFtdPiB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgdG9rZW4sXHJcbiAgICAgIFwicmVkaXJlY3Rpb25cIjogcmVkaXJlY3Rpb25cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyB0b2tlbiB9KSB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyBgL3V0aWxpdGllcy9leHQvc3RyaXBlL2Nvbm5lY3QvJHtyZWRpcmVjdGlvbn1gLCBwYXJhbXMsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcblxyXG5cclxuICB2YWxpZGF0ZVN0cmlwZVNlc3Npb24oc2Vzc2lvbklkOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFtdPiB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgdG9rZW5cclxuICAgIH1cclxuICAgIGNvbnN0IGRhdGEgPSB7XHJcbiAgICAgIFwic2Vzc2lvbmlkXCI6IHNlc3Npb25JZCxcclxuICAgIH07XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHBhcmFtcykgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvZXh0L3ZhbGlkYXRlL3Nlc3Npb24nLCBkYXRhLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBsb2FkUGF5bWVudE1ldGhvZHModG9rZW46IHN0cmluZyk6IE9ic2VydmFibGU8W10+IHtcclxuICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyB0b2tlblxyXG4gICAgfVxyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyhwYXJhbXMpIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvZXh0L3BheW1lbnQvbWV0aG9kcycsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcblxyXG4gIHNldFBheW1lbnREZWZhdWx0TWV0aG9kKHBheW1lbnRNZXRob2RJZDogc3RyaW5nLCB0b2tlbjogc3RyaW5nKTogT2JzZXJ2YWJsZTxbXT4ge1xyXG4gICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIHRva2VuXHJcbiAgICB9XHJcbiAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICBcIm1ldGhvZGlkXCI6IHBheW1lbnRNZXRob2RJZCxcclxuICAgIH07XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHBhcmFtcykgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvZXh0L3VwZGF0ZS9kZWZhdWx0JywgZGF0YSwgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgc2VuZEVtYWlsVmVyaWZ5TGluayhlbWFpbHZhbDogYW55LCB0b2tlbjogc3RyaW5nKTogT2JzZXJ2YWJsZTxbXT4ge1xyXG4gICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIHRva2VuLFxyXG4gICAgICBcImVtYWlsXCI6IGVtYWlsdmFsXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgdG9rZW4gfSkgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvZXh0L3ZlcmlmeS9lbWFpbCcsIHBhcmFtcywgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgVmVyaWZ5RW1haWxMaW5rKGtleTogc3RyaW5nKTogT2JzZXJ2YWJsZTxbXT4ge1xyXG4gICAgY29uc3Qga2V5b2JqID0geyBcImtleVwiOiBrZXkgfTtcclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0pIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL2V4dC91ci92ZXJpZnkvcmVxdWVzdCcsIGtleW9iaiwgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgRGVsZXRlTWV0aG9kKHBheW1lbnRNZXRob2RJZDogc3RyaW5nLCB0b2tlbjogc3RyaW5nKTogT2JzZXJ2YWJsZTxbXT4ge1xyXG4gICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIHRva2VuXHJcbiAgICB9XHJcbiAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICBcIm1ldGhvZGlkXCI6IHBheW1lbnRNZXRob2RJZCxcclxuICAgIH07XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHBhcmFtcykgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvZXh0L2RldGFjaC9tZXRob2QnLCBkYXRhLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBWZXJpZnlTZXNzaW9uKHRva2VuOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFtdPiB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgdG9rZW5cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHBhcmFtcykgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9leHQvdmVyaWZ5L3Nlc3Npb24nLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBHZXRBbGxDb3VudHJ5TGlzdCgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSkgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PHN0cmluZz4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy9nbG9iYWwvbWFzdGVyL3VyL2NvdW50cnlsaXN0JywgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgR2V0QWxsU3RhdGVMaXN0KF9jb3VudHJ5SWQ6IGFueSk6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9KSB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8c3RyaW5nPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL2dsb2JhbC9tYXN0ZXIvdXIvc3RhdGVsaXN0LycgKyBfY291bnRyeUlkLFxyXG4gICAgICBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBMb2dvdXRVc2VyKGF1dGhLZXk6IGFueSk6IE9ic2VydmFibGU8W10+IHtcclxuICAgIGNvbnN0IGF1dGggPSB7IFwiQXV0aC1LZXlcIjogYXV0aEtleSB9XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGgtS2V5JzogYXV0aEtleSB9KSB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL2NsaWVudC91c2VyL2xvZ291dCcsIGF1dGgsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcblxyXG5cclxuICBwdXJjaGFzZWROdW1iZXIodG9rZW46IHN0cmluZyk6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgdG9rZW5cclxuICAgIH1cclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMocGFyYW1zKSB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8c3RyaW5nPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9zb2Z0cGhvbmUvdmlldy9wdXJjaGFzZWQvbnVtYmVyJywgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgYXZhaWxhYmxlTnVtYmVyKHRva2VuOiBzdHJpbmcsIGR0TW9kZWw6IGFueSk6IE9ic2VydmFibGU8W10+IHtcclxuICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgnLFxyXG4gICAgICAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIHRva2VuXHJcbiAgICB9XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHBhcmFtcykgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvc29mdHBob25lL2F2YWlsYWJsZS9udW1iZXInLCBkdE1vZGVsLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICB1ckF2YWlsYWJsZU51bWJlcih0b2tlbjogc3RyaW5nLCBkdE1vZGVsOiBhbnkpOiBPYnNlcnZhYmxlPFtdPiB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JyxcclxuICAgIH1cclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMocGFyYW1zKSB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9zb2Z0cGhvbmUvdXIvYXZhaWxhYmxlL251bWJlcicsIGR0TW9kZWwsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcblxyXG4gIHN0YWdpbmdOdW1iZXIodG9rZW46IHN0cmluZywgZHRNb2RlbDogYW55KTogT2JzZXJ2YWJsZTxbXT4ge1xyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSkgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvZXh0L3VyL3NhdmUvc3RhZ2luZy9udW1iZXInLCBkdE1vZGVsLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBzYXZlQ29tcGFueURldGFpbChkdE1vZGVsOiBhbnkpOiBPYnNlcnZhYmxlPFtdPiB7XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9KSB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9leHQvdXIvc2lnbnVwL2NvbXBhbnkvZGV0YWlscycsIGR0TW9kZWwsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcblxyXG4gIHNhdmVBZGRyZXNzSW5mbyhkdE1vZGVsOiBhbnkpOiBPYnNlcnZhYmxlPFtdPiB7XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9KSB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9leHQvdXIvc2lnbnVwL2FkZHJlc3MnLCBkdE1vZGVsLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBzYXZlU3RyaXBlSW5mbyh1c2VySWQ6IHN0cmluZyk6IE9ic2VydmFibGU8W10+IHtcclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0pIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL2V4dC91ci9zdHJpcGUvY29ubmVjdC8nKyB1c2VySWQsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcblxyXG4gIHNhdmVDYXJkSW5mbyhkdE1vZGVsOiBhbnkpOiBPYnNlcnZhYmxlPFtdPiB7XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9KSB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9leHQvdXIvc2F2ZS9jYXJkL2luZm8nLCBkdE1vZGVsLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG4gIGRlbGV0ZUNhcmQoZHRNb2RlbDogYW55KTogT2JzZXJ2YWJsZTxbXT4ge1xyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSkgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvZXh0L3VyL2RlbGV0ZS9zYXZlZC9jYXJkJywgZHRNb2RlbCwgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuICBwdXJjaGFzZVBsYW4oZHRNb2RlbDogYW55KTogT2JzZXJ2YWJsZTxbXT4ge1xyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSkgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvc29mdHBob25lL3VyL3B1cmNoYXNlL3NpZ251cC9udW1iZXInLCBkdE1vZGVsLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBnZXRVc2VyU3RhZ2luZ0luZm8oZGF0YTogYW55KTogT2JzZXJ2YWJsZTxbXT4ge1xyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSkgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvZXh0L3VyL3NpZ251cC9zdGFnaW5nJyxkYXRhLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBjb3N0Q2hlY2tPdXQodG9rZW46IHN0cmluZywgY29zdDogYW55KTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcclxuICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyB0b2tlblxyXG4gICAgfVxyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyhwYXJhbXMpIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxzdHJpbmc+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3NvZnRwaG9uZS9udW1iZXIvY2hlY2tvdXQvJyArIGNvc3QsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcbiAgYnV5TnVtYmVyKHRva2VuOiBzdHJpbmcsIGR0TW9kZWw6IGFueSk6IE9ic2VydmFibGU8W10+IHtcclxuICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyB0b2tlblxyXG4gICAgfVxyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyhwYXJhbXMpIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3NvZnRwaG9uZS9wdXJjaGFzZS9udW1iZXInLCBkdE1vZGVsLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBmZXRjaENhbGxlcklkKHRva2VuOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIHRva2VuXHJcbiAgICB9XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHBhcmFtcykgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PHN0cmluZz4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvc29mdHBob25lL2ZldGNoL2NhbGxlcmlkJywgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlTnVtYmVyTGFiZWwodG9rZW46IHN0cmluZywgZHRNb2RlbDogYW55KTogT2JzZXJ2YWJsZTxbXT4ge1xyXG4gICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIHRva2VuXHJcbiAgICB9XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHBhcmFtcykgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucHV0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9zb2Z0cGhvbmUvdXBkYXRlL251bWJlci9sYWJlbCcsIGR0TW9kZWwsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcblxyXG4gIHJlbGVhc2VOdW1iZXIodG9rZW46IHN0cmluZywgdHdpbGlvTnVtOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFtdPiB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgdG9rZW5cclxuICAgIH1cclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMocGFyYW1zKSB9O1xyXG4gICAgLy8gcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9zb2Z0cGhvbmUvZGVsZXRlL3R3aWxpby9udW1iZXInLCBodHRwT3B0aW9ucyk7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvc29mdHBob25lL2RlbGV0ZS90d2lsaW8vbnVtYmVyLycrdHdpbGlvTnVtLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICAvLyBDYWxsIGZvcndhcmRpbmcgYXBpJ3NcclxuXHJcbiAgc2VuZE9UUCh0b2tlbjogc3RyaW5nLCBkdE1vZGVsOiBhbnkpOiBPYnNlcnZhYmxlPFtdPiB7XHJcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgdG9rZW5cclxuICAgICAgfVxyXG4gICAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHBhcmFtcykgfTtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9leHQvc2VuZC9vdHAnLCBkdE1vZGVsLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG4gIHZlcmlmeU9UUCh0b2tlbjogc3RyaW5nLCBkdE1vZGVsOiBhbnkpOiBPYnNlcnZhYmxlPFtdPiB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgdG9rZW5cclxuICAgIH1cclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMocGFyYW1zKSB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9leHQvdmVyaWZ5L290cCcsIGR0TW9kZWwsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcbiAgdXBkYXRlQ2FsbEZvcndhcmRpbmcodG9rZW46IHN0cmluZywgZHRNb2RlbDogYW55KTogT2JzZXJ2YWJsZTxbXT4ge1xyXG4gICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIHRva2VuXHJcbiAgICB9XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHBhcmFtcykgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvc29mdHBob25lL2NvbmZpZ3VyZS9jYWxsL2ZvcndhcmRpbmcnLCBkdE1vZGVsLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG4gIGdldFNpbmdsZU51bUZvcndhcmRpbmdTZXR0aW5nKHRva2VuOnN0cmluZywgbnVtYmVyOnN0cmluZyl7XHJcbiAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgdG9rZW5cclxuICAgIH1cclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMocGFyYW1zKSB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3NvZnRwaG9uZS92aWV3L2NhbGwvZm9yd2FyZGluZy8nK251bWJlciwgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuICBkZWxldGVDYWxsRm9yd2FyZGluZyh0b2tlbjogc3RyaW5nLCBkdE1vZGVsOiBhbnkpOiBPYnNlcnZhYmxlPFtdPiB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgdG9rZW5cclxuICAgIH1cclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMocGFyYW1zKSB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9zb2Z0cGhvbmUvY2FsbC9mb3J3YXJkaW5nL2FjdGlvbicsIGR0TW9kZWwsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcbiAgXHJcblxyXG5cclxuICAvL2NhbGxpbmcgcHJlZmVybmVjZSBhcGlcclxuICBkaXNwbGF5SUQodG9rZW46IHN0cmluZyk6IE9ic2VydmFibGU8W10+IHtcclxuICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyB0b2tlblxyXG4gICAgfVxyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyhwYXJhbXMpIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvc29mdHBob25lL2Rpc3BsYXkvY2FsbGVyaWRzJywgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuICB2ZXJpZnlOdW1iZXIodG9rZW46IHN0cmluZywgZHRNb2RlbDogYW55KTogT2JzZXJ2YWJsZTxbXT4ge1xyXG4gICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIHRva2VuXHJcbiAgICB9XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHBhcmFtcykgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvc29mdHBob25lL2FkZC9jYWxsZXJpZCcsIGR0TW9kZWwsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcblxyXG4gIHZlcmlmeVN0YXR1cyh0b2tlbjogc3RyaW5nLCBkdE1vZGVsOiBhbnkpOiBPYnNlcnZhYmxlPFtdPiB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgdG9rZW5cclxuICAgIH1cclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMocGFyYW1zKSB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3NvZnRwaG9uZS9jYWxsZXJpZC9zdGF0dXMvJyArIGR0TW9kZWwsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcblxyXG4gIGV4aXN0aW5nTGlzdG1ha2VDYWxsZXJJRCh0b2tlbjogc3RyaW5nLCBkdE1vZGVsOiBhbnkpOiBPYnNlcnZhYmxlPFtdPiB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgdG9rZW5cclxuICAgIH1cclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMocGFyYW1zKSB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9zb2Z0cGhvbmUvbWFrZS9jYWxsZXJpZCcsIGR0TW9kZWwsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcblxyXG4gIG1ha2VDYWxsZXJJRCh0b2tlbjogc3RyaW5nLCBkdE1vZGVsOiBhbnksIG51bWJlcjogYW55KTogT2JzZXJ2YWJsZTxbXT4ge1xyXG4gICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIHRva2VuXHJcbiAgICB9XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHBhcmFtcykgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgYC91dGlsaXRpZXMvc29mdHBob25lL21hcmthcy9jYWxsZXJpZC8ke251bWJlcn1gLCBkdE1vZGVsLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBkZWxldGVDYWxsZXJJRCh0b2tlbjogc3RyaW5nLCBkdE1vZGVsOiBhbnksIGlkOiBhbnkpOiBPYnNlcnZhYmxlPFtdPiB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgdG9rZW5cclxuICAgIH1cclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMocGFyYW1zKSB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyBgL3V0aWxpdGllcy9zb2Z0cGhvbmUvZGVsZXRlL2NhbGxlcmlkLyR7aWR9YCwgZHRNb2RlbCwgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgZGVyZWdpc3RlckNhbGxlcklEKHRva2VuOiBzdHJpbmcsIGR0TW9kZWw6IGFueSwgaWQ6IGFueSk6IE9ic2VydmFibGU8W10+IHtcclxuICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyB0b2tlblxyXG4gICAgfVxyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyhwYXJhbXMpIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8W10+KGVudmlyb25tZW50LmFwaVVybCArIGAvdXRpbGl0aWVzL3NvZnRwaG9uZS9kZXJlZ2lzdGVyL2NhbGxlcmlkLyR7aWR9YCwgZHRNb2RlbCwgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlQ2FsbGVySURMYWJlbCh0b2tlbjogc3RyaW5nLCBkdE1vZGVsOiBhbnkpOiBPYnNlcnZhYmxlPFtdPiB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgdG9rZW5cclxuICAgIH1cclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMocGFyYW1zKSB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3NvZnRwaG9uZS91cGRhdGUvY2FsbGVyaWQvbGFiZWwnLCBkdE1vZGVsLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBpbml0aWF0ZUNhbGwocGF5bG9hZDogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmZldGNoQmxvY2tlZENvdW50cmllcygpLnBpcGUoXHJcbiAgICAgIHN3aXRjaE1hcChibG9ja2VkQ291bnRyaWVzID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pcEFkZHJlc3NTZXJ2aWNlLmdldElwQWRkcmVzc0luZm8oKS5waXBlKFxyXG4gICAgICAgICAgc3dpdGNoTWFwKGlwQWRkcmVzc0luZm8gPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICAgICAgICAgICAnQXV0aC1LZXknOiAnQmVhcmVyICcgKyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJyksXHJcbiAgICAgICAgICAgICAgICAnaXAtYWRkcmVzcyc6IGlwQWRkcmVzc0luZm8uaXAsXHJcbiAgICAgICAgICAgICAgICAnaXAtY291bnRyeSc6IGlwQWRkcmVzc0luZm8uYWRkcmVzcy5jb3VudHJ5LFxyXG4gICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgcGF5bG9hZCA9IHsuLi5wYXlsb2FkLCBwcm94eTppcEFkZHJlc3NJbmZvLnByb3h5LnRvU3RyaW5nKCl9XHJcbiAgICAgICAgICAgICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyhwYXJhbXMpIH07XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9leHQvdXIvaW5pdGlhdGUvY2FsbCcsIHBheWxvYWQsIGh0dHBPcHRpb25zKS5waXBlKFxyXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgICAgIH0pLCBcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcclxuICAgICAgICAgICAgLy8gQ2F0Y2ggZXJyb3IgZnJvbSBnZXRJcEFkZHJlc3NJbmZvXHJcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGVycm9yKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG4gIFxyXG4gIGZldGNoQmxvY2tlZENvdW50cmllcygpOiBPYnNlcnZhYmxlPHN0cmluZ1tdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxhbnk+KGVudmlyb25tZW50LmFwaVVybCArICcvZ2xvYmFsL21hc3Rlci91ci9ibGFja2xpc3RlZC9jb3VudHJ5bGlzdCcpLnBpcGUoXHJcbiAgICAgIG1hcChyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnJlc3BvbnNlID09PSAnU3VjY2VzcycgJiYgQXJyYXkuaXNBcnJheShyZXNwb25zZS5jb3VudHJpZXMpKSB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuY291bnRyaWVzLm1hcCgoY291bnRyeTogYW55KSA9PiBjb3VudHJ5Lmlzb2NvZGUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmZXRjaCBibG9ja2VkIGNvdW50cmllcycpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG4gIFxyXG4gIC8vIGluaXRpYXRlQ2FsbChwYXlsb2FkOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMuaXBBZGRyZXNzU2VydmljZS5nZXRJcEFkZHJlc3NJbmZvKCkucGlwZShcclxuICAvLyAgICAgc3dpdGNoTWFwKGlwQWRkcmVzc0luZm8gPT4ge1xyXG4gIC8vICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAvLyAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgLy8gICAgICAgICAnQXV0aC1LZXknOiAnQmVhcmVyICcgKyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJyksXHJcbiAgLy8gICAgICAgICAnaXAtYWRkcmVzcyc6IGlwQWRkcmVzc0luZm8uaXAsXHJcbiAgLy8gICAgICAgICAnaXAtY291bnRyeSc6IGlwQWRkcmVzc0luZm8uYWRkcmVzcy5jb3VudHJ5XHJcbiAgLy8gICAgICAgfTtcclxuICAvLyAgICAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHBhcmFtcykgfTtcclxuICAvLyAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL2V4dC91ci9pbml0aWF0ZS9jYWxsJywgcGF5bG9hZCwgaHR0cE9wdGlvbnMpO1xyXG4gIC8vICAgICB9KVxyXG4gIC8vICAgKTtcclxuICAvLyB9XHJcbiAgZ2V0SW5jb21pbmdDYWxsVG9rZW4oKSB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpXHJcbiAgICB9XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHBhcmFtcykgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy90d2lsaW8vaW5jb21pbmdjYWxsL3Rva2VuL3dlYicsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcbiAgZ2V0T3V0Z29pbmdDYWxsVG9rZW4ocGF5bG9hZDogYW55KSB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpLFxyXG4gICAgICAnYzJjLXJlcXVlc3QnOiB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWVcclxuICAgIH1cclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMocGFyYW1zKSB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9leHQvdXIvZ2VuZXJhdGUvdG9rZW4nLCBwYXlsb2FkLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG4gIGdldENhbGxSZWNvcmRpbmcoY2FsbFNpZDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgJ0F1dGgtS2V5JzogJ0JlYXJlciAnICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpXHJcbiAgICB9KTtcclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBoZWFkZXJzIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvdHdpbGlvL2NhbGwvY2FsbHJlY29yZGluZz9jYWxsU2lkPScgKyBjYWxsU2lkLCB7fSwgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuICBwYXVzZU9yUmVzdW1lUmVjb3JkaW5nKGNhbGxTaWQ6IHN0cmluZyxzdGF0dXM6IGFueSkge1xyXG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICdBdXRoLUtleSc6ICdCZWFyZXIgJyArIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKVxyXG4gICAgfSk7XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogaGVhZGVycyB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGVudmlyb25tZW50LmFwaVVybCArIGAvdXRpbGl0aWVzL3R3aWxpby91cGRhdGUvcmVjb3JkaW5nL3N0YXR1cz9jYWxsU2lkPSR7Y2FsbFNpZH0mc3RhdHVzPSR7c3RhdHVzfWAse30sIGh0dHBPcHRpb25zKTtcclxuICB9XHJcbiAgZ2V0Q2FsbFN0YXR1cyhjYWxsQXV0aElkOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoe1xyXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAnQXV0aC1LZXknOiAnQmVhcmVyICcgKyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJylcclxuICAgIH0pO1xyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IGhlYWRlcnMgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVudmlyb25tZW50LmFwaVVybCArIGAvdXRpbGl0aWVzL3R3aWxpby9jYWxsL3N0YXR1cy8ke2NhbGxBdXRoSWR9YCwgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgLy9zbXMgYXBpXHJcbiAgc2VuZFNtcyhjMmNfbGF0bG9uZzogc3RyaW5nLCBjMmNfcmVxdWVzdDogc3RyaW5nLCBkdE1vZGVsOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZmV0Y2hCbG9ja2VkQ291bnRyaWVzKCkucGlwZShcclxuICAgICAgc3dpdGNoTWFwKGJsb2NrZWRDb3VudHJpZXMgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmlwQWRkcmVzc1NlcnZpY2UuZ2V0SXBBZGRyZXNzSW5mbygpLnBpcGUoXHJcbiAgICAgICAgICBzd2l0Y2hNYXAoKGlwQWRkcmVzc0luZm86IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoYmxvY2tlZENvdW50cmllcy5pbmNsdWRlcyhpcEFkZHJlc3NJbmZvLmFkZHJlc3MuY291bnRyeUNvZGUpKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoeyBtZXNzYWdlOiBbJ1VzZXIgZnJvbSBibG9ja2VkIGNvdW50cnknXSB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAgICAgICAgICAgJ2MyYy1sYXRsb25nJzogYzJjX2xhdGxvbmcsXHJcbiAgICAgICAgICAgICAgICAnYzJjLXJlcXVlc3QnOiBjMmNfcmVxdWVzdCxcclxuICAgICAgICAgICAgICAgICdpcC1hZGRyZXNzJzogaXBBZGRyZXNzSW5mby5pcCxcclxuICAgICAgICAgICAgICAgICdpcC1jb3VudHJ5JzogaXBBZGRyZXNzSW5mby5hZGRyZXNzLmNvdW50cnksXHJcbiAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICBkdE1vZGVsID0geyAuLi5kdE1vZGVsLCBwcm94eTogaXBBZGRyZXNzSW5mby5wcm94eS50b1N0cmluZygpIH07XHJcbiAgICAgICAgICAgICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyhwYXJhbXMpIH07XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9leHQvdXIvc2VuZC9zbXMnLCBkdE1vZGVsLCBodHRwT3B0aW9ucykucGlwZShcclxuICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgSFRUUCBlcnJvcnMgaGVyZSBpZiBuZWVkZWRcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAvLyBDYXRjaCBlcnJvciBmcm9tIGdldElwQWRkcmVzc0luZm9cclxuICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgICB9KSxcclxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XHJcbiAgICAgICAgLy8gQ2F0Y2ggZXJyb3IgZnJvbSBmZXRjaEJsb2NrZWRDb3VudHJpZXNcclxuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnJvcik7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcblxyXG5cclxuXHJcblxyXG4gIC8vIHNlbmRTbXMoYzJjX2xhdGxvbmc6IHN0cmluZywgYzJjX3JlcXVlc3Q6IHN0cmluZywgZHRNb2RlbDogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAvLyAgIHJldHVybiB0aGlzLmlwQWRkcmVzc1NlcnZpY2UuZ2V0SXBBZGRyZXNzSW5mbygpLnBpcGUoXHJcbiAgLy8gICAgIHN3aXRjaE1hcChpcEFkZHJlc3NJbmZvID0+IHtcclxuICAvLyAgICAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgLy8gICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gIC8vICAgICAgICAgJ2MyYy1sYXRsb25nJzogYzJjX2xhdGxvbmcsXHJcbiAgLy8gICAgICAgICAnYzJjLXJlcXVlc3QnOiBjMmNfcmVxdWVzdCxcclxuICAvLyAgICAgICAgICdpcC1hZGRyZXNzJzogaXBBZGRyZXNzSW5mby5pcCxcclxuICAvLyAgICAgICAgICdpcC1jb3VudHJ5JzogaXBBZGRyZXNzSW5mby5hZGRyZXNzLmNvdW50cnlcclxuICAvLyAgICAgICB9O1xyXG4gIC8vICAgICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMocGFyYW1zKSB9O1xyXG4gIC8vICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvZXh0L3VyL3NlbmQvc21zJywgZHRNb2RlbCwgaHR0cE9wdGlvbnMpO1xyXG4gIC8vICAgICB9KVxyXG4gIC8vICAgKTtcclxuICAvLyB9XHJcbiAgcmVhZENvbnRhY3RzKHRva2VuOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyB0b2tlblxyXG4gICAgfVxyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyhwYXJhbXMpIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvcGhvbmVib29rL3JlYWQvY29udGFjdHMnLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBzZW50U01TKHRva2VuOiBzdHJpbmcsIHBhZ2VTaXplPzogc3RyaW5nLCBwYWdlSW5kZXg/OiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSB7XHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgdG9rZW4sXHJcbiAgICB9XHJcbiAgICBsZXQgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcclxuICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ3NpemUnLCBwYWdlU2l6ZSB8fCAnMTAnKTtcclxuICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ3BhZ2UnLCBwYWdlSW5kZXggfHwgJzEnKTtcclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzLCBwYXJhbXMgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9zbXMvc2VudC8nLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBkZWxldGVTTVModG9rZW46IHN0cmluZywgcmVjb3JkSWRzOiBhbnksIGR0TW9kZWw6IGFueSkge1xyXG4gICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIHRva2VuXHJcbiAgICB9XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHBhcmFtcykgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgYC91dGlsaXRpZXMvc21zL2RlbGV0ZS8ke3JlY29yZElkc31gLCBkdE1vZGVsLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICAvLyBpbmJveFNNUyh0b2tlbjogc3RyaW5nKSB7XHJcbiAgLy8gICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgLy8gICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgLy8gICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgdG9rZW5cclxuICAvLyAgIH1cclxuICAvLyAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMocGFyYW1zKSB9O1xyXG4gIC8vICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3Ntcy9pbmJveCcsIGh0dHBPcHRpb25zKTtcclxuICAvLyB9XHJcbiAgaW5ib3hTTVModG9rZW46IHN0cmluZywgcGFnZTogbnVtYmVyLCBzaXplOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKClcclxuICAgICAgLnNldCgncGFnZScsIHBhZ2UudG9TdHJpbmcoKSlcclxuICAgICAgLnNldCgnc2l6ZScsIHNpemUudG9TdHJpbmcoKSk7XHJcbiAgXHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgXHJcbiAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRoLUtleSc6ICdCZWFyZXIgJyArIHRva2VuIH0pLFxyXG4gICAgICBwYXJhbXM6IHBhcmFtc1xyXG4gICAgfTtcclxuICBcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9zbXMvaW5ib3gnLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG4gIHJlYWRJbmJveFN0YXR1cyh0b2tlbjogc3RyaW5nLCByZWNvcmRJZDogYW55LCBkdE1vZGVsOiBhbnkpIHtcclxuICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyB0b2tlblxyXG4gICAgfVxyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyhwYXJhbXMpIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8W10+KGVudmlyb25tZW50LmFwaVVybCArIGAvdXRpbGl0aWVzL3Ntcy9tYXJrYXMvcmVhZC8ke3JlY29yZElkfWAsIGR0TW9kZWwsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcbiAgbWFya0FzRmF2b3VyaXRlKHRva2VuOiBzdHJpbmcsIHJlY29yZElkczogYW55LCBkdE1vZGVsOiBhbnkpIHtcclxuICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyB0b2tlblxyXG4gICAgfVxyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyhwYXJhbXMpIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8W10+KGVudmlyb25tZW50LmFwaVVybCArIGAvdXRpbGl0aWVzL3Ntcy9tYXJrL2Zhdm91cml0ZS8ke3JlY29yZElkc31gLCBkdE1vZGVsLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBtYXJrQXNVbkZhdm91cml0ZSh0b2tlbjogc3RyaW5nLCByZWNvcmRJZHM6IGFueSwgZHRNb2RlbDogYW55KSB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgdG9rZW5cclxuICAgIH1cclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMocGFyYW1zKSB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyBgL3V0aWxpdGllcy9zbXMvbWFyay91bmZhdm91cml0ZS8ke3JlY29yZElkc31gLCBkdE1vZGVsLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG4gIHZpZXdmYXZvdXJpdGVTTVModG9rZW46IHN0cmluZywgcGFnZTogbnVtYmVyLCBzaXplOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKClcclxuICAgICAgLnNldCgncGFnZScsIHBhZ2UudG9TdHJpbmcoKSlcclxuICAgICAgLnNldCgnc2l6ZScsIHNpemUudG9TdHJpbmcoKSk7XHJcbiAgXHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgXHJcbiAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRoLUtleSc6ICdCZWFyZXIgJyArIHRva2VuIH0pLFxyXG4gICAgICBwYXJhbXM6IHBhcmFtc1xyXG4gICAgfTtcclxuICBcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9zbXMvdmlldy9mYXZvdXJpdGUnLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG4gIHNhdmVEcmFmdCh0b2tlbjogc3RyaW5nLCBkdE1vZGVsOiBhbnkpOiBPYnNlcnZhYmxlPFtdPiB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgdG9rZW5cclxuICAgIH1cclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMocGFyYW1zKSB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9zbXMvc2F2ZS9kcmFmdCcsIGR0TW9kZWwsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcblxyXG4gIHZpZXdEcmFmdCh0b2tlbjogc3RyaW5nLCBwYWdlOiBudW1iZXIsIHNpemU6IG51bWJlcikge1xyXG4gICAgY29uc3QgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKVxyXG4gICAgICAuc2V0KCdwYWdlJywgcGFnZS50b1N0cmluZygpKVxyXG4gICAgICAuc2V0KCdzaXplJywgc2l6ZS50b1N0cmluZygpKTtcclxuICBcclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBcclxuICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGgtS2V5JzogJ0JlYXJlciAnICsgdG9rZW4gfSksXHJcbiAgICAgIHBhcmFtczogcGFyYW1zXHJcbiAgICB9O1xyXG4gIFxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3Ntcy92aWV3L2RyYWZ0JywgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuICBcclxuICBkZWxldGVEcmFmdFNNUyh0b2tlbjogc3RyaW5nLCBkcmFmdElkczogYW55LCBkdE1vZGVsOiBhbnkpIHtcclxuICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyB0b2tlblxyXG4gICAgfVxyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyhwYXJhbXMpIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8W10+KGVudmlyb25tZW50LmFwaVVybCArIGAvdXRpbGl0aWVzL3Ntcy9kZWxldGUvZHJhZnQvJHtkcmFmdElkc31gLCBkdE1vZGVsLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICAvL0FkZHJlc3MgQm9vayBcclxuICB2aWV3Q29udGFjdExpc3RzKHRva2VuOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyB0b2tlblxyXG4gICAgfVxyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyhwYXJhbXMpIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvcGhvbmVib29rL3JlYWQvY29udGFjdHMnLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG4gIGRlbGV0ZUNvbnRhY3QodG9rZW46IHN0cmluZywgcGhvbmVib29raWQ6IGFueSwgZHRNb2RlbDogYW55KSB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgdG9rZW5cclxuICAgIH1cclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMocGFyYW1zKSB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyBgL3V0aWxpdGllcy9waG9uZWJvb2svZGVsZXRlL2NvbnRhY3QvJHtwaG9uZWJvb2tpZH1gLCBkdE1vZGVsLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG4gIHVwZGF0ZUZhdkNvbnRhY3RzKHRva2VuOiBzdHJpbmcsIGR0TW9kZWw6IGFueSkge1xyXG4gICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIHRva2VuXHJcbiAgICB9XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHBhcmFtcykgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvcGhvbmVib29rL3VwZGF0ZS9mYXZvdXJpdGUnLCBkdE1vZGVsLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG4gIC8vIHNhdmVDb250YWN0cyh0b2tlbjogc3RyaW5nLCBkdE1vZGVsOiBhbnkpe1xyXG4gIC8vICAgY29uc3QgcGFyYW1zID0ge1xyXG4gIC8vICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gIC8vICAgICAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIHRva2VuXHJcbiAgLy8gICB9XHJcblxyXG4gIC8vICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyhwYXJhbXMpIH07XHJcbiAgLy8gICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3Bob25lYm9vay9hZGQvY29udGFjdHMvbWFudWFsbHknLGR0TW9kZWwsIGh0dHBPcHRpb25zKTtcclxuICAvLyB9XHJcblxyXG4gIHVwbG9hZEltYWdlKHRva2VuOiBzdHJpbmcsIGR0TW9kZWw6IGFueSkge1xyXG4gICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAvLydDb250ZW50LVR5cGUnOiAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScsXHJcbiAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgdG9rZW5cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHBhcmFtcykgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvcGhvbmVib29rL3VwbG9hZC9waG90bycsIGR0TW9kZWwsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcblxyXG4gIC8vQ2FsbCBIaXN0cm95IFxyXG4gIHJlY2VudENhbGxIaXN0b3J5KHRva2VuOiBzdHJpbmcscGFnZTpudW1iZXIsc2l6ZTpudW1iZXIpIHtcclxuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKClcclxuICAgICAgLnNldCgncGFnZScsIHBhZ2UudG9TdHJpbmcoKSlcclxuICAgICAgLnNldCgnc2l6ZScsIHNpemUudG9TdHJpbmcoKSk7XHJcbiAgXHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgXHJcbiAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRoLUtleSc6ICdCZWFyZXIgJyArIHRva2VuIH0pLFxyXG4gICAgICBwYXJhbXM6IHBhcmFtc1xyXG4gICAgfTtcclxuICBcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9waG9uZWJvb2svcmVjZW50L2NhbGxzJywgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgZGVsZXRlQ2FsbHModG9rZW46IHN0cmluZywgcmVjb3JkSWQ6IGFueSwgZHRNb2RlbDogYW55KSB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgdG9rZW5cclxuICAgIH1cclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMocGFyYW1zKSB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyBgL3V0aWxpdGllcy9waG9uZWJvb2svZGVsZXRlL2NhbGxzLyR7cmVjb3JkSWR9YCwgZHRNb2RlbCwgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgLy9TTVMgSGlzdG9yeVxyXG4gIHJlY2VudFNNU0hpc3RvcnkodG9rZW46IHN0cmluZywgcGFnZTogbnVtYmVyLCBzaXplOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKClcclxuICAgICAgLnNldCgncGFnZScsIHBhZ2UudG9TdHJpbmcoKSlcclxuICAgICAgLnNldCgnc2l6ZScsIHNpemUudG9TdHJpbmcoKSk7XHJcbiAgXHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgXHJcbiAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRoLUtleSc6ICdCZWFyZXIgJyArIHRva2VuIH0pLFxyXG4gICAgICBwYXJhbXM6IHBhcmFtc1xyXG4gICAgfTtcclxuICBcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9zbXMvaGlzdG9yeScsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcblxyXG4gIGdldFJlY2VudFZvaWNlUmVjb3JkaW5nRGF0YSh0b2tlbjogc3RyaW5nLCBmaWx0ZXJEYXRhOmFueSwgcGFnZTogbnVtYmVyLCBzaXplOiBudW1iZXIpe1xyXG4gICAgY29uc3QgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKVxyXG4gICAgICAgIC5zZXQoJ3BhZ2UnLCBwYWdlLnRvU3RyaW5nKCkpXHJcbiAgICAgICAgLnNldCgnc2l6ZScsIHNpemUudG9TdHJpbmcoKSk7XHJcbiAgICBcclxuICAgICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IFxyXG4gICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRoLUtleSc6ICdCZWFyZXIgJyArIHRva2VuIH0pLFxyXG4gICAgICAgIHBhcmFtczogcGFyYW1zXHJcbiAgICAgIH07XHJcbiAgICAgIGNvbnN0IGZpbHRlck9iaj17fVxyXG4gICAgXHJcbiAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9waG9uZWJvb2svcmVjZW50L3ZvaWNlcmVjb3JkaW5nJywgZmlsdGVyRGF0YSwgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgLy8gc2F2ZSB2b2ljZSBtYWlsIHJlY29yZGluZyBcclxuICBzYXZlVm9pY2VNYWlsUmVvY3JkaW5nKHRva2VuOiBzdHJpbmcsIHJlY29yZGluZ0RhdGE6IGFueSwgKSB7XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgXHJcbiAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRoLUtleSc6ICdCZWFyZXIgJyArIHRva2VuIH0pLFxyXG4gICAgICAvLyBwYXJhbXM6IHBhcmFtc1xyXG4gICAgfTtcclxuICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9waG9uZWJvb2svdXBkYXRlL3JlY29yZGluZycsIHJlY29yZGluZ0RhdGEsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcbiAgZGVsZXRlVm9pY2VSZWNvcmRpbmcodG9rZW46c3RyaW5nLCByZWNvcmRpbmdJZDogYW55KXtcclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBcclxuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRoLUtleSc6ICdCZWFyZXIgJyArIHRva2VuIH0pLFxyXG4gICAgICAgICAgLy8gcGFyYW1zOiBwYXJhbXNcclxuICAgICAgICB9O1xyXG4gICAgICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGU8W10+KGVudmlyb25tZW50LmFwaVVybCArIGAvdXRpbGl0aWVzL3Bob25lYm9vay9kZWxldGUvdm9pY2VyZWNvcmRpbmdzLyR7cmVjb3JkaW5nSWR9YCwgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuICBtYXJrQXNWb2ljZVJlY29yZGluZyh0b2tlbjpzdHJpbmcsIHJlY29yZGluZ0lkOiBhbnksIGR0TW9kZWw6IGFueSl7XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgXHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLCAnQXV0aC1LZXknOiAnQmVhcmVyICcgKyB0b2tlbiB9KSxcclxuICAgICAgICB9O1xyXG4gICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyBgL3V0aWxpdGllcy9waG9uZWJvb2svbWFya2FzL3ZvaWNlbWFpbC9yZWFkLyR7cmVjb3JkaW5nSWR9YCxkdE1vZGVsLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG4gIGVkaXRDb250YWN0QnlJZCh0b2tlbjogc3RyaW5nLCBpZDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgdG9rZW5cclxuICAgIH1cclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMocGFyYW1zKSB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3Bob25lYm9vay9zZWFyY2gvY29udGFjdGlkLycgKyBpZCwgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlQ29udGFjdHModG9rZW46IHN0cmluZywgZHRNb2RlbDogYW55KSB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgdG9rZW5cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHBhcmFtcykgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvcGhvbmVib29rL3VwZGF0ZS9jb250YWN0JywgZHRNb2RlbCwgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgdXBsb2FkUGhvdG8ocGF5bG9hZDphbnkpIHtcclxuICAgIGxldCBodHRwT3B0aW9ucyA9IHtcclxuICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgICAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKVxyXG4gICAgICB9KVxyXG4gICAgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvcGhvbmVib29rL3VwbG9hZC9waG90bycsIHBheWxvYWQsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcbiAgXHJcbiAgc2F2ZUNvbnRhY3RzKHRva2VuOiBzdHJpbmcsIHBheWxvYWQ6YW55KSB7XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyB0b2tlbiB9KSB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9waG9uZWJvb2svYWRkL2NvbnRhY3RzL21hbnVhbGx5JywgcGF5bG9hZCwgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgLy9Eb3dsb2FkIGNzdiB0ZW1wbGF0ZSBcclxuICBkb3dubG9hZENzdlRlbXBsYXRlKHRva2VuOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFtdPiB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgdG9rZW5cclxuICAgIH1cclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMocGFyYW1zKSB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3Bob25lYm9vay9kb3dubG9hZC9jc3YnLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICAvL1VwbG9hZCBjc3YgY29udGFjdHMgXHJcbiAgdXBkYXRlQ1NWQ29udGFjdHModG9rZW46IHN0cmluZywgZHRNb2RlbDogYW55KSB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgdG9rZW5cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHBhcmFtcykgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvcGhvbmVib29rL2FkZC9jb250YWN0cycsIGR0TW9kZWwsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcblxyXG4gIC8vQ2l0eSBsaXN0ICBcclxuICBHZXRBbGxDaXR5TGlzdChfY291bnRyeUlkOiBhbnksIF9zdGF0ZU5hbWU6IGFueSk6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9KSB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8c3RyaW5nPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL2dsb2JhbC9tYXN0ZXIvdXIvY2l0eWxpc3QvJyArIF9jb3VudHJ5SWQgKyAnLycgKyBfc3RhdGVOYW1lLFxyXG4gICAgICBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG4gIC8vemlwIGxpc3RcclxuICBHZXRBbGxaaXBMaXN0KGRhdGFNb2RlbDogYW55KTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0pIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8c3RyaW5nPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL2dsb2JhbC9tYXN0ZXIvdXIvcG9zdGFsY29kZXMnLCBkYXRhTW9kZWwsXHJcbiAgICAgIGh0dHBPcHRpb25zKTtcclxuICB9XHJcblxyXG4gIC8vR2V0IGFsbCBpbnZvaWNlcyBcclxuICBHZXRJbnZvaWNlcyh2aWV3VHlwZTogc3RyaW5nLCB0b2tlbjogc3RyaW5nKTogT2JzZXJ2YWJsZTxbXT4ge1xyXG4gICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIHRva2VuXHJcbiAgICB9XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHBhcmFtcykgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9iaWxsaW5nL2ludm9pY2VzLycgKyB2aWV3VHlwZSwgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuICBEb3dubG9hZEludm9pY2UoaW52b2ljZUlkOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFtdPiB7XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHtcclxuICAgICAgcmVzcG9uc2VUeXBlOiAnYmxvYicgYXMgJ2pzb24nLFxyXG4gICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xyXG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICAgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyB0b2tlblxyXG4gICAgICB9KVxyXG4gICAgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9iaWxsaW5nL2ludm9pY2UvZmlsZS8nICsgaW52b2ljZUlkLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBHZXRJbnZvaWNlKGludm9pY2VJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxbXT4ge1xyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSkgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9iaWxsaW5nL2ludm9pY2UvJyArIGludm9pY2VJZCwgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgLy9CaWxsaW5nIHN1bW1hcnkgXHJcbiAgR2V0QmlsbGluZ1N1bW1hcnkodG9rZW46IGFueSk6IE9ic2VydmFibGU8W10+IHtcclxuICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyB0b2tlblxyXG4gICAgfVxyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyhwYXJhbXMpIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvYmlsbGluZy9zdW1tYXJ5JywgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgLy9CaWxsaW5nIFBsYW4gJiBQcmljaW5nXHJcbiAgR2V0QWxsUGxhbnModG9rZW46IGFueSk6IE9ic2VydmFibGU8W10+IHtcclxuICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyB0b2tlblxyXG4gICAgfVxyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyhwYXJhbXMpIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvYmlsbGluZy90aWVycycsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcblxyXG4gIC8vUGF5IE5vd1xyXG4gIHBheU5vdyhpbnZvaWNlSWQ6IHN0cmluZywgY2FyZElkOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFtdPiB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgdG9rZW5cclxuICAgIH1cclxuICAgIGNvbnN0IGRhdGEgPSB7XHJcbiAgICAgIFwiaW52b2ljZUlkXCI6IGludm9pY2VJZCxcclxuICAgICAgXCJjYXJkSWRcIjogY2FyZElkXHJcbiAgICB9O1xyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyhwYXJhbXMpIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8W10+KGVudmlyb25tZW50LmFwaVVybCArIGAvdXRpbGl0aWVzL2JpbGxpbmcvcGF5L2ludm9pY2UvJHtpbnZvaWNlSWR9LyR7Y2FyZElkfWAsIGRhdGEsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcbiAgY29uZmlybUludm9pY2VQYXltZW50KGN1c3RvbWVySWQ6IHN0cmluZywgdG9rZW46IHN0cmluZyk6IE9ic2VydmFibGU8W10+IHtcclxuICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyB0b2tlblxyXG4gICAgfVxyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyhwYXJhbXMpIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8W10+KGVudmlyb25tZW50LmFwaVVybCArIGAvdXRpbGl0aWVzL2JpbGxpbmcvaW52b2ljZS9jb25maXJtYXRpb24vJHtjdXN0b21lcklkfWAse30sIGh0dHBPcHRpb25zKTtcclxuICB9XHJcblxyXG4gIGxvYWRTdHJpcGVNZXRob2RzKHNlc3Npb25pZDogc3RyaW5nLCB0b2tlbjogc3RyaW5nKTogT2JzZXJ2YWJsZTxbXT4ge1xyXG4gICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIHRva2VuXHJcbiAgICB9XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHBhcmFtcykgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9leHQvZHVwbGljYXRlL2NhcmQvJyArIHNlc3Npb25pZCwgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgbG9nT3V0KGF1dGhLZXk6YW55KTogT2JzZXJ2YWJsZTxbXT4ge1xyXG4gICAgY29uc3QgYXV0aCA9IHsgXCJBdXRoLUtleVwiOiBhdXRoS2V5IH1cclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLCAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIGF1dGhLZXkgfSkgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvZXh0L2xvZ291dCcsIHt9LCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICByZWdpc3RlckZDTVRva2VuKHBheWxvYWQ6YW55KTogT2JzZXJ2YWJsZTxbXT4ge1xyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpIH0pIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvZmlyZWJhc2UvcmVnaXN0ZXIvZGV2aWNlJywgcGF5bG9hZCwgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuICBnZXROb3RpZmljYXRpb25MaXN0KHBhZ2VJbmRleD86IHN0cmluZywgcGFnZVNpemU/OiBzdHJpbmcpIHtcclxuICAgIGxldCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xyXG4gICAgcGFyYW1zID0gcGFyYW1zLnNldCgnc2l6ZScsIHBhZ2VTaXplIHx8ICcxMCcpO1xyXG4gICAgcGFyYW1zID0gcGFyYW1zLnNldCgncGFnZScsIHBhZ2VJbmRleCB8fCAnMScpO1xyXG4gICAgY29uc3QgaGVhZGVycyA9IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJykgfTtcclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzLCBwYXJhbXMgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9zbXMvc3RvcmVkL25vdGlmaWNhdGlvbicsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcbiAgZ2V0VG90YWxVbnJlYWRDb3VudCgpe1xyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpIH0pIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvc21zL25vdGlmaWNhdGlvbi9jb3VudCcsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcbiAgbWFya05vdGlmaWNhdGlvbihwYXlsb2FkOiBhbnkpIHtcclxuICAgIC8vY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpIH0pIH07XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ30pIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvZmlyZWJhc2UvdXIvbWFya2FzL3NlZW4vJyArIHBheWxvYWQubm90aWZpY2F0aW9uSWQgKyAnLycgKyBwYXlsb2FkLnN0YXR1cywge30sIGh0dHBPcHRpb25zKTtcclxuICB9XHJcbiAgZGVsZXRlTm90aWZpY2F0aW9uKHBheWxvYWQ6IGFueSkge1xyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpIH0pIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvZmlyZWJhc2UvbWFya2FzL3NlZW4vJyArIHBheWxvYWQubm90aWZpY2F0aW9uSWQgKyAnLycgKyBwYXlsb2FkLnN0YXR1cywge30sIGh0dHBPcHRpb25zKTtcclxuICB9XHJcbiAgZ2V0Vm9pY2VtYWlsRGV0YWlscyhyZWNvcmRJZDogc3RyaW5nLCB0b2tlbjogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyB0b2tlblxyXG4gICAgfVxyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyhwYXJhbXMpIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICtgL3V0aWxpdGllcy9waG9uZWJvb2svcGxheS92b2ljZXJlY29yZGluZ3MvJHtyZWNvcmRJZH1gLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG4gIGRlbGV0ZU5vdGlmaWNhdGlvbnModG9rZW46IHN0cmluZywgbm90aWZpY2F0aW9uSWRzOiBhbnkpIHtcclxuICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyB0b2tlblxyXG4gICAgfVxyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyhwYXJhbXMpIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgYC91dGlsaXRpZXMvc21zL2RlbGV0ZS9ub3RpZmljYXRpb24vJHtub3RpZmljYXRpb25JZHN9YCwgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuICBnZXRSZXBvcnRzKCBmaWx0ZXJEYXRhOmFueSwgcGFnZUluZGV4PzpudW1iZXIscGFnZVNpemU/Om51bWJlcikge1xyXG4gICAgY29uc3QgZmlsdGVyT2JqID0ge1xyXG4gICAgICBhY2NvdW50U3RhdHVzOiBmaWx0ZXJEYXRhLmFjY291bnRTdGF0dXMgfHwgXCJcIixcclxuICAgICAgZGF0ZVR5cGU6IGZpbHRlckRhdGEuZGF0ZVR5cGUgfHwgXCJcIiAsXHJcbiAgICAgIGZpZWxkVHlwZTogZmlsdGVyRGF0YS5maWVsZFR5cGUgfHwgXCJcIiAgLFxyXG4gICAgICBmaWVsZFZhbHVlOiBmaWx0ZXJEYXRhLmZpZWxkVmFsdWUgfHwgXCJcIixcclxuICAgICAgZnJvbURhdGU6IGZpbHRlckRhdGEuZnJvbURhdGUgfHwgXCJcIixcclxuICAgICAgcGVuZGluZ0R1ZXM6ICBmaWx0ZXJEYXRhLnBlbmRpbmdEdWVzLFxyXG4gICAgICB0b0RhdGU6IGZpbHRlckRhdGEudG9EYXRlIHx8IFwiXCIsXHJcbiAgICB9XHJcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpXHJcbiAgICAuc2V0KCdwYWdlJywgcGFnZUluZGV4Py50b1N0cmluZygpIHx8ICcxJylcclxuICAgIC5zZXQoJ3NpemUnLCBwYWdlU2l6ZT8udG9TdHJpbmcoKSB8fCAnMTAnKTtcclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLCAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKX0pLFxyXG4gICAgcGFyYW1zOiBwYXJhbXMgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsKyAnL3V0aWxpdGllcy9yZXBvcnQvdXNlci9kZXRhaWxzJyxmaWx0ZXJPYmosIGh0dHBPcHRpb25zKTtcclxuICB9XHJcbiAgZ2V0UmVwb3J0c0ZpbHRlcigpe1xyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpfSl9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8W10+KGVudmlyb25tZW50LmFwaVVybCsgJy91dGlsaXRpZXMvcmVwb3J0L2Ryb3Bkb3duJywgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuICBnZXRTeW5jUmVwb3J0RGF0YSgpe1xyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsJ0F1dGgtS2V5JzogJ0JlYXJlciAnICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpfSl9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9yZXBvcnQvdXBkYXRlL2NhY2hlJywge30sIGh0dHBPcHRpb25zKTtcclxuICB9XHJcbiAgZ2V0RG93bmxvYWRDU1YoZmlsdGVyRGF0YTogYW55LCBwYWdlSW5kZXg6YW55LCBwYWdlU2l6ZTphbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgY29uc3QgZmlsdGVyT2JqID0ge1xyXG4gICAgICBhY2NvdW50U3RhdHVzOiBmaWx0ZXJEYXRhLmFjY291bnRTdGF0dXMgfHwgXCJcIixcclxuICAgICAgZGF0ZVR5cGU6IGZpbHRlckRhdGEuZGF0ZVR5cGUgfHwgXCJcIiAsXHJcbiAgICAgIGZpZWxkVHlwZTogZmlsdGVyRGF0YS5maWVsZFR5cGUgfHwgXCJcIiAgLFxyXG4gICAgICBmaWVsZFZhbHVlOiBmaWx0ZXJEYXRhLmZpZWxkVmFsdWUgfHwgXCJcIixcclxuICAgICAgZnJvbURhdGU6IGZpbHRlckRhdGEuZnJvbURhdGUgfHwgXCJcIixcclxuICAgICAgcGVuZGluZ0R1ZXM6ICBmaWx0ZXJEYXRhLnBlbmRpbmdEdWVzLFxyXG4gICAgICB0b0RhdGU6IGZpbHRlckRhdGEudG9EYXRlIHx8IFwiXCIsXHJcbiAgICB9XHJcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpXHJcbiAgICAuc2V0KCdwYWdlJywgcGFnZUluZGV4ID4gMCA/IHBhZ2VJbmRleC50b1N0cmluZygpIDogJzEnKVxyXG4gICAgLnNldCgnc2l6ZScsIHBhZ2VTaXplLnRvU3RyaW5nKCkpO1xyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpfSksIHBhcmFtczogcGFyYW1zfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvcmVwb3J0L2Nzdi9kb3dubG9hZCcgLGZpbHRlck9iaiwgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuIGdldERlbGV0ZUZpbGUoZmlsZVBhdGhWYWx1ZTogc3RyaW5nKTpPYnNlcnZhYmxlPGFueT4ge1xyXG4gIGNvbnN0IGh0dHBPcHRpb25zID0geyBcclxuICAgIGJvZHk6IHsgZmlsZVBhdGg6IGZpbGVQYXRoVmFsdWUgfSxcclxuICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpfSl9O1xyXG4gIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvcmVwb3J0L2Rvd25sb2FkL2NvbXBsZXRlJyAsIGh0dHBPcHRpb25zKTtcclxuIH1cclxuXHJcbiBnZXREb3dubG9hZFBERihmaWx0ZXJEYXRhOiBhbnksIHBhZ2VJbmRleDphbnksIHBhZ2VTaXplOmFueSl7XHJcbiAgY29uc3QgZmlsdGVyT2JqID0geyBcclxuICAgIGFjY291bnRTdGF0dXM6IGZpbHRlckRhdGEuYWNjb3VudFN0YXR1cyB8fCBcIlwiLFxyXG4gICAgZGF0ZVR5cGU6IGZpbHRlckRhdGEuZGF0ZVR5cGUgfHwgXCJcIiAsXHJcbiAgICBmaWVsZFR5cGU6IGZpbHRlckRhdGEuZmllbGRUeXBlIHx8IFwiXCIgICxcclxuICAgIGZpZWxkVmFsdWU6IGZpbHRlckRhdGEuZmllbGRWYWx1ZSB8fCBcIlwiLFxyXG4gICAgZnJvbURhdGU6IGZpbHRlckRhdGEuZnJvbURhdGUgfHwgXCJcIixcclxuICAgIHBlbmRpbmdEdWVzOiAgZmlsdGVyRGF0YS5wZW5kaW5nRHVlcyxcclxuICAgIHRvRGF0ZTogZmlsdGVyRGF0YS50b0RhdGUgfHwgXCJcIixcclxuICB9XHJcbiAgY29uc3QgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKVxyXG4gIC5zZXQoJ3BhZ2UnLCBwYWdlSW5kZXggPiAwID8gcGFnZUluZGV4LnRvU3RyaW5nKCkgOiAnMScpXHJcbiAgLnNldCgnc2l6ZScsIHBhZ2VTaXplLnRvU3RyaW5nKCkpO1xyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7aGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJyl9KSwgcGFyYW1zOiBwYXJhbXN9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9yZXBvcnQvcGRmL2Rvd25sb2FkJyAsZmlsdGVyT2JqLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG4gIGdldFN1c3BlbmRDYXRlZ29yaWVzRGF0YSgpe1xyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7XHJcbiAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpfSl9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3JlcG9ydC9zdXNwZW5kL2NhdGVnb3J5L2Ryb3Bkb3duJyAsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcbiAgZ2V0VXNlckRldGFpbHNGb3JTdXNwZW5kKHVzZXJJZHM6YW55KXtcclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0ge1xyXG4gICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoeyAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKX0pfTtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PGFueVtdPihgJHtlbnZpcm9ubWVudC5hcGlVcmx9L2FkbWluL3N1c3BlbnNpb24vZGF0YS8ke2VuY29kZVVSSUNvbXBvbmVudCh1c2VySWRzKX1gLCBudWxsLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG4gIHN1c3BlbmRVc2Vycyh1c2VyRGF0YTphbnkpe1xyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7XHJcbiAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpfSl9O1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8YW55W10+KGAke2Vudmlyb25tZW50LmFwaVVybH0vYWRtaW4vc3VzcGVuZC91c2VyYCwgdXNlckRhdGEsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcbiAgcmVzdW1lVXNlcih1c2VyRGF0YTogYW55KXtcclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0ge1xyXG4gICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoeyAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKX0pfTtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PGFueVtdPihgJHtlbnZpcm9ubWVudC5hcGlVcmx9L2FkbWluL3Jlc3VtZS91c2VyYCwgdXNlckRhdGEsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcbiAgcmVzdW1lVW5wYWlkVXNlcnModXNlckRhdGE6IGFueSl7XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHtcclxuICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJyl9KX07XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxhbnlbXT4oYCR7ZW52aXJvbm1lbnQuYXBpVXJsfS9hZG1pbi9yZXN1bWUvdW5wYWlkL3VzZXJgLCB1c2VyRGF0YSwgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuICBkZWxldGVVc2VyKHVzZXJEYXRhOiBhbnkpe1xyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7XHJcbiAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpfSl9O1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8YW55W10+KGAke2Vudmlyb25tZW50LmFwaVVybH0vYWRtaW4vZGVsZXRlL3VzZXJgLCB1c2VyRGF0YSwgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuICBcclxuICBkZWxldGVVc2VyQWNjb3VudCgpe1xyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7XHJcbiAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpfSl9O1xyXG4gICAgICAvLyByZXR1cm4gdGhpcy5odHRwLnBvc3Q8YW55W10+KGAke2Vudmlyb25tZW50LmFwaVVybH0vdXRpbGl0aWVzL2V4dC9kZWxldGUvdXNlci9gLCB1c2VyRGF0YSwgaHR0cE9wdGlvbnMpO1xyXG4gICAgICByZXR1cm4gdGhpcy5pcEFkZHJlc3NTZXJ2aWNlLmdldElwQWRkcmVzc0luZm8oKS5waXBlKFxyXG4gICAgICAgIHN3aXRjaE1hcCgoaXBBZGRyZXNzSW5mbzogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PGFueT4oXHJcbiAgICAgICAgICBgJHtlbnZpcm9ubWVudC5hcGlVcmx9L3V0aWxpdGllcy9leHQvZGVsZXRlL3VzZXIvJHt0aGlzLnBsYXRmb3JtfS8ke2lwQWRkcmVzc0luZm8uaXB9YCxcclxuICAgICAgICAgIG51bGwsXHJcbiAgICAgICAgICBodHRwT3B0aW9uc1xyXG4gICAgICAgICk7XHJcbiAgICAgIH0pLFxyXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgIC8vIFByb3Blcmx5IGNhdGNoIGVycm9yc1xyXG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGVycm9yKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXRJUERldGFpbHNGb3JDYWxsKHJlY29yZElkOmFueSwgY2FsbFN0YXR1czphbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaXBBZGRyZXNzU2VydmljZS5nZXRJcEFkZHJlc3NJbmZvKCkucGlwZShcclxuICAgICAgc3dpdGNoTWFwKChpcEFkZHJlc3NJbmZvOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCBJcE9iaiA9IHtcclxuICAgICAgICAgICdpcEFkZHJlc3MnOiBpcEFkZHJlc3NJbmZvLmlwLFxyXG4gICAgICAgICAgJ2lwQ291bnRyeSc6IGlwQWRkcmVzc0luZm8uYWRkcmVzcy5jb3VudHJ5LFxyXG4gICAgICAgICAgJ3JlY29yZElkJzogcmVjb3JkSWQsXHJcbiAgICAgICAgICAnY2FsbFN0YXR1cyc6IGNhbGxTdGF0dXMsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJykgfSkgfTtcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3R3aWxpby9pbmNvbWluZy9jYWxsL2lwJywgSXBPYmosIGh0dHBPcHRpb25zKS5waXBlKFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcihwb3N0RXJyb3IgPT4ge1xyXG4gICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdFcnJvciBkdXJpbmcgSFRUUCBQT1NUIHJlcXVlc3Q6JywgcG9zdEVycm9yKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IocG9zdEVycm9yKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfSksXHJcbiAgICAgIGNhdGNoRXJyb3IoaXBFcnJvciA9PiB7XHJcbiAgICAgIC8vICBjb25zb2xlLmxvZygnRXJyb3IgZmV0Y2hpbmcgSVAgYWRkcmVzcyBpbmZvOicsIGlwRXJyb3IpO1xyXG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGlwRXJyb3IpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG5nZXRJUERldGFpbHNGb3JTTVMocmVjb3JkSWQ6YW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgXHJcbiAgICByZXR1cm4gdGhpcy5pcEFkZHJlc3NTZXJ2aWNlLmdldElwQWRkcmVzc0luZm8oKS5waXBlKFxyXG4gICAgIHN3aXRjaE1hcCgoaXBBZGRyZXNzSW5mbzogYW55KSA9PiB7XHJcbiAgICAgICAgIGNvbnN0IElwT2JqID0ge1xyXG4gICAgICAgICAgJ2lwQWRkcmVzcyc6IGlwQWRkcmVzc0luZm8uaXAsXHJcbiAgICAgICAgICAnaXBDb3VudHJ5JzogaXBBZGRyZXNzSW5mby5hZGRyZXNzLmNvdW50cnksXHJcbiAgICAgICAgICAgJ3JlY29yZElkJzpyZWNvcmRJZCxcclxuICAgICAgICAgXHJcbiAgICAgICAgIH07XHJcbiAgICAgICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLCAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKSB9KSB9O1xyXG4gICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3R3aWxpby9pbmJvdW5kL3Ntcy9pcCcsIElwT2JqLCBodHRwT3B0aW9ucyk7XHJcbiAgICAgICB9LCBcclxuICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xyXG4gICAgICAgIC8vIENhdGNoIGVycm9yIGZyb20gZ2V0SXBBZGRyZXNzSW5mb1xyXG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGVycm9yKTtcclxuICAgICAgfSlcclxuICAgICAgKVxyXG4gICAgICk7XHJcbiB9XHJcbiBcclxuICBHZXRBbGxBdmFpbGFibGVDb3VudHJ5TGlzdCgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSkgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PHN0cmluZz4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy9nbG9iYWwvbWFzdGVyL3VyL2RlZGljYXRlZC9jb3VudHJ5bGlzdCcpXHJcbiAgICAvLyByZXR1cm4gdGhpcy5odHRwLmdldDxzdHJpbmc+KGVudmlyb25tZW50LmFwaVVybCArICcvZ2xvYmFsL21hc3Rlci91ci9jb3VudHJ5bGlzdCcsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcblxyXG4gIGdldFVzZXJTZXR0aW5ncygpe1xyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsJ0F1dGgtS2V5JzogJ0JlYXJlciAnICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpfSl9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8c3RyaW5nPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9leHQvc2V0dGluZ3MnLCBodHRwT3B0aW9ucylcclxuICB9XHJcblxyXG4gIHVwZGF0ZURpYWxDb2RlUHJlZmVyZW5jZShzZXR0aW5nczogYW55KSB7XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGgtS2V5JzogJ0JlYXJlciAnICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpIH0pIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvZXh0L3VwZGF0ZS9zZXR0aW5ncycsIHNldHRpbmdzLCBodHRwT3B0aW9ucylcclxuICB9XHJcblxyXG4gIHVwZGF0ZUxvbmdQcmVzc1RpbWUodGltZTogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGgtS2V5JzogJ0JlYXJlciAnICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpIH0pIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvZXh0L3VwZGF0ZS9sb25ncHJlc3MvJyArIHRpbWUse30sIGh0dHBPcHRpb25zKVxyXG4gIH1cclxuXHJcbiAgZXhwb3J0VG9DU1YoKXtcclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoeydBdXRoLUtleSc6ICdCZWFyZXIgJyArIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKX0pLHJlc3BvbnNlVHlwZTogJ2Jsb2InIGFzICdqc29uJ307XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxzdHJpbmc+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3Bob25lYm9vay9kb3dubG9hZC9jb250YWN0cycsIGh0dHBPcHRpb25zKVxyXG4gIH1cclxuXHJcbiAgZ2V0RGlhbFByZWZlcmVuY2VOdW1zKCl7XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywnQXV0aC1LZXknOiAnQmVhcmVyICcgKyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJyl9KX07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxzdHJpbmc+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL2V4dC9kaWFsL3ByZWZlcmVuY2UvZHJvcGRvd24nLCBodHRwT3B0aW9ucylcclxuICB9XHJcbiAgdXBkYXRlVkFTU2V0dGluZ3ModG9rZW46IHN0cmluZywgZHRNb2RlbDogYW55KSB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgdG9rZW5cclxuICAgIH1cclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMocGFyYW1zKSB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9leHQvdmFsdWUvYWRkZWQvc2VydmljZScsIGR0TW9kZWwsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcbiAgdXBkYXRlVm9pY2VNYWlsU2V0dGluZ3ModG9rZW46IHN0cmluZywgZHRNb2RlbDogYW55KSB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgdG9rZW5cclxuICAgIH1cclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMocGFyYW1zKSB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9leHQvdXBkYXRlL3ZvaWNlbWFpbC9zZXR0aW5nJywgZHRNb2RlbCwgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuICB1cGRhdGVWb2ljZVJlY29yZFNldHRpbmdzKHRva2VuOiBzdHJpbmcsIGR0TW9kZWw6IGFueSkge1xyXG4gICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIHRva2VuXHJcbiAgICB9XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHBhcmFtcykgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvZXh0L3VwZGF0ZS9jYWxsL3JlY29yZGluZy9zZXR0aW5nJywgZHRNb2RlbCwgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgZ2V0TWFudWFsTGlua3MoZGV2aWNlVHlwZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBgJHtlbnZpcm9ubWVudC5hcGlVcmx9L2xhbmRpbmcvc3VwcG9ydC91ci91c2VyL21hbnVhbC8ke2RldmljZVR5cGV9YDtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVNpZ251cFByb2ZpbGUoYm9keTogYW55KSB7XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGgtS2V5JzogJ0JlYXJlciAnICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpIH0pIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxhbnk+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL2V4dC91ci91cGRhdGUvc2lnbnVwL3Byb2ZpbGUnICxib2R5LCBodHRwT3B0aW9ucylcclxuICB9XHJcbiAgZ2V0QWRtaW5TZXR0aW5ncygpe1xyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpfSl9O1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8W10+KGVudmlyb25tZW50LmFwaVVybCsgJy9hZG1pbi9zZXR0aW5ncycsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcbiAgdXBkYXRlQWN0aW9ucyh0b2tlbjogc3RyaW5nLCBkdE1vZGVsOiBhbnkpe1xyXG4gICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIHRva2VuXHJcbiAgICB9XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHBhcmFtcykgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy9hZG1pbi9jaGFuZ2Uvc2V0dGluZ3MnLCBkdE1vZGVsLCBodHRwT3B0aW9ucyk7XHJcbiAgfVxyXG4gIHVwZGF0ZVZhbHVlQWRkZWRTZXJ2aWNlcyh0b2tlbjogc3RyaW5nLCBkdE1vZGVsOiBhbnkpe1xyXG4gICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIHRva2VuXHJcbiAgICB9XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHBhcmFtcykgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy9hZG1pbi92YWx1ZS9hZGRlZC9zZXJ2aWNlJywgZHRNb2RlbCwgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxuIFxyXG4gIGRlbGV0ZUFkbWluVXNlcnModG9rZW46IHN0cmluZywgdXNlcklkczogc3RyaW5nKSB7IC8vIENoYW5nZSB0eXBlIHRvIHN0cmluZ1xyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IFxyXG4gICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoeyBcclxuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLCBcclxuICAgICAgICAnQXV0aC1LZXknOiAnQmVhcmVyICcgKyB0b2tlbiBcclxuICAgICAgfSlcclxuICAgIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZTxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgYC9hZG1pbi9kZWxldGUvdmFsdWUvdXNhZ2UvJHt1c2VySWRzfWAsIGh0dHBPcHRpb25zKTtcclxuICB9XHJcbiAgXHJcbiAgZ2V0VXNlckluZm9ybWF0aW9uKHR3aWxpb0F1dGhJZDogc3RyaW5nKXtcclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBcclxuICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgXHJcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgXHJcbiAgICAgICAgJ0F1dGgtS2V5JzogJ0JlYXJlciAnICsgdGhpcy50b2tlbiBcclxuICAgICAgfSlcclxuICAgIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvdHdpbGlvL2MyYy9pbmZvcm1hdGlvbi8nK3R3aWxpb0F1dGhJZCwgaHR0cE9wdGlvbnMpO1xyXG4gIH1cclxufVxyXG4iXX0=