@pie-lib/editable-html-tip-tap 1.0.5 → 1.0.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 (112) hide show
  1. package/lib/constants.js +2 -5
  2. package/package.json +3 -3
  3. package/src/constants.js +0 -2
  4. package/lib/__tests__/editor.test.js +0 -470
  5. package/lib/__tests__/serialization.test.js +0 -246
  6. package/lib/block-tags.js +0 -25
  7. package/lib/components/CharacterPicker.js.map +0 -1
  8. package/lib/components/EditableHtml.js.map +0 -1
  9. package/lib/components/MenuBar.js.map +0 -1
  10. package/lib/components/TiptapContainer.js.map +0 -1
  11. package/lib/components/buttons/done-button.js +0 -53
  12. package/lib/components/characters/characterUtils.js.map +0 -1
  13. package/lib/components/characters/custom-popper.js.map +0 -1
  14. package/lib/components/common/done-button.js.map +0 -1
  15. package/lib/components/common/toolbar-buttons.js.map +0 -1
  16. package/lib/components/icons/CssIcon.js.map +0 -1
  17. package/lib/components/icons/RespArea.js.map +0 -1
  18. package/lib/components/icons/TableIcons.js.map +0 -1
  19. package/lib/components/icons/TextAlign.js.map +0 -1
  20. package/lib/components/icons/index.js +0 -194
  21. package/lib/components/image/AltDialog.js.map +0 -1
  22. package/lib/components/image/ImageToolbar.js.map +0 -1
  23. package/lib/components/image/InsertImageHandler.js.map +0 -1
  24. package/lib/components/image/alt-dialog.js +0 -2
  25. package/lib/components/media/MediaDialog.js.map +0 -1
  26. package/lib/components/media/MediaToolbar.js.map +0 -1
  27. package/lib/components/media/MediaWrapper.js.map +0 -1
  28. package/lib/components/respArea/DragInTheBlank/DragInTheBlank.js.map +0 -1
  29. package/lib/components/respArea/DragInTheBlank/choice.js.map +0 -1
  30. package/lib/components/respArea/DragInTheBlank.js +0 -94
  31. package/lib/components/respArea/ExplicitConstructedResponse.js.map +0 -1
  32. package/lib/components/respArea/InlineDropdown.js.map +0 -1
  33. package/lib/components/respArea/ToolbarIcon.js.map +0 -1
  34. package/lib/components/respArea/choice.js +0 -2
  35. package/lib/constants.js.map +0 -1
  36. package/lib/editor.js +0 -1356
  37. package/lib/extensions/MediaView.js +0 -112
  38. package/lib/extensions/characters.js +0 -65
  39. package/lib/extensions/component.js.map +0 -1
  40. package/lib/extensions/css.js.map +0 -1
  41. package/lib/extensions/custom-toolbar-wrapper.js.map +0 -1
  42. package/lib/extensions/extended-table.js.map +0 -1
  43. package/lib/extensions/image.js.map +0 -1
  44. package/lib/extensions/index.js.map +0 -1
  45. package/lib/extensions/math.js.map +0 -1
  46. package/lib/extensions/media.js.map +0 -1
  47. package/lib/extensions/responseArea.js.map +0 -1
  48. package/lib/index.js.map +0 -1
  49. package/lib/old-index.js +0 -269
  50. package/lib/parse-html.js +0 -16
  51. package/lib/plugins/characters/custom-popper.js +0 -73
  52. package/lib/plugins/characters/index.js +0 -305
  53. package/lib/plugins/characters/utils.js +0 -381
  54. package/lib/plugins/css/icons/index.js +0 -37
  55. package/lib/plugins/css/index.js +0 -390
  56. package/lib/plugins/customPlugin/index.js +0 -114
  57. package/lib/plugins/html/icons/index.js +0 -38
  58. package/lib/plugins/html/index.js +0 -81
  59. package/lib/plugins/image/__tests__/component.test.js +0 -51
  60. package/lib/plugins/image/__tests__/image-toolbar-logic.test.js +0 -56
  61. package/lib/plugins/image/__tests__/image-toolbar.test.js +0 -26
  62. package/lib/plugins/image/__tests__/index.test.js +0 -98
  63. package/lib/plugins/image/__tests__/insert-image-handler.test.js +0 -125
  64. package/lib/plugins/image/__tests__/mock-change.js +0 -25
  65. package/lib/plugins/image/alt-dialog.js +0 -129
  66. package/lib/plugins/image/component.js +0 -419
  67. package/lib/plugins/image/image-toolbar.js +0 -177
  68. package/lib/plugins/image/index.js +0 -263
  69. package/lib/plugins/image/insert-image-handler.js +0 -117
  70. package/lib/plugins/index.js +0 -341
  71. package/lib/plugins/list/__tests__/index.test.js +0 -79
  72. package/lib/plugins/list/index.js +0 -334
  73. package/lib/plugins/math/__tests__/index.test.js +0 -300
  74. package/lib/plugins/math/index.js +0 -454
  75. package/lib/plugins/media/__tests__/index.test.js +0 -71
  76. package/lib/plugins/media/index.js +0 -387
  77. package/lib/plugins/media/media-dialog.js +0 -709
  78. package/lib/plugins/media/media-toolbar.js +0 -101
  79. package/lib/plugins/media/media-wrapper.js +0 -93
  80. package/lib/plugins/rendering/index.js +0 -46
  81. package/lib/plugins/respArea/drag-in-the-blank/choice.js +0 -289
  82. package/lib/plugins/respArea/drag-in-the-blank/index.js +0 -94
  83. package/lib/plugins/respArea/explicit-constructed-response/index.js +0 -120
  84. package/lib/plugins/respArea/icons/index.js +0 -95
  85. package/lib/plugins/respArea/index.js +0 -341
  86. package/lib/plugins/respArea/inline-dropdown/index.js +0 -126
  87. package/lib/plugins/respArea/math-templated/index.js +0 -130
  88. package/lib/plugins/respArea/utils.js +0 -125
  89. package/lib/plugins/table/CustomTablePlugin.js +0 -133
  90. package/lib/plugins/table/__tests__/index.test.js +0 -442
  91. package/lib/plugins/table/__tests__/table-toolbar.test.js +0 -54
  92. package/lib/plugins/table/icons/index.js +0 -69
  93. package/lib/plugins/table/index.js +0 -483
  94. package/lib/plugins/table/table-toolbar.js +0 -187
  95. package/lib/plugins/textAlign/icons/index.js +0 -194
  96. package/lib/plugins/textAlign/index.js +0 -34
  97. package/lib/plugins/toolbar/__tests__/default-toolbar.test.js +0 -128
  98. package/lib/plugins/toolbar/__tests__/editor-and-toolbar.test.js +0 -51
  99. package/lib/plugins/toolbar/__tests__/toolbar-buttons.test.js +0 -54
  100. package/lib/plugins/toolbar/__tests__/toolbar.test.js +0 -120
  101. package/lib/plugins/toolbar/default-toolbar.js +0 -229
  102. package/lib/plugins/toolbar/done-button.js +0 -53
  103. package/lib/plugins/toolbar/editor-and-toolbar.js +0 -286
  104. package/lib/plugins/toolbar/index.js +0 -34
  105. package/lib/plugins/toolbar/toolbar-buttons.js +0 -194
  106. package/lib/plugins/toolbar/toolbar.js +0 -376
  107. package/lib/plugins/utils.js +0 -62
  108. package/lib/serialization.js +0 -677
  109. package/lib/shared/alert-dialog.js +0 -75
  110. package/lib/styles/editorContainerStyles.js.map +0 -1
  111. package/lib/theme.js.map +0 -1
  112. package/lib/utils/size.js.map +0 -1
