@pie-element/explicit-constructed-response 6.0.4-next.69 → 6.1.0-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 (39) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/configure/CHANGELOG.md +17 -0
  3. package/configure/lib/__tests__/alternateResponses.test.js +335 -0
  4. package/configure/lib/__tests__/alternateSection.test.js +221 -0
  5. package/configure/lib/__tests__/ecr-toolbar.test.js +89 -0
  6. package/configure/lib/__tests__/main.test.js +320 -0
  7. package/configure/lib/__tests__/markupUtils.test.js +56 -0
  8. package/configure/lib/__tests__/utils.test.js +66 -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 +6 -12
  15. package/configure/lib/main.js.map +1 -1
  16. package/configure/lib/markupUtils.js +1 -1
  17. package/configure/lib/utils.js +1 -1
  18. package/configure/package.json +2 -2
  19. package/controller/CHANGELOG.md +17 -0
  20. package/controller/lib/__tests__/index.spec.js +52 -0
  21. package/controller/lib/__tests__/index.test.js +1207 -0
  22. package/controller/lib/defaults.js +1 -1
  23. package/controller/lib/index.js +1 -1
  24. package/controller/package.json +2 -2
  25. package/docs/demo/pie.manifest.json +11 -0
  26. package/lib/__tests__/main.test.js +124 -0
  27. package/lib/index.js +1 -1
  28. package/lib/main.js +3 -3
  29. package/lib/main.js.map +1 -1
  30. package/lib/print.js +1 -1
  31. package/module/demo.js +45 -0
  32. package/module/element.js +116626 -0
  33. package/module/index.html +21 -0
  34. package/module/manifest.json +10 -0
  35. package/module/print-demo.js +83 -0
  36. package/module/print.html +18 -0
  37. package/module/print.js +116569 -0
  38. package/package.json +3 -3
  39. package/LICENSE.md +0 -5
