@pie-lib/graphing 3.2.0-next.2 → 3.2.0-next.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/CHANGELOG.md +18 -30
  2. package/LICENSE.md +5 -0
  3. package/lib/axis/arrow.js +1 -1
  4. package/lib/axis/axes.js +1 -1
  5. package/lib/axis/index.js +1 -1
  6. package/lib/bg.js +1 -1
  7. package/lib/container/actions.js +1 -1
  8. package/lib/container/index.js +1 -1
  9. package/lib/container/marks.js +1 -1
  10. package/lib/container/middleware.js +1 -1
  11. package/lib/container/reducer.js +1 -1
  12. package/lib/coordinates-label.js +1 -1
  13. package/lib/graph-with-controls.js +1 -1
  14. package/lib/graph.js +1 -1
  15. package/lib/grid-setup.js +1 -1
  16. package/lib/grid.js +1 -1
  17. package/lib/index.js +1 -1
  18. package/lib/key-legend.js +1 -1
  19. package/lib/label-svg-icon.js +1 -1
  20. package/lib/labels.js +1 -1
  21. package/lib/mark-label.js +1 -1
  22. package/lib/toggle-bar.js +1 -1
  23. package/lib/tool-menu.js +1 -1
  24. package/lib/tools/absolute/component.js +1 -1
  25. package/lib/tools/absolute/index.js +1 -1
  26. package/lib/tools/circle/bg-circle.js +1 -1
  27. package/lib/tools/circle/component.js +1 -1
  28. package/lib/tools/circle/index.js +1 -1
  29. package/lib/tools/exponential/component.js +1 -1
  30. package/lib/tools/exponential/index.js +1 -1
  31. package/lib/tools/index.js +1 -1
  32. package/lib/tools/line/component.js +1 -1
  33. package/lib/tools/line/index.js +1 -1
  34. package/lib/tools/parabola/component.js +1 -1
  35. package/lib/tools/parabola/index.js +1 -1
  36. package/lib/tools/point/component.js +1 -1
  37. package/lib/tools/point/index.js +1 -1
  38. package/lib/tools/polygon/component.js +1 -1
  39. package/lib/tools/polygon/index.js +1 -1
  40. package/lib/tools/polygon/line.js +1 -1
  41. package/lib/tools/polygon/polygon.js +1 -1
  42. package/lib/tools/ray/component.js +1 -1
  43. package/lib/tools/ray/index.js +1 -1
  44. package/lib/tools/segment/component.js +1 -1
  45. package/lib/tools/segment/index.js +1 -1
  46. package/lib/tools/shared/arrow-head.js +1 -1
  47. package/lib/tools/shared/icons/CorrectSVG.js +1 -1
  48. package/lib/tools/shared/icons/IncorrectSVG.js +1 -1
  49. package/lib/tools/shared/icons/MissingSVG.js +1 -1
  50. package/lib/tools/shared/line/index.js +1 -1
  51. package/lib/tools/shared/line/line-path.js +1 -1
  52. package/lib/tools/shared/line/with-root-edge.js +1 -1
  53. package/lib/tools/shared/point/arrow-point.js +1 -1
  54. package/lib/tools/shared/point/arrow.js +1 -1
  55. package/lib/tools/shared/point/base-point.js +1 -1
  56. package/lib/tools/shared/point/index.js +1 -1
  57. package/lib/tools/shared/styles.js +1 -1
  58. package/lib/tools/shared/types.js +1 -1
  59. package/lib/tools/sine/component.js +1 -1
  60. package/lib/tools/sine/index.js +1 -1
  61. package/lib/tools/vector/component.js +1 -1
  62. package/lib/tools/vector/index.js +1 -1
  63. package/lib/undo-redo.js +1 -1
  64. package/lib/use-debounce.js +1 -1
  65. package/lib/utils.js +1 -1
  66. package/package.json +4 -4
  67. package/lib/__tests__/bg.test.js +0 -282
  68. package/lib/__tests__/coordinates-label.test.js +0 -276
  69. package/lib/__tests__/graph-with-controls.test.js +0 -275
  70. package/lib/__tests__/graph.test.js +0 -927
  71. package/lib/__tests__/grid-setup.test.js +0 -729
  72. package/lib/__tests__/grid.test.js +0 -29
  73. package/lib/__tests__/key-legend.test.js +0 -321
  74. package/lib/__tests__/label-svg-icon.test.js +0 -373
  75. package/lib/__tests__/labels.test.js +0 -61
  76. package/lib/__tests__/mark-label.test.js +0 -133
  77. package/lib/__tests__/toggle-bar.test.js +0 -197
  78. package/lib/__tests__/tool-menu.test.js +0 -151
  79. package/lib/__tests__/undo-redo.test.js +0 -31
  80. package/lib/__tests__/use-debounce.test.js +0 -24
  81. package/lib/__tests__/utils.js +0 -70
  82. package/lib/__tests__/utils.test.js +0 -123
  83. package/lib/axis/__tests__/arrow.test.js +0 -60
  84. package/lib/axis/__tests__/axes.test.js +0 -195
  85. package/lib/container/__tests__/actions.test.js +0 -108
  86. package/lib/container/__tests__/index.test.js +0 -503
  87. package/lib/container/__tests__/marks.test.js +0 -259
  88. package/lib/container/__tests__/middleware.test.js +0 -244
  89. package/lib/container/__tests__/reducer.test.js +0 -450
  90. package/lib/tools/absolute/__tests__/component.test.js +0 -65
  91. package/lib/tools/circle/__tests__/bg-circle.test.js +0 -33
  92. package/lib/tools/circle/__tests__/component.test.js +0 -615
  93. package/lib/tools/circle/__tests__/index.test.js +0 -576
  94. package/lib/tools/exponential/__tests__/component.test.js +0 -64
  95. package/lib/tools/exponential/__tests__/index.test.js +0 -828
  96. package/lib/tools/line/__tests__/component.test.js +0 -45
  97. package/lib/tools/parabola/__tests__/component.test.js +0 -64
  98. package/lib/tools/parabola/__tests__/index.test.js +0 -564
  99. package/lib/tools/point/__tests__/component.test.js +0 -434
  100. package/lib/tools/point/__tests__/index.test.js +0 -262
  101. package/lib/tools/polygon/__tests__/component.test.js +0 -485
  102. package/lib/tools/polygon/__tests__/index.test.js +0 -303
  103. package/lib/tools/polygon/__tests__/line.test.js +0 -50
  104. package/lib/tools/polygon/__tests__/polygon.test.js +0 -85
  105. package/lib/tools/ray/__tests__/component.test.js +0 -35
  106. package/lib/tools/segment/__tests__/component.test.js +0 -35
  107. package/lib/tools/shared/__tests__/arrow-head.test.js +0 -45
  108. package/lib/tools/shared/line/__tests__/index.test.js +0 -124
  109. package/lib/tools/shared/line/__tests__/line-path.test.js +0 -62
  110. package/lib/tools/shared/line/__tests__/with-root-edge.test.js +0 -90
  111. package/lib/tools/shared/point/__tests__/arrow-point.test.js +0 -127
  112. package/lib/tools/shared/point/__tests__/base-point.test.js +0 -122
  113. package/lib/tools/sine/__tests__/component.test.js +0 -72
  114. package/lib/tools/vector/__tests__/component.test.js +0 -32
