@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.
Files changed (58) hide show
  1. package/CHANGELOG.md +80 -28
  2. package/LICENSE.md +5 -0
  3. package/lib/alert-dialog.js +1 -1
  4. package/lib/checkbox.js +1 -1
  5. package/lib/choice-configuration/feedback-menu.js +1 -1
  6. package/lib/choice-configuration/index.js +1 -1
  7. package/lib/choice-utils.js +1 -1
  8. package/lib/feedback-config/feedback-selector.js +1 -1
  9. package/lib/feedback-config/group.js +1 -1
  10. package/lib/feedback-config/index.js +1 -1
  11. package/lib/form-section.js +1 -1
  12. package/lib/help.js +1 -1
  13. package/lib/index.js +1 -1
  14. package/lib/input.js +1 -1
  15. package/lib/inputs.js +1 -1
  16. package/lib/langs.js +1 -1
  17. package/lib/layout/config-layout.js +1 -1
  18. package/lib/layout/index.js +1 -1
  19. package/lib/layout/layout-contents.js +1 -1
  20. package/lib/layout/settings-box.js +1 -1
  21. package/lib/mui-box/index.js +1 -1
  22. package/lib/number-text-field-custom.js +1 -1
  23. package/lib/number-text-field.js +2 -2
  24. package/lib/number-text-field.js.map +1 -1
  25. package/lib/radio-with-label.js +1 -1
  26. package/lib/settings/display-size.js +1 -1
  27. package/lib/settings/index.js +1 -1
  28. package/lib/settings/panel.js +1 -1
  29. package/lib/settings/settings-radio-label.js +1 -1
  30. package/lib/settings/toggle.js +1 -1
  31. package/lib/tabs/index.js +1 -1
  32. package/lib/tags-input/index.js +1 -1
  33. package/lib/two-choice.js +1 -1
  34. package/lib/with-stateful-model.js +1 -1
  35. package/package.json +5 -5
  36. package/src/number-text-field.jsx +1 -1
  37. package/lib/__tests__/alert-dialog.test.js +0 -262
  38. package/lib/__tests__/checkbox.test.js +0 -227
  39. package/lib/__tests__/choice-utils.test.js +0 -14
  40. package/lib/__tests__/form-section.test.js +0 -252
  41. package/lib/__tests__/help.test.js +0 -270
  42. package/lib/__tests__/input.test.js +0 -268
  43. package/lib/__tests__/langs.test.js +0 -541
  44. package/lib/__tests__/number-text-field-custom.test.js +0 -362
  45. package/lib/__tests__/number-text-field.test.js +0 -421
  46. package/lib/__tests__/radio-with-label.test.js +0 -233
  47. package/lib/__tests__/settings-panel.test.js +0 -184
  48. package/lib/__tests__/settings.test.js +0 -653
  49. package/lib/__tests__/tabs.test.js +0 -211
  50. package/lib/__tests__/two-choice.test.js +0 -124
  51. package/lib/__tests__/with-stateful-model.test.js +0 -221
  52. package/lib/choice-configuration/__tests__/feedback-menu.test.js +0 -287
  53. package/lib/choice-configuration/__tests__/index.test.js +0 -253
  54. package/lib/feedback-config/__tests__/feedback-config.test.js +0 -201
  55. package/lib/feedback-config/__tests__/feedback-selector.test.js +0 -177
  56. package/lib/layout/__tests__/config.layout.test.js +0 -70
  57. package/lib/layout/__tests__/layout-content.test.js +0 -6
  58. 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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