@pie-element/multiple-choice 7.6.1-beta.2 → 7.6.1-beta.3

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 (40) hide show
  1. package/configure/package.json +3 -3
  2. package/package.json +3 -3
  3. package/configure/lib/__tests__/root.test.js +0 -271
  4. package/configure/lib/defaults.js +0 -120
  5. package/configure/lib/defaults.js.map +0 -1
  6. package/configure/lib/index.js +0 -212
  7. package/configure/lib/index.js.map +0 -1
  8. package/configure/lib/main.js +0 -604
  9. package/configure/lib/main.js.map +0 -1
  10. package/configure/lib/utils.js +0 -18
  11. package/configure/lib/utils.js.map +0 -1
  12. package/controller/lib/__tests__/index.test.js +0 -864
  13. package/controller/lib/__tests__/utils.test.js +0 -8
  14. package/controller/lib/defaults.js +0 -18
  15. package/controller/lib/defaults.js.map +0 -1
  16. package/controller/lib/index.js +0 -305
  17. package/controller/lib/index.js.map +0 -1
  18. package/controller/lib/utils.js +0 -36
  19. package/controller/lib/utils.js.map +0 -1
  20. package/docs/demo/pie.manifest.json +0 -11
  21. package/lib/__tests__/choice-input-test.js +0 -124
  22. package/lib/__tests__/index-test.js +0 -22
  23. package/lib/__tests__/multiple-choice-test.js +0 -237
  24. package/lib/__tests__/session-updater-test.js +0 -72
  25. package/lib/choice-input.js +0 -298
  26. package/lib/choice-input.js.map +0 -1
  27. package/lib/choice.js +0 -157
  28. package/lib/choice.js.map +0 -1
  29. package/lib/feedback-tick.js +0 -174
  30. package/lib/feedback-tick.js.map +0 -1
  31. package/lib/index.js +0 -151
  32. package/lib/index.js.map +0 -1
  33. package/lib/main.js +0 -100
  34. package/lib/main.js.map +0 -1
  35. package/lib/multiple-choice.js +0 -263
  36. package/lib/multiple-choice.js.map +0 -1
  37. package/lib/print.js +0 -129
  38. package/lib/print.js.map +0 -1
  39. package/lib/session-updater.js +0 -35
  40. package/lib/session-updater.js.map +0 -1
