@pie-lib/editable-html-tip-tap 2.1.20-beta.5 → 2.1.20-beta.7

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,307 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
5
+ var _react = _interopRequireDefault(require("react"));
6
+ var _react2 = require("@testing-library/react");
7
+ var _media = _interopRequireDefault(require("../media"));
8
+ 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; }
9
+ 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; }
10
+ // Create a mockable insertDialog function
11
+ var mockInsertDialog = jest.fn();
12
+
13
+ // Mock react-dom BEFORE any imports that depend on it
14
+ jest.mock('react-dom', function () {
15
+ return _objectSpread(_objectSpread({}, jest.requireActual('react-dom')), {}, {
16
+ render: jest.fn()
17
+ });
18
+ });
19
+
20
+ // Mock the insertDialog function in the media module
21
+ jest.mock('../media', function () {
22
+ var actual = jest.requireActual('../media');
23
+ return _objectSpread(_objectSpread({
24
+ __esModule: true
25
+ }, actual), {}, {
26
+ "default": actual["default"],
27
+ // Preserve the default export
28
+ insertDialog: function insertDialog() {
29
+ return mockInsertDialog.apply(void 0, arguments);
30
+ }
31
+ });
32
+ });
33
+ jest.mock('@tiptap/core', function () {
34
+ return {
35
+ Node: {
36
+ create: jest.fn(function (config) {
37
+ return config;
38
+ })
39
+ },
40
+ mergeAttributes: jest.fn(function () {
41
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
42
+ args[_key] = arguments[_key];
43
+ }
44
+ return Object.assign.apply(Object, [{}].concat(args));
45
+ })
46
+ };
47
+ });
48
+ jest.mock('@tiptap/react', function () {
49
+ return {
50
+ NodeViewWrapper: function NodeViewWrapper(_ref) {
51
+ var children = _ref.children;
52
+ return /*#__PURE__*/_react["default"].createElement("div", {
53
+ "data-testid": "node-view-wrapper"
54
+ }, children);
55
+ },
56
+ ReactNodeViewRenderer: jest.fn(function (component) {
57
+ return component;
58
+ })
59
+ };
60
+ });
61
+ jest.mock('../../components/media/MediaDialog', function () {
62
+ return {
63
+ __esModule: true,
64
+ "default": jest.fn(function () {
65
+ return /*#__PURE__*/_react["default"].createElement("div", {
66
+ "data-testid": "media-dialog"
67
+ });
68
+ })
69
+ };
70
+ });
71
+ jest.mock('../../components/media/MediaToolbar', function () {
72
+ return {
73
+ __esModule: true,
74
+ "default": jest.fn(function (_ref2) {
75
+ var onEdit = _ref2.onEdit,
76
+ onRemove = _ref2.onRemove;
77
+ return /*#__PURE__*/_react["default"].createElement("div", {
78
+ "data-testid": "media-toolbar"
79
+ }, /*#__PURE__*/_react["default"].createElement("button", {
80
+ onClick: onEdit,
81
+ "data-testid": "edit-button"
82
+ }, "Edit Settings"), /*#__PURE__*/_react["default"].createElement("button", {
83
+ onClick: onRemove,
84
+ "data-testid": "remove-button"
85
+ }, "Remove"));
86
+ })
87
+ };
88
+ });
89
+ describe('MediaNodeView Component', function () {
90
+ var mockEditor;
91
+ var mockUpdateAttributes;
92
+ var mockDeleteNode;
93
+ beforeEach(function () {
94
+ jest.clearAllMocks();
95
+ mockInsertDialog.mockClear();
96
+
97
+ // Clean up any existing dialogs in the DOM
98
+ document.body.innerHTML = '';
99
+ mockEditor = {
100
+ chain: jest.fn(function () {
101
+ return {
102
+ focus: jest.fn(function () {
103
+ return {
104
+ run: jest.fn()
105
+ };
106
+ })
107
+ };
108
+ })
109
+ };
110
+ mockUpdateAttributes = jest.fn();
111
+ mockDeleteNode = jest.fn();
112
+ });
113
+ afterEach(function () {
114
+ // Clean up DOM after each test
115
+ document.body.innerHTML = '';
116
+ });
117
+ describe('dialog auto-opening behavior - verifies the fix', function () {
118
+ it('should NOT open dialog on mount when audio has existing src', function () {
119
+ var node = {
120
+ attrs: {
121
+ type: 'audio',
122
+ tag: 'audio',
123
+ src: 'https://example.com/audio.mp3',
124
+ width: null,
125
+ height: null
126
+ }
127
+ };
128
+
129
+ // This should render without opening any dialogs
130
+ var _render = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_media["default"], {
131
+ editor: mockEditor,
132
+ node: node,
133
+ updateAttributes: mockUpdateAttributes,
134
+ deleteNode: mockDeleteNode,
135
+ options: {}
136
+ })),
137
+ container = _render.container;
138
+
139
+ // Verify the component rendered successfully
140
+ expect(container.querySelector('audio')).toBeTruthy();
141
+ // Verify mockInsertDialog was not called (dialog didn't open)
142
+ expect(mockInsertDialog).not.toHaveBeenCalled();
143
+ // Verify deleteNode was not called (media was not removed)
144
+ expect(mockDeleteNode).not.toHaveBeenCalled();
145
+ });
146
+ it('should NOT open dialog on mount when video has existing src', function () {
147
+ var node = {
148
+ attrs: {
149
+ type: 'video',
150
+ tag: 'iframe',
151
+ src: 'https://www.youtube.com/embed/dQw4w9WgXcQ',
152
+ width: '640',
153
+ height: '480'
154
+ }
155
+ };
156
+
157
+ // This should render without opening any dialogs
158
+ var _render2 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_media["default"], {
159
+ editor: mockEditor,
160
+ node: node,
161
+ updateAttributes: mockUpdateAttributes,
162
+ deleteNode: mockDeleteNode,
163
+ options: {}
164
+ })),
165
+ container = _render2.container;
166
+
167
+ // Verify the component rendered successfully
168
+ expect(container.querySelector('iframe')).toBeTruthy();
169
+ // Verify mockInsertDialog was not called (dialog didn't open)
170
+ expect(mockInsertDialog).not.toHaveBeenCalled();
171
+ // Verify deleteNode was not called (media was not removed)
172
+ expect(mockDeleteNode).not.toHaveBeenCalled();
173
+ });
174
+ it('should render existing media with empty string src without opening dialog', function () {
175
+ var node = {
176
+ attrs: {
177
+ type: 'audio',
178
+ tag: 'audio',
179
+ src: '',
180
+ // Empty string (falsy but not null)
181
+ width: null,
182
+ height: null
183
+ }
184
+ };
185
+ var _render3 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_media["default"], {
186
+ editor: mockEditor,
187
+ node: node,
188
+ updateAttributes: mockUpdateAttributes,
189
+ deleteNode: mockDeleteNode,
190
+ options: {}
191
+ })),
192
+ container = _render3.container;
193
+
194
+ // Empty string is falsy, so dialog WOULD open with current implementation
195
+ // This documents current behavior
196
+ expect(container).toBeTruthy();
197
+ });
198
+ });
199
+ describe('toolbar interaction', function () {
200
+ it('should render edit and remove buttons', function () {
201
+ var node = {
202
+ attrs: {
203
+ type: 'audio',
204
+ tag: 'audio',
205
+ src: 'https://example.com/audio.mp3'
206
+ }
207
+ };
208
+ var _render4 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_media["default"], {
209
+ editor: mockEditor,
210
+ node: node,
211
+ updateAttributes: mockUpdateAttributes,
212
+ deleteNode: mockDeleteNode,
213
+ options: {}
214
+ })),
215
+ getByTestId = _render4.getByTestId;
216
+ expect(getByTestId('edit-button')).toBeTruthy();
217
+ expect(getByTestId('remove-button')).toBeTruthy();
218
+ });
219
+ });
220
+ describe('rendering', function () {
221
+ it('should render audio element when tag is audio', function () {
222
+ var node = {
223
+ attrs: {
224
+ type: 'audio',
225
+ tag: 'audio',
226
+ src: 'https://example.com/audio.mp3'
227
+ }
228
+ };
229
+ var _render5 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_media["default"], {
230
+ editor: mockEditor,
231
+ node: node,
232
+ updateAttributes: mockUpdateAttributes,
233
+ deleteNode: mockDeleteNode,
234
+ options: {}
235
+ })),
236
+ container = _render5.container;
237
+ var audio = container.querySelector('audio');
238
+ expect(audio).toBeTruthy();
239
+ var source = audio.querySelector('source');
240
+ expect(source.getAttribute('src')).toBe('https://example.com/audio.mp3');
241
+ });
242
+ it('should render iframe when tag is iframe', function () {
243
+ var node = {
244
+ attrs: {
245
+ type: 'video',
246
+ tag: 'iframe',
247
+ src: 'https://www.youtube.com/embed/dQw4w9WgXcQ',
248
+ width: '640',
249
+ height: '480'
250
+ }
251
+ };
252
+ var _render6 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_media["default"], {
253
+ editor: mockEditor,
254
+ node: node,
255
+ updateAttributes: mockUpdateAttributes,
256
+ deleteNode: mockDeleteNode,
257
+ options: {}
258
+ })),
259
+ container = _render6.container;
260
+ var iframe = container.querySelector('iframe');
261
+ expect(iframe).toBeTruthy();
262
+ expect(iframe.getAttribute('src')).toBe('https://www.youtube.com/embed/dQw4w9WgXcQ');
263
+ expect(iframe.getAttribute('width')).toBe('640');
264
+ expect(iframe.getAttribute('height')).toBe('480');
265
+ });
266
+ it('should render MediaToolbar', function () {
267
+ var node = {
268
+ attrs: {
269
+ type: 'audio',
270
+ tag: 'audio',
271
+ src: 'https://example.com/audio.mp3'
272
+ }
273
+ };
274
+ var _render7 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_media["default"], {
275
+ editor: mockEditor,
276
+ node: node,
277
+ updateAttributes: mockUpdateAttributes,
278
+ deleteNode: mockDeleteNode,
279
+ options: {}
280
+ })),
281
+ getByTestId = _render7.getByTestId;
282
+ expect(getByTestId('media-toolbar')).toBeTruthy();
283
+ expect(getByTestId('edit-button')).toBeTruthy();
284
+ expect(getByTestId('remove-button')).toBeTruthy();
285
+ });
286
+ it('should call deleteNode when remove button is clicked', function () {
287
+ var node = {
288
+ attrs: {
289
+ type: 'audio',
290
+ tag: 'audio',
291
+ src: 'https://example.com/audio.mp3'
292
+ }
293
+ };
294
+ var _render8 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_media["default"], {
295
+ editor: mockEditor,
296
+ node: node,
297
+ updateAttributes: mockUpdateAttributes,
298
+ deleteNode: mockDeleteNode,
299
+ options: {}
300
+ })),
301
+ getByTestId = _render8.getByTestId;
302
+ _react2.fireEvent.click(getByTestId('remove-button'));
303
+ expect(mockDeleteNode).toHaveBeenCalled();
304
+ });
305
+ });
306
+ });
307
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfbWVkaWEiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIm1vY2tJbnNlcnREaWFsb2ciLCJqZXN0IiwiZm4iLCJtb2NrIiwicmVxdWlyZUFjdHVhbCIsInJlbmRlciIsImFjdHVhbCIsIl9fZXNNb2R1bGUiLCJpbnNlcnREaWFsb2ciLCJOb2RlIiwiY3JlYXRlIiwiY29uZmlnIiwibWVyZ2VBdHRyaWJ1dGVzIiwiX2xlbiIsImFyZ3MiLCJBcnJheSIsIl9rZXkiLCJhc3NpZ24iLCJjb25jYXQiLCJOb2RlVmlld1dyYXBwZXIiLCJfcmVmIiwiY2hpbGRyZW4iLCJjcmVhdGVFbGVtZW50IiwiUmVhY3ROb2RlVmlld1JlbmRlcmVyIiwiY29tcG9uZW50IiwiX3JlZjIiLCJvbkVkaXQiLCJvblJlbW92ZSIsIm9uQ2xpY2siLCJkZXNjcmliZSIsIm1vY2tFZGl0b3IiLCJtb2NrVXBkYXRlQXR0cmlidXRlcyIsIm1vY2tEZWxldGVOb2RlIiwiYmVmb3JlRWFjaCIsImNsZWFyQWxsTW9ja3MiLCJtb2NrQ2xlYXIiLCJkb2N1bWVudCIsImJvZHkiLCJpbm5lckhUTUwiLCJjaGFpbiIsImZvY3VzIiwicnVuIiwiYWZ0ZXJFYWNoIiwiaXQiLCJub2RlIiwiYXR0cnMiLCJ0eXBlIiwidGFnIiwic3JjIiwid2lkdGgiLCJoZWlnaHQiLCJfcmVuZGVyIiwiZWRpdG9yIiwidXBkYXRlQXR0cmlidXRlcyIsImRlbGV0ZU5vZGUiLCJvcHRpb25zIiwiY29udGFpbmVyIiwiZXhwZWN0IiwicXVlcnlTZWxlY3RvciIsInRvQmVUcnV0aHkiLCJub3QiLCJ0b0hhdmVCZWVuQ2FsbGVkIiwiX3JlbmRlcjIiLCJfcmVuZGVyMyIsIl9yZW5kZXI0IiwiZ2V0QnlUZXN0SWQiLCJfcmVuZGVyNSIsImF1ZGlvIiwic291cmNlIiwiZ2V0QXR0cmlidXRlIiwidG9CZSIsIl9yZW5kZXI2IiwiaWZyYW1lIiwiX3JlbmRlcjciLCJfcmVuZGVyOCIsImZpcmVFdmVudCIsImNsaWNrIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2V4dGVuc2lvbnMvX190ZXN0c19fL21lZGlhLW5vZGUtdmlldy50ZXN0LmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDcmVhdGUgYSBtb2NrYWJsZSBpbnNlcnREaWFsb2cgZnVuY3Rpb25cbmNvbnN0IG1vY2tJbnNlcnREaWFsb2cgPSBqZXN0LmZuKCk7XG5cbi8vIE1vY2sgcmVhY3QtZG9tIEJFRk9SRSBhbnkgaW1wb3J0cyB0aGF0IGRlcGVuZCBvbiBpdFxuamVzdC5tb2NrKCdyZWFjdC1kb20nLCAoKSA9PiAoe1xuICAuLi5qZXN0LnJlcXVpcmVBY3R1YWwoJ3JlYWN0LWRvbScpLFxuICByZW5kZXI6IGplc3QuZm4oKSxcbn0pKTtcblxuLy8gTW9jayB0aGUgaW5zZXJ0RGlhbG9nIGZ1bmN0aW9uIGluIHRoZSBtZWRpYSBtb2R1bGVcbmplc3QubW9jaygnLi4vbWVkaWEnLCAoKSA9PiB7XG4gIGNvbnN0IGFjdHVhbCA9IGplc3QucmVxdWlyZUFjdHVhbCgnLi4vbWVkaWEnKTtcbiAgcmV0dXJuIHtcbiAgICBfX2VzTW9kdWxlOiB0cnVlLFxuICAgIC4uLmFjdHVhbCxcbiAgICBkZWZhdWx0OiBhY3R1YWwuZGVmYXVsdCwgLy8gUHJlc2VydmUgdGhlIGRlZmF1bHQgZXhwb3J0XG4gICAgaW5zZXJ0RGlhbG9nOiAoLi4uYXJncykgPT4gbW9ja0luc2VydERpYWxvZyguLi5hcmdzKSxcbiAgfTtcbn0pO1xuXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcmVuZGVyLCBmaXJlRXZlbnQgfSBmcm9tICdAdGVzdGluZy1saWJyYXJ5L3JlYWN0JztcbmltcG9ydCBNZWRpYU5vZGVWaWV3IGZyb20gJy4uL21lZGlhJztcblxuamVzdC5tb2NrKCdAdGlwdGFwL2NvcmUnLCAoKSA9PiAoe1xuICBOb2RlOiB7IGNyZWF0ZTogamVzdC5mbigoY29uZmlnKSA9PiBjb25maWcpIH0sXG4gIG1lcmdlQXR0cmlidXRlczogamVzdC5mbigoLi4uYXJncykgPT4gT2JqZWN0LmFzc2lnbih7fSwgLi4uYXJncykpLFxufSkpO1xuXG5qZXN0Lm1vY2soJ0B0aXB0YXAvcmVhY3QnLCAoKSA9PiAoe1xuICBOb2RlVmlld1dyYXBwZXI6ICh7IGNoaWxkcmVuIH0pID0+IDxkaXYgZGF0YS10ZXN0aWQ9XCJub2RlLXZpZXctd3JhcHBlclwiPntjaGlsZHJlbn08L2Rpdj4sXG4gIFJlYWN0Tm9kZVZpZXdSZW5kZXJlcjogamVzdC5mbigoY29tcG9uZW50KSA9PiBjb21wb25lbnQpLFxufSkpO1xuXG5qZXN0Lm1vY2soJy4uLy4uL2NvbXBvbmVudHMvbWVkaWEvTWVkaWFEaWFsb2cnLCAoKSA9PiAoe1xuICBfX2VzTW9kdWxlOiB0cnVlLFxuICBkZWZhdWx0OiBqZXN0LmZuKCgpID0+IDxkaXYgZGF0YS10ZXN0aWQ9XCJtZWRpYS1kaWFsb2dcIiAvPiksXG59KSk7XG5cbmplc3QubW9jaygnLi4vLi4vY29tcG9uZW50cy9tZWRpYS9NZWRpYVRvb2xiYXInLCAoKSA9PiAoe1xuICBfX2VzTW9kdWxlOiB0cnVlLFxuICBkZWZhdWx0OiBqZXN0LmZuKCh7IG9uRWRpdCwgb25SZW1vdmUgfSkgPT4gKFxuICAgIDxkaXYgZGF0YS10ZXN0aWQ9XCJtZWRpYS10b29sYmFyXCI+XG4gICAgICA8YnV0dG9uIG9uQ2xpY2s9e29uRWRpdH0gZGF0YS10ZXN0aWQ9XCJlZGl0LWJ1dHRvblwiPlxuICAgICAgICBFZGl0IFNldHRpbmdzXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gb25DbGljaz17b25SZW1vdmV9IGRhdGEtdGVzdGlkPVwicmVtb3ZlLWJ1dHRvblwiPlxuICAgICAgICBSZW1vdmVcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICApKSxcbn0pKTtcblxuZGVzY3JpYmUoJ01lZGlhTm9kZVZpZXcgQ29tcG9uZW50JywgKCkgPT4ge1xuICBsZXQgbW9ja0VkaXRvcjtcbiAgbGV0IG1vY2tVcGRhdGVBdHRyaWJ1dGVzO1xuICBsZXQgbW9ja0RlbGV0ZU5vZGU7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgamVzdC5jbGVhckFsbE1vY2tzKCk7XG4gICAgbW9ja0luc2VydERpYWxvZy5tb2NrQ2xlYXIoKTtcblxuICAgIC8vIENsZWFuIHVwIGFueSBleGlzdGluZyBkaWFsb2dzIGluIHRoZSBET01cbiAgICBkb2N1bWVudC5ib2R5LmlubmVySFRNTCA9ICcnO1xuXG4gICAgbW9ja0VkaXRvciA9IHtcbiAgICAgIGNoYWluOiBqZXN0LmZuKCgpID0+ICh7XG4gICAgICAgIGZvY3VzOiBqZXN0LmZuKCgpID0+ICh7XG4gICAgICAgICAgcnVuOiBqZXN0LmZuKCksXG4gICAgICAgIH0pKSxcbiAgICAgIH0pKSxcbiAgICB9O1xuXG4gICAgbW9ja1VwZGF0ZUF0dHJpYnV0ZXMgPSBqZXN0LmZuKCk7XG4gICAgbW9ja0RlbGV0ZU5vZGUgPSBqZXN0LmZuKCk7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgLy8gQ2xlYW4gdXAgRE9NIGFmdGVyIGVhY2ggdGVzdFxuICAgIGRvY3VtZW50LmJvZHkuaW5uZXJIVE1MID0gJyc7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdkaWFsb2cgYXV0by1vcGVuaW5nIGJlaGF2aW9yIC0gdmVyaWZpZXMgdGhlIGZpeCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIE5PVCBvcGVuIGRpYWxvZyBvbiBtb3VudCB3aGVuIGF1ZGlvIGhhcyBleGlzdGluZyBzcmMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBub2RlID0ge1xuICAgICAgICBhdHRyczoge1xuICAgICAgICAgIHR5cGU6ICdhdWRpbycsXG4gICAgICAgICAgdGFnOiAnYXVkaW8nLFxuICAgICAgICAgIHNyYzogJ2h0dHBzOi8vZXhhbXBsZS5jb20vYXVkaW8ubXAzJyxcbiAgICAgICAgICB3aWR0aDogbnVsbCxcbiAgICAgICAgICBoZWlnaHQ6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICAvLyBUaGlzIHNob3VsZCByZW5kZXIgd2l0aG91dCBvcGVuaW5nIGFueSBkaWFsb2dzXG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKFxuICAgICAgICA8TWVkaWFOb2RlVmlld1xuICAgICAgICAgIGVkaXRvcj17bW9ja0VkaXRvcn1cbiAgICAgICAgICBub2RlPXtub2RlfVxuICAgICAgICAgIHVwZGF0ZUF0dHJpYnV0ZXM9e21vY2tVcGRhdGVBdHRyaWJ1dGVzfVxuICAgICAgICAgIGRlbGV0ZU5vZGU9e21vY2tEZWxldGVOb2RlfVxuICAgICAgICAgIG9wdGlvbnM9e3t9fVxuICAgICAgICAvPixcbiAgICAgICk7XG5cbiAgICAgIC8vIFZlcmlmeSB0aGUgY29tcG9uZW50IHJlbmRlcmVkIHN1Y2Nlc3NmdWxseVxuICAgICAgZXhwZWN0KGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdhdWRpbycpKS50b0JlVHJ1dGh5KCk7XG4gICAgICAvLyBWZXJpZnkgbW9ja0luc2VydERpYWxvZyB3YXMgbm90IGNhbGxlZCAoZGlhbG9nIGRpZG4ndCBvcGVuKVxuICAgICAgZXhwZWN0KG1vY2tJbnNlcnREaWFsb2cpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAvLyBWZXJpZnkgZGVsZXRlTm9kZSB3YXMgbm90IGNhbGxlZCAobWVkaWEgd2FzIG5vdCByZW1vdmVkKVxuICAgICAgZXhwZWN0KG1vY2tEZWxldGVOb2RlKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBOT1Qgb3BlbiBkaWFsb2cgb24gbW91bnQgd2hlbiB2aWRlbyBoYXMgZXhpc3Rpbmcgc3JjJywgKCkgPT4ge1xuICAgICAgY29uc3Qgbm9kZSA9IHtcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICB0eXBlOiAndmlkZW8nLFxuICAgICAgICAgIHRhZzogJ2lmcmFtZScsXG4gICAgICAgICAgc3JjOiAnaHR0cHM6Ly93d3cueW91dHViZS5jb20vZW1iZWQvZFF3NHc5V2dYY1EnLFxuICAgICAgICAgIHdpZHRoOiAnNjQwJyxcbiAgICAgICAgICBoZWlnaHQ6ICc0ODAnLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgLy8gVGhpcyBzaG91bGQgcmVuZGVyIHdpdGhvdXQgb3BlbmluZyBhbnkgZGlhbG9nc1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcihcbiAgICAgICAgPE1lZGlhTm9kZVZpZXdcbiAgICAgICAgICBlZGl0b3I9e21vY2tFZGl0b3J9XG4gICAgICAgICAgbm9kZT17bm9kZX1cbiAgICAgICAgICB1cGRhdGVBdHRyaWJ1dGVzPXttb2NrVXBkYXRlQXR0cmlidXRlc31cbiAgICAgICAgICBkZWxldGVOb2RlPXttb2NrRGVsZXRlTm9kZX1cbiAgICAgICAgICBvcHRpb25zPXt7fX1cbiAgICAgICAgLz4sXG4gICAgICApO1xuXG4gICAgICAvLyBWZXJpZnkgdGhlIGNvbXBvbmVudCByZW5kZXJlZCBzdWNjZXNzZnVsbHlcbiAgICAgIGV4cGVjdChjb250YWluZXIucXVlcnlTZWxlY3RvcignaWZyYW1lJykpLnRvQmVUcnV0aHkoKTtcbiAgICAgIC8vIFZlcmlmeSBtb2NrSW5zZXJ0RGlhbG9nIHdhcyBub3QgY2FsbGVkIChkaWFsb2cgZGlkbid0IG9wZW4pXG4gICAgICBleHBlY3QobW9ja0luc2VydERpYWxvZykubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgIC8vIFZlcmlmeSBkZWxldGVOb2RlIHdhcyBub3QgY2FsbGVkIChtZWRpYSB3YXMgbm90IHJlbW92ZWQpXG4gICAgICBleHBlY3QobW9ja0RlbGV0ZU5vZGUpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlbmRlciBleGlzdGluZyBtZWRpYSB3aXRoIGVtcHR5IHN0cmluZyBzcmMgd2l0aG91dCBvcGVuaW5nIGRpYWxvZycsICgpID0+IHtcbiAgICAgIGNvbnN0IG5vZGUgPSB7XG4gICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgdHlwZTogJ2F1ZGlvJyxcbiAgICAgICAgICB0YWc6ICdhdWRpbycsXG4gICAgICAgICAgc3JjOiAnJywgLy8gRW1wdHkgc3RyaW5nIChmYWxzeSBidXQgbm90IG51bGwpXG4gICAgICAgICAgd2lkdGg6IG51bGwsXG4gICAgICAgICAgaGVpZ2h0OiBudWxsLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcihcbiAgICAgICAgPE1lZGlhTm9kZVZpZXdcbiAgICAgICAgICBlZGl0b3I9e21vY2tFZGl0b3J9XG4gICAgICAgICAgbm9kZT17bm9kZX1cbiAgICAgICAgICB1cGRhdGVBdHRyaWJ1dGVzPXttb2NrVXBkYXRlQXR0cmlidXRlc31cbiAgICAgICAgICBkZWxldGVOb2RlPXttb2NrRGVsZXRlTm9kZX1cbiAgICAgICAgICBvcHRpb25zPXt7fX1cbiAgICAgICAgLz4sXG4gICAgICApO1xuXG4gICAgICAvLyBFbXB0eSBzdHJpbmcgaXMgZmFsc3ksIHNvIGRpYWxvZyBXT1VMRCBvcGVuIHdpdGggY3VycmVudCBpbXBsZW1lbnRhdGlvblxuICAgICAgLy8gVGhpcyBkb2N1bWVudHMgY3VycmVudCBiZWhhdmlvclxuICAgICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndG9vbGJhciBpbnRlcmFjdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJlbmRlciBlZGl0IGFuZCByZW1vdmUgYnV0dG9ucycsICgpID0+IHtcbiAgICAgIGNvbnN0IG5vZGUgPSB7XG4gICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgdHlwZTogJ2F1ZGlvJyxcbiAgICAgICAgICB0YWc6ICdhdWRpbycsXG4gICAgICAgICAgc3JjOiAnaHR0cHM6Ly9leGFtcGxlLmNvbS9hdWRpby5tcDMnLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyKFxuICAgICAgICA8TWVkaWFOb2RlVmlld1xuICAgICAgICAgIGVkaXRvcj17bW9ja0VkaXRvcn1cbiAgICAgICAgICBub2RlPXtub2RlfVxuICAgICAgICAgIHVwZGF0ZUF0dHJpYnV0ZXM9e21vY2tVcGRhdGVBdHRyaWJ1dGVzfVxuICAgICAgICAgIGRlbGV0ZU5vZGU9e21vY2tEZWxldGVOb2RlfVxuICAgICAgICAgIG9wdGlvbnM9e3t9fVxuICAgICAgICAvPixcbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdChnZXRCeVRlc3RJZCgnZWRpdC1idXR0b24nKSkudG9CZVRydXRoeSgpO1xuICAgICAgZXhwZWN0KGdldEJ5VGVzdElkKCdyZW1vdmUtYnV0dG9uJykpLnRvQmVUcnV0aHkoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JlbmRlcmluZycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJlbmRlciBhdWRpbyBlbGVtZW50IHdoZW4gdGFnIGlzIGF1ZGlvJywgKCkgPT4ge1xuICAgICAgY29uc3Qgbm9kZSA9IHtcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICB0eXBlOiAnYXVkaW8nLFxuICAgICAgICAgIHRhZzogJ2F1ZGlvJyxcbiAgICAgICAgICBzcmM6ICdodHRwczovL2V4YW1wbGUuY29tL2F1ZGlvLm1wMycsXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKFxuICAgICAgICA8TWVkaWFOb2RlVmlld1xuICAgICAgICAgIGVkaXRvcj17bW9ja0VkaXRvcn1cbiAgICAgICAgICBub2RlPXtub2RlfVxuICAgICAgICAgIHVwZGF0ZUF0dHJpYnV0ZXM9e21vY2tVcGRhdGVBdHRyaWJ1dGVzfVxuICAgICAgICAgIGRlbGV0ZU5vZGU9e21vY2tEZWxldGVOb2RlfVxuICAgICAgICAgIG9wdGlvbnM9e3t9fVxuICAgICAgICAvPixcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGF1ZGlvID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2F1ZGlvJyk7XG4gICAgICBleHBlY3QoYXVkaW8pLnRvQmVUcnV0aHkoKTtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IGF1ZGlvLnF1ZXJ5U2VsZWN0b3IoJ3NvdXJjZScpO1xuICAgICAgZXhwZWN0KHNvdXJjZS5nZXRBdHRyaWJ1dGUoJ3NyYycpKS50b0JlKCdodHRwczovL2V4YW1wbGUuY29tL2F1ZGlvLm1wMycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZW5kZXIgaWZyYW1lIHdoZW4gdGFnIGlzIGlmcmFtZScsICgpID0+IHtcbiAgICAgIGNvbnN0IG5vZGUgPSB7XG4gICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgdHlwZTogJ3ZpZGVvJyxcbiAgICAgICAgICB0YWc6ICdpZnJhbWUnLFxuICAgICAgICAgIHNyYzogJ2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkL2RRdzR3OVdnWGNRJyxcbiAgICAgICAgICB3aWR0aDogJzY0MCcsXG4gICAgICAgICAgaGVpZ2h0OiAnNDgwJyxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoXG4gICAgICAgIDxNZWRpYU5vZGVWaWV3XG4gICAgICAgICAgZWRpdG9yPXttb2NrRWRpdG9yfVxuICAgICAgICAgIG5vZGU9e25vZGV9XG4gICAgICAgICAgdXBkYXRlQXR0cmlidXRlcz17bW9ja1VwZGF0ZUF0dHJpYnV0ZXN9XG4gICAgICAgICAgZGVsZXRlTm9kZT17bW9ja0RlbGV0ZU5vZGV9XG4gICAgICAgICAgb3B0aW9ucz17e319XG4gICAgICAgIC8+LFxuICAgICAgKTtcblxuICAgICAgY29uc3QgaWZyYW1lID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2lmcmFtZScpO1xuICAgICAgZXhwZWN0KGlmcmFtZSkudG9CZVRydXRoeSgpO1xuICAgICAgZXhwZWN0KGlmcmFtZS5nZXRBdHRyaWJ1dGUoJ3NyYycpKS50b0JlKCdodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC9kUXc0dzlXZ1hjUScpO1xuICAgICAgZXhwZWN0KGlmcmFtZS5nZXRBdHRyaWJ1dGUoJ3dpZHRoJykpLnRvQmUoJzY0MCcpO1xuICAgICAgZXhwZWN0KGlmcmFtZS5nZXRBdHRyaWJ1dGUoJ2hlaWdodCcpKS50b0JlKCc0ODAnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVuZGVyIE1lZGlhVG9vbGJhcicsICgpID0+IHtcbiAgICAgIGNvbnN0IG5vZGUgPSB7XG4gICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgdHlwZTogJ2F1ZGlvJyxcbiAgICAgICAgICB0YWc6ICdhdWRpbycsXG4gICAgICAgICAgc3JjOiAnaHR0cHM6Ly9leGFtcGxlLmNvbS9hdWRpby5tcDMnLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyKFxuICAgICAgICA8TWVkaWFOb2RlVmlld1xuICAgICAgICAgIGVkaXRvcj17bW9ja0VkaXRvcn1cbiAgICAgICAgICBub2RlPXtub2RlfVxuICAgICAgICAgIHVwZGF0ZUF0dHJpYnV0ZXM9e21vY2tVcGRhdGVBdHRyaWJ1dGVzfVxuICAgICAgICAgIGRlbGV0ZU5vZGU9e21vY2tEZWxldGVOb2RlfVxuICAgICAgICAgIG9wdGlvbnM9e3t9fVxuICAgICAgICAvPixcbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdChnZXRCeVRlc3RJZCgnbWVkaWEtdG9vbGJhcicpKS50b0JlVHJ1dGh5KCk7XG4gICAgICBleHBlY3QoZ2V0QnlUZXN0SWQoJ2VkaXQtYnV0dG9uJykpLnRvQmVUcnV0aHkoKTtcbiAgICAgIGV4cGVjdChnZXRCeVRlc3RJZCgncmVtb3ZlLWJ1dHRvbicpKS50b0JlVHJ1dGh5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNhbGwgZGVsZXRlTm9kZSB3aGVuIHJlbW92ZSBidXR0b24gaXMgY2xpY2tlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG5vZGUgPSB7XG4gICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgdHlwZTogJ2F1ZGlvJyxcbiAgICAgICAgICB0YWc6ICdhdWRpbycsXG4gICAgICAgICAgc3JjOiAnaHR0cHM6Ly9leGFtcGxlLmNvbS9hdWRpby5tcDMnLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyKFxuICAgICAgICA8TWVkaWFOb2RlVmlld1xuICAgICAgICAgIGVkaXRvcj17bW9ja0VkaXRvcn1cbiAgICAgICAgICBub2RlPXtub2RlfVxuICAgICAgICAgIHVwZGF0ZUF0dHJpYnV0ZXM9e21vY2tVcGRhdGVBdHRyaWJ1dGVzfVxuICAgICAgICAgIGRlbGV0ZU5vZGU9e21vY2tEZWxldGVOb2RlfVxuICAgICAgICAgIG9wdGlvbnM9e3t9fVxuICAgICAgICAvPixcbiAgICAgICk7XG5cbiAgICAgIGZpcmVFdmVudC5jbGljayhnZXRCeVRlc3RJZCgncmVtb3ZlLWJ1dHRvbicpKTtcblxuICAgICAgZXhwZWN0KG1vY2tEZWxldGVOb2RlKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFvQkEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBQ0Es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