@projectcor/maia-components 2.11.38 → 2.11.39-1
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/lib/components/atoms/MAIAInput/MAIAInput.js +193 -305
- package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +269 -0
- package/lib/components/atoms/MAIAInput/styles.js +83 -48
- package/lib/components/atoms/icons/AnthropicLogoIcon.js +22 -0
- package/lib/components/atoms/icons/GeminiLogoIcon.js +42 -0
- package/lib/components/atoms/icons/OpenAILogoIcon.js +22 -0
- package/lib/components/atoms/icons/index.js +4 -1
- package/lib/components/molecules/AbmSection/AbmGeneralSection.js +27 -7
- package/lib/components/molecules/AbmSection/AbmGeneralSection.styles.js +26 -14
- package/lib/components/molecules/AbmSection/AgentModelProviderIcon.js +32 -0
- package/lib/types/agent.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
2
|
+
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
|
|
3
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
4
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
5
|
+
/* eslint-disable no-restricted-syntax */
|
|
6
|
+
/* eslint-disable no-continue */
|
|
7
|
+
/* eslint-disable no-void */
|
|
8
|
+
/* eslint-disable prefer-destructuring */
|
|
9
|
+
import { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';
|
|
10
|
+
import { StyledMAIAInput } from './styles';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Líneas visuales con wrap de palabras al ancho dado (aprox. el navegador en LTR).
|
|
14
|
+
*/
|
|
15
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
16
|
+
function countVisualLinesWrapped(raw, contentWidthPx, measureTextWidth) {
|
|
17
|
+
if (contentWidthPx <= 1) {
|
|
18
|
+
return 1;
|
|
19
|
+
}
|
|
20
|
+
var paragraphs = raw.split('\n');
|
|
21
|
+
var total = 0;
|
|
22
|
+
var _iterator = _createForOfIteratorHelper(paragraphs),
|
|
23
|
+
_step;
|
|
24
|
+
try {
|
|
25
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
26
|
+
var paragraph = _step.value;
|
|
27
|
+
if (paragraph.length === 0) {
|
|
28
|
+
total += 1;
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
var words = paragraph.split(/\s+/).filter(function (w) {
|
|
32
|
+
return w.length > 0;
|
|
33
|
+
});
|
|
34
|
+
var linesInParagraph = 1;
|
|
35
|
+
var currentLineWidth = 0;
|
|
36
|
+
for (var i = 0; i < words.length; i += 1) {
|
|
37
|
+
var word = words[i];
|
|
38
|
+
var wordWidth = measureTextWidth(word);
|
|
39
|
+
var spaceWidth = i > 0 ? measureTextWidth(' ') : 0;
|
|
40
|
+
if (wordWidth > contentWidthPx) {
|
|
41
|
+
if (currentLineWidth > 0) {
|
|
42
|
+
linesInParagraph += 1;
|
|
43
|
+
currentLineWidth = 0;
|
|
44
|
+
}
|
|
45
|
+
linesInParagraph += Math.ceil(wordWidth / contentWidthPx) - 1;
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
var candidateWidth = currentLineWidth === 0 ? wordWidth : currentLineWidth + spaceWidth + wordWidth;
|
|
49
|
+
if (candidateWidth > contentWidthPx && currentLineWidth > 0) {
|
|
50
|
+
linesInParagraph += 1;
|
|
51
|
+
currentLineWidth = wordWidth;
|
|
52
|
+
} else {
|
|
53
|
+
currentLineWidth = candidateWidth;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
total += linesInParagraph;
|
|
57
|
+
}
|
|
58
|
+
} catch (err) {
|
|
59
|
+
_iterator.e(err);
|
|
60
|
+
} finally {
|
|
61
|
+
_iterator.f();
|
|
62
|
+
}
|
|
63
|
+
return Math.max(1, total);
|
|
64
|
+
}
|
|
65
|
+
export var MAIAInputEditor = function MAIAInputEditor(_ref) {
|
|
66
|
+
var inputRef = _ref.inputRef,
|
|
67
|
+
disabled = _ref.disabled,
|
|
68
|
+
placeholder = _ref.placeholder,
|
|
69
|
+
alignButtons = _ref.alignButtons,
|
|
70
|
+
compactSingleRowToolbar = _ref.compactSingleRowToolbar,
|
|
71
|
+
setIsTextMultiline = _ref.setIsTextMultiline,
|
|
72
|
+
chatId = _ref.chatId,
|
|
73
|
+
newChatKey = _ref.newChatKey,
|
|
74
|
+
clearSeq = _ref.clearSeq,
|
|
75
|
+
sendDisabled = _ref.sendDisabled,
|
|
76
|
+
onTypingPresenceChange = _ref.onTypingPresenceChange,
|
|
77
|
+
onEnterSend = _ref.onEnterSend,
|
|
78
|
+
onChangeProp = _ref.onChangeProp;
|
|
79
|
+
var textareaMinContentWidthSeenRef = useRef(null);
|
|
80
|
+
var presencePrevRef = useRef(false);
|
|
81
|
+
/** Solo para re-agendar medición de alto sin guardar el string en el padre (aisla re-renders del toolbar). */
|
|
82
|
+
var _useState = useState(0),
|
|
83
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
84
|
+
resizeEpoch = _useState2[0],
|
|
85
|
+
setResizeEpoch = _useState2[1];
|
|
86
|
+
var handleResize = useCallback(function () {
|
|
87
|
+
var _textareaMinContentWi;
|
|
88
|
+
var textarea = inputRef.current;
|
|
89
|
+
if (!textarea) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** Coincide con StyledMAIAInput: line-height 20px sobre fuente 14px (~una línea de texto visible). */
|
|
94
|
+
var minHeight = 20;
|
|
95
|
+
var maxHeight = 120;
|
|
96
|
+
var previousMinHeight = textarea.style.minHeight;
|
|
97
|
+
var previousMaxHeight = textarea.style.maxHeight;
|
|
98
|
+
textarea.style.height = 'auto';
|
|
99
|
+
textarea.style.minHeight = '0px';
|
|
100
|
+
textarea.style.maxHeight = 'none';
|
|
101
|
+
void textarea.offsetHeight;
|
|
102
|
+
var scrollHeight = textarea.scrollHeight;
|
|
103
|
+
var computedStyle = window.getComputedStyle(textarea);
|
|
104
|
+
var lineHeight = parseFloat(computedStyle.lineHeight) || 20;
|
|
105
|
+
var paddingTop = parseFloat(computedStyle.paddingTop) || 0;
|
|
106
|
+
var paddingBottom = parseFloat(computedStyle.paddingBottom) || 0;
|
|
107
|
+
var borderTop = parseFloat(computedStyle.borderTopWidth) || 0;
|
|
108
|
+
var borderBottom = parseFloat(computedStyle.borderBottomWidth) || 0;
|
|
109
|
+
var singleLineHeight = lineHeight + paddingTop + paddingBottom + borderTop + borderBottom;
|
|
110
|
+
var isEmpty = textarea.value.trim() === '';
|
|
111
|
+
var paddingLeft = parseFloat(computedStyle.paddingLeft) || 0;
|
|
112
|
+
var paddingRight = parseFloat(computedStyle.paddingRight) || 0;
|
|
113
|
+
var borderLeft = parseFloat(computedStyle.borderLeftWidth) || 0;
|
|
114
|
+
var borderRight = parseFloat(computedStyle.borderRightWidth) || 0;
|
|
115
|
+
var textareaWidth = textarea.offsetWidth - paddingLeft - paddingRight - borderLeft - borderRight;
|
|
116
|
+
if (!isEmpty) {
|
|
117
|
+
textareaMinContentWidthSeenRef.current = textareaMinContentWidthSeenRef.current === null ? textareaWidth : Math.min(textareaMinContentWidthSeenRef.current, textareaWidth);
|
|
118
|
+
}
|
|
119
|
+
var wrapCheckWidth = (_textareaMinContentWi = textareaMinContentWidthSeenRef.current) !== null && _textareaMinContentWi !== void 0 ? _textareaMinContentWi : textareaWidth;
|
|
120
|
+
var canvasMeasureIndicatesMultiline = false;
|
|
121
|
+
var canvas = document.createElement('canvas');
|
|
122
|
+
var canvasContext = canvas.getContext('2d');
|
|
123
|
+
var text = textarea.value || '';
|
|
124
|
+
var lines = text.split('\n');
|
|
125
|
+
if (!canvasContext) {
|
|
126
|
+
canvasMeasureIndicatesMultiline = scrollHeight > singleLineHeight * 2.05;
|
|
127
|
+
} else {
|
|
128
|
+
var textareaStyles = window.getComputedStyle(textarea);
|
|
129
|
+
canvasContext.font = "".concat(textareaStyles.fontWeight, " ").concat(textareaStyles.fontSize, " ").concat(textareaStyles.fontFamily);
|
|
130
|
+
if (lines.length > 1) {
|
|
131
|
+
canvasMeasureIndicatesMultiline = true;
|
|
132
|
+
} else {
|
|
133
|
+
var _iterator2 = _createForOfIteratorHelper(lines),
|
|
134
|
+
_step2;
|
|
135
|
+
try {
|
|
136
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
137
|
+
var line = _step2.value;
|
|
138
|
+
if (line.trim() === '') continue;
|
|
139
|
+
if (canvasContext.measureText(line).width > wrapCheckWidth) {
|
|
140
|
+
canvasMeasureIndicatesMultiline = true;
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
} catch (err) {
|
|
145
|
+
_iterator2.e(err);
|
|
146
|
+
} finally {
|
|
147
|
+
_iterator2.f();
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
var hasMultipleVisualLines = canvasMeasureIndicatesMultiline;
|
|
152
|
+
var nextMultiline = !isEmpty && hasMultipleVisualLines;
|
|
153
|
+
|
|
154
|
+
/** Líneas según ancho estrecho (history min) — toolbar compacto y detección multiline */
|
|
155
|
+
var visualLinesAtWrapWidth = 1;
|
|
156
|
+
/** Líneas al ancho actual del textarea — en stacked suele ser mayor que wrapCheckWidth */
|
|
157
|
+
var visualLinesAtCurrentWidth = 1;
|
|
158
|
+
if (!isEmpty && canvasContext) {
|
|
159
|
+
visualLinesAtWrapWidth = countVisualLinesWrapped(text, wrapCheckWidth, function (segment) {
|
|
160
|
+
return canvasContext.measureText(segment).width;
|
|
161
|
+
});
|
|
162
|
+
visualLinesAtCurrentWidth = countVisualLinesWrapped(text, textareaWidth, function (segment) {
|
|
163
|
+
return canvasContext.measureText(segment).width;
|
|
164
|
+
});
|
|
165
|
+
} else if (!isEmpty && !canvasContext) {
|
|
166
|
+
visualLinesAtWrapWidth = scrollHeight > singleLineHeight * 1.85 ? Math.ceil(scrollHeight / singleLineHeight) : 1;
|
|
167
|
+
visualLinesAtCurrentWidth = visualLinesAtWrapWidth;
|
|
168
|
+
}
|
|
169
|
+
var linesForHeight = !isEmpty && canvasContext ? visualLinesAtCurrentWidth : visualLinesAtWrapWidth;
|
|
170
|
+
var newHeight;
|
|
171
|
+
/** Una línea al ancho actual: altura fijada por tipografía (+ padding/borde), no scrollHeight — evita ~39px al pasar a stacked cuando el canvas ya cuenta 1 línea a ancho amplio pero scrollHeight aún viene de líneas viejas/wrap anterior. */
|
|
172
|
+
var snappedSingleLineOuterHeight = Math.round(singleLineHeight);
|
|
173
|
+
if (isEmpty) {
|
|
174
|
+
newHeight = snappedSingleLineOuterHeight;
|
|
175
|
+
} else if (!hasMultipleVisualLines) {
|
|
176
|
+
newHeight = snappedSingleLineOuterHeight;
|
|
177
|
+
} else if (linesForHeight <= 1) {
|
|
178
|
+
newHeight = Math.min(Math.max(snappedSingleLineOuterHeight, minHeight), maxHeight);
|
|
179
|
+
} else {
|
|
180
|
+
var snappedHeight = paddingTop + paddingBottom + borderTop + borderBottom + linesForHeight * lineHeight;
|
|
181
|
+
newHeight = Math.min(Math.max(Math.min(scrollHeight, snappedHeight), minHeight), maxHeight);
|
|
182
|
+
}
|
|
183
|
+
setIsTextMultiline(function (prev) {
|
|
184
|
+
return prev === nextMultiline ? prev : nextMultiline;
|
|
185
|
+
});
|
|
186
|
+
textarea.style.minHeight = previousMinHeight || "".concat(minHeight, "px");
|
|
187
|
+
textarea.style.maxHeight = previousMaxHeight || '120px';
|
|
188
|
+
textarea.style.height = "".concat(newHeight, "px");
|
|
189
|
+
}, [inputRef, setIsTextMultiline]);
|
|
190
|
+
|
|
191
|
+
/** Compact↔stacked cambia el grid/CSS del textarea; medir en layout evita un frame con alto desincronizado (sobre todo compact→stacked). */
|
|
192
|
+
useLayoutEffect(function () {
|
|
193
|
+
handleResize();
|
|
194
|
+
}, [compactSingleRowToolbar, handleResize]);
|
|
195
|
+
useEffect(function () {
|
|
196
|
+
var _inputRef$current;
|
|
197
|
+
if (((_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.value.trim()) === '') {
|
|
198
|
+
textareaMinContentWidthSeenRef.current = null;
|
|
199
|
+
}
|
|
200
|
+
}, [resizeEpoch]);
|
|
201
|
+
useEffect(function () {
|
|
202
|
+
textareaMinContentWidthSeenRef.current = null;
|
|
203
|
+
}, [chatId, newChatKey]);
|
|
204
|
+
useEffect(function () {
|
|
205
|
+
if (inputRef.current && !disabled) {
|
|
206
|
+
inputRef.current.focus();
|
|
207
|
+
requestAnimationFrame(function () {
|
|
208
|
+
handleResize();
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
}, [disabled, handleResize]);
|
|
212
|
+
useEffect(function () {
|
|
213
|
+
if (clearSeq === 0) {
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
textareaMinContentWidthSeenRef.current = null;
|
|
217
|
+
presencePrevRef.current = false;
|
|
218
|
+
requestAnimationFrame(function () {
|
|
219
|
+
handleResize();
|
|
220
|
+
});
|
|
221
|
+
}, [clearSeq, handleResize]);
|
|
222
|
+
useEffect(function () {
|
|
223
|
+
var id = requestAnimationFrame(function () {
|
|
224
|
+
handleResize();
|
|
225
|
+
});
|
|
226
|
+
return function () {
|
|
227
|
+
return cancelAnimationFrame(id);
|
|
228
|
+
};
|
|
229
|
+
}, [resizeEpoch, handleResize]);
|
|
230
|
+
var handleChange = function handleChange(e) {
|
|
231
|
+
var hasTrim = e.target.value.trim().length > 0;
|
|
232
|
+
if (hasTrim !== presencePrevRef.current) {
|
|
233
|
+
presencePrevRef.current = hasTrim;
|
|
234
|
+
onTypingPresenceChange(hasTrim);
|
|
235
|
+
}
|
|
236
|
+
setResizeEpoch(function (x) {
|
|
237
|
+
return x + 1;
|
|
238
|
+
});
|
|
239
|
+
onChangeProp === null || onChangeProp === void 0 || onChangeProp();
|
|
240
|
+
};
|
|
241
|
+
var handleBlur = function handleBlur() {
|
|
242
|
+
var _inputRef$current$val, _inputRef$current2;
|
|
243
|
+
var v = (_inputRef$current$val = (_inputRef$current2 = inputRef.current) === null || _inputRef$current2 === void 0 ? void 0 : _inputRef$current2.value) !== null && _inputRef$current$val !== void 0 ? _inputRef$current$val : '';
|
|
244
|
+
var hasTrim = v.trim().length > 0;
|
|
245
|
+
if (hasTrim !== presencePrevRef.current) {
|
|
246
|
+
presencePrevRef.current = hasTrim;
|
|
247
|
+
onTypingPresenceChange(hasTrim);
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
var handleKeyDown = function handleKeyDown(e) {
|
|
251
|
+
if (e.key === 'Enter' && !e.shiftKey) {
|
|
252
|
+
e.preventDefault();
|
|
253
|
+
if (!sendDisabled && !disabled) {
|
|
254
|
+
onEnterSend();
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
};
|
|
258
|
+
return /*#__PURE__*/_jsx(StyledMAIAInput, {
|
|
259
|
+
ref: inputRef,
|
|
260
|
+
disabled: disabled,
|
|
261
|
+
onChange: handleChange,
|
|
262
|
+
onKeyDown: handleKeyDown,
|
|
263
|
+
placeholder: placeholder,
|
|
264
|
+
alignButtons: alignButtons,
|
|
265
|
+
$toolbarLayoutVariant: compactSingleRowToolbar ? 'compactRow' : 'stackedRows',
|
|
266
|
+
onBlur: handleBlur
|
|
267
|
+
});
|
|
268
|
+
};
|
|
269
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZUVmZmVjdCIsInVzZUxheW91dEVmZmVjdCIsInVzZVJlZiIsInVzZVN0YXRlIiwiU3R5bGVkTUFJQUlucHV0IiwianN4IiwiX2pzeCIsImNvdW50VmlzdWFsTGluZXNXcmFwcGVkIiwicmF3IiwiY29udGVudFdpZHRoUHgiLCJtZWFzdXJlVGV4dFdpZHRoIiwicGFyYWdyYXBocyIsInNwbGl0IiwidG90YWwiLCJfaXRlcmF0b3IiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIl9zdGVwIiwicyIsIm4iLCJkb25lIiwicGFyYWdyYXBoIiwidmFsdWUiLCJsZW5ndGgiLCJ3b3JkcyIsImZpbHRlciIsInciLCJsaW5lc0luUGFyYWdyYXBoIiwiY3VycmVudExpbmVXaWR0aCIsImkiLCJ3b3JkIiwid29yZFdpZHRoIiwic3BhY2VXaWR0aCIsIk1hdGgiLCJjZWlsIiwiY2FuZGlkYXRlV2lkdGgiLCJlcnIiLCJlIiwiZiIsIm1heCIsIk1BSUFJbnB1dEVkaXRvciIsIl9yZWYiLCJpbnB1dFJlZiIsImRpc2FibGVkIiwicGxhY2Vob2xkZXIiLCJhbGlnbkJ1dHRvbnMiLCJjb21wYWN0U2luZ2xlUm93VG9vbGJhciIsInNldElzVGV4dE11bHRpbGluZSIsImNoYXRJZCIsIm5ld0NoYXRLZXkiLCJjbGVhclNlcSIsInNlbmREaXNhYmxlZCIsIm9uVHlwaW5nUHJlc2VuY2VDaGFuZ2UiLCJvbkVudGVyU2VuZCIsIm9uQ2hhbmdlUHJvcCIsInRleHRhcmVhTWluQ29udGVudFdpZHRoU2VlblJlZiIsInByZXNlbmNlUHJldlJlZiIsIl91c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheSIsInJlc2l6ZUVwb2NoIiwic2V0UmVzaXplRXBvY2giLCJoYW5kbGVSZXNpemUiLCJfdGV4dGFyZWFNaW5Db250ZW50V2kiLCJ0ZXh0YXJlYSIsImN1cnJlbnQiLCJtaW5IZWlnaHQiLCJtYXhIZWlnaHQiLCJwcmV2aW91c01pbkhlaWdodCIsInN0eWxlIiwicHJldmlvdXNNYXhIZWlnaHQiLCJoZWlnaHQiLCJvZmZzZXRIZWlnaHQiLCJzY3JvbGxIZWlnaHQiLCJjb21wdXRlZFN0eWxlIiwid2luZG93IiwiZ2V0Q29tcHV0ZWRTdHlsZSIsImxpbmVIZWlnaHQiLCJwYXJzZUZsb2F0IiwicGFkZGluZ1RvcCIsInBhZGRpbmdCb3R0b20iLCJib3JkZXJUb3AiLCJib3JkZXJUb3BXaWR0aCIsImJvcmRlckJvdHRvbSIsImJvcmRlckJvdHRvbVdpZHRoIiwic2luZ2xlTGluZUhlaWdodCIsImlzRW1wdHkiLCJ0cmltIiwicGFkZGluZ0xlZnQiLCJwYWRkaW5nUmlnaHQiLCJib3JkZXJMZWZ0IiwiYm9yZGVyTGVmdFdpZHRoIiwiYm9yZGVyUmlnaHQiLCJib3JkZXJSaWdodFdpZHRoIiwidGV4dGFyZWFXaWR0aCIsIm9mZnNldFdpZHRoIiwibWluIiwid3JhcENoZWNrV2lkdGgiLCJjYW52YXNNZWFzdXJlSW5kaWNhdGVzTXVsdGlsaW5lIiwiY2FudmFzIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiY2FudmFzQ29udGV4dCIsImdldENvbnRleHQiLCJ0ZXh0IiwibGluZXMiLCJ0ZXh0YXJlYVN0eWxlcyIsImZvbnQiLCJjb25jYXQiLCJmb250V2VpZ2h0IiwiZm9udFNpemUiLCJmb250RmFtaWx5IiwiX2l0ZXJhdG9yMiIsIl9zdGVwMiIsImxpbmUiLCJtZWFzdXJlVGV4dCIsIndpZHRoIiwiaGFzTXVsdGlwbGVWaXN1YWxMaW5lcyIsIm5leHRNdWx0aWxpbmUiLCJ2aXN1YWxMaW5lc0F0V3JhcFdpZHRoIiwidmlzdWFsTGluZXNBdEN1cnJlbnRXaWR0aCIsInNlZ21lbnQiLCJsaW5lc0ZvckhlaWdodCIsIm5ld0hlaWdodCIsInNuYXBwZWRTaW5nbGVMaW5lT3V0ZXJIZWlnaHQiLCJyb3VuZCIsInNuYXBwZWRIZWlnaHQiLCJwcmV2IiwiX2lucHV0UmVmJGN1cnJlbnQiLCJmb2N1cyIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImlkIiwiY2FuY2VsQW5pbWF0aW9uRnJhbWUiLCJoYW5kbGVDaGFuZ2UiLCJoYXNUcmltIiwidGFyZ2V0IiwieCIsImhhbmRsZUJsdXIiLCJfaW5wdXRSZWYkY3VycmVudCR2YWwiLCJfaW5wdXRSZWYkY3VycmVudDIiLCJ2IiwiaGFuZGxlS2V5RG93biIsImtleSIsInNoaWZ0S2V5IiwicHJldmVudERlZmF1bHQiLCJyZWYiLCJvbkNoYW5nZSIsIm9uS2V5RG93biIsIiR0b29sYmFyTGF5b3V0VmFyaWFudCIsIm9uQmx1ciJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2F0b21zL01BSUFJbnB1dC9NQUlBSW5wdXRFZGl0b3IudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXJlc3RyaWN0ZWQtc3ludGF4ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1jb250aW51ZSAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tdm9pZCAqL1xuLyogZXNsaW50LWRpc2FibGUgcHJlZmVyLWRlc3RydWN0dXJpbmcgKi9cbmltcG9ydCB7IENoYW5nZUV2ZW50LCBLZXlib2FyZEV2ZW50LCB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VMYXlvdXRFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB0eXBlIHsgRGlzcGF0Y2gsIFJlZk9iamVjdCwgU2V0U3RhdGVBY3Rpb24gfSBmcm9tICdyZWFjdCdcblxuaW1wb3J0IHsgU3R5bGVkTUFJQUlucHV0IH0gZnJvbSAnLi9zdHlsZXMnXG5cbi8qKlxuICogTMOtbmVhcyB2aXN1YWxlcyBjb24gd3JhcCBkZSBwYWxhYnJhcyBhbCBhbmNobyBkYWRvIChhcHJveC4gZWwgbmF2ZWdhZG9yIGVuIExUUikuXG4gKi9cbmZ1bmN0aW9uIGNvdW50VmlzdWFsTGluZXNXcmFwcGVkKHJhdzogc3RyaW5nLCBjb250ZW50V2lkdGhQeDogbnVtYmVyLCBtZWFzdXJlVGV4dFdpZHRoOiAoczogc3RyaW5nKSA9PiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoY29udGVudFdpZHRoUHggPD0gMSkge1xuICAgIHJldHVybiAxXG4gIH1cbiAgY29uc3QgcGFyYWdyYXBocyA9IHJhdy5zcGxpdCgnXFxuJylcbiAgbGV0IHRvdGFsID0gMFxuICBmb3IgKGNvbnN0IHBhcmFncmFwaCBvZiBwYXJhZ3JhcGhzKSB7XG4gICAgaWYgKHBhcmFncmFwaC5sZW5ndGggPT09IDApIHtcbiAgICAgIHRvdGFsICs9IDFcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGNvbnN0IHdvcmRzID0gcGFyYWdyYXBoLnNwbGl0KC9cXHMrLykuZmlsdGVyKHcgPT4gdy5sZW5ndGggPiAwKVxuICAgIGxldCBsaW5lc0luUGFyYWdyYXBoID0gMVxuICAgIGxldCBjdXJyZW50TGluZVdpZHRoID0gMFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGNvbnN0IHdvcmQgPSB3b3Jkc1tpXVxuICAgICAgY29uc3Qgd29yZFdpZHRoID0gbWVhc3VyZVRleHRXaWR0aCh3b3JkKVxuICAgICAgY29uc3Qgc3BhY2VXaWR0aCA9IGkgPiAwID8gbWVhc3VyZVRleHRXaWR0aCgnICcpIDogMFxuXG4gICAgICBpZiAod29yZFdpZHRoID4gY29udGVudFdpZHRoUHgpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRMaW5lV2lkdGggPiAwKSB7XG4gICAgICAgICAgbGluZXNJblBhcmFncmFwaCArPSAxXG4gICAgICAgICAgY3VycmVudExpbmVXaWR0aCA9IDBcbiAgICAgICAgfVxuICAgICAgICBsaW5lc0luUGFyYWdyYXBoICs9IE1hdGguY2VpbCh3b3JkV2lkdGggLyBjb250ZW50V2lkdGhQeCkgLSAxXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNhbmRpZGF0ZVdpZHRoID0gY3VycmVudExpbmVXaWR0aCA9PT0gMCA/IHdvcmRXaWR0aCA6IGN1cnJlbnRMaW5lV2lkdGggKyBzcGFjZVdpZHRoICsgd29yZFdpZHRoXG4gICAgICBpZiAoY2FuZGlkYXRlV2lkdGggPiBjb250ZW50V2lkdGhQeCAmJiBjdXJyZW50TGluZVdpZHRoID4gMCkge1xuICAgICAgICBsaW5lc0luUGFyYWdyYXBoICs9IDFcbiAgICAgICAgY3VycmVudExpbmVXaWR0aCA9IHdvcmRXaWR0aFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudExpbmVXaWR0aCA9IGNhbmRpZGF0ZVdpZHRoXG4gICAgICB9XG4gICAgfVxuICAgIHRvdGFsICs9IGxpbmVzSW5QYXJhZ3JhcGhcbiAgfVxuICByZXR1cm4gTWF0aC5tYXgoMSwgdG90YWwpXG59XG5cbmV4cG9ydCB0eXBlIE1BSUFJbnB1dEVkaXRvclByb3BzID0ge1xuICBpbnB1dFJlZjogUmVmT2JqZWN0PEhUTUxUZXh0QXJlYUVsZW1lbnQgfCBudWxsPlxuICBkaXNhYmxlZD86IGJvb2xlYW5cbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmdcbiAgYWxpZ25CdXR0b25zPzogJ2hvcml6b250YWwnIHwgJ3ZlcnRpY2FsJ1xuICBjb21wYWN0U2luZ2xlUm93VG9vbGJhcjogYm9vbGVhblxuICBzZXRJc1RleHRNdWx0aWxpbmU6IERpc3BhdGNoPFNldFN0YXRlQWN0aW9uPGJvb2xlYW4+PlxuICBjaGF0SWQ/OiBzdHJpbmdcbiAgbmV3Q2hhdEtleT86IG51bWJlclxuICAvKiogSW5jcmVtZW50YXIgZGVzZGUgZWwgcGFkcmUgdHJhcyBlbnZpYXIgLyBjYW1iaWFyIHNlc2nDs24gcGFyYSBzaW5jcm9uaXphciBtZWRpY2nDs24gc2luIGVzdGFkbyBkZWwgdGV4dG8gZW4gZWwgcGFkcmUuICovXG4gIGNsZWFyU2VxOiBudW1iZXJcbiAgc2VuZERpc2FibGVkOiBib29sZWFuXG4gIG9uVHlwaW5nUHJlc2VuY2VDaGFuZ2U6IChoYXNUcmltbWVkVGV4dDogYm9vbGVhbikgPT4gdm9pZFxuICBvbkVudGVyU2VuZDogKCkgPT4gdm9pZFxuICBvbkNoYW5nZVByb3A/OiAoKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBjb25zdCBNQUlBSW5wdXRFZGl0b3IgPSAoe1xuICBpbnB1dFJlZixcbiAgZGlzYWJsZWQsXG4gIHBsYWNlaG9sZGVyLFxuICBhbGlnbkJ1dHRvbnMsXG4gIGNvbXBhY3RTaW5nbGVSb3dUb29sYmFyLFxuICBzZXRJc1RleHRNdWx0aWxpbmUsXG4gIGNoYXRJZCxcbiAgbmV3Q2hhdEtleSxcbiAgY2xlYXJTZXEsXG4gIHNlbmREaXNhYmxlZCxcbiAgb25UeXBpbmdQcmVzZW5jZUNoYW5nZSxcbiAgb25FbnRlclNlbmQsXG4gIG9uQ2hhbmdlUHJvcCxcbn06IE1BSUFJbnB1dEVkaXRvclByb3BzKSA9PiB7XG4gIGNvbnN0IHRleHRhcmVhTWluQ29udGVudFdpZHRoU2VlblJlZiA9IHVzZVJlZjxudW1iZXIgfCBudWxsPihudWxsKVxuICBjb25zdCBwcmVzZW5jZVByZXZSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIC8qKiBTb2xvIHBhcmEgcmUtYWdlbmRhciBtZWRpY2nDs24gZGUgYWx0byBzaW4gZ3VhcmRhciBlbCBzdHJpbmcgZW4gZWwgcGFkcmUgKGFpc2xhIHJlLXJlbmRlcnMgZGVsIHRvb2xiYXIpLiAqL1xuICBjb25zdCBbcmVzaXplRXBvY2gsIHNldFJlc2l6ZUVwb2NoXSA9IHVzZVN0YXRlKDApXG5cbiAgY29uc3QgaGFuZGxlUmVzaXplID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNvbnN0IHRleHRhcmVhID0gaW5wdXRSZWYuY3VycmVudFxuICAgIGlmICghdGV4dGFyZWEpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8qKiBDb2luY2lkZSBjb24gU3R5bGVkTUFJQUlucHV0OiBsaW5lLWhlaWdodCAyMHB4IHNvYnJlIGZ1ZW50ZSAxNHB4ICh+dW5hIGzDrW5lYSBkZSB0ZXh0byB2aXNpYmxlKS4gKi9cbiAgICBjb25zdCBtaW5IZWlnaHQgPSAyMFxuICAgIGNvbnN0IG1heEhlaWdodCA9IDEyMFxuXG4gICAgY29uc3QgcHJldmlvdXNNaW5IZWlnaHQgPSB0ZXh0YXJlYS5zdHlsZS5taW5IZWlnaHRcbiAgICBjb25zdCBwcmV2aW91c01heEhlaWdodCA9IHRleHRhcmVhLnN0eWxlLm1heEhlaWdodFxuXG4gICAgdGV4dGFyZWEuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nXG4gICAgdGV4dGFyZWEuc3R5bGUubWluSGVpZ2h0ID0gJzBweCdcbiAgICB0ZXh0YXJlYS5zdHlsZS5tYXhIZWlnaHQgPSAnbm9uZSdcblxuICAgIHZvaWQgdGV4dGFyZWEub2Zmc2V0SGVpZ2h0XG5cbiAgICBjb25zdCBzY3JvbGxIZWlnaHQgPSB0ZXh0YXJlYS5zY3JvbGxIZWlnaHRcblxuICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0ZXh0YXJlYSlcbiAgICBjb25zdCBsaW5lSGVpZ2h0ID0gcGFyc2VGbG9hdChjb21wdXRlZFN0eWxlLmxpbmVIZWlnaHQpIHx8IDIwXG4gICAgY29uc3QgcGFkZGluZ1RvcCA9IHBhcnNlRmxvYXQoY29tcHV0ZWRTdHlsZS5wYWRkaW5nVG9wKSB8fCAwXG4gICAgY29uc3QgcGFkZGluZ0JvdHRvbSA9IHBhcnNlRmxvYXQoY29tcHV0ZWRTdHlsZS5wYWRkaW5nQm90dG9tKSB8fCAwXG4gICAgY29uc3QgYm9yZGVyVG9wID0gcGFyc2VGbG9hdChjb21wdXRlZFN0eWxlLmJvcmRlclRvcFdpZHRoKSB8fCAwXG4gICAgY29uc3QgYm9yZGVyQm90dG9tID0gcGFyc2VGbG9hdChjb21wdXRlZFN0eWxlLmJvcmRlckJvdHRvbVdpZHRoKSB8fCAwXG5cbiAgICBjb25zdCBzaW5nbGVMaW5lSGVpZ2h0ID0gbGluZUhlaWdodCArIHBhZGRpbmdUb3AgKyBwYWRkaW5nQm90dG9tICsgYm9yZGVyVG9wICsgYm9yZGVyQm90dG9tXG5cbiAgICBjb25zdCBpc0VtcHR5ID0gdGV4dGFyZWEudmFsdWUudHJpbSgpID09PSAnJ1xuXG4gICAgY29uc3QgcGFkZGluZ0xlZnQgPSBwYXJzZUZsb2F0KGNvbXB1dGVkU3R5bGUucGFkZGluZ0xlZnQpIHx8IDBcbiAgICBjb25zdCBwYWRkaW5nUmlnaHQgPSBwYXJzZUZsb2F0KGNvbXB1dGVkU3R5bGUucGFkZGluZ1JpZ2h0KSB8fCAwXG4gICAgY29uc3QgYm9yZGVyTGVmdCA9IHBhcnNlRmxvYXQoY29tcHV0ZWRTdHlsZS5ib3JkZXJMZWZ0V2lkdGgpIHx8IDBcbiAgICBjb25zdCBib3JkZXJSaWdodCA9IHBhcnNlRmxvYXQoY29tcHV0ZWRTdHlsZS5ib3JkZXJSaWdodFdpZHRoKSB8fCAwXG4gICAgY29uc3QgdGV4dGFyZWFXaWR0aCA9IHRleHRhcmVhLm9mZnNldFdpZHRoIC0gcGFkZGluZ0xlZnQgLSBwYWRkaW5nUmlnaHQgLSBib3JkZXJMZWZ0IC0gYm9yZGVyUmlnaHRcblxuICAgIGlmICghaXNFbXB0eSkge1xuICAgICAgdGV4dGFyZWFNaW5Db250ZW50V2lkdGhTZWVuUmVmLmN1cnJlbnQgPVxuICAgICAgICB0ZXh0YXJlYU1pbkNvbnRlbnRXaWR0aFNlZW5SZWYuY3VycmVudCA9PT0gbnVsbFxuICAgICAgICAgID8gdGV4dGFyZWFXaWR0aFxuICAgICAgICAgIDogTWF0aC5taW4odGV4dGFyZWFNaW5Db250ZW50V2lkdGhTZWVuUmVmLmN1cnJlbnQsIHRleHRhcmVhV2lkdGgpXG4gICAgfVxuXG4gICAgY29uc3Qgd3JhcENoZWNrV2lkdGggPSB0ZXh0YXJlYU1pbkNvbnRlbnRXaWR0aFNlZW5SZWYuY3VycmVudCA/PyB0ZXh0YXJlYVdpZHRoXG5cbiAgICBsZXQgY2FudmFzTWVhc3VyZUluZGljYXRlc011bHRpbGluZSA9IGZhbHNlXG5cbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKVxuICAgIGNvbnN0IGNhbnZhc0NvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKVxuICAgIGNvbnN0IHRleHQgPSB0ZXh0YXJlYS52YWx1ZSB8fCAnJ1xuICAgIGNvbnN0IGxpbmVzID0gdGV4dC5zcGxpdCgnXFxuJylcblxuICAgIGlmICghY2FudmFzQ29udGV4dCkge1xuICAgICAgY2FudmFzTWVhc3VyZUluZGljYXRlc011bHRpbGluZSA9IHNjcm9sbEhlaWdodCA+IHNpbmdsZUxpbmVIZWlnaHQgKiAyLjA1XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRleHRhcmVhU3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGV4dGFyZWEpXG4gICAgICBjYW52YXNDb250ZXh0LmZvbnQgPSBgJHt0ZXh0YXJlYVN0eWxlcy5mb250V2VpZ2h0fSAke3RleHRhcmVhU3R5bGVzLmZvbnRTaXplfSAke3RleHRhcmVhU3R5bGVzLmZvbnRGYW1pbHl9YFxuICAgICAgaWYgKGxpbmVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgY2FudmFzTWVhc3VyZUluZGljYXRlc011bHRpbGluZSA9IHRydWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICAgIGlmIChsaW5lLnRyaW0oKSA9PT0gJycpIGNvbnRpbnVlXG4gICAgICAgICAgaWYgKGNhbnZhc0NvbnRleHQubWVhc3VyZVRleHQobGluZSkud2lkdGggPiB3cmFwQ2hlY2tXaWR0aCkge1xuICAgICAgICAgICAgY2FudmFzTWVhc3VyZUluZGljYXRlc011bHRpbGluZSA9IHRydWVcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaGFzTXVsdGlwbGVWaXN1YWxMaW5lcyA9IGNhbnZhc01lYXN1cmVJbmRpY2F0ZXNNdWx0aWxpbmVcblxuICAgIGNvbnN0IG5leHRNdWx0aWxpbmUgPSAhaXNFbXB0eSAmJiBoYXNNdWx0aXBsZVZpc3VhbExpbmVzXG5cbiAgICAvKiogTMOtbmVhcyBzZWfDum4gYW5jaG8gZXN0cmVjaG8gKGhpc3RvcnkgbWluKSDigJQgdG9vbGJhciBjb21wYWN0byB5IGRldGVjY2nDs24gbXVsdGlsaW5lICovXG4gICAgbGV0IHZpc3VhbExpbmVzQXRXcmFwV2lkdGggPSAxXG4gICAgLyoqIEzDrW5lYXMgYWwgYW5jaG8gYWN0dWFsIGRlbCB0ZXh0YXJlYSDigJQgZW4gc3RhY2tlZCBzdWVsZSBzZXIgbWF5b3IgcXVlIHdyYXBDaGVja1dpZHRoICovXG4gICAgbGV0IHZpc3VhbExpbmVzQXRDdXJyZW50V2lkdGggPSAxXG4gICAgaWYgKCFpc0VtcHR5ICYmIGNhbnZhc0NvbnRleHQpIHtcbiAgICAgIHZpc3VhbExpbmVzQXRXcmFwV2lkdGggPSBjb3VudFZpc3VhbExpbmVzV3JhcHBlZChcbiAgICAgICAgdGV4dCxcbiAgICAgICAgd3JhcENoZWNrV2lkdGgsXG4gICAgICAgIHNlZ21lbnQgPT4gY2FudmFzQ29udGV4dC5tZWFzdXJlVGV4dChzZWdtZW50KS53aWR0aFxuICAgICAgKVxuICAgICAgdmlzdWFsTGluZXNBdEN1cnJlbnRXaWR0aCA9IGNvdW50VmlzdWFsTGluZXNXcmFwcGVkKFxuICAgICAgICB0ZXh0LFxuICAgICAgICB0ZXh0YXJlYVdpZHRoLFxuICAgICAgICBzZWdtZW50ID0+IGNhbnZhc0NvbnRleHQubWVhc3VyZVRleHQoc2VnbWVudCkud2lkdGhcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKCFpc0VtcHR5ICYmICFjYW52YXNDb250ZXh0KSB7XG4gICAgICB2aXN1YWxMaW5lc0F0V3JhcFdpZHRoID0gc2Nyb2xsSGVpZ2h0ID4gc2luZ2xlTGluZUhlaWdodCAqIDEuODUgPyBNYXRoLmNlaWwoc2Nyb2xsSGVpZ2h0IC8gc2luZ2xlTGluZUhlaWdodCkgOiAxXG4gICAgICB2aXN1YWxMaW5lc0F0Q3VycmVudFdpZHRoID0gdmlzdWFsTGluZXNBdFdyYXBXaWR0aFxuICAgIH1cblxuICAgIGNvbnN0IGxpbmVzRm9ySGVpZ2h0ID0gIWlzRW1wdHkgJiYgY2FudmFzQ29udGV4dCA/IHZpc3VhbExpbmVzQXRDdXJyZW50V2lkdGggOiB2aXN1YWxMaW5lc0F0V3JhcFdpZHRoXG5cbiAgICBsZXQgbmV3SGVpZ2h0OiBudW1iZXJcbiAgICAvKiogVW5hIGzDrW5lYSBhbCBhbmNobyBhY3R1YWw6IGFsdHVyYSBmaWphZGEgcG9yIHRpcG9ncmFmw61hICgrIHBhZGRpbmcvYm9yZGUpLCBubyBzY3JvbGxIZWlnaHQg4oCUIGV2aXRhIH4zOXB4IGFsIHBhc2FyIGEgc3RhY2tlZCBjdWFuZG8gZWwgY2FudmFzIHlhIGN1ZW50YSAxIGzDrW5lYSBhIGFuY2hvIGFtcGxpbyBwZXJvIHNjcm9sbEhlaWdodCBhw7puIHZpZW5lIGRlIGzDrW5lYXMgdmllamFzL3dyYXAgYW50ZXJpb3IuICovXG4gICAgY29uc3Qgc25hcHBlZFNpbmdsZUxpbmVPdXRlckhlaWdodCA9IE1hdGgucm91bmQoc2luZ2xlTGluZUhlaWdodClcbiAgICBpZiAoaXNFbXB0eSkge1xuICAgICAgbmV3SGVpZ2h0ID0gc25hcHBlZFNpbmdsZUxpbmVPdXRlckhlaWdodFxuICAgIH0gZWxzZSBpZiAoIWhhc011bHRpcGxlVmlzdWFsTGluZXMpIHtcbiAgICAgIG5ld0hlaWdodCA9IHNuYXBwZWRTaW5nbGVMaW5lT3V0ZXJIZWlnaHRcbiAgICB9IGVsc2UgaWYgKGxpbmVzRm9ySGVpZ2h0IDw9IDEpIHtcbiAgICAgIG5ld0hlaWdodCA9IE1hdGgubWluKE1hdGgubWF4KHNuYXBwZWRTaW5nbGVMaW5lT3V0ZXJIZWlnaHQsIG1pbkhlaWdodCksIG1heEhlaWdodClcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc25hcHBlZEhlaWdodCA9IHBhZGRpbmdUb3AgKyBwYWRkaW5nQm90dG9tICsgYm9yZGVyVG9wICsgYm9yZGVyQm90dG9tICsgbGluZXNGb3JIZWlnaHQgKiBsaW5lSGVpZ2h0XG4gICAgICBuZXdIZWlnaHQgPSBNYXRoLm1pbihNYXRoLm1heChNYXRoLm1pbihzY3JvbGxIZWlnaHQsIHNuYXBwZWRIZWlnaHQpLCBtaW5IZWlnaHQpLCBtYXhIZWlnaHQpXG4gICAgfVxuXG4gICAgc2V0SXNUZXh0TXVsdGlsaW5lKHByZXYgPT4gKHByZXYgPT09IG5leHRNdWx0aWxpbmUgPyBwcmV2IDogbmV4dE11bHRpbGluZSkpXG5cbiAgICB0ZXh0YXJlYS5zdHlsZS5taW5IZWlnaHQgPSBwcmV2aW91c01pbkhlaWdodCB8fCBgJHttaW5IZWlnaHR9cHhgXG4gICAgdGV4dGFyZWEuc3R5bGUubWF4SGVpZ2h0ID0gcHJldmlvdXNNYXhIZWlnaHQgfHwgJzEyMHB4J1xuXG4gICAgdGV4dGFyZWEuc3R5bGUuaGVpZ2h0ID0gYCR7bmV3SGVpZ2h0fXB4YFxuICB9LCBbaW5wdXRSZWYsIHNldElzVGV4dE11bHRpbGluZV0pXG5cbiAgLyoqIENvbXBhY3TihpRzdGFja2VkIGNhbWJpYSBlbCBncmlkL0NTUyBkZWwgdGV4dGFyZWE7IG1lZGlyIGVuIGxheW91dCBldml0YSB1biBmcmFtZSBjb24gYWx0byBkZXNpbmNyb25pemFkbyAoc29icmUgdG9kbyBjb21wYWN04oaSc3RhY2tlZCkuICovXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgaGFuZGxlUmVzaXplKClcbiAgfSwgW2NvbXBhY3RTaW5nbGVSb3dUb29sYmFyLCBoYW5kbGVSZXNpemVdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGlucHV0UmVmLmN1cnJlbnQ/LnZhbHVlLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHRleHRhcmVhTWluQ29udGVudFdpZHRoU2VlblJlZi5jdXJyZW50ID0gbnVsbFxuICAgIH1cbiAgfSwgW3Jlc2l6ZUVwb2NoXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHRleHRhcmVhTWluQ29udGVudFdpZHRoU2VlblJlZi5jdXJyZW50ID0gbnVsbFxuICB9LCBbY2hhdElkLCBuZXdDaGF0S2V5XSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpbnB1dFJlZi5jdXJyZW50ICYmICFkaXNhYmxlZCkge1xuICAgICAgaW5wdXRSZWYuY3VycmVudC5mb2N1cygpXG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICBoYW5kbGVSZXNpemUoKVxuICAgICAgfSlcbiAgICB9XG4gIH0sIFtkaXNhYmxlZCwgaGFuZGxlUmVzaXplXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChjbGVhclNlcSA9PT0gMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRleHRhcmVhTWluQ29udGVudFdpZHRoU2VlblJlZi5jdXJyZW50ID0gbnVsbFxuICAgIHByZXNlbmNlUHJldlJlZi5jdXJyZW50ID0gZmFsc2VcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgaGFuZGxlUmVzaXplKClcbiAgICB9KVxuICB9LCBbY2xlYXJTZXEsIGhhbmRsZVJlc2l6ZV0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBpZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBoYW5kbGVSZXNpemUoKVxuICAgIH0pXG4gICAgcmV0dXJuICgpID0+IGNhbmNlbEFuaW1hdGlvbkZyYW1lKGlkKVxuICB9LCBbcmVzaXplRXBvY2gsIGhhbmRsZVJlc2l6ZV0pXG5cbiAgY29uc3QgaGFuZGxlQ2hhbmdlID0gKGU6IENoYW5nZUV2ZW50PEhUTUxUZXh0QXJlYUVsZW1lbnQ+KSA9PiB7XG4gICAgY29uc3QgaGFzVHJpbSA9IGUudGFyZ2V0LnZhbHVlLnRyaW0oKS5sZW5ndGggPiAwXG4gICAgaWYgKGhhc1RyaW0gIT09IHByZXNlbmNlUHJldlJlZi5jdXJyZW50KSB7XG4gICAgICBwcmVzZW5jZVByZXZSZWYuY3VycmVudCA9IGhhc1RyaW1cbiAgICAgIG9uVHlwaW5nUHJlc2VuY2VDaGFuZ2UoaGFzVHJpbSlcbiAgICB9XG4gICAgc2V0UmVzaXplRXBvY2goeCA9PiB4ICsgMSlcbiAgICBvbkNoYW5nZVByb3A/LigpXG4gIH1cblxuICBjb25zdCBoYW5kbGVCbHVyID0gKCkgPT4ge1xuICAgIGNvbnN0IHYgPSBpbnB1dFJlZi5jdXJyZW50Py52YWx1ZSA/PyAnJ1xuICAgIGNvbnN0IGhhc1RyaW0gPSB2LnRyaW0oKS5sZW5ndGggPiAwXG4gICAgaWYgKGhhc1RyaW0gIT09IHByZXNlbmNlUHJldlJlZi5jdXJyZW50KSB7XG4gICAgICBwcmVzZW5jZVByZXZSZWYuY3VycmVudCA9IGhhc1RyaW1cbiAgICAgIG9uVHlwaW5nUHJlc2VuY2VDaGFuZ2UoaGFzVHJpbSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBoYW5kbGVLZXlEb3duID0gKGU6IEtleWJvYXJkRXZlbnQ8SFRNTFRleHRBcmVhRWxlbWVudD4pID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicgJiYgIWUuc2hpZnRLZXkpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgaWYgKCFzZW5kRGlzYWJsZWQgJiYgIWRpc2FibGVkKSB7XG4gICAgICAgIG9uRW50ZXJTZW5kKClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxTdHlsZWRNQUlBSW5wdXRcbiAgICAgIHJlZj17aW5wdXRSZWYgYXMgUmVmT2JqZWN0PEhUTUxUZXh0QXJlYUVsZW1lbnQ+fVxuICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgIG9uS2V5RG93bj17aGFuZGxlS2V5RG93bn1cbiAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cbiAgICAgIGFsaWduQnV0dG9ucz17YWxpZ25CdXR0b25zfVxuICAgICAgJHRvb2xiYXJMYXlvdXRWYXJpYW50PXtjb21wYWN0U2luZ2xlUm93VG9vbGJhciA/ICdjb21wYWN0Um93JyA6ICdzdGFja2VkUm93cyd9XG4gICAgICBvbkJsdXI9e2hhbmRsZUJsdXJ9XG4gICAgLz5cbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFxQ0EsV0FBVyxFQUFFQyxTQUFTLEVBQUVDLGVBQWUsRUFBRUMsTUFBTSxFQUFFQyxRQUFRLFFBQVEs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LGNBQWMsQ0FBQyxVQUFBMkUsQ0FBQztNQUFBLE9BQUlBLENBQUMsR0FBRyxDQUFDO0lBQUEsRUFBQztJQUMxQmxGLFlBQVksYUFBWkEsWUFBWSxlQUFaQSxZQUFZLENBQUcsQ0FBQztFQUNsQixDQUFDO0VBRUQsSUFBTW1GLFVBQVUsR0FBRyxTQUFiQSxVQUFVQSxDQUFBLEVBQVM7SUFBQSxJQUFBQyxxQkFBQSxFQUFBQyxrQkFBQTtJQUN2QixJQUFNQyxDQUFDLElBQUFGLHFCQUFBLElBQUFDLGtCQUFBLEdBQUdqRyxRQUFRLENBQUN1QixPQUFPLGNBQUEwRSxrQkFBQSx1QkFBaEJBLGtCQUFBLENBQWtCckgsS0FBSyxjQUFBb0gscUJBQUEsY0FBQUEscUJBQUEsR0FBSSxFQUFFO0lBQ3ZDLElBQU1KLE9BQU8sR0FBR00sQ0FBQyxDQUFDckQsSUFBSSxDQUFDLENBQUMsQ0FBQ2hFLE1BQU0sR0FBRyxDQUFDO0lBQ25DLElBQUkrRyxPQUFPLEtBQUs5RSxlQUFlLENBQUNTLE9BQU8sRUFBRTtNQUN2Q1QsZUFBZSxDQUFDUyxPQUFPLEdBQUdxRSxPQUFPO01BQ2pDbEYsc0JBQXNCLENBQUNrRixPQUFPLENBQUM7SUFDakM7RUFDRixDQUFDO0VBRUQsSUFBTU8sYUFBYSxHQUFHLFNBQWhCQSxhQUFhQSxDQUFJeEcsQ0FBcUMsRUFBSztJQUMvRCxJQUFJQSxDQUFDLENBQUN5RyxHQUFHLEtBQUssT0FBTyxJQUFJLENBQUN6RyxDQUFDLENBQUMwRyxRQUFRLEVBQUU7TUFDcEMxRyxDQUFDLENBQUMyRyxjQUFjLENBQUMsQ0FBQztNQUNsQixJQUFJLENBQUM3RixZQUFZLElBQUksQ0FBQ1IsUUFBUSxFQUFFO1FBQzlCVSxXQUFXLENBQUMsQ0FBQztNQUNmO0lBQ0Y7RUFDRixDQUFDO0VBRUQsb0JBQ0U5QyxJQUFBLENBQUNGLGVBQWU7SUFDZDRJLEdBQUcsRUFBRXZHLFFBQTJDO0lBQ2hEQyxRQUFRLEVBQUVBLFFBQVM7SUFDbkJ1RyxRQUFRLEVBQUViLFlBQWE7SUFDdkJjLFNBQVMsRUFBRU4sYUFBYztJQUN6QmpHLFdBQVcsRUFBRUEsV0FBWTtJQUN6QkMsWUFBWSxFQUFFQSxZQUFhO0lBQzNCdUcscUJBQXFCLEVBQUV0Ryx1QkFBdUIsR0FBRyxZQUFZLEdBQUcsYUFBYztJQUM5RXVHLE1BQU0sRUFBRVo7RUFBVyxDQUNwQixDQUFDO0FBRU4sQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==
|