@projectcor/maia-components 2.11.39 → 2.11.40-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.
Files changed (75) hide show
  1. package/lib/App.js +22 -11
  2. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.js +36 -0
  3. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.styles.js +181 -0
  4. package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.js +39 -0
  5. package/lib/components/atoms/ContextMentionChip/buildChipElement.js +324 -0
  6. package/lib/components/atoms/ContextMentionChip/index.js +4 -0
  7. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +191 -0
  8. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.styles.js +6 -0
  9. package/lib/components/atoms/ContextMentionEditor/index.js +2 -0
  10. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.js +283 -0
  11. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.styles.js +114 -0
  12. package/lib/components/atoms/ContextMentionItem/index.js +2 -0
  13. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.js +142 -0
  14. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.styles.js +75 -0
  15. package/lib/components/atoms/ContextMentionPopover/index.js +3 -0
  16. package/lib/components/atoms/MAIAInput/MAIAInput.js +238 -321
  17. package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +269 -0
  18. package/lib/components/atoms/MAIAInput/styles.js +75 -46
  19. package/lib/components/atoms/icons/NotionIcon.js +36 -0
  20. package/lib/components/atoms/icons/SubtaskIcon.js +36 -0
  21. package/lib/components/atoms/icons/index.js +2 -1
  22. package/lib/components/index.js +2 -1
  23. package/lib/components/molecules/ChatAIHistory/ChatAIHistory.js +8 -4
  24. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +31 -3
  25. package/lib/components/molecules/ChatAIMessages/newStyles.js +5 -2
  26. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +8 -6
  27. package/lib/components/molecules/ChatFooter/ChatFooter.js +5 -4
  28. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.js +68 -0
  29. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.styles.js +6 -0
  30. package/lib/components/molecules/ContextMentionInput/index.js +2 -0
  31. package/lib/components/molecules/Sidebar/Sidebar.js +9 -5
  32. package/lib/components/molecules/Sidebar/Sidebar.layout.styles.js +6 -2
  33. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.js +5 -2
  34. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.js +6 -3
  35. package/lib/constants/taskLinkIcon.js +6 -0
  36. package/lib/context/cor-user.js +1 -1
  37. package/lib/dev/DevContextMentionInput.js +65 -0
  38. package/lib/dev/Providers.js +11 -6
  39. package/lib/hooks/useCaretPosition.js +35 -0
  40. package/lib/hooks/useChatManager/useChatManager.interface.js +1 -1
  41. package/lib/hooks/useChatManager/useChatManager.js +21 -11
  42. package/lib/hooks/useChatMessages/useChatMessages.interface.js +1 -1
  43. package/lib/hooks/useChatMessages/useChatMessages.js +30 -14
  44. package/lib/hooks/useContextMentions.js +270 -0
  45. package/lib/hooks/useEntitySearch.js +535 -0
  46. package/lib/hooks/useEvent.js +6 -1
  47. package/lib/hooks/useMentionAllowedTypes.js +103 -0
  48. package/lib/hooks/useMentionPopover.js +320 -0
  49. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +6 -4
  50. package/lib/hooks/useTaskPanel.js +3 -10
  51. package/lib/hooks/useTextOverflowEllipsisTooltip.js +35 -0
  52. package/lib/lang/br/index.js +24 -1
  53. package/lib/lang/en/index.js +24 -1
  54. package/lib/lang/es/index.js +24 -1
  55. package/lib/lang/fr/index.js +23 -1
  56. package/lib/services/maia/Chats/getChatMessages.js +29 -4
  57. package/lib/services/maia/Orchestrator/orchestrator.js +8 -5
  58. package/lib/services/maia/RecentProjects/getRecentProjects.js +12 -4
  59. package/lib/services/maia/RecentTasks/getRecentTasks.js +43 -0
  60. package/lib/services/maia/RecentTasks/index.js +6 -0
  61. package/lib/services/maia/RecentUsers/getRecentUsers.js +59 -0
  62. package/lib/services/maia/RecentUsers/index.js +6 -0
  63. package/lib/services/query/entitySearchQuery.js +16 -0
  64. package/lib/services/query/usersDirectoryQuery.js +19 -0
  65. package/lib/services/utils/mapChatMessages.js +12 -5
  66. package/lib/types/Chat.js +1 -1
  67. package/lib/types/agent.js +1 -1
  68. package/lib/types/contextMention.js +37 -0
  69. package/lib/utils/contextMentionIcons.js +115 -0
  70. package/lib/utils/contextMentionLabel.js +4 -0
  71. package/lib/utils/contextMentionTypeLabel.js +17 -0
  72. package/lib/utils/maiaStreamdownRehypePlugins.js +27 -0
  73. package/lib/utils/openTaskInCorPanel.js +18 -0
  74. package/lib/utils/renderContextMentions.js +293 -0
  75. package/package.json +1 -1
