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

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