payload-auth 1.4.0 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (22) hide show
  1. package/dist/better-auth/adapter/index.d.ts +10 -0
  2. package/dist/better-auth/adapter/index.d.ts.map +1 -1
  3. package/dist/better-auth/adapter/index.js +151 -125
  4. package/dist/better-auth/adapter/transform/index.d.ts +2 -4
  5. package/dist/better-auth/adapter/transform/index.d.ts.map +1 -1
  6. package/dist/better-auth/adapter/transform/index.js +433 -309
  7. package/dist/better-auth/plugin/constants.d.ts +1 -0
  8. package/dist/better-auth/plugin/constants.d.ts.map +1 -1
  9. package/dist/better-auth/plugin/constants.js +2 -1
  10. package/dist/better-auth/plugin/helpers/prepare-session-data.d.ts +52 -6
  11. package/dist/better-auth/plugin/helpers/prepare-session-data.d.ts.map +1 -1
  12. package/dist/better-auth/plugin/helpers/prepare-session-data.js +52 -35
  13. package/dist/better-auth/plugin/lib/build-collections/sessions.d.ts.map +1 -1
  14. package/dist/better-auth/plugin/lib/build-collections/sessions.js +3 -1
  15. package/dist/better-auth/plugin/lib/build-collections/users/better-auth-strategy.d.ts.map +1 -1
  16. package/dist/better-auth/plugin/lib/build-collections/users/better-auth-strategy.js +2 -2
  17. package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-login.d.ts.map +1 -1
  18. package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-login.js +6 -4
  19. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/save-to-jwt-middleware.d.ts +1 -1
  20. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/save-to-jwt-middleware.d.ts.map +1 -1
  21. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/save-to-jwt-middleware.js +16 -14
  22. package/package.json +9 -4
@@ -2,61 +2,101 @@ import { BetterAuthError } from "better-auth";
2
2
  import { generateSchema } from "./generate-schema";
3
3
  import { createTransform } from "./transform";
4
4
  export const BETTER_AUTH_CONTEXT_KEY = 'payload-db-adapter';
