@pie-lib/graphing 3.2.0-next.0 → 3.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 (113) hide show
  1. package/lib/__tests__/bg.test.js +282 -0
  2. package/lib/__tests__/coordinates-label.test.js +276 -0
  3. package/lib/__tests__/graph-with-controls.test.js +275 -0
  4. package/lib/__tests__/graph.test.js +927 -0
  5. package/lib/__tests__/grid-setup.test.js +729 -0
  6. package/lib/__tests__/grid.test.js +29 -0
  7. package/lib/__tests__/key-legend.test.js +321 -0
  8. package/lib/__tests__/label-svg-icon.test.js +373 -0
  9. package/lib/__tests__/labels.test.js +61 -0
  10. package/lib/__tests__/mark-label.test.js +133 -0
  11. package/lib/__tests__/toggle-bar.test.js +197 -0
  12. package/lib/__tests__/tool-menu.test.js +151 -0
  13. package/lib/__tests__/undo-redo.test.js +31 -0
  14. package/lib/__tests__/use-debounce.test.js +24 -0
  15. package/lib/__tests__/utils.js +70 -0
  16. package/lib/__tests__/utils.test.js +123 -0
  17. package/lib/axis/__tests__/arrow.test.js +60 -0
  18. package/lib/axis/__tests__/axes.test.js +195 -0
  19. package/lib/axis/arrow.js +1 -1
  20. package/lib/axis/axes.js +1 -1
  21. package/lib/axis/index.js +1 -1
  22. package/lib/bg.js +1 -1
  23. package/lib/container/__tests__/actions.test.js +108 -0
  24. package/lib/container/__tests__/index.test.js +503 -0
  25. package/lib/container/__tests__/marks.test.js +259 -0
  26. package/lib/container/__tests__/middleware.test.js +244 -0
  27. package/lib/container/__tests__/reducer.test.js +450 -0
  28. package/lib/container/actions.js +1 -1
  29. package/lib/container/index.js +1 -1
  30. package/lib/container/marks.js +1 -1
  31. package/lib/container/middleware.js +1 -1
  32. package/lib/container/reducer.js +1 -1
  33. package/lib/coordinates-label.js +1 -1
  34. package/lib/graph-with-controls.js +1 -1
  35. package/lib/graph.js +1 -1
  36. package/lib/grid-setup.js +1 -1
  37. package/lib/grid.js +1 -1
  38. package/lib/index.js +1 -1
  39. package/lib/key-legend.js +1 -1
  40. package/lib/label-svg-icon.js +1 -1
  41. package/lib/labels.js +1 -1
  42. package/lib/mark-label.js +1 -1
  43. package/lib/toggle-bar.js +1 -1
  44. package/lib/tool-menu.js +1 -1
  45. package/lib/tools/absolute/__tests__/component.test.js +65 -0
  46. package/lib/tools/absolute/component.js +1 -1
  47. package/lib/tools/absolute/index.js +1 -1
  48. package/lib/tools/circle/__tests__/bg-circle.test.js +33 -0
  49. package/lib/tools/circle/__tests__/component.test.js +615 -0
  50. package/lib/tools/circle/__tests__/index.test.js +576 -0
  51. package/lib/tools/circle/bg-circle.js +1 -1
  52. package/lib/tools/circle/component.js +1 -1
  53. package/lib/tools/circle/index.js +1 -1
  54. package/lib/tools/exponential/__tests__/component.test.js +64 -0
  55. package/lib/tools/exponential/__tests__/index.test.js +828 -0
  56. package/lib/tools/exponential/component.js +1 -1
  57. package/lib/tools/exponential/index.js +1 -1
  58. package/lib/tools/index.js +1 -1
  59. package/lib/tools/line/__tests__/component.test.js +45 -0
  60. package/lib/tools/line/component.js +1 -1
  61. package/lib/tools/line/index.js +1 -1
  62. package/lib/tools/parabola/__tests__/component.test.js +64 -0
  63. package/lib/tools/parabola/__tests__/index.test.js +564 -0
  64. package/lib/tools/parabola/component.js +1 -1
  65. package/lib/tools/parabola/index.js +1 -1
  66. package/lib/tools/point/__tests__/component.test.js +434 -0
  67. package/lib/tools/point/__tests__/index.test.js +262 -0
  68. package/lib/tools/point/component.js +1 -1
  69. package/lib/tools/point/index.js +1 -1
  70. package/lib/tools/polygon/__tests__/component.test.js +485 -0
  71. package/lib/tools/polygon/__tests__/index.test.js +303 -0
  72. package/lib/tools/polygon/__tests__/line.test.js +50 -0
  73. package/lib/tools/polygon/__tests__/polygon.test.js +85 -0
  74. package/lib/tools/polygon/component.js +1 -1
  75. package/lib/tools/polygon/index.js +1 -1
  76. package/lib/tools/polygon/line.js +1 -1
  77. package/lib/tools/polygon/polygon.js +1 -1
  78. package/lib/tools/ray/__tests__/component.test.js +35 -0
  79. package/lib/tools/ray/component.js +1 -1
  80. package/lib/tools/ray/index.js +1 -1
  81. package/lib/tools/segment/__tests__/component.test.js +35 -0
  82. package/lib/tools/segment/component.js +1 -1
  83. package/lib/tools/segment/index.js +1 -1
  84. package/lib/tools/shared/__tests__/arrow-head.test.js +45 -0
  85. package/lib/tools/shared/arrow-head.js +1 -1
  86. package/lib/tools/shared/icons/CorrectSVG.js +1 -1
  87. package/lib/tools/shared/icons/IncorrectSVG.js +1 -1
  88. package/lib/tools/shared/icons/MissingSVG.js +1 -1
  89. package/lib/tools/shared/line/__tests__/index.test.js +124 -0
  90. package/lib/tools/shared/line/__tests__/line-path.test.js +62 -0
  91. package/lib/tools/shared/line/__tests__/with-root-edge.test.js +90 -0
  92. package/lib/tools/shared/line/index.js +1 -1
  93. package/lib/tools/shared/line/line-path.js +1 -1
  94. package/lib/tools/shared/line/with-root-edge.js +1 -1
  95. package/lib/tools/shared/point/__tests__/arrow-point.test.js +127 -0
  96. package/lib/tools/shared/point/__tests__/base-point.test.js +122 -0
  97. package/lib/tools/shared/point/arrow-point.js +1 -1
  98. package/lib/tools/shared/point/arrow.js +1 -1
  99. package/lib/tools/shared/point/base-point.js +1 -1
  100. package/lib/tools/shared/point/index.js +1 -1
  101. package/lib/tools/shared/styles.js +1 -1
  102. package/lib/tools/shared/types.js +1 -1
  103. package/lib/tools/sine/__tests__/component.test.js +72 -0
  104. package/lib/tools/sine/component.js +1 -1
  105. package/lib/tools/sine/index.js +1 -1
  106. package/lib/tools/vector/__tests__/component.test.js +32 -0
  107. package/lib/tools/vector/component.js +1 -1
  108. package/lib/tools/vector/index.js +1 -1
  109. package/lib/undo-redo.js +1 -1
  110. package/lib/use-debounce.js +1 -1
  111. package/lib/utils.js +1 -1
  112. package/package.json +9 -12
  113. package/LICENSE.md +0 -5
