@pie-lib/editable-html-tip-tap 2.1.19 → 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 (84) hide show
  1. package/CHANGELOG.md +0 -130
  2. package/lib/__tests__/EditableHtml.test.js +831 -0
  3. package/lib/__tests__/constants.test.js +21 -0
  4. package/lib/__tests__/div-to-paragraph-conversion.test.js +213 -0
  5. package/lib/__tests__/extensions.test.js +209 -0
  6. package/lib/__tests__/index.test.js +250 -0
  7. package/lib/__tests__/size-utils.test.js +57 -0
  8. package/lib/__tests__/spellcheck.test.js +142 -0
  9. package/lib/__tests__/theme.test.js +17 -0
  10. package/lib/components/EditableHtml.js +0 -56
  11. package/lib/components/EditableHtml.js.map +1 -1
  12. package/lib/components/MenuBar.js +12 -81
  13. package/lib/components/MenuBar.js.map +1 -1
  14. package/lib/components/TiptapContainer.js +2 -2
  15. package/lib/components/TiptapContainer.js.map +1 -1
  16. package/lib/components/__tests__/AltDialog.test.js +201 -0
  17. package/lib/components/__tests__/CharacterPicker.test.js +455 -0
  18. package/lib/components/__tests__/CssIcon.test.js +58 -0
  19. package/lib/components/__tests__/DragInTheBlank.test.js +295 -0
  20. package/lib/components/__tests__/ExplicitConstructedResponse.test.js +345 -0
  21. package/lib/components/__tests__/ImageToolbar.test.js +185 -0
  22. package/lib/components/__tests__/InlineDropdown.test.js +839 -0
  23. package/lib/components/__tests__/InsertImageHandler.test.js +171 -0
  24. package/lib/components/__tests__/MediaDialog.test.js +433 -0
  25. package/lib/components/__tests__/MediaToolbar.test.js +126 -0
  26. package/lib/components/__tests__/MediaWrapper.test.js +96 -0
  27. package/lib/components/__tests__/MenuBar.test.js +502 -0
  28. package/lib/components/__tests__/RespArea.test.js +171 -0
  29. package/lib/components/__tests__/TableIcons.test.js +153 -0
  30. package/lib/components/__tests__/TextAlign.test.js +209 -0
  31. package/lib/components/__tests__/TiptapContainer.test.js +196 -0
  32. package/lib/components/__tests__/characterUtils.test.js +178 -0
  33. package/lib/components/__tests__/choice.test.js +213 -0
  34. package/lib/components/__tests__/custom-popper.test.js +108 -0
  35. package/lib/components/__tests__/done-button.test.js +72 -0
  36. package/lib/components/__tests__/toolbar-buttons.test.js +277 -0
  37. package/lib/components/common/toolbar-buttons.js +5 -6
  38. package/lib/components/common/toolbar-buttons.js.map +1 -1
  39. package/lib/components/icons/TableIcons.js +1 -3
  40. package/lib/components/icons/TableIcons.js.map +1 -1
  41. package/lib/components/icons/TextAlign.js +5 -14
  42. package/lib/components/icons/TextAlign.js.map +1 -1
  43. package/lib/components/respArea/DragInTheBlank/__tests__/choice.test.js +90 -0
  44. package/lib/components/respArea/MathTemplated.js +8 -14
  45. package/lib/components/respArea/MathTemplated.js.map +1 -1
  46. package/lib/components/respArea/__tests__/MathTemplated.test.js +217 -0
  47. package/lib/extensions/__tests__/css.test.js +214 -0
  48. package/lib/extensions/__tests__/custom-toolbar-wrapper.test.js +175 -0
  49. package/lib/extensions/__tests__/divNode.test.js +108 -0
  50. package/lib/extensions/__tests__/ensure-empty-root-div.test.js +50 -0
  51. package/lib/extensions/__tests__/ensure-list-item-content-is-div.test.js +60 -0
  52. package/lib/extensions/__tests__/extended-list-item.test.js +13 -0
  53. package/lib/extensions/__tests__/extended-table-cell.test.js +15 -0
  54. package/lib/extensions/__tests__/extended-table.test.js +200 -0
  55. package/lib/extensions/__tests__/image-component.test.js +432 -0
  56. package/lib/extensions/__tests__/image.test.js +313 -0
  57. package/lib/extensions/__tests__/math.test.js +1411 -0
  58. package/lib/extensions/__tests__/media-node-view.test.js +307 -0
  59. package/lib/extensions/__tests__/media.test.js +292 -0
  60. package/lib/extensions/__tests__/responseArea.test.js +736 -0
  61. package/lib/extensions/math.js +37 -19
  62. package/lib/extensions/math.js.map +1 -1
  63. package/lib/styles/editorContainerStyles.js +2 -2
  64. package/lib/styles/editorContainerStyles.js.map +1 -1
  65. package/lib/utils/__tests__/helper.test.js +107 -0
  66. package/lib/utils/__tests__/toolbar.test.js +38 -0
  67. package/package.json +9 -9
  68. package/src/__tests__/EditableHtml.test.jsx +0 -80
  69. package/src/components/EditableHtml.jsx +0 -52
  70. package/src/components/MenuBar.jsx +9 -91
  71. package/src/components/TiptapContainer.jsx +2 -2
  72. package/src/components/__tests__/MenuBar.test.jsx +9 -97
  73. package/src/components/__tests__/toolbar-buttons.test.jsx +2 -15
  74. package/src/components/common/toolbar-buttons.jsx +4 -6
  75. package/src/components/icons/TableIcons.jsx +1 -9
  76. package/src/components/icons/TextAlign.jsx +5 -39
  77. package/src/components/respArea/MathTemplated.jsx +6 -13
  78. package/src/components/respArea/__tests__/MathTemplated.test.jsx +1 -1
  79. package/src/extensions/__tests__/math.test.js +11 -9
  80. package/src/extensions/math.js +19 -11
  81. package/src/styles/editorContainerStyles.js +2 -2
  82. package/LICENSE.md +0 -5
  83. package/src/__tests__/editor-attributes.test.jsx +0 -77
  84. package/src/__tests__/spellcheck.test.jsx +0 -63