5
- const PAYLOAD_QUERY_DEPTH = 2;
6
- const payloadAdapter = (payloadClient, config)=>{
7
- function debugLog(message) {
5
+ const PAYLOAD_QUERY_DEPTH = 0;
6
+ /**
7
+ * Payload adapter for Better Auth
8
+ *
9
+ * This adapter connects Better Auth to Payload CMS, allowing authentication
10
+ * operations to be performed against Payload collections.
11
+ *
12
+ * @param payloadClient - The Payload CMS client instance or a function that returns it
13
+ * @param config - Configuration options for the adapter
14
+ * @returns A function that creates a Better Auth adapter
15
+ */ const payloadAdapter = (payloadClient, config)=>{
16
+ /**
17
+ * Logs debug messages if debug logging is enabled
18
+ * @param message - The message to log
19
+ */ function debugLog(message) {
8
20
  if (config.enableDebugLogs) {
9
21
  console.log('[payload-db-adapter]', ...message);
10
22
  }
11
23
  }
12
- function errorLog(message) {
24
+ /**
25
+ * Logs error messages
26
+ * @param message - The error message to log
27
+ */ function errorLog(message) {
13
28
  console.error(`[payload-db-adapter]`, ...message);
14
29
  }
15
- function collectionSlugError(model) {
30
+ /**
31
+ * Throws an error when a collection slug doesn't exist
32
+ * @param model - The model name that couldn't be found
33
+ * @throws {BetterAuthError} When the collection doesn't exist
34
+ * @returns Never - Function always throws
35
+ */ function collectionSlugError(model) {
16
36
  throw new BetterAuthError(`Collection ${model} does not exist. Please check your payload collection slugs match the better auth schema`);
17
37
  }
18
- const createAdapterContext = (data)=>({
38
+ /**
39
+ * Validates that a collection exists in Payload
40
+ * @param payload - The Payload client instance
41
+ * @param collectionSlug - The collection slug to validate
42
+ * @param model - The model name for error messages
43
+ * @throws {BetterAuthError} When the collection doesn't exist
44
+ */ async function validateCollection(payload, collectionSlug, model) {
45
+ if (!collectionSlug || !(collectionSlug in payload.collections)) {
46
+ collectionSlugError(model);
47
+ }
48
+ }
49
+ /**
50
+ * Creates a context object for Payload operations
51
+ * @param data - Data to include in the context
52
+ * @returns The context object with Better Auth metadata
53
+ */ const createAdapterContext = (data)=>({
19
54
  [BETTER_AUTH_CONTEXT_KEY]: {
20
55
  ...data
21
56
  }
22
57
  });
23
- async function resolvePayloadClient() {
58
+ /**
59
+ * Resolves the Payload client, handling both function and direct references
60
+ * @returns The resolved Payload client
61
+ * @throws {BetterAuthError} When Better Auth plugin is not configured
62
+ */ async function resolvePayloadClient() {
24
63
  const payload = typeof payloadClient === 'function' ? await payloadClient() : await payloadClient;
25
64
  if (!payload.config?.custom?.hasBetterAuthPlugin) {
26
65
  throw new BetterAuthError(`Payload is not configured with the better-auth plugin. Please add the plugin to your payload config.`);
27
66
  }
28
67
  return payload;
29
68
  }
30
- return (options)=>{
31
- const { transformInput, transformOutput, convertWhereClause, convertSelect, convertSort, getModelName, singleIdQuery, multipleIdsQuery } = createTransform(options, config.enableDebugLogs ?? false);
69
+ /**
70
+ * Creates and returns a Better Auth adapter for Payload
71
+ * @param options - Better Auth options
72
+ * @returns A Better Auth adapter implementation
73
+ */ return (options)=>{
74
+ const { transformInput, transformOutput, convertWhereClause, convertSelect, convertSort, getCollectionSlug, singleIdQuery } = createTransform(options, config.enableDebugLogs ?? false);
32
75
  return {
33
- id: 'payload',
34
- async create (data) {
76
+ id: 'payload-adapter',
77
+ async create ({ model, data: values, select }) {
35
78
  const start = Date.now();
36
- const { model, data: values, select } = data;
37
- const collectionSlug = getModelName(model);
38
- const transformed = transformInput({
79
+ const payload = await resolvePayloadClient();
80
+ const collectionSlug = getCollectionSlug(model);
81
+ // Validate collection exists before proceeding
82
+ await validateCollection(payload, collectionSlug, model);
83
+ const transformedInput = transformInput({
39
84
  data: values,
40
85
  model,
41
- action: 'create',
42
86
  idType: config.idType
43
87
  });
44
88
  debugLog([
45
89
  'create',
46
90
  {
47
91
  collectionSlug,
48
- transformed,
92
+ transformedInput,
49
93
  select
50
94
  }
51
95
  ]);
52
96
  try {
53
- const payload = await resolvePayloadClient();
54
- if (!collectionSlug || !(collectionSlug in payload.collections)) {
55
- collectionSlugError(model);
56
- }
57
97
  const result = await payload.create({
58
98
  collection: collectionSlug,
59
- data: transformed,
99
+ data: transformedInput,
60
100
  select: convertSelect(model, select),
61
101
  context: createAdapterContext({
62
102
  model,
@@ -86,10 +126,12 @@ const payloadAdapter = (payloadClient, config)=>{
86
126
  return null;
87
127
  }
88
128
  },
89
- async findOne (data) {
129
+ async findOne ({ model, where, select }) {
90
130
  const start = Date.now();
91
- const { model, where, select } = data;
92
- const collectionSlug = getModelName(model);
131
+ const payload = await resolvePayloadClient();
132
+ const collectionSlug = getCollectionSlug(model);
133
+ // Validate collection exists before proceeding
134
+ await validateCollection(payload, collectionSlug, model);
93
135
  const payloadWhere = convertWhereClause({
94
136
  idType: config.idType,
95
137
  model,
@@ -102,23 +144,19 @@ const payloadAdapter = (payloadClient, config)=>{
102
144
  }
103
145
  ]);
104
146
  try {
105
- const payload = await resolvePayloadClient();
106
- if (!collectionSlug || !(collectionSlug in payload.collections)) {
107
- collectionSlugError(model);
108
- }
109
- const id = singleIdQuery(payloadWhere);
147
+ const singleId = singleIdQuery(payloadWhere);
110
148
  let result = null;
111
- if (id) {
149
+ if (singleId) {
112
150
  debugLog([
113
151
  'findOneByID',
114
152
  {
115
153
  collectionSlug,
116
- id
154
+ id: singleId
117
155
  }
118
156
  ]);
119
- const doc = await payload.findByID({
157
+ result = await payload.findByID({
120
158
  collection: collectionSlug,
121
- id,
159
+ id: singleId,
122
160
  select: convertSelect(model, select),
123
161
  context: createAdapterContext({
124
162
  model,
@@ -126,7 +164,6 @@ const payloadAdapter = (payloadClient, config)=>{
126
164
  }),
127
165
  depth: PAYLOAD_QUERY_DEPTH
128
166
  });
129
- result = doc;
130
167
  } else {
131
168
  debugLog([
132
169
  'findOneByWhere',
@@ -162,6 +199,9 @@ const payloadAdapter = (payloadClient, config)=>{
162
199
  ]);
163
200
  return transformedResult;
164
201
  } catch (error) {
202
+ if (error instanceof Error && 'status' in error && error.status === 404) {
203
+ return null;
204
+ }
165
205
  errorLog([
166
206
  'Error in findOne: ',
167
207
  error
@@ -169,10 +209,12 @@ const payloadAdapter = (payloadClient, config)=>{
169
209
  return null;
170
210
  }
171
211
  },
172
- async findMany (data) {
212
+ async findMany ({ model, where, limit = 10, sortBy, offset = 0 }) {
173
213
  const start = Date.now();
174
- const { model, where, sortBy, limit, offset } = data;
175
- const collectionSlug = getModelName(model);
214
+ const payload = await resolvePayloadClient();
215
+ const collectionSlug = getCollectionSlug(model);
216
+ // Validate collection exists before proceeding
217
+ await validateCollection(payload, collectionSlug, model);
176
218
  const payloadWhere = convertWhereClause({
177
219
  idType: config.idType,
178
220
  model,
@@ -188,43 +230,9 @@ const payloadAdapter = (payloadClient, config)=>{
188
230
  }
189
231
  ]);
190
232
  try {
191
- const payload = await resolvePayloadClient();
192
- if (!collectionSlug || !(collectionSlug in payload.collections)) {
193
- collectionSlugError(model);
194
- }
195
233
  let result = null;
196
- const multipleIds = where && multipleIdsQuery(payloadWhere);
197
- const singleId = where && singleIdQuery(payloadWhere);
198
- if (multipleIds && multipleIds.length > 0) {
199
- debugLog([
200
- 'findManyByMultipleIDs',
201
- {
202
- collectionSlug,
203
- ids: multipleIds
204
- }
205
- ]);
206
- const res = {
207
- docs: [],
208
- totalDocs: 0
209
- };
210
- for (const id of multipleIds){
211
- const doc = await payload.findByID({
212
- collection: collectionSlug,
213
- id,
214
- depth: PAYLOAD_QUERY_DEPTH,
215
- context: createAdapterContext({
216
- model,
217
- operation: 'findManyByMultipleIDs'
218
- })
219
- });
220
- res.docs.push(doc);
221
- res.totalDocs++;
222
- }
223
- result = {
224
- docs: res.docs,
225
- totalDocs: res.totalDocs
226
- };
227
- } else if (singleId) {
234
+ const singleId = singleIdQuery(payloadWhere);
235
+ if (singleId) {
228
236
  debugLog([
229
237
  'findManyBySingleID',
230
238
  {
@@ -255,11 +263,14 @@ const payloadAdapter = (payloadClient, config)=>{
255
263
  payloadWhere
256
264
  }
257
265
  ]);
266
+ const spill = offset % limit;
267
+ const page = Math.floor(offset / limit) + 1;
268
+ const fetchLimit = spill ? limit + spill : limit;
258
269
  const res = await payload.find({
259
270
  collection: collectionSlug,
260
271
  where: payloadWhere,
261
- limit: limit,
262
- page: offset ? Math.floor(offset / (limit || 10)) + 1 : 1,
272
+ limit: fetchLimit,
273
+ page: page,
263
274
  sort: convertSort(model, sortBy),
264
275
  depth: PAYLOAD_QUERY_DEPTH,
265
276
  context: createAdapterContext({
@@ -268,14 +279,14 @@ const payloadAdapter = (payloadClient, config)=>{
268
279
  })
269
280
  });
270
281
  result = {
271
- docs: res.docs,
282
+ docs: res.docs.slice(spill, spill + limit),
272
283
  totalDocs: res.totalDocs
273
284
  };
274
285
  }
275
286
  const transformedResult = result?.docs.map((doc)=>transformOutput({
276
287
  doc,
277
288
  model
278
- })) ?? null;
289
+ })) ?? [];
279
290
  debugLog([
280
291
  'findMany result',
281
292
  {
@@ -286,6 +297,9 @@ const payloadAdapter = (payloadClient, config)=>{
286
297
  ]);
287
298
  return transformedResult;
288
299
  } catch (error) {
300
+ if (error instanceof Error && 'status' in error && error.status === 404) {
301
+ return [];
302
+ }
289
303
  errorLog([
290
304
  'Error in findMany: ',
291
305
  error
@@ -293,15 +307,22 @@ const payloadAdapter = (payloadClient, config)=>{
293
307
  return [];
294
308
  }
295
309
  },
296
- async update (data) {
310
+ async update ({ model, where, update }) {
297
311
  const start = Date.now();
298
- const { model, where, update } = data;
299
- const collectionSlug = getModelName(model);
312
+ const payload = await resolvePayloadClient();
313
+ const collectionSlug = getCollectionSlug(model);
314
+ // Validate collection exists before proceeding
315
+ await validateCollection(payload, collectionSlug, model);
300
316
  const payloadWhere = convertWhereClause({
301
317
  idType: config.idType,
302
318
  model,
303
319
  where
304
320
  });
321
+ const transformedInput = transformInput({
322
+ data: update,
323
+ model,
324
+ idType: config.idType
325
+ });
305
326
  debugLog([
306
327
  'update',
307
328
  {
@@ -310,10 +331,6 @@ const payloadAdapter = (payloadClient, config)=>{
310
331
  }
311
332
  ]);
312
333
  try {
313
- const payload = await resolvePayloadClient();
314
- if (!collectionSlug || !(collectionSlug in payload.collections)) {
315
- collectionSlugError(model);
316
- }
317
334
  let result = null;
318
335
  const id = singleIdQuery(payloadWhere);
319
336
  if (id) {
@@ -324,17 +341,16 @@ const payloadAdapter = (payloadClient, config)=>{
324
341
  id
325
342
  }
326
343
  ]);
327
- const doc = await payload.update({
344
+ result = await payload.update({
328
345
  collection: collectionSlug,
329
346
  id,
330
- data: update,
347
+ data: transformedInput,
331
348
  depth: PAYLOAD_QUERY_DEPTH,
332
349
  context: createAdapterContext({
333
350
  model,
334
351
  operation: 'updateByID'
335
352
  })
336
353
  });
337
- result = doc;
338
354
  } else {
339
355
  debugLog([
340
356
  'updateByWhere',
@@ -346,7 +362,7 @@ const payloadAdapter = (payloadClient, config)=>{
346
362
  const doc = await payload.update({
347
363
  collection: collectionSlug,
348
364
  where: payloadWhere,
349
- data: update,
365
+ data: transformedInput,
350
366
  depth: PAYLOAD_QUERY_DEPTH,
351
367
  context: createAdapterContext({
352
368
  model,
@@ -360,7 +376,7 @@ const payloadAdapter = (payloadClient, config)=>{
360
376
  model
361
377
  });
362
378
  debugLog([
363
- 'update result',
379
+ 'update-result',
364
380
  {
365
381
  collectionSlug,
366
382
  transformedResult,
@@ -369,6 +385,9 @@ const payloadAdapter = (payloadClient, config)=>{
369
385
  ]);
370
386
  return transformedResult;
371
387
  } catch (error) {
388
+ if (error instanceof Error && 'status' in error && error.status === 404) {
389
+ return null;
390
+ }
372
391
  errorLog([
373
392
  'Error in update: ',
374
393
  error
@@ -376,15 +395,22 @@ const payloadAdapter = (payloadClient, config)=>{
376
395
  return null;
377
396
  }
378
397
  },
379
- async updateMany (data) {
398
+ async updateMany ({ model, where, update }) {
380
399
  const start = Date.now();
381
- const { model, where, update } = data;
382
- const collectionSlug = getModelName(model);
400
+ const payload = await resolvePayloadClient();
401
+ const collectionSlug = getCollectionSlug(model);
402
+ // Validate collection exists before proceeding
403
+ await validateCollection(payload, collectionSlug, model);
383
404
  const payloadWhere = convertWhereClause({
384
405
  idType: config.idType,
385
406
  model,
386
407
  where
387
408
  });
409
+ const transformedInput = transformInput({
410
+ data: update,
411
+ model,
412
+ idType: config.idType
413
+ });
388
414
  debugLog([
389
415
  'updateMany',
390
416
  {
@@ -394,14 +420,10 @@ const payloadAdapter = (payloadClient, config)=>{
394
420
  }
395
421
  ]);
396
422
  try {
397
- const payload = await resolvePayloadClient();
398
- if (!collectionSlug || !(collectionSlug in payload.collections)) {
399
- collectionSlugError(model);
400
- }
401
423
  const { docs: updateResult } = await payload.update({
402
424
  collection: collectionSlug,
403
425
  where: payloadWhere,
404
- data: update,
426
+ data: transformedInput,
405
427
  depth: PAYLOAD_QUERY_DEPTH,
406
428
  context: createAdapterContext({
407
429
  model,
@@ -418,6 +440,9 @@ const payloadAdapter = (payloadClient, config)=>{
418
440
  ]);
419
441
  return updateResult?.length || 0;
420
442
  } catch (error) {
443
+ if (error instanceof Error && 'status' in error && error.status === 404) {
444
+ return 0;
445
+ }
421
446
  errorLog([
422
447
  'Error in updateMany: ',
423
448
  error
@@ -425,10 +450,12 @@ const payloadAdapter = (payloadClient, config)=>{
425
450
  return 0;
426
451
  }
427
452
  },
428
- async delete (data) {
453
+ async delete ({ model, where }) {
429
454
  const start = Date.now();
430
- const { model, where } = data;
431
- const collectionSlug = getModelName(model);
455
+ const payload = await resolvePayloadClient();
456
+ const collectionSlug = getCollectionSlug(model);
457
+ // Validate collection exists before proceeding
458
+ await validateCollection(payload, collectionSlug, model);
432
459
  const payloadWhere = convertWhereClause({
433
460
  idType: config.idType,
434
461
  model,
@@ -441,23 +468,19 @@ const payloadAdapter = (payloadClient, config)=>{
441
468
  }
442
469
  ]);
443
470
  try {
444
- const payload = await resolvePayloadClient();
445
- if (!collectionSlug || !(collectionSlug in payload.collections)) {
446
- collectionSlugError(model);
447
- }
448
471
  let deleteResult = null;
449
- const id = singleIdQuery(payloadWhere);
450
- if (id) {
472
+ const singleId = singleIdQuery(payloadWhere);
473
+ if (singleId) {
451
474
  debugLog([
452
475
  'deleteByID',
453
476
  {
454
477
  collectionSlug,
455
- id
478
+ id: singleId
456
479
  }
457
480
  ]);
458
481
  const doc = await payload.delete({
459
482
  collection: collectionSlug,
460
- id,
483
+ id: singleId,
461
484
  depth: PAYLOAD_QUERY_DEPTH,
462
485
  context: createAdapterContext({
463
486
  model,
@@ -498,19 +521,22 @@ const payloadAdapter = (payloadClient, config)=>{
498
521
  duration: `${Date.now() - start}ms`
499
522
  }
500
523
  ]);
501
- return;
502
524
  } catch (error) {
525
+ if (error instanceof Error && 'status' in error && error.status === 404) {
526
+ return;
527
+ }
503
528
  errorLog([
504
529
  'Error in delete: ',
505
530
  error
506
531
  ]);
507
- return;
508
532
  }
509
533
  },
510
- async deleteMany (data) {
534
+ async deleteMany ({ model, where }) {
511
535
  const start = Date.now();
512
- const { model, where } = data;
513
- const collectionSlug = getModelName(model);
536
+ const payload = await resolvePayloadClient();
537
+ const collectionSlug = getCollectionSlug(model);
538
+ // Validate collection exists before proceeding
539
+ await validateCollection(payload, collectionSlug, model);
514
540
  const payloadWhere = convertWhereClause({
515
541
  idType: config.idType,
516
542
  model,
@@ -524,10 +550,6 @@ const payloadAdapter = (payloadClient, config)=>{
524
550
  }
525
551
  ]);
526
552
  try {
527
- const payload = await resolvePayloadClient();
528
- if (!collectionSlug || !(collectionSlug in payload.collections)) {
529
- collectionSlugError(model);
530
- }
531
553
  const deleteResult = await payload.delete({
532
554
  collection: collectionSlug,
533
555
  where: payloadWhere,
@@ -547,6 +569,9 @@ const payloadAdapter = (payloadClient, config)=>{
547
569
  ]);
548
570
  return deleteResult.docs.length;
549
571
  } catch (error) {
572
+ if (error instanceof Error && 'status' in error && error.status === 404) {
573
+ return 0;
574
+ }
550
575
  errorLog([
551
576
  'Error in deleteMany: ',
552
577
  error
@@ -554,10 +579,12 @@ const payloadAdapter = (payloadClient, config)=>{
554
579
  return 0;
555
580
  }
556
581
  },
557
- async count (data) {
582
+ async count ({ model, where }) {
558
583
  const start = Date.now();
559
- const { model, where } = data;
560
- const collectionSlug = getModelName(model);
584
+ const payload = await resolvePayloadClient();
585
+ const collectionSlug = getCollectionSlug(model);
586
+ // Validate collection exists before proceeding
587
+ await validateCollection(payload, collectionSlug, model);
561
588
  const payloadWhere = convertWhereClause({
562
589
  idType: config.idType,
563
590
  model,
@@ -571,10 +598,6 @@ const payloadAdapter = (payloadClient, config)=>{
571
598
  }
572
599
  ]);
573
600
  try {
574
- const payload = await resolvePayloadClient();
575
- if (!collectionSlug || !(collectionSlug in payload.collections)) {
576
- collectionSlugError(model);
577
- }
578
601
  const result = await payload.count({
579
602
  collection: collectionSlug,
580
603
  where: payloadWhere,
@@ -596,6 +619,9 @@ const payloadAdapter = (payloadClient, config)=>{
596
619
  ]);
597
620
  return result.totalDocs;
598
621
  } catch (error) {
622
+ if (error instanceof Error && 'status' in error && error.status === 404) {
623
+ return 0;
624
+ }
599
625
  errorLog([
600
626
  'Error in count: ',
601
627
  error
@@ -621,4 +647,4 @@ const payloadAdapter = (payloadClient, config)=>{
621
647
  };
622
648
  export { generateSchema, payloadAdapter };
623
649
 
624
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iZXR0ZXItYXV0aC9hZGFwdGVyL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJldHRlckF1dGhFcnJvciB9IGZyb20gJ2JldHRlci1hdXRoJ1xuaW1wb3J0IHR5cGUgeyBBZGFwdGVyLCBCZXR0ZXJBdXRoT3B0aW9ucywgV2hlcmUgfSBmcm9tICdiZXR0ZXItYXV0aCdcbmltcG9ydCB7IGdlbmVyYXRlU2NoZW1hIH0gZnJvbSAnLi9nZW5lcmF0ZS1zY2hlbWEnXG5pbXBvcnQgeyBjcmVhdGVUcmFuc2Zvcm0gfSBmcm9tICcuL3RyYW5zZm9ybSdcbmltcG9ydCB0eXBlIHsgUGF5bG9hZEFkYXB0ZXIgfSBmcm9tICcuL3R5cGVzJ1xuXG5leHBvcnQgY29uc3QgQkVUVEVSX0FVVEhfQ09OVEVYVF9LRVkgPSAncGF5bG9hZC1kYi1hZGFwdGVyJ1xuY29uc3QgUEFZTE9BRF9RVUVSWV9ERVBUSCA9IDJcblxuY29uc3QgcGF5bG9hZEFkYXB0ZXI6IFBheWxvYWRBZGFwdGVyID0gKHBheWxvYWRDbGllbnQsIGNvbmZpZykgPT4ge1xuICBmdW5jdGlvbiBkZWJ1Z0xvZyhtZXNzYWdlOiBhbnlbXSkge1xuICAgIGlmIChjb25maWcuZW5hYmxlRGVidWdMb2dzKSB7XG4gICAgICBjb25zb2xlLmxvZygnW3BheWxvYWQtZGItYWRhcHRlcl0nLCAuLi5tZXNzYWdlKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGVycm9yTG9nKG1lc3NhZ2U6IGFueVtdKSB7XG4gICAgY29uc29sZS5lcnJvcihgW3BheWxvYWQtZGItYWRhcHRlcl1gLCAuLi5tZXNzYWdlKVxuICB9XG5cbiAgZnVuY3Rpb24gY29sbGVjdGlvblNsdWdFcnJvcihtb2RlbDogc3RyaW5nKSB7XG4gICAgdGhyb3cgbmV3IEJldHRlckF1dGhFcnJvcihgQ29sbGVjdGlvbiAke21vZGVsfSBkb2VzIG5vdCBleGlzdC4gUGxlYXNlIGNoZWNrIHlvdXIgcGF5bG9hZCBjb2xsZWN0aW9uIHNsdWdzIG1hdGNoIHRoZSBiZXR0ZXIgYXV0aCBzY2hlbWFgKVxuICB9XG5cbiAgY29uc3QgY3JlYXRlQWRhcHRlckNvbnRleHQgPSAoZGF0YTogUmVjb3JkPHN0cmluZywgYW55PikgPT4gKHtcbiAgICBbQkVUVEVSX0FVVEhfQ09OVEVYVF9LRVldOiB7IC4uLmRhdGEgfVxuICB9KVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVQYXlsb2FkQ2xpZW50KCkge1xuICAgIGNvbnN0IHBheWxvYWQgPSB0eXBlb2YgcGF5bG9hZENsaWVudCA9PT0gJ2Z1bmN0aW9uJyA/IGF3YWl0IHBheWxvYWRDbGllbnQoKSA6IGF3YWl0IHBheWxvYWRDbGllbnRcbiAgICBpZiAoIXBheWxvYWQuY29uZmlnPy5jdXN0b20/Lmhhc0JldHRlckF1dGhQbHVnaW4pIHtcbiAgICAgIHRocm93IG5ldyBCZXR0ZXJBdXRoRXJyb3IoYFBheWxvYWQgaXMgbm90IGNvbmZpZ3VyZWQgd2l0aCB0aGUgYmV0dGVyLWF1dGggcGx1Z2luLiBQbGVhc2UgYWRkIHRoZSBwbHVnaW4gdG8geW91ciBwYXlsb2FkIGNvbmZpZy5gKVxuICAgIH1cbiAgICByZXR1cm4gcGF5bG9hZFxuICB9XG5cbiAgcmV0dXJuIChvcHRpb25zOiBCZXR0ZXJBdXRoT3B0aW9ucyk6IEFkYXB0ZXIgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHRyYW5zZm9ybUlucHV0LFxuICAgICAgdHJhbnNmb3JtT3V0cHV0LFxuICAgICAgY29udmVydFdoZXJlQ2xhdXNlLFxuICAgICAgY29udmVydFNlbGVjdCxcbiAgICAgIGNvbnZlcnRTb3J0LFxuICAgICAgZ2V0TW9kZWxOYW1lLFxuICAgICAgc2luZ2xlSWRRdWVyeSxcbiAgICAgIG11bHRpcGxlSWRzUXVlcnlcbiAgICB9ID0gY3JlYXRlVHJhbnNmb3JtKG9wdGlvbnMsIGNvbmZpZy5lbmFibGVEZWJ1Z0xvZ3MgPz8gZmFsc2UpXG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6ICdwYXlsb2FkJyxcbiAgICAgIGFzeW5jIGNyZWF0ZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiwgUiA9IFQ+KGRhdGE6IHsgbW9kZWw6IHN0cmluZzsgZGF0YTogVDsgc2VsZWN0Pzogc3RyaW5nW10gfSk6IFByb21pc2U8Uj4ge1xuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KClcbiAgICAgICAgY29uc3QgeyBtb2RlbCwgZGF0YTogdmFsdWVzLCBzZWxlY3QgfSA9IGRhdGFcbiAgICAgICAgY29uc3QgY29sbGVjdGlvblNsdWcgPSBnZXRNb2RlbE5hbWUobW9kZWwpXG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkID0gdHJhbnNmb3JtSW5wdXQoe1xuICAgICAgICAgIGRhdGE6IHZhbHVlcyxcbiAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICBhY3Rpb246ICdjcmVhdGUnLFxuICAgICAgICAgIGlkVHlwZTogY29uZmlnLmlkVHlwZVxuICAgICAgICB9KVxuICAgICAgICBkZWJ1Z0xvZyhbJ2NyZWF0ZScsIHsgY29sbGVjdGlvblNsdWcsIHRyYW5zZm9ybWVkLCBzZWxlY3QgfV0pXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IHJlc29sdmVQYXlsb2FkQ2xpZW50KClcbiAgICAgICAgICBpZiAoIWNvbGxlY3Rpb25TbHVnIHx8ICEoY29sbGVjdGlvblNsdWcgaW4gcGF5bG9hZC5jb2xsZWN0aW9ucykpIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb25TbHVnRXJyb3IobW9kZWwpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBheWxvYWQuY3JlYXRlKHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25TbHVnLFxuICAgICAgICAgICAgZGF0YTogdHJhbnNmb3JtZWQsXG4gICAgICAgICAgICBzZWxlY3Q6IGNvbnZlcnRTZWxlY3QobW9kZWwsIHNlbGVjdCksXG4gICAgICAgICAgICBjb250ZXh0OiBjcmVhdGVBZGFwdGVyQ29udGV4dCh7IG1vZGVsLCBvcGVyYXRpb246ICdjcmVhdGUnIH0pLFxuICAgICAgICAgICAgZGVwdGg6IFBBWUxPQURfUVVFUllfREVQVEhcbiAgICAgICAgICB9KVxuICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkUmVzdWx0ID0gdHJhbnNmb3JtT3V0cHV0KHtcbiAgICAgICAgICAgIGRvYzogcmVzdWx0LFxuICAgICAgICAgICAgbW9kZWxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGRlYnVnTG9nKFtcbiAgICAgICAgICAgICdjcmVhdGUgcmVzdWx0JyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29sbGVjdGlvblNsdWcsXG4gICAgICAgICAgICAgIHRyYW5zZm9ybWVkUmVzdWx0LFxuICAgICAgICAgICAgICBkdXJhdGlvbjogYCR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zYFxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0pXG4gICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkUmVzdWx0IGFzIFJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBlcnJvckxvZyhbJ0Vycm9yIGluIGNyZWF0aW5nOicsIG1vZGVsLCBlcnJvcl0pXG4gICAgICAgICAgcmV0dXJuIG51bGwgYXMgUlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYXN5bmMgZmluZE9uZTxUPihkYXRhOiB7IG1vZGVsOiBzdHJpbmc7IHdoZXJlOiBXaGVyZVtdOyBzZWxlY3Q/OiBzdHJpbmdbXSB9KTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KClcbiAgICAgICAgY29uc3QgeyBtb2RlbCwgd2hlcmUsIHNlbGVjdCB9ID0gZGF0YVxuICAgICAgICBjb25zdCBjb2xsZWN0aW9uU2x1ZyA9IGdldE1vZGVsTmFtZShtb2RlbClcbiAgICAgICAgY29uc3QgcGF5bG9hZFdoZXJlID0gY29udmVydFdoZXJlQ2xhdXNlKHtcbiAgICAgICAgICBpZFR5cGU6IGNvbmZpZy5pZFR5cGUsXG4gICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgd2hlcmVcbiAgICAgICAgfSlcbiAgICAgICAgZGVidWdMb2coWydmaW5kT25lJywgeyBjb2xsZWN0aW9uU2x1ZyB9XSlcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgcmVzb2x2ZVBheWxvYWRDbGllbnQoKVxuICAgICAgICAgIGlmICghY29sbGVjdGlvblNsdWcgfHwgIShjb2xsZWN0aW9uU2x1ZyBpbiBwYXlsb2FkLmNvbGxlY3Rpb25zKSkge1xuICAgICAgICAgICAgY29sbGVjdGlvblNsdWdFcnJvcihtb2RlbClcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgaWQgPSBzaW5nbGVJZFF1ZXJ5KHBheWxvYWRXaGVyZSlcbiAgICAgICAgICBsZXQgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGxcbiAgICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgIGRlYnVnTG9nKFsnZmluZE9uZUJ5SUQnLCB7IGNvbGxlY3Rpb25TbHVnLCBpZCB9XSlcbiAgICAgICAgICAgIGNvbnN0IGRvYyA9IGF3YWl0IHBheWxvYWQuZmluZEJ5SUQoe1xuICAgICAgICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uU2x1ZyxcbiAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgIHNlbGVjdDogY29udmVydFNlbGVjdChtb2RlbCwgc2VsZWN0KSxcbiAgICAgICAgICAgICAgY29udGV4dDogY3JlYXRlQWRhcHRlckNvbnRleHQoe1xuICAgICAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ2ZpbmRPbmVCeUlEJ1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgZGVwdGg6IFBBWUxPQURfUVVFUllfREVQVEhcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICByZXN1bHQgPSBkb2NcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVidWdMb2coWydmaW5kT25lQnlXaGVyZScsIHsgY29sbGVjdGlvblNsdWcsIHBheWxvYWRXaGVyZSB9XSlcbiAgICAgICAgICAgIGNvbnN0IGRvY3MgPSBhd2FpdCBwYXlsb2FkLmZpbmQoe1xuICAgICAgICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uU2x1ZyxcbiAgICAgICAgICAgICAgd2hlcmU6IHBheWxvYWRXaGVyZSxcbiAgICAgICAgICAgICAgc2VsZWN0OiBjb252ZXJ0U2VsZWN0KG1vZGVsLCBzZWxlY3QpLFxuICAgICAgICAgICAgICBjb250ZXh0OiBjcmVhdGVBZGFwdGVyQ29udGV4dCh7XG4gICAgICAgICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnZmluZE9uZUJ5V2hlcmUnXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBkZXB0aDogUEFZTE9BRF9RVUVSWV9ERVBUSCxcbiAgICAgICAgICAgICAgbGltaXQ6IDFcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICByZXN1bHQgPSBkb2NzLmRvY3NbMF1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRSZXN1bHQgPSB0cmFuc2Zvcm1PdXRwdXQ8dHlwZW9mIHJlc3VsdCB8IG51bGw+KHtcbiAgICAgICAgICAgIGRvYzogcmVzdWx0LFxuICAgICAgICAgICAgbW9kZWxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGRlYnVnTG9nKFtcbiAgICAgICAgICAgICdmaW5kT25lIHJlc3VsdCcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbGxlY3Rpb25TbHVnLFxuICAgICAgICAgICAgICB0cmFuc2Zvcm1lZFJlc3VsdCxcbiAgICAgICAgICAgICAgZHVyYXRpb246IGAke0RhdGUubm93KCkgLSBzdGFydH1tc2BcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdKVxuICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZFJlc3VsdCBhcyBUXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgZXJyb3JMb2coWydFcnJvciBpbiBmaW5kT25lOiAnLCBlcnJvcl0pXG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGFzeW5jIGZpbmRNYW55PFQ+KGRhdGE6IHtcbiAgICAgICAgbW9kZWw6IHN0cmluZ1xuICAgICAgICB3aGVyZT86IFdoZXJlW11cbiAgICAgICAgbGltaXQ/OiBudW1iZXJcbiAgICAgICAgc29ydEJ5Pzoge1xuICAgICAgICAgIGZpZWxkOiBzdHJpbmdcbiAgICAgICAgICBkaXJlY3Rpb246ICdhc2MnIHwgJ2Rlc2MnXG4gICAgICAgIH1cbiAgICAgICAgb2Zmc2V0PzogbnVtYmVyXG4gICAgICB9KTogUHJvbWlzZTxUW10+IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpXG4gICAgICAgIGNvbnN0IHsgbW9kZWwsIHdoZXJlLCBzb3J0QnksIGxpbWl0LCBvZmZzZXQgfSA9IGRhdGFcbiAgICAgICAgY29uc3QgY29sbGVjdGlvblNsdWcgPSBnZXRNb2RlbE5hbWUobW9kZWwpXG4gICAgICAgIGNvbnN0IHBheWxvYWRXaGVyZSA9IGNvbnZlcnRXaGVyZUNsYXVzZSh7XG4gICAgICAgICAgaWRUeXBlOiBjb25maWcuaWRUeXBlLFxuICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgIHdoZXJlXG4gICAgICAgIH0pXG4gICAgICAgIGRlYnVnTG9nKFsnZmluZE1hbnknLCB7IGNvbGxlY3Rpb25TbHVnLCBzb3J0QnksIGxpbWl0LCBvZmZzZXQgfV0pXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IHJlc29sdmVQYXlsb2FkQ2xpZW50KClcbiAgICAgICAgICBpZiAoIWNvbGxlY3Rpb25TbHVnIHx8ICEoY29sbGVjdGlvblNsdWcgaW4gcGF5bG9hZC5jb2xsZWN0aW9ucykpIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb25TbHVnRXJyb3IobW9kZWwpXG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCByZXN1bHQ6IHtcbiAgICAgICAgICAgIGRvY3M6IFJlY29yZDxzdHJpbmcsIGFueT5bXVxuICAgICAgICAgICAgdG90YWxEb2NzOiBudW1iZXJcbiAgICAgICAgICB9IHwgbnVsbCA9IG51bGxcbiAgICAgICAgICBjb25zdCBtdWx0aXBsZUlkcyA9IHdoZXJlICYmIG11bHRpcGxlSWRzUXVlcnkocGF5bG9hZFdoZXJlKVxuICAgICAgICAgIGNvbnN0IHNpbmdsZUlkID0gd2hlcmUgJiYgc2luZ2xlSWRRdWVyeShwYXlsb2FkV2hlcmUpXG4gICAgICAgICAgaWYgKG11bHRpcGxlSWRzICYmIG11bHRpcGxlSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGRlYnVnTG9nKFsnZmluZE1hbnlCeU11bHRpcGxlSURzJywgeyBjb2xsZWN0aW9uU2x1ZywgaWRzOiBtdWx0aXBsZUlkcyB9XSlcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IHtcbiAgICAgICAgICAgICAgZG9jczogW10gYXMgUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgICAgICAgICAgICB0b3RhbERvY3M6IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgb2YgbXVsdGlwbGVJZHMpIHtcbiAgICAgICAgICAgICAgY29uc3QgZG9jID0gYXdhaXQgcGF5bG9hZC5maW5kQnlJRCh7XG4gICAgICAgICAgICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvblNsdWcsXG4gICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgZGVwdGg6IFBBWUxPQURfUVVFUllfREVQVEgsXG4gICAgICAgICAgICAgICAgY29udGV4dDogY3JlYXRlQWRhcHRlckNvbnRleHQoe1xuICAgICAgICAgICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdmaW5kTWFueUJ5TXVsdGlwbGVJRHMnXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgcmVzLmRvY3MucHVzaChkb2MpXG4gICAgICAgICAgICAgIHJlcy50b3RhbERvY3MrK1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0ID0geyBkb2NzOiByZXMuZG9jcywgdG90YWxEb2NzOiByZXMudG90YWxEb2NzIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHNpbmdsZUlkKSB7XG4gICAgICAgICAgICBkZWJ1Z0xvZyhbJ2ZpbmRNYW55QnlTaW5nbGVJRCcsIHsgY29sbGVjdGlvblNsdWcsIGlkOiBzaW5nbGVJZCB9XSlcbiAgICAgICAgICAgIGNvbnN0IGRvYyA9IGF3YWl0IHBheWxvYWQuZmluZEJ5SUQoe1xuICAgICAgICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uU2x1ZyxcbiAgICAgICAgICAgICAgaWQ6IHNpbmdsZUlkLFxuICAgICAgICAgICAgICBkZXB0aDogUEFZTE9BRF9RVUVSWV9ERVBUSCxcbiAgICAgICAgICAgICAgY29udGV4dDogY3JlYXRlQWRhcHRlckNvbnRleHQoe1xuICAgICAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ2ZpbmRNYW55QnlTaW5nbGVJRCdcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICByZXN1bHQgPSB7IGRvY3M6IGRvYyA/IFtkb2NdIDogW10sIHRvdGFsRG9jczogZG9jID8gMSA6IDAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWJ1Z0xvZyhbJ2ZpbmRNYW55QnlXaGVyZScsIHsgY29sbGVjdGlvblNsdWcsIHBheWxvYWRXaGVyZSB9XSlcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHBheWxvYWQuZmluZCh7XG4gICAgICAgICAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25TbHVnLFxuICAgICAgICAgICAgICB3aGVyZTogcGF5bG9hZFdoZXJlLFxuICAgICAgICAgICAgICBsaW1pdDogbGltaXQsXG4gICAgICAgICAgICAgIHBhZ2U6IG9mZnNldCA/IE1hdGguZmxvb3Iob2Zmc2V0IC8gKGxpbWl0IHx8IDEwKSkgKyAxIDogMSxcbiAgICAgICAgICAgICAgc29ydDogY29udmVydFNvcnQobW9kZWwsIHNvcnRCeSksXG4gICAgICAgICAgICAgIGRlcHRoOiBQQVlMT0FEX1FVRVJZX0RFUFRILFxuICAgICAgICAgICAgICBjb250ZXh0OiBjcmVhdGVBZGFwdGVyQ29udGV4dCh7XG4gICAgICAgICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnZmluZE1hbnlCeVdoZXJlJ1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJlc3VsdCA9IHsgZG9jczogcmVzLmRvY3MsIHRvdGFsRG9jczogcmVzLnRvdGFsRG9jcyB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkUmVzdWx0ID1cbiAgICAgICAgICAgIHJlc3VsdD8uZG9jcy5tYXAoKGRvYykgPT5cbiAgICAgICAgICAgICAgdHJhbnNmb3JtT3V0cHV0KHtcbiAgICAgICAgICAgICAgICBkb2MsXG4gICAgICAgICAgICAgICAgbW9kZWxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICkgPz8gbnVsbFxuICAgICAgICAgIGRlYnVnTG9nKFtcbiAgICAgICAgICAgICdmaW5kTWFueSByZXN1bHQnLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb2xsZWN0aW9uU2x1ZyxcbiAgICAgICAgICAgICAgdHJhbnNmb3JtZWRSZXN1bHQsXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiBgJHtEYXRlLm5vdygpIC0gc3RhcnR9bXNgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSlcbiAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWRSZXN1bHQgYXMgVFtdXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgZXJyb3JMb2coWydFcnJvciBpbiBmaW5kTWFueTogJywgZXJyb3JdKVxuICAgICAgICAgIHJldHVybiBbXSBhcyBUW11cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGFzeW5jIHVwZGF0ZTxUPihkYXRhOiB7IG1vZGVsOiBzdHJpbmc7IHdoZXJlOiBXaGVyZVtdOyB1cGRhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0pOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKVxuICAgICAgICBjb25zdCB7IG1vZGVsLCB3aGVyZSwgdXBkYXRlIH0gPSBkYXRhXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb25TbHVnID0gZ2V0TW9kZWxOYW1lKG1vZGVsKVxuICAgICAgICBjb25zdCBwYXlsb2FkV2hlcmUgPSBjb252ZXJ0V2hlcmVDbGF1c2Uoe1xuICAgICAgICAgIGlkVHlwZTogY29uZmlnLmlkVHlwZSxcbiAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICB3aGVyZVxuICAgICAgICB9KVxuICAgICAgICBkZWJ1Z0xvZyhbJ3VwZGF0ZScsIHsgY29sbGVjdGlvblNsdWcsIHVwZGF0ZSB9XSlcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgcmVzb2x2ZVBheWxvYWRDbGllbnQoKVxuICAgICAgICAgIGlmICghY29sbGVjdGlvblNsdWcgfHwgIShjb2xsZWN0aW9uU2x1ZyBpbiBwYXlsb2FkLmNvbGxlY3Rpb25zKSkge1xuICAgICAgICAgICAgY29sbGVjdGlvblNsdWdFcnJvcihtb2RlbClcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSBudWxsXG4gICAgICAgICAgY29uc3QgaWQgPSBzaW5nbGVJZFF1ZXJ5KHBheWxvYWRXaGVyZSlcbiAgICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgIGRlYnVnTG9nKFsndXBkYXRlQnlJRCcsIHsgY29sbGVjdGlvblNsdWcsIGlkIH1dKVxuICAgICAgICAgICAgY29uc3QgZG9jID0gYXdhaXQgcGF5bG9hZC51cGRhdGUoe1xuICAgICAgICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uU2x1ZyxcbiAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgIGRhdGE6IHVwZGF0ZSxcbiAgICAgICAgICAgICAgZGVwdGg6IFBBWUxPQURfUVVFUllfREVQVEgsXG4gICAgICAgICAgICAgIGNvbnRleHQ6IGNyZWF0ZUFkYXB0ZXJDb250ZXh0KHsgbW9kZWwsIG9wZXJhdGlvbjogJ3VwZGF0ZUJ5SUQnIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmVzdWx0ID0gZG9jXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlYnVnTG9nKFsndXBkYXRlQnlXaGVyZScsIHsgY29sbGVjdGlvblNsdWcsIHBheWxvYWRXaGVyZSB9XSlcbiAgICAgICAgICAgIGNvbnN0IGRvYyA9IGF3YWl0IHBheWxvYWQudXBkYXRlKHtcbiAgICAgICAgICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvblNsdWcsXG4gICAgICAgICAgICAgIHdoZXJlOiBwYXlsb2FkV2hlcmUsXG4gICAgICAgICAgICAgIGRhdGE6IHVwZGF0ZSxcbiAgICAgICAgICAgICAgZGVwdGg6IFBBWUxPQURfUVVFUllfREVQVEgsXG4gICAgICAgICAgICAgIGNvbnRleHQ6IGNyZWF0ZUFkYXB0ZXJDb250ZXh0KHtcbiAgICAgICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgICAgICBvcGVyYXRpb246ICd1cGRhdGVCeVdoZXJlJ1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJlc3VsdCA9IGRvYy5kb2NzWzBdXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkUmVzdWx0ID0gdHJhbnNmb3JtT3V0cHV0PHR5cGVvZiByZXN1bHQgfCBudWxsPih7XG4gICAgICAgICAgICBkb2M6IHJlc3VsdCxcbiAgICAgICAgICAgIG1vZGVsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBkZWJ1Z0xvZyhbXG4gICAgICAgICAgICAndXBkYXRlIHJlc3VsdCcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbGxlY3Rpb25TbHVnLFxuICAgICAgICAgICAgICB0cmFuc2Zvcm1lZFJlc3VsdCxcbiAgICAgICAgICAgICAgZHVyYXRpb246IGAke0RhdGUubm93KCkgLSBzdGFydH1tc2BcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdKVxuICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZFJlc3VsdCBhcyBUXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgZXJyb3JMb2coWydFcnJvciBpbiB1cGRhdGU6ICcsIGVycm9yXSlcbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYXN5bmMgdXBkYXRlTWFueShkYXRhOiB7IG1vZGVsOiBzdHJpbmc7IHdoZXJlOiBXaGVyZVtdOyB1cGRhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KClcbiAgICAgICAgY29uc3QgeyBtb2RlbCwgd2hlcmUsIHVwZGF0ZSB9ID0gZGF0YVxuICAgICAgICBjb25zdCBjb2xsZWN0aW9uU2x1ZyA9IGdldE1vZGVsTmFtZShtb2RlbClcbiAgICAgICAgY29uc3QgcGF5bG9hZFdoZXJlID0gY29udmVydFdoZXJlQ2xhdXNlKHtcbiAgICAgICAgICBpZFR5cGU6IGNvbmZpZy5pZFR5cGUsXG4gICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgd2hlcmVcbiAgICAgICAgfSlcbiAgICAgICAgZGVidWdMb2coWyd1cGRhdGVNYW55JywgeyBjb2xsZWN0aW9uU2x1ZywgcGF5bG9hZFdoZXJlLCB1cGRhdGUgfV0pXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IHJlc29sdmVQYXlsb2FkQ2xpZW50KClcbiAgICAgICAgICBpZiAoIWNvbGxlY3Rpb25TbHVnIHx8ICEoY29sbGVjdGlvblNsdWcgaW4gcGF5bG9hZC5jb2xsZWN0aW9ucykpIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb25TbHVnRXJyb3IobW9kZWwpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHsgZG9jczogdXBkYXRlUmVzdWx0IH0gPSBhd2FpdCBwYXlsb2FkLnVwZGF0ZSh7XG4gICAgICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uU2x1ZyxcbiAgICAgICAgICAgIHdoZXJlOiBwYXlsb2FkV2hlcmUsXG4gICAgICAgICAgICBkYXRhOiB1cGRhdGUsXG4gICAgICAgICAgICBkZXB0aDogUEFZTE9BRF9RVUVSWV9ERVBUSCxcbiAgICAgICAgICAgIGNvbnRleHQ6IGNyZWF0ZUFkYXB0ZXJDb250ZXh0KHsgbW9kZWwsIG9wZXJhdGlvbjogJ3VwZGF0ZU1hbnknIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgICBkZWJ1Z0xvZyhbXG4gICAgICAgICAgICAndXBkYXRlTWFueSByZXN1bHQnLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb2xsZWN0aW9uU2x1ZyxcbiAgICAgICAgICAgICAgcmVzdWx0OiB1cGRhdGVSZXN1bHQsXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiBgJHtEYXRlLm5vdygpIC0gc3RhcnR9bXNgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSlcbiAgICAgICAgICByZXR1cm4gdXBkYXRlUmVzdWx0Py5sZW5ndGggfHwgMFxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGVycm9yTG9nKFsnRXJyb3IgaW4gdXBkYXRlTWFueTogJywgZXJyb3JdKVxuICAgICAgICAgIHJldHVybiAwXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBhc3luYyBkZWxldGUoZGF0YTogeyBtb2RlbDogc3RyaW5nOyB3aGVyZTogV2hlcmVbXSB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKVxuICAgICAgICBjb25zdCB7IG1vZGVsLCB3aGVyZSB9ID0gZGF0YVxuICAgICAgICBjb25zdCBjb2xsZWN0aW9uU2x1ZyA9IGdldE1vZGVsTmFtZShtb2RlbClcbiAgICAgICAgY29uc3QgcGF5bG9hZFdoZXJlID0gY29udmVydFdoZXJlQ2xhdXNlKHtcbiAgICAgICAgICBpZFR5cGU6IGNvbmZpZy5pZFR5cGUsXG4gICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgd2hlcmVcbiAgICAgICAgfSlcbiAgICAgICAgZGVidWdMb2coWydkZWxldGUnLCB7IGNvbGxlY3Rpb25TbHVnIH1dKVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCByZXNvbHZlUGF5bG9hZENsaWVudCgpXG4gICAgICAgICAgaWYgKCFjb2xsZWN0aW9uU2x1ZyB8fCAhKGNvbGxlY3Rpb25TbHVnIGluIHBheWxvYWQuY29sbGVjdGlvbnMpKSB7XG4gICAgICAgICAgICBjb2xsZWN0aW9uU2x1Z0Vycm9yKG1vZGVsKVxuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgZGVsZXRlUmVzdWx0OiB7XG4gICAgICAgICAgICBkb2M6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsXG4gICAgICAgICAgICBlcnJvcnM6IGFueVtdXG4gICAgICAgICAgfSB8IG51bGwgPSBudWxsXG4gICAgICAgICAgY29uc3QgaWQgPSBzaW5nbGVJZFF1ZXJ5KHBheWxvYWRXaGVyZSlcbiAgICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgIGRlYnVnTG9nKFsnZGVsZXRlQnlJRCcsIHsgY29sbGVjdGlvblNsdWcsIGlkIH1dKVxuICAgICAgICAgICAgY29uc3QgZG9jID0gYXdhaXQgcGF5bG9hZC5kZWxldGUoe1xuICAgICAgICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uU2x1ZyxcbiAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgIGRlcHRoOiBQQVlMT0FEX1FVRVJZX0RFUFRILFxuICAgICAgICAgICAgICBjb250ZXh0OiBjcmVhdGVBZGFwdGVyQ29udGV4dCh7IG1vZGVsLCBvcGVyYXRpb246ICdkZWxldGVCeUlEJyB9KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGRlbGV0ZVJlc3VsdCA9IHsgZG9jLCBlcnJvcnM6IFtdIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVidWdMb2coWydkZWxldGVCeVdoZXJlJywgeyBjb2xsZWN0aW9uU2x1ZywgcGF5bG9hZFdoZXJlIH1dKVxuICAgICAgICAgICAgY29uc3QgZG9jID0gYXdhaXQgcGF5bG9hZC5kZWxldGUoe1xuICAgICAgICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uU2x1ZyxcbiAgICAgICAgICAgICAgd2hlcmU6IHBheWxvYWRXaGVyZSxcbiAgICAgICAgICAgICAgZGVwdGg6IFBBWUxPQURfUVVFUllfREVQVEgsXG4gICAgICAgICAgICAgIGNvbnRleHQ6IGNyZWF0ZUFkYXB0ZXJDb250ZXh0KHtcbiAgICAgICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdkZWxldGVCeVdoZXJlJ1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGRlbGV0ZVJlc3VsdCA9IHsgZG9jOiBkb2MuZG9jc1swXSwgZXJyb3JzOiBbXSB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlYnVnTG9nKFtcbiAgICAgICAgICAgICdkZWxldGUgcmVzdWx0JyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29sbGVjdGlvblNsdWcsXG4gICAgICAgICAgICAgIHJlc3VsdDogZGVsZXRlUmVzdWx0LFxuICAgICAgICAgICAgICBkdXJhdGlvbjogYCR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zYFxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0pXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgZXJyb3JMb2coWydFcnJvciBpbiBkZWxldGU6ICcsIGVycm9yXSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGFzeW5jIGRlbGV0ZU1hbnkoZGF0YTogeyBtb2RlbDogc3RyaW5nOyB3aGVyZTogV2hlcmVbXSB9KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpXG4gICAgICAgIGNvbnN0IHsgbW9kZWwsIHdoZXJlIH0gPSBkYXRhXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb25TbHVnID0gZ2V0TW9kZWxOYW1lKG1vZGVsKVxuICAgICAgICBjb25zdCBwYXlsb2FkV2hlcmUgPSBjb252ZXJ0V2hlcmVDbGF1c2Uoe1xuICAgICAgICAgIGlkVHlwZTogY29uZmlnLmlkVHlwZSxcbiAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICB3aGVyZVxuICAgICAgICB9KVxuICAgICAgICBkZWJ1Z0xvZyhbJ2RlbGV0ZU1hbnknLCB7IGNvbGxlY3Rpb25TbHVnLCBwYXlsb2FkV2hlcmUgfV0pXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IHJlc29sdmVQYXlsb2FkQ2xpZW50KClcbiAgICAgICAgICBpZiAoIWNvbGxlY3Rpb25TbHVnIHx8ICEoY29sbGVjdGlvblNsdWcgaW4gcGF5bG9hZC5jb2xsZWN0aW9ucykpIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb25TbHVnRXJyb3IobW9kZWwpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGRlbGV0ZVJlc3VsdCA9IGF3YWl0IHBheWxvYWQuZGVsZXRlKHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25TbHVnLFxuICAgICAgICAgICAgd2hlcmU6IHBheWxvYWRXaGVyZSxcbiAgICAgICAgICAgIGRlcHRoOiBQQVlMT0FEX1FVRVJZX0RFUFRILFxuICAgICAgICAgICAgY29udGV4dDogY3JlYXRlQWRhcHRlckNvbnRleHQoeyBtb2RlbCwgb3BlcmF0aW9uOiAnZGVsZXRlTWFueScgfSlcbiAgICAgICAgICB9KVxuICAgICAgICAgIGRlYnVnTG9nKFtcbiAgICAgICAgICAgICdkZWxldGVNYW55IHJlc3VsdCcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbGxlY3Rpb25TbHVnLFxuICAgICAgICAgICAgICByZXN1bHQ6IGRlbGV0ZVJlc3VsdCxcbiAgICAgICAgICAgICAgZHVyYXRpb246IGAke0RhdGUubm93KCkgLSBzdGFydH1tc2BcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdKVxuICAgICAgICAgIHJldHVybiBkZWxldGVSZXN1bHQuZG9jcy5sZW5ndGhcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBlcnJvckxvZyhbJ0Vycm9yIGluIGRlbGV0ZU1hbnk6ICcsIGVycm9yXSlcbiAgICAgICAgICByZXR1cm4gMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYXN5bmMgY291bnQoZGF0YTogeyBtb2RlbDogc3RyaW5nOyB3aGVyZT86IFdoZXJlW10gfSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKVxuICAgICAgICBjb25zdCB7IG1vZGVsLCB3aGVyZSB9ID0gZGF0YVxuICAgICAgICBjb25zdCBjb2xsZWN0aW9uU2x1ZyA9IGdldE1vZGVsTmFtZShtb2RlbClcbiAgICAgICAgY29uc3QgcGF5bG9hZFdoZXJlID0gY29udmVydFdoZXJlQ2xhdXNlKHtcbiAgICAgICAgICBpZFR5cGU6IGNvbmZpZy5pZFR5cGUsXG4gICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgd2hlcmVcbiAgICAgICAgfSlcbiAgICAgICAgZGVidWdMb2coWydjb3VudCcsIHsgY29sbGVjdGlvblNsdWcsIHBheWxvYWRXaGVyZSB9XSlcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgcmVzb2x2ZVBheWxvYWRDbGllbnQoKVxuICAgICAgICAgIGlmICghY29sbGVjdGlvblNsdWcgfHwgIShjb2xsZWN0aW9uU2x1ZyBpbiBwYXlsb2FkLmNvbGxlY3Rpb25zKSkge1xuICAgICAgICAgICAgY29sbGVjdGlvblNsdWdFcnJvcihtb2RlbClcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGF5bG9hZC5jb3VudCh7XG4gICAgICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uU2x1ZyxcbiAgICAgICAgICAgIHdoZXJlOiBwYXlsb2FkV2hlcmUsXG4gICAgICAgICAgICBkZXB0aDogUEFZTE9BRF9RVUVSWV9ERVBUSCxcbiAgICAgICAgICAgIGNvbnRleHQ6IGNyZWF0ZUFkYXB0ZXJDb250ZXh0KHsgbW9kZWwsIG9wZXJhdGlvbjogJ2NvdW50JyB9KVxuICAgICAgICAgIH0pXG4gICAgICAgICAgZGVidWdMb2coW1xuICAgICAgICAgICAgJ2NvdW50IHJlc3VsdCcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbGxlY3Rpb25TbHVnLFxuICAgICAgICAgICAgICByZXN1bHQ6IHsgdG90YWxEb2NzOiByZXN1bHQudG90YWxEb2NzIH0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiBgJHtEYXRlLm5vdygpIC0gc3RhcnR9bXNgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSlcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LnRvdGFsRG9jc1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGVycm9yTG9nKFsnRXJyb3IgaW4gY291bnQ6ICcsIGVycm9yXSlcbiAgICAgICAgICByZXR1cm4gMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgY3JlYXRlU2NoZW1hOiBhc3luYyAob3B0aW9ucywgZmlsZSkgPT4ge1xuICAgICAgICBjb25zdCBzY2hlbWFDb2RlID0gYXdhaXQgZ2VuZXJhdGVTY2hlbWEob3B0aW9ucylcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb2RlOiBzY2hlbWFDb2RlLFxuICAgICAgICAgIHBhdGg6IGZpbGUgfHwgJ3NjaGVtYS50cycsXG4gICAgICAgICAgYXBwZW5kOiBmYWxzZSxcbiAgICAgICAgICBvdmVyd3JpdGU6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgZW5hYmxlRGVidWdMb2dzOiBjb25maWcuZW5hYmxlRGVidWdMb2dzLFxuICAgICAgICBpZFR5cGU6IGNvbmZpZy5pZFR5cGVcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgZ2VuZXJhdGVTY2hlbWEsIHBheWxvYWRBZGFwdGVyIH1cbiJdLCJuYW1lcyI6WyJCZXR0ZXJBdXRoRXJyb3IiLCJnZW5lcmF0ZVNjaGVtYSIsImNyZWF0ZVRyYW5zZm9ybSIsIkJFVFRFUl9BVVRIX0NPTlRFWFRfS0VZIiwiUEFZTE9BRF9RVUVSWV9ERVBUSCIsInBheWxvYWRBZGFwdGVyIiwicGF5bG9hZENsaWVudCIsImNvbmZpZyIsImRlYnVnTG9nIiwibWVzc2FnZSIsImVuYWJsZURlYnVnTG9ncyIsImNvbnNvbGUiLCJsb2ciLCJlcnJvckxvZyIsImVycm9yIiwiY29sbGVjdGlvblNsdWdFcnJvciIsIm1vZGVsIiwiY3JlYXRlQWRhcHRlckNvbnRleHQiLCJkYXRhIiwicmVzb2x2ZVBheWxvYWRDbGllbnQiLCJwYXlsb2FkIiwiY3VzdG9tIiwiaGFzQmV0dGVyQXV0aFBsdWdpbiIsIm9wdGlvbnMiLCJ0cmFuc2Zvcm1JbnB1dCIsInRyYW5zZm9ybU91dHB1dCIsImNvbnZlcnRXaGVyZUNsYXVzZSIsImNvbnZlcnRTZWxlY3QiLCJjb252ZXJ0U29ydCIsImdldE1vZGVsTmFtZSIsInNpbmdsZUlkUXVlcnkiLCJtdWx0aXBsZUlkc1F1ZXJ5IiwiaWQiLCJjcmVhdGUiLCJzdGFydCIsIkRhdGUiLCJub3ciLCJ2YWx1ZXMiLCJzZWxlY3QiLCJjb2xsZWN0aW9uU2x1ZyIsInRyYW5zZm9ybWVkIiwiYWN0aW9uIiwiaWRUeXBlIiwiY29sbGVjdGlvbnMiLCJyZXN1bHQiLCJjb2xsZWN0aW9uIiwiY29udGV4dCIsIm9wZXJhdGlvbiIsImRlcHRoIiwidHJhbnNmb3JtZWRSZXN1bHQiLCJkb2MiLCJkdXJhdGlvbiIsImZpbmRPbmUiLCJ3aGVyZSIsInBheWxvYWRXaGVyZSIsImZpbmRCeUlEIiwiZG9jcyIsImZpbmQiLCJsaW1pdCIsImZpbmRNYW55Iiwic29ydEJ5Iiwib2Zmc2V0IiwibXVsdGlwbGVJZHMiLCJzaW5nbGVJZCIsImxlbmd0aCIsImlkcyIsInJlcyIsInRvdGFsRG9jcyIsInB1c2giLCJwYWdlIiwiTWF0aCIsImZsb29yIiwic29ydCIsIm1hcCIsInVwZGF0ZSIsInVwZGF0ZU1hbnkiLCJ1cGRhdGVSZXN1bHQiLCJkZWxldGUiLCJkZWxldGVSZXN1bHQiLCJlcnJvcnMiLCJkZWxldGVNYW55IiwiY291bnQiLCJjcmVhdGVTY2hlbWEiLCJmaWxlIiwic2NoZW1hQ29kZSIsImNvZGUiLCJwYXRoIiwiYXBwZW5kIiwib3ZlcndyaXRlIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxlQUFlLFFBQVEsY0FBYTtBQUU3QyxTQUFTQyxjQUFjLFFBQVEsb0JBQW1CO0FBQ2xELFNBQVNDLGVBQWUsUUFBUSxjQUFhO0FBRzdDLE9BQU8sTUFBTUMsMEJBQTBCLHFCQUFvQjtBQUMzRCxNQUFNQyxzQkFBc0I7QUFFNUIsTUFBTUMsaUJBQWlDLENBQUNDLGVBQWVDO0lBQ3JELFNBQVNDLFNBQVNDLE9BQWM7UUFDOUIsSUFBSUYsT0FBT0csZUFBZSxFQUFFO1lBQzFCQyxRQUFRQyxHQUFHLENBQUMsMkJBQTJCSDtRQUN6QztJQUNGO0lBRUEsU0FBU0ksU0FBU0osT0FBYztRQUM5QkUs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
650
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iZXR0ZXItYXV0aC9hZGFwdGVyL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJldHRlckF1dGhFcnJvciB9IGZyb20gJ2JldHRlci1hdXRoJ1xuaW1wb3J0IHR5cGUgeyBBZGFwdGVyLCBCZXR0ZXJBdXRoT3B0aW9ucywgV2hlcmUgfSBmcm9tICdiZXR0ZXItYXV0aCdcbmltcG9ydCB7IGdlbmVyYXRlU2NoZW1hIH0gZnJvbSAnLi9nZW5lcmF0ZS1zY2hlbWEnXG5pbXBvcnQgeyBjcmVhdGVUcmFuc2Zvcm0gfSBmcm9tICcuL3RyYW5zZm9ybSdcbmltcG9ydCB0eXBlIHsgUGF5bG9hZEFkYXB0ZXIgfSBmcm9tICcuL3R5cGVzJ1xuXG5leHBvcnQgY29uc3QgQkVUVEVSX0FVVEhfQ09OVEVYVF9LRVkgPSAncGF5bG9hZC1kYi1hZGFwdGVyJ1xuY29uc3QgUEFZTE9BRF9RVUVSWV9ERVBUSCA9IDBcblxuLyoqXG4gKiBQYXlsb2FkIGFkYXB0ZXIgZm9yIEJldHRlciBBdXRoXG4gKlxuICogVGhpcyBhZGFwdGVyIGNvbm5lY3RzIEJldHRlciBBdXRoIHRvIFBheWxvYWQgQ01TLCBhbGxvd2luZyBhdXRoZW50aWNhdGlvblxuICogb3BlcmF0aW9ucyB0byBiZSBwZXJmb3JtZWQgYWdhaW5zdCBQYXlsb2FkIGNvbGxlY3Rpb25zLlxuICpcbiAqIEBwYXJhbSBwYXlsb2FkQ2xpZW50IC0gVGhlIFBheWxvYWQgQ01TIGNsaWVudCBpbnN0YW5jZSBvciBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBpdFxuICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIGFkYXB0ZXJcbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGEgQmV0dGVyIEF1dGggYWRhcHRlclxuICovXG5jb25zdCBwYXlsb2FkQWRhcHRlcjogUGF5bG9hZEFkYXB0ZXIgPSAocGF5bG9hZENsaWVudCwgY29uZmlnKSA9PiB7XG4gIC8qKlxuICAgKiBMb2dzIGRlYnVnIG1lc3NhZ2VzIGlmIGRlYnVnIGxvZ2dpbmcgaXMgZW5hYmxlZFxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRvIGxvZ1xuICAgKi9cbiAgZnVuY3Rpb24gZGVidWdMb2cobWVzc2FnZTogYW55W10pIHtcbiAgICBpZiAoY29uZmlnLmVuYWJsZURlYnVnTG9ncykge1xuICAgICAgY29uc29sZS5sb2coJ1twYXlsb2FkLWRiLWFkYXB0ZXJdJywgLi4ubWVzc2FnZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9ncyBlcnJvciBtZXNzYWdlc1xuICAgKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBlcnJvciBtZXNzYWdlIHRvIGxvZ1xuICAgKi9cbiAgZnVuY3Rpb24gZXJyb3JMb2cobWVzc2FnZTogYW55W10pIHtcbiAgICBjb25zb2xlLmVycm9yKGBbcGF5bG9hZC1kYi1hZGFwdGVyXWAsIC4uLm1lc3NhZ2UpXG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGFuIGVycm9yIHdoZW4gYSBjb2xsZWN0aW9uIHNsdWcgZG9lc24ndCBleGlzdFxuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgbW9kZWwgbmFtZSB0aGF0IGNvdWxkbid0IGJlIGZvdW5kXG4gICAqIEB0aHJvd3Mge0JldHRlckF1dGhFcnJvcn0gV2hlbiB0aGUgY29sbGVjdGlvbiBkb2Vzbid0IGV4aXN0XG4gICAqIEByZXR1cm5zIE5ldmVyIC0gRnVuY3Rpb24gYWx3YXlzIHRocm93c1xuICAgKi9cbiAgZnVuY3Rpb24gY29sbGVjdGlvblNsdWdFcnJvcihtb2RlbDogc3RyaW5nKTogbmV2ZXIge1xuICAgIHRocm93IG5ldyBCZXR0ZXJBdXRoRXJyb3IoYENvbGxlY3Rpb24gJHttb2RlbH0gZG9lcyBub3QgZXhpc3QuIFBsZWFzZSBjaGVjayB5b3VyIHBheWxvYWQgY29sbGVjdGlvbiBzbHVncyBtYXRjaCB0aGUgYmV0dGVyIGF1dGggc2NoZW1hYClcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhhdCBhIGNvbGxlY3Rpb24gZXhpc3RzIGluIFBheWxvYWRcbiAgICogQHBhcmFtIHBheWxvYWQgLSBUaGUgUGF5bG9hZCBjbGllbnQgaW5zdGFuY2VcbiAgICogQHBhcmFtIGNvbGxlY3Rpb25TbHVnIC0gVGhlIGNvbGxlY3Rpb24gc2x1ZyB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgbW9kZWwgbmFtZSBmb3IgZXJyb3IgbWVzc2FnZXNcbiAgICogQHRocm93cyB7QmV0dGVyQXV0aEVycm9yfSBXaGVuIHRoZSBjb2xsZWN0aW9uIGRvZXNuJ3QgZXhpc3RcbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlQ29sbGVjdGlvbihwYXlsb2FkOiBhbnksIGNvbGxlY3Rpb25TbHVnOiBzdHJpbmcsIG1vZGVsOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWNvbGxlY3Rpb25TbHVnIHx8ICEoY29sbGVjdGlvblNsdWcgaW4gcGF5bG9hZC5jb2xsZWN0aW9ucykpIHtcbiAgICAgIGNvbGxlY3Rpb25TbHVnRXJyb3IobW9kZWwpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjb250ZXh0IG9iamVjdCBmb3IgUGF5bG9hZCBvcGVyYXRpb25zXG4gICAqIEBwYXJhbSBkYXRhIC0gRGF0YSB0byBpbmNsdWRlIGluIHRoZSBjb250ZXh0XG4gICAqIEByZXR1cm5zIFRoZSBjb250ZXh0IG9iamVjdCB3aXRoIEJldHRlciBBdXRoIG1ldGFkYXRhXG4gICAqL1xuICBjb25zdCBjcmVhdGVBZGFwdGVyQ29udGV4dCA9IChkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiAoe1xuICAgIFtCRVRURVJfQVVUSF9DT05URVhUX0tFWV06IHsgLi4uZGF0YSB9XG4gIH0pXG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBQYXlsb2FkIGNsaWVudCwgaGFuZGxpbmcgYm90aCBmdW5jdGlvbiBhbmQgZGlyZWN0IHJlZmVyZW5jZXNcbiAgICogQHJldHVybnMgVGhlIHJlc29sdmVkIFBheWxvYWQgY2xpZW50XG4gICAqIEB0aHJvd3Mge0JldHRlckF1dGhFcnJvcn0gV2hlbiBCZXR0ZXIgQXV0aCBwbHVnaW4gaXMgbm90IGNvbmZpZ3VyZWRcbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVQYXlsb2FkQ2xpZW50KCkge1xuICAgIGNvbnN0IHBheWxvYWQgPSB0eXBlb2YgcGF5bG9hZENsaWVudCA9PT0gJ2Z1bmN0aW9uJyA/IGF3YWl0IHBheWxvYWRDbGllbnQoKSA6IGF3YWl0IHBheWxvYWRDbGllbnRcbiAgICBpZiAoIXBheWxvYWQuY29uZmlnPy5jdXN0b20/Lmhhc0JldHRlckF1dGhQbHVnaW4pIHtcbiAgICAgIHRocm93IG5ldyBCZXR0ZXJBdXRoRXJyb3IoYFBheWxvYWQgaXMgbm90IGNvbmZpZ3VyZWQgd2l0aCB0aGUgYmV0dGVyLWF1dGggcGx1Z2luLiBQbGVhc2UgYWRkIHRoZSBwbHVnaW4gdG8geW91ciBwYXlsb2FkIGNvbmZpZy5gKVxuICAgIH1cbiAgICByZXR1cm4gcGF5bG9hZFxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBCZXR0ZXIgQXV0aCBhZGFwdGVyIGZvciBQYXlsb2FkXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gQmV0dGVyIEF1dGggb3B0aW9uc1xuICAgKiBAcmV0dXJucyBBIEJldHRlciBBdXRoIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICovXG4gIHJldHVybiAob3B0aW9uczogQmV0dGVyQXV0aE9wdGlvbnMpOiBBZGFwdGVyID0+IHtcbiAgICBjb25zdCB7IHRyYW5zZm9ybUlucHV0LCB0cmFuc2Zvcm1PdXRwdXQsIGNvbnZlcnRXaGVyZUNsYXVzZSwgY29udmVydFNlbGVjdCwgY29udmVydFNvcnQsIGdldENvbGxlY3Rpb25TbHVnLCBzaW5nbGVJZFF1ZXJ5IH0gPVxuICAgICAgY3JlYXRlVHJhbnNmb3JtKG9wdGlvbnMsIGNvbmZpZy5lbmFibGVEZWJ1Z0xvZ3MgPz8gZmFsc2UpXG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6ICdwYXlsb2FkLWFkYXB0ZXInLFxuICAgICAgYXN5bmMgY3JlYXRlPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBSID0gVD4oe1xuICAgICAgICBtb2RlbCxcbiAgICAgICAgZGF0YTogdmFsdWVzLFxuICAgICAgICBzZWxlY3RcbiAgICAgIH06IHtcbiAgICAgICAgbW9kZWw6IHN0cmluZ1xuICAgICAgICBkYXRhOiBUXG4gICAgICAgIHNlbGVjdD86IHN0cmluZ1tdXG4gICAgICB9KTogUHJvbWlzZTxSPiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKVxuICAgICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgcmVzb2x2ZVBheWxvYWRDbGllbnQoKVxuICAgICAgICBjb25zdCBjb2xsZWN0aW9uU2x1ZyA9IGdldENvbGxlY3Rpb25TbHVnKG1vZGVsKVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIGNvbGxlY3Rpb24gZXhpc3RzIGJlZm9yZSBwcm9jZWVkaW5nXG4gICAgICAgIGF3YWl0IHZhbGlkYXRlQ29sbGVjdGlvbihwYXlsb2FkLCBjb2xsZWN0aW9uU2x1ZywgbW9kZWwpXG5cbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRJbnB1dCA9IHRyYW5zZm9ybUlucHV0KHtcbiAgICAgICAgICBkYXRhOiB2YWx1ZXMsXG4gICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgaWRUeXBlOiBjb25maWcuaWRUeXBlXG4gICAgICAgIH0pXG5cbiAgICAgICAgZGVidWdMb2coWydjcmVhdGUnLCB7IGNvbGxlY3Rpb25TbHVnLCB0cmFuc2Zvcm1lZElucHV0LCBzZWxlY3QgfV0pXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYXlsb2FkLmNyZWF0ZSh7XG4gICAgICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uU2x1ZyxcbiAgICAgICAgICAgIGRhdGE6IHRyYW5zZm9ybWVkSW5wdXQsXG4gICAgICAgICAgICBzZWxlY3Q6IGNvbnZlcnRTZWxlY3QobW9kZWwsIHNlbGVjdCksXG4gICAgICAgICAgICBjb250ZXh0OiBjcmVhdGVBZGFwdGVyQ29udGV4dCh7IG1vZGVsLCBvcGVyYXRpb246ICdjcmVhdGUnIH0pLFxuICAgICAgICAgICAgZGVwdGg6IFBBWUxPQURfUVVFUllfREVQVEhcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRSZXN1bHQgPSB0cmFuc2Zvcm1PdXRwdXQoe1xuICAgICAgICAgICAgZG9jOiByZXN1bHQsXG4gICAgICAgICAgICBtb2RlbFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBkZWJ1Z0xvZyhbXG4gICAgICAgICAgICAnY3JlYXRlIHJlc3VsdCcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbGxlY3Rpb25TbHVnLFxuICAgICAgICAgICAgICB0cmFuc2Zvcm1lZFJlc3VsdCxcbiAgICAgICAgICAgICAgZHVyYXRpb246IGAke0RhdGUubm93KCkgLSBzdGFydH1tc2BcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdKVxuXG4gICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkUmVzdWx0IGFzIFJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBlcnJvckxvZyhbJ0Vycm9yIGluIGNyZWF0aW5nOicsIG1vZGVsLCBlcnJvcl0pXG4gICAgICAgICAgcmV0dXJuIG51bGwgYXMgUlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYXN5bmMgZmluZE9uZTxSPih7IG1vZGVsLCB3aGVyZSwgc2VsZWN0IH06IHsgbW9kZWw6IHN0cmluZzsgd2hlcmU6IFdoZXJlW107IHNlbGVjdD86IHN0cmluZ1tdIH0pOiBQcm9taXNlPFIgfCBudWxsPiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKVxuICAgICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgcmVzb2x2ZVBheWxvYWRDbGllbnQoKVxuICAgICAgICBjb25zdCBjb2xsZWN0aW9uU2x1ZyA9IGdldENvbGxlY3Rpb25TbHVnKG1vZGVsKVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIGNvbGxlY3Rpb24gZXhpc3RzIGJlZm9yZSBwcm9jZWVkaW5nXG4gICAgICAgIGF3YWl0IHZhbGlkYXRlQ29sbGVjdGlvbihwYXlsb2FkLCBjb2xsZWN0aW9uU2x1ZywgbW9kZWwpXG5cbiAgICAgICAgY29uc3QgcGF5bG9hZFdoZXJlID0gY29udmVydFdoZXJlQ2xhdXNlKHtcbiAgICAgICAgICBpZFR5cGU6IGNvbmZpZy5pZFR5cGUsXG4gICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgd2hlcmVcbiAgICAgICAgfSlcblxuICAgICAgICBkZWJ1Z0xvZyhbJ2ZpbmRPbmUnLCB7IGNvbGxlY3Rpb25TbHVnIH1dKVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgc2luZ2xlSWQgPSBzaW5nbGVJZFF1ZXJ5KHBheWxvYWRXaGVyZSlcbiAgICAgICAgICBsZXQgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGxcblxuICAgICAgICAgIGlmIChzaW5nbGVJZCkge1xuICAgICAgICAgICAgZGVidWdMb2coWydmaW5kT25lQnlJRCcsIHsgY29sbGVjdGlvblNsdWcsIGlkOiBzaW5nbGVJZCB9XSlcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHBheWxvYWQuZmluZEJ5SUQoe1xuICAgICAgICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uU2x1ZyxcbiAgICAgICAgICAgICAgaWQ6IHNpbmdsZUlkLFxuICAgICAgICAgICAgICBzZWxlY3Q6IGNvbnZlcnRTZWxlY3QobW9kZWwsIHNlbGVjdCksXG4gICAgICAgICAgICAgIGNvbnRleHQ6IGNyZWF0ZUFkYXB0ZXJDb250ZXh0KHtcbiAgICAgICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdmaW5kT25lQnlJRCdcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIGRlcHRoOiBQQVlMT0FEX1FVRVJZX0RFUFRIXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWJ1Z0xvZyhbJ2ZpbmRPbmVCeVdoZXJlJywgeyBjb2xsZWN0aW9uU2x1ZywgcGF5bG9hZFdoZXJlIH1dKVxuICAgICAgICAgICAgY29uc3QgZG9jcyA9IGF3YWl0IHBheWxvYWQuZmluZCh7XG4gICAgICAgICAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25TbHVnLFxuICAgICAgICAgICAgICB3aGVyZTogcGF5bG9hZFdoZXJlLFxuICAgICAgICAgICAgICBzZWxlY3Q6IGNvbnZlcnRTZWxlY3QobW9kZWwsIHNlbGVjdCksXG4gICAgICAgICAgICAgIGNvbnRleHQ6IGNyZWF0ZUFkYXB0ZXJDb250ZXh0KHtcbiAgICAgICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdmaW5kT25lQnlXaGVyZSdcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIGRlcHRoOiBQQVlMT0FEX1FVRVJZX0RFUFRILFxuICAgICAgICAgICAgICBsaW1pdDogMVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJlc3VsdCA9IGRvY3MuZG9jc1swXVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkUmVzdWx0ID0gdHJhbnNmb3JtT3V0cHV0PHR5cGVvZiByZXN1bHQgfCBudWxsPih7XG4gICAgICAgICAgICBkb2M6IHJlc3VsdCxcbiAgICAgICAgICAgIG1vZGVsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGRlYnVnTG9nKFtcbiAgICAgICAgICAgICdmaW5kT25lIHJlc3VsdCcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbGxlY3Rpb25TbHVnLFxuICAgICAgICAgICAgICB0cmFuc2Zvcm1lZFJlc3VsdCxcbiAgICAgICAgICAgICAgZHVyYXRpb246IGAke0RhdGUubm93KCkgLSBzdGFydH1tc2BcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdKVxuXG4gICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkUmVzdWx0IGFzIFJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAnc3RhdHVzJyBpbiBlcnJvciAmJiBlcnJvci5zdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICB9XG4gICAgICAgICAgZXJyb3JMb2coWydFcnJvciBpbiBmaW5kT25lOiAnLCBlcnJvcl0pXG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGFzeW5jIGZpbmRNYW55PFI+KHtcbiAgICAgICAgbW9kZWwsXG4gICAgICAgIHdoZXJlLFxuICAgICAgICBsaW1pdCA9IDEwLFxuICAgICAgICBzb3J0QnksXG4gICAgICAgIG9mZnNldCA9IDBcbiAgICAgIH06IHtcbiAgICAgICAgbW9kZWw6IHN0cmluZ1xuICAgICAgICB3aGVyZT86IFdoZXJlW11cbiAgICAgICAgbGltaXQ/OiBudW1iZXJcbiAgICAgICAgc29ydEJ5Pzoge1xuICAgICAgICAgIGZpZWxkOiBzdHJpbmdcbiAgICAgICAgICBkaXJlY3Rpb246ICdhc2MnIHwgJ2Rlc2MnXG4gICAgICAgIH1cbiAgICAgICAgb2Zmc2V0PzogbnVtYmVyXG4gICAgICB9KTogUHJvbWlzZTxSW10+IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpXG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCByZXNvbHZlUGF5bG9hZENsaWVudCgpXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb25TbHVnID0gZ2V0Q29sbGVjdGlvblNsdWcobW9kZWwpXG5cbiAgICAgICAgLy8gVmFsaWRhdGUgY29sbGVjdGlvbiBleGlzdHMgYmVmb3JlIHByb2NlZWRpbmdcbiAgICAgICAgYXdhaXQgdmFsaWRhdGVDb2xsZWN0aW9uKHBheWxvYWQsIGNvbGxlY3Rpb25TbHVnLCBtb2RlbClcblxuICAgICAgICBjb25zdCBwYXlsb2FkV2hlcmUgPSBjb252ZXJ0V2hlcmVDbGF1c2Uoe1xuICAgICAgICAgIGlkVHlwZTogY29uZmlnLmlkVHlwZSxcbiAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICB3aGVyZVxuICAgICAgICB9KVxuXG4gICAgICAgIGRlYnVnTG9nKFsnZmluZE1hbnknLCB7IGNvbGxlY3Rpb25TbHVnLCBzb3J0QnksIGxpbWl0LCBvZmZzZXQgfV0pXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsZXQgcmVzdWx0OiB7XG4gICAgICAgICAgICBkb2NzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W11cbiAgICAgICAgICAgIHRvdGFsRG9jczogbnVtYmVyXG4gICAgICAgICAgfSB8IG51bGwgPSBudWxsXG5cbiAgICAgICAgICBjb25zdCBzaW5nbGVJZCA9IHNpbmdsZUlkUXVlcnkocGF5bG9hZFdoZXJlKVxuICAgICAgICAgIGlmIChzaW5nbGVJZCkge1xuICAgICAgICAgICAgZGVidWdMb2coWydmaW5kTWFueUJ5U2luZ2xlSUQnLCB7IGNvbGxlY3Rpb25TbHVnLCBpZDogc2luZ2xlSWQgfV0pXG4gICAgICAgICAgICBjb25zdCBkb2MgPSBhd2FpdCBwYXlsb2FkLmZpbmRCeUlEKHtcbiAgICAgICAgICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvblNsdWcsXG4gICAgICAgICAgICAgIGlkOiBzaW5nbGVJZCxcbiAgICAgICAgICAgICAgZGVwdGg6IFBBWUxPQURfUVVFUllfREVQVEgsXG4gICAgICAgICAgICAgIGNvbnRleHQ6IGNyZWF0ZUFkYXB0ZXJDb250ZXh0KHtcbiAgICAgICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdmaW5kTWFueUJ5U2luZ2xlSUQnXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmVzdWx0ID0geyBkb2NzOiBkb2MgPyBbZG9jXSA6IFtdLCB0b3RhbERvY3M6IGRvYyA/IDEgOiAwIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVidWdMb2coWydmaW5kTWFueUJ5V2hlcmUnLCB7IGNvbGxlY3Rpb25TbHVnLCBwYXlsb2FkV2hlcmUgfV0pXG4gICAgICAgICAgICBjb25zdCBzcGlsbCA9IG9mZnNldCAlIGxpbWl0XG4gICAgICAgICAgICBjb25zdCBwYWdlID0gTWF0aC5mbG9vcihvZmZzZXQgLyBsaW1pdCkgKyAxXG4gICAgICAgICAgICBjb25zdCBmZXRjaExpbWl0ID0gc3BpbGwgPyBsaW1pdCArIHNwaWxsIDogbGltaXRcblxuICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgcGF5bG9hZC5maW5kKHtcbiAgICAgICAgICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvblNsdWcsXG4gICAgICAgICAgICAgIHdoZXJlOiBwYXlsb2FkV2hlcmUsXG4gICAgICAgICAgICAgIGxpbWl0OiBmZXRjaExpbWl0LFxuICAgICAgICAgICAgICBwYWdlOiBwYWdlLFxuICAgICAgICAgICAgICBzb3J0OiBjb252ZXJ0U29ydChtb2RlbCwgc29ydEJ5KSxcbiAgICAgICAgICAgICAgZGVwdGg6IFBBWUxPQURfUVVFUllfREVQVEgsXG4gICAgICAgICAgICAgIGNvbnRleHQ6IGNyZWF0ZUFkYXB0ZXJDb250ZXh0KHtcbiAgICAgICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdmaW5kTWFueUJ5V2hlcmUnXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmVzdWx0ID0geyBkb2NzOiByZXMuZG9jcy5zbGljZShzcGlsbCwgc3BpbGwgKyBsaW1pdCksIHRvdGFsRG9jczogcmVzLnRvdGFsRG9jcyB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRSZXN1bHQgPVxuICAgICAgICAgICAgcmVzdWx0Py5kb2NzLm1hcCgoZG9jKSA9PlxuICAgICAgICAgICAgICB0cmFuc2Zvcm1PdXRwdXQoe1xuICAgICAgICAgICAgICAgIGRvYyxcbiAgICAgICAgICAgICAgICBtb2RlbFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKSA/PyBbXVxuXG4gICAgICAgICAgZGVidWdMb2coW1xuICAgICAgICAgICAgJ2ZpbmRNYW55IHJlc3VsdCcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbGxlY3Rpb25TbHVnLFxuICAgICAgICAgICAgICB0cmFuc2Zvcm1lZFJlc3VsdCxcbiAgICAgICAgICAgICAgZHVyYXRpb246IGAke0RhdGUubm93KCkgLSBzdGFydH1tc2BcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdKVxuXG4gICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkUmVzdWx0IGFzIFJbXVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICdzdGF0dXMnIGluIGVycm9yICYmIGVycm9yLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gW10gYXMgUltdXG4gICAgICAgICAgfVxuICAgICAgICAgIGVycm9yTG9nKFsnRXJyb3IgaW4gZmluZE1hbnk6ICcsIGVycm9yXSlcbiAgICAgICAgICByZXR1cm4gW10gYXMgUltdXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBhc3luYyB1cGRhdGU8Uj4oeyBtb2RlbCwgd2hlcmUsIHVwZGF0ZSB9OiB7IG1vZGVsOiBzdHJpbmc7IHdoZXJlOiBXaGVyZVtdOyB1cGRhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0pOiBQcm9taXNlPFIgfCBudWxsPiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKVxuICAgICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgcmVzb2x2ZVBheWxvYWRDbGllbnQoKVxuICAgICAgICBjb25zdCBjb2xsZWN0aW9uU2x1ZyA9IGdldENvbGxlY3Rpb25TbHVnKG1vZGVsKVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIGNvbGxlY3Rpb24gZXhpc3RzIGJlZm9yZSBwcm9jZWVkaW5nXG4gICAgICAgIGF3YWl0IHZhbGlkYXRlQ29sbGVjdGlvbihwYXlsb2FkLCBjb2xsZWN0aW9uU2x1ZywgbW9kZWwpXG5cbiAgICAgICAgY29uc3QgcGF5bG9hZFdoZXJlID0gY29udmVydFdoZXJlQ2xhdXNlKHtcbiAgICAgICAgICBpZFR5cGU6IGNvbmZpZy5pZFR5cGUsXG4gICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgd2hlcmVcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZElucHV0ID0gdHJhbnNmb3JtSW5wdXQoe1xuICAgICAgICAgIGRhdGE6IHVwZGF0ZSxcbiAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICBpZFR5cGU6IGNvbmZpZy5pZFR5cGVcbiAgICAgICAgfSlcblxuICAgICAgICBkZWJ1Z0xvZyhbJ3VwZGF0ZScsIHsgY29sbGVjdGlvblNsdWcsIHVwZGF0ZSB9XSlcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGxldCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsID0gbnVsbFxuICAgICAgICAgIGNvbnN0IGlkID0gc2luZ2xlSWRRdWVyeShwYXlsb2FkV2hlcmUpXG5cbiAgICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgIGRlYnVnTG9nKFsndXBkYXRlQnlJRCcsIHsgY29sbGVjdGlvblNsdWcsIGlkIH1dKVxuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgcGF5bG9hZC51cGRhdGUoe1xuICAgICAgICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uU2x1ZyxcbiAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgIGRhdGE6IHRyYW5zZm9ybWVkSW5wdXQsXG4gICAgICAgICAgICAgIGRlcHRoOiBQQVlMT0FEX1FVRVJZX0RFUFRILFxuICAgICAgICAgICAgICBjb250ZXh0OiBjcmVhdGVBZGFwdGVyQ29udGV4dCh7IG1vZGVsLCBvcGVyYXRpb246ICd1cGRhdGVCeUlEJyB9KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVidWdMb2coWyd1cGRhdGVCeVdoZXJlJywgeyBjb2xsZWN0aW9uU2x1ZywgcGF5bG9hZFdoZXJlIH1dKVxuICAgICAgICAgICAgY29uc3QgZG9jID0gYXdhaXQgcGF5bG9hZC51cGRhdGUoe1xuICAgICAgICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uU2x1ZyxcbiAgICAgICAgICAgICAgd2hlcmU6IHBheWxvYWRXaGVyZSxcbiAgICAgICAgICAgICAgZGF0YTogdHJhbnNmb3JtZWRJbnB1dCxcbiAgICAgICAgICAgICAgZGVwdGg6IFBBWUxPQURfUVVFUllfREVQVEgsXG4gICAgICAgICAgICAgIGNvbnRleHQ6IGNyZWF0ZUFkYXB0ZXJDb250ZXh0KHtcbiAgICAgICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgICAgICBvcGVyYXRpb246ICd1cGRhdGVCeVdoZXJlJ1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJlc3VsdCA9IGRvYy5kb2NzWzBdXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRSZXN1bHQgPSB0cmFuc2Zvcm1PdXRwdXQ8dHlwZW9mIHJlc3VsdCB8IG51bGw+KHtcbiAgICAgICAgICAgIGRvYzogcmVzdWx0LFxuICAgICAgICAgICAgbW9kZWxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgZGVidWdMb2coW1xuICAgICAgICAgICAgJ3VwZGF0ZS1yZXN1bHQnLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb2xsZWN0aW9uU2x1ZyxcbiAgICAgICAgICAgICAgdHJhbnNmb3JtZWRSZXN1bHQsXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiBgJHtEYXRlLm5vdygpIC0gc3RhcnR9bXNgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSlcblxuICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZFJlc3VsdCBhcyBSXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgJ3N0YXR1cycgaW4gZXJyb3IgJiYgZXJyb3Iuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgfVxuICAgICAgICAgIGVycm9yTG9nKFsnRXJyb3IgaW4gdXBkYXRlOiAnLCBlcnJvcl0pXG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGFzeW5jIHVwZGF0ZU1hbnkoeyBtb2RlbCwgd2hlcmUsIHVwZGF0ZSB9OiB7IG1vZGVsOiBzdHJpbmc7IHdoZXJlOiBXaGVyZVtdOyB1cGRhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KClcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IHJlc29sdmVQYXlsb2FkQ2xpZW50KClcbiAgICAgICAgY29uc3QgY29sbGVjdGlvblNsdWcgPSBnZXRDb2xsZWN0aW9uU2x1Zyhtb2RlbClcblxuICAgICAgICAvLyBWYWxpZGF0ZSBjb2xsZWN0aW9uIGV4aXN0cyBiZWZvcmUgcHJvY2VlZGluZ1xuICAgICAgICBhd2FpdCB2YWxpZGF0ZUNvbGxlY3Rpb24ocGF5bG9hZCwgY29sbGVjdGlvblNsdWcsIG1vZGVsKVxuXG4gICAgICAgIGNvbnN0IHBheWxvYWRXaGVyZSA9IGNvbnZlcnRXaGVyZUNsYXVzZSh7XG4gICAgICAgICAgaWRUeXBlOiBjb25maWcuaWRUeXBlLFxuICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgIHdoZXJlXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRJbnB1dCA9IHRyYW5zZm9ybUlucHV0KHtcbiAgICAgICAgICBkYXRhOiB1cGRhdGUsXG4gICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgaWRUeXBlOiBjb25maWcuaWRUeXBlXG4gICAgICAgIH0pXG5cbiAgICAgICAgZGVidWdMb2coWyd1cGRhdGVNYW55JywgeyBjb2xsZWN0aW9uU2x1ZywgcGF5bG9hZFdoZXJlLCB1cGRhdGUgfV0pXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB7IGRvY3M6IHVwZGF0ZVJlc3VsdCB9ID0gYXdhaXQgcGF5bG9hZC51cGRhdGUoe1xuICAgICAgICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvblNsdWcsXG4gICAgICAgICAgICB3aGVyZTogcGF5bG9hZFdoZXJlLFxuICAgICAgICAgICAgZGF0YTogdHJhbnNmb3JtZWRJbnB1dCxcbiAgICAgICAgICAgIGRlcHRoOiBQQVlMT0FEX1FVRVJZX0RFUFRILFxuICAgICAgICAgICAgY29udGV4dDogY3JlYXRlQWRhcHRlckNvbnRleHQoeyBtb2RlbCwgb3BlcmF0aW9uOiAndXBkYXRlTWFueScgfSlcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgZGVidWdMb2coW1xuICAgICAgICAgICAgJ3VwZGF0ZU1hbnkgcmVzdWx0JyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29sbGVjdGlvblNsdWcsXG4gICAgICAgICAgICAgIHJlc3VsdDogdXBkYXRlUmVzdWx0LFxuICAgICAgICAgICAgICBkdXJhdGlvbjogYCR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zYFxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0pXG5cbiAgICAgICAgICByZXR1cm4gdXBkYXRlUmVzdWx0Py5sZW5ndGggfHwgMFxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICdzdGF0dXMnIGluIGVycm9yICYmIGVycm9yLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gMFxuICAgICAgICAgIH1cbiAgICAgICAgICBlcnJvckxvZyhbJ0Vycm9yIGluIHVwZGF0ZU1hbnk6ICcsIGVycm9yXSlcbiAgICAgICAgICByZXR1cm4gMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYXN5bmMgZGVsZXRlKHsgbW9kZWwsIHdoZXJlIH06IHsgbW9kZWw6IHN0cmluZzsgd2hlcmU6IFdoZXJlW10gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KClcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IHJlc29sdmVQYXlsb2FkQ2xpZW50KClcbiAgICAgICAgY29uc3QgY29sbGVjdGlvblNsdWcgPSBnZXRDb2xsZWN0aW9uU2x1Zyhtb2RlbClcblxuICAgICAgICAvLyBWYWxpZGF0ZSBjb2xsZWN0aW9uIGV4aXN0cyBiZWZvcmUgcHJvY2VlZGluZ1xuICAgICAgICBhd2FpdCB2YWxpZGF0ZUNvbGxlY3Rpb24ocGF5bG9hZCwgY29sbGVjdGlvblNsdWcsIG1vZGVsKVxuXG4gICAgICAgIGNvbnN0IHBheWxvYWRXaGVyZSA9IGNvbnZlcnRXaGVyZUNsYXVzZSh7XG4gICAgICAgICAgaWRUeXBlOiBjb25maWcuaWRUeXBlLFxuICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgIHdoZXJlXG4gICAgICAgIH0pXG5cbiAgICAgICAgZGVidWdMb2coWydkZWxldGUnLCB7IGNvbGxlY3Rpb25TbHVnIH1dKVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbGV0IGRlbGV0ZVJlc3VsdDoge1xuICAgICAgICAgICAgZG9jOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbFxuICAgICAgICAgICAgZXJyb3JzOiBhbnlbXVxuICAgICAgICAgIH0gfCBudWxsID0gbnVsbFxuXG4gICAgICAgICAgY29uc3Qgc2luZ2xlSWQgPSBzaW5nbGVJZFF1ZXJ5KHBheWxvYWRXaGVyZSlcbiAgICAgICAgICBpZiAoc2luZ2xlSWQpIHtcbiAgICAgICAgICAgIGRlYnVnTG9nKFsnZGVsZXRlQnlJRCcsIHsgY29sbGVjdGlvblNsdWcsIGlkOiBzaW5nbGVJZCB9XSlcbiAgICAgICAgICAgIGNvbnN0IGRvYyA9IGF3YWl0IHBheWxvYWQuZGVsZXRlKHtcbiAgICAgICAgICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvblNsdWcsXG4gICAgICAgICAgICAgIGlkOiBzaW5nbGVJZCxcbiAgICAgICAgICAgICAgZGVwdGg6IFBBWUxPQURfUVVFUllfREVQVEgsXG4gICAgICAgICAgICAgIGNvbnRleHQ6IGNyZWF0ZUFkYXB0ZXJDb250ZXh0KHsgbW9kZWwsIG9wZXJhdGlvbjogJ2RlbGV0ZUJ5SUQnIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgZGVsZXRlUmVzdWx0ID0geyBkb2MsIGVycm9yczogW10gfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWJ1Z0xvZyhbJ2RlbGV0ZUJ5V2hlcmUnLCB7IGNvbGxlY3Rpb25TbHVnLCBwYXlsb2FkV2hlcmUgfV0pXG4gICAgICAgICAgICBjb25zdCBkb2MgPSBhd2FpdCBwYXlsb2FkLmRlbGV0ZSh7XG4gICAgICAgICAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25TbHVnLFxuICAgICAgICAgICAgICB3aGVyZTogcGF5bG9hZFdoZXJlLFxuICAgICAgICAgICAgICBkZXB0aDogUEFZTE9BRF9RVUVSWV9ERVBUSCxcbiAgICAgICAgICAgICAgY29udGV4dDogY3JlYXRlQWRhcHRlckNvbnRleHQoe1xuICAgICAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ2RlbGV0ZUJ5V2hlcmUnXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgZGVsZXRlUmVzdWx0ID0geyBkb2M6IGRvYy5kb2NzWzBdLCBlcnJvcnM6IFtdIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkZWJ1Z0xvZyhbXG4gICAgICAgICAgICAnZGVsZXRlIHJlc3VsdCcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbGxlY3Rpb25TbHVnLFxuICAgICAgICAgICAgICByZXN1bHQ6IGRlbGV0ZVJlc3VsdCxcbiAgICAgICAgICAgICAgZHVyYXRpb246IGAke0RhdGUubm93KCkgLSBzdGFydH1tc2BcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdKVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICdzdGF0dXMnIGluIGVycm9yICYmIGVycm9yLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgZXJyb3JMb2coWydFcnJvciBpbiBkZWxldGU6ICcsIGVycm9yXSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGFzeW5jIGRlbGV0ZU1hbnkoeyBtb2RlbCwgd2hlcmUgfTogeyBtb2RlbDogc3RyaW5nOyB3aGVyZTogV2hlcmVbXSB9KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpXG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCByZXNvbHZlUGF5bG9hZENsaWVudCgpXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb25TbHVnID0gZ2V0Q29sbGVjdGlvblNsdWcobW9kZWwpXG5cbiAgICAgICAgLy8gVmFsaWRhdGUgY29sbGVjdGlvbiBleGlzdHMgYmVmb3JlIHByb2NlZWRpbmdcbiAgICAgICAgYXdhaXQgdmFsaWRhdGVDb2xsZWN0aW9uKHBheWxvYWQsIGNvbGxlY3Rpb25TbHVnLCBtb2RlbClcblxuICAgICAgICBjb25zdCBwYXlsb2FkV2hlcmUgPSBjb252ZXJ0V2hlcmVDbGF1c2Uoe1xuICAgICAgICAgIGlkVHlwZTogY29uZmlnLmlkVHlwZSxcbiAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICB3aGVyZVxuICAgICAgICB9KVxuXG4gICAgICAgIGRlYnVnTG9nKFsnZGVsZXRlTWFueScsIHsgY29sbGVjdGlvblNsdWcsIHBheWxvYWRXaGVyZSB9XSlcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGRlbGV0ZVJlc3VsdCA9IGF3YWl0IHBheWxvYWQuZGVsZXRlKHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25TbHVnLFxuICAgICAgICAgICAgd2hlcmU6IHBheWxvYWRXaGVyZSxcbiAgICAgICAgICAgIGRlcHRoOiBQQVlMT0FEX1FVRVJZX0RFUFRILFxuICAgICAgICAgICAgY29udGV4dDogY3JlYXRlQWRhcHRlckNvbnRleHQoeyBtb2RlbCwgb3BlcmF0aW9uOiAnZGVsZXRlTWFueScgfSlcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgZGVidWdMb2coW1xuICAgICAgICAgICAgJ2RlbGV0ZU1hbnkgcmVzdWx0JyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29sbGVjdGlvblNsdWcsXG4gICAgICAgICAgICAgIHJlc3VsdDogZGVsZXRlUmVzdWx0LFxuICAgICAgICAgICAgICBkdXJhdGlvbjogYCR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zYFxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0pXG5cbiAgICAgICAgICByZXR1cm4gZGVsZXRlUmVzdWx0LmRvY3MubGVuZ3RoXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgJ3N0YXR1cycgaW4gZXJyb3IgJiYgZXJyb3Iuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiAwXG4gICAgICAgICAgfVxuICAgICAgICAgIGVycm9yTG9nKFsnRXJyb3IgaW4gZGVsZXRlTWFueTogJywgZXJyb3JdKVxuICAgICAgICAgIHJldHVybiAwXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBhc3luYyBjb3VudCh7IG1vZGVsLCB3aGVyZSB9OiB7IG1vZGVsOiBzdHJpbmc7IHdoZXJlPzogV2hlcmVbXSB9KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpXG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCByZXNvbHZlUGF5bG9hZENsaWVudCgpXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb25TbHVnID0gZ2V0Q29sbGVjdGlvblNsdWcobW9kZWwpXG5cbiAgICAgICAgLy8gVmFsaWRhdGUgY29sbGVjdGlvbiBleGlzdHMgYmVmb3JlIHByb2NlZWRpbmdcbiAgICAgICAgYXdhaXQgdmFsaWRhdGVDb2xsZWN0aW9uKHBheWxvYWQsIGNvbGxlY3Rpb25TbHVnLCBtb2RlbClcblxuICAgICAgICBjb25zdCBwYXlsb2FkV2hlcmUgPSBjb252ZXJ0V2hlcmVDbGF1c2Uoe1xuICAgICAgICAgIGlkVHlwZTogY29uZmlnLmlkVHlwZSxcbiAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICB3aGVyZVxuICAgICAgICB9KVxuXG4gICAgICAgIGRlYnVnTG9nKFsnY291bnQnLCB7IGNvbGxlY3Rpb25TbHVnLCBwYXlsb2FkV2hlcmUgfV0pXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYXlsb2FkLmNvdW50KHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25TbHVnLFxuICAgICAgICAgICAgd2hlcmU6IHBheWxvYWRXaGVyZSxcbiAgICAgICAgICAgIGRlcHRoOiBQQVlMT0FEX1FVRVJZX0RFUFRILFxuICAgICAgICAgICAgY29udGV4dDogY3JlYXRlQWRhcHRlckNvbnRleHQoeyBtb2RlbCwgb3BlcmF0aW9uOiAnY291bnQnIH0pXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGRlYnVnTG9nKFtcbiAgICAgICAgICAgICdjb3VudCByZXN1bHQnLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb2xsZWN0aW9uU2x1ZyxcbiAgICAgICAgICAgICAgcmVzdWx0OiB7IHRvdGFsRG9jczogcmVzdWx0LnRvdGFsRG9jcyB9LFxuICAgICAgICAgICAgICBkdXJhdGlvbjogYCR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zYFxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0pXG5cbiAgICAgICAgICByZXR1cm4gcmVzdWx0LnRvdGFsRG9jc1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICdzdGF0dXMnIGluIGVycm9yICYmIGVycm9yLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gMFxuICAgICAgICAgIH1cbiAgICAgICAgICBlcnJvckxvZyhbJ0Vycm9yIGluIGNvdW50OiAnLCBlcnJvcl0pXG4gICAgICAgICAgcmV0dXJuIDBcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGNyZWF0ZVNjaGVtYTogYXN5bmMgKG9wdGlvbnMsIGZpbGUpID0+IHtcbiAgICAgICAgY29uc3Qgc2NoZW1hQ29kZSA9IGF3YWl0IGdlbmVyYXRlU2NoZW1hKG9wdGlvbnMpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29kZTogc2NoZW1hQ29kZSxcbiAgICAgICAgICBwYXRoOiBmaWxlIHx8ICdzY2hlbWEudHMnLFxuICAgICAgICAgIGFwcGVuZDogZmFsc2UsXG4gICAgICAgICAgb3ZlcndyaXRlOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIGVuYWJsZURlYnVnTG9nczogY29uZmlnLmVuYWJsZURlYnVnTG9ncyxcbiAgICAgICAgaWRUeXBlOiBjb25maWcuaWRUeXBlXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IGdlbmVyYXRlU2NoZW1hLCBwYXlsb2FkQWRhcHRlciB9XG4iXSwibmFtZXMiOlsiQmV0dGVyQXV0aEVycm9yIiwiZ2VuZXJhdGVTY2hlbWEiLCJjcmVhdGVUcmFuc2Zvcm0iLCJCRVRURVJfQVVUSF9DT05URVhUX0tFWSIsIlBBWUxPQURfUVVFUllfREVQVEgiLCJwYXlsb2FkQWRhcHRlciIsInBheWxvYWRDbGllbnQiLCJjb25maWciLCJkZWJ1Z0xvZyIsIm1lc3NhZ2UiLCJlbmFibGVEZWJ1Z0xvZ3MiLCJjb25zb2xlIiwibG9nIiwiZXJyb3JMb2ciLCJlcnJvciIsImNvbGxlY3Rpb25TbHVnRXJyb3IiLCJtb2RlbCIsInZhbGlkYXRlQ29sbGVjdGlvbiIsInBheWxvYWQiLCJjb2xsZWN0aW9uU2x1ZyIsImNvbGxlY3Rpb25zIiwiY3JlYXRlQWRhcHRlckNvbnRleHQiLCJkYXRhIiwicmVzb2x2ZVBheWxvYWRDbGllbnQiLCJjdXN0b20iLCJoYXNCZXR0ZXJBdXRoUGx1Z2luIiwib3B0aW9ucyIsInRyYW5zZm9ybUlucHV0IiwidHJhbnNmb3JtT3V0cHV0IiwiY29udmVydFdoZXJlQ2xhdXNlIiwiY29udmVydFNlbGVjdCIsImNvbnZlcnRTb3J0IiwiZ2V0Q29sbGVjdGlvblNsdWciLCJzaW5nbGVJZFF1ZXJ5IiwiaWQiLCJjcmVhdGUiLCJ2YWx1ZXMiLCJzZWxlY3QiLCJzdGFydCIsIkRhdGUiLCJub3ciLCJ0cmFuc2Zvcm1lZElucHV0IiwiaWRUeXBlIiwicmVzdWx0IiwiY29sbGVjdGlvbiIsImNvbnRleHQiLCJvcGVyYXRpb24iLCJkZXB0aCIsInRyYW5zZm9ybWVkUmVzdWx0IiwiZG9jIiwiZHVyYXRpb24iLCJmaW5kT25lIiwid2hlcmUiLCJwYXlsb2FkV2hlcmUiLCJzaW5nbGVJZCIsImZpbmRCeUlEIiwiZG9jcyIsImZpbmQiLCJsaW1pdCIsIkVycm9yIiwic3RhdHVzIiwiZmluZE1hbnkiLCJzb3J0QnkiLCJvZmZzZXQiLCJ0b3RhbERvY3MiLCJzcGlsbCIsInBhZ2UiLCJNYXRoIiwiZmxvb3IiLCJmZXRjaExpbWl0IiwicmVzIiwic29ydCIsInNsaWNlIiwibWFwIiwidXBkYXRlIiwidXBkYXRlTWFueSIsInVwZGF0ZVJlc3VsdCIsImxlbmd0aCIsImRlbGV0ZSIsImRlbGV0ZVJlc3VsdCIsImVycm9ycyIsImRlbGV0ZU1hbnkiLCJjb3VudCIsImNyZWF0ZVNjaGVtYSIsImZpbGUiLCJzY2hlbWFDb2RlIiwiY29kZSIsInBhdGgiLCJhcHBlbmQiLCJvdmVyd3JpdGUiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLGVBQWUsUUFBUSxjQUFhO0FBRTdDLFNBQVNDLGNBQWMsUUFBUSxvQkFBbUI7QUFDbEQsU0FBU0MsZUFBZSxRQUFRLGNBQWE7QUFHN0MsT0FBTyxNQUFNQywwQkFBMEIscUJBQW9CO0FBQzNELE1BQU1DLHNCQUFzQjtBQUU1Qjs7Ozs7Ozs7O0NBU0MsR0FDRCxNQUFNQyxpQkFBaUMsQ0FBQ0MsZUFBZUM7SUFDckQ7OztHQUdDLEdBQ0QsU0FBU0MsU0FBU0MsT0FBYztRQUM5QixJQUFJRixPQUFPRyxlQUFlLEVBQUU7WUFDMUJDLFFBQVFDLEdBQUcsQ0FBQywyQkFBMkJIO1FBQ3pDO0lBQ0Y7SUFFQTs7O0dBR0MsR0FDRCxTQUFTSSxTQUFTSixPQUFjO1FBQzlCRSxRQUFRRyxLQUFLLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLTDtJQUMzQztJQUVBOzs7OztHQUtDLEdBQ0QsU0FBU00sb0JBQW9CQyxLQUFhO1FBQ3hDLE1BQU0sSUFBSWhCLGdCQUFnQixDQUFDLFdBQVcsRUFBRWdCLE1BQU0sd0ZBQXdGLENBQUM7SUFDekk7SUFFQTs7Ozs7O0dBTUMsR0FDRCxlQUFlQyxtQkFBbUJDLE9BQVksRUFBRUMsY0FBc0IsRUFBRUgsS0FBYTtRQUNuRixJQUFJLENBQUNHLGtCQUFrQixDQUFFQSxDQUFBQSxrQkFBa0JELFFBQVFFLFdBQVcsQUFBRCxHQUFJO1lBQy9ETCxvQkFBb0JDO1FBQ3RCO0lBQ0Y7SUFFQTs7OztHQUlDLEdBQ0QsTUFBTUssdUJBQXVCLENBQUNDLE9BQStCLENBQUE7WUFDM0QsQ0FBQ25CLHdCQUF3QixFQUFFO2dCQUFF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