@projectcor/maia-components 2.11.103-5 → 2.11.103-7

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 (72) hide show
  1. package/lib/App.js +19 -44
  2. package/lib/components/atoms/MAIAInput/MAIAInput.js +6 -1
  3. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.js +20 -0
  4. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.styles.js +20 -0
  5. package/lib/components/atoms/SessionGeneratingDot/index.js +2 -0
  6. package/lib/components/atoms/icons/MaiaSparkleIcon.js +75 -0
  7. package/lib/components/atoms/icons/index.js +2 -1
  8. package/lib/components/index.js +1 -2
  9. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +4 -91
  10. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +46 -7
  11. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +311 -69
  12. package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +28 -18
  13. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +9 -2
  14. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +69 -61
  15. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.styles.js +5 -1
  16. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.js +66 -0
  17. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.styles.js +55 -0
  18. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/index.js +2 -0
  19. package/lib/components/molecules/ChatFooter/ChatFooter.js +4 -2
  20. package/lib/components/molecules/Sidebar/Sidebar.js +104 -61
  21. package/lib/components/molecules/Sidebar/Sidebar.layout.styles.js +16 -1
  22. package/lib/components/molecules/Sidebar/Sidebar.styles.js +30 -29
  23. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +6 -35
  24. package/lib/components/organisms/ChatAI/ChatAI.js +131 -40
  25. package/lib/context/global-context.js +3 -1
  26. package/lib/hooks/useAgentModel/useCreateAgent.js +14 -61
  27. package/lib/hooks/useAgentModel/useUpdateAgent.js +11 -58
  28. package/lib/hooks/useChatManager/useChatManager.js +530 -438
  29. package/lib/hooks/useChatMessages/useChatMessages.js +427 -236
  30. package/lib/hooks/useChats/useChats.js +21 -4
  31. package/lib/hooks/useEvent.js +1 -2
  32. package/lib/hooks/useMinimizedPillBottomOffset.js +110 -0
  33. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.interface.js +1 -1
  34. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +139 -521
  35. package/lib/hooks/useStreamingMessage/index.js +2 -3
  36. package/lib/hooks/useStreamingMessage/useStreamingMessage.js +13 -17
  37. package/lib/index.js +2 -5
  38. package/lib/lang/br/index.js +11 -9
  39. package/lib/lang/en/index.js +11 -9
  40. package/lib/lang/es/index.js +11 -9
  41. package/lib/lang/fr/index.js +13 -10
  42. package/lib/services/maia/Chats/getChatsByUserId.js +6 -4
  43. package/lib/services/maia/Chats/index.js +3 -1
  44. package/lib/services/maia/Chats/markSessionAsRead.js +32 -0
  45. package/lib/store/chatsSidebarOptimistic.js +92 -0
  46. package/lib/store/chatsStore.types.js +1 -1
  47. package/lib/store/maiaMinimizedPersistence.js +49 -0
  48. package/lib/store/sessions/activeView.js +22 -0
  49. package/lib/store/sessions/index.js +9 -0
  50. package/lib/store/sessions/sessionHitlContext.js +15 -0
  51. package/lib/store/sessions/sessionNotificationSound.js +57 -0
  52. package/lib/store/sessions/sessionNotifications.js +110 -0
  53. package/lib/store/sessions/sessionNotifications.types.js +2 -0
  54. package/lib/store/sessions/sessionStreamManager.js +576 -0
  55. package/lib/store/sessions/sessionStreamingText.js +80 -0
  56. package/lib/store/sessions/sessions.types.js +35 -0
  57. package/lib/store/sessions/useSessionMeta.js +39 -0
  58. package/lib/store/sessions/useSessionStreamingText.js +18 -0
  59. package/lib/store/sessions/useSessionsStore.js +197 -0
  60. package/lib/store/useChatsStore.js +149 -12
  61. package/lib/types/Chat.js +1 -1
  62. package/lib/types/agentModal.js +1 -1
  63. package/lib/utils/formatUnreadCount.js +6 -0
  64. package/lib/utils/maiaHostOpen.js +54 -0
  65. package/lib/utils/normalizeAgentConnectors.js +3 -28
  66. package/package.json +3 -3
  67. package/lib/components/organisms/ChatAIPage/ChatAIPage.js +0 -543
  68. package/lib/components/organisms/ChatAIPage/ChatAIPage.styles.js +0 -16
  69. package/lib/components/organisms/ChatAIPage/index.js +0 -3
  70. package/lib/dev/DevMaiaPage.js +0 -30
  71. package/lib/hooks/useStreamingMessage/streamingStore.js +0 -69
  72. package/lib/services/maia/Agents/connectors.js +0 -250
