@pie-element/explicit-constructed-response 11.0.0 → 11.1.0-beta.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 (36) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/configure/CHANGELOG.md +10 -0
  3. package/configure/lib/__tests__/alternateResponses.test.js +503 -0
  4. package/configure/lib/__tests__/alternateSection.test.js +372 -0
  5. package/configure/lib/__tests__/ecr-toolbar.test.js +214 -0
  6. package/configure/lib/__tests__/main.test.js +470 -0
  7. package/configure/lib/__tests__/markupUtils.test.js +55 -0
  8. package/configure/lib/__tests__/utils.test.js +62 -0
  9. package/configure/lib/alternateResponses.js +1 -1
  10. package/configure/lib/alternateSection.js +1 -1
  11. package/configure/lib/defaults.js +1 -1
  12. package/configure/lib/ecr-toolbar.js +1 -1
  13. package/configure/lib/index.js +1 -1
  14. package/configure/lib/main.js +1 -1
  15. package/configure/lib/markupUtils.js +1 -1
  16. package/configure/lib/utils.js +1 -1
  17. package/configure/package.json +3 -3
  18. package/controller/CHANGELOG.md +10 -0
  19. package/controller/lib/__tests__/index.spec.js +30 -0
  20. package/controller/lib/__tests__/index.test.js +950 -0
  21. package/controller/lib/defaults.js +1 -1
  22. package/controller/lib/index.js +1 -1
  23. package/controller/package.json +3 -3
  24. package/docs/demo/pie.manifest.json +11 -0
  25. package/lib/__tests__/main.test.js +166 -0
  26. package/lib/index.js +1 -1
  27. package/lib/main.js +1 -1
  28. package/lib/print.js +1 -1
  29. package/module/configure.js +1 -1
  30. package/module/element.js +1 -1
  31. package/module/index.html +1 -1
  32. package/module/manifest.json +4 -4
  33. package/module/print.html +1 -1
  34. package/module/print.js +1 -1
  35. package/package.json +7 -7
  36. package/LICENSE.md +0 -5