@@ -0,0 +1,1207 @@
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
+ 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; }
14
+
15
+ 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; }
16
+
17
+ jest.mock('@pie-lib/pie-toolbox/controller-utils', function () {
18
+ return {
19
+ getShuffledChoices: function getShuffledChoices(choices, session, updateSession, key) {
20
+ var currentShuffled = ((session || {}).shuffledValues || []).filter(function (v) {
21
+ return v;
22
+ });
23
+
24
+ if (session && !currentShuffled.length && updateSession && typeof updateSession === 'function') {
25
+ updateSession();
26
+ }
27
+
28
+ return choices;
29
+ },
30
+ partialScoring: {
31
+ enabled: function enabled(config, env) {
32
+ config = config || {};
33
+ env = env || {};
34
+
35
+ if (config.partialScoring === false) {
36
+ return false;
37
+ }
38
+
39
+ if (env.partialScoring === false) {
40
+ return false;
41
+ }
42
+
43
+ return true;
44
+ }
45
+ }
46
+ };
47
+ });
48
+
49
+ var choice = function choice(l, v) {
50
+ return {
51
+ label: l,
52
+ value: v
53
+ };
54
+ };
55
+
56
+ var choices = {
57
+ 0: [choice('cow', '0'), choice('cattle', '1'), choice('calf', '2')],
58
+ 1: [choice('over', '0'), choice('past', '1'), choice('beyond', '2')],
59
+ 2: [choice('moon', '0')]
60
+ };
61
+ var question = {
62
+ markup: '<p>The {{0}} jumped {{1}} the {{2}}</p>',
63
+ disabled: false,
64
+ choices: choices,
65
+ prompt: 'Complete the sentence',
66
+ note: 'The answer shown above is the most common correct answer for this item.'
67
+ };
68
+ describe('controller', function () {
69
+ describe('model', function () {
70
+ var q, env;
71
+ it('output when session is defined', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
72
+ var m;
73
+ return _regenerator["default"].wrap(function _callee$(_context) {
74
+ while (1) {
75
+ switch (_context.prev = _context.next) {
76
+ case 0:
77
+ _context.next = 2;
78
+ return (0, _index.model)(question, {
79
+ value: {
80
+ 0: 'cow',
81
+ 1: 'over',
82
+ 2: 'moon'
83
+ }
84
+ }, {
85
+ mode: 'evaluate'
86
+ });
87
+
88
+ case 2:
89
+ m = _context.sent;
90
+ expect(m).toEqual(expect.objectContaining({
91
+ feedback: {
92
+ 0: 'correct',
93
+ 1: 'correct',
94
+ 2: 'correct'
95
+ },
96
+ responseCorrect: true
97
+ }));
98
+
99
+ case 4:
100
+ case "end":
101
+ return _context.stop();
102
+ }
103
+ }
104
+ }, _callee);
105
+ })));
106
+
107
+ var returnModel = function returnModel(session) {
108
+ it("output when session is ".concat(JSON.stringify(session)), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
109
+ var m;
110
+ return _regenerator["default"].wrap(function _callee2$(_context2) {
111
+ while (1) {
112
+ switch (_context2.prev = _context2.next) {
113
+ case 0:
114
+ _context2.next = 2;
115
+ return (0, _index.model)(question, session, {
116
+ mode: 'evaluate'
117
+ });
118
+
119
+ case 2:
120
+ m = _context2.sent;
121
+ expect(m).toEqual(expect.objectContaining({
122
+ feedback: {
123
+ 0: 'incorrect',
124
+ 1: 'incorrect',
125
+ 2: 'incorrect'
126
+ },
127
+ responseCorrect: false
128
+ }));
129
+
130
+ case 4:
131
+ case "end":
132
+ return _context2.stop();
133
+ }
134
+ }
135
+ }, _callee2);
136
+ })));
137
+ };
138
+
139
+ returnModel(undefined);
140
+ returnModel(null);
141
+ returnModel({});
142
+
143
+ var assertGather = function assertGather(label, extra, session, expected) {
144
+ it("'mode: gather, ".concat(label, "'"), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
145
+ var result;
146
+ return _regenerator["default"].wrap(function _callee3$(_context3) {
147
+ while (1) {
148
+ switch (_context3.prev = _context3.next) {
149
+ case 0:
150
+ q = _objectSpread(_objectSpread({}, question), {}, {
151
+ teacherInstructions: 'Teacher Instructions',
152
+ rationale: 'Rationale'
153
+ }, extra);
154
+ env = {
155
+ mode: 'gather'
156
+ };
157
+ _context3.next = 4;
158
+ return (0, _index.model)(q, _objectSpread({
159
+ id: '1',
160
+ element: 'explicit-constructed-response'
161
+ }, session), env);
162
+
163
+ case 4:
164
+ result = _context3.sent;
165
+ expect(result).toEqual(_objectSpread(_objectSpread({}, question), {}, {
166
+ disabled: false,
167
+ mode: 'gather',
168
+ feedback: {},
169
+ responseCorrect: undefined,
170
+ maxLengthPerChoice: [10, 10, 7],
171
+ env: env
172
+ }, expected));
173
+
174
+ case 6:
175
+ case "end":
176
+ return _context3.stop();
177
+ }
178
+ }
179
+ }, _callee3);
180
+ })));
181
+ };
182
+
183
+ assertGather('promptEnabled, rationaleEnabled and teacherInstructionsEnabled not set', {}, {}, {
184
+ rationale: null,
185
+ showNote: true,
186
+ teacherInstructions: null
187
+ });
188
+ assertGather('promptEnabled, rationaleEnabled and teacherInstructionsEnabled set to false', {
189
+ promptEnabled: false,
190
+ rationaleEnabled: false,
191
+ teacherInstructionsEnabled: false,
192
+ studentInstructionsEnabled: false
193
+ }, {}, {
194
+ prompt: null,
195
+ rationale: null,
196
+ showNote: true,
197
+ teacherInstructions: null
198
+ });
199
+
200
+ var assertView = function assertView(label, extra, session, expected) {
201
+ it("'mode: view, ".concat(label, "'"), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4() {
202
+ var result;
203
+ return _regenerator["default"].wrap(function _callee4$(_context4) {
204
+ while (1) {
205
+ switch (_context4.prev = _context4.next) {
206
+ case 0:
207
+ q = _objectSpread(_objectSpread({}, question), {}, {
208
+ teacherInstructions: 'Teacher Instructions',
209
+ rationale: 'Rationale'
210
+ }, extra);
211
+ env = {
212
+ mode: 'view',
213
+ role: 'instructor'
214
+ };
215
+ _context4.next = 4;
216
+ return (0, _index.model)(q, _objectSpread({
217
+ id: '1',
218
+ element: 'explicit-constructed-response'
219
+ }, session), env);
220
+
221
+ case 4:
222
+ result = _context4.sent;
223
+ expect(result).toEqual(_objectSpread(_objectSpread({}, question), {}, {
224
+ mode: 'view',
225
+ disabled: true,
226
+ feedback: {},
227
+ responseCorrect: undefined,
228
+ env: env,
229
+ maxLengthPerChoice: [10, 10, 7]
230
+ }, expected));
231
+
232
+ case 6:
233
+ case "end":
234
+ return _context4.stop();
235
+ }
236
+ }
237
+ }, _callee4);
238
+ })));
239
+ };
240
+
241
+ assertView(' + role: instructor, promptEnabled, rationaleEnabled and teacherInstructionsEnabled set to false', {
242
+ promptEnabled: false,
243
+ rationaleEnabled: false,
244
+ teacherInstructionsEnabled: false,
245
+ studentInstructionsEnabled: false
246
+ }, {}, {
247
+ prompt: null,
248
+ rationale: null,
249
+ showNote: true,
250
+ teacherInstructions: null
251
+ });
252
+ assertView(' + role: instructor, promptEnabled, rationaleEnabled and teacherInstructionsEnabled unset', {}, {}, {
253
+ teacherInstructions: 'Teacher Instructions',
254
+ showNote: true,
255
+ rationale: 'Rationale'
256
+ });
257
+
258
+ var assertViewStudent = function assertViewStudent(label, extra, session, expected) {
259
+ it("'mode: view, ".concat(label, "'"), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5() {
260
+ var result;
261
+ return _regenerator["default"].wrap(function _callee5$(_context5) {
262
+ while (1) {
263
+ switch (_context5.prev = _context5.next) {
264
+ case 0:
265
+ q = _objectSpread(_objectSpread({}, question), {}, {
266
+ teacherInstructions: 'Teacher Instructions',
267
+ rationale: 'Rationale'
268
+ }, extra);
269
+ env = {
270
+ mode: 'view',
271
+ role: ' student'
272
+ };
273
+ _context5.next = 4;
274
+ return (0, _index.model)(q, _objectSpread({
275
+ id: '1',
276
+ element: 'explicit-constructed-response'
277
+ }, session), env);
278
+
279
+ case 4:
280
+ result = _context5.sent;
281
+ expect(result).toEqual(_objectSpread(_objectSpread({}, question), {}, {
282
+ mode: 'view',
283
+ disabled: true,
284
+ feedback: {},
285
+ responseCorrect: undefined,
286
+ maxLengthPerChoice: [10, 10, 7],
287
+ env: env
288
+ }, expected));
289
+
290
+ case 6:
291
+ case "end":
292
+ return _context5.stop();
293
+ }
294
+ }
295
+ }, _callee5);
296
+ })));
297
+ };
298
+
299
+ assertViewStudent(' + role: student, promptEnabled, rationaleEnabled and teacherInstructionsEnabled set to false', {
300
+ promptEnabled: false,
301
+ rationaleEnabled: false,
302
+ teacherInstructionsEnabled: false,
303
+ studentInstructionsEnabled: false
304
+ }, {}, {
305
+ prompt: null,
306
+ rationale: null,
307
+ showNote: true,
308
+ teacherInstructions: null
309
+ });
310
+ assertViewStudent(' + role: student, promptEnabled, rationaleEnabled and teacherInstructionsEnabled unset', {}, {}, {
311
+ rationale: null,
312
+ showNote: true,
313
+ teacherInstructions: null
314
+ });
315
+
316
+ var assertEvaluate = function assertEvaluate(label, extra, session, expected) {
317
+ it("'mode: evaluate, ".concat(label, "'"), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6() {
318
+ var result;
319
+ return _regenerator["default"].wrap(function _callee6$(_context6) {
320
+ while (1) {
321
+ switch (_context6.prev = _context6.next) {
322
+ case 0:
323
+ q = _objectSpread(_objectSpread({}, question), {}, {
324
+ teacherInstructions: 'Teacher Instructions',
325
+ rationale: 'Rationale'
326
+ }, extra);
327
+ env = {
328
+ mode: 'evaluate',
329
+ role: 'instructor'
330
+ };
331
+ _context6.next = 4;
332
+ return (0, _index.model)(q, _objectSpread({
333
+ id: '1',
334
+ element: 'explicit-constructed-response'
335
+ }, session), env);
336
+
337
+ case 4:
338
+ result = _context6.sent;
339
+ expect(result).toEqual(_objectSpread(_objectSpread({}, question), {}, {
340
+ teacherInstructions: 'Teacher Instructions',
341
+ rationale: 'Rationale',
342
+ mode: 'evaluate',
343
+ disabled: true,
344
+ choices: {
345
+ 0: [{
346
+ label: 'cow',
347
+ value: '0',
348
+ correct: true
349
+ }, {
350
+ label: 'cattle',
351
+ value: '1',
352
+ correct: true
353
+ }, {
354
+ label: 'calf',
355
+ value: '2',
356
+ correct: true
357
+ }],
358
+ 1: [{
359
+ label: 'over',
360
+ value: '0',
361
+ correct: true
362
+ }, {
363
+ label: 'past',
364
+ value: '1',
365
+ correct: true
366
+ }, {
367
+ label: 'beyond',
368
+ value: '2',
369
+ correct: true
370
+ }],
371
+ 2: [{
372
+ label: 'moon',
373
+ value: '0',
374
+ correct: true
375
+ }]
376
+ },
377
+ maxLengthPerChoice: [10, 10, 7],
378
+ env: env
379
+ }, expected));
380
+
381
+ case 6:
382
+ case "end":
383
+ return _context6.stop();
384
+ }
385
+ }
386
+ }, _callee6);
387
+ })));
388
+ };
389
+
390
+ assertEvaluate('- correct answer', {}, {
391
+ value: {
392
+ 0: 'cow',
393
+ 1: 'over',
394
+ 2: 'moon'
395
+ }
396
+ }, {
397
+ feedback: {
398
+ 0: 'correct',
399
+ 1: 'correct',
400
+ 2: 'correct'
401
+ },
402
+ showNote: true,
403
+ responseCorrect: true
404
+ });
405
+ assertEvaluate('- partially correct answer', {}, {
406
+ value: {
407
+ 0: 'cow',
408
+ 1: 'over',
409
+ 2: 'sun'
410
+ }
411
+ }, {
412
+ feedback: {
413
+ 0: 'correct',
414
+ 1: 'correct',
415
+ 2: 'incorrect'
416
+ },
417
+ showNote: true,
418
+ responseCorrect: false
419
+ });
420
+ assertEvaluate('- partially correct answer using alternates', {}, {
421
+ value: {
422
+ 0: 'calf',
423
+ 1: 'over',
424
+ 2: 'sun'
425
+ }
426
+ }, {
427
+ feedback: {
428
+ 0: 'correct',
429
+ 1: 'correct',
430
+ 2: 'incorrect'
431
+ },
432
+ showNote: true,
433
+ responseCorrect: false
434
+ });
435
+ assertEvaluate('- incorrect answer', {}, {
436
+ value: {
437
+ 0: 'han',
438
+ 1: 'above',
439
+ 2: 'chicken'
440
+ }
441
+ }, {
442
+ feedback: {
443
+ 0: 'incorrect',
444
+ 1: 'incorrect',
445
+ 2: 'incorrect'
446
+ },
447
+ showNote: true,
448
+ responseCorrect: false
449
+ });
450
+ });
451
+ describe('get score', function () {
452
+ var assertScore = function assertScore(session, expected) {
453
+ it('return score', function () {
454
+ var score = (0, _index.getScore)(question, session);
455
+ expect(score).toEqual(expected);
456
+ });
457
+ };
458
+
459
+ assertScore({
460
+ value: {
461
+ 0: 'cow',
462
+ 1: 'over',
463
+ 2: 'moon'
464
+ }
465
+ }, 1);
466
+ assertScore({
467
+ value: {
468
+ 0: 'cattle',
469
+ 1: 'over',
470
+ 2: 'moon'
471
+ }
472
+ }, 1);
473
+ assertScore({
474
+ value: {
475
+ 0: 'calf',
476
+ 1: 'over',
477
+ 2: 'moon'
478
+ }
479
+ }, 1);
480
+ assertScore({
481
+ value: {
482
+ 0: 'cow',
483
+ 1: 'past',
484
+ 2: 'moon'
485
+ }
486
+ }, 1);
487
+ assertScore({
488
+ value: {
489
+ 0: 'cattle',
490
+ 1: 'past',
491
+ 2: 'moon'
492
+ }
493
+ }, 1);
494
+ assertScore({
495
+ value: {
496
+ 0: 'calf',
497
+ 1: 'past',
498
+ 2: 'moon'
499
+ }
500
+ }, 1);
501
+ assertScore({
502
+ value: {
503
+ 0: 'cow',
504
+ 1: 'beyond',
505
+ 2: 'moon'
506
+ }
507
+ }, 1);
508
+ assertScore({
509
+ value: {
510
+ 0: 'cattle',
511
+ 1: 'beyond',
512
+ 2: 'moon'
513
+ }
514
+ }, 1);
515
+ assertScore({
516
+ value: {
517
+ 0: 'calf',
518
+ 1: 'beyond',
519
+ 2: 'moon'
520
+ }
521
+ }, 1);
522
+ assertScore({
523
+ value: {
524
+ 0: 'calf',
525
+ 1: 'under',
526
+ 2: 'moon'
527
+ }
528
+ }, 0.67);
529
+ assertScore({
530
+ value: {
531
+ 0: 'cat',
532
+ 1: 'under',
533
+ 2: 'moon'
534
+ }
535
+ }, 0.33);
536
+ assertScore({
537
+ value: {
538
+ 0: 'cat',
539
+ 1: 'under',
540
+ 2: 'sun'
541
+ }
542
+ }, 0);
543
+
544
+ var returnScore = function returnScore(session) {
545
+ it("score = 0 when session is ".concat(JSON.stringify(session)), function () {
546
+ expect((0, _index.getScore)(question, session)).toEqual(0);
547
+ });
548
+ };
549
+
550
+ returnScore(undefined);
551
+ returnScore(null);
552
+ returnScore({});
553
+ });
554
+ describe('outcome partialScoring test', function () {
555
+ var assertOutcome = function assertOutcome(message, extra, sessionValue, env, expected) {
556
+ it(message, /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7() {
557
+ var result;
558
+ return _regenerator["default"].wrap(function _callee7$(_context7) {
559
+ while (1) {
560
+ switch (_context7.prev = _context7.next) {
561
+ case 0:
562
+ _context7.next = 2;
563
+ return (0, _index.outcome)(_objectSpread(_objectSpread({}, question), extra), sessionValue, env);
564
+
565
+ case 2:
566
+ result = _context7.sent;
567
+ expect(result).toEqual(expect.objectContaining(expected));
568
+
569
+ case 4:
570
+ case "end":
571
+ return _context7.stop();
572
+ }
573
+ }
574
+ }, _callee7);
575
+ })));
576
+ };
577
+
578
+ assertOutcome('element.partialScoring = true', {
579
+ partialScoring: true
580
+ }, {
581
+ value: {
582
+ 0: 'calf',
583
+ 1: 'under',
584
+ 2: 'moon'
585
+ }
586
+ }, {
587
+ mode: 'evaluate'
588
+ }, {
589
+ score: 0.67
590
+ });
591
+ assertOutcome('element.partialScoring = false', {
592
+ partialScoring: false
593
+ }, {
594
+ value: {
595
+ 0: 'calf',
596
+ 1: 'under',
597
+ 2: 'moon'
598
+ }
599
+ }, {
600
+ mode: 'evaluate'
601
+ }, {
602
+ score: 0
603
+ });
604
+ assertOutcome('element.partialScoring = false, env.partialScoring = true', {
605
+ partialScoring: false
606
+ }, {
607
+ value: {
608
+ 0: 'calf',
609
+ 1: 'under',
610
+ 2: 'moon'
611
+ }
612
+ }, {
613
+ mode: 'evaluate',
614
+ partialScoring: true
615
+ }, {
616
+ score: 0
617
+ });
618
+ assertOutcome('element.partialScoring = true, env.partialScoring = false', {
619
+ partialScoring: true
620
+ }, {
621
+ value: {
622
+ 0: 'calf',
623
+ 1: 'under',
624
+ 2: 'moon'
625
+ }
626
+ }, {
627
+ mode: 'evaluate',
628
+ partialScoring: false
629
+ }, {
630
+ score: 0
631
+ });
632
+ });
633
+ describe('outcome', function () {
634
+ var assertOutcome = function assertOutcome(partialScoring, sessionValue, expected) {
635
+ it("partial score ".concat(partialScoring ? 'enabled' : ''), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8() {
636
+ var result;
637
+ return _regenerator["default"].wrap(function _callee8$(_context8) {
638
+ while (1) {
639
+ switch (_context8.prev = _context8.next) {
640
+ case 0:
641
+ _context8.next = 2;
642
+ return (0, _index.outcome)(_objectSpread(_objectSpread({}, question), {}, {
643
+ partialScoring: partialScoring
644
+ }), sessionValue);
645
+
646
+ case 2:
647
+ result = _context8.sent;
648
+ expect(result).toEqual(expected);
649
+
650
+ case 4:
651
+ case "end":
652
+ return _context8.stop();
653
+ }
654
+ }
655
+ }, _callee8);
656
+ })));
657
+ };
658
+
659
+ assertOutcome(true, {
660
+ value: {
661
+ 0: 'cow',
662
+ 1: 'over',
663
+ 2: 'moon'
664
+ }
665
+ }, {
666
+ score: 1,
667
+ empty: false
668
+ });
669
+ assertOutcome(true, {
670
+ value: {
671
+ 0: 'cattle',
672
+ 1: 'over',
673
+ 2: 'moon'
674
+ }
675
+ }, {
676
+ score: 1,
677
+ empty: false
678
+ });
679
+ assertOutcome(true, {
680
+ value: {
681
+ 0: 'calf',
682
+ 1: 'over',
683
+ 2: 'moon'
684
+ }
685
+ }, {
686
+ score: 1,
687
+ empty: false
688
+ });
689
+ assertOutcome(true, {
690
+ value: {
691
+ 0: 'cow',
692
+ 1: 'past',
693
+ 2: 'moon'
694
+ }
695
+ }, {
696
+ score: 1,
697
+ empty: false
698
+ });
699
+ assertOutcome(true, {
700
+ value: {
701
+ 0: 'cattle',
702
+ 1: 'past',
703
+ 2: 'moon'
704
+ }
705
+ }, {
706
+ score: 1,
707
+ empty: false
708
+ });
709
+ assertOutcome(true, {
710
+ value: {
711
+ 0: 'calf',
712
+ 1: 'past',
713
+ 2: 'moon'
714
+ }
715
+ }, {
716
+ score: 1,
717
+ empty: false
718
+ });
719
+ assertOutcome(true, {
720
+ value: {
721
+ 0: 'cow',
722
+ 1: 'beyond',
723
+ 2: 'moon'
724
+ }
725
+ }, {
726
+ score: 1,
727
+ empty: false
728
+ });
729
+ assertOutcome(true, {
730
+ value: {
731
+ 0: 'cattle',
732
+ 1: 'beyond',
733
+ 2: 'moon'
734
+ }
735
+ }, {
736
+ score: 1,
737
+ empty: false
738
+ });
739
+ assertOutcome(true, {
740
+ value: {
741
+ 0: 'calf',
742
+ 1: 'beyond',
743
+ 2: 'moon'
744
+ }
745
+ }, {
746
+ score: 1,
747
+ empty: false
748
+ });
749
+ assertOutcome(true, {
750
+ value: {
751
+ 0: 'calf',
752
+ 1: 'under',
753
+ 2: 'moon'
754
+ }
755
+ }, {
756
+ score: 0.67,
757
+ empty: false
758
+ });
759
+ assertOutcome(true, {
760
+ value: {
761
+ 0: 'cat',
762
+ 1: 'under',
763
+ 2: 'moon'
764
+ }
765
+ }, {
766
+ score: 0.33,
767
+ empty: false
768
+ });
769
+ assertOutcome(true, {
770
+ value: {
771
+ 0: 'cat',
772
+ 1: 'under',
773
+ 2: 'sun'
774
+ }
775
+ }, {
776
+ score: 0,
777
+ empty: false
778
+ });
779
+ assertOutcome(false, {
780
+ value: {
781
+ 0: 'cow',
782
+ 1: 'over',
783
+ 2: 'moon'
784
+ }
785
+ }, {
786
+ score: 1,
787
+ empty: false
788
+ });
789
+ assertOutcome(false, {
790
+ value: {
791
+ 0: 'cattle',
792
+ 1: 'over',
793
+ 2: 'moon'
794
+ }
795
+ }, {
796
+ score: 1,
797
+ empty: false
798
+ });
799
+ assertOutcome(false, {
800
+ value: {
801
+ 0: 'calf',
802
+ 1: 'over',
803
+ 2: 'moon'
804
+ }
805
+ }, {
806
+ score: 1,
807
+ empty: false
808
+ });
809
+ assertOutcome(false, {
810
+ value: {
811
+ 0: 'cow',
812
+ 1: 'past',
813
+ 2: 'moon'
814
+ }
815
+ }, {
816
+ score: 1,
817
+ empty: false
818
+ });
819
+ assertOutcome(false, {
820
+ value: {
821
+ 0: 'cattle',
822
+ 1: 'past',
823
+ 2: 'moon'
824
+ }
825
+ }, {
826
+ score: 1,
827
+ empty: false
828
+ });
829
+ assertOutcome(false, {
830
+ value: {
831
+ 0: 'calf',
832
+ 1: 'past',
833
+ 2: 'moon'
834
+ }
835
+ }, {
836
+ score: 1,
837
+ empty: false
838
+ });
839
+ assertOutcome(false, {
840
+ value: {
841
+ 0: 'cow',
842
+ 1: 'beyond',
843
+ 2: 'moon'
844
+ }
845
+ }, {
846
+ score: 1,
847
+ empty: false
848
+ });
849
+ assertOutcome(false, {
850
+ value: {
851
+ 0: 'cattle',
852
+ 1: 'beyond',
853
+ 2: 'moon'
854
+ }
855
+ }, {
856
+ score: 1,
857
+ empty: false
858
+ });
859
+ assertOutcome(false, {
860
+ value: {
861
+ 0: 'calf',
862
+ 1: 'beyond',
863
+ 2: 'moon'
864
+ }
865
+ }, {
866
+ score: 1,
867
+ empty: false
868
+ });
869
+ assertOutcome(false, {
870
+ value: {
871
+ 0: 'calf',
872
+ 1: 'under',
873
+ 2: 'moon'
874
+ }
875
+ }, {
876
+ score: 0,
877
+ empty: false
878
+ });
879
+ assertOutcome(false, {
880
+ value: {
881
+ 0: 'cat',
882
+ 1: 'under',
883
+ 2: 'moon'
884
+ }
885
+ }, {
886
+ score: 0,
887
+ empty: false
888
+ });
889
+ assertOutcome(false, {
890
+ value: {
891
+ 0: 'cat',
892
+ 1: 'under',
893
+ 2: 'sun'
894
+ }
895
+ }, {
896
+ score: 0,
897
+ empty: false
898
+ });
899
+
900
+ var returnModel = function returnModel(session) {
901
+ it("empty: true when session is ".concat(JSON.stringify(session)), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9() {
902
+ var m;
903
+ return _regenerator["default"].wrap(function _callee9$(_context9) {
904
+ while (1) {
905
+ switch (_context9.prev = _context9.next) {
906
+ case 0:
907
+ _context9.next = 2;
908
+ return (0, _index.outcome)(question, session);
909
+
910
+ case 2:
911
+ m = _context9.sent;
912
+ expect(m).toEqual(expect.objectContaining({
913
+ score: 0,
914
+ empty: true
915
+ }));
916
+
917
+ case 4:
918
+ case "end":
919
+ return _context9.stop();
920
+ }
921
+ }
922
+ }, _callee9);
923
+ })));
924
+ };
925
+
926
+ returnModel(undefined);
927
+ returnModel(null);
928
+ returnModel({});
929
+ });
930
+ describe('prepareVal', function () {
931
+ it('should return empty string on null or undefined', function () {
932
+ expect((0, _index.prepareVal)(null)).toEqual('');
933
+ expect((0, _index.prepareVal)(undefined)).toEqual('');
934
+ });
935
+ it('should remove html tags', function () {
936
+ expect((0, _index.prepareVal)('<div>Foo Bar</div>')).toEqual('Foo Bar');
937
+ });
938
+ describe('correct response', function () {
939
+ var question;
940
+ beforeEach(function () {
941
+ question = {
942
+ choices: choices
943
+ };
944
+ });
945
+ it('returns correct response if env is correct', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee10() {
946
+ var sess;
947
+ return _regenerator["default"].wrap(function _callee10$(_context10) {
948
+ while (1) {
949
+ switch (_context10.prev = _context10.next) {
950
+ case 0:
951
+ _context10.next = 2;
952
+ return (0, _index.createCorrectResponseSession)(question, {
953
+ mode: 'gather',
954
+ role: 'instructor'
955
+ });
956
+
957
+ case 2:
958
+ sess = _context10.sent;
959
+ expect(sess).toEqual({
960
+ id: '1',
961
+ value: {
962
+ 0: 'cow',
963
+ 1: 'over',
964
+ 2: 'moon'
965
+ }
966
+ });
967
+
968
+ case 4:
969
+ case "end":
970
+ return _context10.stop();
971
+ }
972
+ }
973
+ }, _callee10);
974
+ })));
975
+ it('returns null env is student', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee11() {
976
+ var noResult;
977
+ return _regenerator["default"].wrap(function _callee11$(_context11) {
978
+ while (1) {
979
+ switch (_context11.prev = _context11.next) {
980
+ case 0:
981
+ _context11.next = 2;
982
+ return (0, _index.createCorrectResponseSession)(question, {
983
+ mode: 'gather',
984
+ role: 'student'
985
+ });
986
+
987
+ case 2:
988
+ noResult = _context11.sent;
989
+ expect(noResult).toBeNull();
990
+
991
+ case 4:
992
+ case "end":
993
+ return _context11.stop();
994
+ }
995
+ }
996
+ }, _callee11);
997
+ })));
998
+ });
999
+ });
1000
+ describe('correct response', function () {
1001
+ it('returns correct response if role is instructor and mode is gather', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee12() {
1002
+ var sess;
1003
+ return _regenerator["default"].wrap(function _callee12$(_context12) {
1004
+ while (1) {
1005
+ switch (_context12.prev = _context12.next) {
1006
+ case 0:
1007
+ _context12.next = 2;
1008
+ return (0, _index.createCorrectResponseSession)(question, {
1009
+ mode: 'gather',
1010
+ role: 'instructor'
1011
+ });
1012
+
1013
+ case 2:
1014
+ sess = _context12.sent;
1015
+ expect(sess).toEqual({
1016
+ id: '1',
1017
+ value: {
1018
+ 0: 'cow',
1019
+ 1: 'over',
1020
+ 2: 'moon'
1021
+ }
1022
+ });
1023
+
1024
+ case 4:
1025
+ case "end":
1026
+ return _context12.stop();
1027
+ }
1028
+ }
1029
+ }, _callee12);
1030
+ })));
1031
+ it('returns correct response if role is instructor and mode is view', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee13() {
1032
+ var sess;
1033
+ return _regenerator["default"].wrap(function _callee13$(_context13) {
1034
+ while (1) {
1035
+ switch (_context13.prev = _context13.next) {
1036
+ case 0:
1037
+ _context13.next = 2;
1038
+ return (0, _index.createCorrectResponseSession)(question, {
1039
+ mode: 'view',
1040
+ role: 'instructor'
1041
+ });
1042
+
1043
+ case 2:
1044
+ sess = _context13.sent;
1045
+ expect(sess).toEqual({
1046
+ id: '1',
1047
+ value: {
1048
+ 0: 'cow',
1049
+ 1: 'over',
1050
+ 2: 'moon'
1051
+ }
1052
+ });
1053
+
1054
+ case 4:
1055
+ case "end":
1056
+ return _context13.stop();
1057
+ }
1058
+ }
1059
+ }, _callee13);
1060
+ })));
1061
+ it('returns null if mode is evaluate', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee14() {
1062
+ var noResult;
1063
+ return _regenerator["default"].wrap(function _callee14$(_context14) {
1064
+ while (1) {
1065
+ switch (_context14.prev = _context14.next) {
1066
+ case 0:
1067
+ _context14.next = 2;
1068
+ return (0, _index.createCorrectResponseSession)(question, {
1069
+ mode: 'evaluate',
1070
+ role: 'instructor'
1071
+ });
1072
+
1073
+ case 2:
1074
+ noResult = _context14.sent;
1075
+ expect(noResult).toBeNull();
1076
+
1077
+ case 4:
1078
+ case "end":
1079
+ return _context14.stop();
1080
+ }
1081
+ }
1082
+ }, _callee14);
1083
+ })));
1084
+ it('returns null if role is student', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee15() {
1085
+ var noResult;
1086
+ return _regenerator["default"].wrap(function _callee15$(_context15) {
1087
+ while (1) {
1088
+ switch (_context15.prev = _context15.next) {
1089
+ case 0:
1090
+ _context15.next = 2;
1091
+ return (0, _index.createCorrectResponseSession)(question, {
1092
+ mode: 'gather',
1093
+ role: 'student'
1094
+ });
1095
+
1096
+ case 2:
1097
+ noResult = _context15.sent;
1098
+ expect(noResult).toBeNull();
1099
+
1100
+ case 4:
1101
+ case "end":
1102
+ return _context15.stop();
1103
+ }
1104
+ }
1105
+ }, _callee15);
1106
+ })));
1107
+ });
1108
+ describe('prepareChoice', function () {
1109
+ var assertPrepareChoice = function assertPrepareChoice(env, defaultFeedback, choice, expected) {
1110
+ var preparChoiceFn = (0, _index.prepareChoice)(env.mode, defaultFeedback);
1111
+ it("prepare choices in ".concat(env.mode, " mode: ").concat(JSON.stringify(choice), " -> ").concat(JSON.stringify(expected)), function () {
1112
+ expect(preparChoiceFn(choice)).toEqual(expected);
1113
+ });
1114
+ };
1115
+
1116
+ assertPrepareChoice({
1117
+ mode: 'gather'
1118
+ }, {
1119
+ correct: 'Correct',
1120
+ incorrect: 'Incorrect'
1121
+ }, {
1122
+ value: '0',
1123
+ label: 'cow'
1124
+ }, {
1125
+ value: '0',
1126
+ label: 'cow'
1127
+ });
1128
+ assertPrepareChoice({
1129
+ mode: 'view'
1130
+ }, {
1131
+ correct: 'Correct',
1132
+ incorrect: 'Incorrect'
1133
+ }, {
1134
+ value: '0',
1135
+ label: 'cow'
1136
+ }, {
1137
+ value: '0',
1138
+ label: 'cow'
1139
+ });
1140
+ assertPrepareChoice({
1141
+ mode: 'evaluate'
1142
+ }, {
1143
+ correct: 'Correct',
1144
+ incorrect: 'Incorrect'
1145
+ }, {
1146
+ value: '0',
1147
+ label: 'cow'
1148
+ }, {
1149
+ value: '0',
1150
+ label: 'cow',
1151
+ correct: true
1152
+ });
1153
+ assertPrepareChoice({
1154
+ mode: 'evaluate'
1155
+ }, {
1156
+ correct: 'Correct',
1157
+ incorrect: 'Incorrect'
1158
+ }, {
1159
+ value: '0',
1160
+ label: 'cow',
1161
+ feedback: {
1162
+ type: 'default'
1163
+ }
1164
+ }, {
1165
+ value: '0',
1166
+ label: 'cow',
1167
+ correct: true,
1168
+ feedback: 'Correct'
1169
+ });
1170
+ assertPrepareChoice({
1171
+ mode: 'evaluate'
1172
+ }, {
1173
+ correct: 'Correct',
1174
+ incorrect: 'Incorrect'
1175
+ }, {
1176
+ value: '0',
1177
+ label: 'cow',
1178
+ feedback: {
1179
+ type: 'custom'
1180
+ }
1181
+ }, {
1182
+ value: '0',
1183
+ label: 'cow',
1184
+ correct: true,
1185
+ feedback: undefined
1186
+ });
1187
+ assertPrepareChoice({
1188
+ mode: 'evaluate'
1189
+ }, {
1190
+ correct: 'Correct',
1191
+ incorrect: 'Incorrect'
1192
+ }, {
1193
+ value: '0',
1194
+ label: 'cow',
1195
+ feedback: {
1196
+ type: 'custom',
1197
+ value: 'Custom Feedback'
1198
+ }
1199
+ }, {
1200
+ value: '0',
1201
+ label: 'cow',
1202
+ correct: true,
1203
+ feedback: 'Custom Feedback'
1204
+ });
1205
+ });
1206
+ });
1207
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vaW5kZXgudGVzdC5qcyJdLCJuYW1lcyI6WyJqZXN0IiwibW9jayIsImdldFNodWZmbGVkQ2hvaWNlcyIsImNob2ljZXMiLCJzZXNzaW9uIiwidXBkYXRlU2Vzc2lvbiIsImtleSIsImN1cnJlbnRTaHVmZmxlZCIsInNodWZmbGVkVmFsdWVzIiwiZmlsdGVyIiwidiIsImxlbmd0aCIsInBhcnRpYWxTY29yaW5nIiwiZW5hYmxlZCIsImNvbmZpZyIsImVudiIsImNob2ljZSIsImwiLCJsYWJlbCIsInZhbHVlIiwicXVlc3Rpb24iLCJtYXJrdXAiLCJkaXNhYmxlZCIsInByb21wdCIsIm5vdGUiLCJkZXNjcmliZSIsInEiLCJpdCIsIm1vZGUiLCJtIiwiZXhwZWN0IiwidG9FcXVhbCIsIm9iamVjdENvbnRhaW5pbmciLCJmZWVkYmFjayIsInJlc3BvbnNlQ29ycmVjdCIsInJldHVybk1vZGVsIiwiSlNPTiIsInN0cmluZ2lmeSIsInVuZGVmaW5lZCIsImFzc2VydEdhdGhlciIsImV4dHJhIiwiZXhwZWN0ZWQiLCJ0ZWFjaGVySW5zdHJ1Y3Rpb25zIiwicmF0aW9uYWxlIiwiaWQiLCJlbGVtZW50IiwicmVzdWx0IiwibWF4TGVuZ3RoUGVyQ2hvaWNlIiwic2hvd05vdGUiLCJwcm9tcHRFbmFibGVkIiwicmF0aW9uYWxlRW5hYmxlZCIsInRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkIiwic3R1ZGVudEluc3RydWN0aW9uc0VuYWJsZWQiLCJhc3NlcnRWaWV3Iiwicm9sZSIsImFzc2VydFZpZXdTdHVkZW50IiwiYXNzZXJ0RXZhbHVhdGUiLCJjb3JyZWN0IiwiYXNzZXJ0U2NvcmUiLCJzY29yZSIsInJldHVyblNjb3JlIiwiYXNzZXJ0T3V0Y29tZSIsIm1lc3NhZ2UiLCJzZXNzaW9uVmFsdWUiLCJlbXB0eSIsImJlZm9yZUVhY2giLCJzZXNzIiwibm9SZXN1bHQiLCJ0b0JlTnVsbCIsImFzc2VydFByZXBhcmVDaG9pY2UiLCJk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Q0FBUjtBQW1ERCxDQTdrQk8sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG1vZGVsLCBnZXRTY29yZSwgb3V0Y29tZSwgcHJlcGFyZVZhbCwgY3JlYXRlQ29ycmVjdFJlc3BvbnNlU2Vzc2lvbiwgcHJlcGFyZUNob2ljZSB9IGZyb20gJy4uL2luZGV4JztcblxuamVzdC5tb2NrKCdAcGllLWxpYi9waWUtdG9vbGJveC9jb250cm9sbGVyLXV0aWxzJywgKCkgPT4gKHtcbiAgZ2V0U2h1ZmZsZWRDaG9pY2VzOiAoY2hvaWNlcywgc2Vzc2lvbiwgdXBkYXRlU2Vzc2lvbiwga2V5KSA9PiB7XG4gICAgY29uc3QgY3VycmVudFNodWZmbGVkID0gKChzZXNzaW9uIHx8IHt9KS5zaHVmZmxlZFZhbHVlcyB8fCBbXSkuZmlsdGVyKCh2KSA9PiB2KTtcblxuICAgIGlmIChzZXNzaW9uICYmICFjdXJyZW50U2h1ZmZsZWQubGVuZ3RoICYmIHVwZGF0ZVNlc3Npb24gJiYgdHlwZW9mIHVwZGF0ZVNlc3Npb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHVwZGF0ZVNlc3Npb24oKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2hvaWNlcztcbiAgfSxcbiAgcGFydGlhbFNjb3Jpbmc6IHtcbiAgICBlbmFibGVkOiAoY29uZmlnLCBlbnYpID0+IHtcbiAgICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcbiAgICAgIGVudiA9IGVudiB8fCB7fTtcblxuICAgICAgaWYgKGNvbmZpZy5wYXJ0aWFsU2NvcmluZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW52LnBhcnRpYWxTY29yaW5nID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gIH0sXG59KSk7XG5cbmNvbnN0IGNob2ljZSA9IChsLCB2KSA9PiAoeyBsYWJlbDogbCwgdmFsdWU6IHYgfSk7XG5jb25zdCBjaG9pY2VzID0ge1xuICAwOiBbY2hvaWNlKCdjb3cnLCAnMCcpLCBjaG9pY2UoJ2NhdHRsZScsICcxJyksIGNob2ljZSgnY2FsZicsICcyJyldLFxuICAxOiBbY2hvaWNlKCdvdmVyJywgJzAnKSwgY2hvaWNlKCdwYXN0JywgJzEnKSwgY2hvaWNlKCdiZXlvbmQnLCAnMicpXSxcbiAgMjogW2Nob2ljZSgnbW9vbicsICcwJyldLFxufTtcblxuY29uc3QgcXVlc3Rpb24gPSB7XG4gIG1hcmt1cDogJzxwPlRoZSB7ezB9fSBqdW1wZWQge3sxfX0gdGhlIHt7Mn19PC9wPicsXG4gIGRpc2FibGVkOiBmYWxzZSxcbiAgY2hvaWNlcyxcbiAgcHJvbXB0OiAnQ29tcGxldGUgdGhlIHNlbnRlbmNlJyxcbiAgbm90ZTogJ1RoZSBhbnN3ZXIgc2hvd24gYWJvdmUgaXMgdGhlIG1vc3QgY29tbW9uIGNvcnJlY3QgYW5zd2VyIGZvciB0aGlzIGl0ZW0uJyxcbn07XG5cbmRlc2NyaWJlKCdjb250cm9sbGVyJywgKCkgPT4ge1xuICBkZXNjcmliZSgnbW9kZWwnLCAoKSA9PiB7XG4gICAgbGV0IHEsIGVudjtcblxuICAgIGl0KCdvdXRwdXQgd2hlbiBzZXNzaW9uIGlzIGRlZmluZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBtID0gYXdhaXQgbW9kZWwocXVlc3Rpb24sIHsgdmFsdWU6IHsgMDogJ2NvdycsIDE6ICdvdmVyJywgMjogJ21vb24nIH0gfSwgeyBtb2RlOiAnZXZhbHVhdGUnIH0pO1xuXG4gICAgICBleHBlY3QobSkudG9FcXVhbChcbiAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgIGZlZWRiYWNrOiB7IDA6ICdjb3JyZWN0JywgMTogJ2NvcnJlY3QnLCAyOiAnY29ycmVjdCcgfSxcbiAgICAgICAgICByZXNwb25zZUNvcnJlY3Q6IHRydWUsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHJldHVybk1vZGVsID0gKHNlc3Npb24pID0+IHtcbiAgICAgIGl0KGBvdXRwdXQgd2hlbiBzZXNzaW9uIGlzICR7SlNPTi5zdHJpbmdpZnkoc2Vzc2lvbil9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBtID0gYXdhaXQgbW9kZWwocXVlc3Rpb24sIHNlc3Npb24sIHsgbW9kZTogJ2V2YWx1YXRlJyB9KTtcblxuICAgICAgICBleHBlY3QobSkudG9FcXVhbChcbiAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICBmZWVkYmFjazogeyAwOiAnaW5jb3JyZWN0JywgMTogJ2luY29ycmVjdCcsIDI6ICdpbmNvcnJlY3QnIH0sXG4gICAgICAgICAgICByZXNwb25zZUNvcnJlY3Q6IGZhbHNlLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybk1vZGVsKHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuTW9kZWwobnVsbCk7XG4gICAgcmV0dXJuTW9kZWwoe30pO1xuXG4gICAgY29uc3QgYXNzZXJ0R2F0aGVyID0gKGxhYmVsLCBleHRyYSwgc2Vzc2lvbiwgZXhwZWN0ZWQpID0+IHtcbiAgICAgIGl0KGAnbW9kZTogZ2F0aGVyLCAke2xhYmVsfSdgLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHEgPSB7XG4gICAgICAgICAgLi4ucXVlc3Rpb24sXG4gICAgICAgICAgdGVhY2hlckluc3RydWN0aW9uczogJ1RlYWNoZXIgSW5zdHJ1Y3Rpb25zJyxcbiAgICAgICAgICByYXRpb25hbGU6ICdSYXRpb25hbGUnLFxuICAgICAgICAgIC4uLmV4dHJhLFxuICAgICAgICB9O1xuICAgICAgICBlbnYgPSB7IG1vZGU6ICdnYXRoZXInIH07XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbW9kZWwoXG4gICAgICAgICAgcSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogJzEnLFxuICAgICAgICAgICAgZWxlbWVudDogJ2V4cGxpY2l0LWNvbnN0cnVjdGVkLXJlc3BvbnNlJyxcbiAgICAgICAgICAgIC4uLnNlc3Npb24sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBlbnYsXG4gICAgICAgICk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbCh7XG4gICAgICAgICAgLi4ucXVlc3Rpb24sXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgIG1vZGU6ICdnYXRoZXInLFxuICAgICAgICAgIGZlZWRiYWNrOiB7fSxcbiAgICAgICAgICByZXNwb25zZUNvcnJlY3Q6IHVuZGVmaW5lZCxcbiAgICAgICAgICBtYXhMZW5ndGhQZXJDaG9pY2U6IFsxMCwgMTAsIDddLFxuICAgICAgICAgIGVudixcbiAgICAgICAgICAuLi5leHBlY3RlZCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgYXNzZXJ0R2F0aGVyKFxuICAgICAgJ3Byb21wdEVuYWJsZWQsIHJhdGlvbmFsZUVuYWJsZWQgYW5kIHRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkIG5vdCBzZXQnLFxuICAgICAge30sXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgcmF0aW9uYWxlOiBudWxsLFxuICAgICAgICBzaG93Tm90ZTogdHJ1ZSxcbiAgICAgICAgdGVhY2hlckluc3RydWN0aW9uczogbnVsbCxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGFzc2VydEdhdGhlcihcbiAgICAgICdwcm9tcHRFbmFibGVkLCByYXRpb25hbGVFbmFibGVkIGFuZCB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZCBzZXQgdG8gZmFsc2UnLFxuICAgICAge1xuICAgICAgICBwcm9tcHRFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgcmF0aW9uYWxlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgc3R1ZGVudEluc3RydWN0aW9uc0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBwcm9tcHQ6IG51bGwsXG4gICAgICAgIHJhdGlvbmFsZTogbnVsbCxcbiAgICAgICAgc2hvd05vdGU6IHRydWUsXG4gICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6IG51bGwsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCBhc3NlcnRWaWV3ID0gKGxhYmVsLCBleHRyYSwgc2Vzc2lvbiwgZXhwZWN0ZWQpID0+IHtcbiAgICAgIGl0KGAnbW9kZTogdmlldywgJHtsYWJlbH0nYCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBxID0ge1xuICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6ICdUZWFjaGVyIEluc3RydWN0aW9ucycsXG4gICAgICAgICAgcmF0aW9uYWxlOiAnUmF0aW9uYWxlJyxcbiAgICAgICAgICAuLi5leHRyYSxcbiAgICAgICAgfTtcbiAgICAgICAgZW52ID0geyBtb2RlOiAndmlldycsIHJvbGU6ICdpbnN0cnVjdG9yJyB9O1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1vZGVsKFxuICAgICAgICAgIHEsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICcxJyxcbiAgICAgICAgICAgIGVsZW1lbnQ6ICdleHBsaWNpdC1jb25zdHJ1Y3RlZC1yZXNwb25zZScsXG4gICAgICAgICAgICAuLi5zZXNzaW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZW52LFxuICAgICAgICApO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoe1xuICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgIG1vZGU6ICd2aWV3JyxcbiAgICAgICAgICBkaXNhYmxlZDogdHJ1ZSxcbiAgICAgICAgICBmZWVkYmFjazoge30sXG4gICAgICAgICAgcmVzcG9uc2VDb3JyZWN0OiB1bmRlZmluZWQsXG4gICAgICAgICAgZW52LFxuICAgICAgICAgIG1heExlbmd0aFBlckNob2ljZTogWzEwLCAxMCwgN10sXG4gICAgICAgICAgLi4uZXhwZWN0ZWQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGFzc2VydFZpZXcoXG4gICAgICAnICsgcm9sZTogaW5zdHJ1Y3RvciwgcHJvbXB0RW5hYmxlZCwgcmF0aW9uYWxlRW5hYmxlZCBhbmQgdGVhY2hlckluc3RydWN0aW9uc0VuYWJsZWQgc2V0IHRvIGZhbHNlJyxcbiAgICAgIHtcbiAgICAgICAgcHJvbXB0RW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHJhdGlvbmFsZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHN0dWRlbnRJbnN0cnVjdGlvbnNFbmFibGVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgcHJvbXB0OiBudWxsLFxuICAgICAgICByYXRpb25hbGU6IG51bGwsXG4gICAgICAgIHNob3dOb3RlOiB0cnVlLFxuICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiBudWxsLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0VmlldyhcbiAgICAgICcgKyByb2xlOiBpbnN0cnVjdG9yLCBwcm9tcHRFbmFibGVkLCByYXRpb25hbGVFbmFibGVkIGFuZCB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZCB1bnNldCcsXG4gICAgICB7fSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiAnVGVhY2hlciBJbnN0cnVjdGlvbnMnLFxuICAgICAgICBzaG93Tm90ZTogdHJ1ZSxcbiAgICAgICAgcmF0aW9uYWxlOiAnUmF0aW9uYWxlJyxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGNvbnN0IGFzc2VydFZpZXdTdHVkZW50ID0gKGxhYmVsLCBleHRyYSwgc2Vzc2lvbiwgZXhwZWN0ZWQpID0+IHtcbiAgICAgIGl0KGAnbW9kZTogdmlldywgJHtsYWJlbH0nYCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBxID0ge1xuICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6ICdUZWFjaGVyIEluc3RydWN0aW9ucycsXG4gICAgICAgICAgcmF0aW9uYWxlOiAnUmF0aW9uYWxlJyxcbiAgICAgICAgICAuLi5leHRyYSxcbiAgICAgICAgfTtcbiAgICAgICAgZW52ID0geyBtb2RlOiAndmlldycsIHJvbGU6ICcgc3R1ZGVudCcgfTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBtb2RlbChcbiAgICAgICAgICBxLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAnMScsXG4gICAgICAgICAgICBlbGVtZW50OiAnZXhwbGljaXQtY29uc3RydWN0ZWQtcmVzcG9uc2UnLFxuICAgICAgICAgICAgLi4uc2Vzc2lvbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVudixcbiAgICAgICAgKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKHtcbiAgICAgICAgICAuLi5xdWVzdGlvbixcbiAgICAgICAgICBtb2RlOiAndmlldycsXG4gICAgICAgICAgZGlzYWJsZWQ6IHRydWUsXG4gICAgICAgICAgZmVlZGJhY2s6IHt9LFxuICAgICAgICAgIHJlc3BvbnNlQ29ycmVjdDogdW5kZWZpbmVkLFxuICAgICAgICAgIG1heExlbmd0aFBlckNob2ljZTogWzEwLCAxMCwgN10sXG4gICAgICAgICAgZW52LFxuICAgICAgICAgIC4uLmV4cGVjdGVkLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBhc3NlcnRWaWV3U3R1ZGVudChcbiAgICAgICcgKyByb2xlOiBzdHVkZW50LCBwcm9tcHRFbmFibGVkLCByYXRpb25hbGVFbmFibGVkIGFuZCB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZCBzZXQgdG8gZmFsc2UnLFxuICAgICAge1xuICAgICAgICBwcm9tcHRFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgcmF0aW9uYWxlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgc3R1ZGVudEluc3RydWN0aW9uc0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBwcm9tcHQ6IG51bGwsXG4gICAgICAgIHJhdGlvbmFsZTogbnVsbCxcbiAgICAgICAgc2hvd05vdGU6IHRydWUsXG4gICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6IG51bGwsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBhc3NlcnRWaWV3U3R1ZGVudChcbiAgICAgICcgKyByb2xlOiBzdHVkZW50LCBwcm9tcHRFbmFibGVkLCByYXRpb25hbGVFbmFibGVkIGFuZCB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZCB1bnNldCcsXG4gICAgICB7fSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICByYXRpb25hbGU6IG51bGwsXG4gICAgICAgIHNob3dOb3RlOiB0cnVlLFxuICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiBudWxsLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgY29uc3QgYXNzZXJ0RXZhbHVhdGUgPSAobGFiZWwsIGV4dHJhLCBzZXNzaW9uLCBleHBlY3RlZCkgPT4ge1xuICAgICAgaXQoYCdtb2RlOiBldmFsdWF0ZSwgJHtsYWJlbH0nYCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBxID0ge1xuICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6ICdUZWFjaGVyIEluc3RydWN0aW9ucycsXG4gICAgICAgICAgcmF0aW9uYWxlOiAnUmF0aW9uYWxlJyxcbiAgICAgICAgICAuLi5leHRyYSxcbiAgICAgICAgfTtcbiAgICAgICAgZW52ID0geyBtb2RlOiAnZXZhbHVhdGUnLCByb2xlOiAnaW5zdHJ1Y3RvcicgfTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBtb2RlbChcbiAgICAgICAgICBxLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAnMScsXG4gICAgICAgICAgICBlbGVtZW50OiAnZXhwbGljaXQtY29uc3RydWN0ZWQtcmVzcG9uc2UnLFxuICAgICAgICAgICAgLi4uc2Vzc2lvbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVudixcbiAgICAgICAgKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKHtcbiAgICAgICAgICAuLi5xdWVzdGlvbixcbiAgICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiAnVGVhY2hlciBJbnN0cnVjdGlvbnMnLFxuICAgICAgICAgIHJhdGlvbmFsZTogJ1JhdGlvbmFsZScsXG4gICAgICAgICAgbW9kZTogJ2V2YWx1YXRlJyxcbiAgICAgICAgICBkaXNhYmxlZDogdHJ1ZSxcbiAgICAgICAgICBjaG9pY2VzOiB7XG4gICAgICAgICAgICAwOiBbXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdjb3cnLCB2YWx1ZTogJzAnLCBjb3JyZWN0OiB0cnVlIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdjYXR0bGUnLCB2YWx1ZTogJzEnLCBjb3JyZWN0OiB0cnVlIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdjYWxmJywgdmFsdWU6ICcyJywgY29ycmVjdDogdHJ1ZSB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIDE6IFtcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ292ZXInLCB2YWx1ZTogJzAnLCBjb3JyZWN0OiB0cnVlIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdwYXN0JywgdmFsdWU6ICcxJywgY29ycmVjdDogdHJ1ZSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnYmV5b25kJywgdmFsdWU6ICcyJywgY29ycmVjdDogdHJ1ZSB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIDI6IFt7IGxhYmVsOiAnbW9vbicsIHZhbHVlOiAnMCcsIGNvcnJlY3Q6IHRydWUgfV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtYXhMZW5ndGhQZXJDaG9pY2U6IFsxMCwgMTAsIDddLFxuICAgICAgICAgIGVudixcbiAgICAgICAgICAuLi5leHBlY3RlZCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgYXNzZXJ0RXZhbHVhdGUoXG4gICAgICAnLSBjb3JyZWN0IGFuc3dlcicsXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAwOiAnY293JyxcbiAgICAgICAgICAxOiAnb3ZlcicsXG4gICAgICAgICAgMjogJ21vb24nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZmVlZGJhY2s6IHsgMDogJ2NvcnJlY3QnLCAxOiAnY29ycmVjdCcsIDI6ICdjb3JyZWN0JyB9LFxuICAgICAgICBzaG93Tm90ZTogdHJ1ZSxcbiAgICAgICAgcmVzcG9uc2VDb3JyZWN0OiB0cnVlLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0RXZhbHVhdGUoXG4gICAgICAnLSBwYXJ0aWFsbHkgY29ycmVjdCBhbnN3ZXInLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgMDogJ2NvdycsXG4gICAgICAgICAgMTogJ292ZXInLFxuICAgICAgICAgIDI6ICdzdW4nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZmVlZGJhY2s6IHsgMDogJ2NvcnJlY3QnLCAxOiAnY29ycmVjdCcsIDI6ICdpbmNvcnJlY3QnIH0sXG4gICAgICAgIHNob3dOb3RlOiB0cnVlLFxuICAgICAgICByZXNwb25zZUNvcnJlY3Q6IGZhbHNlLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0RXZhbHVhdGUoXG4gICAgICAnLSBwYXJ0aWFsbHkgY29ycmVjdCBhbnN3ZXIgdXNpbmcgYWx0ZXJuYXRlcycsXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAwOiAnY2FsZicsXG4gICAgICAgICAgMTogJ292ZXInLFxuICAgICAgICAgIDI6ICdzdW4nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZmVlZGJhY2s6IHsgMDogJ2NvcnJlY3QnLCAxOiAnY29ycmVjdCcsIDI6ICdpbmNvcnJlY3QnIH0sXG4gICAgICAgIHNob3dOb3RlOiB0cnVlLFxuICAgICAgICByZXNwb25zZUNvcnJlY3Q6IGZhbHNlLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0RXZhbHVhdGUoXG4gICAgICAnLSBpbmNvcnJlY3QgYW5zd2VyJyxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIDA6ICdoYW4nLFxuICAgICAgICAgIDE6ICdhYm92ZScsXG4gICAgICAgICAgMjogJ2NoaWNrZW4nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZmVlZGJhY2s6IHsgMDogJ2luY29ycmVjdCcsIDE6ICdpbmNvcnJlY3QnLCAyOiAnaW5jb3JyZWN0JyB9LFxuICAgICAgICBzaG93Tm90ZTogdHJ1ZSxcbiAgICAgICAgcmVzcG9uc2VDb3JyZWN0OiBmYWxzZSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldCBzY29yZScsICgpID0+IHtcbiAgICBjb25zdCBhc3NlcnRTY29yZSA9IChzZXNzaW9uLCBleHBlY3RlZCkgPT4ge1xuICAgICAgaXQoJ3JldHVybiBzY29yZScsICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2NvcmUgPSBnZXRTY29yZShxdWVzdGlvbiwgc2Vzc2lvbik7XG5cbiAgICAgICAgZXhwZWN0KHNjb3JlKS50b0VxdWFsKGV4cGVjdGVkKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBhc3NlcnRTY29yZSh7IHZhbHVlOiB7IDA6ICdjb3cnLCAxOiAnb3ZlcicsIDI6ICdtb29uJyB9IH0sIDEpO1xuICAgIGFzc2VydFNjb3JlKHsgdmFsdWU6IHsgMDogJ2NhdHRsZScsIDE6ICdvdmVyJywgMjogJ21vb24nIH0gfSwgMSk7XG4gICAgYXNzZXJ0U2NvcmUoeyB2YWx1ZTogeyAwOiAnY2FsZicsIDE6ICdvdmVyJywgMjogJ21vb24nIH0gfSwgMSk7XG4gICAgYXNzZXJ0U2NvcmUoeyB2YWx1ZTogeyAwOiAnY293JywgMTogJ3Bhc3QnLCAyOiAnbW9vbicgfSB9LCAxKTtcbiAgICBhc3NlcnRTY29yZSh7IHZhbHVlOiB7IDA6ICdjYXR0bGUnLCAxOiAncGFzdCcsIDI6ICdtb29uJyB9IH0sIDEpO1xuICAgIGFzc2VydFNjb3JlKHsgdmFsdWU6IHsgMDogJ2NhbGYnLCAxOiAncGFzdCcsIDI6ICdtb29uJyB9IH0sIDEpO1xuICAgIGFzc2VydFNjb3JlKHsgdmFsdWU6IHsgMDogJ2NvdycsIDE6ICdiZXlvbmQnLCAyOiAnbW9vbicgfSB9LCAxKTtcbiAgICBhc3NlcnRTY29yZSh7IHZhbHVlOiB7IDA6ICdjYXR0bGUnLCAxOiAnYmV5b25kJywgMjogJ21vb24nIH0gfSwgMSk7XG4gICAgYXNzZXJ0U2NvcmUoeyB2YWx1ZTogeyAwOiAnY2FsZicsIDE6ICdiZXlvbmQnLCAyOiAnbW9vbicgfSB9LCAxKTtcblxuICAgIGFzc2VydFNjb3JlKHsgdmFsdWU6IHsgMDogJ2NhbGYnLCAxOiAndW5kZXInLCAyOiAnbW9vbicgfSB9LCAwLjY3KTtcbiAgICBhc3NlcnRTY29yZSh7IHZhbHVlOiB7IDA6ICdjYXQnLCAxOiAndW5kZXInLCAyOiAnbW9vbicgfSB9LCAwLjMzKTtcbiAgICBhc3NlcnRTY29yZSh7IHZhbHVlOiB7IDA6ICdjYXQnLCAxOiAndW5kZXInLCAyOiAnc3VuJyB9IH0sIDApO1xuXG4gICAgY29uc3QgcmV0dXJuU2NvcmUgPSAoc2Vzc2lvbikgPT4ge1xuICAgICAgaXQoYHNjb3JlID0gMCB3aGVuIHNlc3Npb24gaXMgJHtKU09OLnN0cmluZ2lmeShzZXNzaW9uKX1gLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChnZXRTY29yZShxdWVzdGlvbiwgc2Vzc2lvbikpLnRvRXF1YWwoMCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuU2NvcmUodW5kZWZpbmVkKTtcbiAgICByZXR1cm5TY29yZShudWxsKTtcbiAgICByZXR1cm5TY29yZSh7fSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdvdXRjb21lIHBhcnRpYWxTY29yaW5nIHRlc3QnLCAoKSA9PiB7XG4gICAgY29uc3QgYXNzZXJ0T3V0Y29tZSA9IChtZXNzYWdlLCBleHRyYSwgc2Vzc2lvblZhbHVlLCBlbnYsIGV4cGVjdGVkKSA9PiB7XG4gICAgICBpdChtZXNzYWdlLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG91dGNvbWUoXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4ucXVlc3Rpb24sXG4gICAgICAgICAgICAuLi5leHRyYSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNlc3Npb25WYWx1ZSxcbiAgICAgICAgICBlbnYsXG4gICAgICAgICk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3Qub2JqZWN0Q29udGFpbmluZyhleHBlY3RlZCkpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGFzc2VydE91dGNvbWUoXG4gICAgICAnZWxlbWVudC5wYXJ0aWFsU2NvcmluZyA9IHRydWUnLFxuICAgICAgeyBwYXJ0aWFsU2NvcmluZzogdHJ1ZSB9LFxuICAgICAgeyB2YWx1ZTogeyAwOiAnY2FsZicsIDE6ICd1bmRlcicsIDI6ICdtb29uJyB9IH0sXG4gICAgICB7IG1vZGU6ICdldmFsdWF0ZScgfSxcbiAgICAgIHsgc2NvcmU6IDAuNjcgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0T3V0Y29tZShcbiAgICAgICdlbGVtZW50LnBhcnRpYWxTY29yaW5nID0gZmFsc2UnLFxuICAgICAgeyBwYXJ0aWFsU2NvcmluZzogZmFsc2UgfSxcbiAgICAgIHsgdmFsdWU6IHsgMDogJ2NhbGYnLCAxOiAndW5kZXInLCAyOiAnbW9vbicgfSB9LFxuICAgICAgeyBtb2RlOiAnZXZhbHVhdGUnIH0sXG4gICAgICB7IHNjb3JlOiAwIH0sXG4gICAgKTtcblxuICAgIGFzc2VydE91dGNvbWUoXG4gICAgICAnZWxlbWVudC5wYXJ0aWFsU2NvcmluZyA9IGZhbHNlLCBlbnYucGFydGlhbFNjb3JpbmcgPSB0cnVlJyxcbiAgICAgIHsgcGFydGlhbFNjb3Jpbmc6IGZhbHNlIH0sXG4gICAgICB7IHZhbHVlOiB7IDA6ICdjYWxmJywgMTogJ3VuZGVyJywgMjogJ21vb24nIH0gfSxcbiAgICAgIHtcbiAgICAgICAgbW9kZTogJ2V2YWx1YXRlJyxcbiAgICAgICAgcGFydGlhbFNjb3Jpbmc6IHRydWUsXG4gICAgICB9LFxuICAgICAgeyBzY29yZTogMCB9LFxuICAgICk7XG5cbiAgICBhc3NlcnRPdXRjb21lKFxuICAgICAgJ2VsZW1lbnQucGFydGlhbFNjb3JpbmcgPSB0cnVlLCBlbnYucGFydGlhbFNjb3JpbmcgPSBmYWxzZScsXG4gICAgICB7IHBhcnRpYWxTY29yaW5nOiB0cnVlIH0sXG4gICAgICB7IHZhbHVlOiB7IDA6ICdjYWxmJywgMTogJ3VuZGVyJywgMjogJ21vb24nIH0gfSxcbiAgICAgIHtcbiAgICAgICAgbW9kZTogJ2V2YWx1YXRlJyxcbiAgICAgICAgcGFydGlhbFNjb3Jpbmc6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHsgc2NvcmU6IDAgfSxcbiAgICApO1xuICB9KTtcblxuICBkZXNjcmliZSgnb3V0Y29tZScsICgpID0+IHtcbiAgICBjb25zdCBhc3NlcnRPdXRjb21lID0gKHBhcnRpYWxTY29yaW5nLCBzZXNzaW9uVmFsdWUsIGV4cGVjdGVkKSA9PiB7XG4gICAgICBpdChgcGFydGlhbCBzY29yZSAke3BhcnRpYWxTY29yaW5nID8gJ2VuYWJsZWQnIDogJyd9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvdXRjb21lKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgICAgcGFydGlhbFNjb3JpbmcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXNzaW9uVmFsdWUsXG4gICAgICAgICk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICdjb3cnLCAxOiAnb3ZlcicsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDEsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKHRydWUsIHsgdmFsdWU6IHsgMDogJ2NhdHRsZScsIDE6ICdvdmVyJywgMjogJ21vb24nIH0gfSwgeyBzY29yZTogMSwgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUodHJ1ZSwgeyB2YWx1ZTogeyAwOiAnY2FsZicsIDE6ICdvdmVyJywgMjogJ21vb24nIH0gfSwgeyBzY29yZTogMSwgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUodHJ1ZSwgeyB2YWx1ZTogeyAwOiAnY293JywgMTogJ3Bhc3QnLCAyOiAnbW9vbicgfSB9LCB7IHNjb3JlOiAxLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICdjYXR0bGUnLCAxOiAncGFzdCcsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDEsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKHRydWUsIHsgdmFsdWU6IHsgMDogJ2NhbGYnLCAxOiAncGFzdCcsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDEsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKHRydWUsIHsgdmFsdWU6IHsgMDogJ2NvdycsIDE6ICdiZXlvbmQnLCAyOiAnbW9vbicgfSB9LCB7IHNjb3JlOiAxLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICdjYXR0bGUnLCAxOiAnYmV5b25kJywgMjogJ21vb24nIH0gfSwgeyBzY29yZTogMSwgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUodHJ1ZSwgeyB2YWx1ZTogeyAwOiAnY2FsZicsIDE6ICdiZXlvbmQnLCAyOiAnbW9vbicgfSB9LCB7IHNjb3JlOiAxLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICdjYWxmJywgMTogJ3VuZGVyJywgMjogJ21vb24nIH0gfSwgeyBzY29yZTogMC42NywgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUodHJ1ZSwgeyB2YWx1ZTogeyAwOiAnY2F0JywgMTogJ3VuZGVyJywgMjogJ21vb24nIH0gfSwgeyBzY29yZTogMC4zMywgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUodHJ1ZSwgeyB2YWx1ZTogeyAwOiAnY2F0JywgMTogJ3VuZGVyJywgMjogJ3N1bicgfSB9LCB7IHNjb3JlOiAwLCBlbXB0eTogZmFsc2UgfSk7XG5cbiAgICBhc3NlcnRPdXRjb21lKGZhbHNlLCB7IHZhbHVlOiB7IDA6ICdjb3cnLCAxOiAnb3ZlcicsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDEsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKGZhbHNlLCB7IHZhbHVlOiB7IDA6ICdjYXR0bGUnLCAxOiAnb3ZlcicsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDEsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKGZhbHNlLCB7IHZhbHVlOiB7IDA6ICdjYWxmJywgMTogJ292ZXInLCAyOiAnbW9vbicgfSB9LCB7IHNjb3JlOiAxLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZShmYWxzZSwgeyB2YWx1ZTogeyAwOiAnY293JywgMTogJ3Bhc3QnLCAyOiAnbW9vbicgfSB9LCB7IHNjb3JlOiAxLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZShmYWxzZSwgeyB2YWx1ZTogeyAwOiAnY2F0dGxlJywgMTogJ3Bhc3QnLCAyOiAnbW9vbicgfSB9LCB7IHNjb3JlOiAxLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZShmYWxzZSwgeyB2YWx1ZTogeyAwOiAnY2FsZicsIDE6ICdwYXN0JywgMjogJ21vb24nIH0gfSwgeyBzY29yZTogMSwgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUoZmFsc2UsIHsgdmFsdWU6IHsgMDogJ2NvdycsIDE6ICdiZXlvbmQnLCAyOiAnbW9vbicgfSB9LCB7IHNjb3JlOiAxLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZShmYWxzZSwgeyB2YWx1ZTogeyAwOiAnY2F0dGxlJywgMTogJ2JleW9uZCcsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDEsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKGZhbHNlLCB7IHZhbHVlOiB7IDA6ICdjYWxmJywgMTogJ2JleW9uZCcsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDEsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKGZhbHNlLCB7IHZhbHVlOiB7IDA6ICdjYWxmJywgMTogJ3VuZGVyJywgMjogJ21vb24nIH0gfSwgeyBzY29yZTogMCwgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUoZmFsc2UsIHsgdmFsdWU6IHsgMDogJ2NhdCcsIDE6ICd1bmRlcicsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDAsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKGZhbHNlLCB7IHZhbHVlOiB7IDA6ICdjYXQnLCAxOiAndW5kZXInLCAyOiAnc3VuJyB9IH0sIHsgc2NvcmU6IDAsIGVtcHR5OiBmYWxzZSB9KTtcblxuICAgIGNvbnN0IHJldHVybk1vZGVsID0gKHNlc3Npb24pID0+IHtcbiAgICAgIGl0KGBlbXB0eTogdHJ1ZSB3aGVuIHNlc3Npb24gaXMgJHtKU09OLnN0cmluZ2lmeShzZXNzaW9uKX1gLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG0gPSBhd2FpdCBvdXRjb21lKHF1ZXN0aW9uLCBzZXNzaW9uKTtcblxuICAgICAgICBleHBlY3QobSkudG9FcXVhbChleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7IHNjb3JlOiAwLCBlbXB0eTogdHJ1ZSB9KSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuTW9kZWwodW5kZWZpbmVkKTtcbiAgICByZXR1cm5Nb2RlbChudWxsKTtcbiAgICByZXR1cm5Nb2RlbCh7fSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdwcmVwYXJlVmFsJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGVtcHR5IHN0cmluZyBvbiBudWxsIG9yIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChwcmVwYXJlVmFsKG51bGwpKS50b0VxdWFsKCcnKTtcbiAgICAgIGV4cGVjdChwcmVwYXJlVmFsKHVuZGVmaW5lZCkpLnRvRXF1YWwoJycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZW1vdmUgaHRtbCB0YWdzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHByZXBhcmVWYWwoJzxkaXY+Rm9vIEJhcjwvZGl2PicpKS50b0VxdWFsKCdGb28gQmFyJyk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnY29ycmVjdCByZXNwb25zZScsICgpID0+IHtcbiAgICAgIGxldCBxdWVzdGlvbjtcbiAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICBxdWVzdGlvbiA9IHtcbiAgICAgICAgICBjaG9pY2VzLFxuICAgICAgICB9O1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdyZXR1cm5zIGNvcnJlY3QgcmVzcG9uc2UgaWYgZW52IGlzIGNvcnJlY3QnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlc3MgPSBhd2FpdCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uKHF1ZXN0aW9uLCB7XG4gICAgICAgICAgbW9kZTogJ2dhdGhlcicsXG4gICAgICAgICAgcm9sZTogJ2luc3RydWN0b3InLFxuICAgICAgICB9KTtcbiAgICAgICAgZXhwZWN0KHNlc3MpLnRvRXF1YWwoeyBpZDogJzEnLCB2YWx1ZTogeyAwOiAnY293JywgMTogJ292ZXInLCAyOiAnbW9vbicgfSB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBudWxsIGVudiBpcyBzdHVkZW50JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBub1Jlc3VsdCA9IGF3YWl0IGNyZWF0ZUNvcnJlY3RSZXNwb25zZVNlc3Npb24ocXVlc3Rpb24sIHsgbW9kZTogJ2dhdGhlcicsIHJvbGU6ICdzdHVkZW50JyB9KTtcbiAgICAgICAgZXhwZWN0KG5vUmVzdWx0KS50b0JlTnVsbCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjb3JyZWN0IHJlc3BvbnNlJywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIGNvcnJlY3QgcmVzcG9uc2UgaWYgcm9sZSBpcyBpbnN0cnVjdG9yIGFuZCBtb2RlIGlzIGdhdGhlcicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNlc3MgPSBhd2FpdCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uKHF1ZXN0aW9uLCB7XG4gICAgICAgIG1vZGU6ICdnYXRoZXInLFxuICAgICAgICByb2xlOiAnaW5zdHJ1Y3RvcicsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KHNlc3MpLnRvRXF1YWwoeyBpZDogJzEnLCB2YWx1ZTogeyAwOiAnY293JywgMTogJ292ZXInLCAyOiAnbW9vbicgfSB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIGNvcnJlY3QgcmVzcG9uc2UgaWYgcm9sZSBpcyBpbnN0cnVjdG9yIGFuZCBtb2RlIGlzIHZpZXcnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzZXNzID0gYXdhaXQgY3JlYXRlQ29ycmVjdFJlc3BvbnNlU2Vzc2lvbihxdWVzdGlvbiwge1xuICAgICAgICBtb2RlOiAndmlldycsXG4gICAgICAgIHJvbGU6ICdpbnN0cnVjdG9yJyxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3Qoc2VzcykudG9FcXVhbCh7IGlkOiAnMScsIHZhbHVlOiB7IDA6ICdjb3cnLCAxOiAnb3ZlcicsIDI6ICdtb29uJyB9IH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgbnVsbCBpZiBtb2RlIGlzIGV2YWx1YXRlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgbm9SZXN1bHQgPSBhd2FpdCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uKHF1ZXN0aW9uLCB7IG1vZGU6ICdldmFsdWF0ZScsIHJvbGU6ICdpbnN0cnVjdG9yJyB9KTtcblxuICAgICAgZXhwZWN0KG5vUmVzdWx0KS50b0JlTnVsbCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgbnVsbCBpZiByb2xlIGlzIHN0dWRlbnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBub1Jlc3VsdCA9IGF3YWl0IGNyZWF0ZUNvcnJlY3RSZXNwb25zZVNlc3Npb24ocXVlc3Rpb24sIHsgbW9kZTogJ2dhdGhlcicsIHJvbGU6ICdzdHVkZW50JyB9KTtcblxuICAgICAgZXhwZWN0KG5vUmVzdWx0KS50b0JlTnVsbCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncHJlcGFyZUNob2ljZScsICgpID0+IHtcbiAgICBjb25zdCBhc3NlcnRQcmVwYXJlQ2hvaWNlID0gKGVudiwgZGVmYXVsdEZlZWRiYWNrLCBjaG9pY2UsIGV4cGVjdGVkKSA9PiB7XG4gICAgICBjb25zdCBwcmVwYXJDaG9pY2VGbiA9IHByZXBhcmVDaG9pY2UoZW52Lm1vZGUsIGRlZmF1bHRGZWVkYmFjayk7XG5cbiAgICAgIGl0KGBwcmVwYXJlIGNob2ljZXMgaW4gJHtlbnYubW9kZX0gbW9kZTogJHtKU09OLnN0cmluZ2lmeShjaG9pY2UpfSAtPiAke0pTT04uc3RyaW5naWZ5KGV4cGVjdGVkKX1gLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChwcmVwYXJDaG9pY2VGbihjaG9pY2UpKS50b0VxdWFsKGV4cGVjdGVkKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBhc3NlcnRQcmVwYXJlQ2hvaWNlKFxuICAgICAgeyBtb2RlOiAnZ2F0aGVyJyB9LFxuICAgICAgeyBjb3JyZWN0OiAnQ29ycmVjdCcsIGluY29ycmVjdDogJ0luY29ycmVjdCcgfSxcbiAgICAgIHsgdmFsdWU6ICcwJywgbGFiZWw6ICdjb3cnIH0sXG4gICAgICB7IHZhbHVlOiAnMCcsIGxhYmVsOiAnY293JyB9LFxuICAgICk7XG5cbiAgICBhc3NlcnRQcmVwYXJlQ2hvaWNlKFxuICAgICAgeyBtb2RlOiAndmlldycgfSxcbiAgICAgIHsgY29ycmVjdDogJ0NvcnJlY3QnLCBpbmNvcnJlY3Q6ICdJbmNvcnJlY3QnIH0sXG4gICAgICB7IHZhbHVlOiAnMCcsIGxhYmVsOiAnY293JyB9LFxuICAgICAgeyB2YWx1ZTogJzAnLCBsYWJlbDogJ2NvdycgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0UHJlcGFyZUNob2ljZShcbiAgICAgIHsgbW9kZTogJ2V2YWx1YXRlJyB9LFxuICAgICAgeyBjb3JyZWN0OiAnQ29ycmVjdCcsIGluY29ycmVjdDogJ0luY29ycmVjdCcgfSxcbiAgICAgIHsgdmFsdWU6ICcwJywgbGFiZWw6ICdjb3cnIH0sXG4gICAgICB7IHZhbHVlOiAnMCcsIGxhYmVsOiAnY293JywgY29ycmVjdDogdHJ1ZSB9LFxuICAgICk7XG5cbiAgICBhc3NlcnRQcmVwYXJlQ2hvaWNlKFxuICAgICAgeyBtb2RlOiAnZXZhbHVhdGUnIH0sXG4gICAgICB7IGNvcnJlY3Q6ICdDb3JyZWN0JywgaW5jb3JyZWN0OiAnSW5jb3JyZWN0JyB9LFxuICAgICAgeyB2YWx1ZTogJzAnLCBsYWJlbDogJ2NvdycsIGZlZWRiYWNrOiB7IHR5cGU6ICdkZWZhdWx0JyB9IH0sXG4gICAgICB7IHZhbHVlOiAnMCcsIGxhYmVsOiAnY293JywgY29ycmVjdDogdHJ1ZSwgZmVlZGJhY2s6ICdDb3JyZWN0JyB9LFxuICAgICk7XG5cbiAgICBhc3NlcnRQcmVwYXJlQ2hvaWNlKFxuICAgICAgeyBtb2RlOiAnZXZhbHVhdGUnIH0sXG4gICAgICB7IGNvcnJlY3Q6ICdDb3JyZWN0JywgaW5jb3JyZWN0OiAnSW5jb3JyZWN0JyB9LFxuICAgICAgeyB2YWx1ZTogJzAnLCBsYWJlbDogJ2NvdycsIGZlZWRiYWNrOiB7IHR5cGU6ICdjdXN0b20nIH0gfSxcbiAgICAgIHsgdmFsdWU6ICcwJywgbGFiZWw6ICdjb3cnLCBjb3JyZWN0OiB0cnVlLCBmZWVkYmFjazogdW5kZWZpbmVkIH0sXG4gICAgKTtcblxuICAgIGFzc2VydFByZXBhcmVDaG9pY2UoXG4gICAgICB7IG1vZGU6ICdldmFsdWF0ZScgfSxcbiAgICAgIHsgY29ycmVjdDogJ0NvcnJlY3QnLCBpbmNvcnJlY3Q6ICdJbmNvcnJlY3QnIH0sXG4gICAgICB7IHZhbHVlOiAnMCcsIGxhYmVsOiAnY293JywgZmVlZGJhY2s6IHsgdHlwZTogJ2N1c3RvbScsIHZhbHVlOiAnQ3VzdG9tIEZlZWRiYWNrJyB9IH0sXG4gICAgICB7IHZhbHVlOiAnMCcsIGxhYmVsOiAnY293JywgY29ycmVjdDogdHJ1ZSwgZmVlZGJhY2s6ICdDdXN0b20gRmVlZGJhY2snIH0sXG4gICAgKTtcbiAgfSk7XG59KTtcbiJdfQ==