@pie-lib/charting 6.1.1-next.1 → 6.2.0-next.2

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 (60) hide show
  1. package/lib/__tests__/actions-button.test.js +332 -0
  2. package/lib/__tests__/axes.test.js +746 -0
  3. package/lib/__tests__/chart-setup.test.js +796 -0
  4. package/lib/__tests__/chart-type.test.js +25 -0
  5. package/lib/__tests__/chart.test.js +103 -0
  6. package/lib/__tests__/grid.test.js +39 -0
  7. package/lib/__tests__/key-legend.test.js +235 -0
  8. package/lib/__tests__/mark-label.test.js +46 -0
  9. package/lib/__tests__/tool-menu.test.js +627 -0
  10. package/lib/__tests__/utils.js +56 -0
  11. package/lib/__tests__/utils.test.js +186 -0
  12. package/lib/actions-button.js +1 -1
  13. package/lib/axes.js +1 -1
  14. package/lib/bars/__tests__/bar.test.js +53 -0
  15. package/lib/bars/__tests__/histogram.test.js +53 -0
  16. package/lib/bars/__tests__/utils.js +50 -0
  17. package/lib/bars/bar.js +1 -1
  18. package/lib/bars/common/__tests__/bars.test.js +76 -0
  19. package/lib/bars/common/__tests__/utils.js +50 -0
  20. package/lib/bars/common/bars.js +1 -1
  21. package/lib/bars/common/correct-check-icon.js +1 -1
  22. package/lib/bars/histogram.js +1 -1
  23. package/lib/chart-setup.js +1 -1
  24. package/lib/chart-type.js +1 -1
  25. package/lib/chart-types.js +1 -1
  26. package/lib/chart.js +1 -1
  27. package/lib/common/__tests__/correctness-indicators.test.js +887 -0
  28. package/lib/common/__tests__/drag-handle.test.js +73 -0
  29. package/lib/common/__tests__/utils.js +50 -0
  30. package/lib/common/correctness-indicators.js +1 -1
  31. package/lib/common/drag-handle.js +1 -1
  32. package/lib/common/drag-icon.js +1 -1
  33. package/lib/common/styles.js +1 -1
  34. package/lib/grid.js +1 -1
  35. package/lib/index.js +1 -1
  36. package/lib/key-legend.js +1 -1
  37. package/lib/line/__tests__/line-cross.test.js +617 -0
  38. package/lib/line/__tests__/line-dot.test.js +47 -0
  39. package/lib/line/__tests__/utils.js +56 -0
  40. package/lib/line/common/__tests__/drag-handle.test.js +73 -0
  41. package/lib/line/common/__tests__/line.test.js +92 -0
  42. package/lib/line/common/__tests__/utils.js +50 -0
  43. package/lib/line/common/drag-handle.js +1 -1
  44. package/lib/line/common/line.js +1 -1
  45. package/lib/line/line-cross.js +1 -1
  46. package/lib/line/line-dot.js +1 -1
  47. package/lib/mark-label.js +1 -1
  48. package/lib/plot/__tests__/dot.test.js +513 -0
  49. package/lib/plot/__tests__/line.test.js +566 -0
  50. package/lib/plot/__tests__/utils.js +50 -0
  51. package/lib/plot/common/__tests__/plot.test.js +79 -0
  52. package/lib/plot/common/__tests__/utils.js +50 -0
  53. package/lib/plot/common/plot.js +1 -1
  54. package/lib/plot/dot.js +1 -1
  55. package/lib/plot/line.js +1 -1
  56. package/lib/tool-menu.js +1 -1
  57. package/lib/utils.js +1 -1
  58. package/package.json +7 -7
  59. package/LICENSE.md +0 -5
  60. package/NEXT.CHANGELOG.json +0 -16
