@pie-lib/editable-html 10.0.0-beta.4 → 10.0.0-beta.6
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 +255 -152
- package/lib/components.js +15 -39
- package/lib/components.js.map +1 -1
- package/lib/editor.js +200 -356
- package/lib/editor.js.map +1 -1
- package/lib/index.js +25 -49
- package/lib/index.js.map +1 -1
- package/lib/new-serialization.js +31 -71
- package/lib/new-serialization.js.map +1 -1
- package/lib/parse-html.js +7 -6
- package/lib/parse-html.js.map +1 -1
- package/lib/plugins/characters/custom-popper.js +3 -13
- package/lib/plugins/characters/custom-popper.js.map +1 -1
- package/lib/plugins/characters/index.js +20 -59
- package/lib/plugins/characters/index.js.map +1 -1
- package/lib/plugins/characters/utils.js +1 -1
- package/lib/plugins/characters/utils.js.map +1 -1
- package/lib/plugins/hotKeys/index.js +9 -16
- package/lib/plugins/hotKeys/index.js.map +1 -1
- package/lib/plugins/image/alt-dialog.js +6 -27
- package/lib/plugins/image/alt-dialog.js.map +1 -1
- package/lib/plugins/image/component.js +42 -99
- package/lib/plugins/image/component.js.map +1 -1
- package/lib/plugins/image/image-toolbar.js +14 -50
- package/lib/plugins/image/image-toolbar.js.map +1 -1
- package/lib/plugins/image/index.js +16 -59
- package/lib/plugins/image/index.js.map +1 -1
- package/lib/plugins/image/insert-image-handler.js +13 -25
- package/lib/plugins/image/insert-image-handler.js.map +1 -1
- package/lib/plugins/index.js +6 -36
- package/lib/plugins/index.js.map +1 -1
- package/lib/plugins/list/index.js +11 -46
- package/lib/plugins/list/index.js.map +1 -1
- package/lib/plugins/math/index.js +89 -93
- package/lib/plugins/math/index.js.map +1 -1
- package/lib/plugins/media/index.js +32 -109
- package/lib/plugins/media/index.js.map +1 -1
- package/lib/plugins/media/media-dialog.js +107 -195
- package/lib/plugins/media/media-dialog.js.map +1 -1
- package/lib/plugins/media/media-toolbar.js +7 -27
- package/lib/plugins/media/media-toolbar.js.map +1 -1
- package/lib/plugins/media/media-wrapper.js +9 -14
- package/lib/plugins/media/media-wrapper.js.map +1 -1
- package/lib/plugins/respArea/drag-in-the-blank/choice.js +13 -53
- package/lib/plugins/respArea/drag-in-the-blank/choice.js.map +1 -1
- package/lib/plugins/respArea/drag-in-the-blank/index.js +6 -20
- package/lib/plugins/respArea/drag-in-the-blank/index.js.map +1 -1
- package/lib/plugins/respArea/explicit-constructed-response/index.js +5 -10
- package/lib/plugins/respArea/explicit-constructed-response/index.js.map +1 -1
- package/lib/plugins/respArea/icons/index.js +16 -31
- package/lib/plugins/respArea/icons/index.js.map +1 -1
- package/lib/plugins/respArea/index.js +7 -54
- package/lib/plugins/respArea/index.js.map +1 -1
- package/lib/plugins/respArea/inline-dropdown/index.js +3 -10
- package/lib/plugins/respArea/inline-dropdown/index.js.map +1 -1
- package/lib/plugins/respArea/utils.js +6 -21
- package/lib/plugins/respArea/utils.js.map +1 -1
- package/lib/plugins/table/icons/index.js +1 -8
- package/lib/plugins/table/icons/index.js.map +1 -1
- package/lib/plugins/table/index.js +54 -187
- package/lib/plugins/table/index.js.map +1 -1
- package/lib/plugins/table/table-toolbar.js +12 -44
- package/lib/plugins/table/table-toolbar.js.map +1 -1
- package/lib/plugins/toolbar/default-toolbar.js +17 -46
- package/lib/plugins/toolbar/default-toolbar.js.map +1 -1
- package/lib/plugins/toolbar/done-button.js +2 -10
- package/lib/plugins/toolbar/done-button.js.map +1 -1
- package/lib/plugins/toolbar/editor-and-toolbar.js +134 -144
- package/lib/plugins/toolbar/editor-and-toolbar.js.map +1 -1
- package/lib/plugins/toolbar/index.js +2 -6
- package/lib/plugins/toolbar/index.js.map +1 -1
- package/lib/plugins/toolbar/toolbar-buttons.js +9 -40
- package/lib/plugins/toolbar/toolbar-buttons.js.map +1 -1
- package/lib/plugins/toolbar/toolbar.js +29 -83
- package/lib/plugins/toolbar/toolbar.js.map +1 -1
- package/lib/plugins/utils.js +8 -30
- package/lib/plugins/utils.js.map +1 -1
- package/lib/serialization.js +11 -69
- package/lib/serialization.js.map +1 -1
- package/lib/test-serializer.js +5 -56
- package/lib/test-serializer.js.map +1 -1
- package/lib/theme.js +1 -1
- package/lib/theme.js.map +1 -1
- package/package.json +7 -7
- package/playground/image/data.js +20 -20
- package/playground/image/index.html +20 -22
- package/playground/image/index.jsx +10 -12
- package/playground/index.html +23 -25
- package/playground/mathquill/index.html +20 -23
- package/playground/mathquill/index.jsx +22 -18
- package/playground/prod-test/index.html +20 -24
- package/playground/prod-test/index.jsx +3 -5
- package/playground/schema-override/data.js +10 -10
- package/playground/schema-override/image-plugin.jsx +4 -3
- package/playground/schema-override/index.html +19 -21
- package/playground/schema-override/index.jsx +14 -13
- package/playground/serialization/data.js +10 -10
- package/playground/serialization/image-plugin.jsx +4 -3
- package/playground/serialization/index.html +20 -22
- package/playground/table-examples.html +8 -5
- package/playground/webpack.config.js +10 -10
- package/src/editor.jsx +108 -104
- package/src/index.jsx +20 -13
- package/src/new-serialization.jsx +30 -11
- package/src/parse-html.js +1 -1
- package/src/plugins/characters/custom-popper.js +7 -7
- package/src/plugins/characters/index.jsx +34 -23
- package/src/plugins/characters/utils.js +81 -81
- package/src/plugins/image/alt-dialog.jsx +5 -4
- package/src/plugins/image/component.jsx +47 -44
- package/src/plugins/image/image-toolbar.jsx +19 -27
- package/src/plugins/image/index.jsx +24 -18
- package/src/plugins/image/insert-image-handler.js +9 -0
- package/src/plugins/index.jsx +7 -9
- package/src/plugins/list/index.jsx +7 -7
- package/src/plugins/math/index.jsx +71 -28
- package/src/plugins/media/index.jsx +7 -7
- package/src/plugins/media/media-dialog.js +63 -89
- package/src/plugins/media/media-toolbar.jsx +8 -8
- package/src/plugins/media/media-wrapper.jsx +8 -5
- package/src/plugins/respArea/drag-in-the-blank/choice.jsx +19 -21
- package/src/plugins/respArea/drag-in-the-blank/index.jsx +4 -4
- package/src/plugins/respArea/explicit-constructed-response/index.jsx +5 -4
- package/src/plugins/respArea/icons/index.jsx +14 -11
- package/src/plugins/respArea/index.jsx +9 -15
- package/src/plugins/respArea/inline-dropdown/index.jsx +6 -6
- package/src/plugins/respArea/utils.jsx +7 -3
- package/src/plugins/table/icons/index.jsx +11 -17
- package/src/plugins/table/index.jsx +14 -10
- package/src/plugins/table/table-toolbar.jsx +6 -6
- package/src/plugins/toolbar/default-toolbar.jsx +9 -9
- package/src/plugins/toolbar/done-button.jsx +4 -4
- package/src/plugins/toolbar/editor-and-toolbar.jsx +36 -33
- package/src/plugins/toolbar/index.jsx +3 -2
- package/src/plugins/toolbar/toolbar-buttons.jsx +11 -11
- package/src/plugins/toolbar/toolbar.jsx +6 -1
- package/src/plugins/utils.js +2 -2
- package/src/serialization.jsx +34 -32
- package/src/test-serializer.js +2 -9
- package/lib/old-serialization.js +0 -330
- package/lib/slate-editor.js +0 -302
- package/src/test-serializer.js.rej +0 -20
- package/yarn-error.log +0 -18318
package/lib/old-serialization.js
DELETED
|
@@ -1,330 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
Object.defineProperty(exports, "__esModule", {
|
|
6
|
-
value: true
|
|
7
|
-
});
|
|
8
|
-
exports.valueToHtml = exports.reactAttributes = exports.parseStyleString = exports.htmlToValue = exports.getBase64 = exports.TEXT_RULE = exports.BLOCK_TAGS = void 0;
|
|
9
|
-
|
|
10
|
-
var _testSerializer = _interopRequireDefault(require("./test-serializer"));
|
|
11
|
-
|
|
12
|
-
var _react = _interopRequireDefault(require("react"));
|
|
13
|
-
|
|
14
|
-
var _debug = _interopRequireDefault(require("debug"));
|
|
15
|
-
|
|
16
|
-
var _toStyle = require("to-style");
|
|
17
|
-
|
|
18
|
-
var _image = require("./plugins/image");
|
|
19
|
-
|
|
20
|
-
var _math = require("./plugins/math");
|
|
21
|
-
|
|
22
|
-
var _media = require("./plugins/media");
|
|
23
|
-
|
|
24
|
-
var _list = require("./plugins/list");
|
|
25
|
-
|
|
26
|
-
var _table = require("./plugins/table");
|
|
27
|
-
|
|
28
|
-
var _respArea = require("./plugins/respArea");
|
|
29
|
-
|
|
30
|
-
var _slate = require("slate");
|
|
31
|
-
|
|
32
|
-
var log = (0, _debug["default"])('@pie-lib:editable-html:serialization');
|
|
33
|
-
/**
|
|
34
|
-
* Tags to blocks.
|
|
35
|
-
*
|
|
36
|
-
* @type {Object}
|
|
37
|
-
*/
|
|
38
|
-
|
|
39
|
-
var BLOCK_TAGS = {
|
|
40
|
-
div: 'div',
|
|
41
|
-
span: 'span',
|
|
42
|
-
p: 'paragraph',
|
|
43
|
-
blockquote: 'quote',
|
|
44
|
-
pre: 'code',
|
|
45
|
-
h1: 'heading-one',
|
|
46
|
-
h2: 'heading-two',
|
|
47
|
-
h3: 'heading-three',
|
|
48
|
-
h4: 'heading-four',
|
|
49
|
-
h5: 'heading-five',
|
|
50
|
-
h6: 'heading-six'
|
|
51
|
-
};
|
|
52
|
-
/**
|
|
53
|
-
* Tags to marks.
|
|
54
|
-
*
|
|
55
|
-
* @type {Object}
|
|
56
|
-
*/
|
|
57
|
-
|
|
58
|
-
exports.BLOCK_TAGS = BLOCK_TAGS;
|
|
59
|
-
var MARK_TAGS = {
|
|
60
|
-
b: 'bold',
|
|
61
|
-
em: 'italic',
|
|
62
|
-
u: 'underline',
|
|
63
|
-
s: 'strikethrough',
|
|
64
|
-
code: 'code',
|
|
65
|
-
strong: 'bold'
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
var parseStyleString = function parseStyleString(s) {
|
|
69
|
-
var regex = /([\w-]*)\s*:\s*([^;]*)/g;
|
|
70
|
-
var match;
|
|
71
|
-
var result = {};
|
|
72
|
-
|
|
73
|
-
while (match = regex.exec(s)) {
|
|
74
|
-
result[match[1]] = match[2].trim();
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
return result;
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
exports.parseStyleString = parseStyleString;
|
|
81
|
-
|
|
82
|
-
var getBase64 = function getBase64(file) {
|
|
83
|
-
return new Promise(function (resolve, reject) {
|
|
84
|
-
var reader = new FileReader();
|
|
85
|
-
reader.readAsDataURL(file);
|
|
86
|
-
|
|
87
|
-
reader.onload = function () {
|
|
88
|
-
return resolve(reader.result);
|
|
89
|
-
};
|
|
90
|
-
|
|
91
|
-
reader.onerror = function (error) {
|
|
92
|
-
return reject(error);
|
|
93
|
-
};
|
|
94
|
-
});
|
|
95
|
-
};
|
|
96
|
-
|
|
97
|
-
exports.getBase64 = getBase64;
|
|
98
|
-
|
|
99
|
-
var reactAttributes = function reactAttributes(o) {
|
|
100
|
-
return (0, _toStyle.object)(o, {
|
|
101
|
-
camelize: true,
|
|
102
|
-
addUnits: false
|
|
103
|
-
});
|
|
104
|
-
};
|
|
105
|
-
|
|
106
|
-
exports.reactAttributes = reactAttributes;
|
|
107
|
-
|
|
108
|
-
var attributesToMap = function attributesToMap(el) {
|
|
109
|
-
return function (acc, attribute) {
|
|
110
|
-
var value = el.getAttribute(attribute);
|
|
111
|
-
|
|
112
|
-
if (value) {
|
|
113
|
-
if (attribute === 'style') {
|
|
114
|
-
var styleString = el.getAttribute(attribute);
|
|
115
|
-
var reactStyleObject = reactAttributes(parseStyleString(styleString));
|
|
116
|
-
acc['style'] = reactStyleObject;
|
|
117
|
-
} else {
|
|
118
|
-
acc[attribute] = el.getAttribute(attribute);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
return acc;
|
|
123
|
-
};
|
|
124
|
-
};
|
|
125
|
-
|
|
126
|
-
var attributes = ['border', 'cellpadding', 'cellspacing', 'class', 'style'];
|
|
127
|
-
/**
|
|
128
|
-
* Serializer rules.
|
|
129
|
-
*
|
|
130
|
-
* @type {Array}
|
|
131
|
-
*/
|
|
132
|
-
|
|
133
|
-
var blocks = {
|
|
134
|
-
deserialize: function deserialize(el, next) {
|
|
135
|
-
log('[blocks:deserialize] block: ', el);
|
|
136
|
-
var block = BLOCK_TAGS[el.tagName.toLowerCase()];
|
|
137
|
-
if (!block) return;
|
|
138
|
-
log('[blocks:deserialize] block: ', block);
|
|
139
|
-
|
|
140
|
-
if (el.childNodes.length === 1) {
|
|
141
|
-
var cn = el.childNodes[0];
|
|
142
|
-
|
|
143
|
-
if (cn && cn.tagName && cn.tagName.toLowerCase() === block) {
|
|
144
|
-
log('[we have a child node of the same]...');
|
|
145
|
-
return;
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
return {
|
|
150
|
-
object: 'block',
|
|
151
|
-
type: block,
|
|
152
|
-
|
|
153
|
-
/**
|
|
154
|
-
* Here for rendering styles for all block elements
|
|
155
|
-
*/
|
|
156
|
-
data: {
|
|
157
|
-
attributes: attributes.reduce(attributesToMap(el), {})
|
|
158
|
-
},
|
|
159
|
-
nodes: next(el.childNodes)
|
|
160
|
-
};
|
|
161
|
-
},
|
|
162
|
-
serialize: function serialize(object, children) {
|
|
163
|
-
if (object.object !== 'block') return;
|
|
164
|
-
var jsonData = object.data.toJSON();
|
|
165
|
-
log('[blocks:serialize] object: ', object, children);
|
|
166
|
-
var key;
|
|
167
|
-
|
|
168
|
-
for (key in BLOCK_TAGS) {
|
|
169
|
-
if (BLOCK_TAGS[key] === object.type) {
|
|
170
|
-
var Tag = key;
|
|
171
|
-
return /*#__PURE__*/_react["default"].createElement(Tag, jsonData.attributes, children);
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
};
|
|
176
|
-
var marks = {
|
|
177
|
-
deserialize: function deserialize(el, next) {
|
|
178
|
-
var mark = MARK_TAGS[el.tagName.toLowerCase()];
|
|
179
|
-
if (!mark) return;
|
|
180
|
-
log('[deserialize] mark: ', mark);
|
|
181
|
-
return {
|
|
182
|
-
object: 'mark',
|
|
183
|
-
type: mark,
|
|
184
|
-
nodes: next(el.childNodes)
|
|
185
|
-
};
|
|
186
|
-
},
|
|
187
|
-
serialize: function serialize(object, children) {
|
|
188
|
-
if (_slate.Mark.isMark(object)) {
|
|
189
|
-
for (var key in MARK_TAGS) {
|
|
190
|
-
if (MARK_TAGS[key] === object.type) {
|
|
191
|
-
var Tag = key;
|
|
192
|
-
return /*#__PURE__*/_react["default"].createElement(Tag, null, children);
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
};
|
|
198
|
-
|
|
199
|
-
var findPreviousText = function findPreviousText(el) {
|
|
200
|
-
if (el.nodeName === '#text') {
|
|
201
|
-
return el;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
if (el.previousSibling) {
|
|
205
|
-
return findPreviousText(el.previousSibling);
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
return null;
|
|
209
|
-
};
|
|
210
|
-
|
|
211
|
-
var TEXT_RULE = {
|
|
212
|
-
deserialize: function deserialize(el) {
|
|
213
|
-
/**
|
|
214
|
-
* This needs to be called on the dom element in order to merge the adjacent text nodes together
|
|
215
|
-
* */
|
|
216
|
-
el.normalize();
|
|
217
|
-
|
|
218
|
-
if (el.tagName && el.tagName.toLowerCase() === 'br') {
|
|
219
|
-
return {
|
|
220
|
-
object: 'text',
|
|
221
|
-
leaves: [{
|
|
222
|
-
object: 'leaf',
|
|
223
|
-
text: '\n'
|
|
224
|
-
}]
|
|
225
|
-
};
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
if (el.nodeName === '#text') {
|
|
229
|
-
if (el.nodeValue && el.nodeValue.match(/<!--.*?-->/)) return;
|
|
230
|
-
log('[text:deserialize] return text object..');
|
|
231
|
-
return {
|
|
232
|
-
object: 'text',
|
|
233
|
-
leaves: [{
|
|
234
|
-
object: 'leaf',
|
|
235
|
-
text: el.nodeValue
|
|
236
|
-
}]
|
|
237
|
-
};
|
|
238
|
-
}
|
|
239
|
-
},
|
|
240
|
-
serialize: function serialize(obj, children) {
|
|
241
|
-
if (obj.object === 'string') {
|
|
242
|
-
return children.split('\n').reduce(function (array, text, i) {
|
|
243
|
-
if (i !== 0) array.push( /*#__PURE__*/_react["default"].createElement("br", null));
|
|
244
|
-
array.push(text);
|
|
245
|
-
return array;
|
|
246
|
-
}, []);
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
};
|
|
250
|
-
exports.TEXT_RULE = TEXT_RULE;
|
|
251
|
-
var RULES = [_list.serialization, _math.serialization, _media.serialization, _image.serialization, _table.serialization, _respArea.serialization, TEXT_RULE, blocks, marks];
|
|
252
|
-
|
|
253
|
-
function allWhitespace(node) {
|
|
254
|
-
// Use ECMA-262 Edition 3 String and RegExp features
|
|
255
|
-
return !/[^\t\n\r ]/.test(node.textContent);
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
function defaultParseHtml(html) {
|
|
259
|
-
if (typeof DOMParser === 'undefined') {
|
|
260
|
-
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.');
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
var parsed = new DOMParser().parseFromString(html, 'text/html');
|
|
264
|
-
var body = parsed.body;
|
|
265
|
-
var textNodes = document.createTreeWalker(body, NodeFilter.SHOW_TEXT, null, null);
|
|
266
|
-
var n = textNodes.nextNode();
|
|
267
|
-
|
|
268
|
-
while (n) {
|
|
269
|
-
if (allWhitespace(n) || n.nodeValue === "\u200B") {
|
|
270
|
-
n.parentNode.removeChild(n);
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
n = textNodes.nextNode();
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
return body;
|
|
277
|
-
}
|
|
278
|
-
/** If this lib is used on the server side, we need to bypass using the DOMParser - just put in a stub. */
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
var parseHtml = typeof window === 'undefined' ? function () {
|
|
282
|
-
return {
|
|
283
|
-
childNodes: []
|
|
284
|
-
};
|
|
285
|
-
} : defaultParseHtml;
|
|
286
|
-
var serializer = new _testSerializer["default"]({
|
|
287
|
-
defaultBlock: 'div',
|
|
288
|
-
rules: RULES,
|
|
289
|
-
parseHtml: parseHtml
|
|
290
|
-
});
|
|
291
|
-
|
|
292
|
-
var _extends = Object.assign || function (target) {
|
|
293
|
-
for (var i = 1; i < arguments.length; i++) {
|
|
294
|
-
var source = arguments[i];
|
|
295
|
-
|
|
296
|
-
for (var key in source) {
|
|
297
|
-
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
298
|
-
target[key] = source[key];
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
return target;
|
|
304
|
-
};
|
|
305
|
-
|
|
306
|
-
var htmlToValue = function htmlToValue(html) {
|
|
307
|
-
try {
|
|
308
|
-
return serializer.deserialize(html);
|
|
309
|
-
} catch (e) {
|
|
310
|
-
console.log("Couldn't parse html: ", e);
|
|
311
|
-
return {};
|
|
312
|
-
}
|
|
313
|
-
};
|
|
314
|
-
|
|
315
|
-
exports.htmlToValue = htmlToValue;
|
|
316
|
-
|
|
317
|
-
var valueToHtml = function valueToHtml(value) {
|
|
318
|
-
return serializer.serialize(value);
|
|
319
|
-
};
|
|
320
|
-
/**
|
|
321
|
-
*
|
|
322
|
-
* <div><div>a</div></div> -> <div>a</div>
|
|
323
|
-
*
|
|
324
|
-
* <div><div>a</div><div>b</div></div> -> <div>a</div><div>b</div>
|
|
325
|
-
* <div><div>a</div>4444<div>b</div></div> -> <div>a</div>4444<div>b</div>
|
|
326
|
-
*/
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
exports.valueToHtml = valueToHtml;
|
|
330
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJsb2ciLCJkZWJ1ZyIsIkJMT0NLX1RBR1MiLCJkaXYiLCJzcGFuIiwicCIsImJsb2NrcXVvdGUiLCJwcmUiLCJoMSIsImgyIiwiaDMiLCJoNCIsImg1IiwiaDYiLCJNQVJLX1RBR1MiLCJiIiwiZW0iLCJ1IiwicyIsImNvZGUiLCJzdHJvbmciLCJwYXJzZVN0eWxlU3RyaW5nIiwicmVnZXgiLCJtYXRjaCIsInJlc3VsdCIsImV4ZWMiLCJ0cmltIiwiZ2V0QmFzZTY0IiwiZmlsZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwicmVhZGVyIiwiRmlsZVJlYWRlciIsInJlYWRBc0RhdGFVUkwiLCJvbmxvYWQiLCJvbmVycm9yIiwiZXJyb3IiLCJyZWFjdEF0dHJpYnV0ZXMiLCJvIiwidG9TdHlsZU9iamVjdCIsImNhbWVsaXplIiwiYWRkVW5pdHMiLCJhdHRyaWJ1dGVzVG9NYXAiLCJlbCIsImFjYyIsImF0dHJpYnV0ZSIsInZhbHVlIiwiZ2V0QXR0cmlidXRlIiwic3R5bGVTdHJpbmciLCJyZWFjdFN0eWxlT2JqZWN0IiwiYXR0cmlidXRlcyIsImJsb2NrcyIsImRlc2VyaWFsaXplIiwibmV4dCIsImJsb2NrIiwidGFnTmFtZSIsInRvTG93ZXJDYXNlIiwiY2hpbGROb2RlcyIsImxlbmd0aCIsImNuIiwib2JqZWN0IiwidHlwZSIsImRhdGEiLCJyZWR1Y2UiLCJub2RlcyIsInNlcmlhbGl6ZSIsImNoaWxkcmVuIiwianNvbkRhdGEiLCJ0b0pTT04iLCJrZXkiLCJUYWciLCJtYXJrcyIsIm1hcmsiLCJNYXJrIiwiaXNNYXJrIiwiZmluZFByZXZpb3VzVGV4dCIsIm5vZGVOYW1lIiwicHJldmlvdXNTaWJsaW5nIiwiVEVYVF9SVUxFIiwibm9ybWFsaXplIiwibGVhdmVzIiwidGV4dCIsIm5vZGVWYWx1ZSIsIm9iaiIsInNwbGl0IiwiYXJyYXkiLCJpIiwicHVzaCIsIlJVTEVTIiwibGlzdFNlcmlhbGl6YXRpb24iLCJtYXRoU2VyaWFsaXphdGlvbiIsIm1lZGlhU2VyaWFsaXphdGlvbiIsImltZ1NlcmlhbGl6YXRpb24iLCJ0YWJsZVNlcmlhbGl6YXRpb24iLCJyZXNwb25zZUFyZWFTZXJpYWxpemF0aW9uIiwiYWxsV2hpdGVzcGFjZSIsIm5vZGUiLCJ0ZXN0IiwidGV4dENvbnRlbnQiLCJkZWZhdWx0UGFyc2VIdG1sIiwiaHRtbCIsIkRPTVBhcnNlciIsIkVycm9yIiwicGFyc2VkIiwicGFyc2VGcm9tU3RyaW5nIiwiYm9keSIsInRleHROb2RlcyIsImRvY3VtZW50IiwiY3JlYXRlVHJlZVdhbGtlciIsIk5vZGVGaWx0ZXIiLCJTSE9XX1RFWFQiLCJuIiwibmV4dE5vZGUiLCJwYXJlbnROb2RlIiwicmVtb3ZlQ2hpbGQiLCJwYXJzZUh0bWwiLCJ3aW5kb3ciLCJzZXJpYWxpemVyIiwiSHRtbCIsImRlZmF1bHRCbG9jayIsInJ1bGVzIiwiX2V4dGVuZHMiLCJPYmplY3QiLCJhc3NpZ24iLCJ0YXJnZXQiLCJhcmd1bWVudHMiLCJzb3VyY2UiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJodG1sVG9WYWx1ZSIsImUiLCJjb25zb2xlIiwidmFsdWVUb0h0bWwiXSwic291cmNlcyI6WyIuLi9zcmMvb2xkLXNlcmlhbGl6YXRpb24uanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBIdG1sIGZyb20gJy4vdGVzdC1zZXJpYWxpemVyJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgZGVidWcgZnJvbSAnZGVidWcnO1xuaW1wb3J0IHsgb2JqZWN0IGFzIHRvU3R5bGVPYmplY3QgfSBmcm9tICd0by1zdHlsZSc7XG5cbmltcG9ydCB7IHNlcmlhbGl6YXRpb24gYXMgaW1nU2VyaWFsaXphdGlvbiB9IGZyb20gJy4vcGx1Z2lucy9pbWFnZSc7XG5pbXBvcnQgeyBzZXJpYWxpemF0aW9uIGFzIG1hdGhTZXJpYWxpemF0aW9uIH0gZnJvbSAnLi9wbHVnaW5zL21hdGgnO1xuaW1wb3J0IHsgc2VyaWFsaXphdGlvbiBhcyBtZWRpYVNlcmlhbGl6YXRpb24gfSBmcm9tICcuL3BsdWdpbnMvbWVkaWEnO1xuaW1wb3J0IHsgc2VyaWFsaXphdGlvbiBhcyBsaXN0U2VyaWFsaXphdGlvbiB9IGZyb20gJy4vcGx1Z2lucy9saXN0JztcbmltcG9ydCB7IHNlcmlhbGl6YXRpb24gYXMgdGFibGVTZXJpYWxpemF0aW9uIH0gZnJvbSAnLi9wbHVnaW5zL3RhYmxlJztcbmltcG9ydCB7IHNlcmlhbGl6YXRpb24gYXMgcmVzcG9uc2VBcmVhU2VyaWFsaXphdGlvbiB9IGZyb20gJy4vcGx1Z2lucy9yZXNwQXJlYSc7XG5pbXBvcnQgeyBNYXJrLCBWYWx1ZSB9IGZyb20gJ3NsYXRlJztcblxuY29uc3QgbG9nID0gZGVidWcoJ0BwaWUtbGliOmVkaXRhYmxlLWh0bWw6c2VyaWFsaXphdGlvbicpO1xuXG4vKipcbiAqIFRhZ3MgdG8gYmxvY2tzLlxuICpcbiAqIEB0eXBlIHtPYmplY3R9XG4gKi9cblxuZXhwb3J0IGNvbnN0IEJMT0NLX1RBR1MgPSB7XG4gIGRpdjogJ2RpdicsXG4gIHNwYW46ICdzcGFuJyxcbiAgcDogJ3BhcmFncmFwaCcsXG4gIGJsb2NrcXVvdGU6ICdxdW90ZScsXG4gIHByZTogJ2NvZGUnLFxuICBoMTogJ2hlYWRpbmctb25lJyxcbiAgaDI6ICdoZWFkaW5nLXR3bycsXG4gIGgzOiAnaGVhZGluZy10aHJlZScsXG4gIGg0OiAnaGVhZGluZy1mb3VyJyxcbiAgaDU6ICdoZWFkaW5nLWZpdmUnLFxuICBoNjogJ2hlYWRpbmctc2l4J1xufTtcblxuLyoqXG4gKiBUYWdzIHRvIG1hcmtzLlxuICpcbiAqIEB0eXBlIHtPYmplY3R9XG4gKi9cblxuY29uc3QgTUFSS19UQUdTID0ge1xuICBiOiAnYm9sZCcsXG4gIGVtOiAnaXRhbGljJyxcbiAgdTogJ3VuZGVybGluZScsXG4gIHM6ICdzdHJpa2V0aHJvdWdoJyxcbiAgY29kZTogJ2NvZGUnLFxuICBzdHJvbmc6ICdib2xkJ1xufTtcblxuZXhwb3J0IGNvbnN0IHBhcnNlU3R5bGVTdHJpbmcgPSBzID0+IHtcbiAgY29uc3QgcmVnZXggPSAvKFtcXHctXSopXFxzKjpcXHMqKFteO10qKS9nO1xuICBsZXQgbWF0Y2g7XG4gIGNvbnN0IHJlc3VsdCA9IHt9O1xuICB3aGlsZSAoKG1hdGNoID0gcmVnZXguZXhlYyhzKSkpIHtcbiAgICByZXN1bHRbbWF0Y2hbMV1dID0gbWF0Y2hbMl0udHJpbSgpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QmFzZTY0ID0gZmlsZSA9PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcbiAgICByZWFkZXIub25sb2FkID0gKCkgPT4gcmVzb2x2ZShyZWFkZXIucmVzdWx0KTtcbiAgICByZWFkZXIub25lcnJvciA9IGVycm9yID0+IHJlamVjdChlcnJvcik7XG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlYWN0QXR0cmlidXRlcyA9IG8gPT4gdG9TdHlsZU9iamVjdChvLCB7IGNhbWVsaXplOiB0cnVlLCBhZGRVbml0czogZmFsc2UgfSk7XG5cbmNvbnN0IGF0dHJpYnV0ZXNUb01hcCA9IGVsID0+IChhY2MsIGF0dHJpYnV0ZSkgPT4ge1xuICBjb25zdCB2YWx1ZSA9IGVsLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpO1xuICBpZiAodmFsdWUpIHtcbiAgICBpZiAoYXR0cmlidXRlID09PSAnc3R5bGUnKSB7XG4gICAgICBjb25zdCBzdHlsZVN0cmluZyA9IGVsLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpO1xuICAgICAgY29uc3QgcmVhY3RTdHlsZU9iamVjdCA9IHJlYWN0QXR0cmlidXRlcyhwYXJzZVN0eWxlU3RyaW5nKHN0eWxlU3RyaW5nKSk7XG4gICAgICBhY2NbJ3N0eWxlJ10gPSByZWFjdFN0eWxlT2JqZWN0O1xuICAgIH0gZWxzZSB7XG4gICAgICBhY2NbYXR0cmlidXRlXSA9IGVsLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYWNjO1xufTtcblxuY29uc3QgYXR0cmlidXRlcyA9IFsnYm9yZGVyJywgJ2NlbGxwYWRkaW5nJywgJ2NlbGxzcGFjaW5nJywgJ2NsYXNzJywgJ3N0eWxlJ107XG5cbi8qKlxuICogU2VyaWFsaXplciBydWxlcy5cbiAqXG4gKiBAdHlwZSB7QXJyYXl9XG4gKi9cblxuY29uc3QgYmxvY2tzID0ge1xuICBkZXNlcmlhbGl6ZShlbCwgbmV4dCkge1xuICAgIGxvZygnW2Jsb2NrczpkZXNlcmlhbGl6ZV0gYmxvY2s6ICcsIGVsKTtcbiAgICBjb25zdCBibG9jayA9IEJMT0NLX1RBR1NbZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpXTtcbiAgICBpZiAoIWJsb2NrKSByZXR1cm47XG4gICAgbG9nKCdbYmxvY2tzOmRlc2VyaWFsaXplXSBibG9jazogJywgYmxvY2spO1xuXG4gICAgaWYgKGVsLmNoaWxkTm9kZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBjbiA9IGVsLmNoaWxkTm9kZXNbMF07XG4gICAgICBpZiAoY24gJiYgY24udGFnTmFtZSAmJiBjbi50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IGJsb2NrKSB7XG4gICAgICAgIGxvZygnW3dlIGhhdmUgYSBjaGlsZCBub2RlIG9mIHRoZSBzYW1lXS4uLicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG9iamVjdDogJ2Jsb2NrJyxcbiAgICAgIHR5cGU6IGJsb2NrLFxuICAgICAgLyoqXG4gICAgICAgKiBIZXJlIGZvciByZW5kZXJpbmcgc3R5bGVzIGZvciBhbGwgYmxvY2sgZWxlbWVudHNcbiAgICAgICAqL1xuICAgICAgZGF0YTogeyBhdHRyaWJ1dGVzOiBhdHRyaWJ1dGVzLnJlZHVjZShhdHRyaWJ1dGVzVG9NYXAoZWwpLCB7fSkgfSxcbiAgICAgIG5vZGVzOiBuZXh0KGVsLmNoaWxkTm9kZXMpXG4gICAgfTtcbiAgfSxcbiAgc2VyaWFsaXplOiAob2JqZWN0LCBjaGlsZHJlbikgPT4ge1xuICAgIGlmIChvYmplY3Qub2JqZWN0ICE9PSAnYmxvY2snKSByZXR1cm47XG5cbiAgICBjb25zdCBqc29uRGF0YSA9IG9iamVjdC5kYXRhLnRvSlNPTigpO1xuXG4gICAgbG9nKCdbYmxvY2tzOnNlcmlhbGl6ZV0gb2JqZWN0OiAnLCBvYmplY3QsIGNoaWxkcmVuKTtcbiAgICBsZXQga2V5O1xuXG4gICAgZm9yIChrZXkgaW4gQkxPQ0tfVEFHUykge1xuICAgICAgaWYgKEJMT0NLX1RBR1Nba2V5XSA9PT0gb2JqZWN0LnR5cGUpIHtcbiAgICAgICAgY29uc3QgVGFnID0ga2V5O1xuXG4gICAgICAgIHJldHVybiA8VGFnIHsuLi5qc29uRGF0YS5hdHRyaWJ1dGVzfT57Y2hpbGRyZW59PC9UYWc+O1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuY29uc3QgbWFya3MgPSB7XG4gIGRlc2VyaWFsaXplKGVsLCBuZXh0KSB7XG4gICAgY29uc3QgbWFyayA9IE1BUktfVEFHU1tlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCldO1xuICAgIGlmICghbWFyaykgcmV0dXJuO1xuICAgIGxvZygnW2Rlc2VyaWFsaXplXSBtYXJrOiAnLCBtYXJrKTtcbiAgICByZXR1cm4ge1xuICAgICAgb2JqZWN0OiAnbWFyaycsXG4gICAgICB0eXBlOiBtYXJrLFxuICAgICAgbm9kZXM6IG5leHQoZWwuY2hpbGROb2RlcylcbiAgICB9O1xuICB9LFxuICBzZXJpYWxpemUob2JqZWN0LCBjaGlsZHJlbikge1xuICAgIGlmIChNYXJrLmlzTWFyayhvYmplY3QpKSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gTUFSS19UQUdTKSB7XG4gICAgICAgIGlmIChNQVJLX1RBR1Nba2V5XSA9PT0gb2JqZWN0LnR5cGUpIHtcbiAgICAgICAgICBjb25zdCBUYWcgPSBrZXk7XG4gICAgICAgICAgcmV0dXJuIDxUYWc+e2NoaWxkcmVufTwvVGFnPjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuY29uc3QgZmluZFByZXZpb3VzVGV4dCA9IGVsID0+IHtcbiAgaWYgKGVsLm5vZGVOYW1lID09PSAnI3RleHQnKSB7XG4gICAgcmV0dXJuIGVsO1xuICB9XG5cbiAgaWYgKGVsLnByZXZpb3VzU2libGluZykge1xuICAgIHJldHVybiBmaW5kUHJldmlvdXNUZXh0KGVsLnByZXZpb3VzU2libGluZyk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBURVhUX1JVTEUgPSB7XG4gIGRlc2VyaWFsaXplKGVsKSB7XG4gICAgLyoqXG4gICAgICogVGhpcyBuZWVkcyB0byBiZSBjYWxsZWQgb24gdGhlIGRvbSBlbGVtZW50IGluIG9yZGVyIHRvIG1lcmdlIHRoZSBhZGphY2VudCB0ZXh0IG5vZGVzIHRvZ2V0aGVyXG4gICAgICogKi9cbiAgICBlbC5ub3JtYWxpemUoKTtcblxuICAgIGlmIChlbC50YWdOYW1lICYmIGVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2JyJykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb2JqZWN0OiAndGV4dCcsXG4gICAgICAgIGxlYXZlczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG9iamVjdDogJ2xlYWYnLFxuICAgICAgICAgICAgdGV4dDogJ1xcbidcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKGVsLm5vZGVOYW1lID09PSAnI3RleHQnKSB7XG4gICAgICBpZiAoZWwubm9kZVZhbHVlICYmIGVsLm5vZGVWYWx1ZS5tYXRjaCgvPCEtLS4qPy0tPi8pKSByZXR1cm47XG5cbiAgICAgIGxvZygnW3RleHQ6ZGVzZXJpYWxpemVdIHJldHVybiB0ZXh0IG9iamVjdC4uJyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvYmplY3Q6ICd0ZXh0JyxcbiAgICAgICAgbGVhdmVzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgb2JqZWN0OiAnbGVhZicsXG4gICAgICAgICAgICB0ZXh0OiBlbC5ub2RlVmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH07XG4gICAgfVxuICB9LFxuXG4gIHNlcmlhbGl6ZShvYmosIGNoaWxkcmVuKSB7XG4gICAgaWYgKG9iai5vYmplY3QgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gY2hpbGRyZW4uc3BsaXQoJ1xcbicpLnJlZHVjZSgoYXJyYXksIHRleHQsIGkpID0+IHtcbiAgICAgICAgaWYgKGkgIT09IDApIGFycmF5LnB1c2goPGJyIC8+KTtcbiAgICAgICAgYXJyYXkucHVzaCh0ZXh0KTtcbiAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgICAgfSwgW10pO1xuICAgIH1cbiAgfVxufTtcblxuY29uc3QgUlVMRVMgPSBbXG4gIGxpc3RTZXJpYWxpemF0aW9uLFxuICBtYXRoU2VyaWFsaXphdGlvbixcbiAgbWVkaWFTZXJpYWxpemF0aW9uLFxuICBpbWdTZXJpYWxpemF0aW9uLFxuICB0YWJsZVNlcmlhbGl6YXRpb24sXG4gIHJlc3BvbnNlQXJlYVNlcmlhbGl6YXRpb24sXG4gIFRFWFRfUlVMRSxcbiAgYmxvY2tzLFxuICBtYXJrc1xuXTtcblxuZnVuY3Rpb24gYWxsV2hpdGVzcGFjZShub2RlKSB7XG4gIC8vIFVzZSBFQ01BLTI2MiBFZGl0aW9uIDMgU3RyaW5nIGFuZCBSZWdFeHAgZmVhdHVyZXNcbiAgcmV0dXJuICEvW15cXHRcXG5cXHIgXS8udGVzdChub2RlLnRleHRDb250ZW50KTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFBhcnNlSHRtbChodG1sKSB7XG4gIGlmICh0eXBlb2YgRE9NUGFyc2VyID09PSAndW5kZWZpbmVkJykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdUaGUgbmF0aXZlIGBET01QYXJzZXJgIGdsb2JhbCB3aGljaCB0aGUgYEh0bWxgIHNlcmlhbGl6ZXIgdXNlcyBieSBkZWZhdWx0IGlzIG5vdCBwcmVzZW50IGluIHRoaXMgZW52aXJvbm1lbnQuIFlvdSBtdXN0IHN1cHBseSB0aGUgYG9wdGlvbnMucGFyc2VIdG1sYCBmdW5jdGlvbiBpbnN0ZWFkLidcbiAgICApO1xuICB9XG5cbiAgY29uc3QgcGFyc2VkID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhodG1sLCAndGV4dC9odG1sJyk7XG5cbiAgY29uc3QgeyBib2R5IH0gPSBwYXJzZWQ7XG4gIGNvbnN0IHRleHROb2RlcyA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoYm9keSwgTm9kZUZpbHRlci5TSE9XX1RFWFQsIG51bGwsIG51bGwpO1xuICBsZXQgbiA9IHRleHROb2Rlcy5uZXh0Tm9kZSgpO1xuXG4gIHdoaWxlIChuKSB7XG4gICAgaWYgKGFsbFdoaXRlc3BhY2UobikgfHwgbi5ub2RlVmFsdWUgPT09ICdcXHUyMDBCJykge1xuICAgICAgbi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG4pO1xuICAgIH1cbiAgICBuID0gdGV4dE5vZGVzLm5leHROb2RlKCk7XG4gIH1cblxuICByZXR1cm4gYm9keTtcbn1cblxuLyoqIElmIHRoaXMgbGliIGlzIHVzZWQgb24gdGhlIHNlcnZlciBzaWRlLCB3ZSBuZWVkIHRvIGJ5cGFzcyB1c2luZyB0aGUgRE9NUGFyc2VyIC0ganVzdCBwdXQgaW4gYSBzdHViLiAqL1xuY29uc3QgcGFyc2VIdG1sID1cbiAgdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCdcbiAgICA/ICgpID0+ICh7XG4gICAgICAgIGNoaWxkTm9kZXM6IFtdXG4gICAgICB9KVxuICAgIDogZGVmYXVsdFBhcnNlSHRtbDtcblxuY29uc3Qgc2VyaWFsaXplciA9IG5ldyBIdG1sKHtcbiAgZGVmYXVsdEJsb2NrOiAnZGl2JyxcbiAgcnVsZXM6IFJVTEVTLFxuICBwYXJzZUh0bWxcbn0pO1xuXG5jb25zdCBfZXh0ZW5kcyA9XG4gIE9iamVjdC5hc3NpZ24gfHxcbiAgZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG5cbiAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcblxuZXhwb3J0IGNvbnN0IGh0bWxUb1ZhbHVlID0gaHRtbCA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaHRtbCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmxvZyhcIkNvdWxkbid0IHBhcnNlIGh0bWw6IFwiLCBlKTtcbiAgICByZXR1cm4ge307XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCB2YWx1ZVRvSHRtbCA9IHZhbHVlID0+IHNlcmlhbGl6ZXIuc2VyaWFsaXplKHZhbHVlKTtcblxuLyoqXG4gKlxuICogPGRpdj48ZGl2PmE8L2Rpdj48L2Rpdj4gLT4gPGRpdj5hPC9kaXY+XG4gKlxuICogPGRpdj48ZGl2PmE8L2Rpdj48ZGl2PmI8L2Rpdj48L2Rpdj4gLT4gPGRpdj5hPC9kaXY+PGRpdj5iPC9kaXY+XG4gKiA8ZGl2PjxkaXY+YTwvZGl2PjQ0NDQ8ZGl2PmI8L2Rpdj48L2Rpdj4gLT4gPGRpdj5hPC9kaXY+NDQ0NDxkaXY+YjwvZGl2PlxuICovXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLElBQU1BLEdBQUcsR0FBRyxJQUFBQyxpQkFBQSxFQUFNLHNDQUFOLENBQVo7QUFFQTtBQUNBO0FBQ0E7QUFD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
|