@pie-lib/plot 2.27.3-next.2 → 2.27.4-next.0

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.
@@ -0,0 +1,773 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
5
+ var _react = require("@testing-library/react");
6
+ var _react2 = _interopRequireDefault(require("react"));
7
+ var _gridDraggable = require("../grid-draggable");
8
+ var _utils = require("../utils");
9
+ var _d3Selection = require("d3-selection");
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
+ jest.mock('d3-selection', function () {
13
+ return {
14
+ clientPoint: jest.fn().mockReturnValue([0, 0])
15
+ };
16
+ });
17
+ var mockDraggableCoreProps;
18
+ jest.mock('../draggable', function () {
19
+ return {
20
+ DraggableCore: function DraggableCore(props) {
21
+ // Store the props so tests can call the handlers
22
+ mockDraggableCoreProps = props;
23
+ return props.children;
24
+ }
25
+ };
26
+ });
27
+ jest.mock('../utils', function () {
28
+ return {
29
+ getDelta: jest.fn()
30
+ };
31
+ });
32
+ var xyFn = function xyFn() {
33
+ var out = jest.fn(function (n) {
34
+ return n;
35
+ });
36
+ out.invert = jest.fn(function (n) {
37
+ return n;
38
+ });
39
+ return out;
40
+ };
41
+ var getGraphProps = function getGraphProps() {
42
+ return {
43
+ scale: {
44
+ x: xyFn(),
45
+ y: xyFn()
46
+ },
47
+ snap: {
48
+ x: xyFn(),
49
+ y: xyFn()
50
+ },
51
+ domain: {
52
+ min: 0,
53
+ max: 1,
54
+ step: 1
55
+ },
56
+ range: {
57
+ min: 0,
58
+ max: 1,
59
+ step: 1
60
+ },
61
+ size: {
62
+ width: 500,
63
+ height: 500
64
+ },
65
+ getRootNode: function getRootNode() {
66
+ return {
67
+ ownerSVGElement: null,
68
+ getBoundingClientRect: function getBoundingClientRect() {
69
+ return {
70
+ left: 0,
71
+ top: 0,
72
+ right: 100,
73
+ bottom: 100
74
+ };
75
+ }
76
+ };
77
+ }
78
+ };
79
+ };
80
+ describe('gridDraggable', function () {
81
+ var defaultOptions;
82
+ var defaultProps;
83
+ beforeEach(function () {
84
+ mockDraggableCoreProps = null;
85
+ defaultOptions = {
86
+ anchorPoint: jest.fn().mockReturnValue({
87
+ x: 0,
88
+ y: 0
89
+ }),
90
+ bounds: jest.fn().mockReturnValue({
91
+ left: 0,
92
+ top: 0,
93
+ bottom: 0,
94
+ right: 0
95
+ }),
96
+ fromDelta: jest.fn()
97
+ };
98
+ defaultProps = {
99
+ graphProps: getGraphProps()
100
+ };
101
+ });
102
+ it('renders regular component', function () {
103
+ var Comp = (0, _gridDraggable.gridDraggable)(defaultOptions)(function () {
104
+ return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
105
+ });
106
+ var _render = (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, defaultProps)),
107
+ container = _render.container;
108
+ expect(container.firstChild).toBeInTheDocument();
109
+ });
110
+ it('renders with decimal domain and range', function () {
111
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
112
+ graphProps: _objectSpread(_objectSpread({}, getGraphProps()), {}, {
113
+ domain: {
114
+ min: -1.5,
115
+ max: 1.6,
116
+ step: 0.3
117
+ },
118
+ range: {
119
+ min: -2,
120
+ max: 3,
121
+ step: 0.2
122
+ }
123
+ })
124
+ });
125
+ var Comp = (0, _gridDraggable.gridDraggable)(defaultOptions)(function () {
126
+ return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
127
+ });
128
+ var _render2 = (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, props)),
129
+ container = _render2.container;
130
+ expect(container.firstChild).toBeInTheDocument();
131
+ });
132
+ describe('logic', function () {
133
+ describe('grid calculation', function () {
134
+ it('passes correct grid to DraggableCore based on domain and range step', function () {
135
+ var Comp = (0, _gridDraggable.gridDraggable)(defaultOptions)(function () {
136
+ return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
137
+ });
138
+ (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, defaultProps));
139
+
140
+ // Grid is calculated as: scale.x(domain.step) - scale.x(0)
141
+ // With our mock xyFn that returns n, this is: step - 0 = step
142
+ expect(mockDraggableCoreProps.grid).toEqual([1, 1]);
143
+ });
144
+ it('calculates grid with decimal steps', function () {
145
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
146
+ graphProps: _objectSpread(_objectSpread({}, getGraphProps()), {}, {
147
+ domain: {
148
+ min: -1.5,
149
+ max: 1.6,
150
+ step: 0.3
151
+ },
152
+ range: {
153
+ min: -2,
154
+ max: 3,
155
+ step: 0.2
156
+ }
157
+ })
158
+ });
159
+ var Comp = (0, _gridDraggable.gridDraggable)(defaultOptions)(function () {
160
+ return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
161
+ });
162
+ (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, props));
163
+ expect(mockDraggableCoreProps.grid).toEqual([0.3, 0.2]);
164
+ });
165
+ });
166
+ describe('onStart', function () {
167
+ it('calls onDragStart handler when drag starts', function () {
168
+ var onDragStart = jest.fn();
169
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
170
+ onDragStart: onDragStart
171
+ });
172
+ var Comp = (0, _gridDraggable.gridDraggable)(defaultOptions)(function () {
173
+ return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
174
+ });
175
+ (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, props));
176
+
177
+ // Simulate drag start
178
+ mockDraggableCoreProps.onStart({
179
+ clientX: 100,
180
+ clientY: 100
181
+ });
182
+ expect(onDragStart).toHaveBeenCalled();
183
+ });
184
+ });
185
+ describe('onDrag', function () {
186
+ it('calls onDrag callback with result from fromDelta', function () {
187
+ var onDrag = jest.fn();
188
+ var fromDelta = jest.fn().mockReturnValue('delta-result');
189
+ var bounds = jest.fn().mockReturnValue({
190
+ left: -100,
191
+ top: -100,
192
+ bottom: 100,
193
+ right: 100
194
+ });
195
+ var options = _objectSpread(_objectSpread({}, defaultOptions), {}, {
196
+ fromDelta: fromDelta,
197
+ bounds: bounds
198
+ });
199
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
200
+ onDrag: onDrag
201
+ });
202
+ var Comp = (0, _gridDraggable.gridDraggable)(options)(function () {
203
+ return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
204
+ });
205
+ (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, props));
206
+
207
+ // Set up drag start state
208
+ mockDraggableCoreProps.onStart({
209
+ clientX: 0,
210
+ clientY: 0
211
+ });
212
+
213
+ // Simulate drag
214
+ mockDraggableCoreProps.onDrag({}, {
215
+ deltaX: 10,
216
+ deltaY: 10
217
+ });
218
+ expect(fromDelta).toHaveBeenCalled();
219
+ expect(onDrag).toHaveBeenCalledWith('delta-result');
220
+ });
221
+ it('does not call onDrag when no onDrag handler is provided', function () {
222
+ var fromDelta = jest.fn();
223
+ var options = _objectSpread(_objectSpread({}, defaultOptions), {}, {
224
+ fromDelta: fromDelta
225
+ });
226
+ var Comp = (0, _gridDraggable.gridDraggable)(options)(function () {
227
+ return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
228
+ });
229
+ (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, defaultProps));
230
+ mockDraggableCoreProps.onStart({
231
+ clientX: 0,
232
+ clientY: 0
233
+ });
234
+ mockDraggableCoreProps.onDrag({}, {
235
+ deltaX: 10,
236
+ deltaY: 10
237
+ });
238
+ expect(fromDelta).not.toHaveBeenCalled();
239
+ });
240
+ describe('bounds checking', function () {
241
+ it('does not call onDrag when dragging left beyond left bound', function () {
242
+ var onDrag = jest.fn();
243
+ var bounds = jest.fn().mockReturnValue({
244
+ left: 0,
245
+ top: 0,
246
+ bottom: 0,
247
+ right: 0
248
+ });
249
+ var fromDelta = jest.fn().mockReturnValue('result');
250
+ var options = _objectSpread(_objectSpread({}, defaultOptions), {}, {
251
+ bounds: bounds,
252
+ fromDelta: fromDelta
253
+ });
254
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
255
+ onDrag: onDrag
256
+ });
257
+ var Comp = (0, _gridDraggable.gridDraggable)(options)(function () {
258
+ return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
259
+ });
260
+ (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, props));
261
+ mockDraggableCoreProps.onStart({
262
+ clientX: 0,
263
+ clientY: 0
264
+ });
265
+ // deltaX < 0 and deltaX < scaled bounds.left (0), so -10 < 0 triggers early return
266
+ mockDraggableCoreProps.onDrag({}, {
267
+ deltaX: -10,
268
+ deltaY: 0
269
+ });
270
+ expect(onDrag).not.toHaveBeenCalled();
271
+ });
272
+ it('does not call onDrag when dragging right beyond right bound', function () {
273
+ var onDrag = jest.fn();
274
+ var bounds = jest.fn().mockReturnValue({
275
+ left: 0,
276
+ top: 0,
277
+ bottom: 0,
278
+ right: 0
279
+ });
280
+ var fromDelta = jest.fn().mockReturnValue('result');
281
+ var options = _objectSpread(_objectSpread({}, defaultOptions), {}, {
282
+ bounds: bounds,
283
+ fromDelta: fromDelta
284
+ });
285
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
286
+ onDrag: onDrag
287
+ });
288
+ var Comp = (0, _gridDraggable.gridDraggable)(options)(function () {
289
+ return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
290
+ });
291
+ (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, props));
292
+ mockDraggableCoreProps.onStart({
293
+ clientX: 0,
294
+ clientY: 0
295
+ });
296
+ // deltaX > 0 and deltaX > scaled bounds.right (0), so 10 > 0 triggers early return
297
+ mockDraggableCoreProps.onDrag({}, {
298
+ deltaX: 10,
299
+ deltaY: 0
300
+ });
301
+ expect(onDrag).not.toHaveBeenCalled();
302
+ });
303
+ it('does not call onDrag when dragging up beyond top bound', function () {
304
+ var onDrag = jest.fn();
305
+ var bounds = jest.fn().mockReturnValue({
306
+ left: -100,
307
+ top: 0,
308
+ bottom: 0,
309
+ right: 100
310
+ });
311
+ var fromDelta = jest.fn().mockReturnValue('result');
312
+ var options = _objectSpread(_objectSpread({}, defaultOptions), {}, {
313
+ bounds: bounds,
314
+ fromDelta: fromDelta
315
+ });
316
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
317
+ onDrag: onDrag
318
+ });
319
+ var Comp = (0, _gridDraggable.gridDraggable)(options)(function () {
320
+ return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
321
+ });
322
+ (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, props));
323
+ mockDraggableCoreProps.onStart({
324
+ clientX: 0,
325
+ clientY: 0
326
+ });
327
+ // deltaY < 0 and deltaY < scaled bounds.top (0), so -10 < 0 triggers early return
328
+ mockDraggableCoreProps.onDrag({}, {
329
+ deltaX: 0,
330
+ deltaY: -10
331
+ });
332
+ expect(onDrag).not.toHaveBeenCalled();
333
+ });
334
+ it('does not call onDrag when dragging down beyond bottom bound', function () {
335
+ var onDrag = jest.fn();
336
+ var bounds = jest.fn().mockReturnValue({
337
+ left: -100,
338
+ top: -100,
339
+ bottom: 0,
340
+ right: 100
341
+ });
342
+ var fromDelta = jest.fn().mockReturnValue('result');
343
+ var options = _objectSpread(_objectSpread({}, defaultOptions), {}, {
344
+ bounds: bounds,
345
+ fromDelta: fromDelta
346
+ });
347
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
348
+ onDrag: onDrag
349
+ });
350
+ var Comp = (0, _gridDraggable.gridDraggable)(options)(function () {
351
+ return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
352
+ });
353
+ (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, props));
354
+ mockDraggableCoreProps.onStart({
355
+ clientX: 0,
356
+ clientY: 0
357
+ });
358
+ // deltaY > 0 and deltaY > scaled bounds.bottom (0), so 10 > 0 triggers early return
359
+ mockDraggableCoreProps.onDrag({}, {
360
+ deltaX: 0,
361
+ deltaY: 10
362
+ });
363
+ expect(onDrag).not.toHaveBeenCalled();
364
+ });
365
+ it('calls onDrag when dragging within bounds', function () {
366
+ var onDrag = jest.fn();
367
+ var bounds = jest.fn().mockReturnValue({
368
+ left: -100,
369
+ top: -100,
370
+ bottom: 100,
371
+ right: 100
372
+ });
373
+ var fromDelta = jest.fn().mockReturnValue('result');
374
+ var options = _objectSpread(_objectSpread({}, defaultOptions), {}, {
375
+ bounds: bounds,
376
+ fromDelta: fromDelta
377
+ });
378
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
379
+ onDrag: onDrag
380
+ });
381
+ var Comp = (0, _gridDraggable.gridDraggable)(options)(function () {
382
+ return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
383
+ });
384
+ (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, props));
385
+ mockDraggableCoreProps.onStart({
386
+ clientX: 0,
387
+ clientY: 0
388
+ });
389
+ // All bound checks pass: deltaX (-10) is NOT < bounds.left (-100) and NOT > bounds.right (100)
390
+ // Similarly for deltaY
391
+ mockDraggableCoreProps.onDrag({}, {
392
+ deltaX: -10,
393
+ deltaY: 10
394
+ });
395
+ expect(onDrag).toHaveBeenCalled();
396
+ });
397
+ });
398
+ describe('skipDragOutsideOfBounds', function () {
399
+ it('skips drag when moving left and x is below domain.min', function () {
400
+ var onDrag = jest.fn();
401
+ var graphProps = _objectSpread(_objectSpread({}, getGraphProps()), {}, {
402
+ domain: {
403
+ min: -5,
404
+ max: 5,
405
+ step: 1
406
+ },
407
+ range: {
408
+ min: -5,
409
+ max: 5,
410
+ step: 1
411
+ }
412
+ });
413
+ graphProps.scale.x.invert = jest.fn().mockReturnValue(-6); // Below min
414
+
415
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
416
+ graphProps: graphProps,
417
+ onDrag: onDrag
418
+ });
419
+ var bounds = jest.fn().mockReturnValue({
420
+ left: 100,
421
+ top: 100,
422
+ bottom: 100,
423
+ right: 100
424
+ });
425
+ var options = _objectSpread(_objectSpread({}, defaultOptions), {}, {
426
+ bounds: bounds
427
+ });
428
+ var Comp = (0, _gridDraggable.gridDraggable)(options)(function () {
429
+ return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
430
+ });
431
+ (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, props));
432
+ mockDraggableCoreProps.onStart({
433
+ clientX: 0,
434
+ clientY: 0
435
+ });
436
+ mockDraggableCoreProps.onDrag({}, {
437
+ deltaX: 1,
438
+ deltaY: 0
439
+ });
440
+ expect(onDrag).not.toHaveBeenCalled();
441
+ });
442
+ it('skips drag when moving right and x is above domain.max', function () {
443
+ var onDrag = jest.fn();
444
+ var graphProps = _objectSpread(_objectSpread({}, getGraphProps()), {}, {
445
+ domain: {
446
+ min: -5,
447
+ max: 5,
448
+ step: 1
449
+ },
450
+ range: {
451
+ min: -5,
452
+ max: 5,
453
+ step: 1
454
+ }
455
+ });
456
+ graphProps.scale.x.invert = jest.fn().mockReturnValue(6); // Above max
457
+
458
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
459
+ graphProps: graphProps,
460
+ onDrag: onDrag
461
+ });
462
+ var bounds = jest.fn().mockReturnValue({
463
+ left: 100,
464
+ top: 100,
465
+ bottom: 100,
466
+ right: 100
467
+ });
468
+ var options = _objectSpread(_objectSpread({}, defaultOptions), {}, {
469
+ bounds: bounds
470
+ });
471
+ var Comp = (0, _gridDraggable.gridDraggable)(options)(function () {
472
+ return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
473
+ });
474
+ (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, props));
475
+ mockDraggableCoreProps.onStart({
476
+ clientX: 0,
477
+ clientY: 0
478
+ });
479
+ mockDraggableCoreProps.onDrag({}, {
480
+ deltaX: -1,
481
+ deltaY: 0
482
+ });
483
+ expect(onDrag).not.toHaveBeenCalled();
484
+ });
485
+ it('skips drag when moving up and y is above range.max', function () {
486
+ var onDrag = jest.fn();
487
+ var graphProps = _objectSpread(_objectSpread({}, getGraphProps()), {}, {
488
+ domain: {
489
+ min: -5,
490
+ max: 5,
491
+ step: 1
492
+ },
493
+ range: {
494
+ min: -5,
495
+ max: 5,
496
+ step: 1
497
+ }
498
+ });
499
+ graphProps.scale.y.invert = jest.fn().mockReturnValue(6); // Above max
500
+
501
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
502
+ graphProps: graphProps,
503
+ onDrag: onDrag
504
+ });
505
+ var bounds = jest.fn().mockReturnValue({
506
+ left: 100,
507
+ top: 100,
508
+ bottom: 100,
509
+ right: 100
510
+ });
511
+ var options = _objectSpread(_objectSpread({}, defaultOptions), {}, {
512
+ bounds: bounds
513
+ });
514
+ var Comp = (0, _gridDraggable.gridDraggable)(options)(function () {
515
+ return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
516
+ });
517
+ (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, props));
518
+ mockDraggableCoreProps.onStart({
519
+ clientX: 0,
520
+ clientY: 0
521
+ });
522
+ mockDraggableCoreProps.onDrag({}, {
523
+ deltaX: 0,
524
+ deltaY: 1
525
+ });
526
+ expect(onDrag).not.toHaveBeenCalled();
527
+ });
528
+ it('skips drag when moving down and y is below range.min', function () {
529
+ var onDrag = jest.fn();
530
+ var graphProps = _objectSpread(_objectSpread({}, getGraphProps()), {}, {
531
+ domain: {
532
+ min: -5,
533
+ max: 5,
534
+ step: 1
535
+ },
536
+ range: {
537
+ min: -5,
538
+ max: 5,
539
+ step: 1
540
+ }
541
+ });
542
+ graphProps.scale.y.invert = jest.fn().mockReturnValue(-6); // Below min
543
+
544
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
545
+ graphProps: graphProps,
546
+ onDrag: onDrag
547
+ });
548
+ var bounds = jest.fn().mockReturnValue({
549
+ left: 100,
550
+ top: 100,
551
+ bottom: 100,
552
+ right: 100
553
+ });
554
+ var options = _objectSpread(_objectSpread({}, defaultOptions), {}, {
555
+ bounds: bounds
556
+ });
557
+ var Comp = (0, _gridDraggable.gridDraggable)(options)(function () {
558
+ return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
559
+ });
560
+ (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, props));
561
+ mockDraggableCoreProps.onStart({
562
+ clientX: 0,
563
+ clientY: 0
564
+ });
565
+ mockDraggableCoreProps.onDrag({}, {
566
+ deltaX: 0,
567
+ deltaY: -1
568
+ });
569
+ expect(onDrag).not.toHaveBeenCalled();
570
+ });
571
+ it('allows drag when within domain and range', function () {
572
+ var onDrag = jest.fn();
573
+ var graphProps = _objectSpread(_objectSpread({}, getGraphProps()), {}, {
574
+ domain: {
575
+ min: -5,
576
+ max: 5,
577
+ step: 1
578
+ },
579
+ range: {
580
+ min: -5,
581
+ max: 5,
582
+ step: 1
583
+ }
584
+ });
585
+ graphProps.scale.x.invert = jest.fn().mockReturnValue(3); // Within bounds
586
+ graphProps.scale.y.invert = jest.fn().mockReturnValue(2); // Within bounds
587
+
588
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
589
+ graphProps: graphProps,
590
+ onDrag: onDrag
591
+ });
592
+ var bounds = jest.fn().mockReturnValue({
593
+ left: -100,
594
+ top: -100,
595
+ bottom: 100,
596
+ right: 100
597
+ });
598
+ var options = _objectSpread(_objectSpread({}, defaultOptions), {}, {
599
+ bounds: bounds
600
+ });
601
+ var Comp = (0, _gridDraggable.gridDraggable)(options)(function () {
602
+ return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
603
+ });
604
+ (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, props));
605
+ mockDraggableCoreProps.onStart({
606
+ clientX: 0,
607
+ clientY: 0
608
+ });
609
+ mockDraggableCoreProps.onDrag({}, {
610
+ deltaX: 1,
611
+ deltaY: -1
612
+ });
613
+ expect(onDrag).toHaveBeenCalled();
614
+ });
615
+ });
616
+ });
617
+ describe('getDelta and applyDelta', function () {
618
+ it('calls utils.getDelta when processing drag', function () {
619
+ _utils.getDelta.mockClear();
620
+ var onDrag = jest.fn();
621
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
622
+ onDrag: onDrag
623
+ });
624
+ var bounds = jest.fn().mockReturnValue({
625
+ left: -100,
626
+ top: -100,
627
+ bottom: 100,
628
+ right: 100
629
+ });
630
+ var options = _objectSpread(_objectSpread({}, defaultOptions), {}, {
631
+ bounds: bounds
632
+ });
633
+ var Comp = (0, _gridDraggable.gridDraggable)(options)(function () {
634
+ return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
635
+ });
636
+ (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, props));
637
+ mockDraggableCoreProps.onStart({
638
+ clientX: 0,
639
+ clientY: 0
640
+ });
641
+ mockDraggableCoreProps.onDrag({}, {
642
+ deltaX: 10,
643
+ deltaY: 10
644
+ });
645
+ expect(_utils.getDelta).toHaveBeenCalled();
646
+ });
647
+ it('calls fromDelta with result from getDelta', function () {
648
+ var fromDelta = jest.fn();
649
+ _utils.getDelta.mockReturnValue({
650
+ x: 5,
651
+ y: 5
652
+ });
653
+ var bounds = jest.fn().mockReturnValue({
654
+ left: -100,
655
+ top: -100,
656
+ bottom: 100,
657
+ right: 100
658
+ });
659
+ var options = _objectSpread(_objectSpread({}, defaultOptions), {}, {
660
+ fromDelta: fromDelta,
661
+ bounds: bounds
662
+ });
663
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
664
+ onDrag: jest.fn()
665
+ });
666
+ var Comp = (0, _gridDraggable.gridDraggable)(options)(function () {
667
+ return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
668
+ });
669
+ (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, props));
670
+ mockDraggableCoreProps.onStart({
671
+ clientX: 0,
672
+ clientY: 0
673
+ });
674
+ mockDraggableCoreProps.onDrag({}, {
675
+ deltaX: 10,
676
+ deltaY: 10
677
+ });
678
+ expect(fromDelta).toHaveBeenCalled();
679
+ });
680
+ });
681
+ describe('onStop', function () {
682
+ it('calls onDragStop when drag stops', function () {
683
+ var onDragStop = jest.fn();
684
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
685
+ onDragStop: onDragStop
686
+ });
687
+ var Comp = (0, _gridDraggable.gridDraggable)(defaultOptions)(function () {
688
+ return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
689
+ });
690
+ (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, props));
691
+
692
+ // Start to set up state
693
+ mockDraggableCoreProps.onStart({
694
+ clientX: 0,
695
+ clientY: 0
696
+ });
697
+
698
+ // Stop with large movement (not tiny)
699
+ mockDraggableCoreProps.onStop({
700
+ clientX: 100,
701
+ clientY: 100
702
+ }, {});
703
+ expect(onDragStop).toHaveBeenCalled();
704
+ });
705
+ it('calls onClick instead of onDragStop when movement is tiny', function () {
706
+ var onClick = jest.fn();
707
+ var onDragStop = jest.fn();
708
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
709
+ onClick: onClick,
710
+ onDragStop: onDragStop
711
+ });
712
+ _d3Selection.clientPoint.mockReturnValue([0, 0]);
713
+ var Comp = (0, _gridDraggable.gridDraggable)(defaultOptions)(function () {
714
+ return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
715
+ });
716
+ (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, props));
717
+
718
+ // Start and stop at almost the same position (tiny movement)
719
+ // Grid is 1x1, tiny threshold is grid/10 = 0.1
720
+ mockDraggableCoreProps.onStart({
721
+ clientX: 0,
722
+ clientY: 0
723
+ });
724
+ mockDraggableCoreProps.onStop({
725
+ clientX: 0.05,
726
+ clientY: 0.05,
727
+ target: {}
728
+ }, {});
729
+ expect(onClick).toHaveBeenCalledWith({
730
+ x: 0,
731
+ y: 0
732
+ });
733
+ });
734
+ it('calls onClick with snapped coordinates', function () {
735
+ var onClick = jest.fn();
736
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
737
+ onClick: onClick
738
+ });
739
+ var graphProps = getGraphProps();
740
+ graphProps.scale.x.invert = jest.fn().mockReturnValue(1.7);
741
+ graphProps.scale.y.invert = jest.fn().mockReturnValue(2.3);
742
+ graphProps.snap.x = jest.fn().mockReturnValue(2);
743
+ graphProps.snap.y = jest.fn().mockReturnValue(2);
744
+ _d3Selection.clientPoint.mockReturnValue([1.7, 2.3]);
745
+ var propsWithGraphProps = _objectSpread(_objectSpread({}, props), {}, {
746
+ graphProps: graphProps
747
+ });
748
+ var Comp = (0, _gridDraggable.gridDraggable)(defaultOptions)(function () {
749
+ return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
750
+ });
751
+ (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, propsWithGraphProps));
752
+
753
+ // Start and stop at almost the same position (tiny movement)
754
+ mockDraggableCoreProps.onStart({
755
+ clientX: 0,
756
+ clientY: 0
757
+ });
758
+ mockDraggableCoreProps.onStop({
759
+ clientX: 0.05,
760
+ clientY: 0.05,
761
+ target: {}
762
+ }, {});
763
+ expect(graphProps.snap.x).toHaveBeenCalledWith(1.7);
764
+ expect(graphProps.snap.y).toHaveBeenCalledWith(2.3);
765
+ expect(onClick).toHaveBeenCalledWith({
766
+ x: 2,
767
+ y: 2
768
+ });
769
+ });
770
+ });
771
+ });
772
+ });
773
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJyZXF1aXJlIiwiX3JlYWN0MiIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfZ3JpZERyYWdnYWJsZSIsIl91dGlscyIsIl9kM1NlbGVjdGlvbiIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiamVzdCIsIm1vY2siLCJjbGllbnRQb2ludCIsImZuIiwibW9ja1JldHVyblZhbHVlIiwibW9ja0RyYWdnYWJsZUNvcmVQcm9wcyIsIkRyYWdnYWJsZUNvcmUiLCJwcm9wcyIsImNoaWxkcmVuIiwiZ2V0RGVsdGEiLCJ4eUZuIiwib3V0IiwibiIsImludmVydCIsImdldEdyYXBoUHJvcHMiLCJzY2FsZSIsIngiLCJ5Iiwic25hcCIsImRvbWFpbiIsIm1pbiIsIm1heCIsInN0ZXAiLCJyYW5nZSIsInNpemUiLCJ3aWR0aCIsImhlaWdodCIsImdldFJvb3ROb2RlIiwib3duZXJTVkdFbGVtZW50IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwibGVmdCIsInRvcCIsInJpZ2h0IiwiYm90dG9tIiwiZGVzY3JpYmUiLCJkZWZhdWx0T3B0aW9ucyIsImRlZmF1bHRQcm9wcyIsImJlZm9yZUVhY2giLCJhbmNob3JQb2ludCIsImJvdW5kcyIsImZyb21EZWx0YSIsImdyYXBoUHJvcHMiLCJpdCIsIkNvbXAiLCJncmlkRHJhZ2dhYmxlIiwiY3JlYXRlRWxlbWVudCIsIl9yZW5kZXIiLCJyZW5kZXIiLCJjb250YWluZXIiLCJleHBlY3QiLCJmaXJzdENoaWxkIiwidG9CZUluVGhlRG9jdW1lbnQiLCJfcmVuZGVyMiIsImdyaWQiLCJ0b0VxdWFsIiwib25EcmFnU3RhcnQiLCJvblN0YXJ0IiwiY2xpZW50WCIsImNsaWVudFkiLCJ0b0hhdmVCZWVuQ2FsbGVkIiwib25EcmFnIiwib3B0aW9ucyIsImRlbHRhWCIsImRlbHRhWSIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwibm90IiwibW9ja0NsZWFyIiwib25EcmFnU3RvcCIsIm9uU3RvcCIsIm9uQ2xpY2siLCJ0YXJnZXQiLCJwcm9wc1dpdGhHcmFwaFByb3BzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fdGVzdHNfXy9ncmlkLWRyYWdnYWJsZS50ZXN0LmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZW5kZXIgfSBmcm9tICdAdGVzdGluZy1saWJyYXJ5L3JlYWN0JztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBncmlkRHJhZ2dhYmxlIH0gZnJvbSAnLi4vZ3JpZC1kcmFnZ2FibGUnO1xuaW1wb3J0IHsgZ2V0RGVsdGEgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBjbGllbnRQb2ludCB9IGZyb20gJ2QzLXNlbGVjdGlvbic7XG5cbmplc3QubW9jaygnZDMtc2VsZWN0aW9uJywgKCkgPT4gKHtcbiAgY2xpZW50UG9pbnQ6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoWzAsIDBdKSxcbn0pKTtcblxubGV0IG1vY2tEcmFnZ2FibGVDb3JlUHJvcHM7XG5qZXN0Lm1vY2soJy4uL2RyYWdnYWJsZScsICgpID0+ICh7XG4gIERyYWdnYWJsZUNvcmU6IChwcm9wcykgPT4ge1xuICAgIC8vIFN0b3JlIHRoZSBwcm9wcyBzbyB0ZXN0cyBjYW4gY2FsbCB0aGUgaGFuZGxlcnNcbiAgICBtb2NrRHJhZ2dhYmxlQ29yZVByb3BzID0gcHJvcHM7XG4gICAgcmV0dXJuIHByb3BzLmNoaWxkcmVuO1xuICB9LFxufSkpO1xuXG5qZXN0Lm1vY2soJy4uL3V0aWxzJywgKCkgPT4gKHtcbiAgZ2V0RGVsdGE6IGplc3QuZm4oKSxcbn0pKTtcblxuY29uc3QgeHlGbiA9ICgpID0+IHtcbiAgY29uc3Qgb3V0ID0gamVzdC5mbigobikgPT4gbik7XG4gIG91dC5pbnZlcnQgPSBqZXN0LmZuKChuKSA9PiBuKTtcbiAgcmV0dXJuIG91dDtcbn07XG5cbmNvbnN0IGdldEdyYXBoUHJvcHMgPSAoKSA9PiAoe1xuICBzY2FsZToge1xuICAgIHg6IHh5Rm4oKSxcbiAgICB5OiB4eUZuKCksXG4gIH0sXG4gIHNuYXA6IHtcbiAgICB4OiB4eUZuKCksXG4gICAgeTogeHlGbigpLFxuICB9LFxuICBkb21haW46IHtcbiAgICBtaW46IDAsXG4gICAgbWF4OiAxLFxuICAgIHN0ZXA6IDEsXG4gIH0sXG4gIHJhbmdlOiB7XG4gICAgbWluOiAwLFxuICAgIG1heDogMSxcbiAgICBzdGVwOiAxLFxuICB9LFxuICBzaXplOiB7XG4gICAgd2lkdGg6IDUwMCxcbiAgICBoZWlnaHQ6IDUwMCxcbiAgfSxcbiAgZ2V0Um9vdE5vZGU6ICgpID0+ICh7XG4gICAgb3duZXJTVkdFbGVtZW50OiBudWxsLFxuICAgIGdldEJvdW5kaW5nQ2xpZW50UmVjdDogKCkgPT4gKHtcbiAgICAgIGxlZnQ6IDAsXG4gICAgICB0b3A6IDAsXG4gICAgICByaWdodDogMTAwLFxuICAgICAgYm90dG9tOiAxMDAsXG4gICAgfSksXG4gIH0pLFxufSk7XG5cbmRlc2NyaWJlKCdncmlkRHJhZ2dhYmxlJywgKCkgPT4ge1xuICBsZXQgZGVmYXVsdE9wdGlvbnM7XG4gIGxldCBkZWZhdWx0UHJvcHM7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgbW9ja0RyYWdnYWJsZUNvcmVQcm9wcyA9IG51bGw7XG4gICAgZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgICBhbmNob3JQb2ludDogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSh7IHg6IDAsIHk6IDAgfSksXG4gICAgICBib3VuZHM6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoeyBsZWZ0OiAwLCB0b3A6IDAsIGJvdHRvbTogMCwgcmlnaHQ6IDAgfSksXG4gICAgICBmcm9tRGVsdGE6IGplc3QuZm4oKSxcbiAgICB9O1xuXG4gICAgZGVmYXVsdFByb3BzID0ge1xuICAgICAgZ3JhcGhQcm9wczogZ2V0R3JhcGhQcm9wcygpLFxuICAgIH07XG4gIH0pO1xuXG4gIGl0KCdyZW5kZXJzIHJlZ3VsYXIgY29tcG9uZW50JywgKCkgPT4ge1xuICAgIGNvbnN0IENvbXAgPSBncmlkRHJhZ2dhYmxlKGRlZmF1bHRPcHRpb25zKSgoKSA9PiA8ZGl2PlRlc3Q8L2Rpdj4pO1xuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPENvbXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgfSk7XG5cbiAgaXQoJ3JlbmRlcnMgd2l0aCBkZWNpbWFsIGRvbWFpbiBhbmQgcmFuZ2UnLCAoKSA9PiB7XG4gICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICBncmFwaFByb3BzOiB7XG4gICAgICAgIC4uLmdldEdyYXBoUHJvcHMoKSxcbiAgICAgICAgZG9tYWluOiB7XG4gICAgICAgICAgbWluOiAtMS41LFxuICAgICAgICAgIG1heDogMS42LFxuICAgICAgICAgIHN0ZXA6IDAuMyxcbiAgICAgICAgfSxcbiAgICAgICAgcmFuZ2U6IHtcbiAgICAgICAgICBtaW46IC0yLFxuICAgICAgICAgIG1heDogMyxcbiAgICAgICAgICBzdGVwOiAwLjIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gICAgY29uc3QgQ29tcCA9IGdyaWREcmFnZ2FibGUoZGVmYXVsdE9wdGlvbnMpKCgpID0+IDxkaXY+VGVzdDwvZGl2Pik7XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8Q29tcCB7Li4ucHJvcHN9IC8+KTtcbiAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdsb2dpYycsICgpID0+IHtcbiAgICBkZXNjcmliZSgnZ3JpZCBjYWxjdWxhdGlvbicsICgpID0+IHtcbiAgICAgIGl0KCdwYXNzZXMgY29ycmVjdCBncmlkIHRvIERyYWdnYWJsZUNvcmUgYmFzZWQgb24gZG9tYWluIGFuZCByYW5nZSBzdGVwJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBDb21wID0gZ3JpZERyYWdnYWJsZShkZWZhdWx0T3B0aW9ucykoKCkgPT4gPGRpdj5UZXN0PC9kaXY+KTtcbiAgICAgICAgcmVuZGVyKDxDb21wIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcblxuICAgICAgICAvLyBHcmlkIGlzIGNhbGN1bGF0ZWQgYXM6IHNjYWxlLngoZG9tYWluLnN0ZXApIC0gc2NhbGUueCgwKVxuICAgICAgICAvLyBXaXRoIG91ciBtb2NrIHh5Rm4gdGhhdCByZXR1cm5zIG4sIHRoaXMgaXM6IHN0ZXAgLSAwID0gc3RlcFxuICAgICAgICBleHBlY3QobW9ja0RyYWdnYWJsZUNvcmVQcm9wcy5ncmlkKS50b0VxdWFsKFsxLCAxXSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2NhbGN1bGF0ZXMgZ3JpZCB3aXRoIGRlY2ltYWwgc3RlcHMnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgICBncmFwaFByb3BzOiB7XG4gICAgICAgICAgICAuLi5nZXRHcmFwaFByb3BzKCksXG4gICAgICAgICAgICBkb21haW46IHsgbWluOiAtMS41LCBtYXg6IDEuNiwgc3RlcDogMC4zIH0sXG4gICAgICAgICAgICByYW5nZTogeyBtaW46IC0yLCBtYXg6IDMsIHN0ZXA6IDAuMiB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IENvbXAgPSBncmlkRHJhZ2dhYmxlKGRlZmF1bHRPcHRpb25zKSgoKSA9PiA8ZGl2PlRlc3Q8L2Rpdj4pO1xuICAgICAgICByZW5kZXIoPENvbXAgey4uLnByb3BzfSAvPik7XG5cbiAgICAgICAgZXhwZWN0KG1vY2tEcmFnZ2FibGVDb3JlUHJvcHMuZ3JpZCkudG9FcXVhbChbMC4zLCAwLjJdKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ29uU3RhcnQnLCAoKSA9PiB7XG4gICAgICBpdCgnY2FsbHMgb25EcmFnU3RhcnQgaGFuZGxlciB3aGVuIGRyYWcgc3RhcnRzJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBvbkRyYWdTdGFydCA9IGplc3QuZm4oKTtcbiAgICAgICAgY29uc3QgcHJvcHMgPSB7IC4uLmRlZmF1bHRQcm9wcywgb25EcmFnU3RhcnQgfTtcbiAgICAgICAgY29uc3QgQ29tcCA9IGdyaWREcmFnZ2FibGUoZGVmYXVsdE9wdGlvbnMpKCgpID0+IDxkaXY+VGVzdDwvZGl2Pik7XG4gICAgICAgIHJlbmRlcig8Q29tcCB7Li4ucHJvcHN9IC8+KTtcblxuICAgICAgICAvLyBTaW11bGF0ZSBkcmFnIHN0YXJ0XG4gICAgICAgIG1vY2tEcmFnZ2FibGVDb3JlUHJvcHMub25TdGFydCh7IGNsaWVudFg6IDEwMCwgY2xpZW50WTogMTAwIH0pO1xuXG4gICAgICAgIGV4cGVjdChvbkRyYWdTdGFydCkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnb25EcmFnJywgKCkgPT4ge1xuICAgICAgaXQoJ2NhbGxzIG9uRHJhZyBjYWxsYmFjayB3aXRoIHJlc3VsdCBmcm9tIGZyb21EZWx0YScsICgpID0+IHtcbiAgICAgICAgY29uc3Qgb25EcmFnID0gamVzdC5mbigpO1xuICAgICAgICBjb25zdCBmcm9tRGVsdGEgPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKCdkZWx0YS1yZXN1bHQnKTtcbiAgICAgICAgY29uc3QgYm91bmRzID0gamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSh7IGxlZnQ6IC0xMDAsIHRvcDogLTEwMCwgYm90dG9tOiAxMDAsIHJpZ2h0OiAxMDAgfSk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7IC4uLmRlZmF1bHRPcHRpb25zLCBmcm9tRGVsdGEsIGJvdW5kcyB9O1xuICAgICAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdFByb3BzLCBvbkRyYWcgfTtcblxuICAgICAgICBjb25zdCBDb21wID0gZ3JpZERyYWdnYWJsZShvcHRpb25zKSgoKSA9PiA8ZGl2PlRlc3Q8L2Rpdj4pO1xuICAgICAgICByZW5kZXIoPENvbXAgey4uLnByb3BzfSAvPik7XG5cbiAgICAgICAgLy8gU2V0IHVwIGRyYWcgc3RhcnQgc3RhdGVcbiAgICAgICAgbW9ja0RyYWdnYWJsZUNvcmVQcm9wcy5vblN0YXJ0KHsgY2xpZW50WDogMCwgY2xpZW50WTogMCB9KTtcblxuICAgICAgICAvLyBTaW11bGF0ZSBkcmFnXG4gICAgICAgIG1vY2tEcmFnZ2FibGVDb3JlUHJvcHMub25EcmFnKHt9LCB7IGRlbHRhWDogMTAsIGRlbHRhWTogMTAgfSk7XG5cbiAgICAgICAgZXhwZWN0KGZyb21EZWx0YSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgICBleHBlY3Qob25EcmFnKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnZGVsdGEtcmVzdWx0Jyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2RvZXMgbm90IGNhbGwgb25EcmFnIHdoZW4gbm8gb25EcmFnIGhhbmRsZXIgaXMgcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZyb21EZWx0YSA9IGplc3QuZm4oKTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHsgLi4uZGVmYXVsdE9wdGlvbnMsIGZyb21EZWx0YSB9O1xuICAgICAgICBjb25zdCBDb21wID0gZ3JpZERyYWdnYWJsZShvcHRpb25zKSgoKSA9PiA8ZGl2PlRlc3Q8L2Rpdj4pO1xuICAgICAgICByZW5kZXIoPENvbXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuXG4gICAgICAgIG1vY2tEcmFnZ2FibGVDb3JlUHJvcHMub25TdGFydCh7IGNsaWVudFg6IDAsIGNsaWVudFk6IDAgfSk7XG4gICAgICAgIG1vY2tEcmFnZ2FibGVDb3JlUHJvcHMub25EcmFnKHt9LCB7IGRlbHRhWDogMTAsIGRlbHRhWTogMTAgfSk7XG5cbiAgICAgICAgZXhwZWN0KGZyb21EZWx0YSkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgnYm91bmRzIGNoZWNraW5nJywgKCkgPT4ge1xuICAgICAgICBpdCgnZG9lcyBub3QgY2FsbCBvbkRyYWcgd2hlbiBkcmFnZ2luZyBsZWZ0IGJleW9uZCBsZWZ0IGJvdW5kJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG9uRHJhZyA9IGplc3QuZm4oKTtcbiAgICAgICAgICBjb25zdCBib3VuZHMgPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKHsgbGVmdDogMCwgdG9wOiAwLCBib3R0b206IDAsIHJpZ2h0OiAwIH0pO1xuICAgICAgICAgIGNvbnN0IGZyb21EZWx0YSA9IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoJ3Jlc3VsdCcpO1xuICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7IC4uLmRlZmF1bHRPcHRpb25zLCBib3VuZHMsIGZyb21EZWx0YSB9O1xuICAgICAgICAgIGNvbnN0IHByb3BzID0geyAuLi5kZWZhdWx0UHJvcHMsIG9uRHJhZyB9O1xuXG4gICAgICAgICAgY29uc3QgQ29tcCA9IGdyaWREcmFnZ2FibGUob3B0aW9ucykoKCkgPT4gPGRpdj5UZXN0PC9kaXY+KTtcbiAgICAgICAgICByZW5kZXIoPENvbXAgey4uLnByb3BzfSAvPik7XG5cbiAgICAgICAgICBtb2NrRHJhZ2dhYmxlQ29yZVByb3BzLm9uU3RhcnQoeyBjbGllbnRYOiAwLCBjbGllbnRZOiAwIH0pO1xuICAgICAgICAgIC8vIGRlbHRhWCA8IDAgYW5kIGRlbHRhWCA8IHNjYWxlZCBib3VuZHMubGVmdCAoMCksIHNvIC0xMCA8IDAgdHJpZ2dlcnMgZWFybHkgcmV0dXJuXG4gICAgICAgICAgbW9ja0RyYWdnYWJsZUNvcmVQcm9wcy5vbkRyYWcoe30sIHsgZGVsdGFYOiAtMTAsIGRlbHRhWTogMCB9KTtcblxuICAgICAgICAgIGV4cGVjdChvbkRyYWcpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdkb2VzIG5vdCBjYWxsIG9uRHJhZyB3aGVuIGRyYWdnaW5nIHJpZ2h0IGJleW9uZCByaWdodCBib3VuZCcsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBvbkRyYWcgPSBqZXN0LmZuKCk7XG4gICAgICAgICAgY29uc3QgYm91bmRzID0gamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSh7IGxlZnQ6IDAsIHRvcDogMCwgYm90dG9tOiAwLCByaWdodDogMCB9KTtcbiAgICAgICAgICBjb25zdCBmcm9tRGVsdGEgPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKCdyZXN1bHQnKTtcbiAgICAgICAgICBjb25zdCBvcHRpb25zID0geyAuLi5kZWZhdWx0T3B0aW9ucywgYm91bmRzLCBmcm9tRGVsdGEgfTtcbiAgICAgICAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdFByb3BzLCBvbkRyYWcgfTtcblxuICAgICAgICAgIGNvbnN0IENvbXAgPSBncmlkRHJhZ2dhYmxlKG9wdGlvbnMpKCgpID0+IDxkaXY+VGVzdDwvZGl2Pik7XG4gICAgICAgICAgcmVuZGVyKDxDb21wIHsuLi5wcm9wc30gLz4pO1xuXG4gICAgICAgICAgbW9ja0RyYWdnYWJsZUNvcmVQcm9wcy5vblN0YXJ0KHsgY2xpZW50WDogMCwgY2xpZW50WTogMCB9KTtcbiAgICAgICAgICAvLyBkZWx0YVggPiAwIGFuZCBkZWx0YVggPiBzY2FsZWQgYm91bmRzLnJpZ2h0ICgwKSwgc28gMTAgPiAwIHRyaWdnZXJzIGVhcmx5IHJldHVyblxuICAgICAgICAgIG1vY2tEcmFnZ2FibGVDb3JlUHJvcHMub25EcmFnKHt9LCB7IGRlbHRhWDogMTAsIGRlbHRhWTogMCB9KTtcblxuICAgICAgICAgIGV4cGVjdChvbkRyYWcpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdkb2VzIG5vdCBjYWxsIG9uRHJhZyB3aGVuIGRyYWdnaW5nIHVwIGJleW9uZCB0b3AgYm91bmQnLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgb25EcmFnID0gamVzdC5mbigpO1xuICAgICAgICAgIGNvbnN0IGJvdW5kcyA9IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoeyBsZWZ0OiAtMTAwLCB0b3A6IDAsIGJvdHRvbTogMCwgcmlnaHQ6IDEwMCB9KTtcbiAgICAgICAgICBjb25zdCBmcm9tRGVsdGEgPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKCdyZXN1bHQnKTtcbiAgICAgICAgICBjb25zdCBvcHRpb25zID0geyAuLi5kZWZhdWx0T3B0aW9ucywgYm91bmRzLCBmcm9tRGVsdGEgfTtcbiAgICAgICAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdFByb3BzLCBvbkRyYWcgfTtcblxuICAgICAgICAgIGNvbnN0IENvbXAgPSBncmlkRHJhZ2dhYmxlKG9wdGlvbnMpKCgpID0+IDxkaXY+VGVzdDwvZGl2Pik7XG4gICAgICAgICAgcmVuZGVyKDxDb21wIHsuLi5wcm9wc30gLz4pO1xuXG4gICAgICAgICAgbW9ja0RyYWdnYWJsZUNvcmVQcm9wcy5vblN0YXJ0KHsgY2xpZW50WDogMCwgY2xpZW50WTogMCB9KTtcbiAgICAgICAgICAvLyBkZWx0YVkgPCAwIGFuZCBkZWx0YVkgPCBzY2FsZWQgYm91bmRzLnRvcCAoMCksIHNvIC0xMCA8IDAgdHJpZ2dlcnMgZWFybHkgcmV0dXJuXG4gICAgICAgICAgbW9ja0RyYWdnYWJsZUNvcmVQcm9wcy5vbkRyYWcoe30sIHsgZGVsdGFYOiAwLCBkZWx0YVk6IC0xMCB9KTtcblxuICAgICAgICAgIGV4cGVjdChvbkRyYWcpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdkb2VzIG5vdCBjYWxsIG9uRHJhZyB3aGVuIGRyYWdnaW5nIGRvd24gYmV5b25kIGJvdHRvbSBib3VuZCcsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBvbkRyYWcgPSBqZXN0LmZuKCk7XG4gICAgICAgICAgY29uc3QgYm91bmRzID0gamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSh7IGxlZnQ6IC0xMDAsIHRvcDogLTEwMCwgYm90dG9tOiAwLCByaWdodDogMTAwIH0pO1xuICAgICAgICAgIGNvbnN0IGZyb21EZWx0YSA9IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoJ3Jlc3VsdCcpO1xuICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7IC4uLmRlZmF1bHRPcHRpb25zLCBib3VuZHMsIGZyb21EZWx0YSB9O1xuICAgICAgICAgIGNvbnN0IHByb3BzID0geyAuLi5kZWZhdWx0UHJvcHMsIG9uRHJhZyB9O1xuXG4gICAgICAgICAgY29uc3QgQ29tcCA9IGdyaWREcmFnZ2FibGUob3B0aW9ucykoKCkgPT4gPGRpdj5UZXN0PC9kaXY+KTtcbiAgICAgICAgICByZW5kZXIoPENvbXAgey4uLnByb3BzfSAvPik7XG5cbiAgICAgICAgICBtb2NrRHJhZ2dhYmxlQ29yZVByb3BzLm9uU3RhcnQoeyBjbGllbnRYOiAwLCBjbGllbnRZOiAwIH0pO1xuICAgICAgICAgIC8vIGRlbHRhWSA+IDAgYW5kIGRlbHRhWSA+IHNjYWxlZCBib3VuZHMuYm90dG9tICgwKSwgc28gMTAgPiAwIHRyaWdnZXJzIGVhcmx5IHJldHVyblxuICAgICAgICAgIG1vY2tEcmFnZ2FibGVDb3JlUHJvcHMub25EcmFnKHt9LCB7IGRlbHRhWDogMCwgZGVsdGFZOiAxMCB9KTtcblxuICAgICAgICAgIGV4cGVjdChvbkRyYWcpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdjYWxscyBvbkRyYWcgd2hlbiBkcmFnZ2luZyB3aXRoaW4gYm91bmRzJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG9uRHJhZyA9IGplc3QuZm4oKTtcbiAgICAgICAgICBjb25zdCBib3VuZHMgPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKHsgbGVmdDogLTEwMCwgdG9wOiAtMTAwLCBib3R0b206IDEwMCwgcmlnaHQ6IDEwMCB9KTtcbiAgICAgICAgICBjb25zdCBmcm9tRGVsdGEgPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKCdyZXN1bHQnKTtcbiAgICAgICAgICBjb25zdCBvcHRpb25zID0geyAuLi5kZWZhdWx0T3B0aW9ucywgYm91bmRzLCBmcm9tRGVsdGEgfTtcbiAgICAgICAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdFByb3BzLCBvbkRyYWcgfTtcblxuICAgICAgICAgIGNvbnN0IENvbXAgPSBncmlkRHJhZ2dhYmxlKG9wdGlvbnMpKCgpID0+IDxkaXY+VGVzdDwvZGl2Pik7XG4gICAgICAgICAgcmVuZGVyKDxDb21wIHsuLi5wcm9wc30gLz4pO1xuXG4gICAgICAgICAgbW9ja0RyYWdnYWJsZUNvcmVQcm9wcy5vblN0YXJ0KHsgY2xpZW50WDogMCwgY2xpZW50WTogMCB9KTtcbiAgICAgICAgICAvLyBBbGwgYm91bmQgY2hlY2tzIHBhc3M6IGRlbHRhWCAoLTEwKSBpcyBOT1QgPCBib3VuZHMubGVmdCAoLTEwMCkgYW5kIE5PVCA+IGJvdW5kcy5yaWdodCAoMTAwKVxuICAgICAgICAgIC8vIFNpbWlsYXJseSBmb3IgZGVsdGFZXG4gICAgICAgICAgbW9ja0RyYWdnYWJsZUNvcmVQcm9wcy5vbkRyYWcoe30sIHsgZGVsdGFYOiAtMTAsIGRlbHRhWTogMTAgfSk7XG5cbiAgICAgICAgICBleHBlY3Qob25EcmFnKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGRlc2NyaWJlKCdza2lwRHJhZ091dHNpZGVPZkJvdW5kcycsICgpID0+IHtcbiAgICAgICAgaXQoJ3NraXBzIGRyYWcgd2hlbiBtb3ZpbmcgbGVmdCBhbmQgeCBpcyBiZWxvdyBkb21haW4ubWluJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG9uRHJhZyA9IGplc3QuZm4oKTtcbiAgICAgICAgICBjb25zdCBncmFwaFByb3BzID0ge1xuICAgICAgICAgICAgLi4uZ2V0R3JhcGhQcm9wcygpLFxuICAgICAgICAgICAgZG9tYWluOiB7IG1pbjogLTUsIG1heDogNSwgc3RlcDogMSB9LFxuICAgICAgICAgICAgcmFuZ2U6IHsgbWluOiAtNSwgbWF4OiA1LCBzdGVwOiAxIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgICBncmFwaFByb3BzLnNjYWxlLnguaW52ZXJ0ID0gamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSgtNik7IC8vIEJlbG93IG1pblxuXG4gICAgICAgICAgY29uc3QgcHJvcHMgPSB7IC4uLmRlZmF1bHRQcm9wcywgZ3JhcGhQcm9wcywgb25EcmFnIH07XG4gICAgICAgICAgY29uc3QgYm91bmRzID0gamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSh7IGxlZnQ6IDEwMCwgdG9wOiAxMDAsIGJvdHRvbTogMTAwLCByaWdodDogMTAwIH0pO1xuICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7IC4uLmRlZmF1bHRPcHRpb25zLCBib3VuZHMgfTtcblxuICAgICAgICAgIGNvbnN0IENvbXAgPSBncmlkRHJhZ2dhYmxlKG9wdGlvbnMpKCgpID0+IDxkaXY+VGVzdDwvZGl2Pik7XG4gICAgICAgICAgcmVuZGVyKDxDb21wIHsuLi5wcm9wc30gLz4pO1xuXG4gICAgICAgICAgbW9ja0RyYWdnYWJsZUNvcmVQcm9wcy5vblN0YXJ0KHsgY2xpZW50WDogMCwgY2xpZW50WTogMCB9KTtcbiAgICAgICAgICBtb2NrRHJhZ2dhYmxlQ29yZVByb3BzLm9uRHJhZyh7fSwgeyBkZWx0YVg6IDEsIGRlbHRhWTogMCB9KTtcblxuICAgICAgICAgIGV4cGVjdChvbkRyYWcpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdza2lwcyBkcmFnIHdoZW4gbW92aW5nIHJpZ2h0IGFuZCB4IGlzIGFib3ZlIGRvbWFpbi5tYXgnLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgb25EcmFnID0gamVzdC5mbigpO1xuICAgICAgICAgIGNvbnN0IGdyYXBoUHJvcHMgPSB7XG4gICAgICAgICAgICAuLi5nZXRHcmFwaFByb3BzKCksXG4gICAgICAgICAgICBkb21haW46IHsgbWluOiAtNSwgbWF4OiA1LCBzdGVwOiAxIH0sXG4gICAgICAgICAgICByYW5nZTogeyBtaW46IC01LCBtYXg6IDUsIHN0ZXA6IDEgfSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGdyYXBoUHJvcHMuc2NhbGUueC5pbnZlcnQgPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKDYpOyAvLyBBYm92ZSBtYXhcblxuICAgICAgICAgIGNvbnN0IHByb3BzID0geyAuLi5kZWZhdWx0UHJvcHMsIGdyYXBoUHJvcHMsIG9uRHJhZyB9O1xuICAgICAgICAgIGNvbnN0IGJvdW5kcyA9IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoeyBsZWZ0OiAxMDAsIHRvcDogMTAwLCBib3R0b206IDEwMCwgcmlnaHQ6IDEwMCB9KTtcbiAgICAgICAgICBjb25zdCBvcHRpb25zID0geyAuLi5kZWZhdWx0T3B0aW9ucywgYm91bmRzIH07XG5cbiAgICAgICAgICBjb25zdCBDb21wID0gZ3JpZERyYWdnYWJsZShvcHRpb25zKSgoKSA9PiA8ZGl2PlRlc3Q8L2Rpdj4pO1xuICAgICAgICAgIHJlbmRlcig8Q29tcCB7Li4ucHJvcHN9IC8+KTtcblxuICAgICAgICAgIG1vY2tEcmFnZ2FibGVDb3JlUHJvcHMub25TdGFydCh7IGNsaWVudFg6IDAsIGNsaWVudFk6IDAgfSk7XG4gICAgICAgICAgbW9ja0RyYWdnYWJsZUNvcmVQcm9wcy5vbkRyYWcoe30sIHsgZGVsdGFYOiAtMSwgZGVsdGFZOiAwIH0pO1xuXG4gICAgICAgICAgZXhwZWN0KG9uRHJhZykubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3NraXBzIGRyYWcgd2hlbiBtb3ZpbmcgdXAgYW5kIHkgaXMgYWJvdmUgcmFuZ2UubWF4JywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG9uRHJhZyA9IGplc3QuZm4oKTtcbiAgICAgICAgICBjb25zdCBncmFwaFByb3BzID0ge1xuICAgICAgICAgICAgLi4uZ2V0R3JhcGhQcm9wcygpLFxuICAgICAgICAgICAgZG9tYWluOiB7IG1pbjogLTUsIG1heDogNSwgc3RlcDogMSB9LFxuICAgICAgICAgICAgcmFuZ2U6IHsgbWluOiAtNSwgbWF4OiA1LCBzdGVwOiAxIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgICBncmFwaFByb3BzLnNjYWxlLnkuaW52ZXJ0ID0gamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSg2KTsgLy8gQWJvdmUgbWF4XG5cbiAgICAgICAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdFByb3BzLCBncmFwaFByb3BzLCBvbkRyYWcgfTtcbiAgICAgICAgICBjb25zdCBib3VuZHMgPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKHsgbGVmdDogMTAwLCB0b3A6IDEwMCwgYm90dG9tOiAxMDAsIHJpZ2h0OiAxMDAgfSk7XG4gICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHsgLi4uZGVmYXVsdE9wdGlvbnMsIGJvdW5kcyB9O1xuXG4gICAgICAgICAgY29uc3QgQ29tcCA9IGdyaWREcmFnZ2FibGUob3B0aW9ucykoKCkgPT4gPGRpdj5UZXN0PC9kaXY+KTtcbiAgICAgICAgICByZW5kZXIoPENvbXAgey4uLnByb3BzfSAvPik7XG5cbiAgICAgICAgICBtb2NrRHJhZ2dhYmxlQ29yZVByb3BzLm9uU3RhcnQoeyBjbGllbnRYOiAwLCBjbGllbnRZOiAwIH0pO1xuICAgICAgICAgIG1vY2tEcmFnZ2FibGVDb3JlUHJvcHMub25EcmFnKHt9LCB7IGRlbHRhWDogMCwgZGVsdGFZOiAxIH0pO1xuXG4gICAgICAgICAgZXhwZWN0KG9uRHJhZykubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3NraXBzIGRyYWcgd2hlbiBtb3ZpbmcgZG93biBhbmQgeSBpcyBiZWxvdyByYW5nZS5taW4nLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgb25EcmFnID0gamVzdC5mbigpO1xuICAgICAgICAgIGNvbnN0IGdyYXBoUHJvcHMgPSB7XG4gICAgICAgICAgICAuLi5nZXRHcmFwaFByb3BzKCksXG4gICAgICAgICAgICBkb21haW46IHsgbWluOiAtNSwgbWF4OiA1LCBzdGVwOiAxIH0sXG4gICAgICAgICAgICByYW5nZTogeyBtaW46IC01LCBtYXg6IDUsIHN0ZXA6IDEgfSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGdyYXBoUHJvcHMuc2NhbGUueS5pbnZlcnQgPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKC02KTsgLy8gQmVsb3cgbWluXG5cbiAgICAgICAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdFByb3BzLCBncmFwaFByb3BzLCBvbkRyYWcgfTtcbiAgICAgICAgICBjb25zdCBib3VuZHMgPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKHsgbGVmdDogMTAwLCB0b3A6IDEwMCwgYm90dG9tOiAxMDAsIHJpZ2h0OiAxMDAgfSk7XG4gICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHsgLi4uZGVmYXVsdE9wdGlvbnMsIGJvdW5kcyB9O1xuXG4gICAgICAgICAgY29uc3QgQ29tcCA9IGdyaWREcmFnZ2FibGUob3B0aW9ucykoKCkgPT4gPGRpdj5UZXN0PC9kaXY+KTtcbiAgICAgICAgICByZW5kZXIoPENvbXAgey4uLnByb3BzfSAvPik7XG5cbiAgICAgICAgICBtb2NrRHJhZ2dhYmxlQ29yZVByb3BzLm9uU3RhcnQoeyBjbGllbnRYOiAwLCBjbGllbnRZOiAwIH0pO1xuICAgICAgICAgIG1vY2tEcmFnZ2FibGVDb3JlUHJvcHMub25EcmFnKHt9LCB7IGRlbHRhWDogMCwgZGVsdGFZOiAtMSB9KTtcblxuICAgICAgICAgIGV4cGVjdChvbkRyYWcpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdhbGxvd3MgZHJhZyB3aGVuIHdpdGhpbiBkb21haW4gYW5kIHJhbmdlJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG9uRHJhZyA9IGplc3QuZm4oKTtcbiAgICAgICAgICBjb25zdCBncmFwaFByb3BzID0ge1xuICAgICAgICAgICAgLi4uZ2V0R3JhcGhQcm9wcygpLFxuICAgICAgICAgICAgZG9tYWluOiB7IG1pbjogLTUsIG1heDogNSwgc3RlcDogMSB9LFxuICAgICAgICAgICAgcmFuZ2U6IHsgbWluOiAtNSwgbWF4OiA1LCBzdGVwOiAxIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgICBncmFwaFByb3BzLnNjYWxlLnguaW52ZXJ0ID0gamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSgzKTsgLy8gV2l0aGluIGJvdW5kc1xuICAgICAgICAgIGdyYXBoUHJvcHMuc2NhbGUueS5pbnZlcnQgPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKDIpOyAvLyBXaXRoaW4gYm91bmRzXG5cbiAgICAgICAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdFByb3BzLCBncmFwaFByb3BzLCBvbkRyYWcgfTtcbiAgICAgICAgICBjb25zdCBib3VuZHMgPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKHsgbGVmdDogLTEwMCwgdG9wOiAtMTAwLCBib3R0b206IDEwMCwgcmlnaHQ6IDEwMCB9KTtcbiAgICAgICAgICBjb25zdCBvcHRpb25zID0geyAuLi5kZWZhdWx0T3B0aW9ucywgYm91bmRzIH07XG5cbiAgICAgICAgICBjb25zdCBDb21wID0gZ3JpZERyYWdnYWJsZShvcHRpb25zKSgoKSA9PiA8ZGl2PlRlc3Q8L2Rpdj4pO1xuICAgICAgICAgIHJlbmRlcig8Q29tcCB7Li4ucHJvcHN9IC8+KTtcblxuICAgICAgICAgIG1vY2tEcmFnZ2FibGVDb3JlUHJvcHMub25TdGFydCh7IGNsaWVudFg6IDAsIGNsaWVudFk6IDAgfSk7XG4gICAgICAgICAgbW9ja0RyYWdnYWJsZUNvcmVQcm9wcy5vbkRyYWcoe30sIHsgZGVsdGFYOiAxLCBkZWx0YVk6IC0xIH0pO1xuXG4gICAgICAgICAgZXhwZWN0KG9uRHJhZykudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2dldERlbHRhIGFuZCBhcHBseURlbHRhJywgKCkgPT4ge1xuICAgICAgaXQoJ2NhbGxzIHV0aWxzLmdldERlbHRhIHdoZW4gcHJvY2Vzc2luZyBkcmFnJywgKCkgPT4ge1xuICAgICAgICBnZXREZWx0YS5tb2NrQ2xlYXIoKTtcbiAgICAgICAgY29uc3Qgb25EcmFnID0gamVzdC5mbigpO1xuICAgICAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdFByb3BzLCBvbkRyYWcgfTtcbiAgICAgICAgY29uc3QgYm91bmRzID0gamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSh7IGxlZnQ6IC0xMDAsIHRvcDogLTEwMCwgYm90dG9tOiAxMDAsIHJpZ2h0OiAxMDAgfSk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7IC4uLmRlZmF1bHRPcHRpb25zLCBib3VuZHMgfTtcblxuICAgICAgICBjb25zdCBDb21wID0gZ3JpZERyYWdnYWJsZShvcHRpb25zKSgoKSA9PiA8ZGl2PlRlc3Q8L2Rpdj4pO1xuICAgICAgICByZW5kZXIoPENvbXAgey4uLnByb3BzfSAvPik7XG5cbiAgICAgICAgbW9ja0RyYWdnYWJsZUNvcmVQcm9wcy5vblN0YXJ0KHsgY2xpZW50WDogMCwgY2xpZW50WTogMCB9KTtcbiAgICAgICAgbW9ja0RyYWdnYWJsZUNvcmVQcm9wcy5vbkRyYWcoe30sIHsgZGVsdGFYOiAxMCwgZGVsdGFZOiAxMCB9KTtcblxuICAgICAgICBleHBlY3QoZ2V0RGVsdGEpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnY2FsbHMgZnJvbURlbHRhIHdpdGggcmVzdWx0IGZyb20gZ2V0RGVsdGEnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZyb21EZWx0YSA9IGplc3QuZm4oKTtcbiAgICAgICAgZ2V0RGVsdGEubW9ja1JldHVyblZhbHVlKHsgeDogNSwgeTogNSB9KTtcbiAgICAgICAgY29uc3QgYm91bmRzID0gamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSh7IGxlZnQ6IC0xMDAsIHRvcDogLTEwMCwgYm90dG9tOiAxMDAsIHJpZ2h0OiAxMDAgfSk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7IC4uLmRlZmF1bHRPcHRpb25zLCBmcm9tRGVsdGEsIGJvdW5kcyB9O1xuICAgICAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdFByb3BzLCBvbkRyYWc6IGplc3QuZm4oKSB9O1xuXG4gICAgICAgIGNvbnN0IENvbXAgPSBncmlkRHJhZ2dhYmxlKG9wdGlvbnMpKCgpID0+IDxkaXY+VGVzdDwvZGl2Pik7XG4gICAgICAgIHJlbmRlcig8Q29tcCB7Li4ucHJvcHN9IC8+KTtcblxuICAgICAgICBtb2NrRHJhZ2dhYmxlQ29yZVByb3BzLm9uU3RhcnQoeyBjbGllbnRYOiAwLCBjbGllbnRZOiAwIH0pO1xuICAgICAgICBtb2NrRHJhZ2dhYmxlQ29yZVByb3BzLm9uRHJhZyh7fSwgeyBkZWx0YVg6IDEwLCBkZWx0YVk6IDEwIH0pO1xuXG4gICAgICAgIGV4cGVjdChmcm9tRGVsdGEpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ29uU3RvcCcsICgpID0+IHtcbiAgICAgIGl0KCdjYWxscyBvbkRyYWdTdG9wIHdoZW4gZHJhZyBzdG9wcycsICgpID0+IHtcbiAgICAgICAgY29uc3Qgb25EcmFnU3RvcCA9IGplc3QuZm4oKTtcbiAgICAgICAgY29uc3QgcHJvcHMgPSB7IC4uLmRlZmF1bHRQcm9wcywgb25EcmFnU3RvcCB9O1xuXG4gICAgICAgIGNvbnN0IENvbXAgPSBncmlkRHJhZ2dhYmxlKGRlZmF1bHRPcHRpb25zKSgoKSA9PiA8ZGl2PlRlc3Q8L2Rpdj4pO1xuICAgICAgICByZW5kZXIoPENvbXAgey4uLnByb3BzfSAvPik7XG5cbiAgICAgICAgLy8gU3RhcnQgdG8gc2V0IHVwIHN0YXRlXG4gICAgICAgIG1vY2tEcmFnZ2FibGVDb3JlUHJvcHMub25TdGFydCh7IGNsaWVudFg6IDAsIGNsaWVudFk6IDAgfSk7XG5cbiAgICAgICAgLy8gU3RvcCB3aXRoIGxhcmdlIG1vdmVtZW50IChub3QgdGlueSlcbiAgICAgICAgbW9ja0RyYWdnYWJsZUNvcmVQcm9wcy5vblN0b3AoeyBjbGllbnRYOiAxMDAsIGNsaWVudFk6IDEwMCB9LCB7fSk7XG5cbiAgICAgICAgZXhwZWN0KG9uRHJhZ1N0b3ApLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnY2FsbHMgb25DbGljayBpbnN0ZWFkIG9mIG9uRHJhZ1N0b3Agd2hlbiBtb3ZlbWVudCBpcyB0aW55JywgKCkgPT4ge1xuICAgICAgICBjb25zdCBvbkNsaWNrID0gamVzdC5mbigpO1xuICAgICAgICBjb25zdCBvbkRyYWdTdG9wID0gamVzdC5mbigpO1xuICAgICAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdFByb3BzLCBvbkNsaWNrLCBvbkRyYWdTdG9wIH07XG5cbiAgICAgICAgY2xpZW50UG9pbnQubW9ja1JldHVyblZhbHVlKFswLCAwXSk7XG5cbiAgICAgICAgY29uc3QgQ29tcCA9IGdyaWREcmFnZ2FibGUoZGVmYXVsdE9wdGlvbnMpKCgpID0+IDxkaXY+VGVzdDwvZGl2Pik7XG4gICAgICAgIHJlbmRlcig8Q29tcCB7Li4ucHJvcHN9IC8+KTtcblxuICAgICAgICAvLyBTdGFydCBhbmQgc3RvcCBhdCBhbG1vc3QgdGhlIHNhbWUgcG9zaXRpb24gKHRpbnkgbW92ZW1lbnQpXG4gICAgICAgIC8vIEdyaWQgaXMgMXgxLCB0aW55IHRocmVzaG9sZCBpcyBncmlkLzEwID0gMC4xXG4gICAgICAgIG1vY2tEcmFnZ2FibGVDb3JlUHJvcHMub25TdGFydCh7IGNsaWVudFg6IDAsIGNsaWVudFk6IDAgfSk7XG4gICAgICAgIG1vY2tEcmFnZ2FibGVDb3JlUHJvcHMub25TdG9wKHsgY2xpZW50WDogMC4wNSwgY2xpZW50WTogMC4wNSwgdGFyZ2V0OiB7fSB9LCB7fSk7XG5cbiAgICAgICAgZXhwZWN0KG9uQ2xpY2spLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHsgeDogMCwgeTogMCB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnY2FsbHMgb25DbGljayB3aXRoIHNuYXBwZWQgY29vcmRpbmF0ZXMnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9uQ2xpY2sgPSBqZXN0LmZuKCk7XG4gICAgICAgIGNvbnN0IHByb3BzID0geyAuLi5kZWZhdWx0UHJvcHMsIG9uQ2xpY2sgfTtcbiAgICAgICAgY29uc3QgZ3JhcGhQcm9wcyA9IGdldEdyYXBoUHJvcHMoKTtcbiAgICAgICAgZ3JhcGhQcm9wcy5zY2FsZS54LmludmVydCA9IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoMS43KTtcbiAgICAgICAgZ3JhcGhQcm9wcy5zY2FsZS55LmludmVydCA9IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoMi4zKTtcbiAgICAgICAgZ3JhcGhQcm9wcy5zbmFwLnggPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKDIpO1xuICAgICAgICBncmFwaFByb3BzLnNuYXAueSA9IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoMik7XG5cbiAgICAgICAgY2xpZW50UG9pbnQubW9ja1JldHVyblZhbHVlKFsxLjcsIDIuM10pO1xuXG4gICAgICAgIGNvbnN0IHByb3BzV2l0aEdyYXBoUHJvcHMgPSB7IC4uLnByb3BzLCBncmFwaFByb3BzIH07XG4gICAgICAgIGNvbnN0IENvbXAgPSBncmlkRHJhZ2dhYmxlKGRlZmF1bHRPcHRpb25zKSgoKSA9PiA8ZGl2PlRlc3Q8L2Rpdj4pO1xuICAgICAgICByZW5kZXIoPENvbXAgey4uLnByb3BzV2l0aEdyYXBoUHJvcHN9IC8+KTtcblxuICAgICAgICAvLyBTdGFydCBhbmQgc3RvcCBhdCBhbG1vc3QgdGhlIHNhbWUgcG9zaXRpb24gKHRpbnkgbW92ZW1lbnQpXG4gICAgICAgIG1vY2tEcmFnZ2FibGVDb3JlUHJvcHMub25TdGFydCh7IGNsaWVudFg6IDAsIGNsaWVudFk6IDAgfSk7XG4gICAgICAgIG1vY2tEcmFnZ2FibGVDb3JlUHJvcHMub25TdG9wKHsgY2xpZW50WDogMC4wNSwgY2xpZW50WTogMC4wNSwgdGFyZ2V0OiB7fSB9LCB7fSk7XG5cbiAgICAgICAgZXhwZWN0KGdyYXBoUHJvcHMuc25hcC54KS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgxLjcpO1xuICAgICAgICBleHBlY3QoZ3JhcGhQcm9wcy5zbmFwLnkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDIuMyk7XG4gICAgICAgIGV4cGVjdChvbkNsaWNrKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCh7IHg6IDIsIHk6IDIgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLGNBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLE1BQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLFlBQUEsR0FBQUwsT0FBQTtBQUEyQyxTQUFBTSxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FBQSxX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