@@ -0,0 +1,887 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
5
+ var _react = _interopRequireDefault(require("react"));
6
+ var _react2 = require("@testing-library/react");
7
+ var _styles = require("@mui/material/styles");
8
+ var _correctnessIndicators = require("../correctness-indicators");
9
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
10
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
11
+ jest.mock('@pie-lib/render-ui', function () {
12
+ return {
13
+ color: {
14
+ correct: function correct() {
15
+ return '#00ff00';
16
+ },
17
+ incorrectWithIcon: function incorrectWithIcon() {
18
+ return '#ff0000';
19
+ },
20
+ defaults: {
21
+ WHITE: '#ffffff'
22
+ }
23
+ }
24
+ };
25
+ });
26
+ jest.mock('@mui/icons-material/Check', function () {
27
+ return function Check(props) {
28
+ return /*#__PURE__*/_react["default"].createElement("svg", {
29
+ "data-testid": "check-icon",
30
+ title: props.title,
31
+ className: props.className
32
+ });
33
+ };
34
+ });
35
+ jest.mock('@mui/icons-material/Close', function () {
36
+ return function Close(props) {
37
+ return /*#__PURE__*/_react["default"].createElement("svg", {
38
+ "data-testid": "close-icon",
39
+ title: props.title,
40
+ className: props.className
41
+ });
42
+ };
43
+ });
44
+ var theme;
45
+ beforeAll(function () {
46
+ theme = (0, _styles.createTheme)();
47
+ });
48
+ describe('CorrectnessIndicator', function () {
49
+ var mockScale = {
50
+ x: jest.fn(function (val) {
51
+ return val * 10;
52
+ }),
53
+ y: jest.fn(function (val) {
54
+ return val * 10;
55
+ })
56
+ };
57
+ beforeEach(function () {
58
+ jest.clearAllMocks();
59
+ });
60
+ var renderComponent = function renderComponent() {
61
+ var extras = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
62
+ var defaults = {
63
+ scale: mockScale,
64
+ x: 5,
65
+ y: 10,
66
+ correctness: {
67
+ value: 'correct',
68
+ label: 'Correct Answer'
69
+ },
70
+ interactive: true
71
+ };
72
+ var props = _objectSpread(_objectSpread({}, defaults), extras);
73
+ return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_styles.ThemeProvider, {
74
+ theme: theme
75
+ }, /*#__PURE__*/_react["default"].createElement("svg", null, /*#__PURE__*/_react["default"].createElement(_correctnessIndicators.CorrectnessIndicator, props))));
76
+ };
77
+ describe('rendering', function () {
78
+ it('should render without crashing', function () {
79
+ var _renderComponent = renderComponent(),
80
+ container = _renderComponent.container;
81
+ expect(container).toBeInTheDocument();
82
+ });
83
+ it('should render foreignObject element', function () {
84
+ var _renderComponent2 = renderComponent(),
85
+ container = _renderComponent2.container;
86
+ var foreignObject = container.querySelector('foreignObject');
87
+ expect(foreignObject).toBeInTheDocument();
88
+ });
89
+ it('should render check icon for correct answer', function () {
90
+ var _renderComponent3 = renderComponent({
91
+ correctness: {
92
+ value: 'correct',
93
+ label: 'Correct'
94
+ }
95
+ }),
96
+ getByTestId = _renderComponent3.getByTestId;
97
+ expect(getByTestId('check-icon')).toBeInTheDocument();
98
+ });
99
+ it('should render close icon for incorrect answer', function () {
100
+ var _renderComponent4 = renderComponent({
101
+ correctness: {
102
+ value: 'incorrect',
103
+ label: 'Incorrect'
104
+ }
105
+ }),
106
+ getByTestId = _renderComponent4.getByTestId;
107
+ expect(getByTestId('close-icon')).toBeInTheDocument();
108
+ });
109
+ it('should not render when correctness is null', function () {
110
+ var _renderComponent5 = renderComponent({
111
+ correctness: null
112
+ }),
113
+ container = _renderComponent5.container;
114
+ var foreignObject = container.querySelector('foreignObject');
115
+ expect(foreignObject).not.toBeInTheDocument();
116
+ });
117
+ it('should not render when correctness is undefined', function () {
118
+ var _renderComponent6 = renderComponent({
119
+ correctness: undefined
120
+ }),
121
+ container = _renderComponent6.container;
122
+ var foreignObject = container.querySelector('foreignObject');
123
+ expect(foreignObject).not.toBeInTheDocument();
124
+ });
125
+ it('should not render when interactive is false', function () {
126
+ var _renderComponent7 = renderComponent({
127
+ interactive: false
128
+ }),
129
+ container = _renderComponent7.container;
130
+ var foreignObject = container.querySelector('foreignObject');
131
+ expect(foreignObject).not.toBeInTheDocument();
132
+ });
133
+ it('should render with correct title for correct answer', function () {
134
+ var _renderComponent8 = renderComponent({
135
+ correctness: {
136
+ value: 'correct',
137
+ label: 'Well done!'
138
+ }
139
+ }),
140
+ getByTestId = _renderComponent8.getByTestId;
141
+ var icon = getByTestId('check-icon');
142
+ expect(icon).toHaveAttribute('title', 'Well done!');
143
+ });
144
+ it('should render with correct title for incorrect answer', function () {
145
+ var _renderComponent9 = renderComponent({
146
+ correctness: {
147
+ value: 'incorrect',
148
+ label: 'Try again'
149
+ }
150
+ }),
151
+ getByTestId = _renderComponent9.getByTestId;
152
+ var icon = getByTestId('close-icon');
153
+ expect(icon).toHaveAttribute('title', 'Try again');
154
+ });
155
+ });
156
+ describe('positioning with scale', function () {
157
+ it('should use scale to calculate position', function () {
158
+ var _renderComponent0 = renderComponent({
159
+ scale: mockScale,
160
+ x: 5,
161
+ y: 10
162
+ }),
163
+ container = _renderComponent0.container;
164
+ var foreignObject = container.querySelector('foreignObject');
165
+ expect(mockScale.x).toHaveBeenCalledWith(5);
166
+ expect(mockScale.y).toHaveBeenCalledWith(10);
167
+ // position is scaled value - 11 (half of 22px icon size)
168
+ expect(foreignObject).toHaveAttribute('x', '39'); // 50 - 11
169
+ expect(foreignObject).toHaveAttribute('y', '89'); // 100 - 11
170
+ });
171
+ it('should have correct size attributes', function () {
172
+ var _renderComponent1 = renderComponent(),
173
+ container = _renderComponent1.container;
174
+ var foreignObject = container.querySelector('foreignObject');
175
+ expect(foreignObject).toHaveAttribute('width', '22');
176
+ expect(foreignObject).toHaveAttribute('height', '22');
177
+ });
178
+ it('should handle different x and y values', function () {
179
+ var _renderComponent10 = renderComponent({
180
+ x: 20,
181
+ y: 30
182
+ }),
183
+ container = _renderComponent10.container;
184
+ expect(mockScale.x).toHaveBeenCalledWith(20);
185
+ expect(mockScale.y).toHaveBeenCalledWith(30);
186
+ });
187
+ it('should use raw values when scale is not provided', function () {
188
+ var _renderComponent11 = renderComponent({
189
+ scale: null,
190
+ x: 50,
191
+ y: 100
192
+ }),
193
+ container = _renderComponent11.container;
194
+ var foreignObject = container.querySelector('foreignObject');
195
+ expect(foreignObject).toHaveAttribute('x', '39'); // 50 - 11
196
+ expect(foreignObject).toHaveAttribute('y', '89'); // 100 - 11
197
+ });
198
+ });
199
+ describe('edge cases', function () {
200
+ it('should handle zero coordinates', function () {
201
+ var _renderComponent12 = renderComponent({
202
+ x: 0,
203
+ y: 0
204
+ }),
205
+ container = _renderComponent12.container;
206
+ var foreignObject = container.querySelector('foreignObject');
207
+ expect(foreignObject).toHaveAttribute('x', '-11');
208
+ expect(foreignObject).toHaveAttribute('y', '-11');
209
+ });
210
+ it('should handle negative coordinates', function () {
211
+ var _renderComponent13 = renderComponent({
212
+ x: -5,
213
+ y: -10
214
+ }),
215
+ container = _renderComponent13.container;
216
+ expect(mockScale.x).toHaveBeenCalledWith(-5);
217
+ expect(mockScale.y).toHaveBeenCalledWith(-10);
218
+ });
219
+ it('should handle large coordinates', function () {
220
+ var _renderComponent14 = renderComponent({
221
+ x: 1000,
222
+ y: 2000
223
+ }),
224
+ container = _renderComponent14.container;
225
+ expect(mockScale.x).toHaveBeenCalledWith(1000);
226
+ expect(mockScale.y).toHaveBeenCalledWith(2000);
227
+ });
228
+ it('should handle correctness with empty label', function () {
229
+ var _renderComponent15 = renderComponent({
230
+ correctness: {
231
+ value: 'correct',
232
+ label: ''
233
+ }
234
+ }),
235
+ getByTestId = _renderComponent15.getByTestId;
236
+ var icon = getByTestId('check-icon');
237
+ expect(icon).toHaveAttribute('title', '');
238
+ });
239
+ it('should handle correctness with undefined label', function () {
240
+ var _renderComponent16 = renderComponent({
241
+ correctness: {
242
+ value: 'correct',
243
+ label: undefined
244
+ }
245
+ }),
246
+ getByTestId = _renderComponent16.getByTestId;
247
+ expect(getByTestId('check-icon')).toBeInTheDocument();
248
+ });
249
+ it('should render when both correctness and interactive are true', function () {
250
+ var _renderComponent17 = renderComponent({
251
+ correctness: {
252
+ value: 'correct',
253
+ label: 'Test'
254
+ },
255
+ interactive: true
256
+ }),
257
+ container = _renderComponent17.container;
258
+ expect(container.querySelector('foreignObject')).toBeInTheDocument();
259
+ });
260
+ it('should not render when interactive is false even with correctness', function () {
261
+ var _renderComponent18 = renderComponent({
262
+ correctness: {
263
+ value: 'correct',
264
+ label: 'Test'
265
+ },
266
+ interactive: false
267
+ }),
268
+ container = _renderComponent18.container;
269
+ expect(container.querySelector('foreignObject')).not.toBeInTheDocument();
270
+ });
271
+ });
272
+ });
273
+ describe('SmallCorrectPointIndicator', function () {
274
+ var mockScale = {
275
+ x: jest.fn(function (val) {
276
+ return val * 10;
277
+ }),
278
+ y: jest.fn(function (val) {
279
+ return val * 10;
280
+ })
281
+ };
282
+ var correctData = [{
283
+ label: 'A',
284
+ value: 10
285
+ }, {
286
+ label: 'B',
287
+ value: 20
288
+ }, {
289
+ label: 'C',
290
+ value: '30'
291
+ }];
292
+ beforeEach(function () {
293
+ jest.clearAllMocks();
294
+ });
295
+ var renderComponent = function renderComponent() {
296
+ var extras = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
297
+ var defaults = {
298
+ scale: mockScale,
299
+ x: 5,
300
+ correctness: {
301
+ value: 'incorrect',
302
+ label: 'Incorrect'
303
+ },
304
+ correctData: correctData,
305
+ label: 'A'
306
+ };
307
+ var props = _objectSpread(_objectSpread({}, defaults), extras);
308
+ return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_styles.ThemeProvider, {
309
+ theme: theme
310
+ }, /*#__PURE__*/_react["default"].createElement("svg", null, /*#__PURE__*/_react["default"].createElement(_correctnessIndicators.SmallCorrectPointIndicator, props))));
311
+ };
312
+ describe('rendering', function () {
313
+ it('should render without crashing', function () {
314
+ var _renderComponent19 = renderComponent(),
315
+ container = _renderComponent19.container;
316
+ expect(container).toBeInTheDocument();
317
+ });
318
+ it('should render foreignObject when incorrect', function () {
319
+ var _renderComponent20 = renderComponent({
320
+ correctness: {
321
+ value: 'incorrect',
322
+ label: 'Wrong'
323
+ },
324
+ label: 'A'
325
+ }),
326
+ container = _renderComponent20.container;
327
+ var foreignObject = container.querySelector('foreignObject');
328
+ expect(foreignObject).toBeInTheDocument();
329
+ });
330
+ it('should render small check icon when incorrect', function () {
331
+ var _renderComponent21 = renderComponent({
332
+ correctness: {
333
+ value: 'incorrect',
334
+ label: 'Wrong'
335
+ },
336
+ label: 'A'
337
+ }),
338
+ getByTestId = _renderComponent21.getByTestId;
339
+ var icon = getByTestId('check-icon');
340
+ expect(icon).toBeInTheDocument();
341
+ expect(icon).toHaveClass('small');
342
+ });
343
+ it('should not render when correctness is correct', function () {
344
+ var _renderComponent22 = renderComponent({
345
+ correctness: {
346
+ value: 'correct',
347
+ label: 'Correct'
348
+ }
349
+ }),
350
+ container = _renderComponent22.container;
351
+ var foreignObject = container.querySelector('foreignObject');
352
+ expect(foreignObject).not.toBeInTheDocument();
353
+ });
354
+ it('should not render when correctness is null', function () {
355
+ var _renderComponent23 = renderComponent({
356
+ correctness: null
357
+ }),
358
+ container = _renderComponent23.container;
359
+ var foreignObject = container.querySelector('foreignObject');
360
+ expect(foreignObject).not.toBeInTheDocument();
361
+ });
362
+ it('should not render when correctness is undefined', function () {
363
+ var _renderComponent24 = renderComponent({
364
+ correctness: undefined
365
+ }),
366
+ container = _renderComponent24.container;
367
+ var foreignObject = container.querySelector('foreignObject');
368
+ expect(foreignObject).not.toBeInTheDocument();
369
+ });
370
+ });
371
+ describe('positioning', function () {
372
+ it('should calculate correct position for label A', function () {
373
+ var _renderComponent25 = renderComponent({
374
+ x: 5,
375
+ label: 'A'
376
+ }),
377
+ container = _renderComponent25.container;
378
+ var foreignObject = container.querySelector('foreignObject');
379
+ expect(mockScale.x).toHaveBeenCalledWith(5);
380
+ expect(mockScale.y).toHaveBeenCalledWith(10); // value from correctData for label A
381
+ // Position is scaled value - 7.5 (half of 15px small icon size)
382
+ expect(foreignObject).toHaveAttribute('x', '42.5'); // 50 - 7.5
383
+ expect(foreignObject).toHaveAttribute('y', '92.5'); // 100 - 7.5
384
+ });
385
+ it('should calculate correct position for label B', function () {
386
+ var _renderComponent26 = renderComponent({
387
+ x: 5,
388
+ label: 'B'
389
+ }),
390
+ container = _renderComponent26.container;
391
+ expect(mockScale.y).toHaveBeenCalledWith(20);
392
+ });
393
+ it('should calculate correct position for label C with string value', function () {
394
+ var _renderComponent27 = renderComponent({
395
+ x: 5,
396
+ label: 'C'
397
+ }),
398
+ container = _renderComponent27.container;
399
+ expect(mockScale.y).toHaveBeenCalledWith(30);
400
+ });
401
+ it('should have correct size attributes for small icon', function () {
402
+ var _renderComponent28 = renderComponent({
403
+ label: 'A'
404
+ }),
405
+ container = _renderComponent28.container;
406
+ var foreignObject = container.querySelector('foreignObject');
407
+ expect(foreignObject).toHaveAttribute('width', '15');
408
+ expect(foreignObject).toHaveAttribute('height', '15');
409
+ });
410
+ });
411
+ describe('correctData handling', function () {
412
+ it('should find correct value from correctData by label', function () {
413
+ var _renderComponent29 = renderComponent({
414
+ label: 'B'
415
+ }),
416
+ container = _renderComponent29.container;
417
+ var foreignObject = container.querySelector('foreignObject');
418
+ expect(foreignObject).toBeInTheDocument();
419
+ expect(mockScale.y).toHaveBeenCalledWith(20);
420
+ });
421
+ it('should not render when label is not in correctData', function () {
422
+ var _renderComponent30 = renderComponent({
423
+ label: 'Z'
424
+ }),
425
+ container = _renderComponent30.container;
426
+ var foreignObject = container.querySelector('foreignObject');
427
+ expect(foreignObject).not.toBeInTheDocument();
428
+ });
429
+ it('should not render when correctData value is NaN', function () {
430
+ var _renderComponent31 = renderComponent({
431
+ correctData: [{
432
+ label: 'A',
433
+ value: 'invalid'
434
+ }],
435
+ label: 'A'
436
+ }),
437
+ container = _renderComponent31.container;
438
+ var foreignObject = container.querySelector('foreignObject');
439
+ expect(foreignObject).not.toBeInTheDocument();
440
+ });
441
+ it('should handle empty correctData array', function () {
442
+ var _renderComponent32 = renderComponent({
443
+ correctData: [],
444
+ label: 'A'
445
+ }),
446
+ container = _renderComponent32.container;
447
+ var foreignObject = container.querySelector('foreignObject');
448
+ expect(foreignObject).not.toBeInTheDocument();
449
+ });
450
+ it('should not render when correctData is undefined (correctness not incorrect)', function () {
451
+ var _renderComponent33 = renderComponent({
452
+ correctness: {
453
+ value: 'correct',
454
+ label: 'Correct'
455
+ },
456
+ correctData: undefined,
457
+ label: 'A'
458
+ }),
459
+ container = _renderComponent33.container;
460
+ var foreignObject = container.querySelector('foreignObject');
461
+ expect(foreignObject).not.toBeInTheDocument();
462
+ });
463
+ it('should parse string values correctly', function () {
464
+ var _renderComponent34 = renderComponent({
465
+ correctData: [{
466
+ label: 'D',
467
+ value: '45.5'
468
+ }],
469
+ label: 'D'
470
+ }),
471
+ container = _renderComponent34.container;
472
+ var foreignObject = container.querySelector('foreignObject');
473
+ expect(foreignObject).toBeInTheDocument();
474
+ expect(mockScale.y).toHaveBeenCalledWith(45.5);
475
+ });
476
+ it('should handle zero values', function () {
477
+ var _renderComponent35 = renderComponent({
478
+ correctData: [{
479
+ label: 'E',
480
+ value: 0
481
+ }],
482
+ label: 'E'
483
+ }),
484
+ container = _renderComponent35.container;
485
+ var foreignObject = container.querySelector('foreignObject');
486
+ expect(foreignObject).toBeInTheDocument();
487
+ expect(mockScale.y).toHaveBeenCalledWith(0);
488
+ });
489
+ it('should handle negative values', function () {
490
+ var _renderComponent36 = renderComponent({
491
+ correctData: [{
492
+ label: 'F',
493
+ value: -10
494
+ }],
495
+ label: 'F'
496
+ }),
497
+ container = _renderComponent36.container;
498
+ var foreignObject = container.querySelector('foreignObject');
499
+ expect(foreignObject).toBeInTheDocument();
500
+ expect(mockScale.y).toHaveBeenCalledWith(-10);
501
+ });
502
+ });
503
+ describe('icon properties', function () {
504
+ it('should render icon with correct title', function () {
505
+ var _renderComponent37 = renderComponent({
506
+ correctness: {
507
+ value: 'incorrect',
508
+ label: 'Not quite right'
509
+ },
510
+ label: 'A'
511
+ }),
512
+ getByTestId = _renderComponent37.getByTestId;
513
+ var icon = getByTestId('check-icon');
514
+ expect(icon).toHaveAttribute('title', 'Not quite right');
515
+ });
516
+ it('should render icon with small className', function () {
517
+ var _renderComponent38 = renderComponent({
518
+ label: 'A'
519
+ }),
520
+ getByTestId = _renderComponent38.getByTestId;
521
+ var icon = getByTestId('check-icon');
522
+ expect(icon).toHaveClass('small');
523
+ });
524
+ });
525
+ describe('edge cases', function () {
526
+ it('should handle missing label prop', function () {
527
+ var _renderComponent39 = renderComponent({
528
+ label: undefined
529
+ }),
530
+ container = _renderComponent39.container;
531
+ var foreignObject = container.querySelector('foreignObject');
532
+ expect(foreignObject).not.toBeInTheDocument();
533
+ });
534
+ it('should handle empty string label', function () {
535
+ var _renderComponent40 = renderComponent({
536
+ label: ''
537
+ }),
538
+ container = _renderComponent40.container;
539
+ var foreignObject = container.querySelector('foreignObject');
540
+ expect(foreignObject).not.toBeInTheDocument();
541
+ });
542
+ it('should handle very large values in correctData', function () {
543
+ var _renderComponent41 = renderComponent({
544
+ correctData: [{
545
+ label: 'G',
546
+ value: 999999
547
+ }],
548
+ label: 'G'
549
+ }),
550
+ container = _renderComponent41.container;
551
+ var foreignObject = container.querySelector('foreignObject');
552
+ expect(foreignObject).toBeInTheDocument();
553
+ expect(mockScale.y).toHaveBeenCalledWith(999999);
554
+ });
555
+ it('should only render for incorrect answers', function () {
556
+ var _renderComponent42 = renderComponent({
557
+ correctness: {
558
+ value: 'incorrect',
559
+ label: 'Wrong'
560
+ },
561
+ label: 'A'
562
+ }),
563
+ incorrectContainer = _renderComponent42.container;
564
+ expect(incorrectContainer.querySelector('foreignObject')).toBeInTheDocument();
565
+ var _renderComponent43 = renderComponent({
566
+ correctness: {
567
+ value: 'correct',
568
+ label: 'Right'
569
+ },
570
+ label: 'A'
571
+ }),
572
+ correctContainer = _renderComponent43.container;
573
+ expect(correctContainer.querySelector('foreignObject')).not.toBeInTheDocument();
574
+ });
575
+ });
576
+ });
577
+ describe('TickCorrectnessIndicator', function () {
578
+ beforeEach(function () {
579
+ jest.clearAllMocks();
580
+ });
581
+ var renderComponent = function renderComponent() {
582
+ var extras = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
583
+ var defaults = {
584
+ correctness: {
585
+ value: 'correct',
586
+ label: 'Correct Answer'
587
+ },
588
+ interactive: true
589
+ };
590
+ var props = _objectSpread(_objectSpread({}, defaults), extras);
591
+ return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_styles.ThemeProvider, {
592
+ theme: theme
593
+ }, /*#__PURE__*/_react["default"].createElement(_correctnessIndicators.TickCorrectnessIndicator, props)));
594
+ };
595
+ describe('rendering', function () {
596
+ it('should render without crashing', function () {
597
+ var _renderComponent44 = renderComponent(),
598
+ container = _renderComponent44.container;
599
+ expect(container).toBeInTheDocument();
600
+ });
601
+ it('should render check icon for correct answer', function () {
602
+ var _renderComponent45 = renderComponent({
603
+ correctness: {
604
+ value: 'correct',
605
+ label: 'Correct'
606
+ }
607
+ }),
608
+ getByTestId = _renderComponent45.getByTestId;
609
+ expect(getByTestId('check-icon')).toBeInTheDocument();
610
+ });
611
+ it('should render close icon for incorrect answer', function () {
612
+ var _renderComponent46 = renderComponent({
613
+ correctness: {
614
+ value: 'incorrect',
615
+ label: 'Incorrect'
616
+ }
617
+ }),
618
+ getByTestId = _renderComponent46.getByTestId;
619
+ expect(getByTestId('close-icon')).toBeInTheDocument();
620
+ });
621
+ it('should not render when correctness is null', function () {
622
+ var _renderComponent47 = renderComponent({
623
+ correctness: null
624
+ }),
625
+ queryByTestId = _renderComponent47.queryByTestId;
626
+ expect(queryByTestId('check-icon')).not.toBeInTheDocument();
627
+ expect(queryByTestId('close-icon')).not.toBeInTheDocument();
628
+ });
629
+ it('should not render when correctness is undefined', function () {
630
+ var _renderComponent48 = renderComponent({
631
+ correctness: undefined
632
+ }),
633
+ queryByTestId = _renderComponent48.queryByTestId;
634
+ expect(queryByTestId('check-icon')).not.toBeInTheDocument();
635
+ expect(queryByTestId('close-icon')).not.toBeInTheDocument();
636
+ });
637
+ it('should not render when interactive is false', function () {
638
+ var _renderComponent49 = renderComponent({
639
+ interactive: false
640
+ }),
641
+ queryByTestId = _renderComponent49.queryByTestId;
642
+ expect(queryByTestId('check-icon')).not.toBeInTheDocument();
643
+ expect(queryByTestId('close-icon')).not.toBeInTheDocument();
644
+ });
645
+ it('should render with correct title for correct answer', function () {
646
+ var _renderComponent50 = renderComponent({
647
+ correctness: {
648
+ value: 'correct',
649
+ label: 'Great job!'
650
+ }
651
+ }),
652
+ getByTestId = _renderComponent50.getByTestId;
653
+ var icon = getByTestId('check-icon');
654
+ expect(icon).toHaveAttribute('title', 'Great job!');
655
+ });
656
+ it('should render with correct title for incorrect answer', function () {
657
+ var _renderComponent51 = renderComponent({
658
+ correctness: {
659
+ value: 'incorrect',
660
+ label: 'Not correct'
661
+ }
662
+ }),
663
+ getByTestId = _renderComponent51.getByTestId;
664
+ var icon = getByTestId('close-icon');
665
+ expect(icon).toHaveAttribute('title', 'Not correct');
666
+ });
667
+ });
668
+ describe('interactive flag', function () {
669
+ it('should render when interactive is true', function () {
670
+ var _renderComponent52 = renderComponent({
671
+ interactive: true,
672
+ correctness: {
673
+ value: 'correct',
674
+ label: 'Test'
675
+ }
676
+ }),
677
+ getByTestId = _renderComponent52.getByTestId;
678
+ expect(getByTestId('check-icon')).toBeInTheDocument();
679
+ });
680
+ it('should not render when interactive is false', function () {
681
+ var _renderComponent53 = renderComponent({
682
+ interactive: false,
683
+ correctness: {
684
+ value: 'correct',
685
+ label: 'Test'
686
+ }
687
+ }),
688
+ queryByTestId = _renderComponent53.queryByTestId;
689
+ expect(queryByTestId('check-icon')).not.toBeInTheDocument();
690
+ });
691
+ it('should not render when interactive is undefined', function () {
692
+ var _renderComponent54 = renderComponent({
693
+ interactive: undefined,
694
+ correctness: {
695
+ value: 'correct',
696
+ label: 'Test'
697
+ }
698
+ }),
699
+ queryByTestId = _renderComponent54.queryByTestId;
700
+ expect(queryByTestId('check-icon')).not.toBeInTheDocument();
701
+ });
702
+ it('should not render when interactive is null', function () {
703
+ var _renderComponent55 = renderComponent({
704
+ interactive: null,
705
+ correctness: {
706
+ value: 'correct',
707
+ label: 'Test'
708
+ }
709
+ }),
710
+ queryByTestId = _renderComponent55.queryByTestId;
711
+ expect(queryByTestId('check-icon')).not.toBeInTheDocument();
712
+ });
713
+ });
714
+ describe('correctness values', function () {
715
+ it('should render check icon when value is "correct"', function () {
716
+ var _renderComponent56 = renderComponent({
717
+ correctness: {
718
+ value: 'correct',
719
+ label: 'Test'
720
+ }
721
+ }),
722
+ getByTestId = _renderComponent56.getByTestId,
723
+ queryByTestId = _renderComponent56.queryByTestId;
724
+ expect(getByTestId('check-icon')).toBeInTheDocument();
725
+ expect(queryByTestId('close-icon')).not.toBeInTheDocument();
726
+ });
727
+ it('should render close icon when value is "incorrect"', function () {
728
+ var _renderComponent57 = renderComponent({
729
+ correctness: {
730
+ value: 'incorrect',
731
+ label: 'Test'
732
+ }
733
+ }),
734
+ getByTestId = _renderComponent57.getByTestId,
735
+ queryByTestId = _renderComponent57.queryByTestId;
736
+ expect(getByTestId('close-icon')).toBeInTheDocument();
737
+ expect(queryByTestId('check-icon')).not.toBeInTheDocument();
738
+ });
739
+ it('should render close icon for any value other than "correct"', function () {
740
+ var _renderComponent58 = renderComponent({
741
+ correctness: {
742
+ value: 'partial',
743
+ label: 'Test'
744
+ }
745
+ }),
746
+ getByTestId = _renderComponent58.getByTestId;
747
+ expect(getByTestId('close-icon')).toBeInTheDocument();
748
+ });
749
+ it('should handle empty value string', function () {
750
+ var _renderComponent59 = renderComponent({
751
+ correctness: {
752
+ value: '',
753
+ label: 'Test'
754
+ }
755
+ }),
756
+ getByTestId = _renderComponent59.getByTestId;
757
+ expect(getByTestId('close-icon')).toBeInTheDocument();
758
+ });
759
+ });
760
+ describe('edge cases', function () {
761
+ it('should handle correctness with empty label', function () {
762
+ var _renderComponent60 = renderComponent({
763
+ correctness: {
764
+ value: 'correct',
765
+ label: ''
766
+ }
767
+ }),
768
+ getByTestId = _renderComponent60.getByTestId;
769
+ var icon = getByTestId('check-icon');
770
+ expect(icon).toHaveAttribute('title', '');
771
+ });
772
+ it('should handle correctness with undefined label', function () {
773
+ var _renderComponent61 = renderComponent({
774
+ correctness: {
775
+ value: 'correct',
776
+ label: undefined
777
+ }
778
+ }),
779
+ getByTestId = _renderComponent61.getByTestId;
780
+ expect(getByTestId('check-icon')).toBeInTheDocument();
781
+ });
782
+ it('should handle correctness with null value', function () {
783
+ var _renderComponent62 = renderComponent({
784
+ correctness: {
785
+ value: null,
786
+ label: 'Test'
787
+ }
788
+ }),
789
+ queryByTestId = _renderComponent62.queryByTestId;
790
+ expect(queryByTestId('close-icon')).toBeInTheDocument();
791
+ });
792
+ it('should require both correctness and interactive to render', function () {
793
+ var _renderComponent63 = renderComponent({
794
+ correctness: {
795
+ value: 'correct',
796
+ label: 'Test'
797
+ },
798
+ interactive: false
799
+ }),
800
+ query1 = _renderComponent63.queryByTestId;
801
+ expect(query1('check-icon')).not.toBeInTheDocument();
802
+ var _renderComponent64 = renderComponent({
803
+ correctness: null,
804
+ interactive: true
805
+ }),
806
+ query2 = _renderComponent64.queryByTestId;
807
+ expect(query2('check-icon')).not.toBeInTheDocument();
808
+ });
809
+ it('should handle special characters in label', function () {
810
+ var _renderComponent65 = renderComponent({
811
+ correctness: {
812
+ value: 'correct',
813
+ label: 'Test <>&"'
814
+ }
815
+ }),
816
+ getByTestId = _renderComponent65.getByTestId;
817
+ var icon = getByTestId('check-icon');
818
+ expect(icon).toHaveAttribute('title', 'Test <>&"');
819
+ });
820
+ it('should handle unicode characters in label', function () {
821
+ var _renderComponent66 = renderComponent({
822
+ correctness: {
823
+ value: 'correct',
824
+ label: 'Test 你好 🎉'
825
+ }
826
+ }),
827
+ getByTestId = _renderComponent66.getByTestId;
828
+ var icon = getByTestId('check-icon');
829
+ expect(icon).toHaveAttribute('title', 'Test 你好 🎉');
830
+ });
831
+ it('should handle very long labels', function () {
832
+ var longLabel = 'This is a very long label that might cause layout issues in the UI';
833
+ var _renderComponent67 = renderComponent({
834
+ correctness: {
835
+ value: 'correct',
836
+ label: longLabel
837
+ }
838
+ }),
839
+ getByTestId = _renderComponent67.getByTestId;
840
+ var icon = getByTestId('check-icon');
841
+ expect(icon).toHaveAttribute('title', longLabel);
842
+ });
843
+ });
844
+ describe('component consistency', function () {
845
+ it('should render same icon type consistently for same correctness value', function () {
846
+ var _renderComponent68 = renderComponent({
847
+ correctness: {
848
+ value: 'correct',
849
+ label: 'Test 1'
850
+ }
851
+ }),
852
+ getByTestId = _renderComponent68.getByTestId,
853
+ unmount = _renderComponent68.unmount;
854
+ expect(getByTestId('check-icon')).toBeInTheDocument();
855
+ unmount();
856
+ var _renderComponent69 = renderComponent({
857
+ correctness: {
858
+ value: 'correct',
859
+ label: 'Test 2'
860
+ }
861
+ }),
862
+ get2 = _renderComponent69.getByTestId;
863
+ expect(get2('check-icon')).toBeInTheDocument();
864
+ });
865
+ it('should render different icons for different correctness values', function () {
866
+ var _renderComponent70 = renderComponent({
867
+ correctness: {
868
+ value: 'correct',
869
+ label: 'Correct'
870
+ }
871
+ }),
872
+ getByTestId = _renderComponent70.getByTestId,
873
+ unmount = _renderComponent70.unmount;
874
+ expect(getByTestId('check-icon')).toBeInTheDocument();
875
+ unmount();
876
+ var _renderComponent71 = renderComponent({
877
+ correctness: {
878
+ value: 'incorrect',
879
+ label: 'Incorrect'
880
+ }
881
+ }),
882
+ get2 = _renderComponent71.getByTestId;
883
+ expect(get2('close-icon')).toBeInTheDocument();
884
+ });
885
+ });
886
+ });
887
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfc3R5bGVzIiwiX2NvcnJlY3RuZXNzSW5kaWNhdG9ycyIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiamVzdCIsIm1vY2siLCJjb2xvciIsImNvcnJlY3QiLCJpbmNvcnJlY3RXaXRoSWNvbiIsImRlZmF1bHRzIiwiV0hJVEUiLCJDaGVjayIsInByb3BzIiwiY3JlYXRlRWxlbWVudCIsInRpdGxlIiwiY2xhc3NOYW1lIiwiQ2xvc2UiLCJ0aGVtZSIsImJlZm9yZUFsbCIsImNyZWF0ZVRoZW1lIiwiZGVzY3JpYmUiLCJtb2NrU2NhbGUiLCJ4IiwiZm4iLCJ2YWwiLCJ5IiwiYmVmb3JlRWFjaCIsImNsZWFyQWxsTW9ja3MiLCJyZW5kZXJDb21wb25lbnQiLCJleHRyYXMiLCJ1bmRlZmluZWQiLCJzY2FsZSIsImNvcnJlY3RuZXNzIiwidmFsdWUiLCJsYWJlbCIsImludGVyYWN0aXZlIiwicmVuZGVyIiwiVGhlbWVQcm92aWRlciIsIkNvcnJlY3RuZXNzSW5kaWNhdG9yIiwiaXQiLCJfcmVuZGVyQ29tcG9uZW50IiwiY29udGFpbmVyIiwiZXhwZWN0IiwidG9CZUluVGhlRG9jdW1lbnQiLCJfcmVuZGVyQ29tcG9uZW50MiIsImZvcmVpZ25PYmplY3QiLCJxdWVyeVNlbGVjdG9yIiwiX3JlbmRlckNvbXBvbmVudDMiLCJnZXRCeVRlc3RJZCIsIl9yZW5kZXJDb21wb25lbnQ0IiwiX3JlbmRlckNvbXBvbmVudDUiLCJub3QiLCJfcmVuZGVyQ29tcG9uZW50NiIsIl9yZW5kZXJDb21wb25lbnQ3IiwiX3JlbmRlckNvbXBvbmVudDgiLCJpY29uIiwidG9IYXZlQXR0cmlidXRlIiwiX3JlbmRlckNvbXBvbmVudDkiLCJfcmVuZGVyQ29tcG9uZW50MCIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwiX3JlbmRlckNvbXBvbmVudDEiLCJfcmVuZGVyQ29tcG9uZW50MTAiLCJfcmVuZGVyQ29tcG9uZW50MTEiLCJfcmVuZGVyQ29tcG9uZW50MTIiLCJfcmVuZGVyQ29tcG9uZW50MTMiLCJfcmVuZGVyQ29tcG9uZW50MTQiLCJfcmVuZGVyQ29tcG9uZW50MTUiLCJfcmVuZGVyQ29tcG9uZW50MTYiLCJfcmVuZGVyQ29tcG9uZW50MTciLCJfcmVuZGVyQ29tcG9uZW50MTgiLCJjb3JyZWN0RGF0YSIsIlNtYWxsQ29ycmVjdFBvaW50SW5kaWNhdG9yIiwiX3JlbmRlckNvbXBvbmVudDE5IiwiX3JlbmRlckNvbXBvbmVudDIwIiwiX3JlbmRlckNvbXBvbmVudDIxIiwidG9IYXZlQ2xhc3MiLCJfcmVuZGVyQ29tcG9uZW50MjIiLCJfcmVuZGVyQ29tcG9uZW50MjMiLCJfcmVuZGVyQ29tcG9uZW50MjQiLCJfcmVuZGVyQ29tcG9uZW50MjUiLCJfcmVuZGVyQ29tcG9uZW50MjYiLCJfcmVuZGVyQ29tcG9uZW50MjciLCJfcmVuZGVyQ29tcG9uZW50MjgiLCJfcmVuZGVyQ29tcG9uZW50MjkiLCJfcmVuZGVyQ29tcG9uZW50MzAiLCJfcmVuZGVyQ29tcG9uZW50MzEiLCJfcmVuZGVyQ29tcG9uZW50MzIiLCJfcmVuZGVyQ29tcG9uZW50MzMiLCJfcmVuZGVyQ29tcG9uZW50MzQiLCJfcmVuZGVyQ29tcG9uZW50MzUiLCJfcmVuZGVyQ29tcG9uZW50MzYiLCJfcmVuZGVyQ29tcG9uZW50MzciLCJfcmVuZGVyQ29tcG9uZW50MzgiLCJfcmVuZGVyQ29tcG9uZW50MzkiLCJfcmVuZGVyQ29tcG9uZW50NDAiLCJfcmVuZGVyQ29tcG9uZW50NDEiLCJfcmVuZGVyQ29tcG9uZW50NDIiLCJpbmNvcnJlY3RDb250YWluZXIiLCJfcmVuZGVyQ29tcG9uZW50NDMiLCJjb3JyZWN0Q29udGFpbmVyIiwiVGlja0NvcnJlY3RuZXNzSW5kaWNhdG9yIiwiX3JlbmRlckNvbXBvbmVudDQ0IiwiX3JlbmRlckNvbXBvbmVudDQ1IiwiX3JlbmRlckNvbXBvbmVudDQ2IiwiX3JlbmRlckNvbXBvbmVudDQ3IiwicXVlcnlCeVRlc3RJZCIsIl9yZW5kZXJDb21wb25lbnQ0OCIsIl9yZW5kZXJDb21wb25lbnQ0OSIsIl9yZW5kZXJDb21wb25lbnQ1MCIsIl9yZW5kZXJDb21wb25lbnQ1MSIsIl9yZW5kZXJDb21wb25lbnQ1MiIsIl9yZW5kZXJDb21wb25lbnQ1MyIsIl9yZW5kZXJDb21wb25lbnQ1NCIsIl9yZW5kZXJDb21wb25lbnQ1NSIsIl9yZW5kZXJDb21wb25lbnQ1NiIsIl9yZW5kZXJDb21wb25lbnQ1NyIsIl9yZW5kZXJDb21wb25lbnQ1OCIsIl9yZW5kZXJDb21wb25lbnQ1OSIsIl9yZW5kZXJDb21wb25lbnQ2MCIsIl9yZW5kZXJDb21wb25lbnQ2MSIsIl9yZW5kZXJDb21wb25lbnQ2MiIsIl9yZW5kZXJDb21wb25lbnQ2MyIsInF1ZXJ5MSIsIl9yZW5kZXJDb21wb25lbnQ2NCIsInF1ZXJ5MiIsIl9yZW5kZXJDb21wb25lbnQ2NSIsIl9yZW5kZXJDb21wb25lbnQ2NiIsImxvbmdMYWJlbCIsIl9yZW5kZXJDb21wb25lbnQ2NyIsIl9yZW5kZXJDb21wb25lbnQ2OCIsInVubW91bnQiLCJfcmVuZGVyQ29tcG9uZW50NjkiLCJnZXQyIiwiX3JlbmRlckNvbXBvbmVudDcwIiwiX3JlbmRlckNvbXBvbmVudDcxIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1vbi9fX3Rlc3RzX18vY29ycmVjdG5lc3MtaW5kaWNhdG9ycy50ZXN0LmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcmVuZGVyIH0gZnJvbSAnQHRlc3RpbmctbGlicmFyeS9yZWFjdCc7XG5pbXBvcnQgeyBjcmVhdGVUaGVtZSwgVGhlbWVQcm92aWRlciB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwvc3R5bGVzJztcbmltcG9ydCB7IENvcnJlY3RuZXNzSW5kaWNhdG9yLCBTbWFsbENvcnJlY3RQb2ludEluZGljYXRvciwgVGlja0NvcnJlY3RuZXNzSW5kaWNhdG9yIH0gZnJvbSAnLi4vY29ycmVjdG5lc3MtaW5kaWNhdG9ycyc7XG5cbmplc3QubW9jaygnQHBpZS1saWIvcmVuZGVyLXVpJywgKCkgPT4gKHtcbiAgY29sb3I6IHtcbiAgICBjb3JyZWN0OiAoKSA9PiAnIzAwZmYwMCcsXG4gICAgaW5jb3JyZWN0V2l0aEljb246ICgpID0+ICcjZmYwMDAwJyxcbiAgICBkZWZhdWx0czoge1xuICAgICAgV0hJVEU6ICcjZmZmZmZmJyxcbiAgICB9LFxuICB9LFxufSkpO1xuXG5qZXN0Lm1vY2soJ0BtdWkvaWNvbnMtbWF0ZXJpYWwvQ2hlY2snLCAoKSA9PiB7XG4gIHJldHVybiBmdW5jdGlvbiBDaGVjayhwcm9wcykge1xuICAgIHJldHVybiA8c3ZnIGRhdGEtdGVzdGlkPVwiY2hlY2staWNvblwiIHRpdGxlPXtwcm9wcy50aXRsZX0gY2xhc3NOYW1lPXtwcm9wcy5jbGFzc05hbWV9IC8+O1xuICB9O1xufSk7XG5cbmplc3QubW9jaygnQG11aS9pY29ucy1tYXRlcmlhbC9DbG9zZScsICgpID0+IHtcbiAgcmV0dXJuIGZ1bmN0aW9uIENsb3NlKHByb3BzKSB7XG4gICAgcmV0dXJuIDxzdmcgZGF0YS10ZXN0aWQ9XCJjbG9zZS1pY29uXCIgdGl0bGU9e3Byb3BzLnRpdGxlfSBjbGFzc05hbWU9e3Byb3BzLmNsYXNzTmFtZX0gLz47XG4gIH07XG59KTtcblxubGV0IHRoZW1lO1xuXG5iZWZvcmVBbGwoKCkgPT4ge1xuICB0aGVtZSA9IGNyZWF0ZVRoZW1lKCk7XG59KTtcblxuZGVzY3JpYmUoJ0NvcnJlY3RuZXNzSW5kaWNhdG9yJywgKCkgPT4ge1xuICBjb25zdCBtb2NrU2NhbGUgPSB7XG4gICAgeDogamVzdC5mbigodmFsKSA9PiB2YWwgKiAxMCksXG4gICAgeTogamVzdC5mbigodmFsKSA9PiB2YWwgKiAxMCksXG4gIH07XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgamVzdC5jbGVhckFsbE1vY2tzKCk7XG4gIH0pO1xuXG4gIGNvbnN0IHJlbmRlckNvbXBvbmVudCA9IChleHRyYXMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IGRlZmF1bHRzID0ge1xuICAgICAgc2NhbGU6IG1vY2tTY2FsZSxcbiAgICAgIHg6IDUsXG4gICAgICB5OiAxMCxcbiAgICAgIGNvcnJlY3RuZXNzOiB7IHZhbHVlOiAnY29ycmVjdCcsIGxhYmVsOiAnQ29ycmVjdCBBbnN3ZXInIH0sXG4gICAgICBpbnRlcmFjdGl2ZTogdHJ1ZSxcbiAgICB9O1xuICAgIGNvbnN0IHByb3BzID0geyAuLi5kZWZhdWx0cywgLi4uZXh0cmFzIH07XG4gICAgcmV0dXJuIHJlbmRlcihcbiAgICAgIDxUaGVtZVByb3ZpZGVyIHRoZW1lPXt0aGVtZX0+XG4gICAgICAgIDxzdmc+XG4gICAgICAgICAgPENvcnJlY3RuZXNzSW5kaWNhdG9yIHsuLi5wcm9wc30gLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L1RoZW1lUHJvdmlkZXI+LFxuICAgICk7XG4gIH07XG5cbiAgZGVzY3JpYmUoJ3JlbmRlcmluZycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJlbmRlciB3aXRob3V0IGNyYXNoaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCgpO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVuZGVyIGZvcmVpZ25PYmplY3QgZWxlbWVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoKTtcbiAgICAgIGNvbnN0IGZvcmVpZ25PYmplY3QgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZm9yZWlnbk9iamVjdCcpO1xuICAgICAgZXhwZWN0KGZvcmVpZ25PYmplY3QpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlbmRlciBjaGVjayBpY29uIGZvciBjb3JyZWN0IGFuc3dlcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QnlUZXN0SWQgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNvcnJlY3RuZXNzOiB7IHZhbHVlOiAnY29ycmVjdCcsIGxhYmVsOiAnQ29ycmVjdCcgfSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGdldEJ5VGVzdElkKCdjaGVjay1pY29uJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlbmRlciBjbG9zZSBpY29uIGZvciBpbmNvcnJlY3QgYW5zd2VyJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdpbmNvcnJlY3QnLCBsYWJlbDogJ0luY29ycmVjdCcgfSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGdldEJ5VGVzdElkKCdjbG9zZS1pY29uJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCByZW5kZXIgd2hlbiBjb3JyZWN0bmVzcyBpcyBudWxsJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGNvcnJlY3RuZXNzOiBudWxsIH0pO1xuICAgICAgY29uc3QgZm9yZWlnbk9iamVjdCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdmb3JlaWduT2JqZWN0Jyk7XG4gICAgICBleHBlY3QoZm9yZWlnbk9iamVjdCkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCByZW5kZXIgd2hlbiBjb3JyZWN0bmVzcyBpcyB1bmRlZmluZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgY29ycmVjdG5lc3M6IHVuZGVmaW5lZCB9KTtcbiAgICAgIGNvbnN0IGZvcmVpZ25PYmplY3QgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZm9yZWlnbk9iamVjdCcpO1xuICAgICAgZXhwZWN0KGZvcmVpZ25PYmplY3QpLm5vdC50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgcmVuZGVyIHdoZW4gaW50ZXJhY3RpdmUgaXMgZmFsc2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgaW50ZXJhY3RpdmU6IGZhbHNlIH0pO1xuICAgICAgY29uc3QgZm9yZWlnbk9iamVjdCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdmb3JlaWduT2JqZWN0Jyk7XG4gICAgICBleHBlY3QoZm9yZWlnbk9iamVjdCkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlbmRlciB3aXRoIGNvcnJlY3QgdGl0bGUgZm9yIGNvcnJlY3QgYW5zd2VyJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JywgbGFiZWw6ICdXZWxsIGRvbmUhJyB9LFxuICAgICAgfSk7XG4gICAgICBjb25zdCBpY29uID0gZ2V0QnlUZXN0SWQoJ2NoZWNrLWljb24nKTtcbiAgICAgIGV4cGVjdChpY29uKS50b0hhdmVBdHRyaWJ1dGUoJ3RpdGxlJywgJ1dlbGwgZG9uZSEnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVuZGVyIHdpdGggY29ycmVjdCB0aXRsZSBmb3IgaW5jb3JyZWN0IGFuc3dlcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QnlUZXN0SWQgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNvcnJlY3RuZXNzOiB7IHZhbHVlOiAnaW5jb3JyZWN0JywgbGFiZWw6ICdUcnkgYWdhaW4nIH0sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGljb24gPSBnZXRCeVRlc3RJZCgnY2xvc2UtaWNvbicpO1xuICAgICAgZXhwZWN0KGljb24pLnRvSGF2ZUF0dHJpYnV0ZSgndGl0bGUnLCAnVHJ5IGFnYWluJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdwb3NpdGlvbmluZyB3aXRoIHNjYWxlJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdXNlIHNjYWxlIHRvIGNhbGN1bGF0ZSBwb3NpdGlvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBzY2FsZTogbW9ja1NjYWxlLFxuICAgICAgICB4OiA1LFxuICAgICAgICB5OiAxMCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZm9yZWlnbk9iamVjdCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdmb3JlaWduT2JqZWN0Jyk7XG4gICAgICBleHBlY3QobW9ja1NjYWxlLngpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDUpO1xuICAgICAgZXhwZWN0KG1vY2tTY2FsZS55KS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgxMCk7XG4gICAgICAvLyBwb3NpdGlvbiBpcyBzY2FsZWQgdmFsdWUgLSAxMSAoaGFsZiBvZiAyMnB4IGljb24gc2l6ZSlcbiAgICAgIGV4cGVjdChmb3JlaWduT2JqZWN0KS50b0hhdmVBdHRyaWJ1dGUoJ3gnLCAnMzknKTsgLy8gNTAgLSAxMVxuICAgICAgZXhwZWN0KGZvcmVpZ25PYmplY3QpLnRvSGF2ZUF0dHJpYnV0ZSgneScsICc4OScpOyAvLyAxMDAgLSAxMVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYXZlIGNvcnJlY3Qgc2l6ZSBhdHRyaWJ1dGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCgpO1xuICAgICAgY29uc3QgZm9yZWlnbk9iamVjdCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdmb3JlaWduT2JqZWN0Jyk7XG4gICAgICBleHBlY3QoZm9yZWlnbk9iamVjdCkudG9IYXZlQXR0cmlidXRlKCd3aWR0aCcsICcyMicpO1xuICAgICAgZXhwZWN0KGZvcmVpZ25PYmplY3QpLnRvSGF2ZUF0dHJpYnV0ZSgnaGVpZ2h0JywgJzIyJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBkaWZmZXJlbnQgeCBhbmQgeSB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgeDogMjAsXG4gICAgICAgIHk6IDMwLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QobW9ja1NjYWxlLngpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDIwKTtcbiAgICAgIGV4cGVjdChtb2NrU2NhbGUueSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoMzApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB1c2UgcmF3IHZhbHVlcyB3aGVuIHNjYWxlIGlzIG5vdCBwcm92aWRlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBzY2FsZTogbnVsbCxcbiAgICAgICAgeDogNTAsXG4gICAgICAgIHk6IDEwMCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZm9yZWlnbk9iamVjdCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdmb3JlaWduT2JqZWN0Jyk7XG4gICAgICBleHBlY3QoZm9yZWlnbk9iamVjdCkudG9IYXZlQXR0cmlidXRlKCd4JywgJzM5Jyk7IC8vIDUwIC0gMTFcbiAgICAgIGV4cGVjdChmb3JlaWduT2JqZWN0KS50b0hhdmVBdHRyaWJ1dGUoJ3knLCAnODknKTsgLy8gMTAwIC0gMTFcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2VkZ2UgY2FzZXMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgemVybyBjb29yZGluYXRlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICB4OiAwLFxuICAgICAgICB5OiAwLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBmb3JlaWduT2JqZWN0ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2ZvcmVpZ25PYmplY3QnKTtcbiAgICAgIGV4cGVjdChmb3JlaWduT2JqZWN0KS50b0hhdmVBdHRyaWJ1dGUoJ3gnLCAnLTExJyk7XG4gICAgICBleHBlY3QoZm9yZWlnbk9iamVjdCkudG9IYXZlQXR0cmlidXRlKCd5JywgJy0xMScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbmVnYXRpdmUgY29vcmRpbmF0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgeDogLTUsXG4gICAgICAgIHk6IC0xMCxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KG1vY2tTY2FsZS54KS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgtNSk7XG4gICAgICBleHBlY3QobW9ja1NjYWxlLnkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKC0xMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBsYXJnZSBjb29yZGluYXRlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICB4OiAxMDAwLFxuICAgICAgICB5OiAyMDAwLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QobW9ja1NjYWxlLngpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDEwMDApO1xuICAgICAgZXhwZWN0KG1vY2tTY2FsZS55KS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgyMDAwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGNvcnJlY3RuZXNzIHdpdGggZW1wdHkgbGFiZWwnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEJ5VGVzdElkIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjb3JyZWN0bmVzczogeyB2YWx1ZTogJ2NvcnJlY3QnLCBsYWJlbDogJycgfSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgaWNvbiA9IGdldEJ5VGVzdElkKCdjaGVjay1pY29uJyk7XG4gICAgICBleHBlY3QoaWNvbikudG9IYXZlQXR0cmlidXRlKCd0aXRsZScsICcnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGNvcnJlY3RuZXNzIHdpdGggdW5kZWZpbmVkIGxhYmVsJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JywgbGFiZWw6IHVuZGVmaW5lZCB9LFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoZ2V0QnlUZXN0SWQoJ2NoZWNrLWljb24nKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVuZGVyIHdoZW4gYm90aCBjb3JyZWN0bmVzcyBhbmQgaW50ZXJhY3RpdmUgYXJlIHRydWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JywgbGFiZWw6ICdUZXN0JyB9LFxuICAgICAgICBpbnRlcmFjdGl2ZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdmb3JlaWduT2JqZWN0JykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCByZW5kZXIgd2hlbiBpbnRlcmFjdGl2ZSBpcyBmYWxzZSBldmVuIHdpdGggY29ycmVjdG5lc3MnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JywgbGFiZWw6ICdUZXN0JyB9LFxuICAgICAgICBpbnRlcmFjdGl2ZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIucXVlcnlTZWxlY3RvcignZm9yZWlnbk9iamVjdCcpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ1NtYWxsQ29ycmVjdFBvaW50SW5kaWNhdG9yJywgKCkgPT4ge1xuICBjb25zdCBtb2NrU2NhbGUgPSB7XG4gICAgeDogamVzdC5mbigodmFsKSA9PiB2YWwgKiAxMCksXG4gICAgeTogamVzdC5mbigodmFsKSA9PiB2YWwgKiAxMCksXG4gIH07XG5cbiAgY29uc3QgY29ycmVjdERhdGEgPSBbXG4gICAgeyBsYWJlbDogJ0EnLCB2YWx1ZTogMTAgfSxcbiAgICB7IGxhYmVsOiAnQicsIHZhbHVlOiAyMCB9LFxuICAgIHsgbGFiZWw6ICdDJywgdmFsdWU6ICczMCcgfSxcbiAgXTtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBqZXN0LmNsZWFyQWxsTW9ja3MoKTtcbiAgfSk7XG5cbiAgY29uc3QgcmVuZGVyQ29tcG9uZW50ID0gKGV4dHJhcyA9IHt9KSA9PiB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSB7XG4gICAgICBzY2FsZTogbW9ja1NjYWxlLFxuICAgICAgeDogNSxcbiAgICAgIGNvcnJlY3RuZXNzOiB7IHZhbHVlOiAnaW5jb3JyZWN0JywgbGFiZWw6ICdJbmNvcnJlY3QnIH0sXG4gICAgICBjb3JyZWN0RGF0YSxcbiAgICAgIGxhYmVsOiAnQScsXG4gICAgfTtcbiAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdHMsIC4uLmV4dHJhcyB9O1xuICAgIHJldHVybiByZW5kZXIoXG4gICAgICA8VGhlbWVQcm92aWRlciB0aGVtZT17dGhlbWV9PlxuICAgICAgICA8c3ZnPlxuICAgICAgICAgIDxTbWFsbENvcnJlY3RQb2ludEluZGljYXRvciB7Li4ucHJvcHN9IC8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9UaGVtZVByb3ZpZGVyPixcbiAgICApO1xuICB9O1xuXG4gIGRlc2NyaWJlKCdyZW5kZXJpbmcnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZW5kZXIgd2l0aG91dCBjcmFzaGluZycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoKTtcbiAgICAgIGV4cGVjdChjb250YWluZXIpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlbmRlciBmb3JlaWduT2JqZWN0IHdoZW4gaW5jb3JyZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNvcnJlY3RuZXNzOiB7IHZhbHVlOiAnaW5jb3JyZWN0JywgbGFiZWw6ICdXcm9uZycgfSxcbiAgICAgICAgbGFiZWw6ICdBJyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZm9yZWlnbk9iamVjdCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdmb3JlaWduT2JqZWN0Jyk7XG4gICAgICBleHBlY3QoZm9yZWlnbk9iamVjdCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVuZGVyIHNtYWxsIGNoZWNrIGljb24gd2hlbiBpbmNvcnJlY3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEJ5VGVzdElkIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjb3JyZWN0bmVzczogeyB2YWx1ZTogJ2luY29ycmVjdCcsIGxhYmVsOiAnV3JvbmcnIH0sXG4gICAgICAgIGxhYmVsOiAnQScsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGljb24gPSBnZXRCeVRlc3RJZCgnY2hlY2staWNvbicpO1xuICAgICAgZXhwZWN0KGljb24pLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBleHBlY3QoaWNvbikudG9IYXZlQ2xhc3MoJ3NtYWxsJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCByZW5kZXIgd2hlbiBjb3JyZWN0bmVzcyBpcyBjb3JyZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNvcnJlY3RuZXNzOiB7IHZhbHVlOiAnY29ycmVjdCcsIGxhYmVsOiAnQ29ycmVjdCcgfSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZm9yZWlnbk9iamVjdCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdmb3JlaWduT2JqZWN0Jyk7XG4gICAgICBleHBlY3QoZm9yZWlnbk9iamVjdCkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCByZW5kZXIgd2hlbiBjb3JyZWN0bmVzcyBpcyBudWxsJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGNvcnJlY3RuZXNzOiBudWxsIH0pO1xuICAgICAgY29uc3QgZm9yZWlnbk9iamVjdCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdmb3JlaWduT2JqZWN0Jyk7XG4gICAgICBleHBlY3QoZm9yZWlnbk9iamVjdCkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCByZW5kZXIgd2hlbiBjb3JyZWN0bmVzcyBpcyB1bmRlZmluZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgY29ycmVjdG5lc3M6IHVuZGVmaW5lZCB9KTtcbiAgICAgIGNvbnN0IGZvcmVpZ25PYmplY3QgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZm9yZWlnbk9iamVjdCcpO1xuICAgICAgZXhwZWN0KGZvcmVpZ25PYmplY3QpLm5vdC50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncG9zaXRpb25pbmcnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBjYWxjdWxhdGUgY29ycmVjdCBwb3NpdGlvbiBmb3IgbGFiZWwgQScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICB4OiA1LFxuICAgICAgICBsYWJlbDogJ0EnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBmb3JlaWduT2JqZWN0ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2ZvcmVpZ25PYmplY3QnKTtcbiAgICAgIGV4cGVjdChtb2NrU2NhbGUueCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoNSk7XG4gICAgICBleHBlY3QobW9ja1NjYWxlLnkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDEwKTsgLy8gdmFsdWUgZnJvbSBjb3JyZWN0RGF0YSBmb3IgbGFiZWwgQVxuICAgICAgLy8gUG9zaXRpb24gaXMgc2NhbGVkIHZhbHVlIC0gNy41IChoYWxmIG9mIDE1cHggc21hbGwgaWNvbiBzaXplKVxuICAgICAgZXhwZWN0KGZvcmVpZ25PYmplY3QpLnRvSGF2ZUF0dHJpYnV0ZSgneCcsICc0Mi41Jyk7IC8vIDUwIC0gNy41XG4gICAgICBleHBlY3QoZm9yZWlnbk9iamVjdCkudG9IYXZlQXR0cmlidXRlKCd5JywgJzkyLjUnKTsgLy8gMTAwIC0gNy41XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNhbGN1bGF0ZSBjb3JyZWN0IHBvc2l0aW9uIGZvciBsYWJlbCBCJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIHg6IDUsXG4gICAgICAgIGxhYmVsOiAnQicsXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChtb2NrU2NhbGUueSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoMjApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjYWxjdWxhdGUgY29ycmVjdCBwb3NpdGlvbiBmb3IgbGFiZWwgQyB3aXRoIHN0cmluZyB2YWx1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICB4OiA1LFxuICAgICAgICBsYWJlbDogJ0MnLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QobW9ja1NjYWxlLnkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDMwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGF2ZSBjb3JyZWN0IHNpemUgYXR0cmlidXRlcyBmb3Igc21hbGwgaWNvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBsYWJlbDogJ0EnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBmb3JlaWduT2JqZWN0ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2ZvcmVpZ25PYmplY3QnKTtcbiAgICAgIGV4cGVjdChmb3JlaWduT2JqZWN0KS50b0hhdmVBdHRyaWJ1dGUoJ3dpZHRoJywgJzE1Jyk7XG4gICAgICBleHBlY3QoZm9yZWlnbk9iamVjdCkudG9IYXZlQXR0cmlidXRlKCdoZWlnaHQnLCAnMTUnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2NvcnJlY3REYXRhIGhhbmRsaW5nJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZmluZCBjb3JyZWN0IHZhbHVlIGZyb20gY29ycmVjdERhdGEgYnkgbGFiZWwnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgbGFiZWw6ICdCJyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZm9yZWlnbk9iamVjdCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdmb3JlaWduT2JqZWN0Jyk7XG4gICAgICBleHBlY3QoZm9yZWlnbk9iamVjdCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChtb2NrU2NhbGUueSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoMjApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgcmVuZGVyIHdoZW4gbGFiZWwgaXMgbm90IGluIGNvcnJlY3REYXRhJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGxhYmVsOiAnWicsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGZvcmVpZ25PYmplY3QgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZm9yZWlnbk9iamVjdCcpO1xuICAgICAgZXhwZWN0KGZvcmVpZ25PYmplY3QpLm5vdC50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgcmVuZGVyIHdoZW4gY29ycmVjdERhdGEgdmFsdWUgaXMgTmFOJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNvcnJlY3REYXRhOiBbeyBsYWJlbDogJ0EnLCB2YWx1ZTogJ2ludmFsaWQnIH1dLFxuICAgICAgICBsYWJlbDogJ0EnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBmb3JlaWduT2JqZWN0ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2ZvcmVpZ25PYmplY3QnKTtcbiAgICAgIGV4cGVjdChmb3JlaWduT2JqZWN0KS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGVtcHR5IGNvcnJlY3REYXRhIGFycmF5JywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNvcnJlY3REYXRhOiBbXSxcbiAgICAgICAgbGFiZWw6ICdBJyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZm9yZWlnbk9iamVjdCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdmb3JlaWduT2JqZWN0Jyk7XG4gICAgICBleHBlY3QoZm9yZWlnbk9iamVjdCkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCByZW5kZXIgd2hlbiBjb3JyZWN0RGF0YSBpcyB1bmRlZmluZWQgKGNvcnJlY3RuZXNzIG5vdCBpbmNvcnJlY3QpJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNvcnJlY3RuZXNzOiB7IHZhbHVlOiAnY29ycmVjdCcsIGxhYmVsOiAnQ29ycmVjdCcgfSxcbiAgICAgICAgY29ycmVjdERhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgbGFiZWw6ICdBJyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZm9yZWlnbk9iamVjdCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdmb3JlaWduT2JqZWN0Jyk7XG4gICAgICBleHBlY3QoZm9yZWlnbk9iamVjdCkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHBhcnNlIHN0cmluZyB2YWx1ZXMgY29ycmVjdGx5JywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNvcnJlY3REYXRhOiBbeyBsYWJlbDogJ0QnLCB2YWx1ZTogJzQ1LjUnIH1dLFxuICAgICAgICBsYWJlbDogJ0QnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBmb3JlaWduT2JqZWN0ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2ZvcmVpZ25PYmplY3QnKTtcbiAgICAgIGV4cGVjdChmb3JlaWduT2JqZWN0KS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KG1vY2tTY2FsZS55KS50b0hhdmVCZWVuQ2FsbGVkV2l0aCg0NS41KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHplcm8gdmFsdWVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNvcnJlY3REYXRhOiBbeyBsYWJlbDogJ0UnLCB2YWx1ZTogMCB9XSxcbiAgICAgICAgbGFiZWw6ICdFJyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZm9yZWlnbk9iamVjdCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdmb3JlaWduT2JqZWN0Jyk7XG4gICAgICBleHBlY3QoZm9yZWlnbk9iamVjdCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChtb2NrU2NhbGUueSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBuZWdhdGl2ZSB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgY29ycmVjdERhdGE6IFt7IGxhYmVsOiAnRicsIHZhbHVlOiAtMTAgfV0sXG4gICAgICAgIGxhYmVsOiAnRicsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGZvcmVpZ25PYmplY3QgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZm9yZWlnbk9iamVjdCcpO1xuICAgICAgZXhwZWN0KGZvcmVpZ25PYmplY3QpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBleHBlY3QobW9ja1NjYWxlLnkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKC0xMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpY29uIHByb3BlcnRpZXMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZW5kZXIgaWNvbiB3aXRoIGNvcnJlY3QgdGl0bGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEJ5VGVzdElkIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjb3JyZWN0bmVzczogeyB2YWx1ZTogJ2luY29ycmVjdCcsIGxhYmVsOiAnTm90IHF1aXRlIHJpZ2h0JyB9LFxuICAgICAgICBsYWJlbDogJ0EnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBpY29uID0gZ2V0QnlUZXN0SWQoJ2NoZWNrLWljb24nKTtcbiAgICAgIGV4cGVjdChpY29uKS50b0hhdmVBdHRyaWJ1dGUoJ3RpdGxlJywgJ05vdCBxdWl0ZSByaWdodCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZW5kZXIgaWNvbiB3aXRoIHNtYWxsIGNsYXNzTmFtZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QnlUZXN0SWQgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGxhYmVsOiAnQScsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGljb24gPSBnZXRCeVRlc3RJZCgnY2hlY2staWNvbicpO1xuICAgICAgZXhwZWN0KGljb24pLnRvSGF2ZUNsYXNzKCdzbWFsbCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZWRnZSBjYXNlcycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBtaXNzaW5nIGxhYmVsIHByb3AnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgbGFiZWw6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZm9yZWlnbk9iamVjdCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdmb3JlaWduT2JqZWN0Jyk7XG4gICAgICBleHBlY3QoZm9yZWlnbk9iamVjdCkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBlbXB0eSBzdHJpbmcgbGFiZWwnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgbGFiZWw6ICcnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBmb3JlaWduT2JqZWN0ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2ZvcmVpZ25PYmplY3QnKTtcbiAgICAgIGV4cGVjdChmb3JlaWduT2JqZWN0KS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHZlcnkgbGFyZ2UgdmFsdWVzIGluIGNvcnJlY3REYXRhJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNvcnJlY3REYXRhOiBbeyBsYWJlbDogJ0cnLCB2YWx1ZTogOTk5OTk5IH1dLFxuICAgICAgICBsYWJlbDogJ0cnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBmb3JlaWduT2JqZWN0ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2ZvcmVpZ25PYmplY3QnKTtcbiAgICAgIGV4cGVjdChmb3JlaWduT2JqZWN0KS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KG1vY2tTY2FsZS55KS50b0hhdmVCZWVuQ2FsbGVkV2l0aCg5OTk5OTkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBvbmx5IHJlbmRlciBmb3IgaW5jb3JyZWN0IGFuc3dlcnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lcjogaW5jb3JyZWN0Q29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjb3JyZWN0bmVzczogeyB2YWx1ZTogJ2luY29ycmVjdCcsIGxhYmVsOiAnV3JvbmcnIH0sXG4gICAgICAgIGxhYmVsOiAnQScsXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChpbmNvcnJlY3RDb250YWluZXIucXVlcnlTZWxlY3RvcignZm9yZWlnbk9iamVjdCcpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuXG4gICAgICBjb25zdCB7IGNvbnRhaW5lcjogY29ycmVjdENvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JywgbGFiZWw6ICdSaWdodCcgfSxcbiAgICAgICAgbGFiZWw6ICdBJyxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvcnJlY3RDb250YWluZXIucXVlcnlTZWxlY3RvcignZm9yZWlnbk9iamVjdCcpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ1RpY2tDb3JyZWN0bmVzc0luZGljYXRvcicsICgpID0+IHtcbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgamVzdC5jbGVhckFsbE1vY2tzKCk7XG4gIH0pO1xuXG4gIGNvbnN0IHJlbmRlckNvbXBvbmVudCA9IChleHRyYXMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IGRlZmF1bHRzID0ge1xuICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JywgbGFiZWw6ICdDb3JyZWN0IEFuc3dlcicgfSxcbiAgICAgIGludGVyYWN0aXZlOiB0cnVlLFxuICAgIH07XG4gICAgY29uc3QgcHJvcHMgPSB7IC4uLmRlZmF1bHRzLCAuLi5leHRyYXMgfTtcbiAgICByZXR1cm4gcmVuZGVyKFxuICAgICAgPFRoZW1lUHJvdmlkZXIgdGhlbWU9e3RoZW1lfT5cbiAgICAgICAgPFRpY2tDb3JyZWN0bmVzc0luZGljYXRvciB7Li4ucHJvcHN9IC8+XG4gICAgICA8L1RoZW1lUHJvdmlkZXI+LFxuICAgICk7XG4gIH07XG5cbiAgZGVzY3JpYmUoJ3JlbmRlcmluZycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJlbmRlciB3aXRob3V0IGNyYXNoaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCgpO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVuZGVyIGNoZWNrIGljb24gZm9yIGNvcnJlY3QgYW5zd2VyJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JywgbGFiZWw6ICdDb3JyZWN0JyB9LFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoZ2V0QnlUZXN0SWQoJ2NoZWNrLWljb24nKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVuZGVyIGNsb3NlIGljb24gZm9yIGluY29ycmVjdCBhbnN3ZXInLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEJ5VGVzdElkIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjb3JyZWN0bmVzczogeyB2YWx1ZTogJ2luY29ycmVjdCcsIGxhYmVsOiAnSW5jb3JyZWN0JyB9LFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoZ2V0QnlUZXN0SWQoJ2Nsb3NlLWljb24nKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IHJlbmRlciB3aGVuIGNvcnJlY3RuZXNzIGlzIG51bGwnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IHF1ZXJ5QnlUZXN0SWQgfSA9IHJlbmRlckNvbXBvbmVudCh7IGNvcnJlY3RuZXNzOiBudWxsIH0pO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ2NoZWNrLWljb24nKSkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBleHBlY3QocXVlcnlCeVRlc3RJZCgnY2xvc2UtaWNvbicpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IHJlbmRlciB3aGVuIGNvcnJlY3RuZXNzIGlzIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcXVlcnlCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHsgY29ycmVjdG5lc3M6IHVuZGVmaW5lZCB9KTtcbiAgICAgIGV4cGVjdChxdWVyeUJ5VGVzdElkKCdjaGVjay1pY29uJykpLm5vdC50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ2Nsb3NlLWljb24nKSkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCByZW5kZXIgd2hlbiBpbnRlcmFjdGl2ZSBpcyBmYWxzZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcXVlcnlCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHsgaW50ZXJhY3RpdmU6IGZhbHNlIH0pO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ2NoZWNrLWljb24nKSkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBleHBlY3QocXVlcnlCeVRlc3RJZCgnY2xvc2UtaWNvbicpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVuZGVyIHdpdGggY29ycmVjdCB0aXRsZSBmb3IgY29ycmVjdCBhbnN3ZXInLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEJ5VGVzdElkIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjb3JyZWN0bmVzczogeyB2YWx1ZTogJ2NvcnJlY3QnLCBsYWJlbDogJ0dyZWF0IGpvYiEnIH0sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGljb24gPSBnZXRCeVRlc3RJZCgnY2hlY2staWNvbicpO1xuICAgICAgZXhwZWN0KGljb24pLnRvSGF2ZUF0dHJpYnV0ZSgndGl0bGUnLCAnR3JlYXQgam9iIScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZW5kZXIgd2l0aCBjb3JyZWN0IHRpdGxlIGZvciBpbmNvcnJlY3QgYW5zd2VyJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdpbmNvcnJlY3QnLCBsYWJlbDogJ05vdCBjb3JyZWN0JyB9LFxuICAgICAgfSk7XG4gICAgICBjb25zdCBpY29uID0gZ2V0QnlUZXN0SWQoJ2Nsb3NlLWljb24nKTtcbiAgICAgIGV4cGVjdChpY29uKS50b0hhdmVBdHRyaWJ1dGUoJ3RpdGxlJywgJ05vdCBjb3JyZWN0Jyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpbnRlcmFjdGl2ZSBmbGFnJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmVuZGVyIHdoZW4gaW50ZXJhY3RpdmUgaXMgdHJ1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QnlUZXN0SWQgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGludGVyYWN0aXZlOiB0cnVlLFxuICAgICAgICBjb3JyZWN0bmVzczogeyB2YWx1ZTogJ2NvcnJlY3QnLCBsYWJlbDogJ1Rlc3QnIH0sXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChnZXRCeVRlc3RJZCgnY2hlY2staWNvbicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgcmVuZGVyIHdoZW4gaW50ZXJhY3RpdmUgaXMgZmFsc2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IHF1ZXJ5QnlUZXN0SWQgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGludGVyYWN0aXZlOiBmYWxzZSxcbiAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JywgbGFiZWw6ICdUZXN0JyB9LFxuICAgICAgfSk7XG4gICAgICBleHBlY3QocXVlcnlCeVRlc3RJZCgnY2hlY2staWNvbicpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IHJlbmRlciB3aGVuIGludGVyYWN0aXZlIGlzIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcXVlcnlCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgaW50ZXJhY3RpdmU6IHVuZGVmaW5lZCxcbiAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JywgbGFiZWw6ICdUZXN0JyB9LFxuICAgICAgfSk7XG4gICAgICBleHBlY3QocXVlcnlCeVRlc3RJZCgnY2hlY2staWNvbicpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IHJlbmRlciB3aGVuIGludGVyYWN0aXZlIGlzIG51bGwnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IHF1ZXJ5QnlUZXN0SWQgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGludGVyYWN0aXZlOiBudWxsLFxuICAgICAgICBjb3JyZWN0bmVzczogeyB2YWx1ZTogJ2NvcnJlY3QnLCBsYWJlbDogJ1Rlc3QnIH0sXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChxdWVyeUJ5VGVzdElkKCdjaGVjay1pY29uJykpLm5vdC50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY29ycmVjdG5lc3MgdmFsdWVzJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmVuZGVyIGNoZWNrIGljb24gd2hlbiB2YWx1ZSBpcyBcImNvcnJlY3RcIicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QnlUZXN0SWQsIHF1ZXJ5QnlUZXN0SWQgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNvcnJlY3RuZXNzOiB7IHZhbHVlOiAnY29ycmVjdCcsIGxhYmVsOiAnVGVzdCcgfSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGdldEJ5VGVzdElkKCdjaGVjay1pY29uJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBleHBlY3QocXVlcnlCeVRlc3RJZCgnY2xvc2UtaWNvbicpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVuZGVyIGNsb3NlIGljb24gd2hlbiB2YWx1ZSBpcyBcImluY29ycmVjdFwiJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRlc3RJZCwgcXVlcnlCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdpbmNvcnJlY3QnLCBsYWJlbDogJ1Rlc3QnIH0sXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChnZXRCeVRlc3RJZCgnY2xvc2UtaWNvbicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ2NoZWNrLWljb24nKSkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlbmRlciBjbG9zZSBpY29uIGZvciBhbnkgdmFsdWUgb3RoZXIgdGhhbiBcImNvcnJlY3RcIicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QnlUZXN0SWQgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNvcnJlY3RuZXNzOiB7IHZhbHVlOiAncGFydGlhbCcsIGxhYmVsOiAnVGVzdCcgfSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGdldEJ5VGVzdElkKCdjbG9zZS1pY29uJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBlbXB0eSB2YWx1ZSBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEJ5VGVzdElkIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjb3JyZWN0bmVzczogeyB2YWx1ZTogJycsIGxhYmVsOiAnVGVzdCcgfSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGdldEJ5VGVzdElkKCdjbG9zZS1pY29uJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdlZGdlIGNhc2VzJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgaGFuZGxlIGNvcnJlY3RuZXNzIHdpdGggZW1wdHkgbGFiZWwnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEJ5VGVzdElkIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjb3JyZWN0bmVzczogeyB2YWx1ZTogJ2NvcnJlY3QnLCBsYWJlbDogJycgfSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgaWNvbiA9IGdldEJ5VGVzdElkKCdjaGVjay1pY29uJyk7XG4gICAgICBleHBlY3QoaWNvbikudG9IYXZlQXR0cmlidXRlKCd0aXRsZScsICcnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGNvcnJlY3RuZXNzIHdpdGggdW5kZWZpbmVkIGxhYmVsJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JywgbGFiZWw6IHVuZGVmaW5lZCB9LFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoZ2V0QnlUZXN0SWQoJ2NoZWNrLWljb24nKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGNvcnJlY3RuZXNzIHdpdGggbnVsbCB2YWx1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcXVlcnlCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6IG51bGwsIGxhYmVsOiAnVGVzdCcgfSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ2Nsb3NlLWljb24nKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVxdWlyZSBib3RoIGNvcnJlY3RuZXNzIGFuZCBpbnRlcmFjdGl2ZSB0byByZW5kZXInLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IHF1ZXJ5QnlUZXN0SWQ6IHF1ZXJ5MSB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JywgbGFiZWw6ICdUZXN0JyB9LFxuICAgICAgICBpbnRlcmFjdGl2ZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChxdWVyeTEoJ2NoZWNrLWljb24nKSkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG5cbiAgICAgIGNvbnN0IHsgcXVlcnlCeVRlc3RJZDogcXVlcnkyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjb3JyZWN0bmVzczogbnVsbCxcbiAgICAgICAgaW50ZXJhY3RpdmU6IHRydWUsXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChxdWVyeTIoJ2NoZWNrLWljb24nKSkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gbGFiZWwnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEJ5VGVzdElkIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjb3JyZWN0bmVzczogeyB2YWx1ZTogJ2NvcnJlY3QnLCBsYWJlbDogJ1Rlc3QgPD4mXCInIH0sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGljb24gPSBnZXRCeVRlc3RJZCgnY2hlY2staWNvbicpO1xuICAgICAgZXhwZWN0KGljb24pLnRvSGF2ZUF0dHJpYnV0ZSgndGl0bGUnLCAnVGVzdCA8PiZcIicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgdW5pY29kZSBjaGFyYWN0ZXJzIGluIGxhYmVsJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JywgbGFiZWw6ICdUZXN0IOS9oOWlvSDwn46JJyB9LFxuICAgICAgfSk7XG4gICAgICBjb25zdCBpY29uID0gZ2V0QnlUZXN0SWQoJ2NoZWNrLWljb24nKTtcbiAgICAgIGV4cGVjdChpY29uKS50b0hhdmVBdHRyaWJ1dGUoJ3RpdGxlJywgJ1Rlc3Qg5L2g5aW9IPCfjoknKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHZlcnkgbG9uZyBsYWJlbHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBsb25nTGFiZWwgPSAnVGhpcyBpcyBhIHZlcnkgbG9uZyBsYWJlbCB0aGF0IG1pZ2h0IGNhdXNlIGxheW91dCBpc3N1ZXMgaW4gdGhlIFVJJztcbiAgICAgIGNvbnN0IHsgZ2V0QnlUZXN0SWQgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNvcnJlY3RuZXNzOiB7IHZhbHVlOiAnY29ycmVjdCcsIGxhYmVsOiBsb25nTGFiZWwgfSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgaWNvbiA9IGdldEJ5VGVzdElkKCdjaGVjay1pY29uJyk7XG4gICAgICBleHBlY3QoaWNvbikudG9IYXZlQXR0cmlidXRlKCd0aXRsZScsIGxvbmdMYWJlbCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjb21wb25lbnQgY29uc2lzdGVuY3knLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZW5kZXIgc2FtZSBpY29uIHR5cGUgY29uc2lzdGVudGx5IGZvciBzYW1lIGNvcnJlY3RuZXNzIHZhbHVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRlc3RJZCwgdW5tb3VudCB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JywgbGFiZWw6ICdUZXN0IDEnIH0sXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KGdldEJ5VGVzdElkKCdjaGVjay1pY29uJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICB1bm1vdW50KCk7XG5cbiAgICAgIGNvbnN0IHsgZ2V0QnlUZXN0SWQ6IGdldDIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNvcnJlY3RuZXNzOiB7IHZhbHVlOiAnY29ycmVjdCcsIGxhYmVsOiAnVGVzdCAyJyB9LFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChnZXQyKCdjaGVjay1pY29uJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlbmRlciBkaWZmZXJlbnQgaWNvbnMgZm9yIGRpZmZlcmVudCBjb3JyZWN0bmVzcyB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEJ5VGVzdElkLCB1bm1vdW50IH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjb3JyZWN0bmVzczogeyB2YWx1ZTogJ2NvcnJlY3QnLCBsYWJlbDogJ0NvcnJlY3QnIH0sXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KGdldEJ5VGVzdElkKCdjaGVjay1pY29uJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICB1bm1vdW50KCk7XG5cbiAgICAgIGNvbnN0IHsgZ2V0QnlUZXN0SWQ6IGdldDIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNvcnJlY3RuZXNzOiB7IHZhbHVlOiAnaW5jb3JyZWN0JywgbGFiZWw6ICdJbmNvcnJlY3QnIH0sXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KGdldDIoJ2Nsb3NlLWljb24nKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FB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QWlDckcsZUFBZSxDQUFDO1VBQy9DSSxXQUFXLEVBQUU7WUFBRUMsS0FBSyxFQUFFLFNBQVM7WUFBRUMsS0FBSyxFQUFFO1VBQVM7UUFDbkQsQ0FBQyxDQUFDO1FBRk1jLFdBQVcsR0FBQWlGLGtCQUFBLENBQVhqRixXQUFXO1FBQUVrRixPQUFPLEdBQUFELGtCQUFBLENBQVBDLE9BQU87TUFJNUJ4RixNQUFNLENBQUNNLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDTCxpQkFBaUIsQ0FBQyxDQUFDO01BQ3JEdUYsT0FBTyxDQUFDLENBQUM7TUFFVCxJQUFBQyxrQkFBQSxHQUE4QnZHLGVBQWUsQ0FBQztVQUM1Q0ksV0FBVyxFQUFFO1lBQUVDLEtBQUssRUFBRSxTQUFTO1lBQUVDLEtBQUssRUFBRTtVQUFTO1FBQ25ELENBQUMsQ0FBQztRQUZtQmtHLElBQUksR0FBQUQsa0JBQUEsQ0FBakJuRixXQUFXO01BSW5CTixNQUFNLENBQUMwRixJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQ3pGLGlCQUFpQixDQUFDLENBQUM7SUFDaEQsQ0FBQyxDQUFDO0lBRUZKLEVBQUUsQ0FBQyxnRUFBZ0UsRUFBRSxZQUFNO01BQ3pFLElBQUE4RixrQkFBQSxHQUFpQ3pHLGVBQWUsQ0FBQztVQUMvQ0ksV0FBVyxFQUFFO1lBQUVDLEtBQUssRUFBRSxTQUFTO1lBQUVDLEtBQUssRUFBRTtVQUFVO1FBQ3BELENBQUMsQ0FBQztRQUZNYyxXQUFXLEdBQUFxRixrQkFBQSxDQUFYckYsV0FBVztRQUFFa0YsT0FBTyxHQUFBRyxrQkFBQSxDQUFQSCxPQUFPO01BSTVCeEYsTUFBTSxDQUFDTSxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQ0wsaUJBQWlCLENBQUMsQ0FBQztNQUNyRHVGLE9BQU8sQ0FBQyxDQUFDO01BRVQsSUFBQUksa0JBQUEsR0FBOEIxRyxlQUFlLENBQUM7VUFDNUNJLFdBQVcsRUFBRTtZQUFFQyxLQUFLLEVBQUUsV0FBVztZQUFFQyxLQUFLLEVBQUU7VUFBWTtRQUN4RCxDQUFDLENBQUM7UUFGbUJrRyxJQUFJLEdBQUFFLGtCQUFBLENBQWpCdEYsV0FBVztNQUluQk4sTUFBTSxDQUFDMEYsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUN6RixpQkFBaUIsQ0FBQyxDQUFDO0lBQ2hELENBQUMsQ0FBQztFQUNKLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==