@@ -0,0 +1,576 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
3
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
4
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
5
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
6
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
7
+ 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; } } }; }
8
+ 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; } }
9
+ 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; }
10
+ /* eslint-disable no-console */
11
+ /* eslint-disable no-continue */
12
+ /* eslint-disable no-await-in-loop */
13
+ /* eslint-disable no-restricted-syntax */
14
+ /* eslint-disable no-constant-condition */
15
+ /* eslint-disable @typescript-eslint/no-explicit-any */
16
+ import maia from '../../services/maia';
17
+ import { getInitialStreamActivity, getThinkingLoadingMessage, getWritingStreamActivity, resolveHitlNodeStreamActivity, resolveInitialHitlStreamActivity } from '../../utils/streamActivityMessages';
18
+ import { isCompleteLikeSsePayload, mergeStreamChunk } from '../../utils/sseStreamContent';
19
+ import { sessionStreamingText } from './sessionStreamingText';
20
+ import { useSessionsStore } from './useSessionsStore';
21
+ import { ensureSessionNotificationsInitialized } from './sessionNotifications';
22
+ import { sessionHitlContext } from './sessionHitlContext';
23
+
24
+ /** Compatible con el `t` de i18next (uso de una sola key). */
25
+
26
+ /**
27
+ * Máximo de sesiones generando en paralelo. Protege red/recursos del cliente.
28
+ * Ajustable a futuro vía flag del host.
29
+ */
30
+ export var MAX_CONCURRENT_STREAMS = 4;
31
+ var STREAM_THROTTLE_MS = 16;
32
+ var activeStreams = new Map();
33
+ var store = function store() {
34
+ return useSessionsStore.getState();
35
+ };
36
+ var isStreamActive = function isStreamActive(sessionId) {
37
+ return activeStreams.has(sessionId);
38
+ };
39
+ var getActiveStreamCount = function getActiveStreamCount() {
40
+ return activeStreams.size;
41
+ };
42
+ var parseSessionSSE = /*#__PURE__*/function () {
43
+ var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(response, active, params) {
44
+ var _params$hitlExecution, _response$body, _data$error, _data$error2, _callbacks$onError, _data$error3, _data$error4;
45
+ var sessionId, placeholderId, callbacks, t, hitlExecutionContext, pendingContent, throttleTimer, flushToStores, emitThrottled, flushPending, reader, decoder, buffer, accumulatedContent, hasStartedWriting, ensureWritingStarted, applyStreamChunk, applyStreamComplete, _yield$reader$read, done, value, lines, _iterator, _step, line, _line$split, _line$split2, eventLine, dataLine, eventType, dataStr, data, chunk, _chunk, _callbacks$onApproval, isManualApproval, _t, _t2, _t3;
46
+ return _regeneratorRuntime.wrap(function (_context) {
47
+ while (1) switch (_context.prev = _context.next) {
48
+ case 0:
49
+ sessionId = params.sessionId, placeholderId = params.placeholderId, callbacks = params.callbacks, t = params.t;
50
+ hitlExecutionContext = (_params$hitlExecution = params.hitlExecutionContext) !== null && _params$hitlExecution !== void 0 ? _params$hitlExecution : sessionHitlContext.get(sessionId);
51
+ pendingContent = null;
52
+ throttleTimer = null;
53
+ flushToStores = function flushToStores(content) {
54
+ var _callbacks$onStreamUp;
55
+ sessionStreamingText.setText(sessionId, placeholderId, content);
56
+ (_callbacks$onStreamUp = callbacks.onStreamUpdate) === null || _callbacks$onStreamUp === void 0 || _callbacks$onStreamUp.call(callbacks, content);
57
+ };
58
+ emitThrottled = function emitThrottled(content) {
59
+ pendingContent = content;
60
+ if (throttleTimer != null) return;
61
+ throttleTimer = window.setTimeout(function () {
62
+ throttleTimer = null;
63
+ if (pendingContent != null) {
64
+ var toEmit = pendingContent;
65
+ pendingContent = null;
66
+ flushToStores(toEmit);
67
+ }
68
+ }, STREAM_THROTTLE_MS);
69
+ };
70
+ flushPending = function flushPending() {
71
+ if (throttleTimer != null) {
72
+ window.clearTimeout(throttleTimer);
73
+ throttleTimer = null;
74
+ }
75
+ if (pendingContent != null) {
76
+ var toEmit = pendingContent;
77
+ pendingContent = null;
78
+ flushToStores(toEmit);
79
+ }
80
+ };
81
+ reader = (_response$body = response.body) === null || _response$body === void 0 ? void 0 : _response$body.getReader();
82
+ if (reader) {
83
+ _context.next = 1;
84
+ break;
85
+ }
86
+ throw new Error('No reader available');
87
+ case 1:
88
+ decoder = new TextDecoder();
89
+ buffer = '';
90
+ accumulatedContent = '';
91
+ hasStartedWriting = false;
92
+ ensureWritingStarted = function ensureWritingStarted() {
93
+ var _callbacks$onStartWri;
94
+ if (hasStartedWriting) return;
95
+ hasStartedWriting = true;
96
+ store().patchMeta(sessionId, {
97
+ isLoading: true,
98
+ isWriting: true
99
+ });
100
+ store().setStatus(sessionId, 'writing');
101
+ store().setActivity(sessionId, getWritingStreamActivity(t));
102
+ (_callbacks$onStartWri = callbacks.onStartWriting) === null || _callbacks$onStartWri === void 0 || _callbacks$onStartWri.call(callbacks);
103
+ };
104
+ applyStreamChunk = function applyStreamChunk(chunk) {
105
+ if (!chunk) return;
106
+ accumulatedContent = mergeStreamChunk(accumulatedContent, chunk);
107
+ emitThrottled(accumulatedContent);
108
+ };
109
+ applyStreamComplete = function applyStreamComplete(payload) {
110
+ var _payload$agent_id, _subagentRaw$resolved, _callbacks$onFinishSt;
111
+ var finalContent = payload.content || accumulatedContent;
112
+ var sources = payload.sources || null;
113
+ var memorySessionId = payload.memory_session_id || '';
114
+ var attachments = Array.isArray(payload.attachments) ? payload.attachments : null;
115
+ var suggestions = null;
116
+ if (Array.isArray(payload.suggest_reply)) {
117
+ suggestions = payload.suggest_reply;
118
+ } else if (Array.isArray(payload.suggestions)) {
119
+ suggestions = payload.suggestions;
120
+ }
121
+ var agentIdRaw = (_payload$agent_id = payload.agent_id) !== null && _payload$agent_id !== void 0 ? _payload$agent_id : payload.agentId;
122
+ var completedAgentId = agentIdRaw != null && String(agentIdRaw).trim() !== '' ? String(agentIdRaw).trim() : null;
123
+ var subagentRaw = payload.subagent;
124
+ var resolvedContext = (_subagentRaw$resolved = subagentRaw === null || subagentRaw === void 0 ? void 0 : subagentRaw.resolved_context) !== null && _subagentRaw$resolved !== void 0 ? _subagentRaw$resolved : null;
125
+ flushPending();
126
+ sessionStreamingText.clear(sessionId);
127
+ store().patchMeta(sessionId, {
128
+ isLoading: false,
129
+ isWriting: false
130
+ });
131
+ store().setActivity(sessionId, null);
132
+ store().setStatus(sessionId, 'complete');
133
+ var finishPayload = {
134
+ content: finalContent,
135
+ sources: sources,
136
+ memorySessionId: memorySessionId,
137
+ attachments: attachments,
138
+ suggestions: suggestions,
139
+ completedAgentId: completedAgentId,
140
+ resolvedContext: resolvedContext
141
+ };
142
+ (_callbacks$onFinishSt = callbacks.onFinishStream) === null || _callbacks$onFinishSt === void 0 || _callbacks$onFinishSt.call(callbacks, finishPayload);
143
+ };
144
+ _context.prev = 2;
145
+ case 3:
146
+ if (!true) {
147
+ _context.next = 28;
148
+ break;
149
+ }
150
+ if (!active.isStopped) {
151
+ _context.next = 4;
152
+ break;
153
+ }
154
+ reader.cancel();
155
+ return _context.abrupt("continue", 28);
156
+ case 4:
157
+ _context.next = 5;
158
+ return reader.read();
159
+ case 5:
160
+ _yield$reader$read = _context.sent;
161
+ done = _yield$reader$read.done;
162
+ value = _yield$reader$read.value;
163
+ if (!done) {
164
+ _context.next = 6;
165
+ break;
166
+ }
167
+ return _context.abrupt("continue", 28);
168
+ case 6:
169
+ if (!active.isStopped) {
170
+ _context.next = 7;
171
+ break;
172
+ }
173
+ reader.cancel();
174
+ return _context.abrupt("continue", 28);
175
+ case 7:
176
+ buffer += decoder.decode(value, {
177
+ stream: true
178
+ });
179
+ lines = buffer.split('\n\n');
180
+ buffer = lines.pop() || '';
181
+ _iterator = _createForOfIteratorHelper(lines);
182
+ _context.prev = 8;
183
+ _iterator.s();
184
+ case 9:
185
+ if ((_step = _iterator.n()).done) {
186
+ _context.next = 24;
187
+ break;
188
+ }
189
+ line = _step.value;
190
+ if (!(line.trim() === '')) {
191
+ _context.next = 10;
192
+ break;
193
+ }
194
+ return _context.abrupt("continue", 23);
195
+ case 10:
196
+ _line$split = line.split('\n'), _line$split2 = _slicedToArray(_line$split, 2), eventLine = _line$split2[0], dataLine = _line$split2[1];
197
+ if (!(!eventLine || !dataLine)) {
198
+ _context.next = 11;
199
+ break;
200
+ }
201
+ return _context.abrupt("continue", 23);
202
+ case 11:
203
+ eventType = eventLine.replace('event: ', '').trim();
204
+ dataStr = dataLine.replace('data: ', '').trim();
205
+ _context.prev = 12;
206
+ data = JSON.parse(dataStr);
207
+ _t = eventType;
208
+ _context.next = _t === 'thinking' ? 13 : _t === 'token' ? 14 : _t === 'content' ? 15 : _t === 'node' ? 16 : _t === 'complete' ? 17 : _t === 'approval_required' ? 18 : _t === 'error' ? 19 : 20;
209
+ break;
210
+ case 13:
211
+ if (!hasStartedWriting) {
212
+ store().patchMeta(sessionId, {
213
+ isLoading: true
214
+ });
215
+ store().setStatus(sessionId, 'thinking');
216
+ store().setActivity(sessionId, {
217
+ phase: 'thinking',
218
+ message: getThinkingLoadingMessage(0, t)
219
+ });
220
+ }
221
+ return _context.abrupt("continue", 21);
222
+ case 14:
223
+ chunk = typeof data.content === 'string' ? data.content : '';
224
+ ensureWritingStarted();
225
+ applyStreamChunk(chunk);
226
+ return _context.abrupt("continue", 21);
227
+ case 15:
228
+ _chunk = typeof data.content === 'string' ? data.content : '';
229
+ ensureWritingStarted();
230
+ applyStreamChunk(_chunk);
231
+ if (isCompleteLikeSsePayload(data)) {
232
+ applyStreamComplete(data);
233
+ }
234
+ return _context.abrupt("continue", 21);
235
+ case 16:
236
+ if (data.node === 'agent_transfer') {
237
+ store().patchMeta(sessionId, {
238
+ isLoading: true
239
+ });
240
+ store().setStatus(sessionId, 'thinking');
241
+ } else if (data.message && typeof data.message === 'string') {
242
+ store().patchMeta(sessionId, {
243
+ isLoading: true
244
+ });
245
+ store().setStatus(sessionId, 'thinking');
246
+ store().setActivity(sessionId, resolveHitlNodeStreamActivity(data.message, t, hitlExecutionContext !== null && hitlExecutionContext !== void 0 ? hitlExecutionContext : undefined, typeof data.thread_id === 'string' ? data.thread_id : undefined));
247
+ }
248
+ return _context.abrupt("continue", 21);
249
+ case 17:
250
+ applyStreamComplete(data);
251
+ return _context.abrupt("continue", 21);
252
+ case 18:
253
+ flushPending();
254
+ isManualApproval = data.manual_approval_detected === true;
255
+ store().patchMeta(sessionId, {
256
+ isWriting: false
257
+ });
258
+ if (!isManualApproval) {
259
+ store().patchMeta(sessionId, {
260
+ isLoading: false
261
+ });
262
+ sessionStreamingText.clear(sessionId);
263
+ store().setActivity(sessionId, null);
264
+ }
265
+ store().setStatus(sessionId, 'awaiting_approval');
266
+ (_callbacks$onApproval = callbacks.onApprovalRequired) === null || _callbacks$onApproval === void 0 || _callbacks$onApproval.call(callbacks, data, accumulatedContent);
267
+ if (isManualApproval && Array.isArray(data.pending_actions) && data.pending_actions.length > 0) {
268
+ store().patchMeta(sessionId, {
269
+ isLoading: true
270
+ });
271
+ store().setStatus(sessionId, 'thinking');
272
+ store().setActivity(sessionId, resolveInitialHitlStreamActivity(t, hitlExecutionContext !== null && hitlExecutionContext !== void 0 ? hitlExecutionContext : undefined));
273
+ }
274
+ return _context.abrupt("continue", 21);
275
+ case 19:
276
+ console.error('SSE Error:', data.error);
277
+ flushPending();
278
+ sessionStreamingText.clear(sessionId);
279
+ store().patchMeta(sessionId, {
280
+ isLoading: false,
281
+ isWriting: false
282
+ });
283
+ store().setActivity(sessionId, null);
284
+ store().setError(sessionId, {
285
+ type: (_data$error = data.error) === null || _data$error === void 0 ? void 0 : _data$error.type,
286
+ message: (_data$error2 = data.error) === null || _data$error2 === void 0 ? void 0 : _data$error2.message
287
+ });
288
+ store().setStatus(sessionId, 'error');
289
+ (_callbacks$onError = callbacks.onError) === null || _callbacks$onError === void 0 || _callbacks$onError.call(callbacks, (_data$error3 = data.error) === null || _data$error3 === void 0 ? void 0 : _data$error3.type, (_data$error4 = data.error) === null || _data$error4 === void 0 ? void 0 : _data$error4.message);
290
+ return _context.abrupt("continue", 21);
291
+ case 20:
292
+ console.warn('Unknown SSE event type:', eventType);
293
+ return _context.abrupt("continue", 21);
294
+ case 21:
295
+ _context.next = 23;
296
+ break;
297
+ case 22:
298
+ _context.prev = 22;
299
+ _t2 = _context["catch"](12);
300
+ console.error('Error parsing SSE data:', _t2, dataStr);
301
+ case 23:
302
+ _context.next = 9;
303
+ break;
304
+ case 24:
305
+ _context.next = 26;
306
+ break;
307
+ case 25:
308
+ _context.prev = 25;
309
+ _t3 = _context["catch"](8);
310
+ _iterator.e(_t3);
311
+ case 26:
312
+ _context.prev = 26;
313
+ _iterator.f();
314
+ return _context.finish(26);
315
+ case 27:
316
+ _context.next = 3;
317
+ break;
318
+ case 28:
319
+ _context.prev = 28;
320
+ flushPending();
321
+ return _context.finish(28);
322
+ case 29:
323
+ case "end":
324
+ return _context.stop();
325
+ }
326
+ }, _callee, null, [[2,, 28, 29], [8, 25, 26, 27], [12, 22]]);
327
+ }));
328
+ return function parseSessionSSE(_x, _x2, _x3) {
329
+ return _ref.apply(this, arguments);
330
+ };
331
+ }();
332
+
333
+ /**
334
+ * Manager singleton (module-level) que corre N streams del orchestrator en
335
+ * paralelo, uno por `sessionId`. Sobrevive a cambios de vista y al cierre del
336
+ * modal: los streams solo se cancelan con stop explícito del usuario o al
337
+ * completar/errorar.
338
+ */
339
+ export var sessionStreamManager = {
340
+ isActive: isStreamActive,
341
+ getActiveCount: getActiveStreamCount,
342
+ getActiveSessionIds: function getActiveSessionIds() {
343
+ return Array.from(activeStreams.keys());
344
+ },
345
+ startStream: function startStream(params) {
346
+ return _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
347
+ var sessionId, placeholderId, request, callbacks, t, activityOptions, agentId, agentName, controller, active, response, _callbacks$onError2, _t4;
348
+ return _regeneratorRuntime.wrap(function (_context2) {
349
+ while (1) switch (_context2.prev = _context2.next) {
350
+ case 0:
351
+ ensureSessionNotificationsInitialized();
352
+ sessionId = params.sessionId, placeholderId = params.placeholderId, request = params.request, callbacks = params.callbacks, t = params.t, activityOptions = params.activityOptions, agentId = params.agentId, agentName = params.agentName;
353
+ if (!isStreamActive(sessionId)) {
354
+ _context2.next = 1;
355
+ break;
356
+ }
357
+ return _context2.abrupt("return", {
358
+ started: false,
359
+ reason: 'already_active'
360
+ });
361
+ case 1:
362
+ if (!(getActiveStreamCount() >= MAX_CONCURRENT_STREAMS)) {
363
+ _context2.next = 2;
364
+ break;
365
+ }
366
+ return _context2.abrupt("return", {
367
+ started: false,
368
+ reason: 'limit'
369
+ });
370
+ case 2:
371
+ controller = new AbortController();
372
+ active = {
373
+ sessionId: sessionId,
374
+ controller: controller,
375
+ isStopped: false
376
+ };
377
+ activeStreams.set(sessionId, active);
378
+ store().ensureSession(sessionId);
379
+ store().patchMeta(sessionId, _objectSpread(_objectSpread({
380
+ placeholderId: placeholderId,
381
+ error: null,
382
+ isLoading: true,
383
+ isWriting: false
384
+ }, agentId != null ? {
385
+ agentId: agentId
386
+ } : {}), agentName != null ? {
387
+ agentName: agentName
388
+ } : {}));
389
+ store().setStatus(sessionId, 'thinking');
390
+ sessionStreamingText.start(sessionId, placeholderId);
391
+ store().setActivity(sessionId, getInitialStreamActivity(t, activityOptions !== null && activityOptions !== void 0 ? activityOptions : {}));
392
+ _context2.prev = 3;
393
+ _context2.next = 4;
394
+ return maia.Orchestrator.orchestrator(request, controller.signal);
395
+ case 4:
396
+ response = _context2.sent;
397
+ _context2.next = 5;
398
+ return parseSessionSSE(response, active, params);
399
+ case 5:
400
+ _context2.next = 7;
401
+ break;
402
+ case 6:
403
+ _context2.prev = 6;
404
+ _t4 = _context2["catch"](3);
405
+ if (!active.isStopped) {
406
+ sessionStreamingText.clear(sessionId);
407
+ store().patchMeta(sessionId, {
408
+ isLoading: false,
409
+ isWriting: false
410
+ });
411
+ store().setActivity(sessionId, null);
412
+ store().setStatus(sessionId, 'error');
413
+ (_callbacks$onError2 = callbacks.onError) === null || _callbacks$onError2 === void 0 || _callbacks$onError2.call(callbacks);
414
+ }
415
+ case 7:
416
+ _context2.prev = 7;
417
+ activeStreams["delete"](sessionId);
418
+ return _context2.finish(7);
419
+ case 8:
420
+ return _context2.abrupt("return", {
421
+ started: true
422
+ });
423
+ case 9:
424
+ case "end":
425
+ return _context2.stop();
426
+ }
427
+ }, _callee2, null, [[3, 6, 7, 8]]);
428
+ }))();
429
+ },
430
+ /** Resume HITL (`continue-thread`) keyed por sessionId — mismo motor que orchestrator. */startContinueStream: function startContinueStream(params) {
431
+ return _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
432
+ var _ref2;
433
+ var sessionId, placeholderId, continueRequest, callbacks, t, hitlExecutionContext, agentId, agentName, controller, active, sseParams, response, _callbacks$onError3, _t5;
434
+ return _regeneratorRuntime.wrap(function (_context3) {
435
+ while (1) switch (_context3.prev = _context3.next) {
436
+ case 0:
437
+ ensureSessionNotificationsInitialized();
438
+ sessionId = params.sessionId, placeholderId = params.placeholderId, continueRequest = params.continueRequest, callbacks = params.callbacks, t = params.t, hitlExecutionContext = params.hitlExecutionContext, agentId = params.agentId, agentName = params.agentName;
439
+ if (!isStreamActive(sessionId)) {
440
+ _context3.next = 1;
441
+ break;
442
+ }
443
+ return _context3.abrupt("return", {
444
+ started: false,
445
+ reason: 'already_active'
446
+ });
447
+ case 1:
448
+ if (!(getActiveStreamCount() >= MAX_CONCURRENT_STREAMS)) {
449
+ _context3.next = 2;
450
+ break;
451
+ }
452
+ return _context3.abrupt("return", {
453
+ started: false,
454
+ reason: 'limit'
455
+ });
456
+ case 2:
457
+ if (hitlExecutionContext) {
458
+ sessionHitlContext.set(sessionId, hitlExecutionContext);
459
+ }
460
+ controller = new AbortController();
461
+ active = {
462
+ sessionId: sessionId,
463
+ controller: controller,
464
+ isStopped: false
465
+ };
466
+ activeStreams.set(sessionId, active);
467
+ store().ensureSession(sessionId);
468
+ store().patchMeta(sessionId, _objectSpread(_objectSpread({
469
+ placeholderId: placeholderId,
470
+ error: null,
471
+ isLoading: true,
472
+ isWriting: false
473
+ }, agentId != null ? {
474
+ agentId: agentId
475
+ } : {}), agentName != null ? {
476
+ agentName: agentName
477
+ } : {}));
478
+ store().setStatus(sessionId, 'thinking');
479
+ sessionStreamingText.start(sessionId, placeholderId);
480
+ store().setActivity(sessionId, resolveInitialHitlStreamActivity(t, (_ref2 = hitlExecutionContext !== null && hitlExecutionContext !== void 0 ? hitlExecutionContext : sessionHitlContext.get(sessionId)) !== null && _ref2 !== void 0 ? _ref2 : undefined));
481
+ sseParams = {
482
+ sessionId: sessionId,
483
+ placeholderId: placeholderId,
484
+ request: {},
485
+ callbacks: callbacks,
486
+ t: t,
487
+ hitlExecutionContext: hitlExecutionContext !== null && hitlExecutionContext !== void 0 ? hitlExecutionContext : sessionHitlContext.get(sessionId),
488
+ agentId: agentId,
489
+ agentName: agentName
490
+ };
491
+ _context3.prev = 3;
492
+ _context3.next = 4;
493
+ return maia.Orchestrator.continueThread(continueRequest, controller.signal);
494
+ case 4:
495
+ response = _context3.sent;
496
+ if (response.ok) {
497
+ _context3.next = 5;
498
+ break;
499
+ }
500
+ throw new Error("continue-thread failed: ".concat(response.status));
501
+ case 5:
502
+ _context3.next = 6;
503
+ return parseSessionSSE(response, active, sseParams);
504
+ case 6:
505
+ _context3.next = 8;
506
+ break;
507
+ case 7:
508
+ _context3.prev = 7;
509
+ _t5 = _context3["catch"](3);
510
+ if (!active.isStopped) {
511
+ sessionStreamingText.clear(sessionId);
512
+ store().patchMeta(sessionId, {
513
+ isLoading: false,
514
+ isWriting: false
515
+ });
516
+ store().setActivity(sessionId, null);
517
+ store().setStatus(sessionId, 'error');
518
+ (_callbacks$onError3 = callbacks.onError) === null || _callbacks$onError3 === void 0 || _callbacks$onError3.call(callbacks);
519
+ }
520
+ case 8:
521
+ _context3.prev = 8;
522
+ activeStreams["delete"](sessionId);
523
+ sessionHitlContext.clear(sessionId);
524
+ return _context3.finish(8);
525
+ case 9:
526
+ return _context3.abrupt("return", {
527
+ started: true
528
+ });
529
+ case 10:
530
+ case "end":
531
+ return _context3.stop();
532
+ }
533
+ }, _callee3, null, [[3, 7, 8, 9]]);
534
+ }))();
535
+ },
536
+ /** Cancelación explícita del usuario (mensaje "cancelado"). */stopStream: function stopStream(sessionId, callbacks) {
537
+ var _callbacks$onStop;
538
+ var active = activeStreams.get(sessionId);
539
+ if (!active) return;
540
+ active.isStopped = true;
541
+ active.controller.abort();
542
+ activeStreams["delete"](sessionId);
543
+ sessionStreamingText.clear(sessionId);
544
+ store().patchMeta(sessionId, {
545
+ isLoading: false,
546
+ isWriting: false
547
+ });
548
+ store().setActivity(sessionId, null);
549
+ store().setStatus(sessionId, 'cancelled');
550
+ callbacks === null || callbacks === void 0 || (_callbacks$onStop = callbacks.onStop) === null || _callbacks$onStop === void 0 || _callbacks$onStop.call(callbacks);
551
+ },
552
+ /** Aborta sin marcar "cancelado" (uso interno / limpieza). */abortSilently: function abortSilently(sessionId) {
553
+ var _store$getMeta;
554
+ var active = activeStreams.get(sessionId);
555
+ if (!active) return;
556
+ active.isStopped = true;
557
+ active.controller.abort();
558
+ activeStreams["delete"](sessionId);
559
+ sessionStreamingText.clear(sessionId);
560
+ store().patchMeta(sessionId, {
561
+ isLoading: false,
562
+ isWriting: false
563
+ });
564
+ store().setActivity(sessionId, null);
565
+ if (((_store$getMeta = store().getMeta(sessionId)) === null || _store$getMeta === void 0 ? void 0 : _store$getMeta.status) !== 'complete') {
566
+ store().setStatus(sessionId, 'idle');
567
+ }
568
+ },
569
+ abortAll: function abortAll() {
570
+ var _this = this;
571
+ Array.from(activeStreams.keys()).forEach(function (sessionId) {
572
+ return _this.abortSilently(sessionId);
573
+ });
574
+ }
575
+ };
576
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJtYWlhIiwiZ2V0SW5pdGlhbFN0cmVhbUFjdGl2aXR5IiwiZ2V0VGhpbmtpbmdMb2FkaW5nTWVzc2FnZSIsImdldFdyaXRpbmdTdHJlYW1BY3Rpdml0eSIsInJlc29sdmVIaXRsTm9kZVN0cmVhbUFjdGl2aXR5IiwicmVzb2x2ZUluaXRpYWxIaXRsU3RyZWFtQWN0aXZpdHkiLCJpc0NvbXBsZXRlTGlrZVNzZVBheWxvYWQiLCJtZXJnZVN0cmVhbUNodW5rIiwic2Vzc2lvblN0cmVhbWluZ1RleHQiLCJ1c2VTZXNzaW9uc1N0b3JlIiwiZW5zdXJlU2Vzc2lvbk5vdGlmaWNhdGlvbnNJbml0aWFsaXplZCIsInNlc3Npb25IaXRsQ29udGV4dCIsIk1BWF9DT05DVVJSRU5UX1NUUkVBTVMiLCJTVFJFQU1fVEhST1RUTEVfTVMiLCJhY3RpdmVTdHJlYW1zIiwiTWFwIiwic3RvcmUiLCJnZXRTdGF0ZSIsImlzU3RyZWFtQWN0aXZlIiwic2Vzc2lvbklkIiwiaGFzIiwiZ2V0QWN0aXZlU3RyZWFtQ291bnQiLCJzaXplIiwicGFyc2VTZXNzaW9uU1NFIiwiX3JlZiIsIl9hc3luY1RvR2VuZXJhdG9yIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlIiwicmVzcG9uc2UiLCJhY3RpdmUiLCJwYXJhbXMiLCJfcGFyYW1zJGhpdGxFeGVjdXRpb24iLCJfcmVzcG9uc2UkYm9keSIsIl9kYXRhJGVycm9yIiwiX2RhdGEkZXJyb3IyIiwiX2NhbGxiYWNrcyRvbkVycm9yIiwiX2RhdGEkZXJyb3IzIiwiX2RhdGEkZXJyb3I0IiwicGxhY2Vob2xkZXJJZCIsImNhbGxiYWNrcyIsInQiLCJoaXRsRXhlY3V0aW9uQ29udGV4dCIsInBlbmRpbmdDb250ZW50IiwidGhyb3R0bGVUaW1lciIsImZsdXNoVG9TdG9yZXMiLCJlbWl0VGhyb3R0bGVkIiwiZmx1c2hQZW5kaW5nIiwicmVhZGVyIiwiZGVjb2RlciIsImJ1ZmZlciIsImFjY3VtdWxhdGVkQ29udGVudCIsImhhc1N0YXJ0ZWRXcml0aW5nIiwiZW5zdXJlV3JpdGluZ1N0YXJ0ZWQiLCJhcHBseVN0cmVhbUNodW5rIiwiYXBwbHlTdHJlYW1Db21wbGV0ZSIsIl95aWVsZCRyZWFkZXIkcmVhZCIsImRvbmUiLCJ2YWx1ZSIsImxpbmVzIiwiX2l0ZXJhdG9yIiwiX3N0ZXAiLCJsaW5lIiwiX2xpbmUkc3BsaXQiLCJfbGluZSRzcGxpdDIiLCJldmVudExpbmUiLCJkYXRhTGluZSIsImV2ZW50VHlwZSIsImRhdGFTdHIiLCJkYXRhIiwiY2h1bmsiLCJfY2h1bmsiLCJfY2FsbGJhY2tzJG9uQXBwcm92YWwiLCJpc01hbnVhbEFwcHJvdmFsIiwiX3QiLCJfdDIiLCJfdDMiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsImdldCIsImNvbnRlbnQiLCJfY2FsbGJhY2tzJG9uU3RyZWFtVXAiLCJzZXRUZXh0Iiwib25TdHJlYW1VcGRhdGUiLCJjYWxsIiwid2luZG93Iiwic2V0VGltZW91dCIsInRvRW1pdCIsImNsZWFyVGltZW91dCIsImJvZHkiLCJnZXRSZWFkZXIiLCJFcnJvciIsIlRleHREZWNvZGVyIiwiX2NhbGxiYWNrcyRvblN0YXJ0V3JpIiwicGF0Y2hNZXRhIiwiaXNMb2FkaW5nIiwiaXNXcml0aW5nIiwic2V0U3RhdHVzIiwic2V0QWN0aXZpdHkiLCJvblN0YXJ0V3JpdGluZyIsInBheWxvYWQiLCJfcGF5bG9hZCRhZ2VudF9pZCIsIl9zdWJhZ2VudFJhdyRyZXNvbHZlZCIsIl9jYWxsYmFja3Mkb25GaW5pc2hTdCIsImZpbmFsQ29udGVudCIsInNvdXJjZXMiLCJtZW1vcnlTZXNzaW9uSWQiLCJtZW1vcnlfc2Vzc2lvbl9pZCIsImF0dGFjaG1lbnRzIiwiQXJyYXkiLCJpc0FycmF5Iiwic3VnZ2VzdGlvbnMiLCJzdWdnZXN0X3JlcGx5IiwiYWdlbnRJZFJhdyIsImFnZW50X2lkIiwiYWdlbnRJZCIsImNvbXBsZXRlZEFnZW50SWQiLCJTdHJpbmciLCJ0cmltIiwic3ViYWdlbnRSYXciLCJzdWJhZ2VudCIsInJlc29sdmVkQ29udGV4dCIsInJlc29sdmVkX2NvbnRleHQiLCJjbGVhciIsImZpbmlzaFBheWxvYWQiLCJvbkZpbmlzaFN0cmVhbSIsImlzU3RvcHBlZCIsImNhbmNlbCIsImFicnVwdCIsInJlYWQiLCJzZW50IiwiZGVjb2RlIiwic3RyZWFtIiwic3BsaXQiLCJwb3AiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsInMiLCJuIiwiX3NsaWNlZFRvQXJyYXkiLCJyZXBsYWNlIiwiSlNPTiIsInBhcnNlIiwicGhhc2UiLCJtZXNzYWdlIiwibm9kZSIsInVuZGVmaW5lZCIsInRocmVhZF9pZCIsIm1hbnVhbF9hcHByb3ZhbF9kZXRlY3RlZCIsIm9uQXBwcm92YWxSZXF1aXJlZCIsInBlbmRpbmdfYWN0aW9ucyIsImxlbmd0aCIsImNvbnNvbGUiLCJlcnJvciIsInNldEVycm9yIiwidHlwZSIsIm9uRXJyb3IiLCJ3YXJuIiwiZSIsImYiLCJmaW5pc2giLCJzdG9wIiwiX3giLCJfeDIiLCJfeDMiLCJhcHBseSIsImFyZ3VtZW50cyIsInNlc3Npb25TdHJlYW1NYW5hZ2VyIiwiaXNBY3RpdmUiLCJnZXRBY3RpdmVDb3VudCIsImdldEFjdGl2ZVNlc3Npb25JZHMiLCJmcm9tIiwia2V5cyIsInN0YXJ0U3RyZWFtIiwiX2NhbGxlZTIiLCJyZXF1ZXN0IiwiYWN0aXZpdHlPcHRpb25zIiwiYWdlbnROYW1lIiwiY29udHJvbGxlciIsIl9jYWxsYmFja3Mkb25FcnJvcjIiLCJfdDQiLCJfY29udGV4dDIiLCJzdGFydGVkIiwicmVhc29uIiwiQWJvcnRDb250cm9sbGVyIiwic2V0IiwiZW5zdXJlU2Vzc2lvbiIsIl9vYmplY3RTcHJlYWQiLCJzdGFydCIsIk9yY2hlc3RyYXRvciIsIm9yY2hlc3RyYXRvciIsInNpZ25hbCIsInN0YXJ0Q29udGludWVTdHJlYW0iLCJfY2FsbGVlMyIsIl9yZWYyIiwiY29udGludWVSZXF1ZXN0Iiwic3NlUGFyYW1zIiwiX2NhbGxiYWNrcyRvbkVycm9yMyIsIl90NSIsIl9jb250ZXh0MyIsImNvbnRpbnVlVGhyZWFkIiwib2siLCJjb25jYXQiLCJzdGF0dXMiLCJzdG9wU3RyZWFtIiwiX2NhbGxiYWNrcyRvblN0b3AiLCJhYm9ydCIsIm9uU3RvcCIsImFib3J0U2lsZW50bHkiLCJfc3RvcmUkZ2V0TWV0YSIsImdldE1ldGEiLCJhYm9ydEFsbCIsIl90aGlzIiwiZm9yRWFjaCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zdG9yZS9zZXNzaW9ucy9zZXNzaW9uU3RyZWFtTWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1jb250aW51ZSAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tYXdhaXQtaW4tbG9vcCAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcmVzdHJpY3RlZC1zeW50YXggKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnN0YW50LWNvbmRpdGlvbiAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IG1haWEgZnJvbSAnLi4vLi4vc2VydmljZXMvbWFpYSdcbmltcG9ydCB0eXBlIHsgQXBwcm92YWxSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vdHlwZXMvQ2hhdCdcbmltcG9ydCB7XG4gIGdldEluaXRpYWxTdHJlYW1BY3Rpdml0eSxcbiAgZ2V0VGhpbmtpbmdMb2FkaW5nTWVzc2FnZSxcbiAgZ2V0V3JpdGluZ1N0cmVhbUFjdGl2aXR5LFxuICByZXNvbHZlSGl0bE5vZGVTdHJlYW1BY3Rpdml0eSxcbiAgcmVzb2x2ZUluaXRpYWxIaXRsU3RyZWFtQWN0aXZpdHksXG59IGZyb20gJy4uLy4uL3V0aWxzL3N0cmVhbUFjdGl2aXR5TWVzc2FnZXMnXG5pbXBvcnQgdHlwZSB7IEhpdGxFeGVjdXRpb25Db250ZXh0IH0gZnJvbSAnLi4vLi4vdXRpbHMvc3RyZWFtQWN0aXZpdHlNZXNzYWdlcydcbmltcG9ydCB7IGlzQ29tcGxldGVMaWtlU3NlUGF5bG9hZCwgbWVyZ2VTdHJlYW1DaHVuayB9IGZyb20gJy4uLy4uL3V0aWxzL3NzZVN0cmVhbUNvbnRlbnQnXG5pbXBvcnQgeyBzZXNzaW9uU3RyZWFtaW5nVGV4dCB9IGZyb20gJy4vc2Vzc2lvblN0cmVhbWluZ1RleHQnXG5pbXBvcnQgeyB1c2VTZXNzaW9uc1N0b3JlIH0gZnJvbSAnLi91c2VTZXNzaW9uc1N0b3JlJ1xuaW1wb3J0IHsgZW5zdXJlU2Vzc2lvbk5vdGlmaWNhdGlvbnNJbml0aWFsaXplZCB9IGZyb20gJy4vc2Vzc2lvbk5vdGlmaWNhdGlvbnMnXG5pbXBvcnQgeyBzZXNzaW9uSGl0bENvbnRleHQgfSBmcm9tICcuL3Nlc3Npb25IaXRsQ29udGV4dCdcbmltcG9ydCB0eXBlIHsgU2Vzc2lvbkZpbmlzaFBheWxvYWQsIFNlc3Npb25TdHJlYW1DYWxsYmFja3MsIFN0YXJ0U3RyZWFtUmVzdWx0IH0gZnJvbSAnLi9zZXNzaW9ucy50eXBlcydcblxudHlwZSBPcmNoZXN0cmF0b3JSZXF1ZXN0ID0gUGFyYW1ldGVyczx0eXBlb2YgbWFpYS5PcmNoZXN0cmF0b3Iub3JjaGVzdHJhdG9yPlswXVxudHlwZSBDb250aW51ZVRocmVhZFJlcXVlc3QgPSBQYXJhbWV0ZXJzPHR5cGVvZiBtYWlhLk9yY2hlc3RyYXRvci5jb250aW51ZVRocmVhZD5bMF1cblxuLyoqIENvbXBhdGlibGUgY29uIGVsIGB0YCBkZSBpMThuZXh0ICh1c28gZGUgdW5hIHNvbGEga2V5KS4gKi9cbnR5cGUgVHJhbnNsYXRlRm4gPSAoa2V5OiBzdHJpbmcpID0+IHN0cmluZ1xuXG50eXBlIFN0YXJ0U3RyZWFtUGFyYW1zID0ge1xuICBzZXNzaW9uSWQ6IHN0cmluZ1xuICBwbGFjZWhvbGRlcklkOiBzdHJpbmdcbiAgcmVxdWVzdDogT3JjaGVzdHJhdG9yUmVxdWVzdFxuICBjYWxsYmFja3M6IFNlc3Npb25TdHJlYW1DYWxsYmFja3NcbiAgdDogVHJhbnNsYXRlRm5cbiAgYWN0aXZpdHlPcHRpb25zPzoge1xuICAgIGlzV2ViU2VhcmNoQWN0aXZlPzogYm9vbGVhblxuICAgIGlzRGVlcFNlYXJjaEFjdGl2ZT86IGJvb2xlYW5cbiAgICBoYXNBdHRhY2htZW50cz86IGJvb2xlYW5cbiAgICBhdHRhY2htZW50c0NvdW50PzogbnVtYmVyXG4gIH1cbiAgaGl0bEV4ZWN1dGlvbkNvbnRleHQ/OiBIaXRsRXhlY3V0aW9uQ29udGV4dCB8IG51bGxcbiAgYWdlbnRJZD86IHN0cmluZyB8IG51bWJlclxuICBhZ2VudE5hbWU/OiBzdHJpbmdcbn1cblxudHlwZSBTdGFydENvbnRpbnVlU3RyZWFtUGFyYW1zID0ge1xuICBzZXNzaW9uSWQ6IHN0cmluZ1xuICBwbGFjZWhvbGRlcklkOiBzdHJpbmdcbiAgY29udGludWVSZXF1ZXN0OiBDb250aW51ZVRocmVhZFJlcXVlc3RcbiAgY2FsbGJhY2tzOiBTZXNzaW9uU3RyZWFtQ2FsbGJhY2tzXG4gIHQ6IFRyYW5zbGF0ZUZuXG4gIGhpdGxFeGVjdXRpb25Db250ZXh0PzogSGl0bEV4ZWN1dGlvbkNvbnRleHQgfCBudWxsXG4gIGFnZW50SWQ/OiBzdHJpbmcgfCBudW1iZXJcbiAgYWdlbnROYW1lPzogc3RyaW5nXG59XG5cbnR5cGUgQWN0aXZlU3RyZWFtID0ge1xuICBzZXNzaW9uSWQ6IHN0cmluZ1xuICBjb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXJcbiAgaXNTdG9wcGVkOiBib29sZWFuXG59XG5cbi8qKlxuICogTcOheGltbyBkZSBzZXNpb25lcyBnZW5lcmFuZG8gZW4gcGFyYWxlbG8uIFByb3RlZ2UgcmVkL3JlY3Vyc29zIGRlbCBjbGllbnRlLlxuICogQWp1c3RhYmxlIGEgZnV0dXJvIHbDrWEgZmxhZyBkZWwgaG9zdC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9DT05DVVJSRU5UX1NUUkVBTVMgPSA0XG5cbmNvbnN0IFNUUkVBTV9USFJPVFRMRV9NUyA9IDE2XG5cbmNvbnN0IGFjdGl2ZVN0cmVhbXMgPSBuZXcgTWFwPHN0cmluZywgQWN0aXZlU3RyZWFtPigpXG5cbmNvbnN0IHN0b3JlID0gKCkgPT4gdXNlU2Vzc2lvbnNTdG9yZS5nZXRTdGF0ZSgpXG5cbmNvbnN0IGlzU3RyZWFtQWN0aXZlID0gKHNlc3Npb25JZDogc3RyaW5nKTogYm9vbGVhbiA9PiBhY3RpdmVTdHJlYW1zLmhhcyhzZXNzaW9uSWQpXG5cbmNvbnN0IGdldEFjdGl2ZVN0cmVhbUNvdW50ID0gKCk6IG51bWJlciA9PiBhY3RpdmVTdHJlYW1zLnNpemVcblxuY29uc3QgcGFyc2VTZXNzaW9uU1NFID0gYXN5bmMgKHJlc3BvbnNlOiBSZXNwb25zZSwgYWN0aXZlOiBBY3RpdmVTdHJlYW0sIHBhcmFtczogU3RhcnRTdHJlYW1QYXJhbXMpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgeyBzZXNzaW9uSWQsIHBsYWNlaG9sZGVySWQsIGNhbGxiYWNrcywgdCB9ID0gcGFyYW1zXG4gIGNvbnN0IGhpdGxFeGVjdXRpb25Db250ZXh0ID0gcGFyYW1zLmhpdGxFeGVjdXRpb25Db250ZXh0ID8/IHNlc3Npb25IaXRsQ29udGV4dC5nZXQoc2Vzc2lvbklkKVxuXG4gIGxldCBwZW5kaW5nQ29udGVudDogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgbGV0IHRocm90dGxlVGltZXI6IG51bWJlciB8IG51bGwgPSBudWxsXG5cbiAgY29uc3QgZmx1c2hUb1N0b3JlcyA9IChjb250ZW50OiBzdHJpbmcpID0+IHtcbiAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5zZXRUZXh0KHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZCwgY29udGVudClcbiAgICBjYWxsYmFja3Mub25TdHJlYW1VcGRhdGU/Lihjb250ZW50KVxuICB9XG5cbiAgY29uc3QgZW1pdFRocm90dGxlZCA9IChjb250ZW50OiBzdHJpbmcpID0+IHtcbiAgICBwZW5kaW5nQ29udGVudCA9IGNvbnRlbnRcbiAgICBpZiAodGhyb3R0bGVUaW1lciAhPSBudWxsKSByZXR1cm5cbiAgICB0aHJvdHRsZVRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhyb3R0bGVUaW1lciA9IG51bGxcbiAgICAgIGlmIChwZW5kaW5nQ29udGVudCAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHRvRW1pdCA9IHBlbmRpbmdDb250ZW50XG4gICAgICAgIHBlbmRpbmdDb250ZW50ID0gbnVsbFxuICAgICAgICBmbHVzaFRvU3RvcmVzKHRvRW1pdClcbiAgICAgIH1cbiAgICB9LCBTVFJFQU1fVEhST1RUTEVfTVMpXG4gIH1cblxuICBjb25zdCBmbHVzaFBlbmRpbmcgPSAoKSA9PiB7XG4gICAgaWYgKHRocm90dGxlVGltZXIgIT0gbnVsbCkge1xuICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aHJvdHRsZVRpbWVyKVxuICAgICAgdGhyb3R0bGVUaW1lciA9IG51bGxcbiAgICB9XG4gICAgaWYgKHBlbmRpbmdDb250ZW50ICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHRvRW1pdCA9IHBlbmRpbmdDb250ZW50XG4gICAgICBwZW5kaW5nQ29udGVudCA9IG51bGxcbiAgICAgIGZsdXNoVG9TdG9yZXModG9FbWl0KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlYWRlciA9IHJlc3BvbnNlLmJvZHk/LmdldFJlYWRlcigpXG4gIGlmICghcmVhZGVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyByZWFkZXIgYXZhaWxhYmxlJylcbiAgfVxuXG4gIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKVxuICBsZXQgYnVmZmVyID0gJydcbiAgbGV0IGFjY3VtdWxhdGVkQ29udGVudCA9ICcnXG4gIGxldCBoYXNTdGFydGVkV3JpdGluZyA9IGZhbHNlXG5cbiAgY29uc3QgZW5zdXJlV3JpdGluZ1N0YXJ0ZWQgPSAoKSA9PiB7XG4gICAgaWYgKGhhc1N0YXJ0ZWRXcml0aW5nKSByZXR1cm5cbiAgICBoYXNTdGFydGVkV3JpdGluZyA9IHRydWVcbiAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiB0cnVlLCBpc1dyaXRpbmc6IHRydWUgfSlcbiAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICd3cml0aW5nJylcbiAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgZ2V0V3JpdGluZ1N0cmVhbUFjdGl2aXR5KHQpKVxuICAgIGNhbGxiYWNrcy5vblN0YXJ0V3JpdGluZz8uKClcbiAgfVxuXG4gIGNvbnN0IGFwcGx5U3RyZWFtQ2h1bmsgPSAoY2h1bms6IHN0cmluZykgPT4ge1xuICAgIGlmICghY2h1bmspIHJldHVyblxuICAgIGFjY3VtdWxhdGVkQ29udGVudCA9IG1lcmdlU3RyZWFtQ2h1bmsoYWNjdW11bGF0ZWRDb250ZW50LCBjaHVuaylcbiAgICBlbWl0VGhyb3R0bGVkKGFjY3VtdWxhdGVkQ29udGVudClcbiAgfVxuXG4gIGNvbnN0IGFwcGx5U3RyZWFtQ29tcGxldGUgPSAocGF5bG9hZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICBjb25zdCBmaW5hbENvbnRlbnQgPSAocGF5bG9hZC5jb250ZW50IGFzIHN0cmluZykgfHwgYWNjdW11bGF0ZWRDb250ZW50XG4gICAgY29uc3Qgc291cmNlcyA9IHBheWxvYWQuc291cmNlcyB8fCBudWxsXG4gICAgY29uc3QgbWVtb3J5U2Vzc2lvbklkID0gKHBheWxvYWQubWVtb3J5X3Nlc3Npb25faWQgYXMgc3RyaW5nKSB8fCAnJ1xuICAgIGNvbnN0IGF0dGFjaG1lbnRzID0gQXJyYXkuaXNBcnJheShwYXlsb2FkLmF0dGFjaG1lbnRzKSA/IHBheWxvYWQuYXR0YWNobWVudHMgOiBudWxsXG4gICAgbGV0IHN1Z2dlc3Rpb25zOiBzdHJpbmdbXSB8IG51bGwgPSBudWxsXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGF5bG9hZC5zdWdnZXN0X3JlcGx5KSkge1xuICAgICAgc3VnZ2VzdGlvbnMgPSBwYXlsb2FkLnN1Z2dlc3RfcmVwbHkgYXMgc3RyaW5nW11cbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocGF5bG9hZC5zdWdnZXN0aW9ucykpIHtcbiAgICAgIHN1Z2dlc3Rpb25zID0gcGF5bG9hZC5zdWdnZXN0aW9ucyBhcyBzdHJpbmdbXVxuICAgIH1cbiAgICBjb25zdCBhZ2VudElkUmF3ID0gcGF5bG9hZC5hZ2VudF9pZCA/PyBwYXlsb2FkLmFnZW50SWRcbiAgICBjb25zdCBjb21wbGV0ZWRBZ2VudElkID0gYWdlbnRJZFJhdyAhPSBudWxsICYmIFN0cmluZyhhZ2VudElkUmF3KS50cmltKCkgIT09ICcnID8gU3RyaW5nKGFnZW50SWRSYXcpLnRyaW0oKSA6IG51bGxcbiAgICBjb25zdCBzdWJhZ2VudFJhdyA9IHBheWxvYWQuc3ViYWdlbnQgYXMgeyByZXNvbHZlZF9jb250ZXh0PzogdW5rbm93biB9IHwgbnVsbCB8IHVuZGVmaW5lZFxuICAgIGNvbnN0IHJlc29sdmVkQ29udGV4dCA9IHN1YmFnZW50UmF3Py5yZXNvbHZlZF9jb250ZXh0ID8/IG51bGxcblxuICAgIGZsdXNoUGVuZGluZygpXG4gICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IGZhbHNlLCBpc1dyaXRpbmc6IGZhbHNlIH0pXG4gICAgc3RvcmUoKS5zZXRBY3Rpdml0eShzZXNzaW9uSWQsIG51bGwpXG4gICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAnY29tcGxldGUnKVxuXG4gICAgY29uc3QgZmluaXNoUGF5bG9hZDogU2Vzc2lvbkZpbmlzaFBheWxvYWQgPSB7XG4gICAgICBjb250ZW50OiBmaW5hbENvbnRlbnQsXG4gICAgICBzb3VyY2VzLFxuICAgICAgbWVtb3J5U2Vzc2lvbklkLFxuICAgICAgYXR0YWNobWVudHMsXG4gICAgICBzdWdnZXN0aW9ucyxcbiAgICAgIGNvbXBsZXRlZEFnZW50SWQsXG4gICAgICByZXNvbHZlZENvbnRleHQsXG4gICAgfVxuICAgIGNhbGxiYWNrcy5vbkZpbmlzaFN0cmVhbT8uKGZpbmlzaFBheWxvYWQpXG4gIH1cblxuICB0cnkge1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAoYWN0aXZlLmlzU3RvcHBlZCkge1xuICAgICAgICByZWFkZXIuY2FuY2VsKClcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKVxuICAgICAgaWYgKGRvbmUpIGJyZWFrXG5cbiAgICAgIGlmIChhY3RpdmUuaXNTdG9wcGVkKSB7XG4gICAgICAgIHJlYWRlci5jYW5jZWwoKVxuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBidWZmZXIgKz0gZGVjb2Rlci5kZWNvZGUodmFsdWUsIHsgc3RyZWFtOiB0cnVlIH0pXG4gICAgICBjb25zdCBsaW5lcyA9IGJ1ZmZlci5zcGxpdCgnXFxuXFxuJylcbiAgICAgIGJ1ZmZlciA9IGxpbmVzLnBvcCgpIHx8ICcnXG5cbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICBpZiAobGluZS50cmltKCkgPT09ICcnKSBjb250aW51ZVxuXG4gICAgICAgIGNvbnN0IFtldmVudExpbmUsIGRhdGFMaW5lXSA9IGxpbmUuc3BsaXQoJ1xcbicpXG4gICAgICAgIGlmICghZXZlbnRMaW5lIHx8ICFkYXRhTGluZSkgY29udGludWVcblxuICAgICAgICBjb25zdCBldmVudFR5cGUgPSBldmVudExpbmUucmVwbGFjZSgnZXZlbnQ6ICcsICcnKS50cmltKClcbiAgICAgICAgY29uc3QgZGF0YVN0ciA9IGRhdGFMaW5lLnJlcGxhY2UoJ2RhdGE6ICcsICcnKS50cmltKClcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGRhdGFTdHIpXG5cbiAgICAgICAgICBzd2l0Y2ggKGV2ZW50VHlwZSkge1xuICAgICAgICAgICAgY2FzZSAndGhpbmtpbmcnOlxuICAgICAgICAgICAgICBpZiAoIWhhc1N0YXJ0ZWRXcml0aW5nKSB7XG4gICAgICAgICAgICAgICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7IGlzTG9hZGluZzogdHJ1ZSB9KVxuICAgICAgICAgICAgICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ3RoaW5raW5nJylcbiAgICAgICAgICAgICAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgeyBwaGFzZTogJ3RoaW5raW5nJywgbWVzc2FnZTogZ2V0VGhpbmtpbmdMb2FkaW5nTWVzc2FnZSgwLCB0KSB9KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICAgIGNhc2UgJ3Rva2VuJzoge1xuICAgICAgICAgICAgICBjb25zdCBjaHVuayA9IHR5cGVvZiBkYXRhLmNvbnRlbnQgPT09ICdzdHJpbmcnID8gZGF0YS5jb250ZW50IDogJydcbiAgICAgICAgICAgICAgZW5zdXJlV3JpdGluZ1N0YXJ0ZWQoKVxuICAgICAgICAgICAgICBhcHBseVN0cmVhbUNodW5rKGNodW5rKVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlICdjb250ZW50Jzoge1xuICAgICAgICAgICAgICBjb25zdCBjaHVuayA9IHR5cGVvZiBkYXRhLmNvbnRlbnQgPT09ICdzdHJpbmcnID8gZGF0YS5jb250ZW50IDogJydcbiAgICAgICAgICAgICAgZW5zdXJlV3JpdGluZ1N0YXJ0ZWQoKVxuICAgICAgICAgICAgICBhcHBseVN0cmVhbUNodW5rKGNodW5rKVxuICAgICAgICAgICAgICBpZiAoaXNDb21wbGV0ZUxpa2VTc2VQYXlsb2FkKGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgYXBwbHlTdHJlYW1Db21wbGV0ZShkYXRhKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgJ25vZGUnOlxuICAgICAgICAgICAgICBpZiAoZGF0YS5ub2RlID09PSAnYWdlbnRfdHJhbnNmZXInKSB7XG4gICAgICAgICAgICAgICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7IGlzTG9hZGluZzogdHJ1ZSB9KVxuICAgICAgICAgICAgICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ3RoaW5raW5nJylcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLm1lc3NhZ2UgJiYgdHlwZW9mIGRhdGEubWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiB0cnVlIH0pXG4gICAgICAgICAgICAgICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAndGhpbmtpbmcnKVxuICAgICAgICAgICAgICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoXG4gICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgICByZXNvbHZlSGl0bE5vZGVTdHJlYW1BY3Rpdml0eShcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB0LFxuICAgICAgICAgICAgICAgICAgICBoaXRsRXhlY3V0aW9uQ29udGV4dCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBkYXRhLnRocmVhZF9pZCA9PT0gJ3N0cmluZycgPyBkYXRhLnRocmVhZF9pZCA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgICBjYXNlICdjb21wbGV0ZSc6XG4gICAgICAgICAgICAgIGFwcGx5U3RyZWFtQ29tcGxldGUoZGF0YSlcbiAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgY2FzZSAnYXBwcm92YWxfcmVxdWlyZWQnOiB7XG4gICAgICAgICAgICAgIGZsdXNoUGVuZGluZygpXG4gICAgICAgICAgICAgIGNvbnN0IGlzTWFudWFsQXBwcm92YWwgPSBkYXRhLm1hbnVhbF9hcHByb3ZhbF9kZXRlY3RlZCA9PT0gdHJ1ZVxuICAgICAgICAgICAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNXcml0aW5nOiBmYWxzZSB9KVxuICAgICAgICAgICAgICBpZiAoIWlzTWFudWFsQXBwcm92YWwpIHtcbiAgICAgICAgICAgICAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSB9KVxuICAgICAgICAgICAgICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LmNsZWFyKHNlc3Npb25JZClcbiAgICAgICAgICAgICAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgbnVsbClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICdhd2FpdGluZ19hcHByb3ZhbCcpXG4gICAgICAgICAgICAgIGNhbGxiYWNrcy5vbkFwcHJvdmFsUmVxdWlyZWQ/LihkYXRhIGFzIEFwcHJvdmFsUmVxdWVzdCwgYWNjdW11bGF0ZWRDb250ZW50KVxuICAgICAgICAgICAgICBpZiAoaXNNYW51YWxBcHByb3ZhbCAmJiBBcnJheS5pc0FycmF5KGRhdGEucGVuZGluZ19hY3Rpb25zKSAmJiBkYXRhLnBlbmRpbmdfYWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7IGlzTG9hZGluZzogdHJ1ZSB9KVxuICAgICAgICAgICAgICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ3RoaW5raW5nJylcbiAgICAgICAgICAgICAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgcmVzb2x2ZUluaXRpYWxIaXRsU3RyZWFtQWN0aXZpdHkodCwgaGl0bEV4ZWN1dGlvbkNvbnRleHQgPz8gdW5kZWZpbmVkKSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1NTRSBFcnJvcjonLCBkYXRhLmVycm9yKVxuICAgICAgICAgICAgICBmbHVzaFBlbmRpbmcoKVxuICAgICAgICAgICAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5jbGVhcihzZXNzaW9uSWQpXG4gICAgICAgICAgICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IGZhbHNlLCBpc1dyaXRpbmc6IGZhbHNlIH0pXG4gICAgICAgICAgICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBudWxsKVxuICAgICAgICAgICAgICBzdG9yZSgpLnNldEVycm9yKHNlc3Npb25JZCwgeyB0eXBlOiBkYXRhLmVycm9yPy50eXBlLCBtZXNzYWdlOiBkYXRhLmVycm9yPy5tZXNzYWdlIH0pXG4gICAgICAgICAgICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ2Vycm9yJylcbiAgICAgICAgICAgICAgY2FsbGJhY2tzLm9uRXJyb3I/LihkYXRhLmVycm9yPy50eXBlLCBkYXRhLmVycm9yPy5tZXNzYWdlKVxuICAgICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1Vua25vd24gU1NFIGV2ZW50IHR5cGU6JywgZXZlbnRUeXBlKVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAocGFyc2VFcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhcnNpbmcgU1NFIGRhdGE6JywgcGFyc2VFcnJvciwgZGF0YVN0cilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBmbHVzaFBlbmRpbmcoKVxuICB9XG59XG5cbi8qKlxuICogTWFuYWdlciBzaW5nbGV0b24gKG1vZHVsZS1sZXZlbCkgcXVlIGNvcnJlIE4gc3RyZWFtcyBkZWwgb3JjaGVzdHJhdG9yIGVuXG4gKiBwYXJhbGVsbywgdW5vIHBvciBgc2Vzc2lvbklkYC4gU29icmV2aXZlIGEgY2FtYmlvcyBkZSB2aXN0YSB5IGFsIGNpZXJyZSBkZWxcbiAqIG1vZGFsOiBsb3Mgc3RyZWFtcyBzb2xvIHNlIGNhbmNlbGFuIGNvbiBzdG9wIGV4cGzDrWNpdG8gZGVsIHVzdWFyaW8gbyBhbFxuICogY29tcGxldGFyL2Vycm9yYXIuXG4gKi9cbmV4cG9ydCBjb25zdCBzZXNzaW9uU3RyZWFtTWFuYWdlciA9IHtcbiAgaXNBY3RpdmU6IGlzU3RyZWFtQWN0aXZlLFxuICBnZXRBY3RpdmVDb3VudDogZ2V0QWN0aXZlU3RyZWFtQ291bnQsXG4gIGdldEFjdGl2ZVNlc3Npb25JZHM6ICgpOiBzdHJpbmdbXSA9PiBBcnJheS5mcm9tKGFjdGl2ZVN0cmVhbXMua2V5cygpKSxcblxuICBhc3luYyBzdGFydFN0cmVhbShwYXJhbXM6IFN0YXJ0U3RyZWFtUGFyYW1zKTogUHJvbWlzZTxTdGFydFN0cmVhbVJlc3VsdD4ge1xuICAgIGVuc3VyZVNlc3Npb25Ob3RpZmljYXRpb25zSW5pdGlhbGl6ZWQoKVxuXG4gICAgY29uc3QgeyBzZXNzaW9uSWQsIHBsYWNlaG9sZGVySWQsIHJlcXVlc3QsIGNhbGxiYWNrcywgdCwgYWN0aXZpdHlPcHRpb25zLCBhZ2VudElkLCBhZ2VudE5hbWUgfSA9IHBhcmFtc1xuXG4gICAgaWYgKGlzU3RyZWFtQWN0aXZlKHNlc3Npb25JZCkpIHtcbiAgICAgIHJldHVybiB7IHN0YXJ0ZWQ6IGZhbHNlLCByZWFzb246ICdhbHJlYWR5X2FjdGl2ZScgfVxuICAgIH1cbiAgICBpZiAoZ2V0QWN0aXZlU3RyZWFtQ291bnQoKSA+PSBNQVhfQ09OQ1VSUkVOVF9TVFJFQU1TKSB7XG4gICAgICByZXR1cm4geyBzdGFydGVkOiBmYWxzZSwgcmVhc29uOiAnbGltaXQnIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gICAgY29uc3QgYWN0aXZlOiBBY3RpdmVTdHJlYW0gPSB7IHNlc3Npb25JZCwgY29udHJvbGxlciwgaXNTdG9wcGVkOiBmYWxzZSB9XG4gICAgYWN0aXZlU3RyZWFtcy5zZXQoc2Vzc2lvbklkLCBhY3RpdmUpXG5cbiAgICBzdG9yZSgpLmVuc3VyZVNlc3Npb24oc2Vzc2lvbklkKVxuICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwge1xuICAgICAgcGxhY2Vob2xkZXJJZCxcbiAgICAgIGVycm9yOiBudWxsLFxuICAgICAgaXNMb2FkaW5nOiB0cnVlLFxuICAgICAgaXNXcml0aW5nOiBmYWxzZSxcbiAgICAgIC4uLihhZ2VudElkICE9IG51bGwgPyB7IGFnZW50SWQgfSA6IHt9KSxcbiAgICAgIC4uLihhZ2VudE5hbWUgIT0gbnVsbCA/IHsgYWdlbnROYW1lIH0gOiB7fSksXG4gICAgfSlcbiAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICd0aGlua2luZycpXG4gICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuc3RhcnQoc2Vzc2lvbklkLCBwbGFjZWhvbGRlcklkKVxuICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBnZXRJbml0aWFsU3RyZWFtQWN0aXZpdHkodCwgYWN0aXZpdHlPcHRpb25zID8/IHt9KSlcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1haWEuT3JjaGVzdHJhdG9yLm9yY2hlc3RyYXRvcihyZXF1ZXN0LCBjb250cm9sbGVyLnNpZ25hbClcbiAgICAgIGF3YWl0IHBhcnNlU2Vzc2lvblNTRShyZXNwb25zZSwgYWN0aXZlLCBwYXJhbXMpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghYWN0aXZlLmlzU3RvcHBlZCkge1xuICAgICAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5jbGVhcihzZXNzaW9uSWQpXG4gICAgICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IGZhbHNlLCBpc1dyaXRpbmc6IGZhbHNlIH0pXG4gICAgICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBudWxsKVxuICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICdlcnJvcicpXG4gICAgICAgIGNhbGxiYWNrcy5vbkVycm9yPy4oKVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhY3RpdmVTdHJlYW1zLmRlbGV0ZShzZXNzaW9uSWQpXG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc3RhcnRlZDogdHJ1ZSB9XG4gIH0sXG5cbiAgLyoqIFJlc3VtZSBISVRMIChgY29udGludWUtdGhyZWFkYCkga2V5ZWQgcG9yIHNlc3Npb25JZCDigJQgbWlzbW8gbW90b3IgcXVlIG9yY2hlc3RyYXRvci4gKi9cbiAgYXN5bmMgc3RhcnRDb250aW51ZVN0cmVhbShwYXJhbXM6IFN0YXJ0Q29udGludWVTdHJlYW1QYXJhbXMpOiBQcm9taXNlPFN0YXJ0U3RyZWFtUmVzdWx0PiB7XG4gICAgZW5zdXJlU2Vzc2lvbk5vdGlmaWNhdGlvbnNJbml0aWFsaXplZCgpXG5cbiAgICBjb25zdCB7IHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZCwgY29udGludWVSZXF1ZXN0LCBjYWxsYmFja3MsIHQsIGhpdGxFeGVjdXRpb25Db250ZXh0LCBhZ2VudElkLCBhZ2VudE5hbWUgfSA9IHBhcmFtc1xuXG4gICAgaWYgKGlzU3RyZWFtQWN0aXZlKHNlc3Npb25JZCkpIHtcbiAgICAgIHJldHVybiB7IHN0YXJ0ZWQ6IGZhbHNlLCByZWFzb246ICdhbHJlYWR5X2FjdGl2ZScgfVxuICAgIH1cbiAgICBpZiAoZ2V0QWN0aXZlU3RyZWFtQ291bnQoKSA+PSBNQVhfQ09OQ1VSUkVOVF9TVFJFQU1TKSB7XG4gICAgICByZXR1cm4geyBzdGFydGVkOiBmYWxzZSwgcmVhc29uOiAnbGltaXQnIH1cbiAgICB9XG5cbiAgICBpZiAoaGl0bEV4ZWN1dGlvbkNvbnRleHQpIHtcbiAgICAgIHNlc3Npb25IaXRsQ29udGV4dC5zZXQoc2Vzc2lvbklkLCBoaXRsRXhlY3V0aW9uQ29udGV4dClcbiAgICB9XG5cbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gICAgY29uc3QgYWN0aXZlOiBBY3RpdmVTdHJlYW0gPSB7IHNlc3Npb25JZCwgY29udHJvbGxlciwgaXNTdG9wcGVkOiBmYWxzZSB9XG4gICAgYWN0aXZlU3RyZWFtcy5zZXQoc2Vzc2lvbklkLCBhY3RpdmUpXG5cbiAgICBzdG9yZSgpLmVuc3VyZVNlc3Npb24oc2Vzc2lvbklkKVxuICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwge1xuICAgICAgcGxhY2Vob2xkZXJJZCxcbiAgICAgIGVycm9yOiBudWxsLFxuICAgICAgaXNMb2FkaW5nOiB0cnVlLFxuICAgICAgaXNXcml0aW5nOiBmYWxzZSxcbiAgICAgIC4uLihhZ2VudElkICE9IG51bGwgPyB7IGFnZW50SWQgfSA6IHt9KSxcbiAgICAgIC4uLihhZ2VudE5hbWUgIT0gbnVsbCA/IHsgYWdlbnROYW1lIH0gOiB7fSksXG4gICAgfSlcbiAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICd0aGlua2luZycpXG4gICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuc3RhcnQoc2Vzc2lvbklkLCBwbGFjZWhvbGRlcklkKVxuICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoXG4gICAgICBzZXNzaW9uSWQsXG4gICAgICByZXNvbHZlSW5pdGlhbEhpdGxTdHJlYW1BY3Rpdml0eSh0LCBoaXRsRXhlY3V0aW9uQ29udGV4dCA/PyBzZXNzaW9uSGl0bENvbnRleHQuZ2V0KHNlc3Npb25JZCkgPz8gdW5kZWZpbmVkKVxuICAgIClcblxuICAgIGNvbnN0IHNzZVBhcmFtczogU3RhcnRTdHJlYW1QYXJhbXMgPSB7XG4gICAgICBzZXNzaW9uSWQsXG4gICAgICBwbGFjZWhvbGRlcklkLFxuICAgICAgcmVxdWVzdDoge30gYXMgT3JjaGVzdHJhdG9yUmVxdWVzdCxcbiAgICAgIGNhbGxiYWNrcyxcbiAgICAgIHQsXG4gICAgICBoaXRsRXhlY3V0aW9uQ29udGV4dDogaGl0bEV4ZWN1dGlvbkNvbnRleHQgPz8gc2Vzc2lvbkhpdGxDb250ZXh0LmdldChzZXNzaW9uSWQpLFxuICAgICAgYWdlbnRJZCxcbiAgICAgIGFnZW50TmFtZSxcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBtYWlhLk9yY2hlc3RyYXRvci5jb250aW51ZVRocmVhZChjb250aW51ZVJlcXVlc3QsIGNvbnRyb2xsZXIuc2lnbmFsKVxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNvbnRpbnVlLXRocmVhZCBmYWlsZWQ6ICR7cmVzcG9uc2Uuc3RhdHVzfWApXG4gICAgICB9XG4gICAgICBhd2FpdCBwYXJzZVNlc3Npb25TU0UocmVzcG9uc2UsIGFjdGl2ZSwgc3NlUGFyYW1zKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWFjdGl2ZS5pc1N0b3BwZWQpIHtcbiAgICAgICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgICAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSwgaXNXcml0aW5nOiBmYWxzZSB9KVxuICAgICAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgbnVsbClcbiAgICAgICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAnZXJyb3InKVxuICAgICAgICBjYWxsYmFja3Mub25FcnJvcj8uKClcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgYWN0aXZlU3RyZWFtcy5kZWxldGUoc2Vzc2lvbklkKVxuICAgICAgc2Vzc2lvbkhpdGxDb250ZXh0LmNsZWFyKHNlc3Npb25JZClcbiAgICB9XG5cbiAgICByZXR1cm4geyBzdGFydGVkOiB0cnVlIH1cbiAgfSxcblxuICAvKiogQ2FuY2VsYWNpw7NuIGV4cGzDrWNpdGEgZGVsIHVzdWFyaW8gKG1lbnNhamUgXCJjYW5jZWxhZG9cIikuICovXG4gIHN0b3BTdHJlYW0oc2Vzc2lvbklkOiBzdHJpbmcsIGNhbGxiYWNrcz86IFNlc3Npb25TdHJlYW1DYWxsYmFja3MpIHtcbiAgICBjb25zdCBhY3RpdmUgPSBhY3RpdmVTdHJlYW1zLmdldChzZXNzaW9uSWQpXG4gICAgaWYgKCFhY3RpdmUpIHJldHVyblxuICAgIGFjdGl2ZS5pc1N0b3BwZWQgPSB0cnVlXG4gICAgYWN0aXZlLmNvbnRyb2xsZXIuYWJvcnQoKVxuICAgIGFjdGl2ZVN0cmVhbXMuZGVsZXRlKHNlc3Npb25JZClcbiAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5jbGVhcihzZXNzaW9uSWQpXG4gICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7IGlzTG9hZGluZzogZmFsc2UsIGlzV3JpdGluZzogZmFsc2UgfSlcbiAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgbnVsbClcbiAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICdjYW5jZWxsZWQnKVxuICAgIGNhbGxiYWNrcz8ub25TdG9wPy4oKVxuICB9LFxuXG4gIC8qKiBBYm9ydGEgc2luIG1hcmNhciBcImNhbmNlbGFkb1wiICh1c28gaW50ZXJubyAvIGxpbXBpZXphKS4gKi9cbiAgYWJvcnRTaWxlbnRseShzZXNzaW9uSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGFjdGl2ZSA9IGFjdGl2ZVN0cmVhbXMuZ2V0KHNlc3Npb25JZClcbiAgICBpZiAoIWFjdGl2ZSkgcmV0dXJuXG4gICAgYWN0aXZlLmlzU3RvcHBlZCA9IHRydWVcbiAgICBhY3RpdmUuY29udHJvbGxlci5hYm9ydCgpXG4gICAgYWN0aXZlU3RyZWFtcy5kZWxldGUoc2Vzc2lvbklkKVxuICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LmNsZWFyKHNlc3Npb25JZClcbiAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSwgaXNXcml0aW5nOiBmYWxzZSB9KVxuICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBudWxsKVxuICAgIGlmIChzdG9yZSgpLmdldE1ldGEoc2Vzc2lvbklkKT8uc3RhdHVzICE9PSAnY29tcGxldGUnKSB7XG4gICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICdpZGxlJylcbiAgICB9XG4gIH0sXG5cbiAgYWJvcnRBbGwoKSB7XG4gICAgQXJyYXkuZnJvbShhY3RpdmVTdHJlYW1zLmtleXMoKSkuZm9yRWFjaChzZXNzaW9uSWQgPT4gdGhpcy5hYm9ydFNpbGVudGx5KHNlc3Npb25JZCkpXG4gIH0sXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU9BLElBQUksTUFBTSxxQkFBcUI7QUFFdEMsU0FDRUMsd0JBQXdCLEVBQ3hCQyx5QkFBeUIsRUFDekJDLHdCQUF3QixFQUN4QkMsNkJBQTZCLEVBQzdCQyxnQ0FBZ0MsUUFDM0Isb0NBQW9DO0FBRTNDLFNBQVNDLHdCQUF3QixFQUFFQyxnQkFBZ0IsUUFBUSw4QkFBOEI7QUFDekYsU0FBU0Msb0JBQW9CLFFBQVEsd0JBQXdCO0FBQzdELFNBQVNDLGdCQUFnQixRQUFRLG9CQUFvQjtBQUNyRCxTQUFTQyxxQ0FBcUMsUUFBUSx3QkFBd0I7QUFDOUUsU0FBU0Msa0JBQWtCLFFBQVEsc0JBQXNCOztBQU16RDs7QUFxQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLElBQU1DLHNCQUFzQixHQUFHLENBQUM7QUFFdkMsSUFBTUMsa0JBQWtCLEdBQUcsRUFBRTtBQUU3QixJQUFNQyxhQUFhLEdBQUcsSUFBSUMsR0FBRyxDQUF1QixDQUFDO0FBRXJELElBQU1DLEtBQUssR0FBRyxTQUFSQSxL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