@@ -0,0 +1,828 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
5
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
6
+ var _index = require("../index");
7
+ var _utils = require("../../../utils");
8
+ 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; }
9
+ 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; }
10
+ jest.mock('../../../utils', function () {
11
+ return {
12
+ equalPoints: jest.fn(),
13
+ sameAxes: jest.fn()
14
+ };
15
+ });
16
+ jest.mock('debug', function () {
17
+ return jest.fn(function () {
18
+ return jest.fn();
19
+ });
20
+ });
21
+ describe('exponential tool', function () {
22
+ var exponentialTool;
23
+ beforeEach(function () {
24
+ jest.clearAllMocks();
25
+ exponentialTool = (0, _index.tool)();
26
+ });
27
+ describe('tool configuration', function () {
28
+ it('creates a tool object', function () {
29
+ expect(exponentialTool).toBeDefined();
30
+ expect((0, _typeof2["default"])(exponentialTool)).toBe('object');
31
+ });
32
+ it('has type exponential', function () {
33
+ expect(exponentialTool.type).toBe('exponential');
34
+ });
35
+ it('has a Component', function () {
36
+ expect(exponentialTool.Component).toBeDefined();
37
+ });
38
+ it('has complete function', function () {
39
+ expect((0, _typeof2["default"])(exponentialTool.complete)).toBe('function');
40
+ });
41
+ it('has addPoint function', function () {
42
+ expect((0, _typeof2["default"])(exponentialTool.addPoint)).toBe('function');
43
+ });
44
+ it('does not have hover function', function () {
45
+ expect(exponentialTool.hover).toBeUndefined();
46
+ });
47
+ });
48
+ describe('complete', function () {
49
+ it('marks exponential as complete', function () {
50
+ var data = {
51
+ x: 5,
52
+ y: 10
53
+ };
54
+ var mark = {
55
+ type: 'exponential',
56
+ root: {
57
+ x: 0,
58
+ y: 1
59
+ },
60
+ edge: {
61
+ x: 5,
62
+ y: 10
63
+ },
64
+ building: true,
65
+ closed: false
66
+ };
67
+ var result = exponentialTool.complete(data, mark);
68
+ expect(result).toEqual(_objectSpread(_objectSpread({}, mark), {}, {
69
+ building: false,
70
+ closed: true
71
+ }));
72
+ });
73
+ it('sets building to false', function () {
74
+ var mark = {
75
+ type: 'exponential',
76
+ root: {
77
+ x: 0,
78
+ y: 1
79
+ },
80
+ building: true
81
+ };
82
+ var result = exponentialTool.complete({}, mark);
83
+ expect(result.building).toBe(false);
84
+ });
85
+ it('sets closed to true', function () {
86
+ var mark = {
87
+ type: 'exponential',
88
+ root: {
89
+ x: 0,
90
+ y: 1
91
+ },
92
+ closed: false
93
+ };
94
+ var result = exponentialTool.complete({}, mark);
95
+ expect(result.closed).toBe(true);
96
+ });
97
+ it('preserves mark properties', function () {
98
+ var mark = {
99
+ type: 'exponential',
100
+ root: {
101
+ x: 0,
102
+ y: 1
103
+ },
104
+ edge: {
105
+ x: 5,
106
+ y: 10
107
+ },
108
+ label: 'Exp A',
109
+ correctness: {
110
+ value: 'correct'
111
+ }
112
+ };
113
+ var result = exponentialTool.complete({}, mark);
114
+ expect(result.label).toBe('Exp A');
115
+ expect(result.correctness).toEqual({
116
+ value: 'correct'
117
+ });
118
+ expect(result.root).toEqual(mark.root);
119
+ expect(result.edge).toEqual(mark.edge);
120
+ });
121
+ it('does not mutate original mark', function () {
122
+ var mark = {
123
+ type: 'exponential',
124
+ root: {
125
+ x: 0,
126
+ y: 1
127
+ },
128
+ building: true,
129
+ closed: false
130
+ };
131
+ var originalMark = _objectSpread({}, mark);
132
+ exponentialTool.complete({}, mark);
133
+ expect(mark).toEqual(originalMark);
134
+ });
135
+ });
136
+ describe('addPoint', function () {
137
+ describe('first point (creating root)', function () {
138
+ it('creates new exponential mark when no mark exists', function () {
139
+ var point = {
140
+ x: 0,
141
+ y: 5
142
+ };
143
+ var mark = null;
144
+ _utils.equalPoints.mockReturnValue(false);
145
+ _utils.sameAxes.mockReturnValue(false);
146
+ var result = exponentialTool.addPoint(point, mark);
147
+ expect(result).toEqual({
148
+ type: 'exponential',
149
+ root: point,
150
+ edge: undefined,
151
+ closed: false,
152
+ building: true
153
+ });
154
+ });
155
+ it('creates mark with building true', function () {
156
+ var point = {
157
+ x: 2,
158
+ y: 3
159
+ };
160
+ _utils.equalPoints.mockReturnValue(false);
161
+ _utils.sameAxes.mockReturnValue(false);
162
+ var result = exponentialTool.addPoint(point, null);
163
+ expect(result.building).toBe(true);
164
+ });
165
+ it('creates mark with closed false', function () {
166
+ var point = {
167
+ x: 2,
168
+ y: 3
169
+ };
170
+ _utils.equalPoints.mockReturnValue(false);
171
+ _utils.sameAxes.mockReturnValue(false);
172
+ var result = exponentialTool.addPoint(point, null);
173
+ expect(result.closed).toBe(false);
174
+ });
175
+ it('creates mark with undefined edge', function () {
176
+ var point = {
177
+ x: 2,
178
+ y: 3
179
+ };
180
+ _utils.equalPoints.mockReturnValue(false);
181
+ _utils.sameAxes.mockReturnValue(false);
182
+ var result = exponentialTool.addPoint(point, null);
183
+ expect(result.edge).toBeUndefined();
184
+ });
185
+ it('works with positive coordinates', function () {
186
+ var point = {
187
+ x: 5,
188
+ y: 10
189
+ };
190
+ _utils.equalPoints.mockReturnValue(false);
191
+ _utils.sameAxes.mockReturnValue(false);
192
+ var result = exponentialTool.addPoint(point, null);
193
+ expect(result.root).toEqual(point);
194
+ });
195
+ it('works with negative y coordinate', function () {
196
+ var point = {
197
+ x: 5,
198
+ y: -10
199
+ };
200
+ _utils.equalPoints.mockReturnValue(false);
201
+ _utils.sameAxes.mockReturnValue(false);
202
+ var result = exponentialTool.addPoint(point, null);
203
+ expect(result.root).toEqual(point);
204
+ });
205
+ it('works with decimal coordinates', function () {
206
+ var point = {
207
+ x: 3.5,
208
+ y: 7.25
209
+ };
210
+ _utils.equalPoints.mockReturnValue(false);
211
+ _utils.sameAxes.mockReturnValue(false);
212
+ var result = exponentialTool.addPoint(point, null);
213
+ expect(result.root).toEqual(point);
214
+ });
215
+ });
216
+ describe('second point (completing exponential)', function () {
217
+ it('completes exponential when adding edge point', function () {
218
+ var root = {
219
+ x: 0,
220
+ y: 1
221
+ };
222
+ var edge = {
223
+ x: 5,
224
+ y: 10
225
+ };
226
+ var mark = {
227
+ type: 'exponential',
228
+ root: root,
229
+ edge: undefined,
230
+ closed: false,
231
+ building: true
232
+ };
233
+ _utils.equalPoints.mockReturnValue(false);
234
+ _utils.sameAxes.mockReturnValue(false);
235
+ var result = exponentialTool.addPoint(edge, mark);
236
+ expect(result).toEqual(_objectSpread(_objectSpread({}, mark), {}, {
237
+ edge: edge,
238
+ closed: true,
239
+ building: false
240
+ }));
241
+ });
242
+ it('sets building to false', function () {
243
+ var mark = {
244
+ type: 'exponential',
245
+ root: {
246
+ x: 0,
247
+ y: 1
248
+ },
249
+ building: true
250
+ };
251
+ var point = {
252
+ x: 5,
253
+ y: 10
254
+ };
255
+ _utils.equalPoints.mockReturnValue(false);
256
+ _utils.sameAxes.mockReturnValue(false);
257
+ var result = exponentialTool.addPoint(point, mark);
258
+ expect(result.building).toBe(false);
259
+ });
260
+ it('sets closed to true', function () {
261
+ var mark = {
262
+ type: 'exponential',
263
+ root: {
264
+ x: 0,
265
+ y: 1
266
+ },
267
+ closed: false
268
+ };
269
+ var point = {
270
+ x: 5,
271
+ y: 10
272
+ };
273
+ _utils.equalPoints.mockReturnValue(false);
274
+ _utils.sameAxes.mockReturnValue(false);
275
+ var result = exponentialTool.addPoint(point, mark);
276
+ expect(result.closed).toBe(true);
277
+ });
278
+ it('preserves root when adding edge', function () {
279
+ var root = {
280
+ x: 1,
281
+ y: 2
282
+ };
283
+ var mark = {
284
+ type: 'exponential',
285
+ root: root,
286
+ building: true
287
+ };
288
+ var edge = {
289
+ x: 5,
290
+ y: 8
291
+ };
292
+ _utils.equalPoints.mockReturnValue(false);
293
+ _utils.sameAxes.mockReturnValue(false);
294
+ var result = exponentialTool.addPoint(edge, mark);
295
+ expect(result.root).toEqual(root);
296
+ expect(result.edge).toEqual(edge);
297
+ });
298
+ it('preserves mark properties', function () {
299
+ var mark = {
300
+ type: 'exponential',
301
+ root: {
302
+ x: 0,
303
+ y: 1
304
+ },
305
+ label: 'Exp 1',
306
+ correctness: {
307
+ value: 'correct'
308
+ }
309
+ };
310
+ var point = {
311
+ x: 5,
312
+ y: 10
313
+ };
314
+ _utils.equalPoints.mockReturnValue(false);
315
+ _utils.sameAxes.mockReturnValue(false);
316
+ var result = exponentialTool.addPoint(point, mark);
317
+ expect(result.label).toBe('Exp 1');
318
+ expect(result.correctness).toEqual({
319
+ value: 'correct'
320
+ });
321
+ });
322
+ });
323
+ describe('same point handling', function () {
324
+ it('returns same mark when clicking equal point', function () {
325
+ var point = {
326
+ x: 5,
327
+ y: 10
328
+ };
329
+ var mark = {
330
+ type: 'exponential',
331
+ root: point,
332
+ building: true
333
+ };
334
+ _utils.equalPoints.mockReturnValue(true);
335
+ _utils.sameAxes.mockReturnValue(false);
336
+ var result = exponentialTool.addPoint(point, mark);
337
+ expect(result).toBe(mark);
338
+ });
339
+ it('returns same mark when clicking point on same axis', function () {
340
+ var mark = {
341
+ type: 'exponential',
342
+ root: {
343
+ x: 5,
344
+ y: 10
345
+ },
346
+ building: true
347
+ };
348
+ var point = {
349
+ x: 8,
350
+ y: 10
351
+ }; // same y
352
+ _utils.equalPoints.mockReturnValue(false);
353
+ _utils.sameAxes.mockReturnValue(true);
354
+ var result = exponentialTool.addPoint(point, mark);
355
+ expect(result).toBe(mark);
356
+ });
357
+ it('calls equalPoints with correct arguments', function () {
358
+ var point = {
359
+ x: 5,
360
+ y: 10
361
+ };
362
+ var mark = {
363
+ type: 'exponential',
364
+ root: {
365
+ x: 5,
366
+ y: 10
367
+ },
368
+ building: true
369
+ };
370
+ _utils.equalPoints.mockReturnValue(true);
371
+ exponentialTool.addPoint(point, mark);
372
+ expect(_utils.equalPoints).toHaveBeenCalledWith(mark.root, point);
373
+ });
374
+ it('calls sameAxes with correct arguments', function () {
375
+ var point = {
376
+ x: 8,
377
+ y: 10
378
+ };
379
+ var mark = {
380
+ type: 'exponential',
381
+ root: {
382
+ x: 5,
383
+ y: 10
384
+ },
385
+ building: true
386
+ };
387
+ _utils.equalPoints.mockReturnValue(false);
388
+ _utils.sameAxes.mockReturnValue(true);
389
+ exponentialTool.addPoint(point, mark);
390
+ expect(_utils.sameAxes).toHaveBeenCalledWith(mark.root, point);
391
+ });
392
+ });
393
+ describe('opposite sign y-coordinates', function () {
394
+ it('returns same mark when root and point have opposite sign y', function () {
395
+ var mark = {
396
+ type: 'exponential',
397
+ root: {
398
+ x: 0,
399
+ y: 5
400
+ },
401
+ // positive y
402
+ building: true
403
+ };
404
+ var point = {
405
+ x: 5,
406
+ y: -10
407
+ }; // negative y
408
+ _utils.equalPoints.mockReturnValue(false);
409
+ _utils.sameAxes.mockReturnValue(false);
410
+ var result = exponentialTool.addPoint(point, mark);
411
+ expect(result).toBe(mark);
412
+ });
413
+ it('returns same mark when root is negative and point is positive', function () {
414
+ var mark = {
415
+ type: 'exponential',
416
+ root: {
417
+ x: 0,
418
+ y: -5
419
+ },
420
+ // negative y
421
+ building: true
422
+ };
423
+ var point = {
424
+ x: 5,
425
+ y: 10
426
+ }; // positive y
427
+ _utils.equalPoints.mockReturnValue(false);
428
+ _utils.sameAxes.mockReturnValue(false);
429
+ var result = exponentialTool.addPoint(point, mark);
430
+ expect(result).toBe(mark);
431
+ });
432
+ it('allows points with same sign y (both positive)', function () {
433
+ var mark = {
434
+ type: 'exponential',
435
+ root: {
436
+ x: 0,
437
+ y: 5
438
+ },
439
+ building: true
440
+ };
441
+ var point = {
442
+ x: 5,
443
+ y: 10
444
+ };
445
+ _utils.equalPoints.mockReturnValue(false);
446
+ _utils.sameAxes.mockReturnValue(false);
447
+ var result = exponentialTool.addPoint(point, mark);
448
+ expect(result.edge).toEqual(point);
449
+ expect(result.building).toBe(false);
450
+ });
451
+ it('allows points with same sign y (both negative)', function () {
452
+ var mark = {
453
+ type: 'exponential',
454
+ root: {
455
+ x: 0,
456
+ y: -5
457
+ },
458
+ building: true
459
+ };
460
+ var point = {
461
+ x: 5,
462
+ y: -10
463
+ };
464
+ _utils.equalPoints.mockReturnValue(false);
465
+ _utils.sameAxes.mockReturnValue(false);
466
+ var result = exponentialTool.addPoint(point, mark);
467
+ expect(result.edge).toEqual(point);
468
+ expect(result.building).toBe(false);
469
+ });
470
+ });
471
+ describe('zero y-coordinate handling', function () {
472
+ it('returns same mark when point has y = 0', function () {
473
+ var mark = {
474
+ type: 'exponential',
475
+ root: {
476
+ x: 0,
477
+ y: 5
478
+ },
479
+ building: true
480
+ };
481
+ var point = {
482
+ x: 5,
483
+ y: 0
484
+ };
485
+ _utils.equalPoints.mockReturnValue(false);
486
+ _utils.sameAxes.mockReturnValue(false);
487
+ var result = exponentialTool.addPoint(point, mark);
488
+ expect(result).toBe(mark);
489
+ });
490
+ it('prevents adding point with zero y', function () {
491
+ var point = {
492
+ x: 5,
493
+ y: 0
494
+ };
495
+ var mark = {
496
+ type: 'exponential',
497
+ root: {
498
+ x: 1,
499
+ y: 2
500
+ },
501
+ building: true
502
+ };
503
+ _utils.equalPoints.mockReturnValue(false);
504
+ _utils.sameAxes.mockReturnValue(false);
505
+ var result = exponentialTool.addPoint(point, mark);
506
+ expect(result).toBe(mark);
507
+ expect(result.edge).toBeUndefined();
508
+ });
509
+ it('prevents creating root with zero y', function () {
510
+ var point = {
511
+ x: 5,
512
+ y: 0
513
+ };
514
+ _utils.equalPoints.mockReturnValue(false);
515
+ _utils.sameAxes.mockReturnValue(false);
516
+ var result = exponentialTool.addPoint(point, null);
517
+ expect(result).toBeNull();
518
+ });
519
+ it('allows positive y values close to zero', function () {
520
+ var point = {
521
+ x: 5,
522
+ y: 0.001
523
+ };
524
+ _utils.equalPoints.mockReturnValue(false);
525
+ _utils.sameAxes.mockReturnValue(false);
526
+ var result = exponentialTool.addPoint(point, null);
527
+ expect(result.root).toEqual(point);
528
+ });
529
+ it('allows negative y values close to zero', function () {
530
+ var point = {
531
+ x: 5,
532
+ y: -0.001
533
+ };
534
+ _utils.equalPoints.mockReturnValue(false);
535
+ _utils.sameAxes.mockReturnValue(false);
536
+ var result = exponentialTool.addPoint(point, null);
537
+ expect(result.root).toEqual(point);
538
+ });
539
+ });
540
+ describe('error handling', function () {
541
+ it('throws error when mark has no root', function () {
542
+ var mark = {
543
+ type: 'exponential',
544
+ building: true
545
+ // root is missing
546
+ };
547
+ var point = {
548
+ x: 5,
549
+ y: 10
550
+ };
551
+ _utils.equalPoints.mockReturnValue(false);
552
+ _utils.sameAxes.mockReturnValue(false);
553
+ expect(function () {
554
+ exponentialTool.addPoint(point, mark);
555
+ }).toThrow(); // Will throw TypeError when accessing undefined.y
556
+ });
557
+ it('throws error when mark root is null', function () {
558
+ var mark = {
559
+ type: 'exponential',
560
+ root: null,
561
+ building: true
562
+ };
563
+ var point = {
564
+ x: 5,
565
+ y: 10
566
+ };
567
+ _utils.equalPoints.mockReturnValue(false);
568
+ _utils.sameAxes.mockReturnValue(false);
569
+ expect(function () {
570
+ exponentialTool.addPoint(point, mark);
571
+ }).toThrow(); // Will throw TypeError when accessing null.y
572
+ });
573
+ it('throws error when mark root is undefined', function () {
574
+ var mark = {
575
+ type: 'exponential',
576
+ root: undefined,
577
+ building: true
578
+ };
579
+ var point = {
580
+ x: 5,
581
+ y: 10
582
+ };
583
+ _utils.equalPoints.mockReturnValue(false);
584
+ _utils.sameAxes.mockReturnValue(false);
585
+ expect(function () {
586
+ exponentialTool.addPoint(point, mark);
587
+ }).toThrow(); // Will throw TypeError when accessing undefined.y
588
+ });
589
+ });
590
+ describe('edge cases', function () {
591
+ it('handles undefined mark on first click', function () {
592
+ var point = {
593
+ x: 5,
594
+ y: 10
595
+ };
596
+ _utils.equalPoints.mockReturnValue(false);
597
+ _utils.sameAxes.mockReturnValue(false);
598
+ var result = exponentialTool.addPoint(point, undefined);
599
+ expect(result.type).toBe('exponential');
600
+ expect(result.root).toEqual(point);
601
+ expect(result.building).toBe(true);
602
+ });
603
+ it('handles very large positive y', function () {
604
+ var point = {
605
+ x: 5,
606
+ y: 10000
607
+ };
608
+ _utils.equalPoints.mockReturnValue(false);
609
+ _utils.sameAxes.mockReturnValue(false);
610
+ var result = exponentialTool.addPoint(point, null);
611
+ expect(result.root).toEqual(point);
612
+ });
613
+ it('handles very large negative y', function () {
614
+ var point = {
615
+ x: 5,
616
+ y: -10000
617
+ };
618
+ _utils.equalPoints.mockReturnValue(false);
619
+ _utils.sameAxes.mockReturnValue(false);
620
+ var result = exponentialTool.addPoint(point, null);
621
+ expect(result.root).toEqual(point);
622
+ });
623
+ it('handles negative x coordinates', function () {
624
+ var point = {
625
+ x: -5,
626
+ y: 10
627
+ };
628
+ _utils.equalPoints.mockReturnValue(false);
629
+ _utils.sameAxes.mockReturnValue(false);
630
+ var result = exponentialTool.addPoint(point, null);
631
+ expect(result.root).toEqual(point);
632
+ });
633
+ it('handles mark with existing edge', function () {
634
+ var mark = {
635
+ type: 'exponential',
636
+ root: {
637
+ x: 0,
638
+ y: 1
639
+ },
640
+ edge: {
641
+ x: 3,
642
+ y: 3
643
+ },
644
+ building: false,
645
+ closed: true
646
+ };
647
+ var newEdge = {
648
+ x: 5,
649
+ y: 5
650
+ };
651
+ _utils.equalPoints.mockReturnValue(false);
652
+ _utils.sameAxes.mockReturnValue(false);
653
+ var result = exponentialTool.addPoint(newEdge, mark);
654
+ expect(result.edge).toEqual(newEdge);
655
+ expect(result.closed).toBe(true);
656
+ expect(result.building).toBe(false);
657
+ });
658
+ });
659
+ describe('immutability', function () {
660
+ it('does not mutate original mark when adding edge', function () {
661
+ var mark = {
662
+ type: 'exponential',
663
+ root: {
664
+ x: 0,
665
+ y: 1
666
+ },
667
+ building: true
668
+ };
669
+ var originalMark = _objectSpread({}, mark);
670
+ var point = {
671
+ x: 5,
672
+ y: 10
673
+ };
674
+ _utils.equalPoints.mockReturnValue(false);
675
+ _utils.sameAxes.mockReturnValue(false);
676
+ var result = exponentialTool.addPoint(point, mark);
677
+ expect(mark).toEqual(originalMark);
678
+ expect(result).not.toBe(mark);
679
+ });
680
+ it('does not mutate original mark when returning same', function () {
681
+ var mark = {
682
+ type: 'exponential',
683
+ root: {
684
+ x: 5,
685
+ y: 10
686
+ },
687
+ building: true
688
+ };
689
+ var point = {
690
+ x: 5,
691
+ y: 10
692
+ };
693
+ _utils.equalPoints.mockReturnValue(true);
694
+ var result = exponentialTool.addPoint(point, mark);
695
+ expect(result).toBe(mark);
696
+ });
697
+ });
698
+ });
699
+ describe('integration scenarios', function () {
700
+ it('handles full exponential creation flow', function () {
701
+ _utils.equalPoints.mockReturnValue(false);
702
+ _utils.sameAxes.mockReturnValue(false);
703
+
704
+ // First click - create root
705
+ var firstPoint = {
706
+ x: 0,
707
+ y: 1
708
+ };
709
+ var mark1 = exponentialTool.addPoint(firstPoint, null);
710
+ expect(mark1.root).toEqual(firstPoint);
711
+ expect(mark1.building).toBe(true);
712
+ expect(mark1.closed).toBe(false);
713
+
714
+ // Second click - complete exponential
715
+ var secondPoint = {
716
+ x: 5,
717
+ y: 10
718
+ };
719
+ var mark2 = exponentialTool.addPoint(secondPoint, mark1);
720
+ expect(mark2.root).toEqual(firstPoint);
721
+ expect(mark2.edge).toEqual(secondPoint);
722
+ expect(mark2.building).toBe(false);
723
+ expect(mark2.closed).toBe(true);
724
+
725
+ // Complete
726
+ var mark3 = exponentialTool.complete({}, mark2);
727
+ expect(mark3.building).toBe(false);
728
+ expect(mark3.closed).toBe(true);
729
+ });
730
+ it('handles rejected second point (zero y)', function () {
731
+ _utils.equalPoints.mockReturnValue(false);
732
+ _utils.sameAxes.mockReturnValue(false);
733
+ var firstPoint = {
734
+ x: 0,
735
+ y: 1
736
+ };
737
+ var mark1 = exponentialTool.addPoint(firstPoint, null);
738
+ var secondPoint = {
739
+ x: 5,
740
+ y: 0
741
+ };
742
+ var mark2 = exponentialTool.addPoint(secondPoint, mark1);
743
+
744
+ // Should return unchanged mark
745
+ expect(mark2).toBe(mark1);
746
+ expect(mark2.edge).toBeUndefined();
747
+ });
748
+ it('handles rejected second point (opposite sign)', function () {
749
+ _utils.equalPoints.mockReturnValue(false);
750
+ _utils.sameAxes.mockReturnValue(false);
751
+ var firstPoint = {
752
+ x: 0,
753
+ y: 5
754
+ };
755
+ var mark1 = exponentialTool.addPoint(firstPoint, null);
756
+ var secondPoint = {
757
+ x: 5,
758
+ y: -10
759
+ };
760
+ var mark2 = exponentialTool.addPoint(secondPoint, mark1);
761
+
762
+ // Should return unchanged mark
763
+ expect(mark2).toBe(mark1);
764
+ expect(mark2.edge).toBeUndefined();
765
+ });
766
+ it('handles rejected second point (same axes)', function () {
767
+ _utils.equalPoints.mockReturnValue(false);
768
+ _utils.sameAxes.mockReturnValue(true);
769
+ var firstPoint = {
770
+ x: 0,
771
+ y: 5
772
+ };
773
+ var mark1 = exponentialTool.addPoint(firstPoint, null);
774
+ var secondPoint = {
775
+ x: 10,
776
+ y: 5
777
+ }; // same y
778
+ var mark2 = exponentialTool.addPoint(secondPoint, mark1);
779
+
780
+ // Should return unchanged mark
781
+ expect(mark2).toBe(mark1);
782
+ });
783
+ it('handles exponential with negative y values', function () {
784
+ _utils.equalPoints.mockReturnValue(false);
785
+ _utils.sameAxes.mockReturnValue(false);
786
+ var firstPoint = {
787
+ x: 0,
788
+ y: -1
789
+ };
790
+ var mark1 = exponentialTool.addPoint(firstPoint, null);
791
+ var secondPoint = {
792
+ x: 5,
793
+ y: -10
794
+ };
795
+ var mark2 = exponentialTool.addPoint(secondPoint, mark1);
796
+ expect(mark2.root).toEqual(firstPoint);
797
+ expect(mark2.edge).toEqual(secondPoint);
798
+ expect(mark2.building).toBe(false);
799
+ expect(mark2.closed).toBe(true);
800
+ });
801
+ it('handles exponential with properties', function () {
802
+ _utils.equalPoints.mockReturnValue(false);
803
+ _utils.sameAxes.mockReturnValue(false);
804
+ var firstPoint = {
805
+ x: 0,
806
+ y: 1,
807
+ label: 'Start'
808
+ };
809
+ var mark1 = exponentialTool.addPoint(firstPoint, null);
810
+
811
+ // Add properties
812
+ mark1.label = 'Exp A';
813
+ mark1.correctness = {
814
+ value: 'correct'
815
+ };
816
+ var secondPoint = {
817
+ x: 5,
818
+ y: 10
819
+ };
820
+ var mark2 = exponentialTool.addPoint(secondPoint, mark1);
821
+ expect(mark2.label).toBe('Exp A');
822
+ expect(mark2.correctness).toEqual({
823
+ value: 'correct'
824
+ });
825
+ });
826
+ });
827
+ });
828
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfaW5kZXgiLCJyZXF1aXJlIiwiX3V0aWxzIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJqZXN0IiwibW9jayIsImVxdWFsUG9pbnRzIiwiZm4iLCJzYW1lQXhlcyIsImRlc2NyaWJlIiwiZXhwb25lbnRpYWxUb29sIiwiYmVmb3JlRWFjaCIsImNsZWFyQWxsTW9ja3MiLCJ0b29sIiwiaXQiLCJleHBlY3QiLCJ0b0JlRGVmaW5lZCIsIl90eXBlb2YyIiwidG9CZSIsInR5cGUiLCJDb21wb25lbnQiLCJjb21wbGV0ZSIsImFkZFBvaW50IiwiaG92ZXIiLCJ0b0JlVW5kZWZpbmVkIiwiZGF0YSIsIngiLCJ5IiwibWFyayIsInJvb3QiLCJlZGdlIiwiYnVpbGRpbmciLCJjbG9zZWQiLCJyZXN1bHQiLCJ0b0VxdWFsIiwibGFiZWwiLCJjb3JyZWN0bmVzcyIsInZhbHVlIiwib3JpZ2luYWxNYXJrIiwicG9pbnQiLCJtb2NrUmV0dXJuVmFsdWUiLCJ1bmRlZmluZWQiLCJ0b0hhdmVCZWVuQ2FsbGVkV2l0aCIsInRvQmVOdWxsIiwidG9UaHJvdyIsIm5ld0VkZ2UiLCJub3QiLCJmaXJzdFBvaW50IiwibWFyazEiLCJzZWNvbmRQb2ludCIsIm1hcmsyIiwibWFyazMiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdG9vbHMvZXhwb25lbnRpYWwvX190ZXN0c19fL2luZGV4LnRlc3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdG9vbCB9IGZyb20gJy4uL2luZGV4JztcbmltcG9ydCB7IGVxdWFsUG9pbnRzLCBzYW1lQXhlcyB9IGZyb20gJy4uLy4uLy4uL3V0aWxzJztcblxuamVzdC5tb2NrKCcuLi8uLi8uLi91dGlscycsICgpID0+ICh7XG4gIGVxdWFsUG9pbnRzOiBqZXN0LmZuKCksXG4gIHNhbWVBeGVzOiBqZXN0LmZuKCksXG59KSk7XG5cbmplc3QubW9jaygnZGVidWcnLCAoKSA9PiB7XG4gIHJldHVybiBqZXN0LmZuKCgpID0+IGplc3QuZm4oKSk7XG59KTtcblxuZGVzY3JpYmUoJ2V4cG9uZW50aWFsIHRvb2wnLCAoKSA9PiB7XG4gIGxldCBleHBvbmVudGlhbFRvb2w7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgamVzdC5jbGVhckFsbE1vY2tzKCk7XG4gICAgZXhwb25lbnRpYWxUb29sID0gdG9vbCgpO1xuICB9KTtcblxuICBkZXNjcmliZSgndG9vbCBjb25maWd1cmF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdjcmVhdGVzIGEgdG9vbCBvYmplY3QnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoZXhwb25lbnRpYWxUb29sKS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KHR5cGVvZiBleHBvbmVudGlhbFRvb2wpLnRvQmUoJ29iamVjdCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhcyB0eXBlIGV4cG9uZW50aWFsJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGV4cG9uZW50aWFsVG9vbC50eXBlKS50b0JlKCdleHBvbmVudGlhbCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhcyBhIENvbXBvbmVudCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChleHBvbmVudGlhbFRvb2wuQ29tcG9uZW50KS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhcyBjb21wbGV0ZSBmdW5jdGlvbicsICgpID0+IHtcbiAgICAgIGV4cGVjdCh0eXBlb2YgZXhwb25lbnRpYWxUb29sLmNvbXBsZXRlKS50b0JlKCdmdW5jdGlvbicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhcyBhZGRQb2ludCBmdW5jdGlvbicsICgpID0+IHtcbiAgICAgIGV4cGVjdCh0eXBlb2YgZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KS50b0JlKCdmdW5jdGlvbicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IGhhdmUgaG92ZXIgZnVuY3Rpb24nLCAoKSA9PiB7XG4gICAgICBleHBlY3QoZXhwb25lbnRpYWxUb29sLmhvdmVyKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjb21wbGV0ZScsICgpID0+IHtcbiAgICBpdCgnbWFya3MgZXhwb25lbnRpYWwgYXMgY29tcGxldGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0geyB4OiA1LCB5OiAxMCB9O1xuICAgICAgY29uc3QgbWFyayA9IHtcbiAgICAgICAgdHlwZTogJ2V4cG9uZW50aWFsJyxcbiAgICAgICAgcm9vdDogeyB4OiAwLCB5OiAxIH0sXG4gICAgICAgIGVkZ2U6IHsgeDogNSwgeTogMTAgfSxcbiAgICAgICAgYnVpbGRpbmc6IHRydWUsXG4gICAgICAgIGNsb3NlZDogZmFsc2UsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBleHBvbmVudGlhbFRvb2wuY29tcGxldGUoZGF0YSwgbWFyayk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoe1xuICAgICAgICAuLi5tYXJrLFxuICAgICAgICBidWlsZGluZzogZmFsc2UsXG4gICAgICAgIGNsb3NlZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NldHMgYnVpbGRpbmcgdG8gZmFsc2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtYXJrID0ge1xuICAgICAgICB0eXBlOiAnZXhwb25lbnRpYWwnLFxuICAgICAgICByb290OiB7IHg6IDAsIHk6IDEgfSxcbiAgICAgICAgYnVpbGRpbmc6IHRydWUsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBleHBvbmVudGlhbFRvb2wuY29tcGxldGUoe30sIG1hcmspO1xuXG4gICAgICBleHBlY3QocmVzdWx0LmJ1aWxkaW5nKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzZXRzIGNsb3NlZCB0byB0cnVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWFyayA9IHtcbiAgICAgICAgdHlwZTogJ2V4cG9uZW50aWFsJyxcbiAgICAgICAgcm9vdDogeyB4OiAwLCB5OiAxIH0sXG4gICAgICAgIGNsb3NlZDogZmFsc2UsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBleHBvbmVudGlhbFRvb2wuY29tcGxldGUoe30sIG1hcmspO1xuXG4gICAgICBleHBlY3QocmVzdWx0LmNsb3NlZCkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdwcmVzZXJ2ZXMgbWFyayBwcm9wZXJ0aWVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWFyayA9IHtcbiAgICAgICAgdHlwZTogJ2V4cG9uZW50aWFsJyxcbiAgICAgICAgcm9vdDogeyB4OiAwLCB5OiAxIH0sXG4gICAgICAgIGVkZ2U6IHsgeDogNSwgeTogMTAgfSxcbiAgICAgICAgbGFiZWw6ICdFeHAgQScsXG4gICAgICAgIGNvcnJlY3RuZXNzOiB7IHZhbHVlOiAnY29ycmVjdCcgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGV4cG9uZW50aWFsVG9vbC5jb21wbGV0ZSh7fSwgbWFyayk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHQubGFiZWwpLnRvQmUoJ0V4cCBBJyk7XG4gICAgICBleHBlY3QocmVzdWx0LmNvcnJlY3RuZXNzKS50b0VxdWFsKHsgdmFsdWU6ICdjb3JyZWN0JyB9KTtcbiAgICAgIGV4cGVjdChyZXN1bHQucm9vdCkudG9FcXVhbChtYXJrLnJvb3QpO1xuICAgICAgZXhwZWN0KHJlc3VsdC5lZGdlKS50b0VxdWFsKG1hcmsuZWRnZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgbXV0YXRlIG9yaWdpbmFsIG1hcmsnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtYXJrID0ge1xuICAgICAgICB0eXBlOiAnZXhwb25lbnRpYWwnLFxuICAgICAgICByb290OiB7IHg6IDAsIHk6IDEgfSxcbiAgICAgICAgYnVpbGRpbmc6IHRydWUsXG4gICAgICAgIGNsb3NlZDogZmFsc2UsXG4gICAgICB9O1xuICAgICAgY29uc3Qgb3JpZ2luYWxNYXJrID0geyAuLi5tYXJrIH07XG5cbiAgICAgIGV4cG9uZW50aWFsVG9vbC5jb21wbGV0ZSh7fSwgbWFyayk7XG5cbiAgICAgIGV4cGVjdChtYXJrKS50b0VxdWFsKG9yaWdpbmFsTWFyayk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhZGRQb2ludCcsICgpID0+IHtcbiAgICBkZXNjcmliZSgnZmlyc3QgcG9pbnQgKGNyZWF0aW5nIHJvb3QpJywgKCkgPT4ge1xuICAgICAgaXQoJ2NyZWF0ZXMgbmV3IGV4cG9uZW50aWFsIG1hcmsgd2hlbiBubyBtYXJrIGV4aXN0cycsICgpID0+IHtcbiAgICAgICAgY29uc3QgcG9pbnQgPSB7IHg6IDAsIHk6IDUgfTtcbiAgICAgICAgY29uc3QgbWFyayA9IG51bGw7XG4gICAgICAgIGVxdWFsUG9pbnRzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gICAgICAgIHNhbWVBeGVzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KHBvaW50LCBtYXJrKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKHtcbiAgICAgICAgICB0eXBlOiAnZXhwb25lbnRpYWwnLFxuICAgICAgICAgIHJvb3Q6IHBvaW50LFxuICAgICAgICAgIGVkZ2U6IHVuZGVmaW5lZCxcbiAgICAgICAgICBjbG9zZWQ6IGZhbHNlLFxuICAgICAgICAgIGJ1aWxkaW5nOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnY3JlYXRlcyBtYXJrIHdpdGggYnVpbGRpbmcgdHJ1ZScsICgpID0+IHtcbiAgICAgICAgY29uc3QgcG9pbnQgPSB7IHg6IDIsIHk6IDMgfTtcbiAgICAgICAgZXF1YWxQb2ludHMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcbiAgICAgICAgc2FtZUF4ZXMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBleHBvbmVudGlhbFRvb2wuYWRkUG9pbnQocG9pbnQsIG51bGwpO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQuYnVpbGRpbmcpLnRvQmUodHJ1ZSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2NyZWF0ZXMgbWFyayB3aXRoIGNsb3NlZCBmYWxzZScsICgpID0+IHtcbiAgICAgICAgY29uc3QgcG9pbnQgPSB7IHg6IDIsIHk6IDMgfTtcbiAgICAgICAgZXF1YWxQb2ludHMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcbiAgICAgICAgc2FtZUF4ZXMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBleHBvbmVudGlhbFRvb2wuYWRkUG9pbnQocG9pbnQsIG51bGwpO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQuY2xvc2VkKS50b0JlKGZhbHNlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnY3JlYXRlcyBtYXJrIHdpdGggdW5kZWZpbmVkIGVkZ2UnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvaW50ID0geyB4OiAyLCB5OiAzIH07XG4gICAgICAgIGVxdWFsUG9pbnRzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gICAgICAgIHNhbWVBeGVzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KHBvaW50LCBudWxsKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0LmVkZ2UpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnd29ya3Mgd2l0aCBwb3NpdGl2ZSBjb29yZGluYXRlcycsICgpID0+IHtcbiAgICAgICAgY29uc3QgcG9pbnQgPSB7IHg6IDUsIHk6IDEwIH07XG4gICAgICAgIGVxdWFsUG9pbnRzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gICAgICAgIHNhbWVBeGVzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KHBvaW50LCBudWxsKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0LnJvb3QpLnRvRXF1YWwocG9pbnQpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCd3b3JrcyB3aXRoIG5lZ2F0aXZlIHkgY29vcmRpbmF0ZScsICgpID0+IHtcbiAgICAgICAgY29uc3QgcG9pbnQgPSB7IHg6IDUsIHk6IC0xMCB9O1xuICAgICAgICBlcXVhbFBvaW50cy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuICAgICAgICBzYW1lQXhlcy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGV4cG9uZW50aWFsVG9vbC5hZGRQb2ludChwb2ludCwgbnVsbCk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdC5yb290KS50b0VxdWFsKHBvaW50KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnd29ya3Mgd2l0aCBkZWNpbWFsIGNvb3JkaW5hdGVzJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBwb2ludCA9IHsgeDogMy41LCB5OiA3LjI1IH07XG4gICAgICAgIGVxdWFsUG9pbnRzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gICAgICAgIHNhbWVBeGVzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KHBvaW50LCBudWxsKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0LnJvb3QpLnRvRXF1YWwocG9pbnQpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnc2Vjb25kIHBvaW50IChjb21wbGV0aW5nIGV4cG9uZW50aWFsKScsICgpID0+IHtcbiAgICAgIGl0KCdjb21wbGV0ZXMgZXhwb25lbnRpYWwgd2hlbiBhZGRpbmcgZWRnZSBwb2ludCcsICgpID0+IHtcbiAgICAgICAgY29uc3Qgcm9vdCA9IHsgeDogMCwgeTogMSB9O1xuICAgICAgICBjb25zdCBlZGdlID0geyB4OiA1LCB5OiAxMCB9O1xuICAgICAgICBjb25zdCBtYXJrID0ge1xuICAgICAgICAgIHR5cGU6ICdleHBvbmVudGlhbCcsXG4gICAgICAgICAgcm9vdCxcbiAgICAgICAgICBlZGdlOiB1bmRlZmluZWQsXG4gICAgICAgICAgY2xvc2VkOiBmYWxzZSxcbiAgICAgICAgICBidWlsZGluZzogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgZXF1YWxQb2ludHMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcbiAgICAgICAgc2FtZUF4ZXMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBleHBvbmVudGlhbFRvb2wuYWRkUG9pbnQoZWRnZSwgbWFyayk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbCh7XG4gICAgICAgICAgLi4ubWFyayxcbiAgICAgICAgICBlZGdlLFxuICAgICAgICAgIGNsb3NlZDogdHJ1ZSxcbiAgICAgICAgICBidWlsZGluZzogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzZXRzIGJ1aWxkaW5nIHRvIGZhbHNlJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBtYXJrID0ge1xuICAgICAgICAgIHR5cGU6ICdleHBvbmVudGlhbCcsXG4gICAgICAgICAgcm9vdDogeyB4OiAwLCB5OiAxIH0sXG4gICAgICAgICAgYnVpbGRpbmc6IHRydWUsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHBvaW50ID0geyB4OiA1LCB5OiAxMCB9O1xuICAgICAgICBlcXVhbFBvaW50cy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuICAgICAgICBzYW1lQXhlcy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGV4cG9uZW50aWFsVG9vbC5hZGRQb2ludChwb2ludCwgbWFyayk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdC5idWlsZGluZykudG9CZShmYWxzZSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3NldHMgY2xvc2VkIHRvIHRydWUnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1hcmsgPSB7XG4gICAgICAgICAgdHlwZTogJ2V4cG9uZW50aWFsJyxcbiAgICAgICAgICByb290OiB7IHg6IDAsIHk6IDEgfSxcbiAgICAgICAgICBjbG9zZWQ6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBwb2ludCA9IHsgeDogNSwgeTogMTAgfTtcbiAgICAgICAgZXF1YWxQb2ludHMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcbiAgICAgICAgc2FtZUF4ZXMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBleHBvbmVudGlhbFRvb2wuYWRkUG9pbnQocG9pbnQsIG1hcmspO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQuY2xvc2VkKS50b0JlKHRydWUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdwcmVzZXJ2ZXMgcm9vdCB3aGVuIGFkZGluZyBlZGdlJywgKCkgPT4ge1xuICAgICAgICBjb25zdCByb290ID0geyB4OiAxLCB5OiAyIH07XG4gICAgICAgIGNvbnN0IG1hcmsgPSB7XG4gICAgICAgICAgdHlwZTogJ2V4cG9uZW50aWFsJyxcbiAgICAgICAgICByb290LFxuICAgICAgICAgIGJ1aWxkaW5nOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBlZGdlID0geyB4OiA1LCB5OiA4IH07XG4gICAgICAgIGVxdWFsUG9pbnRzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gICAgICAgIHNhbWVBeGVzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KGVkZ2UsIG1hcmspO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQucm9vdCkudG9FcXVhbChyb290KTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5lZGdlKS50b0VxdWFsKGVkZ2UpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdwcmVzZXJ2ZXMgbWFyayBwcm9wZXJ0aWVzJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBtYXJrID0ge1xuICAgICAgICAgIHR5cGU6ICdleHBvbmVudGlhbCcsXG4gICAgICAgICAgcm9vdDogeyB4OiAwLCB5OiAxIH0sXG4gICAgICAgICAgbGFiZWw6ICdFeHAgMScsXG4gICAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JyB9LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBwb2ludCA9IHsgeDogNSwgeTogMTAgfTtcbiAgICAgICAgZXF1YWxQb2ludHMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcbiAgICAgICAgc2FtZUF4ZXMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBleHBvbmVudGlhbFRvb2wuYWRkUG9pbnQocG9pbnQsIG1hcmspO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQubGFiZWwpLnRvQmUoJ0V4cCAxJyk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuY29ycmVjdG5lc3MpLnRvRXF1YWwoeyB2YWx1ZTogJ2NvcnJlY3QnIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnc2FtZSBwb2ludCBoYW5kbGluZycsICgpID0+IHtcbiAgICAgIGl0KCdyZXR1cm5zIHNhbWUgbWFyayB3aGVuIGNsaWNraW5nIGVxdWFsIHBvaW50JywgKCkgPT4ge1xuICAgICAgICBjb25zdCBwb2ludCA9IHsgeDogNSwgeTogMTAgfTtcbiAgICAgICAgY29uc3QgbWFyayA9IHtcbiAgICAgICAgICB0eXBlOiAnZXhwb25lbnRpYWwnLFxuICAgICAgICAgIHJvb3Q6IHBvaW50LFxuICAgICAgICAgIGJ1aWxkaW5nOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgICBlcXVhbFBvaW50cy5tb2NrUmV0dXJuVmFsdWUodHJ1ZSk7XG4gICAgICAgIHNhbWVBeGVzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KHBvaW50LCBtYXJrKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0KS50b0JlKG1hcmspO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdyZXR1cm5zIHNhbWUgbWFyayB3aGVuIGNsaWNraW5nIHBvaW50IG9uIHNhbWUgYXhpcycsICgpID0+IHtcbiAgICAgICAgY29uc3QgbWFyayA9IHtcbiAgICAgICAgICB0eXBlOiAnZXhwb25lbnRpYWwnLFxuICAgICAgICAgIHJvb3Q6IHsgeDogNSwgeTogMTAgfSxcbiAgICAgICAgICBidWlsZGluZzogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcG9pbnQgPSB7IHg6IDgsIHk6IDEwIH07IC8vIHNhbWUgeVxuICAgICAgICBlcXVhbFBvaW50cy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuICAgICAgICBzYW1lQXhlcy5tb2NrUmV0dXJuVmFsdWUodHJ1ZSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KHBvaW50LCBtYXJrKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0KS50b0JlKG1hcmspO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdjYWxscyBlcXVhbFBvaW50cyB3aXRoIGNvcnJlY3QgYXJndW1lbnRzJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBwb2ludCA9IHsgeDogNSwgeTogMTAgfTtcbiAgICAgICAgY29uc3QgbWFyayA9IHtcbiAgICAgICAgICB0eXBlOiAnZXhwb25lbnRpYWwnLFxuICAgICAgICAgIHJvb3Q6IHsgeDogNSwgeTogMTAgfSxcbiAgICAgICAgICBidWlsZGluZzogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgZXF1YWxQb2ludHMubW9ja1JldHVyblZhbHVlKHRydWUpO1xuXG4gICAgICAgIGV4cG9uZW50aWFsVG9vbC5hZGRQb2ludChwb2ludCwgbWFyayk7XG5cbiAgICAgICAgZXhwZWN0KGVxdWFsUG9pbnRzKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChtYXJrLnJvb3QsIHBvaW50KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnY2FsbHMgc2FtZUF4ZXMgd2l0aCBjb3JyZWN0IGFyZ3VtZW50cycsICgpID0+IHtcbiAgICAgICAgY29uc3QgcG9pbnQgPSB7IHg6IDgsIHk6IDEwIH07XG4gICAgICAgIGNvbnN0IG1hcmsgPSB7XG4gICAgICAgICAgdHlwZTogJ2V4cG9uZW50aWFsJyxcbiAgICAgICAgICByb290OiB7IHg6IDUsIHk6IDEwIH0sXG4gICAgICAgICAgYnVpbGRpbmc6IHRydWUsXG4gICAgICAgIH07XG4gICAgICAgIGVxdWFsUG9pbnRzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gICAgICAgIHNhbWVBeGVzLm1vY2tSZXR1cm5WYWx1ZSh0cnVlKTtcblxuICAgICAgICBleHBvbmVudGlhbFRvb2wuYWRkUG9pbnQocG9pbnQsIG1hcmspO1xuXG4gICAgICAgIGV4cGVjdChzYW1lQXhlcykudG9IYXZlQmVlbkNhbGxlZFdpdGgobWFyay5yb290LCBwb2ludCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdvcHBvc2l0ZSBzaWduIHktY29vcmRpbmF0ZXMnLCAoKSA9PiB7XG4gICAgICBpdCgncmV0dXJucyBzYW1lIG1hcmsgd2hlbiByb290IGFuZCBwb2ludCBoYXZlIG9wcG9zaXRlIHNpZ24geScsICgpID0+IHtcbiAgICAgICAgY29uc3QgbWFyayA9IHtcbiAgICAgICAgICB0eXBlOiAnZXhwb25lbnRpYWwnLFxuICAgICAgICAgIHJvb3Q6IHsgeDogMCwgeTogNSB9LCAvLyBwb3NpdGl2ZSB5XG4gICAgICAgICAgYnVpbGRpbmc6IHRydWUsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHBvaW50ID0geyB4OiA1LCB5OiAtMTAgfTsgLy8gbmVnYXRpdmUgeVxuICAgICAgICBlcXVhbFBvaW50cy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuICAgICAgICBzYW1lQXhlcy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGV4cG9uZW50aWFsVG9vbC5hZGRQb2ludChwb2ludCwgbWFyayk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZShtYXJrKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBzYW1lIG1hcmsgd2hlbiByb290IGlzIG5lZ2F0aXZlIGFuZCBwb2ludCBpcyBwb3NpdGl2ZScsICgpID0+IHtcbiAgICAgICAgY29uc3QgbWFyayA9IHtcbiAgICAgICAgICB0eXBlOiAnZXhwb25lbnRpYWwnLFxuICAgICAgICAgIHJvb3Q6IHsgeDogMCwgeTogLTUgfSwgLy8gbmVnYXRpdmUgeVxuICAgICAgICAgIGJ1aWxkaW5nOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBwb2ludCA9IHsgeDogNSwgeTogMTAgfTsgLy8gcG9zaXRpdmUgeVxuICAgICAgICBlcXVhbFBvaW50cy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuICAgICAgICBzYW1lQXhlcy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGV4cG9uZW50aWFsVG9vbC5hZGRQb2ludChwb2ludCwgbWFyayk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZShtYXJrKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYWxsb3dzIHBvaW50cyB3aXRoIHNhbWUgc2lnbiB5IChib3RoIHBvc2l0aXZlKScsICgpID0+IHtcbiAgICAgICAgY29uc3QgbWFyayA9IHtcbiAgICAgICAgICB0eXBlOiAnZXhwb25lbnRpYWwnLFxuICAgICAgICAgIHJvb3Q6IHsgeDogMCwgeTogNSB9LFxuICAgICAgICAgIGJ1aWxkaW5nOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBwb2ludCA9IHsgeDogNSwgeTogMTAgfTtcbiAgICAgICAgZXF1YWxQb2ludHMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcbiAgICAgICAgc2FtZUF4ZXMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBleHBvbmVudGlhbFRvb2wuYWRkUG9pbnQocG9pbnQsIG1hcmspO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQuZWRnZSkudG9FcXVhbChwb2ludCk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuYnVpbGRpbmcpLnRvQmUoZmFsc2UpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdhbGxvd3MgcG9pbnRzIHdpdGggc2FtZSBzaWduIHkgKGJvdGggbmVnYXRpdmUpJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBtYXJrID0ge1xuICAgICAgICAgIHR5cGU6ICdleHBvbmVudGlhbCcsXG4gICAgICAgICAgcm9vdDogeyB4OiAwLCB5OiAtNSB9LFxuICAgICAgICAgIGJ1aWxkaW5nOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBwb2ludCA9IHsgeDogNSwgeTogLTEwIH07XG4gICAgICAgIGVxdWFsUG9pbnRzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gICAgICAgIHNhbWVBeGVzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KHBvaW50LCBtYXJrKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0LmVkZ2UpLnRvRXF1YWwocG9pbnQpO1xuICAgICAgICBleHBlY3QocmVzdWx0LmJ1aWxkaW5nKS50b0JlKGZhbHNlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3plcm8geS1jb29yZGluYXRlIGhhbmRsaW5nJywgKCkgPT4ge1xuICAgICAgaXQoJ3JldHVybnMgc2FtZSBtYXJrIHdoZW4gcG9pbnQgaGFzIHkgPSAwJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBtYXJrID0ge1xuICAgICAgICAgIHR5cGU6ICdleHBvbmVudGlhbCcsXG4gICAgICAgICAgcm9vdDogeyB4OiAwLCB5OiA1IH0sXG4gICAgICAgICAgYnVpbGRpbmc6IHRydWUsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHBvaW50ID0geyB4OiA1LCB5OiAwIH07XG4gICAgICAgIGVxdWFsUG9pbnRzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gICAgICAgIHNhbWVBeGVzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KHBvaW50LCBtYXJrKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0KS50b0JlKG1hcmspO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdwcmV2ZW50cyBhZGRpbmcgcG9pbnQgd2l0aCB6ZXJvIHknLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvaW50ID0geyB4OiA1LCB5OiAwIH07XG4gICAgICAgIGNvbnN0IG1hcmsgPSB7XG4gICAgICAgICAgdHlwZTogJ2V4cG9uZW50aWFsJyxcbiAgICAgICAgICByb290OiB7IHg6IDEsIHk6IDIgfSxcbiAgICAgICAgICBidWlsZGluZzogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgZXF1YWxQb2ludHMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcbiAgICAgICAgc2FtZUF4ZXMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBleHBvbmVudGlhbFRvb2wuYWRkUG9pbnQocG9pbnQsIG1hcmspO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUobWFyayk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuZWRnZSkudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdwcmV2ZW50cyBjcmVhdGluZyByb290IHdpdGggemVybyB5JywgKCkgPT4ge1xuICAgICAgICBjb25zdCBwb2ludCA9IHsgeDogNSwgeTogMCB9O1xuICAgICAgICBlcXVhbFBvaW50cy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuICAgICAgICBzYW1lQXhlcy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGV4cG9uZW50aWFsVG9vbC5hZGRQb2ludChwb2ludCwgbnVsbCk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZU51bGwoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYWxsb3dzIHBvc2l0aXZlIHkgdmFsdWVzIGNsb3NlIHRvIHplcm8nLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvaW50ID0geyB4OiA1LCB5OiAwLjAwMSB9O1xuICAgICAgICBlcXVhbFBvaW50cy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuICAgICAgICBzYW1lQXhlcy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGV4cG9uZW50aWFsVG9vbC5hZGRQb2ludChwb2ludCwgbnVsbCk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdC5yb290KS50b0VxdWFsKHBvaW50KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYWxsb3dzIG5lZ2F0aXZlIHkgdmFsdWVzIGNsb3NlIHRvIHplcm8nLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvaW50ID0geyB4OiA1LCB5OiAtMC4wMDEgfTtcbiAgICAgICAgZXF1YWxQb2ludHMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcbiAgICAgICAgc2FtZUF4ZXMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBleHBvbmVudGlhbFRvb2wuYWRkUG9pbnQocG9pbnQsIG51bGwpO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQucm9vdCkudG9FcXVhbChwb2ludCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdlcnJvciBoYW5kbGluZycsICgpID0+IHtcbiAgICAgIGl0KCd0aHJvd3MgZXJyb3Igd2hlbiBtYXJrIGhhcyBubyByb290JywgKCkgPT4ge1xuICAgICAgICBjb25zdCBtYXJrID0ge1xuICAgICAgICAgIHR5cGU6ICdleHBvbmVudGlhbCcsXG4gICAgICAgICAgYnVpbGRpbmc6IHRydWUsXG4gICAgICAgICAgLy8gcm9vdCBpcyBtaXNzaW5nXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHBvaW50ID0geyB4OiA1LCB5OiAxMCB9O1xuICAgICAgICBlcXVhbFBvaW50cy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuICAgICAgICBzYW1lQXhlcy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuXG4gICAgICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICAgICAgZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KHBvaW50LCBtYXJrKTtcbiAgICAgICAgfSkudG9UaHJvdygpOyAvLyBXaWxsIHRocm93IFR5cGVFcnJvciB3aGVuIGFjY2Vzc2luZyB1bmRlZmluZWQueVxuICAgICAgfSk7XG5cbiAgICAgIGl0KCd0aHJvd3MgZXJyb3Igd2hlbiBtYXJrIHJvb3QgaXMgbnVsbCcsICgpID0+IHtcbiAgICAgICAgY29uc3QgbWFyayA9IHtcbiAgICAgICAgICB0eXBlOiAnZXhwb25lbnRpYWwnLFxuICAgICAgICAgIHJvb3Q6IG51bGwsXG4gICAgICAgICAgYnVpbGRpbmc6IHRydWUsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHBvaW50ID0geyB4OiA1LCB5OiAxMCB9O1xuICAgICAgICBlcXVhbFBvaW50cy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuICAgICAgICBzYW1lQXhlcy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuXG4gICAgICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICAgICAgZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KHBvaW50LCBtYXJrKTtcbiAgICAgICAgfSkudG9UaHJvdygpOyAvLyBXaWxsIHRocm93IFR5cGVFcnJvciB3aGVuIGFjY2Vzc2luZyBudWxsLnlcbiAgICAgIH0pO1xuXG4gICAgICBpdCgndGhyb3dzIGVycm9yIHdoZW4gbWFyayByb290IGlzIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgICAgY29uc3QgbWFyayA9IHtcbiAgICAgICAgICB0eXBlOiAnZXhwb25lbnRpYWwnLFxuICAgICAgICAgIHJvb3Q6IHVuZGVmaW5lZCxcbiAgICAgICAgICBidWlsZGluZzogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcG9pbnQgPSB7IHg6IDUsIHk6IDEwIH07XG4gICAgICAgIGVxdWFsUG9pbnRzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gICAgICAgIHNhbWVBeGVzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG5cbiAgICAgICAgZXhwZWN0KCgpID0+IHtcbiAgICAgICAgICBleHBvbmVudGlhbFRvb2wuYWRkUG9pbnQocG9pbnQsIG1hcmspO1xuICAgICAgICB9KS50b1Rocm93KCk7IC8vIFdpbGwgdGhyb3cgVHlwZUVycm9yIHdoZW4gYWNjZXNzaW5nIHVuZGVmaW5lZC55XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdlZGdlIGNhc2VzJywgKCkgPT4ge1xuICAgICAgaXQoJ2hhbmRsZXMgdW5kZWZpbmVkIG1hcmsgb24gZmlyc3QgY2xpY2snLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvaW50ID0geyB4OiA1LCB5OiAxMCB9O1xuICAgICAgICBlcXVhbFBvaW50cy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuICAgICAgICBzYW1lQXhlcy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGV4cG9uZW50aWFsVG9vbC5hZGRQb2ludChwb2ludCwgdW5kZWZpbmVkKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0LnR5cGUpLnRvQmUoJ2V4cG9uZW50aWFsJyk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQucm9vdCkudG9FcXVhbChwb2ludCk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuYnVpbGRpbmcpLnRvQmUodHJ1ZSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2hhbmRsZXMgdmVyeSBsYXJnZSBwb3NpdGl2ZSB5JywgKCkgPT4ge1xuICAgICAgICBjb25zdCBwb2ludCA9IHsgeDogNSwgeTogMTAwMDAgfTtcbiAgICAgICAgZXF1YWxQb2ludHMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcbiAgICAgICAgc2FtZUF4ZXMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBleHBvbmVudGlhbFRvb2wuYWRkUG9pbnQocG9pbnQsIG51bGwpO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQucm9vdCkudG9FcXVhbChwb2ludCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2hhbmRsZXMgdmVyeSBsYXJnZSBuZWdhdGl2ZSB5JywgKCkgPT4ge1xuICAgICAgICBjb25zdCBwb2ludCA9IHsgeDogNSwgeTogLTEwMDAwIH07XG4gICAgICAgIGVxdWFsUG9pbnRzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gICAgICAgIHNhbWVBeGVzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KHBvaW50LCBudWxsKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0LnJvb3QpLnRvRXF1YWwocG9pbnQpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdoYW5kbGVzIG5lZ2F0aXZlIHggY29vcmRpbmF0ZXMnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvaW50ID0geyB4OiAtNSwgeTogMTAgfTtcbiAgICAgICAgZXF1YWxQb2ludHMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcbiAgICAgICAgc2FtZUF4ZXMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBleHBvbmVudGlhbFRvb2wuYWRkUG9pbnQocG9pbnQsIG51bGwpO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQucm9vdCkudG9FcXVhbChwb2ludCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2hhbmRsZXMgbWFyayB3aXRoIGV4aXN0aW5nIGVkZ2UnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1hcmsgPSB7XG4gICAgICAgICAgdHlwZTogJ2V4cG9uZW50aWFsJyxcbiAgICAgICAgICByb290OiB7IHg6IDAsIHk6IDEgfSxcbiAgICAgICAgICBlZGdlOiB7IHg6IDMsIHk6IDMgfSxcbiAgICAgICAgICBidWlsZGluZzogZmFsc2UsXG4gICAgICAgICAgY2xvc2VkOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBuZXdFZGdlID0geyB4OiA1LCB5OiA1IH07XG4gICAgICAgIGVxdWFsUG9pbnRzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gICAgICAgIHNhbWVBeGVzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KG5ld0VkZ2UsIG1hcmspO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQuZWRnZSkudG9FcXVhbChuZXdFZGdlKTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5jbG9zZWQpLnRvQmUodHJ1ZSk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuYnVpbGRpbmcpLnRvQmUoZmFsc2UpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnaW1tdXRhYmlsaXR5JywgKCkgPT4ge1xuICAgICAgaXQoJ2RvZXMgbm90IG11dGF0ZSBvcmlnaW5hbCBtYXJrIHdoZW4gYWRkaW5nIGVkZ2UnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1hcmsgPSB7XG4gICAgICAgICAgdHlwZTogJ2V4cG9uZW50aWFsJyxcbiAgICAgICAgICByb290OiB7IHg6IDAsIHk6IDEgfSxcbiAgICAgICAgICBidWlsZGluZzogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxNYXJrID0geyAuLi5tYXJrIH07XG4gICAgICAgIGNvbnN0IHBvaW50ID0geyB4OiA1LCB5OiAxMCB9O1xuICAgICAgICBlcXVhbFBvaW50cy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuICAgICAgICBzYW1lQXhlcy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGV4cG9uZW50aWFsVG9vbC5hZGRQb2ludChwb2ludCwgbWFyayk7XG5cbiAgICAgICAgZXhwZWN0KG1hcmspLnRvRXF1YWwob3JpZ2luYWxNYXJrKTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdCkubm90LnRvQmUobWFyayk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2RvZXMgbm90IG11dGF0ZSBvcmlnaW5hbCBtYXJrIHdoZW4gcmV0dXJuaW5nIHNhbWUnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1hcmsgPSB7XG4gICAgICAgICAgdHlwZTogJ2V4cG9uZW50aWFsJyxcbiAgICAgICAgICByb290OiB7IHg6IDUsIHk6IDEwIH0sXG4gICAgICAgICAgYnVpbGRpbmc6IHRydWUsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHBvaW50ID0geyB4OiA1LCB5OiAxMCB9O1xuICAgICAgICBlcXVhbFBvaW50cy5tb2NrUmV0dXJuVmFsdWUodHJ1ZSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KHBvaW50LCBtYXJrKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0KS50b0JlKG1hcmspO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpbnRlZ3JhdGlvbiBzY2VuYXJpb3MnLCAoKSA9PiB7XG4gICAgaXQoJ2hhbmRsZXMgZnVsbCBleHBvbmVudGlhbCBjcmVhdGlvbiBmbG93JywgKCkgPT4ge1xuICAgICAgZXF1YWxQb2ludHMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcbiAgICAgIHNhbWVBeGVzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG5cbiAgICAgIC8vIEZpcnN0IGNsaWNrIC0gY3JlYXRlIHJvb3RcbiAgICAgIGNvbnN0IGZpcnN0UG9pbnQgPSB7IHg6IDAsIHk6IDEgfTtcbiAgICAgIGNvbnN0IG1hcmsxID0gZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KGZpcnN0UG9pbnQsIG51bGwpO1xuICAgICAgZXhwZWN0KG1hcmsxLnJvb3QpLnRvRXF1YWwoZmlyc3RQb2ludCk7XG4gICAgICBleHBlY3QobWFyazEuYnVpbGRpbmcpLnRvQmUodHJ1ZSk7XG4gICAgICBleHBlY3QobWFyazEuY2xvc2VkKS50b0JlKGZhbHNlKTtcblxuICAgICAgLy8gU2Vjb25kIGNsaWNrIC0gY29tcGxldGUgZXhwb25lbnRpYWxcbiAgICAgIGNvbnN0IHNlY29uZFBvaW50ID0geyB4OiA1LCB5OiAxMCB9O1xuICAgICAgY29uc3QgbWFyazIgPSBleHBvbmVudGlhbFRvb2wuYWRkUG9pbnQoc2Vjb25kUG9pbnQsIG1hcmsxKTtcbiAgICAgIGV4cGVjdChtYXJrMi5yb290KS50b0VxdWFsKGZpcnN0UG9pbnQpO1xuICAgICAgZXhwZWN0KG1hcmsyLmVkZ2UpLnRvRXF1YWwoc2Vjb25kUG9pbnQpO1xuICAgICAgZXhwZWN0KG1hcmsyLmJ1aWxkaW5nKS50b0JlKGZhbHNlKTtcbiAgICAgIGV4cGVjdChtYXJrMi5jbG9zZWQpLnRvQmUodHJ1ZSk7XG5cbiAgICAgIC8vIENvbXBsZXRlXG4gICAgICBjb25zdCBtYXJrMyA9IGV4cG9uZW50aWFsVG9vbC5jb21wbGV0ZSh7fSwgbWFyazIpO1xuICAgICAgZXhwZWN0KG1hcmszLmJ1aWxkaW5nKS50b0JlKGZhbHNlKTtcbiAgICAgIGV4cGVjdChtYXJrMy5jbG9zZWQpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyByZWplY3RlZCBzZWNvbmQgcG9pbnQgKHplcm8geSknLCAoKSA9PiB7XG4gICAgICBlcXVhbFBvaW50cy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuICAgICAgc2FtZUF4ZXMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcblxuICAgICAgY29uc3QgZmlyc3RQb2ludCA9IHsgeDogMCwgeTogMSB9O1xuICAgICAgY29uc3QgbWFyazEgPSBleHBvbmVudGlhbFRvb2wuYWRkUG9pbnQoZmlyc3RQb2ludCwgbnVsbCk7XG5cbiAgICAgIGNvbnN0IHNlY29uZFBvaW50ID0geyB4OiA1LCB5OiAwIH07XG4gICAgICBjb25zdCBtYXJrMiA9IGV4cG9uZW50aWFsVG9vbC5hZGRQb2ludChzZWNvbmRQb2ludCwgbWFyazEpO1xuXG4gICAgICAvLyBTaG91bGQgcmV0dXJuIHVuY2hhbmdlZCBtYXJrXG4gICAgICBleHBlY3QobWFyazIpLnRvQmUobWFyazEpO1xuICAgICAgZXhwZWN0KG1hcmsyLmVkZ2UpLnRvQmVVbmRlZmluZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIHJlamVjdGVkIHNlY29uZCBwb2ludCAob3Bwb3NpdGUgc2lnbiknLCAoKSA9PiB7XG4gICAgICBlcXVhbFBvaW50cy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuICAgICAgc2FtZUF4ZXMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcblxuICAgICAgY29uc3QgZmlyc3RQb2ludCA9IHsgeDogMCwgeTogNSB9O1xuICAgICAgY29uc3QgbWFyazEgPSBleHBvbmVudGlhbFRvb2wuYWRkUG9pbnQoZmlyc3RQb2ludCwgbnVsbCk7XG5cbiAgICAgIGNvbnN0IHNlY29uZFBvaW50ID0geyB4OiA1LCB5OiAtMTAgfTtcbiAgICAgIGNvbnN0IG1hcmsyID0gZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KHNlY29uZFBvaW50LCBtYXJrMSk7XG5cbiAgICAgIC8vIFNob3VsZCByZXR1cm4gdW5jaGFuZ2VkIG1hcmtcbiAgICAgIGV4cGVjdChtYXJrMikudG9CZShtYXJrMSk7XG4gICAgICBleHBlY3QobWFyazIuZWRnZSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgcmVqZWN0ZWQgc2Vjb25kIHBvaW50IChzYW1lIGF4ZXMpJywgKCkgPT4ge1xuICAgICAgZXF1YWxQb2ludHMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcbiAgICAgIHNhbWVBeGVzLm1vY2tSZXR1cm5WYWx1ZSh0cnVlKTtcblxuICAgICAgY29uc3QgZmlyc3RQb2ludCA9IHsgeDogMCwgeTogNSB9O1xuICAgICAgY29uc3QgbWFyazEgPSBleHBvbmVudGlhbFRvb2wuYWRkUG9pbnQoZmlyc3RQb2ludCwgbnVsbCk7XG5cbiAgICAgIGNvbnN0IHNlY29uZFBvaW50ID0geyB4OiAxMCwgeTogNSB9OyAvLyBzYW1lIHlcbiAgICAgIGNvbnN0IG1hcmsyID0gZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KHNlY29uZFBvaW50LCBtYXJrMSk7XG5cbiAgICAgIC8vIFNob3VsZCByZXR1cm4gdW5jaGFuZ2VkIG1hcmtcbiAgICAgIGV4cGVjdChtYXJrMikudG9CZShtYXJrMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBleHBvbmVudGlhbCB3aXRoIG5lZ2F0aXZlIHkgdmFsdWVzJywgKCkgPT4ge1xuICAgICAgZXF1YWxQb2ludHMubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcbiAgICAgIHNhbWVBeGVzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG5cbiAgICAgIGNvbnN0IGZpcnN0UG9pbnQgPSB7IHg6IDAsIHk6IC0xIH07XG4gICAgICBjb25zdCBtYXJrMSA9IGV4cG9uZW50aWFsVG9vbC5hZGRQb2ludChmaXJzdFBvaW50LCBudWxsKTtcblxuICAgICAgY29uc3Qgc2Vjb25kUG9pbnQgPSB7IHg6IDUsIHk6IC0xMCB9O1xuICAgICAgY29uc3QgbWFyazIgPSBleHBvbmVudGlhbFRvb2wuYWRkUG9pbnQoc2Vjb25kUG9pbnQsIG1hcmsxKTtcblxuICAgICAgZXhwZWN0KG1hcmsyLnJvb3QpLnRvRXF1YWwoZmlyc3RQb2ludCk7XG4gICAgICBleHBlY3QobWFyazIuZWRnZSkudG9FcXVhbChzZWNvbmRQb2ludCk7XG4gICAgICBleHBlY3QobWFyazIuYnVpbGRpbmcpLnRvQmUoZmFsc2UpO1xuICAgICAgZXhwZWN0KG1hcmsyLmNsb3NlZCkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIGV4cG9uZW50aWFsIHdpdGggcHJvcGVydGllcycsICgpID0+IHtcbiAgICAgIGVxdWFsUG9pbnRzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gICAgICBzYW1lQXhlcy5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuXG4gICAgICBjb25zdCBmaXJzdFBvaW50ID0geyB4OiAwLCB5OiAxLCBsYWJlbDogJ1N0YXJ0JyB9O1xuICAgICAgY29uc3QgbWFyazEgPSBleHBvbmVudGlhbFRvb2wuYWRkUG9pbnQoZmlyc3RQb2ludCwgbnVsbCk7XG5cbiAgICAgIC8vIEFkZCBwcm9wZXJ0aWVzXG4gICAgICBtYXJrMS5sYWJlbCA9ICdFeHAgQSc7XG4gICAgICBtYXJrMS5jb3JyZWN0bmVzcyA9IHsgdmFsdWU6ICdjb3JyZWN0JyB9O1xuXG4gICAgICBjb25zdCBzZWNvbmRQb2ludCA9IHsgeDogNSwgeTogMTAgfTtcbiAgICAgIGNvbnN0IG1hcmsyID0gZXhwb25lbnRpYWxUb29sLmFkZFBvaW50KHNlY29uZFBvaW50LCBtYXJrMSk7XG5cbiAgICAgIGV4cGVjdChtYXJrMi5sYWJlbCkudG9CZSgnRXhwIEEnKTtcbiAgICAgIGV4cGVjdChtYXJrMi5jb3JyZWN0bmVzcykudG9FcXVhbCh7IHZhbHVlOiAnY29ycmVjdCcgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsTUFBQSxHQUFBRCxPQUFBO0FBQXVELFNBQUFFLFFBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsSUFBQSxDQUFBSixDQUFBLE9BQUFHLE1BQUEsQ0FBQUUscUJBQUEsUUFBQUMsQ0FBQSxHQUFBSCxNQUFBLENBQUFFLHFCQUFBLENBQUFMLENBQUEsR0FBQUMsQ0FBQSxLQUFBSyxDQUFBLEdBQUFBLENBQUEsQ0FBQUMsTUFBQSxXQUFBTixDQUFBLFdBQUFFLE1BQUEsQ0FBQUssd0JBQUEsQ0FBQVIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFRLFVBQUEsT0FBQVAsQ0FBQSxDQUFBUSxJQUFBLENBQUFDLEtBQUEsQ0FBQVQsQ0FBQSxFQUFBSSxDQUFBLFlBQUFKLENBQUE7QUFBQSxTQUFBVSxjQUFBWixDQUFBLGFBQUFDLENBQUEsTUFBQUEsQ0FBQSxHQUFBWSxTQUFBLENBQUFDLE1BQUEsRUFBQWIsQ0FBQSxVQUFBQyxDQUFBLFdBQUFXLFNBQUEsQ0FBQVosQ0FBQSxJQUFBWSxTQUFBLENBQUFaLENBQUEsUUFBQUEsQ0FBQSxPQUFBRixPQUFBLENBQUFJLE1BQUEsQ0FBQUQsQ0FBQSxPQUFBYSxPQUFBLFdBQUFkLENBQUEsUUFBQWUsZ0JBQUEsYUFBQWhCLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLENBQUFELENBQUEsU0FBQUUsTUFBQSxDQUFBYyx5QkFBQSxHQUFBZCxNQUFBLENBQUFlLGdCQUFBLENBQUFsQixDQUFBLEVBQUFHLE1BQUEsQ0FBQWMseUJBQUEsQ0FBQWYsQ0FBQSxLQUFBSCxPQUFBLENBQUFJLE1BQUEsQ0FBQUQsQ0FBQSxHQUFBYSxPQUFBLFdBQUFkLENB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