@pie-element/placement-ordering 14.3.2-beta.4 → 14.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,493 +0,0 @@
1
- "use strict";
2
-
3
- var _utils = require("../utils");
4
- describe('utils', () => {
5
- describe('generateValidationMessage', () => {
6
- it('should return a validation message string', () => {
7
- const message = (0, _utils.generateValidationMessage)();
8
- expect(typeof message).toBe('string');
9
- });
10
- it('should contain validation requirements heading', () => {
11
- const message = (0, _utils.generateValidationMessage)();
12
- expect(message).toContain('Validation requirements:');
13
- });
14
- it('should mention minimum token requirement', () => {
15
- const message = (0, _utils.generateValidationMessage)();
16
- expect(message).toContain('There should be at least 3 tokens.');
17
- });
18
- it('should mention tokens should not be empty', () => {
19
- const message = (0, _utils.generateValidationMessage)();
20
- expect(message).toContain('The tokens should not be empty and should be unique.');
21
- });
22
- it('should mention correct ordering requirement', () => {
23
- const message = (0, _utils.generateValidationMessage)();
24
- expect(message).toContain('The correct ordering should not be identical to the initial ordering.');
25
- });
26
- });
27
- describe('normalizeIndex', () => {
28
- const ordering = {
29
- response: [{
30
- id: 'r1'
31
- }, {
32
- id: 'r2'
33
- }, {
34
- id: 'r3'
35
- }],
36
- choices: [{
37
- id: 'c1'
38
- }, {
39
- id: 'c2'
40
- }, {
41
- id: 'c3'
42
- }]
43
- };
44
- it('should return correct index for target type', () => {
45
- const tile = {
46
- id: 'r2',
47
- type: 'target'
48
- };
49
- const index = (0, _utils.normalizeIndex)(tile, ordering);
50
- expect(index).toBe(1);
51
- });
52
- it('should return correct index for choice type', () => {
53
- const tile = {
54
- id: 'c3',
55
- type: 'choice'
56
- };
57
- const index = (0, _utils.normalizeIndex)(tile, ordering);
58
- expect(index).toBe(2);
59
- });
60
- it('should return -1 for unknown type', () => {
61
- const tile = {
62
- id: 'x1',
63
- type: 'unknown'
64
- };
65
- const index = (0, _utils.normalizeIndex)(tile, ordering);
66
- expect(index).toBe(-1);
67
- });
68
- it('should return -1 when tile not found in response', () => {
69
- const tile = {
70
- id: 'r99',
71
- type: 'target'
72
- };
73
- const index = (0, _utils.normalizeIndex)(tile, ordering);
74
- expect(index).toBe(-1);
75
- });
76
- it('should return -1 when tile not found in choices', () => {
77
- const tile = {
78
- id: 'c99',
79
- type: 'choice'
80
- };
81
- const index = (0, _utils.normalizeIndex)(tile, ordering);
82
- expect(index).toBe(-1);
83
- });
84
- it('should return correct index for first element', () => {
85
- const tile = {
86
- id: 'r1',
87
- type: 'target'
88
- };
89
- const index = (0, _utils.normalizeIndex)(tile, ordering);
90
- expect(index).toBe(0);
91
- });
92
- });
93
- describe('updateResponseOrChoices', () => {
94
- describe('moving within response (target to target)', () => {
95
- it('should move item within response array', () => {
96
- const response = [{
97
- id: 'r1'
98
- }, {
99
- id: 'r2'
100
- }, {
101
- id: 'r3'
102
- }];
103
- const choices = [{
104
- id: 'c1'
105
- }, {
106
- id: 'c2'
107
- }];
108
- const from = {
109
- type: 'target',
110
- index: 0,
111
- id: 'r1'
112
- };
113
- const to = {
114
- type: 'target',
115
- index: 2,
116
- id: 'r3'
117
- };
118
- const result = (0, _utils.updateResponseOrChoices)(response, choices, from, to);
119
- expect(result.response).toEqual([{
120
- id: 'r2'
121
- }, {
122
- id: 'r3'
123
- }, {
124
- id: 'r1'
125
- }]);
126
- expect(result.choices).toEqual(choices);
127
- });
128
- it('should move item to beginning of response', () => {
129
- const response = [{
130
- id: 'r1'
131
- }, {
132
- id: 'r2'
133
- }, {
134
- id: 'r3'
135
- }];
136
- const choices = [{
137
- id: 'c1'
138
- }];
139
- const from = {
140
- type: 'target',
141
- index: 2,
142
- id: 'r3'
143
- };
144
- const to = {
145
- type: 'target',
146
- index: 0,
147
- id: 'r1'
148
- };
149
- const result = (0, _utils.updateResponseOrChoices)(response, choices, from, to);
150
- expect(result.response).toEqual([{
151
- id: 'r3'
152
- }, {
153
- id: 'r1'
154
- }, {
155
- id: 'r2'
156
- }]);
157
- });
158
- it('should move item to end of response', () => {
159
- const response = [{
160
- id: 'r1'
161
- }, {
162
- id: 'r2'
163
- }, {
164
- id: 'r3'
165
- }];
166
- const choices = [{
167
- id: 'c1'
168
- }];
169
- const from = {
170
- type: 'target',
171
- index: 0,
172
- id: 'r1'
173
- };
174
- const to = {
175
- type: 'target',
176
- index: 2,
177
- id: 'r3'
178
- };
179
- const result = (0, _utils.updateResponseOrChoices)(response, choices, from, to);
180
- expect(result.response[result.response.length - 1]).toEqual({
181
- id: 'r1'
182
- });
183
- });
184
- });
185
- describe('moving within choices (choice to choice)', () => {
186
- it('should move item within choices array', () => {
187
- const response = [{
188
- id: 'r1'
189
- }];
190
- const choices = [{
191
- id: 'c1'
192
- }, {
193
- id: 'c2'
194
- }, {
195
- id: 'c3'
196
- }];
197
- const from = {
198
- type: 'choice',
199
- index: 0,
200
- id: 'c1'
201
- };
202
- const to = {
203
- type: 'choice',
204
- index: 2,
205
- id: 'c3'
206
- };
207
- const result = (0, _utils.updateResponseOrChoices)(response, choices, from, to);
208
- expect(result.choices).toEqual([{
209
- id: 'c2'
210
- }, {
211
- id: 'c3'
212
- }, {
213
- id: 'c1'
214
- }]);
215
- expect(result.response).toEqual(response);
216
- });
217
- it('should handle moving to beginning of choices', () => {
218
- const response = [{
219
- id: 'r1'
220
- }];
221
- const choices = [{
222
- id: 'c1'
223
- }, {
224
- id: 'c2'
225
- }, {
226
- id: 'c3'
227
- }];
228
- const from = {
229
- type: 'choice',
230
- index: 2,
231
- id: 'c3'
232
- };
233
- const to = {
234
- type: 'choice',
235
- index: 0,
236
- id: 'c1'
237
- };
238
- const result = (0, _utils.updateResponseOrChoices)(response, choices, from, to);
239
- expect(result.choices[0]).toEqual({
240
- id: 'c3'
241
- });
242
- });
243
- });
244
- describe('mixed type movements', () => {
245
- it('should return unchanged arrays when moving from choice to target', () => {
246
- const response = [{
247
- id: 'r1'
248
- }];
249
- const choices = [{
250
- id: 'c1'
251
- }];
252
- const from = {
253
- type: 'choice',
254
- index: 0,
255
- id: 'c1'
256
- };
257
- const to = {
258
- type: 'target',
259
- index: 0,
260
- id: 'r1'
261
- };
262
- const result = (0, _utils.updateResponseOrChoices)(response, choices, from, to);
263
- expect(result.response).toEqual(response);
264
- expect(result.choices).toEqual(choices);
265
- });
266
- it('should return unchanged arrays when moving from target to choice', () => {
267
- const response = [{
268
- id: 'r1'
269
- }];
270
- const choices = [{
271
- id: 'c1'
272
- }];
273
- const from = {
274
- type: 'target',
275
- index: 0,
276
- id: 'r1'
277
- };
278
- const to = {
279
- type: 'choice',
280
- index: 0,
281
- id: 'c1'
282
- };
283
- const result = (0, _utils.updateResponseOrChoices)(response, choices, from, to);
284
- expect(result.response).toEqual(response);
285
- expect(result.choices).toEqual(choices);
286
- });
287
- });
288
- describe('edge cases', () => {
289
- it('should handle single item arrays', () => {
290
- const response = [{
291
- id: 'r1'
292
- }];
293
- const choices = [{
294
- id: 'c1'
295
- }];
296
- const from = {
297
- type: 'target',
298
- index: 0,
299
- id: 'r1'
300
- };
301
- const to = {
302
- type: 'target',
303
- index: 0,
304
- id: 'r1'
305
- };
306
- const result = (0, _utils.updateResponseOrChoices)(response, choices, from, to);
307
- expect(result.response).toHaveLength(1);
308
- });
309
- });
310
- });
311
- describe('buildTiles', () => {
312
- it('should create tiles from choices and response', () => {
313
- const choices = [{
314
- id: 'c1',
315
- label: 'Choice 1'
316
- }, {
317
- id: 'c2',
318
- label: 'Choice 2'
319
- }];
320
- const response = [{
321
- id: 'c1'
322
- }, {
323
- id: 'c2'
324
- }];
325
- const tiles = (0, _utils.buildTiles)(choices, response);
326
- expect(tiles).toHaveLength(4); // 2 choices + 2 targets
327
- });
328
- it('should mark choice tiles as editable and draggable', () => {
329
- const choices = [{
330
- id: 'c1',
331
- label: 'Choice 1'
332
- }];
333
- const response = [{
334
- id: 'c1'
335
- }];
336
- const tiles = (0, _utils.buildTiles)(choices, response);
337
- const choiceTile = tiles.find(t => t.type === 'choice');
338
- expect(choiceTile).toMatchObject({
339
- type: 'choice',
340
- editable: true,
341
- draggable: true,
342
- droppable: false
343
- });
344
- });
345
- it('should mark target tiles as draggable but not editable', () => {
346
- const choices = [{
347
- id: 'c1',
348
- label: 'Choice 1'
349
- }];
350
- const response = [{
351
- id: 'c1'
352
- }];
353
- const tiles = (0, _utils.buildTiles)(choices, response);
354
- const targetTile = tiles.find(t => t.type === 'target');
355
- expect(targetTile).toMatchObject({
356
- type: 'target',
357
- editable: false,
358
- draggable: true
359
- });
360
- });
361
- it('should match target tiles with corresponding choices by id', () => {
362
- const choices = [{
363
- id: 'c1',
364
- label: 'Choice 1'
365
- }, {
366
- id: 'c2',
367
- label: 'Choice 2'
368
- }];
369
- const response = [{
370
- id: 'c2'
371
- }, {
372
- id: 'c1'
373
- }];
374
- const tiles = (0, _utils.buildTiles)(choices, response);
375
- const targetTiles = tiles.filter(t => t.type === 'target');
376
- expect(targetTiles[0]).toMatchObject({
377
- id: 'c2',
378
- label: 'Choice 2'
379
- });
380
- expect(targetTiles[1]).toMatchObject({
381
- id: 'c1',
382
- label: 'Choice 1'
383
- });
384
- });
385
- it('should assign correct index to target tiles', () => {
386
- const choices = [{
387
- id: 'c1',
388
- label: 'Choice 1'
389
- }];
390
- const response = [{
391
- id: 'c1'
392
- }];
393
- const tiles = (0, _utils.buildTiles)(choices, response);
394
- const targetTile = tiles.find(t => t.type === 'target');
395
- expect(targetTile.index).toBe(0);
396
- });
397
- it('should handle response with null or undefined ids', () => {
398
- const choices = [{
399
- id: 'c1',
400
- label: 'Choice 1'
401
- }, {
402
- id: 'c2',
403
- label: 'Choice 2'
404
- }];
405
- const response = [{
406
- id: null
407
- }, {
408
- id: undefined
409
- }, {
410
- id: 'c1'
411
- }];
412
- const tiles = (0, _utils.buildTiles)(choices, response);
413
- const targetTiles = tiles.filter(t => t.type === 'target');
414
- expect(targetTiles).toHaveLength(3);
415
- expect(targetTiles[2].id).toBe('c1');
416
- });
417
- it('should preserve choice properties in choice tiles', () => {
418
- const choices = [{
419
- id: 'c1',
420
- label: 'Choice 1',
421
- customProp: 'value'
422
- }];
423
- const response = [];
424
- const tiles = (0, _utils.buildTiles)(choices, response);
425
- const choiceTile = tiles.find(t => t.type === 'choice');
426
- expect(choiceTile.customProp).toBe('value');
427
- expect(choiceTile.label).toBe('Choice 1');
428
- });
429
- it('should preserve choice properties in target tiles', () => {
430
- const choices = [{
431
- id: 'c1',
432
- label: 'Choice 1',
433
- customProp: 'value'
434
- }];
435
- const response = [{
436
- id: 'c1'
437
- }];
438
- const tiles = (0, _utils.buildTiles)(choices, response);
439
- const targetTile = tiles.find(t => t.type === 'target');
440
- expect(targetTile.customProp).toBe('value');
441
- expect(targetTile.label).toBe('Choice 1');
442
- });
443
- it('should handle empty choices array', () => {
444
- const choices = [];
445
- const response = [];
446
- const tiles = (0, _utils.buildTiles)(choices, response);
447
- expect(tiles).toEqual([]);
448
- });
449
- it('should handle empty response array', () => {
450
- const choices = [{
451
- id: 'c1',
452
- label: 'Choice 1'
453
- }];
454
- const response = [];
455
- const tiles = (0, _utils.buildTiles)(choices, response);
456
- expect(tiles).toHaveLength(1);
457
- expect(tiles[0].type).toBe('choice');
458
- });
459
- it('should maintain order of choices in choice tiles', () => {
460
- const choices = [{
461
- id: 'c1',
462
- label: 'First'
463
- }, {
464
- id: 'c2',
465
- label: 'Second'
466
- }, {
467
- id: 'c3',
468
- label: 'Third'
469
- }];
470
- const response = [];
471
- const tiles = (0, _utils.buildTiles)(choices, response);
472
- const choiceTiles = tiles.filter(t => t.type === 'choice');
473
- expect(choiceTiles.map(t => t.label)).toEqual(['First', 'Second', 'Third']);
474
- });
475
- it('should place choice tiles before target tiles', () => {
476
- const choices = [{
477
- id: 'c1',
478
- label: 'Choice 1'
479
- }, {
480
- id: 'c2',
481
- label: 'Choice 2'
482
- }];
483
- const response = [{
484
- id: 'c1'
485
- }];
486
- const tiles = (0, _utils.buildTiles)(choices, response);
487
- expect(tiles[0].type).toBe('choice');
488
- expect(tiles[1].type).toBe('choice');
489
- expect(tiles[2].type).toBe('target');
490
- });
491
- });
492
- });
493
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdXRpbHMiLCJyZXF1aXJlIiwiZGVzY3JpYmUiLCJpdCIsIm1lc3NhZ2UiLCJnZW5lcmF0ZVZhbGlkYXRpb25NZXNzYWdlIiwiZXhwZWN0IiwidG9CZSIsInRvQ29udGFpbiIsIm9yZGVyaW5nIiwicmVzcG9uc2UiLCJpZCIsImNob2ljZXMiLCJ0aWxlIiwidHlwZSIsImluZGV4Iiwibm9ybWFsaXplSW5kZXgiLCJmcm9tIiwidG8iLCJyZXN1bHQiLCJ1cGRhdGVSZXNwb25zZU9yQ2hvaWNlcyIsInRvRXF1YWwiLCJsZW5ndGgiLCJ0b0hhdmVMZW5ndGgiLCJsYWJlbCIsInRpbGVzIiwiYnVpbGRUaWxlcyIsImNob2ljZVRpbGUiLCJmaW5kIiwidCIsInRvTWF0Y2hPYmplY3QiLCJlZGl0YWJsZSIsImRyYWdnYWJsZSIsImRyb3BwYWJsZSIsInRhcmdldFRpbGUiLCJ0YXJnZXRUaWxlcyIsImZpbHRlciIsInVuZGVmaW5lZCIsImN1c3RvbVByb3AiLCJjaG9pY2VUaWxlcyIsIm1hcCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vdXRpbHMudGVzdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBnZW5lcmF0ZVZhbGlkYXRpb25NZXNzYWdlLFxuICBub3JtYWxpemVJbmRleCxcbiAgdXBkYXRlUmVzcG9uc2VPckNob2ljZXMsXG4gIGJ1aWxkVGlsZXMsXG59IGZyb20gJy4uL3V0aWxzJztcblxuZGVzY3JpYmUoJ3V0aWxzJywgKCkgPT4ge1xuICBkZXNjcmliZSgnZ2VuZXJhdGVWYWxpZGF0aW9uTWVzc2FnZScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhIHZhbGlkYXRpb24gbWVzc2FnZSBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZ2VuZXJhdGVWYWxpZGF0aW9uTWVzc2FnZSgpO1xuICAgICAgZXhwZWN0KHR5cGVvZiBtZXNzYWdlKS50b0JlKCdzdHJpbmcnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY29udGFpbiB2YWxpZGF0aW9uIHJlcXVpcmVtZW50cyBoZWFkaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGdlbmVyYXRlVmFsaWRhdGlvbk1lc3NhZ2UoKTtcbiAgICAgIGV4cGVjdChtZXNzYWdlKS50b0NvbnRhaW4oJ1ZhbGlkYXRpb24gcmVxdWlyZW1lbnRzOicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBtZW50aW9uIG1pbmltdW0gdG9rZW4gcmVxdWlyZW1lbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZ2VuZXJhdGVWYWxpZGF0aW9uTWVzc2FnZSgpO1xuICAgICAgZXhwZWN0KG1lc3NhZ2UpLnRvQ29udGFpbignVGhlcmUgc2hvdWxkIGJlIGF0IGxlYXN0IDMgdG9rZW5zLicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBtZW50aW9uIHRva2VucyBzaG91bGQgbm90IGJlIGVtcHR5JywgKCkgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGdlbmVyYXRlVmFsaWRhdGlvbk1lc3NhZ2UoKTtcbiAgICAgIGV4cGVjdChtZXNzYWdlKS50b0NvbnRhaW4oJ1RoZSB0b2tlbnMgc2hvdWxkIG5vdCBiZSBlbXB0eSBhbmQgc2hvdWxkIGJlIHVuaXF1ZS4nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbWVudGlvbiBjb3JyZWN0IG9yZGVyaW5nIHJlcXVpcmVtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGdlbmVyYXRlVmFsaWRhdGlvbk1lc3NhZ2UoKTtcbiAgICAgIGV4cGVjdChtZXNzYWdlKS50b0NvbnRhaW4oJ1RoZSBjb3JyZWN0IG9yZGVyaW5nIHNob3VsZCBub3QgYmUgaWRlbnRpY2FsIHRvIHRoZSBpbml0aWFsIG9yZGVyaW5nLicpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbm9ybWFsaXplSW5kZXgnLCAoKSA9PiB7XG4gICAgY29uc3Qgb3JkZXJpbmcgPSB7XG4gICAgICByZXNwb25zZTogW3sgaWQ6ICdyMScgfSwgeyBpZDogJ3IyJyB9LCB7IGlkOiAncjMnIH1dLFxuICAgICAgY2hvaWNlczogW3sgaWQ6ICdjMScgfSwgeyBpZDogJ2MyJyB9LCB7IGlkOiAnYzMnIH1dLFxuICAgIH07XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBjb3JyZWN0IGluZGV4IGZvciB0YXJnZXQgdHlwZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHRpbGUgPSB7IGlkOiAncjInLCB0eXBlOiAndGFyZ2V0JyB9O1xuICAgICAgY29uc3QgaW5kZXggPSBub3JtYWxpemVJbmRleCh0aWxlLCBvcmRlcmluZyk7XG4gICAgICBleHBlY3QoaW5kZXgpLnRvQmUoMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBjb3JyZWN0IGluZGV4IGZvciBjaG9pY2UgdHlwZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHRpbGUgPSB7IGlkOiAnYzMnLCB0eXBlOiAnY2hvaWNlJyB9O1xuICAgICAgY29uc3QgaW5kZXggPSBub3JtYWxpemVJbmRleCh0aWxlLCBvcmRlcmluZyk7XG4gICAgICBleHBlY3QoaW5kZXgpLnRvQmUoMik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiAtMSBmb3IgdW5rbm93biB0eXBlJywgKCkgPT4ge1xuICAgICAgY29uc3QgdGlsZSA9IHsgaWQ6ICd4MScsIHR5cGU6ICd1bmtub3duJyB9O1xuICAgICAgY29uc3QgaW5kZXggPSBub3JtYWxpemVJbmRleCh0aWxlLCBvcmRlcmluZyk7XG4gICAgICBleHBlY3QoaW5kZXgpLnRvQmUoLTEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gLTEgd2hlbiB0aWxlIG5vdCBmb3VuZCBpbiByZXNwb25zZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHRpbGUgPSB7IGlkOiAncjk5JywgdHlwZTogJ3RhcmdldCcgfTtcbiAgICAgIGNvbnN0IGluZGV4ID0gbm9ybWFsaXplSW5kZXgodGlsZSwgb3JkZXJpbmcpO1xuICAgICAgZXhwZWN0KGluZGV4KS50b0JlKC0xKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIC0xIHdoZW4gdGlsZSBub3QgZm91bmQgaW4gY2hvaWNlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHRpbGUgPSB7IGlkOiAnYzk5JywgdHlwZTogJ2Nob2ljZScgfTtcbiAgICAgIGNvbnN0IGluZGV4ID0gbm9ybWFsaXplSW5kZXgodGlsZSwgb3JkZXJpbmcpO1xuICAgICAgZXhwZWN0KGluZGV4KS50b0JlKC0xKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGNvcnJlY3QgaW5kZXggZm9yIGZpcnN0IGVsZW1lbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0aWxlID0geyBpZDogJ3IxJywgdHlwZTogJ3RhcmdldCcgfTtcbiAgICAgIGNvbnN0IGluZGV4ID0gbm9ybWFsaXplSW5kZXgodGlsZSwgb3JkZXJpbmcpO1xuICAgICAgZXhwZWN0KGluZGV4KS50b0JlKDApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndXBkYXRlUmVzcG9uc2VPckNob2ljZXMnLCAoKSA9PiB7XG4gICAgZGVzY3JpYmUoJ21vdmluZyB3aXRoaW4gcmVzcG9uc2UgKHRhcmdldCB0byB0YXJnZXQpJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCBtb3ZlIGl0ZW0gd2l0aGluIHJlc3BvbnNlIGFycmF5JywgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IFt7IGlkOiAncjEnIH0sIHsgaWQ6ICdyMicgfSwgeyBpZDogJ3IzJyB9XTtcbiAgICAgICAgY29uc3QgY2hvaWNlcyA9IFt7IGlkOiAnYzEnIH0sIHsgaWQ6ICdjMicgfV07XG4gICAgICAgIGNvbnN0IGZyb20gPSB7IHR5cGU6ICd0YXJnZXQnLCBpbmRleDogMCwgaWQ6ICdyMScgfTtcbiAgICAgICAgY29uc3QgdG8gPSB7IHR5cGU6ICd0YXJnZXQnLCBpbmRleDogMiwgaWQ6ICdyMycgfTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSB1cGRhdGVSZXNwb25zZU9yQ2hvaWNlcyhyZXNwb25zZSwgY2hvaWNlcywgZnJvbSwgdG8pO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQucmVzcG9uc2UpLnRvRXF1YWwoW3sgaWQ6ICdyMicgfSwgeyBpZDogJ3IzJyB9LCB7IGlkOiAncjEnIH1dKTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5jaG9pY2VzKS50b0VxdWFsKGNob2ljZXMpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgbW92ZSBpdGVtIHRvIGJlZ2lubmluZyBvZiByZXNwb25zZScsICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBbeyBpZDogJ3IxJyB9LCB7IGlkOiAncjInIH0sIHsgaWQ6ICdyMycgfV07XG4gICAgICAgIGNvbnN0IGNob2ljZXMgPSBbeyBpZDogJ2MxJyB9XTtcbiAgICAgICAgY29uc3QgZnJvbSA9IHsgdHlwZTogJ3RhcmdldCcsIGluZGV4OiAyLCBpZDogJ3IzJyB9O1xuICAgICAgICBjb25zdCB0byA9IHsgdHlwZTogJ3RhcmdldCcsIGluZGV4OiAwLCBpZDogJ3IxJyB9O1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHVwZGF0ZVJlc3BvbnNlT3JDaG9pY2VzKHJlc3BvbnNlLCBjaG9pY2VzLCBmcm9tLCB0byk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdC5yZXNwb25zZSkudG9FcXVhbChbeyBpZDogJ3IzJyB9LCB7IGlkOiAncjEnIH0sIHsgaWQ6ICdyMicgfV0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgbW92ZSBpdGVtIHRvIGVuZCBvZiByZXNwb25zZScsICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBbeyBpZDogJ3IxJyB9LCB7IGlkOiAncjInIH0sIHsgaWQ6ICdyMycgfV07XG4gICAgICAgIGNvbnN0IGNob2ljZXMgPSBbeyBpZDogJ2MxJyB9XTtcbiAgICAgICAgY29uc3QgZnJvbSA9IHsgdHlwZTogJ3RhcmdldCcsIGluZGV4OiAwLCBpZDogJ3IxJyB9O1xuICAgICAgICBjb25zdCB0byA9IHsgdHlwZTogJ3RhcmdldCcsIGluZGV4OiAyLCBpZDogJ3IzJyB9O1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHVwZGF0ZVJlc3BvbnNlT3JDaG9pY2VzKHJlc3BvbnNlLCBjaG9pY2VzLCBmcm9tLCB0byk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdC5yZXNwb25zZVtyZXN1bHQucmVzcG9uc2UubGVuZ3RoIC0gMV0pLnRvRXF1YWwoeyBpZDogJ3IxJyB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ21vdmluZyB3aXRoaW4gY2hvaWNlcyAoY2hvaWNlIHRvIGNob2ljZSknLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIG1vdmUgaXRlbSB3aXRoaW4gY2hvaWNlcyBhcnJheScsICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBbeyBpZDogJ3IxJyB9XTtcbiAgICAgICAgY29uc3QgY2hvaWNlcyA9IFt7IGlkOiAnYzEnIH0sIHsgaWQ6ICdjMicgfSwgeyBpZDogJ2MzJyB9XTtcbiAgICAgICAgY29uc3QgZnJvbSA9IHsgdHlwZTogJ2Nob2ljZScsIGluZGV4OiAwLCBpZDogJ2MxJyB9O1xuICAgICAgICBjb25zdCB0byA9IHsgdHlwZTogJ2Nob2ljZScsIGluZGV4OiAyLCBpZDogJ2MzJyB9O1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHVwZGF0ZVJlc3BvbnNlT3JDaG9pY2VzKHJlc3BvbnNlLCBjaG9pY2VzLCBmcm9tLCB0byk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdC5jaG9pY2VzKS50b0VxdWFsKFt7IGlkOiAnYzInIH0sIHsgaWQ6ICdjMycgfSwgeyBpZDogJ2MxJyB9XSk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQucmVzcG9uc2UpLnRvRXF1YWwocmVzcG9uc2UpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgaGFuZGxlIG1vdmluZyB0byBiZWdpbm5pbmcgb2YgY2hvaWNlcycsICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBbeyBpZDogJ3IxJyB9XTtcbiAgICAgICAgY29uc3QgY2hvaWNlcyA9IFt7IGlkOiAnYzEnIH0sIHsgaWQ6ICdjMicgfSwgeyBpZDogJ2MzJyB9XTtcbiAgICAgICAgY29uc3QgZnJvbSA9IHsgdHlwZTogJ2Nob2ljZScsIGluZGV4OiAyLCBpZDogJ2MzJyB9O1xuICAgICAgICBjb25zdCB0byA9IHsgdHlwZTogJ2Nob2ljZScsIGluZGV4OiAwLCBpZDogJ2MxJyB9O1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHVwZGF0ZVJlc3BvbnNlT3JDaG9pY2VzKHJlc3BvbnNlLCBjaG9pY2VzLCBmcm9tLCB0byk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdC5jaG9pY2VzWzBdKS50b0VxdWFsKHsgaWQ6ICdjMycgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdtaXhlZCB0eXBlIG1vdmVtZW50cycsICgpID0+IHtcbiAgICAgIGl0KCdzaG91bGQgcmV0dXJuIHVuY2hhbmdlZCBhcnJheXMgd2hlbiBtb3ZpbmcgZnJvbSBjaG9pY2UgdG8gdGFyZ2V0JywgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IFt7IGlkOiAncjEnIH1dO1xuICAgICAgICBjb25zdCBjaG9pY2VzID0gW3sgaWQ6ICdjMScgfV07XG4gICAgICAgIGNvbnN0IGZyb20gPSB7IHR5cGU6ICdjaG9pY2UnLCBpbmRleDogMCwgaWQ6ICdjMScgfTtcbiAgICAgICAgY29uc3QgdG8gPSB7IHR5cGU6ICd0YXJnZXQnLCBpbmRleDogMCwgaWQ6ICdyMScgfTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSB1cGRhdGVSZXNwb25zZU9yQ2hvaWNlcyhyZXNwb25zZSwgY2hvaWNlcywgZnJvbSwgdG8pO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQucmVzcG9uc2UpLnRvRXF1YWwocmVzcG9uc2UpO1xuICAgICAgICBleHBlY3QocmVzdWx0LmNob2ljZXMpLnRvRXF1YWwoY2hvaWNlcyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gdW5jaGFuZ2VkIGFycmF5cyB3aGVuIG1vdmluZyBmcm9tIHRhcmdldCB0byBjaG9pY2UnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gW3sgaWQ6ICdyMScgfV07XG4gICAgICAgIGNvbnN0IGNob2ljZXMgPSBbeyBpZDogJ2MxJyB9XTtcbiAgICAgICAgY29uc3QgZnJvbSA9IHsgdHlwZTogJ3RhcmdldCcsIGluZGV4OiAwLCBpZDogJ3IxJyB9O1xuICAgICAgICBjb25zdCB0byA9IHsgdHlwZTogJ2Nob2ljZScsIGluZGV4OiAwLCBpZDogJ2MxJyB9O1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHVwZGF0ZVJlc3BvbnNlT3JDaG9pY2VzKHJlc3BvbnNlLCBjaG9pY2VzLCBmcm9tLCB0byk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdC5yZXNwb25zZSkudG9FcXVhbChyZXNwb25zZSk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuY2hvaWNlcykudG9FcXVhbChjaG9pY2VzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2VkZ2UgY2FzZXMnLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIGhhbmRsZSBzaW5nbGUgaXRlbSBhcnJheXMnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gW3sgaWQ6ICdyMScgfV07XG4gICAgICAgIGNvbnN0IGNob2ljZXMgPSBbeyBpZDogJ2MxJyB9XTtcbiAgICAgICAgY29uc3QgZnJvbSA9IHsgdHlwZTogJ3RhcmdldCcsIGluZGV4OiAwLCBpZDogJ3IxJyB9O1xuICAgICAgICBjb25zdCB0byA9IHsgdHlwZTogJ3RhcmdldCcsIGluZGV4OiAwLCBpZDogJ3IxJyB9O1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHVwZGF0ZVJlc3BvbnNlT3JDaG9pY2VzKHJlc3BvbnNlLCBjaG9pY2VzLCBmcm9tLCB0byk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdC5yZXNwb25zZSkudG9IYXZlTGVuZ3RoKDEpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdidWlsZFRpbGVzJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgY3JlYXRlIHRpbGVzIGZyb20gY2hvaWNlcyBhbmQgcmVzcG9uc2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjaG9pY2VzID0gW1xuICAgICAgICB7IGlkOiAnYzEnLCBsYWJlbDogJ0Nob2ljZSAxJyB9LFxuICAgICAgICB7IGlkOiAnYzInLCBsYWJlbDogJ0Nob2ljZSAyJyB9LFxuICAgICAgXTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gW3sgaWQ6ICdjMScgfSwgeyBpZDogJ2MyJyB9XTtcblxuICAgICAgY29uc3QgdGlsZXMgPSBidWlsZFRpbGVzKGNob2ljZXMsIHJlc3BvbnNlKTtcblxuICAgICAgZXhwZWN0KHRpbGVzKS50b0hhdmVMZW5ndGgoNCk7IC8vIDIgY2hvaWNlcyArIDIgdGFyZ2V0c1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBtYXJrIGNob2ljZSB0aWxlcyBhcyBlZGl0YWJsZSBhbmQgZHJhZ2dhYmxlJywgKCkgPT4ge1xuICAgICAgY29uc3QgY2hvaWNlcyA9IFt7IGlkOiAnYzEnLCBsYWJlbDogJ0Nob2ljZSAxJyB9XTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gW3sgaWQ6ICdjMScgfV07XG5cbiAgICAgIGNvbnN0IHRpbGVzID0gYnVpbGRUaWxlcyhjaG9pY2VzLCByZXNwb25zZSk7XG4gICAgICBjb25zdCBjaG9pY2VUaWxlID0gdGlsZXMuZmluZCgodCkgPT4gdC50eXBlID09PSAnY2hvaWNlJyk7XG5cbiAgICAgIGV4cGVjdChjaG9pY2VUaWxlKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgdHlwZTogJ2Nob2ljZScsXG4gICAgICAgIGVkaXRhYmxlOiB0cnVlLFxuICAgICAgICBkcmFnZ2FibGU6IHRydWUsXG4gICAgICAgIGRyb3BwYWJsZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbWFyayB0YXJnZXQgdGlsZXMgYXMgZHJhZ2dhYmxlIGJ1dCBub3QgZWRpdGFibGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjaG9pY2VzID0gW3sgaWQ6ICdjMScsIGxhYmVsOiAnQ2hvaWNlIDEnIH1dO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBbeyBpZDogJ2MxJyB9XTtcblxuICAgICAgY29uc3QgdGlsZXMgPSBidWlsZFRpbGVzKGNob2ljZXMsIHJlc3BvbnNlKTtcbiAgICAgIGNvbnN0IHRhcmdldFRpbGUgPSB0aWxlcy5maW5kKCh0KSA9PiB0LnR5cGUgPT09ICd0YXJnZXQnKTtcblxuICAgICAgZXhwZWN0KHRhcmdldFRpbGUpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgICB0eXBlOiAndGFyZ2V0JyxcbiAgICAgICAgZWRpdGFibGU6IGZhbHNlLFxuICAgICAgICBkcmFnZ2FibGU6IHRydWUsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbWF0Y2ggdGFyZ2V0IHRpbGVzIHdpdGggY29ycmVzcG9uZGluZyBjaG9pY2VzIGJ5IGlkJywgKCkgPT4ge1xuICAgICAgY29uc3QgY2hvaWNlcyA9IFtcbiAgICAgICAgeyBpZDogJ2MxJywgbGFiZWw6ICdDaG9pY2UgMScgfSxcbiAgICAgICAgeyBpZDogJ2MyJywgbGFiZWw6ICdDaG9pY2UgMicgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCByZXNwb25zZSA9IFt7IGlkOiAnYzInIH0sIHsgaWQ6ICdjMScgfV07XG5cbiAgICAgIGNvbnN0IHRpbGVzID0gYnVpbGRUaWxlcyhjaG9pY2VzLCByZXNwb25zZSk7XG4gICAgICBjb25zdCB0YXJnZXRUaWxlcyA9IHRpbGVzLmZpbHRlcigodCkgPT4gdC50eXBlID09PSAndGFyZ2V0Jyk7XG5cbiAgICAgIGV4cGVjdCh0YXJnZXRUaWxlc1swXSkudG9NYXRjaE9iamVjdCh7XG4gICAgICAgIGlkOiAnYzInLFxuICAgICAgICBsYWJlbDogJ0Nob2ljZSAyJyxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KHRhcmdldFRpbGVzWzFdKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgaWQ6ICdjMScsXG4gICAgICAgIGxhYmVsOiAnQ2hvaWNlIDEnLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFzc2lnbiBjb3JyZWN0IGluZGV4IHRvIHRhcmdldCB0aWxlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGNob2ljZXMgPSBbeyBpZDogJ2MxJywgbGFiZWw6ICdDaG9pY2UgMScgfV07XG4gICAgICBjb25zdCByZXNwb25zZSA9IFt7IGlkOiAnYzEnIH1dO1xuXG4gICAgICBjb25zdCB0aWxlcyA9IGJ1aWxkVGlsZXMoY2hvaWNlcywgcmVzcG9uc2UpO1xuICAgICAgY29uc3QgdGFyZ2V0VGlsZSA9IHRpbGVzLmZpbmQoKHQpID0+IHQudHlwZSA9PT0gJ3RhcmdldCcpO1xuXG4gICAgICBleHBlY3QodGFyZ2V0VGlsZS5pbmRleCkudG9CZSgwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHJlc3BvbnNlIHdpdGggbnVsbCBvciB1bmRlZmluZWQgaWRzJywgKCkgPT4ge1xuICAgICAgY29uc3QgY2hvaWNlcyA9IFtcbiAgICAgICAgeyBpZDogJ2MxJywgbGFiZWw6ICdDaG9pY2UgMScgfSxcbiAgICAgICAgeyBpZDogJ2MyJywgbGFiZWw6ICdDaG9pY2UgMicgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCByZXNwb25zZSA9IFt7IGlkOiBudWxsIH0sIHsgaWQ6IHVuZGVmaW5lZCB9LCB7IGlkOiAnYzEnIH1dO1xuXG4gICAgICBjb25zdCB0aWxlcyA9IGJ1aWxkVGlsZXMoY2hvaWNlcywgcmVzcG9uc2UpO1xuICAgICAgY29uc3QgdGFyZ2V0VGlsZXMgPSB0aWxlcy5maWx0ZXIoKHQpID0+IHQudHlwZSA9PT0gJ3RhcmdldCcpO1xuXG4gICAgICBleHBlY3QodGFyZ2V0VGlsZXMpLnRvSGF2ZUxlbmd0aCgzKTtcbiAgICAgIGV4cGVjdCh0YXJnZXRUaWxlc1syXS5pZCkudG9CZSgnYzEnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcHJlc2VydmUgY2hvaWNlIHByb3BlcnRpZXMgaW4gY2hvaWNlIHRpbGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgY2hvaWNlcyA9IFtcbiAgICAgICAgeyBpZDogJ2MxJywgbGFiZWw6ICdDaG9pY2UgMScsIGN1c3RvbVByb3A6ICd2YWx1ZScgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCByZXNwb25zZSA9IFtdO1xuXG4gICAgICBjb25zdCB0aWxlcyA9IGJ1aWxkVGlsZXMoY2hvaWNlcywgcmVzcG9uc2UpO1xuICAgICAgY29uc3QgY2hvaWNlVGlsZSA9IHRpbGVzLmZpbmQoKHQpID0+IHQudHlwZSA9PT0gJ2Nob2ljZScpO1xuXG4gICAgICBleHBlY3QoY2hvaWNlVGlsZS5jdXN0b21Qcm9wKS50b0JlKCd2YWx1ZScpO1xuICAgICAgZXhwZWN0KGNob2ljZVRpbGUubGFiZWwpLnRvQmUoJ0Nob2ljZSAxJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHByZXNlcnZlIGNob2ljZSBwcm9wZXJ0aWVzIGluIHRhcmdldCB0aWxlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGNob2ljZXMgPSBbXG4gICAgICAgIHsgaWQ6ICdjMScsIGxhYmVsOiAnQ2hvaWNlIDEnLCBjdXN0b21Qcm9wOiAndmFsdWUnIH0sXG4gICAgICBdO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBbeyBpZDogJ2MxJyB9XTtcblxuICAgICAgY29uc3QgdGlsZXMgPSBidWlsZFRpbGVzKGNob2ljZXMsIHJlc3BvbnNlKTtcbiAgICAgIGNvbnN0IHRhcmdldFRpbGUgPSB0aWxlcy5maW5kKCh0KSA9PiB0LnR5cGUgPT09ICd0YXJnZXQnKTtcblxuICAgICAgZXhwZWN0KHRhcmdldFRpbGUuY3VzdG9tUHJvcCkudG9CZSgndmFsdWUnKTtcbiAgICAgIGV4cGVjdCh0YXJnZXRUaWxlLmxhYmVsKS50b0JlKCdDaG9pY2UgMScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgZW1wdHkgY2hvaWNlcyBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IGNob2ljZXMgPSBbXTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gW107XG5cbiAgICAgIGNvbnN0IHRpbGVzID0gYnVpbGRUaWxlcyhjaG9pY2VzLCByZXNwb25zZSk7XG5cbiAgICAgIGV4cGVjdCh0aWxlcykudG9FcXVhbChbXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBlbXB0eSByZXNwb25zZSBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IGNob2ljZXMgPSBbeyBpZDogJ2MxJywgbGFiZWw6ICdDaG9pY2UgMScgfV07XG4gICAgICBjb25zdCByZXNwb25zZSA9IFtdO1xuXG4gICAgICBjb25zdCB0aWxlcyA9IGJ1aWxkVGlsZXMoY2hvaWNlcywgcmVzcG9uc2UpO1xuXG4gICAgICBleHBlY3QodGlsZXMpLnRvSGF2ZUxlbmd0aCgxKTtcbiAgICAgIGV4cGVjdCh0aWxlc1swXS50eXBlKS50b0JlKCdjaG9pY2UnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbWFpbnRhaW4gb3JkZXIgb2YgY2hvaWNlcyBpbiBjaG9pY2UgdGlsZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjaG9pY2VzID0gW1xuICAgICAgICB7IGlkOiAnYzEnLCBsYWJlbDogJ0ZpcnN0JyB9LFxuICAgICAgICB7IGlkOiAnYzInLCBsYWJlbDogJ1NlY29uZCcgfSxcbiAgICAgICAgeyBpZDogJ2MzJywgbGFiZWw6ICdUaGlyZCcgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCByZXNwb25zZSA9IFtdO1xuXG4gICAgICBjb25zdCB0aWxlcyA9IGJ1aWxkVGlsZXMoY2hvaWNlcywgcmVzcG9uc2UpO1xuICAgICAgY29uc3QgY2hvaWNlVGlsZXMgPSB0aWxlcy5maWx0ZXIoKHQpID0+IHQudHlwZSA9PT0gJ2Nob2ljZScpO1xuXG4gICAgICBleHBlY3QoY2hvaWNlVGlsZXMubWFwKCh0KSA9PiB0LmxhYmVsKSkudG9FcXVhbChbJ0ZpcnN0JywgJ1NlY29uZCcsICdUaGlyZCddKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcGxhY2UgY2hvaWNlIHRpbGVzIGJlZm9yZSB0YXJnZXQgdGlsZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjaG9pY2VzID0gW1xuICAgICAgICB7IGlkOiAnYzEnLCBsYWJlbDogJ0Nob2ljZSAxJyB9LFxuICAgICAgICB7IGlkOiAnYzInLCBsYWJlbDogJ0Nob2ljZSAyJyB9LFxuICAgICAgXTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gW3sgaWQ6ICdjMScgfV07XG5cbiAgICAgIGNvbnN0IHRpbGVzID0gYnVpbGRUaWxlcyhjaG9pY2VzLCByZXNwb25zZSk7XG5cbiAgICAgIGV4cGVjdCh0aWxlc1swXS50eXBlKS50b0JlKCdjaG9pY2UnKTtcbiAgICAgIGV4cGVjdCh0aWxlc1sxXS50eXBlKS50b0JlKCdjaG9pY2UnKTtcbiAgICAgIGV4cGVjdCh0aWxlc1syXS50eXBlKS50b0JlKCd0YXJnZXQnKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQSxJQUFBQSxNQUFBLEdBQUFDLE9BQUE7QUFPQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxNQUFNO0VBQ3RCQSxRQUFRLENBQUMsMkJBQTJCLEVBQUUsTUFBTTtJQUMxQ0MsRUFBRSxDQUFDLDJDQUEyQyxFQUFFLE1BQU07TUFDcEQsTUFBTUMsT0FBTyxHQUFHLElBQUFDLGdDQUF5QixFQUFDLENBQUM7TUFDM0NDLE1BQU0sQ0FBQyxPQUFPRixPQUFPLENBQUMsQ0FBQ0csSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QyxDQUFDLENBQUM7SUFFRkosRUFBRSxD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