@pie-lib/graphing-solution-set 3.2.0-next.2 → 3.2.0-next.5

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 (75) hide show
  1. package/CHANGELOG.md +22 -31
  2. package/LICENSE.md +5 -0
  3. package/lib/axis/arrow.js +1 -1
  4. package/lib/axis/axes.js +1 -1
  5. package/lib/axis/index.js +1 -1
  6. package/lib/bg.js +1 -1
  7. package/lib/container/actions.js +1 -1
  8. package/lib/container/index.js +1 -1
  9. package/lib/container/marks.js +1 -1
  10. package/lib/container/middleware.js +1 -1
  11. package/lib/container/reducer.js +1 -1
  12. package/lib/coordinates-label.js +1 -1
  13. package/lib/graph-with-controls.js +1 -1
  14. package/lib/graph.js +1 -1
  15. package/lib/grid-setup.js +1 -1
  16. package/lib/grid.js +1 -1
  17. package/lib/index.js +1 -1
  18. package/lib/labels.js +1 -1
  19. package/lib/mark-label.js +1 -1
  20. package/lib/toggle-bar.js +1 -1
  21. package/lib/tool-menu.js +1 -1
  22. package/lib/tools/index.js +1 -1
  23. package/lib/tools/line/component.js +1 -1
  24. package/lib/tools/line/index.js +1 -1
  25. package/lib/tools/polygon/component.js +1 -1
  26. package/lib/tools/polygon/index.js +1 -1
  27. package/lib/tools/polygon/line.js +1 -1
  28. package/lib/tools/polygon/polygon.js +1 -1
  29. package/lib/tools/shared/arrow-head.js +1 -1
  30. package/lib/tools/shared/line/index.js +1 -1
  31. package/lib/tools/shared/line/line-path.js +1 -1
  32. package/lib/tools/shared/line/with-root-edge.js +1 -1
  33. package/lib/tools/shared/point/arrow-point.js +1 -1
  34. package/lib/tools/shared/point/arrow.js +1 -1
  35. package/lib/tools/shared/point/base-point.js +1 -1
  36. package/lib/tools/shared/point/index.js +1 -1
  37. package/lib/tools/shared/styles.js +1 -1
  38. package/lib/tools/shared/types.js +1 -1
  39. package/lib/undo-redo.js +1 -1
  40. package/lib/use-debounce.js +1 -1
  41. package/lib/utils.js +1 -1
  42. package/package.json +4 -4
  43. package/lib/__tests__/bg.test.js +0 -282
  44. package/lib/__tests__/coordinates-label.test.js +0 -276
  45. package/lib/__tests__/graph-with-controls.test.js +0 -256
  46. package/lib/__tests__/graph.test.js +0 -113
  47. package/lib/__tests__/grid-setup.test.js +0 -729
  48. package/lib/__tests__/grid.test.js +0 -29
  49. package/lib/__tests__/labels.test.js +0 -45
  50. package/lib/__tests__/mark-label.test.js +0 -133
  51. package/lib/__tests__/toggle-bar.test.js +0 -146
  52. package/lib/__tests__/tool-menu.test.js +0 -540
  53. package/lib/__tests__/undo-redo.test.js +0 -31
  54. package/lib/__tests__/use-debounce.test.js +0 -24
  55. package/lib/__tests__/utils.js +0 -70
  56. package/lib/__tests__/utils.test.js +0 -123
  57. package/lib/axis/__tests__/arrow.test.js +0 -60
  58. package/lib/axis/__tests__/axes.test.js +0 -160
  59. package/lib/container/__tests__/actions.test.js +0 -108
  60. package/lib/container/__tests__/index.test.js +0 -346
  61. package/lib/container/__tests__/marks.test.js +0 -259
  62. package/lib/container/__tests__/middleware.test.js +0 -244
  63. package/lib/container/__tests__/reducer.test.js +0 -450
  64. package/lib/tools/line/__tests__/component.test.js +0 -45
  65. package/lib/tools/polygon/__tests__/component.test.js +0 -501
  66. package/lib/tools/polygon/__tests__/index.test.js +0 -92
  67. package/lib/tools/polygon/__tests__/line.test.js +0 -30
  68. package/lib/tools/polygon/__tests__/polygon.test.js +0 -61
  69. package/lib/tools/shared/__tests__/arrow-head.test.js +0 -45
  70. package/lib/tools/shared/line/__tests__/index.test.js +0 -725
  71. package/lib/tools/shared/line/__tests__/line-path.test.js +0 -64
  72. package/lib/tools/shared/line/__tests__/with-root-edge.test.js +0 -618
  73. package/lib/tools/shared/point/__tests__/arrow-point.test.js +0 -127
  74. package/lib/tools/shared/point/__tests__/arrow.test.js +0 -619
  75. package/lib/tools/shared/point/__tests__/base-point.test.js +0 -122