@@ -1,729 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
5
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
6
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
7
- var _react = _interopRequireDefault(require("react"));
8
- var _testUtils = require("@pie-lib/test-utils");
9
- var _gridSetup = _interopRequireDefault(require("../grid-setup"));
10
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
11
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
12
- var mockOnChange = jest.fn();
13
- var mockOnChangeView = jest.fn();
14
- var defaultProps = {
15
- domain: {
16
- min: -5,
17
- max: 5,
18
- step: 1,
19
- labelStep: 1,
20
- axisLabel: 'x'
21
- },
22
- range: {
23
- min: -5,
24
- max: 5,
25
- step: 1,
26
- labelStep: 1,
27
- axisLabel: 'y'
28
- },
29
- size: {
30
- width: 480,
31
- height: 480
32
- },
33
- sizeConstraints: {
34
- min: 300,
35
- max: 900,
36
- step: 10
37
- },
38
- includeAxes: true,
39
- standardGrid: false,
40
- displayedFields: {
41
- axisLabel: {
42
- enabled: true,
43
- label: 'Axis Label'
44
- },
45
- min: {
46
- enabled: true,
47
- label: 'Min'
48
- },
49
- max: {
50
- enabled: true,
51
- label: 'Max'
52
- },
53
- step: {
54
- enabled: true,
55
- label: 'Interval'
56
- },
57
- labelStep: {
58
- enabled: true,
59
- label: 'Label Interval'
60
- },
61
- dimensionsEnabled: true,
62
- includeAxesEnabled: true,
63
- standardGridEnabled: true
64
- },
65
- gridValues: {
66
- domain: [1, 2, 5, 10],
67
- range: [1, 2, 5, 10]
68
- },
69
- labelValues: {
70
- domain: [0, 1, 2],
71
- range: [0, 1, 2]
72
- },
73
- onChange: mockOnChange,
74
- onChangeView: mockOnChangeView
75
- };
76
- describe('GridSetup', function () {
77
- beforeEach(function () {
78
- jest.clearAllMocks();
79
- });
80
- describe('rendering', function () {
81
- it('renders without crashing', function () {
82
- var _render = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
83
- container = _render.container;
84
- expect(container).toBeTruthy();
85
- });
86
- it('renders accordion with title', function () {
87
- var _render2 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
88
- getByText = _render2.getByText;
89
- expect(getByText('Customize Grid Setup')).toBeTruthy();
90
- });
91
- it('renders Include axes toggle when enabled', function () {
92
- var _render3 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
93
- getByText = _render3.getByText;
94
- expect(getByText('Include axes and labels?')).toBeTruthy();
95
- });
96
- it('does not render Include axes toggle when disabled', function () {
97
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
98
- displayedFields: _objectSpread(_objectSpread({}, defaultProps.displayedFields), {}, {
99
- includeAxesEnabled: false
100
- })
101
- });
102
- var _render4 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
103
- queryByText = _render4.queryByText;
104
- expect(queryByText('Include axes and labels?')).toBeFalsy();
105
- });
106
- it('renders standard grid toggle when enabled', function () {
107
- var _render5 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
108
- getByText = _render5.getByText;
109
- expect(getByText('Constrain to standard coordinate grid?')).toBeTruthy();
110
- });
111
- it('does not render standard grid toggle when disabled', function () {
112
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
113
- displayedFields: _objectSpread(_objectSpread({}, defaultProps.displayedFields), {}, {
114
- standardGridEnabled: false
115
- })
116
- });
117
- var _render6 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
118
- queryByText = _render6.queryByText;
119
- expect(queryByText('Constrain to standard coordinate grid?')).toBeFalsy();
120
- });
121
- it('renders dimensions section when enabled', function () {
122
- var _render7 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
123
- getByText = _render7.getByText;
124
- expect(getByText('Dimensions(px)')).toBeTruthy();
125
- expect(getByText(/Min 300, Max 900/)).toBeTruthy();
126
- });
127
- it('does not render dimensions section when disabled', function () {
128
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
129
- displayedFields: _objectSpread(_objectSpread({}, defaultProps.displayedFields), {}, {
130
- dimensionsEnabled: false
131
- })
132
- });
133
- var _render8 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
134
- queryByText = _render8.queryByText;
135
- expect(queryByText('Dimensions(px)')).toBeFalsy();
136
- });
137
- });
138
- describe('axes configuration', function () {
139
- it('renders axis headers when includeAxes is true', function () {
140
- var _render9 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
141
- container = _render9.container;
142
- var xAxisHeader = container.querySelector('i');
143
- expect(xAxisHeader === null || xAxisHeader === void 0 ? void 0 : xAxisHeader.textContent).toBe('x');
144
- });
145
- it('renders min/max fields when enabled', function () {
146
- var _render0 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
147
- getAllByLabelText = _render0.getAllByLabelText;
148
- var minFields = getAllByLabelText('Min');
149
- var maxFields = getAllByLabelText('Max');
150
- expect(minFields.length).toBe(2); // domain and range
151
- expect(maxFields.length).toBe(2); // domain and range
152
- });
153
- it('does not render min/max fields when disabled', function () {
154
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
155
- displayedFields: _objectSpread(_objectSpread({}, defaultProps.displayedFields), {}, {
156
- min: {
157
- enabled: false
158
- },
159
- max: {
160
- enabled: false
161
- }
162
- })
163
- });
164
- var _render1 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
165
- queryByLabelText = _render1.queryByLabelText;
166
- expect(queryByLabelText('Min')).toBeFalsy();
167
- expect(queryByLabelText('Max')).toBeFalsy();
168
- });
169
- it('renders axis label fields when enabled', function () {
170
- var _render10 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
171
- getAllByText = _render10.getAllByText;
172
- var axisLabelFields = getAllByText('Axis Label');
173
- expect(axisLabelFields.length).toBe(2); // domain and range
174
- });
175
- it('does not render axis label fields when disabled', function () {
176
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
177
- displayedFields: _objectSpread(_objectSpread({}, defaultProps.displayedFields), {}, {
178
- axisLabel: {
179
- enabled: false
180
- }
181
- })
182
- });
183
- var _render11 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
184
- queryByText = _render11.queryByText;
185
- expect(queryByText('Axis Label')).toBeFalsy();
186
- });
187
- it('renders step and labelStep fields when enabled', function () {
188
- var _render12 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
189
- getAllByLabelText = _render12.getAllByLabelText;
190
- var intervalFields = getAllByLabelText('Interval');
191
- var labelIntervalFields = getAllByLabelText('Label Interval');
192
- expect(intervalFields.length).toBe(2); // domain and range
193
- expect(labelIntervalFields.length).toBe(2); // domain and range
194
- });
195
- it('does not render step fields when disabled', function () {
196
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
197
- displayedFields: _objectSpread(_objectSpread({}, defaultProps.displayedFields), {}, {
198
- step: {
199
- enabled: false
200
- }
201
- })
202
- });
203
- var _render13 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
204
- queryByLabelText = _render13.queryByLabelText;
205
- expect(queryByLabelText('Interval')).toBeFalsy();
206
- });
207
- it('does not render labelStep fields when disabled', function () {
208
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
209
- displayedFields: _objectSpread(_objectSpread({}, defaultProps.displayedFields), {}, {
210
- labelStep: {
211
- enabled: false
212
- }
213
- })
214
- });
215
- var _render14 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
216
- queryByLabelText = _render14.queryByLabelText;
217
- expect(queryByLabelText('Label Interval')).toBeFalsy();
218
- });
219
- it('displays axis visibility hint when min/max enabled', function () {
220
- var _render15 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
221
- getByText = _render15.getByText;
222
- expect(getByText('If you want the axis to be visible, use a zero or negative Min Value, and a positive Max Value')).toBeTruthy();
223
- });
224
- it('displays unnumbered gridlines hint when labelStep enabled', function () {
225
- var _render16 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
226
- getByText = _render16.getByText;
227
- expect(getByText('For unnumbered gridlines, enter a label interval of 0')).toBeTruthy();
228
- });
229
- });
230
- describe('gridlines configuration', function () {
231
- it('renders gridlines config when includeAxes is false', function () {
232
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
233
- includeAxes: false
234
- });
235
- var _render17 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
236
- getByLabelText = _render17.getByLabelText;
237
- expect(getByLabelText('Number of Vertical Gridlines')).toBeTruthy();
238
- expect(getByLabelText('Number of Horizontal Gridlines')).toBeTruthy();
239
- });
240
- it('does not render axes config when includeAxes is false', function () {
241
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
242
- includeAxes: false
243
- });
244
- var _render18 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
245
- queryByText = _render18.queryByText;
246
- expect(queryByText('Axis Label')).toBeFalsy();
247
- });
248
- it('does not render gridlines config when max is disabled', function () {
249
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
250
- includeAxes: false,
251
- displayedFields: _objectSpread(_objectSpread({}, defaultProps.displayedFields), {}, {
252
- max: {
253
- enabled: false
254
- }
255
- })
256
- });
257
- var _render19 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
258
- queryByLabelText = _render19.queryByLabelText;
259
- expect(queryByLabelText('Number of Vertical Gridlines')).toBeFalsy();
260
- expect(queryByLabelText('Number of Horizontal Gridlines')).toBeFalsy();
261
- });
262
- });
263
- describe('user interactions', function () {
264
- it('calls onChange when includeAxes toggle is clicked', function () {
265
- var _render20 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
266
- container = _render20.container;
267
- var toggleInput = container.querySelector('input[type="checkbox"]');
268
- _testUtils.fireEvent.click(toggleInput);
269
- expect(mockOnChange).toHaveBeenCalledWith(expect.objectContaining({
270
- includeAxes: false
271
- }));
272
- });
273
- it('calls onChange with proper config when includeAxes is disabled', function () {
274
- var _render21 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
275
- container = _render21.container;
276
- var toggleInput = container.querySelector('input[type="checkbox"]');
277
- _testUtils.fireEvent.click(toggleInput);
278
- expect(mockOnChange).toHaveBeenCalledWith(expect.objectContaining({
279
- includeAxes: false,
280
- domain: expect.objectContaining({
281
- min: 1,
282
- max: 5,
283
- step: 1,
284
- labelStep: 0
285
- }),
286
- range: expect.objectContaining({
287
- min: 1,
288
- max: 5,
289
- step: 1,
290
- labelStep: 0
291
- })
292
- }));
293
- });
294
- it('calls onChange with proper config when includeAxes is enabled', function () {
295
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
296
- includeAxes: false
297
- });
298
- var _render22 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
299
- container = _render22.container;
300
- var toggleInputs = container.querySelectorAll('input[type="checkbox"]');
301
- var includeAxesToggle = toggleInputs[0]; // First toggle is includeAxes
302
-
303
- _testUtils.fireEvent.click(includeAxesToggle);
304
- expect(mockOnChange).toHaveBeenCalledWith(expect.objectContaining({
305
- includeAxes: true,
306
- domain: expect.objectContaining({
307
- labelStep: 1
308
- }),
309
- range: expect.objectContaining({
310
- labelStep: 1
311
- })
312
- }));
313
- });
314
- it('calls onChange when standardGrid toggle is clicked', function () {
315
- var _render23 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
316
- container = _render23.container;
317
- var toggleInputs = container.querySelectorAll('input[type="checkbox"]');
318
- var standardGridToggle = toggleInputs[1]; // Second toggle is standardGrid
319
-
320
- _testUtils.fireEvent.click(standardGridToggle);
321
- expect(mockOnChange).toHaveBeenCalledWith(expect.objectContaining({
322
- standardGrid: true,
323
- graph: expect.objectContaining({
324
- width: 480,
325
- height: 480
326
- })
327
- }));
328
- });
329
- it('calls onChange when width is changed', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
330
- var _render24, getAllByLabelText, widthInput;
331
- return _regenerator["default"].wrap(function (_context) {
332
- while (1) switch (_context.prev = _context.next) {
333
- case 0:
334
- _render24 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)), getAllByLabelText = _render24.getAllByLabelText;
335
- widthInput = getAllByLabelText('Width')[0];
336
- _testUtils.fireEvent.change(widthInput, {
337
- target: {
338
- value: '500'
339
- }
340
- });
341
- _testUtils.fireEvent.blur(widthInput);
342
- _context.next = 1;
343
- return (0, _testUtils.waitFor)(function () {
344
- expect(mockOnChange).toHaveBeenCalledWith(expect.objectContaining({
345
- graph: expect.objectContaining({
346
- width: 500
347
- })
348
- }));
349
- });
350
- case 1:
351
- case "end":
352
- return _context.stop();
353
- }
354
- }, _callee);
355
- })));
356
- it('calls onChange when height is changed', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2() {
357
- var _render25, getAllByLabelText, heightInput;
358
- return _regenerator["default"].wrap(function (_context2) {
359
- while (1) switch (_context2.prev = _context2.next) {
360
- case 0:
361
- _render25 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)), getAllByLabelText = _render25.getAllByLabelText;
362
- heightInput = getAllByLabelText('Height')[0];
363
- _testUtils.fireEvent.change(heightInput, {
364
- target: {
365
- value: '520'
366
- }
367
- });
368
- _testUtils.fireEvent.blur(heightInput);
369
- _context2.next = 1;
370
- return (0, _testUtils.waitFor)(function () {
371
- expect(mockOnChange).toHaveBeenCalledWith(expect.objectContaining({
372
- graph: expect.objectContaining({
373
- height: 520
374
- })
375
- }));
376
- });
377
- case 1:
378
- case "end":
379
- return _context2.stop();
380
- }
381
- }, _callee2);
382
- })));
383
- it('updates both width and height when standardGrid is true', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3() {
384
- var props, _render26, getAllByLabelText, widthInput;
385
- return _regenerator["default"].wrap(function (_context3) {
386
- while (1) switch (_context3.prev = _context3.next) {
387
- case 0:
388
- props = _objectSpread(_objectSpread({}, defaultProps), {}, {
389
- standardGrid: true
390
- });
391
- _render26 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)), getAllByLabelText = _render26.getAllByLabelText;
392
- widthInput = getAllByLabelText('Width')[0];
393
- _testUtils.fireEvent.change(widthInput, {
394
- target: {
395
- value: '600'
396
- }
397
- });
398
- _testUtils.fireEvent.blur(widthInput);
399
- _context3.next = 1;
400
- return (0, _testUtils.waitFor)(function () {
401
- expect(mockOnChange).toHaveBeenCalledWith(expect.objectContaining({
402
- graph: expect.objectContaining({
403
- width: 600,
404
- height: 600
405
- })
406
- }));
407
- });
408
- case 1:
409
- case "end":
410
- return _context3.stop();
411
- }
412
- }, _callee3);
413
- })));
414
- it('calls onChange when domain min is changed', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee4() {
415
- var _render27, getAllByLabelText, minInputs, domainMinInput;
416
- return _regenerator["default"].wrap(function (_context4) {
417
- while (1) switch (_context4.prev = _context4.next) {
418
- case 0:
419
- _render27 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)), getAllByLabelText = _render27.getAllByLabelText;
420
- minInputs = getAllByLabelText('Min');
421
- domainMinInput = minInputs[0];
422
- _testUtils.fireEvent.change(domainMinInput, {
423
- target: {
424
- value: '-10'
425
- }
426
- });
427
- _testUtils.fireEvent.blur(domainMinInput);
428
- _context4.next = 1;
429
- return (0, _testUtils.waitFor)(function () {
430
- expect(mockOnChange).toHaveBeenCalledWith(expect.objectContaining({
431
- domain: expect.objectContaining({
432
- min: -10
433
- })
434
- }));
435
- });
436
- case 1:
437
- case "end":
438
- return _context4.stop();
439
- }
440
- }, _callee4);
441
- })));
442
- it('calls onChange when domain max is changed', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee5() {
443
- var _render28, getAllByLabelText, maxInputs, domainMaxInput;
444
- return _regenerator["default"].wrap(function (_context5) {
445
- while (1) switch (_context5.prev = _context5.next) {
446
- case 0:
447
- _render28 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)), getAllByLabelText = _render28.getAllByLabelText;
448
- maxInputs = getAllByLabelText('Max');
449
- domainMaxInput = maxInputs[0];
450
- _testUtils.fireEvent.change(domainMaxInput, {
451
- target: {
452
- value: '10'
453
- }
454
- });
455
- _testUtils.fireEvent.blur(domainMaxInput);
456
- _context5.next = 1;
457
- return (0, _testUtils.waitFor)(function () {
458
- expect(mockOnChange).toHaveBeenCalledWith(expect.objectContaining({
459
- domain: expect.objectContaining({
460
- max: 10
461
- })
462
- }));
463
- });
464
- case 1:
465
- case "end":
466
- return _context5.stop();
467
- }
468
- }, _callee5);
469
- })));
470
- it('calls onChange when range min is changed', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee6() {
471
- var _render29, getAllByLabelText, minInputs, rangeMinInput;
472
- return _regenerator["default"].wrap(function (_context6) {
473
- while (1) switch (_context6.prev = _context6.next) {
474
- case 0:
475
- _render29 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)), getAllByLabelText = _render29.getAllByLabelText;
476
- minInputs = getAllByLabelText('Min');
477
- rangeMinInput = minInputs[1];
478
- _testUtils.fireEvent.change(rangeMinInput, {
479
- target: {
480
- value: '-8'
481
- }
482
- });
483
- _testUtils.fireEvent.blur(rangeMinInput);
484
- _context6.next = 1;
485
- return (0, _testUtils.waitFor)(function () {
486
- expect(mockOnChange).toHaveBeenCalledWith(expect.objectContaining({
487
- range: expect.objectContaining({
488
- min: -8
489
- })
490
- }));
491
- });
492
- case 1:
493
- case "end":
494
- return _context6.stop();
495
- }
496
- }, _callee6);
497
- })));
498
- it('calls onChange when range max is changed', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee7() {
499
- var _render30, getAllByLabelText, maxInputs, rangeMaxInput;
500
- return _regenerator["default"].wrap(function (_context7) {
501
- while (1) switch (_context7.prev = _context7.next) {
502
- case 0:
503
- _render30 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)), getAllByLabelText = _render30.getAllByLabelText;
504
- maxInputs = getAllByLabelText('Max');
505
- rangeMaxInput = maxInputs[1];
506
- _testUtils.fireEvent.change(rangeMaxInput, {
507
- target: {
508
- value: '12'
509
- }
510
- });
511
- _testUtils.fireEvent.blur(rangeMaxInput);
512
- _context7.next = 1;
513
- return (0, _testUtils.waitFor)(function () {
514
- expect(mockOnChange).toHaveBeenCalledWith(expect.objectContaining({
515
- range: expect.objectContaining({
516
- max: 12
517
- })
518
- }));
519
- });
520
- case 1:
521
- case "end":
522
- return _context7.stop();
523
- }
524
- }, _callee7);
525
- })));
526
- it('updates both domain and range when standardGrid is true and domain changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee8() {
527
- var props, _render31, getAllByLabelText, minInputs, domainMinInput;
528
- return _regenerator["default"].wrap(function (_context8) {
529
- while (1) switch (_context8.prev = _context8.next) {
530
- case 0:
531
- props = _objectSpread(_objectSpread({}, defaultProps), {}, {
532
- standardGrid: true
533
- });
534
- _render31 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)), getAllByLabelText = _render31.getAllByLabelText;
535
- minInputs = getAllByLabelText('Min');
536
- domainMinInput = minInputs[0];
537
- _testUtils.fireEvent.change(domainMinInput, {
538
- target: {
539
- value: '-15'
540
- }
541
- });
542
- _testUtils.fireEvent.blur(domainMinInput);
543
- _context8.next = 1;
544
- return (0, _testUtils.waitFor)(function () {
545
- expect(mockOnChange).toHaveBeenCalledWith(expect.objectContaining({
546
- domain: expect.objectContaining({
547
- min: -15
548
- }),
549
- range: expect.objectContaining({
550
- min: -15
551
- })
552
- }));
553
- });
554
- case 1:
555
- case "end":
556
- return _context8.stop();
557
- }
558
- }, _callee8);
559
- })));
560
- it('does not update range when domain axisLabel changes with standardGrid', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee9() {
561
- var props, _render32, container, axisLabelInputs;
562
- return _regenerator["default"].wrap(function (_context9) {
563
- while (1) switch (_context9.prev = _context9.next) {
564
- case 0:
565
- props = _objectSpread(_objectSpread({}, defaultProps), {}, {
566
- standardGrid: true
567
- });
568
- _render32 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)), container = _render32.container; // EditableHTML change is harder to trigger, but we can test the handler directly
569
- // by verifying the range doesn't get the axisLabel value from domain
570
- axisLabelInputs = container.querySelectorAll('[contenteditable="true"]');
571
- if (!(axisLabelInputs.length > 0)) {
572
- _context9.next = 1;
573
- break;
574
- }
575
- _testUtils.fireEvent.input(axisLabelInputs[0], {
576
- target: {
577
- innerHTML: 'X-Axis'
578
- }
579
- });
580
- _context9.next = 1;
581
- return (0, _testUtils.waitFor)(function () {
582
- if (mockOnChange.mock.calls.length > 0) {
583
- var _lastCall$range;
584
- var lastCall = mockOnChange.mock.calls[mockOnChange.mock.calls.length - 1][0];
585
- // range.axisLabel should not be 'X-Axis', it should keep its original value
586
- expect((_lastCall$range = lastCall.range) === null || _lastCall$range === void 0 ? void 0 : _lastCall$range.axisLabel).not.toBe('X-Axis');
587
- }
588
- });
589
- case 1:
590
- case "end":
591
- return _context9.stop();
592
- }
593
- }, _callee9);
594
- })));
595
- it('calls onChangeView when accordion is toggled', function () {
596
- var _render33 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
597
- container = _render33.container;
598
- var accordionSummary = container.querySelector('[aria-expanded]');
599
- _testUtils.fireEvent.click(accordionSummary);
600
- expect(mockOnChangeView).toHaveBeenCalled();
601
- });
602
- });
603
- describe('disabled states', function () {
604
- it('disables range fields when standardGrid is true', function () {
605
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
606
- standardGrid: true
607
- });
608
- var _render34 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
609
- getAllByLabelText = _render34.getAllByLabelText;
610
- var minInputs = getAllByLabelText('Min');
611
- var rangeMinInput = minInputs[1];
612
- expect(rangeMinInput).toBeDisabled();
613
- });
614
- it('disables height field when standardGrid is true', function () {
615
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
616
- standardGrid: true
617
- });
618
- var _render35 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
619
- getAllByLabelText = _render35.getAllByLabelText;
620
- var heightInput = getAllByLabelText('Height')[0];
621
- expect(heightInput).toBeDisabled();
622
- });
623
- it('disables horizontal gridlines field when standardGrid is true and includeAxes is false', function () {
624
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
625
- includeAxes: false,
626
- standardGrid: true
627
- });
628
- var _render36 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
629
- getByLabelText = _render36.getByLabelText;
630
- var horizontalGridlinesInput = getByLabelText('Number of Horizontal Gridlines');
631
- expect(horizontalGridlinesInput).toBeDisabled();
632
- });
633
- });
634
- describe('GridConfig component', function () {
635
- it('renders step field when enabled', function () {
636
- var _render37 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
637
- getAllByLabelText = _render37.getAllByLabelText;
638
- var intervalFields = getAllByLabelText('Interval');
639
- expect(intervalFields.length).toBeGreaterThan(0);
640
- });
641
- it('renders labelStep field when enabled', function () {
642
- var _render38 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
643
- getAllByLabelText = _render38.getAllByLabelText;
644
- var labelIntervalFields = getAllByLabelText('Label Interval');
645
- expect(labelIntervalFields.length).toBeGreaterThan(0);
646
- });
647
- it('does not render when both step and labelStep are disabled', function () {
648
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
649
- displayedFields: _objectSpread(_objectSpread({}, defaultProps.displayedFields), {}, {
650
- step: {
651
- enabled: false
652
- },
653
- labelStep: {
654
- enabled: false
655
- }
656
- })
657
- });
658
- var _render39 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
659
- queryByLabelText = _render39.queryByLabelText;
660
- expect(queryByLabelText('Interval')).toBeFalsy();
661
- expect(queryByLabelText('Label Interval')).toBeFalsy();
662
- });
663
- });
664
- describe('AxisConfig component', function () {
665
- it('renders x-axis header', function () {
666
- var _render40 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
667
- container = _render40.container;
668
- var headers = container.querySelectorAll('i');
669
- var xAxisHeader = Array.from(headers).find(function (h) {
670
- return h.textContent === 'x';
671
- });
672
- expect(xAxisHeader).toBeTruthy();
673
- });
674
- it('renders y-axis header', function () {
675
- var _render41 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
676
- container = _render41.container;
677
- var headers = container.querySelectorAll('i');
678
- var yAxisHeader = Array.from(headers).find(function (h) {
679
- return h.textContent === 'y';
680
- });
681
- expect(yAxisHeader).toBeTruthy();
682
- });
683
- it('does not render headers when all fields are disabled', function () {
684
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
685
- displayedFields: _objectSpread(_objectSpread({}, defaultProps.displayedFields), {}, {
686
- min: {
687
- enabled: false
688
- },
689
- max: {
690
- enabled: false
691
- },
692
- axisLabel: {
693
- enabled: false
694
- },
695
- step: {
696
- enabled: false
697
- },
698
- labelStep: {
699
- enabled: false
700
- }
701
- })
702
- });
703
- var _render42 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
704
- container = _render42.container;
705
- var headers = container.querySelectorAll('i');
706
- var axisHeaders = Array.from(headers).filter(function (h) {
707
- return h.textContent === 'x' || h.textContent === 'y';
708
- });
709
- expect(axisHeaders.length).toBe(0);
710
- });
711
- });
712
- describe('Accordion behavior', function () {
713
- it('renders with correct transition props', function () {
714
- var _render43 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
715
- container = _render43.container;
716
- var accordion = container.querySelector('.MuiAccordion-root');
717
- expect(accordion).toBeTruthy();
718
- });
719
- it('expands and collapses accordion', function () {
720
- var _render44 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
721
- container = _render44.container;
722
- var accordionSummary = container.querySelector('[aria-expanded]');
723
- expect(accordionSummary.getAttribute('aria-expanded')).toBe('false');
724
- _testUtils.fireEvent.click(accordionSummary);
725
- expect(mockOnChangeView).toHaveBeenCalled();
726
- });
727
- });
728
- });
729
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl90ZXN0VXRpbHMiLCJfZ3JpZFNldHVwIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJtb2NrT25DaGFuZ2UiLCJqZXN0IiwiZm4iLCJtb2NrT25DaGFuZ2VWaWV3IiwiZGVmYXVsdFByb3BzIiwiZG9tYWluIiwibWluIiwibWF4Iiwic3RlcCIsImxhYmVsU3RlcCIsImF4aXNMYWJlbCIsInJhbmdlIiwic2l6ZSIsIndpZHRoIiwiaGVpZ2h0Iiwic2l6ZUNvbnN0cmFpbnRzIiwiaW5jbHVkZUF4ZXMiLCJzdGFuZGFyZEdyaWQiLCJkaXNwbGF5ZWRGaWVsZHMiLCJlbmFibGVkIiwibGFiZWwiLCJkaW1lbnNpb25zRW5hYmxlZCIsImluY2x1ZGVBeGVzRW5hYmxlZCIsInN0YW5kYXJkR3JpZEVuYWJsZWQiLCJncmlkVmFsdWVzIiwibGFiZWxWYWx1ZXMiLCJvbkNoYW5nZSIsIm9uQ2hhbmdlVmlldyIsImRlc2NyaWJlIiwiYmVmb3JlRWFjaCIsImNsZWFyQWxsTW9ja3MiLCJpdCIsIl9yZW5kZXIiLCJyZW5kZXIiLCJjcmVhdGVFbGVtZW50IiwiY29udGFpbmVyIiwiZXhwZWN0IiwidG9CZVRydXRoeSIsIl9yZW5kZXIyIiwiZ2V0QnlUZXh0IiwiX3JlbmRlcjMiLCJwcm9wcyIsIl9yZW5kZXI0IiwicXVlcnlCeVRleHQiLCJ0b0JlRmFsc3kiLCJfcmVuZGVyNSIsIl9yZW5kZXI2IiwiX3JlbmRlcjciLCJfcmVuZGVyOCIsIl9yZW5kZXI5IiwieEF4aXNIZWFkZXIiLCJxdWVyeVNlbGVjdG9yIiwidGV4dENvbnRlbnQiLCJ0b0JlIiwiX3JlbmRlcjAiLCJnZXRBbGxCeUxhYmVsVGV4dCIsIm1pbkZpZWxkcyIsIm1heEZpZWxkcyIsIl9yZW5kZXIxIiwicXVlcnlCeUxhYmVsVGV4dCIsIl9yZW5kZXIxMCIsImdldEFsbEJ5VGV4dCIsImF4aXNMYWJlbEZpZWxkcyIsIl9yZW5kZXIxMSIsIl9yZW5kZXIxMiIsImludGVydmFsRmllbGRzIiwibGFiZWxJbnRlcnZhbEZpZWxkcyIsIl9yZW5kZXIxMyIsIl9yZW5kZXIxNCIsIl9yZW5kZXIxNSIsIl9yZW5kZXIxNiIsIl9yZW5kZXIxNyIsImdldEJ5TGFiZWxUZXh0IiwiX3JlbmRlcjE4IiwiX3JlbmRlcjE5IiwiX3JlbmRlcjIwIiwidG9nZ2xlSW5wdXQiLCJmaXJlRXZlbnQiLCJjbGljayIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwib2JqZWN0Q29udGFpbmluZyIsIl9yZW5kZXIyMSIsIl9yZW5kZXIyMiIsInRvZ2dsZUlucHV0cyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJpbmNsdWRlQXhlc1RvZ2dsZSIsIl9yZW5kZXIyMyIsInN0YW5kYXJkR3JpZFRvZ2dsZSIsImdyYXBoIiwiX2FzeW5jVG9HZW5lcmF0b3IyIiwiX3JlZ2VuZXJhdG9yIiwibWFyayIsIl9jYWxsZWUiLCJfcmVuZGVyMjQiLCJ3aWR0aElucHV0Iiwid3JhcCIsIl9jb250ZXh0IiwicHJldiIsIm5leHQiLCJjaGFuZ2UiLCJ0YXJnZXQiLCJ2YWx1ZSIsImJsdXIiLCJ3YWl0Rm9yIiwic3RvcCIsIl9jYWxsZWUyIiwiX3JlbmRlcjI1IiwiaGVpZ2h0SW5wdXQiLCJfY29udGV4dDIiLCJfY2FsbGVlMyIsIl9yZW5kZXIyNiIsIl9jb250ZXh0MyIsIl9jYWxsZWU0IiwiX3JlbmRlcjI3IiwibWluSW5wdXRzIiwiZG9tYWluTWluSW5wdXQiLCJfY29udGV4dDQiLCJfY2FsbGVlNSIsIl9yZW5kZXIyOCIsIm1heElucHV0cyIsImRvbWFpbk1heElucHV0IiwiX2NvbnRleHQ1IiwiX2NhbGxlZTYiLCJfcmVuZGVyMjkiLCJyYW5nZU1pbklucHV0IiwiX2NvbnRleHQ2IiwiX2NhbGxlZTciLCJfcmVuZGVyMzAiLCJyYW5nZU1heElucHV0IiwiX2NvbnRleHQ3IiwiX2NhbGxlZTgiLCJfcmVuZGVyMzEiLCJfY29udGV4dDgiLCJfY2FsbGVlOSIsIl9yZW5kZXIzMiIsImF4aXNMYWJlbElucHV0cyIsIl9jb250ZXh0OSIsImlucHV0IiwiaW5uZXJIVE1MIiwibW9jayIsImNhbGxzIiwiX2xhc3RDYWxsJHJhbmdlIiwibGFzdENhbGwiLCJub3QiLCJfcmVuZGVyMzMiLCJhY2NvcmRpb25TdW1tYXJ5IiwidG9IYXZlQmVlbkNhbGxlZCIsIl9yZW5kZXIzNCIsInRvQmVEaXNhYmxlZCIsIl9yZW5kZXIzNSIsIl9yZW5kZXIzNiIsImhvcml6b250YWxHcmlkbGluZXNJbnB1dCIsIl9yZW5kZXIzNyIsInRvQmVHcmVhdGVyVGhhbiIsIl9yZW5kZXIzOCIsIl9yZW5kZXIzOSIsIl9yZW5kZXI0MCIsImhlYWRlcnMiLCJBcnJheSIsImZyb20iLCJmaW5kIiwiaCIsIl9yZW5kZXI0MSIsInlBeGlzSGVhZGVyIiwiX3JlbmRlcjQyIiwiYXhpc0hlYWRlcnMiLCJfcmVuZGVyNDMiLCJhY2NvcmRpb24iLCJfcmVuZGVyNDQiLCJnZXRBdHRyaWJ1dGUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL2dyaWQtc2V0dXAudGVzdC5qc3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGZpcmVFdmVudCwgcmVuZGVyLCB3YWl0Rm9yIH0gZnJvbSAnQHBpZS1saWIvdGVzdC11dGlscyc7XG5pbXBvcnQgR3JpZFNldHVwIGZyb20gJy4uL2dyaWQtc2V0dXAnO1xuXG5jb25zdCBtb2NrT25DaGFuZ2UgPSBqZXN0LmZuKCk7XG5jb25zdCBtb2NrT25DaGFuZ2VWaWV3ID0gamVzdC5mbigpO1xuXG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIGRvbWFpbjoge1xuICAgIG1pbjogLTUsXG4gICAgbWF4OiA1LFxuICAgIHN0ZXA6IDEsXG4gICAgbGFiZWxTdGVwOiAxLFxuICAgIGF4aXNMYWJlbDogJ3gnLFxuICB9LFxuICByYW5nZToge1xuICAgIG1pbjogLTUsXG4gICAgbWF4OiA1LFxuICAgIHN0ZXA6IDEsXG4gICAgbGFiZWxTdGVwOiAxLFxuICAgIGF4aXNMYWJlbDogJ3knLFxuICB9LFxuICBzaXplOiB7XG4gICAgd2lkdGg6IDQ4MCxcbiAgICBoZWlnaHQ6IDQ4MCxcbiAgfSxcbiAgc2l6ZUNvbnN0cmFpbnRzOiB7XG4gICAgbWluOiAzMDAsXG4gICAgbWF4OiA5MDAsXG4gICAgc3RlcDogMTAsXG4gIH0sXG4gIGluY2x1ZGVBeGVzOiB0cnVlLFxuICBzdGFuZGFyZEdyaWQ6IGZhbHNlLFxuICBkaXNwbGF5ZWRGaWVsZHM6IHtcbiAgICBheGlzTGFiZWw6IHsgZW5hYmxlZDogdHJ1ZSwgbGFiZWw6ICdBeGlzIExhYmVsJyB9LFxuICAgIG1pbjogeyBlbmFibGVkOiB0cnVlLCBsYWJlbDogJ01pbicgfSxcbiAgICBtYXg6IHsgZW5hYmxlZDogdHJ1ZSwgbGFiZWw6ICdNYXgnIH0sXG4gICAgc3RlcDogeyBlbmFibGVkOiB0cnVlLCBsYWJlbDogJ0ludGVydmFsJyB9LFxuICAgIGxhYmVsU3RlcDogeyBlbmFibGVkOiB0cnVlLCBsYWJlbDogJ0xhYmVsIEludGVydmFsJyB9LFxuICAgIGRpbWVuc2lvbnNFbmFibGVkOiB0cnVlLFxuICAgIGluY2x1ZGVBeGVzRW5hYmxlZDogdHJ1ZSxcbiAgICBzdGFuZGFyZEdyaWRFbmFibGVkOiB0cnVlLFxuICB9LFxuICBncmlkVmFsdWVzOiB7XG4gICAgZG9tYWluOiBbMSwgMiwgNSwgMTBdLFxuICAgIHJhbmdlOiBbMSwgMiwgNSwgMTBdLFxuICB9LFxuICBsYWJlbFZhbHVlczoge1xuICAgIGRvbWFpbjogWzAsIDEsIDJdLFxuICAgIHJhbmdlOiBbMCwgMSwgMl0sXG4gIH0sXG4gIG9uQ2hhbmdlOiBtb2NrT25DaGFuZ2UsXG4gIG9uQ2hhbmdlVmlldzogbW9ja09uQ2hhbmdlVmlldyxcbn07XG5cbmRlc2NyaWJlKCdHcmlkU2V0dXAnLCAoKSA9PiB7XG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIGplc3QuY2xlYXJBbGxNb2NrcygpO1xuICB9KTtcblxuICBkZXNjcmliZSgncmVuZGVyaW5nJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHdpdGhvdXQgY3Jhc2hpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgYWNjb3JkaW9uIHdpdGggdGl0bGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEJ5VGV4dCB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KGdldEJ5VGV4dCgnQ3VzdG9taXplIEdyaWQgU2V0dXAnKSkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgSW5jbHVkZSBheGVzIHRvZ2dsZSB3aGVuIGVuYWJsZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEJ5VGV4dCB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KGdldEJ5VGV4dCgnSW5jbHVkZSBheGVzIGFuZCBsYWJlbHM/JykpLnRvQmVUcnV0aHkoKTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCByZW5kZXIgSW5jbHVkZSBheGVzIHRvZ2dsZSB3aGVuIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgZGlzcGxheWVkRmllbGRzOiB7XG4gICAgICAgICAgLi4uZGVmYXVsdFByb3BzLmRpc3BsYXllZEZpZWxkcyxcbiAgICAgICAgICBpbmNsdWRlQXhlc0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgcXVlcnlCeVRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5wcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXh0KCdJbmNsdWRlIGF4ZXMgYW5kIGxhYmVscz8nKSkudG9CZUZhbHN5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBzdGFuZGFyZCBncmlkIHRvZ2dsZSB3aGVuIGVuYWJsZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEJ5VGV4dCB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KGdldEJ5VGV4dCgnQ29uc3RyYWluIHRvIHN0YW5kYXJkIGNvb3JkaW5hdGUgZ3JpZD8nKSkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHJlbmRlciBzdGFuZGFyZCBncmlkIHRvZ2dsZSB3aGVuIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgZGlzcGxheWVkRmllbGRzOiB7XG4gICAgICAgICAgLi4uZGVmYXVsdFByb3BzLmRpc3BsYXllZEZpZWxkcyxcbiAgICAgICAgICBzdGFuZGFyZEdyaWRFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCB7IHF1ZXJ5QnlUZXh0IH0gPSByZW5kZXIoPEdyaWRTZXR1cCB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChxdWVyeUJ5VGV4dCgnQ29uc3RyYWluIHRvIHN0YW5kYXJkIGNvb3JkaW5hdGUgZ3JpZD8nKSkudG9CZUZhbHN5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBkaW1lbnNpb25zIHNlY3Rpb24gd2hlbiBlbmFibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChnZXRCeVRleHQoJ0RpbWVuc2lvbnMocHgpJykpLnRvQmVUcnV0aHkoKTtcbiAgICAgIGV4cGVjdChnZXRCeVRleHQoL01pbiAzMDAsIE1heCA5MDAvKSkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHJlbmRlciBkaW1lbnNpb25zIHNlY3Rpb24gd2hlbiBkaXNhYmxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgIGRpc3BsYXllZEZpZWxkczoge1xuICAgICAgICAgIC4uLmRlZmF1bHRQcm9wcy5kaXNwbGF5ZWRGaWVsZHMsXG4gICAgICAgICAgZGltZW5zaW9uc0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgcXVlcnlCeVRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5wcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXh0KCdEaW1lbnNpb25zKHB4KScpKS50b0JlRmFsc3koKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2F4ZXMgY29uZmlndXJhdGlvbicsICgpID0+IHtcbiAgICBpdCgncmVuZGVycyBheGlzIGhlYWRlcnMgd2hlbiBpbmNsdWRlQXhlcyBpcyB0cnVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IHhBeGlzSGVhZGVyID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2knKTtcbiAgICAgIGV4cGVjdCh4QXhpc0hlYWRlcj8udGV4dENvbnRlbnQpLnRvQmUoJ3gnKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIG1pbi9tYXggZmllbGRzIHdoZW4gZW5hYmxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlMYWJlbFRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IG1pbkZpZWxkcyA9IGdldEFsbEJ5TGFiZWxUZXh0KCdNaW4nKTtcbiAgICAgIGNvbnN0IG1heEZpZWxkcyA9IGdldEFsbEJ5TGFiZWxUZXh0KCdNYXgnKTtcbiAgICAgIGV4cGVjdChtaW5GaWVsZHMubGVuZ3RoKS50b0JlKDIpOyAvLyBkb21haW4gYW5kIHJhbmdlXG4gICAgICBleHBlY3QobWF4RmllbGRzLmxlbmd0aCkudG9CZSgyKTsgLy8gZG9tYWluIGFuZCByYW5nZVxuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHJlbmRlciBtaW4vbWF4IGZpZWxkcyB3aGVuIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgZGlzcGxheWVkRmllbGRzOiB7XG4gICAgICAgICAgLi4uZGVmYXVsdFByb3BzLmRpc3BsYXllZEZpZWxkcyxcbiAgICAgICAgICBtaW46IHsgZW5hYmxlZDogZmFsc2UgfSxcbiAgICAgICAgICBtYXg6IHsgZW5hYmxlZDogZmFsc2UgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCB7IHF1ZXJ5QnlMYWJlbFRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5wcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlMYWJlbFRleHQoJ01pbicpKS50b0JlRmFsc3koKTtcbiAgICAgIGV4cGVjdChxdWVyeUJ5TGFiZWxUZXh0KCdNYXgnKSkudG9CZUZhbHN5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBheGlzIGxhYmVsIGZpZWxkcyB3aGVuIGVuYWJsZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5VGV4dCB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3QgYXhpc0xhYmVsRmllbGRzID0gZ2V0QWxsQnlUZXh0KCdBeGlzIExhYmVsJyk7XG4gICAgICBleHBlY3QoYXhpc0xhYmVsRmllbGRzLmxlbmd0aCkudG9CZSgyKTsgLy8gZG9tYWluIGFuZCByYW5nZVxuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHJlbmRlciBheGlzIGxhYmVsIGZpZWxkcyB3aGVuIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgZGlzcGxheWVkRmllbGRzOiB7XG4gICAgICAgICAgLi4uZGVmYXVsdFByb3BzLmRpc3BsYXllZEZpZWxkcyxcbiAgICAgICAgICBheGlzTGFiZWw6IHsgZW5hYmxlZDogZmFsc2UgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCB7IHF1ZXJ5QnlUZXh0IH0gPSByZW5kZXIoPEdyaWRTZXR1cCB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChxdWVyeUJ5VGV4dCgnQXhpcyBMYWJlbCcpKS50b0JlRmFsc3koKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHN0ZXAgYW5kIGxhYmVsU3RlcCBmaWVsZHMgd2hlbiBlbmFibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRBbGxCeUxhYmVsVGV4dCB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3QgaW50ZXJ2YWxGaWVsZHMgPSBnZXRBbGxCeUxhYmVsVGV4dCgnSW50ZXJ2YWwnKTtcbiAgICAgIGNvbnN0IGxhYmVsSW50ZXJ2YWxGaWVsZHMgPSBnZXRBbGxCeUxhYmVsVGV4dCgnTGFiZWwgSW50ZXJ2YWwnKTtcbiAgICAgIGV4cGVjdChpbnRlcnZhbEZpZWxkcy5sZW5ndGgpLnRvQmUoMik7IC8vIGRvbWFpbiBhbmQgcmFuZ2VcbiAgICAgIGV4cGVjdChsYWJlbEludGVydmFsRmllbGRzLmxlbmd0aCkudG9CZSgyKTsgLy8gZG9tYWluIGFuZCByYW5nZVxuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHJlbmRlciBzdGVwIGZpZWxkcyB3aGVuIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgZGlzcGxheWVkRmllbGRzOiB7XG4gICAgICAgICAgLi4uZGVmYXVsdFByb3BzLmRpc3BsYXllZEZpZWxkcyxcbiAgICAgICAgICBzdGVwOiB7IGVuYWJsZWQ6IGZhbHNlIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBxdWVyeUJ5TGFiZWxUZXh0IH0gPSByZW5kZXIoPEdyaWRTZXR1cCB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChxdWVyeUJ5TGFiZWxUZXh0KCdJbnRlcnZhbCcpKS50b0JlRmFsc3koKTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCByZW5kZXIgbGFiZWxTdGVwIGZpZWxkcyB3aGVuIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgZGlzcGxheWVkRmllbGRzOiB7XG4gICAgICAgICAgLi4uZGVmYXVsdFByb3BzLmRpc3BsYXllZEZpZWxkcyxcbiAgICAgICAgICBsYWJlbFN0ZXA6IHsgZW5hYmxlZDogZmFsc2UgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCB7IHF1ZXJ5QnlMYWJlbFRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5wcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlMYWJlbFRleHQoJ0xhYmVsIEludGVydmFsJykpLnRvQmVGYWxzeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Rpc3BsYXlzIGF4aXMgdmlzaWJpbGl0eSBoaW50IHdoZW4gbWluL21heCBlbmFibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgZ2V0QnlUZXh0KCdJZiB5b3Ugd2FudCB0aGUgYXhpcyB0byBiZSB2aXNpYmxlLCB1c2UgYSB6ZXJvIG9yIG5lZ2F0aXZlIE1pbiBWYWx1ZSwgYW5kIGEgcG9zaXRpdmUgTWF4IFZhbHVlJyksXG4gICAgICApLnRvQmVUcnV0aHkoKTtcbiAgICB9KTtcblxuICAgIGl0KCdkaXNwbGF5cyB1bm51bWJlcmVkIGdyaWRsaW5lcyBoaW50IHdoZW4gbGFiZWxTdGVwIGVuYWJsZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEJ5VGV4dCB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KGdldEJ5VGV4dCgnRm9yIHVubnVtYmVyZWQgZ3JpZGxpbmVzLCBlbnRlciBhIGxhYmVsIGludGVydmFsIG9mIDAnKSkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ3JpZGxpbmVzIGNvbmZpZ3VyYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgZ3JpZGxpbmVzIGNvbmZpZyB3aGVuIGluY2x1ZGVBeGVzIGlzIGZhbHNlJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgaW5jbHVkZUF4ZXM6IGZhbHNlLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgZ2V0QnlMYWJlbFRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5wcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KGdldEJ5TGFiZWxUZXh0KCdOdW1iZXIgb2YgVmVydGljYWwgR3JpZGxpbmVzJykpLnRvQmVUcnV0aHkoKTtcbiAgICAgIGV4cGVjdChnZXRCeUxhYmVsVGV4dCgnTnVtYmVyIG9mIEhvcml6b250YWwgR3JpZGxpbmVzJykpLnRvQmVUcnV0aHkoKTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCByZW5kZXIgYXhlcyBjb25maWcgd2hlbiBpbmNsdWRlQXhlcyBpcyBmYWxzZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgIGluY2x1ZGVBeGVzOiBmYWxzZSxcbiAgICAgIH07XG4gICAgICBjb25zdCB7IHF1ZXJ5QnlUZXh0IH0gPSByZW5kZXIoPEdyaWRTZXR1cCB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChxdWVyeUJ5VGV4dCgnQXhpcyBMYWJlbCcpKS50b0JlRmFsc3koKTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCByZW5kZXIgZ3JpZGxpbmVzIGNvbmZpZyB3aGVuIG1heCBpcyBkaXNhYmxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgIGluY2x1ZGVBeGVzOiBmYWxzZSxcbiAgICAgICAgZGlzcGxheWVkRmllbGRzOiB7XG4gICAgICAgICAgLi4uZGVmYXVsdFByb3BzLmRpc3BsYXllZEZpZWxkcyxcbiAgICAgICAgICBtYXg6IHsgZW5hYmxlZDogZmFsc2UgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCB7IHF1ZXJ5QnlMYWJlbFRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5wcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlMYWJlbFRleHQoJ051bWJlciBvZiBWZXJ0aWNhbCBHcmlkbGluZXMnKSkudG9CZUZhbHN5KCk7XG4gICAgICBleHBlY3QocXVlcnlCeUxhYmVsVGV4dCgnTnVtYmVyIG9mIEhvcml6b250YWwgR3JpZGxpbmVzJykpLnRvQmVGYWxzeSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndXNlciBpbnRlcmFjdGlvbnMnLCAoKSA9PiB7XG4gICAgaXQoJ2NhbGxzIG9uQ2hhbmdlIHdoZW4gaW5jbHVkZUF4ZXMgdG9nZ2xlIGlzIGNsaWNrZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3QgdG9nZ2xlSW5wdXQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdJyk7XG5cbiAgICAgIGZpcmVFdmVudC5jbGljayh0b2dnbGVJbnB1dCk7XG5cbiAgICAgIGV4cGVjdChtb2NrT25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgaW5jbHVkZUF4ZXM6IGZhbHNlLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2FsbHMgb25DaGFuZ2Ugd2l0aCBwcm9wZXIgY29uZmlnIHdoZW4gaW5jbHVkZUF4ZXMgaXMgZGlzYWJsZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3QgdG9nZ2xlSW5wdXQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdJyk7XG5cbiAgICAgIGZpcmVFdmVudC5jbGljayh0b2dnbGVJbnB1dCk7XG5cbiAgICAgIGV4cGVjdChtb2NrT25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgaW5jbHVkZUF4ZXM6IGZhbHNlLFxuICAgICAgICAgIGRvbWFpbjogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgbWluOiAxLFxuICAgICAgICAgICAgbWF4OiA1LFxuICAgICAgICAgICAgc3RlcDogMSxcbiAgICAgICAgICAgIGxhYmVsU3RlcDogMCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICByYW5nZTogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgbWluOiAxLFxuICAgICAgICAgICAgbWF4OiA1LFxuICAgICAgICAgICAgc3RlcDogMSxcbiAgICAgICAgICAgIGxhYmVsU3RlcDogMCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NhbGxzIG9uQ2hhbmdlIHdpdGggcHJvcGVyIGNvbmZpZyB3aGVuIGluY2x1ZGVBeGVzIGlzIGVuYWJsZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgLi4uZGVmYXVsdFByb3BzLFxuICAgICAgICBpbmNsdWRlQXhlczogZmFsc2UsXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5wcm9wc30gLz4pO1xuICAgICAgY29uc3QgdG9nZ2xlSW5wdXRzID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W3R5cGU9XCJjaGVja2JveFwiXScpO1xuICAgICAgY29uc3QgaW5jbHVkZUF4ZXNUb2dnbGUgPSB0b2dnbGVJbnB1dHNbMF07IC8vIEZpcnN0IHRvZ2dsZSBpcyBpbmNsdWRlQXhlc1xuXG4gICAgICBmaXJlRXZlbnQuY2xpY2soaW5jbHVkZUF4ZXNUb2dnbGUpO1xuXG4gICAgICBleHBlY3QobW9ja09uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgIGluY2x1ZGVBeGVzOiB0cnVlLFxuICAgICAgICAgIGRvbWFpbjogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgbGFiZWxTdGVwOiAxLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHJhbmdlOiBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICBsYWJlbFN0ZXA6IDEsXG4gICAgICAgICAgfSksXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBvbkNoYW5nZSB3aGVuIHN0YW5kYXJkR3JpZCB0b2dnbGUgaXMgY2xpY2tlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEdyaWRTZXR1cCB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgICBjb25zdCB0b2dnbGVJbnB1dHMgPSBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdJyk7XG4gICAgICBjb25zdCBzdGFuZGFyZEdyaWRUb2dnbGUgPSB0b2dnbGVJbnB1dHNbMV07IC8vIFNlY29uZCB0b2dnbGUgaXMgc3RhbmRhcmRHcmlkXG5cbiAgICAgIGZpcmVFdmVudC5jbGljayhzdGFuZGFyZEdyaWRUb2dnbGUpO1xuXG4gICAgICBleHBlY3QobW9ja09uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgIHN0YW5kYXJkR3JpZDogdHJ1ZSxcbiAgICAgICAgICBncmFwaDogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgd2lkdGg6IDQ4MCxcbiAgICAgICAgICAgIGhlaWdodDogNDgwLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2FsbHMgb25DaGFuZ2Ugd2hlbiB3aWR0aCBpcyBjaGFuZ2VkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRBbGxCeUxhYmVsVGV4dCB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3Qgd2lkdGhJbnB1dCA9IGdldEFsbEJ5TGFiZWxUZXh0KCdXaWR0aCcpWzBdO1xuXG4gICAgICBmaXJlRXZlbnQuY2hhbmdlKHdpZHRoSW5wdXQsIHsgdGFyZ2V0OiB7IHZhbHVlOiAnNTAwJyB9IH0pO1xuICAgICAgZmlyZUV2ZW50LmJsdXIod2lkdGhJbnB1dCk7XG5cbiAgICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgICBleHBlY3QobW9ja09uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICBncmFwaDogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICB3aWR0aDogNTAwLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBvbkNoYW5nZSB3aGVuIGhlaWdodCBpcyBjaGFuZ2VkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRBbGxCeUxhYmVsVGV4dCB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3QgaGVpZ2h0SW5wdXQgPSBnZXRBbGxCeUxhYmVsVGV4dCgnSGVpZ2h0JylbMF07XG5cbiAgICAgIGZpcmVFdmVudC5jaGFuZ2UoaGVpZ2h0SW5wdXQsIHsgdGFyZ2V0OiB7IHZhbHVlOiAnNTIwJyB9IH0pO1xuICAgICAgZmlyZUV2ZW50LmJsdXIoaGVpZ2h0SW5wdXQpO1xuXG4gICAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KG1vY2tPbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgZ3JhcGg6IGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgICAgaGVpZ2h0OiA1MjAsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3VwZGF0ZXMgYm90aCB3aWR0aCBhbmQgaGVpZ2h0IHdoZW4gc3RhbmRhcmRHcmlkIGlzIHRydWUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgLi4uZGVmYXVsdFByb3BzLFxuICAgICAgICBzdGFuZGFyZEdyaWQ6IHRydWUsXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBnZXRBbGxCeUxhYmVsVGV4dCB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLnByb3BzfSAvPik7XG4gICAgICBjb25zdCB3aWR0aElucHV0ID0gZ2V0QWxsQnlMYWJlbFRleHQoJ1dpZHRoJylbMF07XG5cbiAgICAgIGZpcmVFdmVudC5jaGFuZ2Uod2lkdGhJbnB1dCwgeyB0YXJnZXQ6IHsgdmFsdWU6ICc2MDAnIH0gfSk7XG4gICAgICBmaXJlRXZlbnQuYmx1cih3aWR0aElucHV0KTtcblxuICAgICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChtb2NrT25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgIGdyYXBoOiBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICAgIHdpZHRoOiA2MDAsXG4gICAgICAgICAgICAgIGhlaWdodDogNjAwLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBvbkNoYW5nZSB3aGVuIGRvbWFpbiBtaW4gaXMgY2hhbmdlZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlMYWJlbFRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IG1pbklucHV0cyA9IGdldEFsbEJ5TGFiZWxUZXh0KCdNaW4nKTtcbiAgICAgIGNvbnN0IGRvbWFpbk1pbklucHV0ID0gbWluSW5wdXRzWzBdO1xuXG4gICAgICBmaXJlRXZlbnQuY2hhbmdlKGRvbWFpbk1pbklucHV0LCB7IHRhcmdldDogeyB2YWx1ZTogJy0xMCcgfSB9KTtcbiAgICAgIGZpcmVFdmVudC5ibHVyKGRvbWFpbk1pbklucHV0KTtcblxuICAgICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChtb2NrT25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgIGRvbWFpbjogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICBtaW46IC0xMCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2FsbHMgb25DaGFuZ2Ugd2hlbiBkb21haW4gbWF4IGlzIGNoYW5nZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5TGFiZWxUZXh0IH0gPSByZW5kZXIoPEdyaWRTZXR1cCB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgICBjb25zdCBtYXhJbnB1dHMgPSBnZXRBbGxCeUxhYmVsVGV4dCgnTWF4Jyk7XG4gICAgICBjb25zdCBkb21haW5NYXhJbnB1dCA9IG1heElucHV0c1swXTtcblxuICAgICAgZmlyZUV2ZW50LmNoYW5nZShkb21haW5NYXhJbnB1dCwgeyB0YXJnZXQ6IHsgdmFsdWU6ICcxMCcgfSB9KTtcbiAgICAgIGZpcmVFdmVudC5ibHVyKGRvbWFpbk1heElucHV0KTtcblxuICAgICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChtb2NrT25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgIGRvbWFpbjogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICBtYXg6IDEwLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBvbkNoYW5nZSB3aGVuIHJhbmdlIG1pbiBpcyBjaGFuZ2VkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRBbGxCeUxhYmVsVGV4dCB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3QgbWluSW5wdXRzID0gZ2V0QWxsQnlMYWJlbFRleHQoJ01pbicpO1xuICAgICAgY29uc3QgcmFuZ2VNaW5JbnB1dCA9IG1pbklucHV0c1sxXTtcblxuICAgICAgZmlyZUV2ZW50LmNoYW5nZShyYW5nZU1pbklucHV0LCB7IHRhcmdldDogeyB2YWx1ZTogJy04JyB9IH0pO1xuICAgICAgZmlyZUV2ZW50LmJsdXIocmFuZ2VNaW5JbnB1dCk7XG5cbiAgICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgICBleHBlY3QobW9ja09uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICByYW5nZTogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICBtaW46IC04LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBvbkNoYW5nZSB3aGVuIHJhbmdlIG1heCBpcyBjaGFuZ2VkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRBbGxCeUxhYmVsVGV4dCB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3QgbWF4SW5wdXRzID0gZ2V0QWxsQnlMYWJlbFRleHQoJ01heCcpO1xuICAgICAgY29uc3QgcmFuZ2VNYXhJbnB1dCA9IG1heElucHV0c1sxXTtcblxuICAgICAgZmlyZUV2ZW50LmNoYW5nZShyYW5nZU1heElucHV0LCB7IHRhcmdldDogeyB2YWx1ZTogJzEyJyB9IH0pO1xuICAgICAgZmlyZUV2ZW50LmJsdXIocmFuZ2VNYXhJbnB1dCk7XG5cbiAgICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgICBleHBlY3QobW9ja09uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICByYW5nZTogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICBtYXg6IDEyLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCd1cGRhdGVzIGJvdGggZG9tYWluIGFuZCByYW5nZSB3aGVuIHN0YW5kYXJkR3JpZCBpcyB0cnVlIGFuZCBkb21haW4gY2hhbmdlcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgIHN0YW5kYXJkR3JpZDogdHJ1ZSxcbiAgICAgIH07XG4gICAgICBjb25zdCB7IGdldEFsbEJ5TGFiZWxUZXh0IH0gPSByZW5kZXIoPEdyaWRTZXR1cCB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IG1pbklucHV0cyA9IGdldEFsbEJ5TGFiZWxUZXh0KCdNaW4nKTtcbiAgICAgIGNvbnN0IGRvbWFpbk1pbklucHV0ID0gbWluSW5wdXRzWzBdO1xuXG4gICAgICBmaXJlRXZlbnQuY2hhbmdlKGRvbWFpbk1pbklucHV0LCB7IHRhcmdldDogeyB2YWx1ZTogJy0xNScgfSB9KTtcbiAgICAgIGZpcmVFdmVudC5ibHVyKGRvbWFpbk1pbklucHV0KTtcblxuICAgICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChtb2NrT25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgIGRvbWFpbjogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICBtaW46IC0xNSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcmFuZ2U6IGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgICAgbWluOiAtMTUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHVwZGF0ZSByYW5nZSB3aGVuIGRvbWFpbiBheGlzTGFiZWwgY2hhbmdlcyB3aXRoIHN0YW5kYXJkR3JpZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgIHN0YW5kYXJkR3JpZDogdHJ1ZSxcbiAgICAgIH07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLnByb3BzfSAvPik7XG5cbiAgICAgIC8vIEVkaXRhYmxlSFRNTCBjaGFuZ2UgaXMgaGFyZGVyIHRvIHRyaWdnZXIsIGJ1dCB3ZSBjYW4gdGVzdCB0aGUgaGFuZGxlciBkaXJlY3RseVxuICAgICAgLy8gYnkgdmVyaWZ5aW5nIHRoZSByYW5nZSBkb2Vzbid0IGdldCB0aGUgYXhpc0xhYmVsIHZhbHVlIGZyb20gZG9tYWluXG4gICAgICBjb25zdCBheGlzTGFiZWxJbnB1dHMgPSBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl0nKTtcblxuICAgICAgaWYgKGF4aXNMYWJlbElucHV0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZpcmVFdmVudC5pbnB1dChheGlzTGFiZWxJbnB1dHNbMF0sIHsgdGFyZ2V0OiB7IGlubmVySFRNTDogJ1gtQXhpcycgfSB9KTtcblxuICAgICAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgICAgICBpZiAobW9ja09uQ2hhbmdlLm1vY2suY2FsbHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgbGFzdENhbGwgPSBtb2NrT25DaGFuZ2UubW9jay5jYWxsc1ttb2NrT25DaGFuZ2UubW9jay5jYWxscy5sZW5ndGggLSAxXVswXTtcbiAgICAgICAgICAgIC8vIHJhbmdlLmF4aXNMYWJlbCBzaG91bGQgbm90IGJlICdYLUF4aXMnLCBpdCBzaG91bGQga2VlcCBpdHMgb3JpZ2luYWwgdmFsdWVcbiAgICAgICAgICAgIGV4cGVjdChsYXN0Q2FsbC5yYW5nZT8uYXhpc0xhYmVsKS5ub3QudG9CZSgnWC1BeGlzJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBvbkNoYW5nZVZpZXcgd2hlbiBhY2NvcmRpb24gaXMgdG9nZ2xlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEdyaWRTZXR1cCB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgICBjb25zdCBhY2NvcmRpb25TdW1tYXJ5ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1thcmlhLWV4cGFuZGVkXScpO1xuXG4gICAgICBmaXJlRXZlbnQuY2xpY2soYWNjb3JkaW9uU3VtbWFyeSk7XG5cbiAgICAgIGV4cGVjdChtb2NrT25DaGFuZ2VWaWV3KS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdkaXNhYmxlZCBzdGF0ZXMnLCAoKSA9PiB7XG4gICAgaXQoJ2Rpc2FibGVzIHJhbmdlIGZpZWxkcyB3aGVuIHN0YW5kYXJkR3JpZCBpcyB0cnVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgc3RhbmRhcmRHcmlkOiB0cnVlLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlMYWJlbFRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5wcm9wc30gLz4pO1xuICAgICAgY29uc3QgbWluSW5wdXRzID0gZ2V0QWxsQnlMYWJlbFRleHQoJ01pbicpO1xuICAgICAgY29uc3QgcmFuZ2VNaW5JbnB1dCA9IG1pbklucHV0c1sxXTtcblxuICAgICAgZXhwZWN0KHJhbmdlTWluSW5wdXQpLnRvQmVEaXNhYmxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Rpc2FibGVzIGhlaWdodCBmaWVsZCB3aGVuIHN0YW5kYXJkR3JpZCBpcyB0cnVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgc3RhbmRhcmRHcmlkOiB0cnVlLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlMYWJlbFRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5wcm9wc30gLz4pO1xuICAgICAgY29uc3QgaGVpZ2h0SW5wdXQgPSBnZXRBbGxCeUxhYmVsVGV4dCgnSGVpZ2h0JylbMF07XG5cbiAgICAgIGV4cGVjdChoZWlnaHRJbnB1dCkudG9CZURpc2FibGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZGlzYWJsZXMgaG9yaXpvbnRhbCBncmlkbGluZXMgZmllbGQgd2hlbiBzdGFuZGFyZEdyaWQgaXMgdHJ1ZSBhbmQgaW5jbHVkZUF4ZXMgaXMgZmFsc2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgLi4uZGVmYXVsdFByb3BzLFxuICAgICAgICBpbmNsdWRlQXhlczogZmFsc2UsXG4gICAgICAgIHN0YW5kYXJkR3JpZDogdHJ1ZSxcbiAgICAgIH07XG4gICAgICBjb25zdCB7IGdldEJ5TGFiZWxUZXh0IH0gPSByZW5kZXIoPEdyaWRTZXR1cCB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IGhvcml6b250YWxHcmlkbGluZXNJbnB1dCA9IGdldEJ5TGFiZWxUZXh0KCdOdW1iZXIgb2YgSG9yaXpvbnRhbCBHcmlkbGluZXMnKTtcblxuICAgICAgZXhwZWN0KGhvcml6b250YWxHcmlkbGluZXNJbnB1dCkudG9CZURpc2FibGVkKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdHcmlkQ29uZmlnIGNvbXBvbmVudCcsICgpID0+IHtcbiAgICBpdCgncmVuZGVycyBzdGVwIGZpZWxkIHdoZW4gZW5hYmxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlMYWJlbFRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IGludGVydmFsRmllbGRzID0gZ2V0QWxsQnlMYWJlbFRleHQoJ0ludGVydmFsJyk7XG4gICAgICBleHBlY3QoaW50ZXJ2YWxGaWVsZHMubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBsYWJlbFN0ZXAgZmllbGQgd2hlbiBlbmFibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRBbGxCeUxhYmVsVGV4dCB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3QgbGFiZWxJbnRlcnZhbEZpZWxkcyA9IGdldEFsbEJ5TGFiZWxUZXh0KCdMYWJlbCBJbnRlcnZhbCcpO1xuICAgICAgZXhwZWN0KGxhYmVsSW50ZXJ2YWxGaWVsZHMubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgcmVuZGVyIHdoZW4gYm90aCBzdGVwIGFuZCBsYWJlbFN0ZXAgYXJlIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgZGlzcGxheWVkRmllbGRzOiB7XG4gICAgICAgICAgLi4uZGVmYXVsdFByb3BzLmRpc3BsYXllZEZpZWxkcyxcbiAgICAgICAgICBzdGVwOiB7IGVuYWJsZWQ6IGZhbHNlIH0sXG4gICAgICAgICAgbGFiZWxTdGVwOiB7IGVuYWJsZWQ6IGZhbHNlIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBxdWVyeUJ5TGFiZWxUZXh0IH0gPSByZW5kZXIoPEdyaWRTZXR1cCB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChxdWVyeUJ5TGFiZWxUZXh0KCdJbnRlcnZhbCcpKS50b0JlRmFsc3koKTtcbiAgICAgIGV4cGVjdChxdWVyeUJ5TGFiZWxUZXh0KCdMYWJlbCBJbnRlcnZhbCcpKS50b0JlRmFsc3koKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0F4aXNDb25maWcgY29tcG9uZW50JywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHgtYXhpcyBoZWFkZXInLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3QgaGVhZGVycyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCdpJyk7XG4gICAgICBjb25zdCB4QXhpc0hlYWRlciA9IEFycmF5LmZyb20oaGVhZGVycykuZmluZCgoaCkgPT4gaC50ZXh0Q29udGVudCA9PT0gJ3gnKTtcbiAgICAgIGV4cGVjdCh4QXhpc0hlYWRlcikudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgeS1heGlzIGhlYWRlcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEdyaWRTZXR1cCB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgICBjb25zdCBoZWFkZXJzID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ2knKTtcbiAgICAgIGNvbnN0IHlBeGlzSGVhZGVyID0gQXJyYXkuZnJvbShoZWFkZXJzKS5maW5kKChoKSA9PiBoLnRleHRDb250ZW50ID09PSAneScpO1xuICAgICAgZXhwZWN0KHlBeGlzSGVhZGVyKS50b0JlVHJ1dGh5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgcmVuZGVyIGhlYWRlcnMgd2hlbiBhbGwgZmllbGRzIGFyZSBkaXNhYmxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgIGRpc3BsYXllZEZpZWxkczoge1xuICAgICAgICAgIC4uLmRlZmF1bHRQcm9wcy5kaXNwbGF5ZWRGaWVsZHMsXG4gICAgICAgICAgbWluOiB7IGVuYWJsZWQ6IGZhbHNlIH0sXG4gICAgICAgICAgbWF4OiB7IGVuYWJsZWQ6IGZhbHNlIH0sXG4gICAgICAgICAgYXhpc0xhYmVsOiB7IGVuYWJsZWQ6IGZhbHNlIH0sXG4gICAgICAgICAgc3RlcDogeyBlbmFibGVkOiBmYWxzZSB9LFxuICAgICAgICAgIGxhYmVsU3RlcDogeyBlbmFibGVkOiBmYWxzZSB9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEdyaWRTZXR1cCB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnaScpO1xuICAgICAgY29uc3QgYXhpc0hlYWRlcnMgPSBBcnJheS5mcm9tKGhlYWRlcnMpLmZpbHRlcigoaCkgPT4gaC50ZXh0Q29udGVudCA9PT0gJ3gnIHx8IGgudGV4dENvbnRlbnQgPT09ICd5Jyk7XG4gICAgICBleHBlY3QoYXhpc0hlYWRlcnMubGVuZ3RoKS50b0JlKDApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQWNjb3JkaW9uIGJlaGF2aW9yJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHdpdGggY29ycmVjdCB0cmFuc2l0aW9uIHByb3BzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IGFjY29yZGlvbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuTXVpQWNjb3JkaW9uLXJvb3QnKTtcbiAgICAgIGV4cGVjdChhY2NvcmRpb24pLnRvQmVUcnV0aHkoKTtcbiAgICB9KTtcblxuICAgIGl0KCdleHBhbmRzIGFuZCBjb2xsYXBzZXMgYWNjb3JkaW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IGFjY29yZGlvblN1bW1hcnkgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignW2FyaWEtZXhwYW5kZWRdJyk7XG5cbiAgICAgIGV4cGVjdChhY2NvcmRpb25TdW1tYXJ5LmdldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcpKS50b0JlKCdmYWxzZScpO1xuXG4gICAgICBmaXJlRXZlbnQuY2xpY2soYWNjb3JkaW9uU3VtbWFyeSk7XG5cbiAgICAgIGV4cGVjdChtb2NrT25DaGFuZ2VWaWV3KS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFVBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFVBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUFzQyxTQUFB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