@@ -1,677 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.valueToHtml = exports.reduceMultipleBrs = exports.reactAttributes = exports.parseStyleString = exports.htmlToValue = exports.handleHtml = exports.getBase64 = exports.extraCSSRulesOpts = exports.TEXT_RULE = exports.INLINE_TAGS = void 0;
9
-
10
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
-
12
- var _slateHtmlSerializer = _interopRequireDefault(require("slate-html-serializer"));
13
-
14
- var _react = _interopRequireDefault(require("react"));
15
-
16
- var _debug = _interopRequireDefault(require("debug"));
17
-
18
- var _toStyle = require("to-style");
19
-
20
- var _isEmpty = _interopRequireDefault(require("lodash/isEmpty"));
21
-
22
- var _image = require("./plugins/image");
23
-
24
- var _math = require("./plugins/math");
25
-
26
- var _media = require("./plugins/media");
27
-
28
- var _list = require("./plugins/list");
29
-
30
- var _table = require("./plugins/table");
31
-
32
- var _respArea = require("./plugins/respArea");
33
-
34
- var _slate = require("slate");
35
-
36
- var _blockTags = require("./block-tags");
37
-
38
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
39
-
40
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
41
-
42
- var log = (0, _debug["default"])('@pie-lib:editable-html:serialization');
43
- /**
44
- * Tags to marks.
45
- *
46
- * @type {Object}
47
- */
48
-
49
- var MARK_TAGS = {
50
- b: 'bold',
51
- em: 'italic',
52
- u: 'underline',
53
- s: 'strikethrough',
54
- code: 'code',
55
- strong: 'bold',
56
- blockquote: 'blockquote',
57
- h3: 'h3',
58
- sup: 'sup',
59
- sub: 'sub'
60
- };
61
-
62
- var parseStyleString = function parseStyleString(s) {
63
- var regex = /([\w-]*)\s*:\s*([^;]*)/g;
64
- var match;
65
- var result = {};
66
-
67
- while (match = regex.exec(s)) {
68
- result[match[1]] = match[2].trim();
69
- }
70
-
71
- return result;
72
- };
73
-
74
- exports.parseStyleString = parseStyleString;
75
-
76
- var getBase64 = function getBase64(file) {
77
- return new Promise(function (resolve, reject) {
78
- var reader = new FileReader();
79
- reader.readAsDataURL(file);
80
-
81
- reader.onload = function () {
82
- return resolve(reader.result);
83
- };
84
-
85
- reader.onerror = function (error) {
86
- return reject(error);
87
- };
88
- });
89
- };
90
-
91
- exports.getBase64 = getBase64;
92
-
93
- var reactAttributes = function reactAttributes(o) {
94
- return (0, _toStyle.object)(o, {
95
- camelize: true,
96
- addUnits: false
97
- });
98
- };
99
-
100
- exports.reactAttributes = reactAttributes;
101
-
102
- var attributesToMap = function attributesToMap(el) {
103
- return function (acc, attribute) {
104
- var value = el.getAttribute(attribute);
105
-
106
- if (value) {
107
- if (attribute === 'style') {
108
- var styleString = el.getAttribute(attribute);
109
- var reactStyleObject = reactAttributes(parseStyleString(styleString));
110
- acc['style'] = reactStyleObject;
111
- } else {
112
- acc[attribute] = el.getAttribute(attribute);
113
- }
114
- }
115
-
116
- return acc;
117
- };
118
- };
119
-
120
- var attributes = ['border', 'cellpadding', 'cellspacing', 'class', 'style', 'align'];
121
- /**
122
- * Serializer rules.
123
- *
124
- * @type {Array}
125
- */
126
-
127
- var blocks = {
128
- deserialize: function deserialize(el, next) {
129
- log('[blocks:deserialize] block: ', el);
130
-
131
- var block = _blockTags.BLOCK_TAGS[el.tagName.toLowerCase()];
132
-
133
- if (!block) return;
134
- log('[blocks:deserialize] block: ', block);
135
-
136
- if (el.childNodes.length === 1) {
137
- var cn = el.childNodes[0];
138
-
139
- if (cn && cn.tagName && cn.tagName.toLowerCase() === block) {
140
- log('[we have a child node of the same]...');
141
- return;
142
- }
143
- }
144
-
145
- return {
146
- object: 'block',
147
- type: block,
148
-
149
- /**
150
- * Here for rendering styles for all block elements
151
- */
152
- data: {
153
- attributes: attributes.reduce(attributesToMap(el), {})
154
- },
155
- nodes: next(el.childNodes)
156
- };
157
- },
158
- serialize: function serialize(object, children) {
159
- if (object.object !== 'block') return;
160
- var jsonData = object.data.toJSON();
161
- log('[blocks:serialize] object: ', object, children);
162
- var key;
163
-
164
- for (key in _blockTags.BLOCK_TAGS) {
165
- if (_blockTags.BLOCK_TAGS[key] === object.type) {
166
- var Tag = key;
167
- return /*#__PURE__*/_react["default"].createElement(Tag, jsonData.attributes, children);
168
- }
169
- }
170
- }
171
- };
172
- var INLINE_TAGS = {
173
- span: 'span'
174
- };
175
- exports.INLINE_TAGS = INLINE_TAGS;
176
- var inlines = {
177
- deserialize: function deserialize(el, next) {
178
- log('[inlines:deserialize] inline: ', el);
179
- var inlineTag = INLINE_TAGS[el.tagName.toLowerCase()];
180
- if (!inlineTag) return;
181
- log('[inlines:deserialize] inline: ', inlineTag);
182
-
183
- if (el.childNodes.length === 1) {
184
- var cn = el.childNodes[0];
185
-
186
- if (cn && cn.tagName && cn.tagName.toLowerCase() === inlineTag) {
187
- log('[we have a child node of the same]...');
188
- return;
189
- }
190
- }
191
-
192
- return {
193
- object: 'inline',
194
- type: inlineTag,
195
-
196
- /**
197
- * Here for rendering styles for all inline elements
198
- */
199
- data: {
200
- attributes: attributes.reduce(attributesToMap(el), {})
201
- },
202
- nodes: next(el.childNodes)
203
- };
204
- },
205
- serialize: function serialize(object, children) {
206
- if (object.object !== 'inline') return;
207
- var jsonData = object.data.toJSON();
208
- log('[inlines:serialize] object: ', object, children);
209
- var key;
210
-
211
- for (key in INLINE_TAGS) {
212
- if (INLINE_TAGS[key] === object.type) {
213
- var Tag = key;
214
- return /*#__PURE__*/_react["default"].createElement(Tag, jsonData.attributes, children);
215
- }
216
- }
217
- }
218
- };
219
- var extraCSSRulesOpts = {};
220
- exports.extraCSSRulesOpts = extraCSSRulesOpts;
221
- var STYLES_MAP = {
222
- h3: {
223
- fontSize: 'inherit',
224
- fontWeight: 'inherit'
225
- },
226
- blockquote: {
227
- background: '#f9f9f9',
228
- borderLeft: '5px solid #ccc',
229
- margin: '1.5em 10px',
230
- padding: '.5em 10px'
231
- }
232
- };
233
- var reactToHTMLAttributesMap = {
234
- "class": 'className'
235
- };
236
- var marks = {
237
- deserialize: function deserialize(el, next) {
238
- var mark = MARK_TAGS[el.tagName.toLowerCase()];
239
- var elClasses = el.getAttribute('class') || '';
240
- var hasCSSRule = ((extraCSSRulesOpts === null || extraCSSRulesOpts === void 0 ? void 0 : extraCSSRulesOpts.names) || []).find(function (name) {
241
- return elClasses === null || elClasses === void 0 ? void 0 : elClasses.includes(name);
242
- });
243
-
244
- if (!mark && !hasCSSRule) {
245
- return;
246
- }
247
-
248
- log('[deserialize] mark: ', mark);
249
- var attrs = attributes.reduce(attributesToMap(el), {});
250
- var data = (0, _isEmpty["default"])(attrs) ? undefined : {
251
- attributes: attrs
252
- };
253
- return {
254
- object: 'mark',
255
- type: hasCSSRule ? 'css' : mark,
256
-
257
- /**
258
- * Here for rendering styles for all elements
259
- */
260
- data: data,
261
- nodes: next(el.childNodes)
262
- };
263
- },
264
- serialize: function serialize(object, children) {
265
- var _object$data, _jsonData$attributes;
266
-
267
- var jsonData = ((_object$data = object.data) === null || _object$data === void 0 ? void 0 : _object$data.toJSON()) || {};
268
- var elClasses = ((_jsonData$attributes = jsonData.attributes) === null || _jsonData$attributes === void 0 ? void 0 : _jsonData$attributes["class"]) || '';
269
- var hasCSSRule = ((extraCSSRulesOpts === null || extraCSSRulesOpts === void 0 ? void 0 : extraCSSRulesOpts.names) || []).find(function (name) {
270
- return elClasses === null || elClasses === void 0 ? void 0 : elClasses.includes(name);
271
- });
272
-
273
- if (hasCSSRule) {
274
- var htmlAttrs = Object.keys(jsonData.attributes).reduce(function (obj, key) {
275
- obj[reactToHTMLAttributesMap[key] || key] = jsonData.attributes[key];
276
- return obj;
277
- }, {});
278
- return /*#__PURE__*/_react["default"].createElement("span", htmlAttrs, children);
279
- }
280
-
281
- if (_slate.Mark.isMark(object)) {
282
- for (var key in MARK_TAGS) {
283
- if (MARK_TAGS[key] === object.type) {
284
- var Tag = key;
285
- var additionalStyles = STYLES_MAP[Tag];
286
-
287
- if (additionalStyles) {
288
- if (!jsonData.attributes) {
289
- jsonData.attributes = {};
290
- }
291
-
292
- jsonData.attributes.style = _objectSpread(_objectSpread({}, jsonData.attributes.style), additionalStyles);
293
- }
294
-
295
- return /*#__PURE__*/_react["default"].createElement(Tag, jsonData.attributes, children);
296
- }
297
- }
298
- }
299
- }
300
- }; // eslint-disable-next-line no-unused-vars
301
-
302
- var findPreviousText = function findPreviousText(el) {
303
- if (el.nodeName === '#text') {
304
- return el;
305
- }
306
-
307
- if (el.previousSibling) {
308
- return findPreviousText(el.previousSibling);
309
- }
310
-
311
- return null;
312
- };
313
-
314
- var TEXT_RULE = {
315
- deserialize: function deserialize(el) {
316
- /**
317
- * This needs to be called on the dom element in order to merge the adjacent text nodes together
318
- * */
319
- el.normalize();
320
-
321
- if (el.tagName && el.tagName.toLowerCase() === 'br') {
322
- return {
323
- object: 'text',
324
- leaves: [{
325
- object: 'leaf',
326
- text: '\n'
327
- }]
328
- };
329
- }
330
-
331
- if (el.nodeName === '#text') {
332
- if (el.nodeValue && el.nodeValue.match(/<!--.*?-->/)) return;
333
- log('[text:deserialize] return text object..');
334
- return {
335
- object: 'text',
336
- leaves: [{
337
- object: 'leaf',
338
- text: el.nodeValue
339
- }]
340
- };
341
- }
342
- },
343
- serialize: function serialize(obj, children) {
344
- if (obj.object === 'string') {
345
- return children.split('\n').reduce(function (array, text, i) {
346
- if (i !== 0) array.push( /*#__PURE__*/_react["default"].createElement("br", null));
347
- array.push(text);
348
- return array;
349
- }, []);
350
- }
351
- }
352
- };
353
- exports.TEXT_RULE = TEXT_RULE;
354
- var RULES = [_list.serialization, _math.serialization, _media.serialization, _image.serialization, _table.serialization, _respArea.serialization, TEXT_RULE, inlines, blocks, marks];
355
-
356
- function allWhitespace(node) {
357
- // Use ECMA-262 Edition 3 String and RegExp features
358
- return !/[^\t\n\r ]/.test(node.textContent);
359
- }
360
-
361
- function defaultParseHtml(html) {
362
- if (typeof DOMParser === 'undefined') {
363
- throw new Error('The native `DOMParser` global which the `Html` serializer uses by default is not present in this environment. You must supply the `options.parseHtml` function instead.');
364
- }
365
-
366
- var parsed = new DOMParser().parseFromString(html, 'text/html');
367
- var body = parsed.body;
368
- var textNodes = document.createTreeWalker(body, NodeFilter.SHOW_TEXT, null, null);
369
- var n = textNodes.nextNode();
370
-
371
- while (n) {
372
- var _n$nextSibling, _n$nextSibling$tagNam, _n$previousSibling, _n$previousSibling$ta;
373
-
374
- var isWhiteSpace = allWhitespace(n);
375
- var isNotNearMarkup = !MARK_TAGS[(_n$nextSibling = n.nextSibling) === null || _n$nextSibling === void 0 ? void 0 : (_n$nextSibling$tagNam = _n$nextSibling.tagName) === null || _n$nextSibling$tagNam === void 0 ? void 0 : _n$nextSibling$tagNam.toLowerCase()] && !MARK_TAGS[(_n$previousSibling = n.previousSibling) === null || _n$previousSibling === void 0 ? void 0 : (_n$previousSibling$ta = _n$previousSibling.tagName) === null || _n$previousSibling$ta === void 0 ? void 0 : _n$previousSibling$ta.toLowerCase()];
376
-
377
- if (isWhiteSpace && isNotNearMarkup || n.nodeValue === "\u200B") {
378
- n.parentNode.removeChild(n);
379
- }
380
-
381
- n = textNodes.nextNode();
382
- }
383
-
384
- return body;
385
- }
386
- /** If this lib is used on the server side, we need to bypass using the DOMParser - just put in a stub. */
387
-
388
-
389
- var parseHtml = typeof window === 'undefined' ? function () {
390
- return {
391
- childNodes: []
392
- };
393
- } : defaultParseHtml;
394
- var serializer = new _slateHtmlSerializer["default"]({
395
- defaultBlock: 'div',
396
- rules: RULES,
397
- parseHtml: parseHtml
398
- });
399
-
400
- var _extends = Object.assign || function (target) {
401
- for (var i = 1; i < arguments.length; i++) {
402
- var source = arguments[i];
403
-
404
- for (var key in source) {
405
- if (Object.prototype.hasOwnProperty.call(source, key)) {
406
- target[key] = source[key];
407
- }
408
- }
409
- }
410
-
411
- return target;
412
- };
413
- /**
414
- * This is needed in order to override the function that eventually leads
415
- * to the max iteration of 12, which in most cases it's not enough. The newer versions
416
- * have a different way to calculate this, but updating to a newer version of slate
417
- * requires a lot of work fixing other issues. So we just increase the rules by 1000,
418
- * which means a lot of iterations.
419
- * Below is the code that calculates the max iterations.
420
- * var max = schema.stack.plugins.length + schema.rules.length + 1;
421
- */
422
-
423
-
424
- serializer.deserialize = function deserialize(html) {
425
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
426
- var _options$toJSON = options.toJSON;
427
- var toJSON = _options$toJSON === undefined ? false : _options$toJSON;
428
- var defaultBlock = this.defaultBlock;
429
- var parseHtml = this.parseHtml;
430
- var fragment = parseHtml(html);
431
- var children = Array.from(fragment.childNodes);
432
- var nodes = this.deserializeElements(children); // COMPAT: ensure that all top-level inline nodes are wrapped into a block.
433
-
434
- nodes = nodes.reduce(function (memo, node, i, original) {
435
- if (node.object === 'block') {
436
- memo.push(node);
437
- return memo;
438
- }
439
-
440
- if (i > 0 && original[i - 1].object !== 'block') {
441
- var _block = memo[memo.length - 1];
442
-
443
- _block.nodes.push(node);
444
-
445
- return memo;
446
- }
447
-
448
- var block = _extends({
449
- object: 'block',
450
- data: {},
451
- isVoid: false
452
- }, defaultBlock, {
453
- nodes: [node]
454
- });
455
-
456
- memo.push(block);
457
- return memo;
458
- }, []);
459
-
460
- if (nodes.length === 0) {
461
- nodes = [_extends({
462
- object: 'block',
463
- data: {},
464
- isVoid: false
465
- }, defaultBlock, {
466
- nodes: [{
467
- object: 'text',
468
- leaves: [{
469
- object: 'leaf',
470
- text: '',
471
- marks: []
472
- }]
473
- }]
474
- })];
475
- }
476
-
477
- var json = {
478
- object: 'value',
479
- document: {
480
- object: 'document',
481
- data: {},
482
- nodes: nodes
483
- },
484
- schema: {
485
- rules: []
486
- }
487
- };
488
- var i;
489
-
490
- for (i = 0; i < 3000; i++) {
491
- json.schema.rules.push({
492
- match: {
493
- object: 'document'
494
- },
495
- nodes: [{
496
- match: {
497
- object: 'block'
498
- }
499
- }]
500
- });
501
- }
502
-
503
- var ret = toJSON ? json : _slate.Value.fromJSON(json);
504
-
505
- if (ret) {
506
- return ret;
507
- }
508
-
509
- return null;
510
- };
511
-
512
- var reduceMultipleBrs = function reduceMultipleBrs(markup) {
513
- try {
514
- return markup.replace(/(<br\s*\/?>){3,}/gi, '<br>');
515
- } catch (e) {
516
- // eslint-disable-next-line no-console
517
- console.log("Couldn't remove <br/> tags: ", e);
518
- }
519
-
520
- return markup;
521
- };
522
-
523
- exports.reduceMultipleBrs = reduceMultipleBrs;
524
-
525
- var reduceRedundantNewLineCharacters = function reduceRedundantNewLineCharacters(markup) {
526
- try {
527
- return markup.replace(/\n/gi, '');
528
- } catch (e) {
529
- // eslint-disable-next-line no-console
530
- console.log("Couldn't remove <br/> tags: ", e);
531
- }
532
-
533
- return markup;
534
- };
535
- /**
536
- * Makes sure that the html provided respects the schema
537
- * rules for the slate editor.
538
- * @param markup
539
- * @returns {string}
540
- */
541
-
542
-
543
- var fixHtmlCode = function fixHtmlCode(markup) {
544
- var wrapperEl = document.createElement('div');
545
- wrapperEl.innerHTML = markup;
546
- /**
547
- * DIV elements that are at the same level as paragraphs
548
- * are replaced with P elements for normalizing purposes
549
- * @param child
550
- */
551
-
552
- var fixParagraphs = function fixParagraphs(child) {
553
- var p = document.createElement('p');
554
- p.innerHTML = child.innerHTML;
555
- Array.from(child.attributes).forEach(function (attr) {
556
- p.setAttribute(attr.name, attr.value);
557
- });
558
- child.replaceWith(p);
559
- };
560
- /**
561
- * @summary Makes sure that tables are placed in the root document.
562
- * @description This function removes the tables from the nodes that are
563
- * placed inside the root element and places them exactly near
564
- * the parent element.
565
- * @param tableArray
566
- */
567
-
568
-
569
- var fixTables = function fixTables(tableArray) {
570
- tableArray.forEach(function (el) {
571
- var index = el.index,
572
- child = el.child,
573
- parent = el.parent;
574
- var nodesBefore = [];
575
- var nodesAfter = [];
576
- var allNodes = Array.from(parent.childNodes);
577
- var i;
578
-
579
- for (i = 0; i < allNodes.length; i++) {
580
- var node = allNodes[i];
581
-
582
- if (i < index) {
583
- nodesBefore.push(node);
584
- } else if (i > index) {
585
- nodesAfter.push(node);
586
- }
587
- } // creating the element that is going to be placed instead of the parent
588
-
589
-
590
- var beforeEl = document.createElement(parent.nodeName);
591
- beforeEl.append.apply(beforeEl, nodesBefore); // replacing parent with the beforeElement
592
-
593
- parent.replaceWith(beforeEl); // adding the table right after the before element
594
-
595
- beforeEl.after(child); // creating the element that is going to be placed after the table
596
-
597
- var afterEl = document.createElement(parent.nodeName);
598
- afterEl.append.apply(afterEl, nodesAfter); // adding the after element near the table
599
-
600
- child.after(afterEl);
601
- });
602
- };
603
-
604
- var emptyBlockCheck = function emptyBlockCheck(node) {
605
- return (node.nodeName === 'DIV' || node.nodeName === 'P' || node.nodeName === 'LI') && node.childNodes.length === 0;
606
- };
607
-
608
- var parseNode = function parseNode(el) {
609
- var childArray = Array.from(el.childNodes);
610
- var hasParagraphs = childArray.find(function (child) {
611
- return child.nodeName === 'P';
612
- });
613
- var tables = [];
614
- childArray.forEach(function (child, index) {
615
- // removing empty blocks
616
- if (emptyBlockCheck(child)) {
617
- child.remove();
618
- return;
619
- }
620
-
621
- if (hasParagraphs && child.nodeName === 'DIV') {
622
- fixParagraphs(child);
623
- }
624
-
625
- if (wrapperEl !== el && child.nodeName === 'TABLE') {
626
- // we don't need to fix tables in the root element
627
- tables.push({
628
- index: index,
629
- child: child,
630
- parent: el
631
- });
632
- }
633
-
634
- parseNode(child);
635
- });
636
-
637
- if (tables.length) {
638
- fixTables(tables);
639
- }
640
- };
641
-
642
- parseNode(wrapperEl);
643
- return wrapperEl.innerHTML;
644
- };
645
-
646
- var handleHtml = function handleHtml(html) {
647
- return fixHtmlCode(reduceRedundantNewLineCharacters(reduceMultipleBrs(html)));
648
- };
649
-
650
- exports.handleHtml = handleHtml;
651
-
652
- var htmlToValue = function htmlToValue(html) {
653
- try {
654
- return serializer.deserialize(handleHtml(html));
655
- } catch (e) {
656
- // eslint-disable-next-line no-console
657
- console.log("Couldn't parse html: ", e);
658
- return {};
659
- }
660
- };
661
-
662
- exports.htmlToValue = htmlToValue;
663
-
664
- var valueToHtml = function valueToHtml(value) {
665
- return serializer.serialize(value);
666
- };
667
- /**
668
- *
669
- * <div><div>a</div></div> -> <div>a</div>
670
- *
671
- * <div><div>a</div><div>b</div></div> -> <div>a</div><div>b</div>
672
- * <div><div>a</div>4444<div>b</div></div> -> <div>a</div>4444<div>b</div>
673
- */
674
-
675
-
676
- exports.valueToHtml = valueToHtml;
677
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9zZXJpYWxpemF0aW9uLmpzeCJdLCJuYW1lcyI6WyJsb2ciLCJNQVJLX1RBR1MiLCJiIiwiZW0iLCJ1IiwicyIsImNvZGUiLCJzdHJvbmciLCJibG9ja3F1b3RlIiwiaDMiLCJzdXAiLCJzdWIiLCJwYXJzZVN0eWxlU3RyaW5nIiwicmVnZXgiLCJtYXRjaCIsInJlc3VsdCIsImV4ZWMiLCJ0cmltIiwiZ2V0QmFzZTY0IiwiZmlsZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwicmVhZGVyIiwiRmlsZVJlYWRlciIsInJlYWRBc0RhdGFVUkwiLCJvbmxvYWQiLCJvbmVycm9yIiwiZXJyb3IiLCJyZWFjdEF0dHJpYnV0ZXMiLCJvIiwiY2FtZWxpemUiLCJhZGRVbml0cyIsImF0dHJpYnV0ZXNUb01hcCIsImVsIiwiYWNjIiwiYXR0cmlidXRlIiwidmFsdWUiLCJnZXRBdHRyaWJ1dGUiLCJzdHlsZVN0cmluZyIsInJlYWN0U3R5bGVPYmplY3QiLCJhdHRyaWJ1dGVzIiwiYmxvY2tzIiwiZGVzZXJpYWxpemUiLCJuZXh0IiwiYmxvY2siLCJCTE9DS19UQUdTIiwidGFnTmFtZSIsInRvTG93ZXJDYXNlIiwiY2hpbGROb2RlcyIsImxlbmd0aCIsImNuIiwib2JqZWN0IiwidHlwZSIsImRhdGEiLCJyZWR1Y2UiLCJub2RlcyIsInNlcmlhbGl6ZSIsImNoaWxkcmVuIiwianNvbkRhdGEiLCJ0b0pTT04iLCJrZXkiLCJUYWciLCJJTkxJTkVfVEFHUyIsInNwYW4iLCJpbmxpbmVzIiwiaW5saW5lVGFnIiwiZXh0cmFDU1NSdWxlc09wdHMiLCJTVFlMRVNfTUFQIiwiZm9udFNpemUiLCJmb250V2VpZ2h0IiwiYmFja2dyb3VuZCIsImJvcmRlckxlZnQiLCJtYXJnaW4iLCJwYWRkaW5nIiwicmVhY3RUb0hUTUxBdHRyaWJ1dGVzTWFwIiwibWFya3MiLCJtYXJrIiwiZWxDbGFzc2VzIiwiaGFzQ1NTUnVsZSIsIm5hbWVzIiwiZmluZCIsIm5hbWUiLCJpbmNsdWRlcyIsImF0dHJzIiwidW5kZWZpbmVkIiwiaHRtbEF0dHJzIiwiT2JqZWN0Iiwia2V5cyIsIm9iaiIsIk1hcmsiLCJpc01hcmsiLCJhZGRpdGlvbmFsU3R5bGVzIiwic3R5bGUiLCJmaW5kUHJldmlvdXNUZXh0Iiwibm9kZU5hbWUiLCJwcmV2aW91c1NpYmxpbmciLCJURVhUX1JVTEUiLCJub3JtYWxpemUiLCJsZWF2ZXMiLCJ0ZXh0Iiwibm9kZVZhbHVlIiwic3BsaXQiLCJhcnJheSIsImkiLCJwdXNoIiwiUlVMRVMiLCJsaXN0U2VyaWFsaXphdGlvbiIsIm1hdGhTZXJpYWxpemF0aW9uIiwibWVkaWFTZXJpYWxpemF0aW9uIiwiaW1nU2VyaWFsaXphdGlvbiIsInRhYmxlU2VyaWFsaXphdGlvbiIsInJlc3BvbnNlQXJlYVNlcmlhbGl6YXRpb24iLCJhbGxXaGl0ZXNwYWNlIiwibm9kZSIsInRlc3QiLCJ0ZXh0Q29udGVudCIsImRlZmF1bHRQYXJzZUh0bWwiLCJodG1sIiwiRE9NUGFyc2VyIiwiRXJyb3IiLCJwYXJzZWQiLCJwYXJzZUZyb21TdHJpbmciLCJib2R5IiwidGV4dE5vZGVzIiwiZG9jdW1lbnQiLCJjcmVhdGVUcmVlV2Fsa2VyIiwiTm9kZUZpbHRlciIsIlNIT1dfVEVYVCIsIm4iLCJuZXh0Tm9kZSIsImlzV2hpdGVTcGFjZSIsImlzTm90TmVhck1hcmt1cCIsIm5leHRTaWJsaW5nIiwicGFyZW50Tm9kZSIsInJlbW92ZUNoaWxkIiwicGFyc2VIdG1sIiwid2luZG93Iiwic2VyaWFsaXplciIsIkh0bWwiLCJkZWZhdWx0QmxvY2siLCJydWxlcyIsIl9leHRlbmRzIiwiYXNzaWduIiwidGFyZ2V0IiwiYXJndW1lbnRzIiwic291cmNlIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwib3B0aW9ucyIsIl9vcHRpb25zJHRvSlNPTiIsImZyYWdtZW50IiwiQXJyYXkiLCJmcm9tIiwiZGVzZXJpYWxpemVFbGVtZW50cyIsIm1lbW8iLCJvcmlnaW5hbCIsIl9ibG9jayIsImlzVm9pZCIsImpzb24iLCJzY2hlbWEiLCJyZXQiLCJWYWx1ZSIsImZyb21KU09OIiwicmVkdWNlTXVsdGlwbGVCcnMiLCJtYXJrdXAiLCJyZXBsYWNlIiwiZSIsImNvbnNvbGUiLCJyZWR1Y2VSZWR1bmRhbnROZXdMaW5lQ2hhcmFjdGVycyIsImZpeEh0bWxDb2RlIiwid3JhcHBlckVsIiwiY3JlYXRlRWxlbWVudCIsImlubmVySFRNTCIsImZpeFBhcmFncmFwaHMiLCJjaGlsZCIsInAiLCJmb3JFYWNoIiwiYXR0ciIsInNldEF0dHJpYnV0ZSIsInJlcGxhY2VXaXRoIiwiZml4VGFibGVzIiwidGFibGVBcnJheSIsImluZGV4IiwicGFyZW50Iiwibm9kZXNCZWZvcmUiLCJub2Rlc0FmdGVyIiwiYWxsTm9kZXMiLCJiZWZvcmVFbCIsImFwcGVuZCIsImFmdGVyIiwiYWZ0ZXJFbCIsImVtcHR5QmxvY2tDaGVjayIsInBhcnNlTm9kZSIsImNoaWxkQXJyYXkiLCJoYXNQYXJhZ3JhcGhzIiwidGFibGVzIiwicmVtb3ZlIiwiaGFuZGxlSHRtbCIsImh0bWxUb1ZhbHVlIiwidmFsdWVUb0h0bWwiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7OztBQUVBLElBQU1BLEdBQUcsR0FBRyx1QkFBTSxzQ0FBTixDQUFaO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxJQUFNQyxTQUFTLEdBQUc7QUFDaEJDLEVBQUFBLENBQUMsRUFBRSxNQURhO0FBRWhCQyxFQUFBQSxFQUFFLEVBQUUsUUFGWTtBQUdoQkMsRUFBQUEsQ0FBQyxFQUFFLFdBSGE7QUFJaEJDLEVBQUFBLENBQUMsRUFBRSxlQUphO0FBS2hCQyxFQUFBQSxJQUFJLEVBQUUsTUFMVTtBQU1oQkMsRUFBQUEsTUFBTSxFQUFFLE1BTlE7QUFPaEJDLEVBQUFBLFVBQVUsRUFBRSxZQVBJO0FBUWhCQyxF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LEtBRFU7QUFFVlIsVUFBQUEsS0FBSyxFQUFMQSxLQUZVO0FBR1ZTLFVBQUFBLE1BQU0sRUFBRXZKO0FBSEUsU0FBWjtBQUtEOztBQUVEZ0ssTUFBQUEsU0FBUyxDQUFDbEIsS0FBRCxDQUFUO0FBQ0QsS0FyQkQ7O0FBdUJBLFFBQUlxQixNQUFNLENBQUNuSixNQUFYLEVBQW1CO0FBQ2pCb0ksTUFBQUEsU0FBUyxDQUFDZSxNQUFELENBQVQ7QUFDRDtBQUNGLEdBL0JEOztBQWlDQUgsRUFBQUEsU0FBUyxDQUFDdEIsU0FBRCxDQUFUO0FBRUEsU0FBT0EsU0FBUyxDQUFDRSxTQUFqQjtBQUNELENBMUdEOztBQTRHTyxJQUFNeUIsVUFBVSxHQUFHLFNBQWJBLFVBQWEsQ0FBQ2pGLElBQUQ7QUFBQSxTQUFVcUQsV0FBVyxDQUFDRCxnQ0FBZ0MsQ0FBQ0wsaUJBQWlCLENBQUMvQyxJQUFELENBQWxCLENBQWpDLENBQXJCO0FBQUEsQ0FBbkI7Ozs7QUFFQSxJQUFNa0YsV0FBVyxHQUFHLFNBQWRBLFdBQWMsQ0FBQ2xGLElBQUQsRUFBVTtBQUNuQyxNQUFJO0FBQ0YsV0FBT29CLFVBQVUsQ0FBQy9GLFdBQVgsQ0FBdUI0SixVQUFVLENBQUNqRixJQUFELENBQWpDLENBQVA7QUFDRCxHQUZELENBRUUsT0FBT2tELENBQVAsRUFBVTtBQUNWO0FBQ0FDLElBQUFBLE9BQU8sQ0FBQ3pLLEdBQVIsQ0FBWSx1QkFBWixFQUFxQ3dLLENBQXJDO0FBQ0EsV0FBTyxFQUFQO0FBQ0Q7QUFDRixDQVJNOzs7O0FBVUEsSUFBTWlDLFdBQVcsR0FBRyxTQUFkQSxXQUFjLENBQUNwSyxLQUFEO0FBQUEsU0FBV3FHLFVBQVUsQ0FBQ2pGLFNBQVgsQ0FBcUJwQixLQUFyQixDQUFYO0FBQUEsQ0FBcEI7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBIdG1sIGZyb20gJ3NsYXRlLWh0bWwtc2VyaWFsaXplcic7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCB7IG9iamVjdCBhcyB0b1N0eWxlT2JqZWN0IH0gZnJvbSAndG8tc3R5bGUnO1xuaW1wb3J0IGlzRW1wdHkgZnJvbSAnbG9kYXNoL2lzRW1wdHknO1xuXG5pbXBvcnQgeyBzZXJpYWxpemF0aW9uIGFzIGltZ1NlcmlhbGl6YXRpb24gfSBmcm9tICcuL3BsdWdpbnMvaW1hZ2UnO1xuaW1wb3J0IHsgc2VyaWFsaXphdGlvbiBhcyBtYXRoU2VyaWFsaXphdGlvbiB9IGZyb20gJy4vcGx1Z2lucy9tYXRoJztcbmltcG9ydCB7IHNlcmlhbGl6YXRpb24gYXMgbWVkaWFTZXJpYWxpemF0aW9uIH0gZnJvbSAnLi9wbHVnaW5zL21lZGlhJztcbmltcG9ydCB7IHNlcmlhbGl6YXRpb24gYXMgbGlzdFNlcmlhbGl6YXRpb24gfSBmcm9tICcuL3BsdWdpbnMvbGlzdCc7XG5pbXBvcnQgeyBzZXJpYWxpemF0aW9uIGFzIHRhYmxlU2VyaWFsaXphdGlvbiB9IGZyb20gJy4vcGx1Z2lucy90YWJsZSc7XG5pbXBvcnQgeyBzZXJpYWxpemF0aW9uIGFzIHJlc3BvbnNlQXJlYVNlcmlhbGl6YXRpb24gfSBmcm9tICcuL3BsdWdpbnMvcmVzcEFyZWEnO1xuaW1wb3J0IHsgTWFyaywgVmFsdWUgfSBmcm9tICdzbGF0ZSc7XG5pbXBvcnQgeyBCTE9DS19UQUdTIH0gZnJvbSAnLi9ibG9jay10YWdzJztcblxuY29uc3QgbG9nID0gZGVidWcoJ0BwaWUtbGliOmVkaXRhYmxlLWh0bWw6c2VyaWFsaXphdGlvbicpO1xuXG4vKipcbiAqIFRhZ3MgdG8gbWFya3MuXG4gKlxuICogQHR5cGUge09iamVjdH1cbiAqL1xuXG5jb25zdCBNQVJLX1RBR1MgPSB7XG4gIGI6ICdib2xkJyxcbiAgZW06ICdpdGFsaWMnLFxuICB1OiAndW5kZXJsaW5lJyxcbiAgczogJ3N0cmlrZXRocm91Z2gnLFxuICBjb2RlOiAnY29kZScsXG4gIHN0cm9uZzogJ2JvbGQnLFxuICBibG9ja3F1b3RlOiAnYmxvY2txdW90ZScsXG4gIGgzOiAnaDMnLFxuICBzdXA6ICdzdXAnLFxuICBzdWI6ICdzdWInLFxufTtcblxuZXhwb3J0IGNvbnN0IHBhcnNlU3R5bGVTdHJpbmcgPSAocykgPT4ge1xuICBjb25zdCByZWdleCA9IC8oW1xcdy1dKilcXHMqOlxccyooW147XSopL2c7XG4gIGxldCBtYXRjaDtcbiAgY29uc3QgcmVzdWx0ID0ge307XG4gIHdoaWxlICgobWF0Y2ggPSByZWdleC5leGVjKHMpKSkge1xuICAgIHJlc3VsdFttYXRjaFsxXV0gPSBtYXRjaFsyXS50cmltKCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCYXNlNjQgPSAoZmlsZSkgPT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHJlc29sdmUocmVhZGVyLnJlc3VsdCk7XG4gICAgcmVhZGVyLm9uZXJyb3IgPSAoZXJyb3IpID0+IHJlamVjdChlcnJvcik7XG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlYWN0QXR0cmlidXRlcyA9IChvKSA9PiB0b1N0eWxlT2JqZWN0KG8sIHsgY2FtZWxpemU6IHRydWUsIGFkZFVuaXRzOiBmYWxzZSB9KTtcblxuY29uc3QgYXR0cmlidXRlc1RvTWFwID0gKGVsKSA9PiAoYWNjLCBhdHRyaWJ1dGUpID0+IHtcbiAgY29uc3QgdmFsdWUgPSBlbC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgaWYgKHZhbHVlKSB7XG4gICAgaWYgKGF0dHJpYnV0ZSA9PT0gJ3N0eWxlJykge1xuICAgICAgY29uc3Qgc3R5bGVTdHJpbmcgPSBlbC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICAgIGNvbnN0IHJlYWN0U3R5bGVPYmplY3QgPSByZWFjdEF0dHJpYnV0ZXMocGFyc2VTdHlsZVN0cmluZyhzdHlsZVN0cmluZykpO1xuICAgICAgYWNjWydzdHlsZSddID0gcmVhY3RTdHlsZU9iamVjdDtcbiAgICB9IGVsc2Uge1xuICAgICAgYWNjW2F0dHJpYnV0ZV0gPSBlbC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFjYztcbn07XG5cbmNvbnN0IGF0dHJpYnV0ZXMgPSBbJ2JvcmRlcicsICdjZWxscGFkZGluZycsICdjZWxsc3BhY2luZycsICdjbGFzcycsICdzdHlsZScsICdhbGlnbiddO1xuXG4vKipcbiAqIFNlcmlhbGl6ZXIgcnVsZXMuXG4gKlxuICogQHR5cGUge0FycmF5fVxuICovXG5cbmNvbnN0IGJsb2NrcyA9IHtcbiAgZGVzZXJpYWxpemUoZWwsIG5leHQpIHtcbiAgICBsb2coJ1tibG9ja3M6ZGVzZXJpYWxpemVdIGJsb2NrOiAnLCBlbCk7XG4gICAgY29uc3QgYmxvY2sgPSBCTE9DS19UQUdTW2VsLnRhZ05hbWUudG9Mb3dlckNhc2UoKV07XG4gICAgaWYgKCFibG9jaykgcmV0dXJuO1xuICAgIGxvZygnW2Jsb2NrczpkZXNlcmlhbGl6ZV0gYmxvY2s6ICcsIGJsb2NrKTtcblxuICAgIGlmIChlbC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgY24gPSBlbC5jaGlsZE5vZGVzWzBdO1xuICAgICAgaWYgKGNuICYmIGNuLnRhZ05hbWUgJiYgY24udGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBibG9jaykge1xuICAgICAgICBsb2coJ1t3ZSBoYXZlIGEgY2hpbGQgbm9kZSBvZiB0aGUgc2FtZV0uLi4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBvYmplY3Q6ICdibG9jaycsXG4gICAgICB0eXBlOiBibG9jayxcbiAgICAgIC8qKlxuICAgICAgICogSGVyZSBmb3IgcmVuZGVyaW5nIHN0eWxlcyBmb3IgYWxsIGJsb2NrIGVsZW1lbnRzXG4gICAgICAgKi9cbiAgICAgIGRhdGE6IHsgYXR0cmlidXRlczogYXR0cmlidXRlcy5yZWR1Y2UoYXR0cmlidXRlc1RvTWFwKGVsKSwge30pIH0sXG4gICAgICBub2RlczogbmV4dChlbC5jaGlsZE5vZGVzKSxcbiAgICB9O1xuICB9LFxuICBzZXJpYWxpemU6IChvYmplY3QsIGNoaWxkcmVuKSA9PiB7XG4gICAgaWYgKG9iamVjdC5vYmplY3QgIT09ICdibG9jaycpIHJldHVybjtcblxuICAgIGNvbnN0IGpzb25EYXRhID0gb2JqZWN0LmRhdGEudG9KU09OKCk7XG5cbiAgICBsb2coJ1tibG9ja3M6c2VyaWFsaXplXSBvYmplY3Q6ICcsIG9iamVjdCwgY2hpbGRyZW4pO1xuICAgIGxldCBrZXk7XG5cbiAgICBmb3IgKGtleSBpbiBCTE9DS19UQUdTKSB7XG4gICAgICBpZiAoQkxPQ0tfVEFHU1trZXldID09PSBvYmplY3QudHlwZSkge1xuICAgICAgICBjb25zdCBUYWcgPSBrZXk7XG5cbiAgICAgICAgcmV0dXJuIDxUYWcgey4uLmpzb25EYXRhLmF0dHJpYnV0ZXN9PntjaGlsZHJlbn08L1RhZz47XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IElOTElORV9UQUdTID0ge1xuICBzcGFuOiAnc3BhbicsXG59O1xuXG5jb25zdCBpbmxpbmVzID0ge1xuICBkZXNlcmlhbGl6ZShlbCwgbmV4dCkge1xuICAgIGxvZygnW2lubGluZXM6ZGVzZXJpYWxpemVdIGlubGluZTogJywgZWwpO1xuICAgIGNvbnN0IGlubGluZVRhZyA9IElOTElORV9UQUdTW2VsLnRhZ05hbWUudG9Mb3dlckNhc2UoKV07XG4gICAgaWYgKCFpbmxpbmVUYWcpIHJldHVybjtcbiAgICBsb2coJ1tpbmxpbmVzOmRlc2VyaWFsaXplXSBpbmxpbmU6ICcsIGlubGluZVRhZyk7XG5cbiAgICBpZiAoZWwuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IGNuID0gZWwuY2hpbGROb2Rlc1swXTtcbiAgICAgIGlmIChjbiAmJiBjbi50YWdOYW1lICYmIGNuLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gaW5saW5lVGFnKSB7XG4gICAgICAgIGxvZygnW3dlIGhhdmUgYSBjaGlsZCBub2RlIG9mIHRoZSBzYW1lXS4uLicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG9iamVjdDogJ2lubGluZScsXG4gICAgICB0eXBlOiBpbmxpbmVUYWcsXG4gICAgICAvKipcbiAgICAgICAqIEhlcmUgZm9yIHJlbmRlcmluZyBzdHlsZXMgZm9yIGFsbCBpbmxpbmUgZWxlbWVudHNcbiAgICAgICAqL1xuICAgICAgZGF0YTogeyBhdHRyaWJ1dGVzOiBhdHRyaWJ1dGVzLnJlZHVjZShhdHRyaWJ1dGVzVG9NYXAoZWwpLCB7fSkgfSxcbiAgICAgIG5vZGVzOiBuZXh0KGVsLmNoaWxkTm9kZXMpLFxuICAgIH07XG4gIH0sXG4gIHNlcmlhbGl6ZTogKG9iamVjdCwgY2hpbGRyZW4pID0+IHtcbiAgICBpZiAob2JqZWN0Lm9iamVjdCAhPT0gJ2lubGluZScpIHJldHVybjtcblxuICAgIGNvbnN0IGpzb25EYXRhID0gb2JqZWN0LmRhdGEudG9KU09OKCk7XG5cbiAgICBsb2coJ1tpbmxpbmVzOnNlcmlhbGl6ZV0gb2JqZWN0OiAnLCBvYmplY3QsIGNoaWxkcmVuKTtcbiAgICBsZXQga2V5O1xuXG4gICAgZm9yIChrZXkgaW4gSU5MSU5FX1RBR1MpIHtcbiAgICAgIGlmIChJTkxJTkVfVEFHU1trZXldID09PSBvYmplY3QudHlwZSkge1xuICAgICAgICBjb25zdCBUYWcgPSBrZXk7XG5cbiAgICAgICAgcmV0dXJuIDxUYWcgey4uLmpzb25EYXRhLmF0dHJpYnV0ZXN9PntjaGlsZHJlbn08L1RhZz47XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGV4dHJhQ1NTUnVsZXNPcHRzID0ge307XG5cbmNvbnN0IFNUWUxFU19NQVAgPSB7XG4gIGgzOiB7XG4gICAgZm9udFNpemU6ICdpbmhlcml0JyxcbiAgICBmb250V2VpZ2h0OiAnaW5oZXJpdCcsXG4gIH0sXG4gIGJsb2NrcXVvdGU6IHtcbiAgICBiYWNrZ3JvdW5kOiAnI2Y5ZjlmOScsXG4gICAgYm9yZGVyTGVmdDogJzVweCBzb2xpZCAjY2NjJyxcbiAgICBtYXJnaW46ICcxLjVlbSAxMHB4JyxcbiAgICBwYWRkaW5nOiAnLjVlbSAxMHB4JyxcbiAgfSxcbn07XG5cbmNvbnN0IHJlYWN0VG9IVE1MQXR0cmlidXRlc01hcCA9IHtcbiAgY2xhc3M6ICdjbGFzc05hbWUnLFxufTtcblxuY29uc3QgbWFya3MgPSB7XG4gIGRlc2VyaWFsaXplKGVsLCBuZXh0KSB7XG4gICAgY29uc3QgbWFyayA9IE1BUktfVEFHU1tlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCldO1xuICAgIGNvbnN0IGVsQ2xhc3NlcyA9IGVsLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSB8fCAnJztcbiAgICBjb25zdCBoYXNDU1NSdWxlID0gKGV4dHJhQ1NTUnVsZXNPcHRzPy5uYW1lcyB8fCBbXSkuZmluZCgobmFtZSkgPT4gZWxDbGFzc2VzPy5pbmNsdWRlcyhuYW1lKSk7XG5cbiAgICBpZiAoIW1hcmsgJiYgIWhhc0NTU1J1bGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2coJ1tkZXNlcmlhbGl6ZV0gbWFyazogJywgbWFyayk7XG4gICAgY29uc3QgYXR0cnMgPSBhdHRyaWJ1dGVzLnJlZHVjZShhdHRyaWJ1dGVzVG9NYXAoZWwpLCB7fSk7XG4gICAgY29uc3QgZGF0YSA9IGlzRW1wdHkoYXR0cnMpID8gdW5kZWZpbmVkIDogeyBhdHRyaWJ1dGVzOiBhdHRycyB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG9iamVjdDogJ21hcmsnLFxuICAgICAgdHlwZTogaGFzQ1NTUnVsZSA/ICdjc3MnIDogbWFyayxcbiAgICAgIC8qKlxuICAgICAgICogSGVyZSBmb3IgcmVuZGVyaW5nIHN0eWxlcyBmb3IgYWxsIGVsZW1lbnRzXG4gICAgICAgKi9cbiAgICAgIGRhdGEsXG4gICAgICBub2RlczogbmV4dChlbC5jaGlsZE5vZGVzKSxcbiAgICB9O1xuICB9LFxuICBzZXJpYWxpemUob2JqZWN0LCBjaGlsZHJlbikge1xuICAgIGNvbnN0IGpzb25EYXRhID0gb2JqZWN0LmRhdGE/LnRvSlNPTigpIHx8IHt9O1xuICAgIGNvbnN0IGVsQ2xhc3NlcyA9IGpzb25EYXRhLmF0dHJpYnV0ZXM/LmNsYXNzIHx8ICcnO1xuICAgIGNvbnN0IGhhc0NTU1J1bGUgPSAoZXh0cmFDU1NSdWxlc09wdHM/Lm5hbWVzIHx8IFtdKS5maW5kKChuYW1lKSA9PiBlbENsYXNzZXM/LmluY2x1ZGVzKG5hbWUpKTtcblxuICAgIGlmIChoYXNDU1NSdWxlKSB7XG4gICAgICBjb25zdCBodG1sQXR0cnMgPSBPYmplY3Qua2V5cyhqc29uRGF0YS5hdHRyaWJ1dGVzKS5yZWR1Y2UoKG9iaiwga2V5KSA9PiB7XG4gICAgICAgIG9ialtyZWFjdFRvSFRNTEF0dHJpYnV0ZXNNYXBba2V5XSB8fCBrZXldID0ganNvbkRhdGEuYXR0cmlidXRlc1trZXldO1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgfSwge30pO1xuXG4gICAgICByZXR1cm4gPHNwYW4gey4uLmh0bWxBdHRyc30+e2NoaWxkcmVufTwvc3Bhbj47XG4gICAgfVxuXG4gICAgaWYgKE1hcmsuaXNNYXJrKG9iamVjdCkpIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiBNQVJLX1RBR1MpIHtcbiAgICAgICAgaWYgKE1BUktfVEFHU1trZXldID09PSBvYmplY3QudHlwZSkge1xuICAgICAgICAgIGNvbnN0IFRhZyA9IGtleTtcbiAgICAgICAgICBjb25zdCBhZGRpdGlvbmFsU3R5bGVzID0gU1RZTEVTX01BUFtUYWddO1xuXG4gICAgICAgICAgaWYgKGFkZGl0aW9uYWxTdHlsZXMpIHtcbiAgICAgICAgICAgIGlmICghanNvbkRhdGEuYXR0cmlidXRlcykge1xuICAgICAgICAgICAgICBqc29uRGF0YS5hdHRyaWJ1dGVzID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGpzb25EYXRhLmF0dHJpYnV0ZXMuc3R5bGUgPSB7XG4gICAgICAgICAgICAgIC4uLmpzb25EYXRhLmF0dHJpYnV0ZXMuc3R5bGUsXG4gICAgICAgICAgICAgIC4uLmFkZGl0aW9uYWxTdHlsZXMsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiA8VGFnIHsuLi5qc29uRGF0YS5hdHRyaWJ1dGVzfT57Y2hpbGRyZW59PC9UYWc+O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5jb25zdCBmaW5kUHJldmlvdXNUZXh0ID0gKGVsKSA9PiB7XG4gIGlmIChlbC5ub2RlTmFtZSA9PT0gJyN0ZXh0Jykge1xuICAgIHJldHVybiBlbDtcbiAgfVxuXG4gIGlmIChlbC5wcmV2aW91c1NpYmxpbmcpIHtcbiAgICByZXR1cm4gZmluZFByZXZpb3VzVGV4dChlbC5wcmV2aW91c1NpYmxpbmcpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgVEVYVF9SVUxFID0ge1xuICBkZXNlcmlhbGl6ZShlbCkge1xuICAgIC8qKlxuICAgICAqIFRoaXMgbmVlZHMgdG8gYmUgY2FsbGVkIG9uIHRoZSBkb20gZWxlbWVudCBpbiBvcmRlciB0byBtZXJnZSB0aGUgYWRqYWNlbnQgdGV4dCBub2RlcyB0b2dldGhlclxuICAgICAqICovXG4gICAgZWwubm9ybWFsaXplKCk7XG5cbiAgICBpZiAoZWwudGFnTmFtZSAmJiBlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdicicpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9iamVjdDogJ3RleHQnLFxuICAgICAgICBsZWF2ZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBvYmplY3Q6ICdsZWFmJyxcbiAgICAgICAgICAgIHRleHQ6ICdcXG4nLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChlbC5ub2RlTmFtZSA9PT0gJyN0ZXh0Jykge1xuICAgICAgaWYgKGVsLm5vZGVWYWx1ZSAmJiBlbC5ub2RlVmFsdWUubWF0Y2goLzwhLS0uKj8tLT4vKSkgcmV0dXJuO1xuXG4gICAgICBsb2coJ1t0ZXh0OmRlc2VyaWFsaXplXSByZXR1cm4gdGV4dCBvYmplY3QuLicpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb2JqZWN0OiAndGV4dCcsXG4gICAgICAgIGxlYXZlczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG9iamVjdDogJ2xlYWYnLFxuICAgICAgICAgICAgdGV4dDogZWwubm9kZVZhbHVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cbiAgfSxcblxuICBzZXJpYWxpemUob2JqLCBjaGlsZHJlbikge1xuICAgIGlmIChvYmoub2JqZWN0ID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGNoaWxkcmVuLnNwbGl0KCdcXG4nKS5yZWR1Y2UoKGFycmF5LCB0ZXh0LCBpKSA9PiB7XG4gICAgICAgIGlmIChpICE9PSAwKSBhcnJheS5wdXNoKDxiciAvPik7XG4gICAgICAgIGFycmF5LnB1c2godGV4dCk7XG4gICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgIH0sIFtdKTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBSVUxFUyA9IFtcbiAgbGlzdFNlcmlhbGl6YXRpb24sXG4gIG1hdGhTZXJpYWxpemF0aW9uLFxuICBtZWRpYVNlcmlhbGl6YXRpb24sXG4gIGltZ1NlcmlhbGl6YXRpb24sXG4gIHRhYmxlU2VyaWFsaXphdGlvbixcbiAgcmVzcG9uc2VBcmVhU2VyaWFsaXphdGlvbixcbiAgVEVYVF9SVUxFLFxuICBpbmxpbmVzLFxuICBibG9ja3MsXG4gIG1hcmtzLFxuXTtcblxuZnVuY3Rpb24gYWxsV2hpdGVzcGFjZShub2RlKSB7XG4gIC8vIFVzZSBFQ01BLTI2MiBFZGl0aW9uIDMgU3RyaW5nIGFuZCBSZWdFeHAgZmVhdHVyZXNcbiAgcmV0dXJuICEvW15cXHRcXG5cXHIgXS8udGVzdChub2RlLnRleHRDb250ZW50KTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFBhcnNlSHRtbChodG1sKSB7XG4gIGlmICh0eXBlb2YgRE9NUGFyc2VyID09PSAndW5kZWZpbmVkJykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdUaGUgbmF0aXZlIGBET01QYXJzZXJgIGdsb2JhbCB3aGljaCB0aGUgYEh0bWxgIHNlcmlhbGl6ZXIgdXNlcyBieSBkZWZhdWx0IGlzIG5vdCBwcmVzZW50IGluIHRoaXMgZW52aXJvbm1lbnQuIFlvdSBtdXN0IHN1cHBseSB0aGUgYG9wdGlvbnMucGFyc2VIdG1sYCBmdW5jdGlvbiBpbnN0ZWFkLicsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHBhcnNlZCA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoaHRtbCwgJ3RleHQvaHRtbCcpO1xuXG4gIGNvbnN0IHsgYm9keSB9ID0gcGFyc2VkO1xuICB2YXIgdGV4dE5vZGVzID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihib2R5LCBOb2RlRmlsdGVyLlNIT1dfVEVYVCwgbnVsbCwgbnVsbCk7XG4gIHZhciBuID0gdGV4dE5vZGVzLm5leHROb2RlKCk7XG5cbiAgd2hpbGUgKG4pIHtcbiAgICBjb25zdCBpc1doaXRlU3BhY2UgPSBhbGxXaGl0ZXNwYWNlKG4pO1xuICAgIGNvbnN0IGlzTm90TmVhck1hcmt1cCA9XG4gICAgICAhTUFSS19UQUdTW24ubmV4dFNpYmxpbmc/LnRhZ05hbWU/LnRvTG93ZXJDYXNlKCldICYmICFNQVJLX1RBR1Nbbi5wcmV2aW91c1NpYmxpbmc/LnRhZ05hbWU/LnRvTG93ZXJDYXNlKCldO1xuXG4gICAgaWYgKChpc1doaXRlU3BhY2UgJiYgaXNOb3ROZWFyTWFya3VwKSB8fCBuLm5vZGVWYWx1ZSA9PT0gJ1xcdTIwMEInKSB7XG4gICAgICBuLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobik7XG4gICAgfVxuICAgIG4gPSB0ZXh0Tm9kZXMubmV4dE5vZGUoKTtcbiAgfVxuXG4gIHJldHVybiBib2R5O1xufVxuXG4vKiogSWYgdGhpcyBsaWIgaXMgdXNlZCBvbiB0aGUgc2VydmVyIHNpZGUsIHdlIG5lZWQgdG8gYnlwYXNzIHVzaW5nIHRoZSBET01QYXJzZXIgLSBqdXN0IHB1dCBpbiBhIHN0dWIuICovXG5jb25zdCBwYXJzZUh0bWwgPVxuICB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJ1xuICAgID8gKCkgPT4gKHtcbiAgICAgICAgY2hpbGROb2RlczogW10sXG4gICAgICB9KVxuICAgIDogZGVmYXVsdFBhcnNlSHRtbDtcblxuY29uc3Qgc2VyaWFsaXplciA9IG5ldyBIdG1sKHtcbiAgZGVmYXVsdEJsb2NrOiAnZGl2JyxcbiAgcnVsZXM6IFJVTEVTLFxuICBwYXJzZUh0bWwsXG59KTtcblxuY29uc3QgX2V4dGVuZHMgPVxuICBPYmplY3QuYXNzaWduIHx8XG4gIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG5cbi8qKlxuICogVGhpcyBpcyBuZWVkZWQgaW4gb3JkZXIgdG8gb3ZlcnJpZGUgdGhlIGZ1bmN0aW9uIHRoYXQgZXZlbnR1YWxseSBsZWFkc1xuICogdG8gdGhlIG1heCBpdGVyYXRpb24gb2YgMTIsIHdoaWNoIGluIG1vc3QgY2FzZXMgaXQncyBub3QgZW5vdWdoLiBUaGUgbmV3ZXIgdmVyc2lvbnNcbiAqIGhhdmUgYSBkaWZmZXJlbnQgd2F5IHRvIGNhbGN1bGF0ZSB0aGlzLCBidXQgdXBkYXRpbmcgdG8gYSBuZXdlciB2ZXJzaW9uIG9mIHNsYXRlXG4gKiByZXF1aXJlcyBhIGxvdCBvZiB3b3JrIGZpeGluZyBvdGhlciBpc3N1ZXMuIFNvIHdlIGp1c3QgaW5jcmVhc2UgdGhlIHJ1bGVzIGJ5IDEwMDAsXG4gKiB3aGljaCBtZWFucyBhIGxvdCBvZiBpdGVyYXRpb25zLlxuICogQmVsb3cgaXMgdGhlIGNvZGUgdGhhdCBjYWxjdWxhdGVzIHRoZSBtYXggaXRlcmF0aW9ucy5cbiAqIHZhciBtYXggPSBzY2hlbWEuc3RhY2sucGx1Z2lucy5sZW5ndGggKyBzY2hlbWEucnVsZXMubGVuZ3RoICsgMTtcbiAqL1xuc2VyaWFsaXplci5kZXNlcmlhbGl6ZSA9IGZ1bmN0aW9uIGRlc2VyaWFsaXplKGh0bWwpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gIGNvbnN0IF9vcHRpb25zJHRvSlNPTiA9IG9wdGlvbnMudG9KU09OO1xuICBjb25zdCB0b0pTT04gPSBfb3B0aW9ucyR0b0pTT04gPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogX29wdGlvbnMkdG9KU09OO1xuICBjb25zdCBkZWZhdWx0QmxvY2sgPSB0aGlzLmRlZmF1bHRCbG9jaztcbiAgY29uc3QgcGFyc2VIdG1sID0gdGhpcy5wYXJzZUh0bWw7XG5cbiAgY29uc3QgZnJhZ21lbnQgPSBwYXJzZUh0bWwoaHRtbCk7XG4gIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShmcmFnbWVudC5jaGlsZE5vZGVzKTtcbiAgbGV0IG5vZGVzID0gdGhpcy5kZXNlcmlhbGl6ZUVsZW1lbnRzKGNoaWxkcmVuKTtcblxuICAvLyBDT01QQVQ6IGVuc3VyZSB0aGF0IGFsbCB0b3AtbGV2ZWwgaW5saW5lIG5vZGVzIGFyZSB3cmFwcGVkIGludG8gYSBibG9jay5cbiAgbm9kZXMgPSBub2Rlcy5yZWR1Y2UoZnVuY3Rpb24obWVtbywgbm9kZSwgaSwgb3JpZ2luYWwpIHtcbiAgICBpZiAobm9kZS5vYmplY3QgPT09ICdibG9jaycpIHtcbiAgICAgIG1lbW8ucHVzaChub2RlKTtcbiAgICAgIHJldHVybiBtZW1vO1xuICAgIH1cblxuICAgIGlmIChpID4gMCAmJiBvcmlnaW5hbFtpIC0gMV0ub2JqZWN0ICE9PSAnYmxvY2snKSB7XG4gICAgICBjb25zdCBfYmxvY2sgPSBtZW1vW21lbW8ubGVuZ3RoIC0gMV07XG5cbiAgICAgIF9ibG9jay5ub2Rlcy5wdXNoKG5vZGUpO1xuICAgICAgcmV0dXJuIG1lbW87XG4gICAgfVxuXG4gICAgY29uc3QgYmxvY2sgPSBfZXh0ZW5kcyh7IG9iamVjdDogJ2Jsb2NrJywgZGF0YToge30sIGlzVm9pZDogZmFsc2UgfSwgZGVmYXVsdEJsb2NrLCB7XG4gICAgICBub2RlczogW25vZGVdLFxuICAgIH0pO1xuXG4gICAgbWVtby5wdXNoKGJsb2NrKTtcbiAgICByZXR1cm4gbWVtbztcbiAgfSwgW10pO1xuXG4gIGlmIChub2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICBub2RlcyA9IFtcbiAgICAgIF9leHRlbmRzKHsgb2JqZWN0OiAnYmxvY2snLCBkYXRhOiB7fSwgaXNWb2lkOiBmYWxzZSB9LCBkZWZhdWx0QmxvY2ssIHtcbiAgICAgICAgbm9kZXM6IFt7IG9iamVjdDogJ3RleHQnLCBsZWF2ZXM6IFt7IG9iamVjdDogJ2xlYWYnLCB0ZXh0OiAnJywgbWFya3M6IFtdIH1dIH1dLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIGNvbnN0IGpzb24gPSB7XG4gICAgb2JqZWN0OiAndmFsdWUnLFxuICAgIGRvY3VtZW50OiB7XG4gICAgICBvYmplY3Q6ICdkb2N1bWVudCcsXG4gICAgICBkYXRhOiB7fSxcbiAgICAgIG5vZGVzOiBub2RlcyxcbiAgICB9LFxuICAgIHNjaGVtYToge1xuICAgICAgcnVsZXM6IFtdLFxuICAgIH0sXG4gIH07XG5cbiAgbGV0IGk7XG5cbiAgZm9yIChpID0gMDsgaSA8IDMwMDA7IGkrKykge1xuICAgIGpzb24uc2NoZW1hLnJ1bGVzLnB1c2goe1xuICAgICAgbWF0Y2g6IHsgb2JqZWN0OiAnZG9jdW1lbnQnIH0sXG4gICAgICBub2RlczogW3sgbWF0Y2g6IHsgb2JqZWN0OiAnYmxvY2snIH0gfV0sXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCByZXQgPSB0b0pTT04gPyBqc29uIDogVmFsdWUuZnJvbUpTT04oanNvbik7XG5cbiAgaWYgKHJldCkge1xuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCByZWR1Y2VNdWx0aXBsZUJycyA9IChtYXJrdXApID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbWFya3VwLnJlcGxhY2UoLyg8YnJcXHMqXFwvPz4pezMsfS9naSwgJzxicj4nKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS5sb2coXCJDb3VsZG4ndCByZW1vdmUgPGJyLz4gdGFnczogXCIsIGUpO1xuICB9XG5cbiAgcmV0dXJuIG1hcmt1cDtcbn07XG5cbmNvbnN0IHJlZHVjZVJlZHVuZGFudE5ld0xpbmVDaGFyYWN0ZXJzID0gKG1hcmt1cCkgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiBtYXJrdXAucmVwbGFjZSgvXFxuL2dpLCAnJyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUubG9nKFwiQ291bGRuJ3QgcmVtb3ZlIDxici8+IHRhZ3M6IFwiLCBlKTtcbiAgfVxuXG4gIHJldHVybiBtYXJrdXA7XG59O1xuXG4vKipcbiAqIE1ha2VzIHN1cmUgdGhhdCB0aGUgaHRtbCBwcm92aWRlZCByZXNwZWN0cyB0aGUgc2NoZW1hXG4gKiBydWxlcyBmb3IgdGhlIHNsYXRlIGVkaXRvci5cbiAqIEBwYXJhbSBtYXJrdXBcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGZpeEh0bWxDb2RlID0gKG1hcmt1cCkgPT4ge1xuICBjb25zdCB3cmFwcGVyRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICB3cmFwcGVyRWwuaW5uZXJIVE1MID0gbWFya3VwO1xuXG4gIC8qKlxuICAgKiBESVYgZWxlbWVudHMgdGhhdCBhcmUgYXQgdGhlIHNhbWUgbGV2ZWwgYXMgcGFyYWdyYXBoc1xuICAgKiBhcmUgcmVwbGFjZWQgd2l0aCBQIGVsZW1lbnRzIGZvciBub3JtYWxpemluZyBwdXJwb3Nlc1xuICAgKiBAcGFyYW0gY2hpbGRcbiAgICovXG4gIGNvbnN0IGZpeFBhcmFncmFwaHMgPSAoY2hpbGQpID0+IHtcbiAgICBjb25zdCBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xuXG4gICAgcC5pbm5lckhUTUwgPSBjaGlsZC5pbm5lckhUTUw7XG5cbiAgICBBcnJheS5mcm9tKGNoaWxkLmF0dHJpYnV0ZXMpLmZvckVhY2goKGF0dHIpID0+IHtcbiAgICAgIHAuc2V0QXR0cmlidXRlKGF0dHIubmFtZSwgYXR0ci52YWx1ZSk7XG4gICAgfSk7XG4gICAgY2hpbGQucmVwbGFjZVdpdGgocCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IE1ha2VzIHN1cmUgdGhhdCB0YWJsZXMgYXJlIHBsYWNlZCBpbiB0aGUgcm9vdCBkb2N1bWVudC5cbiAgICogQGRlc2NyaXB0aW9uIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyB0aGUgdGFibGVzIGZyb20gdGhlIG5vZGVzIHRoYXQgYXJlXG4gICAqIHBsYWNlZCBpbnNpZGUgdGhlIHJvb3QgZWxlbWVudCBhbmQgcGxhY2VzIHRoZW0gZXhhY3RseSBuZWFyXG4gICAqIHRoZSBwYXJlbnQgZWxlbWVudC5cbiAgICogQHBhcmFtIHRhYmxlQXJyYXlcbiAgICovXG4gIGNvbnN0IGZpeFRhYmxlcyA9ICh0YWJsZUFycmF5KSA9PiB7XG4gICAgdGFibGVBcnJheS5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgY29uc3QgeyBpbmRleCwgY2hpbGQsIHBhcmVudCB9ID0gZWw7XG4gICAgICBjb25zdCBub2Rlc0JlZm9yZSA9IFtdO1xuICAgICAgY29uc3Qgbm9kZXNBZnRlciA9IFtdO1xuICAgICAgY29uc3QgYWxsTm9kZXMgPSBBcnJheS5mcm9tKHBhcmVudC5jaGlsZE5vZGVzKTtcbiAgICAgIGxldCBpO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgYWxsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IGFsbE5vZGVzW2ldO1xuXG4gICAgICAgIGlmIChpIDwgaW5kZXgpIHtcbiAgICAgICAgICBub2Rlc0JlZm9yZS5wdXNoKG5vZGUpO1xuICAgICAgICB9IGVsc2UgaWYgKGkgPiBpbmRleCkge1xuICAgICAgICAgIG5vZGVzQWZ0ZXIucHVzaChub2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBjcmVhdGluZyB0aGUgZWxlbWVudCB0aGF0IGlzIGdvaW5nIHRvIGJlIHBsYWNlZCBpbnN0ZWFkIG9mIHRoZSBwYXJlbnRcbiAgICAgIGNvbnN0IGJlZm9yZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChwYXJlbnQubm9kZU5hbWUpO1xuXG4gICAgICBiZWZvcmVFbC5hcHBlbmQoLi4ubm9kZXNCZWZvcmUpO1xuXG4gICAgICAvLyByZXBsYWNpbmcgcGFyZW50IHdpdGggdGhlIGJlZm9yZUVsZW1lbnRcbiAgICAgIHBhcmVudC5yZXBsYWNlV2l0aChiZWZvcmVFbCk7XG5cbiAgICAgIC8vIGFkZGluZyB0aGUgdGFibGUgcmlnaHQgYWZ0ZXIgdGhlIGJlZm9yZSBlbGVtZW50XG4gICAgICBiZWZvcmVFbC5hZnRlcihjaGlsZCk7XG5cbiAgICAgIC8vIGNyZWF0aW5nIHRoZSBlbGVtZW50IHRoYXQgaXMgZ29pbmcgdG8gYmUgcGxhY2VkIGFmdGVyIHRoZSB0YWJsZVxuICAgICAgY29uc3QgYWZ0ZXJFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocGFyZW50Lm5vZGVOYW1lKTtcblxuICAgICAgYWZ0ZXJFbC5hcHBlbmQoLi4ubm9kZXNBZnRlcik7XG5cbiAgICAgIC8vIGFkZGluZyB0aGUgYWZ0ZXIgZWxlbWVudCBuZWFyIHRoZSB0YWJsZVxuICAgICAgY2hpbGQuYWZ0ZXIoYWZ0ZXJFbCk7XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgZW1wdHlCbG9ja0NoZWNrID0gKG5vZGUpID0+XG4gICAgKG5vZGUubm9kZU5hbWUgPT09ICdESVYnIHx8IG5vZGUubm9kZU5hbWUgPT09ICdQJyB8fCBub2RlLm5vZGVOYW1lID09PSAnTEknKSAmJiBub2RlLmNoaWxkTm9kZXMubGVuZ3RoID09PSAwO1xuXG4gIGNvbnN0IHBhcnNlTm9kZSA9IChlbCkgPT4ge1xuICAgIGNvbnN0IGNoaWxkQXJyYXkgPSBBcnJheS5mcm9tKGVsLmNoaWxkTm9kZXMpO1xuICAgIGNvbnN0IGhhc1BhcmFncmFwaHMgPSBjaGlsZEFycmF5LmZpbmQoKGNoaWxkKSA9PiBjaGlsZC5ub2RlTmFtZSA9PT0gJ1AnKTtcbiAgICBjb25zdCB0YWJsZXMgPSBbXTtcblxuICAgIGNoaWxkQXJyYXkuZm9yRWFjaCgoY2hpbGQsIGluZGV4KSA9PiB7XG4gICAgICAvLyByZW1vdmluZyBlbXB0eSBibG9ja3NcbiAgICAgIGlmIChlbXB0eUJsb2NrQ2hlY2soY2hpbGQpKSB7XG4gICAgICAgIGNoaWxkLnJlbW92ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNQYXJhZ3JhcGhzICYmIGNoaWxkLm5vZGVOYW1lID09PSAnRElWJykge1xuICAgICAgICBmaXhQYXJhZ3JhcGhzKGNoaWxkKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHdyYXBwZXJFbCAhPT0gZWwgJiYgY2hpbGQubm9kZU5hbWUgPT09ICdUQUJMRScpIHtcbiAgICAgICAgLy8gd2UgZG9uJ3QgbmVlZCB0byBmaXggdGFibGVzIGluIHRoZSByb290IGVsZW1lbnRcbiAgICAgICAgdGFibGVzLnB1c2goe1xuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIGNoaWxkLFxuICAgICAgICAgIHBhcmVudDogZWwsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBwYXJzZU5vZGUoY2hpbGQpO1xuICAgIH0pO1xuXG4gICAgaWYgKHRhYmxlcy5sZW5ndGgpIHtcbiAgICAgIGZpeFRhYmxlcyh0YWJsZXMpO1xuICAgIH1cbiAgfTtcblxuICBwYXJzZU5vZGUod3JhcHBlckVsKTtcblxuICByZXR1cm4gd3JhcHBlckVsLmlubmVySFRNTDtcbn07XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVIdG1sID0gKGh0bWwpID0+IGZpeEh0bWxDb2RlKHJlZHVjZVJlZHVuZGFudE5ld0xpbmVDaGFyYWN0ZXJzKHJlZHVjZU11bHRpcGxlQnJzKGh0bWwpKSk7XG5cbmV4cG9ydCBjb25zdCBodG1sVG9WYWx1ZSA9IChodG1sKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaGFuZGxlSHRtbChodG1sKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUubG9nKFwiQ291bGRuJ3QgcGFyc2UgaHRtbDogXCIsIGUpO1xuICAgIHJldHVybiB7fTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHZhbHVlVG9IdG1sID0gKHZhbHVlKSA9PiBzZXJpYWxpemVyLnNlcmlhbGl6ZSh2YWx1ZSk7XG5cbi8qKlxuICpcbiAqIDxkaXY+PGRpdj5hPC9kaXY+PC9kaXY+IC0+IDxkaXY+YTwvZGl2PlxuICpcbiAqIDxkaXY+PGRpdj5hPC9kaXY+PGRpdj5iPC9kaXY+PC9kaXY+IC0+IDxkaXY+YTwvZGl2PjxkaXY+YjwvZGl2PlxuICogPGRpdj48ZGl2PmE8L2Rpdj40NDQ0PGRpdj5iPC9kaXY+PC9kaXY+IC0+IDxkaXY+YTwvZGl2PjQ0NDQ8ZGl2PmI8L2Rpdj5cbiAqL1xuIl19