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