@pie-lib/graphing 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 (114) hide show
  1. package/CHANGELOG.md +21 -29
  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/key-legend.js +1 -1
  19. package/lib/label-svg-icon.js +1 -1
  20. package/lib/labels.js +1 -1
  21. package/lib/mark-label.js +1 -1
  22. package/lib/toggle-bar.js +1 -1
  23. package/lib/tool-menu.js +1 -1
  24. package/lib/tools/absolute/component.js +1 -1
  25. package/lib/tools/absolute/index.js +1 -1
  26. package/lib/tools/circle/bg-circle.js +1 -1
  27. package/lib/tools/circle/component.js +1 -1
  28. package/lib/tools/circle/index.js +1 -1
  29. package/lib/tools/exponential/component.js +1 -1
  30. package/lib/tools/exponential/index.js +1 -1
  31. package/lib/tools/index.js +1 -1
  32. package/lib/tools/line/component.js +1 -1
  33. package/lib/tools/line/index.js +1 -1
  34. package/lib/tools/parabola/component.js +1 -1
  35. package/lib/tools/parabola/index.js +1 -1
  36. package/lib/tools/point/component.js +1 -1
  37. package/lib/tools/point/index.js +1 -1
  38. package/lib/tools/polygon/component.js +1 -1
  39. package/lib/tools/polygon/index.js +1 -1
  40. package/lib/tools/polygon/line.js +1 -1
  41. package/lib/tools/polygon/polygon.js +1 -1
  42. package/lib/tools/ray/component.js +1 -1
  43. package/lib/tools/ray/index.js +1 -1
  44. package/lib/tools/segment/component.js +1 -1
  45. package/lib/tools/segment/index.js +1 -1
  46. package/lib/tools/shared/arrow-head.js +1 -1
  47. package/lib/tools/shared/icons/CorrectSVG.js +1 -1
  48. package/lib/tools/shared/icons/IncorrectSVG.js +1 -1
  49. package/lib/tools/shared/icons/MissingSVG.js +1 -1
  50. package/lib/tools/shared/line/index.js +1 -1
  51. package/lib/tools/shared/line/line-path.js +1 -1
  52. package/lib/tools/shared/line/with-root-edge.js +1 -1
  53. package/lib/tools/shared/point/arrow-point.js +1 -1
  54. package/lib/tools/shared/point/arrow.js +1 -1
  55. package/lib/tools/shared/point/base-point.js +1 -1
  56. package/lib/tools/shared/point/index.js +1 -1
  57. package/lib/tools/shared/styles.js +1 -1
  58. package/lib/tools/shared/types.js +1 -1
  59. package/lib/tools/sine/component.js +1 -1
  60. package/lib/tools/sine/index.js +1 -1
  61. package/lib/tools/vector/component.js +1 -1
  62. package/lib/tools/vector/index.js +1 -1
  63. package/lib/undo-redo.js +1 -1
  64. package/lib/use-debounce.js +1 -1
  65. package/lib/utils.js +1 -1
  66. package/package.json +4 -4
  67. package/lib/__tests__/bg.test.js +0 -282
  68. package/lib/__tests__/coordinates-label.test.js +0 -276
  69. package/lib/__tests__/graph-with-controls.test.js +0 -275
  70. package/lib/__tests__/graph.test.js +0 -927
  71. package/lib/__tests__/grid-setup.test.js +0 -729
  72. package/lib/__tests__/grid.test.js +0 -29
  73. package/lib/__tests__/key-legend.test.js +0 -321
  74. package/lib/__tests__/label-svg-icon.test.js +0 -373
  75. package/lib/__tests__/labels.test.js +0 -61
  76. package/lib/__tests__/mark-label.test.js +0 -133
  77. package/lib/__tests__/toggle-bar.test.js +0 -197
  78. package/lib/__tests__/tool-menu.test.js +0 -151
  79. package/lib/__tests__/undo-redo.test.js +0 -31
  80. package/lib/__tests__/use-debounce.test.js +0 -24
  81. package/lib/__tests__/utils.js +0 -70
  82. package/lib/__tests__/utils.test.js +0 -123
  83. package/lib/axis/__tests__/arrow.test.js +0 -60
  84. package/lib/axis/__tests__/axes.test.js +0 -195
  85. package/lib/container/__tests__/actions.test.js +0 -108
  86. package/lib/container/__tests__/index.test.js +0 -503
  87. package/lib/container/__tests__/marks.test.js +0 -259
  88. package/lib/container/__tests__/middleware.test.js +0 -244
  89. package/lib/container/__tests__/reducer.test.js +0 -450
  90. package/lib/tools/absolute/__tests__/component.test.js +0 -65
  91. package/lib/tools/circle/__tests__/bg-circle.test.js +0 -33
  92. package/lib/tools/circle/__tests__/component.test.js +0 -615
  93. package/lib/tools/circle/__tests__/index.test.js +0 -576
  94. package/lib/tools/exponential/__tests__/component.test.js +0 -64
  95. package/lib/tools/exponential/__tests__/index.test.js +0 -828
  96. package/lib/tools/line/__tests__/component.test.js +0 -45
  97. package/lib/tools/parabola/__tests__/component.test.js +0 -64
  98. package/lib/tools/parabola/__tests__/index.test.js +0 -564
  99. package/lib/tools/point/__tests__/component.test.js +0 -434
  100. package/lib/tools/point/__tests__/index.test.js +0 -262
  101. package/lib/tools/polygon/__tests__/component.test.js +0 -485
  102. package/lib/tools/polygon/__tests__/index.test.js +0 -303
  103. package/lib/tools/polygon/__tests__/line.test.js +0 -50
  104. package/lib/tools/polygon/__tests__/polygon.test.js +0 -85
  105. package/lib/tools/ray/__tests__/component.test.js +0 -35
  106. package/lib/tools/segment/__tests__/component.test.js +0 -35
  107. package/lib/tools/shared/__tests__/arrow-head.test.js +0 -45
  108. package/lib/tools/shared/line/__tests__/index.test.js +0 -124
  109. package/lib/tools/shared/line/__tests__/line-path.test.js +0 -62
  110. package/lib/tools/shared/line/__tests__/with-root-edge.test.js +0 -90
  111. package/lib/tools/shared/point/__tests__/arrow-point.test.js +0 -127
  112. package/lib/tools/shared/point/__tests__/base-point.test.js +0 -122
  113. package/lib/tools/sine/__tests__/component.test.js +0 -72
  114. package/lib/tools/vector/__tests__/component.test.js +0 -32
