@pie-element/hotspot 4.10.15 → 4.10.16-next.1

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