@@ -0,0 +1,270 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
+ import { useCallback, useRef, useState } from 'react';
3
+ import { serializeMention } from '../utils/renderContextMentions';
4
+ /**
5
+ * Inspecciona la selección actual. Formato: [límite de palabra] @+ query sin espacios hasta el caret.
6
+ * La tab objetivo es la que corresponde al número de `@` (1 = primera tab visible, etc.).
7
+ */
8
+ var detectMentionTrigger = function detectMentionTrigger(editorEl, range) {
9
+ if (!editorEl || !editorEl.contains(range.startContainer)) {
10
+ return {
11
+ active: false,
12
+ query: '',
13
+ atRunLength: 0,
14
+ anchor: null
15
+ };
16
+ }
17
+ var node = range.startContainer;
18
+ if (node.nodeType !== Node.TEXT_NODE) {
19
+ return {
20
+ active: false,
21
+ query: '',
22
+ atRunLength: 0,
23
+ anchor: null
24
+ };
25
+ }
26
+ var text = node.data;
27
+ var caret = range.startOffset;
28
+ var i = caret - 1;
29
+ if (i < 0) {
30
+ return {
31
+ active: false,
32
+ query: '',
33
+ atRunLength: 0,
34
+ anchor: null
35
+ };
36
+ }
37
+ while (i >= 0 && text[i] !== '@') {
38
+ if (/\s/.test(text[i])) {
39
+ return {
40
+ active: false,
41
+ query: '',
42
+ atRunLength: 0,
43
+ anchor: null
44
+ };
45
+ }
46
+ i -= 1;
47
+ }
48
+ if (i < 0 || text[i] !== '@') {
49
+ return {
50
+ active: false,
51
+ query: '',
52
+ atRunLength: 0,
53
+ anchor: null
54
+ };
55
+ }
56
+ var runEnd = i;
57
+ while (i >= 0 && text[i] === '@') {
58
+ i -= 1;
59
+ }
60
+ var runStart = i + 1;
61
+ var atRunLength = runEnd - runStart + 1;
62
+ var prev = runStart > 0 ? text.charAt(runStart - 1) : '';
63
+ var isBoundary = !prev || /[\s([{]/.test(prev);
64
+ if (!isBoundary) {
65
+ return {
66
+ active: false,
67
+ query: '',
68
+ atRunLength: 0,
69
+ anchor: null
70
+ };
71
+ }
72
+ var query = text.slice(runEnd + 1, caret);
73
+ if (/\s/.test(query)) {
74
+ return {
75
+ active: false,
76
+ query: '',
77
+ atRunLength: 0,
78
+ anchor: null
79
+ };
80
+ }
81
+ return {
82
+ active: true,
83
+ query: query,
84
+ atRunLength: atRunLength,
85
+ anchor: {
86
+ node: node,
87
+ offset: runStart
88
+ }
89
+ };
90
+ };
91
+ export var useContextMentions = function useContextMentions() {
92
+ var editorRef = useRef(null);
93
+ var _useState = useState({
94
+ active: false,
95
+ query: '',
96
+ atRunLength: 0,
97
+ anchor: null
98
+ }),
99
+ _useState2 = _slicedToArray(_useState, 2),
100
+ trigger = _useState2[0],
101
+ setTrigger = _useState2[1];
102
+ var detectTrigger = useCallback(function () {
103
+ var selection = window.getSelection();
104
+ if (!selection || selection.rangeCount === 0 || !editorRef.current) {
105
+ return {
106
+ active: false,
107
+ query: '',
108
+ atRunLength: 0,
109
+ anchor: null
110
+ };
111
+ }
112
+ return detectMentionTrigger(editorRef.current, selection.getRangeAt(0));
113
+ }, []);
114
+ var updateTrigger = useCallback(function () {
115
+ var next = detectTrigger();
116
+ setTrigger(next);
117
+ return next;
118
+ }, [detectTrigger]);
119
+ var closeTrigger = useCallback(function () {
120
+ setTrigger({
121
+ active: false,
122
+ query: '',
123
+ atRunLength: 0,
124
+ anchor: null
125
+ });
126
+ }, []);
127
+
128
+ /**
129
+ * Ajusta la cantidad de `@` del trigger activo sin perder el query actual.
130
+ * Ej.: `@@abc` -> `@abc` al cambiar de tab.
131
+ */
132
+ var syncTriggerAtRunLength = useCallback(function (nextAtRunLength) {
133
+ var safeNext = Math.max(1, Math.floor(nextAtRunLength));
134
+ var current = detectTrigger();
135
+ if (!current.active || !current.anchor) return;
136
+ var _current$anchor = current.anchor,
137
+ node = _current$anchor.node,
138
+ offset = _current$anchor.offset;
139
+ if (node.nodeType !== Node.TEXT_NODE) return;
140
+ var textNode = node;
141
+ var full = textNode.data;
142
+ var queryLen = current.atRunLength + current.query.length;
143
+ var before = full.slice(0, offset);
144
+ var after = full.slice(offset + queryLen);
145
+ var nextRun = '@'.repeat(safeNext);
146
+ var nextValue = "".concat(before).concat(nextRun).concat(current.query).concat(after);
147
+
148
+ // eslint-disable-next-line no-param-reassign
149
+ textNode.data = nextValue;
150
+ var selection = window.getSelection();
151
+ if (selection) {
152
+ var range = document.createRange();
153
+ var caretOffset = before.length + nextRun.length + current.query.length;
154
+ range.setStart(textNode, Math.min(caretOffset, textNode.data.length));
155
+ range.collapse(true);
156
+ selection.removeAllRanges();
157
+ selection.addRange(range);
158
+ }
159
+ var updated = detectTrigger();
160
+ setTrigger(updated);
161
+ }, [detectTrigger]);
162
+
163
+ /**
164
+ * Reemplaza el `@query` pendiente por un chip atómico con la mention.
165
+ * Requiere que el caller provea el DOM del chip (se inserta tal cual).
166
+ */
167
+ var replaceTriggerWithChip = useCallback(function (chipNode, mention) {
168
+ var current = detectTrigger();
169
+ if (!current.active || !current.anchor) return;
170
+ var _current$anchor2 = current.anchor,
171
+ node = _current$anchor2.node,
172
+ offset = _current$anchor2.offset;
173
+ var textNode = node;
174
+ var full = textNode.data;
175
+ var queryLen = current.atRunLength + current.query.length;
176
+ var after = full.slice(offset + queryLen);
177
+
178
+ // Truncar el texto hasta antes del run de `@…`
179
+ // eslint-disable-next-line no-param-reassign
180
+ textNode.data = full.slice(0, offset);
181
+
182
+ // Insertar el chip justo después del nodo de texto
183
+ chipNode.setAttribute('data-mention', 'true');
184
+ chipNode.setAttribute('data-mention-id', String(mention.id));
185
+ chipNode.setAttribute('data-mention-type', mention.type);
186
+ chipNode.setAttribute('data-mention-label', mention.label);
187
+ chipNode.setAttribute('contenteditable', 'false');
188
+ var parent = textNode.parentNode;
189
+ if (!parent) return;
190
+ var spaceNode = document.createTextNode("\xA0".concat(after));
191
+ parent.insertBefore(chipNode, textNode.nextSibling);
192
+ parent.insertBefore(spaceNode, chipNode.nextSibling);
193
+
194
+ // Reposicionar caret después del chip (antes del espacio non-breaking)
195
+ var selection = window.getSelection();
196
+ if (selection) {
197
+ var range = document.createRange();
198
+ range.setStart(spaceNode, 1);
199
+ range.collapse(true);
200
+ selection.removeAllRanges();
201
+ selection.addRange(range);
202
+ }
203
+ closeTrigger();
204
+ }, [detectTrigger, closeTrigger]);
205
+
206
+ /**
207
+ * Serializa el contenido: texto plano + lista de mentions en orden de aparición.
208
+ */
209
+ var serialize = useCallback(function () {
210
+ var el = editorRef.current;
211
+ if (!el) return {
212
+ text: '',
213
+ mentions: []
214
+ };
215
+ var mentions = [];
216
+ var text = '';
217
+ var _walk = function walk(node) {
218
+ if (node.nodeType === Node.TEXT_NODE) {
219
+ text += node.data;
220
+ return;
221
+ }
222
+ if (node.nodeType === Node.ELEMENT_NODE) {
223
+ var _elNode$dataset;
224
+ var elNode = node;
225
+ if (((_elNode$dataset = elNode.dataset) === null || _elNode$dataset === void 0 ? void 0 : _elNode$dataset.mention) === 'true') {
226
+ var _elNode$dataset$menti, _ref, _ref2, _elNode$dataset$menti2;
227
+ var mention = {
228
+ id: (_elNode$dataset$menti = elNode.dataset.mentionId) !== null && _elNode$dataset$menti !== void 0 ? _elNode$dataset$menti : '',
229
+ type: (_ref = elNode.dataset.mentionType) !== null && _ref !== void 0 ? _ref : 'user',
230
+ label: (_ref2 = (_elNode$dataset$menti2 = elNode.dataset.mentionLabel) !== null && _elNode$dataset$menti2 !== void 0 ? _elNode$dataset$menti2 : elNode.textContent) !== null && _ref2 !== void 0 ? _ref2 : ''
231
+ };
232
+ mentions.push(mention);
233
+ text += serializeMention(mention);
234
+ return;
235
+ }
236
+ if (elNode.tagName === 'BR') {
237
+ text += '\n';
238
+ return;
239
+ }
240
+ elNode.childNodes.forEach(_walk);
241
+ if (elNode.tagName === 'DIV' || elNode.tagName === 'P') text += '\n';
242
+ }
243
+ };
244
+ el.childNodes.forEach(_walk);
245
+ return {
246
+ text: text.replace(/\n+$/, ''),
247
+ mentions: mentions
248
+ };
249
+ }, []);
250
+ var clear = useCallback(function () {
251
+ if (editorRef.current) editorRef.current.innerHTML = '';
252
+ closeTrigger();
253
+ }, [closeTrigger]);
254
+ var focus = useCallback(function () {
255
+ var _editorRef$current;
256
+ (_editorRef$current = editorRef.current) === null || _editorRef$current === void 0 || _editorRef$current.focus();
257
+ }, []);
258
+ return {
259
+ editorRef: editorRef,
260
+ trigger: trigger,
261
+ updateTrigger: updateTrigger,
262
+ closeTrigger: closeTrigger,
263
+ syncTriggerAtRunLength: syncTriggerAtRunLength,
264
+ replaceTriggerWithChip: replaceTriggerWithChip,
265
+ serialize: serialize,
266
+ clear: clear,
267
+ focus: focus
268
+ };
269
+ };
270
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZVJlZiIsInVzZVN0YXRlIiwic2VyaWFsaXplTWVudGlvbiIsImRldGVjdE1lbnRpb25UcmlnZ2VyIiwiZWRpdG9yRWwiLCJyYW5nZSIsImNvbnRhaW5zIiwic3RhcnRDb250YWluZXIiLCJhY3RpdmUiLCJxdWVyeSIsImF0UnVuTGVuZ3RoIiwiYW5jaG9yIiwibm9kZSIsIm5vZGVUeXBlIiwiTm9kZSIsIlRFWFRfTk9ERSIsInRleHQiLCJkYXRhIiwiY2FyZXQiLCJzdGFydE9mZnNldCIsImkiLCJ0ZXN0IiwicnVuRW5kIiwicnVuU3RhcnQiLCJwcmV2IiwiY2hhckF0IiwiaXNCb3VuZGFyeSIsInNsaWNlIiwib2Zmc2V0IiwidXNlQ29udGV4dE1lbnRpb25zIiwiZWRpdG9yUmVmIiwiX3VzZVN0YXRlIiwiX3VzZVN0YXRlMiIsIl9zbGljZWRUb0FycmF5IiwidHJpZ2dlciIsInNldFRyaWdnZXIiLCJkZXRlY3RUcmlnZ2VyIiwic2VsZWN0aW9uIiwid2luZG93IiwiZ2V0U2VsZWN0aW9uIiwicmFuZ2VDb3VudCIsImN1cnJlbnQiLCJnZXRSYW5nZUF0IiwidXBkYXRlVHJpZ2dlciIsIm5leHQiLCJjbG9zZVRyaWdnZXIiLCJzeW5jVHJpZ2dlckF0UnVuTGVuZ3RoIiwibmV4dEF0UnVuTGVuZ3RoIiwic2FmZU5leHQiLCJNYXRoIiwibWF4IiwiZmxvb3IiLCJfY3VycmVudCRhbmNob3IiLCJ0ZXh0Tm9kZSIsImZ1bGwiLCJxdWVyeUxlbiIsImxlbmd0aCIsImJlZm9yZSIsImFmdGVyIiwibmV4dFJ1biIsInJlcGVhdCIsIm5leHRWYWx1ZSIsImNvbmNhdCIsImRvY3VtZW50IiwiY3JlYXRlUmFuZ2UiLCJjYXJldE9mZnNldCIsInNldFN0YXJ0IiwibWluIiwiY29sbGFwc2UiLCJyZW1vdmVBbGxSYW5nZXMiLCJhZGRSYW5nZSIsInVwZGF0ZWQiLCJyZXBsYWNlVHJpZ2dlcldpdGhDaGlwIiwiY2hpcE5vZGUiLCJtZW50aW9uIiwiX2N1cnJlbnQkYW5jaG9yMiIsInNldEF0dHJpYnV0ZSIsIlN0cmluZyIsImlkIiwidHlwZSIsImxhYmVsIiwicGFyZW50IiwicGFyZW50Tm9kZSIsInNwYWNlTm9kZSIsImNyZWF0ZVRleHROb2RlIiwiaW5zZXJ0QmVmb3JlIiwibmV4dFNpYmxpbmciLCJzZXJpYWxpemUiLCJlbCIsIm1lbnRpb25zIiwid2FsayIsIkVMRU1FTlRfTk9ERSIsIl9lbE5vZGUkZGF0YXNldCIsImVsTm9kZSIsImRhdGFzZXQiLCJfZWxOb2RlJGRhdGFzZXQkbWVudGkiLCJfcmVmIiwiX3JlZjIiLCJfZWxOb2RlJGRhdGFzZXQkbWVudGkyIiwibWVudGlvbklkIiwibWVudGlvblR5cGUiLCJtZW50aW9uTGFiZWwiLCJ0ZXh0Q29udGVudCIsInB1c2giLCJ0YWdOYW1lIiwiY2hpbGROb2RlcyIsImZvckVhY2giLCJyZXBsYWNlIiwiY2xlYXIiLCJpbm5lckhUTUwiLCJmb2N1cyIsIl9lZGl0b3JSZWYkY3VycmVudCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2VDb250ZXh0TWVudGlvbnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IENvbnRleHRNZW50aW9uIH0gZnJvbSAnLi4vdHlwZXMvY29udGV4dE1lbnRpb24nXG5pbXBvcnQgeyBzZXJpYWxpemVNZW50aW9uIH0gZnJvbSAnLi4vdXRpbHMvcmVuZGVyQ29udGV4dE1lbnRpb25zJ1xuXG5leHBvcnQgdHlwZSBNZW50aW9uVHJpZ2dlclN0YXRlID0ge1xuICBhY3RpdmU6IGJvb2xlYW5cbiAgcXVlcnk6IHN0cmluZ1xuICAvKiogQ2FudGlkYWQgZGUgYEBgIGNvbnNlY3V0aXZvcyBkZWwgdHJpZ2dlciAoYEBgIOKGkiAxLCBgQEBgIOKGkiAyKS4gTWFwZWEgYSBsYSB0YWIgZW4gb3JkZW4uICovXG4gIGF0UnVuTGVuZ3RoOiBudW1iZXJcbiAgLyoqIFBvc2ljacOzbiBkZWwgcHJpbWVyIGBAYCBkZWwgcnVuIChyZWVtcGxhem8gZGVsIGNoaXApLiAqL1xuICBhbmNob3I6IHsgbm9kZTogTm9kZTsgb2Zmc2V0OiBudW1iZXIgfSB8IG51bGxcbn1cblxuLyoqXG4gKiBJbnNwZWNjaW9uYSBsYSBzZWxlY2Npw7NuIGFjdHVhbC4gRm9ybWF0bzogW2zDrW1pdGUgZGUgcGFsYWJyYV0gQCsgcXVlcnkgc2luIGVzcGFjaW9zIGhhc3RhIGVsIGNhcmV0LlxuICogTGEgdGFiIG9iamV0aXZvIGVzIGxhIHF1ZSBjb3JyZXNwb25kZSBhbCBuw7ptZXJvIGRlIGBAYCAoMSA9IHByaW1lcmEgdGFiIHZpc2libGUsIGV0Yy4pLlxuICovXG5jb25zdCBkZXRlY3RNZW50aW9uVHJpZ2dlciA9IChlZGl0b3JFbDogSFRNTEVsZW1lbnQgfCBudWxsLCByYW5nZTogUmFuZ2UpOiBNZW50aW9uVHJpZ2dlclN0YXRlID0+IHtcbiAgaWYgKCFlZGl0b3JFbCB8fCAhZWRpdG9yRWwuY29udGFpbnMocmFuZ2Uuc3RhcnRDb250YWluZXIpKSB7XG4gICAgcmV0dXJuIHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnLCBhdFJ1bkxlbmd0aDogMCwgYW5jaG9yOiBudWxsIH1cbiAgfVxuICBjb25zdCBub2RlID0gcmFuZ2Uuc3RhcnRDb250YWluZXJcbiAgaWYgKG5vZGUubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgcmV0dXJuIHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnLCBhdFJ1bkxlbmd0aDogMCwgYW5jaG9yOiBudWxsIH1cbiAgfVxuICBjb25zdCB0ZXh0ID0gKG5vZGUgYXMgVGV4dCkuZGF0YVxuICBjb25zdCBjYXJldCA9IHJhbmdlLnN0YXJ0T2Zmc2V0XG4gIGxldCBpID0gY2FyZXQgLSAxXG4gIGlmIChpIDwgMCkge1xuICAgIHJldHVybiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJywgYXRSdW5MZW5ndGg6IDAsIGFuY2hvcjogbnVsbCB9XG4gIH1cblxuICB3aGlsZSAoaSA+PSAwICYmIHRleHRbaV0gIT09ICdAJykge1xuICAgIGlmICgvXFxzLy50ZXN0KHRleHRbaV0pKSB7XG4gICAgICByZXR1cm4geyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycsIGF0UnVuTGVuZ3RoOiAwLCBhbmNob3I6IG51bGwgfVxuICAgIH1cbiAgICBpIC09IDFcbiAgfVxuICBpZiAoaSA8IDAgfHwgdGV4dFtpXSAhPT0gJ0AnKSB7XG4gICAgcmV0dXJuIHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnLCBhdFJ1bkxlbmd0aDogMCwgYW5jaG9yOiBudWxsIH1cbiAgfVxuXG4gIGNvbnN0IHJ1bkVuZCA9IGlcbiAgd2hpbGUgKGkgPj0gMCAmJiB0ZXh0W2ldID09PSAnQCcpIHtcbiAgICBpIC09IDFcbiAgfVxuICBjb25zdCBydW5TdGFydCA9IGkgKyAxXG4gIGNvbnN0IGF0UnVuTGVuZ3RoID0gcnVuRW5kIC0gcnVuU3RhcnQgKyAxXG4gIGNvbnN0IHByZXYgPSBydW5TdGFydCA+IDAgPyB0ZXh0LmNoYXJBdChydW5TdGFydCAtIDEpIDogJydcbiAgY29uc3QgaXNCb3VuZGFyeSA9ICFwcmV2IHx8IC9bXFxzKFt7XS8udGVzdChwcmV2KVxuICBpZiAoIWlzQm91bmRhcnkpIHtcbiAgICByZXR1cm4geyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycsIGF0UnVuTGVuZ3RoOiAwLCBhbmNob3I6IG51bGwgfVxuICB9XG5cbiAgY29uc3QgcXVlcnkgPSB0ZXh0LnNsaWNlKHJ1bkVuZCArIDEsIGNhcmV0KVxuICBpZiAoL1xccy8udGVzdChxdWVyeSkpIHtcbiAgICByZXR1cm4geyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycsIGF0UnVuTGVuZ3RoOiAwLCBhbmNob3I6IG51bGwgfVxuICB9XG5cbiAgcmV0dXJuIHsgYWN0aXZlOiB0cnVlLCBxdWVyeSwgYXRSdW5MZW5ndGgsIGFuY2hvcjogeyBub2RlLCBvZmZzZXQ6IHJ1blN0YXJ0IH0gfVxufVxuXG5leHBvcnQgY29uc3QgdXNlQ29udGV4dE1lbnRpb25zID0gKCkgPT4ge1xuICBjb25zdCBlZGl0b3JSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQgfCBudWxsPihudWxsKVxuICBjb25zdCBbdHJpZ2dlciwgc2V0VHJpZ2dlcl0gPSB1c2VTdGF0ZTxNZW50aW9uVHJpZ2dlclN0YXRlPih7XG4gICAgYWN0aXZlOiBmYWxzZSxcbiAgICBxdWVyeTogJycsXG4gICAgYXRSdW5MZW5ndGg6IDAsXG4gICAgYW5jaG9yOiBudWxsLFxuICB9KVxuXG4gIGNvbnN0IGRldGVjdFRyaWdnZXIgPSB1c2VDYWxsYmFjaygoKTogTWVudGlvblRyaWdnZXJTdGF0ZSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpXG4gICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDAgfHwgIWVkaXRvclJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm4geyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycsIGF0UnVuTGVuZ3RoOiAwLCBhbmNob3I6IG51bGwgfVxuICAgIH1cbiAgICByZXR1cm4gZGV0ZWN0TWVudGlvblRyaWdnZXIoZWRpdG9yUmVmLmN1cnJlbnQsIHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApKVxuICB9LCBbXSlcblxuICBjb25zdCB1cGRhdGVUcmlnZ2VyID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNvbnN0IG5leHQgPSBkZXRlY3RUcmlnZ2VyKClcbiAgICBzZXRUcmlnZ2VyKG5leHQpXG4gICAgcmV0dXJuIG5leHRcbiAgfSwgW2RldGVjdFRyaWdnZXJdKVxuXG4gIGNvbnN0IGNsb3NlVHJpZ2dlciA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRUcmlnZ2VyKHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnLCBhdFJ1bkxlbmd0aDogMCwgYW5jaG9yOiBudWxsIH0pXG4gIH0sIFtdKVxuXG4gIC8qKlxuICAgKiBBanVzdGEgbGEgY2FudGlkYWQgZGUgYEBgIGRlbCB0cmlnZ2VyIGFjdGl2byBzaW4gcGVyZGVyIGVsIHF1ZXJ5IGFjdHVhbC5cbiAgICogRWouOiBgQEBhYmNgIC0+IGBAYWJjYCBhbCBjYW1iaWFyIGRlIHRhYi5cbiAgICovXG4gIGNvbnN0IHN5bmNUcmlnZ2VyQXRSdW5MZW5ndGggPSB1c2VDYWxsYmFjayhcbiAgICAobmV4dEF0UnVuTGVuZ3RoOiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IHNhZmVOZXh0ID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihuZXh0QXRSdW5MZW5ndGgpKVxuICAgICAgY29uc3QgY3VycmVudCA9IGRldGVjdFRyaWdnZXIoKVxuICAgICAgaWYgKCFjdXJyZW50LmFjdGl2ZSB8fCAhY3VycmVudC5hbmNob3IpIHJldHVyblxuXG4gICAgICBjb25zdCB7IG5vZGUsIG9mZnNldCB9ID0gY3VycmVudC5hbmNob3JcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSkgcmV0dXJuXG4gICAgICBjb25zdCB0ZXh0Tm9kZSA9IG5vZGUgYXMgVGV4dFxuICAgICAgY29uc3QgZnVsbCA9IHRleHROb2RlLmRhdGFcbiAgICAgIGNvbnN0IHF1ZXJ5TGVuID0gY3VycmVudC5hdFJ1bkxlbmd0aCArIGN1cnJlbnQucXVlcnkubGVuZ3RoXG4gICAgICBjb25zdCBiZWZvcmUgPSBmdWxsLnNsaWNlKDAsIG9mZnNldClcbiAgICAgIGNvbnN0IGFmdGVyID0gZnVsbC5zbGljZShvZmZzZXQgKyBxdWVyeUxlbilcbiAgICAgIGNvbnN0IG5leHRSdW4gPSAnQCcucmVwZWF0KHNhZmVOZXh0KVxuICAgICAgY29uc3QgbmV4dFZhbHVlID0gYCR7YmVmb3JlfSR7bmV4dFJ1bn0ke2N1cnJlbnQucXVlcnl9JHthZnRlcn1gXG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgdGV4dE5vZGUuZGF0YSA9IG5leHRWYWx1ZVxuXG4gICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKClcbiAgICAgIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpXG4gICAgICAgIGNvbnN0IGNhcmV0T2Zmc2V0ID0gYmVmb3JlLmxlbmd0aCArIG5leHRSdW4ubGVuZ3RoICsgY3VycmVudC5xdWVyeS5sZW5ndGhcbiAgICAgICAgcmFuZ2Uuc2V0U3RhcnQodGV4dE5vZGUsIE1hdGgubWluKGNhcmV0T2Zmc2V0LCB0ZXh0Tm9kZS5kYXRhLmxlbmd0aCkpXG4gICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpXG4gICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKVxuICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVwZGF0ZWQgPSBkZXRlY3RUcmlnZ2VyKClcbiAgICAgIHNldFRyaWdnZXIodXBkYXRlZClcbiAgICB9LFxuICAgIFtkZXRlY3RUcmlnZ2VyXVxuICApXG5cbiAgLyoqXG4gICAqIFJlZW1wbGF6YSBlbCBgQHF1ZXJ5YCBwZW5kaWVudGUgcG9yIHVuIGNoaXAgYXTDs21pY28gY29uIGxhIG1lbnRpb24uXG4gICAqIFJlcXVpZXJlIHF1ZSBlbCBjYWxsZXIgcHJvdmVhIGVsIERPTSBkZWwgY2hpcCAoc2UgaW5zZXJ0YSB0YWwgY3VhbCkuXG4gICAqL1xuICBjb25zdCByZXBsYWNlVHJpZ2dlcldpdGhDaGlwID0gdXNlQ2FsbGJhY2soXG4gICAgKGNoaXBOb2RlOiBIVE1MRWxlbWVudCwgbWVudGlvbjogQ29udGV4dE1lbnRpb24pID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBkZXRlY3RUcmlnZ2VyKClcbiAgICAgIGlmICghY3VycmVudC5hY3RpdmUgfHwgIWN1cnJlbnQuYW5jaG9yKSByZXR1cm5cblxuICAgICAgY29uc3QgeyBub2RlLCBvZmZzZXQgfSA9IGN1cnJlbnQuYW5jaG9yXG4gICAgICBjb25zdCB0ZXh0Tm9kZSA9IG5vZGUgYXMgVGV4dFxuICAgICAgY29uc3QgZnVsbCA9IHRleHROb2RlLmRhdGFcbiAgICAgIGNvbnN0IHF1ZXJ5TGVuID0gY3VycmVudC5hdFJ1bkxlbmd0aCArIGN1cnJlbnQucXVlcnkubGVuZ3RoXG4gICAgICBjb25zdCBhZnRlciA9IGZ1bGwuc2xpY2Uob2Zmc2V0ICsgcXVlcnlMZW4pXG5cbiAgICAgIC8vIFRydW5jYXIgZWwgdGV4dG8gaGFzdGEgYW50ZXMgZGVsIHJ1biBkZSBgQOKApmBcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgdGV4dE5vZGUuZGF0YSA9IGZ1bGwuc2xpY2UoMCwgb2Zmc2V0KVxuXG4gICAgICAvLyBJbnNlcnRhciBlbCBjaGlwIGp1c3RvIGRlc3B1w6lzIGRlbCBub2RvIGRlIHRleHRvXG4gICAgICBjaGlwTm9kZS5zZXRBdHRyaWJ1dGUoJ2RhdGEtbWVudGlvbicsICd0cnVlJylcbiAgICAgIGNoaXBOb2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1tZW50aW9uLWlkJywgU3RyaW5nKG1lbnRpb24uaWQpKVxuICAgICAgY2hpcE5vZGUuc2V0QXR0cmlidXRlKCdkYXRhLW1lbnRpb24tdHlwZScsIG1lbnRpb24udHlwZSlcbiAgICAgIGNoaXBOb2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1tZW50aW9uLWxhYmVsJywgbWVudGlvbi5sYWJlbClcbiAgICAgIGNoaXBOb2RlLnNldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJywgJ2ZhbHNlJylcblxuICAgICAgY29uc3QgcGFyZW50ID0gdGV4dE5vZGUucGFyZW50Tm9kZVxuICAgICAgaWYgKCFwYXJlbnQpIHJldHVyblxuXG4gICAgICBjb25zdCBzcGFjZU5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShgXFx1MDBhMCR7YWZ0ZXJ9YClcbiAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoY2hpcE5vZGUsIHRleHROb2RlLm5leHRTaWJsaW5nKVxuICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShzcGFjZU5vZGUsIGNoaXBOb2RlLm5leHRTaWJsaW5nKVxuXG4gICAgICAvLyBSZXBvc2ljaW9uYXIgY2FyZXQgZGVzcHXDqXMgZGVsIGNoaXAgKGFudGVzIGRlbCBlc3BhY2lvIG5vbi1icmVha2luZylcbiAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKVxuICAgICAgaWYgKHNlbGVjdGlvbikge1xuICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKClcbiAgICAgICAgcmFuZ2Uuc2V0U3RhcnQoc3BhY2VOb2RlLCAxKVxuICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKVxuICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKClcbiAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKVxuICAgICAgfVxuXG4gICAgICBjbG9zZVRyaWdnZXIoKVxuICAgIH0sXG4gICAgW2RldGVjdFRyaWdnZXIsIGNsb3NlVHJpZ2dlcl1cbiAgKVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemEgZWwgY29udGVuaWRvOiB0ZXh0byBwbGFubyArIGxpc3RhIGRlIG1lbnRpb25zIGVuIG9yZGVuIGRlIGFwYXJpY2nDs24uXG4gICAqL1xuICBjb25zdCBzZXJpYWxpemUgPSB1c2VDYWxsYmFjaygoKTogeyB0ZXh0OiBzdHJpbmc7IG1lbnRpb25zOiBDb250ZXh0TWVudGlvbltdIH0gPT4ge1xuICAgIGNvbnN0IGVsID0gZWRpdG9yUmVmLmN1cnJlbnRcbiAgICBpZiAoIWVsKSByZXR1cm4geyB0ZXh0OiAnJywgbWVudGlvbnM6IFtdIH1cbiAgICBjb25zdCBtZW50aW9uczogQ29udGV4dE1lbnRpb25bXSA9IFtdXG4gICAgbGV0IHRleHQgPSAnJ1xuXG4gICAgY29uc3Qgd2FsayA9IChub2RlOiBOb2RlKSA9PiB7XG4gICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgdGV4dCArPSAobm9kZSBhcyBUZXh0KS5kYXRhXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIGNvbnN0IGVsTm9kZSA9IG5vZGUgYXMgSFRNTEVsZW1lbnRcbiAgICAgICAgaWYgKGVsTm9kZS5kYXRhc2V0Py5tZW50aW9uID09PSAndHJ1ZScpIHtcbiAgICAgICAgICBjb25zdCBtZW50aW9uOiBDb250ZXh0TWVudGlvbiA9IHtcbiAgICAgICAgICAgIGlkOiBlbE5vZGUuZGF0YXNldC5tZW50aW9uSWQgPz8gJycsXG4gICAgICAgICAgICB0eXBlOiAoZWxOb2RlLmRhdGFzZXQubWVudGlvblR5cGUgYXMgQ29udGV4dE1lbnRpb25bJ3R5cGUnXSkgPz8gJ3VzZXInLFxuICAgICAgICAgICAgbGFiZWw6IGVsTm9kZS5kYXRhc2V0Lm1lbnRpb25MYWJlbCA/PyBlbE5vZGUudGV4dENvbnRlbnQgPz8gJycsXG4gICAgICAgICAgfVxuICAgICAgICAgIG1lbnRpb25zLnB1c2gobWVudGlvbilcbiAgICAgICAgICB0ZXh0ICs9IHNlcmlhbGl6ZU1lbnRpb24obWVudGlvbilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxOb2RlLnRhZ05hbWUgPT09ICdCUicpIHtcbiAgICAgICAgICB0ZXh0ICs9ICdcXG4nXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgZWxOb2RlLmNoaWxkTm9kZXMuZm9yRWFjaCh3YWxrKVxuICAgICAgICBpZiAoZWxOb2RlLnRhZ05hbWUgPT09ICdESVYnIHx8IGVsTm9kZS50YWdOYW1lID09PSAnUCcpIHRleHQgKz0gJ1xcbidcbiAgICAgIH1cbiAgICB9XG5cbiAgICBlbC5jaGlsZE5vZGVzLmZvckVhY2god2FsaylcbiAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LnJlcGxhY2UoL1xcbiskLywgJycpLCBtZW50aW9ucyB9XG4gIH0sIFtdKVxuXG4gIGNvbnN0IGNsZWFyID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmIChlZGl0b3JSZWYuY3VycmVudCkgZWRpdG9yUmVmLmN1cnJlbnQuaW5uZXJIVE1MID0gJydcbiAgICBjbG9zZVRyaWdnZXIoKVxuICB9LCBbY2xvc2VUcmlnZ2VyXSlcblxuICBjb25zdCBmb2N1cyA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBlZGl0b3JSZWYuY3VycmVudD8uZm9jdXMoKVxuICB9LCBbXSlcblxuICByZXR1cm4ge1xuICAgIGVkaXRvclJlZixcbiAgICB0cmlnZ2VyLFxuICAgIHVwZGF0ZVRyaWdnZXIsXG4gICAgY2xvc2VUcmlnZ2VyLFxuICAgIHN5bmNUcmlnZ2VyQXRSdW5MZW5ndGgsXG4gICAgcmVwbGFjZVRyaWdnZXJXaXRoQ2hpcCxcbiAgICBzZXJpYWxpemUsXG4gICAgY2xlYXIsXG4gICAgZm9jdXMsXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLFNBQVNBLFdBQVcsRUFBRUMsTUFBTSxFQUFFQyxRQUFRLFFBQVEsT0FBTztBQUVyRCxTQUFTQyxnQkFBZ0IsUUFBUSxnQ0FBZ0M7QUFXakU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFNQyxvQkFBb0IsR0FBRyxTQUF2QkEsb0JBQW9CQSxDQUFJQyxRQUE0QixFQUFFQyxLQUFZLEVBQTBCO0VBQ2hHLElBQUksQ0FBQ0QsUUFBUSxJQUFJLENBQUNBLFFBQVEsQ0FBQ0UsUUFBUSxDQUFDRCxLQUFLLENBQUNFLGNBQWMsQ0FBQyxFQUFFO0lBQ3pELE9BQU87TUFBRUMsTUFBTSxFQUFFLEtBQUs7TUFBRUMsS0FBSyxFQUFFLEVBQUU7TUFBRUMsV0FBVyxFQUFFLENBQUM7TUFBRUMsTUFBTSxFQUFFO0lBQUssQ0FBQztFQUNuRTtFQUNBLElBQU1DLElBQUksR0FBR1AsS0FBSyxDQUFDRSxjQUFjO0VBQ2pDLElBQUlLLElBQUksQ0FBQ0MsUUFBUSxLQUFLQyxJQUFJLENBQUNDLFNBQVMs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