@rudderstack/integrations-lib 0.2.23 → 0.2.24

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,757 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const axios_mock_adapter_1 = __importDefault(require("axios-mock-adapter"));
40
+ const axios_1 = __importStar(require("axios"));
41
+ const googleAds_1 = __importDefault(require("./googleAds"));
42
+ describe('Google ads SDK', () => {
43
+ let mock;
44
+ beforeEach(() => {
45
+ mock = new axios_mock_adapter_1.default(axios_1.default, { onNoMatch: 'throwException' });
46
+ });
47
+ afterEach(() => {
48
+ mock.restore();
49
+ });
50
+ describe('Test getConversionAction function', () => {
51
+ const testCases = [
52
+ {
53
+ name: 'should return conversion action ID when API returns success response',
54
+ authObject: {
55
+ accessToken: 'test-access-token',
56
+ customerId: '123456789',
57
+ developerToken: 'test-developer-token',
58
+ },
59
+ mockResponse: [
60
+ {
61
+ results: [
62
+ {
63
+ conversionAction: {
64
+ resourceName: 'customers/123456789/conversionActions/9876543',
65
+ id: '9876543',
66
+ },
67
+ },
68
+ ],
69
+ },
70
+ ],
71
+ conversionName: 'test_conversion',
72
+ status: 200,
73
+ expectedResult: 'customers/123456789/conversionActions/9876543',
74
+ expectedRequest: {
75
+ url: '/123456789/googleAds:searchStream',
76
+ data: JSON.stringify({
77
+ query: "SELECT conversion_action.id FROM conversion_action WHERE conversion_action.name = 'test_conversion'",
78
+ }),
79
+ },
80
+ },
81
+ {
82
+ name: 'handle failure scenario when accessToken is wrong',
83
+ authObject: {
84
+ customerId: '123456789',
85
+ developerToken: 'test-developer-token',
86
+ accessToken: 'wrong-access-token',
87
+ },
88
+ mockResponse: [
89
+ {
90
+ error: {
91
+ code: 401,
92
+ message: 'Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.',
93
+ status: 'UNAUTHENTICATED',
94
+ },
95
+ },
96
+ ],
97
+ mockResponseHeader: new axios_1.AxiosHeaders({
98
+ 'transfer-encoding': 'chunked',
99
+ }),
100
+ conversionName: 'test_conversion',
101
+ status: 401,
102
+ expectedResult: {
103
+ headers: new axios_1.AxiosHeaders({
104
+ 'transfer-encoding': 'chunked',
105
+ }),
106
+ message: undefined,
107
+ responseBody: [
108
+ {
109
+ error: {
110
+ code: 401,
111
+ message: 'Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.',
112
+ status: 'UNAUTHENTICATED',
113
+ },
114
+ },
115
+ ],
116
+ statusCode: 401,
117
+ type: 'application-error',
118
+ },
119
+ expectedRequest: {
120
+ url: '/123456789/googleAds:searchStream',
121
+ data: JSON.stringify({
122
+ query: "SELECT conversion_action.id FROM conversion_action WHERE conversion_action.name = 'test_conversion'",
123
+ }),
124
+ },
125
+ },
126
+ {
127
+ name: 'handle the situation when the conversion is not available',
128
+ authObject: {
129
+ accessToken: 'test-access-token',
130
+ customerId: '123456789',
131
+ developerToken: 'test-developer-token',
132
+ },
133
+ mockResponse: [],
134
+ conversionName: 'non-existing-conversion',
135
+ status: 200,
136
+ expectedResult: null,
137
+ expectedRequest: {
138
+ url: '/123456789/googleAds:searchStream',
139
+ data: JSON.stringify({
140
+ query: "SELECT conversion_action.id FROM conversion_action WHERE conversion_action.name = 'non-existing-conversion'",
141
+ }),
142
+ },
143
+ },
144
+ ];
145
+ testCases.forEach(({ name, authObject, mockResponse, conversionName, expectedRequest, expectedResult, status, mockResponseHeader, }) => {
146
+ it(name, async () => {
147
+ const googleAds = new googleAds_1.default(authObject);
148
+ mock
149
+ .onPost('https://googleads.googleapis.com/v19/customers/123456789/googleAds:searchStream')
150
+ .reply(status, mockResponse, mockResponseHeader);
151
+ const result = await googleAds.getConversionActionId(conversionName);
152
+ expect(mock.history.post[0]).toMatchObject(expectedRequest);
153
+ expect(result).toEqual(expectedResult);
154
+ });
155
+ });
156
+ });
157
+ describe('Test getCustomVariable function', () => {
158
+ const testCases = [
159
+ {
160
+ name: 'should return an array of CustomVariableResults when API call succeeds',
161
+ authObject: {
162
+ accessToken: 'test-access-token',
163
+ customerId: '123456789',
164
+ developerToken: 'test-developer-token',
165
+ },
166
+ mockResponse: [
167
+ {
168
+ results: [
169
+ {
170
+ conversionCustomVariable: {
171
+ resourceName: 'customers/123/conversionCustomVariables/456',
172
+ name: 'test_variable',
173
+ },
174
+ },
175
+ ],
176
+ fieldMask: 'conversion_custom_variable.name',
177
+ requestId: '123456',
178
+ queryResourceConsumption: '100',
179
+ },
180
+ ],
181
+ status: 200,
182
+ expectedResult: [
183
+ {
184
+ conversionCustomVariable: {
185
+ resourceName: 'customers/123/conversionCustomVariables/456',
186
+ name: 'test_variable',
187
+ },
188
+ },
189
+ ],
190
+ expectedRequest: {
191
+ url: '/123456789/googleAds:searchStream',
192
+ data: JSON.stringify({
193
+ query: 'SELECT conversion_custom_variable.name FROM conversion_custom_variable',
194
+ }),
195
+ },
196
+ },
197
+ {
198
+ name: 'should handle the scenario when there is not any customVariables',
199
+ authObject: {
200
+ accessToken: 'test-access-token',
201
+ customerId: '123456789',
202
+ developerToken: 'test-developer-token',
203
+ },
204
+ status: 200,
205
+ mockResponse: [
206
+ {
207
+ results: [],
208
+ fieldMask: 'conversion_custom_variable.name',
209
+ requestId: '123456',
210
+ queryResourceConsumption: '100',
211
+ },
212
+ ],
213
+ expectedResult: [],
214
+ expectedRequest: {
215
+ url: '/123456789/googleAds:searchStream',
216
+ data: JSON.stringify({
217
+ query: 'SELECT conversion_custom_variable.name FROM conversion_custom_variable',
218
+ }),
219
+ },
220
+ },
221
+ {
222
+ name: 'should return an array of CustomVariableResults when API call succeeds',
223
+ authObject: {
224
+ accessToken: 'wrong-access-token',
225
+ customerId: '123456789',
226
+ developerToken: 'test-developer-token',
227
+ },
228
+ mockResponse: [
229
+ {
230
+ error: {
231
+ code: 401,
232
+ message: 'Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.',
233
+ status: 'UNAUTHENTICATED',
234
+ },
235
+ },
236
+ ],
237
+ status: 401,
238
+ expectedResult: {
239
+ headers: new axios_1.AxiosHeaders({
240
+ 'transfer-encoding': 'chunked',
241
+ }),
242
+ message: undefined,
243
+ responseBody: [
244
+ {
245
+ error: {
246
+ code: 401,
247
+ message: 'Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.',
248
+ status: 'UNAUTHENTICATED',
249
+ },
250
+ },
251
+ ],
252
+ statusCode: 401,
253
+ type: 'application-error',
254
+ },
255
+ expectedRequest: {
256
+ url: '/123456789/googleAds:searchStream',
257
+ data: JSON.stringify({
258
+ query: 'SELECT conversion_custom_variable.name FROM conversion_custom_variable',
259
+ }),
260
+ },
261
+ mockResponseHeader: new axios_1.AxiosHeaders({
262
+ 'transfer-encoding': 'chunked',
263
+ }),
264
+ },
265
+ ];
266
+ testCases.forEach(({ name, authObject, mockResponse, expectedRequest, expectedResult, status, mockResponseHeader, }) => {
267
+ it(name, async () => {
268
+ const googleAds = new googleAds_1.default(authObject);
269
+ mock
270
+ .onPost('https://googleads.googleapis.com/v19/customers/123456789/googleAds:searchStream')
271
+ .reply(status, mockResponse, mockResponseHeader);
272
+ const result = await googleAds.getCustomVariable();
273
+ expect(mock.history.post[0]).toMatchObject(expectedRequest);
274
+ expect(result).toEqual(expectedResult);
275
+ });
276
+ });
277
+ });
278
+ describe('Test addConversionAdjustMent function', () => {
279
+ const TestCases = [
280
+ {
281
+ name: 'should successfully upload conversion adjustments with valid data',
282
+ authObject: {
283
+ accessToken: 'valid-access-token',
284
+ customerId: '123456789',
285
+ developerToken: 'test-developer-token',
286
+ },
287
+ requestData: {
288
+ conversionAdjustments: [
289
+ {
290
+ gclidDateTimePair: {
291
+ gclid: 'test-gclid',
292
+ conversionDateTime: '2023-01-01T00:00:00Z',
293
+ },
294
+ adjustmentType: 'RESTATEMENT',
295
+ restatementValue: {
296
+ adjustedValue: 100,
297
+ currencyCode: 'USD',
298
+ },
299
+ userIdentifiers: [
300
+ {
301
+ userIdentifierSource: 'FIRST_PARTY',
302
+ hashedEmail: '389205904d6c7bb83fc676513911226f2be25bf1465616bb9b29587100ab1414',
303
+ },
304
+ ],
305
+ },
306
+ ],
307
+ partialFailure: false,
308
+ },
309
+ status: 200,
310
+ mockResponse: {
311
+ conversionAdjustments: [
312
+ {
313
+ gclidDateTimePair: {
314
+ gclid: 'test-gclid',
315
+ conversionDateTime: '2023-01-01T00:00:00Z',
316
+ },
317
+ adjustmentType: 'RESTATEMENT',
318
+ restatementValue: {
319
+ adjustedValue: 100,
320
+ currencyCode: 'USD',
321
+ },
322
+ userIdentifiers: [],
323
+ },
324
+ ],
325
+ partialFailure: false,
326
+ },
327
+ expectedResult: {
328
+ type: 'success',
329
+ statusCode: 200,
330
+ responseBody: {
331
+ conversionAdjustments: [
332
+ {
333
+ gclidDateTimePair: {
334
+ gclid: 'test-gclid',
335
+ conversionDateTime: '2023-01-01T00:00:00Z',
336
+ },
337
+ adjustmentType: 'RESTATEMENT',
338
+ restatementValue: { adjustedValue: 100, currencyCode: 'USD' },
339
+ userIdentifiers: [],
340
+ },
341
+ ],
342
+ partialFailure: false,
343
+ },
344
+ headers: new axios_1.AxiosHeaders({ 'Content-Type': 'application/json' }),
345
+ },
346
+ mockResponseHeader: new axios_1.AxiosHeaders({ 'Content-Type': 'application/json' }),
347
+ },
348
+ {
349
+ name: 'should successfully handle failure scenario',
350
+ authObject: {
351
+ accessToken: 'wrong-access-token',
352
+ customerId: '123456789',
353
+ developerToken: 'test-developer-token',
354
+ },
355
+ requestData: {
356
+ conversionAdjustments: [
357
+ {
358
+ gclidDateTimePair: {
359
+ gclid: 'test-gclid',
360
+ conversionDateTime: '2023-01-01T00:00:00Z',
361
+ },
362
+ adjustmentType: 'RESTATEMENT',
363
+ restatementValue: {
364
+ adjustedValue: 100,
365
+ currencyCode: 'USD',
366
+ },
367
+ userIdentifiers: [
368
+ {
369
+ userIdentifierSource: 'FIRST_PARTY',
370
+ hashedEmail: '389205904d6c7bb83fc676513911226f2be25bf1465616bb9b29587100ab1414',
371
+ },
372
+ ],
373
+ },
374
+ ],
375
+ partialFailure: false,
376
+ },
377
+ status: 401,
378
+ mockResponse: {
379
+ headers: new axios_1.AxiosHeaders({
380
+ 'transfer-encoding': 'chunked',
381
+ }),
382
+ message: undefined,
383
+ responseBody: [
384
+ {
385
+ error: {
386
+ code: 401,
387
+ message: 'Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.',
388
+ status: 'UNAUTHENTICATED',
389
+ },
390
+ },
391
+ ],
392
+ statusCode: 401,
393
+ type: 'application-error',
394
+ },
395
+ expectedResult: {
396
+ headers: new axios_1.AxiosHeaders({
397
+ 'Content-Type': 'application/json',
398
+ }),
399
+ message: undefined,
400
+ responseBody: {
401
+ headers: { 'transfer-encoding': 'chunked' },
402
+ responseBody: [
403
+ {
404
+ error: {
405
+ code: 401,
406
+ message: 'Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.',
407
+ status: 'UNAUTHENTICATED',
408
+ },
409
+ },
410
+ ],
411
+ statusCode: 401,
412
+ type: 'application-error',
413
+ },
414
+ statusCode: 401,
415
+ type: 'application-error',
416
+ },
417
+ mockResponseHeader: new axios_1.AxiosHeaders({ 'Content-Type': 'application/json' }),
418
+ },
419
+ ];
420
+ TestCases.forEach(({ name, authObject, mockResponse, requestData, expectedResult, mockResponseHeader, status, }) => {
421
+ it(name, async () => {
422
+ const googleAds = new googleAds_1.default(authObject);
423
+ mock
424
+ .onPost('https://googleads.googleapis.com/v19/customers/123456789:uploadConversionAdjustments')
425
+ .reply(status, mockResponse, mockResponseHeader);
426
+ const result = await googleAds.addConversionAdjustMent(requestData);
427
+ expect(result).toEqual(expectedResult);
428
+ });
429
+ });
430
+ });
431
+ describe('Test createOfflineUserDataJob function', () => {
432
+ const TestCases = [
433
+ {
434
+ name: 'should return job ID when response type is success for customerMatchUserList job',
435
+ authObject: {
436
+ accessToken: 'valid-access-token',
437
+ customerId: '123456789',
438
+ developerToken: 'test-developer-token',
439
+ loginCustomerId: '987654321',
440
+ },
441
+ requestData: {
442
+ job: {
443
+ type: 'CUSTOMER_MATCH_USER_LIST',
444
+ customerMatchUserListMetadata: {
445
+ userList: 'customers/123456789/userLists/1234',
446
+ },
447
+ },
448
+ },
449
+ status: 200,
450
+ mockResponse: {
451
+ resourceName: 'customers/123456789/offlineUserDataJobs/5678',
452
+ },
453
+ expectedResult: '5678',
454
+ mockResponseHeader: new axios_1.AxiosHeaders({ 'Content-Type': 'application/json' }),
455
+ },
456
+ {
457
+ name: 'should return job ID when response type is success for store sales job',
458
+ authObject: {
459
+ accessToken: 'valid-access-token',
460
+ customerId: '123456789',
461
+ developerToken: 'test-developer-token',
462
+ },
463
+ requestData: {
464
+ job: {
465
+ storeSalesMetadata: {
466
+ custom_key: 'CUSTOM_KEY',
467
+ loyaltyFraction: 1,
468
+ transaction_upload_fraction: '1',
469
+ },
470
+ type: 'STORE_SALES_UPLOAD_FIRST_PARTY',
471
+ },
472
+ },
473
+ status: 200,
474
+ mockResponse: {
475
+ resourceName: 'customers/123456789/offlineUserDataJobs/5678',
476
+ },
477
+ expectedResult: '5678',
478
+ mockResponseHeader: new axios_1.AxiosHeaders({ 'Content-Type': 'application/json' }),
479
+ },
480
+ ];
481
+ TestCases.forEach(({ name, authObject, mockResponse, status, requestData, expectedResult, mockResponseHeader, }) => {
482
+ it(name, async () => {
483
+ const googleAds = new googleAds_1.default(authObject);
484
+ mock
485
+ .onPost('https://googleads.googleapis.com/v19/customers/123456789/offlineUserDataJobs:create')
486
+ .reply(status, mockResponse, mockResponseHeader);
487
+ const result = await googleAds.createOfflineUserDataJob(requestData);
488
+ expect(result).toEqual(expectedResult);
489
+ });
490
+ });
491
+ });
492
+ describe('Test addUserToOfflineUserDataJob function', () => {
493
+ const TestCases = [
494
+ {
495
+ name: 'should successfully add user data to an offline user data job',
496
+ authObject: {
497
+ accessToken: 'valid-access-token',
498
+ customerId: '123456789',
499
+ developerToken: 'test-developer-token',
500
+ loginCustomerId: '987654321',
501
+ },
502
+ jobId: '1234',
503
+ requestData: {
504
+ operations: [
505
+ {
506
+ create: {
507
+ userIdentifiers: [{ hashedEmail: 'hashed_email_value' }],
508
+ },
509
+ },
510
+ ],
511
+ enablePartialFailure: false,
512
+ },
513
+ status: 200,
514
+ mockResponse: {},
515
+ expectedResult: {
516
+ headers: new axios_1.AxiosHeaders({ 'Content-Type': 'application/json' }),
517
+ responseBody: {},
518
+ statusCode: 200,
519
+ type: 'success',
520
+ },
521
+ mockResponseHeader: new axios_1.AxiosHeaders({ 'Content-Type': 'application/json' }),
522
+ },
523
+ ];
524
+ TestCases.forEach(({ name, authObject, mockResponse, status, requestData, expectedResult, mockResponseHeader, jobId, }) => {
525
+ it(name, async () => {
526
+ const googleAds = new googleAds_1.default(authObject);
527
+ mock
528
+ .onPost('https://googleads.googleapis.com/v19/customers/123456789/offlineUserDataJobs/1234:addOperations')
529
+ .reply(status, mockResponse, mockResponseHeader);
530
+ const result = await googleAds.addUserToOfflineUserDataJob(jobId, requestData);
531
+ expect(result).toEqual(expectedResult);
532
+ });
533
+ });
534
+ });
535
+ describe('Test addConversionsToOfflineUserDataJob function', () => {
536
+ const TestCases = [
537
+ {
538
+ name: 'should successfully add store sales conversion data to an offline user data job',
539
+ authObject: {
540
+ accessToken: 'valid-access-token',
541
+ customerId: '123456789',
542
+ developerToken: 'test-developer-token',
543
+ loginCustomerId: '987654321',
544
+ },
545
+ jobId: '1234',
546
+ requestData: {
547
+ operations: [
548
+ {
549
+ create: {
550
+ userIdentifiers: [{ hashedEmail: 'hashed-email-value' }],
551
+ transactionInfo: {
552
+ conversionAction: 'customers/123456789/conversionActions/987',
553
+ conversionDateTime: '2023-01-01 12:00:00',
554
+ conversionValue: 10.99,
555
+ currencyCode: 'USD',
556
+ },
557
+ },
558
+ },
559
+ ],
560
+ enablePartialFailure: true,
561
+ },
562
+ status: 200,
563
+ mockResponse: {},
564
+ expectedResult: {
565
+ headers: new axios_1.AxiosHeaders({ 'Content-Type': 'application/json' }),
566
+ responseBody: {},
567
+ statusCode: 200,
568
+ type: 'success',
569
+ },
570
+ mockResponseHeader: new axios_1.AxiosHeaders({ 'Content-Type': 'application/json' }),
571
+ },
572
+ ];
573
+ TestCases.forEach(({ name, authObject, mockResponse, status, requestData, expectedResult, mockResponseHeader, jobId, }) => {
574
+ it(name, async () => {
575
+ const googleAds = new googleAds_1.default(authObject);
576
+ mock
577
+ .onPost('https://googleads.googleapis.com/v19/customers/123456789/offlineUserDataJobs/1234:addOperations')
578
+ .reply(status, mockResponse, mockResponseHeader);
579
+ const result = await googleAds.addConversionsToOfflineUserDataJob(jobId, requestData);
580
+ expect(result).toEqual(expectedResult);
581
+ });
582
+ });
583
+ });
584
+ describe('Test runOfflineUserDataJob function', () => {
585
+ const TestCases = [
586
+ {
587
+ name: 'should successfully run an offline user data job with valid jobId',
588
+ authObject: {
589
+ accessToken: 'valid-access-token',
590
+ customerId: '123456789',
591
+ developerToken: 'test-developer-token',
592
+ loginCustomerId: '987654321',
593
+ },
594
+ jobId: '1234',
595
+ requestData: {},
596
+ status: 200,
597
+ mockResponse: {
598
+ success: true,
599
+ data: { name: 'test-job', done: true },
600
+ },
601
+ expectedResult: {
602
+ headers: new axios_1.AxiosHeaders({ 'Content-Type': 'application/json' }),
603
+ responseBody: {
604
+ success: true,
605
+ data: { name: 'test-job', done: true },
606
+ },
607
+ statusCode: 200,
608
+ type: 'success',
609
+ },
610
+ mockResponseHeader: new axios_1.AxiosHeaders({ 'Content-Type': 'application/json' }),
611
+ },
612
+ ];
613
+ TestCases.forEach(({ name, authObject, mockResponse, status, expectedResult, mockResponseHeader, jobId }) => {
614
+ it(name, async () => {
615
+ const googleAds = new googleAds_1.default(authObject);
616
+ mock
617
+ .onPost('https://googleads.googleapis.com/v19/customers/123456789/offlineUserDataJobs/1234:run')
618
+ .reply(status, mockResponse, mockResponseHeader);
619
+ const result = await googleAds.runOfflineUserDataJob(jobId);
620
+ expect(result).toEqual(expectedResult);
621
+ });
622
+ });
623
+ });
624
+ describe('Test uploadClickConversion function', () => {
625
+ const TestCases = [
626
+ {
627
+ name: 'should successfully add user data to an offline user data job',
628
+ authObject: {
629
+ accessToken: 'valid-access-token',
630
+ customerId: '123456789',
631
+ developerToken: 'test-developer-token',
632
+ loginCustomerId: '987654321',
633
+ },
634
+ requestData: {
635
+ conversions: [
636
+ {
637
+ gclid: 'test-gclid',
638
+ conversionAction: 'test-action',
639
+ conversionDateTime: '2023-01-01T00:00:00Z',
640
+ conversionValue: 100,
641
+ currencyCode: 'USD',
642
+ },
643
+ ],
644
+ },
645
+ status: 200,
646
+ mockResponse: {
647
+ success: true,
648
+ data: {
649
+ results: [
650
+ {
651
+ gclid: 'test-gclid',
652
+ conversionAction: 'test-action',
653
+ conversionDateTime: '2023-01-01T00:00:00Z',
654
+ },
655
+ ],
656
+ },
657
+ },
658
+ expectedResult: {
659
+ headers: new axios_1.AxiosHeaders({ 'Content-Type': 'application/json' }),
660
+ responseBody: {
661
+ data: {
662
+ results: [
663
+ {
664
+ conversionAction: 'test-action',
665
+ conversionDateTime: '2023-01-01T00:00:00Z',
666
+ gclid: 'test-gclid',
667
+ },
668
+ ],
669
+ },
670
+ success: true,
671
+ },
672
+ statusCode: 200,
673
+ type: 'success',
674
+ },
675
+ mockResponseHeader: new axios_1.AxiosHeaders({ 'Content-Type': 'application/json' }),
676
+ },
677
+ ];
678
+ TestCases.forEach(({ name, authObject, mockResponse, status, expectedResult, mockResponseHeader, requestData, }) => {
679
+ it(name, async () => {
680
+ const googleAds = new googleAds_1.default(authObject);
681
+ mock
682
+ .onPost('https://googleads.googleapis.com/v19/customers/123456789:uploadClickConversions')
683
+ .reply(status, mockResponse, mockResponseHeader);
684
+ const result = await googleAds.uploadClickConversion(requestData);
685
+ expect(result).toEqual(expectedResult);
686
+ });
687
+ });
688
+ });
689
+ describe('Test uploadCallConversion function', () => {
690
+ const TestCases = [
691
+ {
692
+ name: 'should successfully upload call conversion data and return a successful response',
693
+ authObject: {
694
+ accessToken: 'valid-access-token',
695
+ customerId: '123456789',
696
+ developerToken: 'test-developer-token',
697
+ loginCustomerId: '987654321',
698
+ },
699
+ requestData: {
700
+ conversions: [
701
+ {
702
+ callerId: '1234567890',
703
+ callStartDateTime: '2023-01-01T12:00:00Z',
704
+ conversionAction: 'action1',
705
+ conversionDateTime: '2023-01-01T12:05:00Z',
706
+ },
707
+ ],
708
+ partialFailure: false,
709
+ },
710
+ status: 200,
711
+ mockResponse: {
712
+ success: true,
713
+ data: {
714
+ results: [
715
+ {
716
+ callerId: '1234567890',
717
+ callStartDateTime: '2023-01-01T12:00:00Z',
718
+ conversionAction: 'action1',
719
+ conversionDateTime: '2023-01-01T12:05:00Z',
720
+ },
721
+ ],
722
+ },
723
+ },
724
+ expectedResult: {
725
+ headers: new axios_1.AxiosHeaders({ 'Content-Type': 'application/json' }),
726
+ responseBody: {
727
+ data: {
728
+ results: [
729
+ {
730
+ callStartDateTime: '2023-01-01T12:00:00Z',
731
+ callerId: '1234567890',
732
+ conversionAction: 'action1',
733
+ conversionDateTime: '2023-01-01T12:05:00Z',
734
+ },
735
+ ],
736
+ },
737
+ success: true,
738
+ },
739
+ statusCode: 200,
740
+ type: 'success',
741
+ },
742
+ mockResponseHeader: new axios_1.AxiosHeaders({ 'Content-Type': 'application/json' }),
743
+ },
744
+ ];
745
+ TestCases.forEach(({ name, authObject, mockResponse, status, expectedResult, mockResponseHeader, requestData, }) => {
746
+ it(name, async () => {
747
+ const googleAds = new googleAds_1.default(authObject);
748
+ mock
749
+ .onPost('https://googleads.googleapis.com/v19/customers/123456789:uploadClickConversions')
750
+ .reply(status, mockResponse, mockResponseHeader);
751
+ const result = await googleAds.uploadClickConversion(requestData);
752
+ expect(result).toEqual(expectedResult);
753
+ });
754
+ });
755
+ });
756
+ });
757
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29vZ2xlQWRzLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2Rrcy9nb29nbGVBZHNSZXN0QVBJL2dvb2dsZUFkcy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNEVBQWtEO0FBQ2xELCtDQUE0QztBQUM1Qyw0REFBb0M7QUFFcEMsUUFBUSxDQUFDLGdCQUFnQixFQUFFLEdBQUcsRUFBRTtJQUM5QixJQUFJLElBQXNCLENBQUM7SUFFM0IsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLElBQUksR0FBRyxJQUFJLDRCQUFnQixDQUFDLGVBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7SUFDdEUsQ0FBQyxDQUFDLENBQUM7SUFFSCxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ2IsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2pCLENBQUMsQ0FBQyxDQUFDO0lBQ0gsUUFBUSxDQUFDLG1DQUFtQyxFQUFFLEdBQUcsRUFBRTtRQUNqRCxNQUFNLFNBQVMsR0FBRztZQUNoQjtnQkFDRSxJQUFJLEVBQUUsc0VBQXNFO2dCQUM1RSxVQUFVLEVBQUU7b0JBQ1YsV0FBVyxFQUFFLG1CQUFtQjtvQkFDaEMsVUFBVSxFQUFFLFdBQVc7b0JBQ3ZCLGNBQWMsRUFBRSxzQkFBc0I7aUJBQ3ZDO2dCQUNELFlBQVksRUFBRTtvQkFDWjt3QkFDRSxPQUFPLEVBQUU7NEJBQ1A7Z0NBQ0UsZ0JBQWdCLEVBQUU7b0NBQ2hCLFlBQVksRUFBRSwrQ0FBK0M7b0NBQzdELEVBQUUsRUFBRSxTQUFTO2lDQUNkOzZCQUNGO3lCQUNGO3FCQUNGO2lCQUNGO2dCQUNELGNBQWMsRUFBRSxpQkFBaUI7Z0JBQ2pDLE1BQU0sRUFBRSxHQUFHO2dCQUNYLGNBQWMsRUFBRSwrQ0FBK0M7Z0JBQy9ELGVBQWUsRUFBRTtvQkFDZixHQUFHLEVB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QWdCLEVBQUUsU0FBUztvQ0FDM0Isa0JBQWtCLEVBQUUsc0JBQXNCO2lDQUMzQzs2QkFDRjt5QkFDRjt3QkFDRCxPQUFPLEVBQUUsSUFBSTtxQkFDZDtvQkFDRCxVQUFVLEVBQUUsR0FBRztvQkFDZixJQUFJLEVBQUUsU0FBUztpQkFDaEI7Z0JBQ0Qsa0JBQWtCLEVBQUUsSUFBSSxvQkFBWSxDQUFDLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLENBQUM7YUFDN0U7U0FDRixDQUFDO1FBQ0YsU0FBUyxDQUFDLE9BQU8sQ0FDZixDQUFDLEVBQ0MsSUFBSSxFQUNKLFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUNOLGNBQWMsRUFDZCxrQkFBa0IsRUFDbEIsV0FBVyxHQUNaLEVBQUUsRUFBRTtZQUNILEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQ2xCLE1BQU0sU0FBUyxHQUFHLElBQUksbUJBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDNUMsSUFBSTtxQkFDRCxNQUFNLENBQ0wsaUZBQWlGLENBQ2xGO3FCQUNBLEtBQUssQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixDQUFDLENBQUM7Z0JBQ25ELE1BQU0sTUFBTSxHQUFHLE1BQU0sU0FBUyxDQUFDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNsRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3pDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUNGLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEF4aW9zTW9ja0FkYXB0ZXIgZnJvbSAnYXhpb3MtbW9jay1hZGFwdGVyJztcbmltcG9ydCBheGlvcywgeyBBeGlvc0hlYWRlcnMgfSBmcm9tICdheGlvcyc7XG5pbXBvcnQgR29vZ2xlQWRzIGZyb20gJy4vZ29vZ2xlQWRzJztcblxuZGVzY3JpYmUoJ0dvb2dsZSBhZHMgU0RLJywgKCkgPT4ge1xuICBsZXQgbW9jazogQXhpb3NNb2NrQWRhcHRlcjtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBtb2NrID0gbmV3IEF4aW9zTW9ja0FkYXB0ZXIoYXhpb3MsIHsgb25Ob01hdGNoOiAndGhyb3dFeGNlcHRpb24nIH0pO1xuICB9KTtcblxuICBhZnRlckVhY2goKCkgPT4ge1xuICAgIG1vY2sucmVzdG9yZSgpO1xuICB9KTtcbiAgZGVzY3JpYmUoJ1Rlc3QgZ2V0Q29udmVyc2lvbkFjdGlvbiBmdW5jdGlvbicsICgpID0+IHtcbiAgICBjb25zdCB0ZXN0Q2FzZXMgPSBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdzaG91bGQgcmV0dXJuIGNvbnZlcnNpb24gYWN0aW9uIElEIHdoZW4gQVBJIHJldHVybnMgc3VjY2VzcyByZXNwb25zZScsXG4gICAgICAgIGF1dGhPYmplY3Q6IHtcbiAgICAgICAgICBhY2Nlc3NUb2tlbjogJ3Rlc3QtYWNjZXNzLXRva2VuJyxcbiAgICAgICAgICBjdXN0b21lcklkOiAnMTIzNDU2Nzg5JyxcbiAgICAgICAgICBkZXZlbG9wZXJUb2tlbjogJ3Rlc3QtZGV2ZWxvcGVyLXRva2VuJyxcbiAgICAgICAgfSxcbiAgICAgICAgbW9ja1Jlc3BvbnNlOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVzdWx0czogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udmVyc2lvbkFjdGlvbjoge1xuICAgICAgICAgICAgICAgICAgcmVzb3VyY2VOYW1lOiAnY3VzdG9tZXJzLzEyMzQ1Njc4OS9jb252ZXJzaW9uQWN0aW9ucy85ODc2NTQzJyxcbiAgICAgICAgICAgICAgICAgIGlkOiAnOTg3NjU0MycsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgY29udmVyc2lvbk5hbWU6ICd0ZXN0X2NvbnZlcnNpb24nLFxuICAgICAgICBzdGF0dXM6IDIwMCxcbiAgICAgICAgZXhwZWN0ZWRSZXN1bHQ6ICdjdXN0b21lcnMvMTIzNDU2Nzg5L2NvbnZlcnNpb25BY3Rpb25zLzk4NzY1NDMnLFxuICAgICAgICBleHBlY3RlZFJlcXVlc3Q6IHtcbiAgICAgICAgICB1cmw6ICcvMTIzNDU2Nzg5L2dvb2dsZUFkczpzZWFyY2hTdHJlYW0nLFxuICAgICAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIHF1ZXJ5OlxuICAgICAgICAgICAgICBcIlNFTEVDVCBjb252ZXJzaW9uX2FjdGlvbi5pZCBGUk9NIGNvbnZlcnNpb25fYWN0aW9uIFdIRVJFIGNvbnZlcnNpb25fYWN0aW9uLm5hbWUgPSAndGVzdF9jb252ZXJzaW9uJ1wiLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2hhbmRsZSBmYWlsdXJlIHNjZW5hcmlvIHdoZW4gYWNjZXNzVG9rZW4gaXMgd3JvbmcnLFxuICAgICAgICBhdXRoT2JqZWN0OiB7XG4gICAgICAgICAgY3VzdG9tZXJJZDogJzEyMzQ1Njc4OScsXG4gICAgICAgICAgZGV2ZWxvcGVyVG9rZW46ICd0ZXN0LWRldmVsb3Blci10b2tlbicsXG4gICAgICAgICAgYWNjZXNzVG9rZW46ICd3cm9uZy1hY2Nlc3MtdG9rZW4nLFxuICAgICAgICB9LFxuICAgICAgICBtb2NrUmVzcG9uc2U6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgICBjb2RlOiA0MDEsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgICAgICAgJ1JlcXVlc3QgaGFkIGludmFsaWQgYXV0aGVudGljYXRpb24gY3JlZGVudGlhbHMuIEV4cGVjdGVkIE9BdXRoIDIgYWNjZXNzIHRva2VuLCBsb2dpbiBjb29raWUgb3Igb3RoZXIgdmFsaWQgYXV0aGVudGljYXRpb24gY3JlZGVudGlhbC4gU2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL2lkZW50aXR5L3NpZ24taW4vd2ViL2RldmNvbnNvbGUtcHJvamVjdC4nLFxuICAgICAgICAgICAgICBzdGF0dXM6ICdVTkFVVEhFTlRJQ0FURUQnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBtb2NrUmVzcG9uc2VIZWFkZXI6IG5ldyBBeGlvc0hlYWRlcnMoe1xuICAgICAgICAgICd0cmFuc2Zlci1lbmNvZGluZyc6ICdjaHVua2VkJyxcbiAgICAgICAgfSksXG4gICAgICAgIGNvbnZlcnNpb25OYW1lOiAndGVzdF9jb252ZXJzaW9uJyxcbiAgICAgICAgc3RhdHVzOiA0MDEsXG4gICAgICAgIGV4cGVjdGVkUmVzdWx0OiB7XG4gICAgICAgICAgaGVhZGVyczogbmV3IEF4aW9zSGVhZGVycyh7XG4gICAgICAgICAgICAndHJhbnNmZXItZW5jb2RpbmcnOiAnY2h1bmtlZCcsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgbWVzc2FnZTogdW5kZWZpbmVkLFxuICAgICAgICAgIHJlc3BvbnNlQm9keTogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgICAgIGNvZGU6IDQwMSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgICAgICAgJ1JlcXVlc3QgaGFkIGludmFsaWQgYXV0aGVudGljYXRpb24gY3JlZGVudGlhbHMuIEV4cGVjdGVkIE9BdXRoIDIgYWNjZXNzIHRva2VuLCBsb2dpbiBjb29raWUgb3Igb3RoZXIgdmFsaWQgYXV0aGVudGljYXRpb24gY3JlZGVudGlhbC4gU2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL2lkZW50aXR5L3NpZ24taW4vd2ViL2RldmNvbnNvbGUtcHJvamVjdC4nLFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ1VOQVVUSEVOVElDQVRFRCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgc3RhdHVzQ29kZTogNDAxLFxuICAgICAgICAgIHR5cGU6ICdhcHBsaWNhdGlvbi1lcnJvcicsXG4gICAgICAgIH0sXG4gICAgICAgIGV4cGVjdGVkUmVxdWVzdDoge1xuICAgICAgICAgIHVybDogJy8xMjM0NTY3ODkvZ29vZ2xlQWRzOnNlYXJjaFN0cmVhbScsXG4gICAgICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgcXVlcnk6XG4gICAgICAgICAgICAgIFwiU0VMRUNUIGNvbnZlcnNpb25fYWN0aW9uLmlkIEZST00gY29udmVyc2lvbl9hY3Rpb24gV0hFUkUgY29udmVyc2lvbl9hY3Rpb24ubmFtZSA9ICd0ZXN0X2NvbnZlcnNpb24nXCIsXG4gICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnaGFuZGxlIHRoZSBzaXR1YXRpb24gd2hlbiB0aGUgY29udmVyc2lvbiBpcyBub3QgYXZhaWxhYmxlJyxcbiAgICAgICAgYXV0aE9iamVjdDoge1xuICAgICAgICAgIGFjY2Vzc1Rva2VuOiAndGVzdC1hY2Nlc3MtdG9rZW4nLFxuICAgICAgICAgIGN1c3RvbWVySWQ6ICcxMjM0NTY3ODknLFxuICAgICAgICAgIGRldmVsb3BlclRva2VuOiAndGVzdC1kZXZlbG9wZXItdG9rZW4nLFxuICAgICAgICB9LFxuICAgICAgICBtb2NrUmVzcG9uc2U6IFtdLFxuICAgICAgICBjb252ZXJzaW9uTmFtZTogJ25vbi1leGlzdGluZy1jb252ZXJzaW9uJyxcbiAgICAgICAgc3RhdHVzOiAyMDAsXG4gICAgICAgIGV4cGVjdGVkUmVzdWx0OiBudWxsLFxuICAgICAgICBleHBlY3RlZFJlcXVlc3Q6IHtcbiAgICAgICAgICB1cmw6ICcvMTIzNDU2Nzg5L2dvb2dsZUFkczpzZWFyY2hTdHJlYW0nLFxuICAgICAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIHF1ZXJ5OlxuICAgICAgICAgICAgICBcIlNFTEVDVCBjb252ZXJzaW9uX2FjdGlvbi5pZCBGUk9NIGNvbnZlcnNpb25fYWN0aW9uIFdIRVJFIGNvbnZlcnNpb25fYWN0aW9uLm5hbWUgPSAnbm9uLWV4aXN0aW5nLWNvbnZlcnNpb24nXCIsXG4gICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF07XG4gICAgdGVzdENhc2VzLmZvckVhY2goXG4gICAgICAoe1xuICAgICAgICBuYW1lLFxuICAgICAgICBhdXRoT2JqZWN0LFxuICAgICAgICBtb2NrUmVzcG9uc2UsXG4gICAgICAgIGNvbnZlcnNpb25OYW1lLFxuICAgICAgICBleHBlY3RlZFJlcXVlc3QsXG4gICAgICAgIGV4cGVjdGVkUmVzdWx0LFxuICAgICAgICBzdGF0dXMsXG4gICAgICAgIG1vY2tSZXNwb25zZUhlYWRlcixcbiAgICAgIH0pID0+IHtcbiAgICAgICAgaXQobmFtZSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGdvb2dsZUFkcyA9IG5ldyBHb29nbGVBZHMoYXV0aE9iamVjdCk7XG4gICAgICAgICAgbW9ja1xuICAgICAgICAgICAgLm9uUG9zdChcbiAgICAgICAgICAgICAgJ2h0dHBzOi8vZ29vZ2xlYWRzLmdvb2dsZWFwaXMuY29tL3YxOS9jdXN0b21lcnMvMTIzNDU2Nzg5L2dvb2dsZUFkczpzZWFyY2hTdHJlYW0nLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnJlcGx5KHN0YXR1cywgbW9ja1Jlc3BvbnNlLCBtb2NrUmVzcG9uc2VIZWFkZXIpO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdvb2dsZUFkcy5nZXRDb252ZXJzaW9uQWN0aW9uSWQoY29udmVyc2lvbk5hbWUpO1xuICAgICAgICAgIGV4cGVjdChtb2NrLmhpc3RvcnkucG9zdFswXSkudG9NYXRjaE9iamVjdChleHBlY3RlZFJlcXVlc3QpO1xuICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWRSZXN1bHQpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1Rlc3QgZ2V0Q3VzdG9tVmFyaWFibGUgZnVuY3Rpb24nLCAoKSA9PiB7XG4gICAgY29uc3QgdGVzdENhc2VzID0gW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnc2hvdWxkIHJldHVybiBhbiBhcnJheSBvZiBDdXN0b21WYXJpYWJsZVJlc3VsdHMgd2hlbiBBUEkgY2FsbCBzdWNjZWVkcycsXG4gICAgICAgIGF1dGhPYmplY3Q6IHtcbiAgICAgICAgICBhY2Nlc3NUb2tlbjogJ3Rlc3QtYWNjZXNzLXRva2VuJyxcbiAgICAgICAgICBjdXN0b21lcklkOiAnMTIzNDU2Nzg5JyxcbiAgICAgICAgICBkZXZlbG9wZXJUb2tlbjogJ3Rlc3QtZGV2ZWxvcGVyLXRva2VuJyxcbiAgICAgICAgfSxcbiAgICAgICAgbW9ja1Jlc3BvbnNlOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVzdWx0czogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udmVyc2lvbkN1c3RvbVZhcmlhYmxlOiB7XG4gICAgICAgICAgICAgICAgICByZXNvdXJjZU5hbWU6ICdjdXN0b21lcnMvMTIzL2NvbnZlcnNpb25DdXN0b21WYXJpYWJsZXMvNDU2JyxcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICd0ZXN0X3ZhcmlhYmxlJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGZpZWxkTWFzazogJ2NvbnZlcnNpb25fY3VzdG9tX3ZhcmlhYmxlLm5hbWUnLFxuICAgICAgICAgICAgcmVxdWVzdElkOiAnMTIzNDU2JyxcbiAgICAgICAgICAgIHF1ZXJ5UmVzb3VyY2VDb25zdW1wdGlvbjogJzEwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgc3RhdHVzOiAyMDAsXG4gICAgICAgIGV4cGVjdGVkUmVzdWx0OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29udmVyc2lvbkN1c3RvbVZhcmlhYmxlOiB7XG4gICAgICAgICAgICAgIHJlc291cmNlTmFtZTogJ2N1c3RvbWVycy8xMjMvY29udmVyc2lvbkN1c3RvbVZhcmlhYmxlcy80NTYnLFxuICAgICAgICAgICAgICBuYW1lOiAndGVzdF92YXJpYWJsZScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGV4cGVjdGVkUmVxdWVzdDoge1xuICAgICAgICAgIHVybDogJy8xMjM0NTY3ODkvZ29vZ2xlQWRzOnNlYXJjaFN0cmVhbScsXG4gICAgICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgcXVlcnk6ICdTRUxFQ1QgY29udmVyc2lvbl9jdXN0b21fdmFyaWFibGUubmFtZSBGUk9NIGNvbnZlcnNpb25fY3VzdG9tX3ZhcmlhYmxlJyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdzaG91bGQgaGFuZGxlIHRoZSBzY2VuYXJpbyB3aGVuIHRoZXJlIGlzIG5vdCBhbnkgY3VzdG9tVmFyaWFibGVzJyxcbiAgICAgICAgYXV0aE9iamVjdDoge1xuICAgICAgICAgIGFjY2Vzc1Rva2VuOiAndGVzdC1hY2Nlc3MtdG9rZW4nLFxuICAgICAgICAgIGN1c3RvbWVySWQ6ICcxMjM0NTY3ODknLFxuICAgICAgICAgIGRldmVsb3BlclRva2VuOiAndGVzdC1kZXZlbG9wZXItdG9rZW4nLFxuICAgICAgICB9LFxuICAgICAgICBzdGF0dXM6IDIwMCxcbiAgICAgICAgbW9ja1Jlc3BvbnNlOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVzdWx0czogW10sXG4gICAgICAgICAgICBmaWVsZE1hc2s6ICdjb252ZXJzaW9uX2N1c3RvbV92YXJpYWJsZS5uYW1lJyxcbiAgICAgICAgICAgIHJlcXVlc3RJZDogJzEyMzQ1NicsXG4gICAgICAgICAgICBxdWVyeVJlc291cmNlQ29uc3VtcHRpb246ICcxMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGV4cGVjdGVkUmVzdWx0OiBbXSxcbiAgICAgICAgZXhwZWN0ZWRSZXF1ZXN0OiB7XG4gICAgICAgICAgdXJsOiAnLzEyMzQ1Njc4OS9nb29nbGVBZHM6c2VhcmNoU3RyZWFtJyxcbiAgICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBxdWVyeTogJ1NFTEVDVCBjb252ZXJzaW9uX2N1c3RvbV92YXJpYWJsZS5uYW1lIEZST00gY29udmVyc2lvbl9jdXN0b21fdmFyaWFibGUnLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3Nob3VsZCByZXR1cm4gYW4gYXJyYXkgb2YgQ3VzdG9tVmFyaWFibGVSZXN1bHRzIHdoZW4gQVBJIGNhbGwgc3VjY2VlZHMnLFxuICAgICAgICBhdXRoT2JqZWN0OiB7XG4gICAgICAgICAgYWNjZXNzVG9rZW46ICd3cm9uZy1hY2Nlc3MtdG9rZW4nLFxuICAgICAgICAgIGN1c3RvbWVySWQ6ICcxMjM0NTY3ODknLFxuICAgICAgICAgIGRldmVsb3BlclRva2VuOiAndGVzdC1kZXZlbG9wZXItdG9rZW4nLFxuICAgICAgICB9LFxuICAgICAgICBtb2NrUmVzcG9uc2U6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgICBjb2RlOiA0MDEsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgICAgICAgJ1JlcXVlc3QgaGFkIGludmFsaWQgYXV0aGVudGljYXRpb24gY3JlZGVudGlhbHMuIEV4cGVjdGVkIE9BdXRoIDIgYWNjZXNzIHRva2VuLCBsb2dpbiBjb29raWUgb3Igb3RoZXIgdmFsaWQgYXV0aGVudGljYXRpb24gY3JlZGVudGlhbC4gU2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL2lkZW50aXR5L3NpZ24taW4vd2ViL2RldmNvbnNvbGUtcHJvamVjdC4nLFxuICAgICAgICAgICAgICBzdGF0dXM6ICdVTkFVVEhFTlRJQ0FURUQnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBzdGF0dXM6IDQwMSxcbiAgICAgICAgZXhwZWN0ZWRSZXN1bHQ6IHtcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgQXhpb3NIZWFkZXJzKHtcbiAgICAgICAgICAgICd0cmFuc2Zlci1lbmNvZGluZyc6ICdjaHVua2VkJyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBtZXNzYWdlOiB1bmRlZmluZWQsXG4gICAgICAgICAgcmVzcG9uc2VCb2R5OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAgICAgY29kZTogNDAxLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgICAgICAgICAnUmVxdWVzdCBoYWQgaW52YWxpZCBhdXRoZW50aWNhdGlvbiBjcmVkZW50aWFscy4gRXhwZWN0ZWQgT0F1dGggMiBhY2Nlc3MgdG9rZW4sIGxvZ2luIGNvb2tpZSBvciBvdGhlciB2YWxpZCBhdXRoZW50aWNhdGlvbiBjcmVkZW50aWFsLiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vaWRlbnRpdHkvc2lnbi1pbi93ZWIvZGV2Y29uc29sZS1wcm9qZWN0LicsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnVU5BVVRIRU5USUNBVEVEJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBzdGF0dXNDb2RlOiA0MDEsXG4gICAgICAgICAgdHlwZTogJ2FwcGxpY2F0aW9uLWVycm9yJyxcbiAgICAgICAgfSxcbiAgICAgICAgZXhwZWN0ZWRSZXF1ZXN0OiB7XG4gICAgICAgICAgdXJsOiAnLzEyMzQ1Njc4OS9nb29nbGVBZHM6c2VhcmNoU3RyZWFtJyxcbiAgICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBxdWVyeTogJ1NFTEVDVCBjb252ZXJzaW9uX2N1c3RvbV92YXJpYWJsZS5uYW1lIEZST00gY29udmVyc2lvbl9jdXN0b21fdmFyaWFibGUnLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgICBtb2NrUmVzcG9uc2VIZWFkZXI6IG5ldyBBeGlvc0hlYWRlcnMoe1xuICAgICAgICAgICd0cmFuc2Zlci1lbmNvZGluZyc6ICdjaHVua2VkJyxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgIF07XG5cbiAgICB0ZXN0Q2FzZXMuZm9yRWFjaChcbiAgICAgICh7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGF1dGhPYmplY3QsXG4gICAgICAgIG1vY2tSZXNwb25zZSxcbiAgICAgICAgZXhwZWN0ZWRSZXF1ZXN0LFxuICAgICAgICBleHBlY3RlZFJlc3VsdCxcbiAgICAgICAgc3RhdHVzLFxuICAgICAgICBtb2NrUmVzcG9uc2VIZWFkZXIsXG4gICAgICB9KSA9PiB7XG4gICAgICAgIGl0KG5hbWUsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBnb29nbGVBZHMgPSBuZXcgR29vZ2xlQWRzKGF1dGhPYmplY3QpO1xuICAgICAgICAgIG1vY2tcbiAgICAgICAgICAgIC5vblBvc3QoXG4gICAgICAgICAgICAgICdodHRwczovL2dvb2dsZWFkcy5nb29nbGVhcGlzLmNvbS92MTkvY3VzdG9tZXJzLzEyMzQ1Njc4OS9nb29nbGVBZHM6c2VhcmNoU3RyZWFtJyxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5yZXBseShzdGF0dXMsIG1vY2tSZXNwb25zZSwgbW9ja1Jlc3BvbnNlSGVhZGVyKTtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnb29nbGVBZHMuZ2V0Q3VzdG9tVmFyaWFibGUoKTtcbiAgICAgICAgICBleHBlY3QobW9jay5oaXN0b3J5LnBvc3RbMF0pLnRvTWF0Y2hPYmplY3QoZXhwZWN0ZWRSZXF1ZXN0KTtcbiAgICAgICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkUmVzdWx0KTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdUZXN0IGFkZENvbnZlcnNpb25BZGp1c3RNZW50IGZ1bmN0aW9uJywgKCkgPT4ge1xuICAgIGNvbnN0IFRlc3RDYXNlcyA9IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3Nob3VsZCBzdWNjZXNzZnVsbHkgdXBsb2FkIGNvbnZlcnNpb24gYWRqdXN0bWVudHMgd2l0aCB2YWxpZCBkYXRhJyxcbiAgICAgICAgYXV0aE9iamVjdDoge1xuICAgICAgICAgIGFjY2Vzc1Rva2VuOiAndmFsaWQtYWNjZXNzLXRva2VuJyxcbiAgICAgICAgICBjdXN0b21lcklkOiAnMTIzNDU2Nzg5JyxcbiAgICAgICAgICBkZXZlbG9wZXJUb2tlbjogJ3Rlc3QtZGV2ZWxvcGVyLXRva2VuJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVxdWVzdERhdGE6IHtcbiAgICAgICAgICBjb252ZXJzaW9uQWRqdXN0bWVudHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZ2NsaWREYXRlVGltZVBhaXI6IHtcbiAgICAgICAgICAgICAgICBnY2xpZDogJ3Rlc3QtZ2NsaWQnLFxuICAgICAgICAgICAgICAgIGNvbnZlcnNpb25EYXRlVGltZTogJzIwMjMtMDEtMDFUMDA6MDA6MDBaJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgYWRqdXN0bWVudFR5cGU6ICdSRVNUQVRFTUVOVCcgYXMgY29uc3QsXG4gICAgICAgICAgICAgIHJlc3RhdGVtZW50VmFsdWU6IHtcbiAgICAgICAgICAgICAgICBhZGp1c3RlZFZhbHVlOiAxMDAsXG4gICAgICAgICAgICAgICAgY3VycmVuY3lDb2RlOiAnVVNEJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdXNlcklkZW50aWZpZXJzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgdXNlcklkZW50aWZpZXJTb3VyY2U6ICdGSVJTVF9QQVJUWScgYXMgY29uc3QsXG4gICAgICAgICAgICAgICAgICBoYXNoZWRFbWFpbDogJzM4OTIwNTkwNGQ2YzdiYjgzZmM2NzY1MTM5MTEyMjZmMmJlMjViZjE0NjU2MTZiYjliMjk1ODcxMDBhYjE0MTQnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgcGFydGlhbEZhaWx1cmU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICBzdGF0dXM6IDIwMCxcbiAgICAgICAgbW9ja1Jlc3BvbnNlOiB7XG4gICAgICAgICAgY29udmVyc2lvbkFkanVzdG1lbnRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGdjbGlkRGF0ZVRpbWVQYWlyOiB7XG4gICAgICAgICAgICAgICAgZ2NsaWQ6ICd0ZXN0LWdjbGlkJyxcbiAgICAgICAgICAgICAgICBjb252ZXJzaW9uRGF0ZVRpbWU6ICcyMDIzLTAxLTAxVDAwOjAwOjAwWicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGFkanVzdG1lbnRUeXBlOiAnUkVTVEFURU1FTlQnLFxuICAgICAgICAgICAgICByZXN0YXRlbWVudFZhbHVlOiB7XG4gICAgICAgICAgICAgICAgYWRqdXN0ZWRWYWx1ZTogMTAwLFxuICAgICAgICAgICAgICAgIGN1cnJlbmN5Q29kZTogJ1VTRCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHVzZXJJZGVudGlmaWVyczogW10sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgcGFydGlhbEZhaWx1cmU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICBleHBlY3RlZFJlc3VsdDoge1xuICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJyxcbiAgICAgICAgICBzdGF0dXNDb2RlOiAyMDAsXG4gICAgICAgICAgcmVzcG9uc2VCb2R5OiB7XG4gICAgICAgICAgICBjb252ZXJzaW9uQWRqdXN0bWVudHM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGdjbGlkRGF0ZVRpbWVQYWlyOiB7XG4gICAgICAgICAgICAgICAgICBnY2xpZDogJ3Rlc3QtZ2NsaWQnLFxuICAgICAgICAgICAgICAgICAgY29udmVyc2lvbkRhdGVUaW1lOiAnMjAyMy0wMS0wMVQwMDowMDowMFonLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYWRqdXN0bWVudFR5cGU6ICdSRVNUQVRFTUVOVCcsXG4gICAgICAgICAgICAgICAgcmVzdGF0ZW1lbnRWYWx1ZTogeyBhZGp1c3RlZFZhbHVlOiAxMDAsIGN1cnJlbmN5Q29kZTogJ1VTRCcgfSxcbiAgICAgICAgICAgICAgICB1c2VySWRlbnRpZmllcnM6IFtdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHBhcnRpYWxGYWlsdXJlOiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGhlYWRlcnM6IG5ldyBBeGlvc0hlYWRlcnMoeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0pLFxuICAgICAgICB9LFxuICAgICAgICBtb2NrUmVzcG9uc2VIZWFkZXI6IG5ldyBBeGlvc0hlYWRlcnMoeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0pLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3Nob3VsZCBzdWNjZXNzZnVsbHkgaGFuZGxlIGZhaWx1cmUgc2NlbmFyaW8nLFxuICAgICAgICBhdXRoT2JqZWN0OiB7XG4gICAgICAgICAgYWNjZXNzVG9rZW46ICd3cm9uZy1hY2Nlc3MtdG9rZW4nLFxuICAgICAgICAgIGN1c3RvbWVySWQ6ICcxMjM0NTY3ODknLFxuICAgICAgICAgIGRldmVsb3BlclRva2VuOiAndGVzdC1kZXZlbG9wZXItdG9rZW4nLFxuICAgICAgICB9LFxuICAgICAgICByZXF1ZXN0RGF0YToge1xuICAgICAgICAgIGNvbnZlcnNpb25BZGp1c3RtZW50czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBnY2xpZERhdGVUaW1lUGFpcjoge1xuICAgICAgICAgICAgICAgIGdjbGlkOiAndGVzdC1nY2xpZCcsXG4gICAgICAgICAgICAgICAgY29udmVyc2lvbkRhdGVUaW1lOiAnMjAyMy0wMS0wMVQwMDowMDowMFonLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBhZGp1c3RtZW50VHlwZTogJ1JFU1RBVEVNRU5UJyBhcyBjb25zdCxcbiAgICAgICAgICAgICAgcmVzdGF0ZW1lbnRWYWx1ZToge1xuICAgICAgICAgICAgICAgIGFkanVzdGVkVmFsdWU6IDEwMCxcbiAgICAgICAgICAgICAgICBjdXJyZW5jeUNvZGU6ICdVU0QnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB1c2VySWRlbnRpZmllcnM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB1c2VySWRlbnRpZmllclNvdXJjZTogJ0ZJUlNUX1BBUlRZJyBhcyBjb25zdCxcbiAgICAgICAgICAgICAgICAgIGhhc2hlZEVtYWlsOiAnMzg5MjA1OTA0ZDZjN2JiODNmYzY3NjUxMzkxMTIyNmYyYmUyNWJmMTQ2NTYxNmJiOWIyOTU4NzEwMGFiMTQxNCcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBwYXJ0aWFsRmFpbHVyZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIHN0YXR1czogNDAxLFxuICAgICAgICBtb2NrUmVzcG9uc2U6IHtcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgQXhpb3NIZWFkZXJzKHtcbiAgICAgICAgICAgICd0cmFuc2Zlci1lbmNvZGluZyc6ICdjaHVua2VkJyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBtZXNzYWdlOiB1bmRlZmluZWQsXG4gICAgICAgICAgcmVzcG9uc2VCb2R5OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAgICAgY29kZTogNDAxLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgICAgICAgICAnUmVxdWVzdCBoYWQgaW52YWxpZCBhdXRoZW50aWNhdGlvbiBjcmVkZW50aWFscy4gRXhwZWN0ZWQgT0F1dGggMiBhY2Nlc3MgdG9rZW4sIGxvZ2luIGNvb2tpZSBvciBvdGhlciB2YWxpZCBhdXRoZW50aWNhdGlvbiBjcmVkZW50aWFsLiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vaWRlbnRpdHkvc2lnbi1pbi93ZWIvZGV2Y29uc29sZS1wcm9qZWN0LicsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnVU5BVVRIRU5USUNBVEVEJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBzdGF0dXNDb2RlOiA0MDEsXG4gICAgICAgICAgdHlwZTogJ2FwcGxpY2F0aW9uLWVycm9yJyxcbiAgICAgICAgfSxcbiAgICAgICAgZXhwZWN0ZWRSZXN1bHQ6IHtcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgQXhpb3NIZWFkZXJzKHtcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgbWVzc2FnZTogdW5kZWZpbmVkLFxuICAgICAgICAgIHJlc3BvbnNlQm9keToge1xuICAgICAgICAgICAgaGVhZGVyczogeyAndHJhbnNmZXItZW5jb2RpbmcnOiAnY2h1bmtlZCcgfSxcbiAgICAgICAgICAgIHJlc3BvbnNlQm9keTogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgICAgICAgIGNvZGU6IDQwMSxcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgICAgICAgICAgICdSZXF1ZXN0IGhhZCBpbnZhbGlkIGF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzLiBFeHBlY3RlZCBPQXV0aCAyIGFjY2VzcyB0b2tlbiwgbG9naW4gY29va2llIG9yIG90aGVyIHZhbGlkIGF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWwuIFNlZSBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9pZGVudGl0eS9zaWduLWluL3dlYi9kZXZjb25zb2xlLXByb2plY3QuJyxcbiAgICAgICAgICAgICAgICAgIHN0YXR1czogJ1VOQVVUSEVOVElDQVRFRCcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBzdGF0dXNDb2RlOiA0MDEsXG4gICAgICAgICAgICB0eXBlOiAnYXBwbGljYXRpb24tZXJyb3InLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RhdHVzQ29kZTogNDAxLFxuICAgICAgICAgIHR5cGU6ICdhcHBsaWNhdGlvbi1lcnJvcicsXG4gICAgICAgIH0sXG4gICAgICAgIG1vY2tSZXNwb25zZUhlYWRlcjogbmV3IEF4aW9zSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSksXG4gICAgICB9LFxuICAgIF07XG4gICAgVGVzdENhc2VzLmZvckVhY2goXG4gICAgICAoe1xuICAgICAgICBuYW1lLFxuICAgICAgICBhdXRoT2JqZWN0LFxuICAgICAgICBtb2NrUmVzcG9uc2UsXG4gICAgICAgIHJlcXVlc3REYXRhLFxuICAgICAgICBleHBlY3RlZFJlc3VsdCxcbiAgICAgICAgbW9ja1Jlc3BvbnNlSGVhZGVyLFxuICAgICAgICBzdGF0dXMsXG4gICAgICB9KSA9PiB7XG4gICAgICAgIGl0KG5hbWUsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBnb29nbGVBZHMgPSBuZXcgR29vZ2xlQWRzKGF1dGhPYmplY3QpO1xuICAgICAgICAgIG1vY2tcbiAgICAgICAgICAgIC5vblBvc3QoXG4gICAgICAgICAgICAgICdodHRwczovL2dvb2dsZWFkcy5nb29nbGVhcGlzLmNvbS92MTkvY3VzdG9tZXJzLzEyMzQ1Njc4OTp1cGxvYWRDb252ZXJzaW9uQWRqdXN0bWVudHMnLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnJlcGx5KHN0YXR1cywgbW9ja1Jlc3BvbnNlLCBtb2NrUmVzcG9uc2VIZWFkZXIpO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdvb2dsZUFkcy5hZGRDb252ZXJzaW9uQWRqdXN0TWVudChyZXF1ZXN0RGF0YSk7XG4gICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZFJlc3VsdCk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICApO1xuICB9KTtcblxuICBkZXNjcmliZSgnVGVzdCBjcmVhdGVPZmZsaW5lVXNlckRhdGFKb2IgZnVuY3Rpb24nLCAoKSA9PiB7XG4gICAgY29uc3QgVGVzdENhc2VzID0gW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnc2hvdWxkIHJldHVybiBqb2IgSUQgd2hlbiByZXNwb25zZSB0eXBlIGlzIHN1Y2Nlc3MgZm9yIGN1c3RvbWVyTWF0Y2hVc2VyTGlzdCBqb2InLFxuICAgICAgICBhdXRoT2JqZWN0OiB7XG4gICAgICAgICAgYWNjZXNzVG9rZW46ICd2YWxpZC1hY2Nlc3MtdG9rZW4nLFxuICAgICAgICAgIGN1c3RvbWVySWQ6ICcxMjM0NTY3ODknLFxuICAgICAgICAgIGRldmVsb3BlclRva2VuOiAndGVzdC1kZXZlbG9wZXItdG9rZW4nLFxuICAgICAgICAgIGxvZ2luQ3VzdG9tZXJJZDogJzk4NzY1NDMyMScsXG4gICAgICAgIH0sXG4gICAgICAgIHJlcXVlc3REYXRhOiB7XG4gICAgICAgICAgam9iOiB7XG4gICAgICAgICAgICB0eXBlOiAnQ1VTVE9NRVJfTUFUQ0hfVVNFUl9MSVNUJyBhcyBjb25zdCxcbiAgICAgICAgICAgIGN1c3RvbWVyTWF0Y2hVc2VyTGlzdE1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIHVzZXJMaXN0OiAnY3VzdG9tZXJzLzEyMzQ1Njc4OS91c2VyTGlzdHMvMTIzNCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHN0YXR1czogMjAwLFxuICAgICAgICBtb2NrUmVzcG9uc2U6IHtcbiAgICAgICAgICByZXNvdXJjZU5hbWU6ICdjdXN0b21lcnMvMTIzNDU2Nzg5L29mZmxpbmVVc2VyRGF0YUpvYnMvNTY3OCcsXG4gICAgICAgIH0sXG4gICAgICAgIGV4cGVjdGVkUmVzdWx0OiAnNTY3OCcsXG4gICAgICAgIG1vY2tSZXNwb25zZUhlYWRlcjogbmV3IEF4aW9zSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnc2hvdWxkIHJldHVybiBqb2IgSUQgd2hlbiByZXNwb25zZSB0eXBlIGlzIHN1Y2Nlc3MgZm9yIHN0b3JlIHNhbGVzIGpvYicsXG4gICAgICAgIGF1dGhPYmplY3Q6IHtcbiAgICAgICAgICBhY2Nlc3NUb2tlbjogJ3ZhbGlkLWFjY2Vzcy10b2tlbicsXG4gICAgICAgICAgY3VzdG9tZXJJZDogJzEyMzQ1Njc4OScsXG4gICAgICAgICAgZGV2ZWxvcGVyVG9rZW46ICd0ZXN0LWRldmVsb3Blci10b2tlbicsXG4gICAgICAgIH0sXG4gICAgICAgIHJlcXVlc3REYXRhOiB7XG4gICAgICAgICAgam9iOiB7XG4gICAgICAgICAgICBzdG9yZVNhbGVzTWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgY3VzdG9tX2tleTogJ0NVU1RPTV9LRVknLFxuICAgICAgICAgICAgICBsb3lhbHR5RnJhY3Rpb246IDEsXG4gICAgICAgICAgICAgIHRyYW5zYWN0aW9uX3VwbG9hZF9mcmFjdGlvbjogJzEnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHR5cGU6ICdTVE9SRV9TQUxFU19VUExPQURfRklSU1RfUEFSVFknIGFzIGNvbnN0LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHN0YXR1czogMjAwLFxuICAgICAgICBtb2NrUmVzcG9uc2U6IHtcbiAgICAgICAgICByZXNvdXJjZU5hbWU6ICdjdXN0b21lcnMvMTIzNDU2Nzg5L29mZmxpbmVVc2VyRGF0YUpvYnMvNTY3OCcsXG4gICAgICAgIH0sXG4gICAgICAgIGV4cGVjdGVkUmVzdWx0OiAnNTY3OCcsXG4gICAgICAgIG1vY2tSZXNwb25zZUhlYWRlcjogbmV3IEF4aW9zSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSksXG4gICAgICB9LFxuICAgIF07XG4gICAgVGVzdENhc2VzLmZvckVhY2goXG4gICAgICAoe1xuICAgICAgICBuYW1lLFxuICAgICAgICBhdXRoT2JqZWN0LFxuICAgICAgICBtb2NrUmVzcG9uc2UsXG4gICAgICAgIHN0YXR1cyxcbiAgICAgICAgcmVxdWVzdERhdGEsXG4gICAgICAgIGV4cGVjdGVkUmVzdWx0LFxuICAgICAgICBtb2NrUmVzcG9uc2VIZWFkZXIsXG4gICAgICB9KSA9PiB7XG4gICAgICAgIGl0KG5hbWUsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBnb29nbGVBZHMgPSBuZXcgR29vZ2xlQWRzKGF1dGhPYmplY3QpO1xuICAgICAgICAgIG1vY2tcbiAgICAgICAgICAgIC5vblBvc3QoXG4gICAgICAgICAgICAgICdodHRwczovL2dvb2dsZWFkcy5nb29nbGVhcGlzLmNvbS92MTkvY3VzdG9tZXJzLzEyMzQ1Njc4OS9vZmZsaW5lVXNlckRhdGFKb2JzOmNyZWF0ZScsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAucmVwbHkoc3RhdHVzLCBtb2NrUmVzcG9uc2UsIG1vY2tSZXNwb25zZUhlYWRlcik7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ29vZ2xlQWRzLmNyZWF0ZU9mZmxpbmVVc2VyRGF0YUpvYihyZXF1ZXN0RGF0YSk7XG4gICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZFJlc3VsdCk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICApO1xuICB9KTtcblxuICBkZXNjcmliZSgnVGVzdCBhZGRVc2VyVG9PZmZsaW5lVXNlckRhdGFKb2IgZnVuY3Rpb24nLCAoKSA9PiB7XG4gICAgY29uc3QgVGVzdENhc2VzID0gW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnc2hvdWxkIHN1Y2Nlc3NmdWxseSBhZGQgdXNlciBkYXRhIHRvIGFuIG9mZmxpbmUgdXNlciBkYXRhIGpvYicsXG4gICAgICAgIGF1dGhPYmplY3Q6IHtcbiAgICAgICAgICBhY2Nlc3NUb2tlbjogJ3ZhbGlkLWFjY2Vzcy10b2tlbicsXG4gICAgICAgICAgY3VzdG9tZXJJZDogJzEyMzQ1Njc4OScsXG4gICAgICAgICAgZGV2ZWxvcGVyVG9rZW46ICd0ZXN0LWRldmVsb3Blci10b2tlbicsXG4gICAgICAgICAgbG9naW5DdXN0b21lcklkOiAnOTg3NjU0MzIxJyxcbiAgICAgICAgfSxcbiAgICAgICAgam9iSWQ6ICcxMjM0JyxcbiAgICAgICAgcmVxdWVzdERhdGE6IHtcbiAgICAgICAgICBvcGVyYXRpb25zOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNyZWF0ZToge1xuICAgICAgICAgICAgICAgIHVzZXJJZGVudGlmaWVyczogW3sgaGFzaGVkRW1haWw6ICdoYXNoZWRfZW1haWxfdmFsdWUnIH1dLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGVuYWJsZVBhcnRpYWxGYWlsdXJlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAgc3RhdHVzOiAyMDAsXG4gICAgICAgIG1vY2tSZXNwb25zZToge30sXG4gICAgICAgIGV4cGVjdGVkUmVzdWx0OiB7XG4gICAgICAgICAgaGVhZGVyczogbmV3IEF4aW9zSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSksXG4gICAgICAgICAgcmVzcG9uc2VCb2R5OiB7fSxcbiAgICAgICAgICBzdGF0dXNDb2RlOiAyMDAsXG4gICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxuICAgICAgICB9LFxuICAgICAgICBtb2NrUmVzcG9uc2VIZWFkZXI6IG5ldyBBeGlvc0hlYWRlcnMoeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0pLFxuICAgICAgfSxcbiAgICBdO1xuICAgIFRlc3RDYXNlcy5mb3JFYWNoKFxuICAgICAgKHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgYXV0aE9iamVjdCxcbiAgICAgICAgbW9ja1Jlc3BvbnNlLFxuICAgICAgICBzdGF0dXMsXG4gICAgICAgIHJlcXVlc3REYXRhLFxuICAgICAgICBleHBlY3RlZFJlc3VsdCxcbiAgICAgICAgbW9ja1Jlc3BvbnNlSGVhZGVyLFxuICAgICAgICBqb2JJZCxcbiAgICAgIH0pID0+IHtcbiAgICAgICAgaXQobmFtZSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGdvb2dsZUFkcyA9IG5ldyBHb29nbGVBZHMoYXV0aE9iamVjdCk7XG4gICAgICAgICAgbW9ja1xuICAgICAgICAgICAgLm9uUG9zdChcbiAgICAgICAgICAgICAgJ2h0dHBzOi8vZ29vZ2xlYWRzLmdvb2dsZWFwaXMuY29tL3YxOS9jdXN0b21lcnMvMTIzNDU2Nzg5L29mZmxpbmVVc2VyRGF0YUpvYnMvMTIzNDphZGRPcGVyYXRpb25zJyxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5yZXBseShzdGF0dXMsIG1vY2tSZXNwb25zZSwgbW9ja1Jlc3BvbnNlSGVhZGVyKTtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnb29nbGVBZHMuYWRkVXNlclRvT2ZmbGluZVVzZXJEYXRhSm9iKGpvYklkLCByZXF1ZXN0RGF0YSk7XG4gICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZFJlc3VsdCk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICApO1xuICB9KTtcblxuICBkZXNjcmliZSgnVGVzdCBhZGRDb252ZXJzaW9uc1RvT2ZmbGluZVVzZXJEYXRhSm9iIGZ1bmN0aW9uJywgKCkgPT4ge1xuICAgIGNvbnN0IFRlc3RDYXNlcyA9IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3Nob3VsZCBzdWNjZXNzZnVsbHkgYWRkIHN0b3JlIHNhbGVzIGNvbnZlcnNpb24gZGF0YSB0byBhbiBvZmZsaW5lIHVzZXIgZGF0YSBqb2InLFxuICAgICAgICBhdXRoT2JqZWN0OiB7XG4gICAgICAgICAgYWNjZXNzVG9rZW46ICd2YWxpZC1hY2Nlc3MtdG9rZW4nLFxuICAgICAgICAgIGN1c3RvbWVySWQ6ICcxMjM0NTY3ODknLFxuICAgICAgICAgIGRldmVsb3BlclRva2VuOiAndGVzdC1kZXZlbG9wZXItdG9rZW4nLFxuICAgICAgICAgIGxvZ2luQ3VzdG9tZXJJZDogJzk4NzY1NDMyMScsXG4gICAgICAgIH0sXG4gICAgICAgIGpvYklkOiAnMTIzNCcsXG4gICAgICAgIHJlcXVlc3REYXRhOiB7XG4gICAgICAgICAgb3BlcmF0aW9uczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjcmVhdGU6IHtcbiAgICAgICAgICAgICAgICB1c2VySWRlbnRpZmllcnM6IFt7IGhhc2hlZEVtYWlsOiAnaGFzaGVkLWVtYWlsLXZhbHVlJyB9XSxcbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbkluZm86IHtcbiAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25BY3Rpb246ICdjdXN0b21lcnMvMTIzNDU2Nzg5L2NvbnZlcnNpb25BY3Rpb25zLzk4NycsXG4gICAgICAgICAgICAgICAgICBjb252ZXJzaW9uRGF0ZVRpbWU6ICcyMDIzLTAxLTAxIDEyOjAwOjAwJyxcbiAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25WYWx1ZTogMTAuOTksXG4gICAgICAgICAgICAgICAgICBjdXJyZW5jeUNvZGU6ICdVU0QnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgZW5hYmxlUGFydGlhbEZhaWx1cmU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHN0YXR1czogMjAwLFxuICAgICAgICBtb2NrUmVzcG9uc2U6IHt9LFxuICAgICAgICBleHBlY3RlZFJlc3VsdDoge1xuICAgICAgICAgIGhlYWRlcnM6IG5ldyBBeGlvc0hlYWRlcnMoeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0pLFxuICAgICAgICAgIHJlc3BvbnNlQm9keToge30sXG4gICAgICAgICAgc3RhdHVzQ29kZTogMjAwLFxuICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJyxcbiAgICAgICAgfSxcbiAgICAgICAgbW9ja1Jlc3BvbnNlSGVhZGVyOiBuZXcgQXhpb3NIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9KSxcbiAgICAgIH0sXG4gICAgXTtcbiAgICBUZXN0Q2FzZXMuZm9yRWFjaChcbiAgICAgICh7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGF1dGhPYmplY3QsXG4gICAgICAgIG1vY2tSZXNwb25zZSxcbiAgICAgICAgc3RhdHVzLFxuICAgICAgICByZXF1ZXN0RGF0YSxcbiAgICAgICAgZXhwZWN0ZWRSZXN1bHQsXG4gICAgICAgIG1vY2tSZXNwb25zZUhlYWRlcixcbiAgICAgICAgam9iSWQsXG4gICAgICB9KSA9PiB7XG4gICAgICAgIGl0KG5hbWUsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBnb29nbGVBZHMgPSBuZXcgR29vZ2xlQWRzKGF1dGhPYmplY3QpO1xuICAgICAgICAgIG1vY2tcbiAgICAgICAgICAgIC5vblBvc3QoXG4gICAgICAgICAgICAgICdodHRwczovL2dvb2dsZWFkcy5nb29nbGVhcGlzLmNvbS92MTkvY3VzdG9tZXJzLzEyMzQ1Njc4OS9vZmZsaW5lVXNlckRhdGFKb2JzLzEyMzQ6YWRkT3BlcmF0aW9ucycsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAucmVwbHkoc3RhdHVzLCBtb2NrUmVzcG9uc2UsIG1vY2tSZXNwb25zZUhlYWRlcik7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ29vZ2xlQWRzLmFkZENvbnZlcnNpb25zVG9PZmZsaW5lVXNlckRhdGFKb2Ioam9iSWQsIHJlcXVlc3REYXRhKTtcbiAgICAgICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkUmVzdWx0KTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdUZXN0IHJ1bk9mZmxpbmVVc2VyRGF0YUpvYiBmdW5jdGlvbicsICgpID0+IHtcbiAgICBjb25zdCBUZXN0Q2FzZXMgPSBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdzaG91bGQgc3VjY2Vzc2Z1bGx5IHJ1biBhbiBvZmZsaW5lIHVzZXIgZGF0YSBqb2Igd2l0aCB2YWxpZCBqb2JJZCcsXG4gICAgICAgIGF1dGhPYmplY3Q6IHtcbiAgICAgICAgICBhY2Nlc3NUb2tlbjogJ3ZhbGlkLWFjY2Vzcy10b2tlbicsXG4gICAgICAgICAgY3VzdG9tZXJJZDogJzEyMzQ1Njc4OScsXG4gICAgICAgICAgZGV2ZWxvcGVyVG9rZW46ICd0ZXN0LWRldmVsb3Blci10b2tlbicsXG4gICAgICAgICAgbG9naW5DdXN0b21lcklkOiAnOTg3NjU0MzIxJyxcbiAgICAgICAgfSxcbiAgICAgICAgam9iSWQ6ICcxMjM0JyxcbiAgICAgICAgcmVxdWVzdERhdGE6IHt9LFxuICAgICAgICBzdGF0dXM6IDIwMCxcbiAgICAgICAgbW9ja1Jlc3BvbnNlOiB7XG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICBkYXRhOiB7IG5hbWU6ICd0ZXN0LWpvYicsIGRvbmU6IHRydWUgfSxcbiAgICAgICAgfSxcbiAgICAgICAgZXhwZWN0ZWRSZXN1bHQ6IHtcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgQXhpb3NIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9KSxcbiAgICAgICAgICByZXNwb25zZUJvZHk6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICBkYXRhOiB7IG5hbWU6ICd0ZXN0LWpvYicsIGRvbmU6IHRydWUgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0YXR1c0NvZGU6IDIwMCxcbiAgICAgICAgICB0eXBlOiAnc3VjY2VzcycsXG4gICAgICAgIH0sXG4gICAgICAgIG1vY2tSZXNwb25zZUhlYWRlcjogbmV3IEF4aW9zSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSksXG4gICAgICB9LFxuICAgIF07XG4gICAgVGVzdENhc2VzLmZvckVhY2goXG4gICAgICAoeyBuYW1lLCBhdXRoT2JqZWN0LCBtb2NrUmVzcG9uc2UsIHN0YXR1cywgZXhwZWN0ZWRSZXN1bHQsIG1vY2tSZXNwb25zZUhlYWRlciwgam9iSWQgfSkgPT4ge1xuICAgICAgICBpdChuYW1lLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZ29vZ2xlQWRzID0gbmV3IEdvb2dsZUFkcyhhdXRoT2JqZWN0KTtcbiAgICAgICAgICBtb2NrXG4gICAgICAgICAgICAub25Qb3N0KFxuICAgICAgICAgICAgICAnaHR0cHM6Ly9nb29nbGVhZHMuZ29vZ2xlYXBpcy5jb20vdjE5L2N1c3RvbWVycy8xMjM0NTY3ODkvb2ZmbGluZVVzZXJEYXRhSm9icy8xMjM0OnJ1bicsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAucmVwbHkoc3RhdHVzLCBtb2NrUmVzcG9uc2UsIG1vY2tSZXNwb25zZUhlYWRlcik7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ29vZ2xlQWRzLnJ1bk9mZmxpbmVVc2VyRGF0YUpvYihqb2JJZCk7XG4gICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZFJlc3VsdCk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICApO1xuICB9KTtcblxuICBkZXNjcmliZSgnVGVzdCB1cGxvYWRDbGlja0NvbnZlcnNpb24gZnVuY3Rpb24nLCAoKSA9PiB7XG4gICAgY29uc3QgVGVzdENhc2VzID0gW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnc2hvdWxkIHN1Y2Nlc3NmdWxseSBhZGQgdXNlciBkYXRhIHRvIGFuIG9mZmxpbmUgdXNlciBkYXRhIGpvYicsXG4gICAgICAgIGF1dGhPYmplY3Q6IHtcbiAgICAgICAgICBhY2Nlc3NUb2tlbjogJ3ZhbGlkLWFjY2Vzcy10b2tlbicsXG4gICAgICAgICAgY3VzdG9tZXJJZDogJzEyMzQ1Njc4OScsXG4gICAgICAgICAgZGV2ZWxvcGVyVG9rZW46ICd0ZXN0LWRldmVsb3Blci10b2tlbicsXG4gICAgICAgICAgbG9naW5DdXN0b21lcklkOiAnOTg3NjU0MzIxJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVxdWVzdERhdGE6IHtcbiAgICAgICAgICBjb252ZXJzaW9uczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBnY2xpZDogJ3Rlc3QtZ2NsaWQnLFxuICAgICAgICAgICAgICBjb252ZXJzaW9uQWN0aW9uOiAndGVzdC1hY3Rpb24nLFxuICAgICAgICAgICAgICBjb252ZXJzaW9uRGF0ZVRpbWU6ICcyMDIzLTAxLTAxVDAwOjAwOjAwWicsXG4gICAgICAgICAgICAgIGNvbnZlcnNpb25WYWx1ZTogMTAwLFxuICAgICAgICAgICAgICBjdXJyZW5jeUNvZGU6ICdVU0QnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBzdGF0dXM6IDIwMCxcbiAgICAgICAgbW9ja1Jlc3BvbnNlOiB7XG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICByZXN1bHRzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBnY2xpZDogJ3Rlc3QtZ2NsaWQnLFxuICAgICAgICAgICAgICAgIGNvbnZlcnNpb25BY3Rpb246ICd0ZXN0LWFjdGlvbicsXG4gICAgICAgICAgICAgICAgY29udmVyc2lvbkRhdGVUaW1lOiAnMjAyMy0wMS0wMVQwMDowMDowMFonLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBleHBlY3RlZFJlc3VsdDoge1xuICAgICAgICAgIGhlYWRlcnM6IG5ldyBBeGlvc0hlYWRlcnMoeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0pLFxuICAgICAgICAgIHJlc3BvbnNlQm9keToge1xuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICByZXN1bHRzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgY29udmVyc2lvbkFjdGlvbjogJ3Rlc3QtYWN0aW9uJyxcbiAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25EYXRlVGltZTogJzIwMjMtMDEtMDFUMDA6MDA6MDBaJyxcbiAgICAgICAgICAgICAgICAgIGdjbGlkOiAndGVzdC1nY2xpZCcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RhdHVzQ29kZTogMjAwLFxuICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJyxcbiAgICAgICAgfSxcbiAgICAgICAgbW9ja1Jlc3BvbnNlSGVhZGVyOiBuZXcgQXhpb3NIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9KSxcbiAgICAgIH0sXG4gICAgXTtcbiAgICBUZXN0Q2FzZXMuZm9yRWFjaChcbiAgICAgICh7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGF1dGhPYmplY3QsXG4gICAgICAgIG1vY2tSZXNwb25zZSxcbiAgICAgICAgc3RhdHVzLFxuICAgICAgICBleHBlY3RlZFJlc3VsdCxcbiAgICAgICAgbW9ja1Jlc3BvbnNlSGVhZGVyLFxuICAgICAgICByZXF1ZXN0RGF0YSxcbiAgICAgIH0pID0+IHtcbiAgICAgICAgaXQobmFtZSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGdvb2dsZUFkcyA9IG5ldyBHb29nbGVBZHMoYXV0aE9iamVjdCk7XG4gICAgICAgICAgbW9ja1xuICAgICAgICAgICAgLm9uUG9zdChcbiAgICAgICAgICAgICAgJ2h0dHBzOi8vZ29vZ2xlYWRzLmdvb2dsZWFwaXMuY29tL3YxOS9jdXN0b21lcnMvMTIzNDU2Nzg5OnVwbG9hZENsaWNrQ29udmVyc2lvbnMnLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnJlcGx5KHN0YXR1cywgbW9ja1Jlc3BvbnNlLCBtb2NrUmVzcG9uc2VIZWFkZXIpO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdvb2dsZUFkcy51cGxvYWRDbGlja0NvbnZlcnNpb24ocmVxdWVzdERhdGEpO1xuICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWRSZXN1bHQpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1Rlc3QgdXBsb2FkQ2FsbENvbnZlcnNpb24gZnVuY3Rpb24nLCAoKSA9PiB7XG4gICAgY29uc3QgVGVzdENhc2VzID0gW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnc2hvdWxkIHN1Y2Nlc3NmdWxseSB1cGxvYWQgY2FsbCBjb252ZXJzaW9uIGRhdGEgYW5kIHJldHVybiBhIHN1Y2Nlc3NmdWwgcmVzcG9uc2UnLFxuICAgICAgICBhdXRoT2JqZWN0OiB7XG4gICAgICAgICAgYWNjZXNzVG9rZW46ICd2YWxpZC1hY2Nlc3MtdG9rZW4nLFxuICAgICAgICAgIGN1c3RvbWVySWQ6ICcxMjM0NTY3ODknLFxuICAgICAgICAgIGRldmVsb3BlclRva2VuOiAndGVzdC1kZXZlbG9wZXItdG9rZW4nLFxuICAgICAgICAgIGxvZ2luQ3VzdG9tZXJJZDogJzk4NzY1NDMyMScsXG4gICAgICAgIH0sXG4gICAgICAgIHJlcXVlc3REYXRhOiB7XG4gICAgICAgICAgY29udmVyc2lvbnM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY2FsbGVySWQ6ICcxMjM0NTY3ODkwJyxcbiAgICAgICAgICAgICAgY2FsbFN0YXJ0RGF0ZVRpbWU6ICcyMDIzLTAxLTAxVDEyOjAwOjAwWicsXG4gICAgICAgICAgICAgIGNvbnZlcnNpb25BY3Rpb246ICdhY3Rpb24xJyxcbiAgICAgICAgICAgICAgY29udmVyc2lvbkRhdGVUaW1lOiAnMjAyMy0wMS0wMVQxMjowNTowMFonLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHBhcnRpYWxGYWlsdXJlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAgc3RhdHVzOiAyMDAsXG4gICAgICAgIG1vY2tSZXNwb25zZToge1xuICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgcmVzdWx0czogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY2FsbGVySWQ6ICcxMjM0NTY3ODkwJyxcbiAgICAgICAgICAgICAgICBjYWxsU3RhcnREYXRlVGltZTogJzIwMjMtMDEtMDFUMTI6MDA6MDBaJyxcbiAgICAgICAgICAgICAgICBjb252ZXJzaW9uQWN0aW9uOiAnYWN0aW9uMScsXG4gICAgICAgICAgICAgICAgY29udmVyc2lvbkRhdGVUaW1lOiAnMjAyMy0wMS0wMVQxMjowNTowMFonLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBleHBlY3RlZFJlc3VsdDoge1xuICAgICAgICAgIGhlYWRlcnM6IG5ldyBBeGlvc0hlYWRlcnMoeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0pLFxuICAgICAgICAgIHJlc3BvbnNlQm9keToge1xuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICByZXN1bHRzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgY2FsbFN0YXJ0RGF0ZVRpbWU6ICcyMDIzLTAxLTAxVDEyOjAwOjAwWicsXG4gICAgICAgICAgICAgICAgICBjYWxsZXJJZDogJzEyMzQ1Njc4OTAnLFxuICAgICAgICAgICAgICAgICAgY29udmVyc2lvbkFjdGlvbjogJ2FjdGlvbjEnLFxuICAgICAgICAgICAgICAgICAgY29udmVyc2lvbkRhdGVUaW1lOiAnMjAyMy0wMS0wMVQxMjowNTowMFonLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0YXR1c0NvZGU6IDIwMCxcbiAgICAgICAgICB0eXBlOiAnc3VjY2VzcycsXG4gICAgICAgIH0sXG4gICAgICAgIG1vY2tSZXNwb25zZUhlYWRlcjogbmV3IEF4aW9zSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSksXG4gICAgICB9LFxuICAgIF07XG4gICAgVGVzdENhc2VzLmZvckVhY2goXG4gICAgICAoe1xuICAgICAgICBuYW1lLFxuICAgICAgICBhdXRoT2JqZWN0LFxuICAgICAgICBtb2NrUmVzcG9uc2UsXG4gICAgICAgIHN0YXR1cyxcbiAgICAgICAgZXhwZWN0ZWRSZXN1bHQsXG4gICAgICAgIG1vY2tSZXNwb25zZUhlYWRlcixcbiAgICAgICAgcmVxdWVzdERhdGEsXG4gICAgICB9KSA9PiB7XG4gICAgICAgIGl0KG5hbWUsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBnb29nbGVBZHMgPSBuZXcgR29vZ2xlQWRzKGF1dGhPYmplY3QpO1xuICAgICAgICAgIG1vY2tcbiAgICAgICAgICAgIC5vblBvc3QoXG4gICAgICAgICAgICAgICdodHRwczovL2dvb2dsZWFkcy5nb29nbGVhcGlzLmNvbS92MTkvY3VzdG9tZXJzLzEyMzQ1Njc4OTp1cGxvYWRDbGlja0NvbnZlcnNpb25zJyxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5yZXBseShzdGF0dXMsIG1vY2tSZXNwb25zZSwgbW9ja1Jlc3BvbnNlSGVhZGVyKTtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnb29nbGVBZHMudXBsb2FkQ2xpY2tDb252ZXJzaW9uKHJlcXVlc3REYXRhKTtcbiAgICAgICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkUmVzdWx0KTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICk7XG4gIH0pO1xufSk7XG4iXX0=