@pie-element/inline-dropdown 8.3.2-tip-tap.4 → 8.3.2-tip-tap.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,516 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
6
-
7
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
8
-
9
- var _enzyme = require("enzyme");
10
-
11
- var _react = _interopRequireDefault(require("react"));
12
-
13
- var _main = require("../main");
14
-
15
- var _cloneDeep = _interopRequireDefault(require("lodash/cloneDeep"));
16
-
17
- var _defaults = _interopRequireDefault(require("../defaults"));
18
-
19
- var _markupUtils = require("../markupUtils");
20
-
21
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
22
-
23
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
24
-
25
- jest.mock('@pie-lib/config-ui', function () {
26
- return {
27
- choiceUtils: {
28
- firstAvailableIndex: jest.fn()
29
- },
30
- settings: {
31
- Panel: function Panel(props) {
32
- return /*#__PURE__*/_react["default"].createElement("div", props);
33
- },
34
- toggle: jest.fn(),
35
- radio: jest.fn(),
36
- dropdown: jest.fn()
37
- },
38
- layout: {
39
- ConfigLayout: function ConfigLayout(props) {
40
- return /*#__PURE__*/_react["default"].createElement("div", null, props.children);
41
- }
42
- },
43
- InputContainer: function InputContainer(props) {
44
- return /*#__PURE__*/_react["default"].createElement("div", null, props.children);
45
- }
46
- };
47
- });
48
- var model = {
49
- prompt: 'Use the dropdowns to complete the sentence',
50
- shuffle: true,
51
- markup: '<div><p>The {{0}} jumped {{1}} the {{2}}</p></div>',
52
- choices: {
53
- 0: [{
54
- label: 'cow',
55
- value: '0',
56
- correct: true,
57
- rationale: 'rationale for cow'
58
- }, {
59
- label: 'dog',
60
- value: '1',
61
- correct: false
62
- }, {
63
- label: 'cat',
64
- value: '2',
65
- correct: false
66
- }],
67
- 1: [{
68
- label: 'over',
69
- value: '0',
70
- correct: true,
71
- rationale: 'rationale for over'
72
- }, {
73
- label: 'under',
74
- value: '1',
75
- correct: false
76
- }, {
77
- label: 'across',
78
- value: '2',
79
- correct: false
80
- }],
81
- 2: [{
82
- label: 'moon',
83
- value: '0',
84
- correct: true,
85
- rationale: 'rationale for moon'
86
- }, {
87
- label: 'sun',
88
- value: '2',
89
- correct: false
90
- }, {
91
- label: 'house',
92
- value: '3',
93
- correct: false
94
- }]
95
- },
96
- alternateResponse: {
97
- 2: ['2']
98
- }
99
- };
100
-
101
- var prepareModel = function prepareModel() {
102
- var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
103
-
104
- var currModal = _objectSpread(_objectSpread({}, _defaults["default"].model), model);
105
-
106
- var slateMarkup = model.slateMarkup || (0, _markupUtils.createSlateMarkup)(currModal.markup, currModal.choices);
107
- var markup = (0, _markupUtils.processMarkup)(slateMarkup);
108
- return _objectSpread(_objectSpread({}, currModal), {}, {
109
- slateMarkup: slateMarkup,
110
- markup: markup
111
- /*...processedMarkup,*/
112
-
113
- });
114
- };
115
-
116
- describe('Main', function () {
117
- var onModelChanged;
118
- var onConfigurationChanged;
119
-
120
- var wrapper = function wrapper(extras) {
121
- onModelChanged = jest.fn();
122
- onConfigurationChanged = jest.fn();
123
- var defaults = {
124
- onModelChanged: onModelChanged,
125
- onConfigurationChanged: onConfigurationChanged,
126
- classes: {},
127
- model: prepareModel(_objectSpread(_objectSpread({}, model), extras)),
128
- configuration: _defaults["default"].configuration
129
- };
130
-
131
- var props = _objectSpread({}, defaults);
132
-
133
- return (0, _enzyme.shallow)( /*#__PURE__*/_react["default"].createElement(_main.Main, props), {
134
- disableLifecycleMethods: true
135
- });
136
- };
137
-
138
- describe('snapshot', function () {
139
- it('renders with teacher instructions, prompt and rationale even if not set', function () {
140
- expect(wrapper()).toMatchSnapshot();
141
- });
142
- it('renders without teacher instructions, prompt and rationale', function () {
143
- expect(wrapper({
144
- promptEnabled: false,
145
- teacherInstructionsEnabled: false,
146
- rationaleEnabled: false
147
- })).toMatchSnapshot();
148
- });
149
- });
150
- describe('logic', function () {
151
- var w;
152
- beforeEach(function () {
153
- w = wrapper();
154
- });
155
- describe('onModelChange', function () {
156
- it('changes the model', function () {
157
- w.instance().onModelChange({
158
- promptEnabled: false
159
- });
160
- expect(onModelChanged).toBeCalledWith(_objectSpread(_objectSpread({}, prepareModel(model)), {}, {
161
- promptEnabled: false
162
- }));
163
- });
164
- });
165
- describe('onPromptChanged', function () {
166
- it('changes the prompt value', function () {
167
- w.instance().onPromptChanged('This is the new prompt');
168
- expect(onModelChanged).toBeCalledWith(_objectSpread(_objectSpread({}, prepareModel(model)), {}, {
169
- prompt: 'This is the new prompt'
170
- }));
171
- });
172
- });
173
- describe('onRationaleChanged', function () {
174
- it('changes the rationale value', function () {
175
- w.instance().onRationaleChanged('New Rationale');
176
- expect(onModelChanged).toBeCalledWith(_objectSpread(_objectSpread({}, prepareModel(model)), {}, {
177
- rationale: 'New Rationale'
178
- }));
179
- });
180
- });
181
- describe('onTeacherInstructionsChanged', function () {
182
- it('changes the teacher instructions value', function () {
183
- w.instance().onTeacherInstructionsChanged('New Teacher Instructions');
184
- expect(onModelChanged).toBeCalledWith(_objectSpread(_objectSpread({}, prepareModel(model)), {}, {
185
- teacherInstructions: 'New Teacher Instructions'
186
- }));
187
- });
188
- });
189
- describe('onMarkupChanged', function () {
190
- it('changes slate markup value', function () {
191
- var slateMarkup = '<p>The <span data-type=\\"explicit_constructed_response\\" data-index=\\"0\\" data-value=\\"cow\\"></span> jumped</p>';
192
- w.instance().onMarkupChanged(slateMarkup);
193
- expect(onModelChanged).toBeCalledWith(_objectSpread(_objectSpread({}, prepareModel(model)), {}, {
194
- slateMarkup: slateMarkup
195
- }));
196
- });
197
- });
198
- describe('onChange', function () {
199
- it('Removing choices (keeping only 1 choice): slateMarkup and choices are updated', function () {
200
- var newChoices = _objectSpread(_objectSpread({}, model.choices), {}, {
201
- 0: model.choices['0'].slice(0, 1)
202
- });
203
-
204
- var newMarkup = "<div><p>The <span data-type=\"inline_dropdown\" data-index=\"0\" data-value=\"cow \"></span> jumped <span data-type=\"inline_dropdown\" data-index=\"1\" data-value=\"over \"></span> the <span data-type=\"inline_dropdown\" data-index=\"2\" data-value=\"moon \"></span>.</p></div>";
205
- w.instance().setState({
206
- respAreaChoices: newChoices
207
- });
208
- w.instance().onChange(newMarkup); // TODO do we have to test what happens if clicking on OK/Cancel? How?
209
-
210
- expect(onModelChanged).not.toBeCalled();
211
- });
212
- it('No correct choice selected: slateMarkup and choices are updated', function () {
213
- var newChoices = _objectSpread(_objectSpread({}, model.choices), {}, {
214
- 0: [{
215
- label: 'cow',
216
- value: '0',
217
- correct: false
218
- }, {
219
- label: 'dog',
220
- value: '1',
221
- correct: false
222
- }, {
223
- label: 'cat',
224
- value: '2',
225
- correct: false
226
- }]
227
- });
228
-
229
- var newMarkup = "<div><p>The <span data-type=\"inline_dropdown\" data-index=\"0\" data-value=\"cow \"></span> jumped <span data-type=\"inline_dropdown\" data-index=\"1\" data-value=\"over \"></span> the <span data-type=\"inline_dropdown\" data-index=\"2\" data-value=\"moon \"></span>.</p></div>";
230
- w.instance().setState({
231
- respAreaChoices: newChoices
232
- });
233
- w.instance().onChange(newMarkup); // TODO do we have to test what happens if clicking on OK/Cancel? How?
234
-
235
- expect(onModelChanged).not.toBeCalled();
236
- });
237
- it('New choice: slateMarkup and choices are updated', function () {
238
- var newChoices = _objectSpread(_objectSpread({}, model.choices), {}, {
239
- 0: [].concat((0, _toConsumableArray2["default"])(model.choices['0']), [{
240
- label: 'pet',
241
- value: '3',
242
- correct: false
243
- }])
244
- });
245
-
246
- var newMarkup = "<div><p>The <span data-type=\"inline_dropdown\" data-index=\"0\" data-value=\"cow \"></span> jumped <span data-type=\"inline_dropdown\" data-index=\"1\" data-value=\"over \"></span> the <span data-type=\"inline_dropdown\" data-index=\"2\" data-value=\"moon \"></span>.</p></div>";
247
- w.instance().setState({
248
- respAreaChoices: newChoices
249
- });
250
- w.instance().onChange(newMarkup);
251
- expect(onModelChanged).toBeCalledWith(_objectSpread(_objectSpread({}, prepareModel(model)), {}, {
252
- slateMarkup: newMarkup,
253
- choices: newChoices
254
- }));
255
- });
256
- it('New Response Area: slateMarkup and choices are updated', function () {
257
- var oldModel = w.instance().props.model;
258
-
259
- var newChoices = _objectSpread(_objectSpread({}, model.choices), {}, {
260
- 3: [{
261
- label: 'A',
262
- value: '0',
263
- correct: true
264
- }, {
265
- label: 'B',
266
- value: '1',
267
- correct: false
268
- }, {
269
- label: 'C',
270
- value: '2',
271
- correct: false
272
- }]
273
- });
274
-
275
- var newMarkup = "<div><p>The <span data-type=\"inline_dropdown\" data-index=\"0\" data-value=\"cow \"></span> jumped <span data-type=\"inline_dropdown\" data-index=\"1\" data-value=\"over \"></span> the <span data-type=\"inline_dropdown\" data-index=\"2\" data-value=\"moon \"></span>, <span data-type=\"inline_dropdown\" data-index=\"3\" data-value=\"A\"></span>.</p></div>";
276
- w.instance().setState({
277
- respAreaChoices: newChoices
278
- });
279
- w.instance().onChange(newMarkup);
280
- expect(onModelChanged).toBeCalledWith(_objectSpread(_objectSpread({}, oldModel), {}, {
281
- slateMarkup: newMarkup,
282
- choices: newChoices
283
- }));
284
- });
285
- it('Removing choices (keeping at least 2): slateMarkup and choices are updated', function () {
286
- var oldModel = w.instance().props.model;
287
-
288
- var newChoices = _objectSpread(_objectSpread({}, model.choices), {}, {
289
- 0: model.choices['0'].slice(0, 2)
290
- });
291
-
292
- var newMarkup = "<div><p>The <span data-type=\"inline_dropdown\" data-index=\"0\" data-value=\"cow \"></span> jumped <span data-type=\"inline_dropdown\" data-index=\"1\" data-value=\"over \"></span> the <span data-type=\"inline_dropdown\" data-index=\"2\" data-value=\"moon \"></span>.</p></div>";
293
- w.instance().setState({
294
- respAreaChoices: newChoices
295
- });
296
- w.instance().onChange(newMarkup);
297
- expect(onModelChanged).toBeCalledWith(_objectSpread(_objectSpread({}, oldModel), {}, {
298
- slateMarkup: newMarkup,
299
- choices: newChoices
300
- }));
301
- });
302
- });
303
- describe('onChoiceRationaleChanged', function () {
304
- it('changes the choice level rationale value', function () {
305
- w.instance().onChoiceRationaleChanged(0, {
306
- label: 'cow',
307
- value: '0',
308
- correct: true,
309
- rationale: 'new rationale for cow'
310
- });
311
- expect(onModelChanged).toBeCalledWith(_objectSpread(_objectSpread({}, prepareModel(model)), {}, {
312
- choices: {
313
- 0: [{
314
- label: 'cow',
315
- value: '0',
316
- correct: true,
317
- rationale: 'new rationale for cow'
318
- }, {
319
- label: 'dog',
320
- value: '1',
321
- correct: false
322
- }, {
323
- label: 'cat',
324
- value: '2',
325
- correct: false
326
- }],
327
- 1: [{
328
- label: 'over',
329
- value: '0',
330
- correct: true,
331
- rationale: 'rationale for over'
332
- }, {
333
- label: 'under',
334
- value: '1',
335
- correct: false
336
- }, {
337
- label: 'across',
338
- value: '2',
339
- correct: false
340
- }],
341
- 2: [{
342
- label: 'moon',
343
- value: '0',
344
- correct: true,
345
- rationale: 'rationale for moon'
346
- }, {
347
- label: 'sun',
348
- value: '2',
349
- correct: false
350
- }, {
351
- label: 'house',
352
- value: '3',
353
- correct: false
354
- }]
355
- }
356
- }));
357
- });
358
- });
359
- describe('onAddChoice', function () {
360
- beforeEach(function () {
361
- w.instance().setState({
362
- respAreaChoices: model.choices
363
- });
364
- });
365
- it('Does not add duplicates', function () {
366
- w.instance().onAddChoice('0', 'cow');
367
- expect(onModelChanged).not.toBeCalled();
368
- w.instance().onAddChoice('1', 'over');
369
- expect(onModelChanged).not.toBeCalled();
370
- w.instance().onAddChoice('1', 'under');
371
- expect(onModelChanged).not.toBeCalled();
372
- });
373
- it('Adds a new choice', function () {
374
- var currentModel = (0, _cloneDeep["default"])(w.instance().props.model);
375
- w.instance().onAddChoice('0', 'bird');
376
- expect(onModelChanged).toBeCalledWith(_objectSpread(_objectSpread({}, currentModel), {}, {
377
- choices: _objectSpread(_objectSpread({}, currentModel.choices), {}, {
378
- 0: [].concat((0, _toConsumableArray2["default"])(currentModel.choices['0']), [{
379
- label: 'bird',
380
- value: '3',
381
- correct: false
382
- }])
383
- })
384
- }));
385
- w.instance().onAddChoice('2', 'star');
386
- expect(onModelChanged).toBeCalledWith(_objectSpread(_objectSpread({}, currentModel), {}, {
387
- choices: _objectSpread(_objectSpread({}, currentModel.choices), {}, {
388
- 0: [].concat((0, _toConsumableArray2["default"])(currentModel.choices['0']), [{
389
- label: 'bird',
390
- value: '3',
391
- correct: false
392
- }]),
393
- 2: [].concat((0, _toConsumableArray2["default"])(currentModel.choices['2']), [{
394
- label: 'star',
395
- value: '4',
396
- correct: false
397
- }])
398
- })
399
- }));
400
- });
401
- });
402
- describe('onRemoveChoice', function () {
403
- beforeEach(function () {
404
- w.instance().setState({
405
- respAreaChoices: {
406
- 0: [{
407
- label: 'cow',
408
- value: '0',
409
- correct: true
410
- }, {
411
- label: 'dog',
412
- value: '1',
413
- correct: false
414
- }, {
415
- label: 'cat',
416
- value: '2',
417
- correct: false
418
- }]
419
- }
420
- });
421
- });
422
- it('Removes choices', function () {
423
- w.instance().onRemoveChoice(0, '0');
424
- expect(onModelChanged).toBeCalledWith(expect.objectContaining({
425
- choices: {
426
- 0: [{
427
- label: 'dog',
428
- value: '1',
429
- correct: false
430
- }, {
431
- label: 'cat',
432
- value: '2',
433
- correct: false
434
- }]
435
- }
436
- }));
437
- w.instance().onRemoveChoice(0, '0');
438
- expect(onModelChanged).toBeCalledWith(expect.objectContaining({
439
- choices: {
440
- 0: [{
441
- label: 'cat',
442
- value: '2',
443
- correct: false
444
- }]
445
- }
446
- }));
447
- w.instance().onRemoveChoice(0, '0');
448
- expect(onModelChanged).toBeCalledWith(expect.objectContaining({
449
- choices: {
450
- 0: []
451
- }
452
- }));
453
- });
454
- });
455
- describe('onSelectChoice', function () {
456
- beforeEach(function () {
457
- w.instance().setState({
458
- respAreaChoices: {
459
- 0: [{
460
- label: 'cow',
461
- value: '0',
462
- correct: true
463
- }, {
464
- label: 'dog',
465
- value: '1',
466
- correct: false
467
- }, {
468
- label: 'cat',
469
- value: '2',
470
- correct: false
471
- }]
472
- }
473
- });
474
- });
475
- it('Updates correct choice', function () {
476
- w.instance().onSelectChoice(0, 1);
477
- expect(onModelChanged).toBeCalledWith(expect.objectContaining({
478
- choices: {
479
- 0: [{
480
- label: 'cow',
481
- value: '0',
482
- correct: false
483
- }, {
484
- label: 'dog',
485
- value: '1',
486
- correct: true
487
- }, {
488
- label: 'cat',
489
- value: '2',
490
- correct: false
491
- }]
492
- }
493
- }));
494
- w.instance().onSelectChoice(0, 0);
495
- expect(onModelChanged).toBeCalledWith(expect.objectContaining({
496
- choices: {
497
- 0: [{
498
- label: 'cow',
499
- value: '0',
500
- correct: true
501
- }, {
502
- label: 'dog',
503
- value: '1',
504
- correct: false
505
- }, {
506
- label: 'cat',
507
- value: '2',
508
- correct: false
509
- }]
510
- }
511
- }));
512
- });
513
- });
514
- });
515
- });
516
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vbWFpbi50ZXN0LmpzeCJdLCJuYW1lcyI6WyJqZXN0IiwibW9jayIsImNob2ljZVV0aWxzIiwiZmlyc3RBdmFpbGFibGVJbmRleCIsImZuIiwic2V0dGluZ3MiLCJQYW5lbCIsInByb3BzIiwidG9nZ2xlIiwicmFkaW8iLCJkcm9wZG93biIsImxheW91dCIsIkNvbmZpZ0xheW91dCIsImNoaWxkcmVuIiwiSW5wdXRDb250YWluZXIiLCJtb2RlbCIsInByb21wdCIsInNodWZmbGUiLCJtYXJrdXAiLCJjaG9pY2VzIiwibGFiZWwiLCJ2YWx1ZSIsImNvcnJlY3QiLCJyYXRpb25hbGUiLCJhbHRlcm5hdGVSZXNwb25zZSIsInByZXBhcmVNb2RlbCIsImN1cnJNb2RhbCIsInNlbnNpYmxlRGVmYXVsdHMiLCJzbGF0ZU1hcmt1cCIsImRlc2NyaWJlIiwib25Nb2RlbENoYW5nZWQiLCJvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkIiwid3JhcHBlciIsImV4dHJhcyIsImRlZmF1bHRzIiwiY2xhc3NlcyIsImNvbmZpZ3VyYXRpb24iLCJkaXNhYmxlTGlmZWN5Y2xlTWV0aG9kcyIsIml0IiwiZXhwZWN0IiwidG9NYXRjaFNuYXBzaG90IiwicHJvbXB0RW5hYmxlZCIsInRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkIiwicmF0aW9uYWxlRW5hYmxlZCIsInciLCJiZWZvcmVFYWNoIiwiaW5zdGFuY2UiLCJvbk1vZGVsQ2hhbmdlIiwidG9CZUNhbGxlZFdpdGgiLCJvblByb21wdENoYW5nZWQiLCJvblJhdGlvbmFsZUNoYW5nZWQiLCJvblRlYWNoZXJJbnN0cnVjdGlvbnNDaGFuZ2VkIiwidGVhY2hlckluc3RydWN0aW9ucyIsIm9uTWFya3VwQ2hhbmdlZCIsIm5ld0Nob2ljZXMiLCJzbGljZSIsIm5ld01hcmt1cCIsInNldFN0YXRlIiwicmVzcEFyZWFDaG9pY2VzIiwib25DaGFuZ2UiLCJub3QiLCJ0b0JlQ2FsbGVkIiwib2xkTW9kZWwiLCJvbkNob2ljZVJhdGlvbmFsZUNoYW5nZWQiLCJvbkFkZENob2ljZSIsImN1cnJlbnRNb2RlbCIsIm9uUmVtb3ZlQ2hvaWNlIiwib2JqZWN0Q29udGFpbmluZyIsIm9uU2VsZWN0Q2hvaWNlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7QUFFQUEsSUFBSSxDQUFDQyxJQUFMLENBQVUsb0JBQVYsRUFBZ0M7QUFBQSxTQUFPO0FBQ3JDQyxJQUFBQSxXQUFXLEVBQUU7QUFDWEMsTUFBQUEsbUJBQW1CLEVBQUVILElBQUksQ0FBQ0ksRUFBTDtBQURWLEtBRHdCO0FBSXJDQyxJQUFBQSxRQUFRLEVBQUU7QUFDUkMsTUFBQUEsS0FBSyxFQUFFLGVBQUNDLEtBQUQ7QUFBQSw0QkFBVyx1Q0FBU0EsS0FBVCxDQUFYO0FBQUEsT0FEQztBQUVSQyxNQUFBQSxNQUFNLEVBQUVSLElBQUksQ0FBQ0ksRUFBTCxFQUZBO0FBR1JLLE1BQUFBLEtBQUssRUFBRVQsSUFBSSxDQUFDSSxFQUFMLEVBSEM7QUFJUk0sTUFBQUEsUUFBUSxFQUFFVixJQUFJLENBQUNJLEVBQUw7QUFKRixLQUoyQjtBQVVyQ08sSUFBQUEsTUFBTSxFQUFFO0FBQ05DLE1BQUFBLFlBQVksRUFBRSxzQkFBQ0wsS0FBRDtBQUFBLDRCQUFXLDZDQUFNQSxLQUFLLENBQUNNLFFBQVosQ0FBWDtBQUFBO0FBRFIsS0FWNkI7QUFhckNDLElBQUFBLGNBQWMsRUFBRSx3QkFBQ1AsS0FBRDtBQUFBLDBCQUFXLDZDQUFNQSxLQUFLLENBQUNNLFFBQVosQ0FBWDtBQUFBO0FBYnFCLEdBQVA7QUFBQSxDQUFoQztBQWdCQSxJQUFNRSxLQUFLLEdBQUc7QUFDWkMsRUFBQUEsTUFBTSxFQUFFLDRDQURJO0FBRVpDLEVBQUFBLE9BQU8sRUFBRSxJQUZHO0FBR1pDLEVBQUFBLE1BQU0sRUFBRSxvREFISTtBQUlaQyxFQUFBQSxPQUFPLEVBQUU7QUFDUCxPQUFHLENBQ0Q7QUFDRUMsTUFBQUEsS0FBSyxF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QVQ7QUFBZ0JDLGNBQUFBLEtBQUssRUFBRSxHQUF2QjtBQUE0QkMsY0FBQUEsT0FBTyxFQUFFO0FBQXJDLGFBREMsRUFFRDtBQUFFRixjQUFBQSxLQUFLLEVBQUUsS0FBVDtBQUFnQkMsY0FBQUEsS0FBSyxFQUFFLEdBQXZCO0FBQTRCQyxjQUFBQSxPQUFPLEVBQUU7QUFBckMsYUFGQyxFQUdEO0FBQUVGLGNBQUFBLEtBQUssRUFBRSxLQUFUO0FBQWdCQyxjQUFBQSxLQUFLLEVBQUUsR0FBdkI7QUFBNEJDLGNBQUFBLE9BQU8sRUFBRTtBQUFyQyxhQUhDO0FBREk7QUFEYSxTQUF4QixDQURGO0FBWUFzQixRQUFBQSxDQUFDLENBQUNFLFFBQUYsR0FBYXNCLGNBQWIsQ0FBNEIsQ0FBNUIsRUFBK0IsQ0FBL0I7QUFFQTdCLFFBQUFBLE1BQU0sQ0FBQ1QsY0FBRCxDQUFOLENBQXVCa0IsY0FBdkIsQ0FDRVQsTUFBTSxDQUFDNEIsZ0JBQVAsQ0FBd0I7QUFDdEJoRCxVQUFBQSxPQUFPLEVBQUU7QUFDUCxlQUFHLENBQ0Q7QUFBRUMsY0FBQUEsS0FBSyxFQUFFLEtBQVQ7QUFBZ0JDLGNBQUFBLEtBQUssRUFBRSxHQUF2QjtBQUE0QkMsY0FBQUEsT0FBTyxFQUFFO0FBQXJDLGFBREMsRUFFRDtBQUFFRixjQUFBQSxLQUFLLEVBQUUsS0FBVDtBQUFnQkMsY0FBQUEsS0FBSyxFQUFFLEdBQXZCO0FBQTRCQyxjQUFBQSxPQUFPLEVBQUU7QUFBckMsYUFGQyxFQUdEO0FBQUVGLGNBQUFBLEtBQUssRUFBRSxLQUFUO0FBQWdCQyxjQUFBQSxLQUFLLEVBQUUsR0FBdkI7QUFBNEJDLGNBQUFBLE9BQU8sRUFBRTtBQUFyQyxhQUhDO0FBREk7QUFEYSxTQUF4QixDQURGO0FBV0QsT0E1QkMsQ0FBRjtBQTZCRCxLQTFDTyxDQUFSO0FBMkNELEdBMVlPLENBQVI7QUEyWUQsQ0FsYk8sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNoYWxsb3cgfSBmcm9tICdlbnp5bWUnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgTWFpbiB9IGZyb20gJy4uL21haW4nO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2gvY2xvbmVEZWVwJztcbmltcG9ydCBzZW5zaWJsZURlZmF1bHRzIGZyb20gJy4uL2RlZmF1bHRzJztcbmltcG9ydCB7IGNyZWF0ZVNsYXRlTWFya3VwLCBwcm9jZXNzTWFya3VwIH0gZnJvbSAnLi4vbWFya3VwVXRpbHMnO1xuXG5qZXN0Lm1vY2soJ0BwaWUtbGliL2NvbmZpZy11aScsICgpID0+ICh7XG4gIGNob2ljZVV0aWxzOiB7XG4gICAgZmlyc3RBdmFpbGFibGVJbmRleDogamVzdC5mbigpLFxuICB9LFxuICBzZXR0aW5nczoge1xuICAgIFBhbmVsOiAocHJvcHMpID0+IDxkaXYgey4uLnByb3BzfSAvPixcbiAgICB0b2dnbGU6IGplc3QuZm4oKSxcbiAgICByYWRpbzogamVzdC5mbigpLFxuICAgIGRyb3Bkb3duOiBqZXN0LmZuKCksXG4gIH0sXG4gIGxheW91dDoge1xuICAgIENvbmZpZ0xheW91dDogKHByb3BzKSA9PiA8ZGl2Pntwcm9wcy5jaGlsZHJlbn08L2Rpdj4sXG4gIH0sXG4gIElucHV0Q29udGFpbmVyOiAocHJvcHMpID0+IDxkaXY+e3Byb3BzLmNoaWxkcmVufTwvZGl2Pixcbn0pKTtcblxuY29uc3QgbW9kZWwgPSB7XG4gIHByb21wdDogJ1VzZSB0aGUgZHJvcGRvd25zIHRvIGNvbXBsZXRlIHRoZSBzZW50ZW5jZScsXG4gIHNodWZmbGU6IHRydWUsXG4gIG1hcmt1cDogJzxkaXY+PHA+VGhlIHt7MH19IGp1bXBlZCB7ezF9fSB0aGUge3syfX08L3A+PC9kaXY+JyxcbiAgY2hvaWNlczoge1xuICAgIDA6IFtcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICdjb3cnLFxuICAgICAgICB2YWx1ZTogJzAnLFxuICAgICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgICByYXRpb25hbGU6ICdyYXRpb25hbGUgZm9yIGNvdycsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsYWJlbDogJ2RvZycsXG4gICAgICAgIHZhbHVlOiAnMScsXG4gICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICdjYXQnLFxuICAgICAgICB2YWx1ZTogJzInLFxuICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgIH0sXG4gICAgXSxcbiAgICAxOiBbXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnb3ZlcicsXG4gICAgICAgIHZhbHVlOiAnMCcsXG4gICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgIHJhdGlvbmFsZTogJ3JhdGlvbmFsZSBmb3Igb3ZlcicsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsYWJlbDogJ3VuZGVyJyxcbiAgICAgICAgdmFsdWU6ICcxJyxcbiAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsYWJlbDogJ2Fjcm9zcycsXG4gICAgICAgIHZhbHVlOiAnMicsXG4gICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgfSxcbiAgICBdLFxuICAgIDI6IFtcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICdtb29uJyxcbiAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgICAgcmF0aW9uYWxlOiAncmF0aW9uYWxlIGZvciBtb29uJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnc3VuJyxcbiAgICAgICAgdmFsdWU6ICcyJyxcbiAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsYWJlbDogJ2hvdXNlJyxcbiAgICAgICAgdmFsdWU6ICczJyxcbiAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG4gIGFsdGVybmF0ZVJlc3BvbnNlOiB7XG4gICAgMjogWycyJ10sXG4gIH0sXG59O1xuXG5jb25zdCBwcmVwYXJlTW9kZWwgPSAobW9kZWwgPSB7fSkgPT4ge1xuICBjb25zdCBjdXJyTW9kYWwgPSB7XG4gICAgLi4uc2Vuc2libGVEZWZhdWx0cy5tb2RlbCxcbiAgICAuLi5tb2RlbCxcbiAgfTtcbiAgY29uc3Qgc2xhdGVNYXJrdXAgPSBtb2RlbC5zbGF0ZU1hcmt1cCB8fCBjcmVhdGVTbGF0ZU1hcmt1cChjdXJyTW9kYWwubWFya3VwLCBjdXJyTW9kYWwuY2hvaWNlcyk7XG4gIGNvbnN0IG1hcmt1cCA9IHByb2Nlc3NNYXJrdXAoc2xhdGVNYXJrdXApO1xuXG4gIHJldHVybiB7XG4gICAgLi4uY3Vyck1vZGFsLFxuICAgIHNsYXRlTWFya3VwLFxuICAgIG1hcmt1cCxcbiAgICAvKi4uLnByb2Nlc3NlZE1hcmt1cCwqL1xuICB9O1xufTtcblxuZGVzY3JpYmUoJ01haW4nLCAoKSA9PiB7XG4gIGxldCBvbk1vZGVsQ2hhbmdlZDtcbiAgbGV0IG9uQ29uZmlndXJhdGlvbkNoYW5nZWQ7XG5cbiAgY29uc3Qgd3JhcHBlciA9IChleHRyYXMpID0+IHtcbiAgICBvbk1vZGVsQ2hhbmdlZCA9IGplc3QuZm4oKTtcbiAgICBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkID0gamVzdC5mbigpO1xuXG4gICAgY29uc3QgZGVmYXVsdHMgPSB7XG4gICAgICBvbk1vZGVsQ2hhbmdlZCxcbiAgICAgIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQsXG4gICAgICBjbGFzc2VzOiB7fSxcbiAgICAgIG1vZGVsOiBwcmVwYXJlTW9kZWwoe1xuICAgICAgICAuLi5tb2RlbCxcbiAgICAgICAgLi4uZXh0cmFzLFxuICAgICAgfSksXG4gICAgICBjb25maWd1cmF0aW9uOiBzZW5zaWJsZURlZmF1bHRzLmNvbmZpZ3VyYXRpb24sXG4gICAgfTtcbiAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdHMgfTtcblxuICAgIHJldHVybiBzaGFsbG93KDxNYWluIHsuLi5wcm9wc30gLz4sIHsgZGlzYWJsZUxpZmVjeWNsZU1ldGhvZHM6IHRydWUgfSk7XG4gIH07XG5cbiAgZGVzY3JpYmUoJ3NuYXBzaG90JywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHdpdGggdGVhY2hlciBpbnN0cnVjdGlvbnMsIHByb21wdCBhbmQgcmF0aW9uYWxlIGV2ZW4gaWYgbm90IHNldCcsICgpID0+IHtcbiAgICAgIGV4cGVjdCh3cmFwcGVyKCkpLnRvTWF0Y2hTbmFwc2hvdCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aG91dCB0ZWFjaGVyIGluc3RydWN0aW9ucywgcHJvbXB0IGFuZCByYXRpb25hbGUnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIHdyYXBwZXIoe1xuICAgICAgICAgIHByb21wdEVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgICByYXRpb25hbGVFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgfSksXG4gICAgICApLnRvTWF0Y2hTbmFwc2hvdCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbG9naWMnLCAoKSA9PiB7XG4gICAgbGV0IHc7XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIHcgPSB3cmFwcGVyKCk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnb25Nb2RlbENoYW5nZScsICgpID0+IHtcbiAgICAgIGl0KCdjaGFuZ2VzIHRoZSBtb2RlbCcsICgpID0+IHtcbiAgICAgICAgdy5pbnN0YW5jZSgpLm9uTW9kZWxDaGFuZ2UoeyBwcm9tcHRFbmFibGVkOiBmYWxzZSB9KTtcblxuICAgICAgICBleHBlY3Qob25Nb2RlbENoYW5nZWQpLnRvQmVDYWxsZWRXaXRoKHtcbiAgICAgICAgICAuLi5wcmVwYXJlTW9kZWwobW9kZWwpLFxuICAgICAgICAgIHByb21wdEVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ29uUHJvbXB0Q2hhbmdlZCcsICgpID0+IHtcbiAgICAgIGl0KCdjaGFuZ2VzIHRoZSBwcm9tcHQgdmFsdWUnLCAoKSA9PiB7XG4gICAgICAgIHcuaW5zdGFuY2UoKS5vblByb21wdENoYW5nZWQoJ1RoaXMgaXMgdGhlIG5ldyBwcm9tcHQnKTtcblxuICAgICAgICBleHBlY3Qob25Nb2RlbENoYW5nZWQpLnRvQmVDYWxsZWRXaXRoKHtcbiAgICAgICAgICAuLi5wcmVwYXJlTW9kZWwobW9kZWwpLFxuICAgICAgICAgIHByb21wdDogJ1RoaXMgaXMgdGhlIG5ldyBwcm9tcHQnLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ29uUmF0aW9uYWxlQ2hhbmdlZCcsICgpID0+IHtcbiAgICAgIGl0KCdjaGFuZ2VzIHRoZSByYXRpb25hbGUgdmFsdWUnLCAoKSA9PiB7XG4gICAgICAgIHcuaW5zdGFuY2UoKS5vblJhdGlvbmFsZUNoYW5nZWQoJ05ldyBSYXRpb25hbGUnKTtcblxuICAgICAgICBleHBlY3Qob25Nb2RlbENoYW5nZWQpLnRvQmVDYWxsZWRXaXRoKHtcbiAgICAgICAgICAuLi5wcmVwYXJlTW9kZWwobW9kZWwpLFxuICAgICAgICAgIHJhdGlvbmFsZTogJ05ldyBSYXRpb25hbGUnLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ29uVGVhY2hlckluc3RydWN0aW9uc0NoYW5nZWQnLCAoKSA9PiB7XG4gICAgICBpdCgnY2hhbmdlcyB0aGUgdGVhY2hlciBpbnN0cnVjdGlvbnMgdmFsdWUnLCAoKSA9PiB7XG4gICAgICAgIHcuaW5zdGFuY2UoKS5vblRlYWNoZXJJbnN0cnVjdGlvbnNDaGFuZ2VkKCdOZXcgVGVhY2hlciBJbnN0cnVjdGlvbnMnKTtcblxuICAgICAgICBleHBlY3Qob25Nb2RlbENoYW5nZWQpLnRvQmVDYWxsZWRXaXRoKHtcbiAgICAgICAgICAuLi5wcmVwYXJlTW9kZWwobW9kZWwpLFxuICAgICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6ICdOZXcgVGVhY2hlciBJbnN0cnVjdGlvbnMnLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ29uTWFya3VwQ2hhbmdlZCcsICgpID0+IHtcbiAgICAgIGl0KCdjaGFuZ2VzIHNsYXRlIG1hcmt1cCB2YWx1ZScsICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2xhdGVNYXJrdXAgPVxuICAgICAgICAgICc8cD5UaGUgPHNwYW4gZGF0YS10eXBlPVxcXFxcImV4cGxpY2l0X2NvbnN0cnVjdGVkX3Jlc3BvbnNlXFxcXFwiIGRhdGEtaW5kZXg9XFxcXFwiMFxcXFxcIiBkYXRhLXZhbHVlPVxcXFxcImNvd1xcXFxcIj48L3NwYW4+IGp1bXBlZDwvcD4nO1xuXG4gICAgICAgIHcuaW5zdGFuY2UoKS5vbk1hcmt1cENoYW5nZWQoc2xhdGVNYXJrdXApO1xuXG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkudG9CZUNhbGxlZFdpdGgoe1xuICAgICAgICAgIC4uLnByZXBhcmVNb2RlbChtb2RlbCksXG4gICAgICAgICAgc2xhdGVNYXJrdXAsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnb25DaGFuZ2UnLCAoKSA9PiB7XG4gICAgICBpdCgnUmVtb3ZpbmcgY2hvaWNlcyAoa2VlcGluZyBvbmx5IDEgY2hvaWNlKTogc2xhdGVNYXJrdXAgYW5kIGNob2ljZXMgYXJlIHVwZGF0ZWQnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld0Nob2ljZXMgPSB7XG4gICAgICAgICAgLi4ubW9kZWwuY2hvaWNlcyxcbiAgICAgICAgICAwOiBtb2RlbC5jaG9pY2VzWycwJ10uc2xpY2UoMCwgMSksXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG5ld01hcmt1cCA9IGA8ZGl2PjxwPlRoZSA8c3BhbiBkYXRhLXR5cGU9XCJpbmxpbmVfZHJvcGRvd25cIiBkYXRhLWluZGV4PVwiMFwiIGRhdGEtdmFsdWU9XCJjb3cgXCI+PC9zcGFuPiBqdW1wZWQgPHNwYW4gZGF0YS10eXBlPVwiaW5saW5lX2Ryb3Bkb3duXCIgZGF0YS1pbmRleD1cIjFcIiBkYXRhLXZhbHVlPVwib3ZlciBcIj48L3NwYW4+IHRoZSA8c3BhbiBkYXRhLXR5cGU9XCJpbmxpbmVfZHJvcGRvd25cIiBkYXRhLWluZGV4PVwiMlwiIGRhdGEtdmFsdWU9XCJtb29uIFwiPjwvc3Bhbj4uPC9wPjwvZGl2PmA7XG5cbiAgICAgICAgdy5pbnN0YW5jZSgpLnNldFN0YXRlKHsgcmVzcEFyZWFDaG9pY2VzOiBuZXdDaG9pY2VzIH0pO1xuICAgICAgICB3Lmluc3RhbmNlKCkub25DaGFuZ2UobmV3TWFya3VwKTtcblxuICAgICAgICAvLyBUT0RPIGRvIHdlIGhhdmUgdG8gdGVzdCB3aGF0IGhhcHBlbnMgaWYgY2xpY2tpbmcgb24gT0svQ2FuY2VsPyBIb3c/XG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkubm90LnRvQmVDYWxsZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnTm8gY29ycmVjdCBjaG9pY2Ugc2VsZWN0ZWQ6IHNsYXRlTWFya3VwIGFuZCBjaG9pY2VzIGFyZSB1cGRhdGVkJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBuZXdDaG9pY2VzID0ge1xuICAgICAgICAgIC4uLm1vZGVsLmNob2ljZXMsXG4gICAgICAgICAgMDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ2NvdycsXG4gICAgICAgICAgICAgIHZhbHVlOiAnMCcsXG4gICAgICAgICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdkb2cnLFxuICAgICAgICAgICAgICB2YWx1ZTogJzEnLFxuICAgICAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGxhYmVsOiAnY2F0JyxcbiAgICAgICAgICAgICAgdmFsdWU6ICcyJyxcbiAgICAgICAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG5ld01hcmt1cCA9IGA8ZGl2PjxwPlRoZSA8c3BhbiBkYXRhLXR5cGU9XCJpbmxpbmVfZHJvcGRvd25cIiBkYXRhLWluZGV4PVwiMFwiIGRhdGEtdmFsdWU9XCJjb3cgXCI+PC9zcGFuPiBqdW1wZWQgPHNwYW4gZGF0YS10eXBlPVwiaW5saW5lX2Ryb3Bkb3duXCIgZGF0YS1pbmRleD1cIjFcIiBkYXRhLXZhbHVlPVwib3ZlciBcIj48L3NwYW4+IHRoZSA8c3BhbiBkYXRhLXR5cGU9XCJpbmxpbmVfZHJvcGRvd25cIiBkYXRhLWluZGV4PVwiMlwiIGRhdGEtdmFsdWU9XCJtb29uIFwiPjwvc3Bhbj4uPC9wPjwvZGl2PmA7XG5cbiAgICAgICAgdy5pbnN0YW5jZSgpLnNldFN0YXRlKHsgcmVzcEFyZWFDaG9pY2VzOiBuZXdDaG9pY2VzIH0pO1xuICAgICAgICB3Lmluc3RhbmNlKCkub25DaGFuZ2UobmV3TWFya3VwKTtcblxuICAgICAgICAvLyBUT0RPIGRvIHdlIGhhdmUgdG8gdGVzdCB3aGF0IGhhcHBlbnMgaWYgY2xpY2tpbmcgb24gT0svQ2FuY2VsPyBIb3c/XG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkubm90LnRvQmVDYWxsZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnTmV3IGNob2ljZTogc2xhdGVNYXJrdXAgYW5kIGNob2ljZXMgYXJlIHVwZGF0ZWQnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld0Nob2ljZXMgPSB7XG4gICAgICAgICAgLi4ubW9kZWwuY2hvaWNlcyxcbiAgICAgICAgICAwOiBbXG4gICAgICAgICAgICAuLi5tb2RlbC5jaG9pY2VzWycwJ10sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGxhYmVsOiAncGV0JyxcbiAgICAgICAgICAgICAgdmFsdWU6ICczJyxcbiAgICAgICAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG5ld01hcmt1cCA9IGA8ZGl2PjxwPlRoZSA8c3BhbiBkYXRhLXR5cGU9XCJpbmxpbmVfZHJvcGRvd25cIiBkYXRhLWluZGV4PVwiMFwiIGRhdGEtdmFsdWU9XCJjb3cgXCI+PC9zcGFuPiBqdW1wZWQgPHNwYW4gZGF0YS10eXBlPVwiaW5saW5lX2Ryb3Bkb3duXCIgZGF0YS1pbmRleD1cIjFcIiBkYXRhLXZhbHVlPVwib3ZlciBcIj48L3NwYW4+IHRoZSA8c3BhbiBkYXRhLXR5cGU9XCJpbmxpbmVfZHJvcGRvd25cIiBkYXRhLWluZGV4PVwiMlwiIGRhdGEtdmFsdWU9XCJtb29uIFwiPjwvc3Bhbj4uPC9wPjwvZGl2PmA7XG5cbiAgICAgICAgdy5pbnN0YW5jZSgpLnNldFN0YXRlKHsgcmVzcEFyZWFDaG9pY2VzOiBuZXdDaG9pY2VzIH0pO1xuICAgICAgICB3Lmluc3RhbmNlKCkub25DaGFuZ2UobmV3TWFya3VwKTtcblxuICAgICAgICBleHBlY3Qob25Nb2RlbENoYW5nZWQpLnRvQmVDYWxsZWRXaXRoKHtcbiAgICAgICAgICAuLi5wcmVwYXJlTW9kZWwobW9kZWwpLFxuICAgICAgICAgIHNsYXRlTWFya3VwOiBuZXdNYXJrdXAsXG4gICAgICAgICAgY2hvaWNlczogbmV3Q2hvaWNlcyxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ05ldyBSZXNwb25zZSBBcmVhOiBzbGF0ZU1hcmt1cCBhbmQgY2hvaWNlcyBhcmUgdXBkYXRlZCcsICgpID0+IHtcbiAgICAgICAgY29uc3Qgb2xkTW9kZWwgPSB3Lmluc3RhbmNlKCkucHJvcHMubW9kZWw7XG4gICAgICAgIGNvbnN0IG5ld0Nob2ljZXMgPSB7XG4gICAgICAgICAgLi4ubW9kZWwuY2hvaWNlcyxcbiAgICAgICAgICAzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGxhYmVsOiAnQScsXG4gICAgICAgICAgICAgIHZhbHVlOiAnMCcsXG4gICAgICAgICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ0InLFxuICAgICAgICAgICAgICB2YWx1ZTogJzEnLFxuICAgICAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGxhYmVsOiAnQycsXG4gICAgICAgICAgICAgIHZhbHVlOiAnMicsXG4gICAgICAgICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBuZXdNYXJrdXAgPSBgPGRpdj48cD5UaGUgPHNwYW4gZGF0YS10eXBlPVwiaW5saW5lX2Ryb3Bkb3duXCIgZGF0YS1pbmRleD1cIjBcIiBkYXRhLXZhbHVlPVwiY293IFwiPjwvc3Bhbj4ganVtcGVkIDxzcGFuIGRhdGEtdHlwZT1cImlubGluZV9kcm9wZG93blwiIGRhdGEtaW5kZXg9XCIxXCIgZGF0YS12YWx1ZT1cIm92ZXIgXCI+PC9zcGFuPiB0aGUgPHNwYW4gZGF0YS10eXBlPVwiaW5saW5lX2Ryb3Bkb3duXCIgZGF0YS1pbmRleD1cIjJcIiBkYXRhLXZhbHVlPVwibW9vbiBcIj48L3NwYW4+LCA8c3BhbiBkYXRhLXR5cGU9XCJpbmxpbmVfZHJvcGRvd25cIiBkYXRhLWluZGV4PVwiM1wiIGRhdGEtdmFsdWU9XCJBXCI+PC9zcGFuPi48L3A+PC9kaXY+YDtcblxuICAgICAgICB3Lmluc3RhbmNlKCkuc2V0U3RhdGUoeyByZXNwQXJlYUNob2ljZXM6IG5ld0Nob2ljZXMgfSk7XG4gICAgICAgIHcuaW5zdGFuY2UoKS5vbkNoYW5nZShuZXdNYXJrdXApO1xuXG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkudG9CZUNhbGxlZFdpdGgoe1xuICAgICAgICAgIC4uLm9sZE1vZGVsLFxuICAgICAgICAgIHNsYXRlTWFya3VwOiBuZXdNYXJrdXAsXG4gICAgICAgICAgY2hvaWNlczogbmV3Q2hvaWNlcyxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ1JlbW92aW5nIGNob2ljZXMgKGtlZXBpbmcgYXQgbGVhc3QgMik6IHNsYXRlTWFya3VwIGFuZCBjaG9pY2VzIGFyZSB1cGRhdGVkJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBvbGRNb2RlbCA9IHcuaW5zdGFuY2UoKS5wcm9wcy5tb2RlbDtcbiAgICAgICAgY29uc3QgbmV3Q2hvaWNlcyA9IHtcbiAgICAgICAgICAuLi5tb2RlbC5jaG9pY2VzLFxuICAgICAgICAgIDA6IG1vZGVsLmNob2ljZXNbJzAnXS5zbGljZSgwLCAyKSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbmV3TWFya3VwID0gYDxkaXY+PHA+VGhlIDxzcGFuIGRhdGEtdHlwZT1cImlubGluZV9kcm9wZG93blwiIGRhdGEtaW5kZXg9XCIwXCIgZGF0YS12YWx1ZT1cImNvdyBcIj48L3NwYW4+IGp1bXBlZCA8c3BhbiBkYXRhLXR5cGU9XCJpbmxpbmVfZHJvcGRvd25cIiBkYXRhLWluZGV4PVwiMVwiIGRhdGEtdmFsdWU9XCJvdmVyIFwiPjwvc3Bhbj4gdGhlIDxzcGFuIGRhdGEtdHlwZT1cImlubGluZV9kcm9wZG93blwiIGRhdGEtaW5kZXg9XCIyXCIgZGF0YS12YWx1ZT1cIm1vb24gXCI+PC9zcGFuPi48L3A+PC9kaXY+YDtcblxuICAgICAgICB3Lmluc3RhbmNlKCkuc2V0U3RhdGUoeyByZXNwQXJlYUNob2ljZXM6IG5ld0Nob2ljZXMgfSk7XG4gICAgICAgIHcuaW5zdGFuY2UoKS5vbkNoYW5nZShuZXdNYXJrdXApO1xuXG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkudG9CZUNhbGxlZFdpdGgoe1xuICAgICAgICAgIC4uLm9sZE1vZGVsLFxuICAgICAgICAgIHNsYXRlTWFya3VwOiBuZXdNYXJrdXAsXG4gICAgICAgICAgY2hvaWNlczogbmV3Q2hvaWNlcyxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdvbkNob2ljZVJhdGlvbmFsZUNoYW5nZWQnLCAoKSA9PiB7XG4gICAgICBpdCgnY2hhbmdlcyB0aGUgY2hvaWNlIGxldmVsIHJhdGlvbmFsZSB2YWx1ZScsICgpID0+IHtcbiAgICAgICAgdy5pbnN0YW5jZSgpLm9uQ2hvaWNlUmF0aW9uYWxlQ2hhbmdlZCgwLCB7XG4gICAgICAgICAgbGFiZWw6ICdjb3cnLFxuICAgICAgICAgIHZhbHVlOiAnMCcsXG4gICAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgICAgICByYXRpb25hbGU6ICduZXcgcmF0aW9uYWxlIGZvciBjb3cnLFxuICAgICAgICB9KTtcblxuICAgICAgICBleHBlY3Qob25Nb2RlbENoYW5nZWQpLnRvQmVDYWxsZWRXaXRoKHtcbiAgICAgICAgICAuLi5wcmVwYXJlTW9kZWwobW9kZWwpLFxuICAgICAgICAgIGNob2ljZXM6IHtcbiAgICAgICAgICAgIDA6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnY293JyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJzAnLFxuICAgICAgICAgICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgICAgICAgICAgcmF0aW9uYWxlOiAnbmV3IHJhdGlvbmFsZSBmb3IgY293JyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnZG9nJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJzEnLFxuICAgICAgICAgICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdjYXQnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnMicsXG4gICAgICAgICAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgMTogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdvdmVyJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJzAnLFxuICAgICAgICAgICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgICAgICAgICAgcmF0aW9uYWxlOiAncmF0aW9uYWxlIGZvciBvdmVyJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAndW5kZXInLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnMScsXG4gICAgICAgICAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ2Fjcm9zcycsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICcyJyxcbiAgICAgICAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAyOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ21vb24nLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnMCcsXG4gICAgICAgICAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICByYXRpb25hbGU6ICdyYXRpb25hbGUgZm9yIG1vb24nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdzdW4nLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnMicsXG4gICAgICAgICAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ2hvdXNlJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJzMnLFxuICAgICAgICAgICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ29uQWRkQ2hvaWNlJywgKCkgPT4ge1xuICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgIHcuaW5zdGFuY2UoKS5zZXRTdGF0ZSh7IHJlc3BBcmVhQ2hvaWNlczogbW9kZWwuY2hvaWNlcyB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnRG9lcyBub3QgYWRkIGR1cGxpY2F0ZXMnLCAoKSA9PiB7XG4gICAgICAgIHcuaW5zdGFuY2UoKS5vbkFkZENob2ljZSgnMCcsICdjb3cnKTtcblxuICAgICAgICBleHBlY3Qob25Nb2RlbENoYW5nZWQpLm5vdC50b0JlQ2FsbGVkKCk7XG5cbiAgICAgICAgdy5pbnN0YW5jZSgpLm9uQWRkQ2hvaWNlKCcxJywgJ292ZXInKTtcblxuICAgICAgICBleHBlY3Qob25Nb2RlbENoYW5nZWQpLm5vdC50b0JlQ2FsbGVkKCk7XG5cbiAgICAgICAgdy5pbnN0YW5jZSgpLm9uQWRkQ2hvaWNlKCcxJywgJ3VuZGVyJyk7XG5cbiAgICAgICAgZXhwZWN0KG9uTW9kZWxDaGFuZ2VkKS5ub3QudG9CZUNhbGxlZCgpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdBZGRzIGEgbmV3IGNob2ljZScsICgpID0+IHtcbiAgICAgICAgY29uc3QgY3VycmVudE1vZGVsID0gY2xvbmVEZWVwKHcuaW5zdGFuY2UoKS5wcm9wcy5tb2RlbCk7XG5cbiAgICAgICAgdy5pbnN0YW5jZSgpLm9uQWRkQ2hvaWNlKCcwJywgJ2JpcmQnKTtcblxuICAgICAgICBleHBlY3Qob25Nb2RlbENoYW5nZWQpLnRvQmVDYWxsZWRXaXRoKHtcbiAgICAgICAgICAuLi5jdXJyZW50TW9kZWwsXG4gICAgICAgICAgY2hvaWNlczoge1xuICAgICAgICAgICAgLi4uY3VycmVudE1vZGVsLmNob2ljZXMsXG4gICAgICAgICAgICAwOiBbLi4uY3VycmVudE1vZGVsLmNob2ljZXNbJzAnXSwgeyBsYWJlbDogJ2JpcmQnLCB2YWx1ZTogJzMnLCBjb3JyZWN0OiBmYWxzZSB9XSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICB3Lmluc3RhbmNlKCkub25BZGRDaG9pY2UoJzInLCAnc3RhcicpO1xuICAgICAgICBleHBlY3Qob25Nb2RlbENoYW5nZWQpLnRvQmVDYWxsZWRXaXRoKHtcbiAgICAgICAgICAuLi5jdXJyZW50TW9kZWwsXG4gICAgICAgICAgY2hvaWNlczoge1xuICAgICAgICAgICAgLi4uY3VycmVudE1vZGVsLmNob2ljZXMsXG4gICAgICAgICAgICAwOiBbLi4uY3VycmVudE1vZGVsLmNob2ljZXNbJzAnXSwgeyBsYWJlbDogJ2JpcmQnLCB2YWx1ZTogJzMnLCBjb3JyZWN0OiBmYWxzZSB9XSxcbiAgICAgICAgICAgIDI6IFsuLi5jdXJyZW50TW9kZWwuY2hvaWNlc1snMiddLCB7IGxhYmVsOiAnc3RhcicsIHZhbHVlOiAnNCcsIGNvcnJlY3Q6IGZhbHNlIH1dLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnb25SZW1vdmVDaG9pY2UnLCAoKSA9PiB7XG4gICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgdy5pbnN0YW5jZSgpLnNldFN0YXRlKHtcbiAgICAgICAgICByZXNwQXJlYUNob2ljZXM6IHtcbiAgICAgICAgICAgIDA6IFtcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ2NvdycsIHZhbHVlOiAnMCcsIGNvcnJlY3Q6IHRydWUgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ2RvZycsIHZhbHVlOiAnMScsIGNvcnJlY3Q6IGZhbHNlIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdjYXQnLCB2YWx1ZTogJzInLCBjb3JyZWN0OiBmYWxzZSB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnUmVtb3ZlcyBjaG9pY2VzJywgKCkgPT4ge1xuICAgICAgICB3Lmluc3RhbmNlKCkub25SZW1vdmVDaG9pY2UoMCwgJzAnKTtcblxuICAgICAgICBleHBlY3Qob25Nb2RlbENoYW5nZWQpLnRvQmVDYWxsZWRXaXRoKFxuICAgICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgIGNob2ljZXM6IHtcbiAgICAgICAgICAgICAgMDogW1xuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdkb2cnLCB2YWx1ZTogJzEnLCBjb3JyZWN0OiBmYWxzZSB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdjYXQnLCB2YWx1ZTogJzInLCBjb3JyZWN0OiBmYWxzZSB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcblxuICAgICAgICB3Lmluc3RhbmNlKCkub25SZW1vdmVDaG9pY2UoMCwgJzAnKTtcblxuICAgICAgICBleHBlY3Qob25Nb2RlbENoYW5nZWQpLnRvQmVDYWxsZWRXaXRoKFxuICAgICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgIGNob2ljZXM6IHtcbiAgICAgICAgICAgICAgMDogW3sgbGFiZWw6ICdjYXQnLCB2YWx1ZTogJzInLCBjb3JyZWN0OiBmYWxzZSB9XSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgdy5pbnN0YW5jZSgpLm9uUmVtb3ZlQ2hvaWNlKDAsICcwJyk7XG5cbiAgICAgICAgZXhwZWN0KG9uTW9kZWxDaGFuZ2VkKS50b0JlQ2FsbGVkV2l0aChcbiAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICBjaG9pY2VzOiB7XG4gICAgICAgICAgICAgIDA6IFtdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ29uU2VsZWN0Q2hvaWNlJywgKCkgPT4ge1xuICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgIHcuaW5zdGFuY2UoKS5zZXRTdGF0ZSh7XG4gICAgICAgICAgcmVzcEFyZWFDaG9pY2VzOiB7XG4gICAgICAgICAgICAwOiBbXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdjb3cnLCB2YWx1ZTogJzAnLCBjb3JyZWN0OiB0cnVlIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdkb2cnLCB2YWx1ZTogJzEnLCBjb3JyZWN0OiBmYWxzZSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnY2F0JywgdmFsdWU6ICcyJywgY29ycmVjdDogZmFsc2UgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ1VwZGF0ZXMgY29ycmVjdCBjaG9pY2UnLCAoKSA9PiB7XG4gICAgICAgIHcuaW5zdGFuY2UoKS5vblNlbGVjdENob2ljZSgwLCAxKTtcblxuICAgICAgICBleHBlY3Qob25Nb2RlbENoYW5nZWQpLnRvQmVDYWxsZWRXaXRoKFxuICAgICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgIGNob2ljZXM6IHtcbiAgICAgICAgICAgICAgMDogW1xuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdjb3cnLCB2YWx1ZTogJzAnLCBjb3JyZWN0OiBmYWxzZSB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdkb2cnLCB2YWx1ZTogJzEnLCBjb3JyZWN0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ2NhdCcsIHZhbHVlOiAnMicsIGNvcnJlY3Q6IGZhbHNlIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuXG4gICAgICAgIHcuaW5zdGFuY2UoKS5vblNlbGVjdENob2ljZSgwLCAwKTtcblxuICAgICAgICBleHBlY3Qob25Nb2RlbENoYW5nZWQpLnRvQmVDYWxsZWRXaXRoKFxuICAgICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgIGNob2ljZXM6IHtcbiAgICAgICAgICAgICAgMDogW1xuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdjb3cnLCB2YWx1ZTogJzAnLCBjb3JyZWN0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ2RvZycsIHZhbHVlOiAnMScsIGNvcnJlY3Q6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ2NhdCcsIHZhbHVlOiAnMicsIGNvcnJlY3Q6IGZhbHNlIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=