@pie-element/hotspot 9.0.2-esm.0 → 9.2.0-mui-update.0

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 (125) hide show
  1. package/CHANGELOG.md +74 -0
  2. package/configure/CHANGELOG.md +74 -0
  3. package/configure/lib/DeleteWidget.js +31 -44
  4. package/configure/lib/DeleteWidget.js.map +1 -1
  5. package/configure/lib/__tests__/DeleteWidget.test.js +60 -0
  6. package/configure/lib/__tests__/hotspot-container.test.js +377 -0
  7. package/configure/lib/__tests__/hotspot-drawable.test.js +233 -0
  8. package/configure/lib/__tests__/index.test.js +211 -0
  9. package/configure/lib/__tests__/root.test.js +440 -0
  10. package/configure/lib/__tests__/utils.test.js +287 -0
  11. package/configure/lib/button.js +27 -46
  12. package/configure/lib/button.js.map +1 -1
  13. package/configure/lib/buttons/circle.js +21 -28
  14. package/configure/lib/buttons/circle.js.map +1 -1
  15. package/configure/lib/buttons/polygon.js +27 -34
  16. package/configure/lib/buttons/polygon.js.map +1 -1
  17. package/configure/lib/buttons/rectangle.js +27 -34
  18. package/configure/lib/buttons/rectangle.js.map +1 -1
  19. package/configure/lib/defaults.js +3 -4
  20. package/configure/lib/defaults.js.map +1 -1
  21. package/configure/lib/hotspot-circle.js +133 -199
  22. package/configure/lib/hotspot-circle.js.map +1 -1
  23. package/configure/lib/hotspot-container.js +251 -356
  24. package/configure/lib/hotspot-container.js.map +1 -1
  25. package/configure/lib/hotspot-drawable.js +361 -473
  26. package/configure/lib/hotspot-drawable.js.map +1 -1
  27. package/configure/lib/hotspot-palette.js +93 -140
  28. package/configure/lib/hotspot-palette.js.map +1 -1
  29. package/configure/lib/hotspot-polygon.js +213 -318
  30. package/configure/lib/hotspot-polygon.js.map +1 -1
  31. package/configure/lib/hotspot-rectangle.js +129 -193
  32. package/configure/lib/hotspot-rectangle.js.map +1 -1
  33. package/configure/lib/icons.js +4 -8
  34. package/configure/lib/icons.js.map +1 -1
  35. package/configure/lib/image-konva.js +47 -87
  36. package/configure/lib/image-konva.js.map +1 -1
  37. package/configure/lib/index.js +163 -223
  38. package/configure/lib/index.js.map +1 -1
  39. package/configure/lib/root.js +302 -394
  40. package/configure/lib/root.js.map +1 -1
  41. package/configure/lib/shapes/circle.js +70 -102
  42. package/configure/lib/shapes/circle.js.map +1 -1
  43. package/configure/lib/shapes/index.js +5 -13
  44. package/configure/lib/shapes/index.js.map +1 -1
  45. package/configure/lib/shapes/polygon.js +65 -97
  46. package/configure/lib/shapes/polygon.js.map +1 -1
  47. package/configure/lib/shapes/rectagle.js +70 -102
  48. package/configure/lib/shapes/rectagle.js.map +1 -1
  49. package/configure/lib/shapes/utils.js +3 -9
  50. package/configure/lib/shapes/utils.js.map +1 -1
  51. package/configure/lib/upload-control.js +26 -53
  52. package/configure/lib/upload-control.js.map +1 -1
  53. package/configure/lib/utils.js +85 -138
  54. package/configure/lib/utils.js.map +1 -1
  55. package/configure/package.json +11 -10
  56. package/configure/src/__tests__/index.test.js +11 -5
  57. package/configure/src/button.jsx +12 -20
  58. package/configure/src/hotspot-circle.jsx +5 -18
  59. package/configure/src/hotspot-container.jsx +82 -98
  60. package/configure/src/hotspot-drawable.jsx +43 -45
  61. package/configure/src/hotspot-palette.jsx +45 -37
  62. package/configure/src/hotspot-polygon.jsx +4 -20
  63. package/configure/src/hotspot-rectangle.jsx +4 -17
  64. package/configure/src/icons.js +4 -2
  65. package/configure/src/index.js +12 -2
  66. package/configure/src/root.jsx +85 -79
  67. package/configure/src/upload-control.jsx +6 -16
  68. package/controller/CHANGELOG.md +60 -0
  69. package/controller/lib/__tests__/index.test.js +586 -0
  70. package/controller/lib/__tests__/utils.test.js +8 -0
  71. package/controller/lib/defaults.js +3 -4
  72. package/controller/lib/defaults.js.map +1 -1
  73. package/controller/lib/index.js +152 -206
  74. package/controller/lib/index.js.map +1 -1
  75. package/controller/lib/utils.js +15 -35
  76. package/controller/lib/utils.js.map +1 -1
  77. package/controller/package.json +2 -2
  78. package/docs/demo/pie.manifest.json +11 -0
  79. package/lib/__tests__/container.test.js +221 -0
  80. package/lib/__tests__/index.test.js +113 -0
  81. package/lib/__tests__/polygon.test.js +245 -0
  82. package/lib/__tests__/rectangle.test.js +236 -0
  83. package/lib/__tests__/session-updater.test.js +69 -0
  84. package/lib/hotspot/circle.js +111 -170
  85. package/lib/hotspot/circle.js.map +1 -1
  86. package/lib/hotspot/container.js +175 -261
  87. package/lib/hotspot/container.js.map +1 -1
  88. package/lib/hotspot/icons.js +5 -10
  89. package/lib/hotspot/icons.js.map +1 -1
  90. package/lib/hotspot/image-konva-tooltip.js +66 -113
  91. package/lib/hotspot/image-konva-tooltip.js.map +1 -1
  92. package/lib/hotspot/index.js +136 -199
  93. package/lib/hotspot/index.js.map +1 -1
  94. package/lib/hotspot/polygon.js +151 -215
  95. package/lib/hotspot/polygon.js.map +1 -1
  96. package/lib/hotspot/rectangle.js +130 -186
  97. package/lib/hotspot/rectangle.js.map +1 -1
  98. package/lib/index.js +188 -257
  99. package/lib/index.js.map +1 -1
  100. package/lib/session-updater.js +13 -19
  101. package/lib/session-updater.js.map +1 -1
  102. package/package.json +15 -29
  103. package/src/hotspot/circle.jsx +2 -13
  104. package/src/hotspot/container.jsx +35 -50
  105. package/src/hotspot/icons.js +6 -5
  106. package/src/hotspot/index.jsx +16 -28
  107. package/src/hotspot/polygon.jsx +4 -13
  108. package/src/hotspot/rectangle.jsx +4 -13
  109. package/src/index.js +21 -12
  110. package/LICENSE.md +0 -5
  111. package/configure/node_modules/debug/CHANGELOG.md +0 -395
  112. package/configure/node_modules/debug/LICENSE +0 -19
  113. package/configure/node_modules/debug/README.md +0 -437
  114. package/configure/node_modules/debug/node.js +0 -1
  115. package/configure/node_modules/debug/package.json +0 -51
  116. package/configure/node_modules/debug/src/browser.js +0 -180
  117. package/configure/node_modules/debug/src/common.js +0 -249
  118. package/configure/node_modules/debug/src/index.js +0 -12
  119. package/configure/node_modules/debug/src/node.js +0 -177
  120. package/esm/configure.js +0 -25986
  121. package/esm/configure.js.map +0 -1
  122. package/esm/controller.js +0 -344
  123. package/esm/controller.js.map +0 -1
  124. package/esm/element.js +0 -1312
  125. package/esm/element.js.map +0 -1
