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