@@ -1,615 +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 _testUtils = require("@pie-lib/test-utils");
6
- var _react = _interopRequireDefault(require("react"));
7
- var _utils = require("../../../__tests__/utils");
8
- var _component = require("../component");
9
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
10
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
11
- describe('Component', function () {
12
- var onChange = jest.fn();
13
- var changeMarkProps = jest.fn();
14
- var renderComponent = function renderComponent(extras) {
15
- var defaults = {
16
- classes: {},
17
- className: 'className',
18
- onChange: onChange,
19
- changeMarkProps: changeMarkProps,
20
- graphProps: (0, _utils.graphProps)(),
21
- from: (0, _utils.xy)(0, 0),
22
- to: (0, _utils.xy)(1, 1)
23
- };
24
- var props = _objectSpread(_objectSpread({}, defaults), extras);
25
- return (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_component.RawBaseCircle, props));
26
- };
27
-
28
- // used to test items that have labels attached to points
29
- var labelNode = document.createElement('foreignObject');
30
- var fromWithLabel = {
31
- x: 0,
32
- y: 0,
33
- label: 'A'
34
- };
35
- var toWithLabel = {
36
- x: 1,
37
- y: 1,
38
- label: 'B'
39
- };
40
- var renderWithLabels = function renderWithLabels() {
41
- var extras = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
42
- return renderComponent(_objectSpread(_objectSpread({}, extras), {}, {
43
- labelNode: labelNode,
44
- from: fromWithLabel,
45
- to: toWithLabel
46
- }));
47
- };
48
- describe('rendering', function () {
49
- it('renders without crashing', function () {
50
- var _renderComponent = renderComponent(),
51
- container = _renderComponent.container;
52
- expect(container.firstChild).toBeInTheDocument();
53
- });
54
- it('renders with labels', function () {
55
- var _renderWithLabels = renderWithLabels(),
56
- container = _renderWithLabels.container;
57
- expect(container.firstChild).toBeInTheDocument();
58
- });
59
- it('renders a g element', function () {
60
- var _renderComponent2 = renderComponent(),
61
- container = _renderComponent2.container;
62
- var g = container.querySelector('g');
63
- expect(g).toBeInTheDocument();
64
- });
65
- it('renders BgCircle component', function () {
66
- var _renderComponent3 = renderComponent(),
67
- container = _renderComponent3.container;
68
- // BgCircle is rendered as a styled component
69
- expect(container.querySelector('g')).toBeInTheDocument();
70
- });
71
- it('renders two BasePoint components', function () {
72
- var _renderComponent4 = renderComponent(),
73
- container = _renderComponent4.container;
74
- // Two points: from and to
75
- var points = container.querySelectorAll('g');
76
- expect(points.length).toBeGreaterThanOrEqual(2);
77
- });
78
- it('renders with building prop', function () {
79
- var _renderComponent5 = renderComponent({
80
- building: true
81
- }),
82
- container = _renderComponent5.container;
83
- expect(container.firstChild).toBeInTheDocument();
84
- });
85
- it('renders with disabled prop', function () {
86
- var _renderComponent6 = renderComponent({
87
- disabled: true
88
- }),
89
- container = _renderComponent6.container;
90
- expect(container.firstChild).toBeInTheDocument();
91
- });
92
- it('renders with correctness prop', function () {
93
- var _renderComponent7 = renderComponent({
94
- correctness: 'correct'
95
- }),
96
- container = _renderComponent7.container;
97
- expect(container.firstChild).toBeInTheDocument();
98
- });
99
- it('renders with coordinatesOnHover enabled', function () {
100
- var _renderComponent8 = renderComponent({
101
- coordinatesOnHover: true
102
- }),
103
- container = _renderComponent8.container;
104
- expect(container.firstChild).toBeInTheDocument();
105
- });
106
- it('renders with labelModeEnabled', function () {
107
- var _renderComponent9 = renderComponent({
108
- labelModeEnabled: true
109
- }),
110
- container = _renderComponent9.container;
111
- expect(container.firstChild).toBeInTheDocument();
112
- });
113
- it('renders with middle point', function () {
114
- var middle = {
115
- x: 0.5,
116
- y: 0.5,
117
- label: 'M'
118
- };
119
- var _renderComponent0 = renderComponent({
120
- middle: middle,
121
- labelNode: labelNode,
122
- labelModeEnabled: true
123
- }),
124
- container = _renderComponent0.container;
125
- expect(container.firstChild).toBeInTheDocument();
126
- });
127
- it('handles undefined to point (uses from)', function () {
128
- var _renderComponent1 = renderComponent({
129
- to: undefined
130
- }),
131
- container = _renderComponent1.container;
132
- expect(container.firstChild).toBeInTheDocument();
133
- });
134
- it('handles null to point (uses from)', function () {
135
- var _renderComponent10 = renderComponent({
136
- to: null
137
- }),
138
- container = _renderComponent10.container;
139
- expect(container.firstChild).toBeInTheDocument();
140
- });
141
- });
142
- describe('props', function () {
143
- it('passes onChange callback', function () {
144
- var customOnChange = jest.fn();
145
- var _renderComponent11 = renderComponent({
146
- onChange: customOnChange
147
- }),
148
- container = _renderComponent11.container;
149
- expect(container.firstChild).toBeInTheDocument();
150
- });
151
- it('passes changeMarkProps callback', function () {
152
- var customChangeMarkProps = jest.fn();
153
- var _renderComponent12 = renderComponent({
154
- changeMarkProps: customChangeMarkProps
155
- }),
156
- container = _renderComponent12.container;
157
- expect(container.firstChild).toBeInTheDocument();
158
- });
159
- it('passes onClick callback', function () {
160
- var onClick = jest.fn();
161
- var _renderComponent13 = renderComponent({
162
- onClick: onClick
163
- }),
164
- container = _renderComponent13.container;
165
- expect(container.firstChild).toBeInTheDocument();
166
- });
167
- it('passes onDragStart callback', function () {
168
- var onDragStart = jest.fn();
169
- var _renderComponent14 = renderComponent({
170
- onDragStart: onDragStart
171
- }),
172
- container = _renderComponent14.container;
173
- expect(container.firstChild).toBeInTheDocument();
174
- });
175
- it('passes onDragStop callback', function () {
176
- var onDragStop = jest.fn();
177
- var _renderComponent15 = renderComponent({
178
- onDragStop: onDragStop
179
- }),
180
- container = _renderComponent15.container;
181
- expect(container.firstChild).toBeInTheDocument();
182
- });
183
- it('uses default onClick when not provided', function () {
184
- var _renderComponent16 = renderComponent({
185
- onClick: undefined
186
- }),
187
- container = _renderComponent16.container;
188
- expect(container.firstChild).toBeInTheDocument();
189
- });
190
- it('passes graphProps', function () {
191
- var customGraphProps = (0, _utils.graphProps)();
192
- customGraphProps.size = {
193
- width: 800,
194
- height: 600
195
- };
196
- var _renderComponent17 = renderComponent({
197
- graphProps: customGraphProps
198
- }),
199
- container = _renderComponent17.container;
200
- expect(container.firstChild).toBeInTheDocument();
201
- });
202
- it('passes className', function () {
203
- var _renderComponent18 = renderComponent({
204
- className: 'custom-circle'
205
- }),
206
- container = _renderComponent18.container;
207
- expect(container.firstChild).toBeInTheDocument();
208
- });
209
- });
210
- describe('labels', function () {
211
- it('renders from label when provided', function () {
212
- var _renderWithLabels2 = renderWithLabels(),
213
- container = _renderWithLabels2.container;
214
- expect(container.firstChild).toBeInTheDocument();
215
- });
216
- it('renders to label when provided', function () {
217
- var _renderWithLabels3 = renderWithLabels(),
218
- container = _renderWithLabels3.container;
219
- expect(container.firstChild).toBeInTheDocument();
220
- });
221
- it('renders middle label when provided', function () {
222
- var middle = {
223
- x: 0.5,
224
- y: 0.5,
225
- label: 'M'
226
- };
227
- var _renderComponent19 = renderComponent({
228
- labelNode: labelNode,
229
- middle: middle,
230
- from: fromWithLabel,
231
- to: toWithLabel
232
- }),
233
- container = _renderComponent19.container;
234
- expect(container.firstChild).toBeInTheDocument();
235
- });
236
- it('does not render labels when labelNode is not provided', function () {
237
- var _renderComponent20 = renderComponent({
238
- from: fromWithLabel,
239
- to: toWithLabel,
240
- labelNode: null
241
- }),
242
- container = _renderComponent20.container;
243
- expect(container.firstChild).toBeInTheDocument();
244
- });
245
- it('handles empty label', function () {
246
- var from = {
247
- x: 0,
248
- y: 0,
249
- label: ''
250
- };
251
- var to = {
252
- x: 1,
253
- y: 1,
254
- label: ''
255
- };
256
- var _renderComponent21 = renderComponent({
257
- labelNode: labelNode,
258
- from: from,
259
- to: to
260
- }),
261
- container = _renderComponent21.container;
262
- expect(container.firstChild).toBeInTheDocument();
263
- });
264
- it('renders with label mode enabled', function () {
265
- var _renderComponent22 = renderComponent({
266
- labelNode: labelNode,
267
- labelModeEnabled: true,
268
- from: fromWithLabel,
269
- to: toWithLabel
270
- }),
271
- container = _renderComponent22.container;
272
- expect(container.firstChild).toBeInTheDocument();
273
- });
274
- it('renders with label mode disabled', function () {
275
- var _renderComponent23 = renderComponent({
276
- labelNode: labelNode,
277
- labelModeEnabled: false,
278
- from: fromWithLabel,
279
- to: toWithLabel
280
- }),
281
- container = _renderComponent23.container;
282
- expect(container.firstChild).toBeInTheDocument();
283
- });
284
- it('renders with limitLabeling enabled', function () {
285
- var _renderComponent24 = renderComponent({
286
- labelNode: labelNode,
287
- limitLabeling: true,
288
- from: fromWithLabel,
289
- to: toWithLabel
290
- }),
291
- container = _renderComponent24.container;
292
- expect(container.firstChild).toBeInTheDocument();
293
- });
294
- it('handles from label undefined', function () {
295
- var from = {
296
- x: 0,
297
- y: 0
298
- };
299
- var to = {
300
- x: 1,
301
- y: 1,
302
- label: 'B'
303
- };
304
- var _renderComponent25 = renderComponent({
305
- labelNode: labelNode,
306
- from: from,
307
- to: to
308
- }),
309
- container = _renderComponent25.container;
310
- expect(container.firstChild).toBeInTheDocument();
311
- });
312
- it('handles to label undefined', function () {
313
- var from = {
314
- x: 0,
315
- y: 0,
316
- label: 'A'
317
- };
318
- var to = {
319
- x: 1,
320
- y: 1
321
- };
322
- var _renderComponent26 = renderComponent({
323
- labelNode: labelNode,
324
- from: from,
325
- to: to
326
- }),
327
- container = _renderComponent26.container;
328
- expect(container.firstChild).toBeInTheDocument();
329
- });
330
- });
331
- describe('coordinates', function () {
332
- it('renders with positive coordinates', function () {
333
- var _renderComponent27 = renderComponent({
334
- from: (0, _utils.xy)(5, 10),
335
- to: (0, _utils.xy)(15, 20)
336
- }),
337
- container = _renderComponent27.container;
338
- expect(container.firstChild).toBeInTheDocument();
339
- });
340
- it('renders with negative coordinates', function () {
341
- var _renderComponent28 = renderComponent({
342
- from: (0, _utils.xy)(-5, -10),
343
- to: (0, _utils.xy)(-15, -20)
344
- }),
345
- container = _renderComponent28.container;
346
- expect(container.firstChild).toBeInTheDocument();
347
- });
348
- it('renders with zero coordinates', function () {
349
- var _renderComponent29 = renderComponent({
350
- from: (0, _utils.xy)(0, 0),
351
- to: (0, _utils.xy)(0, 0)
352
- }),
353
- container = _renderComponent29.container;
354
- expect(container.firstChild).toBeInTheDocument();
355
- });
356
- it('renders with decimal coordinates', function () {
357
- var _renderComponent30 = renderComponent({
358
- from: {
359
- x: 1.5,
360
- y: 2.7
361
- },
362
- to: {
363
- x: 3.2,
364
- y: 4.9
365
- }
366
- }),
367
- container = _renderComponent30.container;
368
- expect(container.firstChild).toBeInTheDocument();
369
- });
370
- it('renders with large coordinates', function () {
371
- var _renderComponent31 = renderComponent({
372
- from: (0, _utils.xy)(1000, 1000),
373
- to: (0, _utils.xy)(2000, 2000)
374
- }),
375
- container = _renderComponent31.container;
376
- expect(container.firstChild).toBeInTheDocument();
377
- });
378
- it('renders with mixed coordinate signs', function () {
379
- var _renderComponent32 = renderComponent({
380
- from: (0, _utils.xy)(-5, 10),
381
- to: (0, _utils.xy)(15, -20)
382
- }),
383
- container = _renderComponent32.container;
384
- expect(container.firstChild).toBeInTheDocument();
385
- });
386
- it('renders with very close points', function () {
387
- var _renderComponent33 = renderComponent({
388
- from: {
389
- x: 5,
390
- y: 5
391
- },
392
- to: {
393
- x: 5.01,
394
- y: 5.01
395
- }
396
- }),
397
- container = _renderComponent33.container;
398
- expect(container.firstChild).toBeInTheDocument();
399
- });
400
- it('renders with very far points', function () {
401
- var _renderComponent34 = renderComponent({
402
- from: (0, _utils.xy)(0, 0),
403
- to: (0, _utils.xy)(10000, 10000)
404
- }),
405
- container = _renderComponent34.container;
406
- expect(container.firstChild).toBeInTheDocument();
407
- });
408
- });
409
- describe('states', function () {
410
- it('renders in building state', function () {
411
- var _renderComponent35 = renderComponent({
412
- building: true
413
- }),
414
- container = _renderComponent35.container;
415
- expect(container.firstChild).toBeInTheDocument();
416
- });
417
- it('renders in completed state', function () {
418
- var _renderComponent36 = renderComponent({
419
- building: false
420
- }),
421
- container = _renderComponent36.container;
422
- expect(container.firstChild).toBeInTheDocument();
423
- });
424
- it('renders in disabled state', function () {
425
- var _renderComponent37 = renderComponent({
426
- disabled: true
427
- }),
428
- container = _renderComponent37.container;
429
- expect(container.firstChild).toBeInTheDocument();
430
- });
431
- it('renders in enabled state', function () {
432
- var _renderComponent38 = renderComponent({
433
- disabled: false
434
- }),
435
- container = _renderComponent38.container;
436
- expect(container.firstChild).toBeInTheDocument();
437
- });
438
- it('renders with building and disabled', function () {
439
- var _renderComponent39 = renderComponent({
440
- building: true,
441
- disabled: true
442
- }),
443
- container = _renderComponent39.container;
444
- expect(container.firstChild).toBeInTheDocument();
445
- });
446
- it('renders with correctness correct', function () {
447
- var _renderComponent40 = renderComponent({
448
- correctness: 'correct'
449
- }),
450
- container = _renderComponent40.container;
451
- expect(container.firstChild).toBeInTheDocument();
452
- });
453
- it('renders with correctness incorrect', function () {
454
- var _renderComponent41 = renderComponent({
455
- correctness: 'incorrect'
456
- }),
457
- container = _renderComponent41.container;
458
- expect(container.firstChild).toBeInTheDocument();
459
- });
460
- it('renders with correctness partial', function () {
461
- var _renderComponent42 = renderComponent({
462
- correctness: 'partial'
463
- }),
464
- container = _renderComponent42.container;
465
- expect(container.firstChild).toBeInTheDocument();
466
- });
467
- it('renders without correctness', function () {
468
- var _renderComponent43 = renderComponent({
469
- correctness: undefined
470
- }),
471
- container = _renderComponent43.container;
472
- expect(container.firstChild).toBeInTheDocument();
473
- });
474
- });
475
- describe('edge cases', function () {
476
- it('handles null labelNode', function () {
477
- var _renderComponent44 = renderComponent({
478
- labelNode: null,
479
- from: fromWithLabel,
480
- to: toWithLabel
481
- }),
482
- container = _renderComponent44.container;
483
- expect(container.firstChild).toBeInTheDocument();
484
- });
485
- it('handles undefined labelNode', function () {
486
- var _renderComponent45 = renderComponent({
487
- labelNode: undefined,
488
- from: fromWithLabel,
489
- to: toWithLabel
490
- }),
491
- container = _renderComponent45.container;
492
- expect(container.firstChild).toBeInTheDocument();
493
- });
494
- it('handles missing from coordinates', function () {
495
- var _renderComponent46 = renderComponent({
496
- from: {},
497
- to: (0, _utils.xy)(1, 1)
498
- }),
499
- container = _renderComponent46.container;
500
- expect(container.firstChild).toBeInTheDocument();
501
- });
502
- it('handles all props undefined except required', function () {
503
- var _renderComponent47 = renderComponent({
504
- building: undefined,
505
- disabled: undefined,
506
- correctness: undefined,
507
- coordinatesOnHover: undefined,
508
- labelModeEnabled: undefined,
509
- limitLabeling: undefined
510
- }),
511
- container = _renderComponent47.container;
512
- expect(container.firstChild).toBeInTheDocument();
513
- });
514
- it('renders with custom classes', function () {
515
- var _renderComponent48 = renderComponent({
516
- classes: {
517
- root: 'custom-root'
518
- }
519
- }),
520
- container = _renderComponent48.container;
521
- expect(container.firstChild).toBeInTheDocument();
522
- });
523
- it('renders with empty classes', function () {
524
- var _renderComponent49 = renderComponent({
525
- classes: {}
526
- }),
527
- container = _renderComponent49.container;
528
- expect(container.firstChild).toBeInTheDocument();
529
- });
530
- it('handles middle point without label', function () {
531
- var middle = {
532
- x: 0.5,
533
- y: 0.5
534
- };
535
- var _renderComponent50 = renderComponent({
536
- labelNode: labelNode,
537
- middle: middle
538
- }),
539
- container = _renderComponent50.container;
540
- expect(container.firstChild).toBeInTheDocument();
541
- });
542
- it('renders with all label types simultaneously', function () {
543
- var middle = {
544
- x: 0.5,
545
- y: 0.5,
546
- label: 'M'
547
- };
548
- var _renderComponent51 = renderComponent({
549
- labelNode: labelNode,
550
- from: fromWithLabel,
551
- to: toWithLabel,
552
- middle: middle,
553
- labelModeEnabled: true
554
- }),
555
- container = _renderComponent51.container;
556
- expect(container.firstChild).toBeInTheDocument();
557
- });
558
- });
559
- describe('integration', function () {
560
- it('renders complete circle with all features', function () {
561
- var middle = {
562
- x: 0.5,
563
- y: 0.5,
564
- label: 'Middle'
565
- };
566
- var _renderComponent52 = renderComponent({
567
- from: fromWithLabel,
568
- to: toWithLabel,
569
- middle: middle,
570
- labelNode: labelNode,
571
- labelModeEnabled: true,
572
- coordinatesOnHover: true,
573
- correctness: 'correct',
574
- building: false,
575
- disabled: false,
576
- onClick: jest.fn(),
577
- onChange: jest.fn(),
578
- changeMarkProps: jest.fn(),
579
- onDragStart: jest.fn(),
580
- onDragStop: jest.fn()
581
- }),
582
- container = _renderComponent52.container;
583
- expect(container.firstChild).toBeInTheDocument();
584
- });
585
- it('renders building circle without labels', function () {
586
- var _renderComponent53 = renderComponent({
587
- from: (0, _utils.xy)(0, 0),
588
- to: (0, _utils.xy)(1, 1),
589
- building: true,
590
- disabled: false
591
- }),
592
- container = _renderComponent53.container;
593
- expect(container.firstChild).toBeInTheDocument();
594
- });
595
- it('renders disabled circle with labels', function () {
596
- var _renderComponent54 = renderComponent({
597
- from: fromWithLabel,
598
- to: toWithLabel,
599
- labelNode: labelNode,
600
- disabled: true,
601
- building: false
602
- }),
603
- container = _renderComponent54.container;
604
- expect(container.firstChild).toBeInTheDocument();
605
- });
606
- });
607
-
608
- // Note: Instance method tests (dragFrom, dragTo, dragCircle, labelChange, clickPoint)
609
- // have been removed as they test internal implementation details.
610
- // These behaviors should be tested through:
611
- // 1. User interaction tests (drag-and-drop, clicks) - requires complex setup with @dnd-kit
612
- // 2. Integration/E2E tests
613
- // The component's public API (onChange, changeMarkProps callbacks) is what matters for RTL testing.
614
- });
615
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdGVzdFV0aWxzIiwicmVxdWlyZSIsIl9yZWFjdCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfdXRpbHMiLCJfY29tcG9uZW50Iiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJkZXNjcmliZSIsIm9uQ2hhbmdlIiwiamVzdCIsImZuIiwiY2hhbmdlTWFya1Byb3BzIiwicmVuZGVyQ29tcG9uZW50IiwiZXh0cmFzIiwiZGVmYXVsdHMiLCJjbGFzc2VzIiwiY2xhc3NOYW1lIiwiZ3JhcGhQcm9wcyIsImZyb20iLCJ4eSIsInRvIiwicHJvcHMiLCJyZW5kZXIiLCJjcmVhdGVFbGVtZW50IiwiUmF3QmFzZUNpcmNsZSIsImxhYmVsTm9kZSIsImRvY3VtZW50IiwiZnJvbVdpdGhMYWJlbCIsIngiLCJ5IiwibGFiZWwiLCJ0b1dpdGhMYWJlbCIsInJlbmRlcldpdGhMYWJlbHMiLCJ1bmRlZmluZWQiLCJpdCIsIl9yZW5kZXJDb21wb25lbnQiLCJjb250YWluZXIiLCJleHBlY3QiLCJmaXJzdENoaWxkIiwidG9CZUluVGhlRG9jdW1lbnQiLCJfcmVuZGVyV2l0aExhYmVscyIsIl9yZW5kZXJDb21wb25lbnQyIiwiZyIsInF1ZXJ5U2VsZWN0b3IiLCJfcmVuZGVyQ29tcG9uZW50MyIsIl9yZW5kZXJDb21wb25lbnQ0IiwicG9pbnRzIiwicXVlcnlTZWxlY3RvckFsbCIsInRvQmVHcmVhdGVyVGhhbk9yRXF1YWwiLCJfcmVuZGVyQ29tcG9uZW50NSIsImJ1aWxkaW5nIiwiX3JlbmRlckNvbXBvbmVudDYiLCJkaXNhYmxlZCIsIl9yZW5kZXJDb21wb25lbnQ3IiwiY29ycmVjdG5lc3MiLCJfcmVuZGVyQ29tcG9uZW50OCIsImNvb3JkaW5hdGVzT25Ib3ZlciIsIl9yZW5kZXJDb21wb25lbnQ5IiwibGFiZWxNb2RlRW5hYmxlZCIsIm1pZGRsZSIsIl9yZW5kZXJDb21wb25lbnQwIiwiX3JlbmRlckNvbXBvbmVudDEiLCJfcmVuZGVyQ29tcG9uZW50MTAiLCJjdXN0b21PbkNoYW5nZSIsIl9yZW5kZXJDb21wb25lbnQxMSIsImN1c3RvbUNoYW5nZU1hcmtQcm9wcyIsIl9yZW5kZXJDb21wb25lbnQxMiIsIm9uQ2xpY2siLCJfcmVuZGVyQ29tcG9uZW50MTMiLCJvbkRyYWdTdGFydCIsIl9yZW5kZXJDb21wb25lbnQxNCIsIm9uRHJhZ1N0b3AiLCJfcmVuZGVyQ29tcG9uZW50MTUiLCJfcmVuZGVyQ29tcG9uZW50MTYiLCJjdXN0b21HcmFwaFByb3BzIiwic2l6ZSIsIndpZHRoIiwiaGVpZ2h0IiwiX3JlbmRlckNvbXBvbmVudDE3IiwiX3JlbmRlckNvbXBvbmVudDE4IiwiX3JlbmRlcldpdGhMYWJlbHMyIiwiX3JlbmRlcldpdGhMYWJlbHMzIiwiX3JlbmRlckNvbXBvbmVudDE5IiwiX3JlbmRlckNvbXBvbmVudDIwIiwiX3JlbmRlckNvbXBvbmVudDIxIiwiX3JlbmRlckNvbXBvbmVudDIyIiwiX3JlbmRlckNvbXBvbmVudDIzIiwiX3JlbmRlckNvbXBvbmVudDI0IiwibGltaXRMYWJlbGluZyIsIl9yZW5kZXJDb21wb25lbnQyNSIsIl9yZW5kZXJDb21wb25lbnQyNiIsIl9yZW5kZXJDb21wb25lbnQyNyIsIl9yZW5kZXJDb21wb25lbnQyOCIsIl9yZW5kZXJDb21wb25lbnQyOSIsIl9yZW5kZXJDb21wb25lbnQzMCIsIl9yZW5kZXJDb21wb25lbnQzMSIsIl9yZW5kZXJDb21wb25lbnQzMiIsIl9yZW5kZXJDb21wb25lbnQzMyIsIl9yZW5kZXJDb21wb25lbnQzNCIsIl9yZW5kZXJDb21wb25lbnQzNSIsIl9yZW5kZXJDb21wb25lbnQzNiIsIl9yZW5kZXJDb21wb25lbnQzNyIsIl9yZW5kZXJDb21wb25lbnQzOCIsIl9yZW5kZXJDb21wb25lbnQzOSIsIl9yZW5kZXJDb21wb25lbnQ0MCIsIl9yZW5kZXJDb21wb25lbnQ0MSIsIl9yZW5kZXJDb21wb25lbnQ0MiIsIl9yZW5kZXJDb21wb25lbnQ0MyIsIl9yZW5kZXJDb21wb25lbnQ0NCIsIl9yZW5kZXJDb21wb25lbnQ0NSIsIl9yZW5kZXJDb21wb25lbnQ0NiIsIl9yZW5kZXJDb21wb25lbnQ0NyIsIl9yZW5kZXJDb21wb25lbnQ0OCIsInJvb3QiLCJfcmVuZGVyQ29tcG9uZW50NDkiLCJfcmVuZGVyQ29tcG9uZW50NTAiLCJfcmVuZGVyQ29tcG9uZW50NTEiLCJfcmVuZGVyQ29tcG9uZW50NTIiLCJfcmVuZGVyQ29tcG9uZW50NTMiLCJfcmVuZGVyQ29tcG9uZW50NTQiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdG9vbHMvY2lyY2xlL19fdGVzdHNfXy9jb21wb25lbnQudGVzdC5qc3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVuZGVyIH0gZnJvbSAnQHBpZS1saWIvdGVzdC11dGlscyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZ3JhcGhQcm9wcywgeHkgfSBmcm9tICcuLi8uLi8uLi9fX3Rlc3RzX18vdXRpbHMnO1xuXG5pbXBvcnQgeyBSYXdCYXNlQ2lyY2xlIH0gZnJvbSAnLi4vY29tcG9uZW50JztcblxuZGVzY3JpYmUoJ0NvbXBvbmVudCcsICgpID0+IHtcbiAgbGV0IG9uQ2hhbmdlID0gamVzdC5mbigpO1xuICBsZXQgY2hhbmdlTWFya1Byb3BzID0gamVzdC5mbigpO1xuXG4gIGNvbnN0IHJlbmRlckNvbXBvbmVudCA9IChleHRyYXMpID0+IHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHtcbiAgICAgIGNsYXNzZXM6IHt9LFxuICAgICAgY2xhc3NOYW1lOiAnY2xhc3NOYW1lJyxcbiAgICAgIG9uQ2hhbmdlLFxuICAgICAgY2hhbmdlTWFya1Byb3BzLFxuICAgICAgZ3JhcGhQcm9wczogZ3JhcGhQcm9wcygpLFxuICAgICAgZnJvbTogeHkoMCwgMCksXG4gICAgICB0bzogeHkoMSwgMSksXG4gICAgfTtcbiAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdHMsIC4uLmV4dHJhcyB9O1xuXG4gICAgcmV0dXJuIHJlbmRlcig8UmF3QmFzZUNpcmNsZSB7Li4ucHJvcHN9IC8+KTtcbiAgfTtcblxuICAvLyB1c2VkIHRvIHRlc3QgaXRlbXMgdGhhdCBoYXZlIGxhYmVscyBhdHRhY2hlZCB0byBwb2ludHNcbiAgY29uc3QgbGFiZWxOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZm9yZWlnbk9iamVjdCcpO1xuICBjb25zdCBmcm9tV2l0aExhYmVsID0geyB4OiAwLCB5OiAwLCBsYWJlbDogJ0EnIH07XG4gIGNvbnN0IHRvV2l0aExhYmVsID0geyB4OiAxLCB5OiAxLCBsYWJlbDogJ0InIH07XG4gIGNvbnN0IHJlbmRlcldpdGhMYWJlbHMgPSAoZXh0cmFzID0ge30pID0+XG4gICAgcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgIC4uLmV4dHJhcyxcbiAgICAgIGxhYmVsTm9kZTogbGFiZWxOb2RlLFxuICAgICAgZnJvbTogZnJvbVdpdGhMYWJlbCxcbiAgICAgIHRvOiB0b1dpdGhMYWJlbCxcbiAgICB9KTtcblxuICBkZXNjcmliZSgncmVuZGVyaW5nJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHdpdGhvdXQgY3Jhc2hpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KCk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGxhYmVscycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJXaXRoTGFiZWxzKCk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBhIGcgZWxlbWVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoKTtcbiAgICAgIGNvbnN0IGcgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZycpO1xuICAgICAgZXhwZWN0KGcpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBCZ0NpcmNsZSBjb21wb25lbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KCk7XG4gICAgICAvLyBCZ0NpcmNsZSBpcyByZW5kZXJlZCBhcyBhIHN0eWxlZCBjb21wb25lbnRcbiAgICAgIGV4cGVjdChjb250YWluZXIucXVlcnlTZWxlY3RvcignZycpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgdHdvIEJhc2VQb2ludCBjb21wb25lbnRzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCgpO1xuICAgICAgLy8gVHdvIHBvaW50czogZnJvbSBhbmQgdG9cbiAgICAgIGNvbnN0IHBvaW50cyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCdnJyk7XG4gICAgICBleHBlY3QocG9pbnRzLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuT3JFcXVhbCgyKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggYnVpbGRpbmcgcHJvcCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBidWlsZGluZzogdHJ1ZSB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggZGlzYWJsZWQgcHJvcCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBkaXNhYmxlZDogdHJ1ZSB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggY29ycmVjdG5lc3MgcHJvcCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBjb3JyZWN0bmVzczogJ2NvcnJlY3QnIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBjb29yZGluYXRlc09uSG92ZXIgZW5hYmxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBjb29yZGluYXRlc09uSG92ZXI6IHRydWUgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGxhYmVsTW9kZUVuYWJsZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgbGFiZWxNb2RlRW5hYmxlZDogdHJ1ZSB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggbWlkZGxlIHBvaW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgbWlkZGxlID0geyB4OiAwLjUsIHk6IDAuNSwgbGFiZWw6ICdNJyB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIG1pZGRsZSxcbiAgICAgICAgbGFiZWxOb2RlLFxuICAgICAgICBsYWJlbE1vZGVFbmFibGVkOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyB1bmRlZmluZWQgdG8gcG9pbnQgKHVzZXMgZnJvbSknLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgdG86IHVuZGVmaW5lZCB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIG51bGwgdG8gcG9pbnQgKHVzZXMgZnJvbSknLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgdG86IG51bGwgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdwcm9wcycsICgpID0+IHtcbiAgICBpdCgncGFzc2VzIG9uQ2hhbmdlIGNhbGxiYWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tT25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgb25DaGFuZ2U6IGN1c3RvbU9uQ2hhbmdlIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Bhc3NlcyBjaGFuZ2VNYXJrUHJvcHMgY2FsbGJhY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBjdXN0b21DaGFuZ2VNYXJrUHJvcHMgPSBqZXN0LmZuKCk7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgY2hhbmdlTWFya1Byb3BzOiBjdXN0b21DaGFuZ2VNYXJrUHJvcHMgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncGFzc2VzIG9uQ2xpY2sgY2FsbGJhY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkNsaWNrID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IG9uQ2xpY2sgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncGFzc2VzIG9uRHJhZ1N0YXJ0IGNhbGxiYWNrJywgKCkgPT4ge1xuICAgICAgY29uc3Qgb25EcmFnU3RhcnQgPSBqZXN0LmZuKCk7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgb25EcmFnU3RhcnQgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncGFzc2VzIG9uRHJhZ1N0b3AgY2FsbGJhY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkRyYWdTdG9wID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IG9uRHJhZ1N0b3AgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgndXNlcyBkZWZhdWx0IG9uQ2xpY2sgd2hlbiBub3QgcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgb25DbGljazogdW5kZWZpbmVkIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Bhc3NlcyBncmFwaFByb3BzJywgKCkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tR3JhcGhQcm9wcyA9IGdyYXBoUHJvcHMoKTtcbiAgICAgIGN1c3RvbUdyYXBoUHJvcHMuc2l6ZSA9IHsgd2lkdGg6IDgwMCwgaGVpZ2h0OiA2MDAgfTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBncmFwaFByb3BzOiBjdXN0b21HcmFwaFByb3BzIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Bhc3NlcyBjbGFzc05hbWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgY2xhc3NOYW1lOiAnY3VzdG9tLWNpcmNsZScgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdsYWJlbHMnLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgZnJvbSBsYWJlbCB3aGVuIHByb3ZpZGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcldpdGhMYWJlbHMoKTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHRvIGxhYmVsIHdoZW4gcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyV2l0aExhYmVscygpO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgbWlkZGxlIGxhYmVsIHdoZW4gcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtaWRkbGUgPSB7IHg6IDAuNSwgeTogMC41LCBsYWJlbDogJ00nIH07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgbGFiZWxOb2RlLFxuICAgICAgICBtaWRkbGUsXG4gICAgICAgIGZyb206IGZyb21XaXRoTGFiZWwsXG4gICAgICAgIHRvOiB0b1dpdGhMYWJlbCxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHJlbmRlciBsYWJlbHMgd2hlbiBsYWJlbE5vZGUgaXMgbm90IHByb3ZpZGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGZyb206IGZyb21XaXRoTGFiZWwsXG4gICAgICAgIHRvOiB0b1dpdGhMYWJlbCxcbiAgICAgICAgbGFiZWxOb2RlOiBudWxsLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBlbXB0eSBsYWJlbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGZyb20gPSB7IHg6IDAsIHk6IDAsIGxhYmVsOiAnJyB9O1xuICAgICAgY29uc3QgdG8gPSB7IHg6IDEsIHk6IDEsIGxhYmVsOiAnJyB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGxhYmVsTm9kZSxcbiAgICAgICAgZnJvbSxcbiAgICAgICAgdG8sXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggbGFiZWwgbW9kZSBlbmFibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGxhYmVsTm9kZSxcbiAgICAgICAgbGFiZWxNb2RlRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgZnJvbTogZnJvbVdpdGhMYWJlbCxcbiAgICAgICAgdG86IHRvV2l0aExhYmVsLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGxhYmVsIG1vZGUgZGlzYWJsZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgbGFiZWxOb2RlLFxuICAgICAgICBsYWJlbE1vZGVFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgZnJvbTogZnJvbVdpdGhMYWJlbCxcbiAgICAgICAgdG86IHRvV2l0aExhYmVsLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGxpbWl0TGFiZWxpbmcgZW5hYmxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBsYWJlbE5vZGUsXG4gICAgICAgIGxpbWl0TGFiZWxpbmc6IHRydWUsXG4gICAgICAgIGZyb206IGZyb21XaXRoTGFiZWwsXG4gICAgICAgIHRvOiB0b1dpdGhMYWJlbCxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgZnJvbSBsYWJlbCB1bmRlZmluZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBmcm9tID0geyB4OiAwLCB5OiAwIH07XG4gICAgICBjb25zdCB0byA9IHsgeDogMSwgeTogMSwgbGFiZWw6ICdCJyB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGxhYmVsTm9kZSxcbiAgICAgICAgZnJvbSxcbiAgICAgICAgdG8sXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIHRvIGxhYmVsIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGZyb20gPSB7IHg6IDAsIHk6IDAsIGxhYmVsOiAnQScgfTtcbiAgICAgIGNvbnN0IHRvID0geyB4OiAxLCB5OiAxIH07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgbGFiZWxOb2RlLFxuICAgICAgICBmcm9tLFxuICAgICAgICB0byxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY29vcmRpbmF0ZXMnLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBwb3NpdGl2ZSBjb29yZGluYXRlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBmcm9tOiB4eSg1LCAxMCksXG4gICAgICAgIHRvOiB4eSgxNSwgMjApLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIG5lZ2F0aXZlIGNvb3JkaW5hdGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGZyb206IHh5KC01LCAtMTApLFxuICAgICAgICB0bzogeHkoLTE1LCAtMjApLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIHplcm8gY29vcmRpbmF0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZnJvbTogeHkoMCwgMCksXG4gICAgICAgIHRvOiB4eSgwLCAwKSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBkZWNpbWFsIGNvb3JkaW5hdGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGZyb206IHsgeDogMS41LCB5OiAyLjcgfSxcbiAgICAgICAgdG86IHsgeDogMy4yLCB5OiA0LjkgfSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBsYXJnZSBjb29yZGluYXRlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBmcm9tOiB4eSgxMDAwLCAxMDAwKSxcbiAgICAgICAgdG86IHh5KDIwMDAsIDIwMDApLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIG1peGVkIGNvb3JkaW5hdGUgc2lnbnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZnJvbTogeHkoLTUsIDEwKSxcbiAgICAgICAgdG86IHh5KDE1LCAtMjApLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIHZlcnkgY2xvc2UgcG9pbnRzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGZyb206IHsgeDogNSwgeTogNSB9LFxuICAgICAgICB0bzogeyB4OiA1LjAxLCB5OiA1LjAxIH0sXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggdmVyeSBmYXIgcG9pbnRzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGZyb206IHh5KDAsIDApLFxuICAgICAgICB0bzogeHkoMTAwMDAsIDEwMDAwKSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc3RhdGVzJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIGluIGJ1aWxkaW5nIHN0YXRlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGJ1aWxkaW5nOiB0cnVlIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgaW4gY29tcGxldGVkIHN0YXRlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGJ1aWxkaW5nOiBmYWxzZSB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIGluIGRpc2FibGVkIHN0YXRlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGRpc2FibGVkOiB0cnVlIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgaW4gZW5hYmxlZCBzdGF0ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBkaXNhYmxlZDogZmFsc2UgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGJ1aWxkaW5nIGFuZCBkaXNhYmxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBidWlsZGluZzogdHJ1ZSwgZGlzYWJsZWQ6IHRydWUgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGNvcnJlY3RuZXNzIGNvcnJlY3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgY29ycmVjdG5lc3M6ICdjb3JyZWN0JyB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggY29ycmVjdG5lc3MgaW5jb3JyZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGNvcnJlY3RuZXNzOiAnaW5jb3JyZWN0JyB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggY29ycmVjdG5lc3MgcGFydGlhbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBjb3JyZWN0bmVzczogJ3BhcnRpYWwnIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aG91dCBjb3JyZWN0bmVzcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBjb3JyZWN0bmVzczogdW5kZWZpbmVkIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZWRnZSBjYXNlcycsICgpID0+IHtcbiAgICBpdCgnaGFuZGxlcyBudWxsIGxhYmVsTm9kZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBsYWJlbE5vZGU6IG51bGwsXG4gICAgICAgIGZyb206IGZyb21XaXRoTGFiZWwsXG4gICAgICAgIHRvOiB0b1dpdGhMYWJlbCxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgdW5kZWZpbmVkIGxhYmVsTm9kZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBsYWJlbE5vZGU6IHVuZGVmaW5lZCxcbiAgICAgICAgZnJvbTogZnJvbVdpdGhMYWJlbCxcbiAgICAgICAgdG86IHRvV2l0aExhYmVsLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBtaXNzaW5nIGZyb20gY29vcmRpbmF0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZnJvbToge30sXG4gICAgICAgIHRvOiB4eSgxLCAxKSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgYWxsIHByb3BzIHVuZGVmaW5lZCBleGNlcHQgcmVxdWlyZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgYnVpbGRpbmc6IHVuZGVmaW5lZCxcbiAgICAgICAgZGlzYWJsZWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgY29ycmVjdG5lc3M6IHVuZGVmaW5lZCxcbiAgICAgICAgY29vcmRpbmF0ZXNPbkhvdmVyOiB1bmRlZmluZWQsXG4gICAgICAgIGxhYmVsTW9kZUVuYWJsZWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgbGltaXRMYWJlbGluZzogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGN1c3RvbSBjbGFzc2VzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNsYXNzZXM6IHsgcm9vdDogJ2N1c3RvbS1yb290JyB9LFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGVtcHR5IGNsYXNzZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgY2xhc3Nlczoge30gfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBtaWRkbGUgcG9pbnQgd2l0aG91dCBsYWJlbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1pZGRsZSA9IHsgeDogMC41LCB5OiAwLjUgfTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBsYWJlbE5vZGUsXG4gICAgICAgIG1pZGRsZSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBhbGwgbGFiZWwgdHlwZXMgc2ltdWx0YW5lb3VzbHknLCAoKSA9PiB7XG4gICAgICBjb25zdCBtaWRkbGUgPSB7IHg6IDAuNSwgeTogMC41LCBsYWJlbDogJ00nIH07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgbGFiZWxOb2RlLFxuICAgICAgICBmcm9tOiBmcm9tV2l0aExhYmVsLFxuICAgICAgICB0bzogdG9XaXRoTGFiZWwsXG4gICAgICAgIG1pZGRsZSxcbiAgICAgICAgbGFiZWxNb2RlRW5hYmxlZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaW50ZWdyYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgY29tcGxldGUgY2lyY2xlIHdpdGggYWxsIGZlYXR1cmVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWlkZGxlID0geyB4OiAwLjUsIHk6IDAuNSwgbGFiZWw6ICdNaWRkbGUnIH07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZnJvbTogZnJvbVdpdGhMYWJlbCxcbiAgICAgICAgdG86IHRvV2l0aExhYmVsLFxuICAgICAgICBtaWRkbGUsXG4gICAgICAgIGxhYmVsTm9kZSxcbiAgICAgICAgbGFiZWxNb2RlRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgY29vcmRpbmF0ZXNPbkhvdmVyOiB0cnVlLFxuICAgICAgICBjb3JyZWN0bmVzczogJ2NvcnJlY3QnLFxuICAgICAgICBidWlsZGluZzogZmFsc2UsXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgb25DbGljazogamVzdC5mbigpLFxuICAgICAgICBvbkNoYW5nZTogamVzdC5mbigpLFxuICAgICAgICBjaGFuZ2VNYXJrUHJvcHM6IGplc3QuZm4oKSxcbiAgICAgICAgb25EcmFnU3RhcnQ6IGplc3QuZm4oKSxcbiAgICAgICAgb25EcmFnU3RvcDogamVzdC5mbigpLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBidWlsZGluZyBjaXJjbGUgd2l0aG91dCBsYWJlbHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZnJvbTogeHkoMCwgMCksXG4gICAgICAgIHRvOiB4eSgxLCAxKSxcbiAgICAgICAgYnVpbGRpbmc6IHRydWUsXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgZGlzYWJsZWQgY2lyY2xlIHdpdGggbGFiZWxzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGZyb206IGZyb21XaXRoTGFiZWwsXG4gICAgICAgIHRvOiB0b1dpdGhMYWJlbCxcbiAgICAgICAgbGFiZWxOb2RlLFxuICAgICAgICBkaXNhYmxlZDogdHJ1ZSxcbiAgICAgICAgYnVpbGRpbmc6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIE5vdGU6IEluc3RhbmNlIG1ldGhvZCB0ZXN0cyAoZHJhZ0Zyb20sIGRyYWdUbywgZHJhZ0NpcmNsZSwgbGFiZWxDaGFuZ2UsIGNsaWNrUG9pbnQpXG4gIC8vIGhhdmUgYmVlbiByZW1vdmVkIGFzIHRoZXkgdGVzdCBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLlxuICAvLyBUaGVzZSBiZWhhdmlvcnMgc2hvdWxkIGJlIHRlc3RlZCB0aHJvdWdoOlxuICAvLyAxLiBVc2VyIGludGVyYWN0aW9uIHRlc3RzIChkcmFnLWFuZC1kcm9wLCBjbGlja3MpIC0gcmVxdWlyZXMgY29tcGxleCBzZXR1cCB3aXRoIEBkbmQta2l0XG4gIC8vIDIuIEludGVncmF0aW9uL0UyRSB0ZXN0c1xuICAvLyBUaGUgY29tcG9uZW50J3MgcHVibGljIEFQSSAob25DaGFuZ2UsIGNoYW5nZU1hcmtQcm9wcyBjYWxsYmFja3MpIGlzIHdoYXQgbWF0dGVycyBmb3IgUlRMIHRlc3RpbmcuXG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLElBQUFBLFVBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLE1BQUEsR0FBQUgsT0FBQTtBQUVBLElBQUFJLFVBQUEsR0FBQUosT0FBQTtBQUE2QyxTQUFBSyxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FBQSxXQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFSLENBQUEsRUFBQUMsQ0FBQSxFQUFBUSxVQUFBLE9BQUFQLENBQUEsQ0FBQVEsSUFBQSxDQUFBQyxLQUFBLENBQUFULENBQUEsRUFBQUksQ0FBQSxZQUFBSixDQUFBO0FBQUEsU0FBQVUsY0FBQVosQ0FBQSxhQUFBQyxDQUFBLE1BQUFBLENBQUEsR0FBQVksU0FBQSxDQUFBQyxNQUFBLEVBQUFiLENBQUEsVUFBQUMsQ0FBQSxXQUFBVyxTQUFBLENBQUFaLENBQUEsSUFBQVksU0FBQSxDQUFBWixDQUFBLFFBQUFBLENBQUEsT0FBQUYsT0FBQSxDQUFBSSxNQUFBLENBQUFELENBQUEsT0FBQWEsT0FBQSxXQUFBZCxDQUFBLFFBQUFlLGdCQUFBLGFBQUFoQixDQUFBLEVBQUFDLENBQUEsRUFBQUMsQ0FBQSxDQUFBRCxDQUFBLFNBQUFFLE1BQUEsQ0FBQWMseUJBQUEsR0FBQWQsTUFBQSxDQUFBZSxn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