@@ -0,0 +1,950 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _index = require("../index");
5
+ var _defaults = _interopRequireDefault(require("../defaults"));
6
+ jest.mock('@pie-lib/controller-utils', () => ({
7
+ getShuffledChoices: (choices, session, updateSession, key) => {
8
+ const currentShuffled = ((session || {}).shuffledValues || []).filter(v => v);
9
+ if (session && !currentShuffled.length && updateSession && typeof updateSession === 'function') {
10
+ updateSession();
11
+ }
12
+ return choices;
13
+ },
14
+ partialScoring: {
15
+ enabled: (config, env) => {
16
+ config = config || {};
17
+ env = env || {};
18
+ if (config.partialScoring === false) {
19
+ return false;
20
+ }
21
+ if (env.partialScoring === false) {
22
+ return false;
23
+ }
24
+ return true;
25
+ }
26
+ }
27
+ }));
28
+ const choice = (l, v) => ({
29
+ label: l,
30
+ value: v
31
+ });
32
+ const choices = {
33
+ 0: [choice('cow', '0'), choice('cattle', '1'), choice('calf', '2')],
34
+ 1: [choice('over', '0'), choice('past', '1'), choice('beyond', '2')],
35
+ 2: [choice('moon', '0')]
36
+ };
37
+ const question = {
38
+ markup: '<p>The {{0}} jumped {{1}} the {{2}}</p>',
39
+ disabled: false,
40
+ choices,
41
+ prompt: 'Complete the sentence',
42
+ note: 'The answer shown above is the most common correct answer for this item.',
43
+ language: 'english',
44
+ maxLengthPerChoiceEnabled: true,
45
+ playerSpellCheckEnabled: true,
46
+ displayType: 'block'
47
+ };
48
+ describe('controller', () => {
49
+ describe('model', () => {
50
+ let q, env;
51
+ it('output when session is defined', async () => {
52
+ const m = await (0, _index.model)(question, {
53
+ value: {
54
+ 0: 'cow',
55
+ 1: 'over',
56
+ 2: 'moon'
57
+ }
58
+ }, {
59
+ mode: 'evaluate'
60
+ });
61
+ expect(m).toEqual(expect.objectContaining({
62
+ feedback: {
63
+ 0: 'correct',
64
+ 1: 'correct',
65
+ 2: 'correct'
66
+ },
67
+ responseCorrect: true
68
+ }));
69
+ });
70
+ const returnModel = session => {
71
+ it(`output when session is ${JSON.stringify(session)}`, async () => {
72
+ const m = await (0, _index.model)(question, session, {
73
+ mode: 'evaluate'
74
+ });
75
+ expect(m).toEqual(expect.objectContaining({
76
+ feedback: {
77
+ 0: 'incorrect',
78
+ 1: 'incorrect',
79
+ 2: 'incorrect'
80
+ },
81
+ responseCorrect: false
82
+ }));
83
+ });
84
+ };
85
+ returnModel(undefined);
86
+ returnModel(null);
87
+ returnModel({});
88
+ const assertGather = (label, extra, session, expected) => {
89
+ it(`'mode: gather, ${label}'`, async () => {
90
+ q = {
91
+ ...question,
92
+ teacherInstructions: 'Teacher Instructions',
93
+ rationale: 'Rationale',
94
+ ...extra
95
+ };
96
+ env = {
97
+ mode: 'gather'
98
+ };
99
+ const result = await (0, _index.model)(q, {
100
+ id: '1',
101
+ element: 'explicit-constructed-response',
102
+ ...session
103
+ }, env);
104
+ expect(result).toEqual({
105
+ ...question,
106
+ disabled: false,
107
+ feedback: {},
108
+ responseCorrect: undefined,
109
+ maxLengthPerChoice: [10, 10, 7],
110
+ ...env,
111
+ ...expected
112
+ });
113
+ });
114
+ };
115
+ assertGather('promptEnabled, rationaleEnabled and teacherInstructionsEnabled not set', {}, {}, {
116
+ rationale: _defaults.default.rationale,
117
+ showNote: true,
118
+ teacherInstructions: _defaults.default.teacherInstructions
119
+ });
120
+ assertGather('promptEnabled, rationaleEnabled and teacherInstructionsEnabled set to false', {
121
+ promptEnabled: false,
122
+ rationaleEnabled: false,
123
+ teacherInstructionsEnabled: false,
124
+ studentInstructionsEnabled: false
125
+ }, {}, {
126
+ prompt: _defaults.default.prompt,
127
+ rationale: _defaults.default.rationale,
128
+ showNote: true,
129
+ teacherInstructions: _defaults.default.teacherInstructions
130
+ });
131
+ const assertView = (label, extra, session, expected) => {
132
+ it(`'mode: view, ${label}'`, async () => {
133
+ q = {
134
+ ...question,
135
+ teacherInstructions: 'Teacher Instructions',
136
+ rationale: 'Rationale',
137
+ ...extra
138
+ };
139
+ env = {
140
+ mode: 'view',
141
+ role: 'instructor'
142
+ };
143
+ const result = await (0, _index.model)(q, {
144
+ id: '1',
145
+ element: 'explicit-constructed-response',
146
+ ...session
147
+ }, env);
148
+ expect(result).toEqual({
149
+ ...question,
150
+ disabled: true,
151
+ feedback: {},
152
+ responseCorrect: undefined,
153
+ maxLengthPerChoice: [10, 10, 7],
154
+ ...env,
155
+ ...expected
156
+ });
157
+ });
158
+ };
159
+ assertView(' + role: instructor, promptEnabled, rationaleEnabled and teacherInstructionsEnabled set to false', {
160
+ promptEnabled: false,
161
+ rationaleEnabled: false,
162
+ teacherInstructionsEnabled: false,
163
+ studentInstructionsEnabled: false
164
+ }, {}, {
165
+ prompt: _defaults.default.prompt,
166
+ rationale: _defaults.default.rationale,
167
+ showNote: true,
168
+ teacherInstructions: _defaults.default.teacherInstructions
169
+ });
170
+ assertView(' + role: instructor, promptEnabled, rationaleEnabled and teacherInstructionsEnabled unset', {}, {}, {
171
+ teacherInstructions: 'Teacher Instructions',
172
+ showNote: true,
173
+ rationale: 'Rationale'
174
+ });
175
+ const assertViewStudent = (label, extra, session, expected) => {
176
+ it(`'mode: view, ${label}'`, async () => {
177
+ q = {
178
+ ...question,
179
+ teacherInstructions: 'Teacher Instructions',
180
+ rationale: 'Rationale',
181
+ ...extra
182
+ };
183
+ env = {
184
+ mode: 'view',
185
+ role: ' student'
186
+ };
187
+ const result = await (0, _index.model)(q, {
188
+ id: '1',
189
+ element: 'explicit-constructed-response',
190
+ ...session
191
+ }, env);
192
+ expect(result).toEqual({
193
+ ...question,
194
+ disabled: true,
195
+ feedback: {},
196
+ responseCorrect: undefined,
197
+ maxLengthPerChoice: [10, 10, 7],
198
+ ...env,
199
+ ...expected
200
+ });
201
+ });
202
+ };
203
+ assertViewStudent(' + role: student, promptEnabled, rationaleEnabled and teacherInstructionsEnabled set to false', {
204
+ promptEnabled: false,
205
+ rationaleEnabled: false,
206
+ teacherInstructionsEnabled: false,
207
+ studentInstructionsEnabled: false
208
+ }, {}, {
209
+ prompt: _defaults.default.prompt,
210
+ rationale: _defaults.default.rationale,
211
+ showNote: true,
212
+ teacherInstructions: _defaults.default.teacherInstructions
213
+ });
214
+ assertViewStudent(' + role: student, promptEnabled, rationaleEnabled and teacherInstructionsEnabled unset', {}, {}, {
215
+ rationale: _defaults.default.rationale,
216
+ showNote: true,
217
+ teacherInstructions: _defaults.default.teacherInstructions
218
+ });
219
+ const assertEvaluate = (label, extra, session, expected) => {
220
+ it(`'mode: evaluate, ${label}'`, async () => {
221
+ q = {
222
+ ...question,
223
+ teacherInstructions: 'Teacher Instructions',
224
+ rationale: 'Rationale',
225
+ ...extra
226
+ };
227
+ env = {
228
+ mode: 'evaluate',
229
+ role: 'instructor'
230
+ };
231
+ const result = await (0, _index.model)(q, {
232
+ id: '1',
233
+ element: 'explicit-constructed-response',
234
+ ...session
235
+ }, env);
236
+ expect(result).toEqual({
237
+ ...question,
238
+ teacherInstructions: 'Teacher Instructions',
239
+ rationale: 'Rationale',
240
+ disabled: true,
241
+ choices: {
242
+ 0: [{
243
+ label: 'cow',
244
+ value: '0',
245
+ correct: true
246
+ }, {
247
+ label: 'cattle',
248
+ value: '1',
249
+ correct: true
250
+ }, {
251
+ label: 'calf',
252
+ value: '2',
253
+ correct: true
254
+ }],
255
+ 1: [{
256
+ label: 'over',
257
+ value: '0',
258
+ correct: true
259
+ }, {
260
+ label: 'past',
261
+ value: '1',
262
+ correct: true
263
+ }, {
264
+ label: 'beyond',
265
+ value: '2',
266
+ correct: true
267
+ }],
268
+ 2: [{
269
+ label: 'moon',
270
+ value: '0',
271
+ correct: true
272
+ }]
273
+ },
274
+ maxLengthPerChoice: [10, 10, 7],
275
+ ...env,
276
+ ...expected
277
+ });
278
+ });
279
+ };
280
+ assertEvaluate('- correct answer', {}, {
281
+ value: {
282
+ 0: 'cow',
283
+ 1: 'over',
284
+ 2: 'moon'
285
+ }
286
+ }, {
287
+ feedback: {
288
+ 0: 'correct',
289
+ 1: 'correct',
290
+ 2: 'correct'
291
+ },
292
+ showNote: true,
293
+ responseCorrect: true
294
+ });
295
+ assertEvaluate('- partially correct answer', {}, {
296
+ value: {
297
+ 0: 'cow',
298
+ 1: 'over',
299
+ 2: 'sun'
300
+ }
301
+ }, {
302
+ feedback: {
303
+ 0: 'correct',
304
+ 1: 'correct',
305
+ 2: 'incorrect'
306
+ },
307
+ showNote: true,
308
+ responseCorrect: false
309
+ });
310
+ assertEvaluate('- partially correct answer using alternates', {}, {
311
+ value: {
312
+ 0: 'calf',
313
+ 1: 'over',
314
+ 2: 'sun'
315
+ }
316
+ }, {
317
+ feedback: {
318
+ 0: 'correct',
319
+ 1: 'correct',
320
+ 2: 'incorrect'
321
+ },
322
+ showNote: true,
323
+ responseCorrect: false
324
+ });
325
+ assertEvaluate('- incorrect answer', {}, {
326
+ value: {
327
+ 0: 'han',
328
+ 1: 'above',
329
+ 2: 'chicken'
330
+ }
331
+ }, {
332
+ feedback: {
333
+ 0: 'incorrect',
334
+ 1: 'incorrect',
335
+ 2: 'incorrect'
336
+ },
337
+ showNote: true,
338
+ responseCorrect: false
339
+ });
340
+ });
341
+ describe('get score', () => {
342
+ const assertScore = (session, expected) => {
343
+ it('return score', () => {
344
+ const score = (0, _index.getScore)(question, session);
345
+ expect(score).toEqual(expected);
346
+ });
347
+ };
348
+ assertScore({
349
+ value: {
350
+ 0: 'cow',
351
+ 1: 'over',
352
+ 2: 'moon'
353
+ }
354
+ }, 1);
355
+ assertScore({
356
+ value: {
357
+ 0: 'cattle',
358
+ 1: 'over',
359
+ 2: 'moon'
360
+ }
361
+ }, 1);
362
+ assertScore({
363
+ value: {
364
+ 0: 'calf',
365
+ 1: 'over',
366
+ 2: 'moon'
367
+ }
368
+ }, 1);
369
+ assertScore({
370
+ value: {
371
+ 0: 'cow',
372
+ 1: 'past',
373
+ 2: 'moon'
374
+ }
375
+ }, 1);
376
+ assertScore({
377
+ value: {
378
+ 0: 'cattle',
379
+ 1: 'past',
380
+ 2: 'moon'
381
+ }
382
+ }, 1);
383
+ assertScore({
384
+ value: {
385
+ 0: 'calf',
386
+ 1: 'past',
387
+ 2: 'moon'
388
+ }
389
+ }, 1);
390
+ assertScore({
391
+ value: {
392
+ 0: 'cow',
393
+ 1: 'beyond',
394
+ 2: 'moon'
395
+ }
396
+ }, 1);
397
+ assertScore({
398
+ value: {
399
+ 0: 'cattle',
400
+ 1: 'beyond',
401
+ 2: 'moon'
402
+ }
403
+ }, 1);
404
+ assertScore({
405
+ value: {
406
+ 0: 'calf',
407
+ 1: 'beyond',
408
+ 2: 'moon'
409
+ }
410
+ }, 1);
411
+ assertScore({
412
+ value: {
413
+ 0: 'calf',
414
+ 1: 'under',
415
+ 2: 'moon'
416
+ }
417
+ }, 0.67);
418
+ assertScore({
419
+ value: {
420
+ 0: 'cat',
421
+ 1: 'under',
422
+ 2: 'moon'
423
+ }
424
+ }, 0.33);
425
+ assertScore({
426
+ value: {
427
+ 0: 'cat',
428
+ 1: 'under',
429
+ 2: 'sun'
430
+ }
431
+ }, 0);
432
+ const returnScore = session => {
433
+ it(`score = 0 when session is ${JSON.stringify(session)}`, () => {
434
+ expect((0, _index.getScore)(question, session)).toEqual(0);
435
+ });
436
+ };
437
+ returnScore(undefined);
438
+ returnScore(null);
439
+ returnScore({});
440
+ });
441
+ describe('outcome partialScoring test', () => {
442
+ const assertOutcome = (message, extra, sessionValue, env, expected) => {
443
+ it(message, async () => {
444
+ const result = await (0, _index.outcome)({
445
+ ...question,
446
+ ...extra
447
+ }, sessionValue, env);
448
+ expect(result).toEqual(expect.objectContaining(expected));
449
+ });
450
+ };
451
+ assertOutcome('element.partialScoring = true', {
452
+ partialScoring: true
453
+ }, {
454
+ value: {
455
+ 0: 'calf',
456
+ 1: 'under',
457
+ 2: 'moon'
458
+ }
459
+ }, {
460
+ mode: 'evaluate'
461
+ }, {
462
+ score: 0.67
463
+ });
464
+ assertOutcome('element.partialScoring = false', {
465
+ partialScoring: false
466
+ }, {
467
+ value: {
468
+ 0: 'calf',
469
+ 1: 'under',
470
+ 2: 'moon'
471
+ }
472
+ }, {
473
+ mode: 'evaluate'
474
+ }, {
475
+ score: 0
476
+ });
477
+ assertOutcome('element.partialScoring = false, env.partialScoring = true', {
478
+ partialScoring: false
479
+ }, {
480
+ value: {
481
+ 0: 'calf',
482
+ 1: 'under',
483
+ 2: 'moon'
484
+ }
485
+ }, {
486
+ mode: 'evaluate',
487
+ partialScoring: true
488
+ }, {
489
+ score: 0
490
+ });
491
+ assertOutcome('element.partialScoring = true, env.partialScoring = false', {
492
+ partialScoring: true
493
+ }, {
494
+ value: {
495
+ 0: 'calf',
496
+ 1: 'under',
497
+ 2: 'moon'
498
+ }
499
+ }, {
500
+ mode: 'evaluate',
501
+ partialScoring: false
502
+ }, {
503
+ score: 0
504
+ });
505
+ });
506
+ describe('outcome', () => {
507
+ const assertOutcome = (partialScoring, sessionValue, expected) => {
508
+ it(`partial score ${partialScoring ? 'enabled' : ''}`, async () => {
509
+ const result = await (0, _index.outcome)({
510
+ ...question,
511
+ partialScoring
512
+ }, sessionValue);
513
+ expect(result).toEqual(expect.objectContaining(expected));
514
+ });
515
+ };
516
+ assertOutcome(true, {
517
+ value: {
518
+ 0: 'cow',
519
+ 1: 'over',
520
+ 2: 'moon'
521
+ }
522
+ }, {
523
+ score: 1,
524
+ empty: false
525
+ });
526
+ assertOutcome(true, {
527
+ value: {
528
+ 0: 'cattle',
529
+ 1: 'over',
530
+ 2: 'moon'
531
+ }
532
+ }, {
533
+ score: 1,
534
+ empty: false
535
+ });
536
+ assertOutcome(true, {
537
+ value: {
538
+ 0: 'calf',
539
+ 1: 'over',
540
+ 2: 'moon'
541
+ }
542
+ }, {
543
+ score: 1,
544
+ empty: false
545
+ });
546
+ assertOutcome(true, {
547
+ value: {
548
+ 0: 'cow',
549
+ 1: 'past',
550
+ 2: 'moon'
551
+ }
552
+ }, {
553
+ score: 1,
554
+ empty: false
555
+ });
556
+ assertOutcome(true, {
557
+ value: {
558
+ 0: 'cattle',
559
+ 1: 'past',
560
+ 2: 'moon'
561
+ }
562
+ }, {
563
+ score: 1,
564
+ empty: false
565
+ });
566
+ assertOutcome(true, {
567
+ value: {
568
+ 0: 'calf',
569
+ 1: 'past',
570
+ 2: 'moon'
571
+ }
572
+ }, {
573
+ score: 1,
574
+ empty: false
575
+ });
576
+ assertOutcome(true, {
577
+ value: {
578
+ 0: 'cow',
579
+ 1: 'beyond',
580
+ 2: 'moon'
581
+ }
582
+ }, {
583
+ score: 1,
584
+ empty: false
585
+ });
586
+ assertOutcome(true, {
587
+ value: {
588
+ 0: 'cattle',
589
+ 1: 'beyond',
590
+ 2: 'moon'
591
+ }
592
+ }, {
593
+ score: 1,
594
+ empty: false
595
+ });
596
+ assertOutcome(true, {
597
+ value: {
598
+ 0: 'calf',
599
+ 1: 'beyond',
600
+ 2: 'moon'
601
+ }
602
+ }, {
603
+ score: 1,
604
+ empty: false
605
+ });
606
+ assertOutcome(true, {
607
+ value: {
608
+ 0: 'calf',
609
+ 1: 'under',
610
+ 2: 'moon'
611
+ }
612
+ }, {
613
+ score: 0.67,
614
+ empty: false
615
+ });
616
+ assertOutcome(true, {
617
+ value: {
618
+ 0: 'cat',
619
+ 1: 'under',
620
+ 2: 'moon'
621
+ }
622
+ }, {
623
+ score: 0.33,
624
+ empty: false
625
+ });
626
+ assertOutcome(true, {
627
+ value: {
628
+ 0: 'cat',
629
+ 1: 'under',
630
+ 2: 'sun'
631
+ }
632
+ }, {
633
+ score: 0,
634
+ empty: false
635
+ });
636
+ assertOutcome(false, {
637
+ value: {
638
+ 0: 'cow',
639
+ 1: 'over',
640
+ 2: 'moon'
641
+ }
642
+ }, {
643
+ score: 1,
644
+ empty: false
645
+ });
646
+ assertOutcome(false, {
647
+ value: {
648
+ 0: 'cattle',
649
+ 1: 'over',
650
+ 2: 'moon'
651
+ }
652
+ }, {
653
+ score: 1,
654
+ empty: false
655
+ });
656
+ assertOutcome(false, {
657
+ value: {
658
+ 0: 'calf',
659
+ 1: 'over',
660
+ 2: 'moon'
661
+ }
662
+ }, {
663
+ score: 1,
664
+ empty: false
665
+ });
666
+ assertOutcome(false, {
667
+ value: {
668
+ 0: 'cow',
669
+ 1: 'past',
670
+ 2: 'moon'
671
+ }
672
+ }, {
673
+ score: 1,
674
+ empty: false
675
+ });
676
+ assertOutcome(false, {
677
+ value: {
678
+ 0: 'cattle',
679
+ 1: 'past',
680
+ 2: 'moon'
681
+ }
682
+ }, {
683
+ score: 1,
684
+ empty: false
685
+ });
686
+ assertOutcome(false, {
687
+ value: {
688
+ 0: 'calf',
689
+ 1: 'past',
690
+ 2: 'moon'
691
+ }
692
+ }, {
693
+ score: 1,
694
+ empty: false
695
+ });
696
+ assertOutcome(false, {
697
+ value: {
698
+ 0: 'cow',
699
+ 1: 'beyond',
700
+ 2: 'moon'
701
+ }
702
+ }, {
703
+ score: 1,
704
+ empty: false
705
+ });
706
+ assertOutcome(false, {
707
+ value: {
708
+ 0: 'cattle',
709
+ 1: 'beyond',
710
+ 2: 'moon'
711
+ }
712
+ }, {
713
+ score: 1,
714
+ empty: false
715
+ });
716
+ assertOutcome(false, {
717
+ value: {
718
+ 0: 'calf',
719
+ 1: 'beyond',
720
+ 2: 'moon'
721
+ }
722
+ }, {
723
+ score: 1,
724
+ empty: false
725
+ });
726
+ assertOutcome(false, {
727
+ value: {
728
+ 0: 'calf',
729
+ 1: 'under',
730
+ 2: 'moon'
731
+ }
732
+ }, {
733
+ score: 0,
734
+ empty: false
735
+ });
736
+ assertOutcome(false, {
737
+ value: {
738
+ 0: 'cat',
739
+ 1: 'under',
740
+ 2: 'moon'
741
+ }
742
+ }, {
743
+ score: 0,
744
+ empty: false
745
+ });
746
+ assertOutcome(false, {
747
+ value: {
748
+ 0: 'cat',
749
+ 1: 'under',
750
+ 2: 'sun'
751
+ }
752
+ }, {
753
+ score: 0,
754
+ empty: false
755
+ });
756
+ const returnModel = session => {
757
+ it(`empty: true when session is ${JSON.stringify(session)}`, async () => {
758
+ const m = await (0, _index.outcome)(question, session);
759
+ expect(m).toEqual({
760
+ score: 0,
761
+ empty: true,
762
+ traceLog: ['Student did not fill any response areas. Score: 0.']
763
+ });
764
+ });
765
+ };
766
+ returnModel(undefined);
767
+ returnModel(null);
768
+ returnModel({});
769
+ });
770
+ describe('prepareVal', () => {
771
+ it('should return empty string on null or undefined', () => {
772
+ expect((0, _index.prepareVal)(null)).toEqual('');
773
+ expect((0, _index.prepareVal)(undefined)).toEqual('');
774
+ });
775
+ it('should remove html tags', () => {
776
+ expect((0, _index.prepareVal)('<div>Foo Bar</div>')).toEqual('Foo Bar');
777
+ });
778
+ describe('correct response', () => {
779
+ let question;
780
+ beforeEach(() => {
781
+ question = {
782
+ choices
783
+ };
784
+ });
785
+ it('returns correct response if env is correct', async () => {
786
+ const sess = await (0, _index.createCorrectResponseSession)(question, {
787
+ mode: 'gather',
788
+ role: 'instructor'
789
+ });
790
+ expect(sess).toEqual({
791
+ id: '1',
792
+ value: {
793
+ 0: 'cow',
794
+ 1: 'over',
795
+ 2: 'moon'
796
+ }
797
+ });
798
+ });
799
+ it('returns null env is student', async () => {
800
+ const noResult = await (0, _index.createCorrectResponseSession)(question, {
801
+ mode: 'gather',
802
+ role: 'student'
803
+ });
804
+ expect(noResult).toBeNull();
805
+ });
806
+ });
807
+ });
808
+ describe('correct response', () => {
809
+ it('returns correct response if role is instructor and mode is gather', async () => {
810
+ const sess = await (0, _index.createCorrectResponseSession)(question, {
811
+ mode: 'gather',
812
+ role: 'instructor'
813
+ });
814
+ expect(sess).toEqual({
815
+ id: '1',
816
+ value: {
817
+ 0: 'cow',
818
+ 1: 'over',
819
+ 2: 'moon'
820
+ }
821
+ });
822
+ });
823
+ it('returns correct response if role is instructor and mode is view', async () => {
824
+ const sess = await (0, _index.createCorrectResponseSession)(question, {
825
+ mode: 'view',
826
+ role: 'instructor'
827
+ });
828
+ expect(sess).toEqual({
829
+ id: '1',
830
+ value: {
831
+ 0: 'cow',
832
+ 1: 'over',
833
+ 2: 'moon'
834
+ }
835
+ });
836
+ });
837
+ it('returns null if mode is evaluate', async () => {
838
+ const noResult = await (0, _index.createCorrectResponseSession)(question, {
839
+ mode: 'evaluate',
840
+ role: 'instructor'
841
+ });
842
+ expect(noResult).toBeNull();
843
+ });
844
+ it('returns null if role is student', async () => {
845
+ const noResult = await (0, _index.createCorrectResponseSession)(question, {
846
+ mode: 'gather',
847
+ role: 'student'
848
+ });
849
+ expect(noResult).toBeNull();
850
+ });
851
+ });
852
+ describe('prepareChoice', () => {
853
+ const assertPrepareChoice = (env, defaultFeedback, choice, expected) => {
854
+ const preparChoiceFn = (0, _index.prepareChoice)(env.mode, defaultFeedback);
855
+ it(`prepare choices in ${env.mode} mode: ${JSON.stringify(choice)} -> ${JSON.stringify(expected)}`, () => {
856
+ expect(preparChoiceFn(choice)).toEqual(expected);
857
+ });
858
+ };
859
+ assertPrepareChoice({
860
+ mode: 'gather'
861
+ }, {
862
+ correct: 'Correct',
863
+ incorrect: 'Incorrect'
864
+ }, {
865
+ value: '0',
866
+ label: 'cow'
867
+ }, {
868
+ value: '0',
869
+ label: 'cow'
870
+ });
871
+ assertPrepareChoice({
872
+ mode: 'view'
873
+ }, {
874
+ correct: 'Correct',
875
+ incorrect: 'Incorrect'
876
+ }, {
877
+ value: '0',
878
+ label: 'cow'
879
+ }, {
880
+ value: '0',
881
+ label: 'cow'
882
+ });
883
+ assertPrepareChoice({
884
+ mode: 'evaluate'
885
+ }, {
886
+ correct: 'Correct',
887
+ incorrect: 'Incorrect'
888
+ }, {
889
+ value: '0',
890
+ label: 'cow'
891
+ }, {
892
+ value: '0',
893
+ label: 'cow',
894
+ correct: true
895
+ });
896
+ assertPrepareChoice({
897
+ mode: 'evaluate'
898
+ }, {
899
+ correct: 'Correct',
900
+ incorrect: 'Incorrect'
901
+ }, {
902
+ value: '0',
903
+ label: 'cow',
904
+ feedback: {
905
+ type: 'default'
906
+ }
907
+ }, {
908
+ value: '0',
909
+ label: 'cow',
910
+ correct: true,
911
+ feedback: 'Correct'
912
+ });
913
+ assertPrepareChoice({
914
+ mode: 'evaluate'
915
+ }, {
916
+ correct: 'Correct',
917
+ incorrect: 'Incorrect'
918
+ }, {
919
+ value: '0',
920
+ label: 'cow',
921
+ feedback: {
922
+ type: 'custom'
923
+ }
924
+ }, {
925
+ value: '0',
926
+ label: 'cow',
927
+ correct: true,
928
+ feedback: undefined
929
+ });
930
+ assertPrepareChoice({
931
+ mode: 'evaluate'
932
+ }, {
933
+ correct: 'Correct',
934
+ incorrect: 'Incorrect'
935
+ }, {
936
+ value: '0',
937
+ label: 'cow',
938
+ feedback: {
939
+ type: 'custom',
940
+ value: 'Custom Feedback'
941
+ }
942
+ }, {
943
+ value: '0',
944
+ label: 'cow',
945
+ correct: true,
946
+ feedback: 'Custom Feedback'
947
+ });
948
+ });
949
+ });
950
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfaW5kZXgiLCJyZXF1aXJlIiwiX2RlZmF1bHRzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsImplc3QiLCJtb2NrIiwiZ2V0U2h1ZmZsZWRDaG9pY2VzIiwiY2hvaWNlcyIsInNlc3Npb24iLCJ1cGRhdGVTZXNzaW9uIiwia2V5IiwiY3VycmVudFNodWZmbGVkIiwic2h1ZmZsZWRWYWx1ZXMiLCJmaWx0ZXIiLCJ2IiwibGVuZ3RoIiwicGFydGlhbFNjb3JpbmciLCJlbmFibGVkIiwiY29uZmlnIiwiZW52IiwiY2hvaWNlIiwibCIsImxhYmVsIiwidmFsdWUiLCJxdWVzdGlvbiIsIm1hcmt1cCIsImRpc2FibGVkIiwicHJvbXB0Iiwibm90ZSIsImxhbmd1YWdlIiwibWF4TGVuZ3RoUGVyQ2hvaWNlRW5hYmxlZCIsInBsYXllclNwZWxsQ2hlY2tFbmFibGVkIiwiZGlzcGxheVR5cGUiLCJkZXNjcmliZSIsInEiLCJpdCIsIm0iLCJtb2RlbCIsIm1vZGUiLCJleHBlY3QiLCJ0b0VxdWFsIiwib2JqZWN0Q29udGFpbmluZyIsImZlZWRiYWNrIiwicmVzcG9uc2VDb3JyZWN0IiwicmV0dXJuTW9kZWwiLCJKU09OIiwic3RyaW5naWZ5IiwidW5kZWZpbmVkIiwiYXNzZXJ0R2F0aGVyIiwiZXh0cmEiLCJleHBlY3RlZCIsInRlYWNoZXJJbnN0cnVjdGlvbnMiLCJyYXRpb25hbGUiLCJyZXN1bHQiLCJpZCIsImVsZW1lbnQiLCJtYXhMZW5ndGhQZXJDaG9pY2UiLCJkZWZhdWx0cyIsInNob3dOb3RlIiwicHJvbXB0RW5hYmxlZCIsInJhdGlvbmFsZUVuYWJsZWQiLCJ0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZCIsInN0dWRlbnRJbnN0cnVjdGlvbnNFbmFibGVkIiwiYXNzZXJ0VmlldyIsInJvbGUiLCJhc3NlcnRWaWV3U3R1ZGVudCIsImFzc2VydEV2YWx1YXRlIiwiY29ycmVjdCIsImFzc2VydFNjb3JlIiwic2NvcmUiLCJnZXRTY29yZSIsInJldHVyblNjb3JlIiwiYXNzZXJ0T3V0Y29tZSIsIm1lc3NhZ2UiLCJzZXNzaW9uVmFsdWUiLCJvdXRjb21lIiwiZW1wdHkiLCJ0cmFjZUxvZyIsInByZXBhcmVWYWwiLCJiZWZvcmVFYWNoIiwic2VzcyIsImNyZWF0ZUNvcnJlY3RSZXNwb25zZVNlc3Npb24iLCJub1Jlc3VsdCIsInRvQmVOdWxsIiwiYXNzZXJ0UHJlcGFyZUNob2ljZSIsImRlZmF1bHRGZWVkYmFjayIsInByZXBhckNob2ljZUZuIiwicHJlcGFyZUNob2ljZSIsImluY29ycmVjdCIsInR5cGUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL2luZGV4LnRlc3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbW9kZWwsIGdldFNjb3JlLCBvdXRjb21lLCBwcmVwYXJlVmFsLCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uLCBwcmVwYXJlQ2hvaWNlIH0gZnJvbSAnLi4vaW5kZXgnO1xuXG5pbXBvcnQgZGVmYXVsdHMgZnJvbSAnLi4vZGVmYXVsdHMnO1xuXG5qZXN0Lm1vY2soJ0BwaWUtbGliL2NvbnRyb2xsZXItdXRpbHMnLCAoKSA9PiAoe1xuICBnZXRTaHVmZmxlZENob2ljZXM6IChjaG9pY2VzLCBzZXNzaW9uLCB1cGRhdGVTZXNzaW9uLCBrZXkpID0+IHtcbiAgICBjb25zdCBjdXJyZW50U2h1ZmZsZWQgPSAoKHNlc3Npb24gfHwge30pLnNodWZmbGVkVmFsdWVzIHx8IFtdKS5maWx0ZXIoKHYpID0+IHYpO1xuXG4gICAgaWYgKHNlc3Npb24gJiYgIWN1cnJlbnRTaHVmZmxlZC5sZW5ndGggJiYgdXBkYXRlU2Vzc2lvbiAmJiB0eXBlb2YgdXBkYXRlU2Vzc2lvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdXBkYXRlU2Vzc2lvbigpO1xuICAgIH1cblxuICAgIHJldHVybiBjaG9pY2VzO1xuICB9LFxuICBwYXJ0aWFsU2NvcmluZzoge1xuICAgIGVuYWJsZWQ6IChjb25maWcsIGVudikgPT4ge1xuICAgICAgY29uZmlnID0gY29uZmlnIHx8IHt9O1xuICAgICAgZW52ID0gZW52IHx8IHt9O1xuXG4gICAgICBpZiAoY29uZmlnLnBhcnRpYWxTY29yaW5nID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbnYucGFydGlhbFNjb3JpbmcgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgfSxcbn0pKTtcblxuY29uc3QgY2hvaWNlID0gKGwsIHYpID0+ICh7IGxhYmVsOiBsLCB2YWx1ZTogdiB9KTtcbmNvbnN0IGNob2ljZXMgPSB7XG4gIDA6IFtjaG9pY2UoJ2NvdycsICcwJyksIGNob2ljZSgnY2F0dGxlJywgJzEnKSwgY2hvaWNlKCdjYWxmJywgJzInKV0sXG4gIDE6IFtjaG9pY2UoJ292ZXInLCAnMCcpLCBjaG9pY2UoJ3Bhc3QnLCAnMScpLCBjaG9pY2UoJ2JleW9uZCcsICcyJyldLFxuICAyOiBbY2hvaWNlKCdtb29uJywgJzAnKV0sXG59O1xuXG5jb25zdCBxdWVzdGlvbiA9IHtcbiAgbWFya3VwOiAnPHA+VGhlIHt7MH19IGp1bXBlZCB7ezF9fSB0aGUge3syfX08L3A+JyxcbiAgZGlzYWJsZWQ6IGZhbHNlLFxuICBjaG9pY2VzLFxuICBwcm9tcHQ6ICdDb21wbGV0ZSB0aGUgc2VudGVuY2UnLFxuICBub3RlOiAnVGhlIGFuc3dlciBzaG93biBhYm92ZSBpcyB0aGUgbW9zdCBjb21tb24gY29ycmVjdCBhbnN3ZXIgZm9yIHRoaXMgaXRlbS4nLFxuICBsYW5ndWFnZTogJ2VuZ2xpc2gnLFxuICBtYXhMZW5ndGhQZXJDaG9pY2VFbmFibGVkOiB0cnVlLFxuICBwbGF5ZXJTcGVsbENoZWNrRW5hYmxlZDogdHJ1ZSxcbiAgZGlzcGxheVR5cGU6ICdibG9jaycsXG59O1xuXG5kZXNjcmliZSgnY29udHJvbGxlcicsICgpID0+IHtcbiAgZGVzY3JpYmUoJ21vZGVsJywgKCkgPT4ge1xuICAgIGxldCBxLCBlbnY7XG5cbiAgICBpdCgnb3V0cHV0IHdoZW4gc2Vzc2lvbiBpcyBkZWZpbmVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgbSA9IGF3YWl0IG1vZGVsKHF1ZXN0aW9uLCB7IHZhbHVlOiB7IDA6ICdjb3cnLCAxOiAnb3ZlcicsIDI6ICdtb29uJyB9IH0sIHsgbW9kZTogJ2V2YWx1YXRlJyB9KTtcblxuICAgICAgZXhwZWN0KG0pLnRvRXF1YWwoXG4gICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICBmZWVkYmFjazogeyAwOiAnY29ycmVjdCcsIDE6ICdjb3JyZWN0JywgMjogJ2NvcnJlY3QnIH0sXG4gICAgICAgICAgcmVzcG9uc2VDb3JyZWN0OiB0cnVlLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBjb25zdCByZXR1cm5Nb2RlbCA9IChzZXNzaW9uKSA9PiB7XG4gICAgICBpdChgb3V0cHV0IHdoZW4gc2Vzc2lvbiBpcyAke0pTT04uc3RyaW5naWZ5KHNlc3Npb24pfWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgbSA9IGF3YWl0IG1vZGVsKHF1ZXN0aW9uLCBzZXNzaW9uLCB7IG1vZGU6ICdldmFsdWF0ZScgfSk7XG5cbiAgICAgICAgZXhwZWN0KG0pLnRvRXF1YWwoXG4gICAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgZmVlZGJhY2s6IHsgMDogJ2luY29ycmVjdCcsIDE6ICdpbmNvcnJlY3QnLCAyOiAnaW5jb3JyZWN0JyB9LFxuICAgICAgICAgICAgcmVzcG9uc2VDb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm5Nb2RlbCh1bmRlZmluZWQpO1xuICAgIHJldHVybk1vZGVsKG51bGwpO1xuICAgIHJldHVybk1vZGVsKHt9KTtcblxuICAgIGNvbnN0IGFzc2VydEdhdGhlciA9IChsYWJlbCwgZXh0cmEsIHNlc3Npb24sIGV4cGVjdGVkKSA9PiB7XG4gICAgICBpdChgJ21vZGU6IGdhdGhlciwgJHtsYWJlbH0nYCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBxID0ge1xuICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6ICdUZWFjaGVyIEluc3RydWN0aW9ucycsXG4gICAgICAgICAgcmF0aW9uYWxlOiAnUmF0aW9uYWxlJyxcbiAgICAgICAgICAuLi5leHRyYSxcbiAgICAgICAgfTtcbiAgICAgICAgZW52ID0geyBtb2RlOiAnZ2F0aGVyJyB9O1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1vZGVsKFxuICAgICAgICAgIHEsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICcxJyxcbiAgICAgICAgICAgIGVsZW1lbnQ6ICdleHBsaWNpdC1jb25zdHJ1Y3RlZC1yZXNwb25zZScsXG4gICAgICAgICAgICAuLi5zZXNzaW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZW52LFxuICAgICAgICApO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoe1xuICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgICBmZWVkYmFjazoge30sXG4gICAgICAgICAgcmVzcG9uc2VDb3JyZWN0OiB1bmRlZmluZWQsXG4gICAgICAgICAgbWF4TGVuZ3RoUGVyQ2hvaWNlOiBbMTAsIDEwLCA3XSxcbiAgICAgICAgICAuLi5lbnYsXG4gICAgICAgICAgLi4uZXhwZWN0ZWQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGFzc2VydEdhdGhlcihcbiAgICAgICdwcm9tcHRFbmFibGVkLCByYXRpb25hbGVFbmFibGVkIGFuZCB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZCBub3Qgc2V0JyxcbiAgICAgIHt9LFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIHJhdGlvbmFsZTogZGVmYXVsdHMucmF0aW9uYWxlLFxuICAgICAgICBzaG93Tm90ZTogdHJ1ZSxcbiAgICAgICAgdGVhY2hlckluc3RydWN0aW9uczogZGVmYXVsdHMudGVhY2hlckluc3RydWN0aW9ucyxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGFzc2VydEdhdGhlcihcbiAgICAgICdwcm9tcHRFbmFibGVkLCByYXRpb25hbGVFbmFibGVkIGFuZCB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZCBzZXQgdG8gZmFsc2UnLFxuICAgICAge1xuICAgICAgICBwcm9tcHRFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgcmF0aW9uYWxlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgc3R1ZGVudEluc3RydWN0aW9uc0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBwcm9tcHQ6IGRlZmF1bHRzLnByb21wdCxcbiAgICAgICAgcmF0aW9uYWxlOiBkZWZhdWx0cy5yYXRpb25hbGUsXG4gICAgICAgIHNob3dOb3RlOiB0cnVlLFxuICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiBkZWZhdWx0cy50ZWFjaGVySW5zdHJ1Y3Rpb25zLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgY29uc3QgYXNzZXJ0VmlldyA9IChsYWJlbCwgZXh0cmEsIHNlc3Npb24sIGV4cGVjdGVkKSA9PiB7XG4gICAgICBpdChgJ21vZGU6IHZpZXcsICR7bGFiZWx9J2AsIGFzeW5jICgpID0+IHtcbiAgICAgICAgcSA9IHtcbiAgICAgICAgICAuLi5xdWVzdGlvbixcbiAgICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiAnVGVhY2hlciBJbnN0cnVjdGlvbnMnLFxuICAgICAgICAgIHJhdGlvbmFsZTogJ1JhdGlvbmFsZScsXG4gICAgICAgICAgLi4uZXh0cmEsXG4gICAgICAgIH07XG4gICAgICAgIGVudiA9IHsgbW9kZTogJ3ZpZXcnLCByb2xlOiAnaW5zdHJ1Y3RvcicgfTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBtb2RlbChcbiAgICAgICAgICBxLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAnMScsXG4gICAgICAgICAgICBlbGVtZW50OiAnZXhwbGljaXQtY29uc3RydWN0ZWQtcmVzcG9uc2UnLFxuICAgICAgICAgICAgLi4uc2Vzc2lvbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVudixcbiAgICAgICAgKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKHtcbiAgICAgICAgICAuLi5xdWVzdGlvbixcbiAgICAgICAgICBkaXNhYmxlZDogdHJ1ZSxcbiAgICAgICAgICBmZWVkYmFjazoge30sXG4gICAgICAgICAgcmVzcG9uc2VDb3JyZWN0OiB1bmRlZmluZWQsXG4gICAgICAgICAgbWF4TGVuZ3RoUGVyQ2hvaWNlOiBbMTAsIDEwLCA3XSxcbiAgICAgICAgICAuLi5lbnYsXG4gICAgICAgICAgLi4uZXhwZWN0ZWQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGFzc2VydFZpZXcoXG4gICAgICAnICsgcm9sZTogaW5zdHJ1Y3RvciwgcHJvbXB0RW5hYmxlZCwgcmF0aW9uYWxlRW5hYmxlZCBhbmQgdGVhY2hlckluc3RydWN0aW9uc0VuYWJsZWQgc2V0IHRvIGZhbHNlJyxcbiAgICAgIHtcbiAgICAgICAgcHJvbXB0RW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHJhdGlvbmFsZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHN0dWRlbnRJbnN0cnVjdGlvbnNFbmFibGVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgcHJvbXB0OiBkZWZhdWx0cy5wcm9tcHQsXG4gICAgICAgIHJhdGlvbmFsZTogZGVmYXVsdHMucmF0aW9uYWxlLFxuICAgICAgICBzaG93Tm90ZTogdHJ1ZSxcbiAgICAgICAgdGVhY2hlckluc3RydWN0aW9uczogZGVmYXVsdHMudGVhY2hlckluc3RydWN0aW9ucyxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGFzc2VydFZpZXcoXG4gICAgICAnICsgcm9sZTogaW5zdHJ1Y3RvciwgcHJvbXB0RW5hYmxlZCwgcmF0aW9uYWxlRW5hYmxlZCBhbmQgdGVhY2hlckluc3RydWN0aW9uc0VuYWJsZWQgdW5zZXQnLFxuICAgICAge30sXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgdGVhY2hlckluc3RydWN0aW9uczogJ1RlYWNoZXIgSW5zdHJ1Y3Rpb25zJyxcbiAgICAgICAgc2hvd05vdGU6IHRydWUsXG4gICAgICAgIHJhdGlvbmFsZTogJ1JhdGlvbmFsZScsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCBhc3NlcnRWaWV3U3R1ZGVudCA9IChsYWJlbCwgZXh0cmEsIHNlc3Npb24sIGV4cGVjdGVkKSA9PiB7XG4gICAgICBpdChgJ21vZGU6IHZpZXcsICR7bGFiZWx9J2AsIGFzeW5jICgpID0+IHtcbiAgICAgICAgcSA9IHtcbiAgICAgICAgICAuLi5xdWVzdGlvbixcbiAgICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiAnVGVhY2hlciBJbnN0cnVjdGlvbnMnLFxuICAgICAgICAgIHJhdGlvbmFsZTogJ1JhdGlvbmFsZScsXG4gICAgICAgICAgLi4uZXh0cmEsXG4gICAgICAgIH07XG4gICAgICAgIGVudiA9IHsgbW9kZTogJ3ZpZXcnLCByb2xlOiAnIHN0dWRlbnQnIH07XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbW9kZWwoXG4gICAgICAgICAgcSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogJzEnLFxuICAgICAgICAgICAgZWxlbWVudDogJ2V4cGxpY2l0LWNvbnN0cnVjdGVkLXJlc3BvbnNlJyxcbiAgICAgICAgICAgIC4uLnNlc3Npb24sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBlbnYsXG4gICAgICAgICk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbCh7XG4gICAgICAgICAgLi4ucXVlc3Rpb24sXG4gICAgICAgICAgZGlzYWJsZWQ6IHRydWUsXG4gICAgICAgICAgZmVlZGJhY2s6IHt9LFxuICAgICAgICAgIHJlc3BvbnNlQ29ycmVjdDogdW5kZWZpbmVkLFxuICAgICAgICAgIG1heExlbmd0aFBlckNob2ljZTogWzEwLCAxMCwgN10sXG4gICAgICAgICAgLi4uZW52LFxuICAgICAgICAgIC4uLmV4cGVjdGVkLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBhc3NlcnRWaWV3U3R1ZGVudChcbiAgICAgICcgKyByb2xlOiBzdHVkZW50LCBwcm9tcHRFbmFibGVkLCByYXRpb25hbGVFbmFibGVkIGFuZCB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZCBzZXQgdG8gZmFsc2UnLFxuICAgICAge1xuICAgICAgICBwcm9tcHRFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgcmF0aW9uYWxlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgc3R1ZGVudEluc3RydWN0aW9uc0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBwcm9tcHQ6IGRlZmF1bHRzLnByb21wdCxcbiAgICAgICAgcmF0aW9uYWxlOiBkZWZhdWx0cy5yYXRpb25hbGUsXG4gICAgICAgIHNob3dOb3RlOiB0cnVlLFxuICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiBkZWZhdWx0cy50ZWFjaGVySW5zdHJ1Y3Rpb25zLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0Vmlld1N0dWRlbnQoXG4gICAgICAnICsgcm9sZTogc3R1ZGVudCwgcHJvbXB0RW5hYmxlZCwgcmF0aW9uYWxlRW5hYmxlZCBhbmQgdGVhY2hlckluc3RydWN0aW9uc0VuYWJsZWQgdW5zZXQnLFxuICAgICAge30sXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgcmF0aW9uYWxlOiBkZWZhdWx0cy5yYXRpb25hbGUsXG4gICAgICAgIHNob3dOb3RlOiB0cnVlLFxuICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiBkZWZhdWx0cy50ZWFjaGVySW5zdHJ1Y3Rpb25zLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgY29uc3QgYXNzZXJ0RXZhbHVhdGUgPSAobGFiZWwsIGV4dHJhLCBzZXNzaW9uLCBleHBlY3RlZCkgPT4ge1xuICAgICAgaXQoYCdtb2RlOiBldmFsdWF0ZSwgJHtsYWJlbH0nYCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBxID0ge1xuICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6ICdUZWFjaGVyIEluc3RydWN0aW9ucycsXG4gICAgICAgICAgcmF0aW9uYWxlOiAnUmF0aW9uYWxlJyxcbiAgICAgICAgICAuLi5leHRyYSxcbiAgICAgICAgfTtcbiAgICAgICAgZW52ID0geyBtb2RlOiAnZXZhbHVhdGUnLCByb2xlOiAnaW5zdHJ1Y3RvcicgfTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBtb2RlbChcbiAgICAgICAgICBxLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAnMScsXG4gICAgICAgICAgICBlbGVtZW50OiAnZXhwbGljaXQtY29uc3RydWN0ZWQtcmVzcG9uc2UnLFxuICAgICAgICAgICAgLi4uc2Vzc2lvbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVudixcbiAgICAgICAgKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKHtcbiAgICAgICAgICAuLi5xdWVzdGlvbixcbiAgICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiAnVGVhY2hlciBJbnN0cnVjdGlvbnMnLFxuICAgICAgICAgIHJhdGlvbmFsZTogJ1JhdGlvbmFsZScsXG4gICAgICAgICAgZGlzYWJsZWQ6IHRydWUsXG4gICAgICAgICAgY2hvaWNlczoge1xuICAgICAgICAgICAgMDogW1xuICAgICAgICAgICAgICB7IGxhYmVsOiAnY293JywgdmFsdWU6ICcwJywgY29ycmVjdDogdHJ1ZSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnY2F0dGxlJywgdmFsdWU6ICcxJywgY29ycmVjdDogdHJ1ZSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnY2FsZicsIHZhbHVlOiAnMicsIGNvcnJlY3Q6IHRydWUgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAxOiBbXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdvdmVyJywgdmFsdWU6ICcwJywgY29ycmVjdDogdHJ1ZSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAncGFzdCcsIHZhbHVlOiAnMScsIGNvcnJlY3Q6IHRydWUgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ2JleW9uZCcsIHZhbHVlOiAnMicsIGNvcnJlY3Q6IHRydWUgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAyOiBbeyBsYWJlbDogJ21vb24nLCB2YWx1ZTogJzAnLCBjb3JyZWN0OiB0cnVlIH1dLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWF4TGVuZ3RoUGVyQ2hvaWNlOiBbMTAsIDEwLCA3XSxcbiAgICAgICAgICAuLi5lbnYsXG4gICAgICAgICAgLi4uZXhwZWN0ZWQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGFzc2VydEV2YWx1YXRlKFxuICAgICAgJy0gY29ycmVjdCBhbnN3ZXInLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgMDogJ2NvdycsXG4gICAgICAgICAgMTogJ292ZXInLFxuICAgICAgICAgIDI6ICdtb29uJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGZlZWRiYWNrOiB7IDA6ICdjb3JyZWN0JywgMTogJ2NvcnJlY3QnLCAyOiAnY29ycmVjdCcgfSxcbiAgICAgICAgc2hvd05vdGU6IHRydWUsXG4gICAgICAgIHJlc3BvbnNlQ29ycmVjdDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGFzc2VydEV2YWx1YXRlKFxuICAgICAgJy0gcGFydGlhbGx5IGNvcnJlY3QgYW5zd2VyJyxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIDA6ICdjb3cnLFxuICAgICAgICAgIDE6ICdvdmVyJyxcbiAgICAgICAgICAyOiAnc3VuJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGZlZWRiYWNrOiB7IDA6ICdjb3JyZWN0JywgMTogJ2NvcnJlY3QnLCAyOiAnaW5jb3JyZWN0JyB9LFxuICAgICAgICBzaG93Tm90ZTogdHJ1ZSxcbiAgICAgICAgcmVzcG9uc2VDb3JyZWN0OiBmYWxzZSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGFzc2VydEV2YWx1YXRlKFxuICAgICAgJy0gcGFydGlhbGx5IGNvcnJlY3QgYW5zd2VyIHVzaW5nIGFsdGVybmF0ZXMnLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgMDogJ2NhbGYnLFxuICAgICAgICAgIDE6ICdvdmVyJyxcbiAgICAgICAgICAyOiAnc3VuJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGZlZWRiYWNrOiB7IDA6ICdjb3JyZWN0JywgMTogJ2NvcnJlY3QnLCAyOiAnaW5jb3JyZWN0JyB9LFxuICAgICAgICBzaG93Tm90ZTogdHJ1ZSxcbiAgICAgICAgcmVzcG9uc2VDb3JyZWN0OiBmYWxzZSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGFzc2VydEV2YWx1YXRlKFxuICAgICAgJy0gaW5jb3JyZWN0IGFuc3dlcicsXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAwOiAnaGFuJyxcbiAgICAgICAgICAxOiAnYWJvdmUnLFxuICAgICAgICAgIDI6ICdjaGlja2VuJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGZlZWRiYWNrOiB7IDA6ICdpbmNvcnJlY3QnLCAxOiAnaW5jb3JyZWN0JywgMjogJ2luY29ycmVjdCcgfSxcbiAgICAgICAgc2hvd05vdGU6IHRydWUsXG4gICAgICAgIHJlc3BvbnNlQ29ycmVjdDogZmFsc2UsXG4gICAgICB9LFxuICAgICk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXQgc2NvcmUnLCAoKSA9PiB7XG4gICAgY29uc3QgYXNzZXJ0U2NvcmUgPSAoc2Vzc2lvbiwgZXhwZWN0ZWQpID0+IHtcbiAgICAgIGl0KCdyZXR1cm4gc2NvcmUnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNjb3JlID0gZ2V0U2NvcmUocXVlc3Rpb24sIHNlc3Npb24pO1xuXG4gICAgICAgIGV4cGVjdChzY29yZSkudG9FcXVhbChleHBlY3RlZCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgYXNzZXJ0U2NvcmUoeyB2YWx1ZTogeyAwOiAnY293JywgMTogJ292ZXInLCAyOiAnbW9vbicgfSB9LCAxKTtcbiAgICBhc3NlcnRTY29yZSh7IHZhbHVlOiB7IDA6ICdjYXR0bGUnLCAxOiAnb3ZlcicsIDI6ICdtb29uJyB9IH0sIDEpO1xuICAgIGFzc2VydFNjb3JlKHsgdmFsdWU6IHsgMDogJ2NhbGYnLCAxOiAnb3ZlcicsIDI6ICdtb29uJyB9IH0sIDEpO1xuICAgIGFzc2VydFNjb3JlKHsgdmFsdWU6IHsgMDogJ2NvdycsIDE6ICdwYXN0JywgMjogJ21vb24nIH0gfSwgMSk7XG4gICAgYXNzZXJ0U2NvcmUoeyB2YWx1ZTogeyAwOiAnY2F0dGxlJywgMTogJ3Bhc3QnLCAyOiAnbW9vbicgfSB9LCAxKTtcbiAgICBhc3NlcnRTY29yZSh7IHZhbHVlOiB7IDA6ICdjYWxmJywgMTogJ3Bhc3QnLCAyOiAnbW9vbicgfSB9LCAxKTtcbiAgICBhc3NlcnRTY29yZSh7IHZhbHVlOiB7IDA6ICdjb3cnLCAxOiAnYmV5b25kJywgMjogJ21vb24nIH0gfSwgMSk7XG4gICAgYXNzZXJ0U2NvcmUoeyB2YWx1ZTogeyAwOiAnY2F0dGxlJywgMTogJ2JleW9uZCcsIDI6ICdtb29uJyB9IH0sIDEpO1xuICAgIGFzc2VydFNjb3JlKHsgdmFsdWU6IHsgMDogJ2NhbGYnLCAxOiAnYmV5b25kJywgMjogJ21vb24nIH0gfSwgMSk7XG5cbiAgICBhc3NlcnRTY29yZSh7IHZhbHVlOiB7IDA6ICdjYWxmJywgMTogJ3VuZGVyJywgMjogJ21vb24nIH0gfSwgMC42Nyk7XG4gICAgYXNzZXJ0U2NvcmUoeyB2YWx1ZTogeyAwOiAnY2F0JywgMTogJ3VuZGVyJywgMjogJ21vb24nIH0gfSwgMC4zMyk7XG4gICAgYXNzZXJ0U2NvcmUoeyB2YWx1ZTogeyAwOiAnY2F0JywgMTogJ3VuZGVyJywgMjogJ3N1bicgfSB9LCAwKTtcblxuICAgIGNvbnN0IHJldHVyblNjb3JlID0gKHNlc3Npb24pID0+IHtcbiAgICAgIGl0KGBzY29yZSA9IDAgd2hlbiBzZXNzaW9uIGlzICR7SlNPTi5zdHJpbmdpZnkoc2Vzc2lvbil9YCwgKCkgPT4ge1xuICAgICAgICBleHBlY3QoZ2V0U2NvcmUocXVlc3Rpb24sIHNlc3Npb24pKS50b0VxdWFsKDApO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVyblNjb3JlKHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuU2NvcmUobnVsbCk7XG4gICAgcmV0dXJuU2NvcmUoe30pO1xuICB9KTtcblxuICBkZXNjcmliZSgnb3V0Y29tZSBwYXJ0aWFsU2NvcmluZyB0ZXN0JywgKCkgPT4ge1xuICAgIGNvbnN0IGFzc2VydE91dGNvbWUgPSAobWVzc2FnZSwgZXh0cmEsIHNlc3Npb25WYWx1ZSwgZW52LCBleHBlY3RlZCkgPT4ge1xuICAgICAgaXQobWVzc2FnZSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvdXRjb21lKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgICAgLi4uZXh0cmEsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXNzaW9uVmFsdWUsXG4gICAgICAgICAgZW52LFxuICAgICAgICApO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoZXhwZWN0ZWQpKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBhc3NlcnRPdXRjb21lKFxuICAgICAgJ2VsZW1lbnQucGFydGlhbFNjb3JpbmcgPSB0cnVlJyxcbiAgICAgIHsgcGFydGlhbFNjb3Jpbmc6IHRydWUgfSxcbiAgICAgIHsgdmFsdWU6IHsgMDogJ2NhbGYnLCAxOiAndW5kZXInLCAyOiAnbW9vbicgfSB9LFxuICAgICAgeyBtb2RlOiAnZXZhbHVhdGUnIH0sXG4gICAgICB7IHNjb3JlOiAwLjY3IH0sXG4gICAgKTtcblxuICAgIGFzc2VydE91dGNvbWUoXG4gICAgICAnZWxlbWVudC5wYXJ0aWFsU2NvcmluZyA9IGZhbHNlJyxcbiAgICAgIHsgcGFydGlhbFNjb3Jpbmc6IGZhbHNlIH0sXG4gICAgICB7IHZhbHVlOiB7IDA6ICdjYWxmJywgMTogJ3VuZGVyJywgMjogJ21vb24nIH0gfSxcbiAgICAgIHsgbW9kZTogJ2V2YWx1YXRlJyB9LFxuICAgICAgeyBzY29yZTogMCB9LFxuICAgICk7XG5cbiAgICBhc3NlcnRPdXRjb21lKFxuICAgICAgJ2VsZW1lbnQucGFydGlhbFNjb3JpbmcgPSBmYWxzZSwgZW52LnBhcnRpYWxTY29yaW5nID0gdHJ1ZScsXG4gICAgICB7IHBhcnRpYWxTY29yaW5nOiBmYWxzZSB9LFxuICAgICAgeyB2YWx1ZTogeyAwOiAnY2FsZicsIDE6ICd1bmRlcicsIDI6ICdtb29uJyB9IH0sXG4gICAgICB7XG4gICAgICAgIG1vZGU6ICdldmFsdWF0ZScsXG4gICAgICAgIHBhcnRpYWxTY29yaW5nOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIHsgc2NvcmU6IDAgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0T3V0Y29tZShcbiAgICAgICdlbGVtZW50LnBhcnRpYWxTY29yaW5nID0gdHJ1ZSwgZW52LnBhcnRpYWxTY29yaW5nID0gZmFsc2UnLFxuICAgICAgeyBwYXJ0aWFsU2NvcmluZzogdHJ1ZSB9LFxuICAgICAgeyB2YWx1ZTogeyAwOiAnY2FsZicsIDE6ICd1bmRlcicsIDI6ICdtb29uJyB9IH0sXG4gICAgICB7XG4gICAgICAgIG1vZGU6ICdldmFsdWF0ZScsXG4gICAgICAgIHBhcnRpYWxTY29yaW5nOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICB7IHNjb3JlOiAwIH0sXG4gICAgKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ291dGNvbWUnLCAoKSA9PiB7XG4gICAgY29uc3QgYXNzZXJ0T3V0Y29tZSA9IChwYXJ0aWFsU2NvcmluZywgc2Vzc2lvblZhbHVlLCBleHBlY3RlZCkgPT4ge1xuICAgICAgaXQoYHBhcnRpYWwgc2NvcmUgJHtwYXJ0aWFsU2NvcmluZyA/ICdlbmFibGVkJyA6ICcnfWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICAuLi5xdWVzdGlvbixcbiAgICAgICAgICAgIHBhcnRpYWxTY29yaW5nLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2Vzc2lvblZhbHVlLFxuICAgICAgICApO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoZXhwZWN0ZWQpKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBhc3NlcnRPdXRjb21lKHRydWUsIHsgdmFsdWU6IHsgMDogJ2NvdycsIDE6ICdvdmVyJywgMjogJ21vb24nIH0gfSwgeyBzY29yZTogMSwgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUodHJ1ZSwgeyB2YWx1ZTogeyAwOiAnY2F0dGxlJywgMTogJ292ZXInLCAyOiAnbW9vbicgfSB9LCB7IHNjb3JlOiAxLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICdjYWxmJywgMTogJ292ZXInLCAyOiAnbW9vbicgfSB9LCB7IHNjb3JlOiAxLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICdjb3cnLCAxOiAncGFzdCcsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDEsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKHRydWUsIHsgdmFsdWU6IHsgMDogJ2NhdHRsZScsIDE6ICdwYXN0JywgMjogJ21vb24nIH0gfSwgeyBzY29yZTogMSwgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUodHJ1ZSwgeyB2YWx1ZTogeyAwOiAnY2FsZicsIDE6ICdwYXN0JywgMjogJ21vb24nIH0gfSwgeyBzY29yZTogMSwgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUodHJ1ZSwgeyB2YWx1ZTogeyAwOiAnY293JywgMTogJ2JleW9uZCcsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDEsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKHRydWUsIHsgdmFsdWU6IHsgMDogJ2NhdHRsZScsIDE6ICdiZXlvbmQnLCAyOiAnbW9vbicgfSB9LCB7IHNjb3JlOiAxLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICdjYWxmJywgMTogJ2JleW9uZCcsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDEsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKHRydWUsIHsgdmFsdWU6IHsgMDogJ2NhbGYnLCAxOiAndW5kZXInLCAyOiAnbW9vbicgfSB9LCB7IHNjb3JlOiAwLjY3LCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICdjYXQnLCAxOiAndW5kZXInLCAyOiAnbW9vbicgfSB9LCB7IHNjb3JlOiAwLjMzLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICdjYXQnLCAxOiAndW5kZXInLCAyOiAnc3VuJyB9IH0sIHsgc2NvcmU6IDAsIGVtcHR5OiBmYWxzZSB9KTtcblxuICAgIGFzc2VydE91dGNvbWUoZmFsc2UsIHsgdmFsdWU6IHsgMDogJ2NvdycsIDE6ICdvdmVyJywgMjogJ21vb24nIH0gfSwgeyBzY29yZTogMSwgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUoZmFsc2UsIHsgdmFsdWU6IHsgMDogJ2NhdHRsZScsIDE6ICdvdmVyJywgMjogJ21vb24nIH0gfSwgeyBzY29yZTogMSwgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUoZmFsc2UsIHsgdmFsdWU6IHsgMDogJ2NhbGYnLCAxOiAnb3ZlcicsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDEsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKGZhbHNlLCB7IHZhbHVlOiB7IDA6ICdjb3cnLCAxOiAncGFzdCcsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDEsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKGZhbHNlLCB7IHZhbHVlOiB7IDA6ICdjYXR0bGUnLCAxOiAncGFzdCcsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDEsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKGZhbHNlLCB7IHZhbHVlOiB7IDA6ICdjYWxmJywgMTogJ3Bhc3QnLCAyOiAnbW9vbicgfSB9LCB7IHNjb3JlOiAxLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZShmYWxzZSwgeyB2YWx1ZTogeyAwOiAnY293JywgMTogJ2JleW9uZCcsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDEsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKGZhbHNlLCB7IHZhbHVlOiB7IDA6ICdjYXR0bGUnLCAxOiAnYmV5b25kJywgMjogJ21vb24nIH0gfSwgeyBzY29yZTogMSwgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUoZmFsc2UsIHsgdmFsdWU6IHsgMDogJ2NhbGYnLCAxOiAnYmV5b25kJywgMjogJ21vb24nIH0gfSwgeyBzY29yZTogMSwgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUoZmFsc2UsIHsgdmFsdWU6IHsgMDogJ2NhbGYnLCAxOiAndW5kZXInLCAyOiAnbW9vbicgfSB9LCB7IHNjb3JlOiAwLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZShmYWxzZSwgeyB2YWx1ZTogeyAwOiAnY2F0JywgMTogJ3VuZGVyJywgMjogJ21vb24nIH0gfSwgeyBzY29yZTogMCwgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUoZmFsc2UsIHsgdmFsdWU6IHsgMDogJ2NhdCcsIDE6ICd1bmRlcicsIDI6ICdzdW4nIH0gfSwgeyBzY29yZTogMCwgZW1wdHk6IGZhbHNlIH0pO1xuXG4gICAgY29uc3QgcmV0dXJuTW9kZWwgPSAoc2Vzc2lvbikgPT4ge1xuICAgICAgaXQoYGVtcHR5OiB0cnVlIHdoZW4gc2Vzc2lvbiBpcyAke0pTT04uc3RyaW5naWZ5KHNlc3Npb24pfWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgbSA9IGF3YWl0IG91dGNvbWUocXVlc3Rpb24sIHNlc3Npb24pO1xuXG4gICAgICAgIGV4cGVjdChtKS50b0VxdWFsKHsgc2NvcmU6IDAsIGVtcHR5OiB0cnVlLCB0cmFjZUxvZzogWydTdHVkZW50IGRpZCBub3QgZmlsbCBhbnkgcmVzcG9uc2UgYXJlYXMuIFNjb3JlOiAwLiddIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybk1vZGVsKHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuTW9kZWwobnVsbCk7XG4gICAgcmV0dXJuTW9kZWwoe30pO1xuICB9KTtcblxuICBkZXNjcmliZSgncHJlcGFyZVZhbCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBlbXB0eSBzdHJpbmcgb24gbnVsbCBvciB1bmRlZmluZWQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QocHJlcGFyZVZhbChudWxsKSkudG9FcXVhbCgnJyk7XG4gICAgICBleHBlY3QocHJlcGFyZVZhbCh1bmRlZmluZWQpKS50b0VxdWFsKCcnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVtb3ZlIGh0bWwgdGFncycsICgpID0+IHtcbiAgICAgIGV4cGVjdChwcmVwYXJlVmFsKCc8ZGl2PkZvbyBCYXI8L2Rpdj4nKSkudG9FcXVhbCgnRm9vIEJhcicpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2NvcnJlY3QgcmVzcG9uc2UnLCAoKSA9PiB7XG4gICAgICBsZXQgcXVlc3Rpb247XG4gICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgcXVlc3Rpb24gPSB7XG4gICAgICAgICAgY2hvaWNlcyxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBjb3JyZWN0IHJlc3BvbnNlIGlmIGVudiBpcyBjb3JyZWN0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBzZXNzID0gYXdhaXQgY3JlYXRlQ29ycmVjdFJlc3BvbnNlU2Vzc2lvbihxdWVzdGlvbiwge1xuICAgICAgICAgIG1vZGU6ICdnYXRoZXInLFxuICAgICAgICAgIHJvbGU6ICdpbnN0cnVjdG9yJyxcbiAgICAgICAgfSk7XG4gICAgICAgIGV4cGVjdChzZXNzKS50b0VxdWFsKHsgaWQ6ICcxJywgdmFsdWU6IHsgMDogJ2NvdycsIDE6ICdvdmVyJywgMjogJ21vb24nIH0gfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JldHVybnMgbnVsbCBlbnYgaXMgc3R1ZGVudCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgbm9SZXN1bHQgPSBhd2FpdCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uKHF1ZXN0aW9uLCB7IG1vZGU6ICdnYXRoZXInLCByb2xlOiAnc3R1ZGVudCcgfSk7XG4gICAgICAgIGV4cGVjdChub1Jlc3VsdCkudG9CZU51bGwoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY29ycmVjdCByZXNwb25zZScsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyBjb3JyZWN0IHJlc3BvbnNlIGlmIHJvbGUgaXMgaW5zdHJ1Y3RvciBhbmQgbW9kZSBpcyBnYXRoZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzZXNzID0gYXdhaXQgY3JlYXRlQ29ycmVjdFJlc3BvbnNlU2Vzc2lvbihxdWVzdGlvbiwge1xuICAgICAgICBtb2RlOiAnZ2F0aGVyJyxcbiAgICAgICAgcm9sZTogJ2luc3RydWN0b3InLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChzZXNzKS50b0VxdWFsKHsgaWQ6ICcxJywgdmFsdWU6IHsgMDogJ2NvdycsIDE6ICdvdmVyJywgMjogJ21vb24nIH0gfSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBjb3JyZWN0IHJlc3BvbnNlIGlmIHJvbGUgaXMgaW5zdHJ1Y3RvciBhbmQgbW9kZSBpcyB2aWV3JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2VzcyA9IGF3YWl0IGNyZWF0ZUNvcnJlY3RSZXNwb25zZVNlc3Npb24ocXVlc3Rpb24sIHtcbiAgICAgICAgbW9kZTogJ3ZpZXcnLFxuICAgICAgICByb2xlOiAnaW5zdHJ1Y3RvcicsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KHNlc3MpLnRvRXF1YWwoeyBpZDogJzEnLCB2YWx1ZTogeyAwOiAnY293JywgMTogJ292ZXInLCAyOiAnbW9vbicgfSB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIG51bGwgaWYgbW9kZSBpcyBldmFsdWF0ZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG5vUmVzdWx0ID0gYXdhaXQgY3JlYXRlQ29ycmVjdFJlc3BvbnNlU2Vzc2lvbihxdWVzdGlvbiwgeyBtb2RlOiAnZXZhbHVhdGUnLCByb2xlOiAnaW5zdHJ1Y3RvcicgfSk7XG5cbiAgICAgIGV4cGVjdChub1Jlc3VsdCkudG9CZU51bGwoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIG51bGwgaWYgcm9sZSBpcyBzdHVkZW50JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgbm9SZXN1bHQgPSBhd2FpdCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uKHF1ZXN0aW9uLCB7IG1vZGU6ICdnYXRoZXInLCByb2xlOiAnc3R1ZGVudCcgfSk7XG5cbiAgICAgIGV4cGVjdChub1Jlc3VsdCkudG9CZU51bGwoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3ByZXBhcmVDaG9pY2UnLCAoKSA9PiB7XG4gICAgY29uc3QgYXNzZXJ0UHJlcGFyZUNob2ljZSA9IChlbnYsIGRlZmF1bHRGZWVkYmFjaywgY2hvaWNlLCBleHBlY3RlZCkgPT4ge1xuICAgICAgY29uc3QgcHJlcGFyQ2hvaWNlRm4gPSBwcmVwYXJlQ2hvaWNlKGVudi5tb2RlLCBkZWZhdWx0RmVlZGJhY2spO1xuXG4gICAgICBpdChgcHJlcGFyZSBjaG9pY2VzIGluICR7ZW52Lm1vZGV9IG1vZGU6ICR7SlNPTi5zdHJpbmdpZnkoY2hvaWNlKX0gLT4gJHtKU09OLnN0cmluZ2lmeShleHBlY3RlZCl9YCwgKCkgPT4ge1xuICAgICAgICBleHBlY3QocHJlcGFyQ2hvaWNlRm4oY2hvaWNlKSkudG9FcXVhbChleHBlY3RlZCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgYXNzZXJ0UHJlcGFyZUNob2ljZShcbiAgICAgIHsgbW9kZTogJ2dhdGhlcicgfSxcbiAgICAgIHsgY29ycmVjdDogJ0NvcnJlY3QnLCBpbmNvcnJlY3Q6ICdJbmNvcnJlY3QnIH0sXG4gICAgICB7IHZhbHVlOiAnMCcsIGxhYmVsOiAnY293JyB9LFxuICAgICAgeyB2YWx1ZTogJzAnLCBsYWJlbDogJ2NvdycgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0UHJlcGFyZUNob2ljZShcbiAgICAgIHsgbW9kZTogJ3ZpZXcnIH0sXG4gICAgICB7IGNvcnJlY3Q6ICdDb3JyZWN0JywgaW5jb3JyZWN0OiAnSW5jb3JyZWN0JyB9LFxuICAgICAgeyB2YWx1ZTogJzAnLCBsYWJlbDogJ2NvdycgfSxcbiAgICAgIHsgdmFsdWU6ICcwJywgbGFiZWw6ICdjb3cnIH0sXG4gICAgKTtcblxuICAgIGFzc2VydFByZXBhcmVDaG9pY2UoXG4gICAgICB7IG1vZGU6ICdldmFsdWF0ZScgfSxcbiAgICAgIHsgY29ycmVjdDogJ0NvcnJlY3QnLCBpbmNvcnJlY3Q6ICdJbmNvcnJlY3QnIH0sXG4gICAgICB7IHZhbHVlOiAnMCcsIGxhYmVsOiAnY293JyB9LFxuICAgICAgeyB2YWx1ZTogJzAnLCBsYWJlbDogJ2NvdycsIGNvcnJlY3Q6IHRydWUgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0UHJlcGFyZUNob2ljZShcbiAgICAgIHsgbW9kZTogJ2V2YWx1YXRlJyB9LFxuICAgICAgeyBjb3JyZWN0OiAnQ29ycmVjdCcsIGluY29ycmVjdDogJ0luY29ycmVjdCcgfSxcbiAgICAgIHsgdmFsdWU6ICcwJywgbGFiZWw6ICdjb3cnLCBmZWVkYmFjazogeyB0eXBlOiAnZGVmYXVsdCcgfSB9LFxuICAgICAgeyB2YWx1ZTogJzAnLCBsYWJlbDogJ2NvdycsIGNvcnJlY3Q6IHRydWUsIGZlZWRiYWNrOiAnQ29ycmVjdCcgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0UHJlcGFyZUNob2ljZShcbiAgICAgIHsgbW9kZTogJ2V2YWx1YXRlJyB9LFxuICAgICAgeyBjb3JyZWN0OiAnQ29ycmVjdCcsIGluY29ycmVjdDogJ0luY29ycmVjdCcgfSxcbiAgICAgIHsgdmFsdWU6ICcwJywgbGFiZWw6ICdjb3cnLCBmZWVkYmFjazogeyB0eXBlOiAnY3VzdG9tJyB9IH0sXG4gICAgICB7IHZhbHVlOiAnMCcsIGxhYmVsOiAnY293JywgY29ycmVjdDogdHJ1ZSwgZmVlZGJhY2s6IHVuZGVmaW5lZCB9LFxuICAgICk7XG5cbiAgICBhc3NlcnRQcmVwYXJlQ2hvaWNlKFxuICAgICAgeyBtb2RlOiAnZXZhbHVhdGUnIH0sXG4gICAgICB7IGNvcnJlY3Q6ICdDb3JyZWN0JywgaW5jb3JyZWN0OiAnSW5jb3JyZWN0JyB9LFxuICAgICAgeyB2YWx1ZTogJzAnLCBsYWJlbDogJ2NvdycsIGZlZWRiYWNrOiB7IHR5cGU6ICdjdXN0b20nLCB2YWx1ZTogJ0N1c3RvbSBGZWVkYmFjaycgfSB9LFxuICAgICAgeyB2YWx1ZTogJzAnLCBsYWJlbDogJ2NvdycsIGNvcnJlY3Q6IHRydWUsIGZlZWRiYWNrOiAnQ3VzdG9tIEZlZWRiYWNrJyB9LFxuICAgICk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsT0FBQTtBQUVBLElBQUFDLFNBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUVBRyxJQUFJLENBQUNDLElBQUksQ0FBQywyQkFBMkIsRUFBRSxPQUFPO0VBQzVDQyxrQkFBa0IsRUFBRUEsQ0FBQ0MsT0FBTyxFQUFFQyxPQUFPLEVBQUVDLGFBQWEsRUFBRUMsR0FBRyxLQUFLO0lBQzVELE1BQU1DLGVBQWUsR0FBRyxDQUFDLENBQUNILE9BQU8sSUFBSSxDQUFDLENBQUMsRUFBRUksY0FBYyxJQUFJLEVBQUUsRUFBRUMsTUFBTSxDQUFFQyxDQUFDLElBQUtBLENBQUMsQ0FBQztJQUUvRSxJQUFJTixPQUFPLElBQUksQ0FBQ0csZUFBZSxDQUFDSSxNQUFNLElBQUlOLGFBQWEsSUFBSSxPQUFPQSxhQUFhLEtBQUssVUFBVSxFQUFFO01BQzlGQSxhQUFhLENBQUMsQ0FBQztJQUNqQjtJQUVBLE9BQU9GLE9BQU87RUFDaEIsQ0FBQztFQUNEUyxjQUFjLEVBQUU7SUFDZEMsT0FBTyxF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QyxFQUFFLENBQUMsQ0FBQztJQUM3RDZDLFdBQVcsQ0FBQztNQUFFN0MsS0FBSyxFQUFFO1FBQUUsQ0FBQyxFQUFFLFFBQVE7UUFBRSxDQUFDLEVBQUUsTUFBTTtRQUFFLENBQUMsRUFBRTtNQUFPO0lBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoRTZDLFdBQVcsQ0FBQztNQUFFN0MsS0FBSyxFQUFFO1FBQUUsQ0FBQyxFQUFFLE1BQU07UUFBRSxDQUFDLEVBQUUsTUFBTTtRQUFFLENBQUMsRUFBRTtNQUFPO0lBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM5RDZDLFdBQVcsQ0FBQztNQUFFN0MsS0FBSyxFQUFFO1FBQUUsQ0FBQyxFQUFFLEtBQUs7UUFBRSxDQUFDLEVBQUUsTUFBTTtRQUFFLENBQUMsRUFBRTtNQUFPO0lBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3RDZDLFdBQVcsQ0FBQztNQUFFN0MsS0FBSyxFQUFFO1FBQUUsQ0FBQyxFQUFFLFFBQVE7UUFBRSxDQUFDLEVBQUUsTUFBTTtRQUFFLENBQUMsRUFBRTtNQUFPO0lBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoRTZDLFdBQVcsQ0FBQztNQUFFN0MsS0FBSyxFQUFFO1FBQUUsQ0FBQyxFQUFFLE1BQU07UUFBRSxDQUFDLEVBQUUsTUFBTTtRQUFFLENBQUMsRUFBRTtNQUFPO0lBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM5RDZDLFdBQVcsQ0FBQztNQUFFN0MsS0FBSyxFQUFFO1FBQUUsQ0FBQyxFQUFFLEtBQUs7UUFBRSxDQUFDLEVBQUUsUUFBUTtRQUFFLENBQUMsRUFBRTtNQUFPO0lBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMvRDZDLFdBQVcsQ0FBQztNQUFFN0MsS0FBSyxFQUFFO1FBQUUsQ0FBQyxFQUFFLFFBQVE7UUFBRSxDQUFDLEVBQUUsUUFBUTtRQUFFLENBQUMsRUFBRTtNQUFPO0lBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNsRTZDLFdBQVcsQ0FBQztNQUFFN0MsS0FBSyxFQUFFO1FBQUUsQ0FB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