@pie-lib/editable-html-tip-tap 2.1.20-beta.1 → 2.1.20-beta.10

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 (94) hide show
  1. package/lib/__tests__/EditableHtml.test.js +831 -0
  2. package/lib/__tests__/constants.test.js +21 -0
  3. package/lib/__tests__/div-to-paragraph-conversion.test.js +213 -0
  4. package/lib/__tests__/extensions.test.js +209 -0
  5. package/lib/__tests__/index.test.js +250 -0
  6. package/lib/__tests__/size-utils.test.js +57 -0
  7. package/lib/__tests__/spellcheck.test.js +142 -0
  8. package/lib/__tests__/theme.test.js +17 -0
  9. package/lib/components/__tests__/AltDialog.test.js +201 -0
  10. package/lib/components/__tests__/CharacterPicker.test.js +455 -0
  11. package/lib/components/__tests__/CssIcon.test.js +58 -0
  12. package/lib/components/__tests__/DragInTheBlank.test.js +295 -0
  13. package/lib/components/__tests__/ExplicitConstructedResponse.test.js +345 -0
  14. package/lib/components/__tests__/ImageToolbar.test.js +185 -0
  15. package/lib/components/__tests__/InlineDropdown.test.js +839 -0
  16. package/lib/components/__tests__/InsertImageHandler.test.js +171 -0
  17. package/lib/components/__tests__/MediaDialog.test.js +433 -0
  18. package/lib/components/__tests__/MediaToolbar.test.js +126 -0
  19. package/lib/components/__tests__/MediaWrapper.test.js +96 -0
  20. package/lib/components/__tests__/MenuBar.test.js +502 -0
  21. package/lib/components/__tests__/RespArea.test.js +171 -0
  22. package/lib/components/__tests__/TableIcons.test.js +153 -0
  23. package/lib/components/__tests__/TextAlign.test.js +209 -0
  24. package/lib/components/__tests__/TiptapContainer.test.js +196 -0
  25. package/lib/components/__tests__/characterUtils.test.js +178 -0
  26. package/lib/components/__tests__/choice.test.js +213 -0
  27. package/lib/components/__tests__/custom-popper.test.js +108 -0
  28. package/lib/components/__tests__/done-button.test.js +72 -0
  29. package/lib/components/__tests__/toolbar-buttons.test.js +277 -0
  30. package/lib/components/respArea/DragInTheBlank/__tests__/choice.test.js +90 -0
  31. package/lib/components/respArea/__tests__/MathTemplated.test.js +217 -0
  32. package/lib/extensions/__tests__/css.test.js +214 -0
  33. package/lib/extensions/__tests__/custom-toolbar-wrapper.test.js +175 -0
  34. package/lib/extensions/__tests__/divNode.test.js +108 -0
  35. package/lib/extensions/__tests__/ensure-empty-root-div.test.js +50 -0
  36. package/lib/extensions/__tests__/ensure-list-item-content-is-div.test.js +60 -0
  37. package/lib/extensions/__tests__/extended-list-item.test.js +13 -0
  38. package/lib/extensions/__tests__/extended-table-cell.test.js +15 -0
  39. package/lib/extensions/__tests__/extended-table.test.js +200 -0
  40. package/lib/extensions/__tests__/image-component.test.js +432 -0
  41. package/lib/extensions/__tests__/image.test.js +313 -0
  42. package/lib/extensions/__tests__/math.test.js +1411 -0
  43. package/lib/extensions/__tests__/media-node-view.test.js +307 -0
  44. package/lib/extensions/__tests__/media.test.js +292 -0
  45. package/lib/extensions/__tests__/responseArea.test.js +736 -0
  46. package/lib/utils/__tests__/helper.test.js +107 -0
  47. package/lib/utils/__tests__/toolbar.test.js +38 -0
  48. package/package.json +3 -3
  49. package/src/__tests__/EditableHtml.test.jsx +588 -0
  50. package/src/__tests__/constants.test.js +19 -0
  51. package/src/__tests__/div-to-paragraph-conversion.test.jsx +125 -0
  52. package/src/__tests__/extensions.test.js +208 -0
  53. package/src/__tests__/index.test.jsx +154 -0
  54. package/src/__tests__/size-utils.test.js +64 -0
  55. package/src/__tests__/theme.test.js +17 -0
  56. package/src/components/__tests__/AltDialog.test.jsx +147 -0
  57. package/src/components/__tests__/CharacterPicker.test.jsx +270 -0
  58. package/src/components/__tests__/CssIcon.test.jsx +46 -0
  59. package/src/components/__tests__/DragInTheBlank.test.jsx +255 -0
  60. package/src/components/__tests__/ExplicitConstructedResponse.test.jsx +209 -0
  61. package/src/components/__tests__/ImageToolbar.test.jsx +128 -0
  62. package/src/components/__tests__/InlineDropdown.test.jsx +557 -0
  63. package/src/components/__tests__/InsertImageHandler.test.js +161 -0
  64. package/src/components/__tests__/MediaDialog.test.jsx +293 -0
  65. package/src/components/__tests__/MediaToolbar.test.jsx +74 -0
  66. package/src/components/__tests__/MediaWrapper.test.jsx +81 -0
  67. package/src/components/__tests__/MenuBar.test.jsx +250 -0
  68. package/src/components/__tests__/RespArea.test.jsx +122 -0
  69. package/src/components/__tests__/TableIcons.test.jsx +149 -0
  70. package/src/components/__tests__/TextAlign.test.jsx +167 -0
  71. package/src/components/__tests__/TiptapContainer.test.jsx +138 -0
  72. package/src/components/__tests__/characterUtils.test.js +166 -0
  73. package/src/components/__tests__/choice.test.jsx +171 -0
  74. package/src/components/__tests__/custom-popper.test.jsx +82 -0
  75. package/src/components/__tests__/done-button.test.jsx +54 -0
  76. package/src/components/__tests__/toolbar-buttons.test.jsx +234 -0
  77. package/src/components/respArea/DragInTheBlank/__tests__/choice.test.jsx +72 -0
  78. package/src/components/respArea/__tests__/MathTemplated.test.jsx +210 -0
  79. package/src/extensions/__tests__/css.test.js +196 -0
  80. package/src/extensions/__tests__/custom-toolbar-wrapper.test.jsx +180 -0
  81. package/src/extensions/__tests__/divNode.test.js +87 -0
  82. package/src/extensions/__tests__/ensure-empty-root-div.test.js +57 -0
  83. package/src/extensions/__tests__/ensure-list-item-content-is-div.test.js +44 -0
  84. package/src/extensions/__tests__/extended-list-item.test.js +13 -0
  85. package/src/extensions/__tests__/extended-table-cell.test.js +22 -0
  86. package/src/extensions/__tests__/extended-table.test.js +183 -0
  87. package/src/extensions/__tests__/image-component.test.jsx +346 -0
  88. package/src/extensions/__tests__/image.test.js +237 -0
  89. package/src/extensions/__tests__/math.test.js +900 -0
  90. package/src/extensions/__tests__/media-node-view.test.jsx +298 -0
  91. package/src/extensions/__tests__/media.test.js +271 -0
  92. package/src/extensions/__tests__/responseArea.test.js +655 -0
  93. package/src/utils/__tests__/helper.test.js +126 -0
  94. package/src/utils/__tests__/toolbar.test.js +43 -0
