@cdktn/hcl2cdk 0.23.0-pre.4 → 0.23.0-pre.41

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 (86) hide show
  1. package/ambient.d.ts +0 -1
  2. package/build/__tests__/coerceType.test.js +165 -0
  3. package/build/__tests__/expressionToTs.test.js +693 -0
  4. package/build/__tests__/expressions.test.js +415 -0
  5. package/build/__tests__/findExpressionType.test.js +105 -0
  6. package/build/__tests__/functions.test.js +605 -0
  7. package/build/__tests__/generation.test.js +45 -0
  8. package/build/__tests__/jsii-rosetta-workarounds.test.js +86 -0
  9. package/build/__tests__/partialCode.test.js +390 -0
  10. package/build/__tests__/terraformSchema.test.js +105 -0
  11. package/build/__tests__/testHelpers.js +16 -0
  12. package/build/coerceType.js +240 -0
  13. package/build/dynamic-blocks.js +44 -0
  14. package/build/expressions.js +633 -0
  15. package/build/function-bindings/functions.generated.js +1142 -0
  16. package/build/function-bindings/functions.js +73 -0
  17. package/build/generation.js +676 -0
  18. package/{lib → build}/index.d.ts +2 -2
  19. package/build/index.js +364 -0
  20. package/build/iteration.js +87 -0
  21. package/build/jsii-rosetta-workarounds.js +126 -0
  22. package/build/partialCode.js +116 -0
  23. package/build/provider.js +40 -0
  24. package/build/references.js +141 -0
  25. package/build/schema.js +81 -0
  26. package/build/telemetryAllowList.json +24 -0
  27. package/build/terraformSchema.js +136 -0
  28. package/build/types.js +3 -0
  29. package/build/utils.js +25 -0
  30. package/build/variables.js +172 -0
  31. package/package.json +19 -19
  32. package/tsconfig.json +4 -2
  33. package/lib/__tests__/coerceType.test.js +0 -165
  34. package/lib/__tests__/expressionToTs.test.js +0 -693
  35. package/lib/__tests__/expressions.test.js +0 -415
  36. package/lib/__tests__/findExpressionType.test.js +0 -105
  37. package/lib/__tests__/functions.test.js +0 -605
  38. package/lib/__tests__/generation.test.js +0 -45
  39. package/lib/__tests__/jsii-rosetta-workarounds.test.js +0 -86
  40. package/lib/__tests__/partialCode.test.js +0 -390
  41. package/lib/__tests__/terraformSchema.test.js +0 -105
  42. package/lib/__tests__/testHelpers.js +0 -16
  43. package/lib/coerceType.js +0 -240
  44. package/lib/dynamic-blocks.js +0 -44
  45. package/lib/expressions.js +0 -634
  46. package/lib/function-bindings/functions.generated.js +0 -1142
  47. package/lib/function-bindings/functions.js +0 -73
  48. package/lib/generation.js +0 -676
  49. package/lib/index.js +0 -364
  50. package/lib/iteration.js +0 -87
  51. package/lib/jsii-rosetta-workarounds.js +0 -126
  52. package/lib/partialCode.js +0 -116
  53. package/lib/provider.js +0 -40
  54. package/lib/references.js +0 -141
  55. package/lib/schema.js +0 -81
  56. package/lib/terraformSchema.js +0 -136
  57. package/lib/types.js +0 -3
  58. package/lib/utils.js +0 -25
  59. package/lib/variables.js +0 -172
  60. /package/{lib → build}/__tests__/coerceType.test.d.ts +0 -0
  61. /package/{lib → build}/__tests__/expressionToTs.test.d.ts +0 -0
  62. /package/{lib → build}/__tests__/expressions.test.d.ts +0 -0
  63. /package/{lib → build}/__tests__/findExpressionType.test.d.ts +0 -0
  64. /package/{lib → build}/__tests__/functions.test.d.ts +0 -0
  65. /package/{lib → build}/__tests__/generation.test.d.ts +0 -0
  66. /package/{lib → build}/__tests__/jsii-rosetta-workarounds.test.d.ts +0 -0
  67. /package/{lib → build}/__tests__/partialCode.test.d.ts +0 -0
  68. /package/{lib → build}/__tests__/terraformSchema.test.d.ts +0 -0
  69. /package/{lib → build}/__tests__/testHelpers.d.ts +0 -0
  70. /package/{lib → build}/coerceType.d.ts +0 -0
  71. /package/{lib → build}/dynamic-blocks.d.ts +0 -0
  72. /package/{lib → build}/expressions.d.ts +0 -0
  73. /package/{lib → build}/function-bindings/functions.d.ts +0 -0
  74. /package/{lib → build}/function-bindings/functions.generated.d.ts +0 -0
  75. /package/{lib → build}/generation.d.ts +0 -0
  76. /package/{lib → build}/iteration.d.ts +0 -0
  77. /package/{lib → build}/jsii-rosetta-workarounds.d.ts +0 -0
  78. /package/{lib → build}/partialCode.d.ts +0 -0
  79. /package/{lib → build}/provider.d.ts +0 -0
  80. /package/{lib → build}/references.d.ts +0 -0
  81. /package/{lib → build}/schema.d.ts +0 -0
  82. /package/{lib → build}/terraformSchema.d.ts +0 -0
  83. /package/{lib → build}/types.d.ts +0 -0
  84. /package/{lib → build}/utils.d.ts +0 -0
  85. /package/{lib → build}/variables.d.ts +0 -0
  86. /package/{lib → src}/telemetryAllowList.json +0 -0
