@projectcor/maia-components 2.30.1-0 → 2.30.2-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/App.js +4 -2
- package/lib/components/atoms/ContextMentionChip/buildChipElement.js +1 -12
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +5 -127
- package/lib/components/atoms/ContextMentionItem/ContextMentionItem.js +29 -2
- package/lib/components/atoms/ContextMentionItem/ContextMentionItem.styles.js +33 -24
- package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.js +19 -2
- package/lib/components/atoms/MAIAInput/MAIAInput.js +88 -204
- package/lib/components/atoms/MAIAInput/styles.js +11 -15
- package/lib/components/atoms/ReasoningBlock/ReasoningBlock.js +116 -0
- package/lib/components/atoms/ReasoningBlock/ReasoningBlock.styles.js +197 -0
- package/lib/components/atoms/ReasoningBlock/ReasoningSteps.js +157 -0
- package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.js +123 -0
- package/lib/components/atoms/ReasoningBlock/groupParallelSteps.js +115 -0
- package/lib/components/atoms/ReasoningBlock/index.js +3 -0
- package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.js +54 -0
- package/lib/components/atoms/icons/SkillsNavIcon.js +7 -4
- package/lib/components/atoms/icons/index.js +1 -5
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +4 -91
- package/lib/components/molecules/ChatAIContent/ChatAIContent.js +3 -5
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +391 -120
- package/lib/components/molecules/ChatAIMessages/newStyles.js +50 -18
- package/lib/components/molecules/ChatAIModal/ChatAIModal.js +12 -49
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +5 -10
- package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.js +239 -312
- package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.styles.js +104 -128
- package/lib/components/molecules/ContextMentionInput/ContextMentionInput.js +3 -1
- package/lib/components/molecules/MessageFeedback/styles.js +6 -2
- package/lib/components/molecules/Sidebar/Sidebar.js +4 -5
- package/lib/components/molecules/Sidebar/Sidebar.layout.styles.js +2 -2
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +5 -34
- package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.js +1 -8
- package/lib/components/organisms/AbmSkillModal/AbmSkillModal.js +185 -338
- package/lib/components/organisms/AbmSkillModal/AbmSkillModal.styles.js +66 -122
- package/lib/constants/config.js +4 -1
- package/lib/constants/permissions/utils.js +3 -3
- package/lib/context/global-context.js +1 -1
- package/lib/dev/DevReasoningTimeline.js +235 -0
- package/lib/dev/reasoningTraceMock.js +556 -0
- package/lib/hooks/useAgentModel/useCreateAgent.js +14 -61
- package/lib/hooks/useAgentModel/useUpdateAgent.js +11 -58
- package/lib/hooks/useChatManager/useChatManager.js +97 -59
- package/lib/hooks/useChatMessages/useChatMessages.js +28 -27
- package/lib/hooks/useContextMentions.js +56 -93
- package/lib/hooks/useEntitySearch.js +278 -92
- package/lib/hooks/useEvent.js +1 -2
- package/lib/hooks/useMentionAllowedTypes.js +25 -9
- package/lib/hooks/useMentionPopover.js +33 -9
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.interface.js +1 -1
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +4 -3
- package/lib/hooks/useProjectSummaryConfig.js +36 -17
- package/lib/hooks/useReasoningTrace/index.js +3 -0
- package/lib/hooks/useReasoningTrace/reasoningStore.js +142 -0
- package/lib/hooks/useReasoningTrace/useReasoningTrace.js +14 -0
- package/lib/lang/br/index.js +245 -71
- package/lib/lang/en/index.js +245 -71
- package/lib/lang/es/index.js +246 -72
- package/lib/lang/fr/index.js +245 -71
- package/lib/services/maia/Orchestrator/orchestrator.js +9 -7
- package/lib/services/maia/Skills/createSkill.js +1 -1
- package/lib/services/maia/Skills/getSkills.js +40 -70
- package/lib/services/maia/Skills/updateSkill.js +1 -1
- package/lib/services/utils/mapChatMessages.js +21 -18
- package/lib/store/sessions/sessionStreamManager.js +98 -51
- package/lib/store/sessions/sessions.types.js +1 -1
- package/lib/types/Chat.js +1 -1
- package/lib/types/agentModal.js +1 -1
- package/lib/types/reasoning.js +2 -0
- package/lib/types/skill.js +1 -1
- package/lib/utils/autoApproveStorage.js +26 -0
- package/lib/utils/contextMentionTriggers.js +5 -2
- package/lib/utils/hitlAnalytics.js +4 -3
- package/lib/utils/normalizeAgentConnectors.js +3 -28
- package/lib/utils/reasoningMappers.js +62 -0
- package/lib/utils/renderContextMentions.js +18 -39
- package/lib/utils/streamActivityMessages.js +106 -41
- package/package.json +1 -1
- package/lib/components/atoms/SkillsDropdown/SkillsDropdown.js +0 -208
- package/lib/components/atoms/SkillsDropdown/SkillsDropdown.styles.js +0 -77
- package/lib/components/atoms/SkillsDropdown/index.js +0 -2
- package/lib/components/atoms/icons/PlusIcon.js +0 -29
- package/lib/components/atoms/icons/SkillCreatedByIcon.js +0 -20
- package/lib/components/atoms/icons/SkillVisibilityEveryoneIcon.js +0 -23
- package/lib/components/atoms/icons/SkillVisibilityOnlyMeIcon.js +0 -23
- package/lib/hooks/useSkillsCatalog.js +0 -66
- package/lib/services/maia/Agents/connectors.js +0 -250
|
@@ -1,250 +0,0 @@
|
|
|
1
|
-
import _typeof from "@babel/runtime/helpers/typeof";
|
|
2
|
-
import _toArray from "@babel/runtime/helpers/toArray";
|
|
3
|
-
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
|
|
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
|
-
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
6
|
-
import { fetchMaia } from '../client';
|
|
7
|
-
export var getAvailableConnectors = /*#__PURE__*/function () {
|
|
8
|
-
var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
|
|
9
|
-
var response;
|
|
10
|
-
return _regeneratorRuntime.wrap(function (_context) {
|
|
11
|
-
while (1) switch (_context.prev = _context.next) {
|
|
12
|
-
case 0:
|
|
13
|
-
_context.next = 1;
|
|
14
|
-
return fetchMaia({
|
|
15
|
-
path: 'connectors',
|
|
16
|
-
method: 'GET'
|
|
17
|
-
});
|
|
18
|
-
case 1:
|
|
19
|
-
response = _context.sent;
|
|
20
|
-
if (response.ok) {
|
|
21
|
-
_context.next = 2;
|
|
22
|
-
break;
|
|
23
|
-
}
|
|
24
|
-
throw new Error('Failed to fetch connectors');
|
|
25
|
-
case 2:
|
|
26
|
-
return _context.abrupt("return", response.json());
|
|
27
|
-
case 3:
|
|
28
|
-
case "end":
|
|
29
|
-
return _context.stop();
|
|
30
|
-
}
|
|
31
|
-
}, _callee);
|
|
32
|
-
}));
|
|
33
|
-
return function getAvailableConnectors() {
|
|
34
|
-
return _ref.apply(this, arguments);
|
|
35
|
-
};
|
|
36
|
-
}();
|
|
37
|
-
export var getAgentConnectors = /*#__PURE__*/function () {
|
|
38
|
-
var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(agentId) {
|
|
39
|
-
var response;
|
|
40
|
-
return _regeneratorRuntime.wrap(function (_context2) {
|
|
41
|
-
while (1) switch (_context2.prev = _context2.next) {
|
|
42
|
-
case 0:
|
|
43
|
-
_context2.next = 1;
|
|
44
|
-
return fetchMaia({
|
|
45
|
-
path: "agents/".concat(agentId, "/connectors"),
|
|
46
|
-
method: 'GET'
|
|
47
|
-
});
|
|
48
|
-
case 1:
|
|
49
|
-
response = _context2.sent;
|
|
50
|
-
if (response.ok) {
|
|
51
|
-
_context2.next = 2;
|
|
52
|
-
break;
|
|
53
|
-
}
|
|
54
|
-
throw new Error('Failed to fetch agent connectors');
|
|
55
|
-
case 2:
|
|
56
|
-
return _context2.abrupt("return", response.json());
|
|
57
|
-
case 3:
|
|
58
|
-
case "end":
|
|
59
|
-
return _context2.stop();
|
|
60
|
-
}
|
|
61
|
-
}, _callee2);
|
|
62
|
-
}));
|
|
63
|
-
return function getAgentConnectors(_x) {
|
|
64
|
-
return _ref2.apply(this, arguments);
|
|
65
|
-
};
|
|
66
|
-
}();
|
|
67
|
-
export var saveAgentConnectors = /*#__PURE__*/function () {
|
|
68
|
-
var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3(agentId, connectorSlugs) {
|
|
69
|
-
var response;
|
|
70
|
-
return _regeneratorRuntime.wrap(function (_context3) {
|
|
71
|
-
while (1) switch (_context3.prev = _context3.next) {
|
|
72
|
-
case 0:
|
|
73
|
-
_context3.next = 1;
|
|
74
|
-
return fetchMaia({
|
|
75
|
-
path: "agents/".concat(agentId, "/connectors"),
|
|
76
|
-
method: 'POST',
|
|
77
|
-
body: {
|
|
78
|
-
connector_slugs: connectorSlugs
|
|
79
|
-
}
|
|
80
|
-
});
|
|
81
|
-
case 1:
|
|
82
|
-
response = _context3.sent;
|
|
83
|
-
if (response.ok) {
|
|
84
|
-
_context3.next = 2;
|
|
85
|
-
break;
|
|
86
|
-
}
|
|
87
|
-
throw new Error('Failed to save agent connectors');
|
|
88
|
-
case 2:
|
|
89
|
-
return _context3.abrupt("return", response.json());
|
|
90
|
-
case 3:
|
|
91
|
-
case "end":
|
|
92
|
-
return _context3.stop();
|
|
93
|
-
}
|
|
94
|
-
}, _callee3);
|
|
95
|
-
}));
|
|
96
|
-
return function saveAgentConnectors(_x2, _x3) {
|
|
97
|
-
return _ref3.apply(this, arguments);
|
|
98
|
-
};
|
|
99
|
-
}();
|
|
100
|
-
export var openConnectorAuthorizationWindows = function openConnectorAuthorizationWindows(authorizations, popupWindow) {
|
|
101
|
-
if (!authorizations.length) {
|
|
102
|
-
if (popupWindow && !popupWindow.closed) {
|
|
103
|
-
popupWindow.close();
|
|
104
|
-
}
|
|
105
|
-
return null;
|
|
106
|
-
}
|
|
107
|
-
var _authorizations = _toArray(authorizations),
|
|
108
|
-
firstAuthorization = _authorizations[0],
|
|
109
|
-
remainingAuthorizations = _arrayLikeToArray(_authorizations).slice(1);
|
|
110
|
-
var opened = null;
|
|
111
|
-
if (popupWindow && !popupWindow.closed) {
|
|
112
|
-
popupWindow.location.href = firstAuthorization.auth_url;
|
|
113
|
-
opened = popupWindow;
|
|
114
|
-
} else {
|
|
115
|
-
opened = window.open(firstAuthorization.auth_url, '_blank', 'popup=yes,width=560,height=760');
|
|
116
|
-
}
|
|
117
|
-
remainingAuthorizations.forEach(function (authorization) {
|
|
118
|
-
window.open(authorization.auth_url, '_blank', 'popup=yes,width=560,height=760');
|
|
119
|
-
});
|
|
120
|
-
return opened;
|
|
121
|
-
};
|
|
122
|
-
var isConnectorOAuthMessage = function isConnectorOAuthMessage(data) {
|
|
123
|
-
return !!data && _typeof(data) === 'object' && 'type' in data && data.type === 'connector-oauth';
|
|
124
|
-
};
|
|
125
|
-
|
|
126
|
-
/** Waits until the OAuth popup finishes, then confirms the company token via GET. */
|
|
127
|
-
export var waitForConnectorAuthorization = /*#__PURE__*/function () {
|
|
128
|
-
var _ref5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee6(_ref4) {
|
|
129
|
-
var agentId, slugs, popup, _ref4$timeoutMs, timeoutMs, pending, oauthError, authorizedSlugs;
|
|
130
|
-
return _regeneratorRuntime.wrap(function (_context6) {
|
|
131
|
-
while (1) switch (_context6.prev = _context6.next) {
|
|
132
|
-
case 0:
|
|
133
|
-
agentId = _ref4.agentId, slugs = _ref4.slugs, popup = _ref4.popup, _ref4$timeoutMs = _ref4.timeoutMs, timeoutMs = _ref4$timeoutMs === void 0 ? 180000 : _ref4$timeoutMs;
|
|
134
|
-
if (slugs.length) {
|
|
135
|
-
_context6.next = 1;
|
|
136
|
-
break;
|
|
137
|
-
}
|
|
138
|
-
return _context6.abrupt("return", {
|
|
139
|
-
authorized: []
|
|
140
|
-
});
|
|
141
|
-
case 1:
|
|
142
|
-
pending = new Set(slugs);
|
|
143
|
-
authorizedSlugs = /*#__PURE__*/function () {
|
|
144
|
-
var _ref6 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4() {
|
|
145
|
-
var connectors;
|
|
146
|
-
return _regeneratorRuntime.wrap(function (_context4) {
|
|
147
|
-
while (1) switch (_context4.prev = _context4.next) {
|
|
148
|
-
case 0:
|
|
149
|
-
_context4.next = 1;
|
|
150
|
-
return getAgentConnectors(agentId);
|
|
151
|
-
case 1:
|
|
152
|
-
connectors = _context4.sent;
|
|
153
|
-
return _context4.abrupt("return", connectors.filter(function (connector) {
|
|
154
|
-
return pending.has(connector.slug) && connector.user_authorized;
|
|
155
|
-
}).map(function (connector) {
|
|
156
|
-
return connector.slug;
|
|
157
|
-
}));
|
|
158
|
-
case 2:
|
|
159
|
-
case "end":
|
|
160
|
-
return _context4.stop();
|
|
161
|
-
}
|
|
162
|
-
}, _callee4);
|
|
163
|
-
}));
|
|
164
|
-
return function authorizedSlugs() {
|
|
165
|
-
return _ref6.apply(this, arguments);
|
|
166
|
-
};
|
|
167
|
-
}();
|
|
168
|
-
return _context6.abrupt("return", new Promise(function (resolve) {
|
|
169
|
-
var finished = false;
|
|
170
|
-
var finish = /*#__PURE__*/function () {
|
|
171
|
-
var _ref7 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee5() {
|
|
172
|
-
var authorized, _t;
|
|
173
|
-
return _regeneratorRuntime.wrap(function (_context5) {
|
|
174
|
-
while (1) switch (_context5.prev = _context5.next) {
|
|
175
|
-
case 0:
|
|
176
|
-
if (!finished) {
|
|
177
|
-
_context5.next = 1;
|
|
178
|
-
break;
|
|
179
|
-
}
|
|
180
|
-
return _context5.abrupt("return");
|
|
181
|
-
case 1:
|
|
182
|
-
finished = true;
|
|
183
|
-
window.removeEventListener('message', onMessage);
|
|
184
|
-
window.clearInterval(poll);
|
|
185
|
-
window.clearTimeout(timer);
|
|
186
|
-
_context5.prev = 2;
|
|
187
|
-
_context5.next = 3;
|
|
188
|
-
return authorizedSlugs();
|
|
189
|
-
case 3:
|
|
190
|
-
authorized = _context5.sent;
|
|
191
|
-
resolve({
|
|
192
|
-
authorized: authorized,
|
|
193
|
-
error: authorized.length ? undefined : oauthError
|
|
194
|
-
});
|
|
195
|
-
_context5.next = 5;
|
|
196
|
-
break;
|
|
197
|
-
case 4:
|
|
198
|
-
_context5.prev = 4;
|
|
199
|
-
_t = _context5["catch"](2);
|
|
200
|
-
resolve({
|
|
201
|
-
authorized: [],
|
|
202
|
-
error: oauthError
|
|
203
|
-
});
|
|
204
|
-
case 5:
|
|
205
|
-
case "end":
|
|
206
|
-
return _context5.stop();
|
|
207
|
-
}
|
|
208
|
-
}, _callee5, null, [[2, 4]]);
|
|
209
|
-
}));
|
|
210
|
-
return function finish() {
|
|
211
|
-
return _ref7.apply(this, arguments);
|
|
212
|
-
};
|
|
213
|
-
}();
|
|
214
|
-
var onMessage = function onMessage(event) {
|
|
215
|
-
if (!isConnectorOAuthMessage(event.data)) {
|
|
216
|
-
return;
|
|
217
|
-
}
|
|
218
|
-
if (event.data.status === 'error') {
|
|
219
|
-
oauthError = event.data.message;
|
|
220
|
-
}
|
|
221
|
-
void finish();
|
|
222
|
-
};
|
|
223
|
-
window.addEventListener('message', onMessage);
|
|
224
|
-
var poll = window.setInterval(function () {
|
|
225
|
-
if (popup && popup.closed) {
|
|
226
|
-
void finish();
|
|
227
|
-
}
|
|
228
|
-
}, 400);
|
|
229
|
-
var timer = window.setTimeout(function () {
|
|
230
|
-
oauthError = oauthError || 'timeout';
|
|
231
|
-
void finish();
|
|
232
|
-
}, timeoutMs);
|
|
233
|
-
}));
|
|
234
|
-
case 2:
|
|
235
|
-
case "end":
|
|
236
|
-
return _context6.stop();
|
|
237
|
-
}
|
|
238
|
-
}, _callee6);
|
|
239
|
-
}));
|
|
240
|
-
return function waitForConnectorAuthorization(_x4) {
|
|
241
|
-
return _ref5.apply(this, arguments);
|
|
242
|
-
};
|
|
243
|
-
}();
|
|
244
|
-
export var connectorAuthErrorMessage = function connectorAuthErrorMessage(error) {
|
|
245
|
-
if (error.slug === 'netsuite') {
|
|
246
|
-
return error.message;
|
|
247
|
-
}
|
|
248
|
-
return "".concat(error.name, ": ").concat(error.message);
|
|
249
|
-
};
|
|
250
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmZXRjaE1haWEiLCJnZXRBdmFpbGFibGVDb25uZWN0b3JzIiwiX3JlZiIsIl9hc3luY1RvR2VuZXJhdG9yIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlIiwicmVzcG9uc2UiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsInBhdGgiLCJtZXRob2QiLCJzZW50Iiwib2siLCJFcnJvciIsImFicnVwdCIsImpzb24iLCJzdG9wIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJnZXRBZ2VudENvbm5lY3RvcnMiLCJfcmVmMiIsIl9jYWxsZWUyIiwiYWdlbnRJZCIsIl9jb250ZXh0MiIsImNvbmNhdCIsIl94Iiwic2F2ZUFnZW50Q29ubmVjdG9ycyIsIl9yZWYzIiwiX2NhbGxlZTMiLCJjb25uZWN0b3JTbHVncyIsIl9jb250ZXh0MyIsImJvZHkiLCJjb25uZWN0b3Jfc2x1Z3MiLCJfeDIiLCJfeDMiLCJvcGVuQ29ubmVjdG9yQXV0aG9yaXphdGlvbldpbmRvd3MiLCJhdXRob3JpemF0aW9ucyIsInBvcHVwV2luZG93IiwibGVuZ3RoIiwiY2xvc2VkIiwiY2xvc2UiLCJfYXV0aG9yaXphdGlvbnMiLCJfdG9BcnJheSIsImZpcnN0QXV0aG9yaXphdGlvbiIsInJlbWFpbmluZ0F1dGhvcml6YXRpb25zIiwiX2FycmF5TGlrZVRvQXJyYXkiLCJzbGljZSIsIm9wZW5lZCIsImxvY2F0aW9uIiwiaHJlZiIsImF1dGhfdXJsIiwid2luZG93Iiwib3BlbiIsImZvckVhY2giLCJhdXRob3JpemF0aW9uIiwiaXNDb25uZWN0b3JPQXV0aE1lc3NhZ2UiLCJkYXRhIiwiX3R5cGVvZiIsInR5cGUiLCJ3YWl0Rm9yQ29ubmVjdG9yQXV0aG9yaXphdGlvbiIsIl9yZWY1IiwiX2NhbGxlZTYiLCJfcmVmNCIsInNsdWdzIiwicG9wdXAiLCJfcmVmNCR0aW1lb3V0TXMiLCJ0aW1lb3V0TXMiLCJwZW5kaW5nIiwib2F1dGhFcnJvciIsImF1dGhvcml6ZWRTbHVncyIsIl9jb250ZXh0NiIsImF1dGhvcml6ZWQiLCJTZXQiLCJfcmVmNiIsIl9jYWxsZWU0IiwiY29ubmVjdG9ycyIsIl9jb250ZXh0NCIsImZpbHRlciIsImNvbm5lY3RvciIsImhhcyIsInNsdWciLCJ1c2VyX2F1dGhvcml6ZWQiLCJtYXAiLCJQcm9taXNlIiwicmVzb2x2ZSIsImZpbmlzaGVkIiwiZmluaXNoIiwiX3JlZjciLCJfY2FsbGVlNSIsIl90IiwiX2NvbnRleHQ1IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIm9uTWVzc2FnZSIsImNsZWFySW50ZXJ2YWwiLCJwb2xsIiwiY2xlYXJUaW1lb3V0IiwidGltZXIiLCJlcnJvciIsInVuZGVmaW5lZCIsImV2ZW50Iiwic3RhdHVzIiwibWVzc2FnZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJzZXRJbnRlcnZhbCIsInNldFRpbWVvdXQiLCJfeDQiLCJjb25uZWN0b3JBdXRoRXJyb3JNZXNzYWdlIiwibmFtZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9tYWlhL0FnZW50cy9jb25uZWN0b3JzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZldGNoTWFpYSB9IGZyb20gJy4uL2NsaWVudCdcblxuZXhwb3J0IHR5cGUgQ2F0YWxvZ0Nvbm5lY3RvciA9IHtcbiAgaWQ6IG51bWJlclxuICBzbHVnOiBzdHJpbmdcbiAgbmFtZTogc3RyaW5nXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gIGljb25fdXJsPzogc3RyaW5nXG4gIHJlcXVpcmVzX2F1dGg6IGJvb2xlYW5cbiAgaXNfYWN0aXZlOiBib29sZWFuXG59XG5cbmV4cG9ydCB0eXBlIEFnZW50Q29ubmVjdG9yID0gQ2F0YWxvZ0Nvbm5lY3RvciAmIHtcbiAgZW5hYmxlZF9mb3JfYWdlbnQ6IGJvb2xlYW5cbiAgdXNlcl9hdXRob3JpemVkOiBib29sZWFuXG59XG5cbmV4cG9ydCB0eXBlIFBlbmRpbmdDb25uZWN0b3JBdXRob3JpemF0aW9uID0ge1xuICBzbHVnOiBzdHJpbmdcbiAgbmFtZTogc3RyaW5nXG4gIGF1dGhfdXJsOiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgQ29ubmVjdG9yQXV0aEVycm9yID0ge1xuICBzbHVnOiBzdHJpbmdcbiAgbmFtZTogc3RyaW5nXG4gIG1lc3NhZ2U6IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBTYXZlQWdlbnRDb25uZWN0b3JzUmVzcG9uc2UgPSB7XG4gIGFnZW50X2lkOiBzdHJpbmdcbiAgY29ubmVjdG9yX3NsdWdzOiBzdHJpbmdbXVxuICByZXF1aXJlc19hdXRoPzogUGVuZGluZ0Nvbm5lY3RvckF1dGhvcml6YXRpb25bXVxuICBhdXRoX2Vycm9ycz86IENvbm5lY3RvckF1dGhFcnJvcltdXG59XG5cbmV4cG9ydCBjb25zdCBnZXRBdmFpbGFibGVDb25uZWN0b3JzID0gYXN5bmMgKCk6IFByb21pc2U8Q2F0YWxvZ0Nvbm5lY3RvcltdPiA9PiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hNYWlhKHtcbiAgICBwYXRoOiAnY29ubmVjdG9ycycsXG4gICAgbWV0aG9kOiAnR0VUJyxcbiAgfSlcblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggY29ubmVjdG9ycycpXG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2UuanNvbigpXG59XG5cbmV4cG9ydCBjb25zdCBnZXRBZ2VudENvbm5lY3RvcnMgPSBhc3luYyAoYWdlbnRJZDogc3RyaW5nKTogUHJvbWlzZTxBZ2VudENvbm5lY3RvcltdPiA9PiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hNYWlhKHtcbiAgICBwYXRoOiBgYWdlbnRzLyR7YWdlbnRJZH0vY29ubmVjdG9yc2AsXG4gICAgbWV0aG9kOiAnR0VUJyxcbiAgfSlcblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggYWdlbnQgY29ubmVjdG9ycycpXG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2UuanNvbigpXG59XG5cbmV4cG9ydCBjb25zdCBzYXZlQWdlbnRDb25uZWN0b3JzID0gYXN5bmMgKFxuICBhZ2VudElkOiBzdHJpbmcsXG4gIGNvbm5lY3RvclNsdWdzOiBzdHJpbmdbXVxuKTogUHJvbWlzZTxTYXZlQWdlbnRDb25uZWN0b3JzUmVzcG9uc2U+ID0+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaE1haWEoe1xuICAgIHBhdGg6IGBhZ2VudHMvJHthZ2VudElkfS9jb25uZWN0b3JzYCxcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBib2R5OiB7XG4gICAgICBjb25uZWN0b3Jfc2x1Z3M6IGNvbm5lY3RvclNsdWdzLFxuICAgIH0sXG4gIH0pXG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHNhdmUgYWdlbnQgY29ubmVjdG9ycycpXG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2UuanNvbigpXG59XG5cbmV4cG9ydCBjb25zdCBvcGVuQ29ubmVjdG9yQXV0aG9yaXphdGlvbldpbmRvd3MgPSAoXG4gIGF1dGhvcml6YXRpb25zOiBQZW5kaW5nQ29ubmVjdG9yQXV0aG9yaXphdGlvbltdLFxuICBwb3B1cFdpbmRvdz86IFdpbmRvdyB8IG51bGxcbik6IFdpbmRvdyB8IG51bGwgPT4ge1xuICBpZiAoIWF1dGhvcml6YXRpb25zLmxlbmd0aCkge1xuICAgIGlmIChwb3B1cFdpbmRvdyAmJiAhcG9wdXBXaW5kb3cuY2xvc2VkKSB7XG4gICAgICBwb3B1cFdpbmRvdy5jbG9zZSgpXG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCBbZmlyc3RBdXRob3JpemF0aW9uLCAuLi5yZW1haW5pbmdBdXRob3JpemF0aW9uc10gPSBhdXRob3JpemF0aW9uc1xuXG4gIGxldCBvcGVuZWQ6IFdpbmRvdyB8IG51bGwgPSBudWxsXG4gIGlmIChwb3B1cFdpbmRvdyAmJiAhcG9wdXBXaW5kb3cuY2xvc2VkKSB7XG4gICAgcG9wdXBXaW5kb3cubG9jYXRpb24uaHJlZiA9IGZpcnN0QXV0aG9yaXphdGlvbi5hdXRoX3VybFxuICAgIG9wZW5lZCA9IHBvcHVwV2luZG93XG4gIH0gZWxzZSB7XG4gICAgb3BlbmVkID0gd2luZG93Lm9wZW4oZmlyc3RBdXRob3JpemF0aW9uLmF1dGhfdXJsLCAnX2JsYW5rJywgJ3BvcHVwPXllcyx3aWR0aD01NjAsaGVpZ2h0PTc2MCcpXG4gIH1cblxuICByZW1haW5pbmdBdXRob3JpemF0aW9ucy5mb3JFYWNoKGF1dGhvcml6YXRpb24gPT4ge1xuICAgIHdpbmRvdy5vcGVuKGF1dGhvcml6YXRpb24uYXV0aF91cmwsICdfYmxhbmsnLCAncG9wdXA9eWVzLHdpZHRoPTU2MCxoZWlnaHQ9NzYwJylcbiAgfSlcblxuICByZXR1cm4gb3BlbmVkXG59XG5cbmNvbnN0IGlzQ29ubmVjdG9yT0F1dGhNZXNzYWdlID0gKGRhdGE6IHVua25vd24pOiBkYXRhIGlzIHsgdHlwZTogc3RyaW5nOyBzdGF0dXM6IHN0cmluZzsgc2x1Zz86IHN0cmluZzsgbWVzc2FnZT86IHN0cmluZyB9ID0+XG4gICEhZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgJ3R5cGUnIGluIGRhdGEgJiYgKGRhdGEgYXMgeyB0eXBlOiBzdHJpbmcgfSkudHlwZSA9PT0gJ2Nvbm5lY3Rvci1vYXV0aCdcblxuLyoqIFdhaXRzIHVudGlsIHRoZSBPQXV0aCBwb3B1cCBmaW5pc2hlcywgdGhlbiBjb25maXJtcyB0aGUgY29tcGFueSB0b2tlbiB2aWEgR0VULiAqL1xuZXhwb3J0IGNvbnN0IHdhaXRGb3JDb25uZWN0b3JBdXRob3JpemF0aW9uID0gYXN5bmMgKHtcbiAgYWdlbnRJZCxcbiAgc2x1Z3MsXG4gIHBvcHVwLFxuICB0aW1lb3V0TXMgPSAxODBfMDAwLFxufToge1xuICBhZ2VudElkOiBzdHJpbmdcbiAgc2x1Z3M6IHN0cmluZ1tdXG4gIHBvcHVwPzogV2luZG93IHwgbnVsbFxuICB0aW1lb3V0TXM/OiBudW1iZXJcbn0pOiBQcm9taXNlPHsgYXV0aG9yaXplZDogc3RyaW5nW107IGVycm9yPzogc3RyaW5nIH0+ID0+IHtcbiAgaWYgKCFzbHVncy5sZW5ndGgpIHtcbiAgICByZXR1cm4geyBhdXRob3JpemVkOiBbXSB9XG4gIH1cblxuICBjb25zdCBwZW5kaW5nID0gbmV3IFNldChzbHVncylcbiAgbGV0IG9hdXRoRXJyb3I6IHN0cmluZyB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGF1dGhvcml6ZWRTbHVncyA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjb25uZWN0b3JzID0gYXdhaXQgZ2V0QWdlbnRDb25uZWN0b3JzKGFnZW50SWQpXG4gICAgcmV0dXJuIGNvbm5lY3RvcnMuZmlsdGVyKGNvbm5lY3RvciA9PiBwZW5kaW5nLmhhcyhjb25uZWN0b3Iuc2x1ZykgJiYgY29ubmVjdG9yLnVzZXJfYXV0aG9yaXplZCkubWFwKGNvbm5lY3RvciA9PiBjb25uZWN0b3Iuc2x1ZylcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICBsZXQgZmluaXNoZWQgPSBmYWxzZVxuXG4gICAgY29uc3QgZmluaXNoID0gYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKGZpbmlzaGVkKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgZmluaXNoZWQgPSB0cnVlXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIG9uTWVzc2FnZSlcbiAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHBvbGwpXG4gICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVyKVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYXV0aG9yaXplZCA9IGF3YWl0IGF1dGhvcml6ZWRTbHVncygpXG4gICAgICAgIHJlc29sdmUoeyBhdXRob3JpemVkLCBlcnJvcjogYXV0aG9yaXplZC5sZW5ndGggPyB1bmRlZmluZWQgOiBvYXV0aEVycm9yIH0pXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmVzb2x2ZSh7IGF1dGhvcml6ZWQ6IFtdLCBlcnJvcjogb2F1dGhFcnJvciB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG9uTWVzc2FnZSA9IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICBpZiAoIWlzQ29ubmVjdG9yT0F1dGhNZXNzYWdlKGV2ZW50LmRhdGEpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKGV2ZW50LmRhdGEuc3RhdHVzID09PSAnZXJyb3InKSB7XG4gICAgICAgIG9hdXRoRXJyb3IgPSBldmVudC5kYXRhLm1lc3NhZ2VcbiAgICAgIH1cbiAgICAgIHZvaWQgZmluaXNoKClcbiAgICB9XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIG9uTWVzc2FnZSlcblxuICAgIGNvbnN0IHBvbGwgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgaWYgKHBvcHVwICYmIHBvcHVwLmNsb3NlZCkge1xuICAgICAgICB2b2lkIGZpbmlzaCgpXG4gICAgICB9XG4gICAgfSwgNDAwKVxuXG4gICAgY29uc3QgdGltZXIgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBvYXV0aEVycm9yID0gb2F1dGhFcnJvciB8fCAndGltZW91dCdcbiAgICAgIHZvaWQgZmluaXNoKClcbiAgICB9LCB0aW1lb3V0TXMpXG4gIH0pXG59XG5cbmV4cG9ydCBjb25zdCBjb25uZWN0b3JBdXRoRXJyb3JNZXNzYWdlID0gKGVycm9yOiBDb25uZWN0b3JBdXRoRXJyb3IpOiBzdHJpbmcgPT4ge1xuICBpZiAoZXJyb3Iuc2x1ZyA9PT0gJ25ldHN1aXRlJykge1xuICAgIHJldHVybiBlcnJvci5tZXNzYWdlXG4gIH1cbiAgcmV0dXJuIGAke2Vycm9yLm5hbWV9OiAke2Vycm9yLm1lc3NhZ2V9YFxufVxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBLFNBQVNBLFNBQVMsUUFBUSxXQUFXO0FB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T0FBQUMsS0FBQSxDQUFBdEUsS0FBQSxPQUFBQyxTQUFBO2NBQUE7WUFBQSxHQWNYO1lBRUQsSUFBTTBFLFNBQVMsR0FBRyxTQUFaQSxTQUFTQSxDQUFJTyxLQUFtQixFQUFLO2NBQ3pDLElBQUksQ0FBQzVDLHVCQUF1QixDQUFDNEMsS0FBSyxDQUFDM0MsSUFBSSxDQUFDLEVBQUU7Z0JBQ3hDO2NBQ0Y7Y0FDQSxJQUFJMkMsS0FBSyxDQUFDM0MsSUFBSSxDQUFDNEMsTUFBTSxLQUFLLE9BQU8sRUFBRTtnQkFDakNoQyxVQUFVLEdBQUcrQixLQUFLLENBQUMzQyxJQUFJLENBQUM2QyxPQUFPO2NBQ2pDO2NBQ0EsS0FBS2YsTUFBTSxDQUFDLENBQUM7WUFDZixDQUFDO1lBRURuQyxNQUFNLENBQUNtRCxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUVWLFNBQVMsQ0FBQztZQUU3QyxJQUFNRSxJQUFJLEdBQUczQyxNQUFNLENBQUNvRCxXQUFXLENBQUMsWUFBTTtjQUNwQyxJQUFJdkMsS0FBSyxJQUFJQSxLQUFLLENBQUN6QixNQUFNLEVBQUU7Z0JBQ3pCLEtBQUsrQyxNQUFNLENBQUMsQ0FBQztjQUNmO1lBQ0YsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUVQLElBQU1VLEtBQUssR0FBRzdDLE1BQU0sQ0FBQ3FELFVBQVUsQ0FBQyxZQUFNO2NBQ3BDcEMsVUFBVSxHQUFHQSxVQUFVLElBQUksU0FBUztjQUNwQyxLQUFLa0IsTUFBTSxDQUFDLENBQUM7WUFDZixDQUFDLEVBQUVwQixTQUFTLENBQUM7VUFDZixDQUFDLENBQUM7UUFBQTtRQUFBO1VBQUEsT0FBQUksU0FBQSxDQUFBdEQsSUFBQTtNQUFBO0lBQUEsR0FBQTZDLFFBQUE7RUFBQSxDQUNIO0VBQUEsZ0JBakVZRiw2QkFBNkJBLENBQUE4QyxHQUFBO0lBQUEsT0FBQTdDLEtBQUEsQ0FBQTNDLEtBQUEsT0FBQUMsU0FBQTtFQUFBO0FBQUEsR0FpRXpDO0FBRUQsT0FBTyxJQUFNd0YseUJBQXlCLEdBQUcsU0FBNUJBLHlCQUF5QkEsQ0FBSVQsS0FBeUIsRUFBYTtFQUM5RSxJQUFJQSxLQUFLLENBQUNqQixJQUFJLEtBQUssVUFBVSxFQUFFO0lBQzdCLE9BQU9pQixLQUFLLENBQUNJLE9BQU87RUFDdEI7RUFDQSxVQUFBN0UsTUFBQSxDQUFVeUUsS0FBSyxDQUFDVSxJQUFJLFFBQUFuRixNQUFBLENBQUt5RSxLQUFLLENBQUNJLE9BQU87QUFDeEMsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==
|