@@ -0,0 +1,432 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
5
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
6
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
7
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
8
+ var _react = _interopRequireDefault(require("react"));
9
+ var _react2 = require("@testing-library/react");
10
+ var _imageComponent = _interopRequireDefault(require("../image-component"));
11
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
12
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
13
+ jest.mock('@tiptap/react', function () {
14
+ return {
15
+ NodeViewWrapper: function NodeViewWrapper(_ref) {
16
+ var children = _ref.children;
17
+ return /*#__PURE__*/_react["default"].createElement("div", {
18
+ "data-testid": "node-view-wrapper"
19
+ }, children);
20
+ }
21
+ };
22
+ });
23
+ jest.mock('../../components/image/InsertImageHandler', function () {
24
+ return {
25
+ __esModule: true,
26
+ "default": jest.fn()
27
+ };
28
+ });
29
+ jest.mock('../../components/image/ImageToolbar', function () {
30
+ return {
31
+ __esModule: true,
32
+ "default": function _default(_ref2) {
33
+ var onChange = _ref2.onChange,
34
+ alignment = _ref2.alignment,
35
+ alt = _ref2.alt;
36
+ return /*#__PURE__*/_react["default"].createElement("div", {
37
+ "data-testid": "image-toolbar"
38
+ }, /*#__PURE__*/_react["default"].createElement("button", {
39
+ onClick: function onClick() {
40
+ return onChange({
41
+ alignment: 'center'
42
+ });
43
+ }
44
+ }, "Center"), /*#__PURE__*/_react["default"].createElement("span", null, alignment), /*#__PURE__*/_react["default"].createElement("span", null, alt));
45
+ }
46
+ };
47
+ });
48
+ jest.mock('../custom-toolbar-wrapper', function () {
49
+ return {
50
+ __esModule: true,
51
+ "default": function _default(_ref3) {
52
+ var children = _ref3.children,
53
+ onDone = _ref3.onDone;
54
+ return /*#__PURE__*/_react["default"].createElement("div", {
55
+ "data-testid": "custom-toolbar-wrapper"
56
+ }, children, /*#__PURE__*/_react["default"].createElement("button", {
57
+ onClick: onDone,
58
+ "data-testid": "done-button"
59
+ }, "Done"));
60
+ }
61
+ };
62
+ });
63
+ describe('ImageComponent', function () {
64
+ var MOCK_NODE_POS = 7;
65
+ var createMockEditor = function createMockEditor() {
66
+ var selection = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
67
+ from: 0,
68
+ to: 1
69
+ };
70
+ return {
71
+ _tiptapContainerEl: document.body,
72
+ isEditable: true,
73
+ commands: {
74
+ updateAttributes: jest.fn(),
75
+ focus: jest.fn()
76
+ },
77
+ state: {
78
+ selection: selection,
79
+ doc: {
80
+ descendants: jest.fn(),
81
+ nodeAt: jest.fn()
82
+ },
83
+ tr: {
84
+ setNodeMarkup: jest.fn().mockReturnThis(),
85
+ "delete": jest.fn().mockReturnThis()
86
+ }
87
+ },
88
+ view: {
89
+ dispatch: jest.fn()
90
+ }
91
+ };
92
+ };
93
+ var mockEditor = createMockEditor();
94
+ var mockNode = {
95
+ type: {
96
+ name: 'imageUploadNode'
97
+ },
98
+ attrs: {
99
+ nodeKey: 'test-key-123',
100
+ src: 'test.jpg',
101
+ width: 100,
102
+ height: 100,
103
+ loaded: true,
104
+ percent: 100,
105
+ alt: 'Test image',
106
+ alignment: 'left',
107
+ deleteStatus: null
108
+ },
109
+ nodeSize: 1
110
+ };
111
+ var mockOptions = {
112
+ imageHandling: {
113
+ insertImageRequested: jest.fn(),
114
+ onDone: jest.fn(),
115
+ onDelete: jest.fn()
116
+ },
117
+ disableImageAlignmentButtons: false
118
+ };
119
+ var defaultProps = {
120
+ node: mockNode,
121
+ editor: mockEditor,
122
+ selected: false,
123
+ options: mockOptions,
124
+ attributes: {},
125
+ onFocus: jest.fn(),
126
+ getPos: jest.fn(function () {
127
+ return MOCK_NODE_POS;
128
+ })
129
+ };
130
+ beforeEach(function () {
131
+ jest.clearAllMocks();
132
+ mockEditor = createMockEditor();
133
+ defaultProps.editor = mockEditor;
134
+ defaultProps.getPos = jest.fn(function () {
135
+ return MOCK_NODE_POS;
136
+ });
137
+ mockEditor.state.doc.descendants.mockImplementation(function (cb) {
138
+ return cb(mockNode, 0);
139
+ });
140
+ mockEditor.state.doc.nodeAt.mockReturnValue(mockNode);
141
+ });
142
+ it('renders without crashing', function () {
143
+ var _render = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_imageComponent["default"], defaultProps)),
144
+ getByTestId = _render.getByTestId;
145
+ expect(getByTestId('node-view-wrapper')).toBeInTheDocument();
146
+ });
147
+ it('renders image with correct src', function () {
148
+ var _render2 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_imageComponent["default"], defaultProps)),
149
+ container = _render2.container;
150
+ var img = container.querySelector('img');
151
+ expect(img).toBeInTheDocument();
152
+ expect(img.src).toContain('test.jpg');
153
+ });
154
+ it('renders image with correct dimensions', function () {
155
+ var _render3 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_imageComponent["default"], defaultProps)),
156
+ container = _render3.container;
157
+ var img = container.querySelector('img');
158
+ expect(img.style.width).toBe('100px');
159
+ expect(img.style.height).toBe('100px');
160
+ });
161
+ it('renders image with alt text', function () {
162
+ var _render4 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_imageComponent["default"], defaultProps)),
163
+ container = _render4.container;
164
+ var img = container.querySelector('img');
165
+ expect(img.alt).toBe('Test image');
166
+ });
167
+ it('does not show toolbar when not selected', function () {
168
+ var _render5 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_imageComponent["default"], (0, _extends2["default"])({}, defaultProps, {
169
+ selected: false
170
+ }))),
171
+ queryByTestId = _render5.queryByTestId;
172
+ expect(queryByTestId('image-toolbar')).not.toBeInTheDocument();
173
+ });
174
+ it('shows toolbar when selected', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
175
+ var _render6, getByTestId;
176
+ return _regenerator["default"].wrap(function (_context) {
177
+ while (1) switch (_context.prev = _context.next) {
178
+ case 0:
179
+ _render6 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_imageComponent["default"], (0, _extends2["default"])({}, defaultProps, {
180
+ selected: true
181
+ }))), getByTestId = _render6.getByTestId;
182
+ _context.next = 1;
183
+ return (0, _react2.waitFor)(function () {
184
+ expect(getByTestId('image-toolbar')).toBeInTheDocument();
185
+ });
186
+ case 1:
187
+ case "end":
188
+ return _context.stop();
189
+ }
190
+ }, _callee);
191
+ })));
192
+ it('applies loading opacity when image not loaded', function () {
193
+ var notLoadedNode = _objectSpread(_objectSpread({}, mockNode), {}, {
194
+ attrs: _objectSpread(_objectSpread({}, mockNode.attrs), {}, {
195
+ loaded: false
196
+ })
197
+ });
198
+ var _render7 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_imageComponent["default"], (0, _extends2["default"])({}, defaultProps, {
199
+ node: notLoadedNode
200
+ }))),
201
+ container = _render7.container;
202
+ var root = container.querySelector('[data-testid="node-view-wrapper"] > div');
203
+ expect(root).toHaveStyle({
204
+ opacity: 0.3
205
+ });
206
+ });
207
+ it('applies pending delete opacity', function () {
208
+ var pendingDeleteNode = _objectSpread(_objectSpread({}, mockNode), {}, {
209
+ attrs: _objectSpread(_objectSpread({}, mockNode.attrs), {}, {
210
+ deleteStatus: 'pending'
211
+ })
212
+ });
213
+ var _render8 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_imageComponent["default"], (0, _extends2["default"])({}, defaultProps, {
214
+ node: pendingDeleteNode
215
+ }))),
216
+ container = _render8.container;
217
+ var root = container.querySelector('[data-testid="node-view-wrapper"] > div');
218
+ expect(root).toHaveStyle({
219
+ opacity: 0.3
220
+ });
221
+ });
222
+ it('aligns image to left by default', function () {
223
+ var _render9 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_imageComponent["default"], defaultProps)),
224
+ container = _render9.container;
225
+ var root = container.querySelector('[data-testid="node-view-wrapper"] > div');
226
+ expect(root).toHaveStyle({
227
+ justifyContent: 'flex-start'
228
+ });
229
+ });
230
+ it('aligns image to center', function () {
231
+ var centerNode = _objectSpread(_objectSpread({}, mockNode), {}, {
232
+ attrs: _objectSpread(_objectSpread({}, mockNode.attrs), {}, {
233
+ alignment: 'center'
234
+ })
235
+ });
236
+ var _render0 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_imageComponent["default"], (0, _extends2["default"])({}, defaultProps, {
237
+ node: centerNode
238
+ }))),
239
+ container = _render0.container;
240
+ var root = container.querySelector('[data-testid="node-view-wrapper"] > div');
241
+ expect(root).toHaveStyle({
242
+ justifyContent: 'center'
243
+ });
244
+ });
245
+ it('aligns image to right', function () {
246
+ var rightNode = _objectSpread(_objectSpread({}, mockNode), {}, {
247
+ attrs: _objectSpread(_objectSpread({}, mockNode.attrs), {}, {
248
+ alignment: 'right'
249
+ })
250
+ });
251
+ var _render1 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_imageComponent["default"], (0, _extends2["default"])({}, defaultProps, {
252
+ node: rightNode
253
+ }))),
254
+ container = _render1.container;
255
+ var root = container.querySelector('[data-testid="node-view-wrapper"] > div');
256
+ expect(root).toHaveStyle({
257
+ justifyContent: 'flex-end'
258
+ });
259
+ });
260
+ it('does not call insertImageRequested when image already has src', function () {
261
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_imageComponent["default"], (0, _extends2["default"])({}, defaultProps, {
262
+ selected: true
263
+ })));
264
+ expect(mockOptions.imageHandling.insertImageRequested).not.toHaveBeenCalled();
265
+ });
266
+ it('does not call insertImageRequested for empty placeholder on mount when not selected', function () {
267
+ var placeholderNode = _objectSpread(_objectSpread({}, mockNode), {}, {
268
+ attrs: _objectSpread(_objectSpread({}, mockNode.attrs), {}, {
269
+ src: null,
270
+ loaded: false,
271
+ percent: null
272
+ })
273
+ });
274
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_imageComponent["default"], (0, _extends2["default"])({}, defaultProps, {
275
+ node: placeholderNode,
276
+ selected: false
277
+ })));
278
+ expect(mockOptions.imageHandling.insertImageRequested).not.toHaveBeenCalled();
279
+ });
280
+ it('calls insertImageRequested with editor and [node, pos] when empty placeholder is solely selected', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2() {
281
+ var placeholderNode;
282
+ return _regenerator["default"].wrap(function (_context2) {
283
+ while (1) switch (_context2.prev = _context2.next) {
284
+ case 0:
285
+ placeholderNode = _objectSpread(_objectSpread({}, mockNode), {}, {
286
+ nodeSize: 1,
287
+ attrs: _objectSpread(_objectSpread({}, mockNode.attrs), {}, {
288
+ src: null,
289
+ loaded: false,
290
+ percent: null
291
+ })
292
+ });
293
+ mockEditor = createMockEditor({
294
+ from: 0,
295
+ to: 1
296
+ });
297
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_imageComponent["default"], (0, _extends2["default"])({}, defaultProps, {
298
+ editor: mockEditor,
299
+ node: placeholderNode,
300
+ selected: true
301
+ })));
302
+ _context2.next = 1;
303
+ return (0, _react2.waitFor)(function () {
304
+ expect(mockOptions.imageHandling.insertImageRequested).toHaveBeenCalled();
305
+ });
306
+ case 1:
307
+ expect(mockOptions.imageHandling.insertImageRequested).toHaveBeenCalledWith(mockEditor, [placeholderNode, MOCK_NODE_POS], expect.any(Function));
308
+ expect(defaultProps.getPos).toHaveBeenCalled();
309
+ case 2:
310
+ case "end":
311
+ return _context2.stop();
312
+ }
313
+ }, _callee2);
314
+ })));
315
+ it('does not call insertImageRequested when selection spans beyond the image node', function () {
316
+ var placeholderNode = _objectSpread(_objectSpread({}, mockNode), {}, {
317
+ nodeSize: 1,
318
+ attrs: _objectSpread(_objectSpread({}, mockNode.attrs), {}, {
319
+ src: null,
320
+ loaded: false,
321
+ percent: null
322
+ })
323
+ });
324
+ mockEditor = createMockEditor({
325
+ from: 0,
326
+ to: 5
327
+ });
328
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_imageComponent["default"], (0, _extends2["default"])({}, defaultProps, {
329
+ editor: mockEditor,
330
+ node: placeholderNode,
331
+ selected: true
332
+ })));
333
+ expect(mockOptions.imageHandling.insertImageRequested).not.toHaveBeenCalled();
334
+ });
335
+ it('updates attributes through toolbar onChange', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3() {
336
+ var _render10, getByTestId;
337
+ return _regenerator["default"].wrap(function (_context3) {
338
+ while (1) switch (_context3.prev = _context3.next) {
339
+ case 0:
340
+ _render10 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_imageComponent["default"], (0, _extends2["default"])({}, defaultProps, {
341
+ selected: true
342
+ }))), getByTestId = _render10.getByTestId;
343
+ _context3.next = 1;
344
+ return (0, _react2.waitFor)(function () {
345
+ var centerButton = getByTestId('image-toolbar').querySelector('button');
346
+ _react2.fireEvent.click(centerButton);
347
+ });
348
+ case 1:
349
+ expect(mockEditor.state.tr.setNodeMarkup).toHaveBeenCalledWith(0, undefined, expect.objectContaining({
350
+ alignment: 'center'
351
+ }));
352
+ expect(mockEditor.view.dispatch).toHaveBeenCalled();
353
+ case 2:
354
+ case "end":
355
+ return _context3.stop();
356
+ }
357
+ }, _callee3);
358
+ })));
359
+ it('toolbar is shown when selected', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee4() {
360
+ var _render11, container, queryByTestId;
361
+ return _regenerator["default"].wrap(function (_context4) {
362
+ while (1) switch (_context4.prev = _context4.next) {
363
+ case 0:
364
+ _render11 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_imageComponent["default"], (0, _extends2["default"])({}, defaultProps, {
365
+ selected: true
366
+ }))), container = _render11.container, queryByTestId = _render11.queryByTestId; // Wait for toolbar to potentially appear
367
+ _context4.next = 1;
368
+ return (0, _react2.waitFor)(function () {
369
+ // The toolbar might not be visible due to mocking but check if custom-toolbar-wrapper shows up
370
+ var toolbar = container.querySelector('[data-testid="custom-toolbar-wrapper"]');
371
+ // In a real test environment, the toolbar would be visible
372
+ // For now, just verify the component renders without errors when selected
373
+ expect(container).toBeInTheDocument();
374
+ });
375
+ case 1:
376
+ case "end":
377
+ return _context4.stop();
378
+ }
379
+ }, _callee4);
380
+ })));
381
+ it('respects maxImageWidth prop', function () {
382
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
383
+ maxImageWidth: 500
384
+ });
385
+ var _render12 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_imageComponent["default"], props)),
386
+ container = _render12.container;
387
+ expect(container).toBeInTheDocument();
388
+ });
389
+ it('respects maxImageHeight prop', function () {
390
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
391
+ maxImageHeight: 800
392
+ });
393
+ var _render13 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_imageComponent["default"], props)),
394
+ container = _render13.container;
395
+ expect(container).toBeInTheDocument();
396
+ });
397
+ it('handles missing alt attribute', function () {
398
+ var noAltNode = _objectSpread(_objectSpread({}, mockNode), {}, {
399
+ attrs: _objectSpread(_objectSpread({}, mockNode.attrs), {}, {
400
+ alt: undefined
401
+ })
402
+ });
403
+ var _render14 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_imageComponent["default"], (0, _extends2["default"])({}, defaultProps, {
404
+ node: noAltNode
405
+ }))),
406
+ container = _render14.container;
407
+ var img = container.querySelector('img');
408
+ expect(img).toBeInTheDocument();
409
+ });
410
+ it('passes editor to imageHandling onDone when Done is clicked', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee5() {
411
+ var _render15, getByTestId;
412
+ return _regenerator["default"].wrap(function (_context5) {
413
+ while (1) switch (_context5.prev = _context5.next) {
414
+ case 0:
415
+ _render15 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_imageComponent["default"], (0, _extends2["default"])({}, defaultProps, {
416
+ selected: true
417
+ }))), getByTestId = _render15.getByTestId;
418
+ _context5.next = 1;
419
+ return (0, _react2.waitFor)(function () {
420
+ expect(getByTestId('done-button')).toBeInTheDocument();
421
+ });
422
+ case 1:
423
+ _react2.fireEvent.click(getByTestId('done-button'));
424
+ expect(mockOptions.imageHandling.onDone).toHaveBeenCalledWith(mockEditor);
425
+ case 2:
426
+ case "end":
427
+ return _context5.stop();
428
+ }
429
+ }, _callee5);
430
+ })));
431
+ });
432
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfaW1hZ2VDb21wb25lbnQiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsImplc3QiLCJtb2NrIiwiTm9kZVZpZXdXcmFwcGVyIiwiX3JlZiIsImNoaWxkcmVuIiwiY3JlYXRlRWxlbWVudCIsIl9fZXNNb2R1bGUiLCJmbiIsImRlZmF1bHQiLCJfcmVmMiIsIm9uQ2hhbmdlIiwiYWxpZ25tZW50IiwiYWx0Iiwib25DbGljayIsIl9yZWYzIiwib25Eb25lIiwiZGVzY3JpYmUiLCJNT0NLX05PREVfUE9TIiwiY3JlYXRlTW9ja0VkaXRvciIsInNlbGVjdGlvbiIsInVuZGVmaW5lZCIsImZyb20iLCJ0byIsIl90aXB0YXBDb250YWluZXJFbCIsImRvY3VtZW50IiwiYm9keSIsImlzRWRpdGFibGUiLCJjb21tYW5kcyIsInVwZGF0ZUF0dHJpYnV0ZXMiLCJmb2N1cyIsInN0YXRlIiwiZG9jIiwiZGVzY2VuZGFudHMiLCJub2RlQXQiLCJ0ciIsInNldE5vZGVNYXJrdXAiLCJtb2NrUmV0dXJuVGhpcyIsInZpZXciLCJkaXNwYXRjaCIsIm1vY2tFZGl0b3IiLCJtb2NrTm9kZSIsInR5cGUiLCJuYW1lIiwiYXR0cnMiLCJub2RlS2V5Iiwic3JjIiwid2lkdGgiLCJoZWlnaHQiLCJsb2FkZWQiLCJwZXJjZW50IiwiZGVsZXRlU3RhdHVzIiwibm9kZVNpemUiLCJtb2NrT3B0aW9ucyIsImltYWdlSGFuZGxpbmciLCJpbnNlcnRJbWFnZVJlcXVlc3RlZCIsIm9uRGVsZXRlIiwiZGlzYWJsZUltYWdlQWxpZ25tZW50QnV0dG9ucyIsImRlZmF1bHRQcm9wcyIsIm5vZGUiLCJlZGl0b3IiLCJzZWxlY3RlZCIsIm9wdGlvbnMiLCJhdHRyaWJ1dGVzIiwib25Gb2N1cyIsImdldFBvcyIsImJlZm9yZUVhY2giLCJjbGVhckFsbE1vY2tzIiwibW9ja0ltcGxlbWVudGF0aW9uIiwiY2IiLCJtb2NrUmV0dXJuVmFsdWUiLCJpdCIsIl9yZW5kZXIiLCJyZW5kZXIiLCJnZXRCeVRlc3RJZCIsImV4cGVjdCIsInRvQmVJblRoZURvY3VtZW50IiwiX3JlbmRlcjIiLCJjb250YWluZXIiLCJpbWciLCJxdWVyeVNlbGVjdG9yIiwidG9Db250YWluIiwiX3JlbmRlcjMiLCJzdHlsZSIsInRvQmUiLCJfcmVuZGVyNCIsIl9yZW5kZXI1IiwiX2V4dGVuZHMyIiwicXVlcnlCeVRlc3RJZCIsIm5vdCIsIl9hc3luY1RvR2VuZXJhdG9yMiIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlIiwiX3JlbmRlcjYiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsIndhaXRGb3IiLCJzdG9wIiwibm90TG9hZGVkTm9kZSIsIl9yZW5kZXI3Iiwicm9vdCIsInRvSGF2ZVN0eWxlIiwib3BhY2l0eSIsInBlbmRpbmdEZWxldGVOb2RlIiwiX3JlbmRlcjgiLCJfcmVuZGVyOSIsImp1c3RpZnlDb250ZW50IiwiY2VudGVyTm9kZSIsIl9yZW5kZXIwIiwicmlnaHROb2RlIiwiX3JlbmRlcjEiLCJ0b0hhdmVCZWVuQ2FsbGVkIiwicGxhY2Vob2xkZXJOb2RlIiwiX2NhbGxlZTIiLCJfY29udGV4dDIiLCJ0b0hhdmVCZWVuQ2FsbGVkV2l0aCIsImFueSIsIkZ1bmN0aW9uIiwiX2NhbGxlZTMiLCJfcmVuZGVyMTAiLCJfY29udGV4dDMiLCJjZW50ZXJCdXR0b24iLCJmaXJlRXZlbnQiLCJjbGljayIsIm9iamVjdENvbnRhaW5pbmciLCJfY2FsbGVlNCIsIl9yZW5kZXIxMSIsIl9jb250ZXh0NCIsInRvb2xiYXIiLCJwcm9wcyIsIm1heEltYWdlV2lkdGgiLCJfcmVuZGVyMTIiLCJtYXhJbWFnZUhlaWdodCIsIl9yZW5kZXIxMyIsIm5vQWx0Tm9kZSIsIl9yZW5kZXIxNCIsIl9jYWxsZWU1IiwiX3JlbmRlcjE1IiwiX2NvbnRleHQ1Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2V4dGVuc2lvbnMvX190ZXN0c19fL2ltYWdlLWNvbXBvbmVudC50ZXN0LmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZmlyZUV2ZW50LCByZW5kZXIsIHdhaXRGb3IgfSBmcm9tICdAdGVzdGluZy1saWJyYXJ5L3JlYWN0JztcbmltcG9ydCBJbWFnZUNvbXBvbmVudCBmcm9tICcuLi9pbWFnZS1jb21wb25lbnQnO1xuXG5qZXN0Lm1vY2soJ0B0aXB0YXAvcmVhY3QnLCAoKSA9PiAoe1xuICBOb2RlVmlld1dyYXBwZXI6ICh7IGNoaWxkcmVuIH0pID0+IDxkaXYgZGF0YS10ZXN0aWQ9XCJub2RlLXZpZXctd3JhcHBlclwiPntjaGlsZHJlbn08L2Rpdj4sXG59KSk7XG5cbmplc3QubW9jaygnLi4vLi4vY29tcG9uZW50cy9pbWFnZS9JbnNlcnRJbWFnZUhhbmRsZXInLCAoKSA9PiAoe1xuICBfX2VzTW9kdWxlOiB0cnVlLFxuICBkZWZhdWx0OiBqZXN0LmZuKCksXG59KSk7XG5cbmplc3QubW9jaygnLi4vLi4vY29tcG9uZW50cy9pbWFnZS9JbWFnZVRvb2xiYXInLCAoKSA9PiAoe1xuICBfX2VzTW9kdWxlOiB0cnVlLFxuICBkZWZhdWx0OiAoeyBvbkNoYW5nZSwgYWxpZ25tZW50LCBhbHQgfSkgPT4gKFxuICAgIDxkaXYgZGF0YS10ZXN0aWQ9XCJpbWFnZS10b29sYmFyXCI+XG4gICAgICA8YnV0dG9uIG9uQ2xpY2s9eygpID0+IG9uQ2hhbmdlKHsgYWxpZ25tZW50OiAnY2VudGVyJyB9KX0+Q2VudGVyPC9idXR0b24+XG4gICAgICA8c3Bhbj57YWxpZ25tZW50fTwvc3Bhbj5cbiAgICAgIDxzcGFuPnthbHR9PC9zcGFuPlxuICAgIDwvZGl2PlxuICApLFxufSkpO1xuXG5qZXN0Lm1vY2soJy4uL2N1c3RvbS10b29sYmFyLXdyYXBwZXInLCAoKSA9PiAoe1xuICBfX2VzTW9kdWxlOiB0cnVlLFxuICBkZWZhdWx0OiAoeyBjaGlsZHJlbiwgb25Eb25lIH0pID0+IChcbiAgICA8ZGl2IGRhdGEtdGVzdGlkPVwiY3VzdG9tLXRvb2xiYXItd3JhcHBlclwiPlxuICAgICAge2NoaWxkcmVufVxuICAgICAgPGJ1dHRvbiBvbkNsaWNrPXtvbkRvbmV9IGRhdGEtdGVzdGlkPVwiZG9uZS1idXR0b25cIj5cbiAgICAgICAgRG9uZVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICksXG59KSk7XG5cbmRlc2NyaWJlKCdJbWFnZUNvbXBvbmVudCcsICgpID0+IHtcbiAgY29uc3QgTU9DS19OT0RFX1BPUyA9IDc7XG5cbiAgY29uc3QgY3JlYXRlTW9ja0VkaXRvciA9IChzZWxlY3Rpb24gPSB7IGZyb206IDAsIHRvOiAxIH0pID0+ICh7XG4gICAgX3RpcHRhcENvbnRhaW5lckVsOiBkb2N1bWVudC5ib2R5LFxuICAgIGlzRWRpdGFibGU6IHRydWUsXG4gICAgY29tbWFuZHM6IHtcbiAgICAgIHVwZGF0ZUF0dHJpYnV0ZXM6IGplc3QuZm4oKSxcbiAgICAgIGZvY3VzOiBqZXN0LmZuKCksXG4gICAgfSxcbiAgICBzdGF0ZToge1xuICAgICAgc2VsZWN0aW9uLFxuICAgICAgZG9jOiB7XG4gICAgICAgIGRlc2NlbmRhbnRzOiBqZXN0LmZuKCksXG4gICAgICAgIG5vZGVBdDogamVzdC5mbigpLFxuICAgICAgfSxcbiAgICAgIHRyOiB7XG4gICAgICAgIHNldE5vZGVNYXJrdXA6IGplc3QuZm4oKS5tb2NrUmV0dXJuVGhpcygpLFxuICAgICAgICBkZWxldGU6IGplc3QuZm4oKS5tb2NrUmV0dXJuVGhpcygpLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHZpZXc6IHtcbiAgICAgIGRpc3BhdGNoOiBqZXN0LmZuKCksXG4gICAgfSxcbiAgfSk7XG5cbiAgbGV0IG1vY2tFZGl0b3IgPSBjcmVhdGVNb2NrRWRpdG9yKCk7XG5cbiAgY29uc3QgbW9ja05vZGUgPSB7XG4gICAgdHlwZTogeyBuYW1lOiAnaW1hZ2VVcGxvYWROb2RlJyB9LFxuICAgIGF0dHJzOiB7XG4gICAgICBub2RlS2V5OiAndGVzdC1rZXktMTIzJyxcbiAgICAgIHNyYzogJ3Rlc3QuanBnJyxcbiAgICAgIHdpZHRoOiAxMDAsXG4gICAgICBoZWlnaHQ6IDEwMCxcbiAgICAgIGxvYWRlZDogdHJ1ZSxcbiAgICAgIHBlcmNlbnQ6IDEwMCxcbiAgICAgIGFsdDogJ1Rlc3QgaW1hZ2UnLFxuICAgICAgYWxpZ25tZW50OiAnbGVmdCcsXG4gICAgICBkZWxldGVTdGF0dXM6IG51bGwsXG4gICAgfSxcbiAgICBub2RlU2l6ZTogMSxcbiAgfTtcblxuICBjb25zdCBtb2NrT3B0aW9ucyA9IHtcbiAgICBpbWFnZUhhbmRsaW5nOiB7XG4gICAgICBpbnNlcnRJbWFnZVJlcXVlc3RlZDogamVzdC5mbigpLFxuICAgICAgb25Eb25lOiBqZXN0LmZuKCksXG4gICAgICBvbkRlbGV0ZTogamVzdC5mbigpLFxuICAgIH0sXG4gICAgZGlzYWJsZUltYWdlQWxpZ25tZW50QnV0dG9uczogZmFsc2UsXG4gIH07XG5cbiAgY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICAgIG5vZGU6IG1vY2tOb2RlLFxuICAgIGVkaXRvcjogbW9ja0VkaXRvcixcbiAgICBzZWxlY3RlZDogZmFsc2UsXG4gICAgb3B0aW9uczogbW9ja09wdGlvbnMsXG4gICAgYXR0cmlidXRlczoge30sXG4gICAgb25Gb2N1czogamVzdC5mbigpLFxuICAgIGdldFBvczogamVzdC5mbigoKSA9PiBNT0NLX05PREVfUE9TKSxcbiAgfTtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBqZXN0LmNsZWFyQWxsTW9ja3MoKTtcbiAgICBtb2NrRWRpdG9yID0gY3JlYXRlTW9ja0VkaXRvcigpO1xuICAgIGRlZmF1bHRQcm9wcy5lZGl0b3IgPSBtb2NrRWRpdG9yO1xuICAgIGRlZmF1bHRQcm9wcy5nZXRQb3MgPSBqZXN0LmZuKCgpID0+IE1PQ0tfTk9ERV9QT1MpO1xuICAgIG1vY2tFZGl0b3Iuc3RhdGUuZG9jLmRlc2NlbmRhbnRzLm1vY2tJbXBsZW1lbnRhdGlvbigoY2IpID0+IGNiKG1vY2tOb2RlLCAwKSk7XG4gICAgbW9ja0VkaXRvci5zdGF0ZS5kb2Mubm9kZUF0Lm1vY2tSZXR1cm5WYWx1ZShtb2NrTm9kZSk7XG4gIH0pO1xuXG4gIGl0KCdyZW5kZXJzIHdpdGhvdXQgY3Jhc2hpbmcnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyKDxJbWFnZUNvbXBvbmVudCB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgZXhwZWN0KGdldEJ5VGVzdElkKCdub2RlLXZpZXctd3JhcHBlcicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICB9KTtcblxuICBpdCgncmVuZGVycyBpbWFnZSB3aXRoIGNvcnJlY3Qgc3JjJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEltYWdlQ29tcG9uZW50IHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICBjb25zdCBpbWcgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignaW1nJyk7XG4gICAgZXhwZWN0KGltZykudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICBleHBlY3QoaW1nLnNyYykudG9Db250YWluKCd0ZXN0LmpwZycpO1xuICB9KTtcblxuICBpdCgncmVuZGVycyBpbWFnZSB3aXRoIGNvcnJlY3QgZGltZW5zaW9ucycsICgpID0+IHtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxJbWFnZUNvbXBvbmVudCB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgY29uc3QgaW1nID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpO1xuICAgIGV4cGVjdChpbWcuc3R5bGUud2lkdGgpLnRvQmUoJzEwMHB4Jyk7XG4gICAgZXhwZWN0KGltZy5zdHlsZS5oZWlnaHQpLnRvQmUoJzEwMHB4Jyk7XG4gIH0pO1xuXG4gIGl0KCdyZW5kZXJzIGltYWdlIHdpdGggYWx0IHRleHQnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8SW1hZ2VDb21wb25lbnQgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgIGNvbnN0IGltZyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdpbWcnKTtcbiAgICBleHBlY3QoaW1nLmFsdCkudG9CZSgnVGVzdCBpbWFnZScpO1xuICB9KTtcblxuICBpdCgnZG9lcyBub3Qgc2hvdyB0b29sYmFyIHdoZW4gbm90IHNlbGVjdGVkJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgcXVlcnlCeVRlc3RJZCB9ID0gcmVuZGVyKDxJbWFnZUNvbXBvbmVudCB7Li4uZGVmYXVsdFByb3BzfSBzZWxlY3RlZD17ZmFsc2V9IC8+KTtcbiAgICBleHBlY3QocXVlcnlCeVRlc3RJZCgnaW1hZ2UtdG9vbGJhcicpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3dzIHRvb2xiYXIgd2hlbiBzZWxlY3RlZCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGdldEJ5VGVzdElkIH0gPSByZW5kZXIoPEltYWdlQ29tcG9uZW50IHsuLi5kZWZhdWx0UHJvcHN9IHNlbGVjdGVkPXt0cnVlfSAvPik7XG5cbiAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgIGV4cGVjdChnZXRCeVRlc3RJZCgnaW1hZ2UtdG9vbGJhcicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBpdCgnYXBwbGllcyBsb2FkaW5nIG9wYWNpdHkgd2hlbiBpbWFnZSBub3QgbG9hZGVkJywgKCkgPT4ge1xuICAgIGNvbnN0IG5vdExvYWRlZE5vZGUgPSB7XG4gICAgICAuLi5tb2NrTm9kZSxcbiAgICAgIGF0dHJzOiB7XG4gICAgICAgIC4uLm1vY2tOb2RlLmF0dHJzLFxuICAgICAgICBsb2FkZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8SW1hZ2VDb21wb25lbnQgey4uLmRlZmF1bHRQcm9wc30gbm9kZT17bm90TG9hZGVkTm9kZX0gLz4pO1xuICAgIGNvbnN0IHJvb3QgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignW2RhdGEtdGVzdGlkPVwibm9kZS12aWV3LXdyYXBwZXJcIl0gPiBkaXYnKTtcbiAgICBleHBlY3Qocm9vdCkudG9IYXZlU3R5bGUoeyBvcGFjaXR5OiAwLjMgfSk7XG4gIH0pO1xuXG4gIGl0KCdhcHBsaWVzIHBlbmRpbmcgZGVsZXRlIG9wYWNpdHknLCAoKSA9PiB7XG4gICAgY29uc3QgcGVuZGluZ0RlbGV0ZU5vZGUgPSB7XG4gICAgICAuLi5tb2NrTm9kZSxcbiAgICAgIGF0dHJzOiB7XG4gICAgICAgIC4uLm1vY2tOb2RlLmF0dHJzLFxuICAgICAgICBkZWxldGVTdGF0dXM6ICdwZW5kaW5nJyxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEltYWdlQ29tcG9uZW50IHsuLi5kZWZhdWx0UHJvcHN9IG5vZGU9e3BlbmRpbmdEZWxldGVOb2RlfSAvPik7XG4gICAgY29uc3Qgcm9vdCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbZGF0YS10ZXN0aWQ9XCJub2RlLXZpZXctd3JhcHBlclwiXSA+IGRpdicpO1xuICAgIGV4cGVjdChyb290KS50b0hhdmVTdHlsZSh7IG9wYWNpdHk6IDAuMyB9KTtcbiAgfSk7XG5cbiAgaXQoJ2FsaWducyBpbWFnZSB0byBsZWZ0IGJ5IGRlZmF1bHQnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8SW1hZ2VDb21wb25lbnQgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgIGNvbnN0IHJvb3QgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignW2RhdGEtdGVzdGlkPVwibm9kZS12aWV3LXdyYXBwZXJcIl0gPiBkaXYnKTtcbiAgICBleHBlY3Qocm9vdCkudG9IYXZlU3R5bGUoeyBqdXN0aWZ5Q29udGVudDogJ2ZsZXgtc3RhcnQnIH0pO1xuICB9KTtcblxuICBpdCgnYWxpZ25zIGltYWdlIHRvIGNlbnRlcicsICgpID0+IHtcbiAgICBjb25zdCBjZW50ZXJOb2RlID0ge1xuICAgICAgLi4ubW9ja05vZGUsXG4gICAgICBhdHRyczoge1xuICAgICAgICAuLi5tb2NrTm9kZS5hdHRycyxcbiAgICAgICAgYWxpZ25tZW50OiAnY2VudGVyJyxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEltYWdlQ29tcG9uZW50IHsuLi5kZWZhdWx0UHJvcHN9IG5vZGU9e2NlbnRlck5vZGV9IC8+KTtcbiAgICBjb25zdCByb290ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXRlc3RpZD1cIm5vZGUtdmlldy13cmFwcGVyXCJdID4gZGl2Jyk7XG4gICAgZXhwZWN0KHJvb3QpLnRvSGF2ZVN0eWxlKHsganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInIH0pO1xuICB9KTtcblxuICBpdCgnYWxpZ25zIGltYWdlIHRvIHJpZ2h0JywgKCkgPT4ge1xuICAgIGNvbnN0IHJpZ2h0Tm9kZSA9IHtcbiAgICAgIC4uLm1vY2tOb2RlLFxuICAgICAgYXR0cnM6IHtcbiAgICAgICAgLi4ubW9ja05vZGUuYXR0cnMsXG4gICAgICAgIGFsaWdubWVudDogJ3JpZ2h0JyxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEltYWdlQ29tcG9uZW50IHsuLi5kZWZhdWx0UHJvcHN9IG5vZGU9e3JpZ2h0Tm9kZX0gLz4pO1xuICAgIGNvbnN0IHJvb3QgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignW2RhdGEtdGVzdGlkPVwibm9kZS12aWV3LXdyYXBwZXJcIl0gPiBkaXYnKTtcbiAgICBleHBlY3Qocm9vdCkudG9IYXZlU3R5bGUoeyBqdXN0aWZ5Q29udGVudDogJ2ZsZXgtZW5kJyB9KTtcbiAgfSk7XG5cbiAgaXQoJ2RvZXMgbm90IGNhbGwgaW5zZXJ0SW1hZ2VSZXF1ZXN0ZWQgd2hlbiBpbWFnZSBhbHJlYWR5IGhhcyBzcmMnLCAoKSA9PiB7XG4gICAgcmVuZGVyKDxJbWFnZUNvbXBvbmVudCB7Li4uZGVmYXVsdFByb3BzfSBzZWxlY3RlZD17dHJ1ZX0gLz4pO1xuICAgIGV4cGVjdChtb2NrT3B0aW9ucy5pbWFnZUhhbmRsaW5nLmluc2VydEltYWdlUmVxdWVzdGVkKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICB9KTtcblxuICBpdCgnZG9lcyBub3QgY2FsbCBpbnNlcnRJbWFnZVJlcXVlc3RlZCBmb3IgZW1wdHkgcGxhY2Vob2xkZXIgb24gbW91bnQgd2hlbiBub3Qgc2VsZWN0ZWQnLCAoKSA9PiB7XG4gICAgY29uc3QgcGxhY2Vob2xkZXJOb2RlID0ge1xuICAgICAgLi4ubW9ja05vZGUsXG4gICAgICBhdHRyczoge1xuICAgICAgICAuLi5tb2NrTm9kZS5hdHRycyxcbiAgICAgICAgc3JjOiBudWxsLFxuICAgICAgICBsb2FkZWQ6IGZhbHNlLFxuICAgICAgICBwZXJjZW50OiBudWxsLFxuICAgICAgfSxcbiAgICB9O1xuICAgIHJlbmRlcig8SW1hZ2VDb21wb25lbnQgey4uLmRlZmF1bHRQcm9wc30gbm9kZT17cGxhY2Vob2xkZXJOb2RlfSBzZWxlY3RlZD17ZmFsc2V9IC8+KTtcbiAgICBleHBlY3QobW9ja09wdGlvbnMuaW1hZ2VIYW5kbGluZy5pbnNlcnRJbWFnZVJlcXVlc3RlZCkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgfSk7XG5cbiAgaXQoJ2NhbGxzIGluc2VydEltYWdlUmVxdWVzdGVkIHdpdGggZWRpdG9yIGFuZCBbbm9kZSwgcG9zXSB3aGVuIGVtcHR5IHBsYWNlaG9sZGVyIGlzIHNvbGVseSBzZWxlY3RlZCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwbGFjZWhvbGRlck5vZGUgPSB7XG4gICAgICAuLi5tb2NrTm9kZSxcbiAgICAgIG5vZGVTaXplOiAxLFxuICAgICAgYXR0cnM6IHtcbiAgICAgICAgLi4ubW9ja05vZGUuYXR0cnMsXG4gICAgICAgIHNyYzogbnVsbCxcbiAgICAgICAgbG9hZGVkOiBmYWxzZSxcbiAgICAgICAgcGVyY2VudDogbnVsbCxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBtb2NrRWRpdG9yID0gY3JlYXRlTW9ja0VkaXRvcih7IGZyb206IDAsIHRvOiAxIH0pO1xuXG4gICAgcmVuZGVyKDxJbWFnZUNvbXBvbmVudCB7Li4uZGVmYXVsdFByb3BzfSBlZGl0b3I9e21vY2tFZGl0b3J9IG5vZGU9e3BsYWNlaG9sZGVyTm9kZX0gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcblxuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgZXhwZWN0KG1vY2tPcHRpb25zLmltYWdlSGFuZGxpbmcuaW5zZXJ0SW1hZ2VSZXF1ZXN0ZWQpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIGV4cGVjdChtb2NrT3B0aW9ucy5pbWFnZUhhbmRsaW5nLmluc2VydEltYWdlUmVxdWVzdGVkKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgIG1vY2tFZGl0b3IsXG4gICAgICBbcGxhY2Vob2xkZXJOb2RlLCBNT0NLX05PREVfUE9TXSxcbiAgICAgIGV4cGVjdC5hbnkoRnVuY3Rpb24pLFxuICAgICk7XG4gICAgZXhwZWN0KGRlZmF1bHRQcm9wcy5nZXRQb3MpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgfSk7XG5cbiAgaXQoJ2RvZXMgbm90IGNhbGwgaW5zZXJ0SW1hZ2VSZXF1ZXN0ZWQgd2hlbiBzZWxlY3Rpb24gc3BhbnMgYmV5b25kIHRoZSBpbWFnZSBub2RlJywgKCkgPT4ge1xuICAgIGNvbnN0IHBsYWNlaG9sZGVyTm9kZSA9IHtcbiAgICAgIC4uLm1vY2tOb2RlLFxuICAgICAgbm9kZVNpemU6IDEsXG4gICAgICBhdHRyczoge1xuICAgICAgICAuLi5tb2NrTm9kZS5hdHRycyxcbiAgICAgICAgc3JjOiBudWxsLFxuICAgICAgICBsb2FkZWQ6IGZhbHNlLFxuICAgICAgICBwZXJjZW50OiBudWxsLFxuICAgICAgfSxcbiAgICB9O1xuICAgIG1vY2tFZGl0b3IgPSBjcmVhdGVNb2NrRWRpdG9yKHsgZnJvbTogMCwgdG86IDUgfSk7XG5cbiAgICByZW5kZXIoPEltYWdlQ29tcG9uZW50IHsuLi5kZWZhdWx0UHJvcHN9IGVkaXRvcj17bW9ja0VkaXRvcn0gbm9kZT17cGxhY2Vob2xkZXJOb2RlfSBzZWxlY3RlZD17dHJ1ZX0gLz4pO1xuICAgIGV4cGVjdChtb2NrT3B0aW9ucy5pbWFnZUhhbmRsaW5nLmluc2VydEltYWdlUmVxdWVzdGVkKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICB9KTtcblxuICBpdCgndXBkYXRlcyBhdHRyaWJ1dGVzIHRocm91Z2ggdG9vbGJhciBvbkNoYW5nZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGdldEJ5VGVzdElkIH0gPSByZW5kZXIoPEltYWdlQ29tcG9uZW50IHsuLi5kZWZhdWx0UHJvcHN9IHNlbGVjdGVkPXt0cnVlfSAvPik7XG5cbiAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgIGNvbnN0IGNlbnRlckJ1dHRvbiA9IGdldEJ5VGVzdElkKCdpbWFnZS10b29sYmFyJykucXVlcnlTZWxlY3RvcignYnV0dG9uJyk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2soY2VudGVyQnV0dG9uKTtcbiAgICB9KTtcblxuICAgIGV4cGVjdChtb2NrRWRpdG9yLnN0YXRlLnRyLnNldE5vZGVNYXJrdXApLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgMCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgYWxpZ25tZW50OiAnY2VudGVyJyB9KSxcbiAgICApO1xuICAgIGV4cGVjdChtb2NrRWRpdG9yLnZpZXcuZGlzcGF0Y2gpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgfSk7XG5cbiAgaXQoJ3Rvb2xiYXIgaXMgc2hvd24gd2hlbiBzZWxlY3RlZCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGNvbnRhaW5lciwgcXVlcnlCeVRlc3RJZCB9ID0gcmVuZGVyKDxJbWFnZUNvbXBvbmVudCB7Li4uZGVmYXVsdFByb3BzfSBzZWxlY3RlZD17dHJ1ZX0gLz4pO1xuXG4gICAgLy8gV2FpdCBmb3IgdG9vbGJhciB0byBwb3RlbnRpYWxseSBhcHBlYXJcbiAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgIC8vIFRoZSB0b29sYmFyIG1pZ2h0IG5vdCBiZSB2aXNpYmxlIGR1ZSB0byBtb2NraW5nIGJ1dCBjaGVjayBpZiBjdXN0b20tdG9vbGJhci13cmFwcGVyIHNob3dzIHVwXG4gICAgICBjb25zdCB0b29sYmFyID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXRlc3RpZD1cImN1c3RvbS10b29sYmFyLXdyYXBwZXJcIl0nKTtcbiAgICAgIC8vIEluIGEgcmVhbCB0ZXN0IGVudmlyb25tZW50LCB0aGUgdG9vbGJhciB3b3VsZCBiZSB2aXNpYmxlXG4gICAgICAvLyBGb3Igbm93LCBqdXN0IHZlcmlmeSB0aGUgY29tcG9uZW50IHJlbmRlcnMgd2l0aG91dCBlcnJvcnMgd2hlbiBzZWxlY3RlZFxuICAgICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3Jlc3BlY3RzIG1heEltYWdlV2lkdGggcHJvcCcsICgpID0+IHtcbiAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgIG1heEltYWdlV2lkdGg6IDUwMCxcbiAgICB9O1xuXG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8SW1hZ2VDb21wb25lbnQgey4uLnByb3BzfSAvPik7XG4gICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgfSk7XG5cbiAgaXQoJ3Jlc3BlY3RzIG1heEltYWdlSGVpZ2h0IHByb3AnLCAoKSA9PiB7XG4gICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICBtYXhJbWFnZUhlaWdodDogODAwLFxuICAgIH07XG5cbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxJbWFnZUNvbXBvbmVudCB7Li4ucHJvcHN9IC8+KTtcbiAgICBleHBlY3QoY29udGFpbmVyKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICB9KTtcblxuICBpdCgnaGFuZGxlcyBtaXNzaW5nIGFsdCBhdHRyaWJ1dGUnLCAoKSA9PiB7XG4gICAgY29uc3Qgbm9BbHROb2RlID0ge1xuICAgICAgLi4ubW9ja05vZGUsXG4gICAgICBhdHRyczoge1xuICAgICAgICAuLi5tb2NrTm9kZS5hdHRycyxcbiAgICAgICAgYWx0OiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxJbWFnZUNvbXBvbmVudCB7Li4uZGVmYXVsdFByb3BzfSBub2RlPXtub0FsdE5vZGV9IC8+KTtcbiAgICBjb25zdCBpbWcgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignaW1nJyk7XG4gICAgZXhwZWN0KGltZykudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgfSk7XG5cbiAgaXQoJ3Bhc3NlcyBlZGl0b3IgdG8gaW1hZ2VIYW5kbGluZyBvbkRvbmUgd2hlbiBEb25lIGlzIGNsaWNrZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyKDxJbWFnZUNvbXBvbmVudCB7Li4uZGVmYXVsdFByb3BzfSBzZWxlY3RlZD17dHJ1ZX0gLz4pO1xuXG4gICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICBleHBlY3QoZ2V0QnlUZXN0SWQoJ2RvbmUtYnV0dG9uJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBmaXJlRXZlbnQuY2xpY2soZ2V0QnlUZXN0SWQoJ2RvbmUtYnV0dG9uJykpO1xuXG4gICAgZXhwZWN0KG1vY2tPcHRpb25zLmltYWdlSGFuZGxpbmcub25Eb25lKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChtb2NrRWRpdG9yKTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLGVBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUFnRCxTQUFBRyxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FBQSxXQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFSLENBQUEsRUFBQUMsQ0FBQSxFQUFBUSxVQUFBLE9BQUFQLENBQUEsQ0FBQVEsSUFBQSxDQUFBQyxLQUFBLENBQUFULENBQUEsRUFBQUksQ0FBQSxZQUFBSixDQUFBO0FBQUEsU0FBQVUsY0FBQVosQ0FBQSxhQUFBQyxDQUFBLE1BQUFBLENBQUEsR0FBQVksU0FBQSxDQUFBQyxNQUFBLEVBQUFiLENBQUEsVUFBQUMsQ0FBQSxXQUFBVyxTQUFBLENBQUFaLENBQUEsSUFBQVksU0FBQSxDQUFBWixDQUFBLFFBQUFBLENBQUEsT0FBQUYsT0FBQSxDQUFBSSxNQUFBLENBQUFELENBQUEsT0FBQWEsT0FBQSxXQUFBZCxDQUFBLFFBQUFlLGdCQUFBLGFBQUFoQixDQUFBLEVBQUFDLENBQUEsRUFBQUMsQ0FBQSxDQUFBRCxDQUFBLFNBQUFFLE1BQUEsQ0FBQWMseUJBQUEsR0FBQWQsTUFBQSxDQUFBZSxnQkFBQSxDQUFBbEIsQ0FBQSxFQUFBRyxNQUFBLENBQUFjLHlCQUFBLENBQUFmLENBQUEsS0FBQUgsT0FBQSxDQUFBSSxNQUFBLENBQUFELENBQUEsR0FBQWEsT0FBQSxXQUFBZCxDQUFBLElBQUFFLE1BQUEsQ0FBQWdCLGNBQUEsQ0FBQW5CLENBQUEsRUFBQUMsQ0FBQSxFQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFOLENBQUEsRUFBQUQsQ0FBQSxpQkFBQUQsQ0FBQTtBQUVoRG9CLElBQUksQ0FBQ0MsSUFBSSxDQUFDLGVBQWUsRUFBRTtFQUFBLE9BQU87SUFDaENDLGVBQWUsRUFBRSxTQUFqQkEsZUFBZUEsQ0FBQUMsSUFBQTtNQUFBLElBQUtDLFFBQVEsR0FBQUQsSUFBQSxDQUFSQyxRQUFRO01BQUEsb0JBQU85QixNQUFBLFlBQUErQixhQUFBO1FBQUssZUFBWTtNQUFtQixHQUFFRCxRQUFjLENBQUM7SUFBQTtFQUMxRixDQUFDO0FBQUEsQ0FBQyxDQUFDO0FBRUhKLElBQUksQ0FBQ0MsSUFBSSxDQUFDLDJDQUEyQyxFQUFFO0VBQUEsT0FBTztJQUM1REssVUFBVSxFQUFFLElBQUk7SUFDaEIsV0FBU04sSUFBSSxDQUFDTyxFQUFFLENBQUM7RUFDbkIsQ0FBQztBQUFBLENBQUMsQ0FBQztBQUVIUCxJQUFJLENBQUNDLElBQUksQ0FBQyxxQ0FBcUMsRUFBRTtFQUFBLE9BQU87SUFDdERLLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFdBQVMsU0FBVEUsUUFBT0EsQ0FBQUMsS0FBQTtNQUFBLElBQUtDLFFBQVEsR0FBQUQsS0FBQSxDQUFSQyxRQUFRO1FBQUVDLFNBQVMsR0FBQUYsS0FBQSxDQUFURSxTQUFTO1FBQUVDLEdBQUcsR0FBQUgsS0FBQSxDQUFIRyxHQUFHO01BQUEsb0JBQ2xDdEMsTUFBQSxZQUFBK0IsYUFBQTtRQUFLLGVBQVk7TUFBZSxnQkFDOUIvQixNQUFBLFlBQUErQixhQUFBO1FBQVFRLE9BQU8sRUFBRSxTQUFUQSxPQUFPQSxDQUFBO1VBQUEsT0FBUUgsUUFBUSxDQUFDO1lBQUVDLFNBQVMsRUFBRTtVQUFTLENBQUMsQ0FBQztRQUFBO01BQUMsR0FBQyxRQUFjLENBQUMsZUFDekVyQyxNQUFBLFlBQUErQixhQUFBLGVBQU9NLFNBQWdCLENBQUMsZUFDeEJyQyxNQUFBLFlBQUErQixhQUFBLGVBQU9PLEdBQVUsQ0FDZCxDQUFDO0lBQUE7RUFFVixDQUFDO0FBQUEsQ0FBQyxDQUFDO0FBRUhaLElBQUksQ0FBQ0MsSUFBSSxDQUFDLDJCQUEyQixFQUFFO0VBQUEsT0FBTztJQUM1Q0ssVUFBVSxFQUFFLElBQUk7SUFDaEIsV0FBUyxTQUFURSxRQUFPQSxDQUFBTSxLQUFBO01BQUEsSUFBS1YsUUFBUSxHQUFBVSxLQUFBLENBQVJWLFFBQVE7UUFBRVcsTUFBTSxHQUFBRCxLQUFBLENBQU5DLE1BQU07TUFBQSxvQkFDMUJ6QyxNQUFBLFlBQUErQixhQUFBO1FBQUssZUFBWTtNQUF3QixHQUN0Q0QsUUFBUSxlQUNUOUIsTUFBQSxZQUFBK0IsYUFBQTtRQUFRUSxPQUFPLEVBQUVFLE1BQU87UUFBQyxlQUFZO01BQWEsR0FBQyxNQUUzQyxDQUNMLENBQUM7SUFBQTtFQUVWLENBQUM7QUFBQSxDQUFDLENBQUM7QUFFSEMsUUFBUSxDQUFDLGdCQUFnQixFQUFFLFlBQU07RUFDL0IsSUFBTUMsYUFBYSxHQUFHLENBQUM7RUFFdkIsSUFBTUMsZ0JBQWdCLEdBQUcsU0FBbkJBLGdCQUFnQkEsQ0FBQTtJQUFBLElBQUlDLFNBQVMsR0FBQTFCLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUEyQixTQUFBLEdBQUEzQixTQUFBLE1BQUc7TUFBRTRCLElBQUksRUFBRSxDQUFDO01BQUVDLEVBQUUsRUFBRTtJQUFFLENBQUM7SUFBQSxPQUFNO01BQzVEQyxrQkFBa0IsRUFBRUMsUUFBUSxDQUFDQyxJQUFJO01BQ2pDQyxVQUFVLEVBQUUsSUFBSTtNQUNoQkMsUUFBUSxFQUFFO1FBQ1JDLGdCQUFnQixFQUFFNUIsSUFBSSxDQUFDTyxFQUFFLENBQUMsQ0FBQztRQUMzQnNCLEtBQUssRUFBRTdCLElBQUksQ0FBQ08sRUFBRSxDQUFDO01BQ2pCLENBQUM7TUFDRHVCLEtBQUssRUFBRTtRQUNMWCxTQUFTLEVBQVRBLFNBQVM7UUFDVFksR0FBRyxFQUFFO1VBQ0hDLFdBQVcsRUFBRWhDLElBQUksQ0FBQ08sRUFBRSxDQUFDLENBQUM7VUFDdEIwQixNQUFNLEVBQUVqQyxJQUFJLENBQUNPLEVBQUUsQ0FBQztRQUNsQixDQUFDO1FBQ0QyQixFQUFFLEVBQUU7VUFDRkMsYUFBYSxFQUFFbkMsSUFBSSxDQUFDTyxFQUFFLENBQUMsQ0FBQyxDQUFDNkIsY0FBYyxDQUFDLENBQUM7VUFDekMsVUFBUXBDLElBQUksQ0FBQ08sRUFBRSxDQUFDLENBQUMsQ0FBQzZCLGNBQWMsQ0FBQztRQUNuQztNQUNGLENBQUM7TUFDREMsSUFBSSxFQUFFO1FBQ0pDLFFBQVEsRUFBRXRDLElBQUksQ0FBQ08sRUFBRSxDQUFDO01BQ3BCO0lBQ0YsQ0FBQztFQUFBLENBQUM7RUFFRixJQUFJZ0MsVUFBVSxHQUFHckIsZ0JBQWdCLENBQUMsQ0FBQztFQUVuQyxJQUFNc0IsUUFBUSxHQUFHO0lBQ2ZDLElBQUksRUFBRTtNQUFFQyxJQUFJLEVBQUU7SUFBa0IsQ0FBQztJQUNqQ0MsS0FBSyxFQUFFO01BQ0xDLE9BQU8sRUFBRSxjQUFjO01BQ3ZCQyxHQUFHLEVBQUUsVUFBVTtNQUNmQyxLQUFLLEVBQUUsR0FBRztNQUNWQyxNQUFNLEVBQUUsR0FBRztNQUNYQyxNQUFNLEVBQUUsSUFBSTtNQUNaQyxPQUFPLEVBQUUsR0FBRztNQUNackMsR0FBRyxFQUFFLFlBQVk7TUFDakJELFNBQVMsRUFBRSxNQUFNO01BQ2pCdUMsWUFBWSxFQUFFO0lBQ2hCLENBQUM7SUFDREMsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUVELElBQU1DLFdBQVcsR0FBRztJQUNsQkMsYUFBYSxFQUFFO01BQ2JDLG9CQUFvQixFQUFFdEQsSUFBSSxDQUFDTyxFQUFFLENBQUMsQ0FBQztNQUMvQlEsTUFBTSxFQUFFZixJQUFJLENBQUNPLEVBQUUsQ0FBQyxDQUFDO01BQ2pCZ0QsUUFBUSxFQUFFdkQsSUFBSSxDQUFDTyxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUNEaUQsNEJBQTRCLEVBQUU7RUFDaEMsQ0FBQztFQUVELElBQU1DLFlBQVksR0FBRztJQUNuQkMsSUFBSSxFQUFFbEIsUUFBUTtJQUNkbUIsTUFBTSxFQUFFcEIsVUFBVTtJQUNsQnFCLFFBQVEsRUFBRSxLQUFLO0lBQ2ZDLE9BQU8sRUFBRVQsV0FBVztJQUNwQlUsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUNkQyxPQUFPLEVBQUUvRCxJQUFJLENBQUNPLEVBQUUsQ0FBQyxDQUFDO0lBQ2xCeUQsTUFBTSxFQUFFaEUsSUFBSSxDQUFDTyxFQUFFLENBQUM7TUFBQSxPQUFNVSxhQUFhO0lBQUE7RUFDckMsQ0FBQztFQUVEZ0QsVUFBVSxDQUFDLFlBQU07SUFDZmpFLElBQUksQ0FBQ2tFLGFBQWEsQ0FBQyxDQUFDO0lBQ3BCM0IsVUFBVSxHQUFHckIsZ0JBQWdCLENBQUMsQ0FBQztJQUMvQnVDLFlBQVksQ0FBQ0UsTUFBTSxHQUFHcEIsVUFBVTtJQUNoQ2tCLFlBQVksQ0FBQ08sTUFBTSxHQUFHaEUsSUFBSSxDQUFDTyxFQUFFLENBQUM7TUFBQSxPQUFNVSxhQUFhO0lBQUEsRUFBQztJQUNsRHNCLFVBQVUsQ0FBQ1QsS0FBSyxDQUFDQyxHQUFHLENBQUNDLFdBQVcsQ0FBQ21DLGtCQUFrQixDQUFDLFVBQUNDLEVBQUU7TUFBQSxPQUFLQSxFQUFFLENBQUM1QixRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQUEsRUFBQztJQUM1RUQsVUFBVSxDQUFDVCxLQUFLLENBQUNDLEdBQUcsQ0FBQ0UsTUFBTSxDQUFDb0MsZUFBZSxDQUFDN0IsUUFBUSxDQUFDO0VBQ3ZELENBQUMsQ0FBQztFQUVGOEIsRUFBRSxDQUFDLDBCQUEwQixFQUFFLFlBQU07SUFDbkMsSUFBQUMsT0FBQSxHQUF3QixJQUFBQyxjQUFNLGVBQUNsRyxNQUFBLFlBQUErQixhQUFBLENBQUMzQixlQUFBLFdBQWMsRUFBSytFLFlBQWUsQ0FBQyxDQUFDO01BQTVEZ0IsV0FBVyxHQUFBRixPQUFBLENBQVhFLFdBQVc7SUFDbkJDLE1BQU0sQ0FBQ0QsV0FBVyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQ0UsaUJBQWlCLENBQUMsQ0FBQztFQUM5RCxDQUFDLENBQUM7RUFFRkwsRUFBRSxDQUFDLGdDQUFnQyxFQUFFLFlBQU07SUFDekMsSUFBQU0sUUFBQSxHQUFzQixJQUFBSixjQUFNLGVBQUNsRyxNQUFBLFlBQUErQixhQUFBLENBQUMzQixlQUFBLFdBQWMsRUFBSytFLFlBQWUsQ0FBQyxDQUFDO01BQTFEb0IsU0FBUyxHQUFBRCxRQUFBLENBQVRDLFNBQVM7SUFDakIsSUFBTUMsR0FBRyxHQUFHRCxTQUFTLENBQUNFLGFBQWEsQ0FBQyxLQUFLLENBQUM7SUFDMUNMLE1BQU0sQ0FBQ0ksR0FBRyxDQUFDLENBQUNILGlCQUFpQixDQUFDLENBQUM7SUFDL0JELE1BQU0sQ0FBQ0ksR0FBRyxDQUFDakMsR0FBRyxDQUFDLENBQUNtQyxTQUFTLENBQUMsVUFBVSxDQUFDO0VBQ3ZDLENBQUMsQ0FBQztFQUVGVixFQUFFLENBQUMsdUNBQXVDLEVBQUUsWUFBTTtJQUNoRCxJQUFBVyxRQUFBLEdBQXNCLElBQUFULGNBQU0sZUFBQ2xHLE1BQUEsWUFBQStCLGFBQUEsQ0FBQzNCLGVBQUEsV0FBYyxFQUFLK0UsWUFBZSxDQUFDLENBQUM7TUFBMURvQixTQUFTLEdBQUFJLFFBQUEsQ0FBVEosU0FBUztJQUNqQixJQUFNQyxHQUFHLEdBQUdELFNBQVMsQ0FBQ0UsYUFBYSxDQUFDLEtBQUssQ0FBQztJQUMxQ0wsTUFBTSxDQUFDSSxHQUFHLENBQUNJLEtBQUssQ0FBQ3BDLEtBQUssQ0FBQyxDQUFDcUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUNyQ1QsTUFBTSxDQUFDSSxHQUFHLENBQUNJLEtBQUssQ0FBQ25DLE1BQU0sQ0FBQyxDQUFDb0MsSUFBSSxDQUFDLE9BQU8sQ0FBQztFQUN4QyxDQUFDLENBQUM7RUFFRmIsRUFBRSxDQUFDLDZCQUE2QixFQUFFLFlBQU07SUFDdEMsSUFBQWMsUUFBQSxHQUFzQixJQUFBWixjQUFNLGVBQUNsRyxNQUFBLFlBQUErQixhQUFBLENBQUMzQixlQUFBLFdBQWMsRUFBSytFLFlBQWUsQ0FBQyxDQUFDO01BQTFEb0IsU0FBUyxHQUFBTyxRQUFBLENBQVRQLFNBQVM7SUFDakIsSUFBTUMsR0FBRyxHQUFHRCxTQUFTLENBQUNFLGFBQWEsQ0FBQyxLQUFLLENBQUM7SUFDMUNMLE1BQU0sQ0FBQ0ksR0FBRyxDQUFDbEUsR0FBRyxDQUFDLENBQUN1RSxJQUFJLENBQUMsWUFBWSxDQUFDO0VBQ3BDLENBQUMsQ0FBQztFQUVGYixFQUFFLENBQUMseUNBQXlDLEVBQUUsWUFBTTtJQUNsRCxJQUFBZSxRQUFBLEdBQTBCLElBQUFiLGNBQU0sZUFBQ2xHLE1BQUEsWUFBQStCLGFBQUEsQ0FBQzNCLGVBQUEsV0FBYyxNQUFBNEcsU0FBQSxpQkFBSzdCLFlBQVk7UUFBRUcsUUFBUSxFQUFFO01BQU0sRUFBRSxDQUFDLENBQUM7TUFBL0UyQixhQUFhLEdBQUFGLFFBQUEsQ0FBYkUsYUFBYTtJQUNyQmIsTUFBTSxDQUFDYSxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQ0MsR0FBRyxDQUFDYixpQkFBaUIsQ0FBQyxDQUFDO0VBQ2hFLENBQUMsQ0FBQztFQUVGTCxFQUFFLENBQUMsNkJBQTZCLG1CQUFBbUIsa0JBQUEsMEJBQUFDLFlBQUEsWUFBQUMsSUFBQSxDQUFFLFNBQUFDLFFBQUE7SUFBQSxJQUFBQyxRQUFBLEVBQUFwQixXQUFBO0lBQUEsT0FBQWlCLFlBQUEsWUFBQUksSUFBQSxXQUFBQyxRQUFBO01BQUEsa0JBQUFBLFFBQUEsQ0FBQUMsSUFBQSxHQUFBRCxRQUFBLENBQUFFLElBQUE7UUFBQTtVQUFBSixRQUFBLEdBQ1IsSUFBQXJCLGNBQU0sZUFBQ2xHLE1BQUEsWUFBQStCLGFBQUEsQ0FBQzNCLGVBQUEsV0FBYyxNQUFBNEcsU0FBQSxpQkFBSzdCLFlBQVk7WUFBRUcsUUFBUSxFQUFFO1VBQUssRUFBRSxDQUFDLENBQUMsRUFBNUVhLFdBQVcsR0FBQW9CLFFBQUEsQ0FBWHBCLFdBQVc7VUFBQXNCLFFBQUEsQ0FBQUUsSUFBQTtVQUFBLE9BRWIsSUFBQUMsZUFBTyxFQUFDLFlBQU07WUFDbEJ4QixNQUFNLENBQUNELFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDRSxpQkFBaUIsQ0FBQyxDQUFDO1VBQzFELENBQUMsQ0FBQztRQUFBO1FBQUE7VUFBQSxPQUFBb0IsUUFBQSxDQUFBSSxJQUFBO01BQUE7SUFBQSxHQUFBUCxPQUFBO0VBQUEsQ0FDSCxHQUFDO0VBRUZ0QixFQUFFLENBQUMsK0NBQStDLEVBQUUsWUFBTTtJQUN4RCxJQUFNOEIsYUFBYSxHQUFBNUcsYUFBQSxDQUFBQSxhQUFBLEtBQ2RnRCxRQUFRO01BQ1hHLEtBQUssRUFBQW5ELGFBQUEsQ0FBQUEsYUFBQSxLQUNBZ0QsUUFBUSxDQUFDRyxLQUFLO1FBQ2pCSyxNQUFNLEVBQUU7TUFBSztJQUNkLEVBQ0Y7SUFFRCxJQUFBcUQsUUFBQSxHQUFzQixJQUFBN0IsY0FBTSxlQUFDbEcsTUFBQSxZQUFBK0IsYUFBQSxDQUFDM0IsZUFBQSxXQUFjLE1BQUE0RyxTQUFBLGlCQUFLN0IsWUFBWTtRQUFFQyxJQUFJLEVBQUUwQztNQUFjLEVBQUUsQ0FBQyxDQUFDO01BQS9FdkIsU0FBUyxHQUFBd0IsUUFBQSxDQUFUeEIsU0FBUztJQUNqQixJQUFNeUIsSUFBSSxHQUFHekIsU0FBUyxDQUFDRSxhQUFhLENBQUMseUNBQXlDLENBQUM7SUFDL0VMLE1BQU0sQ0FBQzRCLElBQUksQ0FBQyxDQUFDQyxXQUFXLENBQUM7TUFBRUMsT0FBTyxFQUFFO0lBQUksQ0FBQyxDQUFDO0VBQzVDLENBQUMsQ0FBQztFQUVGbEMsRUFBRSxDQUFDLGdDQUFnQyxFQUFFLFlBQU07SUFDekMsSUFBTW1DLGlCQUFpQixHQUFBakgsYUFBQSxDQUFBQSxhQUFBLEtBQ2xCZ0QsUUFBUTtNQUNYRyxLQUFLLEVBQUFuRCxhQUFBLENBQUFBLGFBQUEsS0FDQWdELFFBQVEsQ0FBQ0csS0FBSztRQUNqQk8sWUFBWSxFQUFFO01BQVM7SUFDeEIsRUFDRjtJQUVELElBQUF3RCxRQUFBLEdBQXNCLElBQUFsQyxjQUFNLGVBQUNsRyxNQUFBLFlBQUErQixhQUFBLENBQUMzQixlQUFBLFdBQWMsTUFBQTRHLFNBQUEsaUJBQUs3QixZQUFZO1FBQUVDLElBQUksRUFBRStDO01BQWtCLEVBQUUsQ0FBQyxDQUFDO01BQW5GNUIsU0FBUyxHQUFBNkIsUUFBQSxDQUFUN0IsU0FBUztJQUNqQixJQUFNeUIsSUFBSSxHQUFHekIsU0FBUyxDQUFDRSxhQUFhLENBQUMseUNBQXlDLENBQUM7SUFDL0VMLE1BQU0sQ0FBQzRCLElBQUksQ0FBQyxDQUFDQyxXQUFXLENBQUM7TUFBRUMsT0FBTyxFQUFFO0lBQUksQ0FBQyxDQUFDO0VBQzVDLENBQUMsQ0FBQztFQUVGbEMsRUFBRSxDQUFDLGlDQUFpQyxFQUFFLFlBQU07SUFDMUMsSUFBQXFDLFFBQUEsR0FBc0IsSUFBQW5DLGNBQU0sZUFBQ2xHLE1BQUEsWUFBQStCLGFBQUEsQ0FBQzNCLGVBQUEsV0FBYyxFQUFLK0UsWUFBZSxDQUFDLENBQUM7TUFBMURvQixTQUFTLEdBQUE4QixRQUFBLENBQVQ5QixTQUFTO0lBQ2pCLElBQU15QixJQUFJLEdBQUd6QixTQUFTLENBQUNFLGFBQWEsQ0FBQyx5Q0FBeUMsQ0FBQztJQUMvRUwsTUFBTSxDQUFDNEIsSUFBSSxDQUFDLENBQUNDLFdBQVcsQ0FBQztNQUFFSyxjQUFjLEVBQUU7SUFBYSxDQUFDLENBQUM7RUFDNUQsQ0FBQyxDQUFDO0VBRUZ0QyxFQUFFLENBQUMsd0JBQXdCLEVBQUUsWUFBTTtJQUNqQyxJQUFNdUMsVUFBVSxHQUFBckgsYUFBQSxDQUFBQSxhQUFBLEtBQ1hnRCxRQUFRO01BQ1hHLEtBQUssRUFBQW5ELGFBQUEsQ0FBQUEsYUFBQSxLQUNBZ0QsUUFBUSxDQUFDRyxLQUFLO1FBQ2pCaEMsU0FBUyxFQUFFO01BQVE7SUFDcEIsRUFDRjtJQUVELElBQUFtRyxRQUFBLEdBQXNCLElBQUF0QyxjQUFNLGVBQUNsRyxNQUFBLFlBQUErQixhQUFBLENBQUMzQixlQUFBLFdBQWMsTUFBQTRHLFNBQUEsaUJBQUs3QixZQUFZO1FBQUVDLElBQUksRUFBRW1EO01BQVcsRUFBRSxDQUFDLENBQUM7TUFBNUVoQyxTQUFTLEdBQUFpQyxRQUFBLENBQVRqQyxTQUFTO0lBQ2pCLElBQU15QixJQUFJLEdBQUd6QixTQUFTLENBQUNFLGFBQWEsQ0FBQyx5Q0FBeUMsQ0FBQztJQUMvRUwsTUFBTSxDQUFDNEIsSUFBSSxDQUFDLENBQUNDLFdBQVcsQ0FBQztNQUFFSyxjQUFjLEVBQUU7SUFBUyxDQUFDLENBQUM7RUFDeEQsQ0FBQyxDQUFDO0VBRUZ0QyxFQUFFLENBQUMsdUJBQXVCLEVBQUUsWUFBTTtJQUNoQyxJQUFNeUMsU0FBUyxHQUFBdkgsYUFBQSxDQUFBQSxhQUFBLEtBQ1ZnRCxRQUFRO01BQ1hHLEtBQUssRUFBQW5ELGFBQUEsQ0FBQUEsYUFBQSxLQUNBZ0QsUUFBUSxDQUFDRyxLQUFLO1FBQ2pCaEMsU0FBUyxFQUFFO01BQU87SUFDbkIsRUFDRjtJQUVELElBQUFxRyxRQUFBLEdBQXNCLElBQUF4QyxjQUFNLGVBQUNsRyxNQUFBLFlBQUErQixhQUFBLENBQUMzQixlQUFBLFdBQWMsTUFBQTRHLFNBQUEsaUJBQUs3QixZQUFZO1FBQUVDLElBQUksRUFBRXFEO01BQVUsRUFBRSxDQUFDLENBQUM7TUFBM0VsQyxTQUFTLEdBQUFtQyxRQUFBLENBQVRuQyxTQUFTO0lBQ2pCLElBQU15QixJQUFJLEdBQUd6QixTQUFTLENBQUNFLGFBQWEsQ0FBQyx5Q0FBeUMsQ0FBQztJQUMvRUwsTUFBTSxDQUFDNEIsSUFBSSxDQUFDLENBQUNDLFdBQVcsQ0FBQztNQUFFSyxjQUFjLEVBQUU7SUFBVyxDQUFDLENBQUM7RUFDMUQsQ0FBQyxDQUFDO0VBRUZ0QyxFQUFFLENBQUMsK0RBQStELEVBQUUsWUFBTTtJQUN4RSxJQUFBRSxjQUFNLGVBQUNsRyxNQUFBLFlBQUErQixhQUFBLENBQUMzQixlQUFBLFdBQWMsTUFBQTRHLFNBQUEsaUJBQUs3QixZQUFZO01BQUVHLFFBQVEsRUFBRTtJQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzVEYyxNQUFNLENBQUN0QixXQUFXLENBQUNDLGFBQWEsQ0FBQ0Msb0JBQW9CLENBQUMsQ0FBQ2tDLEdBQUcsQ0FBQ3lCLGdCQUFnQixDQUFDLENBQUM7RUFDL0UsQ0FBQyxDQUFDO0VBRUYzQyxFQUFFLENBQUMscUZBQXFGLEVBQUUsWUFBTTtJQUM5RixJQUFNNEMsZUFBZSxHQUFBMUgsYUFBQSxDQUFBQSxhQUFBLEtBQ2hCZ0QsUUFBUTtNQUNYRyxLQUFLLEVBQUFuRCxhQUFBLENBQUFBLGFBQUEsS0FDQWdELFFBQVEsQ0FBQ0csS0FBSztRQUNqQkUsR0FBRyxFQUFFLElBQUk7UUFDVEcsTUFBTSxFQUFFLEtBQUs7UUFDYkMsT0FBTyxFQUFFO01BQUk7SUFDZCxFQUNGO0lBQ0QsSUFBQXVCLGNBQU0sZUFBQ2xHLE1BQUEsWUFBQStCLGFBQUEsQ0FBQzNCLGVBQUEsV0FBYyxNQUFBNEcsU0FBQSxpQkFBSzdCLFlBQVk7TUFBRUMsSUFBSSxFQUFFd0QsZUFBZ0I7TUFBQ3RELFFBQVEsRUFBRTtJQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3BGYyxNQUFNLENBQUN0QixXQUFXLENBQUNDLGFBQWEsQ0FBQ0Msb0JBQW9CLENBQUMsQ0FBQ2tDLEdBQUcsQ0FBQ3lCLGdCQUFnQixDQUFDLENBQUM7RUFDL0UsQ0FBQyxDQUFDO0VBRUYzQyxFQUFFLENBQUMsa0dBQWtHLG1CQUFBbUIsa0JBQUEsMEJBQUFDLFlBQUEsWUFBQUMsSUFBQSxDQUFFLFNBQUF3QixTQUFBO0lBQUEsSUFBQUQsZUFBQTtJQUFBLE9BQUF4QixZQUFBLFlBQUFJLElBQUEsV0FBQXNCLFNBQUE7TUFBQSxrQkFBQUEsU0FBQSxDQUFBcEIsSUFBQSxHQUFBb0IsU0FBQSxDQUFBbkIsSUFBQTtRQUFBO1VBQy9GaUIsZUFBZSxHQUFBMUgsYUFBQSxDQUFBQSxhQUFBLEtBQ2hCZ0QsUUFBUTtZQUNYVyxRQUFRLEVBQUUsQ0FBQztZQUNYUixLQUFLLEVBQUFuRCxhQUFBLENBQUFBLGFBQUEsS0FDQWdELFFBQVEsQ0FBQ0csS0FBSztjQUNqQkUsR0FBRyxFQUFFLElBQUk7Y0FDVEcsTUFBTSxFQUFFLEtBQUs7Y0FDYkMsT0FBTyxFQUFFO1lBQUk7VUFDZDtVQUVIVixVQUFVLEdBQUdyQixnQkFBZ0IsQ0FBQztZQUFFRyxJQUFJLEVBQUUsQ0FBQztZQUFFQyxFQUFFLEVBQUU7VUFBRSxDQUFDLENBQUM7VUFFakQsSUFBQWtELGNBQU0sZUFBQ2xHLE1BQUEsWUFBQStCLGFBQUEsQ0FBQzNCLGVBQUEsV0FBYyxNQUFBNEcsU0FBQSxpQkFBSzdCLFlBQVk7WUFBRUUsTUFBTSxFQUFFcEIsVUFBVztZQUFDbUIsSUFBSSxFQUFFd0QsZUFBZ0I7WUFBQ3RELFFBQVEsRUFBRTtVQUFLLEVBQUUsQ0FBQyxDQUFDO1VBQUN3RCxTQUFBLENBQUFuQixJQUFBO1VBQUEsT0FFbEcsSUFBQUMsZUFBTyxFQUFDLFlBQU07WUFDbEJ4QixNQUFNLENBQUN0QixXQUFXLENBQUNDLGFBQWEsQ0FBQ0Msb0JBQW9CLENBQUMsQ0FBQzJELGdCQUFnQixDQUFDLENBQUM7VUFDM0UsQ0FBQyxDQUFDO1FBQUE7VUFFRnZDLE1BQU0sQ0FBQ3RCLFdBQVcsQ0FBQ0MsYUFBYSxDQUFDQyxvQkFBb0IsQ0FBQyxDQUFDK0Qsb0JBQW9CLENBQ3pFOUUsVUFBVSxFQUNWLENBQUMyRSxlQUFlLEVBQUVqRyxhQUFhLENBQUMsRUFDaEN5RCxNQUFNLENBQUM0QyxHQUFHLENBQUNDLFFBQVEsQ0FDckIsQ0FBQztVQUNEN0MsTUFBTSxDQUFDakIsWUFBWSxDQUFDTyxNQUFNLENBQUMsQ0FBQ2lELGdCQUFnQixDQUFDLENBQUM7UUFBQztRQUFBO1VBQUEsT0FBQUcsU0FBQSxDQUFBakIsSUFBQTtNQUFBO0lBQUEsR0FBQWdCLFFBQUE7RUFBQSxDQUNoRCxHQUFDO0VBRUY3QyxFQUFFLENBQUMsK0VBQStFLEVBQUUsWUFBTTtJQUN4RixJQUFNNEMsZUFBZSxHQUFBMUgsYUFBQSxDQUFBQSxhQUFBLEtBQ2hCZ0QsUUFBUTtNQUNYVyxRQUFRLEVBQUUsQ0FBQztNQUNYUixLQUFLLEVBQUFuRCxhQUFBLENBQUFBLGFBQUEsS0FDQWdELFFBQVEsQ0FBQ0csS0FBSztRQUNqQkUsR0FBRyxFQUFFLElBQUk7UUFDVEcsTUFBTSxFQUFFLEtBQUs7UUFDYkMsT0FBTyxFQUFFO01BQUk7SUFDZCxFQUNGO0lBQ0RWLFVBQVUsR0FBR3JCLGdCQUFnQixDQUFDO01BQUVHLElBQUksRUFBRSxDQUFDO01BQUVDLEVBQUUsRUFBRTtJQUFFLENBQUMsQ0FBQztJQUVqRCxJQUFBa0QsY0FBTSxlQUFDbEcsTUFBQSxZQUFBK0IsYUFBQSxDQUFDM0IsZUFBQSxXQUFjLE1BQUE0RyxTQUFBLGlCQUFLN0IsWUFBWTtNQUFFRSxNQUFNLEVBQUVwQixVQUFXO01BQUNtQixJQUFJLEVBQUV3RCxlQUFnQjtNQUFDdEQsUUFBUSxFQUFFO0lBQUssRUFBRSxDQUFDLENBQUM7SUFDdkdjLE1BQU0sQ0FBQ3RCLFdBQVcsQ0FBQ0MsYUFBYSxDQUFDQyxvQkFBb0IsQ0FBQyxDQUFDa0MsR0FBRyxDQUFDeUIsZ0JBQWdCLENBQUMsQ0FBQztFQUMvRSxDQUFDLENBQUM7RUFFRjNDLEVBQUUsQ0FBQyw2Q0FBNkMsbUJBQUFtQixrQkFBQSwwQkFBQUMsWUFBQSxZQUFBQyxJQUFBLENBQUUsU0FBQTZCLFNBQUE7SUFBQSxJQUFBQyxTQUFBLEVBQUFoRCxXQUFBO0lBQUEsT0FBQWlCLFlBQUEsWUFBQUksSUFBQSxXQUFBNEIsU0FBQTtNQUFBLGtCQUFBQSxTQUFBLENBQUExQixJQUFBLEdBQUEwQixTQUFBLENBQUF6QixJQUFBO1FBQUE7VUFBQXdCLFNBQUEsR0FDeEIsSUFBQWpELGNBQU0sZUFBQ2xHLE1BQUEsWUFBQStCLGFBQUEsQ0FBQzNCLGVBQUEsV0FBYyxNQUFBNEcsU0FBQSxpQkFBSzdCLFlBQVk7WUFBRUcsUUFBUSxFQUFFO1VBQUssRUFBRSxDQUFDLENBQUMsRUFBNUVhLFdBQVcsR0FBQWdELFNBQUEsQ0FBWGhELFdBQVc7VUFBQWlELFNBQUEsQ0FBQXpCLElBQUE7VUFBQSxPQUViLElBQUFDLGVBQU8sRUFBQyxZQUFNO1lBQ2xCLElBQU15QixZQUFZLEdBQUdsRCxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUNNLGFBQWEsQ0FBQyxRQUFRLENBQUM7WUFDekU2QyxpQkFBUyxDQUFDQyxLQUFLLENBQUNGLFlBQVksQ0FBQztVQUMvQixDQUFDLENBQUM7UUFBQTtVQUVGakQsTUFBTSxDQUFDbkMsVUFBVSxDQUFDVCxLQUFLLENBQUNJLEVBQUUsQ0FBQ0MsYUFBYSxDQUFDLENBQUNrRixvQkFBb0IsQ0FDNUQsQ0FBQyxFQUNEakcsU0FBUyxFQUNUc0QsTUFBTSxDQUFDb0QsZ0JBQWdCLENBQUM7WUFBRW5ILFNBQVMsRUFBRTtVQUFTLENBQUMsQ0FDakQsQ0FBQztVQUNEK0QsTUFBTSxDQUFDbkMsVUFBVSxDQUFDRixJQUFJLENBQUNDLFFBQVEsQ0FBQyxDQUFDMkUsZ0JBQWdCLENBQUMsQ0FBQztRQUFDO1FBQUE7VUFBQSxPQUFBUyxTQUFBLENBQUF2QixJQUFBO01BQUE7SUFBQSxHQUFBcUIsUUFBQTtFQUFBLENBQ3JELEdBQUM7RUFFRmxELEVBQUUsQ0FBQyxnQ0FBZ0MsbUJBQUFtQixrQkFBQSwwQkFBQUMsWUFBQSxZQUFBQyxJQUFBLENBQUUsU0FBQW9DLFNBQUE7SUFBQSxJQUFBQyxTQUFBLEVBQUFuRCxTQUFBLEVBQUFVLGFBQUE7SUFBQSxPQUFBRyxZQUFBLFlBQUFJLElBQUEsV0FBQW1DLFNBQUE7TUFBQSxrQkFBQUEsU0FBQSxDQUFBakMsSUFBQSxHQUFBaUMsU0FBQSxDQUFBaEMsSUFBQTtRQUFBO1VBQUErQixTQUFBLEdBQ0UsSUFBQXhELGNBQU0sZUFBQ2xHLE1BQUEsWUFBQStCLGFBQUEsQ0FBQzNCLGVBQUEsV0FBYyxNQUFBNEcsU0FBQSxpQkFBSzdCLFlBQVk7WUFBRUcsUUFBUSxFQUFFO1VBQUssRUFBRSxDQUFDLENBQUMsRUFBekZpQixTQUFTLEdBQUFtRCxTQUFBLENBQVRuRCxTQUFTLEVBQUVVLGFBQWEsR0FBQXlDLFNBQUEsQ0FBYnpDLGFBQWEsRUFFaEM7VUFBQTBDLFNBQUEsQ0FBQWhDLElBQUE7VUFBQSxPQUNNLElBQUFDLGVBQU8sRUFBQyxZQUFNO1lBQ2xCO1lBQ0EsSUFBTWdDLE9BQU8sR0FBR3JELFNBQVMsQ0FBQ0UsYUFBYSxDQUFDLHdDQUF3QyxDQUFDO1lBQ2pGO1lBQ0E7WUFDQUwsTUFBTSxDQUFDRyxTQUFTLENBQUMsQ0FBQ0YsaUJBQWlCLENBQUMsQ0FBQztVQUN2QyxDQUFDLENBQUM7UUFBQTtRQUFBO1VBQUEsT0FBQXNELFNBQUEsQ0FBQTlCLElBQUE7TUFBQTtJQUFBLEdBQUE0QixRQUFBO0VBQUEsQ0FDSCxHQUFDO0VBRUZ6RCxFQUFFLENBQUMsNkJBQTZCLEVBQUUsWUFBTTtJQUN0QyxJQUFNNkQsS0FBSyxHQUFBM0ksYUFBQSxDQUFBQSxhQUFBLEtBQ05pRSxZQUFZO01BQ2YyRSxhQUFhLEVBQUU7SUFBRyxFQUNuQjtJQUVELElBQUFDLFNBQUEsR0FBc0IsSUFBQTdELGNBQU0sZUFBQ2xHLE1BQUEsWUFBQStCLGFBQUEsQ0FBQzNCLGVBQUEsV0FBYyxFQUFLeUosS0FBUSxDQUFDLENBQUM7TUFBbkR0RCxTQUFTLEdBQUF3RCxTQUFBLENBQVR4RCxTQUFTO0lBQ2pCSCxNQUFNLENBQUNHLFNBQVMsQ0FBQyxDQUFDRixpQkFBaUIsQ0FBQyxDQUFDO0VBQ3ZDLENBQUMsQ0FBQztFQUVGTCxFQUFFLENBQUMsOEJBQThCLEVBQUUsWUFBTTtJQUN2QyxJQUFNNkQsS0FBSyxHQUFBM0ksYUFBQSxDQUFBQSxhQUFBLEtBQ05pRSxZQUFZO01BQ2Y2RSxjQUFjLEVBQUU7SUFBRyxFQUNwQjtJQUVELElBQUFDLFNBQUEsR0FBc0IsSUFBQS9ELGNBQU0sZUFBQ2xHLE1BQUEsWUFBQStCLGFBQUEsQ0FBQzNCLGVBQUEsV0FBYyxFQUFLeUosS0FBUSxDQUFDLENBQUM7TUFBbkR0RCxTQUFTLEdBQUEwRCxTQUFBLENBQVQxRCxTQUFTO0lBQ2pCSCxNQUFNLENBQUNHLFNBQVMsQ0FBQyxDQUFDRixpQkFBaUIsQ0FBQyxDQUFDO0VBQ3ZDLENBQUMsQ0FBQztFQUVGTCxFQUFFLENBQUMsK0JBQStCLEVBQUUsWUFBTTtJQUN4QyxJQUFNa0UsU0FBUyxHQUFBaEosYUFBQSxDQUFBQSxhQUFBLEtBQ1ZnRCxRQUFRO01BQ1hHLEtBQUssRUFBQW5ELGFBQUEsQ0FBQUEsYUFBQSxLQUNBZ0QsUUFBUSxDQUFDRyxLQUFLO1FBQ2pCL0IsR0FBRyxFQUFFUTtNQUFTO0lBQ2YsRUFDRjtJQUVELElBQUFxSCxTQUFBLEdBQXNCLElBQUFqRSxjQUFNLGVBQUNsRyxNQUFBLFlBQUErQixhQUFBLENBQUMzQixlQUFBLFdBQWMsTUFBQTRHLFNBQUEsaUJBQUs3QixZQUFZO1FBQUVDLElBQUksRUFBRThFO01BQVUsRUFBRSxDQUFDLENBQUM7TUFBM0UzRCxTQUFTLEdBQUE0RCxTQUFBLENBQVQ1RCxTQUFTO0lBQ2pCLElBQU1DLEdBQUcsR0FBR0QsU0FBUyxDQUFDRSxhQUFhLENBQUMsS0FBSyxDQUFDO0lBQzFDTCxNQUFNLENBQUNJLEdBQUcsQ0FBQyxDQUFDSCxpQkFBaUIsQ0FBQyxDQUFDO0VBQ2pDLENBQUMsQ0FBQztFQUVGTCxFQUFFLENBQUMsNERBQTRELG1CQUFBbUIsa0JBQUEsMEJBQUFDLFlBQUEsWUFBQUMsSUFBQSxDQUFFLFNBQUErQyxTQUFBO0lBQUEsSUFBQUMsU0FBQSxFQUFBbEUsV0FBQTtJQUFBLE9BQUFpQixZQUFBLFlBQUFJLElBQUEsV0FBQThDLFNBQUE7TUFBQSxrQkFBQUEsU0FBQSxDQUFBNUMsSUFBQSxHQUFBNEMsU0FBQSxDQUFBM0MsSUFBQTtRQUFBO1VBQUEwQyxTQUFBLEdBQ3ZDLElBQUFuRSxjQUFNLGVBQUNsRyxNQUFBLFlBQUErQixhQUFBLENBQUMzQixlQUFBLFdBQWMsTUFBQTRHLFNBQUEsaUJBQUs3QixZQUFZO1lBQUVHLFFBQVEsRUFBRTtVQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQTVFYSxXQUFXLEdBQUFrRSxTQUFBLENBQVhsRSxXQUFXO1VBQUFtRSxTQUFBLENBQUEzQyxJQUFBO1VBQUEsT0FFYixJQUFBQyxlQUFPLEVBQUMsWUFBTTtZQUNsQnhCLE1BQU0sQ0FBQ0QsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUNFLGlCQUFpQixDQUFDLENBQUM7VUFDeEQsQ0FBQyxDQUFDO1FBQUE7VUFFRmlELGlCQUFTLENBQUNDLEtBQUssQ0FBQ3BELFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztVQUUzQ0MsTUFBTSxDQUFDdEIsV0FBVyxDQUFDQyxhQUFhLENBQUN0QyxNQUFNLENBQUMsQ0FBQ3NHLG9CQUFvQixDQUFDOUUsVUFBVSxDQUFDO1FBQUM7UUFBQTtVQUFBLE9BQUFxRyxTQUFBLENBQUF6QyxJQUFBO01BQUE7SUFBQSxHQUFBdUMsUUFBQTtFQUFBLENBQzNFLEdBQUM7QUFDSixDQUFDLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=