@@ -1,725 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
5
- var _index = require("../index");
6
- var _plot = require("@pie-lib/plot");
7
- var _testUtils = require("@pie-lib/test-utils");
8
- var _react = _interopRequireDefault(require("react"));
9
- var _utils = require("../../../../__tests__/utils");
10
- 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; }
11
- 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; }
12
- var xy = _plot.utils.xy;
13
- var xyLabel = function xyLabel(x, y, label) {
14
- return {
15
- x: x,
16
- y: y,
17
- label: label
18
- };
19
- };
20
- describe('lineTool', function () {
21
- describe('addPoint', function () {
22
- var toolbar;
23
- beforeEach(function () {
24
- toolbar = (0, _index.lineTool)('lineType', function () {
25
- return /*#__PURE__*/_react["default"].createElement("div", null);
26
- })();
27
- });
28
- it('returns a building mark when no existing mark', function () {
29
- var result = toolbar.addPoint(xy(1, 1));
30
- expect(result).toEqual({
31
- type: 'lineType',
32
- building: true,
33
- from: xy(1, 1)
34
- });
35
- });
36
- it('returns a complete mark when adding second point', function () {
37
- var result = toolbar.addPoint(xy(1, 1), {
38
- from: xy(0, 0)
39
- });
40
- expect(result).toEqual({
41
- building: false,
42
- from: xy(0, 0),
43
- to: xy(1, 1)
44
- });
45
- });
46
- it('returns same mark if point equals existing from point', function () {
47
- var existingMark = {
48
- from: xy(1, 1),
49
- building: true
50
- };
51
- var result = toolbar.addPoint(xy(1, 1), existingMark);
52
- expect(result).toEqual(existingMark);
53
- });
54
- it('handles adding point with root property', function () {
55
- var existingMark = {
56
- root: xy(1, 1),
57
- building: true
58
- };
59
- var result = toolbar.addPoint(xy(1, 1), existingMark);
60
- expect(result).toEqual(existingMark);
61
- });
62
- it('creates different types correctly', function () {
63
- var lineA = (0, _index.lineTool)('lineA', function () {
64
- return /*#__PURE__*/_react["default"].createElement("div", null);
65
- })();
66
- var lineB = (0, _index.lineTool)('lineB', function () {
67
- return /*#__PURE__*/_react["default"].createElement("div", null);
68
- })();
69
- var resultA = lineA.addPoint(xy(1, 1));
70
- var resultB = lineB.addPoint(xy(1, 1));
71
- expect(resultA.type).toBe('lineA');
72
- expect(resultB.type).toBe('lineB');
73
- });
74
- it('preserves building state correctly', function () {
75
- var building = toolbar.addPoint(xy(1, 1));
76
- expect(building.building).toBe(true);
77
- var complete = toolbar.addPoint(xy(2, 2), building);
78
- expect(complete.building).toBe(false);
79
- });
80
- });
81
- describe('Component property', function () {
82
- it('stores the provided Component', function () {
83
- var TestComp = function TestComp() {
84
- return /*#__PURE__*/_react["default"].createElement("div", null, "Test");
85
- };
86
- var tool = (0, _index.lineTool)('test', TestComp)();
87
- expect(tool.Component).toBe(TestComp);
88
- });
89
- it('stores the correct type', function () {
90
- var tool = (0, _index.lineTool)('customType', function () {
91
- return /*#__PURE__*/_react["default"].createElement("div", null);
92
- })();
93
- expect(tool.type).toBe('customType');
94
- });
95
- });
96
- });
97
- describe('lineToolComponent', function () {
98
- var Comp;
99
- var mark;
100
- var onChange;
101
- beforeEach(function () {
102
- onChange = jest.fn();
103
- Comp = (0, _index.lineToolComponent)(function () {
104
- return /*#__PURE__*/_react["default"].createElement("text", {
105
- "data-testid": "line-component"
106
- });
107
- });
108
- mark = {
109
- from: xy(0, 0),
110
- to: xy(1, 1),
111
- type: 'line'
112
- };
113
- });
114
- var renderComponent = function renderComponent(extras) {
115
- var defaults = {
116
- mark: mark,
117
- onChange: onChange,
118
- graphProps: (0, _utils.graphProps)()
119
- };
120
- var props = _objectSpread(_objectSpread({}, defaults), extras);
121
- return (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(Comp, props));
122
- };
123
- describe('rendering', function () {
124
- it('renders without crashing', function () {
125
- var _renderComponent = renderComponent(),
126
- container = _renderComponent.container;
127
- expect(container.firstChild).toBeInTheDocument();
128
- });
129
- it('renders with building mark', function () {
130
- var buildingMark = {
131
- from: xy(0, 0),
132
- building: true,
133
- type: 'line'
134
- };
135
- var _renderComponent2 = renderComponent({
136
- mark: buildingMark
137
- }),
138
- container = _renderComponent2.container;
139
- expect(container.firstChild).toBeInTheDocument();
140
- });
141
- it('renders with background mark', function () {
142
- var bgMark = {
143
- from: xy(0, 0),
144
- to: xy(1, 1),
145
- isBackground: true,
146
- type: 'line'
147
- };
148
- var _renderComponent3 = renderComponent({
149
- mark: bgMark
150
- }),
151
- container = _renderComponent3.container;
152
- expect(container.firstChild).toBeInTheDocument();
153
- });
154
- it('renders with disabled mark', function () {
155
- var disabledMark = {
156
- from: xy(0, 0),
157
- to: xy(1, 1),
158
- disabled: true,
159
- type: 'line'
160
- };
161
- var _renderComponent4 = renderComponent({
162
- mark: disabledMark
163
- }),
164
- container = _renderComponent4.container;
165
- expect(container.firstChild).toBeInTheDocument();
166
- });
167
- it('renders with correctness states', function () {
168
- var correctMark = {
169
- from: xy(0, 0),
170
- to: xy(1, 1),
171
- correctness: 'correct',
172
- type: 'line'
173
- };
174
- var _renderComponent5 = renderComponent({
175
- mark: correctMark
176
- }),
177
- container = _renderComponent5.container;
178
- expect(container.firstChild).toBeInTheDocument();
179
- });
180
- it('renders with middle point', function () {
181
- var markWithMiddle = {
182
- from: xy(0, 0),
183
- to: xy(1, 1),
184
- middle: xy(0.5, 0.5),
185
- type: 'line'
186
- };
187
- var _renderComponent6 = renderComponent({
188
- mark: markWithMiddle
189
- }),
190
- container = _renderComponent6.container;
191
- expect(container.firstChild).toBeInTheDocument();
192
- });
193
- it('renders with fill color', function () {
194
- var coloredMark = {
195
- from: xy(0, 0),
196
- to: xy(1, 1),
197
- fill: '#ff0000',
198
- type: 'line'
199
- };
200
- var _renderComponent7 = renderComponent({
201
- mark: coloredMark
202
- }),
203
- container = _renderComponent7.container;
204
- expect(container.firstChild).toBeInTheDocument();
205
- });
206
- it('renders with gssLineData', function () {
207
- var gssLineData = {
208
- selectedTool: 'lineA'
209
- };
210
- var _renderComponent8 = renderComponent({
211
- gssLineData: gssLineData
212
- }),
213
- container = _renderComponent8.container;
214
- expect(container.firstChild).toBeInTheDocument();
215
- });
216
- it('renders with labelNode', function () {
217
- var labelNode = document.createElement('foreignObject');
218
- var _renderComponent9 = renderComponent({
219
- labelNode: labelNode
220
- }),
221
- container = _renderComponent9.container;
222
- expect(container.firstChild).toBeInTheDocument();
223
- });
224
- it('renders with coordinatesOnHover enabled', function () {
225
- var _renderComponent0 = renderComponent({
226
- coordinatesOnHover: true
227
- }),
228
- container = _renderComponent0.container;
229
- expect(container.firstChild).toBeInTheDocument();
230
- });
231
- it('renders with labelModeEnabled', function () {
232
- var _renderComponent1 = renderComponent({
233
- labelModeEnabled: true
234
- }),
235
- container = _renderComponent1.container;
236
- expect(container.firstChild).toBeInTheDocument();
237
- });
238
- });
239
- describe('state management', function () {
240
- it('initializes with empty state', function () {
241
- var _renderComponent10 = renderComponent(),
242
- container = _renderComponent10.container;
243
- expect(container.firstChild).toBeInTheDocument();
244
- // State should be empty initially
245
- });
246
- it('handles mark updates through props', function () {
247
- var _renderComponent11 = renderComponent(),
248
- rerender = _renderComponent11.rerender,
249
- container = _renderComponent11.container;
250
- var updatedMark = {
251
- from: xy(1, 1),
252
- to: xy(2, 2),
253
- type: 'line'
254
- };
255
- rerender(/*#__PURE__*/_react["default"].createElement(Comp, {
256
- mark: updatedMark,
257
- onChange: onChange,
258
- graphProps: (0, _utils.graphProps)()
259
- }));
260
- expect(container.firstChild).toBeInTheDocument();
261
- });
262
- });
263
- describe('background mark handling', function () {
264
- it('disables from point when mark is background', function () {
265
- var bgMark = {
266
- from: xy(0, 0),
267
- to: xy(1, 1),
268
- isBackground: true,
269
- type: 'line'
270
- };
271
- var _renderComponent12 = renderComponent({
272
- mark: bgMark
273
- }),
274
- container = _renderComponent12.container;
275
- expect(container.firstChild).toBeInTheDocument();
276
- // from.disabled should be true
277
- });
278
- it('disables to point when mark is background', function () {
279
- var bgMark = {
280
- from: xy(0, 0),
281
- to: xy(1, 1),
282
- isBackground: true,
283
- type: 'line'
284
- };
285
- var _renderComponent13 = renderComponent({
286
- mark: bgMark
287
- }),
288
- container = _renderComponent13.container;
289
- expect(container.firstChild).toBeInTheDocument();
290
- // to.disabled should be true
291
- });
292
- it('disables middle point when mark is background', function () {
293
- var bgMark = {
294
- from: xy(0, 0),
295
- to: xy(1, 1),
296
- middle: xy(0.5, 0.5),
297
- isBackground: true,
298
- type: 'line'
299
- };
300
- var _renderComponent14 = renderComponent({
301
- mark: bgMark
302
- }),
303
- container = _renderComponent14.container;
304
- expect(container.firstChild).toBeInTheDocument();
305
- // middle.disabled should be true
306
- });
307
- });
308
- describe('edge cases', function () {
309
- it('handles mark without to point', function () {
310
- var incompleteMark = {
311
- from: xy(0, 0),
312
- type: 'line'
313
- };
314
- var _renderComponent15 = renderComponent({
315
- mark: incompleteMark
316
- }),
317
- container = _renderComponent15.container;
318
- expect(container.firstChild).toBeInTheDocument();
319
- });
320
- it('handles mark with only from point', function () {
321
- var singlePointMark = {
322
- from: xy(0, 0),
323
- building: true,
324
- type: 'line'
325
- };
326
- var _renderComponent16 = renderComponent({
327
- mark: singlePointMark
328
- }),
329
- container = _renderComponent16.container;
330
- expect(container.firstChild).toBeInTheDocument();
331
- });
332
- it('handles different line types', function () {
333
- var parabola = {
334
- from: xy(0, 0),
335
- to: xy(1, 1),
336
- type: 'parabola'
337
- };
338
- var sine = {
339
- from: xy(0, 0),
340
- to: xy(1, 1),
341
- type: 'sine'
342
- };
343
- var absolute = {
344
- from: xy(0, 0),
345
- to: xy(1, 1),
346
- type: 'absolute'
347
- };
348
- var exponential = {
349
- from: xy(0, 0),
350
- to: xy(1, 1),
351
- type: 'exponential'
352
- };
353
- (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(Comp, {
354
- mark: parabola,
355
- onChange: onChange,
356
- graphProps: (0, _utils.graphProps)()
357
- }));
358
- (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(Comp, {
359
- mark: sine,
360
- onChange: onChange,
361
- graphProps: (0, _utils.graphProps)()
362
- }));
363
- (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(Comp, {
364
- mark: absolute,
365
- onChange: onChange,
366
- graphProps: (0, _utils.graphProps)()
367
- }));
368
- (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(Comp, {
369
- mark: exponential,
370
- onChange: onChange,
371
- graphProps: (0, _utils.graphProps)()
372
- }));
373
- });
374
- });
375
- });
376
- describe('lineBase', function () {
377
- var Comp;
378
- var onChange;
379
- var changeMarkProps;
380
- var onClick;
381
- beforeEach(function () {
382
- onChange = jest.fn();
383
- changeMarkProps = jest.fn();
384
- onClick = jest.fn();
385
- Comp = (0, _index.lineBase)(function () {
386
- return /*#__PURE__*/_react["default"].createElement("text", {
387
- "data-testid": "line-base"
388
- });
389
- });
390
- });
391
- var renderComponent = function renderComponent(extras) {
392
- var defaults = {
393
- onChange: onChange,
394
- changeMarkProps: changeMarkProps,
395
- onClick: onClick,
396
- graphProps: (0, _utils.graphProps)(),
397
- from: xy(0, 0),
398
- to: xy(1, 1)
399
- };
400
- var props = _objectSpread(_objectSpread({}, defaults), extras);
401
- return (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(Comp, props));
402
- };
403
- var labelNode = document.createElement('foreignObject');
404
- var renderWithLabels = function renderWithLabels() {
405
- var extras = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
406
- return renderComponent(_objectSpread(_objectSpread({}, extras), {}, {
407
- labelNode: labelNode,
408
- from: xyLabel(0, 0, 'A'),
409
- to: xyLabel(1, 1, 'B')
410
- }));
411
- };
412
- describe('rendering', function () {
413
- it('renders without crashing', function () {
414
- var _renderComponent17 = renderComponent(),
415
- container = _renderComponent17.container;
416
- expect(container.firstChild).toBeInTheDocument();
417
- });
418
- it('renders with labels', function () {
419
- var _renderWithLabels = renderWithLabels(),
420
- container = _renderWithLabels.container;
421
- expect(container.firstChild).toBeInTheDocument();
422
- });
423
- it('renders with middle point label', function () {
424
- var _renderComponent18 = renderComponent({
425
- labelNode: labelNode,
426
- middle: xyLabel(0.5, 0.5, 'M')
427
- }),
428
- container = _renderComponent18.container;
429
- expect(container.firstChild).toBeInTheDocument();
430
- });
431
- it('renders with only from label', function () {
432
- var _renderComponent19 = renderComponent({
433
- labelNode: labelNode,
434
- from: xyLabel(0, 0, 'Start'),
435
- to: xy(1, 1)
436
- }),
437
- container = _renderComponent19.container;
438
- expect(container.firstChild).toBeInTheDocument();
439
- });
440
- it('renders with only to label', function () {
441
- var _renderComponent20 = renderComponent({
442
- labelNode: labelNode,
443
- from: xy(0, 0),
444
- to: xyLabel(1, 1, 'End')
445
- }),
446
- container = _renderComponent20.container;
447
- expect(container.firstChild).toBeInTheDocument();
448
- });
449
- it('renders with all three labels', function () {
450
- var _renderComponent21 = renderComponent({
451
- labelNode: labelNode,
452
- from: xyLabel(0, 0, 'A'),
453
- to: xyLabel(1, 1, 'B'),
454
- middle: xyLabel(0.5, 0.5, 'M')
455
- }),
456
- container = _renderComponent21.container;
457
- expect(container.firstChild).toBeInTheDocument();
458
- });
459
- });
460
- describe('gssLineData handling', function () {
461
- it('renders normally without gssLineData', function () {
462
- var _renderComponent22 = renderComponent(),
463
- container = _renderComponent22.container;
464
- expect(container.firstChild).toBeInTheDocument();
465
- });
466
- it('renders with gssLineData when solutionSet is selected', function () {
467
- var gssLineData = {
468
- selectedTool: 'solutionSet'
469
- };
470
- var _renderComponent23 = renderComponent({
471
- gssLineData: gssLineData
472
- }),
473
- container = _renderComponent23.container;
474
- expect(container.firstChild).toBeInTheDocument();
475
- });
476
- it('renders with gssLineData when lineA is selected', function () {
477
- var gssLineData = {
478
- selectedTool: 'lineA'
479
- };
480
- var _renderComponent24 = renderComponent({
481
- gssLineData: gssLineData
482
- }),
483
- container = _renderComponent24.container;
484
- expect(container.firstChild).toBeInTheDocument();
485
- });
486
- it('renders with gssLineData when lineB is selected', function () {
487
- var gssLineData = {
488
- selectedTool: 'lineB'
489
- };
490
- var _renderComponent25 = renderComponent({
491
- gssLineData: gssLineData
492
- }),
493
- container = _renderComponent25.container;
494
- expect(container.firstChild).toBeInTheDocument();
495
- });
496
- });
497
- describe('disabled state', function () {
498
- it('renders when disabled', function () {
499
- var _renderComponent26 = renderComponent({
500
- disabled: true
501
- }),
502
- container = _renderComponent26.container;
503
- expect(container.firstChild).toBeInTheDocument();
504
- });
505
- it('renders when not disabled', function () {
506
- var _renderComponent27 = renderComponent({
507
- disabled: false
508
- }),
509
- container = _renderComponent27.container;
510
- expect(container.firstChild).toBeInTheDocument();
511
- });
512
- });
513
- describe('correctness states', function () {
514
- it('renders with correct state', function () {
515
- var _renderComponent28 = renderComponent({
516
- correctness: 'correct'
517
- }),
518
- container = _renderComponent28.container;
519
- expect(container.firstChild).toBeInTheDocument();
520
- });
521
- it('renders with incorrect state', function () {
522
- var _renderComponent29 = renderComponent({
523
- correctness: 'incorrect'
524
- }),
525
- container = _renderComponent29.container;
526
- expect(container.firstChild).toBeInTheDocument();
527
- });
528
- it('renders with missing state', function () {
529
- var _renderComponent30 = renderComponent({
530
- correctness: 'missing'
531
- }),
532
- container = _renderComponent30.container;
533
- expect(container.firstChild).toBeInTheDocument();
534
- });
535
- it('renders without correctness', function () {
536
- var _renderComponent31 = renderComponent({
537
- correctness: undefined
538
- }),
539
- container = _renderComponent31.container;
540
- expect(container.firstChild).toBeInTheDocument();
541
- });
542
- });
543
- describe('fill color', function () {
544
- it('renders with custom fill color', function () {
545
- var _renderComponent32 = renderComponent({
546
- fill: '#ff0000'
547
- }),
548
- container = _renderComponent32.container;
549
- expect(container.firstChild).toBeInTheDocument();
550
- });
551
- it('renders without fill color', function () {
552
- var _renderComponent33 = renderComponent({
553
- fill: undefined
554
- }),
555
- container = _renderComponent33.container;
556
- expect(container.firstChild).toBeInTheDocument();
557
- });
558
- });
559
- describe('coordinates on hover', function () {
560
- it('renders with coordinatesOnHover enabled', function () {
561
- var _renderComponent34 = renderComponent({
562
- coordinatesOnHover: true
563
- }),
564
- container = _renderComponent34.container;
565
- expect(container.firstChild).toBeInTheDocument();
566
- });
567
- it('renders with coordinatesOnHover disabled', function () {
568
- var _renderComponent35 = renderComponent({
569
- coordinatesOnHover: false
570
- }),
571
- container = _renderComponent35.container;
572
- expect(container.firstChild).toBeInTheDocument();
573
- });
574
- });
575
- describe('label mode', function () {
576
- it('renders with labelModeEnabled', function () {
577
- var _renderComponent36 = renderComponent({
578
- labelModeEnabled: true,
579
- labelNode: labelNode
580
- }),
581
- container = _renderComponent36.container;
582
- expect(container.firstChild).toBeInTheDocument();
583
- });
584
- it('renders without labelModeEnabled', function () {
585
- var _renderComponent37 = renderComponent({
586
- labelModeEnabled: false,
587
- labelNode: labelNode
588
- }),
589
- container = _renderComponent37.container;
590
- expect(container.firstChild).toBeInTheDocument();
591
- });
592
- });
593
- describe('drag callbacks', function () {
594
- it('renders with onDragStart callback', function () {
595
- var onDragStart = jest.fn();
596
- var _renderComponent38 = renderComponent({
597
- onDragStart: onDragStart
598
- }),
599
- container = _renderComponent38.container;
600
- expect(container.firstChild).toBeInTheDocument();
601
- });
602
- it('renders with onDragStop callback', function () {
603
- var onDragStop = jest.fn();
604
- var _renderComponent39 = renderComponent({
605
- onDragStop: onDragStop
606
- }),
607
- container = _renderComponent39.container;
608
- expect(container.firstChild).toBeInTheDocument();
609
- });
610
- it('renders with both drag callbacks', function () {
611
- var onDragStart = jest.fn();
612
- var onDragStop = jest.fn();
613
- var _renderComponent40 = renderComponent({
614
- onDragStart: onDragStart,
615
- onDragStop: onDragStop
616
- }),
617
- container = _renderComponent40.container;
618
- expect(container.firstChild).toBeInTheDocument();
619
- });
620
- });
621
- describe('edge cases', function () {
622
- it('handles equal from and to points', function () {
623
- var _renderComponent41 = renderComponent({
624
- from: xy(1, 1),
625
- to: xy(1, 1)
626
- }),
627
- container = _renderComponent41.container;
628
- expect(container.firstChild).toBeInTheDocument();
629
- });
630
- it('handles negative coordinates', function () {
631
- var _renderComponent42 = renderComponent({
632
- from: xy(-5, -5),
633
- to: xy(-1, -1)
634
- }),
635
- container = _renderComponent42.container;
636
- expect(container.firstChild).toBeInTheDocument();
637
- });
638
- it('handles large coordinate values', function () {
639
- var _renderComponent43 = renderComponent({
640
- from: xy(100, 100),
641
- to: xy(200, 200)
642
- }),
643
- container = _renderComponent43.container;
644
- expect(container.firstChild).toBeInTheDocument();
645
- });
646
- it('handles decimal coordinates', function () {
647
- var _renderComponent44 = renderComponent({
648
- from: xy(0.5, 0.5),
649
- to: xy(1.5, 1.5)
650
- }),
651
- container = _renderComponent44.container;
652
- expect(container.firstChild).toBeInTheDocument();
653
- });
654
- it('handles vertical lines', function () {
655
- var _renderComponent45 = renderComponent({
656
- from: xy(1, 0),
657
- to: xy(1, 5)
658
- }),
659
- container = _renderComponent45.container;
660
- expect(container.firstChild).toBeInTheDocument();
661
- });
662
- it('handles horizontal lines', function () {
663
- var _renderComponent46 = renderComponent({
664
- from: xy(0, 1),
665
- to: xy(5, 1)
666
- }),
667
- container = _renderComponent46.container;
668
- expect(container.firstChild).toBeInTheDocument();
669
- });
670
- it('handles empty label strings', function () {
671
- var _renderComponent47 = renderComponent({
672
- labelNode: labelNode,
673
- from: xyLabel(0, 0, ''),
674
- to: xyLabel(1, 1, '')
675
- }),
676
- container = _renderComponent47.container;
677
- expect(container.firstChild).toBeInTheDocument();
678
- });
679
- });
680
- describe('integration scenarios', function () {
681
- it('renders complete line with all features', function () {
682
- var _renderComponent48 = renderComponent({
683
- from: xyLabel(0, 0, 'Start'),
684
- to: xyLabel(5, 5, 'End'),
685
- middle: xyLabel(2.5, 2.5, 'Middle'),
686
- labelNode: labelNode,
687
- coordinatesOnHover: true,
688
- labelModeEnabled: true,
689
- disabled: false,
690
- correctness: 'correct',
691
- fill: '#00ff00',
692
- gssLineData: {
693
- selectedTool: 'lineA'
694
- },
695
- onDragStart: jest.fn(),
696
- onDragStop: jest.fn()
697
- }),
698
- container = _renderComponent48.container;
699
- expect(container.firstChild).toBeInTheDocument();
700
- });
701
- it('renders disabled background line', function () {
702
- var _renderComponent49 = renderComponent({
703
- from: xy(0, 0),
704
- to: xy(1, 1),
705
- disabled: true,
706
- correctness: 'incorrect'
707
- }),
708
- container = _renderComponent49.container;
709
- expect(container.firstChild).toBeInTheDocument();
710
- });
711
- it('renders solution set mode', function () {
712
- var _renderComponent50 = renderComponent({
713
- from: xy(0, 0),
714
- to: xy(1, 1),
715
- gssLineData: {
716
- selectedTool: 'solutionSet'
717
- },
718
- labelNode: labelNode
719
- }),
720
- container = _renderComponent50.container;
721
- expect(container.firstChild).toBeInTheDocument();
722
- });
723
- });
724
- });
725
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfaW5kZXgiLCJyZXF1aXJlIiwiX3Bsb3QiLCJfdGVzdFV0aWxzIiwiX3JlYWN0IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl91dGlscyIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwieHkiLCJ1dGlscyIsInh5TGFiZWwiLCJ4IiwieSIsImxhYmVsIiwiZGVzY3JpYmUiLCJ0b29sYmFyIiwiYmVmb3JlRWFjaCIsImxpbmVUb29sIiwiY3JlYXRlRWxlbWVudCIsIml0IiwicmVzdWx0IiwiYWRkUG9pbnQiLCJleHBlY3QiLCJ0b0VxdWFsIiwidHlwZSIsImJ1aWxkaW5nIiwiZnJvbSIsInRvIiwiZXhpc3RpbmdNYXJrIiwicm9vdCIsImxpbmVBIiwibGluZUIiLCJyZXN1bHRBIiwicmVzdWx0QiIsInRvQmUiLCJjb21wbGV0ZSIsIlRlc3RDb21wIiwidG9vbCIsIkNvbXBvbmVudCIsIkNvbXAiLCJtYXJrIiwib25DaGFuZ2UiLCJqZXN0IiwiZm4iLCJsaW5lVG9vbENvbXBvbmVudCIsInJlbmRlckNvbXBvbmVudCIsImV4dHJhcyIsImRlZmF1bHRzIiwiZ3JhcGhQcm9wcyIsImdldEdyYXBoUHJvcHMiLCJwcm9wcyIsInJlbmRlciIsIl9yZW5kZXJDb21wb25lbnQiLCJjb250YWluZXIiLCJmaXJzdENoaWxkIiwidG9CZUluVGhlRG9jdW1lbnQiLCJidWlsZGluZ01hcmsiLCJfcmVuZGVyQ29tcG9uZW50MiIsImJnTWFyayIsImlzQmFja2dyb3VuZCIsIl9yZW5kZXJDb21wb25lbnQzIiwiZGlzYWJsZWRNYXJrIiwiZGlzYWJsZWQiLCJfcmVuZGVyQ29tcG9uZW50NCIsImNvcnJlY3RNYXJrIiwiY29ycmVjdG5lc3MiLCJfcmVuZGVyQ29tcG9uZW50NSIsIm1hcmtXaXRoTWlkZGxlIiwibWlkZGxlIiwiX3JlbmRlckNvbXBvbmVudDYiLCJjb2xvcmVkTWFyayIsImZpbGwiLCJfcmVuZGVyQ29tcG9uZW50NyIsImdzc0xpbmVEYXRhIiwic2VsZWN0ZWRUb29sIiwiX3JlbmRlckNvbXBvbmVudDgiLCJsYWJlbE5vZGUiLCJkb2N1bWVudCIsIl9yZW5kZXJDb21wb25lbnQ5IiwiX3JlbmRlckNvbXBvbmVudDAiLCJjb29yZGluYXRlc09uSG92ZXIiLCJfcmVuZGVyQ29tcG9uZW50MSIsImxhYmVsTW9kZUVuYWJsZWQiLCJfcmVuZGVyQ29tcG9uZW50MTAiLCJfcmVuZGVyQ29tcG9uZW50MTEiLCJyZXJlbmRlciIsInVwZGF0ZWRNYXJrIiwiX3JlbmRlckNvbXBvbmVudDEyIiwiX3JlbmRlckNvbXBvbmVudDEzIiwiX3JlbmRlckNvbXBvbmVudDE0IiwiaW5jb21wbGV0ZU1hcmsiLCJfcmVuZGVyQ29tcG9uZW50MTUiLCJzaW5nbGVQb2ludE1hcmsiLCJfcmVuZGVyQ29tcG9uZW50MTYiLCJwYXJhYm9sYSIsInNpbmUiLCJhYnNvbHV0ZSIsImV4cG9uZW50aWFsIiwiY2hhbmdlTWFya1Byb3BzIiwib25DbGljayIsImxpbmVCYXNlIiwicmVuZGVyV2l0aExhYmVscyIsInVuZGVmaW5lZCIsIl9yZW5kZXJDb21wb25lbnQxNyIsIl9yZW5kZXJXaXRoTGFiZWxzIiwiX3JlbmRlckNvbXBvbmVudDE4IiwiX3JlbmRlckNvbXBvbmVudDE5IiwiX3JlbmRlckNvbXBvbmVudDIwIiwiX3JlbmRlckNvbXBvbmVudDIxIiwiX3JlbmRlckNvbXBvbmVudDIyIiwiX3JlbmRlckNvbXBvbmVudDIzIiwiX3JlbmRlckNvbXBvbmVudDI0IiwiX3JlbmRlckNvbXBvbmVudDI1IiwiX3JlbmRlckNvbXBvbmVudDI2IiwiX3JlbmRlckNvbXBvbmVudDI3IiwiX3JlbmRlckNvbXBvbmVudDI4IiwiX3JlbmRlckNvbXBvbmVudDI5IiwiX3JlbmRlckNvbXBvbmVudDMwIiwiX3JlbmRlckNvbXBvbmVudDMxIiwiX3JlbmRlckNvbXBvbmVudDMyIiwiX3JlbmRlckNvbXBvbmVudDMzIiwiX3JlbmRlckNvbXBvbmVudDM0IiwiX3JlbmRlckNvbXBvbmVudDM1IiwiX3JlbmRlckNvbXBvbmVudDM2IiwiX3JlbmRlckNvbXBvbmVudDM3Iiwib25EcmFnU3RhcnQiLCJfcmVuZGVyQ29tcG9uZW50MzgiLCJvbkRyYWdTdG9wIiwiX3JlbmRlckNvbXBvbmVudDM5IiwiX3JlbmRlckNvbXBvbmVudDQwIiwiX3JlbmRlckNvbXBvbmVudDQxIiwiX3JlbmRlckNvbXBvbmVudDQyIiwiX3JlbmRlckNvbXBvbmVudDQzIiwiX3JlbmRlckNvbXBvbmVudDQ0IiwiX3JlbmRlckNvbXBvbmVudDQ1IiwiX3JlbmRlckNvbXBvbmVudDQ2IiwiX3JlbmRlckNvbXBvbmVudDQ3IiwiX3JlbmRlckNvbXBvbmVudDQ4IiwiX3JlbmRlckNvbXBvbmVudDQ5IiwiX3JlbmRlckNvbXBvbmVudDUwIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3Rvb2xzL3NoYXJlZC9saW5lL19fdGVzdHNfXy9pbmRleC50ZXN0LmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBsaW5lQmFzZSwgbGluZVRvb2wsIGxpbmVUb29sQ29tcG9uZW50IH0gZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IHsgdXRpbHMgfSBmcm9tICdAcGllLWxpYi9wbG90JztcbmltcG9ydCB7IHJlbmRlciB9IGZyb20gJ0BwaWUtbGliL3Rlc3QtdXRpbHMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGdyYXBoUHJvcHMgYXMgZ2V0R3JhcGhQcm9wcyB9IGZyb20gJy4uLy4uLy4uLy4uL19fdGVzdHNfXy91dGlscyc7XG5cbmNvbnN0IHsgeHkgfSA9IHV0aWxzO1xuY29uc3QgeHlMYWJlbCA9ICh4LCB5LCBsYWJlbCkgPT4gKHsgeCwgeSwgbGFiZWwgfSk7XG5cbmRlc2NyaWJlKCdsaW5lVG9vbCcsICgpID0+IHtcbiAgZGVzY3JpYmUoJ2FkZFBvaW50JywgKCkgPT4ge1xuICAgIGxldCB0b29sYmFyO1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICB0b29sYmFyID0gbGluZVRvb2woJ2xpbmVUeXBlJywgKCkgPT4gPGRpdiAvPikoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIGEgYnVpbGRpbmcgbWFyayB3aGVuIG5vIGV4aXN0aW5nIG1hcmsnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0b29sYmFyLmFkZFBvaW50KHh5KDEsIDEpKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoe1xuICAgICAgICB0eXBlOiAnbGluZVR5cGUnLFxuICAgICAgICBidWlsZGluZzogdHJ1ZSxcbiAgICAgICAgZnJvbTogeHkoMSwgMSksXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIGEgY29tcGxldGUgbWFyayB3aGVuIGFkZGluZyBzZWNvbmQgcG9pbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0b29sYmFyLmFkZFBvaW50KHh5KDEsIDEpLCB7IGZyb206IHh5KDAsIDApIH0pO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbCh7XG4gICAgICAgIGJ1aWxkaW5nOiBmYWxzZSxcbiAgICAgICAgZnJvbTogeHkoMCwgMCksXG4gICAgICAgIHRvOiB4eSgxLCAxKSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgc2FtZSBtYXJrIGlmIHBvaW50IGVxdWFscyBleGlzdGluZyBmcm9tIHBvaW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgZXhpc3RpbmdNYXJrID0geyBmcm9tOiB4eSgxLCAxKSwgYnVpbGRpbmc6IHRydWUgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRvb2xiYXIuYWRkUG9pbnQoeHkoMSwgMSksIGV4aXN0aW5nTWFyayk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4aXN0aW5nTWFyayk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBhZGRpbmcgcG9pbnQgd2l0aCByb290IHByb3BlcnR5JywgKCkgPT4ge1xuICAgICAgY29uc3QgZXhpc3RpbmdNYXJrID0geyByb290OiB4eSgxLCAxKSwgYnVpbGRpbmc6IHRydWUgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRvb2xiYXIuYWRkUG9pbnQoeHkoMSwgMSksIGV4aXN0aW5nTWFyayk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4aXN0aW5nTWFyayk7XG4gICAgfSk7XG5cbiAgICBpdCgnY3JlYXRlcyBkaWZmZXJlbnQgdHlwZXMgY29ycmVjdGx5JywgKCkgPT4ge1xuICAgICAgY29uc3QgbGluZUEgPSBsaW5lVG9vbCgnbGluZUEnLCAoKSA9PiA8ZGl2IC8+KSgpO1xuICAgICAgY29uc3QgbGluZUIgPSBsaW5lVG9vbCgnbGluZUInLCAoKSA9PiA8ZGl2IC8+KSgpO1xuXG4gICAgICBjb25zdCByZXN1bHRBID0gbGluZUEuYWRkUG9pbnQoeHkoMSwgMSkpO1xuICAgICAgY29uc3QgcmVzdWx0QiA9IGxpbmVCLmFkZFBvaW50KHh5KDEsIDEpKTtcblxuICAgICAgZXhwZWN0KHJlc3VsdEEudHlwZSkudG9CZSgnbGluZUEnKTtcbiAgICAgIGV4cGVjdChyZXN1bHRCLnR5cGUpLnRvQmUoJ2xpbmVCJyk7XG4gICAgfSk7XG5cbiAgICBpdCgncHJlc2VydmVzIGJ1aWxkaW5nIHN0YXRlIGNvcnJlY3RseScsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkaW5nID0gdG9vbGJhci5hZGRQb2ludCh4eSgxLCAxKSk7XG4gICAgICBleHBlY3QoYnVpbGRpbmcuYnVpbGRpbmcpLnRvQmUodHJ1ZSk7XG5cbiAgICAgIGNvbnN0IGNvbXBsZXRlID0gdG9vbGJhci5hZGRQb2ludCh4eSgyLCAyKSwgYnVpbGRpbmcpO1xuICAgICAgZXhwZWN0KGNvbXBsZXRlLmJ1aWxkaW5nKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0NvbXBvbmVudCBwcm9wZXJ0eScsICgpID0+IHtcbiAgICBpdCgnc3RvcmVzIHRoZSBwcm92aWRlZCBDb21wb25lbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBUZXN0Q29tcCA9ICgpID0+IDxkaXY+VGVzdDwvZGl2PjtcbiAgICAgIGNvbnN0IHRvb2wgPSBsaW5lVG9vbCgndGVzdCcsIFRlc3RDb21wKSgpO1xuICAgICAgZXhwZWN0KHRvb2wuQ29tcG9uZW50KS50b0JlKFRlc3RDb21wKTtcbiAgICB9KTtcblxuICAgIGl0KCdzdG9yZXMgdGhlIGNvcnJlY3QgdHlwZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHRvb2wgPSBsaW5lVG9vbCgnY3VzdG9tVHlwZScsICgpID0+IDxkaXYgLz4pKCk7XG4gICAgICBleHBlY3QodG9vbC50eXBlKS50b0JlKCdjdXN0b21UeXBlJyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdsaW5lVG9vbENvbXBvbmVudCcsICgpID0+IHtcbiAgbGV0IENvbXA7XG4gIGxldCBtYXJrO1xuICBsZXQgb25DaGFuZ2U7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgQ29tcCA9IGxpbmVUb29sQ29tcG9uZW50KCgpID0+IDx0ZXh0IGRhdGEtdGVzdGlkPVwibGluZS1jb21wb25lbnRcIiAvPik7XG4gICAgbWFyayA9IHsgZnJvbTogeHkoMCwgMCksIHRvOiB4eSgxLCAxKSwgdHlwZTogJ2xpbmUnIH07XG4gIH0pO1xuXG4gIGNvbnN0IHJlbmRlckNvbXBvbmVudCA9IChleHRyYXMpID0+IHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHtcbiAgICAgIG1hcmssXG4gICAgICBvbkNoYW5nZSxcbiAgICAgIGdyYXBoUHJvcHM6IGdldEdyYXBoUHJvcHMoKSxcbiAgICB9O1xuICAgIGNvbnN0IHByb3BzID0geyAuLi5kZWZhdWx0cywgLi4uZXh0cmFzIH07XG4gICAgcmV0dXJuIHJlbmRlcig8Q29tcCB7Li4ucHJvcHN9IC8+KTtcbiAgfTtcblxuICBkZXNjcmliZSgncmVuZGVyaW5nJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHdpdGhvdXQgY3Jhc2hpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KCk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGJ1aWxkaW5nIG1hcmsnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGluZ01hcmsgPSB7IGZyb206IHh5KDAsIDApLCBidWlsZGluZzogdHJ1ZSwgdHlwZTogJ2xpbmUnIH07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgbWFyazogYnVpbGRpbmdNYXJrIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBiYWNrZ3JvdW5kIG1hcmsnLCAoKSA9PiB7XG4gICAgICBjb25zdCBiZ01hcmsgPSB7IGZyb206IHh5KDAsIDApLCB0bzogeHkoMSwgMSksIGlzQmFja2dyb3VuZDogdHJ1ZSwgdHlwZTogJ2xpbmUnIH07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgbWFyazogYmdNYXJrIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBkaXNhYmxlZCBtYXJrJywgKCkgPT4ge1xuICAgICAgY29uc3QgZGlzYWJsZWRNYXJrID0geyBmcm9tOiB4eSgwLCAwKSwgdG86IHh5KDEsIDEpLCBkaXNhYmxlZDogdHJ1ZSwgdHlwZTogJ2xpbmUnIH07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgbWFyazogZGlzYWJsZWRNYXJrIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBjb3JyZWN0bmVzcyBzdGF0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb3JyZWN0TWFyayA9IHsgZnJvbTogeHkoMCwgMCksIHRvOiB4eSgxLCAxKSwgY29ycmVjdG5lc3M6ICdjb3JyZWN0JywgdHlwZTogJ2xpbmUnIH07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgbWFyazogY29ycmVjdE1hcmsgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIG1pZGRsZSBwb2ludCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1hcmtXaXRoTWlkZGxlID0geyBmcm9tOiB4eSgwLCAwKSwgdG86IHh5KDEsIDEpLCBtaWRkbGU6IHh5KDAuNSwgMC41KSwgdHlwZTogJ2xpbmUnIH07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgbWFyazogbWFya1dpdGhNaWRkbGUgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGZpbGwgY29sb3InLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb2xvcmVkTWFyayA9IHsgZnJvbTogeHkoMCwgMCksIHRvOiB4eSgxLCAxKSwgZmlsbDogJyNmZjAwMDAnLCB0eXBlOiAnbGluZScgfTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBtYXJrOiBjb2xvcmVkTWFyayB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggZ3NzTGluZURhdGEnLCAoKSA9PiB7XG4gICAgICBjb25zdCBnc3NMaW5lRGF0YSA9IHsgc2VsZWN0ZWRUb29sOiAnbGluZUEnIH07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgZ3NzTGluZURhdGEgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGxhYmVsTm9kZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGxhYmVsTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ZvcmVpZ25PYmplY3QnKTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBsYWJlbE5vZGUgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGNvb3JkaW5hdGVzT25Ib3ZlciBlbmFibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGNvb3JkaW5hdGVzT25Ib3ZlcjogdHJ1ZSB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggbGFiZWxNb2RlRW5hYmxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBsYWJlbE1vZGVFbmFibGVkOiB0cnVlIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc3RhdGUgbWFuYWdlbWVudCcsICgpID0+IHtcbiAgICBpdCgnaW5pdGlhbGl6ZXMgd2l0aCBlbXB0eSBzdGF0ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoKTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIC8vIFN0YXRlIHNob3VsZCBiZSBlbXB0eSBpbml0aWFsbHlcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIG1hcmsgdXBkYXRlcyB0aHJvdWdoIHByb3BzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyByZXJlbmRlciwgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoKTtcbiAgICAgIGNvbnN0IHVwZGF0ZWRNYXJrID0geyBmcm9tOiB4eSgxLCAxKSwgdG86IHh5KDIsIDIpLCB0eXBlOiAnbGluZScgfTtcblxuICAgICAgcmVyZW5kZXIoPENvbXAgbWFyaz17dXBkYXRlZE1hcmt9IG9uQ2hhbmdlPXtvbkNoYW5nZX0gZ3JhcGhQcm9wcz17Z2V0R3JhcGhQcm9wcygpfSAvPik7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdiYWNrZ3JvdW5kIG1hcmsgaGFuZGxpbmcnLCAoKSA9PiB7XG4gICAgaXQoJ2Rpc2FibGVzIGZyb20gcG9pbnQgd2hlbiBtYXJrIGlzIGJhY2tncm91bmQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBiZ01hcmsgPSB7XG4gICAgICAgIGZyb206IHh5KDAsIDApLFxuICAgICAgICB0bzogeHkoMSwgMSksXG4gICAgICAgIGlzQmFja2dyb3VuZDogdHJ1ZSxcbiAgICAgICAgdHlwZTogJ2xpbmUnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBtYXJrOiBiZ01hcmsgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICAvLyBmcm9tLmRpc2FibGVkIHNob3VsZCBiZSB0cnVlXG4gICAgfSk7XG5cbiAgICBpdCgnZGlzYWJsZXMgdG8gcG9pbnQgd2hlbiBtYXJrIGlzIGJhY2tncm91bmQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBiZ01hcmsgPSB7XG4gICAgICAgIGZyb206IHh5KDAsIDApLFxuICAgICAgICB0bzogeHkoMSwgMSksXG4gICAgICAgIGlzQmFja2dyb3VuZDogdHJ1ZSxcbiAgICAgICAgdHlwZTogJ2xpbmUnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBtYXJrOiBiZ01hcmsgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICAvLyB0by5kaXNhYmxlZCBzaG91bGQgYmUgdHJ1ZVxuICAgIH0pO1xuXG4gICAgaXQoJ2Rpc2FibGVzIG1pZGRsZSBwb2ludCB3aGVuIG1hcmsgaXMgYmFja2dyb3VuZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGJnTWFyayA9IHtcbiAgICAgICAgZnJvbTogeHkoMCwgMCksXG4gICAgICAgIHRvOiB4eSgxLCAxKSxcbiAgICAgICAgbWlkZGxlOiB4eSgwLjUsIDAuNSksXG4gICAgICAgIGlzQmFja2dyb3VuZDogdHJ1ZSxcbiAgICAgICAgdHlwZTogJ2xpbmUnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBtYXJrOiBiZ01hcmsgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICAvLyBtaWRkbGUuZGlzYWJsZWQgc2hvdWxkIGJlIHRydWVcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2VkZ2UgY2FzZXMnLCAoKSA9PiB7XG4gICAgaXQoJ2hhbmRsZXMgbWFyayB3aXRob3V0IHRvIHBvaW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5jb21wbGV0ZU1hcmsgPSB7IGZyb206IHh5KDAsIDApLCB0eXBlOiAnbGluZScgfTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBtYXJrOiBpbmNvbXBsZXRlTWFyayB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIG1hcmsgd2l0aCBvbmx5IGZyb20gcG9pbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzaW5nbGVQb2ludE1hcmsgPSB7IGZyb206IHh5KDAsIDApLCBidWlsZGluZzogdHJ1ZSwgdHlwZTogJ2xpbmUnIH07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgbWFyazogc2luZ2xlUG9pbnRNYXJrIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgZGlmZmVyZW50IGxpbmUgdHlwZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwYXJhYm9sYSA9IHsgZnJvbTogeHkoMCwgMCksIHRvOiB4eSgxLCAxKSwgdHlwZTogJ3BhcmFib2xhJyB9O1xuICAgICAgY29uc3Qgc2luZSA9IHsgZnJvbTogeHkoMCwgMCksIHRvOiB4eSgxLCAxKSwgdHlwZTogJ3NpbmUnIH07XG4gICAgICBjb25zdCBhYnNvbHV0ZSA9IHsgZnJvbTogeHkoMCwgMCksIHRvOiB4eSgxLCAxKSwgdHlwZTogJ2Fic29sdXRlJyB9O1xuICAgICAgY29uc3QgZXhwb25lbnRpYWwgPSB7IGZyb206IHh5KDAsIDApLCB0bzogeHkoMSwgMSksIHR5cGU6ICdleHBvbmVudGlhbCcgfTtcblxuICAgICAgcmVuZGVyKDxDb21wIG1hcms9e3BhcmFib2xhfSBvbkNoYW5nZT17b25DaGFuZ2V9IGdyYXBoUHJvcHM9e2dldEdyYXBoUHJvcHMoKX0gLz4pO1xuICAgICAgcmVuZGVyKDxDb21wIG1hcms9e3NpbmV9IG9uQ2hhbmdlPXtvbkNoYW5nZX0gZ3JhcGhQcm9wcz17Z2V0R3JhcGhQcm9wcygpfSAvPik7XG4gICAgICByZW5kZXIoPENvbXAgbWFyaz17YWJzb2x1dGV9IG9uQ2hhbmdlPXtvbkNoYW5nZX0gZ3JhcGhQcm9wcz17Z2V0R3JhcGhQcm9wcygpfSAvPik7XG4gICAgICByZW5kZXIoPENvbXAgbWFyaz17ZXhwb25lbnRpYWx9IG9uQ2hhbmdlPXtvbkNoYW5nZX0gZ3JhcGhQcm9wcz17Z2V0R3JhcGhQcm9wcygpfSAvPik7XG4gICAgfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdsaW5lQmFzZScsICgpID0+IHtcbiAgbGV0IENvbXA7XG4gIGxldCBvbkNoYW5nZTtcbiAgbGV0IGNoYW5nZU1hcmtQcm9wcztcbiAgbGV0IG9uQ2xpY2s7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgY2hhbmdlTWFya1Byb3BzID0gamVzdC5mbigpO1xuICAgIG9uQ2xpY2sgPSBqZXN0LmZuKCk7XG4gICAgQ29tcCA9IGxpbmVCYXNlKCgpID0+IDx0ZXh0IGRhdGEtdGVzdGlkPVwibGluZS1iYXNlXCIgLz4pO1xuICB9KTtcblxuICBjb25zdCByZW5kZXJDb21wb25lbnQgPSAoZXh0cmFzKSA9PiB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSB7XG4gICAgICBvbkNoYW5nZSxcbiAgICAgIGNoYW5nZU1hcmtQcm9wcyxcbiAgICAgIG9uQ2xpY2ssXG4gICAgICBncmFwaFByb3BzOiBnZXRHcmFwaFByb3BzKCksXG4gICAgICBmcm9tOiB4eSgwLCAwKSxcbiAgICAgIHRvOiB4eSgxLCAxKSxcbiAgICB9O1xuICAgIGNvbnN0IHByb3BzID0geyAuLi5kZWZhdWx0cywgLi4uZXh0cmFzIH07XG4gICAgcmV0dXJuIHJlbmRlcig8Q29tcCB7Li4ucHJvcHN9IC8+KTtcbiAgfTtcblxuICBjb25zdCBsYWJlbE5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdmb3JlaWduT2JqZWN0Jyk7XG4gIGNvbnN0IHJlbmRlcldpdGhMYWJlbHMgPSAoZXh0cmFzID0ge30pID0+XG4gICAgcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgIC4uLmV4dHJhcyxcbiAgICAgIGxhYmVsTm9kZTogbGFiZWxOb2RlLFxuICAgICAgZnJvbTogeHlMYWJlbCgwLCAwLCAnQScpLFxuICAgICAgdG86IHh5TGFiZWwoMSwgMSwgJ0InKSxcbiAgICB9KTtcblxuICBkZXNjcmliZSgncmVuZGVyaW5nJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHdpdGhvdXQgY3Jhc2hpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KCk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGxhYmVscycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJXaXRoTGFiZWxzKCk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIG1pZGRsZSBwb2ludCBsYWJlbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBsYWJlbE5vZGUsXG4gICAgICAgIG1pZGRsZTogeHlMYWJlbCgwLjUsIDAuNSwgJ00nKSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBvbmx5IGZyb20gbGFiZWwnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgbGFiZWxOb2RlLFxuICAgICAgICBmcm9tOiB4eUxhYmVsKDAsIDAsICdTdGFydCcpLFxuICAgICAgICB0bzogeHkoMSwgMSksXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggb25seSB0byBsYWJlbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBsYWJlbE5vZGUsXG4gICAgICAgIGZyb206IHh5KDAsIDApLFxuICAgICAgICB0bzogeHlMYWJlbCgxLCAxLCAnRW5kJyksXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggYWxsIHRocmVlIGxhYmVscycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBsYWJlbE5vZGUsXG4gICAgICAgIGZyb206IHh5TGFiZWwoMCwgMCwgJ0EnKSxcbiAgICAgICAgdG86IHh5TGFiZWwoMSwgMSwgJ0InKSxcbiAgICAgICAgbWlkZGxlOiB4eUxhYmVsKDAuNSwgMC41LCAnTScpLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnc3NMaW5lRGF0YSBoYW5kbGluZycsICgpID0+IHtcbiAgICBpdCgncmVuZGVycyBub3JtYWxseSB3aXRob3V0IGdzc0xpbmVEYXRhJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCgpO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBnc3NMaW5lRGF0YSB3aGVuIHNvbHV0aW9uU2V0IGlzIHNlbGVjdGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgZ3NzTGluZURhdGEgPSB7IHNlbGVjdGVkVG9vbDogJ3NvbHV0aW9uU2V0JyB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGdzc0xpbmVEYXRhIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBnc3NMaW5lRGF0YSB3aGVuIGxpbmVBIGlzIHNlbGVjdGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgZ3NzTGluZURhdGEgPSB7IHNlbGVjdGVkVG9vbDogJ2xpbmVBJyB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGdzc0xpbmVEYXRhIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBnc3NMaW5lRGF0YSB3aGVuIGxpbmVCIGlzIHNlbGVjdGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgZ3NzTGluZURhdGEgPSB7IHNlbGVjdGVkVG9vbDogJ2xpbmVCJyB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGdzc0xpbmVEYXRhIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZGlzYWJsZWQgc3RhdGUnLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgd2hlbiBkaXNhYmxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBkaXNhYmxlZDogdHJ1ZSB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdoZW4gbm90IGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGRpc2FibGVkOiBmYWxzZSB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2NvcnJlY3RuZXNzIHN0YXRlcycsICgpID0+IHtcbiAgICBpdCgncmVuZGVycyB3aXRoIGNvcnJlY3Qgc3RhdGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgY29ycmVjdG5lc3M6ICdjb3JyZWN0JyB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggaW5jb3JyZWN0IHN0YXRlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGNvcnJlY3RuZXNzOiAnaW5jb3JyZWN0JyB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggbWlzc2luZyBzdGF0ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBjb3JyZWN0bmVzczogJ21pc3NpbmcnIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aG91dCBjb3JyZWN0bmVzcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBjb3JyZWN0bmVzczogdW5kZWZpbmVkIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZmlsbCBjb2xvcicsICgpID0+IHtcbiAgICBpdCgncmVuZGVycyB3aXRoIGN1c3RvbSBmaWxsIGNvbG9yJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGZpbGw6ICcjZmYwMDAwJyB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGhvdXQgZmlsbCBjb2xvcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBmaWxsOiB1bmRlZmluZWQgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjb29yZGluYXRlcyBvbiBob3ZlcicsICgpID0+IHtcbiAgICBpdCgncmVuZGVycyB3aXRoIGNvb3JkaW5hdGVzT25Ib3ZlciBlbmFibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGNvb3JkaW5hdGVzT25Ib3ZlcjogdHJ1ZSB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggY29vcmRpbmF0ZXNPbkhvdmVyIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGNvb3JkaW5hdGVzT25Ib3ZlcjogZmFsc2UgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdsYWJlbCBtb2RlJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHdpdGggbGFiZWxNb2RlRW5hYmxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBsYWJlbE1vZGVFbmFibGVkOiB0cnVlLFxuICAgICAgICBsYWJlbE5vZGUsXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGhvdXQgbGFiZWxNb2RlRW5hYmxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBsYWJlbE1vZGVFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgbGFiZWxOb2RlLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdkcmFnIGNhbGxiYWNrcycsICgpID0+IHtcbiAgICBpdCgncmVuZGVycyB3aXRoIG9uRHJhZ1N0YXJ0IGNhbGxiYWNrJywgKCkgPT4ge1xuICAgICAgY29uc3Qgb25EcmFnU3RhcnQgPSBqZXN0LmZuKCk7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgb25EcmFnU3RhcnQgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIG9uRHJhZ1N0b3AgY2FsbGJhY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkRyYWdTdG9wID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IG9uRHJhZ1N0b3AgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGJvdGggZHJhZyBjYWxsYmFja3MnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkRyYWdTdGFydCA9IGplc3QuZm4oKTtcbiAgICAgIGNvbnN0IG9uRHJhZ1N0b3AgPSBqZXN0LmZuKCk7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgb25EcmFnU3RhcnQsIG9uRHJhZ1N0b3AgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdlZGdlIGNhc2VzJywgKCkgPT4ge1xuICAgIGl0KCdoYW5kbGVzIGVxdWFsIGZyb20gYW5kIHRvIHBvaW50cycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBmcm9tOiB4eSgxLCAxKSxcbiAgICAgICAgdG86IHh5KDEsIDEpLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBuZWdhdGl2ZSBjb29yZGluYXRlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBmcm9tOiB4eSgtNSwgLTUpLFxuICAgICAgICB0bzogeHkoLTEsIC0xKSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgbGFyZ2UgY29vcmRpbmF0ZSB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZnJvbTogeHkoMTAwLCAxMDApLFxuICAgICAgICB0bzogeHkoMjAwLCAyMDApLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBkZWNpbWFsIGNvb3JkaW5hdGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGZyb206IHh5KDAuNSwgMC41KSxcbiAgICAgICAgdG86IHh5KDEuNSwgMS41KSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgdmVydGljYWwgbGluZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZnJvbTogeHkoMSwgMCksXG4gICAgICAgIHRvOiB4eSgxLCA1KSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgaG9yaXpvbnRhbCBsaW5lcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBmcm9tOiB4eSgwLCAxKSxcbiAgICAgICAgdG86IHh5KDUsIDEpLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBlbXB0eSBsYWJlbCBzdHJpbmdzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGxhYmVsTm9kZSxcbiAgICAgICAgZnJvbTogeHlMYWJlbCgwLCAwLCAnJyksXG4gICAgICAgIHRvOiB4eUxhYmVsKDEsIDEsICcnKSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaW50ZWdyYXRpb24gc2NlbmFyaW9zJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIGNvbXBsZXRlIGxpbmUgd2l0aCBhbGwgZmVhdHVyZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZnJvbTogeHlMYWJlbCgwLCAwLCAnU3RhcnQnKSxcbiAgICAgICAgdG86IHh5TGFiZWwoNSwgNSwgJ0VuZCcpLFxuICAgICAgICBtaWRkbGU6IHh5TGFiZWwoMi41LCAyLjUsICdNaWRkbGUnKSxcbiAgICAgICAgbGFiZWxOb2RlLFxuICAgICAgICBjb29yZGluYXRlc09uSG92ZXI6IHRydWUsXG4gICAgICAgIGxhYmVsTW9kZUVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgY29ycmVjdG5lc3M6ICdjb3JyZWN0JyxcbiAgICAgICAgZmlsbDogJyMwMGZmMDAnLFxuICAgICAgICBnc3NMaW5lRGF0YTogeyBzZWxlY3RlZFRvb2w6ICdsaW5lQScgfSxcbiAgICAgICAgb25EcmFnU3RhcnQ6IGplc3QuZm4oKSxcbiAgICAgICAgb25EcmFnU3RvcDogamVzdC5mbigpLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBkaXNhYmxlZCBiYWNrZ3JvdW5kIGxpbmUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZnJvbTogeHkoMCwgMCksXG4gICAgICAgIHRvOiB4eSgxLCAxKSxcbiAgICAgICAgZGlzYWJsZWQ6IHRydWUsXG4gICAgICAgIGNvcnJlY3RuZXNzOiAnaW5jb3JyZWN0JyxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgc29sdXRpb24gc2V0IG1vZGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZnJvbTogeHkoMCwgMCksXG4gICAgICAgIHRvOiB4eSgxLCAxKSxcbiAgICAgICAgZ3NzTGluZURhdGE6IHsgc2VsZWN0ZWRUb29sOiAnc29sdXRpb25TZXQnIH0sXG4gICAgICAgIGxhYmVsTm9kZSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsS0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsVUFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsTUFBQSxHQUFBQyxzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQUssTUFBQSxHQUFBTCxPQUFBO0FBQTBFLFNBQUFNLFFBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsSUFBQSxDQUFBSixDQUFBLE9BQUFHLE1BQUEsQ0FBQUUscUJBQUEsUUFBQUMsQ0FBQSxHQUFBSCxNQUFBLENBQUFFLHFCQUFBLENBQUFMLENBQUEsR0FBQUMsQ0FBQSxLQUFBSyxDQUFBLEdBQUFBLENBQUEsQ0FBQUMsTUFBQSxXQUFBTixDQUFBLFdBQUFFLE1BQUEsQ0FBQUssd0JBQUEsQ0FBQVIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFRLFVBQUEsT0FBQVAsQ0FBQSxDQUFBUSxJQUFBLENBQUFDLEtBQUEsQ0FBQVQsQ0FBQSxFQUFBSSxDQUFBLFlBQUFKLENBQUE7QUFBQSxTQUFBVSxjQUFBWixDQUFBLGFBQUFDLENBQUEsTUFBQUEsQ0FBQSxHQUFBWSxTQUFBLENBQUFDLE1BQUEsRUFBQWIsQ0FBQSxVQUFBQyxDQUFBLFdBQUFXLFNBQUEsQ0FBQVosQ0FBQSxJQUFBWSxTQUFBLENBQUFaLENBQUEsUUFBQUEsQ0FBQSxPQUFBRixPQUFBLENBQUFJLE1BQUEsQ0FBQUQsQ0FBQSxPQUFBYSxPQUFBLFdBQUFkLENBQUEsUUFBQWUsZ0JBQUEsYUFBQWhCLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLENBQUFELENBQUEsU0FBQUUsTUFBQSxDQUFBYyx5QkFBQSxHQUFBZCxNQUFBLENBQUFlLGdCQUFBLENBQUFs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