@pie-lib/config-ui 12.2.0-next.2 → 12.2.0-next.21
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 +80 -28
- package/LICENSE.md +5 -0
- package/lib/alert-dialog.js +1 -1
- package/lib/checkbox.js +1 -1
- package/lib/choice-configuration/feedback-menu.js +1 -1
- package/lib/choice-configuration/index.js +1 -1
- package/lib/choice-utils.js +1 -1
- package/lib/feedback-config/feedback-selector.js +1 -1
- package/lib/feedback-config/group.js +1 -1
- package/lib/feedback-config/index.js +1 -1
- package/lib/form-section.js +1 -1
- package/lib/help.js +1 -1
- package/lib/index.js +1 -1
- package/lib/input.js +1 -1
- package/lib/inputs.js +1 -1
- package/lib/langs.js +1 -1
- package/lib/layout/config-layout.js +1 -1
- package/lib/layout/index.js +1 -1
- package/lib/layout/layout-contents.js +1 -1
- package/lib/layout/settings-box.js +1 -1
- package/lib/mui-box/index.js +1 -1
- package/lib/number-text-field-custom.js +1 -1
- package/lib/number-text-field.js +2 -2
- package/lib/number-text-field.js.map +1 -1
- package/lib/radio-with-label.js +1 -1
- package/lib/settings/display-size.js +1 -1
- package/lib/settings/index.js +1 -1
- package/lib/settings/panel.js +1 -1
- package/lib/settings/settings-radio-label.js +1 -1
- package/lib/settings/toggle.js +1 -1
- package/lib/tabs/index.js +1 -1
- package/lib/tags-input/index.js +1 -1
- package/lib/two-choice.js +1 -1
- package/lib/with-stateful-model.js +1 -1
- package/package.json +5 -5
- package/src/number-text-field.jsx +1 -1
- package/lib/__tests__/alert-dialog.test.js +0 -262
- package/lib/__tests__/checkbox.test.js +0 -227
- package/lib/__tests__/choice-utils.test.js +0 -14
- package/lib/__tests__/form-section.test.js +0 -252
- package/lib/__tests__/help.test.js +0 -270
- package/lib/__tests__/input.test.js +0 -268
- package/lib/__tests__/langs.test.js +0 -541
- package/lib/__tests__/number-text-field-custom.test.js +0 -362
- package/lib/__tests__/number-text-field.test.js +0 -421
- package/lib/__tests__/radio-with-label.test.js +0 -233
- package/lib/__tests__/settings-panel.test.js +0 -184
- package/lib/__tests__/settings.test.js +0 -653
- package/lib/__tests__/tabs.test.js +0 -211
- package/lib/__tests__/two-choice.test.js +0 -124
- package/lib/__tests__/with-stateful-model.test.js +0 -221
- package/lib/choice-configuration/__tests__/feedback-menu.test.js +0 -287
- package/lib/choice-configuration/__tests__/index.test.js +0 -253
- package/lib/feedback-config/__tests__/feedback-config.test.js +0 -201
- package/lib/feedback-config/__tests__/feedback-selector.test.js +0 -177
- package/lib/layout/__tests__/config.layout.test.js +0 -70
- package/lib/layout/__tests__/layout-content.test.js +0 -6
- package/lib/tags-input/__tests__/index.test.js +0 -183
|
@@ -1,653 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
5
|
-
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
6
|
-
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
7
|
-
var _react = _interopRequireDefault(require("react"));
|
|
8
|
-
var _react2 = require("@testing-library/react");
|
|
9
|
-
var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
|
|
10
|
-
var _toggle = _interopRequireDefault(require("../settings/toggle"));
|
|
11
|
-
var _displaySize = _interopRequireDefault(require("../settings/display-size"));
|
|
12
|
-
var _settingsRadioLabel = _interopRequireDefault(require("../settings/settings-radio-label"));
|
|
13
|
-
var _panel = require("../settings/panel");
|
|
14
|
-
describe('Settings Components', function () {
|
|
15
|
-
describe('Toggle', function () {
|
|
16
|
-
it('renders toggle with label', function () {
|
|
17
|
-
var toggle = jest.fn();
|
|
18
|
-
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toggle["default"], {
|
|
19
|
-
label: "Enable Feature",
|
|
20
|
-
checked: false,
|
|
21
|
-
toggle: toggle
|
|
22
|
-
}));
|
|
23
|
-
expect(_react2.screen.getByText('Enable Feature')).toBeInTheDocument();
|
|
24
|
-
});
|
|
25
|
-
});
|
|
26
|
-
describe('DisplaySize', function () {
|
|
27
|
-
var defaultProps = {
|
|
28
|
-
size: {
|
|
29
|
-
width: 500,
|
|
30
|
-
height: 400
|
|
31
|
-
},
|
|
32
|
-
label: 'Display Size',
|
|
33
|
-
onChange: jest.fn()
|
|
34
|
-
};
|
|
35
|
-
beforeEach(function () {
|
|
36
|
-
jest.clearAllMocks();
|
|
37
|
-
});
|
|
38
|
-
it('renders label and input fields', function () {
|
|
39
|
-
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], defaultProps));
|
|
40
|
-
expect(_react2.screen.getByText('Display Size')).toBeInTheDocument();
|
|
41
|
-
expect(_react2.screen.getByLabelText('Width')).toBeInTheDocument();
|
|
42
|
-
expect(_react2.screen.getByLabelText('Height')).toBeInTheDocument();
|
|
43
|
-
});
|
|
44
|
-
it('displays width and height values', function () {
|
|
45
|
-
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], defaultProps));
|
|
46
|
-
var widthInput = _react2.screen.getByLabelText('Width');
|
|
47
|
-
var heightInput = _react2.screen.getByLabelText('Height');
|
|
48
|
-
expect(widthInput).toHaveValue(500);
|
|
49
|
-
expect(heightInput).toHaveValue(400);
|
|
50
|
-
});
|
|
51
|
-
it('calls onChange when width changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
|
|
52
|
-
var user, onChange, widthInput;
|
|
53
|
-
return _regenerator["default"].wrap(function (_context) {
|
|
54
|
-
while (1) switch (_context.prev = _context.next) {
|
|
55
|
-
case 0:
|
|
56
|
-
user = _userEvent["default"].setup();
|
|
57
|
-
onChange = jest.fn();
|
|
58
|
-
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
59
|
-
onChange: onChange
|
|
60
|
-
})));
|
|
61
|
-
widthInput = _react2.screen.getByLabelText('Width');
|
|
62
|
-
_context.next = 1;
|
|
63
|
-
return user.clear(widthInput);
|
|
64
|
-
case 1:
|
|
65
|
-
_context.next = 2;
|
|
66
|
-
return user.type(widthInput, '600');
|
|
67
|
-
case 2:
|
|
68
|
-
_react2.fireEvent.blur(widthInput);
|
|
69
|
-
expect(onChange).toHaveBeenCalledWith(expect.objectContaining({
|
|
70
|
-
width: 600
|
|
71
|
-
}));
|
|
72
|
-
case 3:
|
|
73
|
-
case "end":
|
|
74
|
-
return _context.stop();
|
|
75
|
-
}
|
|
76
|
-
}, _callee);
|
|
77
|
-
})));
|
|
78
|
-
it('calls onChange when height changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2() {
|
|
79
|
-
var user, onChange, heightInput;
|
|
80
|
-
return _regenerator["default"].wrap(function (_context2) {
|
|
81
|
-
while (1) switch (_context2.prev = _context2.next) {
|
|
82
|
-
case 0:
|
|
83
|
-
user = _userEvent["default"].setup();
|
|
84
|
-
onChange = jest.fn();
|
|
85
|
-
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
86
|
-
onChange: onChange
|
|
87
|
-
})));
|
|
88
|
-
heightInput = _react2.screen.getByLabelText('Height');
|
|
89
|
-
_context2.next = 1;
|
|
90
|
-
return user.clear(heightInput);
|
|
91
|
-
case 1:
|
|
92
|
-
_context2.next = 2;
|
|
93
|
-
return user.type(heightInput, '500');
|
|
94
|
-
case 2:
|
|
95
|
-
_react2.fireEvent.blur(heightInput);
|
|
96
|
-
expect(onChange).toHaveBeenCalledWith(expect.objectContaining({
|
|
97
|
-
height: 500
|
|
98
|
-
}));
|
|
99
|
-
case 3:
|
|
100
|
-
case "end":
|
|
101
|
-
return _context2.stop();
|
|
102
|
-
}
|
|
103
|
-
}, _callee2);
|
|
104
|
-
})));
|
|
105
|
-
it('maintains other dimension when one changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3() {
|
|
106
|
-
var user, onChange, widthInput;
|
|
107
|
-
return _regenerator["default"].wrap(function (_context3) {
|
|
108
|
-
while (1) switch (_context3.prev = _context3.next) {
|
|
109
|
-
case 0:
|
|
110
|
-
user = _userEvent["default"].setup();
|
|
111
|
-
onChange = jest.fn();
|
|
112
|
-
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
113
|
-
onChange: onChange
|
|
114
|
-
})));
|
|
115
|
-
widthInput = _react2.screen.getByLabelText('Width');
|
|
116
|
-
_context3.next = 1;
|
|
117
|
-
return user.clear(widthInput);
|
|
118
|
-
case 1:
|
|
119
|
-
_context3.next = 2;
|
|
120
|
-
return user.type(widthInput, '700');
|
|
121
|
-
case 2:
|
|
122
|
-
_react2.fireEvent.blur(widthInput);
|
|
123
|
-
expect(onChange).toHaveBeenCalledWith({
|
|
124
|
-
width: 700,
|
|
125
|
-
height: 400
|
|
126
|
-
});
|
|
127
|
-
case 3:
|
|
128
|
-
case "end":
|
|
129
|
-
return _context3.stop();
|
|
130
|
-
}
|
|
131
|
-
}, _callee3);
|
|
132
|
-
})));
|
|
133
|
-
it('enforces min value constraint', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee4() {
|
|
134
|
-
var user, onChange, widthInput;
|
|
135
|
-
return _regenerator["default"].wrap(function (_context4) {
|
|
136
|
-
while (1) switch (_context4.prev = _context4.next) {
|
|
137
|
-
case 0:
|
|
138
|
-
user = _userEvent["default"].setup();
|
|
139
|
-
onChange = jest.fn();
|
|
140
|
-
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
141
|
-
onChange: onChange
|
|
142
|
-
})));
|
|
143
|
-
widthInput = _react2.screen.getByLabelText('Width');
|
|
144
|
-
_context4.next = 1;
|
|
145
|
-
return user.clear(widthInput);
|
|
146
|
-
case 1:
|
|
147
|
-
_context4.next = 2;
|
|
148
|
-
return user.type(widthInput, '100');
|
|
149
|
-
case 2:
|
|
150
|
-
_react2.fireEvent.blur(widthInput);
|
|
151
|
-
|
|
152
|
-
// Should clamp to minimum 150
|
|
153
|
-
expect(widthInput).toHaveValue(150);
|
|
154
|
-
case 3:
|
|
155
|
-
case "end":
|
|
156
|
-
return _context4.stop();
|
|
157
|
-
}
|
|
158
|
-
}, _callee4);
|
|
159
|
-
})));
|
|
160
|
-
it('enforces max value constraint', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee5() {
|
|
161
|
-
var user, onChange, widthInput;
|
|
162
|
-
return _regenerator["default"].wrap(function (_context5) {
|
|
163
|
-
while (1) switch (_context5.prev = _context5.next) {
|
|
164
|
-
case 0:
|
|
165
|
-
user = _userEvent["default"].setup();
|
|
166
|
-
onChange = jest.fn();
|
|
167
|
-
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
168
|
-
onChange: onChange
|
|
169
|
-
})));
|
|
170
|
-
widthInput = _react2.screen.getByLabelText('Width');
|
|
171
|
-
_context5.next = 1;
|
|
172
|
-
return user.clear(widthInput);
|
|
173
|
-
case 1:
|
|
174
|
-
_context5.next = 2;
|
|
175
|
-
return user.type(widthInput, '2000');
|
|
176
|
-
case 2:
|
|
177
|
-
_react2.fireEvent.blur(widthInput);
|
|
178
|
-
|
|
179
|
-
// Should clamp to maximum 1000
|
|
180
|
-
expect(widthInput).toHaveValue(1000);
|
|
181
|
-
case 3:
|
|
182
|
-
case "end":
|
|
183
|
-
return _context5.stop();
|
|
184
|
-
}
|
|
185
|
-
}, _callee5);
|
|
186
|
-
})));
|
|
187
|
-
it('updates when size prop changes', function () {
|
|
188
|
-
var _render = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], defaultProps)),
|
|
189
|
-
rerender = _render.rerender;
|
|
190
|
-
var widthInput = _react2.screen.getByLabelText('Width');
|
|
191
|
-
expect(widthInput).toHaveValue(500);
|
|
192
|
-
rerender(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
193
|
-
size: {
|
|
194
|
-
width: 800,
|
|
195
|
-
height: 600
|
|
196
|
-
}
|
|
197
|
-
})));
|
|
198
|
-
widthInput = _react2.screen.getByLabelText('Width');
|
|
199
|
-
expect(widthInput).toHaveValue(800);
|
|
200
|
-
});
|
|
201
|
-
it('handles boundary values at minimum', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee6() {
|
|
202
|
-
var user, onChange, widthInput, heightInput;
|
|
203
|
-
return _regenerator["default"].wrap(function (_context6) {
|
|
204
|
-
while (1) switch (_context6.prev = _context6.next) {
|
|
205
|
-
case 0:
|
|
206
|
-
user = _userEvent["default"].setup();
|
|
207
|
-
onChange = jest.fn();
|
|
208
|
-
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
209
|
-
onChange: onChange
|
|
210
|
-
})));
|
|
211
|
-
widthInput = _react2.screen.getByLabelText('Width');
|
|
212
|
-
heightInput = _react2.screen.getByLabelText('Height');
|
|
213
|
-
_context6.next = 1;
|
|
214
|
-
return user.clear(widthInput);
|
|
215
|
-
case 1:
|
|
216
|
-
_context6.next = 2;
|
|
217
|
-
return user.type(widthInput, '150');
|
|
218
|
-
case 2:
|
|
219
|
-
_react2.fireEvent.blur(widthInput);
|
|
220
|
-
_context6.next = 3;
|
|
221
|
-
return user.clear(heightInput);
|
|
222
|
-
case 3:
|
|
223
|
-
_context6.next = 4;
|
|
224
|
-
return user.type(heightInput, '150');
|
|
225
|
-
case 4:
|
|
226
|
-
_react2.fireEvent.blur(heightInput);
|
|
227
|
-
expect(widthInput).toHaveValue(150);
|
|
228
|
-
expect(heightInput).toHaveValue(150);
|
|
229
|
-
case 5:
|
|
230
|
-
case "end":
|
|
231
|
-
return _context6.stop();
|
|
232
|
-
}
|
|
233
|
-
}, _callee6);
|
|
234
|
-
})));
|
|
235
|
-
it('handles boundary values at maximum', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee7() {
|
|
236
|
-
var user, onChange, widthInput, heightInput;
|
|
237
|
-
return _regenerator["default"].wrap(function (_context7) {
|
|
238
|
-
while (1) switch (_context7.prev = _context7.next) {
|
|
239
|
-
case 0:
|
|
240
|
-
user = _userEvent["default"].setup();
|
|
241
|
-
onChange = jest.fn();
|
|
242
|
-
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
243
|
-
onChange: onChange
|
|
244
|
-
})));
|
|
245
|
-
widthInput = _react2.screen.getByLabelText('Width');
|
|
246
|
-
heightInput = _react2.screen.getByLabelText('Height');
|
|
247
|
-
_context7.next = 1;
|
|
248
|
-
return user.clear(widthInput);
|
|
249
|
-
case 1:
|
|
250
|
-
_context7.next = 2;
|
|
251
|
-
return user.type(widthInput, '1000');
|
|
252
|
-
case 2:
|
|
253
|
-
_react2.fireEvent.blur(widthInput);
|
|
254
|
-
_context7.next = 3;
|
|
255
|
-
return user.clear(heightInput);
|
|
256
|
-
case 3:
|
|
257
|
-
_context7.next = 4;
|
|
258
|
-
return user.type(heightInput, '1000');
|
|
259
|
-
case 4:
|
|
260
|
-
_react2.fireEvent.blur(heightInput);
|
|
261
|
-
expect(widthInput).toHaveValue(1000);
|
|
262
|
-
expect(heightInput).toHaveValue(1000);
|
|
263
|
-
case 5:
|
|
264
|
-
case "end":
|
|
265
|
-
return _context7.stop();
|
|
266
|
-
}
|
|
267
|
-
}, _callee7);
|
|
268
|
-
})));
|
|
269
|
-
it('handles decimal input values', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee8() {
|
|
270
|
-
var user, onChange, widthInput;
|
|
271
|
-
return _regenerator["default"].wrap(function (_context8) {
|
|
272
|
-
while (1) switch (_context8.prev = _context8.next) {
|
|
273
|
-
case 0:
|
|
274
|
-
user = _userEvent["default"].setup();
|
|
275
|
-
onChange = jest.fn();
|
|
276
|
-
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
277
|
-
onChange: onChange
|
|
278
|
-
})));
|
|
279
|
-
widthInput = _react2.screen.getByLabelText('Width');
|
|
280
|
-
_context8.next = 1;
|
|
281
|
-
return user.clear(widthInput);
|
|
282
|
-
case 1:
|
|
283
|
-
_context8.next = 2;
|
|
284
|
-
return user.type(widthInput, '500.5');
|
|
285
|
-
case 2:
|
|
286
|
-
_react2.fireEvent.blur(widthInput);
|
|
287
|
-
expect(widthInput).toBeInTheDocument();
|
|
288
|
-
case 3:
|
|
289
|
-
case "end":
|
|
290
|
-
return _context8.stop();
|
|
291
|
-
}
|
|
292
|
-
}, _callee8);
|
|
293
|
-
})));
|
|
294
|
-
it('handles empty input and resets to min', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee9() {
|
|
295
|
-
var user, onChange, widthInput;
|
|
296
|
-
return _regenerator["default"].wrap(function (_context9) {
|
|
297
|
-
while (1) switch (_context9.prev = _context9.next) {
|
|
298
|
-
case 0:
|
|
299
|
-
user = _userEvent["default"].setup();
|
|
300
|
-
onChange = jest.fn();
|
|
301
|
-
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
302
|
-
onChange: onChange
|
|
303
|
-
})));
|
|
304
|
-
widthInput = _react2.screen.getByLabelText('Width');
|
|
305
|
-
_context9.next = 1;
|
|
306
|
-
return user.clear(widthInput);
|
|
307
|
-
case 1:
|
|
308
|
-
_react2.fireEvent.blur(widthInput);
|
|
309
|
-
|
|
310
|
-
// Should reset to minimum value
|
|
311
|
-
expect(widthInput).toHaveValue(150);
|
|
312
|
-
case 2:
|
|
313
|
-
case "end":
|
|
314
|
-
return _context9.stop();
|
|
315
|
-
}
|
|
316
|
-
}, _callee9);
|
|
317
|
-
})));
|
|
318
|
-
it('handles rapid width and height changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee0() {
|
|
319
|
-
var user, onChange, widthInput;
|
|
320
|
-
return _regenerator["default"].wrap(function (_context0) {
|
|
321
|
-
while (1) switch (_context0.prev = _context0.next) {
|
|
322
|
-
case 0:
|
|
323
|
-
user = _userEvent["default"].setup();
|
|
324
|
-
onChange = jest.fn();
|
|
325
|
-
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
326
|
-
onChange: onChange
|
|
327
|
-
})));
|
|
328
|
-
widthInput = _react2.screen.getByLabelText('Width');
|
|
329
|
-
_context0.next = 1;
|
|
330
|
-
return user.clear(widthInput);
|
|
331
|
-
case 1:
|
|
332
|
-
_context0.next = 2;
|
|
333
|
-
return user.type(widthInput, '6');
|
|
334
|
-
case 2:
|
|
335
|
-
_context0.next = 3;
|
|
336
|
-
return user.type(widthInput, '0');
|
|
337
|
-
case 3:
|
|
338
|
-
_context0.next = 4;
|
|
339
|
-
return user.type(widthInput, '0');
|
|
340
|
-
case 4:
|
|
341
|
-
_react2.fireEvent.blur(widthInput);
|
|
342
|
-
expect(onChange).toHaveBeenCalled();
|
|
343
|
-
case 5:
|
|
344
|
-
case "end":
|
|
345
|
-
return _context0.stop();
|
|
346
|
-
}
|
|
347
|
-
}, _callee0);
|
|
348
|
-
})));
|
|
349
|
-
it('clamps height at both boundaries', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee1() {
|
|
350
|
-
var user, onChange, heightInput;
|
|
351
|
-
return _regenerator["default"].wrap(function (_context1) {
|
|
352
|
-
while (1) switch (_context1.prev = _context1.next) {
|
|
353
|
-
case 0:
|
|
354
|
-
user = _userEvent["default"].setup();
|
|
355
|
-
onChange = jest.fn();
|
|
356
|
-
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
357
|
-
onChange: onChange
|
|
358
|
-
})));
|
|
359
|
-
heightInput = _react2.screen.getByLabelText('Height'); // Test below min
|
|
360
|
-
_context1.next = 1;
|
|
361
|
-
return user.clear(heightInput);
|
|
362
|
-
case 1:
|
|
363
|
-
_context1.next = 2;
|
|
364
|
-
return user.type(heightInput, '50');
|
|
365
|
-
case 2:
|
|
366
|
-
_react2.fireEvent.blur(heightInput);
|
|
367
|
-
expect(heightInput).toHaveValue(150);
|
|
368
|
-
|
|
369
|
-
// Test above max
|
|
370
|
-
_context1.next = 3;
|
|
371
|
-
return user.clear(heightInput);
|
|
372
|
-
case 3:
|
|
373
|
-
_context1.next = 4;
|
|
374
|
-
return user.type(heightInput, '2500');
|
|
375
|
-
case 4:
|
|
376
|
-
_react2.fireEvent.blur(heightInput);
|
|
377
|
-
expect(heightInput).toHaveValue(1000);
|
|
378
|
-
case 5:
|
|
379
|
-
case "end":
|
|
380
|
-
return _context1.stop();
|
|
381
|
-
}
|
|
382
|
-
}, _callee1);
|
|
383
|
-
})));
|
|
384
|
-
it('displays custom label text', function () {
|
|
385
|
-
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], {
|
|
386
|
-
size: {
|
|
387
|
-
width: 500,
|
|
388
|
-
height: 400
|
|
389
|
-
},
|
|
390
|
-
label: "Custom Size Settings",
|
|
391
|
-
onChange: jest.fn()
|
|
392
|
-
}));
|
|
393
|
-
expect(_react2.screen.getByText('Custom Size Settings')).toBeInTheDocument();
|
|
394
|
-
});
|
|
395
|
-
it('renders with variant outlined', function () {
|
|
396
|
-
var _render2 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], defaultProps)),
|
|
397
|
-
container = _render2.container;
|
|
398
|
-
var inputs = container.querySelectorAll('input');
|
|
399
|
-
expect(inputs.length).toBe(2);
|
|
400
|
-
});
|
|
401
|
-
});
|
|
402
|
-
describe('SettingsRadioLabel', function () {
|
|
403
|
-
it('renders radio label', function () {
|
|
404
|
-
var onChange = jest.fn();
|
|
405
|
-
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_settingsRadioLabel["default"], {
|
|
406
|
-
label: "Option 1",
|
|
407
|
-
value: "option1",
|
|
408
|
-
checked: false,
|
|
409
|
-
onChange: onChange
|
|
410
|
-
}));
|
|
411
|
-
expect(_react2.screen.getByText('Option 1')).toBeInTheDocument();
|
|
412
|
-
expect(_react2.screen.getByRole('radio')).toBeInTheDocument();
|
|
413
|
-
});
|
|
414
|
-
it('renders checked state', function () {
|
|
415
|
-
var onChange = jest.fn();
|
|
416
|
-
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_settingsRadioLabel["default"], {
|
|
417
|
-
label: "Option 1",
|
|
418
|
-
value: "option1",
|
|
419
|
-
checked: true,
|
|
420
|
-
onChange: onChange
|
|
421
|
-
}));
|
|
422
|
-
var radio = _react2.screen.getByRole('radio');
|
|
423
|
-
expect(radio).toBeChecked();
|
|
424
|
-
});
|
|
425
|
-
it('renders unchecked state', function () {
|
|
426
|
-
var onChange = jest.fn();
|
|
427
|
-
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_settingsRadioLabel["default"], {
|
|
428
|
-
label: "Option 1",
|
|
429
|
-
value: "option1",
|
|
430
|
-
checked: false,
|
|
431
|
-
onChange: onChange
|
|
432
|
-
}));
|
|
433
|
-
var radio = _react2.screen.getByRole('radio');
|
|
434
|
-
expect(radio).not.toBeChecked();
|
|
435
|
-
});
|
|
436
|
-
it('calls onChange when radio is clicked', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee10() {
|
|
437
|
-
var user, onChange, radio;
|
|
438
|
-
return _regenerator["default"].wrap(function (_context10) {
|
|
439
|
-
while (1) switch (_context10.prev = _context10.next) {
|
|
440
|
-
case 0:
|
|
441
|
-
user = _userEvent["default"].setup();
|
|
442
|
-
onChange = jest.fn();
|
|
443
|
-
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_settingsRadioLabel["default"], {
|
|
444
|
-
label: "Option 1",
|
|
445
|
-
value: "option1",
|
|
446
|
-
checked: false,
|
|
447
|
-
onChange: onChange
|
|
448
|
-
}));
|
|
449
|
-
radio = _react2.screen.getByRole('radio');
|
|
450
|
-
_context10.next = 1;
|
|
451
|
-
return user.click(radio);
|
|
452
|
-
case 1:
|
|
453
|
-
expect(onChange).toHaveBeenCalled();
|
|
454
|
-
case 2:
|
|
455
|
-
case "end":
|
|
456
|
-
return _context10.stop();
|
|
457
|
-
}
|
|
458
|
-
}, _callee10);
|
|
459
|
-
})));
|
|
460
|
-
it('displays label text correctly', function () {
|
|
461
|
-
var onChange = jest.fn();
|
|
462
|
-
var labelText = 'Custom Option Label';
|
|
463
|
-
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_settingsRadioLabel["default"], {
|
|
464
|
-
label: labelText,
|
|
465
|
-
value: "custom",
|
|
466
|
-
checked: false,
|
|
467
|
-
onChange: onChange
|
|
468
|
-
}));
|
|
469
|
-
expect(_react2.screen.getByText(labelText)).toBeInTheDocument();
|
|
470
|
-
});
|
|
471
|
-
});
|
|
472
|
-
describe('Panel', function () {
|
|
473
|
-
var defaultProps = {
|
|
474
|
-
model: {
|
|
475
|
-
toggleSetting: true,
|
|
476
|
-
numberValue: 5
|
|
477
|
-
},
|
|
478
|
-
configuration: {
|
|
479
|
-
configValue: 'test'
|
|
480
|
-
},
|
|
481
|
-
groups: {
|
|
482
|
-
'General Settings': {
|
|
483
|
-
toggleSetting: {
|
|
484
|
-
type: 'toggle',
|
|
485
|
-
label: 'Enable Feature'
|
|
486
|
-
}
|
|
487
|
-
}
|
|
488
|
-
},
|
|
489
|
-
onChangeModel: jest.fn(),
|
|
490
|
-
onChangeConfiguration: jest.fn()
|
|
491
|
-
};
|
|
492
|
-
beforeEach(function () {
|
|
493
|
-
jest.clearAllMocks();
|
|
494
|
-
});
|
|
495
|
-
it('renders panel with group label', function () {
|
|
496
|
-
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_panel.Panel, defaultProps));
|
|
497
|
-
expect(_react2.screen.getByText('General Settings')).toBeInTheDocument();
|
|
498
|
-
});
|
|
499
|
-
it('renders empty when groups is undefined', function () {
|
|
500
|
-
var _render3 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_panel.Panel, (0, _extends2["default"])({}, defaultProps, {
|
|
501
|
-
groups: undefined
|
|
502
|
-
}))),
|
|
503
|
-
container = _render3.container;
|
|
504
|
-
expect(container.firstChild.children.length).toBe(0);
|
|
505
|
-
});
|
|
506
|
-
it('renders empty when groups is empty', function () {
|
|
507
|
-
var _render4 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_panel.Panel, (0, _extends2["default"])({}, defaultProps, {
|
|
508
|
-
groups: {}
|
|
509
|
-
}))),
|
|
510
|
-
container = _render4.container;
|
|
511
|
-
expect(container.firstChild.children.length).toBe(0);
|
|
512
|
-
});
|
|
513
|
-
it('calls onChangeModel when model changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee11() {
|
|
514
|
-
var user, onChangeModel, _render5, container, switchElement;
|
|
515
|
-
return _regenerator["default"].wrap(function (_context11) {
|
|
516
|
-
while (1) switch (_context11.prev = _context11.next) {
|
|
517
|
-
case 0:
|
|
518
|
-
user = _userEvent["default"].setup();
|
|
519
|
-
onChangeModel = jest.fn();
|
|
520
|
-
_render5 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_panel.Panel, (0, _extends2["default"])({}, defaultProps, {
|
|
521
|
-
onChangeModel: onChangeModel
|
|
522
|
-
}))), container = _render5.container;
|
|
523
|
-
switchElement = container.querySelector('input[type="checkbox"]');
|
|
524
|
-
_context11.next = 1;
|
|
525
|
-
return user.click(switchElement);
|
|
526
|
-
case 1:
|
|
527
|
-
expect(onChangeModel).toHaveBeenCalled();
|
|
528
|
-
case 2:
|
|
529
|
-
case "end":
|
|
530
|
-
return _context11.stop();
|
|
531
|
-
}
|
|
532
|
-
}, _callee11);
|
|
533
|
-
})));
|
|
534
|
-
it('calls onChangeConfiguration when configuration changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee12() {
|
|
535
|
-
var user, onChangeConfiguration, _render6, container, switchElement;
|
|
536
|
-
return _regenerator["default"].wrap(function (_context12) {
|
|
537
|
-
while (1) switch (_context12.prev = _context12.next) {
|
|
538
|
-
case 0:
|
|
539
|
-
user = _userEvent["default"].setup();
|
|
540
|
-
onChangeConfiguration = jest.fn();
|
|
541
|
-
_render6 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_panel.Panel, (0, _extends2["default"])({}, defaultProps, {
|
|
542
|
-
groups: {
|
|
543
|
-
'Config Group': {
|
|
544
|
-
configValue: {
|
|
545
|
-
type: 'toggle',
|
|
546
|
-
label: 'Config Toggle',
|
|
547
|
-
isConfigProperty: true
|
|
548
|
-
}
|
|
549
|
-
}
|
|
550
|
-
},
|
|
551
|
-
onChangeConfiguration: onChangeConfiguration
|
|
552
|
-
}))), container = _render6.container;
|
|
553
|
-
switchElement = container.querySelector('input[type="checkbox"]');
|
|
554
|
-
_context12.next = 1;
|
|
555
|
-
return user.click(switchElement);
|
|
556
|
-
case 1:
|
|
557
|
-
expect(onChangeConfiguration).toHaveBeenCalled();
|
|
558
|
-
case 2:
|
|
559
|
-
case "end":
|
|
560
|
-
return _context12.stop();
|
|
561
|
-
}
|
|
562
|
-
}, _callee12);
|
|
563
|
-
})));
|
|
564
|
-
it('renders with modal when provided', function () {
|
|
565
|
-
var modal = /*#__PURE__*/_react["default"].createElement("div", {
|
|
566
|
-
"data-testid": "test-modal"
|
|
567
|
-
}, "Modal Content");
|
|
568
|
-
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_panel.Panel, (0, _extends2["default"])({}, defaultProps, {
|
|
569
|
-
modal: modal
|
|
570
|
-
})));
|
|
571
|
-
expect(_react2.screen.getByTestId('test-modal')).toBeInTheDocument();
|
|
572
|
-
expect(_react2.screen.getByText('Modal Content')).toBeInTheDocument();
|
|
573
|
-
});
|
|
574
|
-
it('renders multiple groups', function () {
|
|
575
|
-
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_panel.Panel, (0, _extends2["default"])({}, defaultProps, {
|
|
576
|
-
groups: {
|
|
577
|
-
'Group One': {
|
|
578
|
-
setting1: {
|
|
579
|
-
type: 'toggle',
|
|
580
|
-
label: 'Setting One'
|
|
581
|
-
}
|
|
582
|
-
},
|
|
583
|
-
'Group Two': {
|
|
584
|
-
setting2: {
|
|
585
|
-
type: 'toggle',
|
|
586
|
-
label: 'Setting Two'
|
|
587
|
-
}
|
|
588
|
-
}
|
|
589
|
-
},
|
|
590
|
-
model: {
|
|
591
|
-
setting1: true,
|
|
592
|
-
setting2: false
|
|
593
|
-
}
|
|
594
|
-
})));
|
|
595
|
-
expect(_react2.screen.getByText('Group One')).toBeInTheDocument();
|
|
596
|
-
expect(_react2.screen.getByText('Group Two')).toBeInTheDocument();
|
|
597
|
-
});
|
|
598
|
-
it('uses default callbacks when not provided', function () {
|
|
599
|
-
var _render7 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_panel.Panel, {
|
|
600
|
-
model: {
|
|
601
|
-
test: true
|
|
602
|
-
},
|
|
603
|
-
groups: {
|
|
604
|
-
'Test Group': {
|
|
605
|
-
test: {
|
|
606
|
-
type: 'toggle',
|
|
607
|
-
label: 'Test'
|
|
608
|
-
}
|
|
609
|
-
}
|
|
610
|
-
}
|
|
611
|
-
})),
|
|
612
|
-
container = _render7.container;
|
|
613
|
-
expect(container.firstChild).toBeInTheDocument();
|
|
614
|
-
});
|
|
615
|
-
it('filters out empty groups', function () {
|
|
616
|
-
var _render8 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_panel.Panel, (0, _extends2["default"])({}, defaultProps, {
|
|
617
|
-
groups: {
|
|
618
|
-
'Empty Group': {},
|
|
619
|
-
'General Settings': {
|
|
620
|
-
toggleSetting: {
|
|
621
|
-
type: 'toggle',
|
|
622
|
-
label: 'Enable Feature'
|
|
623
|
-
}
|
|
624
|
-
}
|
|
625
|
-
},
|
|
626
|
-
model: {
|
|
627
|
-
toggleSetting: true
|
|
628
|
-
}
|
|
629
|
-
}))),
|
|
630
|
-
container = _render8.container;
|
|
631
|
-
expect(_react2.screen.getByText('General Settings')).toBeInTheDocument();
|
|
632
|
-
expect(_react2.screen.queryByText('Empty Group')).not.toBeInTheDocument();
|
|
633
|
-
});
|
|
634
|
-
it('renders with null model', function () {
|
|
635
|
-
var _render9 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_panel.Panel, {
|
|
636
|
-
model: null,
|
|
637
|
-
configuration: {},
|
|
638
|
-
groups: {
|
|
639
|
-
'General Settings': {
|
|
640
|
-
toggleSetting: {
|
|
641
|
-
type: 'toggle',
|
|
642
|
-
label: 'Enable Feature'
|
|
643
|
-
}
|
|
644
|
-
}
|
|
645
|
-
},
|
|
646
|
-
onChangeModel: jest.fn()
|
|
647
|
-
})),
|
|
648
|
-
container = _render9.container;
|
|
649
|
-
expect(_react2.screen.getByText('General Settings')).toBeInTheDocument();
|
|
650
|
-
});
|
|
651
|
-
});
|
|
652
|
-
});
|
|
653
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfdXNlckV2ZW50IiwiX3RvZ2dsZSIsIl9kaXNwbGF5U2l6ZSIsIl9zZXR0aW5nc1JhZGlvTGFiZWwiLCJfcGFuZWwiLCJkZXNjcmliZSIsIml0IiwidG9nZ2xlIiwiamVzdCIsImZuIiwicmVuZGVyIiwiY3JlYXRlRWxlbWVudCIsImxhYmVsIiwiY2hlY2tlZCIsImV4cGVjdCIsInNjcmVlbiIsImdldEJ5VGV4dCIsInRvQmVJblRoZURvY3VtZW50IiwiZGVmYXVsdFByb3BzIiwic2l6ZSIsIndpZHRoIiwiaGVpZ2h0Iiwib25DaGFuZ2UiLCJiZWZvcmVFYWNoIiwiY2xlYXJBbGxNb2NrcyIsImdldEJ5TGFiZWxUZXh0Iiwid2lkdGhJbnB1dCIsImhlaWdodElucHV0IiwidG9IYXZlVmFsdWUiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsInVzZXIiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsInVzZXJFdmVudCIsInNldHVwIiwiX2V4dGVuZHMyIiwiY2xlYXIiLCJ0eXBlIiwiZmlyZUV2ZW50IiwiYmx1ciIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwib2JqZWN0Q29udGFpbmluZyIsInN0b3AiLCJfY2FsbGVlMiIsIl9jb250ZXh0MiIsIl9jYWxsZWUzIiwiX2NvbnRleHQzIiwiX2NhbGxlZTQiLCJfY29udGV4dDQiLCJfY2FsbGVlNSIsIl9jb250ZXh0NSIsIl9yZW5kZXIiLCJyZXJlbmRlciIsIl9jYWxsZWU2IiwiX2NvbnRleHQ2IiwiX2NhbGxlZTciLCJfY29udGV4dDciLCJfY2FsbGVlOCIsIl9jb250ZXh0OCIsIl9jYWxsZWU5IiwiX2NvbnRleHQ5IiwiX2NhbGxlZTAiLCJfY29udGV4dDAiLCJ0b0hhdmVCZWVuQ2FsbGVkIiwiX2NhbGxlZTEiLCJfY29udGV4dDEiLCJfcmVuZGVyMiIsImNvbnRhaW5lciIsImlucHV0cyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJsZW5ndGgiLCJ0b0JlIiwidmFsdWUiLCJnZXRCeVJvbGUiLCJyYWRpbyIsInRvQmVDaGVja2VkIiwibm90IiwiX2NhbGxlZTEwIiwiX2NvbnRleHQxMCIsImNsaWNrIiwibGFiZWxUZXh0IiwibW9kZWwiLCJ0b2dnbGVTZXR0aW5nIiwibnVtYmVyVmFsdWUiLCJjb25maWd1cmF0aW9uIiwiY29uZmlnVmFsdWUiLCJncm91cHMiLCJvbkNoYW5nZU1vZGVsIiwib25DaGFuZ2VDb25maWd1cmF0aW9uIiwiUGFuZWwiLCJfcmVuZGVyMyIsInVuZGVmaW5lZCIsImZpcnN0Q2hpbGQiLCJjaGlsZHJlbiIsIl9yZW5kZXI0IiwiX2NhbGxlZTExIiwiX3JlbmRlcjUiLCJzd2l0Y2hFbGVtZW50IiwiX2NvbnRleHQxMSIsInF1ZXJ5U2VsZWN0b3IiLCJfY2FsbGVlMTIiLCJfcmVuZGVyNiIsIl9jb250ZXh0MTIiLCJpc0NvbmZpZ1Byb3BlcnR5IiwibW9kYWwiLCJnZXRCeVRlc3RJZCIsInNldHRpbmcxIiwic2V0dGluZzIiLCJfcmVuZGVyNyIsInRlc3QiLCJfcmVuZGVyOCIsInF1ZXJ5QnlUZXh0IiwiX3JlbmRlcjkiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL3NldHRpbmdzLnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBmaXJlRXZlbnQsIHJlbmRlciwgc2NyZWVuIH0gZnJvbSAnQHRlc3RpbmctbGlicmFyeS9yZWFjdCc7XG5pbXBvcnQgdXNlckV2ZW50IGZyb20gJ0B0ZXN0aW5nLWxpYnJhcnkvdXNlci1ldmVudCc7XG5pbXBvcnQgVG9nZ2xlIGZyb20gJy4uL3NldHRpbmdzL3RvZ2dsZSc7XG5pbXBvcnQgRGlzcGxheVNpemUgZnJvbSAnLi4vc2V0dGluZ3MvZGlzcGxheS1zaXplJztcbmltcG9ydCBTZXR0aW5nc1JhZGlvTGFiZWwgZnJvbSAnLi4vc2V0dGluZ3Mvc2V0dGluZ3MtcmFkaW8tbGFiZWwnO1xuaW1wb3J0IHsgUGFuZWwgfSBmcm9tICcuLi9zZXR0aW5ncy9wYW5lbCc7XG5cbmRlc2NyaWJlKCdTZXR0aW5ncyBDb21wb25lbnRzJywgKCkgPT4ge1xuICBkZXNjcmliZSgnVG9nZ2xlJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHRvZ2dsZSB3aXRoIGxhYmVsJywgKCkgPT4ge1xuICAgICAgY29uc3QgdG9nZ2xlID0gamVzdC5mbigpO1xuICAgICAgcmVuZGVyKDxUb2dnbGUgbGFiZWw9XCJFbmFibGUgRmVhdHVyZVwiIGNoZWNrZWQ9e2ZhbHNlfSB0b2dnbGU9e3RvZ2dsZX0gLz4pO1xuXG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgnRW5hYmxlIEZlYXR1cmUnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0Rpc3BsYXlTaXplJywgKCkgPT4ge1xuICAgIGNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgIHNpemU6IHsgd2lkdGg6IDUwMCwgaGVpZ2h0OiA0MDAgfSxcbiAgICAgIGxhYmVsOiAnRGlzcGxheSBTaXplJyxcbiAgICAgIG9uQ2hhbmdlOiBqZXN0LmZuKCksXG4gICAgfTtcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgamVzdC5jbGVhckFsbE1vY2tzKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBsYWJlbCBhbmQgaW5wdXQgZmllbGRzJywgKCkgPT4ge1xuICAgICAgcmVuZGVyKDxEaXNwbGF5U2l6ZSB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG5cbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdEaXNwbGF5IFNpemUnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ1dpZHRoJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdIZWlnaHQnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdkaXNwbGF5cyB3aWR0aCBhbmQgaGVpZ2h0IHZhbHVlcycsICgpID0+IHtcbiAgICAgIHJlbmRlcig8RGlzcGxheVNpemUgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuXG4gICAgICBjb25zdCB3aWR0aElucHV0ID0gc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdXaWR0aCcpO1xuICAgICAgY29uc3QgaGVpZ2h0SW5wdXQgPSBzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ0hlaWdodCcpO1xuXG4gICAgICBleHBlY3Qod2lkdGhJbnB1dCkudG9IYXZlVmFsdWUoNTAwKTtcbiAgICAgIGV4cGVjdChoZWlnaHRJbnB1dCkudG9IYXZlVmFsdWUoNDAwKTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBvbkNoYW5nZSB3aGVuIHdpZHRoIGNoYW5nZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gdXNlckV2ZW50LnNldHVwKCk7XG4gICAgICBjb25zdCBvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgICAgIHJlbmRlcig8RGlzcGxheVNpemUgey4uLmRlZmF1bHRQcm9wc30gb25DaGFuZ2U9e29uQ2hhbmdlfSAvPik7XG5cbiAgICAgIGNvbnN0IHdpZHRoSW5wdXQgPSBzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ1dpZHRoJyk7XG4gICAgICBhd2FpdCB1c2VyLmNsZWFyKHdpZHRoSW5wdXQpO1xuICAgICAgYXdhaXQgdXNlci50eXBlKHdpZHRoSW5wdXQsICc2MDAnKTtcbiAgICAgIGZpcmVFdmVudC5ibHVyKHdpZHRoSW5wdXQpO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgd2lkdGg6IDYwMCB9KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2FsbHMgb25DaGFuZ2Ugd2hlbiBoZWlnaHQgY2hhbmdlcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHVzZXIgPSB1c2VyRXZlbnQuc2V0dXAoKTtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlID0gamVzdC5mbigpO1xuICAgICAgcmVuZGVyKDxEaXNwbGF5U2l6ZSB7Li4uZGVmYXVsdFByb3BzfSBvbkNoYW5nZT17b25DaGFuZ2V9IC8+KTtcblxuICAgICAgY29uc3QgaGVpZ2h0SW5wdXQgPSBzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ0hlaWdodCcpO1xuICAgICAgYXdhaXQgdXNlci5jbGVhcihoZWlnaHRJbnB1dCk7XG4gICAgICBhd2FpdCB1c2VyLnR5cGUoaGVpZ2h0SW5wdXQsICc1MDAnKTtcbiAgICAgIGZpcmVFdmVudC5ibHVyKGhlaWdodElucHV0KTtcblxuICAgICAgZXhwZWN0KG9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7IGhlaWdodDogNTAwIH0pKTtcbiAgICB9KTtcblxuICAgIGl0KCdtYWludGFpbnMgb3RoZXIgZGltZW5zaW9uIHdoZW4gb25lIGNoYW5nZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gdXNlckV2ZW50LnNldHVwKCk7XG4gICAgICBjb25zdCBvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgICAgIHJlbmRlcig8RGlzcGxheVNpemUgey4uLmRlZmF1bHRQcm9wc30gb25DaGFuZ2U9e29uQ2hhbmdlfSAvPik7XG5cbiAgICAgIGNvbnN0IHdpZHRoSW5wdXQgPSBzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ1dpZHRoJyk7XG4gICAgICBhd2FpdCB1c2VyLmNsZWFyKHdpZHRoSW5wdXQpO1xuICAgICAgYXdhaXQgdXNlci50eXBlKHdpZHRoSW5wdXQsICc3MDAnKTtcbiAgICAgIGZpcmVFdmVudC5ibHVyKHdpZHRoSW5wdXQpO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHtcbiAgICAgICAgd2lkdGg6IDcwMCxcbiAgICAgICAgaGVpZ2h0OiA0MDAsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdlbmZvcmNlcyBtaW4gdmFsdWUgY29uc3RyYWludCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHVzZXIgPSB1c2VyRXZlbnQuc2V0dXAoKTtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlID0gamVzdC5mbigpO1xuICAgICAgcmVuZGVyKDxEaXNwbGF5U2l6ZSB7Li4uZGVmYXVsdFByb3BzfSBvbkNoYW5nZT17b25DaGFuZ2V9IC8+KTtcblxuICAgICAgY29uc3Qgd2lkdGhJbnB1dCA9IHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnV2lkdGgnKTtcbiAgICAgIGF3YWl0IHVzZXIuY2xlYXIod2lkdGhJbnB1dCk7XG4gICAgICBhd2FpdCB1c2VyLnR5cGUod2lkdGhJbnB1dCwgJzEwMCcpO1xuICAgICAgZmlyZUV2ZW50LmJsdXIod2lkdGhJbnB1dCk7XG5cbiAgICAgIC8vIFNob3VsZCBjbGFtcCB0byBtaW5pbXVtIDE1MFxuICAgICAgZXhwZWN0KHdpZHRoSW5wdXQpLnRvSGF2ZVZhbHVlKDE1MCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZW5mb3JjZXMgbWF4IHZhbHVlIGNvbnN0cmFpbnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gdXNlckV2ZW50LnNldHVwKCk7XG4gICAgICBjb25zdCBvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgICAgIHJlbmRlcig8RGlzcGxheVNpemUgey4uLmRlZmF1bHRQcm9wc30gb25DaGFuZ2U9e29uQ2hhbmdlfSAvPik7XG5cbiAgICAgIGNvbnN0IHdpZHRoSW5wdXQgPSBzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ1dpZHRoJyk7XG4gICAgICBhd2FpdCB1c2VyLmNsZWFyKHdpZHRoSW5wdXQpO1xuICAgICAgYXdhaXQgdXNlci50eXBlKHdpZHRoSW5wdXQsICcyMDAwJyk7XG4gICAgICBmaXJlRXZlbnQuYmx1cih3aWR0aElucHV0KTtcblxuICAgICAgLy8gU2hvdWxkIGNsYW1wIHRvIG1heGltdW0gMTAwMFxuICAgICAgZXhwZWN0KHdpZHRoSW5wdXQpLnRvSGF2ZVZhbHVlKDEwMDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3VwZGF0ZXMgd2hlbiBzaXplIHByb3AgY2hhbmdlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcmVyZW5kZXIgfSA9IHJlbmRlcig8RGlzcGxheVNpemUgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuXG4gICAgICBsZXQgd2lkdGhJbnB1dCA9IHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnV2lkdGgnKTtcbiAgICAgIGV4cGVjdCh3aWR0aElucHV0KS50b0hhdmVWYWx1ZSg1MDApO1xuXG4gICAgICByZXJlbmRlcig8RGlzcGxheVNpemUgey4uLmRlZmF1bHRQcm9wc30gc2l6ZT17eyB3aWR0aDogODAwLCBoZWlnaHQ6IDYwMCB9fSAvPik7XG5cbiAgICAgIHdpZHRoSW5wdXQgPSBzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ1dpZHRoJyk7XG4gICAgICBleHBlY3Qod2lkdGhJbnB1dCkudG9IYXZlVmFsdWUoODAwKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIGJvdW5kYXJ5IHZhbHVlcyBhdCBtaW5pbXVtJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9IHVzZXJFdmVudC5zZXR1cCgpO1xuICAgICAgY29uc3Qgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgICByZW5kZXIoPERpc3BsYXlTaXplIHsuLi5kZWZhdWx0UHJvcHN9IG9uQ2hhbmdlPXtvbkNoYW5nZX0gLz4pO1xuXG4gICAgICBjb25zdCB3aWR0aElucHV0ID0gc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdXaWR0aCcpO1xuICAgICAgY29uc3QgaGVpZ2h0SW5wdXQgPSBzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ0hlaWdodCcpO1xuXG4gICAgICBhd2FpdCB1c2VyLmNsZWFyKHdpZHRoSW5wdXQpO1xuICAgICAgYXdhaXQgdXNlci50eXBlKHdpZHRoSW5wdXQsICcxNTAnKTtcbiAgICAgIGZpcmVFdmVudC5ibHVyKHdpZHRoSW5wdXQpO1xuXG4gICAgICBhd2FpdCB1c2VyLmNsZWFyKGhlaWdodElucHV0KTtcbiAgICAgIGF3YWl0IHVzZXIudHlwZShoZWlnaHRJbnB1dCwgJzE1MCcpO1xuICAgICAgZmlyZUV2ZW50LmJsdXIoaGVpZ2h0SW5wdXQpO1xuXG4gICAgICBleHBlY3Qod2lkdGhJbnB1dCkudG9IYXZlVmFsdWUoMTUwKTtcbiAgICAgIGV4cGVjdChoZWlnaHRJbnB1dCkudG9IYXZlVmFsdWUoMTUwKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIGJvdW5kYXJ5IHZhbHVlcyBhdCBtYXhpbXVtJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9IHVzZXJFdmVudC5zZXR1cCgpO1xuICAgICAgY29uc3Qgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgICByZW5kZXIoPERpc3BsYXlTaXplIHsuLi5kZWZhdWx0UHJvcHN9IG9uQ2hhbmdlPXtvbkNoYW5nZX0gLz4pO1xuXG4gICAgICBjb25zdCB3aWR0aElucHV0ID0gc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdXaWR0aCcpO1xuICAgICAgY29uc3QgaGVpZ2h0SW5wdXQgPSBzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ0hlaWdodCcpO1xuXG4gICAgICBhd2FpdCB1c2VyLmNsZWFyKHdpZHRoSW5wdXQpO1xuICAgICAgYXdhaXQgdXNlci50eXBlKHdpZHRoSW5wdXQsICcxMDAwJyk7XG4gICAgICBmaXJlRXZlbnQuYmx1cih3aWR0aElucHV0KTtcblxuICAgICAgYXdhaXQgdXNlci5jbGVhcihoZWlnaHRJbnB1dCk7XG4gICAgICBhd2FpdCB1c2VyLnR5cGUoaGVpZ2h0SW5wdXQsICcxMDAwJyk7XG4gICAgICBmaXJlRXZlbnQuYmx1cihoZWlnaHRJbnB1dCk7XG5cbiAgICAgIGV4cGVjdCh3aWR0aElucHV0KS50b0hhdmVWYWx1ZSgxMDAwKTtcbiAgICAgIGV4cGVjdChoZWlnaHRJbnB1dCkudG9IYXZlVmFsdWUoMTAwMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBkZWNpbWFsIGlucHV0IHZhbHVlcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHVzZXIgPSB1c2VyRXZlbnQuc2V0dXAoKTtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlID0gamVzdC5mbigpO1xuICAgICAgcmVuZGVyKDxEaXNwbGF5U2l6ZSB7Li4uZGVmYXVsdFByb3BzfSBvbkNoYW5nZT17b25DaGFuZ2V9IC8+KTtcblxuICAgICAgY29uc3Qgd2lkdGhJbnB1dCA9IHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnV2lkdGgnKTtcbiAgICAgIGF3YWl0IHVzZXIuY2xlYXIod2lkdGhJbnB1dCk7XG4gICAgICBhd2FpdCB1c2VyLnR5cGUod2lkdGhJbnB1dCwgJzUwMC41Jyk7XG4gICAgICBmaXJlRXZlbnQuYmx1cih3aWR0aElucHV0KTtcblxuICAgICAgZXhwZWN0KHdpZHRoSW5wdXQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBlbXB0eSBpbnB1dCBhbmQgcmVzZXRzIHRvIG1pbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHVzZXIgPSB1c2VyRXZlbnQuc2V0dXAoKTtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlID0gamVzdC5mbigpO1xuICAgICAgcmVuZGVyKDxEaXNwbGF5U2l6ZSB7Li4uZGVmYXVsdFByb3BzfSBvbkNoYW5nZT17b25DaGFuZ2V9IC8+KTtcblxuICAgICAgY29uc3Qgd2lkdGhJbnB1dCA9IHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnV2lkdGgnKTtcbiAgICAgIGF3YWl0IHVzZXIuY2xlYXIod2lkdGhJbnB1dCk7XG4gICAgICBmaXJlRXZlbnQuYmx1cih3aWR0aElucHV0KTtcblxuICAgICAgLy8gU2hvdWxkIHJlc2V0IHRvIG1pbmltdW0gdmFsdWVcbiAgICAgIGV4cGVjdCh3aWR0aElucHV0KS50b0hhdmVWYWx1ZSgxNTApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgcmFwaWQgd2lkdGggYW5kIGhlaWdodCBjaGFuZ2VzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9IHVzZXJFdmVudC5zZXR1cCgpO1xuICAgICAgY29uc3Qgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgICByZW5kZXIoPERpc3BsYXlTaXplIHsuLi5kZWZhdWx0UHJvcHN9IG9uQ2hhbmdlPXtvbkNoYW5nZX0gLz4pO1xuXG4gICAgICBjb25zdCB3aWR0aElucHV0ID0gc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdXaWR0aCcpO1xuXG4gICAgICBhd2FpdCB1c2VyLmNsZWFyKHdpZHRoSW5wdXQpO1xuICAgICAgYXdhaXQgdXNlci50eXBlKHdpZHRoSW5wdXQsICc2Jyk7XG4gICAgICBhd2FpdCB1c2VyLnR5cGUod2lkdGhJbnB1dCwgJzAnKTtcbiAgICAgIGF3YWl0IHVzZXIudHlwZSh3aWR0aElucHV0LCAnMCcpO1xuICAgICAgZmlyZUV2ZW50LmJsdXIod2lkdGhJbnB1dCk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NsYW1wcyBoZWlnaHQgYXQgYm90aCBib3VuZGFyaWVzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9IHVzZXJFdmVudC5zZXR1cCgpO1xuICAgICAgY29uc3Qgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgICByZW5kZXIoPERpc3BsYXlTaXplIHsuLi5kZWZhdWx0UHJvcHN9IG9uQ2hhbmdlPXtvbkNoYW5nZX0gLz4pO1xuXG4gICAgICBjb25zdCBoZWlnaHRJbnB1dCA9IHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnSGVpZ2h0Jyk7XG5cbiAgICAgIC8vIFRlc3QgYmVsb3cgbWluXG4gICAgICBhd2FpdCB1c2VyLmNsZWFyKGhlaWdodElucHV0KTtcbiAgICAgIGF3YWl0IHVzZXIudHlwZShoZWlnaHRJbnB1dCwgJzUwJyk7XG4gICAgICBmaXJlRXZlbnQuYmx1cihoZWlnaHRJbnB1dCk7XG4gICAgICBleHBlY3QoaGVpZ2h0SW5wdXQpLnRvSGF2ZVZhbHVlKDE1MCk7XG5cbiAgICAgIC8vIFRlc3QgYWJvdmUgbWF4XG4gICAgICBhd2FpdCB1c2VyLmNsZWFyKGhlaWdodElucHV0KTtcbiAgICAgIGF3YWl0IHVzZXIudHlwZShoZWlnaHRJbnB1dCwgJzI1MDAnKTtcbiAgICAgIGZpcmVFdmVudC5ibHVyKGhlaWdodElucHV0KTtcbiAgICAgIGV4cGVjdChoZWlnaHRJbnB1dCkudG9IYXZlVmFsdWUoMTAwMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZGlzcGxheXMgY3VzdG9tIGxhYmVsIHRleHQnLCAoKSA9PiB7XG4gICAgICByZW5kZXIoPERpc3BsYXlTaXplIHNpemU9e3sgd2lkdGg6IDUwMCwgaGVpZ2h0OiA0MDAgfX0gbGFiZWw9XCJDdXN0b20gU2l6ZSBTZXR0aW5nc1wiIG9uQ2hhbmdlPXtqZXN0LmZuKCl9IC8+KTtcblxuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoJ0N1c3RvbSBTaXplIFNldHRpbmdzJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIHZhcmlhbnQgb3V0bGluZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxEaXNwbGF5U2l6ZSB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG5cbiAgICAgIGNvbnN0IGlucHV0cyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCcpO1xuICAgICAgZXhwZWN0KGlucHV0cy5sZW5ndGgpLnRvQmUoMik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdTZXR0aW5nc1JhZGlvTGFiZWwnLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgcmFkaW8gbGFiZWwnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgICAgIHJlbmRlcig8U2V0dGluZ3NSYWRpb0xhYmVsIGxhYmVsPVwiT3B0aW9uIDFcIiB2YWx1ZT1cIm9wdGlvbjFcIiBjaGVja2VkPXtmYWxzZX0gb25DaGFuZ2U9e29uQ2hhbmdlfSAvPik7XG5cbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdPcHRpb24gMScpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVJvbGUoJ3JhZGlvJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBjaGVja2VkIHN0YXRlJywgKCkgPT4ge1xuICAgICAgY29uc3Qgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgICByZW5kZXIoPFNldHRpbmdzUmFkaW9MYWJlbCBsYWJlbD1cIk9wdGlvbiAxXCIgdmFsdWU9XCJvcHRpb24xXCIgY2hlY2tlZD17dHJ1ZX0gb25DaGFuZ2U9e29uQ2hhbmdlfSAvPik7XG5cbiAgICAgIGNvbnN0IHJhZGlvID0gc2NyZWVuLmdldEJ5Um9sZSgncmFkaW8nKTtcbiAgICAgIGV4cGVjdChyYWRpbykudG9CZUNoZWNrZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHVuY2hlY2tlZCBzdGF0ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlID0gamVzdC5mbigpO1xuICAgICAgcmVuZGVyKDxTZXR0aW5nc1JhZGlvTGFiZWwgbGFiZWw9XCJPcHRpb24gMVwiIHZhbHVlPVwib3B0aW9uMVwiIGNoZWNrZWQ9e2ZhbHNlfSBvbkNoYW5nZT17b25DaGFuZ2V9IC8+KTtcblxuICAgICAgY29uc3QgcmFkaW8gPSBzY3JlZW4uZ2V0QnlSb2xlKCdyYWRpbycpO1xuICAgICAgZXhwZWN0KHJhZGlvKS5ub3QudG9CZUNoZWNrZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBvbkNoYW5nZSB3aGVuIHJhZGlvIGlzIGNsaWNrZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gdXNlckV2ZW50LnNldHVwKCk7XG4gICAgICBjb25zdCBvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgICAgIHJlbmRlcig8U2V0dGluZ3NSYWRpb0xhYmVsIGxhYmVsPVwiT3B0aW9uIDFcIiB2YWx1ZT1cIm9wdGlvbjFcIiBjaGVja2VkPXtmYWxzZX0gb25DaGFuZ2U9e29uQ2hhbmdlfSAvPik7XG5cbiAgICAgIGNvbnN0IHJhZGlvID0gc2NyZWVuLmdldEJ5Um9sZSgncmFkaW8nKTtcbiAgICAgIGF3YWl0IHVzZXIuY2xpY2socmFkaW8pO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdkaXNwbGF5cyBsYWJlbCB0ZXh0IGNvcnJlY3RseScsICgpID0+IHtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgbGFiZWxUZXh0ID0gJ0N1c3RvbSBPcHRpb24gTGFiZWwnO1xuICAgICAgcmVuZGVyKDxTZXR0aW5nc1JhZGlvTGFiZWwgbGFiZWw9e2xhYmVsVGV4dH0gdmFsdWU9XCJjdXN0b21cIiBjaGVja2VkPXtmYWxzZX0gb25DaGFuZ2U9e29uQ2hhbmdlfSAvPik7XG5cbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KGxhYmVsVGV4dCkpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdQYW5lbCcsICgpID0+IHtcbiAgICBjb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gICAgICBtb2RlbDogeyB0b2dnbGVTZXR0aW5nOiB0cnVlLCBudW1iZXJWYWx1ZTogNSB9LFxuICAgICAgY29uZmlndXJhdGlvbjogeyBjb25maWdWYWx1ZTogJ3Rlc3QnIH0sXG4gICAgICBncm91cHM6IHtcbiAgICAgICAgJ0dlbmVyYWwgU2V0dGluZ3MnOiB7XG4gICAgICAgICAgdG9nZ2xlU2V0dGluZzoge1xuICAgICAgICAgICAgdHlwZTogJ3RvZ2dsZScsXG4gICAgICAgICAgICBsYWJlbDogJ0VuYWJsZSBGZWF0dXJlJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG9uQ2hhbmdlTW9kZWw6IGplc3QuZm4oKSxcbiAgICAgIG9uQ2hhbmdlQ29uZmlndXJhdGlvbjogamVzdC5mbigpLFxuICAgIH07XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIGplc3QuY2xlYXJBbGxNb2NrcygpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgcGFuZWwgd2l0aCBncm91cCBsYWJlbCcsICgpID0+IHtcbiAgICAgIHJlbmRlcig8UGFuZWwgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoJ0dlbmVyYWwgU2V0dGluZ3MnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIGVtcHR5IHdoZW4gZ3JvdXBzIGlzIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPFBhbmVsIHsuLi5kZWZhdWx0UHJvcHN9IGdyb3Vwcz17dW5kZWZpbmVkfSAvPik7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQuY2hpbGRyZW4ubGVuZ3RoKS50b0JlKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgZW1wdHkgd2hlbiBncm91cHMgaXMgZW1wdHknLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxQYW5lbCB7Li4uZGVmYXVsdFByb3BzfSBncm91cHM9e3t9fSAvPik7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQuY2hpbGRyZW4ubGVuZ3RoKS50b0JlKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NhbGxzIG9uQ2hhbmdlTW9kZWwgd2hlbiBtb2RlbCBjaGFuZ2VzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9IHVzZXJFdmVudC5zZXR1cCgpO1xuICAgICAgY29uc3Qgb25DaGFuZ2VNb2RlbCA9IGplc3QuZm4oKTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPFBhbmVsIHsuLi5kZWZhdWx0UHJvcHN9IG9uQ2hhbmdlTW9kZWw9e29uQ2hhbmdlTW9kZWx9IC8+KTtcblxuICAgICAgY29uc3Qgc3dpdGNoRWxlbWVudCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0nKTtcbiAgICAgIGF3YWl0IHVzZXIuY2xpY2soc3dpdGNoRWxlbWVudCk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZU1vZGVsKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2FsbHMgb25DaGFuZ2VDb25maWd1cmF0aW9uIHdoZW4gY29uZmlndXJhdGlvbiBjaGFuZ2VzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9IHVzZXJFdmVudC5zZXR1cCgpO1xuICAgICAgY29uc3Qgb25DaGFuZ2VDb25maWd1cmF0aW9uID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcihcbiAgICAgICAgPFBhbmVsXG4gICAgICAgICAgey4uLmRlZmF1bHRQcm9wc31cbiAgICAgICAgICBncm91cHM9e3tcbiAgICAgICAgICAgICdDb25maWcgR3JvdXAnOiB7XG4gICAgICAgICAgICAgIGNvbmZpZ1ZhbHVlOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3RvZ2dsZScsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICdDb25maWcgVG9nZ2xlJyxcbiAgICAgICAgICAgICAgICBpc0NvbmZpZ1Byb3BlcnR5OiB0cnVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9fVxuICAgICAgICAgIG9uQ2hhbmdlQ29uZmlndXJhdGlvbj17b25DaGFuZ2VDb25maWd1cmF0aW9ufVxuICAgICAgICAvPixcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN3aXRjaEVsZW1lbnQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdJyk7XG4gICAgICBhd2FpdCB1c2VyLmNsaWNrKHN3aXRjaEVsZW1lbnQpO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2VDb25maWd1cmF0aW9uKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIG1vZGFsIHdoZW4gcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RhbCA9IDxkaXYgZGF0YS10ZXN0aWQ9XCJ0ZXN0LW1vZGFsXCI+TW9kYWwgQ29udGVudDwvZGl2PjtcbiAgICAgIHJlbmRlcig8UGFuZWwgey4uLmRlZmF1bHRQcm9wc30gbW9kYWw9e21vZGFsfSAvPik7XG5cbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXN0SWQoJ3Rlc3QtbW9kYWwnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdNb2RhbCBDb250ZW50JykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBtdWx0aXBsZSBncm91cHMnLCAoKSA9PiB7XG4gICAgICByZW5kZXIoXG4gICAgICAgIDxQYW5lbFxuICAgICAgICAgIHsuLi5kZWZhdWx0UHJvcHN9XG4gICAgICAgICAgZ3JvdXBzPXt7XG4gICAgICAgICAgICAnR3JvdXAgT25lJzoge1xuICAgICAgICAgICAgICBzZXR0aW5nMToge1xuICAgICAgICAgICAgICAgIHR5cGU6ICd0b2dnbGUnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnU2V0dGluZyBPbmUnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdHcm91cCBUd28nOiB7XG4gICAgICAgICAgICAgIHNldHRpbmcyOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3RvZ2dsZScsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICdTZXR0aW5nIFR3bycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH19XG4gICAgICAgICAgbW9kZWw9e3sgc2V0dGluZzE6IHRydWUsIHNldHRpbmcyOiBmYWxzZSB9fVxuICAgICAgICAvPixcbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdHcm91cCBPbmUnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdHcm91cCBUd28nKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCd1c2VzIGRlZmF1bHQgY2FsbGJhY2tzIHdoZW4gbm90IHByb3ZpZGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcihcbiAgICAgICAgPFBhbmVsXG4gICAgICAgICAgbW9kZWw9e3sgdGVzdDogdHJ1ZSB9fVxuICAgICAgICAgIGdyb3Vwcz17e1xuICAgICAgICAgICAgJ1Rlc3QgR3JvdXAnOiB7XG4gICAgICAgICAgICAgIHRlc3Q6IHsgdHlwZTogJ3RvZ2dsZScsIGxhYmVsOiAnVGVzdCcgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfX1cbiAgICAgICAgLz4sXG4gICAgICApO1xuXG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZmlsdGVycyBvdXQgZW1wdHkgZ3JvdXBzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcihcbiAgICAgICAgPFBhbmVsXG4gICAgICAgICAgey4uLmRlZmF1bHRQcm9wc31cbiAgICAgICAgICBncm91cHM9e3tcbiAgICAgICAgICAgICdFbXB0eSBHcm91cCc6IHt9LFxuICAgICAgICAgICAgJ0dlbmVyYWwgU2V0dGluZ3MnOiB7XG4gICAgICAgICAgICAgIHRvZ2dsZVNldHRpbmc6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAndG9nZ2xlJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0VuYWJsZSBGZWF0dXJlJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfX1cbiAgICAgICAgICBtb2RlbD17eyB0b2dnbGVTZXR0aW5nOiB0cnVlIH19XG4gICAgICAgIC8+LFxuICAgICAgKTtcblxuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoJ0dlbmVyYWwgU2V0dGluZ3MnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChzY3JlZW4ucXVlcnlCeVRleHQoJ0VtcHR5IEdyb3VwJykpLm5vdC50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBudWxsIG1vZGVsJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcihcbiAgICAgICAgPFBhbmVsXG4gICAgICAgICAgbW9kZWw9e251bGx9XG4gICAgICAgICAgY29uZmlndXJhdGlvbj17e319XG4gICAgICAgICAgZ3JvdXBzPXt7XG4gICAgICAgICAgICAnR2VuZXJhbCBTZXR0aW5ncyc6IHtcbiAgICAgICAgICAgICAgdG9nZ2xlU2V0dGluZzoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICd0b2dnbGUnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnRW5hYmxlIEZlYXR1cmUnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9fVxuICAgICAgICAgIG9uQ2hhbmdlTW9kZWw9e2plc3QuZm4oKX1cbiAgICAgICAgLz4sXG4gICAgICApO1xuXG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgnR2VuZXJhbCBTZXR0aW5ncycpKS50b0JlSW5UaGVEb2N1bWVudCgp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
|