@pie-element/inline-dropdown 10.1.7 → 10.2.0-beta.0
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 +8 -37
- package/configure/CHANGELOG.md +8 -37
- package/configure/lib/__tests__/inline-dropdown-toolbar.test.js +1654 -0
- package/configure/lib/__tests__/main.test.js +598 -0
- package/configure/lib/__tests__/markupUtils.test.js +107 -0
- package/configure/package.json +3 -3
- package/controller/CHANGELOG.md +1 -5
- package/controller/lib/__tests__/index.test.js +705 -0
- package/controller/package.json +1 -1
- package/docs/demo/pie.manifest.json +11 -0
- package/package.json +3 -3
|
@@ -0,0 +1,598 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _react = require("@testing-library/react");
|
|
5
|
+
var _react2 = _interopRequireDefault(require("react"));
|
|
6
|
+
var _editableHtmlTipTap = require("@pie-lib/editable-html-tip-tap");
|
|
7
|
+
var _main = require("../main");
|
|
8
|
+
var _lodashEs = require("lodash-es");
|
|
9
|
+
var _defaults = _interopRequireDefault(require("../defaults"));
|
|
10
|
+
var _markupUtils = require("../markupUtils");
|
|
11
|
+
jest.mock('@pie-lib/editable-html-tip-tap', () => {
|
|
12
|
+
const actual = jest.requireActual('@pie-lib/editable-html-tip-tap');
|
|
13
|
+
return {
|
|
14
|
+
...actual,
|
|
15
|
+
deleteInlineDropdownByIndex: jest.fn()
|
|
16
|
+
};
|
|
17
|
+
});
|
|
18
|
+
jest.mock('@pie-lib/config-ui', () => ({
|
|
19
|
+
choiceUtils: {
|
|
20
|
+
firstAvailableIndex: jest.fn()
|
|
21
|
+
},
|
|
22
|
+
settings: {
|
|
23
|
+
Panel: props => /*#__PURE__*/_react2.default.createElement("div", props),
|
|
24
|
+
toggle: jest.fn(),
|
|
25
|
+
radio: jest.fn(),
|
|
26
|
+
dropdown: jest.fn()
|
|
27
|
+
},
|
|
28
|
+
layout: {
|
|
29
|
+
ConfigLayout: props => /*#__PURE__*/_react2.default.createElement("div", null, props.children)
|
|
30
|
+
},
|
|
31
|
+
InputContainer: props => /*#__PURE__*/_react2.default.createElement("div", null, props.children),
|
|
32
|
+
AlertDialog: props => /*#__PURE__*/_react2.default.createElement("div", null, props.children)
|
|
33
|
+
}));
|
|
34
|
+
const model = {
|
|
35
|
+
prompt: 'Use the dropdowns to complete the sentence',
|
|
36
|
+
shuffle: true,
|
|
37
|
+
markup: '<div><p>The {{0}} jumped {{1}} the {{2}}</p></div>',
|
|
38
|
+
choices: {
|
|
39
|
+
0: [{
|
|
40
|
+
label: 'cow',
|
|
41
|
+
value: '0',
|
|
42
|
+
correct: true,
|
|
43
|
+
rationale: 'rationale for cow'
|
|
44
|
+
}, {
|
|
45
|
+
label: 'dog',
|
|
46
|
+
value: '1',
|
|
47
|
+
correct: false
|
|
48
|
+
}, {
|
|
49
|
+
label: 'cat',
|
|
50
|
+
value: '2',
|
|
51
|
+
correct: false
|
|
52
|
+
}],
|
|
53
|
+
1: [{
|
|
54
|
+
label: 'over',
|
|
55
|
+
value: '0',
|
|
56
|
+
correct: true,
|
|
57
|
+
rationale: 'rationale for over'
|
|
58
|
+
}, {
|
|
59
|
+
label: 'under',
|
|
60
|
+
value: '1',
|
|
61
|
+
correct: false
|
|
62
|
+
}, {
|
|
63
|
+
label: 'across',
|
|
64
|
+
value: '2',
|
|
65
|
+
correct: false
|
|
66
|
+
}],
|
|
67
|
+
2: [{
|
|
68
|
+
label: 'moon',
|
|
69
|
+
value: '0',
|
|
70
|
+
correct: true,
|
|
71
|
+
rationale: 'rationale for moon'
|
|
72
|
+
}, {
|
|
73
|
+
label: 'sun',
|
|
74
|
+
value: '2',
|
|
75
|
+
correct: false
|
|
76
|
+
}, {
|
|
77
|
+
label: 'house',
|
|
78
|
+
value: '3',
|
|
79
|
+
correct: false
|
|
80
|
+
}]
|
|
81
|
+
},
|
|
82
|
+
alternateResponse: {
|
|
83
|
+
2: ['2']
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
const prepareModel = (model = {}) => {
|
|
87
|
+
const currModal = {
|
|
88
|
+
..._defaults.default.model,
|
|
89
|
+
...model
|
|
90
|
+
};
|
|
91
|
+
const slateMarkup = model.slateMarkup || (0, _markupUtils.createSlateMarkup)(currModal.markup, currModal.choices);
|
|
92
|
+
const markup = (0, _markupUtils.processMarkup)(slateMarkup);
|
|
93
|
+
return {
|
|
94
|
+
...currModal,
|
|
95
|
+
slateMarkup,
|
|
96
|
+
markup
|
|
97
|
+
/*...processedMarkup,*/
|
|
98
|
+
};
|
|
99
|
+
};
|
|
100
|
+
describe('Main', () => {
|
|
101
|
+
let onModelChanged;
|
|
102
|
+
let onConfigurationChanged;
|
|
103
|
+
const wrapper = extras => {
|
|
104
|
+
onModelChanged = jest.fn();
|
|
105
|
+
onConfigurationChanged = jest.fn();
|
|
106
|
+
const defaults = {
|
|
107
|
+
onModelChanged,
|
|
108
|
+
onConfigurationChanged,
|
|
109
|
+
classes: {},
|
|
110
|
+
model: prepareModel({
|
|
111
|
+
...model,
|
|
112
|
+
...extras
|
|
113
|
+
}),
|
|
114
|
+
configuration: _defaults.default.configuration
|
|
115
|
+
};
|
|
116
|
+
const props = {
|
|
117
|
+
...defaults
|
|
118
|
+
};
|
|
119
|
+
return (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_main.Main, props));
|
|
120
|
+
};
|
|
121
|
+
const createInstance = extras => {
|
|
122
|
+
onModelChanged = jest.fn();
|
|
123
|
+
onConfigurationChanged = jest.fn();
|
|
124
|
+
const defaults = {
|
|
125
|
+
onModelChanged,
|
|
126
|
+
onConfigurationChanged,
|
|
127
|
+
classes: {},
|
|
128
|
+
model: prepareModel({
|
|
129
|
+
...model,
|
|
130
|
+
...extras
|
|
131
|
+
}),
|
|
132
|
+
configuration: _defaults.default.configuration
|
|
133
|
+
};
|
|
134
|
+
const instance = new _main.Main(defaults);
|
|
135
|
+
|
|
136
|
+
// Mock setState to execute updates immediately for testing
|
|
137
|
+
instance.setState = jest.fn((state, callback) => {
|
|
138
|
+
Object.assign(instance.state, typeof state === 'function' ? state(instance.state) : state);
|
|
139
|
+
if (callback) {
|
|
140
|
+
callback();
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
return instance;
|
|
144
|
+
};
|
|
145
|
+
describe('logic', () => {
|
|
146
|
+
let w;
|
|
147
|
+
beforeEach(() => {
|
|
148
|
+
w = createInstance();
|
|
149
|
+
});
|
|
150
|
+
describe('onModelChange', () => {
|
|
151
|
+
it('changes the model', () => {
|
|
152
|
+
w.onModelChange({
|
|
153
|
+
promptEnabled: false
|
|
154
|
+
});
|
|
155
|
+
expect(onModelChanged).toBeCalledWith({
|
|
156
|
+
...prepareModel(model),
|
|
157
|
+
promptEnabled: false
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
describe('onPromptChanged', () => {
|
|
162
|
+
it('changes the prompt value', () => {
|
|
163
|
+
w.onPromptChanged('This is the new prompt');
|
|
164
|
+
expect(onModelChanged).toBeCalledWith({
|
|
165
|
+
...prepareModel(model),
|
|
166
|
+
prompt: 'This is the new prompt'
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
describe('onRationaleChanged', () => {
|
|
171
|
+
it('changes the rationale value', () => {
|
|
172
|
+
w.onRationaleChanged('New Rationale');
|
|
173
|
+
expect(onModelChanged).toBeCalledWith({
|
|
174
|
+
...prepareModel(model),
|
|
175
|
+
rationale: 'New Rationale'
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
describe('onTeacherInstructionsChanged', () => {
|
|
180
|
+
it('changes the teacher instructions value', () => {
|
|
181
|
+
w.onTeacherInstructionsChanged('New Teacher Instructions');
|
|
182
|
+
expect(onModelChanged).toBeCalledWith({
|
|
183
|
+
...prepareModel(model),
|
|
184
|
+
teacherInstructions: 'New Teacher Instructions'
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
describe('onMarkupChanged', () => {
|
|
189
|
+
it('changes slate markup value', () => {
|
|
190
|
+
const slateMarkup = '<p>The <span data-type=\\"explicit_constructed_response\\" data-index=\\"0\\" data-value=\\"cow\\"></span> jumped</p>';
|
|
191
|
+
w.onMarkupChanged(slateMarkup);
|
|
192
|
+
expect(onModelChanged).toBeCalledWith({
|
|
193
|
+
...prepareModel(model),
|
|
194
|
+
slateMarkup
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
describe('onChange', () => {
|
|
199
|
+
it('Removing choices (keeping only 1 choice): syncs markup and choices without discarding', () => {
|
|
200
|
+
const oldModel = w.props.model;
|
|
201
|
+
const newChoices = {
|
|
202
|
+
...model.choices,
|
|
203
|
+
0: model.choices['0'].slice(0, 1)
|
|
204
|
+
};
|
|
205
|
+
const 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>`;
|
|
206
|
+
w.setState({
|
|
207
|
+
respAreaChoices: newChoices
|
|
208
|
+
});
|
|
209
|
+
w.onChange(newMarkup);
|
|
210
|
+
expect(onModelChanged).toBeCalledWith({
|
|
211
|
+
...oldModel,
|
|
212
|
+
slateMarkup: newMarkup,
|
|
213
|
+
choices: newChoices
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
it('No correct choice selected: syncs markup and choices without discarding', () => {
|
|
217
|
+
const oldModel = w.props.model;
|
|
218
|
+
const newChoices = {
|
|
219
|
+
...model.choices,
|
|
220
|
+
0: [{
|
|
221
|
+
label: 'cow',
|
|
222
|
+
value: '0',
|
|
223
|
+
correct: false
|
|
224
|
+
}, {
|
|
225
|
+
label: 'dog',
|
|
226
|
+
value: '1',
|
|
227
|
+
correct: false
|
|
228
|
+
}, {
|
|
229
|
+
label: 'cat',
|
|
230
|
+
value: '2',
|
|
231
|
+
correct: false
|
|
232
|
+
}]
|
|
233
|
+
};
|
|
234
|
+
const 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>`;
|
|
235
|
+
w.setState({
|
|
236
|
+
respAreaChoices: newChoices
|
|
237
|
+
});
|
|
238
|
+
w.onChange(newMarkup);
|
|
239
|
+
expect(onModelChanged).toBeCalledWith({
|
|
240
|
+
...oldModel,
|
|
241
|
+
slateMarkup: newMarkup,
|
|
242
|
+
choices: newChoices
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
it('New choice: slateMarkup and choices are updated', () => {
|
|
246
|
+
const newChoices = {
|
|
247
|
+
...model.choices,
|
|
248
|
+
0: [...model.choices['0'], {
|
|
249
|
+
label: 'pet',
|
|
250
|
+
value: '3',
|
|
251
|
+
correct: false
|
|
252
|
+
}]
|
|
253
|
+
};
|
|
254
|
+
const 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>`;
|
|
255
|
+
w.setState({
|
|
256
|
+
respAreaChoices: newChoices
|
|
257
|
+
});
|
|
258
|
+
w.onChange(newMarkup);
|
|
259
|
+
expect(onModelChanged).toBeCalledWith({
|
|
260
|
+
...prepareModel(model),
|
|
261
|
+
slateMarkup: newMarkup,
|
|
262
|
+
choices: newChoices
|
|
263
|
+
});
|
|
264
|
+
});
|
|
265
|
+
it('New Response Area: slateMarkup and choices are updated', () => {
|
|
266
|
+
const oldModel = w.props.model;
|
|
267
|
+
const newChoices = {
|
|
268
|
+
...model.choices,
|
|
269
|
+
3: [{
|
|
270
|
+
label: 'A',
|
|
271
|
+
value: '0',
|
|
272
|
+
correct: true
|
|
273
|
+
}, {
|
|
274
|
+
label: 'B',
|
|
275
|
+
value: '1',
|
|
276
|
+
correct: false
|
|
277
|
+
}, {
|
|
278
|
+
label: 'C',
|
|
279
|
+
value: '2',
|
|
280
|
+
correct: false
|
|
281
|
+
}]
|
|
282
|
+
};
|
|
283
|
+
const 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>`;
|
|
284
|
+
w.setState({
|
|
285
|
+
respAreaChoices: newChoices
|
|
286
|
+
});
|
|
287
|
+
w.onChange(newMarkup);
|
|
288
|
+
expect(onModelChanged).toBeCalledWith({
|
|
289
|
+
...oldModel,
|
|
290
|
+
slateMarkup: newMarkup,
|
|
291
|
+
choices: newChoices
|
|
292
|
+
});
|
|
293
|
+
});
|
|
294
|
+
it('Removing choices (keeping at least 2): slateMarkup and choices are updated', () => {
|
|
295
|
+
const oldModel = w.props.model;
|
|
296
|
+
const newChoices = {
|
|
297
|
+
...model.choices,
|
|
298
|
+
0: model.choices['0'].slice(0, 2)
|
|
299
|
+
};
|
|
300
|
+
const 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>`;
|
|
301
|
+
w.setState({
|
|
302
|
+
respAreaChoices: newChoices
|
|
303
|
+
});
|
|
304
|
+
w.onChange(newMarkup);
|
|
305
|
+
expect(onModelChanged).toBeCalledWith({
|
|
306
|
+
...oldModel,
|
|
307
|
+
slateMarkup: newMarkup,
|
|
308
|
+
choices: newChoices
|
|
309
|
+
});
|
|
310
|
+
});
|
|
311
|
+
});
|
|
312
|
+
describe('validateResponseAreaClose', () => {
|
|
313
|
+
const node = {
|
|
314
|
+
attrs: {
|
|
315
|
+
index: 0
|
|
316
|
+
}
|
|
317
|
+
};
|
|
318
|
+
const closeToolbar = jest.fn();
|
|
319
|
+
const onCancel = jest.fn();
|
|
320
|
+
beforeEach(() => {
|
|
321
|
+
w.setState({
|
|
322
|
+
respAreaChoices: (0, _lodashEs.cloneDeep)(model.choices)
|
|
323
|
+
});
|
|
324
|
+
closeToolbar.mockClear();
|
|
325
|
+
onCancel.mockClear();
|
|
326
|
+
_editableHtmlTipTap.deleteInlineDropdownByIndex.mockClear();
|
|
327
|
+
});
|
|
328
|
+
it('closes toolbar when choices are valid', () => {
|
|
329
|
+
w.validateResponseAreaClose(node, 5, {}, closeToolbar, onCancel);
|
|
330
|
+
expect(closeToolbar).toHaveBeenCalled();
|
|
331
|
+
expect(w.state.warning.open).toBe(false);
|
|
332
|
+
expect(_editableHtmlTipTap.deleteInlineDropdownByIndex).not.toHaveBeenCalled();
|
|
333
|
+
});
|
|
334
|
+
it('shows warning when choices are invalid', () => {
|
|
335
|
+
w.setState({
|
|
336
|
+
respAreaChoices: {
|
|
337
|
+
0: [{
|
|
338
|
+
label: 'only',
|
|
339
|
+
value: '0',
|
|
340
|
+
correct: false
|
|
341
|
+
}]
|
|
342
|
+
}
|
|
343
|
+
});
|
|
344
|
+
w.validateResponseAreaClose(node, 5, {}, closeToolbar, onCancel);
|
|
345
|
+
expect(closeToolbar).not.toHaveBeenCalled();
|
|
346
|
+
expect(w.state.warning.open).toBe(true);
|
|
347
|
+
});
|
|
348
|
+
it('deletes response area and closes toolbar on confirm', () => {
|
|
349
|
+
const editor = {};
|
|
350
|
+
w.setState({
|
|
351
|
+
respAreaChoices: {
|
|
352
|
+
0: [{
|
|
353
|
+
label: 'only',
|
|
354
|
+
value: '0',
|
|
355
|
+
correct: false
|
|
356
|
+
}]
|
|
357
|
+
}
|
|
358
|
+
});
|
|
359
|
+
w.validateResponseAreaClose(node, 5, editor, closeToolbar, onCancel);
|
|
360
|
+
w.state.warning.onConfirm();
|
|
361
|
+
expect(_editableHtmlTipTap.deleteInlineDropdownByIndex).toHaveBeenCalledWith(editor, 0, 5);
|
|
362
|
+
expect(closeToolbar).toHaveBeenCalled();
|
|
363
|
+
});
|
|
364
|
+
it('calls pie-lib onCancel when dialog is dismissed', () => {
|
|
365
|
+
w.setState({
|
|
366
|
+
respAreaChoices: {
|
|
367
|
+
0: [{
|
|
368
|
+
label: 'only',
|
|
369
|
+
value: '0',
|
|
370
|
+
correct: false
|
|
371
|
+
}]
|
|
372
|
+
}
|
|
373
|
+
});
|
|
374
|
+
w.validateResponseAreaClose(node, 5, {}, closeToolbar, onCancel);
|
|
375
|
+
w.state.warning.onClose();
|
|
376
|
+
expect(onCancel).toHaveBeenCalled();
|
|
377
|
+
expect(_editableHtmlTipTap.deleteInlineDropdownByIndex).not.toHaveBeenCalled();
|
|
378
|
+
});
|
|
379
|
+
});
|
|
380
|
+
describe('onChoiceRationaleChanged', () => {
|
|
381
|
+
it('changes the choice level rationale value', () => {
|
|
382
|
+
w.onChoiceRationaleChanged(0, {
|
|
383
|
+
label: 'cow',
|
|
384
|
+
value: '0',
|
|
385
|
+
correct: true,
|
|
386
|
+
rationale: 'new rationale for cow'
|
|
387
|
+
});
|
|
388
|
+
expect(onModelChanged).toBeCalledWith({
|
|
389
|
+
...prepareModel(model),
|
|
390
|
+
choices: {
|
|
391
|
+
0: [{
|
|
392
|
+
label: 'cow',
|
|
393
|
+
value: '0',
|
|
394
|
+
correct: true,
|
|
395
|
+
rationale: 'new rationale for cow'
|
|
396
|
+
}, {
|
|
397
|
+
label: 'dog',
|
|
398
|
+
value: '1',
|
|
399
|
+
correct: false
|
|
400
|
+
}, {
|
|
401
|
+
label: 'cat',
|
|
402
|
+
value: '2',
|
|
403
|
+
correct: false
|
|
404
|
+
}],
|
|
405
|
+
1: [{
|
|
406
|
+
label: 'over',
|
|
407
|
+
value: '0',
|
|
408
|
+
correct: true,
|
|
409
|
+
rationale: 'rationale for over'
|
|
410
|
+
}, {
|
|
411
|
+
label: 'under',
|
|
412
|
+
value: '1',
|
|
413
|
+
correct: false
|
|
414
|
+
}, {
|
|
415
|
+
label: 'across',
|
|
416
|
+
value: '2',
|
|
417
|
+
correct: false
|
|
418
|
+
}],
|
|
419
|
+
2: [{
|
|
420
|
+
label: 'moon',
|
|
421
|
+
value: '0',
|
|
422
|
+
correct: true,
|
|
423
|
+
rationale: 'rationale for moon'
|
|
424
|
+
}, {
|
|
425
|
+
label: 'sun',
|
|
426
|
+
value: '2',
|
|
427
|
+
correct: false
|
|
428
|
+
}, {
|
|
429
|
+
label: 'house',
|
|
430
|
+
value: '3',
|
|
431
|
+
correct: false
|
|
432
|
+
}]
|
|
433
|
+
}
|
|
434
|
+
});
|
|
435
|
+
});
|
|
436
|
+
});
|
|
437
|
+
describe('onAddChoice', () => {
|
|
438
|
+
beforeEach(() => {
|
|
439
|
+
w.setState({
|
|
440
|
+
respAreaChoices: model.choices
|
|
441
|
+
});
|
|
442
|
+
});
|
|
443
|
+
it('Does not add duplicates', () => {
|
|
444
|
+
w.onAddChoice('0', 'cow');
|
|
445
|
+
expect(onModelChanged).not.toBeCalled();
|
|
446
|
+
w.onAddChoice('1', 'over');
|
|
447
|
+
expect(onModelChanged).not.toBeCalled();
|
|
448
|
+
w.onAddChoice('1', 'under');
|
|
449
|
+
expect(onModelChanged).not.toBeCalled();
|
|
450
|
+
});
|
|
451
|
+
it('Adds a new choice', () => {
|
|
452
|
+
const currentModel = (0, _lodashEs.cloneDeep)(w.props.model);
|
|
453
|
+
w.onAddChoice('0', 'bird');
|
|
454
|
+
expect(onModelChanged).toBeCalledWith({
|
|
455
|
+
...currentModel,
|
|
456
|
+
choices: {
|
|
457
|
+
...currentModel.choices,
|
|
458
|
+
0: [...currentModel.choices['0'], {
|
|
459
|
+
label: 'bird',
|
|
460
|
+
value: '3',
|
|
461
|
+
correct: false
|
|
462
|
+
}]
|
|
463
|
+
}
|
|
464
|
+
});
|
|
465
|
+
w.onAddChoice('2', 'star');
|
|
466
|
+
expect(onModelChanged).toBeCalledWith({
|
|
467
|
+
...currentModel,
|
|
468
|
+
choices: {
|
|
469
|
+
...currentModel.choices,
|
|
470
|
+
0: [...currentModel.choices['0'], {
|
|
471
|
+
label: 'bird',
|
|
472
|
+
value: '3',
|
|
473
|
+
correct: false
|
|
474
|
+
}],
|
|
475
|
+
2: [...currentModel.choices['2'], {
|
|
476
|
+
label: 'star',
|
|
477
|
+
value: '4',
|
|
478
|
+
correct: false
|
|
479
|
+
}]
|
|
480
|
+
}
|
|
481
|
+
});
|
|
482
|
+
});
|
|
483
|
+
});
|
|
484
|
+
describe('onRemoveChoice', () => {
|
|
485
|
+
beforeEach(() => {
|
|
486
|
+
w.setState({
|
|
487
|
+
respAreaChoices: {
|
|
488
|
+
0: [{
|
|
489
|
+
label: 'cow',
|
|
490
|
+
value: '0',
|
|
491
|
+
correct: true
|
|
492
|
+
}, {
|
|
493
|
+
label: 'dog',
|
|
494
|
+
value: '1',
|
|
495
|
+
correct: false
|
|
496
|
+
}, {
|
|
497
|
+
label: 'cat',
|
|
498
|
+
value: '2',
|
|
499
|
+
correct: false
|
|
500
|
+
}]
|
|
501
|
+
}
|
|
502
|
+
});
|
|
503
|
+
});
|
|
504
|
+
it('Removes choices', () => {
|
|
505
|
+
w.onRemoveChoice(0, '0');
|
|
506
|
+
expect(onModelChanged).toBeCalledWith(expect.objectContaining({
|
|
507
|
+
choices: {
|
|
508
|
+
0: [{
|
|
509
|
+
label: 'dog',
|
|
510
|
+
value: '1',
|
|
511
|
+
correct: false
|
|
512
|
+
}, {
|
|
513
|
+
label: 'cat',
|
|
514
|
+
value: '2',
|
|
515
|
+
correct: false
|
|
516
|
+
}]
|
|
517
|
+
}
|
|
518
|
+
}));
|
|
519
|
+
w.onRemoveChoice(0, '0');
|
|
520
|
+
expect(onModelChanged).toBeCalledWith(expect.objectContaining({
|
|
521
|
+
choices: {
|
|
522
|
+
0: [{
|
|
523
|
+
label: 'cat',
|
|
524
|
+
value: '2',
|
|
525
|
+
correct: false
|
|
526
|
+
}]
|
|
527
|
+
}
|
|
528
|
+
}));
|
|
529
|
+
w.onRemoveChoice(0, '0');
|
|
530
|
+
expect(onModelChanged).toBeCalledWith(expect.objectContaining({
|
|
531
|
+
choices: {
|
|
532
|
+
0: []
|
|
533
|
+
}
|
|
534
|
+
}));
|
|
535
|
+
});
|
|
536
|
+
});
|
|
537
|
+
describe('onSelectChoice', () => {
|
|
538
|
+
beforeEach(() => {
|
|
539
|
+
w.setState({
|
|
540
|
+
respAreaChoices: {
|
|
541
|
+
0: [{
|
|
542
|
+
label: 'cow',
|
|
543
|
+
value: '0',
|
|
544
|
+
correct: true
|
|
545
|
+
}, {
|
|
546
|
+
label: 'dog',
|
|
547
|
+
value: '1',
|
|
548
|
+
correct: false
|
|
549
|
+
}, {
|
|
550
|
+
label: 'cat',
|
|
551
|
+
value: '2',
|
|
552
|
+
correct: false
|
|
553
|
+
}]
|
|
554
|
+
}
|
|
555
|
+
});
|
|
556
|
+
});
|
|
557
|
+
it('Updates correct choice', () => {
|
|
558
|
+
w.onSelectChoice(0, 1);
|
|
559
|
+
expect(onModelChanged).toBeCalledWith(expect.objectContaining({
|
|
560
|
+
choices: {
|
|
561
|
+
0: [{
|
|
562
|
+
label: 'cow',
|
|
563
|
+
value: '0',
|
|
564
|
+
correct: false
|
|
565
|
+
}, {
|
|
566
|
+
label: 'dog',
|
|
567
|
+
value: '1',
|
|
568
|
+
correct: true
|
|
569
|
+
}, {
|
|
570
|
+
label: 'cat',
|
|
571
|
+
value: '2',
|
|
572
|
+
correct: false
|
|
573
|
+
}]
|
|
574
|
+
}
|
|
575
|
+
}));
|
|
576
|
+
w.onSelectChoice(0, 0);
|
|
577
|
+
expect(onModelChanged).toBeCalledWith(expect.objectContaining({
|
|
578
|
+
choices: {
|
|
579
|
+
0: [{
|
|
580
|
+
label: 'cow',
|
|
581
|
+
value: '0',
|
|
582
|
+
correct: true
|
|
583
|
+
}, {
|
|
584
|
+
label: 'dog',
|
|
585
|
+
value: '1',
|
|
586
|
+
correct: false
|
|
587
|
+
}, {
|
|
588
|
+
label: 'cat',
|
|
589
|
+
value: '2',
|
|
590
|
+
correct: false
|
|
591
|
+
}]
|
|
592
|
+
}
|
|
593
|
+
}));
|
|
594
|
+
});
|
|
595
|
+
});
|
|
596
|
+
});
|
|
597
|
+
});
|
|
598
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJyZXF1aXJlIiwiX3JlYWN0MiIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfZWRpdGFibGVIdG1sVGlwVGFwIiwiX21haW4iLCJfbG9kYXNoRXMiLCJfZGVmYXVsdHMiLCJfbWFya3VwVXRpbHMiLCJqZXN0IiwibW9jayIsImFjdHVhbCIsInJlcXVpcmVBY3R1YWwiLCJkZWxldGVJbmxpbmVEcm9wZG93bkJ5SW5kZXgiLCJmbiIsImNob2ljZVV0aWxzIiwiZmlyc3RBdmFpbGFibGVJbmRleCIsInNldHRpbmdzIiwiUGFuZWwiLCJwcm9wcyIsImRlZmF1bHQiLCJjcmVhdGVFbGVtZW50IiwidG9nZ2xlIiwicmFkaW8iLCJkcm9wZG93biIsImxheW91dCIsIkNvbmZpZ0xheW91dCIsImNoaWxkcmVuIiwiSW5wdXRDb250YWluZXIiLCJBbGVydERpYWxvZyIsIm1vZGVsIiwicHJvbXB0Iiwic2h1ZmZsZSIsIm1hcmt1cCIsImNob2ljZXMiLCJsYWJlbCIsInZhbHVlIiwiY29ycmVjdCIsInJhdGlvbmFsZSIsImFsdGVybmF0ZVJlc3BvbnNlIiwicHJlcGFyZU1vZGVsIiwiY3Vyck1vZGFsIiwic2Vuc2libGVEZWZhdWx0cyIsInNsYXRlTWFya3VwIiwiY3JlYXRlU2xhdGVNYXJrdXAiLCJwcm9jZXNzTWFya3VwIiwiZGVzY3JpYmUiLCJvbk1vZGVsQ2hhbmdlZCIsIm9uQ29uZmlndXJhdGlvbkNoYW5nZWQiLCJ3cmFwcGVyIiwiZXh0cmFzIiwiZGVmYXVsdHMiLCJjbGFzc2VzIiwiY29uZmlndXJhdGlvbiIsInJlbmRlciIsIk1haW4iLCJjcmVhdGVJbnN0YW5jZSIsImluc3RhbmNlIiwic2V0U3RhdGUiLCJzdGF0ZSIsImNhbGxiYWNrIiwiT2JqZWN0IiwiYXNzaWduIiwidyIsImJlZm9yZUVhY2giLCJpdCIsIm9uTW9kZWxDaGFuZ2UiLCJwcm9tcHRFbmFibGVkIiwiZXhwZWN0IiwidG9CZUNhbGxlZFdpdGgiLCJvblByb21wdENoYW5nZWQiLCJvblJhdGlvbmFsZUNoYW5nZWQiLCJvblRlYWNoZXJJbnN0cnVjdGlvbnNDaGFuZ2VkIiwidGVhY2hlckluc3RydWN0aW9ucyIsIm9uTWFya3VwQ2hhbmdlZCIsIm9sZE1vZGVsIiwibmV3Q2hvaWNlcyIsInNsaWNlIiwibmV3TWFya3VwIiwicmVzcEFyZWFDaG9pY2VzIiwib25DaGFuZ2UiLCJub2RlIiwiYXR0cnMiLCJpbmRleCIsImNsb3NlVG9vbGJhciIsIm9uQ2FuY2VsIiwiY2xvbmVEZWVwIiwibW9ja0NsZWFyIiwidmFsaWRhdGVSZXNwb25zZUFyZWFDbG9zZSIsInRvSGF2ZUJlZW5DYWxsZWQiLCJ3YXJuaW5nIiwib3BlbiIsInRvQmUiLCJub3QiLCJlZGl0b3IiLCJvbkNvbmZpcm0iLCJ0b0hhdmVCZWVuQ2FsbGVkV2l0aCIsIm9uQ2xvc2UiLCJvbkNob2ljZVJhdGlvbmFsZUNoYW5nZWQiLCJvbkFkZENob2ljZSIsInRvQmVDYWxsZWQiLCJjdXJyZW50TW9kZWwiLCJvblJlbW92ZUNob2ljZSIsIm9iamVjdENvbnRhaW5pbmciLCJvblNlbGVjdENob2ljZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vbWFpbi50ZXN0LmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZW5kZXIgfSBmcm9tICdAdGVzdGluZy1saWJyYXJ5L3JlYWN0JztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBkZWxldGVJbmxpbmVEcm9wZG93bkJ5SW5kZXggfSBmcm9tICdAcGllLWxpYi9lZGl0YWJsZS1odG1sLXRpcC10YXAnO1xuXG5pbXBvcnQgeyBNYWluIH0gZnJvbSAnLi4vbWFpbic7XG5pbXBvcnQgeyBjbG9uZURlZXAgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHNlbnNpYmxlRGVmYXVsdHMgZnJvbSAnLi4vZGVmYXVsdHMnO1xuaW1wb3J0IHsgY3JlYXRlU2xhdGVNYXJrdXAsIHByb2Nlc3NNYXJrdXAgfSBmcm9tICcuLi9tYXJrdXBVdGlscyc7XG5cbmplc3QubW9jaygnQHBpZS1saWIvZWRpdGFibGUtaHRtbC10aXAtdGFwJywgKCkgPT4ge1xuICBjb25zdCBhY3R1YWwgPSBqZXN0LnJlcXVpcmVBY3R1YWwoJ0BwaWUtbGliL2VkaXRhYmxlLWh0bWwtdGlwLXRhcCcpO1xuXG4gIHJldHVybiB7XG4gICAgLi4uYWN0dWFsLFxuICAgIGRlbGV0ZUlubGluZURyb3Bkb3duQnlJbmRleDogamVzdC5mbigpLFxuICB9O1xufSk7XG5cbmplc3QubW9jaygnQHBpZS1saWIvY29uZmlnLXVpJywgKCkgPT4gKHtcbiAgY2hvaWNlVXRpbHM6IHtcbiAgICBmaXJzdEF2YWlsYWJsZUluZGV4OiBqZXN0LmZuKCksXG4gIH0sXG4gIHNldHRpbmdzOiB7XG4gICAgUGFuZWw6IChwcm9wcykgPT4gPGRpdiB7Li4ucHJvcHN9IC8+LFxuICAgIHRvZ2dsZTogamVzdC5mbigpLFxuICAgIHJhZGlvOiBqZXN0LmZuKCksXG4gICAgZHJvcGRvd246IGplc3QuZm4oKSxcbiAgfSxcbiAgbGF5b3V0OiB7XG4gICAgQ29uZmlnTGF5b3V0OiAocHJvcHMpID0+IDxkaXY+e3Byb3BzLmNoaWxkcmVufTwvZGl2PixcbiAgfSxcbiAgSW5wdXRDb250YWluZXI6IChwcm9wcykgPT4gPGRpdj57cHJvcHMuY2hpbGRyZW59PC9kaXY+LFxuICBBbGVydERpYWxvZzogKHByb3BzKSA9PiA8ZGl2Pntwcm9wcy5jaGlsZHJlbn08L2Rpdj4sXG59KSk7XG5cbmNvbnN0IG1vZGVsID0ge1xuICBwcm9tcHQ6ICdVc2UgdGhlIGRyb3Bkb3ducyB0byBjb21wbGV0ZSB0aGUgc2VudGVuY2UnLFxuICBzaHVmZmxlOiB0cnVlLFxuICBtYXJrdXA6ICc8ZGl2PjxwPlRoZSB7ezB9fSBqdW1wZWQge3sxfX0gdGhlIHt7Mn19PC9wPjwvZGl2PicsXG4gIGNob2ljZXM6IHtcbiAgICAwOiBbXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnY293JyxcbiAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgICAgcmF0aW9uYWxlOiAncmF0aW9uYWxlIGZvciBjb3cnLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICdkb2cnLFxuICAgICAgICB2YWx1ZTogJzEnLFxuICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnY2F0JyxcbiAgICAgICAgdmFsdWU6ICcyJyxcbiAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICB9LFxuICAgIF0sXG4gICAgMTogW1xuICAgICAge1xuICAgICAgICBsYWJlbDogJ292ZXInLFxuICAgICAgICB2YWx1ZTogJzAnLFxuICAgICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgICByYXRpb25hbGU6ICdyYXRpb25hbGUgZm9yIG92ZXInLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICd1bmRlcicsXG4gICAgICAgIHZhbHVlOiAnMScsXG4gICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICdhY3Jvc3MnLFxuICAgICAgICB2YWx1ZTogJzInLFxuICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgIH0sXG4gICAgXSxcbiAgICAyOiBbXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnbW9vbicsXG4gICAgICAgIHZhbHVlOiAnMCcsXG4gICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgIHJhdGlvbmFsZTogJ3JhdGlvbmFsZSBmb3IgbW9vbicsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsYWJlbDogJ3N1bicsXG4gICAgICAgIHZhbHVlOiAnMicsXG4gICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICdob3VzZScsXG4gICAgICAgIHZhbHVlOiAnMycsXG4gICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuICBhbHRlcm5hdGVSZXNwb25zZToge1xuICAgIDI6IFsnMiddLFxuICB9LFxufTtcblxuY29uc3QgcHJlcGFyZU1vZGVsID0gKG1vZGVsID0ge30pID0+IHtcbiAgY29uc3QgY3Vyck1vZGFsID0ge1xuICAgIC4uLnNlbnNpYmxlRGVmYXVsdHMubW9kZWwsXG4gICAgLi4ubW9kZWwsXG4gIH07XG4gIGNvbnN0IHNsYXRlTWFya3VwID0gbW9kZWwuc2xhdGVNYXJrdXAgfHwgY3JlYXRlU2xhdGVNYXJrdXAoY3Vyck1vZGFsLm1hcmt1cCwgY3Vyck1vZGFsLmNob2ljZXMpO1xuICBjb25zdCBtYXJrdXAgPSBwcm9jZXNzTWFya3VwKHNsYXRlTWFya3VwKTtcblxuICByZXR1cm4ge1xuICAgIC4uLmN1cnJNb2RhbCxcbiAgICBzbGF0ZU1hcmt1cCxcbiAgICBtYXJrdXAsXG4gICAgLyouLi5wcm9jZXNzZWRNYXJrdXAsKi9cbiAgfTtcbn07XG5cbmRlc2NyaWJlKCdNYWluJywgKCkgPT4ge1xuICBsZXQgb25Nb2RlbENoYW5nZWQ7XG4gIGxldCBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkO1xuXG4gIGNvbnN0IHdyYXBwZXIgPSAoZXh0cmFzKSA9PiB7XG4gICAgb25Nb2RlbENoYW5nZWQgPSBqZXN0LmZuKCk7XG4gICAgb25Db25maWd1cmF0aW9uQ2hhbmdlZCA9IGplc3QuZm4oKTtcblxuICAgIGNvbnN0IGRlZmF1bHRzID0ge1xuICAgICAgb25Nb2RlbENoYW5nZWQsXG4gICAgICBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkLFxuICAgICAgY2xhc3Nlczoge30sXG4gICAgICBtb2RlbDogcHJlcGFyZU1vZGVsKHtcbiAgICAgICAgLi4ubW9kZWwsXG4gICAgICAgIC4uLmV4dHJhcyxcbiAgICAgIH0pLFxuICAgICAgY29uZmlndXJhdGlvbjogc2Vuc2libGVEZWZhdWx0cy5jb25maWd1cmF0aW9uLFxuICAgIH07XG4gICAgY29uc3QgcHJvcHMgPSB7IC4uLmRlZmF1bHRzIH07XG5cbiAgICByZXR1cm4gcmVuZGVyKDxNYWluIHsuLi5wcm9wc30gLz4pO1xuICB9O1xuXG4gIGNvbnN0IGNyZWF0ZUluc3RhbmNlID0gKGV4dHJhcykgPT4ge1xuICAgIG9uTW9kZWxDaGFuZ2VkID0gamVzdC5mbigpO1xuICAgIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQgPSBqZXN0LmZuKCk7XG5cbiAgICBjb25zdCBkZWZhdWx0cyA9IHtcbiAgICAgIG9uTW9kZWxDaGFuZ2VkLFxuICAgICAgb25Db25maWd1cmF0aW9uQ2hhbmdlZCxcbiAgICAgIGNsYXNzZXM6IHt9LFxuICAgICAgbW9kZWw6IHByZXBhcmVNb2RlbCh7XG4gICAgICAgIC4uLm1vZGVsLFxuICAgICAgICAuLi5leHRyYXMsXG4gICAgICB9KSxcbiAgICAgIGNvbmZpZ3VyYXRpb246IHNlbnNpYmxlRGVmYXVsdHMuY29uZmlndXJhdGlvbixcbiAgICB9O1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IE1haW4oZGVmYXVsdHMpO1xuXG4gICAgLy8gTW9jayBzZXRTdGF0ZSB0byBleGVjdXRlIHVwZGF0ZXMgaW1tZWRpYXRlbHkgZm9yIHRlc3RpbmdcbiAgICBpbnN0YW5jZS5zZXRTdGF0ZSA9IGplc3QuZm4oKHN0YXRlLCBjYWxsYmFjaykgPT4ge1xuICAgICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZS5zdGF0ZSwgdHlwZW9mIHN0YXRlID09PSAnZnVuY3Rpb24nID8gc3RhdGUoaW5zdGFuY2Uuc3RhdGUpIDogc3RhdGUpO1xuXG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfTtcblxuICBkZXNjcmliZSgnbG9naWMnLCAoKSA9PiB7XG4gICAgbGV0IHc7XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIHcgPSBjcmVhdGVJbnN0YW5jZSgpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ29uTW9kZWxDaGFuZ2UnLCAoKSA9PiB7XG4gICAgICBpdCgnY2hhbmdlcyB0aGUgbW9kZWwnLCAoKSA9PiB7XG4gICAgICAgIHcub25Nb2RlbENoYW5nZSh7IHByb21wdEVuYWJsZWQ6IGZhbHNlIH0pO1xuXG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkudG9CZUNhbGxlZFdpdGgoe1xuICAgICAgICAgIC4uLnByZXBhcmVNb2RlbChtb2RlbCksXG4gICAgICAgICAgcHJvbXB0RW5hYmxlZDogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnb25Qcm9tcHRDaGFuZ2VkJywgKCkgPT4ge1xuICAgICAgaXQoJ2NoYW5nZXMgdGhlIHByb21wdCB2YWx1ZScsICgpID0+IHtcbiAgICAgICAgdy5vblByb21wdENoYW5nZWQoJ1RoaXMgaXMgdGhlIG5ldyBwcm9tcHQnKTtcblxuICAgICAgICBleHBlY3Qob25Nb2RlbENoYW5nZWQpLnRvQmVDYWxsZWRXaXRoKHtcbiAgICAgICAgICAuLi5wcmVwYXJlTW9kZWwobW9kZWwpLFxuICAgICAgICAgIHByb21wdDogJ1RoaXMgaXMgdGhlIG5ldyBwcm9tcHQnLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ29uUmF0aW9uYWxlQ2hhbmdlZCcsICgpID0+IHtcbiAgICAgIGl0KCdjaGFuZ2VzIHRoZSByYXRpb25hbGUgdmFsdWUnLCAoKSA9PiB7XG4gICAgICAgIHcub25SYXRpb25hbGVDaGFuZ2VkKCdOZXcgUmF0aW9uYWxlJyk7XG5cbiAgICAgICAgZXhwZWN0KG9uTW9kZWxDaGFuZ2VkKS50b0JlQ2FsbGVkV2l0aCh7XG4gICAgICAgICAgLi4ucHJlcGFyZU1vZGVsKG1vZGVsKSxcbiAgICAgICAgICByYXRpb25hbGU6ICdOZXcgUmF0aW9uYWxlJyxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdvblRlYWNoZXJJbnN0cnVjdGlvbnNDaGFuZ2VkJywgKCkgPT4ge1xuICAgICAgaXQoJ2NoYW5nZXMgdGhlIHRlYWNoZXIgaW5zdHJ1Y3Rpb25zIHZhbHVlJywgKCkgPT4ge1xuICAgICAgICB3Lm9uVGVhY2hlckluc3RydWN0aW9uc0NoYW5nZWQoJ05ldyBUZWFjaGVyIEluc3RydWN0aW9ucycpO1xuXG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkudG9CZUNhbGxlZFdpdGgoe1xuICAgICAgICAgIC4uLnByZXBhcmVNb2RlbChtb2RlbCksXG4gICAgICAgICAgdGVhY2hlckluc3RydWN0aW9uczogJ05ldyBUZWFjaGVyIEluc3RydWN0aW9ucycsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnb25NYXJrdXBDaGFuZ2VkJywgKCkgPT4ge1xuICAgICAgaXQoJ2NoYW5nZXMgc2xhdGUgbWFya3VwIHZhbHVlJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBzbGF0ZU1hcmt1cCA9XG4gICAgICAgICAgJzxwPlRoZSA8c3BhbiBkYXRhLXR5cGU9XFxcXFwiZXhwbGljaXRfY29uc3RydWN0ZWRfcmVzcG9uc2VcXFxcXCIgZGF0YS1pbmRleD1cXFxcXCIwXFxcXFwiIGRhdGEtdmFsdWU9XFxcXFwiY293XFxcXFwiPjwvc3Bhbj4ganVtcGVkPC9wPic7XG5cbiAgICAgICAgdy5vbk1hcmt1cENoYW5nZWQoc2xhdGVNYXJrdXApO1xuXG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkudG9CZUNhbGxlZFdpdGgoe1xuICAgICAgICAgIC4uLnByZXBhcmVNb2RlbChtb2RlbCksXG4gICAgICAgICAgc2xhdGVNYXJrdXAsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnb25DaGFuZ2UnLCAoKSA9PiB7XG4gICAgICBpdCgnUmVtb3ZpbmcgY2hvaWNlcyAoa2VlcGluZyBvbmx5IDEgY2hvaWNlKTogc3luY3MgbWFya3VwIGFuZCBjaG9pY2VzIHdpdGhvdXQgZGlzY2FyZGluZycsICgpID0+IHtcbiAgICAgICAgY29uc3Qgb2xkTW9kZWwgPSB3LnByb3BzLm1vZGVsO1xuICAgICAgICBjb25zdCBuZXdDaG9pY2VzID0ge1xuICAgICAgICAgIC4uLm1vZGVsLmNob2ljZXMsXG4gICAgICAgICAgMDogbW9kZWwuY2hvaWNlc1snMCddLnNsaWNlKDAsIDEpLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBuZXdNYXJrdXAgPSBgPGRpdj48cD5UaGUgPHNwYW4gZGF0YS10eXBlPVwiaW5saW5lX2Ryb3Bkb3duXCIgZGF0YS1pbmRleD1cIjBcIiBkYXRhLXZhbHVlPVwiY293IFwiPjwvc3Bhbj4ganVtcGVkIDxzcGFuIGRhdGEtdHlwZT1cImlubGluZV9kcm9wZG93blwiIGRhdGEtaW5kZXg9XCIxXCIgZGF0YS12YWx1ZT1cIm92ZXIgXCI+PC9zcGFuPiB0aGUgPHNwYW4gZGF0YS10eXBlPVwiaW5saW5lX2Ryb3Bkb3duXCIgZGF0YS1pbmRleD1cIjJcIiBkYXRhLXZhbHVlPVwibW9vbiBcIj48L3NwYW4+LjwvcD48L2Rpdj5gO1xuXG4gICAgICAgIHcuc2V0U3RhdGUoeyByZXNwQXJlYUNob2ljZXM6IG5ld0Nob2ljZXMgfSk7XG4gICAgICAgIHcub25DaGFuZ2UobmV3TWFya3VwKTtcblxuICAgICAgICBleHBlY3Qob25Nb2RlbENoYW5nZWQpLnRvQmVDYWxsZWRXaXRoKHtcbiAgICAgICAgICAuLi5vbGRNb2RlbCxcbiAgICAgICAgICBzbGF0ZU1hcmt1cDogbmV3TWFya3VwLFxuICAgICAgICAgIGNob2ljZXM6IG5ld0Nob2ljZXMsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdObyBjb3JyZWN0IGNob2ljZSBzZWxlY3RlZDogc3luY3MgbWFya3VwIGFuZCBjaG9pY2VzIHdpdGhvdXQgZGlzY2FyZGluZycsICgpID0+IHtcbiAgICAgICAgY29uc3Qgb2xkTW9kZWwgPSB3LnByb3BzLm1vZGVsO1xuICAgICAgICBjb25zdCBuZXdDaG9pY2VzID0ge1xuICAgICAgICAgIC4uLm1vZGVsLmNob2ljZXMsXG4gICAgICAgICAgMDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ2NvdycsXG4gICAgICAgICAgICAgIHZhbHVlOiAnMCcsXG4gICAgICAgICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdkb2cnLFxuICAgICAgICAgICAgICB2YWx1ZTogJzEnLFxuICAgICAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGxhYmVsOiAnY2F0JyxcbiAgICAgICAgICAgICAgdmFsdWU6ICcyJyxcbiAgICAgICAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG5ld01hcmt1cCA9IGA8ZGl2PjxwPlRoZSA8c3BhbiBkYXRhLXR5cGU9XCJpbmxpbmVfZHJvcGRvd25cIiBkYXRhLWluZGV4PVwiMFwiIGRhdGEtdmFsdWU9XCJjb3cgXCI+PC9zcGFuPiBqdW1wZWQgPHNwYW4gZGF0YS10eXBlPVwiaW5saW5lX2Ryb3Bkb3duXCIgZGF0YS1pbmRleD1cIjFcIiBkYXRhLXZhbHVlPVwib3ZlciBcIj48L3NwYW4+IHRoZSA8c3BhbiBkYXRhLXR5cGU9XCJpbmxpbmVfZHJvcGRvd25cIiBkYXRhLWluZGV4PVwiMlwiIGRhdGEtdmFsdWU9XCJtb29uIFwiPjwvc3Bhbj4uPC9wPjwvZGl2PmA7XG5cbiAgICAgICAgdy5zZXRTdGF0ZSh7IHJlc3BBcmVhQ2hvaWNlczogbmV3Q2hvaWNlcyB9KTtcbiAgICAgICAgdy5vbkNoYW5nZShuZXdNYXJrdXApO1xuXG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkudG9CZUNhbGxlZFdpdGgoe1xuICAgICAgICAgIC4uLm9sZE1vZGVsLFxuICAgICAgICAgIHNsYXRlTWFya3VwOiBuZXdNYXJrdXAsXG4gICAgICAgICAgY2hvaWNlczogbmV3Q2hvaWNlcyxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ05ldyBjaG9pY2U6IHNsYXRlTWFya3VwIGFuZCBjaG9pY2VzIGFyZSB1cGRhdGVkJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBuZXdDaG9pY2VzID0ge1xuICAgICAgICAgIC4uLm1vZGVsLmNob2ljZXMsXG4gICAgICAgICAgMDogW1xuICAgICAgICAgICAgLi4ubW9kZWwuY2hvaWNlc1snMCddLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ3BldCcsXG4gICAgICAgICAgICAgIHZhbHVlOiAnMycsXG4gICAgICAgICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBuZXdNYXJrdXAgPSBgPGRpdj48cD5UaGUgPHNwYW4gZGF0YS10eXBlPVwiaW5saW5lX2Ryb3Bkb3duXCIgZGF0YS1pbmRleD1cIjBcIiBkYXRhLXZhbHVlPVwiY293IFwiPjwvc3Bhbj4ganVtcGVkIDxzcGFuIGRhdGEtdHlwZT1cImlubGluZV9kcm9wZG93blwiIGRhdGEtaW5kZXg9XCIxXCIgZGF0YS12YWx1ZT1cIm92ZXIgXCI+PC9zcGFuPiB0aGUgPHNwYW4gZGF0YS10eXBlPVwiaW5saW5lX2Ryb3Bkb3duXCIgZGF0YS1pbmRleD1cIjJcIiBkYXRhLXZhbHVlPVwibW9vbiBcIj48L3NwYW4+LjwvcD48L2Rpdj5gO1xuXG4gICAgICAgIHcuc2V0U3RhdGUoeyByZXNwQXJlYUNob2ljZXM6IG5ld0Nob2ljZXMgfSk7XG4gICAgICAgIHcub25DaGFuZ2UobmV3TWFya3VwKTtcblxuICAgICAgICBleHBlY3Qob25Nb2RlbENoYW5nZWQpLnRvQmVDYWxsZWRXaXRoKHtcbiAgICAgICAgICAuLi5wcmVwYXJlTW9kZWwobW9kZWwpLFxuICAgICAgICAgIHNsYXRlTWFya3VwOiBuZXdNYXJrdXAsXG4gICAgICAgICAgY2hvaWNlczogbmV3Q2hvaWNlcyxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ05ldyBSZXNwb25zZSBBcmVhOiBzbGF0ZU1hcmt1cCBhbmQgY2hvaWNlcyBhcmUgdXBkYXRlZCcsICgpID0+IHtcbiAgICAgICAgY29uc3Qgb2xkTW9kZWwgPSB3LnByb3BzLm1vZGVsO1xuICAgICAgICBjb25zdCBuZXdDaG9pY2VzID0ge1xuICAgICAgICAgIC4uLm1vZGVsLmNob2ljZXMsXG4gICAgICAgICAgMzogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ0EnLFxuICAgICAgICAgICAgICB2YWx1ZTogJzAnLFxuICAgICAgICAgICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdCJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICcxJyxcbiAgICAgICAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ0MnLFxuICAgICAgICAgICAgICB2YWx1ZTogJzInLFxuICAgICAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbmV3TWFya3VwID0gYDxkaXY+PHA+VGhlIDxzcGFuIGRhdGEtdHlwZT1cImlubGluZV9kcm9wZG93blwiIGRhdGEtaW5kZXg9XCIwXCIgZGF0YS12YWx1ZT1cImNvdyBcIj48L3NwYW4+IGp1bXBlZCA8c3BhbiBkYXRhLXR5cGU9XCJpbmxpbmVfZHJvcGRvd25cIiBkYXRhLWluZGV4PVwiMVwiIGRhdGEtdmFsdWU9XCJvdmVyIFwiPjwvc3Bhbj4gdGhlIDxzcGFuIGRhdGEtdHlwZT1cImlubGluZV9kcm9wZG93blwiIGRhdGEtaW5kZXg9XCIyXCIgZGF0YS12YWx1ZT1cIm1vb24gXCI+PC9zcGFuPiwgPHNwYW4gZGF0YS10eXBlPVwiaW5saW5lX2Ryb3Bkb3duXCIgZGF0YS1pbmRleD1cIjNcIiBkYXRhLXZhbHVlPVwiQVwiPjwvc3Bhbj4uPC9wPjwvZGl2PmA7XG5cbiAgICAgICAgdy5zZXRTdGF0ZSh7IHJlc3BBcmVhQ2hvaWNlczogbmV3Q2hvaWNlcyB9KTtcbiAgICAgICAgdy5vbkNoYW5nZShuZXdNYXJrdXApO1xuXG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkudG9CZUNhbGxlZFdpdGgoe1xuICAgICAgICAgIC4uLm9sZE1vZGVsLFxuICAgICAgICAgIHNsYXRlTWFya3VwOiBuZXdNYXJrdXAsXG4gICAgICAgICAgY2hvaWNlczogbmV3Q2hvaWNlcyxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ1JlbW92aW5nIGNob2ljZXMgKGtlZXBpbmcgYXQgbGVhc3QgMik6IHNsYXRlTWFya3VwIGFuZCBjaG9pY2VzIGFyZSB1cGRhdGVkJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBvbGRNb2RlbCA9IHcucHJvcHMubW9kZWw7XG4gICAgICAgIGNvbnN0IG5ld0Nob2ljZXMgPSB7XG4gICAgICAgICAgLi4ubW9kZWwuY2hvaWNlcyxcbiAgICAgICAgICAwOiBtb2RlbC5jaG9pY2VzWycwJ10uc2xpY2UoMCwgMiksXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG5ld01hcmt1cCA9IGA8ZGl2PjxwPlRoZSA8c3BhbiBkYXRhLXR5cGU9XCJpbmxpbmVfZHJvcGRvd25cIiBkYXRhLWluZGV4PVwiMFwiIGRhdGEtdmFsdWU9XCJjb3cgXCI+PC9zcGFuPiBqdW1wZWQgPHNwYW4gZGF0YS10eXBlPVwiaW5saW5lX2Ryb3Bkb3duXCIgZGF0YS1pbmRleD1cIjFcIiBkYXRhLXZhbHVlPVwib3ZlciBcIj48L3NwYW4+IHRoZSA8c3BhbiBkYXRhLXR5cGU9XCJpbmxpbmVfZHJvcGRvd25cIiBkYXRhLWluZGV4PVwiMlwiIGRhdGEtdmFsdWU9XCJtb29uIFwiPjwvc3Bhbj4uPC9wPjwvZGl2PmA7XG5cbiAgICAgICAgdy5zZXRTdGF0ZSh7IHJlc3BBcmVhQ2hvaWNlczogbmV3Q2hvaWNlcyB9KTtcbiAgICAgICAgdy5vbkNoYW5nZShuZXdNYXJrdXApO1xuXG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkudG9CZUNhbGxlZFdpdGgoe1xuICAgICAgICAgIC4uLm9sZE1vZGVsLFxuICAgICAgICAgIHNsYXRlTWFya3VwOiBuZXdNYXJrdXAsXG4gICAgICAgICAgY2hvaWNlczogbmV3Q2hvaWNlcyxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd2YWxpZGF0ZVJlc3BvbnNlQXJlYUNsb3NlJywgKCkgPT4ge1xuICAgICAgY29uc3Qgbm9kZSA9IHsgYXR0cnM6IHsgaW5kZXg6IDAgfSB9O1xuICAgICAgY29uc3QgY2xvc2VUb29sYmFyID0gamVzdC5mbigpO1xuICAgICAgY29uc3Qgb25DYW5jZWwgPSBqZXN0LmZuKCk7XG5cbiAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICB3LnNldFN0YXRlKHsgcmVzcEFyZWFDaG9pY2VzOiBjbG9uZURlZXAobW9kZWwuY2hvaWNlcykgfSk7XG4gICAgICAgIGNsb3NlVG9vbGJhci5tb2NrQ2xlYXIoKTtcbiAgICAgICAgb25DYW5jZWwubW9ja0NsZWFyKCk7XG4gICAgICAgIGRlbGV0ZUlubGluZURyb3Bkb3duQnlJbmRleC5tb2NrQ2xlYXIoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnY2xvc2VzIHRvb2xiYXIgd2hlbiBjaG9pY2VzIGFyZSB2YWxpZCcsICgpID0+IHtcbiAgICAgICAgdy52YWxpZGF0ZVJlc3BvbnNlQXJlYUNsb3NlKG5vZGUsIDUsIHt9LCBjbG9zZVRvb2xiYXIsIG9uQ2FuY2VsKTtcblxuICAgICAgICBleHBlY3QoY2xvc2VUb29sYmFyKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgIGV4cGVjdCh3LnN0YXRlLndhcm5pbmcub3BlbikudG9CZShmYWxzZSk7XG4gICAgICAgIGV4cGVjdChkZWxldGVJbmxpbmVEcm9wZG93bkJ5SW5kZXgpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3dzIHdhcm5pbmcgd2hlbiBjaG9pY2VzIGFyZSBpbnZhbGlkJywgKCkgPT4ge1xuICAgICAgICB3LnNldFN0YXRlKHtcbiAgICAgICAgICByZXNwQXJlYUNob2ljZXM6IHtcbiAgICAgICAgICAgIDA6IFt7IGxhYmVsOiAnb25seScsIHZhbHVlOiAnMCcsIGNvcnJlY3Q6IGZhbHNlIH1dLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHcudmFsaWRhdGVSZXNwb25zZUFyZWFDbG9zZShub2RlLCA1LCB7fSwgY2xvc2VUb29sYmFyLCBvbkNhbmNlbCk7XG5cbiAgICAgICAgZXhwZWN0KGNsb3NlVG9vbGJhcikubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgICAgZXhwZWN0KHcuc3RhdGUud2FybmluZy5vcGVuKS50b0JlKHRydWUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdkZWxldGVzIHJlc3BvbnNlIGFyZWEgYW5kIGNsb3NlcyB0b29sYmFyIG9uIGNvbmZpcm0nLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGVkaXRvciA9IHt9O1xuXG4gICAgICAgIHcuc2V0U3RhdGUoe1xuICAgICAgICAgIHJlc3BBcmVhQ2hvaWNlczoge1xuICAgICAgICAgICAgMDogW3sgbGFiZWw6ICdvbmx5JywgdmFsdWU6ICcwJywgY29ycmVjdDogZmFsc2UgfV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdy52YWxpZGF0ZVJlc3BvbnNlQXJlYUNsb3NlKG5vZGUsIDUsIGVkaXRvciwgY2xvc2VUb29sYmFyLCBvbkNhbmNlbCk7XG4gICAgICAgIHcuc3RhdGUud2FybmluZy5vbkNvbmZpcm0oKTtcblxuICAgICAgICBleHBlY3QoZGVsZXRlSW5saW5lRHJvcGRvd25CeUluZGV4KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChlZGl0b3IsIDAsIDUpO1xuICAgICAgICBleHBlY3QoY2xvc2VUb29sYmFyKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2NhbGxzIHBpZS1saWIgb25DYW5jZWwgd2hlbiBkaWFsb2cgaXMgZGlzbWlzc2VkJywgKCkgPT4ge1xuICAgICAgICB3LnNldFN0YXRlKHtcbiAgICAgICAgICByZXNwQXJlYUNob2ljZXM6IHtcbiAgICAgICAgICAgIDA6IFt7IGxhYmVsOiAnb25seScsIHZhbHVlOiAnMCcsIGNvcnJlY3Q6IGZhbHNlIH1dLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHcudmFsaWRhdGVSZXNwb25zZUFyZWFDbG9zZShub2RlLCA1LCB7fSwgY2xvc2VUb29sYmFyLCBvbkNhbmNlbCk7XG4gICAgICAgIHcuc3RhdGUud2FybmluZy5vbkNsb3NlKCk7XG5cbiAgICAgICAgZXhwZWN0KG9uQ2FuY2VsKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgIGV4cGVjdChkZWxldGVJbmxpbmVEcm9wZG93bkJ5SW5kZXgpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdvbkNob2ljZVJhdGlvbmFsZUNoYW5nZWQnLCAoKSA9PiB7XG4gICAgICBpdCgnY2hhbmdlcyB0aGUgY2hvaWNlIGxldmVsIHJhdGlvbmFsZSB2YWx1ZScsICgpID0+IHtcbiAgICAgICAgdy5vbkNob2ljZVJhdGlvbmFsZUNoYW5nZWQoMCwge1xuICAgICAgICAgIGxhYmVsOiAnY293JyxcbiAgICAgICAgICB2YWx1ZTogJzAnLFxuICAgICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgICAgcmF0aW9uYWxlOiAnbmV3IHJhdGlvbmFsZSBmb3IgY293JyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZXhwZWN0KG9uTW9kZWxDaGFuZ2VkKS50b0JlQ2FsbGVkV2l0aCh7XG4gICAgICAgICAgLi4ucHJlcGFyZU1vZGVsKG1vZGVsKSxcbiAgICAgICAgICBjaG9pY2VzOiB7XG4gICAgICAgICAgICAwOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ2NvdycsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgICAgICAgICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgICAgICAgICAgIHJhdGlvbmFsZTogJ25ldyByYXRpb25hbGUgZm9yIGNvdycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ2RvZycsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICcxJyxcbiAgICAgICAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnY2F0JyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJzInLFxuICAgICAgICAgICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIDE6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnb3ZlcicsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgICAgICAgICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgICAgICAgICAgIHJhdGlvbmFsZTogJ3JhdGlvbmFsZSBmb3Igb3ZlcicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ3VuZGVyJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJzEnLFxuICAgICAgICAgICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdhY3Jvc3MnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnMicsXG4gICAgICAgICAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgMjogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdtb29uJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJzAnLFxuICAgICAgICAgICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgICAgICAgICAgcmF0aW9uYWxlOiAncmF0aW9uYWxlIGZvciBtb29uJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnc3VuJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJzInLFxuICAgICAgICAgICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdob3VzZScsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICczJyxcbiAgICAgICAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdvbkFkZENob2ljZScsICgpID0+IHtcbiAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICB3LnNldFN0YXRlKHsgcmVzcEFyZWFDaG9pY2VzOiBtb2RlbC5jaG9pY2VzIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdEb2VzIG5vdCBhZGQgZHVwbGljYXRlcycsICgpID0+IHtcbiAgICAgICAgdy5vbkFkZENob2ljZSgnMCcsICdjb3cnKTtcblxuICAgICAgICBleHBlY3Qob25Nb2RlbENoYW5nZWQpLm5vdC50b0JlQ2FsbGVkKCk7XG5cbiAgICAgICAgdy5vbkFkZENob2ljZSgnMScsICdvdmVyJyk7XG5cbiAgICAgICAgZXhwZWN0KG9uTW9kZWxDaGFuZ2VkKS5ub3QudG9CZUNhbGxlZCgpO1xuXG4gICAgICAgIHcub25BZGRDaG9pY2UoJzEnLCAndW5kZXInKTtcblxuICAgICAgICBleHBlY3Qob25Nb2RlbENoYW5nZWQpLm5vdC50b0JlQ2FsbGVkKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ0FkZHMgYSBuZXcgY2hvaWNlJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBjdXJyZW50TW9kZWwgPSBjbG9uZURlZXAody5wcm9wcy5tb2RlbCk7XG5cbiAgICAgICAgdy5vbkFkZENob2ljZSgnMCcsICdiaXJkJyk7XG5cbiAgICAgICAgZXhwZWN0KG9uTW9kZWxDaGFuZ2VkKS50b0JlQ2FsbGVkV2l0aCh7XG4gICAgICAgICAgLi4uY3VycmVudE1vZGVsLFxuICAgICAgICAgIGNob2ljZXM6IHtcbiAgICAgICAgICAgIC4uLmN1cnJlbnRNb2RlbC5jaG9pY2VzLFxuICAgICAgICAgICAgMDogWy4uLmN1cnJlbnRNb2RlbC5jaG9pY2VzWycwJ10sIHsgbGFiZWw6ICdiaXJkJywgdmFsdWU6ICczJywgY29ycmVjdDogZmFsc2UgfV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdy5vbkFkZENob2ljZSgnMicsICdzdGFyJyk7XG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkudG9CZUNhbGxlZFdpdGgoe1xuICAgICAgICAgIC4uLmN1cnJlbnRNb2RlbCxcbiAgICAgICAgICBjaG9pY2VzOiB7XG4gICAgICAgICAgICAuLi5jdXJyZW50TW9kZWwuY2hvaWNlcyxcbiAgICAgICAgICAgIDA6IFsuLi5jdXJyZW50TW9kZWwuY2hvaWNlc1snMCddLCB7IGxhYmVsOiAnYmlyZCcsIHZhbHVlOiAnMycsIGNvcnJlY3Q6IGZhbHNlIH1dLFxuICAgICAgICAgICAgMjogWy4uLmN1cnJlbnRNb2RlbC5jaG9pY2VzWycyJ10sIHsgbGFiZWw6ICdzdGFyJywgdmFsdWU6ICc0JywgY29ycmVjdDogZmFsc2UgfV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdvblJlbW92ZUNob2ljZScsICgpID0+IHtcbiAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICB3LnNldFN0YXRlKHtcbiAgICAgICAgICByZXNwQXJlYUNob2ljZXM6IHtcbiAgICAgICAgICAgIDA6IFtcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ2NvdycsIHZhbHVlOiAnMCcsIGNvcnJlY3Q6IHRydWUgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ2RvZycsIHZhbHVlOiAnMScsIGNvcnJlY3Q6IGZhbHNlIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdjYXQnLCB2YWx1ZTogJzInLCBjb3JyZWN0OiBmYWxzZSB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnUmVtb3ZlcyBjaG9pY2VzJywgKCkgPT4ge1xuICAgICAgICB3Lm9uUmVtb3ZlQ2hvaWNlKDAsICcwJyk7XG5cbiAgICAgICAgZXhwZWN0KG9uTW9kZWxDaGFuZ2VkKS50b0JlQ2FsbGVkV2l0aChcbiAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICBjaG9pY2VzOiB7XG4gICAgICAgICAgICAgIDA6IFtcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnZG9nJywgdmFsdWU6ICcxJywgY29ycmVjdDogZmFsc2UgfSxcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnY2F0JywgdmFsdWU6ICcyJywgY29ycmVjdDogZmFsc2UgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgdy5vblJlbW92ZUNob2ljZSgwLCAnMCcpO1xuXG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkudG9CZUNhbGxlZFdpdGgoXG4gICAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgY2hvaWNlczoge1xuICAgICAgICAgICAgICAwOiBbeyBsYWJlbDogJ2NhdCcsIHZhbHVlOiAnMicsIGNvcnJlY3Q6IGZhbHNlIH1dLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcblxuICAgICAgICB3Lm9uUmVtb3ZlQ2hvaWNlKDAsICcwJyk7XG5cbiAgICAgICAgZXhwZWN0KG9uTW9kZWxDaGFuZ2VkKS50b0JlQ2FsbGVkV2l0aChcbiAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICBjaG9pY2VzOiB7XG4gICAgICAgICAgICAgIDA6IFtdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ29uU2VsZWN0Q2hvaWNlJywgKCkgPT4ge1xuICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgIHcuc2V0U3RhdGUoe1xuICAgICAgICAgIHJlc3BBcmVhQ2hvaWNlczoge1xuICAgICAgICAgICAgMDogW1xuICAgICAgICAgICAgICB7IGxhYmVsOiAnY293JywgdmFsdWU6ICcwJywgY29ycmVjdDogdHJ1ZSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnZG9nJywgdmFsdWU6ICcxJywgY29ycmVjdDogZmFsc2UgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ2NhdCcsIHZhbHVlOiAnMicsIGNvcnJlY3Q6IGZhbHNlIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdVcGRhdGVzIGNvcnJlY3QgY2hvaWNlJywgKCkgPT4ge1xuICAgICAgICB3Lm9uU2VsZWN0Q2hvaWNlKDAsIDEpO1xuXG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkudG9CZUNhbGxlZFdpdGgoXG4gICAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgY2hvaWNlczoge1xuICAgICAgICAgICAgICAwOiBbXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ2NvdycsIHZhbHVlOiAnMCcsIGNvcnJlY3Q6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ2RvZycsIHZhbHVlOiAnMScsIGNvcnJlY3Q6IHRydWUgfSxcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnY2F0JywgdmFsdWU6ICcyJywgY29ycmVjdDogZmFsc2UgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgdy5vblNlbGVjdENob2ljZSgwLCAwKTtcblxuICAgICAgICBleHBlY3Qob25Nb2RlbENoYW5nZWQpLnRvQmVDYWxsZWRXaXRoKFxuICAgICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgIGNob2ljZXM6IHtcbiAgICAgICAgICAgICAgMDogW1xuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdjb3cnLCB2YWx1ZTogJzAnLCBjb3JyZWN0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ2RvZycsIHZhbHVlOiAnMScsIGNvcnJlY3Q6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ2NhdCcsIHZhbHVlOiAnMicsIGNvcnJlY3Q6IGZhbHNlIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwibWFw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
|