@@ -0,0 +1,440 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _enzyme = require("enzyme");
5
+ var _react = _interopRequireDefault(require("react"));
6
+ var _root = require("../root");
7
+ var _defaults = _interopRequireDefault(require("../defaults"));
8
+ jest.mock('@pie-lib/config-ui', () => ({
9
+ choiceUtils: {
10
+ firstAvailableIndex: jest.fn()
11
+ },
12
+ settings: {
13
+ Panel: props => /*#__PURE__*/_react.default.createElement("div", props),
14
+ toggle: jest.fn(),
15
+ radio: jest.fn()
16
+ },
17
+ layout: {
18
+ ConfigLayout: ({
19
+ children
20
+ }) => /*#__PURE__*/_react.default.createElement("div", null, children)
21
+ }
22
+ }));
23
+ const model = () => ({
24
+ prompt: 'This is the question prompt',
25
+ imageUrl: 'https://cdn.fluence.net/image/0240eb1455ce4c4bb6180232347b6aef_W',
26
+ shapes: {
27
+ rectangles: [{
28
+ id: '0',
29
+ height: 140,
30
+ width: 130,
31
+ x: 1,
32
+ y: 1,
33
+ correct: true
34
+ }, {
35
+ id: '1',
36
+ height: 140,
37
+ width: 130,
38
+ x: 140,
39
+ y: 1
40
+ }, {
41
+ id: '2',
42
+ height: 140,
43
+ width: 130,
44
+ x: 280,
45
+ y: 1
46
+ }],
47
+ polygons: [{
48
+ points: [{
49
+ x: 1,
50
+ y: 148
51
+ }, {
52
+ x: 1,
53
+ y: 288
54
+ }, {
55
+ y: 288,
56
+ x: 129
57
+ }, {
58
+ y: 148,
59
+ x: 129
60
+ }],
61
+ correct: true,
62
+ id: '3'
63
+ }, {
64
+ id: '4',
65
+ points: [{
66
+ y: 151,
67
+ x: 141
68
+ }, {
69
+ y: 289,
70
+ x: 141
71
+ }, {
72
+ y: 289,
73
+ x: 269
74
+ }, {
75
+ x: 269,
76
+ y: 151
77
+ }],
78
+ correct: false
79
+ }, {
80
+ points: [{
81
+ x: 279,
82
+ y: 149.99999999999997
83
+ }, {
84
+ x: 279,
85
+ y: 289
86
+ }, {
87
+ x: 407,
88
+ y: 289
89
+ }, {
90
+ x: 407,
91
+ y: 149.99999999999997
92
+ }],
93
+ correct: false,
94
+ id: '5'
95
+ }],
96
+ circles: [{
97
+ id: '6',
98
+ radius: 70,
99
+ x: 100,
100
+ y: 100,
101
+ correct: false
102
+ }]
103
+ },
104
+ dimensions: {
105
+ height: 300,
106
+ width: 400
107
+ },
108
+ hotspotColor: 'rgba(137, 183, 244, 0.65)',
109
+ hotspotList: ['rgba(137, 183, 244, 0.65)', 'rgba(217, 30, 24, 0.65)', 'rgba(254, 241, 96, 0.65)'],
110
+ outlineColor: 'blue',
111
+ outlineList: ['blue', 'red', 'yellow'],
112
+ configure: {},
113
+ multipleCorrect: true,
114
+ partialScoring: false
115
+ });
116
+ describe('Root', () => {
117
+ let initialModel = model();
118
+ describe('render', () => {
119
+ it('renders', () => {
120
+ const props = {
121
+ classes: {},
122
+ configuration: _defaults.default.configuration,
123
+ model: initialModel
124
+ };
125
+ expect((0, _enzyme.shallow)(/*#__PURE__*/_react.default.createElement(_root.Root, props))).toMatchSnapshot();
126
+ });
127
+ });
128
+ describe('logic', () => {
129
+ let w,
130
+ onColorChanged = jest.fn();
131
+ beforeEach(() => {
132
+ w = (config, onUpdateImageDimension, onUpdateShapes) => {
133
+ const props = {
134
+ classes: {},
135
+ configuration: config || _defaults.default.configuration,
136
+ model: {
137
+ ...initialModel,
138
+ dimensions: {
139
+ width: 200,
140
+ height: 300
141
+ },
142
+ shapes: {
143
+ rectangles: [{
144
+ x: 10,
145
+ y: 10,
146
+ height: 100,
147
+ width: 100
148
+ }],
149
+ polygons: [{
150
+ points: [{
151
+ x: 0,
152
+ y: 200
153
+ }, {
154
+ x: 200,
155
+ y: 200
156
+ }, {
157
+ x: 100,
158
+ y: 300
159
+ }]
160
+ }]
161
+ }
162
+ },
163
+ onColorChanged,
164
+ onUpdateImageDimension,
165
+ onUpdateShapes
166
+ };
167
+ return (0, _enzyme.shallow)(/*#__PURE__*/_react.default.createElement(_root.Root, props));
168
+ };
169
+ });
170
+ describe('handleColorChange', () => {
171
+ it('calls onColorChanged', () => {
172
+ let wrapper = w();
173
+ wrapper.instance().handleColorChange('type', 'color');
174
+ expect(onColorChanged).toHaveBeenLastCalledWith('typeColor', 'color');
175
+ });
176
+ });
177
+ describe('KEEP IMAGE ASPECT RATIO: handleOnUpdateImageDimensions: calls onUpdateImageDimension & onUpdateShapes', () => {
178
+ let wrapper;
179
+ let onUpdateImageDimension = jest.fn();
180
+ let onUpdateShapes = jest.fn();
181
+ beforeEach(() => {
182
+ wrapper = w(undefined, onUpdateImageDimension, onUpdateShapes);
183
+ });
184
+ it('increase width with 100%:', () => {
185
+ wrapper.instance().handleOnUpdateImageDimensions(400, 'width');
186
+ expect(onUpdateImageDimension).toBeCalledWith({
187
+ width: 400,
188
+ height: 600
189
+ });
190
+ expect(onUpdateShapes).toBeCalledWith({
191
+ rectangles: [{
192
+ x: 20,
193
+ y: 20,
194
+ height: 200,
195
+ width: 200,
196
+ index: 0
197
+ }],
198
+ polygons: [{
199
+ points: [{
200
+ x: 0,
201
+ y: 400
202
+ }, {
203
+ x: 400,
204
+ y: 400
205
+ }, {
206
+ x: 200,
207
+ y: 600
208
+ }],
209
+ index: 1
210
+ }],
211
+ circles: []
212
+ });
213
+ });
214
+ it('decrease width with 50%', () => {
215
+ wrapper.instance().handleOnUpdateImageDimensions(100, 'width');
216
+ expect(onUpdateImageDimension).toBeCalledWith({
217
+ width: 100,
218
+ height: 150
219
+ });
220
+ expect(onUpdateShapes).toBeCalledWith({
221
+ rectangles: [{
222
+ x: 5,
223
+ y: 5,
224
+ height: 50,
225
+ width: 50,
226
+ index: 0
227
+ }],
228
+ polygons: [{
229
+ points: [{
230
+ x: 0,
231
+ y: 100
232
+ }, {
233
+ x: 100,
234
+ y: 100
235
+ }, {
236
+ x: 50,
237
+ y: 150
238
+ }],
239
+ index: 1
240
+ }],
241
+ circles: []
242
+ });
243
+ });
244
+ it('increase height with 50%:', () => {
245
+ wrapper.instance().handleOnUpdateImageDimensions(450, 'height');
246
+ expect(onUpdateImageDimension).toBeCalledWith({
247
+ width: 300,
248
+ height: 450
249
+ });
250
+ expect(onUpdateShapes).toBeCalledWith({
251
+ rectangles: [{
252
+ x: 15,
253
+ y: 15,
254
+ height: 150,
255
+ width: 150,
256
+ index: 0
257
+ }],
258
+ polygons: [{
259
+ points: [{
260
+ x: 0,
261
+ y: 300
262
+ }, {
263
+ x: 300,
264
+ y: 300
265
+ }, {
266
+ x: 150,
267
+ y: 450
268
+ }],
269
+ index: 1
270
+ }],
271
+ circles: []
272
+ });
273
+ });
274
+ it('decrease height with 10%', () => {
275
+ wrapper.instance().handleOnUpdateImageDimensions(270, 'height');
276
+ expect(onUpdateImageDimension).toBeCalledWith({
277
+ width: 180,
278
+ height: 270
279
+ });
280
+ expect(onUpdateShapes).toBeCalledWith({
281
+ rectangles: [{
282
+ x: 9,
283
+ y: 9,
284
+ height: 90,
285
+ width: 90,
286
+ index: 0
287
+ }],
288
+ polygons: [{
289
+ points: [{
290
+ x: 0,
291
+ y: 180
292
+ }, {
293
+ x: 180,
294
+ y: 180
295
+ }, {
296
+ x: 90,
297
+ y: 270
298
+ }],
299
+ index: 1
300
+ }],
301
+ circles: []
302
+ });
303
+ });
304
+ });
305
+ describe('DO NOT KEEP IMAGE ASPECT RATIO: handleOnUpdateImageDimensions: calls onUpdateImageDimension & onUpdateShapes', () => {
306
+ let wrapper;
307
+ let onUpdateImageDimension = jest.fn();
308
+ let onUpdateShapes = jest.fn();
309
+ beforeEach(() => {
310
+ wrapper = w({
311
+ ..._defaults.default.configuration,
312
+ preserveAspectRatio: {
313
+ enabled: false
314
+ }
315
+ }, onUpdateImageDimension, onUpdateShapes);
316
+ });
317
+ it('increase width with 100%:', () => {
318
+ wrapper.instance().handleOnUpdateImageDimensions(400, 'width');
319
+ expect(onUpdateImageDimension).toBeCalledWith({
320
+ width: 400,
321
+ height: 300
322
+ });
323
+ expect(onUpdateShapes).toBeCalledWith({
324
+ rectangles: [{
325
+ x: 20,
326
+ y: 10,
327
+ height: 100,
328
+ width: 200,
329
+ index: 0
330
+ }],
331
+ polygons: [{
332
+ points: [{
333
+ x: 0,
334
+ y: 200
335
+ }, {
336
+ x: 400,
337
+ y: 200
338
+ }, {
339
+ x: 200,
340
+ y: 300
341
+ }],
342
+ index: 1
343
+ }],
344
+ circles: []
345
+ });
346
+ });
347
+ it('decrease width with 50%', () => {
348
+ wrapper.instance().handleOnUpdateImageDimensions(100, 'width');
349
+ expect(onUpdateImageDimension).toBeCalledWith({
350
+ width: 100,
351
+ height: 300
352
+ });
353
+ expect(onUpdateShapes).toBeCalledWith({
354
+ rectangles: [{
355
+ x: 5,
356
+ y: 10,
357
+ height: 100,
358
+ width: 50,
359
+ index: 0
360
+ }],
361
+ polygons: [{
362
+ points: [{
363
+ x: 0,
364
+ y: 200
365
+ }, {
366
+ x: 100,
367
+ y: 200
368
+ }, {
369
+ x: 50,
370
+ y: 300
371
+ }],
372
+ index: 1
373
+ }],
374
+ circles: []
375
+ });
376
+ });
377
+ it('increase height with 50%:', () => {
378
+ wrapper.instance().handleOnUpdateImageDimensions(450, 'height');
379
+ expect(onUpdateImageDimension).toBeCalledWith({
380
+ width: 200,
381
+ height: 450
382
+ });
383
+ expect(onUpdateShapes).toBeCalledWith({
384
+ rectangles: [{
385
+ x: 10,
386
+ y: 15,
387
+ height: 150,
388
+ width: 100,
389
+ index: 0
390
+ }],
391
+ polygons: [{
392
+ index: 1,
393
+ points: [{
394
+ x: 0,
395
+ y: 300
396
+ }, {
397
+ x: 200,
398
+ y: 300
399
+ }, {
400
+ x: 100,
401
+ y: 450
402
+ }]
403
+ }],
404
+ circles: []
405
+ });
406
+ });
407
+ it('decrease height with 10%', () => {
408
+ wrapper.instance().handleOnUpdateImageDimensions(270, 'height');
409
+ expect(onUpdateImageDimension).toBeCalledWith({
410
+ width: 200,
411
+ height: 270
412
+ });
413
+ expect(onUpdateShapes).toBeCalledWith({
414
+ rectangles: [{
415
+ x: 10,
416
+ y: 9,
417
+ height: 90,
418
+ width: 100,
419
+ index: 0
420
+ }],
421
+ polygons: [{
422
+ points: [{
423
+ x: 0,
424
+ y: 180
425
+ }, {
426
+ x: 200,
427
+ y: 180
428
+ }, {
429
+ x: 100,
430
+ y: 270
431
+ }],
432
+ index: 1
433
+ }],
434
+ circles: []
435
+ });
436
+ });
437
+ });
438
+ });
439
+ });
440
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZW56eW1lIiwicmVxdWlyZSIsIl9yZWFjdCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfcm9vdCIsIl9kZWZhdWx0cyIsImplc3QiLCJtb2NrIiwiY2hvaWNlVXRpbHMiLCJmaXJzdEF2YWlsYWJsZUluZGV4IiwiZm4iLCJzZXR0aW5ncyIsIlBhbmVsIiwicHJvcHMiLCJkZWZhdWx0IiwiY3JlYXRlRWxlbWVudCIsInRvZ2dsZSIsInJhZGlvIiwibGF5b3V0IiwiQ29uZmlnTGF5b3V0IiwiY2hpbGRyZW4iLCJtb2RlbCIsInByb21wdCIsImltYWdlVXJsIiwic2hhcGVzIiwicmVjdGFuZ2xlcyIsImlkIiwiaGVpZ2h0Iiwid2lkdGgiLCJ4IiwieSIsImNvcnJlY3QiLCJwb2x5Z29ucyIsInBvaW50cyIsImNpcmNsZXMiLCJyYWRpdXMiLCJkaW1lbnNpb25zIiwiaG90c3BvdENvbG9yIiwiaG90c3BvdExpc3QiLCJvdXRsaW5lQ29sb3IiLCJvdXRsaW5lTGlzdCIsImNvbmZpZ3VyZSIsIm11bHRpcGxlQ29ycmVjdCIsInBhcnRpYWxTY29yaW5nIiwiZGVzY3JpYmUiLCJpbml0aWFsTW9kZWwiLCJpdCIsImNsYXNzZXMiLCJjb25maWd1cmF0aW9uIiwiZGVmYXVsdFZhbHVlcyIsImV4cGVjdCIsInNoYWxsb3ciLCJSb290IiwidG9NYXRjaFNuYXBzaG90IiwidyIsIm9uQ29sb3JDaGFuZ2VkIiwiYmVmb3JlRWFjaCIsImNvbmZpZyIsIm9uVXBkYXRlSW1hZ2VEaW1lbnNpb24iLCJvblVwZGF0ZVNoYXBlcyIsIndyYXBwZXIiLCJpbnN0YW5jZSIsImhhbmRsZUNvbG9yQ2hhbmdlIiwidG9IYXZlQmVlbkxhc3RDYWxsZWRXaXRoIiwidW5kZWZpbmVkIiwiaGFuZGxlT25VcGRhdGVJbWFnZURpbWVuc2lvbnMiLCJ0b0JlQ2FsbGVkV2l0aCIsImluZGV4IiwicHJlc2VydmVBc3BlY3RSYXRpbyIsImVuYWJsZWQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL3Jvb3QudGVzdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzaGFsbG93IH0gZnJvbSAnZW56eW1lJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBSb290IH0gZnJvbSAnLi4vcm9vdCc7XG5pbXBvcnQgZGVmYXVsdFZhbHVlcyBmcm9tICcuLi9kZWZhdWx0cyc7XG5cbmplc3QubW9jaygnQHBpZS1saWIvY29uZmlnLXVpJywgKCkgPT4gKHtcbiAgY2hvaWNlVXRpbHM6IHtcbiAgICBmaXJzdEF2YWlsYWJsZUluZGV4OiBqZXN0LmZuKCksXG4gIH0sXG4gIHNldHRpbmdzOiB7XG4gICAgUGFuZWw6IChwcm9wcykgPT4gPGRpdiB7Li4ucHJvcHN9IC8+LFxuICAgIHRvZ2dsZTogamVzdC5mbigpLFxuICAgIHJhZGlvOiBqZXN0LmZuKCksXG4gIH0sXG4gIGxheW91dDoge1xuICAgIENvbmZpZ0xheW91dDogKHsgY2hpbGRyZW4gfSkgPT4gPGRpdj57Y2hpbGRyZW59PC9kaXY+LFxuICB9LFxufSkpO1xuXG5jb25zdCBtb2RlbCA9ICgpID0+ICh7XG4gIHByb21wdDogJ1RoaXMgaXMgdGhlIHF1ZXN0aW9uIHByb21wdCcsXG4gIGltYWdlVXJsOiAnaHR0cHM6Ly9jZG4uZmx1ZW5jZS5uZXQvaW1hZ2UvMDI0MGViMTQ1NWNlNGM0YmI2MTgwMjMyMzQ3YjZhZWZfVycsXG4gIHNoYXBlczoge1xuICAgIHJlY3RhbmdsZXM6IFtcbiAgICAgIHtcbiAgICAgICAgaWQ6ICcwJyxcbiAgICAgICAgaGVpZ2h0OiAxNDAsXG4gICAgICAgIHdpZHRoOiAxMzAsXG4gICAgICAgIHg6IDEsXG4gICAgICAgIHk6IDEsXG4gICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpZDogJzEnLFxuICAgICAgICBoZWlnaHQ6IDE0MCxcbiAgICAgICAgd2lkdGg6IDEzMCxcbiAgICAgICAgeDogMTQwLFxuICAgICAgICB5OiAxLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaWQ6ICcyJyxcbiAgICAgICAgaGVpZ2h0OiAxNDAsXG4gICAgICAgIHdpZHRoOiAxMzAsXG4gICAgICAgIHg6IDI4MCxcbiAgICAgICAgeTogMSxcbiAgICAgIH0sXG4gICAgXSxcbiAgICBwb2x5Z29uczogW1xuICAgICAge1xuICAgICAgICBwb2ludHM6IFtcbiAgICAgICAgICB7IHg6IDEsIHk6IDE0OCB9LFxuICAgICAgICAgIHsgeDogMSwgeTogMjg4IH0sXG4gICAgICAgICAgeyB5OiAyODgsIHg6IDEyOSB9LFxuICAgICAgICAgIHsgeTogMTQ4LCB4OiAxMjkgfSxcbiAgICAgICAgXSxcbiAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgICAgaWQ6ICczJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiAnNCcsXG4gICAgICAgIHBvaW50czogW1xuICAgICAgICAgIHsgeTogMTUxLCB4OiAxNDEgfSxcbiAgICAgICAgICB7IHk6IDI4OSwgeDogMTQxIH0sXG4gICAgICAgICAgeyB5OiAyODksIHg6IDI2OSB9LFxuICAgICAgICAgIHsgeDogMjY5LCB5OiAxNTEgfSxcbiAgICAgICAgXSxcbiAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBwb2ludHM6IFtcbiAgICAgICAgICB7IHg6IDI3OSwgeTogMTQ5Ljk5OTk5OTk5OTk5OTk3IH0sXG4gICAgICAgICAgeyB4OiAyNzksIHk6IDI4OSB9LFxuICAgICAgICAgIHsgeDogNDA3LCB5OiAyODkgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB4OiA0MDcsXG4gICAgICAgICAgICB5OiAxNDkuOTk5OTk5OTk5OTk5OTcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICAgIGlkOiAnNScsXG4gICAgICB9LFxuICAgIF0sXG4gICAgY2lyY2xlczogW1xuICAgICAge1xuICAgICAgICBpZDogJzYnLFxuICAgICAgICByYWRpdXM6IDcwLFxuICAgICAgICB4OiAxMDAsXG4gICAgICAgIHk6IDEwMCxcbiAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG4gIGRpbWVuc2lvbnM6IHsgaGVpZ2h0OiAzMDAsIHdpZHRoOiA0MDAgfSxcbiAgaG90c3BvdENvbG9yOiAncmdiYSgxMzcsIDE4MywgMjQ0LCAwLjY1KScsXG4gIGhvdHNwb3RMaXN0OiBbJ3JnYmEoMTM3LCAxODMsIDI0NCwgMC42NSknLCAncmdiYSgyMTcsIDMwLCAyNCwgMC42NSknLCAncmdiYSgyNTQsIDI0MSwgOTYsIDAuNjUpJ10sXG4gIG91dGxpbmVDb2xvcjogJ2JsdWUnLFxuICBvdXRsaW5lTGlzdDogWydibHVlJywgJ3JlZCcsICd5ZWxsb3cnXSxcbiAgY29uZmlndXJlOiB7fSxcbiAgbXVsdGlwbGVDb3JyZWN0OiB0cnVlLFxuICBwYXJ0aWFsU2NvcmluZzogZmFsc2UsXG59KTtcblxuZGVzY3JpYmUoJ1Jvb3QnLCAoKSA9PiB7XG4gIGxldCBpbml0aWFsTW9kZWwgPSBtb2RlbCgpO1xuXG4gIGRlc2NyaWJlKCdyZW5kZXInLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgY2xhc3Nlczoge30sXG4gICAgICAgIGNvbmZpZ3VyYXRpb246IGRlZmF1bHRWYWx1ZXMuY29uZmlndXJhdGlvbixcbiAgICAgICAgbW9kZWw6IGluaXRpYWxNb2RlbCxcbiAgICAgIH07XG5cbiAgICAgIGV4cGVjdChzaGFsbG93KDxSb290IHsuLi5wcm9wc30gLz4pKS50b01hdGNoU25hcHNob3QoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2xvZ2ljJywgKCkgPT4ge1xuICAgIGxldCB3LFxuICAgICAgb25Db2xvckNoYW5nZWQgPSBqZXN0LmZuKCk7XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIHcgPSAoY29uZmlnLCBvblVwZGF0ZUltYWdlRGltZW5zaW9uLCBvblVwZGF0ZVNoYXBlcykgPT4ge1xuICAgICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgICBjbGFzc2VzOiB7fSxcbiAgICAgICAgICBjb25maWd1cmF0aW9uOiBjb25maWcgfHwgZGVmYXVsdFZhbHVlcy5jb25maWd1cmF0aW9uLFxuICAgICAgICAgIG1vZGVsOiB7XG4gICAgICAgICAgICAuLi5pbml0aWFsTW9kZWwsXG4gICAgICAgICAgICBkaW1lbnNpb25zOiB7IHdpZHRoOiAyMDAsIGhlaWdodDogMzAwIH0sXG4gICAgICAgICAgICBzaGFwZXM6IHtcbiAgICAgICAgICAgICAgcmVjdGFuZ2xlczogW3sgeDogMTAsIHk6IDEwLCBoZWlnaHQ6IDEwMCwgd2lkdGg6IDEwMCB9XSxcbiAgICAgICAgICAgICAgcG9seWdvbnM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBwb2ludHM6IFtcbiAgICAgICAgICAgICAgICAgICAgeyB4OiAwLCB5OiAyMDAgfSxcbiAgICAgICAgICAgICAgICAgICAgeyB4OiAyMDAsIHk6IDIwMCB9LFxuICAgICAgICAgICAgICAgICAgICB7IHg6IDEwMCwgeTogMzAwIH0sXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Db2xvckNoYW5nZWQsXG4gICAgICAgICAgb25VcGRhdGVJbWFnZURpbWVuc2lvbixcbiAgICAgICAgICBvblVwZGF0ZVNoYXBlcyxcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gc2hhbGxvdyg8Um9vdCB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnaGFuZGxlQ29sb3JDaGFuZ2UnLCAoKSA9PiB7XG4gICAgICBpdCgnY2FsbHMgb25Db2xvckNoYW5nZWQnLCAoKSA9PiB7XG4gICAgICAgIGxldCB3cmFwcGVyID0gdygpO1xuICAgICAgICB3cmFwcGVyLmluc3RhbmNlKCkuaGFuZGxlQ29sb3JDaGFuZ2UoJ3R5cGUnLCAnY29sb3InKTtcblxuICAgICAgICBleHBlY3Qob25Db2xvckNoYW5nZWQpLnRvSGF2ZUJlZW5MYXN0Q2FsbGVkV2l0aCgndHlwZUNvbG9yJywgJ2NvbG9yJyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdLRUVQIElNQUdFIEFTUEVDVCBSQVRJTzogaGFuZGxlT25VcGRhdGVJbWFnZURpbWVuc2lvbnM6IGNhbGxzIG9uVXBkYXRlSW1hZ2VEaW1lbnNpb24gJiBvblVwZGF0ZVNoYXBlcycsICgpID0+IHtcbiAgICAgIGxldCB3cmFwcGVyO1xuICAgICAgbGV0IG9uVXBkYXRlSW1hZ2VEaW1lbnNpb24gPSBqZXN0LmZuKCk7XG4gICAgICBsZXQgb25VcGRhdGVTaGFwZXMgPSBqZXN0LmZuKCk7XG5cbiAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICB3cmFwcGVyID0gdyh1bmRlZmluZWQsIG9uVXBkYXRlSW1hZ2VEaW1lbnNpb24sIG9uVXBkYXRlU2hhcGVzKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnaW5jcmVhc2Ugd2lkdGggd2l0aCAxMDAlOicsICgpID0+IHtcbiAgICAgICAgd3JhcHBlci5pbnN0YW5jZSgpLmhhbmRsZU9uVXBkYXRlSW1hZ2VEaW1lbnNpb25zKDQwMCwgJ3dpZHRoJyk7XG5cbiAgICAgICAgZXhwZWN0KG9uVXBkYXRlSW1hZ2VEaW1lbnNpb24pLnRvQmVDYWxsZWRXaXRoKHtcbiAgICAgICAgICB3aWR0aDogNDAwLFxuICAgICAgICAgIGhlaWdodDogNjAwLFxuICAgICAgICB9KTtcbiAgICAgICAgZXhwZWN0KG9uVXBkYXRlU2hhcGVzKS50b0JlQ2FsbGVkV2l0aCh7XG4gICAgICAgICAgcmVjdGFuZ2xlczogW3sgeDogMjAsIHk6IDIwLCBoZWlnaHQ6IDIwMCwgd2lkdGg6IDIwMCwgaW5kZXg6IDAgfV0sXG4gICAgICAgICAgcG9seWdvbnM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcG9pbnRzOiBbXG4gICAgICAgICAgICAgICAgeyB4OiAwLCB5OiA0MDAgfSxcbiAgICAgICAgICAgICAgICB7IHg6IDQwMCwgeTogNDAwIH0sXG4gICAgICAgICAgICAgICAgeyB4OiAyMDAsIHk6IDYwMCB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBpbmRleDogMSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBjaXJjbGVzOiBbXSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2RlY3JlYXNlIHdpZHRoIHdpdGggNTAlJywgKCkgPT4ge1xuICAgICAgICB3cmFwcGVyLmluc3RhbmNlKCkuaGFuZGxlT25VcGRhdGVJbWFnZURpbWVuc2lvbnMoMTAwLCAnd2lkdGgnKTtcblxuICAgICAgICBleHBlY3Qob25VcGRhdGVJbWFnZURpbWVuc2lvbikudG9CZUNhbGxlZFdpdGgoe1xuICAgICAgICAgIHdpZHRoOiAxMDAsXG4gICAgICAgICAgaGVpZ2h0OiAxNTAsXG4gICAgICAgIH0pO1xuICAgICAgICBleHBlY3Qob25VcGRhdGVTaGFwZXMpLnRvQmVDYWxsZWRXaXRoKHtcbiAgICAgICAgICByZWN0YW5nbGVzOiBbeyB4OiA1LCB5OiA1LCBoZWlnaHQ6IDUwLCB3aWR0aDogNTAsIGluZGV4OiAwIH1dLFxuICAgICAgICAgIHBvbHlnb25zOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHBvaW50czogW1xuICAgICAgICAgICAgICAgIHsgeDogMCwgeTogMTAwIH0sXG4gICAgICAgICAgICAgICAgeyB4OiAxMDAsIHk6IDEwMCB9LFxuICAgICAgICAgICAgICAgIHsgeDogNTAsIHk6IDE1MCB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBpbmRleDogMSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBjaXJjbGVzOiBbXSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2luY3JlYXNlIGhlaWdodCB3aXRoIDUwJTonLCAoKSA9PiB7XG4gICAgICAgIHdyYXBwZXIuaW5zdGFuY2UoKS5oYW5kbGVPblVwZGF0ZUltYWdlRGltZW5zaW9ucyg0NTAsICdoZWlnaHQnKTtcblxuICAgICAgICBleHBlY3Qob25VcGRhdGVJbWFnZURpbWVuc2lvbikudG9CZUNhbGxlZFdpdGgoe1xuICAgICAgICAgIHdpZHRoOiAzMDAsXG4gICAgICAgICAgaGVpZ2h0OiA0NTAsXG4gICAgICAgIH0pO1xuICAgICAgICBleHBlY3Qob25VcGRhdGVTaGFwZXMpLnRvQmVDYWxsZWRXaXRoKHtcbiAgICAgICAgICByZWN0YW5nbGVzOiBbeyB4OiAxNSwgeTogMTUsIGhlaWdodDogMTUwLCB3aWR0aDogMTUwLCBpbmRleDogMCB9XSxcbiAgICAgICAgICBwb2x5Z29uczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBwb2ludHM6IFtcbiAgICAgICAgICAgICAgICB7IHg6IDAsIHk6IDMwMCB9LFxuICAgICAgICAgICAgICAgIHsgeDogMzAwLCB5OiAzMDAgfSxcbiAgICAgICAgICAgICAgICB7IHg6IDE1MCwgeTogNDUwIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIGluZGV4OiAxLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGNpcmNsZXM6IFtdLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnZGVjcmVhc2UgaGVpZ2h0IHdpdGggMTAlJywgKCkgPT4ge1xuICAgICAgICB3cmFwcGVyLmluc3RhbmNlKCkuaGFuZGxlT25VcGRhdGVJbWFnZURpbWVuc2lvbnMoMjcwLCAnaGVpZ2h0Jyk7XG5cbiAgICAgICAgZXhwZWN0KG9uVXBkYXRlSW1hZ2VEaW1lbnNpb24pLnRvQmVDYWxsZWRXaXRoKHtcbiAgICAgICAgICB3aWR0aDogMTgwLFxuICAgICAgICAgIGhlaWdodDogMjcwLFxuICAgICAgICB9KTtcbiAgICAgICAgZXhwZWN0KG9uVXBkYXRlU2hhcGVzKS50b0JlQ2FsbGVkV2l0aCh7XG4gICAgICAgICAgcmVjdGFuZ2xlczogW3sgeDogOSwgeTogOSwgaGVpZ2h0OiA5MCwgd2lkdGg6IDkwLCBpbmRleDogMCB9XSxcbiAgICAgICAgICBwb2x5Z29uczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBwb2ludHM6IFtcbiAgICAgICAgICAgICAgICB7IHg6IDAsIHk6IDE4MCB9LFxuICAgICAgICAgICAgICAgIHsgeDogMTgwLCB5OiAxODAgfSxcbiAgICAgICAgICAgICAgICB7IHg6IDkwLCB5OiAyNzAgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgaW5kZXg6IDEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgY2lyY2xlczogW10sXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnRE8gTk9UIEtFRVAgSU1BR0UgQVNQRUNUIFJBVElPOiBoYW5kbGVPblVwZGF0ZUltYWdlRGltZW5zaW9uczogY2FsbHMgb25VcGRhdGVJbWFnZURpbWVuc2lvbiAmIG9uVXBkYXRlU2hhcGVzJywgKCkgPT4ge1xuICAgICAgbGV0IHdyYXBwZXI7XG4gICAgICBsZXQgb25VcGRhdGVJbWFnZURpbWVuc2lvbiA9IGplc3QuZm4oKTtcbiAgICAgIGxldCBvblVwZGF0ZVNoYXBlcyA9IGplc3QuZm4oKTtcblxuICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgIHdyYXBwZXIgPSB3KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLmRlZmF1bHRWYWx1ZXMuY29uZmlndXJhdGlvbixcbiAgICAgICAgICAgIHByZXNlcnZlQXNwZWN0UmF0aW86IHtcbiAgICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgb25VcGRhdGVJbWFnZURpbWVuc2lvbixcbiAgICAgICAgICBvblVwZGF0ZVNoYXBlcyxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnaW5jcmVhc2Ugd2lkdGggd2l0aCAxMDAlOicsICgpID0+IHtcbiAgICAgICAgd3JhcHBlci5pbnN0YW5jZSgpLmhhbmRsZU9uVXBkYXRlSW1hZ2VEaW1lbnNpb25zKDQwMCwgJ3dpZHRoJyk7XG5cbiAgICAgICAgZXhwZWN0KG9uVXBkYXRlSW1hZ2VEaW1lbnNpb24pLnRvQmVDYWxsZWRXaXRoKHtcbiAgICAgICAgICB3aWR0aDogNDAwLFxuICAgICAgICAgIGhlaWdodDogMzAwLFxuICAgICAgICB9KTtcbiAgICAgICAgZXhwZWN0KG9uVXBkYXRlU2hhcGVzKS50b0JlQ2FsbGVkV2l0aCh7XG4gICAgICAgICAgcmVjdGFuZ2xlczogW3sgeDogMjAsIHk6IDEwLCBoZWlnaHQ6IDEwMCwgd2lkdGg6IDIwMCwgaW5kZXg6IDAgfV0sXG4gICAgICAgICAgcG9seWdvbnM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcG9pbnRzOiBbXG4gICAgICAgICAgICAgICAgeyB4OiAwLCB5OiAyMDAgfSxcbiAgICAgICAgICAgICAgICB7IHg6IDQwMCwgeTogMjAwIH0sXG4gICAgICAgICAgICAgICAgeyB4OiAyMDAsIHk6IDMwMCB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBpbmRleDogMSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBjaXJjbGVzOiBbXSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2RlY3JlYXNlIHdpZHRoIHdpdGggNTAlJywgKCkgPT4ge1xuICAgICAgICB3cmFwcGVyLmluc3RhbmNlKCkuaGFuZGxlT25VcGRhdGVJbWFnZURpbWVuc2lvbnMoMTAwLCAnd2lkdGgnKTtcblxuICAgICAgICBleHBlY3Qob25VcGRhdGVJbWFnZURpbWVuc2lvbikudG9CZUNhbGxlZFdpdGgoe1xuICAgICAgICAgIHdpZHRoOiAxMDAsXG4gICAgICAgICAgaGVpZ2h0OiAzMDAsXG4gICAgICAgIH0pO1xuICAgICAgICBleHBlY3Qob25VcGRhdGVTaGFwZXMpLnRvQmVDYWxsZWRXaXRoKHtcbiAgICAgICAgICByZWN0YW5nbGVzOiBbeyB4OiA1LCB5OiAxMCwgaGVpZ2h0OiAxMDAsIHdpZHRoOiA1MCwgaW5kZXg6IDAgfV0sXG4gICAgICAgICAgcG9seWdvbnM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcG9pbnRzOiBbXG4gICAgICAgICAgICAgICAgeyB4OiAwLCB5OiAyMDAgfSxcbiAgICAgICAgICAgICAgICB7IHg6IDEwMCwgeTogMjAwIH0sXG4gICAgICAgICAgICAgICAgeyB4OiA1MCwgeTogMzAwIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIGluZGV4OiAxLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGNpcmNsZXM6IFtdLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnaW5jcmVhc2UgaGVpZ2h0IHdpdGggNTAlOicsICgpID0+IHtcbiAgICAgICAgd3JhcHBlci5pbnN0YW5jZSgpLmhhbmRsZU9uVXBkYXRlSW1hZ2VEaW1lbnNpb25zKDQ1MCwgJ2hlaWdodCcpO1xuXG4gICAgICAgIGV4cGVjdChvblVwZGF0ZUltYWdlRGltZW5zaW9uKS50b0JlQ2FsbGVkV2l0aCh7XG4gICAgICAgICAgd2lkdGg6IDIwMCxcbiAgICAgICAgICBoZWlnaHQ6IDQ1MCxcbiAgICAgICAgfSk7XG4gICAgICAgIGV4cGVjdChvblVwZGF0ZVNoYXBlcykudG9CZUNhbGxlZFdpdGgoe1xuICAgICAgICAgIHJlY3RhbmdsZXM6IFt7IHg6IDEwLCB5OiAxNSwgaGVpZ2h0OiAxNTAsIHdpZHRoOiAxMDAsIGluZGV4OiAwIH1dLFxuICAgICAgICAgIHBvbHlnb25zOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGluZGV4OiAxLFxuICAgICAgICAgICAgICBwb2ludHM6IFtcbiAgICAgICAgICAgICAgICB7IHg6IDAsIHk6IDMwMCB9LFxuICAgICAgICAgICAgICAgIHsgeDogMjAwLCB5OiAzMDAgfSxcbiAgICAgICAgICAgICAgICB7IHg6IDEwMCwgeTogNDUwIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgY2lyY2xlczogW10sXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdkZWNyZWFzZSBoZWlnaHQgd2l0aCAxMCUnLCAoKSA9PiB7XG4gICAgICAgIHdyYXBwZXIuaW5zdGFuY2UoKS5oYW5kbGVPblVwZGF0ZUltYWdlRGltZW5zaW9ucygyNzAsICdoZWlnaHQnKTtcblxuICAgICAgICBleHBlY3Qob25VcGRhdGVJbWFnZURpbWVuc2lvbikudG9CZUNhbGxlZFdpdGgoe1xuICAgICAgICAgIHdpZHRoOiAyMDAsXG4gICAgICAgICAgaGVpZ2h0OiAyNzAsXG4gICAgICAgIH0pO1xuICAgICAgICBleHBlY3Qob25VcGRhdGVTaGFwZXMpLnRvQmVDYWxsZWRXaXRoKHtcbiAgICAgICAgICByZWN0YW5nbGVzOiBbeyB4OiAxMCwgeTogOSwgaGVpZ2h0OiA5MCwgd2lkdGg6IDEwMCwgaW5kZXg6IDAgfV0sXG4gICAgICAgICAgcG9seWdvbnM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcG9pbnRzOiBbXG4gICAgICAgICAgICAgICAgeyB4OiAwLCB5OiAxODAgfSxcbiAgICAgICAgICAgICAgICB7IHg6IDIwMCwgeTogMTgwIH0sXG4gICAgICAgICAgICAgICAgeyB4OiAxMDAsIHk6IDI3MCB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBpbmRleDogMSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBjaXJjbGVzOiBbXSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsTUFBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsS0FBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksU0FBQSxHQUFBRixzQkFBQSxDQUFBRixPQUFBO0FBRUFLLElBQUksQ0FBQ0MsSUFBSSxDQUFDLG9CQUFvQixFQUFFLE9BQU87RUFDckNDLFdBQVcsRUFBRTtJQUNYQyxtQkFBbUIsRUFBRUgsSUFBSSxDQUFDSSxFQUFFLENBQUM7RUFDL0IsQ0FBQztFQUNEQyxRQUFRLEVBQUU7SUFDUkMsS0FBSyxFQUFHQyxLQUFLLGlCQUFLWCxNQUFBLENBQUFZLE9BQUEsQ0FBQUMsYUFBQSxRQUFTRixLQUFRLENBQUM7SUFDcENHLE1BQU0sRUFBRVYsSUFBSSxDQUFDSSxFQUFFLENBQUMsQ0FBQztJQUNqQk8sS0FBSyxFQUFFWCxJQUFJLENBQUNJLEVBQUUsQ0FBQztFQUNqQixDQUFDO0VBQ0RRLE1BQU0sRUFBRTtJQUNOQyxZQUFZLEVBQUVBLENBQUM7TUFBRUM7SUFBUyxDQUFDLGtCQUFLbEIsTUFBQSxDQUFBWSxPQUFBLENBQUFDLGFBQUEsY0FBTUssUUFBYztFQUN0RDtBQUNGLENBQUMsQ0FBQyxDQUFDO0FBRUgsTUFBTUMsS0FBSyxHQUFHQSxDQUFBLE1BQU87RUFDbkJDLE1BQU0sRUFBRSw2QkFBNkI7RUFDckNDLFFBQVEsRUFBRSxrRUFBa0U7RUFDNUVDLE1BQU0sRUFBRTtJQUNOQyxVQUFVLEVBQUUsQ0FDVjtNQUNFQyxFQUFFLEVBQUUsR0FBRztNQUNQQyxNQUFNLEVBQUUsR0FBRztNQUNYQyxLQUFLLEVBQUUsR0FBRztNQUNWQyxDQUFDLEVBQUUsQ0FBQztNQUNKQyxDQUFDLEVBQUUsQ0FBQztNQUNKQyxPQUFPLEVBQUU7SUFDWCxDQUFD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