@@ -0,0 +1,605 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright (c) HashiCorp, Inc.
4
+ * SPDX-License-Identifier: MPL-2.0
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || function (mod) {
23
+ if (mod && mod.__esModule) return mod;
24
+ var result = {};
25
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
26
+ __setModuleDefault(result, mod);
27
+ return result;
28
+ };
29
+ Object.defineProperty(exports, "__esModule", { value: true });
30
+ const t = __importStar(require("@babel/types"));
31
+ const coerceType_1 = require("../coerceType");
32
+ const functions_1 = require("../function-bindings/functions");
33
+ const testHelpers_1 = require("./testHelpers");
34
+ const scope = {
35
+ providerSchema: {},
36
+ providerGenerator: {},
37
+ constructs: new Set(),
38
+ variables: {},
39
+ hasTokenBasedTypeCoercion: false,
40
+ nodeIds: [],
41
+ importables: [],
42
+ topLevelConfig: {},
43
+ };
44
+ // '${replace(module.foo.output, "-", var.bar)}'
45
+ // from https://github.com/hashicorp/terraform-cdk/pull/2729
46
+ const dummy2 = {
47
+ children: [
48
+ {
49
+ children: [
50
+ {
51
+ children: [],
52
+ meta: {
53
+ traversal: [
54
+ {
55
+ range: {
56
+ End: {
57
+ Byte: 16,
58
+ Column: 16,
59
+ Line: 0,
60
+ },
61
+ Filename: "",
62
+ Start: {
63
+ Byte: 10,
64
+ Column: 10,
65
+ Line: 0,
66
+ },
67
+ },
68
+ segment: "module",
69
+ },
70
+ {
71
+ range: {
72
+ End: {
73
+ Byte: 20,
74
+ Column: 20,
75
+ Line: 0,
76
+ },
77
+ Filename: "",
78
+ Start: {
79
+ Byte: 16,
80
+ Column: 16,
81
+ Line: 0,
82
+ },
83
+ },
84
+ segment: "foo",
85
+ },
86
+ {
87
+ range: {
88
+ End: {
89
+ Byte: 27,
90
+ Column: 27,
91
+ Line: 0,
92
+ },
93
+ Filename: "",
94
+ Start: {
95
+ Byte: 20,
96
+ Column: 20,
97
+ Line: 0,
98
+ },
99
+ },
100
+ segment: "output",
101
+ },
102
+ ],
103
+ },
104
+ range: {
105
+ end: {
106
+ byte: 27,
107
+ column: 27,
108
+ line: 0,
109
+ },
110
+ start: {
111
+ byte: 10,
112
+ column: 10,
113
+ line: 0,
114
+ },
115
+ },
116
+ type: "ScopeTraversal",
117
+ },
118
+ {
119
+ children: [
120
+ {
121
+ children: [],
122
+ meta: {
123
+ type: "string",
124
+ value: "-",
125
+ },
126
+ range: {
127
+ end: {
128
+ byte: 31,
129
+ column: 31,
130
+ line: 0,
131
+ },
132
+ start: {
133
+ byte: 30,
134
+ column: 30,
135
+ line: 0,
136
+ },
137
+ },
138
+ type: "LiteralValue",
139
+ },
140
+ ],
141
+ range: {
142
+ end: {
143
+ byte: 31,
144
+ column: 31,
145
+ line: 0,
146
+ },
147
+ start: {
148
+ byte: 30,
149
+ column: 30,
150
+ line: 0,
151
+ },
152
+ },
153
+ type: "Template",
154
+ },
155
+ {
156
+ children: [],
157
+ meta: {
158
+ traversal: [
159
+ {
160
+ range: {
161
+ End: {
162
+ Byte: 37,
163
+ Column: 37,
164
+ Line: 0,
165
+ },
166
+ Filename: "",
167
+ Start: {
168
+ Byte: 34,
169
+ Column: 34,
170
+ Line: 0,
171
+ },
172
+ },
173
+ segment: "var",
174
+ },
175
+ {
176
+ range: {
177
+ End: {
178
+ Byte: 41,
179
+ Column: 41,
180
+ Line: 0,
181
+ },
182
+ Filename: "",
183
+ Start: {
184
+ Byte: 37,
185
+ Column: 37,
186
+ Line: 0,
187
+ },
188
+ },
189
+ segment: "bar",
190
+ },
191
+ ],
192
+ },
193
+ range: {
194
+ end: {
195
+ byte: 41,
196
+ column: 41,
197
+ line: 0,
198
+ },
199
+ start: {
200
+ byte: 34,
201
+ column: 34,
202
+ line: 0,
203
+ },
204
+ },
205
+ type: "ScopeTraversal",
206
+ },
207
+ ],
208
+ meta: {
209
+ closeParenRange: {
210
+ end: {
211
+ byte: 42,
212
+ column: 42,
213
+ line: 0,
214
+ },
215
+ start: {
216
+ byte: 41,
217
+ column: 41,
218
+ line: 0,
219
+ },
220
+ },
221
+ expandedFinalArgument: false,
222
+ name: "replace",
223
+ nameRange: {
224
+ end: {
225
+ byte: 9,
226
+ column: 9,
227
+ line: 0,
228
+ },
229
+ start: {
230
+ byte: 2,
231
+ column: 2,
232
+ line: 0,
233
+ },
234
+ },
235
+ openParenRange: {
236
+ end: {
237
+ byte: 10,
238
+ column: 10,
239
+ line: 0,
240
+ },
241
+ start: {
242
+ byte: 9,
243
+ column: 9,
244
+ line: 0,
245
+ },
246
+ },
247
+ },
248
+ range: {
249
+ end: {
250
+ byte: 10,
251
+ column: 10,
252
+ line: 0,
253
+ },
254
+ start: {
255
+ byte: 2,
256
+ column: 2,
257
+ line: 0,
258
+ },
259
+ },
260
+ type: "function",
261
+ },
262
+ ],
263
+ range: {
264
+ end: {
265
+ byte: 43,
266
+ column: 43,
267
+ line: 0,
268
+ },
269
+ start: {
270
+ byte: 0,
271
+ column: 0,
272
+ line: 0,
273
+ },
274
+ },
275
+ type: "TemplateWrap",
276
+ };
277
+ describe("bindings for Terraform functions", () => {
278
+ it("should convert Terraform AST into TS AST", () => {
279
+ expect((0, testHelpers_1.astToCode)(terraformThingToTs(scope, dummy2, "dynamic"))).toMatchInlineSnapshot(`"Fn.replace(TodoReference-module-foo-output, "-", TodoReference-var-bar)"`);
280
+ });
281
+ it("should convert Terraform AST into TS AST for overriden function name", () => {
282
+ expect((0, testHelpers_1.astToCode)(terraformThingToTs(scope, {
283
+ type: "function",
284
+ meta: {
285
+ name: "length",
286
+ },
287
+ children: [
288
+ {
289
+ type: "ScopeTraversal",
290
+ meta: {
291
+ traversal: [
292
+ {
293
+ segment: "var",
294
+ },
295
+ {
296
+ segment: "list",
297
+ },
298
+ ],
299
+ },
300
+ children: [],
301
+ },
302
+ ],
303
+ }, "number"))).toMatchInlineSnapshot(`"Fn.lengthOf(TodoReference-var-list)"`);
304
+ });
305
+ it("should convert Terraform AST into TS AST for overriden function with variadic args for optional params", () => {
306
+ expect((0, testHelpers_1.astToCode)(terraformThingToTs(scope, {
307
+ type: "function",
308
+ meta: {
309
+ name: "bcrypt",
310
+ },
311
+ children: [
312
+ {
313
+ type: "ScopeTraversal",
314
+ meta: {
315
+ traversal: [
316
+ {
317
+ segment: "var",
318
+ },
319
+ {
320
+ segment: "str",
321
+ },
322
+ ],
323
+ },
324
+ children: [],
325
+ },
326
+ {
327
+ type: "ScopeTraversal",
328
+ meta: {
329
+ traversal: [
330
+ {
331
+ segment: "var",
332
+ },
333
+ {
334
+ segment: "cost",
335
+ },
336
+ ],
337
+ },
338
+ children: [],
339
+ },
340
+ ],
341
+ }, "string"))).toMatchInlineSnapshot(`"Fn.bcrypt(TodoReference-var-str, TodoReference-var-cost)"`);
342
+ });
343
+ it("should convert Terraform AST into TS AST for overriden function with variadic args for optional params that are not passed", () => {
344
+ expect((0, testHelpers_1.astToCode)(terraformThingToTs(scope, {
345
+ type: "function",
346
+ meta: {
347
+ name: "bcrypt",
348
+ },
349
+ children: [
350
+ {
351
+ type: "ScopeTraversal",
352
+ meta: {
353
+ traversal: [
354
+ {
355
+ segment: "var",
356
+ },
357
+ {
358
+ segment: "str",
359
+ },
360
+ ],
361
+ },
362
+ children: [],
363
+ },
364
+ ],
365
+ }, "string"))).toMatchInlineSnapshot(`"Fn.bcrypt(TodoReference-var-str)"`);
366
+ });
367
+ it("should convert Terraform AST into TS AST for function with variadic param", () => {
368
+ expect((0, testHelpers_1.astToCode)(terraformThingToTs(scope, {
369
+ type: "function",
370
+ meta: {
371
+ name: "try",
372
+ },
373
+ children: [
374
+ {
375
+ type: "ScopeTraversal",
376
+ meta: {
377
+ traversal: [
378
+ {
379
+ segment: "var",
380
+ },
381
+ {
382
+ segment: "strA",
383
+ },
384
+ ],
385
+ },
386
+ children: [],
387
+ },
388
+ {
389
+ type: "ScopeTraversal",
390
+ meta: {
391
+ traversal: [
392
+ {
393
+ segment: "var",
394
+ },
395
+ {
396
+ segment: "strB",
397
+ },
398
+ ],
399
+ },
400
+ children: [],
401
+ },
402
+ ],
403
+ }, "dynamic"))).toMatchInlineSnapshot(`"Fn.try([TodoReference-var-strA, TodoReference-var-strB])"`);
404
+ });
405
+ it("should convert Terraform AST into TS AST for join function with single list param", () => {
406
+ expect((0, testHelpers_1.astToCode)(terraformThingToTs(scope, {
407
+ type: "function",
408
+ meta: {
409
+ name: "join",
410
+ },
411
+ children: [
412
+ {
413
+ type: "ScopeTraversal",
414
+ meta: {
415
+ traversal: [
416
+ {
417
+ segment: "var",
418
+ },
419
+ {
420
+ segment: "str",
421
+ },
422
+ ],
423
+ },
424
+ children: [],
425
+ },
426
+ {
427
+ type: "ScopeTraversal",
428
+ meta: {
429
+ traversal: [
430
+ {
431
+ segment: "var",
432
+ },
433
+ {
434
+ segment: "list",
435
+ },
436
+ ],
437
+ },
438
+ children: [],
439
+ },
440
+ ],
441
+ }, "string"))).toMatchInlineSnapshot(`"Fn.join(TodoReference-var-str, TodoReference-var-list)"`);
442
+ });
443
+ it("should convert Terraform AST into TS AST for join function with multiple list params", () => {
444
+ expect((0, testHelpers_1.astToCode)(terraformThingToTs(scope, {
445
+ type: "function",
446
+ meta: {
447
+ name: "join",
448
+ },
449
+ children: [
450
+ {
451
+ type: "ScopeTraversal",
452
+ meta: {
453
+ traversal: [
454
+ {
455
+ segment: "var",
456
+ },
457
+ {
458
+ segment: "str",
459
+ },
460
+ ],
461
+ },
462
+ children: [],
463
+ },
464
+ {
465
+ type: "ScopeTraversal",
466
+ meta: {
467
+ traversal: [
468
+ {
469
+ segment: "var",
470
+ },
471
+ {
472
+ segment: "listA",
473
+ },
474
+ ],
475
+ },
476
+ children: [],
477
+ },
478
+ {
479
+ type: "ScopeTraversal",
480
+ meta: {
481
+ traversal: [
482
+ {
483
+ segment: "var",
484
+ },
485
+ {
486
+ segment: "listB",
487
+ },
488
+ ],
489
+ },
490
+ children: [],
491
+ },
492
+ ],
493
+ }, "string"))).toMatchInlineSnapshot(`"Fn.join(TodoReference-var-str, Token.asList(Fn.concat([TodoReference-var-listA, TodoReference-var-listB])))"`);
494
+ });
495
+ it("should throw if not enough parameters were passed", () => {
496
+ expect(() => (0, testHelpers_1.astToCode)(terraformThingToTs(scope, {
497
+ type: "function",
498
+ meta: {
499
+ name: "bcrypt",
500
+ },
501
+ children: [],
502
+ }, "string"))).toThrowErrorMatchingInlineSnapshot(`"Terraform function call to "bcrypt" is not valid! Parameter at index 0 of type string is not optional but received no value. The following parameters were passed: []"`);
503
+ });
504
+ // TODO: tests for type coercion
505
+ });
506
+ function terraformThingToTs(scope, tfAst, targetType) {
507
+ switch (tfAst.type) {
508
+ case "function": {
509
+ return terraformFunctionCallToTs(scope, tfAst, targetType);
510
+ }
511
+ case "TemplateWrap": {
512
+ // If there's just one child, we can skip them
513
+ if (tfAst.children.length === 1) {
514
+ return terraformThingToTs(scope, tfAst.children[0], targetType);
515
+ }
516
+ throw new Error("TemplateWrap with not exactly one child is not supported yet: " +
517
+ tfAst.children);
518
+ }
519
+ case "ScopeTraversal": {
520
+ return terraformScopeTraversalToTs(tfAst, targetType);
521
+ }
522
+ case "Template": {
523
+ return terraformTemplateToTs(scope, tfAst, targetType);
524
+ }
525
+ case "LiteralValue": {
526
+ return terraformLiteralValueToTs(tfAst, targetType);
527
+ }
528
+ default:
529
+ throw new Error("Unsupported type: " + tfAst.type);
530
+ }
531
+ }
532
+ function terraformScopeTraversalToTs(tfAst, _targetType) {
533
+ return t.identifier("TodoReference-" + tfAst.meta.traversal.map((t) => t.segment).join("-"));
534
+ }
535
+ function terraformTemplateToTs(scope, tfAst, targetType) {
536
+ if (tfAst.children.length === 1) {
537
+ return terraformThingToTs(scope, tfAst.children[0], targetType);
538
+ }
539
+ throw new Error("Template currently only supports exactly one child");
540
+ }
541
+ function terraformLiteralValueToTs(tfAst, targetType) {
542
+ const literalExpression = t.stringLiteral(tfAst.meta.value);
543
+ return (0, coerceType_1.coerceType)(
544
+ // TODO: scope should be passed instead, even if coerceType won't need it probably
545
+ {
546
+ constructs: new Set(),
547
+ hasTokenBasedTypeCoercion: false,
548
+ providerGenerator: {},
549
+ providerSchema: {},
550
+ variables: {},
551
+ nodeIds: [],
552
+ importables: [],
553
+ topLevelConfig: {},
554
+ }, literalExpression, tfAst.meta.type, targetType);
555
+ }
556
+ function terraformFunctionCallToTs(scope, tfAst, targetType) {
557
+ const { name } = tfAst.meta;
558
+ const mapping = functions_1.functionsMap[name];
559
+ if (!mapping) {
560
+ throw new Error(`Mapping not found for function: ${name}`);
561
+ }
562
+ if (mapping.transformer) {
563
+ const newTfAst = mapping.transformer(tfAst);
564
+ if (newTfAst !== tfAst)
565
+ return terraformFunctionCallToTs(scope, newTfAst, targetType);
566
+ }
567
+ scope.importables.push({
568
+ constructName: "Fn",
569
+ provider: "cdktn",
570
+ });
571
+ const callee = t.memberExpression(t.identifier("Fn"), t.identifier(mapping.name));
572
+ const args = [];
573
+ mapping.parameters.forEach((param, idx) => {
574
+ if (param.variadic) {
575
+ // return an array with all remaining children (each mapped accordingly)
576
+ args.push(t.arrayExpression(tfAst.children
577
+ .slice(idx)
578
+ .map((child) => terraformThingToTs(scope, child, param.type))));
579
+ }
580
+ else {
581
+ const child = tfAst.children[idx];
582
+ if (child) {
583
+ args.push(terraformThingToTs(scope, child, param.type));
584
+ }
585
+ else if (!param.optional) {
586
+ throw new Error(`Terraform function call to "${name}" is not valid! Parameter at index ${idx} of type ${param.type} is not optional but received no value. The following parameters were passed: ${JSON.stringify(tfAst.children)}`);
587
+ }
588
+ }
589
+ });
590
+ const returnType = mapping.returnType;
591
+ const callExpression = t.callExpression(callee, args);
592
+ return (0, coerceType_1.coerceType)(
593
+ // TODO: scope should be passed instead, even if coerceType won't need it probably
594
+ {
595
+ constructs: new Set(),
596
+ hasTokenBasedTypeCoercion: false,
597
+ providerGenerator: {},
598
+ providerSchema: {},
599
+ variables: {},
600
+ nodeIds: [],
601
+ importables: [],
602
+ topLevelConfig: {},
603
+ }, callExpression, returnType, targetType);
604
+ }
605
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb25zLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL2Z1bmN0aW9ucy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCxnREFBa0M7QUFFbEMsOENBQTJDO0FBQzNDLDhEQUE4RDtBQUU5RCwrQ0FBMEM7QUE4QzFDLE1BQU0sS0FBSyxHQUFpQjtJQUMxQixjQUFjLEVBQUUsRUFBRTtJQUNsQixpQkFBaUIsRUFBRSxFQUFFO0lBQ3JCLFVBQVUsRUFBRSxJQUFJLEdBQUcsRUFBRTtJQUNyQixTQUFTLEVBQUUsRUFBRTtJQUNiLHlCQUF5QixFQUFFLEtBQUs7SUFDaEMsT0FBTyxFQUFFLEVBQUU7SUFDWCxXQUFXLEVBQUUsRUFBRTtJQUNmLGNBQWMsRUFBRSxFQUFFO0NBQ25CLENBQUM7QUFTRixnREFBZ0Q7QUFDaEQsNERBQTREO0FBQzVELE1BQU0sTUFBTSxHQUFVO0lBQ3BCLFFBQVEsRUFBRTtRQUNSO1lBQ0UsUUFBUSxFQUFFO2dCQUNSO29CQUNFLFFBQVEsRUFBRSxFQUFFO29CQUNaLElBQUksRUFBRTt3QkFDSixTQUFTLEVBQUU7NEJBQ1Q7Z0NBQ0UsS0FBSyxFQUFFO29DQUNMLEdBQUcsRUFBRTt3Q0FDSCxJQUFJLEVBQUUsRUFBRTt3Q0FDUixNQUFNLEVBQUUsRUFBRTt3Q0FDVixJQUFJLEVBQUUsQ0FBQztxQ0FDUjtvQ0FDRCxRQUFRLEVBQUUsRUFBRTtvQ0FDWixLQUFLLEVBQUU7d0NBQ0wsSUFBSSxFQUFFLEVBQUU7d0NBQ1IsTUFBTSxFQUFFLEVBQUU7d0NBQ1YsSUFBSSxFQUFFLENBQUM7cUNBQ1I7aUNBQ0Y7Z0NBQ0QsT0FBTyxFQUFFLFFBQVE7NkJBQ2xCOzRCQUNEO2dDQUNFLEtBQUssRUFBRTtvQ0FDTCxHQUFHLEVBQUU7d0NBQ0gsSUFBSSxFQUFFLEVBQUU7d0NBQ1IsTUFBTSxFQUFFLEVBQUU7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Q0FBQztpQkFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUMzQixNQUFNLElBQUksS0FBSyxDQUNiLCtCQUErQixJQUFJLHNDQUFzQyxHQUFHLFlBQzFFLEtBQUssQ0FBQyxJQUNSLGlGQUFpRixJQUFJLENBQUMsU0FBUyxDQUM3RixLQUFLLENBQUMsUUFBUSxDQUNmLEVBQUUsQ0FDSixDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUM7SUFFdEMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFFdEQsT0FBTyxJQUFBLHVCQUFVO0lBQ2Ysa0ZBQWtGO0lBQ2xGO1FBQ0UsVUFBVSxFQUFFLElBQUksR0FBRyxFQUFFO1FBQ3JCLHlCQUF5QixFQUFFLEtBQUs7UUFDaEMsaUJBQWlCLEVBQUUsRUFBRTtRQUNyQixjQUFjLEVBQUUsRUFBRTtRQUNsQixTQUFTLEVBQUUsRUFBRTtRQUNiLE9BQU8sRUFBRSxFQUFFO1FBQ1gsV0FBVyxFQUFFLEVBQUU7UUFDZixjQUFjLEVBQUUsRUFBRTtLQUNuQixFQUNELGNBQWMsRUFDZCxVQUFVLEVBQ1YsVUFBVSxDQUNYLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIEhhc2hpQ29ycCwgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbiAqL1xuXG5pbXBvcnQgKiBhcyB0IGZyb20gXCJAYmFiZWwvdHlwZXNcIjtcbmltcG9ydCB7IEF0dHJpYnV0ZVR5cGUgfSBmcm9tIFwiQGNka3RuL2NvbW1vbnNcIjtcbmltcG9ydCB7IGNvZXJjZVR5cGUgfSBmcm9tIFwiLi4vY29lcmNlVHlwZVwiO1xuaW1wb3J0IHsgZnVuY3Rpb25zTWFwIH0gZnJvbSBcIi4uL2Z1bmN0aW9uLWJpbmRpbmdzL2Z1bmN0aW9uc1wiO1xuaW1wb3J0IHsgUHJvZ3JhbVNjb3BlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBhc3RUb0NvZGUgfSBmcm9tIFwiLi90ZXN0SGVscGVyc1wiO1xuXG50eXBlIEJhc2VUaGluZyA9IHtcbiAgdHlwZTogc3RyaW5nO1xuICBjaGlsZHJlbjogVGhpbmdbXTtcbiAgbWV0YT86IG9iamVjdDtcbiAgcmFuZ2U/OiB1bmtub3duOyAvLyBvcHRpb25hbCBhcyB3ZSBkb24ndCBjYXJlIGFib3V0IGl0XG59O1xuXG50eXBlIEZ1bmN0aW9uQ2FsbCA9IEJhc2VUaGluZyAmIHtcbiAgdHlwZTogXCJmdW5jdGlvblwiO1xuICBtZXRhOiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGV4cGFuZGVkRmluYWxBcmd1bWVudD86IGJvb2xlYW47IC8vIG9wdGlvbmFsIGFzIHdlIGRvbid0IGNhcmUgYWJvdXQgaXRcbiAgICBjbG9zZVBhcmVuUmFuZ2U/OiB1bmtub3duOyAvLyBvcHRpb25hbCBhcyB3ZSBkb24ndCBjYXJlIGFib3V0IGl0XG4gICAgb3BlblBhcmVuUmFuZ2U/OiB1bmtub3duOyAvLyBvcHRpb25hbCBhcyB3ZSBkb24ndCBjYXJlIGFib3V0IGl0XG4gICAgbmFtZVJhbmdlPzogdW5rbm93bjsgLy8gb3B0aW9uYWwgYXMgd2UgZG9uJ3QgY2FyZSBhYm91dCBpdFxuICB9O1xufTtcblxudHlwZSBUZW1wbGF0ZVdyYXAgPSBCYXNlVGhpbmcgJiB7XG4gIHR5cGU6IFwiVGVtcGxhdGVXcmFwXCI7XG59O1xuXG50eXBlIFRlbXBsYXRlID0gQmFzZVRoaW5nICYge1xuICB0eXBlOiBcIlRlbXBsYXRlXCI7XG59O1xuXG50eXBlIExpdGVyYWxWYWx1ZSA9IEJhc2VUaGluZyAmIHtcbiAgdHlwZTogXCJMaXRlcmFsVmFsdWVcIjtcbiAgbWV0YToge1xuICAgIHR5cGU6IFwic3RyaW5nXCI7XG4gICAgdmFsdWU6IHN0cmluZzsgLy8gdGhpcyBpcyBhdmFpbGFibGUgaW4gb3RoZXIgXCJUaGluZ3NcIiB0b28gYnV0IHdlIG9ubHkgbmVlZCBpdCBoZXJlIHlldFxuICB9O1xufTtcblxudHlwZSBTY29wZVRyYXZlcnNhbCA9IEJhc2VUaGluZyAmIHtcbiAgdHlwZTogXCJTY29wZVRyYXZlcnNhbFwiO1xuICBtZXRhOiB7XG4gICAgdHJhdmVyc2FsOiB7XG4gICAgICBzZWdtZW50OiBzdHJpbmc7XG4gICAgICByYW5nZT86IHVua25vd247IC8vIG9wdGlvbmFsIGFzIHdlIGRvbid0IGNhcmUgYWJvdXQgaXRcbiAgICB9W107XG4gIH07XG59O1xuXG5jb25zdCBzY29wZTogUHJvZ3JhbVNjb3BlID0ge1xuICBwcm92aWRlclNjaGVtYToge30sXG4gIHByb3ZpZGVyR2VuZXJhdG9yOiB7fSxcbiAgY29uc3RydWN0czogbmV3IFNldCgpLFxuICB2YXJpYWJsZXM6IHt9LFxuICBoYXNUb2tlbkJhc2VkVHlwZUNvZXJjaW9uOiBmYWxzZSxcbiAgbm9kZUlkczogW10sXG4gIGltcG9ydGFibGVzOiBbXSxcbiAgdG9wTGV2ZWxDb25maWc6IHt9LFxufTtcblxudHlwZSBUaGluZyA9XG4gIHwgRnVuY3Rpb25DYWxsXG4gIHwgVGVtcGxhdGVXcmFwXG4gIHwgVGVtcGxhdGVcbiAgfCBTY29wZVRyYXZlcnNhbFxuICB8IExpdGVyYWxWYWx1ZTtcblxuLy8gJyR7cmVwbGFjZShtb2R1bGUuZm9vLm91dHB1dCwgXCItXCIsIHZhci5iYXIpfSdcbi8vIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2hhc2hpY29ycC90ZXJyYWZvcm0tY2RrL3B1bGwvMjcyOVxuY29uc3QgZHVtbXkyOiBUaGluZyA9IHtcbiAgY2hpbGRyZW46IFtcbiAgICB7XG4gICAgICBjaGlsZHJlbjogW1xuICAgICAgICB7XG4gICAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgIHRyYXZlcnNhbDogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmFuZ2U6IHtcbiAgICAgICAgICAgICAgICAgIEVuZDoge1xuICAgICAgICAgICAgICAgICAgICBCeXRlOiAxNixcbiAgICAgICAgICAgICAgICAgICAgQ29sdW1uOiAxNixcbiAgICAgICAgICAgICAgICAgICAgTGluZTogMCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBGaWxlbmFtZTogXCJcIixcbiAgICAgICAgICAgICAgICAgIFN0YXJ0OiB7XG4gICAgICAgICAgICAgICAgICAgIEJ5dGU6IDEwLFxuICAgICAgICAgICAgICAgICAgICBDb2x1bW46IDEwLFxuICAgICAgICAgICAgICAgICAgICBMaW5lOiAwLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNlZ21lbnQ6IFwibW9kdWxlXCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByYW5nZToge1xuICAgICAgICAgICAgICAgICAgRW5kOiB7XG4gICAgICAgICAgICAgICAgICAgIEJ5dGU6IDIwLFxuICAgICAgICAgICAgICAgICAgICBDb2x1bW46IDIwLFxuICAgICAgICAgICAgICAgICAgICBMaW5lOiAwLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIEZpbGVuYW1lOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgU3RhcnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgQnl0ZTogMTYsXG4gICAgICAgICAgICAgICAgICAgIENvbHVtbjogMTYsXG4gICAgICAgICAgICAgICAgICAgIExpbmU6IDAsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2VnbWVudDogXCJmb29cIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJhbmdlOiB7XG4gICAgICAgICAgICAgICAgICBFbmQ6IHtcbiAgICAgICAgICAgICAgICAgICAgQnl0ZTogMjcsXG4gICAgICAgICAgICAgICAgICAgIENvbHVtbjogMjcsXG4gICAgICAgICAgICAgICAgICAgIExpbmU6IDAsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgRmlsZW5hbWU6IFwiXCIsXG4gICAgICAgICAgICAgICAgICBTdGFydDoge1xuICAgICAgICAgICAgICAgICAgICBCeXRlOiAyMCxcbiAgICAgICAgICAgICAgICAgICAgQ29sdW1uOiAyMCxcbiAgICAgICAgICAgICAgICAgICAgTGluZTogMCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZWdtZW50OiBcIm91dHB1dFwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJhbmdlOiB7XG4gICAgICAgICAgICBlbmQ6IHtcbiAgICAgICAgICAgICAgYnl0ZTogMjcsXG4gICAgICAgICAgICAgIGNvbHVtbjogMjcsXG4gICAgICAgICAgICAgIGxpbmU6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3RhcnQ6IHtcbiAgICAgICAgICAgICAgYnl0ZTogMTAsXG4gICAgICAgICAgICAgIGNvbHVtbjogMTAsXG4gICAgICAgICAgICAgIGxpbmU6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHlwZTogXCJTY29wZVRyYXZlcnNhbFwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogXCItXCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHJhbmdlOiB7XG4gICAgICAgICAgICAgICAgZW5kOiB7XG4gICAgICAgICAgICAgICAgICBieXRlOiAzMSxcbiAgICAgICAgICAgICAgICAgIGNvbHVtbjogMzEsXG4gICAgICAgICAgICAgICAgICBsaW5lOiAwLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc3RhcnQ6IHtcbiAgICAgICAgICAgICAgICAgIGJ5dGU6IDMwLFxuICAgICAgICAgICAgICAgICAgY29sdW1uOiAzMCxcbiAgICAgICAgICAgICAgICAgIGxpbmU6IDAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdHlwZTogXCJMaXRlcmFsVmFsdWVcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICByYW5nZToge1xuICAgICAgICAgICAgZW5kOiB7XG4gICAgICAgICAgICAgIGJ5dGU6IDMxLFxuICAgICAgICAgICAgICBjb2x1bW46IDMxLFxuICAgICAgICAgICAgICBsaW5lOiAwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0YXJ0OiB7XG4gICAgICAgICAgICAgIGJ5dGU6IDMwLFxuICAgICAgICAgICAgICBjb2x1bW46IDMwLFxuICAgICAgICAgICAgICBsaW5lOiAwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHR5cGU6IFwiVGVtcGxhdGVcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICB0cmF2ZXJzYWw6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJhbmdlOiB7XG4gICAgICAgICAgICAgICAgICBFbmQ6IHtcbiAgICAgICAgICAgICAgICAgICAgQnl0ZTogMzcsXG4gICAgICAgICAgICAgICAgICAgIENvbHVtbjogMzcsXG4gICAgICAgICAgICAgICAgICAgIExpbmU6IDAsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgRmlsZW5hbWU6IFwiXCIsXG4gICAgICAgICAgICAgICAgICBTdGFydDoge1xuICAgICAgICAgICAgICAgICAgICBCeXRlOiAzNCxcbiAgICAgICAgICAgICAgICAgICAgQ29sdW1uOiAzNCxcbiAgICAgICAgICAgICAgICAgICAgTGluZTogMCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZWdtZW50OiBcInZhclwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmFuZ2U6IHtcbiAgICAgICAgICAgICAgICAgIEVuZDoge1xuICAgICAgICAgICAgICAgICAgICBCeXRlOiA0MSxcbiAgICAgICAgICAgICAgICAgICAgQ29sdW1uOiA0MSxcbiAgICAgICAgICAgICAgICAgICAgTGluZTogMCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBGaWxlbmFtZTogXCJcIixcbiAgICAgICAgICAgICAgICAgIFN0YXJ0OiB7XG4gICAgICAgICAgICAgICAgICAgIEJ5dGU6IDM3LFxuICAgICAgICAgICAgICAgICAgICBDb2x1bW46IDM3LFxuICAgICAgICAgICAgICAgICAgICBMaW5lOiAwLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNlZ21lbnQ6IFwiYmFyXCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmFuZ2U6IHtcbiAgICAgICAgICAgIGVuZDoge1xuICAgICAgICAgICAgICBieXRlOiA0MSxcbiAgICAgICAgICAgICAgY29sdW1uOiA0MSxcbiAgICAgICAgICAgICAgbGluZTogMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdGFydDoge1xuICAgICAgICAgICAgICBieXRlOiAzNCxcbiAgICAgICAgICAgICAgY29sdW1uOiAzNCxcbiAgICAgICAgICAgICAgbGluZTogMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0eXBlOiBcIlNjb3BlVHJhdmVyc2FsXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgbWV0YToge1xuICAgICAgICBjbG9zZVBhcmVuUmFuZ2U6IHtcbiAgICAgICAgICBlbmQ6IHtcbiAgICAgICAgICAgIGJ5dGU6IDQyLFxuICAgICAgICAgICAgY29sdW1uOiA0MixcbiAgICAgICAgICAgIGxpbmU6IDAsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGFydDoge1xuICAgICAgICAgICAgYnl0ZTogNDEsXG4gICAgICAgICAgICBjb2x1bW46IDQxLFxuICAgICAgICAgICAgbGluZTogMCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBleHBhbmRlZEZpbmFsQXJndW1lbnQ6IGZhbHNlLFxuICAgICAgICBuYW1lOiBcInJlcGxhY2VcIixcbiAgICAgICAgbmFtZVJhbmdlOiB7XG4gICAgICAgICAgZW5kOiB7XG4gICAgICAgICAgICBieXRlOiA5LFxuICAgICAgICAgICAgY29sdW1uOiA5LFxuICAgICAgICAgICAgbGluZTogMCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0YXJ0OiB7XG4gICAgICAgICAgICBieXRlOiAyLFxuICAgICAgICAgICAgY29sdW1uOiAyLFxuICAgICAgICAgICAgbGluZTogMCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBvcGVuUGFyZW5SYW5nZToge1xuICAgICAgICAgIGVuZDoge1xuICAgICAgICAgICAgYnl0ZTogMTAsXG4gICAgICAgICAgICBjb2x1bW46IDEwLFxuICAgICAgICAgICAgbGluZTogMCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0YXJ0OiB7XG4gICAgICAgICAgICBieXRlOiA5LFxuICAgICAgICAgICAgY29sdW1uOiA5LFxuICAgICAgICAgICAgbGluZTogMCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHJhbmdlOiB7XG4gICAgICAgIGVuZDoge1xuICAgICAgICAgIGJ5dGU6IDEwLFxuICAgICAgICAgIGNvbHVtbjogMTAsXG4gICAgICAgICAgbGluZTogMCxcbiAgICAgICAgfSxcbiAgICAgICAgc3RhcnQ6IHtcbiAgICAgICAgICBieXRlOiAyLFxuICAgICAgICAgIGNvbHVtbjogMixcbiAgICAgICAgICBsaW5lOiAwLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICB9LFxuICBdLFxuICByYW5nZToge1xuICAgIGVuZDoge1xuICAgICAgYnl0ZTogNDMsXG4gICAgICBjb2x1bW46IDQzLFxuICAgICAgbGluZTogMCxcbiAgICB9LFxuICAgIHN0YXJ0OiB7XG4gICAgICBieXRlOiAwLFxuICAgICAgY29sdW1uOiAwLFxuICAgICAgbGluZTogMCxcbiAgICB9LFxuICB9LFxuICB0eXBlOiBcIlRlbXBsYXRlV3JhcFwiLFxufTtcblxuZGVzY3JpYmUoXCJiaW5kaW5ncyBmb3IgVGVycmFmb3JtIGZ1bmN0aW9uc1wiLCAoKSA9PiB7XG4gIGl0KFwic2hvdWxkIGNvbnZlcnQgVGVycmFmb3JtIEFTVCBpbnRvIFRTIEFTVFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KFxuICAgICAgYXN0VG9Db2RlKHRlcnJhZm9ybVRoaW5nVG9UcyhzY29wZSwgZHVtbXkyLCBcImR5bmFtaWNcIikpLFxuICAgICkudG9NYXRjaElubGluZVNuYXBzaG90KFxuICAgICAgYFwiRm4ucmVwbGFjZShUb2RvUmVmZXJlbmNlLW1vZHVsZS1mb28tb3V0cHV0LCBcIi1cIiwgVG9kb1JlZmVyZW5jZS12YXItYmFyKVwiYCxcbiAgICApO1xuICB9KTtcblxuICBpdChcInNob3VsZCBjb252ZXJ0IFRlcnJhZm9ybSBBU1QgaW50byBUUyBBU1QgZm9yIG92ZXJyaWRlbiBmdW5jdGlvbiBuYW1lXCIsICgpID0+IHtcbiAgICBleHBlY3QoXG4gICAgICBhc3RUb0NvZGUoXG4gICAgICAgIHRlcnJhZm9ybVRoaW5nVG9UcyhcbiAgICAgICAgICBzY29wZSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcImZ1bmN0aW9uXCIsXG4gICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgIG5hbWU6IFwibGVuZ3RoXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiU2NvcGVUcmF2ZXJzYWxcIixcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICB0cmF2ZXJzYWw6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQ6IFwidmFyXCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50OiBcImxpc3RcIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJudW1iZXJcIixcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKS50b01hdGNoSW5saW5lU25hcHNob3QoYFwiRm4ubGVuZ3RoT2YoVG9kb1JlZmVyZW5jZS12YXItbGlzdClcImApO1xuICB9KTtcblxuICBpdChcInNob3VsZCBjb252ZXJ0IFRlcnJhZm9ybSBBU1QgaW50byBUUyBBU1QgZm9yIG92ZXJyaWRlbiBmdW5jdGlvbiB3aXRoIHZhcmlhZGljIGFyZ3MgZm9yIG9wdGlvbmFsIHBhcmFtc1wiLCAoKSA9PiB7XG4gICAgZXhwZWN0KFxuICAgICAgYXN0VG9Db2RlKFxuICAgICAgICB0ZXJyYWZvcm1UaGluZ1RvVHMoXG4gICAgICAgICAgc2NvcGUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJmdW5jdGlvblwiLFxuICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICBuYW1lOiBcImJjcnlwdFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIlNjb3BlVHJhdmVyc2FsXCIsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgdHJhdmVyc2FsOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50OiBcInZhclwiLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgc2VnbWVudDogXCJzdHJcIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIlNjb3BlVHJhdmVyc2FsXCIsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgdHJhdmVyc2FsOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50OiBcInZhclwiLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgc2VnbWVudDogXCJjb3N0XCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic3RyaW5nXCIsXG4gICAgICAgICksXG4gICAgICApLFxuICAgICkudG9NYXRjaElubGluZVNuYXBzaG90KFxuICAgICAgYFwiRm4uYmNyeXB0KFRvZG9SZWZlcmVuY2UtdmFyLXN0ciwgVG9kb1JlZmVyZW5jZS12YXItY29zdClcImAsXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJzaG91bGQgY29udmVydCBUZXJyYWZvcm0gQVNUIGludG8gVFMgQVNUIGZvciBvdmVycmlkZW4gZnVuY3Rpb24gd2l0aCB2YXJpYWRpYyBhcmdzIGZvciBvcHRpb25hbCBwYXJhbXMgdGhhdCBhcmUgbm90IHBhc3NlZFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KFxuICAgICAgYXN0VG9Db2RlKFxuICAgICAgICB0ZXJyYWZvcm1UaGluZ1RvVHMoXG4gICAgICAgICAgc2NvcGUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJmdW5jdGlvblwiLFxuICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICBuYW1lOiBcImJjcnlwdFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIlNjb3BlVHJhdmVyc2FsXCIsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgdHJhdmVyc2FsOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50OiBcInZhclwiLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgc2VnbWVudDogXCJzdHJcIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJzdHJpbmdcIixcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKS50b01hdGNoSW5saW5lU25hcHNob3QoYFwiRm4uYmNyeXB0KFRvZG9SZWZlcmVuY2UtdmFyLXN0cilcImApO1xuICB9KTtcblxuICBpdChcInNob3VsZCBjb252ZXJ0IFRlcnJhZm9ybSBBU1QgaW50byBUUyBBU1QgZm9yIGZ1bmN0aW9uIHdpdGggdmFyaWFkaWMgcGFyYW1cIiwgKCkgPT4ge1xuICAgIGV4cGVjdChcbiAgICAgIGFzdFRvQ29kZShcbiAgICAgICAgdGVycmFmb3JtVGhpbmdUb1RzKFxuICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgbmFtZTogXCJ0cnlcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJTY29wZVRyYXZlcnNhbFwiLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgIHRyYXZlcnNhbDogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgc2VnbWVudDogXCJ2YXJcIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQ6IFwic3RyQVwiLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiU2NvcGVUcmF2ZXJzYWxcIixcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICB0cmF2ZXJzYWw6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQ6IFwidmFyXCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50OiBcInN0ckJcIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJkeW5hbWljXCIsXG4gICAgICAgICksXG4gICAgICApLFxuICAgICkudG9NYXRjaElubGluZVNuYXBzaG90KFxuICAgICAgYFwiRm4udHJ5KFtUb2RvUmVmZXJlbmNlLXZhci1zdHJBLCBUb2RvUmVmZXJlbmNlLXZhci1zdHJCXSlcImAsXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJzaG91bGQgY29udmVydCBUZXJyYWZvcm0gQVNUIGludG8gVFMgQVNUIGZvciBqb2luIGZ1bmN0aW9uIHdpdGggc2luZ2xlIGxpc3QgcGFyYW1cIiwgKCkgPT4ge1xuICAgIGV4cGVjdChcbiAgICAgIGFzdFRvQ29kZShcbiAgICAgICAgdGVycmFmb3JtVGhpbmdUb1RzKFxuICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgbmFtZTogXCJqb2luXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiU2NvcGVUcmF2ZXJzYWxcIixcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICB0cmF2ZXJzYWw6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQ6IFwidmFyXCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50OiBcInN0clwiLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiU2NvcGVUcmF2ZXJzYWxcIixcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICB0cmF2ZXJzYWw6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQ6IFwidmFyXCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50OiBcImxpc3RcIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJzdHJpbmdcIixcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKS50b01hdGNoSW5saW5lU25hcHNob3QoXG4gICAgICBgXCJGbi5qb2luKFRvZG9SZWZlcmVuY2UtdmFyLXN0ciwgVG9kb1JlZmVyZW5jZS12YXItbGlzdClcImAsXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJzaG91bGQgY29udmVydCBUZXJyYWZvcm0gQVNUIGludG8gVFMgQVNUIGZvciBqb2luIGZ1bmN0aW9uIHdpdGggbXVsdGlwbGUgbGlzdCBwYXJhbXNcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChcbiAgICAgIGFzdFRvQ29kZShcbiAgICAgICAgdGVycmFmb3JtVGhpbmdUb1RzKFxuICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgbmFtZTogXCJqb2luXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiU2NvcGVUcmF2ZXJzYWxcIixcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICB0cmF2ZXJzYWw6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQ6IFwidmFyXCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50OiBcInN0clwiLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiU2NvcGVUcmF2ZXJzYWxcIixcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICB0cmF2ZXJzYWw6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQ6IFwidmFyXCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50OiBcImxpc3RBXCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJTY29wZVRyYXZlcnNhbFwiLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgIHRyYXZlcnNhbDogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgc2VnbWVudDogXCJ2YXJcIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQ6IFwibGlzdEJcIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJzdHJpbmdcIixcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKS50b01hdGNoSW5saW5lU25hcHNob3QoXG4gICAgICBgXCJGbi5qb2luKFRvZG9SZWZlcmVuY2UtdmFyLXN0ciwgVG9rZW4uYXNMaXN0KEZuLmNvbmNhdChbVG9kb1JlZmVyZW5jZS12YXItbGlzdEEsIFRvZG9SZWZlcmVuY2UtdmFyLWxpc3RCXSkpKVwiYCxcbiAgICApO1xuICB9KTtcblxuICBpdChcInNob3VsZCB0aHJvdyBpZiBub3QgZW5vdWdoIHBhcmFtZXRlcnMgd2VyZSBwYXNzZWRcIiwgKCkgPT4ge1xuICAgIGV4cGVjdCgoKSA9PlxuICAgICAgYXN0VG9Db2RlKFxuICAgICAgICB0ZXJyYWZvcm1UaGluZ1RvVHMoXG4gICAgICAgICAgc2NvcGUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJmdW5jdGlvblwiLFxuICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICBuYW1lOiBcImJjcnlwdFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic3RyaW5nXCIsXG4gICAgICAgICksXG4gICAgICApLFxuICAgICkudG9UaHJvd0Vycm9yTWF0Y2hpbmdJbmxpbmVTbmFwc2hvdChcbiAgICAgIGBcIlRlcnJhZm9ybSBmdW5jdGlvbiBjYWxsIHRvIFwiYmNyeXB0XCIgaXMgbm90IHZhbGlkISBQYXJhbWV0ZXIgYXQgaW5kZXggMCBvZiB0eXBlIHN0cmluZyBpcyBub3Qgb3B0aW9uYWwgYnV0IHJlY2VpdmVkIG5vIHZhbHVlLiBUaGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgd2VyZSBwYXNzZWQ6IFtdXCJgLFxuICAgICk7XG4gIH0pO1xuXG4gIC8vIFRPRE86IHRlc3RzIGZvciB0eXBlIGNvZXJjaW9uXG59KTtcblxuZnVuY3Rpb24gdGVycmFmb3JtVGhpbmdUb1RzKFxuICBzY29wZTogUHJvZ3JhbVNjb3BlLFxuICB0ZkFzdDogVGhpbmcsXG4gIHRhcmdldFR5cGU6IEF0dHJpYnV0ZVR5cGUgfCB1bmRlZmluZWQsXG4pOiB0LkV4cHJlc3Npb24ge1xuICBzd2l0Y2ggKHRmQXN0LnR5cGUpIHtcbiAgICBjYXNlIFwiZnVuY3Rpb25cIjoge1xuICAgICAgcmV0dXJuIHRlcnJhZm9ybUZ1bmN0aW9uQ2FsbFRvVHMoc2NvcGUsIHRmQXN0LCB0YXJnZXRUeXBlKTtcbiAgICB9XG4gICAgY2FzZSBcIlRlbXBsYXRlV3JhcFwiOiB7XG4gICAgICAvLyBJZiB0aGVyZSdzIGp1c3Qgb25lIGNoaWxkLCB3ZSBjYW4gc2tpcCB0aGVtXG4gICAgICBpZiAodGZBc3QuY2hpbGRyZW4ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiB0ZXJyYWZvcm1UaGluZ1RvVHMoc2NvcGUsIHRmQXN0LmNoaWxkcmVuWzBdLCB0YXJnZXRUeXBlKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJUZW1wbGF0ZVdyYXAgd2l0aCBub3QgZXhhY3RseSBvbmUgY2hpbGQgaXMgbm90IHN1cHBvcnRlZCB5ZXQ6IFwiICtcbiAgICAgICAgICB0ZkFzdC5jaGlsZHJlbixcbiAgICAgICk7XG4gICAgfVxuICAgIGNhc2UgXCJTY29wZVRyYXZlcnNhbFwiOiB7XG4gICAgICByZXR1cm4gdGVycmFmb3JtU2NvcGVUcmF2ZXJzYWxUb1RzKHRmQXN0LCB0YXJnZXRUeXBlKTtcbiAgICB9XG4gICAgY2FzZSBcIlRlbXBsYXRlXCI6IHtcbiAgICAgIHJldHVybiB0ZXJyYWZvcm1UZW1wbGF0ZVRvVHMoc2NvcGUsIHRmQXN0LCB0YXJnZXRUeXBlKTtcbiAgICB9XG4gICAgY2FzZSBcIkxpdGVyYWxWYWx1ZVwiOiB7XG4gICAgICByZXR1cm4gdGVycmFmb3JtTGl0ZXJhbFZhbHVlVG9Ucyh0ZkFzdCwgdGFyZ2V0VHlwZSk7XG4gICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCB0eXBlOiBcIiArICh0ZkFzdCBhcyBhbnkpLnR5cGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRlcnJhZm9ybVNjb3BlVHJhdmVyc2FsVG9UcyhcbiAgdGZBc3Q6IFNjb3BlVHJhdmVyc2FsLFxuICBfdGFyZ2V0VHlwZTogQXR0cmlidXRlVHlwZSB8IHVuZGVmaW5lZCxcbik6IHQuRXhwcmVzc2lvbiB7XG4gIHJldHVybiB0LmlkZW50aWZpZXIoXG4gICAgXCJUb2RvUmVmZXJlbmNlLVwiICsgdGZBc3QubWV0YS50cmF2ZXJzYWwubWFwKCh0KSA9PiB0LnNlZ21lbnQpLmpvaW4oXCItXCIpLFxuICApO1xufVxuXG5mdW5jdGlvbiB0ZXJyYWZvcm1UZW1wbGF0ZVRvVHMoXG4gIHNjb3BlOiBQcm9ncmFtU2NvcGUsXG4gIHRmQXN0OiBUZW1wbGF0ZSxcbiAgdGFyZ2V0VHlwZTogQXR0cmlidXRlVHlwZSB8IHVuZGVmaW5lZCxcbik6IHQuRXhwcmVzc2lvbiB7XG4gIGlmICh0ZkFzdC5jaGlsZHJlbi5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gdGVycmFmb3JtVGhpbmdUb1RzKHNjb3BlLCB0ZkFzdC5jaGlsZHJlblswXSwgdGFyZ2V0VHlwZSk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFwiVGVtcGxhdGUgY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgZXhhY3RseSBvbmUgY2hpbGRcIik7XG59XG5cbmZ1bmN0aW9uIHRlcnJhZm9ybUxpdGVyYWxWYWx1ZVRvVHMoXG4gIHRmQXN0OiBMaXRlcmFsVmFsdWUsXG4gIHRhcmdldFR5cGU6IEF0dHJpYnV0ZVR5cGUgfCB1bmRlZmluZWQsXG4pOiB0LkV4cHJlc3Npb24ge1xuICBjb25zdCBsaXRlcmFsRXhwcmVzc2lvbiA9IHQuc3RyaW5nTGl0ZXJhbCh0ZkFzdC5tZXRhLnZhbHVlKTtcbiAgcmV0dXJuIGNvZXJjZVR5cGUoXG4gICAgLy8gVE9ETzogc2NvcGUgc2hvdWxkIGJlIHBhc3NlZCBpbnN0ZWFkLCBldmVuIGlmIGNvZXJjZVR5cGUgd29uJ3QgbmVlZCBpdCBwcm9iYWJseVxuICAgIHtcbiAgICAgIGNvbnN0cnVjdHM6IG5ldyBTZXQoKSxcbiAgICAgIGhhc1Rva2VuQmFzZWRUeXBlQ29lcmNpb246IGZhbHNlLFxuICAgICAgcHJvdmlkZXJHZW5lcmF0b3I6IHt9LFxuICAgICAgcHJvdmlkZXJTY2hlbWE6IHt9LFxuICAgICAgdmFyaWFibGVzOiB7fSxcbiAgICAgIG5vZGVJZHM6IFtdLFxuICAgICAgaW1wb3J0YWJsZXM6IFtdLFxuICAgICAgdG9wTGV2ZWxDb25maWc6IHt9LFxuICAgIH0sXG4gICAgbGl0ZXJhbEV4cHJlc3Npb24sXG4gICAgdGZBc3QubWV0YS50eXBlLFxuICAgIHRhcmdldFR5cGUsXG4gICk7XG59XG5cbmZ1bmN0aW9uIHRlcnJhZm9ybUZ1bmN0aW9uQ2FsbFRvVHMoXG4gIHNjb3BlOiBQcm9ncmFtU2NvcGUsXG4gIHRmQXN0OiBGdW5jdGlvbkNhbGwsXG4gIHRhcmdldFR5cGU6IEF0dHJpYnV0ZVR5cGUgfCB1bmRlZmluZWQsXG4pOiB0LkV4cHJlc3Npb24ge1xuICBjb25zdCB7IG5hbWUgfSA9IHRmQXN0Lm1ldGE7XG5cbiAgY29uc3QgbWFwcGluZyA9IGZ1bmN0aW9uc01hcFtuYW1lXTtcbiAgaWYgKCFtYXBwaW5nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNYXBwaW5nIG5vdCBmb3VuZCBmb3IgZnVuY3Rpb246ICR7bmFtZX1gKTtcbiAgfVxuXG4gIGlmIChtYXBwaW5nLnRyYW5zZm9ybWVyKSB7XG4gICAgY29uc3QgbmV3VGZBc3QgPSBtYXBwaW5nLnRyYW5zZm9ybWVyKHRmQXN0KTtcbiAgICBpZiAobmV3VGZBc3QgIT09IHRmQXN0KVxuICAgICAgcmV0dXJuIHRlcnJhZm9ybUZ1bmN0aW9uQ2FsbFRvVHMoc2NvcGUsIG5ld1RmQXN0LCB0YXJnZXRUeXBlKTtcbiAgfVxuXG4gIHNjb3BlLmltcG9ydGFibGVzLnB1c2goe1xuICAgIGNvbnN0cnVjdE5hbWU6IFwiRm5cIixcbiAgICBwcm92aWRlcjogXCJjZGt0blwiLFxuICB9KTtcblxuICBjb25zdCBjYWxsZWUgPSB0Lm1lbWJlckV4cHJlc3Npb24oXG4gICAgdC5pZGVudGlmaWVyKFwiRm5cIiksXG4gICAgdC5pZGVudGlmaWVyKG1hcHBpbmcubmFtZSksXG4gICk7XG5cbiAgY29uc3QgYXJnczogdC5FeHByZXNzaW9uW10gPSBbXTtcbiAgbWFwcGluZy5wYXJhbWV0ZXJzLmZvckVhY2goKHBhcmFtLCBpZHgpID0+IHtcbiAgICBpZiAocGFyYW0udmFyaWFkaWMpIHtcbiAgICAgIC8vIHJldHVybiBhbiBhcnJheSB3aXRoIGFsbCByZW1haW5pbmcgY2hpbGRyZW4gKGVhY2ggbWFwcGVkIGFjY29yZGluZ2x5KVxuICAgICAgYXJncy5wdXNoKFxuICAgICAgICB0LmFycmF5RXhwcmVzc2lvbihcbiAgICAgICAgICB0ZkFzdC5jaGlsZHJlblxuICAgICAgICAgICAgLnNsaWNlKGlkeClcbiAgICAgICAgICAgIC5tYXAoKGNoaWxkKSA9PiB0ZXJyYWZvcm1UaGluZ1RvVHMoc2NvcGUsIGNoaWxkLCBwYXJhbS50eXBlKSksXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjaGlsZCA9IHRmQXN0LmNoaWxkcmVuW2lkeF07XG4gICAgICBpZiAoY2hpbGQpIHtcbiAgICAgICAgYXJncy5wdXNoKHRlcnJhZm9ybVRoaW5nVG9UcyhzY29wZSwgY2hpbGQsIHBhcmFtLnR5cGUpKTtcbiAgICAgIH0gZWxzZSBpZiAoIXBhcmFtLm9wdGlvbmFsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGVycmFmb3JtIGZ1bmN0aW9uIGNhbGwgdG8gXCIke25hbWV9XCIgaXMgbm90IHZhbGlkISBQYXJhbWV0ZXIgYXQgaW5kZXggJHtpZHh9IG9mIHR5cGUgJHtcbiAgICAgICAgICAgIHBhcmFtLnR5cGVcbiAgICAgICAgICB9IGlzIG5vdCBvcHRpb25hbCBidXQgcmVjZWl2ZWQgbm8gdmFsdWUuIFRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyB3ZXJlIHBhc3NlZDogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIHRmQXN0LmNoaWxkcmVuLFxuICAgICAgICAgICl9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IHJldHVyblR5cGUgPSBtYXBwaW5nLnJldHVyblR5cGU7XG5cbiAgY29uc3QgY2FsbEV4cHJlc3Npb24gPSB0LmNhbGxFeHByZXNzaW9uKGNhbGxlZSwgYXJncyk7XG5cbiAgcmV0dXJuIGNvZXJjZVR5cGUoXG4gICAgLy8gVE9ETzogc2NvcGUgc2hvdWxkIGJlIHBhc3NlZCBpbnN0ZWFkLCBldmVuIGlmIGNvZXJjZVR5cGUgd29uJ3QgbmVlZCBpdCBwcm9iYWJseVxuICAgIHtcbiAgICAgIGNvbnN0cnVjdHM6IG5ldyBTZXQoKSxcbiAgICAgIGhhc1Rva2VuQmFzZWRUeXBlQ29lcmNpb246IGZhbHNlLFxuICAgICAgcHJvdmlkZXJHZW5lcmF0b3I6IHt9LFxuICAgICAgcHJvdmlkZXJTY2hlbWE6IHt9LFxuICAgICAgdmFyaWFibGVzOiB7fSxcbiAgICAgIG5vZGVJZHM6IFtdLFxuICAgICAgaW1wb3J0YWJsZXM6IFtdLFxuICAgICAgdG9wTGV2ZWxDb25maWc6IHt9LFxuICAgIH0sXG4gICAgY2FsbEV4cHJlc3Npb24sXG4gICAgcmV0dXJuVHlwZSxcbiAgICB0YXJnZXRUeXBlLFxuICApO1xufVxuIl19