@@ -1,864 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
6
-
7
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
8
-
9
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
-
11
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
12
-
13
- var _index = require("../index");
14
-
15
- var _utils = require("../utils");
16
-
17
- var _defaults = _interopRequireDefault(require("../defaults"));
18
-
19
- var _templateObject, _templateObject2, _templateObject3;
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('../utils', function () {
26
- return {
27
- isResponseCorrect: jest.fn()
28
- };
29
- });
30
- describe('controller', function () {
31
- var result, question, session, env;
32
- beforeEach(function () {
33
- question = {
34
- id: '1',
35
- element: 'multiple-choice',
36
- prompt: 'prompt',
37
- promptEnabled: true,
38
- choicePrefix: 'letters',
39
- choiceMode: 'radio',
40
- feedbackEnabled: true,
41
- choices: [{
42
- label: 'a',
43
- value: 'apple',
44
- correct: true,
45
- feedback: {
46
- type: 'custom',
47
- value: 'foo'
48
- }
49
- }, {
50
- label: 'b',
51
- value: 'banana',
52
- feedback: {
53
- type: 'default'
54
- }
55
- }]
56
- };
57
- });
58
- var stringify = JSON.stringify;
59
- describe('model', function () {
60
- describe('mode: gather', function () {
61
- beforeEach( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
62
- return _regenerator["default"].wrap(function _callee$(_context) {
63
- while (1) {
64
- switch (_context.prev = _context.next) {
65
- case 0:
66
- session = {};
67
- env = {
68
- mode: 'gather'
69
- };
70
- _context.next = 4;
71
- return (0, _index.model)(question, session, env);
72
-
73
- case 4:
74
- result = _context.sent;
75
-
76
- case 5:
77
- case "end":
78
- return _context.stop();
79
- }
80
- }
81
- }, _callee);
82
- })));
83
- it('returns disabled', function () {
84
- expect(result.disabled).toEqual(false);
85
- });
86
- it('returns mode', function () {
87
- expect(result.mode).toEqual('gather');
88
- });
89
- it('returns prompt', function () {
90
- expect(result.prompt).toEqual('prompt');
91
- });
92
- it('returns choiceMode', function () {
93
- expect(result.choiceMode).toEqual('radio');
94
- });
95
- it('returns choicePrefix', function () {
96
- expect(result.keyMode).toEqual('letters');
97
- });
98
- it('returns choices', function () {
99
- expect(result.choices).toEqual(expect.arrayContaining([{
100
- label: 'a',
101
- value: 'apple',
102
- rationale: null
103
- }, {
104
- label: 'b',
105
- value: 'banana',
106
- rationale: null
107
- }]));
108
- });
109
- it('does not return responseCorrect', function () {
110
- expect(result.responseCorrect).toBe(undefined);
111
- });
112
- });
113
- describe('model - with updateSession', function () {
114
- it('calls updateSession', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
115
- var updateSession;
116
- return _regenerator["default"].wrap(function _callee2$(_context2) {
117
- while (1) {
118
- switch (_context2.prev = _context2.next) {
119
- case 0:
120
- session = {
121
- id: '1',
122
- element: 'multiple-choice'
123
- };
124
- env = {
125
- mode: 'gather'
126
- };
127
- updateSession = jest.fn().mockResolvedValue();
128
- _context2.next = 5;
129
- return (0, _index.model)(question, session, env, updateSession);
130
-
131
- case 5:
132
- expect(updateSession).toHaveBeenCalledWith('1', 'multiple-choice', {
133
- shuffledValues: expect.arrayContaining(['apple', 'banana'])
134
- });
135
-
136
- case 6:
137
- case "end":
138
- return _context2.stop();
139
- }
140
- }
141
- }, _callee2);
142
- })));
143
- });
144
- describe('mode: view', function () {
145
- beforeEach( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
146
- return _regenerator["default"].wrap(function _callee3$(_context3) {
147
- while (1) {
148
- switch (_context3.prev = _context3.next) {
149
- case 0:
150
- session = {};
151
- env = {
152
- mode: 'view'
153
- };
154
- _context3.next = 4;
155
- return (0, _index.model)(question, session, env);
156
-
157
- case 4:
158
- result = _context3.sent;
159
-
160
- case 5:
161
- case "end":
162
- return _context3.stop();
163
- }
164
- }
165
- }, _callee3);
166
- })));
167
- it('returns disabled', function () {
168
- expect(result.disabled).toEqual(true);
169
- });
170
- });
171
- describe('mode: evaluate', function () {
172
- beforeEach( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4() {
173
- return _regenerator["default"].wrap(function _callee4$(_context4) {
174
- while (1) {
175
- switch (_context4.prev = _context4.next) {
176
- case 0:
177
- session = {};
178
- env = {
179
- mode: 'evaluate'
180
- };
181
-
182
- _utils.isResponseCorrect.mockReturnValue(false);
183
-
184
- _context4.next = 5;
185
- return (0, _index.model)(question, session, env);
186
-
187
- case 5:
188
- result = _context4.sent;
189
- return _context4.abrupt("return", result);
190
-
191
- case 7:
192
- case "end":
193
- return _context4.stop();
194
- }
195
- }
196
- }, _callee4);
197
- })));
198
- it('returns choices w/ correct', function () {
199
- expect(result.choices).toEqual(expect.arrayContaining([{
200
- label: 'a',
201
- value: 'apple',
202
- correct: true,
203
- feedback: 'foo',
204
- rationale: null
205
- }, {
206
- label: 'b',
207
- value: 'banana',
208
- correct: false,
209
- feedback: 'Incorrect',
210
- rationale: null
211
- }]));
212
- });
213
- it('returns choices w/ correct even if feedbackEnabled is false', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5() {
214
- return _regenerator["default"].wrap(function _callee5$(_context5) {
215
- while (1) {
216
- switch (_context5.prev = _context5.next) {
217
- case 0:
218
- _context5.next = 2;
219
- return (0, _index.model)(_objectSpread(_objectSpread({}, question), {}, {
220
- feedbackEnabled: false
221
- }), session, env, jest.fn());
222
-
223
- case 2:
224
- result = _context5.sent;
225
- expect(result.choices).toEqual(expect.arrayContaining([{
226
- label: 'a',
227
- value: 'apple',
228
- correct: true,
229
- feedback: undefined,
230
- rationale: null
231
- }, {
232
- label: 'b',
233
- value: 'banana',
234
- correct: false,
235
- feedback: undefined,
236
- rationale: null
237
- }]));
238
-
239
- case 4:
240
- case "end":
241
- return _context5.stop();
242
- }
243
- }
244
- }, _callee5);
245
- })));
246
- it('returns feedback undefined if feedbackEnabled is false', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6() {
247
- return _regenerator["default"].wrap(function _callee6$(_context6) {
248
- while (1) {
249
- switch (_context6.prev = _context6.next) {
250
- case 0:
251
- _context6.next = 2;
252
- return (0, _index.model)(_objectSpread(_objectSpread({}, question), {}, {
253
- feedbackEnabled: false
254
- }), session, env, jest.fn());
255
-
256
- case 2:
257
- result = _context6.sent;
258
- expect(result.choices).toEqual(expect.arrayContaining([{
259
- label: 'a',
260
- value: 'apple',
261
- correct: true,
262
- feedback: undefined,
263
- rationale: null
264
- }, {
265
- label: 'b',
266
- value: 'banana',
267
- correct: false,
268
- feedback: undefined,
269
- rationale: null
270
- }]));
271
-
272
- case 4:
273
- case "end":
274
- return _context6.stop();
275
- }
276
- }
277
- }, _callee6);
278
- })));
279
- it('returns proper feedback if feedbackEnabled is true', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7() {
280
- return _regenerator["default"].wrap(function _callee7$(_context7) {
281
- while (1) {
282
- switch (_context7.prev = _context7.next) {
283
- case 0:
284
- _context7.next = 2;
285
- return (0, _index.model)(_objectSpread(_objectSpread({}, question), {}, {
286
- feedbackEnabled: true
287
- }), session, env, jest.fn());
288
-
289
- case 2:
290
- result = _context7.sent;
291
- expect(result.choices).toEqual(expect.arrayContaining([{
292
- label: 'a',
293
- value: 'apple',
294
- correct: true,
295
- feedback: 'foo',
296
- rationale: null
297
- }, {
298
- label: 'b',
299
- value: 'banana',
300
- correct: false,
301
- feedback: 'Incorrect',
302
- rationale: null
303
- }]));
304
-
305
- case 4:
306
- case "end":
307
- return _context7.stop();
308
- }
309
- }
310
- }, _callee7);
311
- })));
312
- it('returns is response correct', function () {
313
- expect(result.responseCorrect).toEqual(false);
314
- });
315
-
316
- var returnsCorrectness = function returnsCorrectness(sess) {
317
- it("returns responseCorrect: false if session is ".concat(stringify(sess)), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8() {
318
- var o;
319
- return _regenerator["default"].wrap(function _callee8$(_context8) {
320
- while (1) {
321
- switch (_context8.prev = _context8.next) {
322
- case 0:
323
- _context8.next = 2;
324
- return (0, _index.model)(question, sess, env);
325
-
326
- case 2:
327
- o = _context8.sent;
328
- expect(o.responseCorrect).toEqual(false);
329
-
330
- case 4:
331
- case "end":
332
- return _context8.stop();
333
- }
334
- }
335
- }, _callee8);
336
- })));
337
- };
338
-
339
- returnsCorrectness(undefined);
340
- returnsCorrectness(null);
341
- returnsCorrectness({});
342
- });
343
- describe('choicePrefix is undefined', function () {
344
- var question = {
345
- id: '1',
346
- element: 'multiple-choice',
347
- prompt: 'prompt',
348
- promptEnabled: true,
349
- choiceMode: 'radio',
350
- feedbackEnabled: true,
351
- choices: [{
352
- label: 'a',
353
- value: 'apple',
354
- correct: true,
355
- feedback: {
356
- type: 'custom',
357
- value: 'foo'
358
- }
359
- }, {
360
- label: 'b',
361
- value: 'banana',
362
- feedback: {
363
- type: 'default'
364
- }
365
- }]
366
- };
367
- beforeEach( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9() {
368
- return _regenerator["default"].wrap(function _callee9$(_context9) {
369
- while (1) {
370
- switch (_context9.prev = _context9.next) {
371
- case 0:
372
- session = {};
373
- env = {
374
- mode: 'gather'
375
- };
376
- _context9.next = 4;
377
- return (0, _index.model)(question, session, env);
378
-
379
- case 4:
380
- result = _context9.sent;
381
-
382
- case 5:
383
- case "end":
384
- return _context9.stop();
385
- }
386
- }
387
- }, _callee9);
388
- })));
389
- it('returns default letters', function () {
390
- expect(result.keyMode).toEqual('letters');
391
- });
392
- });
393
- });
394
- describe('getScore', function () {
395
- it.each(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n sessionValue | expectedDychotomous | expectedPartialScoring\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n "])), undefined, 0, 0, null, 0, 0, [], 0, 0, ['a'], 0, 0.5, ['e'], 0, 0.5, ['a', 'b'], 0, 0.5, ['a', 'c'], 0, 0.5, ['a', 'd'], 0, 0.5, ['a', 'e'], 1, 1, ['a', 'b', 'c'], 0, 0, ['a', 'b', 'd'], 0, 0, ['a', 'b', 'e'], 0, 0.5, ['a', 'b', 'c', 'd'], 0, 0, ['a', 'b', 'c', 'e'], 0, 0, ['a', 'b', 'c', 'd', 'e'], 0, 0, ['a', 'c', 'd', 'e'], 0, 0, ['a', 'd', 'e'], 0, 0.5)('session = $sessionValue; partial scoring = true => score = $expectedPartialScoring / partial scoring = false => score = $expectedDychotomous', /*#__PURE__*/function () {
396
- var _ref11 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee10(_ref10) {
397
- var sessionValue, expectedPartialScoring, expectedDychotomous, q, resultPS, resultD;
398
- return _regenerator["default"].wrap(function _callee10$(_context10) {
399
- while (1) {
400
- switch (_context10.prev = _context10.next) {
401
- case 0:
402
- sessionValue = _ref10.sessionValue, expectedPartialScoring = _ref10.expectedPartialScoring, expectedDychotomous = _ref10.expectedDychotomous;
403
- q = {
404
- choiceMode: 'checkbox',
405
- choices: [{
406
- label: 'a',
407
- value: 'a',
408
- correct: true
409
- }, {
410
- label: 'b',
411
- value: 'b'
412
- }, {
413
- label: 'c',
414
- value: 'c'
415
- }, {
416
- label: 'd',
417
- value: 'd'
418
- }, {
419
- label: 'e',
420
- value: 'e',
421
- correct: true
422
- }]
423
- };
424
- _context10.next = 4;
425
- return (0, _index.outcome)(q, {
426
- value: sessionValue
427
- }, {
428
- mode: 'evaluate '
429
- });
430
-
431
- case 4:
432
- resultPS = _context10.sent;
433
- expect(resultPS.score).toEqual(expectedPartialScoring);
434
- _context10.next = 8;
435
- return (0, _index.outcome)(_objectSpread(_objectSpread({}, q), {}, {
436
- partialScoring: false
437
- }), {
438
- value: sessionValue
439
- }, {
440
- mode: 'evaluate '
441
- });
442
-
443
- case 8:
444
- resultD = _context10.sent;
445
- expect(resultD.score).toEqual(expectedDychotomous);
446
-
447
- case 10:
448
- case "end":
449
- return _context10.stop();
450
- }
451
- }
452
- }, _callee10);
453
- }));
454
-
455
- return function (_x) {
456
- return _ref11.apply(this, arguments);
457
- };
458
- }());
459
- });
460
- describe('outcome', function () {
461
- it('returns score of 0', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee11() {
462
- var result;
463
- return _regenerator["default"].wrap(function _callee11$(_context11) {
464
- while (1) {
465
- switch (_context11.prev = _context11.next) {
466
- case 0:
467
- _context11.next = 2;
468
- return (0, _index.outcome)(question, {
469
- value: ['banana']
470
- }, {
471
- mode: 'gather'
472
- });
473
-
474
- case 2:
475
- result = _context11.sent;
476
- expect(result.score).toEqual(0);
477
-
478
- case 4:
479
- case "end":
480
- return _context11.stop();
481
- }
482
- }
483
- }, _callee11);
484
- })));
485
- it('returns score of 1', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee12() {
486
- var result;
487
- return _regenerator["default"].wrap(function _callee12$(_context12) {
488
- while (1) {
489
- switch (_context12.prev = _context12.next) {
490
- case 0:
491
- _context12.next = 2;
492
- return (0, _index.outcome)(question, {
493
- value: ['apple']
494
- }, {
495
- mode: 'gather'
496
- });
497
-
498
- case 2:
499
- result = _context12.sent;
500
- expect(result.score).toEqual(1);
501
-
502
- case 4:
503
- case "end":
504
- return _context12.stop();
505
- }
506
- }
507
- }, _callee12);
508
- })));
509
- describe('partial scoring', function () {
510
- describe('choiceMode:radio is disabled', function () {
511
- it('with defaults', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee13() {
512
- var result;
513
- return _regenerator["default"].wrap(function _callee13$(_context13) {
514
- while (1) {
515
- switch (_context13.prev = _context13.next) {
516
- case 0:
517
- _context13.next = 2;
518
- return (0, _index.outcome)(question, {}, {});
519
-
520
- case 2:
521
- result = _context13.sent;
522
- expect(result.score).toEqual(0);
523
-
524
- case 4:
525
- case "end":
526
- return _context13.stop();
527
- }
528
- }
529
- }, _callee13);
530
- })));
531
- it('with defaults and correct', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee14() {
532
- var result;
533
- return _regenerator["default"].wrap(function _callee14$(_context14) {
534
- while (1) {
535
- switch (_context14.prev = _context14.next) {
536
- case 0:
537
- _context14.next = 2;
538
- return (0, _index.outcome)(question, {
539
- value: ['apple']
540
- }, {});
541
-
542
- case 2:
543
- result = _context14.sent;
544
- expect(result.score).toEqual(1);
545
-
546
- case 4:
547
- case "end":
548
- return _context14.stop();
549
- }
550
- }
551
- }, _callee14);
552
- })));
553
- it('with env.partialScoring: true', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee15() {
554
- var result;
555
- return _regenerator["default"].wrap(function _callee15$(_context15) {
556
- while (1) {
557
- switch (_context15.prev = _context15.next) {
558
- case 0:
559
- _context15.next = 2;
560
- return (0, _index.outcome)(question, {
561
- partialScoring: true
562
- }, {});
563
-
564
- case 2:
565
- result = _context15.sent;
566
- expect(result.score).toEqual(0);
567
-
568
- case 4:
569
- case "end":
570
- return _context15.stop();
571
- }
572
- }
573
- }, _callee15);
574
- })));
575
- it('with env.partialScoring: true + config.partialScoring: true', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee16() {
576
- var result;
577
- return _regenerator["default"].wrap(function _callee16$(_context16) {
578
- while (1) {
579
- switch (_context16.prev = _context16.next) {
580
- case 0:
581
- _context16.next = 2;
582
- return (0, _index.outcome)(_objectSpread(_objectSpread({}, question), {}, {
583
- partialScoring: true
584
- }), {
585
- partialScoring: true
586
- }, {});
587
-
588
- case 2:
589
- result = _context16.sent;
590
- expect(result.score).toEqual(0);
591
-
592
- case 4:
593
- case "end":
594
- return _context16.stop();
595
- }
596
- }
597
- }, _callee16);
598
- })));
599
- });
600
- describe('checkbox', function () {
601
- beforeEach(function () {
602
- var choices = question.choices.concat({
603
- value: 'c',
604
- correct: true
605
- });
606
- question = _objectSpread(_objectSpread({}, question), {}, {
607
- choiceMode: 'checkbox',
608
- partialScoring: true,
609
- choices: choices
610
- });
611
- });
612
- it.each(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n sessionValue | expected\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n "])), undefined, 0, null, 0, [], 0, ['apple'], 0.25, ['apple', 'cherry'], 0.5, ['apple', 'banana'], 0.5, ['apple', 'banana', 'cherry'], 0.75, ['apple', 'banana', 'grapes'], 0.75, ['apple', 'banana', 'grapes', 'cherry'], 1, ['cherry', 'banana', 'grapes'], 0.75, ['apple', 'durian'], 0.25, ['apple', 'durian', 'elderberries'], 0.25, ['apple', 'durian', 'feijoa', 'elderberries', 'jackfruit'], 0, ['apple', 'durian', 'feijoa', 'elderberries', 'jackfruit', 'kiwi'], 0, ['apple', 'cherry', 'durian', 'feijoa', 'elderberries', 'jackfruit', 'kiwi'], 0, ['apple', 'cherry', 'durian', 'feijoa', 'elderberries', 'jackfruit', 'kiwi'], 0, ['apple', 'cherry', 'banana', 'durian', 'feijoa', 'elderberries', 'jackfruit', 'kiwi'], 0, ['apple', 'cherry', 'banana', 'durian', 'feijoa', 'jackfruit', 'kiwi'], 0, ['apple', 'cherry', 'banana', 'grapes', 'durian', 'jackfruit', 'kiwi'], 0.25, ['apple', 'cherry', 'banana', 'grapes', 'durian', 'jackfruit'], 0.5, ['apple', 'cherry', 'banana', 'grapes', 'durian'], 0.75)('outcome: partial scoring = true, sessionValue = $sessionValue => expected = $expected', /*#__PURE__*/function () {
613
- var _ref19 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee17(_ref18) {
614
- var sessionValue, expected, q, result;
615
- return _regenerator["default"].wrap(function _callee17$(_context17) {
616
- while (1) {
617
- switch (_context17.prev = _context17.next) {
618
- case 0:
619
- sessionValue = _ref18.sessionValue, expected = _ref18.expected;
620
- q = {
621
- choiceMode: 'checkbox',
622
- choices: [{
623
- label: 'a',
624
- value: 'apple',
625
- correct: true
626
- }, {
627
- label: 'b',
628
- value: 'banana',
629
- correct: true
630
- }, {
631
- label: 'c',
632
- value: 'cherry',
633
- correct: true
634
- }, {
635
- label: 'd',
636
- value: 'durian'
637
- }, {
638
- label: 'e',
639
- value: 'elderberries'
640
- }, {
641
- label: 'f',
642
- value: 'feijoa'
643
- }, {
644
- label: 'g',
645
- value: 'grapes',
646
- correct: true
647
- }, {
648
- label: 'j',
649
- value: 'jackfruit'
650
- }, {
651
- label: 'k',
652
- value: 'kiwi'
653
- }]
654
- };
655
- _context17.next = 4;
656
- return (0, _index.outcome)(q, {
657
- value: sessionValue
658
- }, {
659
- mode: 'evaluate '
660
- });
661
-
662
- case 4:
663
- result = _context17.sent;
664
- expect(result.score).toEqual(expected);
665
-
666
- case 6:
667
- case "end":
668
- return _context17.stop();
669
- }
670
- }
671
- }, _callee17);
672
- }));
673
-
674
- return function (_x2) {
675
- return _ref19.apply(this, arguments);
676
- };
677
- }());
678
- });
679
- });
680
- it.each(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n session | empty\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n "])), undefined, true, null, true, {}, true, {
681
- value: []
682
- }, false)('returns score: 0 and empty: true if session is $session', /*#__PURE__*/function () {
683
- var _ref21 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee18(_ref20) {
684
- var session, empty, o;
685
- return _regenerator["default"].wrap(function _callee18$(_context18) {
686
- while (1) {
687
- switch (_context18.prev = _context18.next) {
688
- case 0:
689
- session = _ref20.session, empty = _ref20.empty;
690
- _context18.next = 3;
691
- return (0, _index.outcome)(question, session, {
692
- mode: 'evaluate'
693
- });
694
-
695
- case 3:
696
- o = _context18.sent;
697
- expect(o).toEqual({
698
- score: 0,
699
- empty: empty
700
- });
701
-
702
- case 5:
703
- case "end":
704
- return _context18.stop();
705
- }
706
- }
707
- }, _callee18);
708
- }));
709
-
710
- return function (_x3) {
711
- return _ref21.apply(this, arguments);
712
- };
713
- }());
714
- });
715
- describe('correct response', function () {
716
- it('returns correct response if env is correct', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee19() {
717
- var sess;
718
- return _regenerator["default"].wrap(function _callee19$(_context19) {
719
- while (1) {
720
- switch (_context19.prev = _context19.next) {
721
- case 0:
722
- _context19.next = 2;
723
- return (0, _index.createCorrectResponseSession)(question, {
724
- mode: 'gather',
725
- role: 'instructor'
726
- });
727
-
728
- case 2:
729
- sess = _context19.sent;
730
- expect(sess).toEqual({
731
- id: '1',
732
- value: ['apple']
733
- });
734
-
735
- case 4:
736
- case "end":
737
- return _context19.stop();
738
- }
739
- }
740
- }, _callee19);
741
- })));
742
- it('returns null env is student', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee20() {
743
- var noResult;
744
- return _regenerator["default"].wrap(function _callee20$(_context20) {
745
- while (1) {
746
- switch (_context20.prev = _context20.next) {
747
- case 0:
748
- _context20.next = 2;
749
- return (0, _index.createCorrectResponseSession)(question, {
750
- mode: 'gather',
751
- role: 'student'
752
- });
753
-
754
- case 2:
755
- noResult = _context20.sent;
756
- expect(noResult).toBeNull();
757
-
758
- case 4:
759
- case "end":
760
- return _context20.stop();
761
- }
762
- }
763
- }, _callee20);
764
- })));
765
- });
766
- describe('normalize', function () {
767
- it('sets choicesLayout: horizontal if verticalMode: false', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee21() {
768
- var sess;
769
- return _regenerator["default"].wrap(function _callee21$(_context21) {
770
- while (1) {
771
- switch (_context21.prev = _context21.next) {
772
- case 0:
773
- _context21.next = 2;
774
- return (0, _index.normalize)(_objectSpread(_objectSpread({}, question), {}, {
775
- verticalMode: false
776
- }));
777
-
778
- case 2:
779
- sess = _context21.sent;
780
- expect(sess).toEqual(_objectSpread(_objectSpread(_objectSpread({}, _defaults["default"]), question), {}, {
781
- choicesLayout: 'horizontal'
782
- }));
783
-
784
- case 4:
785
- case "end":
786
- return _context21.stop();
787
- }
788
- }
789
- }, _callee21);
790
- })));
791
- it('sets choicesLayout: vertical if verticalMode: true', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee22() {
792
- var sess;
793
- return _regenerator["default"].wrap(function _callee22$(_context22) {
794
- while (1) {
795
- switch (_context22.prev = _context22.next) {
796
- case 0:
797
- _context22.next = 2;
798
- return (0, _index.normalize)(_objectSpread(_objectSpread({}, question), {}, {
799
- verticalMode: true
800
- }));
801
-
802
- case 2:
803
- sess = _context22.sent;
804
- expect(sess).toEqual(_objectSpread(_objectSpread(_objectSpread({}, _defaults["default"]), question), {}, {
805
- choicesLayout: 'vertical'
806
- }));
807
-
808
- case 4:
809
- case "end":
810
- return _context22.stop();
811
- }
812
- }
813
- }, _callee22);
814
- })));
815
- it('sets choicesLayout: grid if verticalMode: true && choicesLayout: grid', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee23() {
816
- var sess;
817
- return _regenerator["default"].wrap(function _callee23$(_context23) {
818
- while (1) {
819
- switch (_context23.prev = _context23.next) {
820
- case 0:
821
- _context23.next = 2;
822
- return (0, _index.normalize)(_objectSpread(_objectSpread({}, question), {}, {
823
- verticalMode: true,
824
- choicesLayout: 'grid'
825
- }));
826
-
827
- case 2:
828
- sess = _context23.sent;
829
- expect(sess).toEqual(_objectSpread(_objectSpread(_objectSpread({}, _defaults["default"]), question), {}, {
830
- choicesLayout: 'grid'
831
- }));
832
-
833
- case 4:
834
- case "end":
835
- return _context23.stop();
836
- }
837
- }
838
- }, _callee23);
839
- })));
840
- it('sets choicesLayout: vertical', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee24() {
841
- var sess;
842
- return _regenerator["default"].wrap(function _callee24$(_context24) {
843
- while (1) {
844
- switch (_context24.prev = _context24.next) {
845
- case 0:
846
- _context24.next = 2;
847
- return (0, _index.normalize)(question);
848
-
849
- case 2:
850
- sess = _context24.sent;
851
- expect(sess).toEqual(_objectSpread(_objectSpread(_objectSpread({}, _defaults["default"]), question), {}, {
852
- choicesLayout: 'vertical'
853
- }));
854
-
855
- case 4:
856
- case "end":
857
- return _context24.stop();
858
- }
859
- }
860
- }, _callee24);
861
- })));
862
- });
863
- });
864
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vaW5kZXgudGVzdC5qcyJdLCJuYW1lcyI6WyJqZXN0IiwibW9jayIsImlzUmVzcG9uc2VDb3JyZWN0IiwiZm4iLCJkZXNjcmliZSIsInJlc3VsdCIsInF1ZXN0aW9uIiwic2Vzc2lvbiIsImVudiIsImJlZm9yZUVhY2giLCJpZCIsImVsZW1lbnQiLCJwcm9tcHQiLCJwcm9tcHRFbmFibGVkIiwiY2hvaWNlUHJlZml4IiwiY2hvaWNlTW9kZSIsImZlZWRiYWNrRW5hYmxlZCIsImNob2ljZXMiLCJsYWJlbCIsInZhbHVlIiwiY29ycmVjdCIsImZlZWRiYWNrIiwidHlwZSIsInN0cmluZ2lmeSIsIkpTT04iLCJtb2RlIiwiaXQiLCJleHBlY3QiLCJkaXNhYmxlZCIsInRvRXF1YWwiLCJrZXlNb2RlIiwiYXJyYXlDb250YWluaW5nIiwicmF0aW9uYWxlIiwicmVzcG9uc2VDb3JyZWN0IiwidG9CZSIsInVuZGVmaW5lZCIsInVwZGF0ZVNlc3Npb24iLCJtb2NrUmVzb2x2ZWRWYWx1ZSIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwic2h1ZmZsZWRWYWx1ZXMiLCJtb2NrUmV0dXJuVmFsdWUiLCJyZXR1cm5zQ29ycmVjdG5lc3MiLCJzZXNzIiwibyIsImVhY2giLCJzZXNzaW9uVmFsdWUiLCJleHBlY3RlZFBhcnRpYWxTY29yaW5nIiwiZXhwZWN0ZWREeWNob3RvbW91cyIsInEiLCJyZXN1bHRQUyIsInNjb3JlIiwicGFydGlhbFNjb3JpbmciLCJyZXN1bHREIiwiY29uY2F0IiwiZXhwZWN0ZWQiLCJlbXB0eSIsInJvbGUiLCJub1Jlc3VsdCIsInRvQmVOdWxsIiwidmVydGljYWxNb2RlIiwiZGVmYXVsdHMiLCJjaG9pY2VzTGF5b3V0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7QUFFQUEsSUFBSSxDQUFDQyxJQUFMLENBQVUsVUFBVixFQUFzQjtBQUFBLFNBQU87QUFDM0JDLElBQUFB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O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQUExRSxHQUFGO0FBTUFuQyxJQUFBQSxFQUFFLENBQUMsOEJBQUQsNkZBQWlDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEscUJBQ2Qsc0JBQVVwQixRQUFWLENBRGM7O0FBQUE7QUFDM0JvQyxjQUFBQSxJQUQyQjtBQUdqQ2YsY0FBQUEsTUFBTSxDQUFDZSxJQUFELENBQU4sQ0FBYWIsT0FBYiwrQ0FBMEIrQixvQkFBMUIsR0FBdUN0RCxRQUF2QztBQUFpRHVELGdCQUFBQSxhQUFhLEVBQUU7QUFBaEU7O0FBSGlDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBQWpDLEdBQUY7QUFLRCxHQXhCTyxDQUFSO0FBeUJELENBcGRPLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtb2RlbCwgb3V0Y29tZSwgZ2V0U2NvcmUsIGNyZWF0ZUNvcnJlY3RSZXNwb25zZVNlc3Npb24sIG5vcm1hbGl6ZSB9IGZyb20gJy4uL2luZGV4JztcbmltcG9ydCB7IGlzUmVzcG9uc2VDb3JyZWN0IH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IGRlZmF1bHRzIGZyb20gJy4uL2RlZmF1bHRzJztcblxuamVzdC5tb2NrKCcuLi91dGlscycsICgpID0+ICh7XG4gIGlzUmVzcG9uc2VDb3JyZWN0OiBqZXN0LmZuKCksXG59KSk7XG5cbmRlc2NyaWJlKCdjb250cm9sbGVyJywgKCkgPT4ge1xuICBsZXQgcmVzdWx0LCBxdWVzdGlvbiwgc2Vzc2lvbiwgZW52O1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIHF1ZXN0aW9uID0ge1xuICAgICAgaWQ6ICcxJyxcbiAgICAgIGVsZW1lbnQ6ICdtdWx0aXBsZS1jaG9pY2UnLFxuICAgICAgcHJvbXB0OiAncHJvbXB0JyxcbiAgICAgIHByb21wdEVuYWJsZWQ6IHRydWUsXG4gICAgICBjaG9pY2VQcmVmaXg6ICdsZXR0ZXJzJyxcbiAgICAgIGNob2ljZU1vZGU6ICdyYWRpbycsXG4gICAgICBmZWVkYmFja0VuYWJsZWQ6IHRydWUsXG4gICAgICBjaG9pY2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ2EnLFxuICAgICAgICAgIHZhbHVlOiAnYXBwbGUnLFxuICAgICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgICAgZmVlZGJhY2s6IHtcbiAgICAgICAgICAgIHR5cGU6ICdjdXN0b20nLFxuICAgICAgICAgICAgdmFsdWU6ICdmb28nLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ2InLFxuICAgICAgICAgIHZhbHVlOiAnYmFuYW5hJyxcbiAgICAgICAgICBmZWVkYmFjazoge1xuICAgICAgICAgICAgdHlwZTogJ2RlZmF1bHQnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH0pO1xuXG4gIGNvbnN0IHsgc3RyaW5naWZ5IH0gPSBKU09OO1xuXG4gIGRlc2NyaWJlKCdtb2RlbCcsICgpID0+IHtcbiAgICBkZXNjcmliZSgnbW9kZTogZ2F0aGVyJywgKCkgPT4ge1xuICAgICAgYmVmb3JlRWFjaChhc3luYyAoKSA9PiB7XG4gICAgICAgIHNlc3Npb24gPSB7fTtcbiAgICAgICAgZW52ID0geyBtb2RlOiAnZ2F0aGVyJyB9O1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBtb2RlbChxdWVzdGlvbiwgc2Vzc2lvbiwgZW52KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBkaXNhYmxlZCcsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5kaXNhYmxlZCkudG9FcXVhbChmYWxzZSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JldHVybnMgbW9kZScsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5tb2RlKS50b0VxdWFsKCdnYXRoZXInKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBwcm9tcHQnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChyZXN1bHQucHJvbXB0KS50b0VxdWFsKCdwcm9tcHQnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBjaG9pY2VNb2RlJywgKCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LmNob2ljZU1vZGUpLnRvRXF1YWwoJ3JhZGlvJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JldHVybnMgY2hvaWNlUHJlZml4JywgKCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LmtleU1vZGUpLnRvRXF1YWwoJ2xldHRlcnMnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBjaG9pY2VzJywgKCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LmNob2ljZXMpLnRvRXF1YWwoXG4gICAgICAgICAgZXhwZWN0LmFycmF5Q29udGFpbmluZyhbXG4gICAgICAgICAgICB7IGxhYmVsOiAnYScsIHZhbHVlOiAnYXBwbGUnLCByYXRpb25hbGU6IG51bGwgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdiJywgdmFsdWU6ICdiYW5hbmEnLCByYXRpb25hbGU6IG51bGwgfSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnZG9lcyBub3QgcmV0dXJuIHJlc3BvbnNlQ29ycmVjdCcsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5yZXNwb25zZUNvcnJlY3QpLnRvQmUodW5kZWZpbmVkKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ21vZGVsIC0gd2l0aCB1cGRhdGVTZXNzaW9uJywgKCkgPT4ge1xuICAgICAgaXQoJ2NhbGxzIHVwZGF0ZVNlc3Npb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHNlc3Npb24gPSB7IGlkOiAnMScsIGVsZW1lbnQ6ICdtdWx0aXBsZS1jaG9pY2UnIH07XG4gICAgICAgIGVudiA9IHsgbW9kZTogJ2dhdGhlcicgfTtcbiAgICAgICAgY29uc3QgdXBkYXRlU2Vzc2lvbiA9IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSgpO1xuICAgICAgICBhd2FpdCBtb2RlbChxdWVzdGlvbiwgc2Vzc2lvbiwgZW52LCB1cGRhdGVTZXNzaW9uKTtcbiAgICAgICAgZXhwZWN0KHVwZGF0ZVNlc3Npb24pLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCcxJywgJ211bHRpcGxlLWNob2ljZScsIHtcbiAgICAgICAgICBzaHVmZmxlZFZhbHVlczogZXhwZWN0LmFycmF5Q29udGFpbmluZyhbJ2FwcGxlJywgJ2JhbmFuYSddKSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdtb2RlOiB2aWV3JywgKCkgPT4ge1xuICAgICAgYmVmb3JlRWFjaChhc3luYyAoKSA9PiB7XG4gICAgICAgIHNlc3Npb24gPSB7fTtcbiAgICAgICAgZW52ID0geyBtb2RlOiAndmlldycgfTtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgbW9kZWwocXVlc3Rpb24sIHNlc3Npb24sIGVudik7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JldHVybnMgZGlzYWJsZWQnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuZGlzYWJsZWQpLnRvRXF1YWwodHJ1ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdtb2RlOiBldmFsdWF0ZScsICgpID0+IHtcbiAgICAgIGJlZm9yZUVhY2goYXN5bmMgKCkgPT4ge1xuICAgICAgICBzZXNzaW9uID0ge307XG4gICAgICAgIGVudiA9IHsgbW9kZTogJ2V2YWx1YXRlJyB9O1xuICAgICAgICBpc1Jlc3BvbnNlQ29ycmVjdC5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBtb2RlbChxdWVzdGlvbiwgc2Vzc2lvbiwgZW52KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBjaG9pY2VzIHcvIGNvcnJlY3QnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuY2hvaWNlcykudG9FcXVhbChcbiAgICAgICAgICBleHBlY3QuYXJyYXlDb250YWluaW5nKFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdhJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdhcHBsZScsXG4gICAgICAgICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgICAgICAgIGZlZWRiYWNrOiAnZm9vJyxcbiAgICAgICAgICAgICAgcmF0aW9uYWxlOiBudWxsLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdiJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdiYW5hbmEnLFxuICAgICAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgZmVlZGJhY2s6ICdJbmNvcnJlY3QnLFxuICAgICAgICAgICAgICByYXRpb25hbGU6IG51bGwsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0pLFxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdyZXR1cm5zIGNob2ljZXMgdy8gY29ycmVjdCBldmVuIGlmIGZlZWRiYWNrRW5hYmxlZCBpcyBmYWxzZScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgbW9kZWwoXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4ucXVlc3Rpb24sXG4gICAgICAgICAgICBmZWVkYmFja0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2Vzc2lvbixcbiAgICAgICAgICBlbnYsXG4gICAgICAgICAgamVzdC5mbigpLFxuICAgICAgICApO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQuY2hvaWNlcykudG9FcXVhbChcbiAgICAgICAgICBleHBlY3QuYXJyYXlDb250YWluaW5nKFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdhJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdhcHBsZScsXG4gICAgICAgICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgICAgICAgIGZlZWRiYWNrOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHJhdGlvbmFsZTogbnVsbCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGxhYmVsOiAnYicsXG4gICAgICAgICAgICAgIHZhbHVlOiAnYmFuYW5hJyxcbiAgICAgICAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICAgICAgICAgIGZlZWRiYWNrOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHJhdGlvbmFsZTogbnVsbCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSksXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JldHVybnMgZmVlZGJhY2sgdW5kZWZpbmVkIGlmIGZlZWRiYWNrRW5hYmxlZCBpcyBmYWxzZScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgbW9kZWwoXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4ucXVlc3Rpb24sXG4gICAgICAgICAgICBmZWVkYmFja0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2Vzc2lvbixcbiAgICAgICAgICBlbnYsXG4gICAgICAgICAgamVzdC5mbigpLFxuICAgICAgICApO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQuY2hvaWNlcykudG9FcXVhbChcbiAgICAgICAgICBleHBlY3QuYXJyYXlDb250YWluaW5nKFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdhJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdhcHBsZScsXG4gICAgICAgICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgICAgICAgIGZlZWRiYWNrOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHJhdGlvbmFsZTogbnVsbCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGxhYmVsOiAnYicsXG4gICAgICAgICAgICAgIHZhbHVlOiAnYmFuYW5hJyxcbiAgICAgICAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICAgICAgICAgIGZlZWRiYWNrOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHJhdGlvbmFsZTogbnVsbCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSksXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JldHVybnMgcHJvcGVyIGZlZWRiYWNrIGlmIGZlZWRiYWNrRW5hYmxlZCBpcyB0cnVlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBtb2RlbChcbiAgICAgICAgICB7XG4gICAgICAgICAgICAuLi5xdWVzdGlvbixcbiAgICAgICAgICAgIGZlZWRiYWNrRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNlc3Npb24sXG4gICAgICAgICAgZW52LFxuICAgICAgICAgIGplc3QuZm4oKSxcbiAgICAgICAgKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0LmNob2ljZXMpLnRvRXF1YWwoXG4gICAgICAgICAgZXhwZWN0LmFycmF5Q29udGFpbmluZyhbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGxhYmVsOiAnYScsXG4gICAgICAgICAgICAgIHZhbHVlOiAnYXBwbGUnLFxuICAgICAgICAgICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgICAgICAgICBmZWVkYmFjazogJ2ZvbycsXG4gICAgICAgICAgICAgIHJhdGlvbmFsZTogbnVsbCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGxhYmVsOiAnYicsXG4gICAgICAgICAgICAgIHZhbHVlOiAnYmFuYW5hJyxcbiAgICAgICAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICAgICAgICAgIGZlZWRiYWNrOiAnSW5jb3JyZWN0JyxcbiAgICAgICAgICAgICAgcmF0aW9uYWxlOiBudWxsLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBpcyByZXNwb25zZSBjb3JyZWN0JywgKCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LnJlc3BvbnNlQ29ycmVjdCkudG9FcXVhbChmYWxzZSk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmV0dXJuc0NvcnJlY3RuZXNzID0gKHNlc3MpID0+IHtcbiAgICAgICAgaXQoYHJldHVybnMgcmVzcG9uc2VDb3JyZWN0OiBmYWxzZSBpZiBzZXNzaW9uIGlzICR7c3RyaW5naWZ5KHNlc3MpfWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBvID0gYXdhaXQgbW9kZWwocXVlc3Rpb24sIHNlc3MsIGVudik7XG5cbiAgICAgICAgICBleHBlY3Qoby5yZXNwb25zZUNvcnJlY3QpLnRvRXF1YWwoZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybnNDb3JyZWN0bmVzcyh1bmRlZmluZWQpO1xuICAgICAgcmV0dXJuc0NvcnJlY3RuZXNzKG51bGwpO1xuICAgICAgcmV0dXJuc0NvcnJlY3RuZXNzKHt9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdjaG9pY2VQcmVmaXggaXMgdW5kZWZpbmVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcXVlc3Rpb24gPSB7XG4gICAgICAgIGlkOiAnMScsXG4gICAgICAgIGVsZW1lbnQ6ICdtdWx0aXBsZS1jaG9pY2UnLFxuICAgICAgICBwcm9tcHQ6ICdwcm9tcHQnLFxuICAgICAgICBwcm9tcHRFbmFibGVkOiB0cnVlLFxuICAgICAgICBjaG9pY2VNb2RlOiAncmFkaW8nLFxuICAgICAgICBmZWVkYmFja0VuYWJsZWQ6IHRydWUsXG4gICAgICAgIGNob2ljZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBsYWJlbDogJ2EnLFxuICAgICAgICAgICAgdmFsdWU6ICdhcHBsZScsXG4gICAgICAgICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgICAgICAgZmVlZGJhY2s6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ2N1c3RvbScsXG4gICAgICAgICAgICAgIHZhbHVlOiAnZm9vJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBsYWJlbDogJ2InLFxuICAgICAgICAgICAgdmFsdWU6ICdiYW5hbmEnLFxuICAgICAgICAgICAgZmVlZGJhY2s6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ2RlZmF1bHQnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcblxuICAgICAgYmVmb3JlRWFjaChhc3luYyAoKSA9PiB7XG4gICAgICAgIHNlc3Npb24gPSB7fTtcbiAgICAgICAgZW52ID0geyBtb2RlOiAnZ2F0aGVyJyB9O1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBtb2RlbChxdWVzdGlvbiwgc2Vzc2lvbiwgZW52KTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3JldHVybnMgZGVmYXVsdCBsZXR0ZXJzJywgKCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LmtleU1vZGUpLnRvRXF1YWwoJ2xldHRlcnMnKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2V0U2NvcmUnLCAoKSA9PiB7XG4gICAgaXQuZWFjaGBcbiAgICAgIHNlc3Npb25WYWx1ZSAgICAgICAgICAgICAgICAgfCBleHBlY3RlZER5Y2hvdG9tb3VzIHwgZXhwZWN0ZWRQYXJ0aWFsU2NvcmluZ1xuICAgICAgJHt1bmRlZmluZWR9ICAgICAgICAgICAgICAgICB8ICR7MH0gICAgICAgICAgICAgICAgfCAkezB9XG4gICAgICAke251bGx9ICAgICAgICAgICAgICAgICAgICAgIHwgJHswfSAgICAgICAgICAgICAgICB8ICR7MH1cbiAgICAgICR7W119ICAgICAgICAgICAgICAgICAgICAgICAgfCAkezB9ICAgICAgICAgICAgICAgIHwgJHswfVxuICAgICAgJHtbJ2EnXX0gICAgICAgICAgICAgICAgICAgICB8ICR7MH0gICAgICAgICAgICAgICAgfCAkezAuNX1cbiAgICAgICR7WydlJ119ICAgICAgICAgICAgICAgICAgICAgfCAkezB9ICAgICAgICAgICAgICAgIHwgJHswLjV9XG4gICAgICAke1snYScsICdiJ119ICAgICAgICAgICAgICAgIHwgJHswfSAgICAgICAgICAgICAgICB8ICR7MC41fVxuICAgICAgJHtbJ2EnLCAnYyddfSAgICAgICAgICAgICAgICB8ICR7MH0gICAgICAgICAgICAgICAgfCAkezAuNX1cbiAgICAgICR7WydhJywgJ2QnXX0gICAgICAgICAgICAgICAgfCAkezB9ICAgICAgICAgICAgICAgIHwgJHswLjV9XG4gICAgICAke1snYScsICdlJ119ICAgICAgICAgICAgICAgIHwgJHsxfSAgICAgICAgICAgICAgICB8ICR7MX1cbiAgICAgICR7WydhJywgJ2InLCAnYyddfSAgICAgICAgICAgfCAkezB9ICAgICAgICAgICAgICAgIHwgJHswfVxuICAgICAgJHtbJ2EnLCAnYicsICdkJ119ICAgICAgICAgICB8ICR7MH0gICAgICAgICAgICAgICAgfCAkezB9XG4gICAgICAke1snYScsICdiJywgJ2UnXX0gICAgICAgICAgIHwgJHswfSAgICAgICAgICAgICAgICB8ICR7MC41fVxuICAgICAgJHtbJ2EnLCAnYicsICdjJywgJ2QnXX0gICAgICB8ICR7MH0gICAgICAgICAgICAgICAgfCAkezB9XG4gICAgICAke1snYScsICdiJywgJ2MnLCAnZSddfSAgICAgIHwgJHswfSAgICAgICAgICAgICAgICB8ICR7MH1cbiAgICAgICR7WydhJywgJ2InLCAnYycsICdkJywgJ2UnXX0gfCAkezB9ICAgICAgICAgICAgICAgIHwgJHswfVxuICAgICAgJHtbJ2EnLCAnYycsICdkJywgJ2UnXX0gICAgICB8ICR7MH0gICAgICAgICAgICAgICAgfCAkezB9XG4gICAgICAke1snYScsICdkJywgJ2UnXX0gICAgICAgICAgIHwgJHswfSAgICAgICAgICAgICAgICB8ICR7MC41fVxuICAgIGAoXG4gICAgICAnc2Vzc2lvbiA9ICRzZXNzaW9uVmFsdWU7IHBhcnRpYWwgc2NvcmluZyA9IHRydWUgPT4gc2NvcmUgPSAkZXhwZWN0ZWRQYXJ0aWFsU2NvcmluZyAvIHBhcnRpYWwgc2NvcmluZyA9IGZhbHNlID0+IHNjb3JlID0gJGV4cGVjdGVkRHljaG90b21vdXMnLFxuICAgICAgYXN5bmMgKHsgc2Vzc2lvblZhbHVlLCBleHBlY3RlZFBhcnRpYWxTY29yaW5nLCBleHBlY3RlZER5Y2hvdG9tb3VzIH0pID0+IHtcbiAgICAgICAgY29uc3QgcSA9IHtcbiAgICAgICAgICBjaG9pY2VNb2RlOiAnY2hlY2tib3gnLFxuICAgICAgICAgIGNob2ljZXM6IFtcbiAgICAgICAgICAgIHsgbGFiZWw6ICdhJywgdmFsdWU6ICdhJywgY29ycmVjdDogdHJ1ZSB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ2InLCB2YWx1ZTogJ2InIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnYycsIHZhbHVlOiAnYycgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdkJywgdmFsdWU6ICdkJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ2UnLCB2YWx1ZTogJ2UnLCBjb3JyZWN0OiB0cnVlIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCByZXN1bHRQUyA9IGF3YWl0IG91dGNvbWUocSwgeyB2YWx1ZTogc2Vzc2lvblZhbHVlIH0sIHsgbW9kZTogJ2V2YWx1YXRlICcgfSk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdFBTLnNjb3JlKS50b0VxdWFsKGV4cGVjdGVkUGFydGlhbFNjb3JpbmcpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdEQgPSBhd2FpdCBvdXRjb21lKHsgLi4ucSwgcGFydGlhbFNjb3Jpbmc6IGZhbHNlIH0sIHsgdmFsdWU6IHNlc3Npb25WYWx1ZSB9LCB7IG1vZGU6ICdldmFsdWF0ZSAnIH0pO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHRELnNjb3JlKS50b0VxdWFsKGV4cGVjdGVkRHljaG90b21vdXMpO1xuICAgICAgfSxcbiAgICApO1xuICB9KTtcblxuICBkZXNjcmliZSgnb3V0Y29tZScsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyBzY29yZSBvZiAwJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShxdWVzdGlvbiwgeyB2YWx1ZTogWydiYW5hbmEnXSB9LCB7IG1vZGU6ICdnYXRoZXInIH0pO1xuICAgICAgZXhwZWN0KHJlc3VsdC5zY29yZSkudG9FcXVhbCgwKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIHNjb3JlIG9mIDEnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvdXRjb21lKHF1ZXN0aW9uLCB7IHZhbHVlOiBbJ2FwcGxlJ10gfSwgeyBtb2RlOiAnZ2F0aGVyJyB9KTtcbiAgICAgIGV4cGVjdChyZXN1bHQuc2NvcmUpLnRvRXF1YWwoMSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgncGFydGlhbCBzY29yaW5nJywgKCkgPT4ge1xuICAgICAgZGVzY3JpYmUoJ2Nob2ljZU1vZGU6cmFkaW8gaXMgZGlzYWJsZWQnLCAoKSA9PiB7XG4gICAgICAgIGl0KCd3aXRoIGRlZmF1bHRzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG91dGNvbWUocXVlc3Rpb24sIHt9LCB7fSk7XG4gICAgICAgICAgZXhwZWN0KHJlc3VsdC5zY29yZSkudG9FcXVhbCgwKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCd3aXRoIGRlZmF1bHRzIGFuZCBjb3JyZWN0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG91dGNvbWUocXVlc3Rpb24sIHsgdmFsdWU6IFsnYXBwbGUnXSB9LCB7fSk7XG4gICAgICAgICAgZXhwZWN0KHJlc3VsdC5zY29yZSkudG9FcXVhbCgxKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCd3aXRoIGVudi5wYXJ0aWFsU2NvcmluZzogdHJ1ZScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvdXRjb21lKHF1ZXN0aW9uLCB7IHBhcnRpYWxTY29yaW5nOiB0cnVlIH0sIHt9KTtcbiAgICAgICAgICBleHBlY3QocmVzdWx0LnNjb3JlKS50b0VxdWFsKDApO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3dpdGggZW52LnBhcnRpYWxTY29yaW5nOiB0cnVlICsgY29uZmlnLnBhcnRpYWxTY29yaW5nOiB0cnVlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG91dGNvbWUoeyAuLi5xdWVzdGlvbiwgcGFydGlhbFNjb3Jpbmc6IHRydWUgfSwgeyBwYXJ0aWFsU2NvcmluZzogdHJ1ZSB9LCB7fSk7XG4gICAgICAgICAgZXhwZWN0KHJlc3VsdC5zY29yZSkudG9FcXVhbCgwKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ2NoZWNrYm94JywgKCkgPT4ge1xuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBjaG9pY2VzID0gcXVlc3Rpb24uY2hvaWNlcy5jb25jYXQoe1xuICAgICAgICAgICAgdmFsdWU6ICdjJyxcbiAgICAgICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcXVlc3Rpb24gPSB7XG4gICAgICAgICAgICAuLi5xdWVzdGlvbixcbiAgICAgICAgICAgIGNob2ljZU1vZGU6ICdjaGVja2JveCcsXG4gICAgICAgICAgICBwYXJ0aWFsU2NvcmluZzogdHJ1ZSxcbiAgICAgICAgICAgIGNob2ljZXMsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQuZWFjaGBcbiAgICAgICAgICBzZXNzaW9uVmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGV4cGVjdGVkXG4gICAgICAgICAgJHt1bmRlZmluZWR9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAkezB9XG4gICAgICAgICAgJHtudWxsfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAkezB9XG4gICAgICAgICAgJHtbXX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAkezB9XG4gICAgICAgICAgJHtbJ2FwcGxlJ119ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAkezAuMjV9XG4gICAgICAgICAgJHtbJ2FwcGxlJywgJ2NoZXJyeSddfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAkezAuNX1cbiAgICAgICAgICAke1snYXBwbGUnLCAnYmFuYW5hJ119ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICR7MC41fVxuICAgICAgICAgICR7WydhcHBsZScsICdiYW5hbmEnLCAnY2hlcnJ5J119ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgJHswLjc1fVxuICAgICAgICAgICR7WydhcHBsZScsICdiYW5hbmEnLCAnZ3JhcGVzJ119ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgJHswLjc1fVxuICAgICAgICAgICR7WydhcHBsZScsICdiYW5hbmEnLCAnZ3JhcGVzJywgJ2NoZXJyeSddfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgJHsxfVxuICAgICAgICAgICR7WydjaGVycnknLCAnYmFuYW5hJywgJ2dyYXBlcyddfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgJHswLjc1fVxuICAgICAgICAgICR7WydhcHBsZScsICdkdXJpYW4nXX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgJHswLjI1fVxuICAgICAgICAgICR7WydhcHBsZScsICdkdXJpYW4nLCAnZWxkZXJiZXJyaWVzJ119ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgJHswLjI1fVxuICAgICAgICAgICR7WydhcHBsZScsICdkdXJpYW4nLCAnZmVpam9hJywgJ2VsZGVyYmVycmllcycsICdqYWNrZnJ1aXQnXX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgJHswfVxuICAgICAgICAgICR7WydhcHBsZScsICdkdXJpYW4nLCAnZmVpam9hJywgJ2VsZGVyYmVycmllcycsICdqYWNrZnJ1aXQnLCAna2l3aSddfSAgICAgICAgICAgICAgICAgICAgIHwgJHswfVxuICAgICAgICAgICR7WydhcHBsZScsICdjaGVycnknLCAnZHVyaWFuJywgJ2ZlaWpvYScsICdlbGRlcmJlcnJpZXMnLCAnamFja2ZydWl0JywgJ2tpd2knXX0gICAgICAgICAgIHwgJHswfVxuICAgICAgICAgICR7WydhcHBsZScsICdjaGVycnknLCAnZHVyaWFuJywgJ2ZlaWpvYScsICdlbGRlcmJlcnJpZXMnLCAnamFja2ZydWl0JywgJ2tpd2knXX0gICAgICAgICAgIHwgJHswfVxuICAgICAgICAgICR7WydhcHBsZScsICdjaGVycnknLCAnYmFuYW5hJywgJ2R1cmlhbicsICdmZWlqb2EnLCAnZWxkZXJiZXJyaWVzJywgJ2phY2tmcnVpdCcsICdraXdpJ119IHwgJHswfVxuICAgICAgICAgICR7WydhcHBsZScsICdjaGVycnknLCAnYmFuYW5hJywgJ2R1cmlhbicsICdmZWlqb2EnLCAnamFja2ZydWl0JywgJ2tpd2knXX0gICAgICAgICAgICAgICAgIHwgJHswfVxuICAgICAgICAgICR7WydhcHBsZScsICdjaGVycnknLCAnYmFuYW5hJywgJ2dyYXBlcycsICdkdXJpYW4nLCAnamFja2ZydWl0JywgJ2tpd2knXX0gICAgICAgICAgICAgICAgIHwgJHswLjI1fVxuICAgICAgICAgICR7WydhcHBsZScsICdjaGVycnknLCAnYmFuYW5hJywgJ2dyYXBlcycsICdkdXJpYW4nLCAnamFja2ZydWl0J119ICAgICAgICAgICAgICAgICAgICAgICAgIHwgJHswLjV9XG4gICAgICAgICAgJHtbJ2FwcGxlJywgJ2NoZXJyeScsICdiYW5hbmEnLCAnZ3JhcGVzJywgJ2R1cmlhbiddfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAkezAuNzV9XG4gICAgICAgIGAoXG4gICAgICAgICAgJ291dGNvbWU6IHBhcnRpYWwgc2NvcmluZyA9IHRydWUsIHNlc3Npb25WYWx1ZSA9ICRzZXNzaW9uVmFsdWUgPT4gZXhwZWN0ZWQgPSAkZXhwZWN0ZWQnLFxuICAgICAgICAgIGFzeW5jICh7IHNlc3Npb25WYWx1ZSwgZXhwZWN0ZWQgfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcSA9IHtcbiAgICAgICAgICAgICAgY2hvaWNlTW9kZTogJ2NoZWNrYm94JyxcbiAgICAgICAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdhJywgdmFsdWU6ICdhcHBsZScsIGNvcnJlY3Q6IHRydWUgfSxcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnYicsIHZhbHVlOiAnYmFuYW5hJywgY29ycmVjdDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdjJywgdmFsdWU6ICdjaGVycnknLCBjb3JyZWN0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ2QnLCB2YWx1ZTogJ2R1cmlhbicgfSxcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnZScsIHZhbHVlOiAnZWxkZXJiZXJyaWVzJyB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdmJywgdmFsdWU6ICdmZWlqb2EnIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ2cnLCB2YWx1ZTogJ2dyYXBlcycsIGNvcnJlY3Q6IHRydWUgfSxcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnaicsIHZhbHVlOiAnamFja2ZydWl0JyB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdrJywgdmFsdWU6ICdraXdpJyB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShxLCB7IHZhbHVlOiBzZXNzaW9uVmFsdWUgfSwgeyBtb2RlOiAnZXZhbHVhdGUgJyB9KTtcbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQuc2NvcmUpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0LmVhY2hgXG4gICAgICBzZXNzaW9uICAgICAgICAgIHwgZW1wdHlcbiAgICAgICR7dW5kZWZpbmVkfSAgICAgfCAke3RydWV9XG4gICAgICAke251bGx9ICAgICAgICAgIHwgJHt0cnVlfVxuICAgICAgJHt7fX0gICAgICAgICAgICB8ICR7dHJ1ZX1cbiAgICAgICR7eyB2YWx1ZTogW10gfX0gfCAke2ZhbHNlfVxuICAgIGAoJ3JldHVybnMgc2NvcmU6IDAgYW5kIGVtcHR5OiB0cnVlIGlmIHNlc3Npb24gaXMgJHNlc3Npb24nLCBhc3luYyAoeyBzZXNzaW9uLCBlbXB0eSB9KSA9PiB7XG4gICAgICBjb25zdCBvID0gYXdhaXQgb3V0Y29tZShxdWVzdGlvbiwgc2Vzc2lvbiwgeyBtb2RlOiAnZXZhbHVhdGUnIH0pO1xuXG4gICAgICBleHBlY3QobykudG9FcXVhbCh7IHNjb3JlOiAwLCBlbXB0eSB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2NvcnJlY3QgcmVzcG9uc2UnLCAoKSA9PiB7XG4gICAgaXQoJ3JldHVybnMgY29ycmVjdCByZXNwb25zZSBpZiBlbnYgaXMgY29ycmVjdCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNlc3MgPSBhd2FpdCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uKHF1ZXN0aW9uLCB7IG1vZGU6ICdnYXRoZXInLCByb2xlOiAnaW5zdHJ1Y3RvcicgfSk7XG4gICAgICBleHBlY3Qoc2VzcykudG9FcXVhbCh7IGlkOiAnMScsIHZhbHVlOiBbJ2FwcGxlJ10gfSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBudWxsIGVudiBpcyBzdHVkZW50JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgbm9SZXN1bHQgPSBhd2FpdCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uKHF1ZXN0aW9uLCB7IG1vZGU6ICdnYXRoZXInLCByb2xlOiAnc3R1ZGVudCcgfSk7XG4gICAgICBleHBlY3Qobm9SZXN1bHQpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdub3JtYWxpemUnLCAoKSA9PiB7XG4gICAgaXQoJ3NldHMgY2hvaWNlc0xheW91dDogaG9yaXpvbnRhbCBpZiB2ZXJ0aWNhbE1vZGU6IGZhbHNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2VzcyA9IGF3YWl0IG5vcm1hbGl6ZSh7IC4uLnF1ZXN0aW9uLCB2ZXJ0aWNhbE1vZGU6IGZhbHNlIH0pO1xuXG4gICAgICBleHBlY3Qoc2VzcykudG9FcXVhbCh7IC4uLmRlZmF1bHRzLCAuLi5xdWVzdGlvbiwgY2hvaWNlc0xheW91dDogJ2hvcml6b250YWwnIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NldHMgY2hvaWNlc0xheW91dDogdmVydGljYWwgaWYgdmVydGljYWxNb2RlOiB0cnVlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2VzcyA9IGF3YWl0IG5vcm1hbGl6ZSh7IC4uLnF1ZXN0aW9uLCB2ZXJ0aWNhbE1vZGU6IHRydWUgfSk7XG5cbiAgICAgIGV4cGVjdChzZXNzKS50b0VxdWFsKHsgLi4uZGVmYXVsdHMsIC4uLnF1ZXN0aW9uLCBjaG9pY2VzTGF5b3V0OiAndmVydGljYWwnIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NldHMgY2hvaWNlc0xheW91dDogZ3JpZCBpZiB2ZXJ0aWNhbE1vZGU6IHRydWUgJiYgY2hvaWNlc0xheW91dDogZ3JpZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNlc3MgPSBhd2FpdCBub3JtYWxpemUoeyAuLi5xdWVzdGlvbiwgdmVydGljYWxNb2RlOiB0cnVlLCBjaG9pY2VzTGF5b3V0OiAnZ3JpZCcgfSk7XG5cbiAgICAgIGV4cGVjdChzZXNzKS50b0VxdWFsKHsgLi4uZGVmYXVsdHMsIC4uLnF1ZXN0aW9uLCBjaG9pY2VzTGF5b3V0OiAnZ3JpZCcgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2V0cyBjaG9pY2VzTGF5b3V0OiB2ZXJ0aWNhbCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNlc3MgPSBhd2FpdCBub3JtYWxpemUocXVlc3Rpb24pO1xuXG4gICAgICBleHBlY3Qoc2VzcykudG9FcXVhbCh7IC4uLmRlZmF1bHRzLCAuLi5xdWVzdGlvbiwgY2hvaWNlc0xheW91dDogJ3ZlcnRpY2FsJyB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==