@pie-lib/editable-html-tip-tap 1.0.0
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.json +32 -0
- package/CHANGELOG.md +2280 -0
- package/lib/__tests__/editor.test.js +470 -0
- package/lib/__tests__/serialization.test.js +246 -0
- package/lib/__tests__/utils.js +106 -0
- package/lib/block-tags.js +25 -0
- package/lib/constants.js +16 -0
- package/lib/editor.js +1356 -0
- package/lib/extensions/MediaView.js +112 -0
- package/lib/extensions/characters.js +65 -0
- package/lib/extensions/component.js +325 -0
- package/lib/extensions/css.js +252 -0
- package/lib/extensions/custom-toolbar-wrapper.js +124 -0
- package/lib/extensions/image.js +106 -0
- package/lib/extensions/math.js +330 -0
- package/lib/extensions/media.js +276 -0
- package/lib/extensions/responseArea.js +278 -0
- package/lib/index.js +1213 -0
- package/lib/old-index.js +269 -0
- package/lib/parse-html.js +16 -0
- package/lib/plugins/characters/custom-popper.js +73 -0
- package/lib/plugins/characters/index.js +305 -0
- package/lib/plugins/characters/utils.js +381 -0
- package/lib/plugins/css/icons/index.js +37 -0
- package/lib/plugins/css/index.js +390 -0
- package/lib/plugins/customPlugin/index.js +114 -0
- package/lib/plugins/html/icons/index.js +38 -0
- package/lib/plugins/html/index.js +81 -0
- package/lib/plugins/image/__tests__/component.test.js +51 -0
- package/lib/plugins/image/__tests__/image-toolbar-logic.test.js +56 -0
- package/lib/plugins/image/__tests__/image-toolbar.test.js +26 -0
- package/lib/plugins/image/__tests__/index.test.js +98 -0
- package/lib/plugins/image/__tests__/insert-image-handler.test.js +125 -0
- package/lib/plugins/image/__tests__/mock-change.js +25 -0
- package/lib/plugins/image/alt-dialog.js +129 -0
- package/lib/plugins/image/component.js +419 -0
- package/lib/plugins/image/image-toolbar.js +177 -0
- package/lib/plugins/image/index.js +263 -0
- package/lib/plugins/image/insert-image-handler.js +117 -0
- package/lib/plugins/index.js +413 -0
- package/lib/plugins/list/__tests__/index.test.js +79 -0
- package/lib/plugins/list/index.js +334 -0
- package/lib/plugins/math/__tests__/index.test.js +300 -0
- package/lib/plugins/math/index.js +454 -0
- package/lib/plugins/media/__tests__/index.test.js +71 -0
- package/lib/plugins/media/index.js +387 -0
- package/lib/plugins/media/media-dialog.js +709 -0
- package/lib/plugins/media/media-toolbar.js +101 -0
- package/lib/plugins/media/media-wrapper.js +93 -0
- package/lib/plugins/rendering/index.js +46 -0
- package/lib/plugins/respArea/drag-in-the-blank/choice.js +289 -0
- package/lib/plugins/respArea/drag-in-the-blank/index.js +94 -0
- package/lib/plugins/respArea/explicit-constructed-response/index.js +120 -0
- package/lib/plugins/respArea/icons/index.js +95 -0
- package/lib/plugins/respArea/index.js +341 -0
- package/lib/plugins/respArea/inline-dropdown/index.js +126 -0
- package/lib/plugins/respArea/math-templated/index.js +130 -0
- package/lib/plugins/respArea/utils.js +125 -0
- package/lib/plugins/table/CustomTablePlugin.js +133 -0
- package/lib/plugins/table/__tests__/index.test.js +442 -0
- package/lib/plugins/table/__tests__/table-toolbar.test.js +54 -0
- package/lib/plugins/table/icons/index.js +69 -0
- package/lib/plugins/table/index.js +483 -0
- package/lib/plugins/table/table-toolbar.js +187 -0
- package/lib/plugins/textAlign/icons/index.js +194 -0
- package/lib/plugins/textAlign/index.js +34 -0
- package/lib/plugins/toolbar/__tests__/default-toolbar.test.js +128 -0
- package/lib/plugins/toolbar/__tests__/editor-and-toolbar.test.js +51 -0
- package/lib/plugins/toolbar/__tests__/toolbar-buttons.test.js +54 -0
- package/lib/plugins/toolbar/__tests__/toolbar.test.js +120 -0
- package/lib/plugins/toolbar/default-toolbar.js +229 -0
- package/lib/plugins/toolbar/done-button.js +53 -0
- package/lib/plugins/toolbar/editor-and-toolbar.js +286 -0
- package/lib/plugins/toolbar/index.js +34 -0
- package/lib/plugins/toolbar/toolbar-buttons.js +194 -0
- package/lib/plugins/toolbar/toolbar.js +376 -0
- package/lib/plugins/utils.js +62 -0
- package/lib/serialization.js +677 -0
- package/lib/shared/alert-dialog.js +75 -0
- package/lib/theme.js +9 -0
- package/package.json +69 -0
- package/src/__tests__/editor.test.jsx +363 -0
- package/src/__tests__/serialization.test.js +291 -0
- package/src/__tests__/utils.js +36 -0
- package/src/block-tags.js +17 -0
- package/src/constants.js +7 -0
- package/src/editor.jsx +1197 -0
- package/src/extensions/characters.js +46 -0
- package/src/extensions/component.jsx +294 -0
- package/src/extensions/css.js +217 -0
- package/src/extensions/custom-toolbar-wrapper.jsx +100 -0
- package/src/extensions/image.js +55 -0
- package/src/extensions/math.js +259 -0
- package/src/extensions/media.js +182 -0
- package/src/extensions/responseArea.js +205 -0
- package/src/index.jsx +1462 -0
- package/src/old-index.jsx +162 -0
- package/src/parse-html.js +8 -0
- package/src/plugins/README.md +27 -0
- package/src/plugins/characters/custom-popper.js +48 -0
- package/src/plugins/characters/index.jsx +284 -0
- package/src/plugins/characters/utils.js +447 -0
- package/src/plugins/css/icons/index.jsx +17 -0
- package/src/plugins/css/index.jsx +340 -0
- package/src/plugins/customPlugin/index.jsx +85 -0
- package/src/plugins/html/icons/index.jsx +19 -0
- package/src/plugins/html/index.jsx +72 -0
- package/src/plugins/image/__tests__/__snapshots__/component.test.jsx.snap +51 -0
- package/src/plugins/image/__tests__/__snapshots__/image-toolbar-logic.test.jsx.snap +27 -0
- package/src/plugins/image/__tests__/__snapshots__/image-toolbar.test.jsx.snap +44 -0
- package/src/plugins/image/__tests__/component.test.jsx +41 -0
- package/src/plugins/image/__tests__/image-toolbar-logic.test.jsx +42 -0
- package/src/plugins/image/__tests__/image-toolbar.test.jsx +11 -0
- package/src/plugins/image/__tests__/index.test.js +95 -0
- package/src/plugins/image/__tests__/insert-image-handler.test.js +113 -0
- package/src/plugins/image/__tests__/mock-change.js +15 -0
- package/src/plugins/image/alt-dialog.jsx +82 -0
- package/src/plugins/image/component.jsx +343 -0
- package/src/plugins/image/image-toolbar.jsx +100 -0
- package/src/plugins/image/index.jsx +227 -0
- package/src/plugins/image/insert-image-handler.js +79 -0
- package/src/plugins/index.jsx +377 -0
- package/src/plugins/list/__tests__/index.test.js +54 -0
- package/src/plugins/list/index.jsx +305 -0
- package/src/plugins/math/__tests__/__snapshots__/index.test.jsx.snap +48 -0
- package/src/plugins/math/__tests__/index.test.jsx +245 -0
- package/src/plugins/math/index.jsx +379 -0
- package/src/plugins/media/__tests__/index.test.js +75 -0
- package/src/plugins/media/index.jsx +325 -0
- package/src/plugins/media/media-dialog.js +624 -0
- package/src/plugins/media/media-toolbar.jsx +56 -0
- package/src/plugins/media/media-wrapper.jsx +43 -0
- package/src/plugins/rendering/index.js +31 -0
- package/src/plugins/respArea/drag-in-the-blank/choice.jsx +215 -0
- package/src/plugins/respArea/drag-in-the-blank/index.jsx +70 -0
- package/src/plugins/respArea/explicit-constructed-response/index.jsx +92 -0
- package/src/plugins/respArea/icons/index.jsx +71 -0
- package/src/plugins/respArea/index.jsx +299 -0
- package/src/plugins/respArea/inline-dropdown/index.jsx +108 -0
- package/src/plugins/respArea/math-templated/index.jsx +104 -0
- package/src/plugins/respArea/utils.jsx +90 -0
- package/src/plugins/table/CustomTablePlugin.js +113 -0
- package/src/plugins/table/__tests__/__snapshots__/table-toolbar.test.jsx.snap +44 -0
- package/src/plugins/table/__tests__/index.test.jsx +401 -0
- package/src/plugins/table/__tests__/table-toolbar.test.jsx +42 -0
- package/src/plugins/table/icons/index.jsx +53 -0
- package/src/plugins/table/index.jsx +427 -0
- package/src/plugins/table/table-toolbar.jsx +136 -0
- package/src/plugins/textAlign/icons/index.jsx +114 -0
- package/src/plugins/textAlign/index.jsx +23 -0
- package/src/plugins/toolbar/__tests__/__snapshots__/default-toolbar.test.jsx.snap +923 -0
- package/src/plugins/toolbar/__tests__/__snapshots__/editor-and-toolbar.test.jsx.snap +20 -0
- package/src/plugins/toolbar/__tests__/__snapshots__/toolbar-buttons.test.jsx.snap +36 -0
- package/src/plugins/toolbar/__tests__/__snapshots__/toolbar.test.jsx.snap +46 -0
- package/src/plugins/toolbar/__tests__/default-toolbar.test.jsx +94 -0
- package/src/plugins/toolbar/__tests__/editor-and-toolbar.test.jsx +37 -0
- package/src/plugins/toolbar/__tests__/toolbar-buttons.test.jsx +51 -0
- package/src/plugins/toolbar/__tests__/toolbar.test.jsx +106 -0
- package/src/plugins/toolbar/default-toolbar.jsx +206 -0
- package/src/plugins/toolbar/done-button.jsx +38 -0
- package/src/plugins/toolbar/editor-and-toolbar.jsx +257 -0
- package/src/plugins/toolbar/index.jsx +23 -0
- package/src/plugins/toolbar/toolbar-buttons.jsx +138 -0
- package/src/plugins/toolbar/toolbar.jsx +338 -0
- package/src/plugins/utils.js +31 -0
- package/src/serialization.jsx +621 -0
- package/src/theme.js +1 -0
|
@@ -0,0 +1,677 @@
|
|
|
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
|