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

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,313 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
5
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
6
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
7
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
8
+ var _state = require("@tiptap/pm/state");
9
+ var _image = require("../image");
10
+ 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; }
11
+ 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; }
12
+ jest.mock('@tiptap/core', function () {
13
+ return {
14
+ Node: {
15
+ create: jest.fn(function (config) {
16
+ return config;
17
+ })
18
+ },
19
+ mergeAttributes: jest.fn(function () {
20
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
21
+ args[_key] = arguments[_key];
22
+ }
23
+ return Object.assign.apply(Object, [{}].concat(args));
24
+ })
25
+ };
26
+ });
27
+ jest.mock('@tiptap/pm/state', function () {
28
+ return {
29
+ Plugin: jest.fn(function MockPlugin(spec) {
30
+ this.spec = spec;
31
+ return {
32
+ spec: spec
33
+ };
34
+ })
35
+ };
36
+ });
37
+ jest.mock('@tiptap/react', function () {
38
+ return {
39
+ ReactNodeViewRenderer: jest.fn(function (component) {
40
+ return component;
41
+ })
42
+ };
43
+ });
44
+ jest.mock('../image-component', function () {
45
+ return {
46
+ __esModule: true,
47
+ "default": jest.fn(function () {
48
+ return /*#__PURE__*/React.createElement("div", {
49
+ "data-testid": "image-component"
50
+ });
51
+ })
52
+ };
53
+ });
54
+ function setupPastePlugin() {
55
+ var insertContent = jest.fn();
56
+ var editor = {
57
+ commands: {
58
+ insertContent: insertContent
59
+ }
60
+ };
61
+ _state.Plugin.mockClear();
62
+ _image.ImageUploadNode.addProseMirrorPlugins.call({
63
+ editor: editor
64
+ });
65
+ expect(_state.Plugin).toHaveBeenCalledTimes(1);
66
+ var handlePaste = _state.Plugin.mock.calls[0][0].props.handlePaste;
67
+ return {
68
+ handlePaste: handlePaste,
69
+ insertContent: insertContent,
70
+ editor: editor
71
+ };
72
+ }
73
+ describe('ImageUploadNode', function () {
74
+ describe('configuration', function () {
75
+ it('has correct name', function () {
76
+ expect(_image.ImageUploadNode.name).toBe('imageUploadNode');
77
+ });
78
+ it('is in block group', function () {
79
+ expect(_image.ImageUploadNode.group).toBe('block');
80
+ });
81
+ it('is atomic', function () {
82
+ expect(_image.ImageUploadNode.atom).toBe(true);
83
+ });
84
+ it('is selectable', function () {
85
+ expect(_image.ImageUploadNode.selectable).toBe(true);
86
+ });
87
+ it('is draggable', function () {
88
+ expect(_image.ImageUploadNode.draggable).toBe(true);
89
+ });
90
+ });
91
+ describe('addAttributes', function () {
92
+ it('returns all required attributes with defaults', function () {
93
+ var attributes = _image.ImageUploadNode.addAttributes();
94
+ expect(attributes).toHaveProperty('loaded');
95
+ expect(attributes).toHaveProperty('deleteStatus');
96
+ expect(attributes).toHaveProperty('alignment');
97
+ expect(attributes).toHaveProperty('percent');
98
+ expect(attributes).toHaveProperty('width');
99
+ expect(attributes).toHaveProperty('height');
100
+ expect(attributes).toHaveProperty('src');
101
+ expect(attributes).toHaveProperty('alt');
102
+ expect(attributes.loaded).toEqual({
103
+ "default": false
104
+ });
105
+ expect(attributes.deleteStatus).toEqual({
106
+ "default": null
107
+ });
108
+ expect(attributes.alignment).toEqual({
109
+ "default": null
110
+ });
111
+ expect(attributes.percent).toEqual({
112
+ "default": null
113
+ });
114
+ expect(attributes.width).toEqual({
115
+ "default": null
116
+ });
117
+ expect(attributes.height).toEqual({
118
+ "default": null
119
+ });
120
+ expect(attributes.src).toEqual({
121
+ "default": null
122
+ });
123
+ expect(attributes.alt).toEqual({
124
+ "default": null
125
+ });
126
+ });
127
+ });
128
+ describe('parseHTML', function () {
129
+ it('returns array with div selector', function () {
130
+ var rules = _image.ImageUploadNode.parseHTML();
131
+ expect(Array.isArray(rules)).toBe(true);
132
+ expect(rules).toHaveLength(1);
133
+ expect(rules[0]).toHaveProperty('tag', 'img[data-type="image-upload-node"]');
134
+ });
135
+ });
136
+ describe('renderHTML', function () {
137
+ it('renders img tag with data-type attribute', function () {
138
+ var HTMLAttributes = {
139
+ src: 'test.jpg',
140
+ width: 100,
141
+ height: 100
142
+ };
143
+ var result = _image.ImageUploadNode.renderHTML({
144
+ HTMLAttributes: HTMLAttributes
145
+ });
146
+ expect(result[0]).toBe('img');
147
+ expect(result[1]).toEqual(_objectSpread(_objectSpread({}, HTMLAttributes), {}, {
148
+ 'data-type': 'image-upload-node'
149
+ }));
150
+ });
151
+ it('merges attributes correctly', function () {
152
+ var HTMLAttributes = {
153
+ src: 'test.jpg',
154
+ alt: 'Test image'
155
+ };
156
+ var result = _image.ImageUploadNode.renderHTML({
157
+ HTMLAttributes: HTMLAttributes
158
+ });
159
+ expect(result[1].src).toBe('test.jpg');
160
+ expect(result[1].alt).toBe('Test image');
161
+ expect(result[1]['data-type']).toBe('image-upload-node');
162
+ });
163
+ });
164
+ describe('addNodeView', function () {
165
+ it('returns ReactNodeViewRenderer result', function () {
166
+ var result = _image.ImageUploadNode.addNodeView();
167
+ expect(result).toBeDefined();
168
+ });
169
+ });
170
+ describe('addCommands', function () {
171
+ it('returns setImageUploadNode command', function () {
172
+ var context = {
173
+ name: 'imageUploadNode'
174
+ };
175
+ var commands = _image.ImageUploadNode.addCommands.call(context);
176
+ expect(commands).toHaveProperty('setImageUploadNode');
177
+ expect((0, _typeof2["default"])(commands.setImageUploadNode)).toBe('function');
178
+ });
179
+ it('setImageUploadNode inserts content', function () {
180
+ var context = {
181
+ name: 'imageUploadNode'
182
+ };
183
+ var commands = _image.ImageUploadNode.addCommands.call(context);
184
+ var mockCommands = {
185
+ insertContent: jest.fn(function () {
186
+ return true;
187
+ })
188
+ };
189
+ var result = commands.setImageUploadNode()({
190
+ commands: mockCommands
191
+ });
192
+ expect(mockCommands.insertContent).toHaveBeenCalledWith(expect.objectContaining({
193
+ type: 'imageUploadNode',
194
+ attrs: expect.objectContaining({
195
+ nodeKey: expect.any(String)
196
+ })
197
+ }));
198
+ expect(result).toBe(true);
199
+ });
200
+ });
201
+ describe('addProseMirrorPlugins', function () {
202
+ var mockView = {};
203
+ beforeEach(function () {
204
+ jest.spyOn(global, 'FileReader').mockImplementation(function MockFileReader() {
205
+ this.readAsDataURL = function readAsDataURL() {
206
+ var _this = this;
207
+ this.result = 'data:image/png;base64,Zm9v';
208
+ queueMicrotask(function () {
209
+ if (_this.onload) {
210
+ _this.onload();
211
+ }
212
+ });
213
+ };
214
+ });
215
+ });
216
+ afterEach(function () {
217
+ global.FileReader.mockRestore();
218
+ });
219
+ it('registers one paste plugin', function () {
220
+ var insertContent = jest.fn();
221
+ var editor = {
222
+ commands: {
223
+ insertContent: insertContent
224
+ }
225
+ };
226
+ _state.Plugin.mockClear();
227
+ var plugins = _image.ImageUploadNode.addProseMirrorPlugins.call({
228
+ editor: editor
229
+ });
230
+ expect(plugins).toHaveLength(1);
231
+ expect(_state.Plugin).toHaveBeenCalledTimes(1);
232
+ });
233
+ it('handlePaste returns false when clipboard has no image file', function () {
234
+ var _setupPastePlugin = setupPastePlugin(),
235
+ handlePaste = _setupPastePlugin.handlePaste;
236
+ var event = {
237
+ clipboardData: {
238
+ items: [{
239
+ kind: 'string',
240
+ type: 'text/plain',
241
+ getAsFile: function getAsFile() {
242
+ return null;
243
+ }
244
+ }]
245
+ }
246
+ };
247
+ expect(handlePaste(mockView, event)).toBe(false);
248
+ });
249
+ it('handlePaste returns false when clipboardData is missing', function () {
250
+ var _setupPastePlugin2 = setupPastePlugin(),
251
+ handlePaste = _setupPastePlugin2.handlePaste;
252
+ var event = {};
253
+ expect(handlePaste(mockView, event)).toBe(false);
254
+ });
255
+ it('handlePaste returns false when the file item has no file', function () {
256
+ var _setupPastePlugin3 = setupPastePlugin(),
257
+ handlePaste = _setupPastePlugin3.handlePaste;
258
+ var event = {
259
+ clipboardData: {
260
+ items: [{
261
+ kind: 'file',
262
+ type: 'image/png',
263
+ getAsFile: function getAsFile() {
264
+ return null;
265
+ }
266
+ }]
267
+ }
268
+ };
269
+ expect(handlePaste(mockView, event)).toBe(false);
270
+ });
271
+ it('handlePaste returns true and inserts imageUploadNode with data URL after read', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
272
+ var _setupPastePlugin4, handlePaste, insertContent, file, event;
273
+ return _regenerator["default"].wrap(function (_context) {
274
+ while (1) switch (_context.prev = _context.next) {
275
+ case 0:
276
+ _setupPastePlugin4 = setupPastePlugin(), handlePaste = _setupPastePlugin4.handlePaste, insertContent = _setupPastePlugin4.insertContent;
277
+ file = new File([new Uint8Array([1, 2, 3])], 'p.png', {
278
+ type: 'image/png'
279
+ });
280
+ event = {
281
+ clipboardData: {
282
+ items: [{
283
+ kind: 'file',
284
+ type: 'image/png',
285
+ getAsFile: function getAsFile() {
286
+ return file;
287
+ }
288
+ }]
289
+ }
290
+ };
291
+ expect(handlePaste(mockView, event)).toBe(true);
292
+ expect(insertContent).not.toHaveBeenCalled();
293
+ _context.next = 1;
294
+ return new Promise(function (resolve) {
295
+ return queueMicrotask(resolve);
296
+ });
297
+ case 1:
298
+ expect(insertContent).toHaveBeenCalledWith(expect.objectContaining({
299
+ type: 'imageUploadNode',
300
+ attrs: expect.objectContaining({
301
+ src: 'data:image/png;base64,Zm9v',
302
+ loaded: true
303
+ })
304
+ }));
305
+ case 2:
306
+ case "end":
307
+ return _context.stop();
308
+ }
309
+ }, _callee);
310
+ })));
311
+ });
312
+ });
313
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc3RhdGUiLCJyZXF1aXJlIiwiX2ltYWdlIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJqZXN0IiwibW9jayIsIk5vZGUiLCJjcmVhdGUiLCJmbiIsImNvbmZpZyIsIm1lcmdlQXR0cmlidXRlcyIsIl9sZW4iLCJhcmdzIiwiQXJyYXkiLCJfa2V5IiwiYXNzaWduIiwiY29uY2F0IiwiUGx1Z2luIiwiTW9ja1BsdWdpbiIsInNwZWMiLCJSZWFjdE5vZGVWaWV3UmVuZGVyZXIiLCJjb21wb25lbnQiLCJfX2VzTW9kdWxlIiwiUmVhY3QiLCJjcmVhdGVFbGVtZW50Iiwic2V0dXBQYXN0ZVBsdWdpbiIsImluc2VydENvbnRlbnQiLCJlZGl0b3IiLCJjb21tYW5kcyIsIm1vY2tDbGVhciIsIkltYWdlVXBsb2FkTm9kZSIsImFkZFByb3NlTWlycm9yUGx1Z2lucyIsImNhbGwiLCJleHBlY3QiLCJ0b0hhdmVCZWVuQ2FsbGVkVGltZXMiLCJoYW5kbGVQYXN0ZSIsImNhbGxzIiwicHJvcHMiLCJkZXNjcmliZSIsIml0IiwibmFtZSIsInRvQmUiLCJncm91cCIsImF0b20iLCJzZWxlY3RhYmxlIiwiZHJhZ2dhYmxlIiwiYXR0cmlidXRlcyIsImFkZEF0dHJpYnV0ZXMiLCJ0b0hhdmVQcm9wZXJ0eSIsImxvYWRlZCIsInRvRXF1YWwiLCJkZWxldGVTdGF0dXMiLCJhbGlnbm1lbnQiLCJwZXJjZW50Iiwid2lkdGgiLCJoZWlnaHQiLCJzcmMiLCJhbHQiLCJydWxlcyIsInBhcnNlSFRNTCIsImlzQXJyYXkiLCJ0b0hhdmVMZW5ndGgiLCJIVE1MQXR0cmlidXRlcyIsInJlc3VsdCIsInJlbmRlckhUTUwiLCJhZGROb2RlVmlldyIsInRvQmVEZWZpbmVkIiwiY29udGV4dCIsImFkZENvbW1hbmRzIiwiX3R5cGVvZjIiLCJzZXRJbWFnZVVwbG9hZE5vZGUiLCJtb2NrQ29tbWFuZHMiLCJ0b0hhdmVCZWVuQ2FsbGVkV2l0aCIsIm9iamVjdENvbnRhaW5pbmciLCJ0eXBlIiwiYXR0cnMiLCJub2RlS2V5IiwiYW55IiwiU3RyaW5nIiwibW9ja1ZpZXciLCJiZWZvcmVFYWNoIiwic3B5T24iLCJnbG9iYWwiLCJtb2NrSW1wbGVtZW50YXRpb24iLCJNb2NrRmlsZVJlYWRlciIsInJlYWRBc0RhdGFVUkwiLCJfdGhpcyIsInF1ZXVlTWljcm90YXNrIiwib25sb2FkIiwiYWZ0ZXJFYWNoIiwiRmlsZVJlYWRlciIsIm1vY2tSZXN0b3JlIiwicGx1Z2lucyIsIl9zZXR1cFBhc3RlUGx1Z2luIiwiZXZlbnQiLCJjbGlwYm9hcmREYXRhIiwiaXRlbXMiLCJraW5kIiwiZ2V0QXNGaWxlIiwiX3NldHVwUGFzdGVQbHVnaW4yIiwiX3NldHVwUGFzdGVQbHVnaW4zIiwiX2FzeW5jVG9HZW5lcmF0b3IyIiwiX3JlZ2VuZXJhdG9yIiwibWFyayIsIl9jYWxsZWUiLCJfc2V0dXBQYXN0ZVBsdWdpbjQiLCJmaWxlIiwid3JhcCIsIl9jb250ZXh0IiwicHJldiIsIm5leHQiLCJGaWxlIiwiVWludDhBcnJheSIsIm5vdCIsInRvSGF2ZUJlZW5DYWxsZWQiLCJQcm9taXNlIiwicmVzb2x2ZSIsInN0b3AiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZXh0ZW5zaW9ucy9fX3Rlc3RzX18vaW1hZ2UudGVzdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJqZXN0Lm1vY2soJ0B0aXB0YXAvY29yZScsICgpID0+ICh7XG4gIE5vZGU6IHsgY3JlYXRlOiBqZXN0LmZuKChjb25maWcpID0+IGNvbmZpZykgfSxcbiAgbWVyZ2VBdHRyaWJ1dGVzOiBqZXN0LmZuKCguLi5hcmdzKSA9PiBPYmplY3QuYXNzaWduKHt9LCAuLi5hcmdzKSksXG59KSk7XG5cbmplc3QubW9jaygnQHRpcHRhcC9wbS9zdGF0ZScsICgpID0+ICh7XG4gIFBsdWdpbjogamVzdC5mbihmdW5jdGlvbiBNb2NrUGx1Z2luKHNwZWMpIHtcbiAgICB0aGlzLnNwZWMgPSBzcGVjO1xuICAgIHJldHVybiB7IHNwZWMgfTtcbiAgfSksXG59KSk7XG5cbmplc3QubW9jaygnQHRpcHRhcC9yZWFjdCcsICgpID0+ICh7XG4gIFJlYWN0Tm9kZVZpZXdSZW5kZXJlcjogamVzdC5mbigoY29tcG9uZW50KSA9PiBjb21wb25lbnQpLFxufSkpO1xuXG5qZXN0Lm1vY2soJy4uL2ltYWdlLWNvbXBvbmVudCcsICgpID0+ICh7XG4gIF9fZXNNb2R1bGU6IHRydWUsXG4gIGRlZmF1bHQ6IGplc3QuZm4oKCkgPT4gPGRpdiBkYXRhLXRlc3RpZD1cImltYWdlLWNvbXBvbmVudFwiIC8+KSxcbn0pKTtcblxuaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSAnQHRpcHRhcC9wbS9zdGF0ZSc7XG5pbXBvcnQgeyBJbWFnZVVwbG9hZE5vZGUgfSBmcm9tICcuLi9pbWFnZSc7XG5cbmZ1bmN0aW9uIHNldHVwUGFzdGVQbHVnaW4oKSB7XG4gIGNvbnN0IGluc2VydENvbnRlbnQgPSBqZXN0LmZuKCk7XG4gIGNvbnN0IGVkaXRvciA9IHsgY29tbWFuZHM6IHsgaW5zZXJ0Q29udGVudCB9IH07XG4gIFBsdWdpbi5tb2NrQ2xlYXIoKTtcbiAgSW1hZ2VVcGxvYWROb2RlLmFkZFByb3NlTWlycm9yUGx1Z2lucy5jYWxsKHsgZWRpdG9yIH0pO1xuICBleHBlY3QoUGx1Z2luKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gIGNvbnN0IGhhbmRsZVBhc3RlID0gUGx1Z2luLm1vY2suY2FsbHNbMF1bMF0ucHJvcHMuaGFuZGxlUGFzdGU7XG4gIHJldHVybiB7IGhhbmRsZVBhc3RlLCBpbnNlcnRDb250ZW50LCBlZGl0b3IgfTtcbn1cblxuZGVzY3JpYmUoJ0ltYWdlVXBsb2FkTm9kZScsICgpID0+IHtcbiAgZGVzY3JpYmUoJ2NvbmZpZ3VyYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ2hhcyBjb3JyZWN0IG5hbWUnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoSW1hZ2VVcGxvYWROb2RlLm5hbWUpLnRvQmUoJ2ltYWdlVXBsb2FkTm9kZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2lzIGluIGJsb2NrIGdyb3VwJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KEltYWdlVXBsb2FkTm9kZS5ncm91cCkudG9CZSgnYmxvY2snKTtcbiAgICB9KTtcblxuICAgIGl0KCdpcyBhdG9taWMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoSW1hZ2VVcGxvYWROb2RlLmF0b20pLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaXMgc2VsZWN0YWJsZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChJbWFnZVVwbG9hZE5vZGUuc2VsZWN0YWJsZSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdpcyBkcmFnZ2FibGUnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoSW1hZ2VVcGxvYWROb2RlLmRyYWdnYWJsZSkudG9CZSh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2FkZEF0dHJpYnV0ZXMnLCAoKSA9PiB7XG4gICAgaXQoJ3JldHVybnMgYWxsIHJlcXVpcmVkIGF0dHJpYnV0ZXMgd2l0aCBkZWZhdWx0cycsICgpID0+IHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBJbWFnZVVwbG9hZE5vZGUuYWRkQXR0cmlidXRlcygpO1xuXG4gICAgICBleHBlY3QoYXR0cmlidXRlcykudG9IYXZlUHJvcGVydHkoJ2xvYWRlZCcpO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMpLnRvSGF2ZVByb3BlcnR5KCdkZWxldGVTdGF0dXMnKTtcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzKS50b0hhdmVQcm9wZXJ0eSgnYWxpZ25tZW50Jyk7XG4gICAgICBleHBlY3QoYXR0cmlidXRlcykudG9IYXZlUHJvcGVydHkoJ3BlcmNlbnQnKTtcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzKS50b0hhdmVQcm9wZXJ0eSgnd2lkdGgnKTtcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzKS50b0hhdmVQcm9wZXJ0eSgnaGVpZ2h0Jyk7XG4gICAgICBleHBlY3QoYXR0cmlidXRlcykudG9IYXZlUHJvcGVydHkoJ3NyYycpO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMpLnRvSGF2ZVByb3BlcnR5KCdhbHQnKTtcblxuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMubG9hZGVkKS50b0VxdWFsKHsgZGVmYXVsdDogZmFsc2UgfSk7XG4gICAgICBleHBlY3QoYXR0cmlidXRlcy5kZWxldGVTdGF0dXMpLnRvRXF1YWwoeyBkZWZhdWx0OiBudWxsIH0pO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMuYWxpZ25tZW50KS50b0VxdWFsKHsgZGVmYXVsdDogbnVsbCB9KTtcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzLnBlcmNlbnQpLnRvRXF1YWwoeyBkZWZhdWx0OiBudWxsIH0pO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMud2lkdGgpLnRvRXF1YWwoeyBkZWZhdWx0OiBudWxsIH0pO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMuaGVpZ2h0KS50b0VxdWFsKHsgZGVmYXVsdDogbnVsbCB9KTtcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzLnNyYykudG9FcXVhbCh7IGRlZmF1bHQ6IG51bGwgfSk7XG4gICAgICBleHBlY3QoYXR0cmlidXRlcy5hbHQpLnRvRXF1YWwoeyBkZWZhdWx0OiBudWxsIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncGFyc2VIVE1MJywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIGFycmF5IHdpdGggZGl2IHNlbGVjdG9yJywgKCkgPT4ge1xuICAgICAgY29uc3QgcnVsZXMgPSBJbWFnZVVwbG9hZE5vZGUucGFyc2VIVE1MKCk7XG5cbiAgICAgIGV4cGVjdChBcnJheS5pc0FycmF5KHJ1bGVzKSkudG9CZSh0cnVlKTtcbiAgICAgIGV4cGVjdChydWxlcykudG9IYXZlTGVuZ3RoKDEpO1xuICAgICAgZXhwZWN0KHJ1bGVzWzBdKS50b0hhdmVQcm9wZXJ0eSgndGFnJywgJ2ltZ1tkYXRhLXR5cGU9XCJpbWFnZS11cGxvYWQtbm9kZVwiXScpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncmVuZGVySFRNTCcsICgpID0+IHtcbiAgICBpdCgncmVuZGVycyBpbWcgdGFnIHdpdGggZGF0YS10eXBlIGF0dHJpYnV0ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IEhUTUxBdHRyaWJ1dGVzID0ge1xuICAgICAgICBzcmM6ICd0ZXN0LmpwZycsXG4gICAgICAgIHdpZHRoOiAxMDAsXG4gICAgICAgIGhlaWdodDogMTAwLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gSW1hZ2VVcGxvYWROb2RlLnJlbmRlckhUTUwoeyBIVE1MQXR0cmlidXRlcyB9KTtcblxuICAgICAgZXhwZWN0KHJlc3VsdFswXSkudG9CZSgnaW1nJyk7XG4gICAgICBleHBlY3QocmVzdWx0WzFdKS50b0VxdWFsKHtcbiAgICAgICAgLi4uSFRNTEF0dHJpYnV0ZXMsXG4gICAgICAgICdkYXRhLXR5cGUnOiAnaW1hZ2UtdXBsb2FkLW5vZGUnLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnbWVyZ2VzIGF0dHJpYnV0ZXMgY29ycmVjdGx5JywgKCkgPT4ge1xuICAgICAgY29uc3QgSFRNTEF0dHJpYnV0ZXMgPSB7XG4gICAgICAgIHNyYzogJ3Rlc3QuanBnJyxcbiAgICAgICAgYWx0OiAnVGVzdCBpbWFnZScsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBJbWFnZVVwbG9hZE5vZGUucmVuZGVySFRNTCh7IEhUTUxBdHRyaWJ1dGVzIH0pO1xuXG4gICAgICBleHBlY3QocmVzdWx0WzFdLnNyYykudG9CZSgndGVzdC5qcGcnKTtcbiAgICAgIGV4cGVjdChyZXN1bHRbMV0uYWx0KS50b0JlKCdUZXN0IGltYWdlJyk7XG4gICAgICBleHBlY3QocmVzdWx0WzFdWydkYXRhLXR5cGUnXSkudG9CZSgnaW1hZ2UtdXBsb2FkLW5vZGUnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2FkZE5vZGVWaWV3JywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIFJlYWN0Tm9kZVZpZXdSZW5kZXJlciByZXN1bHQnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBJbWFnZVVwbG9hZE5vZGUuYWRkTm9kZVZpZXcoKTtcblxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZURlZmluZWQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2FkZENvbW1hbmRzJywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIHNldEltYWdlVXBsb2FkTm9kZSBjb21tYW5kJywgKCkgPT4ge1xuICAgICAgY29uc3QgY29udGV4dCA9IHsgbmFtZTogJ2ltYWdlVXBsb2FkTm9kZScgfTtcbiAgICAgIGNvbnN0IGNvbW1hbmRzID0gSW1hZ2VVcGxvYWROb2RlLmFkZENvbW1hbmRzLmNhbGwoY29udGV4dCk7XG5cbiAgICAgIGV4cGVjdChjb21tYW5kcykudG9IYXZlUHJvcGVydHkoJ3NldEltYWdlVXBsb2FkTm9kZScpO1xuICAgICAgZXhwZWN0KHR5cGVvZiBjb21tYW5kcy5zZXRJbWFnZVVwbG9hZE5vZGUpLnRvQmUoJ2Z1bmN0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2V0SW1hZ2VVcGxvYWROb2RlIGluc2VydHMgY29udGVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB7IG5hbWU6ICdpbWFnZVVwbG9hZE5vZGUnIH07XG4gICAgICBjb25zdCBjb21tYW5kcyA9IEltYWdlVXBsb2FkTm9kZS5hZGRDb21tYW5kcy5jYWxsKGNvbnRleHQpO1xuICAgICAgY29uc3QgbW9ja0NvbW1hbmRzID0ge1xuICAgICAgICBpbnNlcnRDb250ZW50OiBqZXN0LmZuKCgpID0+IHRydWUpLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbW1hbmRzLnNldEltYWdlVXBsb2FkTm9kZSgpKHsgY29tbWFuZHM6IG1vY2tDb21tYW5kcyB9KTtcbiAgICAgIGV4cGVjdChtb2NrQ29tbWFuZHMuaW5zZXJ0Q29udGVudCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICB0eXBlOiAnaW1hZ2VVcGxvYWROb2RlJyxcbiAgICAgICAgICBhdHRyczogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoeyBub2RlS2V5OiBleHBlY3QuYW55KFN0cmluZykgfSksXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhZGRQcm9zZU1pcnJvclBsdWdpbnMnLCAoKSA9PiB7XG4gICAgY29uc3QgbW9ja1ZpZXcgPSB7fTtcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgamVzdC5zcHlPbihnbG9iYWwsICdGaWxlUmVhZGVyJykubW9ja0ltcGxlbWVudGF0aW9uKGZ1bmN0aW9uIE1vY2tGaWxlUmVhZGVyKCkge1xuICAgICAgICB0aGlzLnJlYWRBc0RhdGFVUkwgPSBmdW5jdGlvbiByZWFkQXNEYXRhVVJMKCkge1xuICAgICAgICAgIHRoaXMucmVzdWx0ID0gJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxabTl2JztcbiAgICAgICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5vbmxvYWQpIHtcbiAgICAgICAgICAgICAgdGhpcy5vbmxvYWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgIGdsb2JhbC5GaWxlUmVhZGVyLm1vY2tSZXN0b3JlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVnaXN0ZXJzIG9uZSBwYXN0ZSBwbHVnaW4nLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnNlcnRDb250ZW50ID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgZWRpdG9yID0geyBjb21tYW5kczogeyBpbnNlcnRDb250ZW50IH0gfTtcbiAgICAgIFBsdWdpbi5tb2NrQ2xlYXIoKTtcbiAgICAgIGNvbnN0IHBsdWdpbnMgPSBJbWFnZVVwbG9hZE5vZGUuYWRkUHJvc2VNaXJyb3JQbHVnaW5zLmNhbGwoeyBlZGl0b3IgfSk7XG4gICAgICBleHBlY3QocGx1Z2lucykudG9IYXZlTGVuZ3RoKDEpO1xuICAgICAgZXhwZWN0KFBsdWdpbikudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZVBhc3RlIHJldHVybnMgZmFsc2Ugd2hlbiBjbGlwYm9hcmQgaGFzIG5vIGltYWdlIGZpbGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGhhbmRsZVBhc3RlIH0gPSBzZXR1cFBhc3RlUGx1Z2luKCk7XG4gICAgICBjb25zdCBldmVudCA9IHtcbiAgICAgICAgY2xpcGJvYXJkRGF0YToge1xuICAgICAgICAgIGl0ZW1zOiBbeyBraW5kOiAnc3RyaW5nJywgdHlwZTogJ3RleHQvcGxhaW4nLCBnZXRBc0ZpbGU6ICgpID0+IG51bGwgfV0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgZXhwZWN0KGhhbmRsZVBhc3RlKG1vY2tWaWV3LCBldmVudCkpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZVBhc3RlIHJldHVybnMgZmFsc2Ugd2hlbiBjbGlwYm9hcmREYXRhIGlzIG1pc3NpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGhhbmRsZVBhc3RlIH0gPSBzZXR1cFBhc3RlUGx1Z2luKCk7XG4gICAgICBjb25zdCBldmVudCA9IHt9O1xuICAgICAgZXhwZWN0KGhhbmRsZVBhc3RlKG1vY2tWaWV3LCBldmVudCkpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZVBhc3RlIHJldHVybnMgZmFsc2Ugd2hlbiB0aGUgZmlsZSBpdGVtIGhhcyBubyBmaWxlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBoYW5kbGVQYXN0ZSB9ID0gc2V0dXBQYXN0ZVBsdWdpbigpO1xuICAgICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICAgIGNsaXBib2FyZERhdGE6IHtcbiAgICAgICAgICBpdGVtczogW3sga2luZDogJ2ZpbGUnLCB0eXBlOiAnaW1hZ2UvcG5nJywgZ2V0QXNGaWxlOiAoKSA9PiBudWxsIH1dLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGV4cGVjdChoYW5kbGVQYXN0ZShtb2NrVmlldywgZXZlbnQpKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVQYXN0ZSByZXR1cm5zIHRydWUgYW5kIGluc2VydHMgaW1hZ2VVcGxvYWROb2RlIHdpdGggZGF0YSBVUkwgYWZ0ZXIgcmVhZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHsgaGFuZGxlUGFzdGUsIGluc2VydENvbnRlbnQgfSA9IHNldHVwUGFzdGVQbHVnaW4oKTtcbiAgICAgIGNvbnN0IGZpbGUgPSBuZXcgRmlsZShbbmV3IFVpbnQ4QXJyYXkoWzEsIDIsIDNdKV0sICdwLnBuZycsIHsgdHlwZTogJ2ltYWdlL3BuZycgfSk7XG4gICAgICBjb25zdCBldmVudCA9IHtcbiAgICAgICAgY2xpcGJvYXJkRGF0YToge1xuICAgICAgICAgIGl0ZW1zOiBbeyBraW5kOiAnZmlsZScsIHR5cGU6ICdpbWFnZS9wbmcnLCBnZXRBc0ZpbGU6ICgpID0+IGZpbGUgfV0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICBleHBlY3QoaGFuZGxlUGFzdGUobW9ja1ZpZXcsIGV2ZW50KSkudG9CZSh0cnVlKTtcbiAgICAgIGV4cGVjdChpbnNlcnRDb250ZW50KS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gcXVldWVNaWNyb3Rhc2socmVzb2x2ZSkpO1xuXG4gICAgICBleHBlY3QoaW5zZXJ0Q29udGVudCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICB0eXBlOiAnaW1hZ2VVcGxvYWROb2RlJyxcbiAgICAgICAgICBhdHRyczogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgc3JjOiAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LFptOXYnLFxuICAgICAgICAgICAgbG9hZGVkOiB0cnVlLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFxQkEsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsTUFBQSxHQUFBRCxPQUFBO0FBQTJDLFNBQUFFLFFBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsSUFBQSxDQUFBSixDQUFBLE9BQUFHLE1BQUEsQ0FBQUUscUJBQUEsUUFBQUMsQ0FBQSxHQUFBSCxNQUFBLENBQUFFLHFCQUFBLENBQUFMLENBQUEsR0FBQUMsQ0FBQSxLQUFBSyxDQUFBLEdBQUFBLENBQUEsQ0FBQUMsTUFBQSxXQUFBTixDQUFBLFdBQUFFLE1BQUEsQ0FBQUssd0JBQUEsQ0FBQVIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFRLFVBQUEsT0FBQVAsQ0FBQSxDQUFBUSxJQUFBLENBQUFDLEtBQUEsQ0FBQVQsQ0FBQSxFQUFBSSxDQUFBLFlBQUFKLENBQUE7QUFBQSxTQUFBVSxjQUFBWixDQUFBLGFBQUFDLENBQUEsTUFBQUEsQ0FBQSxHQUFBWSxTQUFBLENBQUFDLE1BQUEsRUFBQWIs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