@@ -0,0 +1,839 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
5
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
6
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
7
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
8
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
10
+ var _react = _interopRequireDefault(require("react"));
11
+ var _react2 = require("@testing-library/react");
12
+ var _mathRendering = require("@pie-lib/math-rendering");
13
+ var _InlineDropdown = _interopRequireDefault(require("../respArea/InlineDropdown"));
14
+ var _excluded = ["children"];
15
+ 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; }
16
+ 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; }
17
+ jest.mock('@pie-lib/math-rendering', function () {
18
+ return {
19
+ renderMath: jest.fn()
20
+ };
21
+ });
22
+ jest.mock('@tiptap/react', function () {
23
+ return {
24
+ NodeViewWrapper: function NodeViewWrapper(_ref) {
25
+ var children = _ref.children,
26
+ props = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
27
+ return /*#__PURE__*/_react["default"].createElement("div", (0, _extends2["default"])({
28
+ "data-testid": "node-view-wrapper"
29
+ }, props), children);
30
+ }
31
+ };
32
+ });
33
+ var mockCreatePortal = jest.fn(function (node) {
34
+ return node;
35
+ });
36
+ jest.mock('react-dom', function () {
37
+ return _objectSpread(_objectSpread({}, jest.requireActual('react-dom')), {}, {
38
+ createPortal: function createPortal() {
39
+ return mockCreatePortal.apply(void 0, arguments);
40
+ }
41
+ });
42
+ });
43
+ describe('InlineDropdown', function () {
44
+ var buildMockEditor = function buildMockEditor() {
45
+ var overrides = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
46
+ var mockNodeAt = jest.fn(function (pos) {
47
+ return pos === 5 ? {
48
+ nodeSize: 1
49
+ } : null;
50
+ });
51
+ var mockDoc = {
52
+ descendants: jest.fn(),
53
+ nodeAt: mockNodeAt
54
+ };
55
+ var mockTr = {
56
+ "delete": jest.fn(),
57
+ doc: {
58
+ nodeAt: mockNodeAt
59
+ },
60
+ setSelection: jest.fn(),
61
+ setMeta: jest.fn(function setMeta() {
62
+ return mockTr;
63
+ })
64
+ };
65
+ return _objectSpread({
66
+ state: {
67
+ selection: {
68
+ from: 0,
69
+ to: 1
70
+ },
71
+ tr: mockTr,
72
+ doc: mockDoc
73
+ },
74
+ view: {
75
+ coordsAtPos: jest.fn(function () {
76
+ return {
77
+ top: 100,
78
+ left: 50
79
+ };
80
+ }),
81
+ dispatch: jest.fn()
82
+ },
83
+ commands: {
84
+ focus: jest.fn()
85
+ },
86
+ _tiptapContainerEl: document.createElement('div'),
87
+ _toolbarOpened: false
88
+ }, overrides);
89
+ };
90
+ var mockEditor;
91
+ var mockNode = {
92
+ attrs: {
93
+ index: '0',
94
+ value: 'Selected Option',
95
+ error: false
96
+ },
97
+ nodeSize: 1
98
+ };
99
+ var mockOptions = {
100
+ respAreaToolbar: jest.fn(function () {
101
+ return function () {
102
+ return /*#__PURE__*/_react["default"].createElement("div", {
103
+ "data-testid": "inline-dropdown-toolbar"
104
+ }, "Toolbar");
105
+ };
106
+ })
107
+ };
108
+ var defaultProps = {
109
+ editor: mockEditor,
110
+ node: mockNode,
111
+ getPos: function getPos() {
112
+ return 5;
113
+ },
114
+ options: mockOptions,
115
+ selected: false
116
+ };
117
+ beforeEach(function () {
118
+ jest.clearAllMocks();
119
+ mockCreatePortal.mockClear();
120
+ mockEditor = buildMockEditor();
121
+ defaultProps.editor = mockEditor;
122
+ Object.defineProperty(document.body, 'getBoundingClientRect', {
123
+ value: jest.fn(function () {
124
+ return {
125
+ top: 0,
126
+ left: 0
127
+ };
128
+ }),
129
+ configurable: true
130
+ });
131
+ });
132
+ it('renders without crashing', function () {
133
+ var _render = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], defaultProps)),
134
+ container = _render.container;
135
+ expect(container).toBeInTheDocument();
136
+ });
137
+ it('renders NodeViewWrapper', function () {
138
+ var _render2 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], defaultProps)),
139
+ getByTestId = _render2.getByTestId;
140
+ expect(getByTestId('node-view-wrapper')).toBeInTheDocument();
141
+ });
142
+ it('displays selected value', function () {
143
+ var _render3 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], defaultProps)),
144
+ container = _render3.container;
145
+ var valueDiv = container.querySelector('div[style*="border"]');
146
+ expect(valueDiv).toBeInTheDocument();
147
+ });
148
+ it('renders math inside the value control on mount', function () {
149
+ var _render4 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], defaultProps)),
150
+ container = _render4.container;
151
+ var valueDiv = container.querySelector('div[style*="border"]');
152
+ expect(_mathRendering.renderMath).toHaveBeenCalledWith(valueDiv);
153
+ });
154
+ it('re-renders math when the value changes', function () {
155
+ var updatedNode = _objectSpread(_objectSpread({}, mockNode), {}, {
156
+ attrs: _objectSpread(_objectSpread({}, mockNode.attrs), {}, {
157
+ value: '<span>Updated math</span>'
158
+ })
159
+ });
160
+ var _render5 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], defaultProps)),
161
+ container = _render5.container,
162
+ rerender = _render5.rerender;
163
+ _mathRendering.renderMath.mockClear();
164
+ rerender(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
165
+ node: updatedNode
166
+ })));
167
+ var valueDiv = container.querySelector('div[style*="border"]');
168
+ expect(_mathRendering.renderMath).toHaveBeenCalledWith(valueDiv);
169
+ });
170
+ it('uses 2px horizontal margin on the value control and no horizontal margin on the wrapper', function () {
171
+ var _render6 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], defaultProps)),
172
+ container = _render6.container,
173
+ getByTestId = _render6.getByTestId;
174
+ var valueDiv = container.querySelector('div[style*="border"]');
175
+ expect(valueDiv).toHaveStyle({
176
+ margin: '0 2px'
177
+ });
178
+ var wrapper = getByTestId('node-view-wrapper');
179
+ expect(wrapper.getAttribute('style') || '').not.toMatch(/margin/);
180
+ });
181
+ it('renders chevron icon', function () {
182
+ var _render7 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], defaultProps)),
183
+ container = _render7.container;
184
+ var chevron = container.querySelector('svg');
185
+ expect(chevron).toBeInTheDocument();
186
+ });
187
+ it('shows toolbar when selected and only this node is selected', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
188
+ var _render8, queryByTestId;
189
+ return _regenerator["default"].wrap(function (_context) {
190
+ while (1) switch (_context.prev = _context.next) {
191
+ case 0:
192
+ _render8 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
193
+ selected: true
194
+ }))), queryByTestId = _render8.queryByTestId;
195
+ _context.next = 1;
196
+ return (0, _react2.waitFor)(function () {
197
+ // Toolbar is shown via portal
198
+ expect(queryByTestId('inline-dropdown-toolbar')).toBeInTheDocument();
199
+ });
200
+ case 1:
201
+ case "end":
202
+ return _context.stop();
203
+ }
204
+ }, _callee);
205
+ })));
206
+ it('does not show toolbar when not selected', function () {
207
+ var _render9 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
208
+ selected: false
209
+ }))),
210
+ queryByTestId = _render9.queryByTestId;
211
+ expect(queryByTestId('inline-dropdown-toolbar')).not.toBeInTheDocument();
212
+ });
213
+ it('shows toolbar on click', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2() {
214
+ var _render0, container, queryByTestId, dropdown;
215
+ return _regenerator["default"].wrap(function (_context2) {
216
+ while (1) switch (_context2.prev = _context2.next) {
217
+ case 0:
218
+ _render0 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], defaultProps)), container = _render0.container, queryByTestId = _render0.queryByTestId;
219
+ dropdown = container.querySelector('div[style*="border"]');
220
+ if (!dropdown) {
221
+ _context2.next = 2;
222
+ break;
223
+ }
224
+ _react2.fireEvent.click(dropdown);
225
+ _context2.next = 1;
226
+ return (0, _react2.waitFor)(function () {
227
+ expect(queryByTestId('inline-dropdown-toolbar')).toBeInTheDocument();
228
+ });
229
+ case 1:
230
+ _context2.next = 3;
231
+ break;
232
+ case 2:
233
+ // If dropdown is not found, just verify the component rendered
234
+ expect(container).toBeInTheDocument();
235
+ case 3:
236
+ case "end":
237
+ return _context2.stop();
238
+ }
239
+ }, _callee2);
240
+ })));
241
+ it('has correct minimum dimensions', function () {
242
+ var _render1 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], defaultProps)),
243
+ container = _render1.container;
244
+ var wrapper = container.querySelector('[data-testid="node-view-wrapper"]');
245
+ expect(wrapper).toHaveStyle({
246
+ height: '50px'
247
+ });
248
+ });
249
+ it('has inline-flex display', function () {
250
+ var _render10 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], defaultProps)),
251
+ container = _render10.container;
252
+ var wrapper = container.querySelector('[data-testid="node-view-wrapper"]');
253
+ expect(wrapper).toHaveStyle({
254
+ display: 'inline-flex'
255
+ });
256
+ });
257
+ it('has cursor pointer style', function () {
258
+ var _render11 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], defaultProps)),
259
+ container = _render11.container;
260
+ var wrapper = container.querySelector('[data-testid="node-view-wrapper"]');
261
+ expect(wrapper).toHaveStyle({
262
+ cursor: 'pointer'
263
+ });
264
+ });
265
+ it('renders with empty value as nbsp', function () {
266
+ var emptyNode = _objectSpread(_objectSpread({}, mockNode), {}, {
267
+ attrs: _objectSpread(_objectSpread({}, mockNode.attrs), {}, {
268
+ value: ''
269
+ })
270
+ });
271
+ var _render12 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
272
+ node: emptyNode
273
+ }))),
274
+ container = _render12.container;
275
+ expect(container).toBeInTheDocument();
276
+ });
277
+ it('calls respAreaToolbar with correct params', function () {
278
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], defaultProps));
279
+ expect(mockOptions.respAreaToolbar).toHaveBeenCalledWith([mockNode, 5], mockEditor, expect.any(Function));
280
+ });
281
+ it('closes toolbar on outside click', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3() {
282
+ var _render13, container, queryByTestId;
283
+ return _regenerator["default"].wrap(function (_context3) {
284
+ while (1) switch (_context3.prev = _context3.next) {
285
+ case 0:
286
+ _render13 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
287
+ selected: true
288
+ }))), container = _render13.container, queryByTestId = _render13.queryByTestId;
289
+ _context3.next = 1;
290
+ return (0, _react2.waitFor)(function () {
291
+ _react2.fireEvent.mouseDown(document.body);
292
+ });
293
+ case 1:
294
+ _context3.next = 2;
295
+ return (0, _react2.waitFor)(function () {
296
+ expect(queryByTestId('inline-dropdown-toolbar')).not.toBeInTheDocument();
297
+ });
298
+ case 2:
299
+ case "end":
300
+ return _context3.stop();
301
+ }
302
+ }, _callee3);
303
+ })));
304
+ it('calls close callback when toolbar closes on outside click', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee4() {
305
+ var onInlineDropdownToolbarClose, options, _render14, queryByTestId;
306
+ return _regenerator["default"].wrap(function (_context4) {
307
+ while (1) switch (_context4.prev = _context4.next) {
308
+ case 0:
309
+ onInlineDropdownToolbarClose = jest.fn();
310
+ options = _objectSpread(_objectSpread({}, mockOptions), {}, {
311
+ onInlineDropdownToolbarClose: onInlineDropdownToolbarClose
312
+ });
313
+ _render14 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
314
+ options: options,
315
+ selected: true
316
+ }))), queryByTestId = _render14.queryByTestId;
317
+ _context4.next = 1;
318
+ return (0, _react2.waitFor)(function () {
319
+ expect(queryByTestId('inline-dropdown-toolbar')).toBeInTheDocument();
320
+ });
321
+ case 1:
322
+ _react2.fireEvent.mouseDown(document.body);
323
+ _context4.next = 2;
324
+ return (0, _react2.waitFor)(function () {
325
+ expect(queryByTestId('inline-dropdown-toolbar')).not.toBeInTheDocument();
326
+ });
327
+ case 2:
328
+ expect(onInlineDropdownToolbarClose).toHaveBeenCalledWith(mockEditor);
329
+ case 3:
330
+ case "end":
331
+ return _context4.stop();
332
+ }
333
+ }, _callee4);
334
+ })));
335
+ it('uses the current node when closing on outside click after the node prop changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee5() {
336
+ var onToolbarCloseRequest, options, updatedNode, _render15, queryByTestId, rerender;
337
+ return _regenerator["default"].wrap(function (_context5) {
338
+ while (1) switch (_context5.prev = _context5.next) {
339
+ case 0:
340
+ onToolbarCloseRequest = jest.fn(function (_tuple, _editor, onConfirm) {
341
+ return onConfirm();
342
+ });
343
+ options = _objectSpread(_objectSpread({}, mockOptions), {}, {
344
+ onToolbarCloseRequest: onToolbarCloseRequest
345
+ });
346
+ updatedNode = {
347
+ attrs: {
348
+ index: '1',
349
+ value: 'Updated Option',
350
+ error: false
351
+ },
352
+ nodeSize: 1
353
+ };
354
+ _render15 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
355
+ options: options,
356
+ selected: true
357
+ }))), queryByTestId = _render15.queryByTestId, rerender = _render15.rerender;
358
+ _context5.next = 1;
359
+ return (0, _react2.waitFor)(function () {
360
+ expect(queryByTestId('inline-dropdown-toolbar')).toBeInTheDocument();
361
+ });
362
+ case 1:
363
+ rerender(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
364
+ options: options,
365
+ node: updatedNode,
366
+ selected: true
367
+ })));
368
+ _react2.fireEvent.mouseDown(document.body);
369
+ _context5.next = 2;
370
+ return (0, _react2.waitFor)(function () {
371
+ expect(onToolbarCloseRequest).toHaveBeenCalledWith([updatedNode, 5], expect.anything(), expect.any(Function), expect.any(Function));
372
+ });
373
+ case 2:
374
+ case "end":
375
+ return _context5.stop();
376
+ }
377
+ }, _callee5);
378
+ })));
379
+ it('respects hold state for the current node after the node prop changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee6() {
380
+ var updatedNode, _render16, queryByTestId, rerender;
381
+ return _regenerator["default"].wrap(function (_context6) {
382
+ while (1) switch (_context6.prev = _context6.next) {
383
+ case 0:
384
+ updatedNode = {
385
+ attrs: {
386
+ index: '1',
387
+ value: 'Updated Option',
388
+ error: false
389
+ },
390
+ nodeSize: 1
391
+ };
392
+ mockEditor._holdInlineDropdownToolbarIndex = '1';
393
+ _render16 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
394
+ selected: true
395
+ }))), queryByTestId = _render16.queryByTestId, rerender = _render16.rerender;
396
+ _context6.next = 1;
397
+ return (0, _react2.waitFor)(function () {
398
+ expect(queryByTestId('inline-dropdown-toolbar')).toBeInTheDocument();
399
+ });
400
+ case 1:
401
+ rerender(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
402
+ node: updatedNode,
403
+ selected: true
404
+ })));
405
+ _react2.fireEvent.mouseDown(document.body);
406
+ _context6.next = 2;
407
+ return (0, _react2.waitFor)(function () {
408
+ expect(queryByTestId('inline-dropdown-toolbar')).toBeInTheDocument();
409
+ });
410
+ case 2:
411
+ case "end":
412
+ return _context6.stop();
413
+ }
414
+ }, _callee6);
415
+ })));
416
+ it('rebinds the outside-click listener when the node prop changes while the toolbar is open', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee7() {
417
+ var addSpy, removeSpy, updatedNode, _render17, rerender, removeCallsBeforeRerender;
418
+ return _regenerator["default"].wrap(function (_context7) {
419
+ while (1) switch (_context7.prev = _context7.next) {
420
+ case 0:
421
+ addSpy = jest.spyOn(document, 'addEventListener');
422
+ removeSpy = jest.spyOn(document, 'removeEventListener');
423
+ updatedNode = _objectSpread(_objectSpread({}, mockNode), {}, {
424
+ attrs: _objectSpread(_objectSpread({}, mockNode.attrs), {}, {
425
+ value: 'Updated Option'
426
+ })
427
+ });
428
+ _render17 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
429
+ selected: true
430
+ }))), rerender = _render17.rerender;
431
+ _context7.next = 1;
432
+ return (0, _react2.waitFor)(function () {
433
+ expect(addSpy).toHaveBeenCalledWith('mousedown', expect.any(Function));
434
+ });
435
+ case 1:
436
+ removeCallsBeforeRerender = removeSpy.mock.calls.filter(function (_ref9) {
437
+ var _ref0 = (0, _slicedToArray2["default"])(_ref9, 1),
438
+ type = _ref0[0];
439
+ return type === 'mousedown';
440
+ }).length;
441
+ rerender(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
442
+ node: updatedNode,
443
+ selected: true
444
+ })));
445
+ _context7.next = 2;
446
+ return (0, _react2.waitFor)(function () {
447
+ var removeCallsAfterRerender = removeSpy.mock.calls.filter(function (_ref1) {
448
+ var _ref10 = (0, _slicedToArray2["default"])(_ref1, 1),
449
+ type = _ref10[0];
450
+ return type === 'mousedown';
451
+ }).length;
452
+ expect(removeCallsAfterRerender).toBeGreaterThan(removeCallsBeforeRerender);
453
+ expect(addSpy).toHaveBeenCalledWith('mousedown', expect.any(Function));
454
+ });
455
+ case 2:
456
+ addSpy.mockRestore();
457
+ removeSpy.mockRestore();
458
+ case 3:
459
+ case "end":
460
+ return _context7.stop();
461
+ }
462
+ }, _callee7);
463
+ })));
464
+ it('has correct border styling', function () {
465
+ var _render18 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], defaultProps)),
466
+ container = _render18.container;
467
+ var dropdownDiv = container.querySelector('div[style*="border"]');
468
+ expect(dropdownDiv).toHaveStyle({
469
+ border: '1px solid #C0C3CF'
470
+ });
471
+ });
472
+ it('has correct min width', function () {
473
+ var _render19 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], defaultProps)),
474
+ container = _render19.container;
475
+ var dropdownDiv = container.querySelector('div[style*="border"]');
476
+ expect(dropdownDiv).toHaveStyle({
477
+ minWidth: '178px'
478
+ });
479
+ });
480
+ it('positions chevron correctly', function () {
481
+ var _render20 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], defaultProps)),
482
+ container = _render20.container;
483
+ var chevron = container.querySelector('svg');
484
+ // Chevron styling is applied inline, just verify it rendered
485
+ if (chevron) {
486
+ expect(chevron).toBeInTheDocument();
487
+ } else {
488
+ expect(container).toBeInTheDocument();
489
+ }
490
+ });
491
+ it('has ellipsis for overflow text', function () {
492
+ var _render21 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], defaultProps)),
493
+ container = _render21.container;
494
+ var textContainer = container.querySelector('div[style*="overflow"]');
495
+ expect(textContainer).toHaveStyle({
496
+ textOverflow: 'ellipsis',
497
+ whiteSpace: 'nowrap'
498
+ });
499
+ });
500
+ it('portals toolbar into editor container when _tiptapContainerEl is set', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee8() {
501
+ var containerEl, editor;
502
+ return _regenerator["default"].wrap(function (_context8) {
503
+ while (1) switch (_context8.prev = _context8.next) {
504
+ case 0:
505
+ containerEl = document.createElement('div');
506
+ editor = buildMockEditor({
507
+ _tiptapContainerEl: containerEl
508
+ });
509
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
510
+ editor: editor,
511
+ selected: true
512
+ })));
513
+ _context8.next = 1;
514
+ return (0, _react2.waitFor)(function () {
515
+ expect(mockCreatePortal).toHaveBeenCalled();
516
+ });
517
+ case 1:
518
+ expect(mockCreatePortal.mock.calls[0][1]).toBe(containerEl);
519
+ case 2:
520
+ case "end":
521
+ return _context8.stop();
522
+ }
523
+ }, _callee8);
524
+ })));
525
+ it('portals toolbar into document.body when _tiptapContainerEl is missing', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee9() {
526
+ var editor;
527
+ return _regenerator["default"].wrap(function (_context9) {
528
+ while (1) switch (_context9.prev = _context9.next) {
529
+ case 0:
530
+ editor = buildMockEditor({
531
+ _tiptapContainerEl: undefined
532
+ });
533
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
534
+ editor: editor,
535
+ selected: true
536
+ })));
537
+ _context9.next = 1;
538
+ return (0, _react2.waitFor)(function () {
539
+ expect(mockCreatePortal).toHaveBeenCalled();
540
+ });
541
+ case 1:
542
+ expect(mockCreatePortal.mock.calls[0][1]).toBe(document.body);
543
+ case 2:
544
+ case "end":
545
+ return _context9.stop();
546
+ }
547
+ }, _callee9);
548
+ })));
549
+ it('passes editorCallback to InlineDropdownToolbar', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee0() {
550
+ var mockToolbarComponent, mockOptionsWithCallback, _render22, queryByTestId;
551
+ return _regenerator["default"].wrap(function (_context0) {
552
+ while (1) switch (_context0.prev = _context0.next) {
553
+ case 0:
554
+ mockToolbarComponent = jest.fn(function (_ref14) {
555
+ var editorCallback = _ref14.editorCallback;
556
+ editorCallback === null || editorCallback === void 0 || editorCallback({
557
+ instanceId: 'test-instance'
558
+ });
559
+ return /*#__PURE__*/_react["default"].createElement("div", {
560
+ "data-testid": "inline-dropdown-toolbar"
561
+ }, "Toolbar");
562
+ });
563
+ mockOptionsWithCallback = {
564
+ respAreaToolbar: jest.fn(function () {
565
+ return mockToolbarComponent;
566
+ })
567
+ };
568
+ _render22 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
569
+ options: mockOptionsWithCallback,
570
+ selected: true
571
+ }))), queryByTestId = _render22.queryByTestId;
572
+ _context0.next = 1;
573
+ return (0, _react2.waitFor)(function () {
574
+ expect(queryByTestId('inline-dropdown-toolbar')).toBeInTheDocument();
575
+ });
576
+ case 1:
577
+ case "end":
578
+ return _context0.stop();
579
+ }
580
+ }, _callee0);
581
+ })));
582
+ it('stores toolbar editor instance in ref when editorCallback is called', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee1() {
583
+ var capturedCallback, mockToolbarComponent, mockOptionsWithCallback, _render23, queryByTestId;
584
+ return _regenerator["default"].wrap(function (_context1) {
585
+ while (1) switch (_context1.prev = _context1.next) {
586
+ case 0:
587
+ mockToolbarComponent = function mockToolbarComponent(_ref16) {
588
+ var editorCallback = _ref16.editorCallback;
589
+ capturedCallback = editorCallback;
590
+ return /*#__PURE__*/_react["default"].createElement("div", {
591
+ "data-testid": "inline-dropdown-toolbar"
592
+ }, "Toolbar");
593
+ };
594
+ mockOptionsWithCallback = {
595
+ respAreaToolbar: jest.fn(function () {
596
+ return mockToolbarComponent;
597
+ })
598
+ };
599
+ _render23 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
600
+ options: mockOptionsWithCallback,
601
+ selected: true
602
+ }))), queryByTestId = _render23.queryByTestId;
603
+ _context1.next = 1;
604
+ return (0, _react2.waitFor)(function () {
605
+ expect(queryByTestId('inline-dropdown-toolbar')).toBeInTheDocument();
606
+ });
607
+ case 1:
608
+ // Verify callback exists
609
+ expect(capturedCallback).toBeDefined();
610
+ case 2:
611
+ case "end":
612
+ return _context1.stop();
613
+ }
614
+ }, _callee1);
615
+ })));
616
+ it('handles click outside logic with data-toolbar-for attribute', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee10() {
617
+ var editorWithInstanceId, capturedCallback, mockToolbarComponent, mockOptionsWithCallback, _render24, container, queryByTestId, otherToolbar;
618
+ return _regenerator["default"].wrap(function (_context10) {
619
+ while (1) switch (_context10.prev = _context10.next) {
620
+ case 0:
621
+ editorWithInstanceId = _objectSpread(_objectSpread({}, mockEditor), {}, {
622
+ instanceId: 'editor-123',
623
+ _toolbarOpened: false
624
+ }); // Mock the toolbar callback to set the toolbar editor instance
625
+ mockToolbarComponent = function mockToolbarComponent(_ref18) {
626
+ var editorCallback = _ref18.editorCallback;
627
+ _react["default"].useEffect(function () {
628
+ capturedCallback = editorCallback;
629
+ if (editorCallback) {
630
+ editorCallback({
631
+ instanceId: 'editor-123'
632
+ });
633
+ }
634
+ }, [editorCallback]);
635
+ return /*#__PURE__*/_react["default"].createElement("div", {
636
+ "data-testid": "inline-dropdown-toolbar"
637
+ }, "Toolbar");
638
+ };
639
+ mockOptionsWithCallback = {
640
+ respAreaToolbar: jest.fn(function () {
641
+ return mockToolbarComponent;
642
+ })
643
+ };
644
+ _render24 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
645
+ editor: editorWithInstanceId,
646
+ options: mockOptionsWithCallback,
647
+ selected: true
648
+ }))), container = _render24.container, queryByTestId = _render24.queryByTestId;
649
+ _context10.next = 1;
650
+ return (0, _react2.waitFor)(function () {
651
+ expect(queryByTestId('inline-dropdown-toolbar')).toBeInTheDocument();
652
+ });
653
+ case 1:
654
+ // Create an element with data-toolbar-for attribute
655
+ otherToolbar = document.createElement('div');
656
+ otherToolbar.setAttribute('data-toolbar-for', 'editor-456');
657
+ document.body.appendChild(otherToolbar);
658
+ _context10.next = 2;
659
+ return (0, _react2.waitFor)(function () {
660
+ _react2.fireEvent.mouseDown(otherToolbar);
661
+ });
662
+ case 2:
663
+ // Cleanup
664
+ document.body.removeChild(otherToolbar);
665
+ expect(container).toBeInTheDocument();
666
+ case 3:
667
+ case "end":
668
+ return _context10.stop();
669
+ }
670
+ }, _callee10);
671
+ })));
672
+ it('does not close when clicking inside same editor toolbar', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee11() {
673
+ var editorWithInstanceId, toolbarEditorInstance, mockToolbarComponent, mockOptionsWithCallback;
674
+ return _regenerator["default"].wrap(function (_context11) {
675
+ while (1) switch (_context11.prev = _context11.next) {
676
+ case 0:
677
+ editorWithInstanceId = _objectSpread(_objectSpread({}, mockEditor), {}, {
678
+ instanceId: 'editor-123',
679
+ _toolbarOpened: false
680
+ });
681
+ mockToolbarComponent = function mockToolbarComponent(_ref20) {
682
+ var editorCallback = _ref20.editorCallback;
683
+ _react["default"].useEffect(function () {
684
+ if (editorCallback) {
685
+ editorCallback({
686
+ instanceId: 'editor-123'
687
+ });
688
+ toolbarEditorInstance = {
689
+ instanceId: 'editor-123'
690
+ };
691
+ }
692
+ }, [editorCallback]);
693
+ return /*#__PURE__*/_react["default"].createElement("div", {
694
+ "data-testid": "inline-dropdown-toolbar"
695
+ }, "Toolbar");
696
+ };
697
+ mockOptionsWithCallback = {
698
+ respAreaToolbar: jest.fn(function () {
699
+ return mockToolbarComponent;
700
+ })
701
+ };
702
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
703
+ editor: editorWithInstanceId,
704
+ options: mockOptionsWithCallback,
705
+ selected: true
706
+ })));
707
+ _context11.next = 1;
708
+ return (0, _react2.waitFor)(function () {
709
+ expect(mockOptionsWithCallback.respAreaToolbar).toHaveBeenCalled();
710
+ });
711
+ case 1:
712
+ case "end":
713
+ return _context11.stop();
714
+ }
715
+ }, _callee11);
716
+ })));
717
+ it('checks editor._toolbarOpened in click outside handler', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee12() {
718
+ var editorWithToolbarOpened, _render25, queryByTestId;
719
+ return _regenerator["default"].wrap(function (_context12) {
720
+ while (1) switch (_context12.prev = _context12.next) {
721
+ case 0:
722
+ editorWithToolbarOpened = buildMockEditor({
723
+ _toolbarOpened: true
724
+ });
725
+ _render25 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
726
+ editor: editorWithToolbarOpened,
727
+ selected: true
728
+ }))), queryByTestId = _render25.queryByTestId;
729
+ _context12.next = 1;
730
+ return (0, _react2.waitFor)(function () {
731
+ expect(queryByTestId('inline-dropdown-toolbar')).toBeInTheDocument();
732
+ });
733
+ case 1:
734
+ // When _toolbarOpened is true, clicking outside should not close
735
+ _react2.fireEvent.mouseDown(document.body);
736
+
737
+ // Toolbar should still be visible
738
+ expect(queryByTestId('inline-dropdown-toolbar')).toBeInTheDocument();
739
+ case 2:
740
+ case "end":
741
+ return _context12.stop();
742
+ }
743
+ }, _callee12);
744
+ })));
745
+ it('does not close toolbar when clicking the page scrollbar (documentElement)', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee13() {
746
+ var _render26, queryByTestId;
747
+ return _regenerator["default"].wrap(function (_context13) {
748
+ while (1) switch (_context13.prev = _context13.next) {
749
+ case 0:
750
+ _render26 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
751
+ selected: true
752
+ }))), queryByTestId = _render26.queryByTestId;
753
+ _context13.next = 1;
754
+ return (0, _react2.waitFor)(function () {
755
+ expect(queryByTestId('inline-dropdown-toolbar')).toBeInTheDocument();
756
+ });
757
+ case 1:
758
+ _react2.fireEvent.mouseDown(document.documentElement);
759
+ _context13.next = 2;
760
+ return (0, _react2.waitFor)(function () {
761
+ expect(queryByTestId('inline-dropdown-toolbar')).toBeInTheDocument();
762
+ });
763
+ case 2:
764
+ case "end":
765
+ return _context13.stop();
766
+ }
767
+ }, _callee13);
768
+ })));
769
+ it('renders delete control on portaled custom toolbar when container el is set', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee14() {
770
+ var _render27, findByLabelText, _t;
771
+ return _regenerator["default"].wrap(function (_context14) {
772
+ while (1) switch (_context14.prev = _context14.next) {
773
+ case 0:
774
+ _render27 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
775
+ selected: true
776
+ }))), findByLabelText = _render27.findByLabelText;
777
+ _t = expect;
778
+ _context14.next = 1;
779
+ return findByLabelText('Delete');
780
+ case 1:
781
+ _t(_context14.sent).toBeInTheDocument();
782
+ case 2:
783
+ case "end":
784
+ return _context14.stop();
785
+ }
786
+ }, _callee14);
787
+ })));
788
+ it('does not render portaled delete control when _tiptapContainerEl is missing', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee15() {
789
+ var editor, _render28, queryByLabelText, findByTestId, _t2;
790
+ return _regenerator["default"].wrap(function (_context15) {
791
+ while (1) switch (_context15.prev = _context15.next) {
792
+ case 0:
793
+ editor = buildMockEditor({
794
+ _tiptapContainerEl: undefined
795
+ });
796
+ _render28 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
797
+ editor: editor,
798
+ selected: true
799
+ }))), queryByLabelText = _render28.queryByLabelText, findByTestId = _render28.findByTestId;
800
+ _t2 = expect;
801
+ _context15.next = 1;
802
+ return findByTestId('inline-dropdown-toolbar');
803
+ case 1:
804
+ _t2(_context15.sent).toBeInTheDocument();
805
+ expect(queryByLabelText('Delete')).not.toBeInTheDocument();
806
+ case 2:
807
+ case "end":
808
+ return _context15.stop();
809
+ }
810
+ }, _callee15);
811
+ })));
812
+ it('delete clears toolbar flag, removes node range, dispatches, and focuses', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee16() {
813
+ var _render29, findByLabelText, _t3;
814
+ return _regenerator["default"].wrap(function (_context16) {
815
+ while (1) switch (_context16.prev = _context16.next) {
816
+ case 0:
817
+ mockEditor._toolbarOpened = true;
818
+ _render29 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
819
+ selected: true
820
+ }))), findByLabelText = _render29.findByLabelText;
821
+ _t3 = _react2.fireEvent;
822
+ _context16.next = 1;
823
+ return findByLabelText('Delete');
824
+ case 1:
825
+ _t3.mouseDown.call(_t3, _context16.sent);
826
+ expect(mockEditor.state.tr["delete"]).toHaveBeenCalledWith(5, 6);
827
+ expect(mockEditor.view.dispatch).toHaveBeenCalledTimes(2);
828
+ expect(mockEditor.view.dispatch).toHaveBeenNthCalledWith(1, mockEditor.state.tr);
829
+ expect(mockEditor.view.dispatch).toHaveBeenNthCalledWith(2, mockEditor.state.tr);
830
+ expect(mockEditor._toolbarOpened).toBe(false);
831
+ expect(mockEditor.commands.focus).toHaveBeenCalled();
832
+ case 2:
833
+ case "end":
834
+ return _context16.stop();
835
+ }
836
+ }, _callee16);
837
+ })));
838
+ });
839
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfbWF0aFJlbmRlcmluZyIsIl9JbmxpbmVEcm9wZG93biIsIl9leGNsdWRlZCIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiamVzdCIsIm1vY2siLCJyZW5kZXJNYXRoIiwiZm4iLCJOb2RlVmlld1dyYXBwZXIiLCJfcmVmIiwiY2hpbGRyZW4iLCJwcm9wcyIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllczIiLCJjcmVhdGVFbGVtZW50IiwiX2V4dGVuZHMyIiwibW9ja0NyZWF0ZVBvcnRhbCIsIm5vZGUiLCJyZXF1aXJlQWN0dWFsIiwiY3JlYXRlUG9ydGFsIiwiZGVzY3JpYmUiLCJidWlsZE1vY2tFZGl0b3IiLCJvdmVycmlkZXMiLCJ1bmRlZmluZWQiLCJtb2NrTm9kZUF0IiwicG9zIiwibm9kZVNpemUiLCJtb2NrRG9jIiwiZGVzY2VuZGFudHMiLCJub2RlQXQiLCJtb2NrVHIiLCJkb2MiLCJzZXRTZWxlY3Rpb24iLCJzZXRNZXRhIiwic3RhdGUiLCJzZWxlY3Rpb24iLCJmcm9tIiwidG8iLCJ0ciIsInZpZXciLCJjb29yZHNBdFBvcyIsInRvcCIsImxlZnQiLCJkaXNwYXRjaCIsImNvbW1hbmRzIiwiZm9jdXMiLCJfdGlwdGFwQ29udGFpbmVyRWwiLCJkb2N1bWVudCIsIl90b29sYmFyT3BlbmVkIiwibW9ja0VkaXRvciIsIm1vY2tOb2RlIiwiYXR0cnMiLCJpbmRleCIsInZhbHVlIiwiZXJyb3IiLCJtb2NrT3B0aW9ucyIsInJlc3BBcmVhVG9vbGJhciIsImRlZmF1bHRQcm9wcyIsImVkaXRvciIsImdldFBvcyIsIm9wdGlvbnMiLCJzZWxlY3RlZCIsImJlZm9yZUVhY2giLCJjbGVhckFsbE1vY2tzIiwibW9ja0NsZWFyIiwiYm9keSIsImNvbmZpZ3VyYWJsZSIsIml0IiwiX3JlbmRlciIsInJlbmRlciIsImNvbnRhaW5lciIsImV4cGVjdCIsInRvQmVJblRoZURvY3VtZW50IiwiX3JlbmRlcjIiLCJnZXRCeVRlc3RJZCIsIl9yZW5kZXIzIiwidmFsdWVEaXYiLCJxdWVyeVNlbGVjdG9yIiwiX3JlbmRlcjQiLCJ0b0hhdmVCZWVuQ2FsbGVkV2l0aCIsInVwZGF0ZWROb2RlIiwiX3JlbmRlcjUiLCJyZXJlbmRlciIsIl9yZW5kZXI2IiwidG9IYXZlU3R5bGUiLCJtYXJnaW4iLCJ3cmFwcGVyIiwiZ2V0QXR0cmlidXRlIiwibm90IiwidG9NYXRjaCIsIl9yZW5kZXI3IiwiY2hldnJvbiIsIl9hc3luY1RvR2VuZXJhdG9yMiIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlIiwiX3JlbmRlcjgiLCJxdWVyeUJ5VGVzdElkIiwid3JhcCIsIl9jb250ZXh0IiwicHJldiIsIm5leHQiLCJ3YWl0Rm9yIiwic3RvcCIsIl9yZW5kZXI5IiwiX2NhbGxlZTIiLCJfcmVuZGVyMCIsImRyb3Bkb3duIiwiX2NvbnRleHQyIiwiZmlyZUV2ZW50IiwiY2xpY2siLCJfcmVuZGVyMSIsImhlaWdodCIsIl9yZW5kZXIxMCIsImRpc3BsYXkiLCJfcmVuZGVyMTEiLCJjdXJzb3IiLCJlbXB0eU5vZGUiLCJfcmVuZGVyMTIiLCJhbnkiLCJGdW5jdGlvbiIsIl9jYWxsZWUzIiwiX3JlbmRlcjEzIiwiX2NvbnRleHQzIiwibW91c2VEb3duIiwiX2NhbGxlZTQiLCJvbklubGluZURyb3Bkb3duVG9vbGJhckNsb3NlIiwiX3JlbmRlcjE0IiwiX2NvbnRleHQ0IiwiX2NhbGxlZTUiLCJvblRvb2xiYXJDbG9zZVJlcXVlc3QiLCJfcmVuZGVyMTUiLCJfY29udGV4dDUiLCJfdHVwbGUiLCJfZWRpdG9yIiwib25Db25maXJtIiwiYW55dGhpbmciLCJfY2FsbGVlNiIsIl9yZW5kZXIxNiIsIl9jb250ZXh0NiIsIl9ob2xkSW5saW5lRHJvcGRvd25Ub29sYmFySW5kZXgiLCJfY2FsbGVlNyIsImFkZFNweSIsInJlbW92ZVNweSIsIl9yZW5kZXIxNyIsInJlbW92ZUNhbGxzQmVmb3JlUmVyZW5kZXIiLCJfY29udGV4dDciLCJzcHlPbiIsImNhbGxzIiwiX3JlZjkiLCJfcmVmMCIsIl9zbGljZWRUb0FycmF5MiIsInR5cGUiLCJyZW1vdmVDYWxsc0FmdGVyUmVyZW5kZXIiLCJfcmVmMSIsIl9yZWYxMCIsInRvQmVHcmVhdGVyVGhhbiIsIm1vY2tSZXN0b3JlIiwiX3JlbmRlcjE4IiwiZHJvcGRvd25EaXYiLCJib3JkZXIiLCJfcmVuZGVyMTkiLCJtaW5XaWR0aCIsIl9yZW5kZXIyMCIsIl9yZW5kZXIyMSIsInRleHRDb250YWluZXIiLCJ0ZXh0T3ZlcmZsb3ciLCJ3aGl0ZVNwYWNlIiwiX2NhbGxlZTgiLCJjb250YWluZXJFbCIsIl9jb250ZXh0OCIsInRvSGF2ZUJlZW5DYWxsZWQiLCJ0b0JlIiwiX2NhbGxlZTkiLCJfY29udGV4dDkiLCJfY2FsbGVlMCIsIm1vY2tUb29sYmFyQ29tcG9uZW50IiwibW9ja09wdGlvbnNXaXRoQ2FsbGJhY2siLCJfcmVuZGVyMjIiLCJfY29udGV4dDAiLCJfcmVmMTQiLCJlZGl0b3JDYWxsYmFjayIsImluc3RhbmNlSWQiLCJfY2FsbGVlMSIsImNhcHR1cmVkQ2FsbGJhY2siLCJfcmVuZGVyMjMiLCJfY29udGV4dDEiLCJfcmVmMTYiLCJ0b0JlRGVmaW5lZCIsIl9jYWxsZWUxMCIsImVkaXRvcldpdGhJbnN0YW5jZUlkIiwiX3JlbmRlcjI0Iiwib3RoZXJUb29sYmFyIiwiX2NvbnRleHQxMCIsIl9yZWYxOCIsIlJlYWN0IiwidXNlRWZmZWN0Iiwic2V0QXR0cmlidXRlIiwiYXBwZW5kQ2hpbGQiLCJyZW1vdmVDaGlsZCIsIl9jYWxsZWUxMSIsInRvb2xiYXJFZGl0b3JJbnN0YW5jZSIsIl9jb250ZXh0MTEiLCJfcmVmMjAiLCJfY2FsbGVlMTIiLCJlZGl0b3JXaXRoVG9vbGJhck9wZW5lZCIsIl9yZW5kZXIyNSIsIl9jb250ZXh0MTIiLCJfY2FsbGVlMTMiLCJfcmVuZGVyMjYiLCJfY29udGV4dDEzIiwiZG9jdW1lbnRFbGVtZW50IiwiX2NhbGxlZTE0IiwiX3JlbmRlcjI3IiwiZmluZEJ5TGFiZWxUZXh0IiwiX3QiLCJfY29udGV4dDE0Iiwic2VudCIsIl9jYWxsZWUxNSIsIl9yZW5kZXIyOCIsInF1ZXJ5QnlMYWJlbFRleHQiLCJmaW5kQnlUZXN0SWQiLCJfdDIiLCJfY29udGV4dDE1IiwiX2NhbGxlZTE2IiwiX3JlbmRlcjI5IiwiX3QzIiwiX2NvbnRleHQxNiIsImNhbGwiLCJ0b0hhdmVCZWVuQ2FsbGVkVGltZXMiLCJ0b0hhdmVCZWVuTnRoQ2FsbGVkV2l0aCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL19fdGVzdHNfXy9JbmxpbmVEcm9wZG93bi50ZXN0LmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZmlyZUV2ZW50LCByZW5kZXIsIHdhaXRGb3IgfSBmcm9tICdAdGVzdGluZy1saWJyYXJ5L3JlYWN0JztcbmltcG9ydCB7IHJlbmRlck1hdGggfSBmcm9tICdAcGllLWxpYi9tYXRoLXJlbmRlcmluZyc7XG5pbXBvcnQgSW5saW5lRHJvcGRvd24gZnJvbSAnLi4vcmVzcEFyZWEvSW5saW5lRHJvcGRvd24nO1xuXG5qZXN0Lm1vY2soJ0BwaWUtbGliL21hdGgtcmVuZGVyaW5nJywgKCkgPT4gKHtcbiAgcmVuZGVyTWF0aDogamVzdC5mbigpLFxufSkpO1xuXG5qZXN0Lm1vY2soJ0B0aXB0YXAvcmVhY3QnLCAoKSA9PiAoe1xuICBOb2RlVmlld1dyYXBwZXI6ICh7IGNoaWxkcmVuLCAuLi5wcm9wcyB9KSA9PiAoXG4gICAgPGRpdiBkYXRhLXRlc3RpZD1cIm5vZGUtdmlldy13cmFwcGVyXCIgey4uLnByb3BzfT5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L2Rpdj5cbiAgKSxcbn0pKTtcblxuY29uc3QgbW9ja0NyZWF0ZVBvcnRhbCA9IGplc3QuZm4oKG5vZGUpID0+IG5vZGUpO1xuXG5qZXN0Lm1vY2soJ3JlYWN0LWRvbScsICgpID0+ICh7XG4gIC4uLmplc3QucmVxdWlyZUFjdHVhbCgncmVhY3QtZG9tJyksXG4gIGNyZWF0ZVBvcnRhbDogKC4uLmFyZ3MpID0+IG1vY2tDcmVhdGVQb3J0YWwoLi4uYXJncyksXG59KSk7XG5cbmRlc2NyaWJlKCdJbmxpbmVEcm9wZG93bicsICgpID0+IHtcbiAgY29uc3QgYnVpbGRNb2NrRWRpdG9yID0gKG92ZXJyaWRlcyA9IHt9KSA9PiB7XG4gICAgY29uc3QgbW9ja05vZGVBdCA9IGplc3QuZm4oKHBvcykgPT4gKHBvcyA9PT0gNSA/IHsgbm9kZVNpemU6IDEgfSA6IG51bGwpKTtcbiAgICBjb25zdCBtb2NrRG9jID0ge1xuICAgICAgZGVzY2VuZGFudHM6IGplc3QuZm4oKSxcbiAgICAgIG5vZGVBdDogbW9ja05vZGVBdCxcbiAgICB9O1xuICAgIGNvbnN0IG1vY2tUciA9IHtcbiAgICAgIGRlbGV0ZTogamVzdC5mbigpLFxuICAgICAgZG9jOiB7IG5vZGVBdDogbW9ja05vZGVBdCB9LFxuICAgICAgc2V0U2VsZWN0aW9uOiBqZXN0LmZuKCksXG4gICAgICBzZXRNZXRhOiBqZXN0LmZuKGZ1bmN0aW9uIHNldE1ldGEoKSB7XG4gICAgICAgIHJldHVybiBtb2NrVHI7XG4gICAgICB9KSxcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0ZToge1xuICAgICAgICBzZWxlY3Rpb246IHtcbiAgICAgICAgICBmcm9tOiAwLFxuICAgICAgICAgIHRvOiAxLFxuICAgICAgICB9LFxuICAgICAgICB0cjogbW9ja1RyLFxuICAgICAgICBkb2M6IG1vY2tEb2MsXG4gICAgICB9LFxuICAgICAgdmlldzoge1xuICAgICAgICBjb29yZHNBdFBvczogamVzdC5mbigoKSA9PiAoeyB0b3A6IDEwMCwgbGVmdDogNTAgfSkpLFxuICAgICAgICBkaXNwYXRjaDogamVzdC5mbigpLFxuICAgICAgfSxcbiAgICAgIGNvbW1hbmRzOiB7XG4gICAgICAgIGZvY3VzOiBqZXN0LmZuKCksXG4gICAgICB9LFxuICAgICAgX3RpcHRhcENvbnRhaW5lckVsOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSxcbiAgICAgIF90b29sYmFyT3BlbmVkOiBmYWxzZSxcbiAgICAgIC4uLm92ZXJyaWRlcyxcbiAgICB9O1xuICB9O1xuXG4gIGxldCBtb2NrRWRpdG9yO1xuXG4gIGNvbnN0IG1vY2tOb2RlID0ge1xuICAgIGF0dHJzOiB7XG4gICAgICBpbmRleDogJzAnLFxuICAgICAgdmFsdWU6ICdTZWxlY3RlZCBPcHRpb24nLFxuICAgICAgZXJyb3I6IGZhbHNlLFxuICAgIH0sXG4gICAgbm9kZVNpemU6IDEsXG4gIH07XG5cbiAgY29uc3QgbW9ja09wdGlvbnMgPSB7XG4gICAgcmVzcEFyZWFUb29sYmFyOiBqZXN0LmZuKCgpID0+ICgpID0+IDxkaXYgZGF0YS10ZXN0aWQ9XCJpbmxpbmUtZHJvcGRvd24tdG9vbGJhclwiPlRvb2xiYXI8L2Rpdj4pLFxuICB9O1xuXG4gIGNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgICBlZGl0b3I6IG1vY2tFZGl0b3IsXG4gICAgbm9kZTogbW9ja05vZGUsXG4gICAgZ2V0UG9zOiAoKSA9PiA1LFxuICAgIG9wdGlvbnM6IG1vY2tPcHRpb25zLFxuICAgIHNlbGVjdGVkOiBmYWxzZSxcbiAgfTtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBqZXN0LmNsZWFyQWxsTW9ja3MoKTtcbiAgICBtb2NrQ3JlYXRlUG9ydGFsLm1vY2tDbGVhcigpO1xuICAgIG1vY2tFZGl0b3IgPSBidWlsZE1vY2tFZGl0b3IoKTtcbiAgICBkZWZhdWx0UHJvcHMuZWRpdG9yID0gbW9ja0VkaXRvcjtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZG9jdW1lbnQuYm9keSwgJ2dldEJvdW5kaW5nQ2xpZW50UmVjdCcsIHtcbiAgICAgIHZhbHVlOiBqZXN0LmZuKCgpID0+ICh7IHRvcDogMCwgbGVmdDogMCB9KSksXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdyZW5kZXJzIHdpdGhvdXQgY3Jhc2hpbmcnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8SW5saW5lRHJvcGRvd24gey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgIGV4cGVjdChjb250YWluZXIpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGl0KCdyZW5kZXJzIE5vZGVWaWV3V3JhcHBlcicsICgpID0+IHtcbiAgICBjb25zdCB7IGdldEJ5VGVzdElkIH0gPSByZW5kZXIoPElubGluZURyb3Bkb3duIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICBleHBlY3QoZ2V0QnlUZXN0SWQoJ25vZGUtdmlldy13cmFwcGVyJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGl0KCdkaXNwbGF5cyBzZWxlY3RlZCB2YWx1ZScsICgpID0+IHtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxJbmxpbmVEcm9wZG93biB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgY29uc3QgdmFsdWVEaXYgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZGl2W3N0eWxlKj1cImJvcmRlclwiXScpO1xuICAgIGV4cGVjdCh2YWx1ZURpdikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgfSk7XG5cbiAgaXQoJ3JlbmRlcnMgbWF0aCBpbnNpZGUgdGhlIHZhbHVlIGNvbnRyb2wgb24gbW91bnQnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8SW5saW5lRHJvcGRvd24gey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgIGNvbnN0IHZhbHVlRGl2ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2RpdltzdHlsZSo9XCJib3JkZXJcIl0nKTtcblxuICAgIGV4cGVjdChyZW5kZXJNYXRoKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCh2YWx1ZURpdik7XG4gIH0pO1xuXG4gIGl0KCdyZS1yZW5kZXJzIG1hdGggd2hlbiB0aGUgdmFsdWUgY2hhbmdlcycsICgpID0+IHtcbiAgICBjb25zdCB1cGRhdGVkTm9kZSA9IHtcbiAgICAgIC4uLm1vY2tOb2RlLFxuICAgICAgYXR0cnM6IHtcbiAgICAgICAgLi4ubW9ja05vZGUuYXR0cnMsXG4gICAgICAgIHZhbHVlOiAnPHNwYW4+VXBkYXRlZCBtYXRoPC9zcGFuPicsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCB7IGNvbnRhaW5lciwgcmVyZW5kZXIgfSA9IHJlbmRlcig8SW5saW5lRHJvcGRvd24gey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuXG4gICAgcmVuZGVyTWF0aC5tb2NrQ2xlYXIoKTtcblxuICAgIHJlcmVuZGVyKDxJbmxpbmVEcm9wZG93biB7Li4uZGVmYXVsdFByb3BzfSBub2RlPXt1cGRhdGVkTm9kZX0gLz4pO1xuXG4gICAgY29uc3QgdmFsdWVEaXYgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZGl2W3N0eWxlKj1cImJvcmRlclwiXScpO1xuICAgIGV4cGVjdChyZW5kZXJNYXRoKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCh2YWx1ZURpdik7XG4gIH0pO1xuXG4gIGl0KCd1c2VzIDJweCBob3Jpem9udGFsIG1hcmdpbiBvbiB0aGUgdmFsdWUgY29udHJvbCBhbmQgbm8gaG9yaXpvbnRhbCBtYXJnaW4gb24gdGhlIHdyYXBwZXInLCAoKSA9PiB7XG4gICAgY29uc3QgeyBjb250YWluZXIsIGdldEJ5VGVzdElkIH0gPSByZW5kZXIoPElubGluZURyb3Bkb3duIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICBjb25zdCB2YWx1ZURpdiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdkaXZbc3R5bGUqPVwiYm9yZGVyXCJdJyk7XG4gICAgZXhwZWN0KHZhbHVlRGl2KS50b0hhdmVTdHlsZSh7IG1hcmdpbjogJzAgMnB4JyB9KTtcbiAgICBjb25zdCB3cmFwcGVyID0gZ2V0QnlUZXN0SWQoJ25vZGUtdmlldy13cmFwcGVyJyk7XG4gICAgZXhwZWN0KHdyYXBwZXIuZ2V0QXR0cmlidXRlKCdzdHlsZScpIHx8ICcnKS5ub3QudG9NYXRjaCgvbWFyZ2luLyk7XG4gIH0pO1xuXG4gIGl0KCdyZW5kZXJzIGNoZXZyb24gaWNvbicsICgpID0+IHtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxJbmxpbmVEcm9wZG93biB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgY29uc3QgY2hldnJvbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdzdmcnKTtcbiAgICBleHBlY3QoY2hldnJvbikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3dzIHRvb2xiYXIgd2hlbiBzZWxlY3RlZCBhbmQgb25seSB0aGlzIG5vZGUgaXMgc2VsZWN0ZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBxdWVyeUJ5VGVzdElkIH0gPSByZW5kZXIoPElubGluZURyb3Bkb3duIHsuLi5kZWZhdWx0UHJvcHN9IHNlbGVjdGVkPXt0cnVlfSAvPik7XG4gICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICAvLyBUb29sYmFyIGlzIHNob3duIHZpYSBwb3J0YWxcbiAgICAgIGV4cGVjdChxdWVyeUJ5VGVzdElkKCdpbmxpbmUtZHJvcGRvd24tdG9vbGJhcicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBpdCgnZG9lcyBub3Qgc2hvdyB0b29sYmFyIHdoZW4gbm90IHNlbGVjdGVkJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgcXVlcnlCeVRlc3RJZCB9ID0gcmVuZGVyKDxJbmxpbmVEcm9wZG93biB7Li4uZGVmYXVsdFByb3BzfSBzZWxlY3RlZD17ZmFsc2V9IC8+KTtcbiAgICBleHBlY3QocXVlcnlCeVRlc3RJZCgnaW5saW5lLWRyb3Bkb3duLXRvb2xiYXInKSkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGl0KCdzaG93cyB0b29sYmFyIG9uIGNsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgY29udGFpbmVyLCBxdWVyeUJ5VGVzdElkIH0gPSByZW5kZXIoPElubGluZURyb3Bkb3duIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICBjb25zdCBkcm9wZG93biA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdkaXZbc3R5bGUqPVwiYm9yZGVyXCJdJyk7XG4gICAgaWYgKGRyb3Bkb3duKSB7XG4gICAgICBmaXJlRXZlbnQuY2xpY2soZHJvcGRvd24pO1xuICAgICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChxdWVyeUJ5VGVzdElkKCdpbmxpbmUtZHJvcGRvd24tdG9vbGJhcicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIGRyb3Bkb3duIGlzIG5vdCBmb3VuZCwganVzdCB2ZXJpZnkgdGhlIGNvbXBvbmVudCByZW5kZXJlZFxuICAgICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KCdoYXMgY29ycmVjdCBtaW5pbXVtIGRpbWVuc2lvbnMnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8SW5saW5lRHJvcGRvd24gey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgIGNvbnN0IHdyYXBwZXIgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignW2RhdGEtdGVzdGlkPVwibm9kZS12aWV3LXdyYXBwZXJcIl0nKTtcbiAgICBleHBlY3Qod3JhcHBlcikudG9IYXZlU3R5bGUoeyBoZWlnaHQ6ICc1MHB4JyB9KTtcbiAgfSk7XG5cbiAgaXQoJ2hhcyBpbmxpbmUtZmxleCBkaXNwbGF5JywgKCkgPT4ge1xuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPElubGluZURyb3Bkb3duIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICBjb25zdCB3cmFwcGVyID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXRlc3RpZD1cIm5vZGUtdmlldy13cmFwcGVyXCJdJyk7XG4gICAgZXhwZWN0KHdyYXBwZXIpLnRvSGF2ZVN0eWxlKHsgZGlzcGxheTogJ2lubGluZS1mbGV4JyB9KTtcbiAgfSk7XG5cbiAgaXQoJ2hhcyBjdXJzb3IgcG9pbnRlciBzdHlsZScsICgpID0+IHtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxJbmxpbmVEcm9wZG93biB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgY29uc3Qgd3JhcHBlciA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbZGF0YS10ZXN0aWQ9XCJub2RlLXZpZXctd3JhcHBlclwiXScpO1xuICAgIGV4cGVjdCh3cmFwcGVyKS50b0hhdmVTdHlsZSh7IGN1cnNvcjogJ3BvaW50ZXInIH0pO1xuICB9KTtcblxuICBpdCgncmVuZGVycyB3aXRoIGVtcHR5IHZhbHVlIGFzIG5ic3AnLCAoKSA9PiB7XG4gICAgY29uc3QgZW1wdHlOb2RlID0geyAuLi5tb2NrTm9kZSwgYXR0cnM6IHsgLi4ubW9ja05vZGUuYXR0cnMsIHZhbHVlOiAnJyB9IH07XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8SW5saW5lRHJvcGRvd24gey4uLmRlZmF1bHRQcm9wc30gbm9kZT17ZW1wdHlOb2RlfSAvPik7XG4gICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgfSk7XG5cbiAgaXQoJ2NhbGxzIHJlc3BBcmVhVG9vbGJhciB3aXRoIGNvcnJlY3QgcGFyYW1zJywgKCkgPT4ge1xuICAgIHJlbmRlcig8SW5saW5lRHJvcGRvd24gey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgIGV4cGVjdChtb2NrT3B0aW9ucy5yZXNwQXJlYVRvb2xiYXIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFttb2NrTm9kZSwgNV0sIG1vY2tFZGl0b3IsIGV4cGVjdC5hbnkoRnVuY3Rpb24pKTtcbiAgfSk7XG5cbiAgaXQoJ2Nsb3NlcyB0b29sYmFyIG9uIG91dHNpZGUgY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBjb250YWluZXIsIHF1ZXJ5QnlUZXN0SWQgfSA9IHJlbmRlcig8SW5saW5lRHJvcGRvd24gey4uLmRlZmF1bHRQcm9wc30gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcbiAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgIGZpcmVFdmVudC5tb3VzZURvd24oZG9jdW1lbnQuYm9keSk7XG4gICAgfSk7XG4gICAgLy8gQWZ0ZXIgY2xpY2tpbmcgb3V0c2lkZSwgdG9vbGJhciBzaG91bGQgYmUgaGlkZGVuXG4gICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICBleHBlY3QocXVlcnlCeVRlc3RJZCgnaW5saW5lLWRyb3Bkb3duLXRvb2xiYXInKSkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdjYWxscyBjbG9zZSBjYWxsYmFjayB3aGVuIHRvb2xiYXIgY2xvc2VzIG9uIG91dHNpZGUgY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgb25JbmxpbmVEcm9wZG93blRvb2xiYXJDbG9zZSA9IGplc3QuZm4oKTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgLi4ubW9ja09wdGlvbnMsXG4gICAgICBvbklubGluZURyb3Bkb3duVG9vbGJhckNsb3NlLFxuICAgIH07XG5cbiAgICBjb25zdCB7IHF1ZXJ5QnlUZXN0SWQgfSA9IHJlbmRlcig8SW5saW5lRHJvcGRvd24gey4uLmRlZmF1bHRQcm9wc30gb3B0aW9ucz17b3B0aW9uc30gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcblxuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ2lubGluZS1kcm9wZG93bi10b29sYmFyJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBmaXJlRXZlbnQubW91c2VEb3duKGRvY3VtZW50LmJvZHkpO1xuXG4gICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICBleHBlY3QocXVlcnlCeVRlc3RJZCgnaW5saW5lLWRyb3Bkb3duLXRvb2xiYXInKSkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBleHBlY3Qob25JbmxpbmVEcm9wZG93blRvb2xiYXJDbG9zZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgobW9ja0VkaXRvcik7XG4gIH0pO1xuXG4gIGl0KCd1c2VzIHRoZSBjdXJyZW50IG5vZGUgd2hlbiBjbG9zaW5nIG9uIG91dHNpZGUgY2xpY2sgYWZ0ZXIgdGhlIG5vZGUgcHJvcCBjaGFuZ2VzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG9uVG9vbGJhckNsb3NlUmVxdWVzdCA9IGplc3QuZm4oKF90dXBsZSwgX2VkaXRvciwgb25Db25maXJtKSA9PiBvbkNvbmZpcm0oKSk7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIC4uLm1vY2tPcHRpb25zLFxuICAgICAgb25Ub29sYmFyQ2xvc2VSZXF1ZXN0LFxuICAgIH07XG4gICAgY29uc3QgdXBkYXRlZE5vZGUgPSB7XG4gICAgICBhdHRyczogeyBpbmRleDogJzEnLCB2YWx1ZTogJ1VwZGF0ZWQgT3B0aW9uJywgZXJyb3I6IGZhbHNlIH0sXG4gICAgICBub2RlU2l6ZTogMSxcbiAgICB9O1xuXG4gICAgY29uc3QgeyBxdWVyeUJ5VGVzdElkLCByZXJlbmRlciB9ID0gcmVuZGVyKDxJbmxpbmVEcm9wZG93biB7Li4uZGVmYXVsdFByb3BzfSBvcHRpb25zPXtvcHRpb25zfSBzZWxlY3RlZD17dHJ1ZX0gLz4pO1xuXG4gICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICBleHBlY3QocXVlcnlCeVRlc3RJZCgnaW5saW5lLWRyb3Bkb3duLXRvb2xiYXInKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIHJlcmVuZGVyKDxJbmxpbmVEcm9wZG93biB7Li4uZGVmYXVsdFByb3BzfSBvcHRpb25zPXtvcHRpb25zfSBub2RlPXt1cGRhdGVkTm9kZX0gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcblxuICAgIGZpcmVFdmVudC5tb3VzZURvd24oZG9jdW1lbnQuYm9keSk7XG5cbiAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgIGV4cGVjdChvblRvb2xiYXJDbG9zZVJlcXVlc3QpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICBbdXBkYXRlZE5vZGUsIDVdLFxuICAgICAgICBleHBlY3QuYW55dGhpbmcoKSxcbiAgICAgICAgZXhwZWN0LmFueShGdW5jdGlvbiksXG4gICAgICAgIGV4cGVjdC5hbnkoRnVuY3Rpb24pLFxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3Jlc3BlY3RzIGhvbGQgc3RhdGUgZm9yIHRoZSBjdXJyZW50IG5vZGUgYWZ0ZXIgdGhlIG5vZGUgcHJvcCBjaGFuZ2VzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZWROb2RlID0ge1xuICAgICAgYXR0cnM6IHsgaW5kZXg6ICcxJywgdmFsdWU6ICdVcGRhdGVkIE9wdGlvbicsIGVycm9yOiBmYWxzZSB9LFxuICAgICAgbm9kZVNpemU6IDEsXG4gICAgfTtcblxuICAgIG1vY2tFZGl0b3IuX2hvbGRJbmxpbmVEcm9wZG93blRvb2xiYXJJbmRleCA9ICcxJztcblxuICAgIGNvbnN0IHsgcXVlcnlCeVRlc3RJZCwgcmVyZW5kZXIgfSA9IHJlbmRlcig8SW5saW5lRHJvcGRvd24gey4uLmRlZmF1bHRQcm9wc30gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcblxuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ2lubGluZS1kcm9wZG93bi10b29sYmFyJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICByZXJlbmRlcig8SW5saW5lRHJvcGRvd24gey4uLmRlZmF1bHRQcm9wc30gbm9kZT17dXBkYXRlZE5vZGV9IHNlbGVjdGVkPXt0cnVlfSAvPik7XG5cbiAgICBmaXJlRXZlbnQubW91c2VEb3duKGRvY3VtZW50LmJvZHkpO1xuXG4gICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICBleHBlY3QocXVlcnlCeVRlc3RJZCgnaW5saW5lLWRyb3Bkb3duLXRvb2xiYXInKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3JlYmluZHMgdGhlIG91dHNpZGUtY2xpY2sgbGlzdGVuZXIgd2hlbiB0aGUgbm9kZSBwcm9wIGNoYW5nZXMgd2hpbGUgdGhlIHRvb2xiYXIgaXMgb3BlbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhZGRTcHkgPSBqZXN0LnNweU9uKGRvY3VtZW50LCAnYWRkRXZlbnRMaXN0ZW5lcicpO1xuICAgIGNvbnN0IHJlbW92ZVNweSA9IGplc3Quc3B5T24oZG9jdW1lbnQsICdyZW1vdmVFdmVudExpc3RlbmVyJyk7XG4gICAgY29uc3QgdXBkYXRlZE5vZGUgPSB7IC4uLm1vY2tOb2RlLCBhdHRyczogeyAuLi5tb2NrTm9kZS5hdHRycywgdmFsdWU6ICdVcGRhdGVkIE9wdGlvbicgfSB9O1xuXG4gICAgY29uc3QgeyByZXJlbmRlciB9ID0gcmVuZGVyKDxJbmxpbmVEcm9wZG93biB7Li4uZGVmYXVsdFByb3BzfSBzZWxlY3RlZD17dHJ1ZX0gLz4pO1xuXG4gICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICBleHBlY3QoYWRkU3B5KS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnbW91c2Vkb3duJywgZXhwZWN0LmFueShGdW5jdGlvbikpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcmVtb3ZlQ2FsbHNCZWZvcmVSZXJlbmRlciA9IHJlbW92ZVNweS5tb2NrLmNhbGxzLmZpbHRlcigoW3R5cGVdKSA9PiB0eXBlID09PSAnbW91c2Vkb3duJykubGVuZ3RoO1xuXG4gICAgcmVyZW5kZXIoPElubGluZURyb3Bkb3duIHsuLi5kZWZhdWx0UHJvcHN9IG5vZGU9e3VwZGF0ZWROb2RlfSBzZWxlY3RlZD17dHJ1ZX0gLz4pO1xuXG4gICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICBjb25zdCByZW1vdmVDYWxsc0FmdGVyUmVyZW5kZXIgPSByZW1vdmVTcHkubW9jay5jYWxscy5maWx0ZXIoKFt0eXBlXSkgPT4gdHlwZSA9PT0gJ21vdXNlZG93bicpLmxlbmd0aDtcbiAgICAgIGV4cGVjdChyZW1vdmVDYWxsc0FmdGVyUmVyZW5kZXIpLnRvQmVHcmVhdGVyVGhhbihyZW1vdmVDYWxsc0JlZm9yZVJlcmVuZGVyKTtcbiAgICAgIGV4cGVjdChhZGRTcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdtb3VzZWRvd24nLCBleHBlY3QuYW55KEZ1bmN0aW9uKSk7XG4gICAgfSk7XG5cbiAgICBhZGRTcHkubW9ja1Jlc3RvcmUoKTtcbiAgICByZW1vdmVTcHkubW9ja1Jlc3RvcmUoKTtcbiAgfSk7XG5cbiAgaXQoJ2hhcyBjb3JyZWN0IGJvcmRlciBzdHlsaW5nJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPElubGluZURyb3Bkb3duIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICBjb25zdCBkcm9wZG93bkRpdiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdkaXZbc3R5bGUqPVwiYm9yZGVyXCJdJyk7XG4gICAgZXhwZWN0KGRyb3Bkb3duRGl2KS50b0hhdmVTdHlsZSh7IGJvcmRlcjogJzFweCBzb2xpZCAjQzBDM0NGJyB9KTtcbiAgfSk7XG5cbiAgaXQoJ2hhcyBjb3JyZWN0IG1pbiB3aWR0aCcsICgpID0+IHtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxJbmxpbmVEcm9wZG93biB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgY29uc3QgZHJvcGRvd25EaXYgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZGl2W3N0eWxlKj1cImJvcmRlclwiXScpO1xuICAgIGV4cGVjdChkcm9wZG93bkRpdikudG9IYXZlU3R5bGUoeyBtaW5XaWR0aDogJzE3OHB4JyB9KTtcbiAgfSk7XG5cbiAgaXQoJ3Bvc2l0aW9ucyBjaGV2cm9uIGNvcnJlY3RseScsICgpID0+IHtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxJbmxpbmVEcm9wZG93biB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgY29uc3QgY2hldnJvbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdzdmcnKTtcbiAgICAvLyBDaGV2cm9uIHN0eWxpbmcgaXMgYXBwbGllZCBpbmxpbmUsIGp1c3QgdmVyaWZ5IGl0IHJlbmRlcmVkXG4gICAgaWYgKGNoZXZyb24pIHtcbiAgICAgIGV4cGVjdChjaGV2cm9uKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHBlY3QoY29udGFpbmVyKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH1cbiAgfSk7XG5cbiAgaXQoJ2hhcyBlbGxpcHNpcyBmb3Igb3ZlcmZsb3cgdGV4dCcsICgpID0+IHtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxJbmxpbmVEcm9wZG93biB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgY29uc3QgdGV4dENvbnRhaW5lciA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdkaXZbc3R5bGUqPVwib3ZlcmZsb3dcIl0nKTtcbiAgICBleHBlY3QodGV4dENvbnRhaW5lcikudG9IYXZlU3R5bGUoeyB0ZXh0T3ZlcmZsb3c6ICdlbGxpcHNpcycsIHdoaXRlU3BhY2U6ICdub3dyYXAnIH0pO1xuICB9KTtcblxuICBpdCgncG9ydGFscyB0b29sYmFyIGludG8gZWRpdG9yIGNvbnRhaW5lciB3aGVuIF90aXB0YXBDb250YWluZXJFbCBpcyBzZXQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY29udGFpbmVyRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb25zdCBlZGl0b3IgPSBidWlsZE1vY2tFZGl0b3IoeyBfdGlwdGFwQ29udGFpbmVyRWw6IGNvbnRhaW5lckVsIH0pO1xuXG4gICAgcmVuZGVyKDxJbmxpbmVEcm9wZG93biB7Li4uZGVmYXVsdFByb3BzfSBlZGl0b3I9e2VkaXRvcn0gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcblxuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgZXhwZWN0KG1vY2tDcmVhdGVQb3J0YWwpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIGV4cGVjdChtb2NrQ3JlYXRlUG9ydGFsLm1vY2suY2FsbHNbMF1bMV0pLnRvQmUoY29udGFpbmVyRWwpO1xuICB9KTtcblxuICBpdCgncG9ydGFscyB0b29sYmFyIGludG8gZG9jdW1lbnQuYm9keSB3aGVuIF90aXB0YXBDb250YWluZXJFbCBpcyBtaXNzaW5nJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGVkaXRvciA9IGJ1aWxkTW9ja0VkaXRvcih7IF90aXB0YXBDb250YWluZXJFbDogdW5kZWZpbmVkIH0pO1xuXG4gICAgcmVuZGVyKDxJbmxpbmVEcm9wZG93biB7Li4uZGVmYXVsdFByb3BzfSBlZGl0b3I9e2VkaXRvcn0gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcblxuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgZXhwZWN0KG1vY2tDcmVhdGVQb3J0YWwpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIGV4cGVjdChtb2NrQ3JlYXRlUG9ydGFsLm1vY2suY2FsbHNbMF1bMV0pLnRvQmUoZG9jdW1lbnQuYm9keSk7XG4gIH0pO1xuXG4gIGl0KCdwYXNzZXMgZWRpdG9yQ2FsbGJhY2sgdG8gSW5saW5lRHJvcGRvd25Ub29sYmFyJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG1vY2tUb29sYmFyQ29tcG9uZW50ID0gamVzdC5mbigoeyBlZGl0b3JDYWxsYmFjayB9KSA9PiB7XG4gICAgICBlZGl0b3JDYWxsYmFjaz8uKHsgaW5zdGFuY2VJZDogJ3Rlc3QtaW5zdGFuY2UnIH0pO1xuICAgICAgcmV0dXJuIDxkaXYgZGF0YS10ZXN0aWQ9XCJpbmxpbmUtZHJvcGRvd24tdG9vbGJhclwiPlRvb2xiYXI8L2Rpdj47XG4gICAgfSk7XG5cbiAgICBjb25zdCBtb2NrT3B0aW9uc1dpdGhDYWxsYmFjayA9IHtcbiAgICAgIHJlc3BBcmVhVG9vbGJhcjogamVzdC5mbigoKSA9PiBtb2NrVG9vbGJhckNvbXBvbmVudCksXG4gICAgfTtcblxuICAgIGNvbnN0IHsgcXVlcnlCeVRlc3RJZCB9ID0gcmVuZGVyKFxuICAgICAgPElubGluZURyb3Bkb3duIHsuLi5kZWZhdWx0UHJvcHN9IG9wdGlvbnM9e21vY2tPcHRpb25zV2l0aENhbGxiYWNrfSBzZWxlY3RlZD17dHJ1ZX0gLz4sXG4gICAgKTtcblxuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ2lubGluZS1kcm9wZG93bi10b29sYmFyJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdzdG9yZXMgdG9vbGJhciBlZGl0b3IgaW5zdGFuY2UgaW4gcmVmIHdoZW4gZWRpdG9yQ2FsbGJhY2sgaXMgY2FsbGVkJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBjYXB0dXJlZENhbGxiYWNrO1xuICAgIGNvbnN0IG1vY2tUb29sYmFyQ29tcG9uZW50ID0gKHsgZWRpdG9yQ2FsbGJhY2sgfSkgPT4ge1xuICAgICAgY2FwdHVyZWRDYWxsYmFjayA9IGVkaXRvckNhbGxiYWNrO1xuICAgICAgcmV0dXJuIDxkaXYgZGF0YS10ZXN0aWQ9XCJpbmxpbmUtZHJvcGRvd24tdG9vbGJhclwiPlRvb2xiYXI8L2Rpdj47XG4gICAgfTtcblxuICAgIGNvbnN0IG1vY2tPcHRpb25zV2l0aENhbGxiYWNrID0ge1xuICAgICAgcmVzcEFyZWFUb29sYmFyOiBqZXN0LmZuKCgpID0+IG1vY2tUb29sYmFyQ29tcG9uZW50KSxcbiAgICB9O1xuXG4gICAgY29uc3QgeyBxdWVyeUJ5VGVzdElkIH0gPSByZW5kZXIoXG4gICAgICA8SW5saW5lRHJvcGRvd24gey4uLmRlZmF1bHRQcm9wc30gb3B0aW9ucz17bW9ja09wdGlvbnNXaXRoQ2FsbGJhY2t9IHNlbGVjdGVkPXt0cnVlfSAvPixcbiAgICApO1xuXG4gICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICBleHBlY3QocXVlcnlCeVRlc3RJZCgnaW5saW5lLWRyb3Bkb3duLXRvb2xiYXInKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIC8vIFZlcmlmeSBjYWxsYmFjayBleGlzdHNcbiAgICBleHBlY3QoY2FwdHVyZWRDYWxsYmFjaykudG9CZURlZmluZWQoKTtcbiAgfSk7XG5cbiAgaXQoJ2hhbmRsZXMgY2xpY2sgb3V0c2lkZSBsb2dpYyB3aXRoIGRhdGEtdG9vbGJhci1mb3IgYXR0cmlidXRlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGVkaXRvcldpdGhJbnN0YW5jZUlkID0ge1xuICAgICAgLi4ubW9ja0VkaXRvcixcbiAgICAgIGluc3RhbmNlSWQ6ICdlZGl0b3ItMTIzJyxcbiAgICAgIF90b29sYmFyT3BlbmVkOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgLy8gTW9jayB0aGUgdG9vbGJhciBjYWxsYmFjayB0byBzZXQgdGhlIHRvb2xiYXIgZWRpdG9yIGluc3RhbmNlXG4gICAgbGV0IGNhcHR1cmVkQ2FsbGJhY2s7XG4gICAgY29uc3QgbW9ja1Rvb2xiYXJDb21wb25lbnQgPSAoeyBlZGl0b3JDYWxsYmFjayB9KSA9PiB7XG4gICAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBjYXB0dXJlZENhbGxiYWNrID0gZWRpdG9yQ2FsbGJhY2s7XG4gICAgICAgIGlmIChlZGl0b3JDYWxsYmFjaykge1xuICAgICAgICAgIGVkaXRvckNhbGxiYWNrKHsgaW5zdGFuY2VJZDogJ2VkaXRvci0xMjMnIH0pO1xuICAgICAgICB9XG4gICAgICB9LCBbZWRpdG9yQ2FsbGJhY2tdKTtcbiAgICAgIHJldHVybiA8ZGl2IGRhdGEtdGVzdGlkPVwiaW5saW5lLWRyb3Bkb3duLXRvb2xiYXJcIj5Ub29sYmFyPC9kaXY+O1xuICAgIH07XG5cbiAgICBjb25zdCBtb2NrT3B0aW9uc1dpdGhDYWxsYmFjayA9IHtcbiAgICAgIHJlc3BBcmVhVG9vbGJhcjogamVzdC5mbigoKSA9PiBtb2NrVG9vbGJhckNvbXBvbmVudCksXG4gICAgfTtcblxuICAgIGNvbnN0IHsgY29udGFpbmVyLCBxdWVyeUJ5VGVzdElkIH0gPSByZW5kZXIoXG4gICAgICA8SW5saW5lRHJvcGRvd25cbiAgICAgICAgey4uLmRlZmF1bHRQcm9wc31cbiAgICAgICAgZWRpdG9yPXtlZGl0b3JXaXRoSW5zdGFuY2VJZH1cbiAgICAgICAgb3B0aW9ucz17bW9ja09wdGlvbnNXaXRoQ2FsbGJhY2t9XG4gICAgICAgIHNlbGVjdGVkPXt0cnVlfVxuICAgICAgLz4sXG4gICAgKTtcblxuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ2lubGluZS1kcm9wZG93bi10b29sYmFyJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgYW4gZWxlbWVudCB3aXRoIGRhdGEtdG9vbGJhci1mb3IgYXR0cmlidXRlXG4gICAgY29uc3Qgb3RoZXJUb29sYmFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgb3RoZXJUb29sYmFyLnNldEF0dHJpYnV0ZSgnZGF0YS10b29sYmFyLWZvcicsICdlZGl0b3ItNDU2Jyk7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChvdGhlclRvb2xiYXIpO1xuXG4gICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICBmaXJlRXZlbnQubW91c2VEb3duKG90aGVyVG9vbGJhcik7XG4gICAgfSk7XG5cbiAgICAvLyBDbGVhbnVwXG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChvdGhlclRvb2xiYXIpO1xuICAgIGV4cGVjdChjb250YWluZXIpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGl0KCdkb2VzIG5vdCBjbG9zZSB3aGVuIGNsaWNraW5nIGluc2lkZSBzYW1lIGVkaXRvciB0b29sYmFyJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGVkaXRvcldpdGhJbnN0YW5jZUlkID0ge1xuICAgICAgLi4ubW9ja0VkaXRvcixcbiAgICAgIGluc3RhbmNlSWQ6ICdlZGl0b3ItMTIzJyxcbiAgICAgIF90b29sYmFyT3BlbmVkOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgbGV0IHRvb2xiYXJFZGl0b3JJbnN0YW5jZTtcbiAgICBjb25zdCBtb2NrVG9vbGJhckNvbXBvbmVudCA9ICh7IGVkaXRvckNhbGxiYWNrIH0pID0+IHtcbiAgICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChlZGl0b3JDYWxsYmFjaykge1xuICAgICAgICAgIGVkaXRvckNhbGxiYWNrKHsgaW5zdGFuY2VJZDogJ2VkaXRvci0xMjMnIH0pO1xuICAgICAgICAgIHRvb2xiYXJFZGl0b3JJbnN0YW5jZSA9IHsgaW5zdGFuY2VJZDogJ2VkaXRvci0xMjMnIH07XG4gICAgICAgIH1cbiAgICAgIH0sIFtlZGl0b3JDYWxsYmFja10pO1xuICAgICAgcmV0dXJuIDxkaXYgZGF0YS10ZXN0aWQ9XCJpbmxpbmUtZHJvcGRvd24tdG9vbGJhclwiPlRvb2xiYXI8L2Rpdj47XG4gICAgfTtcblxuICAgIGNvbnN0IG1vY2tPcHRpb25zV2l0aENhbGxiYWNrID0ge1xuICAgICAgcmVzcEFyZWFUb29sYmFyOiBqZXN0LmZuKCgpID0+IG1vY2tUb29sYmFyQ29tcG9uZW50KSxcbiAgICB9O1xuXG4gICAgcmVuZGVyKFxuICAgICAgPElubGluZURyb3Bkb3duXG4gICAgICAgIHsuLi5kZWZhdWx0UHJvcHN9XG4gICAgICAgIGVkaXRvcj17ZWRpdG9yV2l0aEluc3RhbmNlSWR9XG4gICAgICAgIG9wdGlvbnM9e21vY2tPcHRpb25zV2l0aENhbGxiYWNrfVxuICAgICAgICBzZWxlY3RlZD17dHJ1ZX1cbiAgICAgIC8+LFxuICAgICk7XG5cbiAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgIGV4cGVjdChtb2NrT3B0aW9uc1dpdGhDYWxsYmFjay5yZXNwQXJlYVRvb2xiYXIpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ2NoZWNrcyBlZGl0b3IuX3Rvb2xiYXJPcGVuZWQgaW4gY2xpY2sgb3V0c2lkZSBoYW5kbGVyJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGVkaXRvcldpdGhUb29sYmFyT3BlbmVkID0gYnVpbGRNb2NrRWRpdG9yKHsgX3Rvb2xiYXJPcGVuZWQ6IHRydWUgfSk7XG5cbiAgICBjb25zdCB7IHF1ZXJ5QnlUZXN0SWQgfSA9IHJlbmRlcihcbiAgICAgIDxJbmxpbmVEcm9wZG93biB7Li4uZGVmYXVsdFByb3BzfSBlZGl0b3I9e2VkaXRvcldpdGhUb29sYmFyT3BlbmVkfSBzZWxlY3RlZD17dHJ1ZX0gLz4sXG4gICAgKTtcblxuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ2lubGluZS1kcm9wZG93bi10b29sYmFyJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICAvLyBXaGVuIF90b29sYmFyT3BlbmVkIGlzIHRydWUsIGNsaWNraW5nIG91dHNpZGUgc2hvdWxkIG5vdCBjbG9zZVxuICAgIGZpcmVFdmVudC5tb3VzZURvd24oZG9jdW1lbnQuYm9keSk7XG5cbiAgICAvLyBUb29sYmFyIHNob3VsZCBzdGlsbCBiZSB2aXNpYmxlXG4gICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ2lubGluZS1kcm9wZG93bi10b29sYmFyJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGl0KCdkb2VzIG5vdCBjbG9zZSB0b29sYmFyIHdoZW4gY2xpY2tpbmcgdGhlIHBhZ2Ugc2Nyb2xsYmFyIChkb2N1bWVudEVsZW1lbnQpJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgcXVlcnlCeVRlc3RJZCB9ID0gcmVuZGVyKDxJbmxpbmVEcm9wZG93biB7Li4uZGVmYXVsdFByb3BzfSBzZWxlY3RlZD17dHJ1ZX0gLz4pO1xuXG4gICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICBleHBlY3QocXVlcnlCeVRlc3RJZCgnaW5saW5lLWRyb3Bkb3duLXRvb2xiYXInKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGZpcmVFdmVudC5tb3VzZURvd24oZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcblxuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ2lubGluZS1kcm9wZG93bi10b29sYmFyJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdyZW5kZXJzIGRlbGV0ZSBjb250cm9sIG9uIHBvcnRhbGVkIGN1c3RvbSB0b29sYmFyIHdoZW4gY29udGFpbmVyIGVsIGlzIHNldCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGZpbmRCeUxhYmVsVGV4dCB9ID0gcmVuZGVyKDxJbmxpbmVEcm9wZG93biB7Li4uZGVmYXVsdFByb3BzfSBzZWxlY3RlZCAvPik7XG4gICAgZXhwZWN0KGF3YWl0IGZpbmRCeUxhYmVsVGV4dCgnRGVsZXRlJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGl0KCdkb2VzIG5vdCByZW5kZXIgcG9ydGFsZWQgZGVsZXRlIGNvbnRyb2wgd2hlbiBfdGlwdGFwQ29udGFpbmVyRWwgaXMgbWlzc2luZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBlZGl0b3IgPSBidWlsZE1vY2tFZGl0b3IoeyBfdGlwdGFwQ29udGFpbmVyRWw6IHVuZGVmaW5lZCB9KTtcbiAgICBjb25zdCB7IHF1ZXJ5QnlMYWJlbFRleHQsIGZpbmRCeVRlc3RJZCB9ID0gcmVuZGVyKDxJbmxpbmVEcm9wZG93biB7Li4uZGVmYXVsdFByb3BzfSBlZGl0b3I9e2VkaXRvcn0gc2VsZWN0ZWQgLz4pO1xuICAgIGV4cGVjdChhd2FpdCBmaW5kQnlUZXN0SWQoJ2lubGluZS1kcm9wZG93bi10b29sYmFyJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgZXhwZWN0KHF1ZXJ5QnlMYWJlbFRleHQoJ0RlbGV0ZScpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgfSk7XG5cbiAgaXQoJ2RlbGV0ZSBjbGVhcnMgdG9vbGJhciBmbGFnLCByZW1vdmVzIG5vZGUgcmFuZ2UsIGRpc3BhdGNoZXMsIGFuZCBmb2N1c2VzJywgYXN5bmMgKCkgPT4ge1xuICAgIG1vY2tFZGl0b3IuX3Rvb2xiYXJPcGVuZWQgPSB0cnVlO1xuICAgIGNvbnN0IHsgZmluZEJ5TGFiZWxUZXh0IH0gPSByZW5kZXIoPElubGluZURyb3Bkb3duIHsuLi5kZWZhdWx0UHJvcHN9IHNlbGVjdGVkIC8+KTtcbiAgICBmaXJlRXZlbnQubW91c2VEb3duKGF3YWl0IGZpbmRCeUxhYmVsVGV4dCgnRGVsZXRlJykpO1xuICAgIGV4cGVjdChtb2NrRWRpdG9yLnN0YXRlLnRyLmRlbGV0ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoNSwgNik7XG4gICAgZXhwZWN0KG1vY2tFZGl0b3Iudmlldy5kaXNwYXRjaCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDIpO1xuICAgIGV4cGVjdChtb2NrRWRpdG9yLnZpZXcuZGlzcGF0Y2gpLnRvSGF2ZUJlZW5OdGhDYWxsZWRXaXRoKDEsIG1vY2tFZGl0b3Iuc3RhdGUudHIpO1xuICAgIGV4cGVjdChtb2NrRWRpdG9yLnZpZXcuZGlzcGF0Y2gpLnRvSGF2ZUJlZW5OdGhDYWxsZWRXaXRoKDIsIG1vY2tFZGl0b3Iuc3RhdGUudHIpO1xuICAgIGV4cGVjdChtb2NrRWRpdG9yLl90b29sYmFyT3BlbmVkKS50b0JlKGZhbHNlKTtcbiAgICBleHBlY3QobW9ja0VkaXRvci5jb21tYW5kcy5mb2N1cykudG9IYXZlQmVlbkNhbGxlZCgpO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxJQUFBQSxNQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxjQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxlQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFBd0QsSUFBQUksU0FBQTtBQUFBLFNBQUFDLFFBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsSUFBQSxDQUFBSixDQUFBLE9BQUFHLE1BQUEsQ0FBQUUscUJBQUEsUUFBQUMsQ0FBQSxHQUFBSCxNQUFBLENBQUFFLHFCQUFBLENBQUFMLENBQUEsR0FBQUMsQ0FBQSxLQUFBSyxDQUFBLEdBQUFBLENBQUEsQ0FBQUMsTUFBQSxXQUFBTixDQUFBLFdBQUFFLE1BQUEsQ0FBQUssd0JBQUEsQ0FBQVIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFRLFVBQUEsT0FBQVAsQ0FBQSxDQUFBUSxJQUFBLENBQUFDLEtBQUEsQ0FBQVQsQ0FBQSxFQUFBSSxDQUFBLFlBQUFKLENBQUE7QUFBQSxTQUFBVSxjQUFBWixDQUFBLGFBQUFDLENBQUEsTUFBQUEsQ0FBQSxHQUFBWSxTQUFBLENBQUFDLE1BQUEsRUFBQWIsQ0FBQSxVQUFBQyxDQUFBLFdBQUFXLFNBQUEsQ0FBQVosQ0FBQSxJQUFBWSxTQUFBLENBQUFaLENBQUEs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