@projectcor/maia-components 2.11.66-7 → 2.11.66
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/components/atoms/Chip/Chip.js +15 -50
- package/lib/components/atoms/Chip/styles.js +5 -9
- package/lib/components/atoms/ContextMentionChip/ContextMentionChip.styles.js +4 -4
- package/lib/components/atoms/ContextMentionItem/ContextMentionItem.js +8 -8
- package/lib/components/atoms/ContextMentionItem/ContextMentionItem.styles.js +5 -5
- package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.js +6 -38
- package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.styles.js +13 -21
- package/lib/components/atoms/MAIAInput/MAIAInput.js +29 -24
- package/lib/components/atoms/icons/MAIAIsologo.js +5 -2
- package/lib/components/atoms/icons/TaskLinkIcon.js +27 -0
- package/lib/components/molecules/ChatAIContent/ChatAIContent.js +6 -2
- package/lib/components/molecules/ChatAIHome/ChatAIHome.js +48 -298
- package/lib/components/molecules/ChatAIHome/styles.js +26 -63
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +150 -57
- package/lib/components/molecules/ChatAIMessages/newStyles.js +12 -21
- package/lib/components/molecules/ChatAIModal/ChatAIModal.js +47 -220
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +4 -27
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +45 -18
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.js +123 -28
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.styles.js +66 -41
- package/lib/components/molecules/ChatFooter/ChatFooter.js +24 -78
- package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +7 -22
- package/lib/components/molecules/ChatFooter/styles.js +2 -11
- package/lib/components/molecules/Sidebar/Sidebar.js +51 -18
- package/lib/components/molecules/Sidebar/Sidebar.layout.styles.js +40 -26
- package/lib/components/molecules/Sidebar/Sidebar.styles.js +10 -7
- package/lib/components/organisms/EditQuestionModal/EditQuestionModal.js +2 -2
- package/lib/constants/taskLinkIcon.js +15 -6
- package/lib/constants/taskUrls.js +1 -3
- package/lib/context/global-context.js +1 -8
- package/lib/hooks/index.js +1 -2
- package/lib/hooks/useChatManager/useChatManager.js +125 -149
- package/lib/hooks/useChatMessages/useChatMessages.js +2 -33
- package/lib/hooks/useEntitySearch.js +129 -74
- package/lib/hooks/useEvent.js +4 -3
- package/lib/hooks/useFrequentlyAskedQuestions.js +10 -12
- package/lib/hooks/useFrequentlyUsedActions.js +3 -5
- package/lib/hooks/useMentionAllowedTypes.js +1 -11
- package/lib/hooks/useMentionPopover.js +2 -3
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.interface.js +1 -1
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +18 -27
- package/lib/hooks/useProjectSearch.js +28 -4
- package/lib/hooks/useProjectSummaryConfig.js +4 -74
- package/lib/hooks/useRecentClientsSearch.js +34 -4
- package/lib/hooks/useSmoothStreamText/useSmoothStreamText.js +16 -24
- package/lib/lang/br/index.js +7 -29
- package/lib/lang/en/index.js +7 -29
- package/lib/lang/es/index.js +7 -29
- package/lib/lang/fr/index.js +7 -29
- package/lib/services/maia/Actions/getFrequentlyUsedActions.js +3 -6
- package/lib/services/maia/Agents/getAgents.js +216 -193
- package/lib/services/maia/Chats/getChatMessages.js +3 -13
- package/lib/services/maia/Chats/getChatsByUserId.js +2 -10
- package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.js +4 -6
- package/lib/services/maia/Orchestrator/orchestrator.js +5 -21
- package/lib/services/maia/index.js +2 -4
- package/lib/services/utils/validateIsMaia.js +2 -2
- package/lib/types/agent.js +1 -1
- package/lib/utils/agentDisplayName.js +19 -11
- package/lib/utils/contextMentionIcons.js +7 -16
- package/lib/utils/hitlAnalytics.js +6 -5
- package/lib/utils/renderContextMentions.js +1 -3
- package/package.json +1 -1
- package/lib/hooks/useContextPinPopover.js +0 -235
- package/lib/hooks/useRecentContexts.js +0 -86
- package/lib/services/maia/RecentContexts/getRecentContexts.js +0 -54
- package/lib/services/maia/RecentContexts/index.js +0 -6
- package/lib/utils/entityLinkRender.js +0 -132
|
@@ -17,37 +17,20 @@ import { useState, useCallback, useRef } from 'react';
|
|
|
17
17
|
import { useTranslation } from 'react-i18next';
|
|
18
18
|
import { useSnackBarManager } from '../../../hooks/useSnackBarManager/useSnackBarManager';
|
|
19
19
|
import { fetchMaia } from '../client';
|
|
20
|
-
import { useUser
|
|
20
|
+
import { useUser } from '../../../context/cor-user';
|
|
21
|
+
import { isMaiaCloneAgentsRoleBlocked } from '../../../constants/maiaTaskPanelAccess';
|
|
21
22
|
import { mapCORLang } from '../../../lang/utils';
|
|
22
|
-
var isMaiaAgent = function isMaiaAgent(agent) {
|
|
23
|
-
return agent.type === 'orchestrator';
|
|
24
|
-
};
|
|
25
|
-
var isMarketplaceMaiakerEnabled = function isMarketplaceMaiakerEnabled() {
|
|
26
|
-
return !!window.MAIA_MARKETPLACE_MAIAKER;
|
|
27
|
-
};
|
|
28
|
-
var is403AgentFetchError = function is403AgentFetchError(err) {
|
|
29
|
-
var _error$response, _error$message, _error$message2;
|
|
30
|
-
var error = err;
|
|
31
|
-
return (error === null || error === void 0 || (_error$response = error.response) === null || _error$response === void 0 ? void 0 : _error$response.status) === 403 || (error === null || error === void 0 ? void 0 : error.status) === 403 || Boolean(error === null || error === void 0 || (_error$message = error.message) === null || _error$message === void 0 ? void 0 : _error$message.includes("You don't have permission to view agents")) || Boolean(error === null || error === void 0 || (_error$message2 = error.message) === null || _error$message2 === void 0 ? void 0 : _error$message2.includes('Failed fetching data'));
|
|
32
|
-
};
|
|
33
|
-
var mergeAgentsWithoutDuplicates = function mergeAgentsWithoutDuplicates(base, extra) {
|
|
34
|
-
var ids = new Set(base.map(function (agent) {
|
|
35
|
-
return agent.id;
|
|
36
|
-
}));
|
|
37
|
-
var merged = _toConsumableArray(base);
|
|
38
|
-
extra.forEach(function (agent) {
|
|
39
|
-
if (!ids.has(agent.id)) merged.push(agent);
|
|
40
|
-
});
|
|
41
|
-
return merged;
|
|
42
|
-
};
|
|
43
23
|
|
|
44
24
|
/**
|
|
45
|
-
* Ordena los agentes:
|
|
25
|
+
* Ordena los agentes: agentes clone primero (si existen), luego favoritos alfabéticamente, luego no favoritos alfabéticamente
|
|
46
26
|
*/
|
|
47
27
|
var sortAgents = function sortAgents(agents) {
|
|
48
|
-
|
|
28
|
+
// Separar agentes clone del resto
|
|
29
|
+
var cloneAgents = agents.filter(function (ag) {
|
|
30
|
+
return ag.type === 'clone';
|
|
31
|
+
});
|
|
49
32
|
var otherAgents = agents.filter(function (ag) {
|
|
50
|
-
return
|
|
33
|
+
return ag.type !== 'clone';
|
|
51
34
|
});
|
|
52
35
|
|
|
53
36
|
// Separar favoritos y no favoritos
|
|
@@ -61,7 +44,9 @@ var sortAgents = function sortAgents(agents) {
|
|
|
61
44
|
}).sort(function (a, b) {
|
|
62
45
|
return a.name.localeCompare(b.name);
|
|
63
46
|
});
|
|
64
|
-
|
|
47
|
+
|
|
48
|
+
// Combinar: clones primero, luego favoritos, luego no favoritos
|
|
49
|
+
return cloneAgents.length ? [].concat(_toConsumableArray(cloneAgents), _toConsumableArray(favorites), _toConsumableArray(nonFavorites)) : [].concat(_toConsumableArray(favorites), _toConsumableArray(nonFavorites));
|
|
65
50
|
};
|
|
66
51
|
export var useGetAgents = function useGetAgents(_ref) {
|
|
67
52
|
var selectAgent = _ref.selectAgent,
|
|
@@ -83,10 +68,14 @@ export var useGetAgents = function useGetAgents(_ref) {
|
|
|
83
68
|
_useState6 = _slicedToArray(_useState5, 2),
|
|
84
69
|
loadingMore = _useState6[0],
|
|
85
70
|
setLoadingMore = _useState6[1];
|
|
86
|
-
var _useState7 = useState(
|
|
71
|
+
var _useState7 = useState(false),
|
|
87
72
|
_useState8 = _slicedToArray(_useState7, 2),
|
|
88
|
-
|
|
89
|
-
|
|
73
|
+
searchLoading = _useState8[0],
|
|
74
|
+
setSearchLoading = _useState8[1];
|
|
75
|
+
var _useState9 = useState(null),
|
|
76
|
+
_useState0 = _slicedToArray(_useState9, 2),
|
|
77
|
+
error = _useState0[0],
|
|
78
|
+
setError = _useState0[1];
|
|
90
79
|
var _useSnackBarManager = useSnackBarManager(),
|
|
91
80
|
handleSnackbarError = _useSnackBarManager.handleSnackbarError;
|
|
92
81
|
var _useTranslation = useTranslation('chat_ai_section'),
|
|
@@ -95,7 +84,10 @@ export var useGetAgents = function useGetAgents(_ref) {
|
|
|
95
84
|
var lastSelectedAgentRef = useRef(null);
|
|
96
85
|
var isRefreshingRef = useRef(false);
|
|
97
86
|
var lastRequestRef = useRef(null);
|
|
98
|
-
var
|
|
87
|
+
var agentsRef = useRef(agents);
|
|
88
|
+
var preSearchAgentsRef = useRef(null);
|
|
89
|
+
agentsRef.current = agents;
|
|
90
|
+
var canFetchCloneAgents = !isMaiaCloneAgentsRoleBlocked(user, section);
|
|
99
91
|
var addAgent = useCallback(function (newAgent, options) {
|
|
100
92
|
setAgents(function (prev) {
|
|
101
93
|
// Verificar si el agente ya existe para evitar duplicados
|
|
@@ -193,184 +185,137 @@ export var useGetAgents = function useGetAgents(_ref) {
|
|
|
193
185
|
}
|
|
194
186
|
}, [agents.data, selectAgent]);
|
|
195
187
|
var handleGetAgents = useCallback(/*#__PURE__*/function () {
|
|
196
|
-
var _ref5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function
|
|
188
|
+
var _ref5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3(agentToSelect) {
|
|
197
189
|
var _agentToSelect$id;
|
|
198
|
-
var requestKey, isMultiAgents, agentParsed, hasMore, nextOffset,
|
|
199
|
-
return _regeneratorRuntime.wrap(function (
|
|
200
|
-
while (1) switch (
|
|
190
|
+
var requestKey, isMultiAgents, agentParsed, hasMore, nextOffset, cloneAgents, customAgents, customHasMore, customNextOffset, is403, loadCloneAgents, loadCustomAgents, shouldRequestCloneAgents, queryParams, path, response, data, _responseError$respon, _responseError$messag, _responseError$messag2, is403Error, _agentParsed, _agentParsed2, _lastSelectedAgentRef, _lastSelectedAgentRef2, availableAgents, _availableAgents, firstAgent, _lastSelectedAgentRef3, _availableAgents2, _availableAgents3, firstAvailableAgent, _t3, _t4;
|
|
191
|
+
return _regeneratorRuntime.wrap(function (_context3) {
|
|
192
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
201
193
|
case 0:
|
|
202
194
|
if (!isRefreshingRef.current) {
|
|
203
|
-
|
|
195
|
+
_context3.next = 1;
|
|
204
196
|
break;
|
|
205
197
|
}
|
|
206
|
-
return
|
|
198
|
+
return _context3.abrupt("return");
|
|
207
199
|
case 1:
|
|
208
200
|
requestKey = (agentToSelect === null || agentToSelect === void 0 || (_agentToSelect$id = agentToSelect.id) === null || _agentToSelect$id === void 0 ? void 0 : _agentToSelect$id.toString()) || 'default';
|
|
209
201
|
if (!(lastRequestRef.current === requestKey && !loading)) {
|
|
210
|
-
|
|
202
|
+
_context3.next = 2;
|
|
211
203
|
break;
|
|
212
204
|
}
|
|
213
|
-
return
|
|
205
|
+
return _context3.abrupt("return");
|
|
214
206
|
case 2:
|
|
215
207
|
isRefreshingRef.current = true;
|
|
216
208
|
lastRequestRef.current = requestKey;
|
|
217
209
|
setLoading(true);
|
|
218
210
|
setError(null);
|
|
219
211
|
isMultiAgents = !!window.MAIA_CHAT_AI_FEATURE_ACCESS && !!window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS;
|
|
220
|
-
|
|
212
|
+
_context3.prev = 3;
|
|
221
213
|
agentParsed = [];
|
|
222
214
|
hasMore = false;
|
|
223
|
-
nextOffset = null;
|
|
224
|
-
|
|
225
|
-
|
|
215
|
+
nextOffset = null; // Si tiene feature access multi agents, hacer dos queries (Maia + custom) en cualquier sección
|
|
216
|
+
if (!isMultiAgents) {
|
|
217
|
+
_context3.next = 5;
|
|
218
|
+
break;
|
|
219
|
+
}
|
|
220
|
+
// Query clone (Maia) y custom son independientes → se disparan en paralelo.
|
|
221
|
+
cloneAgents = [];
|
|
222
|
+
customAgents = [];
|
|
223
|
+
customHasMore = false;
|
|
224
|
+
customNextOffset = null;
|
|
225
|
+
is403 = function is403(err) {
|
|
226
|
+
var _err$response, _err$message, _err$message2;
|
|
227
|
+
return (err === null || err === void 0 || (_err$response = err.response) === null || _err$response === void 0 ? void 0 : _err$response.status) === 403 || (err === null || err === void 0 ? void 0 : err.status) === 403 || (err === null || err === void 0 || (_err$message = err.message) === null || _err$message === void 0 ? void 0 : _err$message.includes("You don't have permission to view agents")) || (err === null || err === void 0 || (_err$message2 = err.message) === null || _err$message2 === void 0 ? void 0 : _err$message2.includes('Failed fetching data'));
|
|
228
|
+
}; // fetchCOR lanza esto para 403 sin 'Access denied'
|
|
229
|
+
loadCloneAgents = /*#__PURE__*/function () {
|
|
226
230
|
var _ref6 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
|
|
227
|
-
var
|
|
231
|
+
var _maiaData$data, orderParam, maiaResponse, maiaData, _t;
|
|
228
232
|
return _regeneratorRuntime.wrap(function (_context) {
|
|
229
233
|
while (1) switch (_context.prev = _context.next) {
|
|
230
234
|
case 0:
|
|
231
|
-
if (
|
|
235
|
+
if (canFetchCloneAgents) {
|
|
232
236
|
_context.next = 1;
|
|
233
237
|
break;
|
|
234
238
|
}
|
|
235
|
-
return _context.abrupt("return"
|
|
239
|
+
return _context.abrupt("return");
|
|
236
240
|
case 1:
|
|
237
241
|
_context.prev = 1;
|
|
242
|
+
orderParam = section === 'client' ? '&order=client,project' : section === 'project' || section === 'header' || section === 'task' ? '&order=project,client' : '';
|
|
238
243
|
_context.next = 2;
|
|
239
244
|
return fetchMaia({
|
|
240
|
-
path: "agents?agent_type=clone&
|
|
245
|
+
path: "agents?agent_type=clone&lang=".concat(mapCORLang(i18n.language)).concat(orderParam),
|
|
241
246
|
method: 'GET'
|
|
242
247
|
});
|
|
243
248
|
case 2:
|
|
244
|
-
|
|
249
|
+
maiaResponse = _context.sent;
|
|
245
250
|
_context.next = 3;
|
|
246
|
-
return
|
|
251
|
+
return maiaResponse.json();
|
|
247
252
|
case 3:
|
|
248
|
-
|
|
249
|
-
|
|
253
|
+
maiaData = _context.sent;
|
|
254
|
+
cloneAgents = ((_maiaData$data = maiaData.data) === null || _maiaData$data === void 0 ? void 0 : _maiaData$data.filter(function (ag) {
|
|
250
255
|
return ag.type === 'clone';
|
|
251
|
-
}));
|
|
256
|
+
})) || [];
|
|
257
|
+
_context.next = 5;
|
|
258
|
+
break;
|
|
252
259
|
case 4:
|
|
253
260
|
_context.prev = 4;
|
|
254
261
|
_t = _context["catch"](1);
|
|
255
|
-
if (
|
|
262
|
+
if (is403(_t)) {
|
|
256
263
|
_context.next = 5;
|
|
257
264
|
break;
|
|
258
265
|
}
|
|
259
|
-
return _context.abrupt("return", []);
|
|
260
|
-
case 5:
|
|
261
266
|
throw _t;
|
|
262
|
-
case
|
|
267
|
+
case 5:
|
|
263
268
|
case "end":
|
|
264
269
|
return _context.stop();
|
|
265
270
|
}
|
|
266
271
|
}, _callee, null, [[1, 4]]);
|
|
267
272
|
}));
|
|
268
|
-
return function
|
|
273
|
+
return function loadCloneAgents() {
|
|
269
274
|
return _ref6.apply(this, arguments);
|
|
270
275
|
};
|
|
271
|
-
}();
|
|
272
|
-
|
|
273
|
-
_context4.next = 5;
|
|
274
|
-
break;
|
|
275
|
-
}
|
|
276
|
-
// Query clone (Maia) y custom son independientes → se disparan en paralelo.
|
|
277
|
-
customAgents = [];
|
|
278
|
-
customHasMore = false;
|
|
279
|
-
customNextOffset = null;
|
|
280
|
-
is403 = is403AgentFetchError;
|
|
281
|
-
maiaAgents = [];
|
|
282
|
-
loadCloneAgents = /*#__PURE__*/function () {
|
|
276
|
+
}();
|
|
277
|
+
loadCustomAgents = /*#__PURE__*/function () {
|
|
283
278
|
var _ref7 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
|
|
284
|
-
var
|
|
279
|
+
var customResponse, customData, _t2;
|
|
285
280
|
return _regeneratorRuntime.wrap(function (_context2) {
|
|
286
281
|
while (1) switch (_context2.prev = _context2.next) {
|
|
287
282
|
case 0:
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
break;
|
|
291
|
-
}
|
|
292
|
-
return _context2.abrupt("return");
|
|
293
|
-
case 1:
|
|
294
|
-
_context2.prev = 1;
|
|
295
|
-
_context2.next = 2;
|
|
296
|
-
return fetchMaia({
|
|
297
|
-
path: "agents?agent_type=orchestrator&lang=".concat(mapCORLang(i18n.language)),
|
|
298
|
-
method: 'GET'
|
|
299
|
-
});
|
|
300
|
-
case 2:
|
|
301
|
-
maiaResponse = _context2.sent;
|
|
302
|
-
_context2.next = 3;
|
|
303
|
-
return maiaResponse.json();
|
|
304
|
-
case 3:
|
|
305
|
-
maiaData = _context2.sent;
|
|
306
|
-
maiaAgents = ((_maiaData$data = maiaData.data) === null || _maiaData$data === void 0 ? void 0 : _maiaData$data.filter(isMaiaAgent)) || [];
|
|
307
|
-
_context2.next = 4;
|
|
308
|
-
return fetchGlobalCloneAgents();
|
|
309
|
-
case 4:
|
|
310
|
-
globalCloneAgents = _context2.sent;
|
|
311
|
-
maiaAgents = mergeAgentsWithoutDuplicates(maiaAgents, globalCloneAgents);
|
|
312
|
-
_context2.next = 6;
|
|
313
|
-
break;
|
|
314
|
-
case 5:
|
|
315
|
-
_context2.prev = 5;
|
|
316
|
-
_t2 = _context2["catch"](1);
|
|
317
|
-
if (is403(_t2)) {
|
|
318
|
-
_context2.next = 6;
|
|
319
|
-
break;
|
|
320
|
-
}
|
|
321
|
-
throw _t2;
|
|
322
|
-
case 6:
|
|
323
|
-
case "end":
|
|
324
|
-
return _context2.stop();
|
|
325
|
-
}
|
|
326
|
-
}, _callee2, null, [[1, 5]]);
|
|
327
|
-
}));
|
|
328
|
-
return function loadCloneAgents() {
|
|
329
|
-
return _ref7.apply(this, arguments);
|
|
330
|
-
};
|
|
331
|
-
}();
|
|
332
|
-
loadCustomAgents = /*#__PURE__*/function () {
|
|
333
|
-
var _ref8 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
|
|
334
|
-
var customResponse, customData, _t3;
|
|
335
|
-
return _regeneratorRuntime.wrap(function (_context3) {
|
|
336
|
-
while (1) switch (_context3.prev = _context3.next) {
|
|
337
|
-
case 0:
|
|
338
|
-
_context3.prev = 0;
|
|
339
|
-
_context3.next = 1;
|
|
283
|
+
_context2.prev = 0;
|
|
284
|
+
_context2.next = 1;
|
|
340
285
|
return fetchMaia({
|
|
341
286
|
path: 'agents?agent_type=custom&limit=7&offset=0',
|
|
342
287
|
method: 'GET'
|
|
343
288
|
});
|
|
344
289
|
case 1:
|
|
345
|
-
customResponse =
|
|
346
|
-
|
|
290
|
+
customResponse = _context2.sent;
|
|
291
|
+
_context2.next = 2;
|
|
347
292
|
return customResponse.json();
|
|
348
293
|
case 2:
|
|
349
|
-
customData =
|
|
294
|
+
customData = _context2.sent;
|
|
350
295
|
customAgents = customData.data || [];
|
|
351
296
|
customHasMore = customData.has_more || false;
|
|
352
297
|
customNextOffset = customData.next_offset || null;
|
|
353
|
-
|
|
298
|
+
_context2.next = 4;
|
|
354
299
|
break;
|
|
355
300
|
case 3:
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
if (is403(
|
|
359
|
-
|
|
301
|
+
_context2.prev = 3;
|
|
302
|
+
_t2 = _context2["catch"](0);
|
|
303
|
+
if (is403(_t2)) {
|
|
304
|
+
_context2.next = 4;
|
|
360
305
|
break;
|
|
361
306
|
}
|
|
362
|
-
throw
|
|
307
|
+
throw _t2;
|
|
363
308
|
case 4:
|
|
364
309
|
case "end":
|
|
365
|
-
return
|
|
310
|
+
return _context2.stop();
|
|
366
311
|
}
|
|
367
|
-
},
|
|
312
|
+
}, _callee2, null, [[0, 3]]);
|
|
368
313
|
}));
|
|
369
314
|
return function loadCustomAgents() {
|
|
370
|
-
return
|
|
315
|
+
return _ref7.apply(this, arguments);
|
|
371
316
|
};
|
|
372
317
|
}();
|
|
373
|
-
|
|
318
|
+
_context3.next = 4;
|
|
374
319
|
return Promise.all([loadCloneAgents(), loadCustomAgents()]);
|
|
375
320
|
case 4:
|
|
376
321
|
// Combinar: agentes clone primero, luego los custom (si existen)
|
|
@@ -380,7 +325,10 @@ export var useGetAgents = function useGetAgents(_ref) {
|
|
|
380
325
|
// Si customAgents está vacío (por 403), agentParsed será []
|
|
381
326
|
agentParsed = customAgents;
|
|
382
327
|
} else {
|
|
383
|
-
|
|
328
|
+
// Rol con acceso a clones: cloneAgents + customAgents
|
|
329
|
+
// Si customAgents está vacío (por 403) pero hay cloneAgents, agentParsed tendrá los clones
|
|
330
|
+
// Si no hay cloneAgents ni customAgents, agentParsed será []
|
|
331
|
+
agentParsed = cloneAgents.length ? [].concat(_toConsumableArray(cloneAgents), _toConsumableArray(customAgents)) : customAgents;
|
|
384
332
|
}
|
|
385
333
|
// Ordenar: Maia primero, luego favoritos alfabéticamente, luego no favoritos alfabéticamente
|
|
386
334
|
agentParsed = sortAgents(agentParsed);
|
|
@@ -396,60 +344,64 @@ export var useGetAgents = function useGetAgents(_ref) {
|
|
|
396
344
|
if (agentParsed.length === 0) {
|
|
397
345
|
setError(null);
|
|
398
346
|
}
|
|
399
|
-
|
|
347
|
+
_context3.next = 12;
|
|
400
348
|
break;
|
|
401
349
|
case 5:
|
|
402
|
-
|
|
350
|
+
shouldRequestCloneAgents = canFetchCloneAgents && (section === 'project' || section === 'client' || section === 'header' || section === 'task');
|
|
351
|
+
if (shouldRequestCloneAgents) {
|
|
352
|
+
_context3.next = 6;
|
|
353
|
+
break;
|
|
354
|
+
}
|
|
355
|
+
setAgents({
|
|
356
|
+
data: [],
|
|
357
|
+
has_more: false,
|
|
358
|
+
next_offset: null
|
|
359
|
+
});
|
|
360
|
+
setError(null);
|
|
361
|
+
_context3.next = 12;
|
|
362
|
+
break;
|
|
363
|
+
case 6:
|
|
403
364
|
queryParams = new URLSearchParams();
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
}
|
|
365
|
+
queryParams.append('agent_type', 'clone');
|
|
366
|
+
queryParams.append('lang', mapCORLang(i18n.language));
|
|
367
|
+
queryParams.append('order', section === 'client' ? 'client,project' : 'project,client');
|
|
368
|
+
if (section === 'header') {
|
|
369
|
+
queryParams.append('limit', '7');
|
|
370
|
+
queryParams.append('offset', '0');
|
|
411
371
|
}
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
_context4.next = 7;
|
|
372
|
+
path = "agents?".concat(queryParams.toString());
|
|
373
|
+
_context3.prev = 7;
|
|
374
|
+
_context3.next = 8;
|
|
416
375
|
return fetchMaia({
|
|
417
376
|
path: path,
|
|
418
377
|
method: 'GET'
|
|
419
378
|
});
|
|
420
|
-
case 7:
|
|
421
|
-
response = _context4.sent;
|
|
422
|
-
_context4.next = 8;
|
|
423
|
-
return response.json();
|
|
424
379
|
case 8:
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
_context4.next = 9;
|
|
429
|
-
return fetchGlobalCloneAgents();
|
|
380
|
+
response = _context3.sent;
|
|
381
|
+
_context3.next = 9;
|
|
382
|
+
return response.json();
|
|
430
383
|
case 9:
|
|
431
|
-
|
|
432
|
-
agentParsed =
|
|
433
|
-
// Ordenar: Maia primero, luego favoritos alfabéticamente, luego no favoritos alfabéticamente
|
|
384
|
+
data = _context3.sent;
|
|
385
|
+
agentParsed = data.data || [];
|
|
434
386
|
agentParsed = sortAgents(agentParsed);
|
|
435
387
|
hasMore = data.has_more;
|
|
436
388
|
nextOffset = data.next_offset;
|
|
437
389
|
setAgents(_objectSpread(_objectSpread({}, data), {}, {
|
|
438
390
|
data: agentParsed
|
|
439
391
|
}));
|
|
440
|
-
|
|
392
|
+
_context3.next = 12;
|
|
441
393
|
break;
|
|
442
394
|
case 10:
|
|
443
|
-
|
|
444
|
-
|
|
395
|
+
_context3.prev = 10;
|
|
396
|
+
_t3 = _context3["catch"](7);
|
|
445
397
|
// Verificar si el error es 403
|
|
446
398
|
// fetchCOR puede lanzar diferentes tipos de errores:
|
|
447
399
|
// 1. Error con errorData.detail si incluye 'Access denied'
|
|
448
400
|
// 2. Error genérico 'Failed fetching data' si es 403 pero no incluye 'Access denied'
|
|
449
401
|
// 3. Necesitamos verificar el status code si está disponible
|
|
450
|
-
is403Error = (
|
|
402
|
+
is403Error = (_t3 === null || _t3 === void 0 || (_responseError$respon = _t3.response) === null || _responseError$respon === void 0 ? void 0 : _responseError$respon.status) === 403 || (_t3 === null || _t3 === void 0 ? void 0 : _t3.status) === 403 || (_t3 === null || _t3 === void 0 || (_responseError$messag = _t3.message) === null || _responseError$messag === void 0 ? void 0 : _responseError$messag.includes("You don't have permission to view agents")) || (_t3 === null || _t3 === void 0 || (_responseError$messag2 = _t3.message) === null || _responseError$messag2 === void 0 ? void 0 : _responseError$messag2.includes('Failed fetching data')); // fetchCOR lanza esto para 403 sin 'Access denied'
|
|
451
403
|
if (!is403Error) {
|
|
452
|
-
|
|
404
|
+
_context3.next = 11;
|
|
453
405
|
break;
|
|
454
406
|
}
|
|
455
407
|
// Si es 403, establecer agentes vacíos y continuar
|
|
@@ -459,10 +411,10 @@ export var useGetAgents = function useGetAgents(_ref) {
|
|
|
459
411
|
next_offset: null
|
|
460
412
|
});
|
|
461
413
|
setError(null);
|
|
462
|
-
|
|
414
|
+
_context3.next = 12;
|
|
463
415
|
break;
|
|
464
416
|
case 11:
|
|
465
|
-
throw
|
|
417
|
+
throw _t3;
|
|
466
418
|
case 12:
|
|
467
419
|
// Lógica de select agent - Solo seleccionar si hay agentes disponibles
|
|
468
420
|
if (agentParsed.length > 0) {
|
|
@@ -476,8 +428,8 @@ export var useGetAgents = function useGetAgents(_ref) {
|
|
|
476
428
|
} else if ((_agentParsed = agentParsed) !== null && _agentParsed !== void 0 && _agentParsed[0] && (!agent || !agentParsed.find(function (a) {
|
|
477
429
|
return a.id === agent.id;
|
|
478
430
|
}))) {
|
|
479
|
-
availableAgents = window.MAIA_CHAT_AI_FEATURE_ACCESS &&
|
|
480
|
-
return
|
|
431
|
+
availableAgents = window.MAIA_CHAT_AI_FEATURE_ACCESS && canFetchCloneAgents ? agentParsed : agentParsed.filter(function (agentItem) {
|
|
432
|
+
return agentItem.type !== 'clone';
|
|
481
433
|
});
|
|
482
434
|
_availableAgents = _slicedToArray(availableAgents, 1), firstAgent = _availableAgents[0];
|
|
483
435
|
if (firstAgent && ((_lastSelectedAgentRef2 = lastSelectedAgentRef.current) === null || _lastSelectedAgentRef2 === void 0 ? void 0 : _lastSelectedAgentRef2.id) !== firstAgent.id) {
|
|
@@ -485,8 +437,8 @@ export var useGetAgents = function useGetAgents(_ref) {
|
|
|
485
437
|
selectAgent(firstAgent);
|
|
486
438
|
}
|
|
487
439
|
} else if (agentToSelect && (_agentParsed2 = agentParsed) !== null && _agentParsed2 !== void 0 && _agentParsed2.length) {
|
|
488
|
-
_availableAgents2 = window.MAIA_CHAT_AI_FEATURE_ACCESS &&
|
|
489
|
-
return
|
|
440
|
+
_availableAgents2 = window.MAIA_CHAT_AI_FEATURE_ACCESS && canFetchCloneAgents ? agentParsed : agentParsed.filter(function (agentItem) {
|
|
441
|
+
return agentItem.type !== 'clone';
|
|
490
442
|
});
|
|
491
443
|
_availableAgents3 = _slicedToArray(_availableAgents2, 1), firstAvailableAgent = _availableAgents3[0];
|
|
492
444
|
if (firstAvailableAgent && ((_lastSelectedAgentRef3 = lastSelectedAgentRef.current) === null || _lastSelectedAgentRef3 === void 0 ? void 0 : _lastSelectedAgentRef3.id) !== firstAvailableAgent.id) {
|
|
@@ -496,32 +448,95 @@ export var useGetAgents = function useGetAgents(_ref) {
|
|
|
496
448
|
}
|
|
497
449
|
}
|
|
498
450
|
setLoading(false);
|
|
499
|
-
|
|
451
|
+
_context3.next = 14;
|
|
500
452
|
break;
|
|
501
453
|
case 13:
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
setError(
|
|
454
|
+
_context3.prev = 13;
|
|
455
|
+
_t4 = _context3["catch"](3);
|
|
456
|
+
setError(_t4 instanceof Error ? _t4.message : 'An unknown error occurred');
|
|
505
457
|
setLoading(false);
|
|
506
458
|
case 14:
|
|
507
|
-
|
|
459
|
+
_context3.prev = 14;
|
|
508
460
|
isRefreshingRef.current = false;
|
|
509
461
|
setTimeout(function () {
|
|
510
462
|
if (!isRefreshingRef.current) {
|
|
511
463
|
lastRequestRef.current = null;
|
|
512
464
|
}
|
|
513
465
|
}, 100);
|
|
514
|
-
return
|
|
466
|
+
return _context3.finish(14);
|
|
515
467
|
case 15:
|
|
516
468
|
case "end":
|
|
517
|
-
return
|
|
469
|
+
return _context3.stop();
|
|
518
470
|
}
|
|
519
|
-
},
|
|
471
|
+
}, _callee3, null, [[3, 13, 14, 15], [7, 10]]);
|
|
520
472
|
}));
|
|
521
473
|
return function (_x) {
|
|
522
474
|
return _ref5.apply(this, arguments);
|
|
523
475
|
};
|
|
524
|
-
}(), [selectAgent, section, agent, loading]);
|
|
476
|
+
}(), [selectAgent, section, agent, loading, canFetchCloneAgents, i18n.language]);
|
|
477
|
+
var searchCustomAgents = useCallback(/*#__PURE__*/function () {
|
|
478
|
+
var _ref8 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4(query) {
|
|
479
|
+
var response, data, _t5;
|
|
480
|
+
return _regeneratorRuntime.wrap(function (_context4) {
|
|
481
|
+
while (1) switch (_context4.prev = _context4.next) {
|
|
482
|
+
case 0:
|
|
483
|
+
if (query) {
|
|
484
|
+
_context4.next = 1;
|
|
485
|
+
break;
|
|
486
|
+
}
|
|
487
|
+
if (preSearchAgentsRef.current) {
|
|
488
|
+
setAgents(preSearchAgentsRef.current);
|
|
489
|
+
preSearchAgentsRef.current = null;
|
|
490
|
+
}
|
|
491
|
+
return _context4.abrupt("return");
|
|
492
|
+
case 1:
|
|
493
|
+
if (!preSearchAgentsRef.current) {
|
|
494
|
+
preSearchAgentsRef.current = agentsRef.current;
|
|
495
|
+
}
|
|
496
|
+
setSearchLoading(true);
|
|
497
|
+
_context4.prev = 2;
|
|
498
|
+
_context4.next = 3;
|
|
499
|
+
return fetchMaia({
|
|
500
|
+
path: "agents?agent_type=custom&limit=20&offset=0&q=".concat(encodeURIComponent(query)),
|
|
501
|
+
method: 'GET'
|
|
502
|
+
});
|
|
503
|
+
case 3:
|
|
504
|
+
response = _context4.sent;
|
|
505
|
+
_context4.next = 4;
|
|
506
|
+
return response.json();
|
|
507
|
+
case 4:
|
|
508
|
+
data = _context4.sent;
|
|
509
|
+
setAgents(function (prev) {
|
|
510
|
+
var cloneAgents = prev.data.filter(function (ag) {
|
|
511
|
+
return ag.type === 'clone';
|
|
512
|
+
});
|
|
513
|
+
var customResults = data.data || [];
|
|
514
|
+
return {
|
|
515
|
+
data: cloneAgents.length ? [].concat(_toConsumableArray(cloneAgents), _toConsumableArray(customResults)) : customResults,
|
|
516
|
+
has_more: false,
|
|
517
|
+
next_offset: null
|
|
518
|
+
};
|
|
519
|
+
});
|
|
520
|
+
_context4.next = 6;
|
|
521
|
+
break;
|
|
522
|
+
case 5:
|
|
523
|
+
_context4.prev = 5;
|
|
524
|
+
_t5 = _context4["catch"](2);
|
|
525
|
+
handleSnackbarError(t('snackbar.loadMoreAgents.error'));
|
|
526
|
+
case 6:
|
|
527
|
+
_context4.prev = 6;
|
|
528
|
+
setSearchLoading(false);
|
|
529
|
+
return _context4.finish(6);
|
|
530
|
+
case 7:
|
|
531
|
+
case "end":
|
|
532
|
+
return _context4.stop();
|
|
533
|
+
}
|
|
534
|
+
}, _callee4, null, [[2, 5, 6, 7]]);
|
|
535
|
+
}));
|
|
536
|
+
return function (_x2) {
|
|
537
|
+
return _ref8.apply(this, arguments);
|
|
538
|
+
};
|
|
539
|
+
}(), []);
|
|
525
540
|
var loadMoreAgents = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee5() {
|
|
526
541
|
var isMultiAgents, canLoadMore, path, queryParams, response, data, _t6;
|
|
527
542
|
return _regeneratorRuntime.wrap(function (_context5) {
|
|
@@ -543,10 +558,11 @@ export var useGetAgents = function useGetAgents(_ref) {
|
|
|
543
558
|
// Mantener cantidad impar de cards: primera carga 7, siguientes +6 (7, 13, 19, ...)
|
|
544
559
|
path = "agents?agent_type=custom&limit=6&offset=".concat(agents.next_offset);
|
|
545
560
|
} else {
|
|
546
|
-
// Si no es multiAgents, cargar más agentes
|
|
561
|
+
// Si no es multiAgents, cargar más agentes clone (Maia) — mismo order que project para header
|
|
547
562
|
queryParams = new URLSearchParams();
|
|
548
|
-
queryParams.append('agent_type', '
|
|
563
|
+
queryParams.append('agent_type', 'clone');
|
|
549
564
|
queryParams.append('lang', mapCORLang(i18n.language));
|
|
565
|
+
queryParams.append('order', 'project,client');
|
|
550
566
|
queryParams.append('limit', '7');
|
|
551
567
|
queryParams.append('offset', agents.next_offset.toString());
|
|
552
568
|
path = "agents?".concat(queryParams.toString());
|
|
@@ -565,24 +581,29 @@ export var useGetAgents = function useGetAgents(_ref) {
|
|
|
565
581
|
// Acumular agentes, excluyendo duplicados
|
|
566
582
|
setAgents(function (prev) {
|
|
567
583
|
if (isMultiAgents) {
|
|
568
|
-
// Lógica para multiAgents: separar
|
|
569
|
-
|
|
584
|
+
// Lógica para multiAgents: separar clone y custom
|
|
585
|
+
// Mantener todos los agentes clone existentes al inicio
|
|
586
|
+
var existingCloneAgents = prev.data.filter(function (ag) {
|
|
587
|
+
return ag.type === 'clone';
|
|
588
|
+
});
|
|
570
589
|
|
|
571
|
-
// Obtener IDs existentes (excluyendo
|
|
590
|
+
// Obtener IDs existentes (excluyendo clones)
|
|
572
591
|
var _existingIds = new Set(prev.data.filter(function (ag) {
|
|
573
|
-
return
|
|
592
|
+
return ag.type !== 'clone';
|
|
574
593
|
}).map(function (ag) {
|
|
575
594
|
return ag.id;
|
|
576
595
|
}));
|
|
577
596
|
|
|
578
|
-
// Filtrar nuevos agents que no estén ya en la lista (y que no sean
|
|
597
|
+
// Filtrar nuevos agents que no estén ya en la lista (y que no sean clone)
|
|
579
598
|
var _newAgents = data.data.filter(function (ag) {
|
|
580
|
-
return
|
|
599
|
+
return ag.type !== 'clone' && !_existingIds.has(ag.id);
|
|
581
600
|
});
|
|
582
|
-
|
|
583
|
-
|
|
601
|
+
|
|
602
|
+
// Construir el nuevo array: clones primero, luego los agents existentes que no sean clone, luego los nuevos
|
|
603
|
+
var _newData = existingCloneAgents.length ? [].concat(_toConsumableArray(existingCloneAgents), _toConsumableArray(prev.data.filter(function (ag) {
|
|
604
|
+
return ag.type !== 'clone';
|
|
584
605
|
})), _toConsumableArray(_newAgents)) : [].concat(_toConsumableArray(prev.data.filter(function (ag) {
|
|
585
|
-
return
|
|
606
|
+
return ag.type !== 'clone';
|
|
586
607
|
})), _toConsumableArray(_newAgents));
|
|
587
608
|
|
|
588
609
|
// Ordenar: Maia primero, luego favoritos alfabéticamente, luego no favoritos alfabéticamente
|
|
@@ -593,7 +614,7 @@ export var useGetAgents = function useGetAgents(_ref) {
|
|
|
593
614
|
next_offset: data.next_offset
|
|
594
615
|
};
|
|
595
616
|
}
|
|
596
|
-
// Lógica para !isMultiAgents: agregar evitando duplicados
|
|
617
|
+
// Lógica para !isMultiAgents: todos los agentes son clone, simplemente agregar evitando duplicados
|
|
597
618
|
var existingIds = new Set(prev.data.map(function (ag) {
|
|
598
619
|
return ag.id;
|
|
599
620
|
}));
|
|
@@ -631,6 +652,8 @@ export var useGetAgents = function useGetAgents(_ref) {
|
|
|
631
652
|
error: error,
|
|
632
653
|
handleGetAgents: handleGetAgents,
|
|
633
654
|
loadMoreAgents: loadMoreAgents,
|
|
655
|
+
searchCustomAgents: searchCustomAgents,
|
|
656
|
+
searchLoading: searchLoading,
|
|
634
657
|
addAgent: addAgent,
|
|
635
658
|
removeAgent: removeAgent,
|
|
636
659
|
updateAgent: updateAgent,
|
|
@@ -639,4 +662,4 @@ export var useGetAgents = function useGetAgents(_ref) {
|
|
|
639
662
|
sortAgentsList: sortAgentsList
|
|
640
663
|
};
|
|
641
664
|
};
|
|
642
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VTdGF0ZSIsInVzZUNhbGxiYWNrIiwidXNlUmVmIiwidXNlVHJhbnNsYXRpb24iLCJ1c2VTbmFja0Jhck1hbmFnZXIiLCJmZXRjaE1haWEiLCJ1c2VVc2VyIiwiQ09SVXNlclJvbGUiLCJtYXBDT1JMYW5nIiwiaXNNYWlhQWdlbnQiLCJhZ2VudCIsInR5cGUiLCJpc01hcmtldHBsYWNlTWFpYWtlckVuYWJsZWQiLCJ3aW5kb3ciLCJNQUlBX01BUktFVFBMQUNFX01BSUFLRVIiLCJpczQwM0FnZW50RmV0Y2hFcnJvciIsImVyciIsIl9lcnJvciRyZXNwb25zZSIsIl9lcnJvciRtZXNzYWdlIiwiX2Vycm9yJG1lc3NhZ2UyIiwiZXJyb3IiLCJyZXNwb25zZSIsInN0YXR1cyIsIkJvb2xlYW4iLCJtZXNzYWdlIiwiaW5jbHVkZXMiLCJtZXJnZUFnZW50c1dpdGhvdXREdXBsaWNhdGVzIiwiYmFzZSIsImV4dHJhIiwiaWRzIiwiU2V0IiwibWFwIiwiaWQiLCJtZXJnZWQiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJmb3JFYWNoIiwiaGFzIiwicHVzaCIsInNvcnRBZ2VudHMiLCJhZ2VudHMiLCJtYWlhQWdlbnRzIiwiZmlsdGVyIiwib3RoZXJBZ2VudHMiLCJhZyIsImZhdm9yaXRlcyIsImlzX2Zhdm9yaXRlIiwic29ydCIsImEiLCJiIiwibmFtZSIsImxvY2FsZUNvbXBhcmUiLCJub25GYXZvcml0ZXMiLCJsZW5ndGgiLCJjb25jYXQiLCJ1c2VHZXRBZ2VudHMiLCJfcmVmIiwic2VsZWN0QWdlbnQiLCJzZWN0aW9uIiwiaGFuZGxlR29Ib21lIiwidXNlciIsIl91c2VTdGF0ZSIsImRhdGEiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkiLCJzZXRBZ2VudHMiLCJfdXNlU3RhdGUzIiwiX3VzZVN0YXRlNCIsImxvYWRpbmciLCJzZXRMb2FkaW5nIiwiX3VzZVN0YXRlNSIsIl91c2VTdGF0ZTYiLCJsb2FkaW5nTW9yZSIsInNldExvYWRpbmdNb3JlIiwiX3VzZVN0YXRlNyIsIl91c2VTdGF0ZTgiLCJzZXRFcnJvciIsIl91c2VTbmFja0Jhck1hbmFnZXIiLCJoYW5kbGVTbmFja2JhckVycm9yIiwiX3VzZVRyYW5zbGF0aW9uIiwidCIsImkxOG4iLCJsYXN0U2VsZWN0ZWRBZ2VudFJlZiIsImlzUmVmcmVzaGluZ1JlZiIsImxhc3RSZXF1ZXN0UmVmIiwidXNlclJvbGVzRGlzYWJsZWQiLCJDT0xMQUJPUkFUT1IiLCJGUkVFTEFOQ0VSIiwiQ0xJRU5UIiwiYWRkQWdlbnQiLCJuZXdBZ2VudCIsIm9wdGlvbnMiLCJwcmV2IiwiYWdlbnRFeGlzdHMiLCJzb21lIiwiZXhpc3RpbmdBZ2VudCIsIm5ld0RhdGEiLCJzb3J0ZWREYXRhIiwiX29iamVjdFNwcmVhZCIsIm5hdmlnYXRlSG9tZSIsInJlbW92ZUFnZW50IiwiYWdlbnRJZCIsInRvU3RyaW5nIiwidXBkYXRlQWdlbnQiLCJ1cGRhdGVkQWdlbnQiLCJ1cGRhdGVkRGF0YSIsInVwZGF0ZUFnZW50RmF2b3JpdGUiLCJzaG91bGRTb3J0IiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwiX3JlZjIiLCJhZ2VudEZpZWxkcyIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllcyIsIl9leGNsdWRlZCIsIm1lcmdlZEFnZW50IiwiZmluYWxEYXRhIiwiZmluZCIsIl9yZWYzIiwiX2V4Y2x1ZGVkMiIsIl9yZWY0IiwiX2V4Y2x1ZGVkMyIsInNvcnRBZ2VudHNMaXN0Iiwic2VsZWN0Rmlyc3RBZ2VudCIsImZpcnN0QWdlbnQiLCJmaW5kSW5kZXgiLCJhZ2VudERhdGEiLCJjdXJyZW50IiwiaGFuZGxlR2V0QWdlbnRzIiwiX3JlZjUiLCJfYXN5bmNUb0dlbmVyYXRvciIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJtYXJrIiwiX2NhbGxlZTQiLCJhZ2VudFRvU2VsZWN0IiwiX2FnZW50VG9TZWxlY3QkaWQiLCJyZXF1ZXN0S2V5IiwiaXNNdWx0aUFnZW50cyIsImFnZW50UGFyc2VkIiwiaGFzTW9yZSIsIm5leHRPZmZzZXQiLCJjYW5GZXRjaENsb25lQWdlbnRzIiwiZmV0Y2hHbG9iYWxDbG9uZUFnZW50cyIsImN1c3RvbUFnZW50cyIsImN1c3RvbUhhc01vcmUiLCJjdXN0b21OZXh0T2Zmc2V0IiwiaXM0MDMiLCJsb2FkQ2xvbmVBZ2VudHMiLCJsb2FkQ3VzdG9tQWdlbnRzIiwicXVlcnlQYXJhbXMiLCJxdWVyeVN0cmluZyIsInBhdGgiLCJnbG9iYWxDbG9uZUFnZW50cyIsIl9yZXNwb25zZUVycm9yJHJlc3BvbiIsIl9yZXNwb25zZUVycm9yJG1lc3NhZyIsIl9yZXNwb25zZUVycm9yJG1lc3NhZzIiLCJpczQwM0Vycm9yIiwiX2FnZW50UGFyc2VkIiwiX2FnZW50UGFyc2VkMiIsIl9sYXN0U2VsZWN0ZWRBZ2VudFJlZiIsIl9sYXN0U2VsZWN0ZWRBZ2VudFJlZjIiLCJhdmFpbGFibGVBZ2VudHMiLCJfYXZhaWxhYmxlQWdlbnRzIiwiX2xhc3RTZWxlY3RlZEFnZW50UmVmMyIsIl9hdmFpbGFibGVBZ2VudHMyIiwiX2F2YWlsYWJsZUFnZW50czMiLCJmaXJzdEF2YWlsYWJsZUFnZW50IiwiX3Q0IiwiX3Q1Iiwid3JhcCIsIl9jb250ZXh0NCIsIm5leHQiLCJhYnJ1cHQiLCJNQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MiLCJNQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTIiwicm9sZV9pZCIsIl9yZWY2IiwiX2NhbGxlZSIsImNsb25lUmVzcG9uc2UiLCJjbG9uZURhdGEiLCJfdCIsIl9jb250ZXh0IiwibGFuZ3VhZ2UiLCJtZXRob2QiLCJzZW50IiwianNvbiIsInN0b3AiLCJhcHBseSIsIl9yZWY3IiwiX2NhbGxlZTIiLCJfbWFpYURhdGEkZGF0YSIsIm1haWFSZXNwb25zZSIsIm1haWFEYXRhIiwiX3QyIiwiX2NvbnRleHQyIiwiX3JlZjgiLCJfY2FsbGVlMyIsImN1c3RvbVJlc3BvbnNlIiwiY3VzdG9tRGF0YSIsIl90MyIsIl9jb250ZXh0MyIsImhhc19tb3JlIiwibmV4dF9vZmZzZXQiLCJQcm9taXNlIiwiYWxsIiwiVVJMU2VhcmNoUGFyYW1zIiwiYXBwZW5kIiwiYWdlbnRUb1JlcXVlc3QiLCJhZ2VudEl0ZW0iLCJFcnJvciIsInNldFRpbWVvdXQiLCJmaW5pc2giLCJfeCIsImxvYWRNb3JlQWdlbnRzIiwiX2NhbGxlZTUiLCJjYW5Mb2FkTW9yZSIsIl90NiIsIl9jb250ZXh0NSIsImV4aXN0aW5nTWFpYUFnZW50cyIsImV4aXN0aW5nSWRzIiwibmV3QWdlbnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlcnZpY2VzL21haWEvQWdlbnRzL2dldEFnZW50cy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLW5lc3RlZC10ZXJuYXJ5ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG5pbXBvcnQgeyB1c2VTdGF0ZSwgdXNlQ2FsbGJhY2ssIHVzZVJlZiB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tICdyZWFjdC1pMThuZXh0J1xuaW1wb3J0IHsgdXNlU25hY2tCYXJNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlU25hY2tCYXJNYW5hZ2VyL3VzZVNuYWNrQmFyTWFuYWdlcidcbmltcG9ydCB7IGZldGNoTWFpYSB9IGZyb20gJy4uL2NsaWVudCdcbmltcG9ydCB7IEFnZW50IH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvYWdlbnQnXG5pbXBvcnQgeyB1c2VVc2VyLCBDT1JVc2VyUm9sZSB9IGZyb20gJy4uLy4uLy4uL2NvbnRleHQvY29yLXVzZXInXG5pbXBvcnQgeyBTZWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29udGV4dC9nbG9iYWwtY29udGV4dCdcbmltcG9ydCB7IG1hcENPUkxhbmcgfSBmcm9tICcuLi8uLi8uLi9sYW5nL3V0aWxzJ1xuXG5jb25zdCBpc01haWFBZ2VudCA9IChhZ2VudDogQWdlbnQpID0+IGFnZW50LnR5cGUgPT09ICdvcmNoZXN0cmF0b3InXG5cbmNvbnN0IGlzTWFya2V0cGxhY2VNYWlha2VyRW5hYmxlZCA9ICgpID0+ICEhd2luZG93Lk1BSUFfTUFSS0VUUExBQ0VfTUFJQUtFUlxuXG5jb25zdCBpczQwM0FnZW50RmV0Y2hFcnJvciA9IChlcnI6IHVua25vd24pOiBib29sZWFuID0+IHtcbiAgY29uc3QgZXJyb3IgPSBlcnIgYXMgeyByZXNwb25zZT86IHsgc3RhdHVzPzogbnVtYmVyIH07IHN0YXR1cz86IG51bWJlcjsgbWVzc2FnZT86IHN0cmluZyB9XG4gIHJldHVybiAoXG4gICAgZXJyb3I/LnJlc3BvbnNlPy5zdGF0dXMgPT09IDQwMyB8fFxuICAgIGVycm9yPy5zdGF0dXMgPT09IDQwMyB8fFxuICAgIEJvb2xlYW4oZXJyb3I/Lm1lc3NhZ2U/LmluY2x1ZGVzKFwiWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byB2aWV3IGFnZW50c1wiKSkgfHxcbiAgICBCb29sZWFuKGVycm9yPy5tZXNzYWdlPy5pbmNsdWRlcygnRmFpbGVkIGZldGNoaW5nIGRhdGEnKSlcbiAgKVxufVxuXG5jb25zdCBtZXJnZUFnZW50c1dpdGhvdXREdXBsaWNhdGVzID0gKGJhc2U6IEFnZW50W10sIGV4dHJhOiBBZ2VudFtdKTogQWdlbnRbXSA9PiB7XG4gIGNvbnN0IGlkcyA9IG5ldyBTZXQoYmFzZS5tYXAoYWdlbnQgPT4gYWdlbnQuaWQpKVxuICBjb25zdCBtZXJnZWQgPSBbLi4uYmFzZV1cbiAgZXh0cmEuZm9yRWFjaChhZ2VudCA9PiB7XG4gICAgaWYgKCFpZHMuaGFzKGFnZW50LmlkKSkgbWVyZ2VkLnB1c2goYWdlbnQpXG4gIH0pXG4gIHJldHVybiBtZXJnZWRcbn1cblxuLyoqXG4gKiBPcmRlbmEgbG9zIGFnZW50ZXM6IE1BSUEgcHJpbWVybyAoc2kgZXhpc3RlKSwgbHVlZ28gZmF2b3JpdG9zIGFsZmFiw6l0aWNhbWVudGUsIGx1ZWdvIG5vIGZhdm9yaXRvcyBhbGZhYsOpdGljYW1lbnRlXG4gKi9cbmNvbnN0IHNvcnRBZ2VudHMgPSAoYWdlbnRzOiBBZ2VudFtdKTogQWdlbnRbXSA9PiB7XG4gIGNvbnN0IG1haWFBZ2VudHMgPSBhZ2VudHMuZmlsdGVyKGlzTWFpYUFnZW50KVxuICBjb25zdCBvdGhlckFnZW50cyA9IGFnZW50cy5maWx0ZXIoYWcgPT4gIWlzTWFpYUFnZW50KGFnKSlcblxuICAvLyBTZXBhcmFyIGZhdm9yaXRvcyB5IG5vIGZhdm9yaXRvc1xuICBjb25zdCBmYXZvcml0ZXMgPSBvdGhlckFnZW50cy5maWx0ZXIoYWcgPT4gYWcuaXNfZmF2b3JpdGUpLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpXG4gIGNvbnN0IG5vbkZhdm9yaXRlcyA9IG90aGVyQWdlbnRzLmZpbHRlcihhZyA9PiAhYWcuaXNfZmF2b3JpdGUpLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpXG5cbiAgcmV0dXJuIG1haWFBZ2VudHMubGVuZ3RoID8gWy4uLm1haWFBZ2VudHMsIC4uLmZhdm9yaXRlcywgLi4ubm9uRmF2b3JpdGVzXSA6IFsuLi5mYXZvcml0ZXMsIC4uLm5vbkZhdm9yaXRlc11cbn1cblxudHlwZSBVc2VHZXRBZ2VudHNQcm9wcyA9IHtcbiAgc2VsZWN0QWdlbnQ6IChhZ2VudDogQWdlbnQpID0+IHZvaWRcbiAgc2VjdGlvbjogU2VjdGlvblxuICBhZ2VudDogQWdlbnQgfCBudWxsXG4gIGhhbmRsZUdvSG9tZTogKCkgPT4gdm9pZFxufVxuXG5leHBvcnQgdHlwZSBBZGRBZ2VudE9wdGlvbnMgPSB7XG4gIC8qKiBQb3IgZGVmZWN0byBgdHJ1ZWAgKGNvbXBvcnRhbWllbnRvIEFCTSkuIFBhc2FyIGBmYWxzZWAgYWwgaW5zZXJ0YXIgYWdlbnRlIGNyZWFkbyBwb3IgY2hhdCBzaW4gY2FtYmlhciBkZSB2aXN0YS4gKi9cbiAgbmF2aWdhdGVIb21lPzogYm9vbGVhblxufVxuXG5leHBvcnQgY29uc3QgdXNlR2V0QWdlbnRzID0gKHsgc2VsZWN0QWdlbnQsIHNlY3Rpb24sIGFnZW50LCBoYW5kbGVHb0hvbWUgfTogVXNlR2V0QWdlbnRzUHJvcHMpID0+IHtcbiAgY29uc3QgdXNlciA9IHVzZVVzZXIoKVxuICBjb25zdCBbYWdlbnRzLCBzZXRBZ2VudHNdID0gdXNlU3RhdGU8eyBkYXRhOiBBZ2VudFtdOyBoYXNfbW9yZT86IGJvb2xlYW47IG5leHRfb2Zmc2V0PzogbnVtYmVyIHwgbnVsbCB9Pih7IGRhdGE6IFtdIH0pXG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbbG9hZGluZ01vcmUsIHNldExvYWRpbmdNb3JlXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbZXJyb3IsIHNldEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IHsgaGFuZGxlU25hY2tiYXJFcnJvciB9ID0gdXNlU25hY2tCYXJNYW5hZ2VyKClcbiAgY29uc3QgeyB0LCBpMThuIH0gPSB1c2VUcmFuc2xhdGlvbignY2hhdF9haV9zZWN0aW9uJylcbiAgY29uc3QgbGFzdFNlbGVjdGVkQWdlbnRSZWYgPSB1c2VSZWY8QWdlbnQgfCBudWxsPihudWxsKVxuICBjb25zdCBpc1JlZnJlc2hpbmdSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIGNvbnN0IGxhc3RSZXF1ZXN0UmVmID0gdXNlUmVmPHN0cmluZyB8IG51bGw+KG51bGwpXG5cbiAgY29uc3QgdXNlclJvbGVzRGlzYWJsZWQgPSBbQ09SVXNlclJvbGUuQ09MTEFCT1JBVE9SLCBDT1JVc2VyUm9sZS5GUkVFTEFOQ0VSLCBDT1JVc2VyUm9sZS5DTElFTlRdXG5cbiAgY29uc3QgYWRkQWdlbnQgPSB1c2VDYWxsYmFjayhcbiAgICAobmV3QWdlbnQ6IEFnZW50LCBvcHRpb25zPzogQWRkQWdlbnRPcHRpb25zKSA9PiB7XG4gICAgICBzZXRBZ2VudHMocHJldiA9PiB7XG4gICAgICAgIC8vIFZlcmlmaWNhciBzaSBlbCBhZ2VudGUgeWEgZXhpc3RlIHBhcmEgZXZpdGFyIGR1cGxpY2Fkb3NcbiAgICAgICAgY29uc3QgYWdlbnRFeGlzdHMgPSBwcmV2LmRhdGEuc29tZShleGlzdGluZ0FnZW50ID0+IGV4aXN0aW5nQWdlbnQuaWQgPT09IG5ld0FnZW50LmlkKVxuICAgICAgICBpZiAoYWdlbnRFeGlzdHMpIHtcbiAgICAgICAgICByZXR1cm4gcHJldlxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld0RhdGEgPSBbLi4ucHJldi5kYXRhLCBuZXdBZ2VudF1cbiAgICAgICAgY29uc3Qgc29ydGVkRGF0YSA9IHNvcnRBZ2VudHMobmV3RGF0YSlcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgIGRhdGE6IHNvcnRlZERhdGEsXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBpZiAob3B0aW9ucz8ubmF2aWdhdGVIb21lICE9PSBmYWxzZSkge1xuICAgICAgICBoYW5kbGVHb0hvbWUoKVxuICAgICAgfVxuICAgIH0sXG4gICAgW2hhbmRsZUdvSG9tZV1cbiAgKVxuXG4gIGNvbnN0IHJlbW92ZUFnZW50ID0gdXNlQ2FsbGJhY2soKGFnZW50SWQ6IG51bWJlciB8IHN0cmluZykgPT4ge1xuICAgIHNldEFnZW50cyhwcmV2ID0+ICh7XG4gICAgICAuLi5wcmV2LFxuICAgICAgZGF0YTogcHJldi5kYXRhLmZpbHRlcihhID0+IGEuaWQgIT09IGFnZW50SWQudG9TdHJpbmcoKSksXG4gICAgfSkpXG4gIH0sIFtdKVxuXG4gIGNvbnN0IHVwZGF0ZUFnZW50ID0gdXNlQ2FsbGJhY2soKHVwZGF0ZWRBZ2VudDogQWdlbnQpID0+IHtcbiAgICBzZXRBZ2VudHMocHJldiA9PiB7XG4gICAgICBjb25zdCB1cGRhdGVkRGF0YSA9IHByZXYuZGF0YS5tYXAoZXhpc3RpbmdBZ2VudCA9PlxuICAgICAgICBleGlzdGluZ0FnZW50LmlkID09PSB1cGRhdGVkQWdlbnQuaWQgPyB1cGRhdGVkQWdlbnQgOiBleGlzdGluZ0FnZW50XG4gICAgICApXG4gICAgICBjb25zdCBzb3J0ZWREYXRhID0gc29ydEFnZW50cyh1cGRhdGVkRGF0YSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnByZXYsXG4gICAgICAgIGRhdGE6IHNvcnRlZERhdGEsXG4gICAgICB9XG4gICAgfSlcbiAgfSwgW10pXG5cbiAgY29uc3QgdXBkYXRlQWdlbnRGYXZvcml0ZSA9IHVzZUNhbGxiYWNrKFxuICAgICh1cGRhdGVkQWdlbnQ6IEFnZW50LCBzaG91bGRTb3J0OiBib29sZWFuID0gZmFsc2UpID0+IHtcbiAgICAgIHNldEFnZW50cyhwcmV2ID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlZERhdGEgPSBwcmV2LmRhdGEubWFwKGV4aXN0aW5nQWdlbnQgPT4ge1xuICAgICAgICAgIGlmIChleGlzdGluZ0FnZW50LmlkID09PSB1cGRhdGVkQWdlbnQuaWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgbWVzc2FnZSwgLi4uYWdlbnRGaWVsZHMgfSA9IHVwZGF0ZWRBZ2VudCBhcyBhbnlcbiAgICAgICAgICAgIGNvbnN0IG1lcmdlZEFnZW50ID0geyAuLi5leGlzdGluZ0FnZW50LCAuLi5hZ2VudEZpZWxkcyB9XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VkQWdlbnRcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGV4aXN0aW5nQWdlbnRcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBTb2xvIG9yZGVuYXIgc2kgc2hvdWxkU29ydCBlcyB0cnVlXG4gICAgICAgIGNvbnN0IGZpbmFsRGF0YSA9IHNob3VsZFNvcnQgPyBzb3J0QWdlbnRzKHVwZGF0ZWREYXRhKSA6IHVwZGF0ZWREYXRhXG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgIGRhdGE6IGZpbmFsRGF0YSxcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgLy8gQWN0dWFsaXphciBlbCBhZ2VudGUgc2VsZWNjaW9uYWRvIHNpIGVzIGVsIHF1ZSBzZSBlc3TDoSBhY3R1YWxpemFuZG9cbiAgICAgIGlmIChhZ2VudD8uaWQgPT09IHVwZGF0ZWRBZ2VudC5pZCkge1xuICAgICAgICBjb25zdCBleGlzdGluZ0FnZW50ID0gYWdlbnRzLmRhdGEuZmluZChhID0+IGEuaWQgPT09IHVwZGF0ZWRBZ2VudC5pZClcbiAgICAgICAgaWYgKGV4aXN0aW5nQWdlbnQpIHtcbiAgICAgICAgICBjb25zdCB7IG1lc3NhZ2UsIC4uLmFnZW50RmllbGRzIH0gPSB1cGRhdGVkQWdlbnQgYXMgYW55XG4gICAgICAgICAgY29uc3QgbWVyZ2VkQWdlbnQgPSB7IC4uLmV4aXN0aW5nQWdlbnQsIC4uLmFnZW50RmllbGRzIH1cbiAgICAgICAgICBzZWxlY3RBZ2VudChtZXJnZWRBZ2VudClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCB7IG1lc3NhZ2UsIC4uLmFnZW50RmllbGRzIH0gPSB1cGRhdGVkQWdlbnQgYXMgYW55XG4gICAgICAgICAgc2VsZWN0QWdlbnQoYWdlbnRGaWVsZHMgYXMgQWdlbnQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFthZ2VudCwgc2VsZWN0QWdlbnQsIGFnZW50cy5kYXRhXVxuICApXG5cbiAgY29uc3Qgc29ydEFnZW50c0xpc3QgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0QWdlbnRzKHByZXYgPT4ge1xuICAgICAgY29uc3Qgc29ydGVkRGF0YSA9IHNvcnRBZ2VudHMocHJldi5kYXRhKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ucHJldixcbiAgICAgICAgZGF0YTogc29ydGVkRGF0YSxcbiAgICAgIH1cbiAgICB9KVxuICB9LCBbXSlcblxuICBjb25zdCBzZWxlY3RGaXJzdEFnZW50ID0gdXNlQ2FsbGJhY2soXG4gICAgKGFnZW50SWQ/OiBzdHJpbmcpID0+IHtcbiAgICAgIGlmIChhZ2VudHMuZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgZmlyc3RBZ2VudCA9IGFnZW50cy5kYXRhLmZpbmRJbmRleChhZ2VudERhdGEgPT4gYWdlbnREYXRhLmlkID09PSBhZ2VudElkKVxuICAgICAgICBsYXN0U2VsZWN0ZWRBZ2VudFJlZi5jdXJyZW50ID0gYWdlbnRzLmRhdGFbZmlyc3RBZ2VudCA9PT0gMCA/IDEgOiAwXVxuICAgICAgICBzZWxlY3RBZ2VudChhZ2VudHMuZGF0YVtmaXJzdEFnZW50ID09PSAwID8gMSA6IDBdKVxuICAgICAgfVxuICAgIH0sXG4gICAgW2FnZW50cy5kYXRhLCBzZWxlY3RBZ2VudF1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZUdldEFnZW50cyA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChhZ2VudFRvU2VsZWN0PzogQWdlbnQpID0+IHtcbiAgICAgIGlmIChpc1JlZnJlc2hpbmdSZWYuY3VycmVudCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVxdWVzdEtleSA9IGFnZW50VG9TZWxlY3Q/LmlkPy50b1N0cmluZygpIHx8ICdkZWZhdWx0J1xuICAgICAgaWYgKGxhc3RSZXF1ZXN0UmVmLmN1cnJlbnQgPT09IHJlcXVlc3RLZXkgJiYgIWxvYWRpbmcpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlzUmVmcmVzaGluZ1JlZi5jdXJyZW50ID0gdHJ1ZVxuICAgICAgbGFzdFJlcXVlc3RSZWYuY3VycmVudCA9IHJlcXVlc3RLZXlcbiAgICAgIHNldExvYWRpbmcodHJ1ZSlcbiAgICAgIHNldEVycm9yKG51bGwpXG5cbiAgICAgIGNvbnN0IGlzTXVsdGlBZ2VudHMgPSAhIXdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MgJiYgISF3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UU1xuXG4gICAgICB0cnkge1xuICAgICAgICBsZXQgYWdlbnRQYXJzZWQ6IEFnZW50W10gPSBbXVxuICAgICAgICBsZXQgaGFzTW9yZSA9IGZhbHNlXG4gICAgICAgIGxldCBuZXh0T2Zmc2V0OiBudW1iZXIgfCBudWxsID0gbnVsbFxuICAgICAgICBjb25zdCBjYW5GZXRjaENsb25lQWdlbnRzID0gIXVzZXJSb2xlc0Rpc2FibGVkLmluY2x1ZGVzKHVzZXI/LnJvbGVfaWQgYXMgQ09SVXNlclJvbGUpXG5cbiAgICAgICAgY29uc3QgZmV0Y2hHbG9iYWxDbG9uZUFnZW50cyA9IGFzeW5jICgpOiBQcm9taXNlPEFnZW50W10+ID0+IHtcbiAgICAgICAgICBpZiAoIWlzTWFya2V0cGxhY2VNYWlha2VyRW5hYmxlZCgpIHx8ICFjYW5GZXRjaENsb25lQWdlbnRzKSByZXR1cm4gW11cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgY2xvbmVSZXNwb25zZSA9IGF3YWl0IGZldGNoTWFpYSh7XG4gICAgICAgICAgICAgIHBhdGg6IGBhZ2VudHM/YWdlbnRfdHlwZT1jbG9uZSZlbnRpdHk9Z2xvYmFsJmxhbmc9JHttYXBDT1JMYW5nKGkxOG4ubGFuZ3VhZ2UpfWAsXG4gICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgY29uc3QgY2xvbmVEYXRhID0gYXdhaXQgY2xvbmVSZXNwb25zZS5qc29uKClcbiAgICAgICAgICAgIHJldHVybiAoY2xvbmVEYXRhLmRhdGEgfHwgW10pLmZpbHRlcigoYWc6IEFnZW50KSA9PiBhZy50eXBlID09PSAnY2xvbmUnKVxuICAgICAgICAgIH0gY2F0Y2ggKGNsb25lRXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpczQwM0FnZW50RmV0Y2hFcnJvcihjbG9uZUVycm9yKSkgcmV0dXJuIFtdXG4gICAgICAgICAgICB0aHJvdyBjbG9uZUVycm9yXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2kgdGllbmUgZmVhdHVyZSBhY2Nlc3MgbXVsdGkgYWdlbnRzLCBoYWNlciBkb3MgcXVlcmllcyAoTWFpYSArIGN1c3RvbSkgZW4gY3VhbHF1aWVyIHNlY2Npw7NuXG4gICAgICAgIGlmIChpc011bHRpQWdlbnRzKSB7XG4gICAgICAgICAgLy8gUXVlcnkgY2xvbmUgKE1haWEpIHkgY3VzdG9tIHNvbiBpbmRlcGVuZGllbnRlcyDihpIgc2UgZGlzcGFyYW4gZW4gcGFyYWxlbG8uXG4gICAgICAgICAgbGV0IGN1c3RvbUFnZW50czogQWdlbnRbXSA9IFtdXG4gICAgICAgICAgbGV0IGN1c3RvbUhhc01vcmUgPSBmYWxzZVxuICAgICAgICAgIGxldCBjdXN0b21OZXh0T2Zmc2V0OiBudW1iZXIgfCBudWxsID0gbnVsbFxuXG4gICAgICAgICAgY29uc3QgaXM0MDMgPSBpczQwM0FnZW50RmV0Y2hFcnJvclxuXG4gICAgICAgICAgbGV0IG1haWFBZ2VudHM6IEFnZW50W10gPSBbXVxuXG4gICAgICAgICAgY29uc3QgbG9hZENsb25lQWdlbnRzID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFjYW5GZXRjaENsb25lQWdlbnRzKSByZXR1cm5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IG1haWFSZXNwb25zZSA9IGF3YWl0IGZldGNoTWFpYSh7XG4gICAgICAgICAgICAgICAgcGF0aDogYGFnZW50cz9hZ2VudF90eXBlPW9yY2hlc3RyYXRvciZsYW5nPSR7bWFwQ09STGFuZyhpMThuLmxhbmd1YWdlKX1gLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIGNvbnN0IG1haWFEYXRhID0gYXdhaXQgbWFpYVJlc3BvbnNlLmpzb24oKVxuICAgICAgICAgICAgICBtYWlhQWdlbnRzID0gbWFpYURhdGEuZGF0YT8uZmlsdGVyKGlzTWFpYUFnZW50KSB8fCBbXVxuICAgICAgICAgICAgICBjb25zdCBnbG9iYWxDbG9uZUFnZW50cyA9IGF3YWl0IGZldGNoR2xvYmFsQ2xvbmVBZ2VudHMoKVxuICAgICAgICAgICAgICBtYWlhQWdlbnRzID0gbWVyZ2VBZ2VudHNXaXRob3V0RHVwbGljYXRlcyhtYWlhQWdlbnRzLCBnbG9iYWxDbG9uZUFnZW50cylcbiAgICAgICAgICAgIH0gY2F0Y2ggKG1haWFFcnJvcjogdW5rbm93bikge1xuICAgICAgICAgICAgICAvLyBTaSBlcyA0MDMsIGNvbnRpbnVhciBzaW4gbG9zIGNsb25lQWdlbnRzOyBzaSBlcyBvdHJvIGVycm9yLCBwcm9wYWdhcmxvXG4gICAgICAgICAgICAgIGlmICghaXM0MDMobWFpYUVycm9yKSkgdGhyb3cgbWFpYUVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgbG9hZEN1c3RvbUFnZW50cyA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGN1c3RvbVJlc3BvbnNlID0gYXdhaXQgZmV0Y2hNYWlhKHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnYWdlbnRzP2FnZW50X3R5cGU9Y3VzdG9tJmxpbWl0PTcmb2Zmc2V0PTAnLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIGNvbnN0IGN1c3RvbURhdGEgPSBhd2FpdCBjdXN0b21SZXNwb25zZS5qc29uKClcbiAgICAgICAgICAgICAgY3VzdG9tQWdlbnRzID0gY3VzdG9tRGF0YS5kYXRhIHx8IFtdXG4gICAgICAgICAgICAgIGN1c3RvbUhhc01vcmUgPSBjdXN0b21EYXRhLmhhc19tb3JlIHx8IGZhbHNlXG4gICAgICAgICAgICAgIGN1c3RvbU5leHRPZmZzZXQgPSBjdXN0b21EYXRhLm5leHRfb2Zmc2V0IHx8IG51bGxcbiAgICAgICAgICAgIH0gY2F0Y2ggKGN1c3RvbUVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgICAgLy8gU2kgZXMgNDAzLCBjb250aW51YXIgc2luIGxvcyBjdXN0b21BZ2VudHMgKHF1ZWRhIGNvbW8gYXJyYXkgdmFjw61vKTsgc2kgbm8sIHByb3BhZ2FybG9cbiAgICAgICAgICAgICAgaWYgKCFpczQwMyhjdXN0b21FcnJvcikpIHRocm93IGN1c3RvbUVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW2xvYWRDbG9uZUFnZW50cygpLCBsb2FkQ3VzdG9tQWdlbnRzKCldKVxuXG4gICAgICAgICAgLy8gQ29tYmluYXI6IGFnZW50ZXMgY2xvbmUgcHJpbWVybywgbHVlZ28gbG9zIGN1c3RvbSAoc2kgZXhpc3RlbilcbiAgICAgICAgICAvLyBTaSBlbCB1c3VhcmlvIHRpZW5lIHVuIHJvbCBkZXNoYWJpbGl0YWRvLCBubyBpbmNsdWlyIGNsb25lQWdlbnRzXG4gICAgICAgICAgaWYgKCFjYW5GZXRjaENsb25lQWdlbnRzKSB7XG4gICAgICAgICAgICAvLyBSb2wgc2luIGFjY2VzbyBhIGNsb25lcyAocC4gZWouIGNvbGFib3JhZG9yIGZ1ZXJhIGRlbCBwaWxvdG8pOiBzb2xvIGN1c3RvbUFnZW50c1xuICAgICAgICAgICAgLy8gU2kgY3VzdG9tQWdlbnRzIGVzdMOhIHZhY8OtbyAocG9yIDQwMyksIGFnZW50UGFyc2VkIHNlcsOhIFtdXG4gICAgICAgICAgICBhZ2VudFBhcnNlZCA9IGN1c3RvbUFnZW50c1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhZ2VudFBhcnNlZCA9IG1haWFBZ2VudHMubGVuZ3RoID8gWy4uLm1haWFBZ2VudHMsIC4uLmN1c3RvbUFnZW50c10gOiBjdXN0b21BZ2VudHNcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gT3JkZW5hcjogTWFpYSBwcmltZXJvLCBsdWVnbyBmYXZvcml0b3MgYWxmYWLDqXRpY2FtZW50ZSwgbHVlZ28gbm8gZmF2b3JpdG9zIGFsZmFiw6l0aWNhbWVudGVcbiAgICAgICAgICBhZ2VudFBhcnNlZCA9IHNvcnRBZ2VudHMoYWdlbnRQYXJzZWQpXG4gICAgICAgICAgaGFzTW9yZSA9IGN1c3RvbUhhc01vcmVcbiAgICAgICAgICBuZXh0T2Zmc2V0ID0gY3VzdG9tTmV4dE9mZnNldFxuXG4gICAgICAgICAgc2V0QWdlbnRzKHtcbiAgICAgICAgICAgIGRhdGE6IGFnZW50UGFyc2VkLFxuICAgICAgICAgICAgaGFzX21vcmU6IGhhc01vcmUsXG4gICAgICAgICAgICBuZXh0X29mZnNldDogbmV4dE9mZnNldCxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgLy8gU2kgbm8gaGF5IGFnZW50ZXMgZGVzcHXDqXMgZGUgcHJvY2VzYXIgbGFzIHF1ZXJpZXMsIGxpbXBpYXIgZWwgZXJyb3JcbiAgICAgICAgICBpZiAoYWdlbnRQYXJzZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBzZXRFcnJvcihudWxsKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBMw7NnaWNhIHBhcmEgcHJvamVjdCwgY2xpZW50IG8gaGVhZGVyIHNpbiBtdWx0aUFnZW50cyAobWlzbW8gY3JpdGVyaW8gZGUgb3JkZW4gcHJvamVjdC9jbGllbnQ7IGhlYWRlciBhw7FhZGUgcGFnaW5hY2nDs24pXG4gICAgICAgICAgY29uc3QgcXVlcnlQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKClcbiAgICAgICAgICBpZiAoc2VjdGlvbiA9PT0gJ3Byb2plY3QnIHx8IHNlY3Rpb24gPT09ICdjbGllbnQnIHx8IHNlY3Rpb24gPT09ICdoZWFkZXInIHx8IHNlY3Rpb24gPT09ICd0YXNrJykge1xuICAgICAgICAgICAgcXVlcnlQYXJhbXMuYXBwZW5kKCdhZ2VudF90eXBlJywgJ29yY2hlc3RyYXRvcicpXG4gICAgICAgICAgICBxdWVyeVBhcmFtcy5hcHBlbmQoJ2xhbmcnLCBtYXBDT1JMYW5nKGkxOG4ubGFuZ3VhZ2UpKVxuICAgICAgICAgICAgaWYgKHNlY3Rpb24gPT09ICdoZWFkZXInKSB7XG4gICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zLmFwcGVuZCgnbGltaXQnLCAnNycpXG4gICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zLmFwcGVuZCgnb2Zmc2V0JywgJzAnKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gcXVlcnlQYXJhbXMudG9TdHJpbmcoKVxuICAgICAgICAgIGNvbnN0IHBhdGggPSBgYWdlbnRzJHtxdWVyeVN0cmluZyA/IGA/JHtxdWVyeVN0cmluZ31gIDogJyd9YFxuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hNYWlhKHtcbiAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgICAgICAgICAgIC8vIGRhdGEuZGF0YSB5YSBjb250aWVuZSBlbC9sb3MgYWdlbnRlcyBvcnF1ZXN0YWRvcmVzIGRlIGxhIHF1ZXJ5IGFnZW50X3R5cGU9b3JjaGVzdHJhdG9yXG4gICAgICAgICAgICBhZ2VudFBhcnNlZCA9IGRhdGEuZGF0YSB8fCBbXVxuICAgICAgICAgICAgY29uc3QgZ2xvYmFsQ2xvbmVBZ2VudHMgPSBhd2FpdCBmZXRjaEdsb2JhbENsb25lQWdlbnRzKClcbiAgICAgICAgICAgIGFnZW50UGFyc2VkID0gbWVyZ2VBZ2VudHNXaXRob3V0RHVwbGljYXRlcyhhZ2VudFBhcnNlZCwgZ2xvYmFsQ2xvbmVBZ2VudHMpXG4gICAgICAgICAgICAvLyBPcmRlbmFyOiBNYWlhIHByaW1lcm8sIGx1ZWdvIGZhdm9yaXRvcyBhbGZhYsOpdGljYW1lbnRlLCBsdWVnbyBubyBmYXZvcml0b3MgYWxmYWLDqXRpY2FtZW50ZVxuICAgICAgICAgICAgYWdlbnRQYXJzZWQgPSBzb3J0QWdlbnRzKGFnZW50UGFyc2VkKVxuICAgICAgICAgICAgaGFzTW9yZSA9IGRhdGEuaGFzX21vcmVcbiAgICAgICAgICAgIG5leHRPZmZzZXQgPSBkYXRhLm5leHRfb2Zmc2V0XG5cbiAgICAgICAgICAgIHNldEFnZW50cyh7XG4gICAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICAgIGRhdGE6IGFnZW50UGFyc2VkLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9IGNhdGNoIChyZXNwb25zZUVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgIC8vIFZlcmlmaWNhciBzaSBlbCBlcnJvciBlcyA0MDNcbiAgICAgICAgICAgIC8vIGZldGNoQ09SIHB1ZWRlIGxhbnphciBkaWZlcmVudGVzIHRpcG9zIGRlIGVycm9yZXM6XG4gICAgICAgICAgICAvLyAxLiBFcnJvciBjb24gZXJyb3JEYXRhLmRldGFpbCBzaSBpbmNsdXllICdBY2Nlc3MgZGVuaWVkJ1xuICAgICAgICAgICAgLy8gMi4gRXJyb3IgZ2Vuw6lyaWNvICdGYWlsZWQgZmV0Y2hpbmcgZGF0YScgc2kgZXMgNDAzIHBlcm8gbm8gaW5jbHV5ZSAnQWNjZXNzIGRlbmllZCdcbiAgICAgICAgICAgIC8vIDMuIE5lY2VzaXRhbW9zIHZlcmlmaWNhciBlbCBzdGF0dXMgY29kZSBzaSBlc3TDoSBkaXNwb25pYmxlXG4gICAgICAgICAgICBjb25zdCBpczQwM0Vycm9yID1cbiAgICAgICAgICAgICAgcmVzcG9uc2VFcnJvcj8ucmVzcG9uc2U/LnN0YXR1cyA9PT0gNDAzIHx8XG4gICAgICAgICAgICAgIHJlc3BvbnNlRXJyb3I/LnN0YXR1cyA9PT0gNDAzIHx8XG4gICAgICAgICAgICAgIHJlc3BvbnNlRXJyb3I/Lm1lc3NhZ2U/LmluY2x1ZGVzKFwiWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byB2aWV3IGFnZW50c1wiKSB8fFxuICAgICAgICAgICAgICByZXNwb25zZUVycm9yPy5tZXNzYWdlPy5pbmNsdWRlcygnRmFpbGVkIGZldGNoaW5nIGRhdGEnKSAvLyBmZXRjaENPUiBsYW56YSBlc3RvIHBhcmEgNDAzIHNpbiAnQWNjZXNzIGRlbmllZCdcblxuICAgICAgICAgICAgaWYgKGlzNDAzRXJyb3IpIHtcbiAgICAgICAgICAgICAgLy8gU2kgZXMgNDAzLCBlc3RhYmxlY2VyIGFnZW50ZXMgdmFjw61vcyB5IGNvbnRpbnVhclxuICAgICAgICAgICAgICBzZXRBZ2VudHMoe1xuICAgICAgICAgICAgICAgIGRhdGE6IFtdLFxuICAgICAgICAgICAgICAgIGhhc19tb3JlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBuZXh0X29mZnNldDogbnVsbCxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgc2V0RXJyb3IobnVsbClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFNpIGVzIG90cm8gZXJyb3IsIGxhbnphcmxvXG4gICAgICAgICAgICAgIHRocm93IHJlc3BvbnNlRXJyb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMw7NnaWNhIGRlIHNlbGVjdCBhZ2VudCAtIFNvbG8gc2VsZWNjaW9uYXIgc2kgaGF5IGFnZW50ZXMgZGlzcG9uaWJsZXNcbiAgICAgICAgaWYgKGFnZW50UGFyc2VkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBpZiAoYWdlbnRUb1NlbGVjdCAmJiBhZ2VudFBhcnNlZC5maW5kKChhZ2VudFRvUmVxdWVzdDogQWdlbnQpID0+IGFnZW50VG9SZXF1ZXN0LmlkID09PSBhZ2VudFRvU2VsZWN0LmlkKSkge1xuICAgICAgICAgICAgaWYgKGxhc3RTZWxlY3RlZEFnZW50UmVmLmN1cnJlbnQ/LmlkICE9PSBhZ2VudFRvU2VsZWN0LmlkKSB7XG4gICAgICAgICAgICAgIGxhc3RTZWxlY3RlZEFnZW50UmVmLmN1cnJlbnQgPSBhZ2VudFRvU2VsZWN0XG4gICAgICAgICAgICAgIHNlbGVjdEFnZW50KGFnZW50VG9TZWxlY3QpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChhZ2VudFBhcnNlZD8uWzBdICYmICghYWdlbnQgfHwgIWFnZW50UGFyc2VkLmZpbmQoKGE6IEFnZW50KSA9PiBhLmlkID09PSBhZ2VudC5pZCkpKSB7XG4gICAgICAgICAgICBjb25zdCBhdmFpbGFibGVBZ2VudHMgPVxuICAgICAgICAgICAgICB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTICYmICF1c2VyUm9sZXNEaXNhYmxlZC5pbmNsdWRlcyh1c2VyLnJvbGVfaWQpXG4gICAgICAgICAgICAgICAgPyBhZ2VudFBhcnNlZFxuICAgICAgICAgICAgICAgIDogYWdlbnRQYXJzZWQuZmlsdGVyKChhZ2VudEl0ZW06IEFnZW50KSA9PiAhaXNNYWlhQWdlbnQoYWdlbnRJdGVtKSlcblxuICAgICAgICAgICAgY29uc3QgW2ZpcnN0QWdlbnRdID0gYXZhaWxhYmxlQWdlbnRzXG4gICAgICAgICAgICBpZiAoZmlyc3RBZ2VudCAmJiBsYXN0U2VsZWN0ZWRBZ2VudFJlZi5jdXJyZW50Py5pZCAhPT0gZmlyc3RBZ2VudC5pZCkge1xuICAgICAgICAgICAgICBsYXN0U2VsZWN0ZWRBZ2VudFJlZi5jdXJyZW50ID0gZmlyc3RBZ2VudFxuICAgICAgICAgICAgICBzZWxlY3RBZ2VudChmaXJzdEFnZW50KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoYWdlbnRUb1NlbGVjdCAmJiBhZ2VudFBhcnNlZD8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBhdmFpbGFibGVBZ2VudHMgPVxuICAgICAgICAgICAgICB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTICYmICF1c2VyUm9sZXNEaXNhYmxlZC5pbmNsdWRlcyh1c2VyLnJvbGVfaWQpXG4gICAgICAgICAgICAgICAgPyBhZ2VudFBhcnNlZFxuICAgICAgICAgICAgICAgIDogYWdlbnRQYXJzZWQuZmlsdGVyKChhZ2VudEl0ZW06IEFnZW50KSA9PiAhaXNNYWlhQWdlbnQoYWdlbnRJdGVtKSlcblxuICAgICAgICAgICAgY29uc3QgW2ZpcnN0QXZhaWxhYmxlQWdlbnRdID0gYXZhaWxhYmxlQWdlbnRzXG4gICAgICAgICAgICBpZiAoZmlyc3RBdmFpbGFibGVBZ2VudCAmJiBsYXN0U2VsZWN0ZWRBZ2VudFJlZi5jdXJyZW50Py5pZCAhPT0gZmlyc3RBdmFpbGFibGVBZ2VudC5pZCkge1xuICAgICAgICAgICAgICBsYXN0U2VsZWN0ZWRBZ2VudFJlZi5jdXJyZW50ID0gZmlyc3RBdmFpbGFibGVBZ2VudFxuICAgICAgICAgICAgICBzZWxlY3RBZ2VudChmaXJzdEF2YWlsYWJsZUFnZW50KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHNldExvYWRpbmcoZmFsc2UpXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgc2V0RXJyb3IoZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6ICdBbiB1bmtub3duIGVycm9yIG9jY3VycmVkJylcbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSlcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlzUmVmcmVzaGluZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgaWYgKCFpc1JlZnJlc2hpbmdSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgbGFzdFJlcXVlc3RSZWYuY3VycmVudCA9IG51bGxcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDEwMClcbiAgICAgIH1cbiAgICB9LFxuICAgIFtzZWxlY3RBZ2VudCwgc2VjdGlvbiwgYWdlbnQsIGxvYWRpbmddXG4gIClcblxuICBjb25zdCBsb2FkTW9yZUFnZW50cyA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpc011bHRpQWdlbnRzID0gISF3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTICYmICEhd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFNcbiAgICAvLyBDYXJnYXIgbcOhczogZW4gaGVhZGVyIHNpZW1wcmU7IGVuIHByb2plY3Qgc29sbyBzaSBpc011bHRpQWdlbnRzIChwb3JxdWUgc29sbyBlbnRvbmNlcyBoYXkgcGFnaW5hY2nDs24gZGUgY3VzdG9tKVxuICAgIGNvbnN0IGNhbkxvYWRNb3JlID0gc2VjdGlvbiA9PT0gJ2hlYWRlcicgfHwgaXNNdWx0aUFnZW50c1xuICAgIGlmICghY2FuTG9hZE1vcmUgfHwgIWFnZW50cy5oYXNfbW9yZSB8fCAhYWdlbnRzLm5leHRfb2Zmc2V0IHx8IGxvYWRpbmdNb3JlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBzZXRMb2FkaW5nTW9yZSh0cnVlKVxuICAgIHNldEVycm9yKG51bGwpXG5cbiAgICB0cnkge1xuICAgICAgbGV0IHBhdGg6IHN0cmluZ1xuXG4gICAgICAvLyBTaSBlcyBtdWx0aUFnZW50cywgc29sbyBjYXJnYXIgYWdlbnRzIGN1c3RvbSAoTWFpYSB5YSBlc3TDoSBjYXJnYWRvKVxuICAgICAgaWYgKGlzTXVsdGlBZ2VudHMpIHtcbiAgICAgICAgLy8gTWFudGVuZXIgY2FudGlkYWQgaW1wYXIgZGUgY2FyZHM6IHByaW1lcmEgY2FyZ2EgNywgc2lndWllbnRlcyArNiAoNywgMTMsIDE5LCAuLi4pXG4gICAgICAgIHBhdGggPSBgYWdlbnRzP2FnZW50X3R5cGU9Y3VzdG9tJmxpbWl0PTYmb2Zmc2V0PSR7YWdlbnRzLm5leHRfb2Zmc2V0fWBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFNpIG5vIGVzIG11bHRpQWdlbnRzLCBjYXJnYXIgbcOhcyBhZ2VudGVzIG9ycXVlc3RhZG9yZXMgKE1BSUEpXG4gICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpXG4gICAgICAgIHF1ZXJ5UGFyYW1zLmFwcGVuZCgnYWdlbnRfdHlwZScsICdvcmNoZXN0cmF0b3InKVxuICAgICAgICBxdWVyeVBhcmFtcy5hcHBlbmQoJ2xhbmcnLCBtYXBDT1JMYW5nKGkxOG4ubGFuZ3VhZ2UpKVxuICAgICAgICBxdWVyeVBhcmFtcy5hcHBlbmQoJ2xpbWl0JywgJzcnKVxuICAgICAgICBxdWVyeVBhcmFtcy5hcHBlbmQoJ29mZnNldCcsIGFnZW50cy5uZXh0X29mZnNldC50b1N0cmluZygpKVxuICAgICAgICBwYXRoID0gYGFnZW50cz8ke3F1ZXJ5UGFyYW1zLnRvU3RyaW5nKCl9YFxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoTWFpYSh7XG4gICAgICAgIHBhdGgsXG4gICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICB9KVxuXG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG5cbiAgICAgIC8vIEFjdW11bGFyIGFnZW50ZXMsIGV4Y2x1eWVuZG8gZHVwbGljYWRvc1xuICAgICAgc2V0QWdlbnRzKHByZXYgPT4ge1xuICAgICAgICBpZiAoaXNNdWx0aUFnZW50cykge1xuICAgICAgICAgIC8vIEzDs2dpY2EgcGFyYSBtdWx0aUFnZW50czogc2VwYXJhciBNQUlBIHkgY3VzdG9tXG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdNYWlhQWdlbnRzID0gcHJldi5kYXRhLmZpbHRlcihpc01haWFBZ2VudClcblxuICAgICAgICAgIC8vIE9idGVuZXIgSURzIGV4aXN0ZW50ZXMgKGV4Y2x1eWVuZG8gTUFJQSlcbiAgICAgICAgICBjb25zdCBleGlzdGluZ0lkcyA9IG5ldyBTZXQocHJldi5kYXRhLmZpbHRlcigoYWc6IEFnZW50KSA9PiAhaXNNYWlhQWdlbnQoYWcpKS5tYXAoKGFnOiBBZ2VudCkgPT4gYWcuaWQpKVxuXG4gICAgICAgICAgLy8gRmlsdHJhciBudWV2b3MgYWdlbnRzIHF1ZSBubyBlc3TDqW4geWEgZW4gbGEgbGlzdGEgKHkgcXVlIG5vIHNlYW4gTUFJQSlcbiAgICAgICAgICBjb25zdCBuZXdBZ2VudHMgPSBkYXRhLmRhdGEuZmlsdGVyKChhZzogQWdlbnQpID0+ICFpc01haWFBZ2VudChhZykgJiYgIWV4aXN0aW5nSWRzLmhhcyhhZy5pZCkpXG5cbiAgICAgICAgICBjb25zdCBuZXdEYXRhID0gZXhpc3RpbmdNYWlhQWdlbnRzLmxlbmd0aFxuICAgICAgICAgICAgPyBbLi4uZXhpc3RpbmdNYWlhQWdlbnRzLCAuLi5wcmV2LmRhdGEuZmlsdGVyKChhZzogQWdlbnQpID0+ICFpc01haWFBZ2VudChhZykpLCAuLi5uZXdBZ2VudHNdXG4gICAgICAgICAgICA6IFsuLi5wcmV2LmRhdGEuZmlsdGVyKChhZzogQWdlbnQpID0+ICFpc01haWFBZ2VudChhZykpLCAuLi5uZXdBZ2VudHNdXG5cbiAgICAgICAgICAvLyBPcmRlbmFyOiBNYWlhIHByaW1lcm8sIGx1ZWdvIGZhdm9yaXRvcyBhbGZhYsOpdGljYW1lbnRlLCBsdWVnbyBubyBmYXZvcml0b3MgYWxmYWLDqXRpY2FtZW50ZVxuICAgICAgICAgIGNvbnN0IHNvcnRlZERhdGEgPSBzb3J0QWdlbnRzKG5ld0RhdGEpXG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF0YTogc29ydGVkRGF0YSxcbiAgICAgICAgICAgIGhhc19tb3JlOiBkYXRhLmhhc19tb3JlLFxuICAgICAgICAgICAgbmV4dF9vZmZzZXQ6IGRhdGEubmV4dF9vZmZzZXQsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEzDs2dpY2EgcGFyYSAhaXNNdWx0aUFnZW50czogYWdyZWdhciBldml0YW5kbyBkdXBsaWNhZG9zXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldChwcmV2LmRhdGEubWFwKChhZzogQWdlbnQpID0+IGFnLmlkKSlcbiAgICAgICAgY29uc3QgbmV3QWdlbnRzID0gKGRhdGEuZGF0YSB8fCBbXSkuZmlsdGVyKChhZzogQWdlbnQpID0+ICFleGlzdGluZ0lkcy5oYXMoYWcuaWQpKVxuICAgICAgICBjb25zdCBuZXdEYXRhID0gWy4uLnByZXYuZGF0YSwgLi4ubmV3QWdlbnRzXVxuXG4gICAgICAgIC8vIE9yZGVuYXI6IE1haWEgcHJpbWVybywgbHVlZ28gZmF2b3JpdG9zIGFsZmFiw6l0aWNhbWVudGUsIGx1ZWdvIG5vIGZhdm9yaXRvcyBhbGZhYsOpdGljYW1lbnRlXG4gICAgICAgIGNvbnN0IHNvcnRlZERhdGEgPSBzb3J0QWdlbnRzKG5ld0RhdGEpXG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiBzb3J0ZWREYXRhLFxuICAgICAgICAgIGhhc19tb3JlOiBkYXRhLmhhc19tb3JlLFxuICAgICAgICAgIG5leHRfb2Zmc2V0OiBkYXRhLm5leHRfb2Zmc2V0LFxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBzZXRMb2FkaW5nTW9yZShmYWxzZSlcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGhhbmRsZVNuYWNrYmFyRXJyb3IodCgnc25hY2tiYXIubG9hZE1vcmVBZ2VudHMuZXJyb3InKSlcbiAgICAgIHNldExvYWRpbmdNb3JlKGZhbHNlKVxuICAgIH1cbiAgfSwgW3NlY3Rpb24sIGFnZW50cy5oYXNfbW9yZSwgYWdlbnRzLm5leHRfb2Zmc2V0LCBsb2FkaW5nTW9yZSwgaTE4bi5sYW5ndWFnZV0pXG5cbiAgcmV0dXJuIHtcbiAgICBhZ2VudHMsXG4gICAgbG9hZGluZyxcbiAgICBsb2FkaW5nTW9yZSxcbiAgICBlcnJvcixcbiAgICBoYW5kbGVHZXRBZ2VudHMsXG4gICAgbG9hZE1vcmVBZ2VudHMsXG4gICAgYWRkQWdlbnQsXG4gICAgcmVtb3ZlQWdlbnQsXG4gICAgdXBkYXRlQWdlbnQsXG4gICAgdXBkYXRlQWdlbnRGYXZvcml0ZSxcbiAgICBzZWxlY3RGaXJzdEFnZW50LFxuICAgIHNvcnRBZ2VudHNMaXN0LFxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTQSxRQUFRLEVBQUVDLFdBQVcsRUFBRUMsTUFBTSxRQUFRLE9BQU87QUFDckQsU0FBU0MsY0FBYyxRQUFR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
|
|
665
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VTdGF0ZSIsInVzZUNhbGxiYWNrIiwidXNlUmVmIiwidXNlVHJhbnNsYXRpb24iLCJ1c2VTbmFja0Jhck1hbmFnZXIiLCJmZXRjaE1haWEiLCJ1c2VVc2VyIiwiaXNNYWlhQ2xvbmVBZ2VudHNSb2xlQmxvY2tlZCIsIm1hcENPUkxhbmciLCJzb3J0QWdlbnRzIiwiYWdlbnRzIiwiY2xvbmVBZ2VudHMiLCJmaWx0ZXIiLCJhZyIsInR5cGUiLCJvdGhlckFnZW50cyIsImZhdm9yaXRlcyIsImlzX2Zhdm9yaXRlIiwic29ydCIsImEiLCJiIiwibmFtZSIsImxvY2FsZUNvbXBhcmUiLCJub25GYXZvcml0ZXMiLCJsZW5ndGgiLCJjb25jYXQiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJ1c2VHZXRBZ2VudHMiLCJfcmVmIiwic2VsZWN0QWdlbnQiLCJzZWN0aW9uIiwiYWdlbnQiLCJoYW5kbGVHb0hvbWUiLCJ1c2VyIiwiX3VzZVN0YXRlIiwiZGF0YSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheSIsInNldEFnZW50cyIsIl91c2VTdGF0ZTMiLCJfdXNlU3RhdGU0IiwibG9hZGluZyIsInNldExvYWRpbmciLCJfdXNlU3RhdGU1IiwiX3VzZVN0YXRlNiIsImxvYWRpbmdNb3JlIiwic2V0TG9hZGluZ01vcmUiLCJfdXNlU3RhdGU3IiwiX3VzZVN0YXRlOCIsInNlYXJjaExvYWRpbmciLCJzZXRTZWFyY2hMb2FkaW5nIiwiX3VzZVN0YXRlOSIsIl91c2VTdGF0ZTAiLCJlcnJvciIsInNldEVycm9yIiwiX3VzZVNuYWNrQmFyTWFuYWdlciIsImhhbmRsZVNuYWNrYmFyRXJyb3IiLCJfdXNlVHJhbnNsYXRpb24iLCJ0IiwiaTE4biIsImxhc3RTZWxlY3RlZEFnZW50UmVmIiwiaXNSZWZyZXNoaW5nUmVmIiwibGFzdFJlcXVlc3RSZWYiLCJhZ2VudHNSZWYiLCJwcmVTZWFyY2hBZ2VudHNSZWYiLCJjdXJyZW50IiwiY2FuRmV0Y2hDbG9uZUFnZW50cyIsImFkZEFnZW50IiwibmV3QWdlbnQiLCJvcHRpb25zIiwicHJldiIsImFnZW50RXhpc3RzIiwic29tZSIsImV4aXN0aW5nQWdlbnQiLCJpZCIsIm5ld0RhdGEiLCJzb3J0ZWREYXRhIiwiX29iamVjdFNwcmVhZCIsIm5hdmlnYXRlSG9tZSIsInJlbW92ZUFnZW50IiwiYWdlbnRJZCIsInRvU3RyaW5nIiwidXBkYXRlQWdlbnQiLCJ1cGRhdGVkQWdlbnQiLCJ1cGRhdGVkRGF0YSIsIm1hcCIsInVwZGF0ZUFnZW50RmF2b3JpdGUiLCJzaG91bGRTb3J0IiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwiX3JlZjIiLCJtZXNzYWdlIiwiYWdlbnRGaWVsZHMiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMiLCJfZXhjbHVkZWQiLCJtZXJnZWRBZ2VudCIsImZpbmFsRGF0YSIsImZpbmQiLCJfcmVmMyIsIl9leGNsdWRlZDIiLCJfcmVmNCIsIl9leGNsdWRlZDMiLCJzb3J0QWdlbnRzTGlzdCIsInNlbGVjdEZpcnN0QWdlbnQiLCJmaXJzdEFnZW50IiwiZmluZEluZGV4IiwiYWdlbnREYXRhIiwiaGFuZGxlR2V0QWdlbnRzIiwiX3JlZjUiLCJfYXN5bmNUb0dlbmVyYXRvciIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJtYXJrIiwiX2NhbGxlZTMiLCJhZ2VudFRvU2VsZWN0IiwiX2FnZW50VG9TZWxlY3QkaWQiLCJyZXF1ZXN0S2V5IiwiaXNNdWx0aUFnZW50cyIsImFnZW50UGFyc2VkIiwiaGFzTW9yZSIsIm5leHRPZmZzZXQiLCJjdXN0b21BZ2VudHMiLCJjdXN0b21IYXNNb3JlIiwiY3VzdG9tTmV4dE9mZnNldCIsImlzNDAzIiwibG9hZENsb25lQWdlbnRzIiwibG9hZEN1c3RvbUFnZW50cyIsInNob3VsZFJlcXVlc3RDbG9uZUFnZW50cyIsInF1ZXJ5UGFyYW1zIiwicGF0aCIsInJlc3BvbnNlIiwiX3Jlc3BvbnNlRXJyb3IkcmVzcG9uIiwiX3Jlc3BvbnNlRXJyb3IkbWVzc2FnIiwiX3Jlc3BvbnNlRXJyb3IkbWVzc2FnMiIsImlzNDAzRXJyb3IiLCJfYWdlbnRQYXJzZWQiLCJfYWdlbnRQYXJzZWQyIiwiX2xhc3RTZWxlY3RlZEFnZW50UmVmIiwiX2xhc3RTZWxlY3RlZEFnZW50UmVmMiIsImF2YWlsYWJsZUFnZW50cyIsIl9hdmFpbGFibGVBZ2VudHMiLCJfbGFzdFNlbGVjdGVkQWdlbnRSZWYzIiwiX2F2YWlsYWJsZUFnZW50czIiLCJfYXZhaWxhYmxlQWdlbnRzMyIsImZpcnN0QXZhaWxhYmxlQWdlbnQiLCJfdDMiLCJfdDQiLCJ3cmFwIiwiX2NvbnRleHQzIiwibmV4dCIsImFicnVwdCIsIndpbmRvdyIsIk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTUyIsIk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMiLCJlcnIiLCJfZXJyJHJlc3BvbnNlIiwiX2VyciRtZXNzYWdlIiwiX2VyciRtZXNzYWdlMiIsInN0YXR1cyIsImluY2x1ZGVzIiwiX3JlZjYiLCJfY2FsbGVlIiwiX21haWFEYXRhJGRhdGEiLCJvcmRlclBhcmFtIiwibWFpYVJlc3BvbnNlIiwibWFpYURhdGEiLCJfdCIsIl9jb250ZXh0IiwibGFuZ3VhZ2UiLCJtZXRob2QiLCJzZW50IiwianNvbiIsInN0b3AiLCJhcHBseSIsIl9yZWY3IiwiX2NhbGxlZTIiLCJjdXN0b21SZXNwb25zZSIsImN1c3RvbURhdGEiLCJfdDIiLCJfY29udGV4dDIiLCJoYXNfbW9yZSIsIm5leHRfb2Zmc2V0IiwiUHJvbWlzZSIsImFsbCIsIlVSTFNlYXJjaFBhcmFtcyIsImFwcGVuZCIsImFnZW50VG9SZXF1ZXN0IiwiYWdlbnRJdGVtIiwiRXJyb3IiLCJzZXRUaW1lb3V0IiwiZmluaXNoIiwiX3giLCJzZWFyY2hDdXN0b21BZ2VudHMiLCJfcmVmOCIsIl9jYWxsZWU0IiwicXVlcnkiLCJfdDUiLCJfY29udGV4dDQiLCJlbmNvZGVVUklDb21wb25lbnQiLCJjdXN0b21SZXN1bHRzIiwiX3gyIiwibG9hZE1vcmVBZ2VudHMiLCJfY2FsbGVlNSIsImNhbkxvYWRNb3JlIiwiX3Q2IiwiX2NvbnRleHQ1IiwiZXhpc3RpbmdDbG9uZUFnZW50cyIsImV4aXN0aW5nSWRzIiwiU2V0IiwibmV3QWdlbnRzIiwiaGFzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlcnZpY2VzL21haWEvQWdlbnRzL2dldEFnZW50cy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLW5lc3RlZC10ZXJuYXJ5ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG5pbXBvcnQgeyB1c2VTdGF0ZSwgdXNlQ2FsbGJhY2ssIHVzZVJlZiB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tICdyZWFjdC1pMThuZXh0J1xuaW1wb3J0IHsgdXNlU25hY2tCYXJNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlU25hY2tCYXJNYW5hZ2VyL3VzZVNuYWNrQmFyTWFuYWdlcidcbmltcG9ydCB7IGZldGNoTWFpYSB9IGZyb20gJy4uL2NsaWVudCdcbmltcG9ydCB7IEFnZW50IH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvYWdlbnQnXG5pbXBvcnQgeyB1c2VVc2VyIH0gZnJvbSAnLi4vLi4vLi4vY29udGV4dC9jb3ItdXNlcidcbmltcG9ydCB7IGlzTWFpYUNsb25lQWdlbnRzUm9sZUJsb2NrZWQgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvbWFpYVRhc2tQYW5lbEFjY2VzcydcbmltcG9ydCB7IG1hcENPUkxhbmcgfSBmcm9tICcuLi8uLi8uLi9sYW5nL3V0aWxzJ1xuXG4vKipcbiAqIE9yZGVuYSBsb3MgYWdlbnRlczogYWdlbnRlcyBjbG9uZSBwcmltZXJvIChzaSBleGlzdGVuKSwgbHVlZ28gZmF2b3JpdG9zIGFsZmFiw6l0aWNhbWVudGUsIGx1ZWdvIG5vIGZhdm9yaXRvcyBhbGZhYsOpdGljYW1lbnRlXG4gKi9cbmNvbnN0IHNvcnRBZ2VudHMgPSAoYWdlbnRzOiBBZ2VudFtdKTogQWdlbnRbXSA9PiB7XG4gIC8vIFNlcGFyYXIgYWdlbnRlcyBjbG9uZSBkZWwgcmVzdG9cbiAgY29uc3QgY2xvbmVBZ2VudHMgPSBhZ2VudHMuZmlsdGVyKGFnID0+IGFnLnR5cGUgPT09ICdjbG9uZScpXG4gIGNvbnN0IG90aGVyQWdlbnRzID0gYWdlbnRzLmZpbHRlcihhZyA9PiBhZy50eXBlICE9PSAnY2xvbmUnKVxuXG4gIC8vIFNlcGFyYXIgZmF2b3JpdG9zIHkgbm8gZmF2b3JpdG9zXG4gIGNvbnN0IGZhdm9yaXRlcyA9IG90aGVyQWdlbnRzLmZpbHRlcihhZyA9PiBhZy5pc19mYXZvcml0ZSkuc29ydCgoYSwgYikgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSlcbiAgY29uc3Qgbm9uRmF2b3JpdGVzID0gb3RoZXJBZ2VudHMuZmlsdGVyKGFnID0+ICFhZy5pc19mYXZvcml0ZSkuc29ydCgoYSwgYikgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSlcblxuICAvLyBDb21iaW5hcjogY2xvbmVzIHByaW1lcm8sIGx1ZWdvIGZhdm9yaXRvcywgbHVlZ28gbm8gZmF2b3JpdG9zXG4gIHJldHVybiBjbG9uZUFnZW50cy5sZW5ndGggPyBbLi4uY2xvbmVBZ2VudHMsIC4uLmZhdm9yaXRlcywgLi4ubm9uRmF2b3JpdGVzXSA6IFsuLi5mYXZvcml0ZXMsIC4uLm5vbkZhdm9yaXRlc11cbn1cblxudHlwZSBVc2VHZXRBZ2VudHNQcm9wcyA9IHtcbiAgc2VsZWN0QWdlbnQ6IChhZ2VudDogQWdlbnQpID0+IHZvaWRcbiAgc2VjdGlvbjogJ3Byb2plY3QnIHwgJ2hlYWRlcicgfCAnY2xpZW50JyB8ICd0YXNrJ1xuICBhZ2VudDogQWdlbnQgfCBudWxsXG4gIGhhbmRsZUdvSG9tZTogKCkgPT4gdm9pZFxufVxuXG5leHBvcnQgdHlwZSBBZGRBZ2VudE9wdGlvbnMgPSB7XG4gIC8qKiBQb3IgZGVmZWN0byBgdHJ1ZWAgKGNvbXBvcnRhbWllbnRvIEFCTSkuIFBhc2FyIGBmYWxzZWAgYWwgaW5zZXJ0YXIgYWdlbnRlIGNyZWFkbyBwb3IgY2hhdCBzaW4gY2FtYmlhciBkZSB2aXN0YS4gKi9cbiAgbmF2aWdhdGVIb21lPzogYm9vbGVhblxufVxuXG5leHBvcnQgY29uc3QgdXNlR2V0QWdlbnRzID0gKHsgc2VsZWN0QWdlbnQsIHNlY3Rpb24sIGFnZW50LCBoYW5kbGVHb0hvbWUgfTogVXNlR2V0QWdlbnRzUHJvcHMpID0+IHtcbiAgY29uc3QgdXNlciA9IHVzZVVzZXIoKVxuICBjb25zdCBbYWdlbnRzLCBzZXRBZ2VudHNdID0gdXNlU3RhdGU8eyBkYXRhOiBBZ2VudFtdOyBoYXNfbW9yZT86IGJvb2xlYW47IG5leHRfb2Zmc2V0PzogbnVtYmVyIHwgbnVsbCB9Pih7IGRhdGE6IFtdIH0pXG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbbG9hZGluZ01vcmUsIHNldExvYWRpbmdNb3JlXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbc2VhcmNoTG9hZGluZywgc2V0U2VhcmNoTG9hZGluZ10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCB7IGhhbmRsZVNuYWNrYmFyRXJyb3IgfSA9IHVzZVNuYWNrQmFyTWFuYWdlcigpXG4gIGNvbnN0IHsgdCwgaTE4biB9ID0gdXNlVHJhbnNsYXRpb24oJ2NoYXRfYWlfc2VjdGlvbicpXG4gIGNvbnN0IGxhc3RTZWxlY3RlZEFnZW50UmVmID0gdXNlUmVmPEFnZW50IHwgbnVsbD4obnVsbClcbiAgY29uc3QgaXNSZWZyZXNoaW5nUmVmID0gdXNlUmVmKGZhbHNlKVxuICBjb25zdCBsYXN0UmVxdWVzdFJlZiA9IHVzZVJlZjxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCBhZ2VudHNSZWYgPSB1c2VSZWYoYWdlbnRzKVxuICBjb25zdCBwcmVTZWFyY2hBZ2VudHNSZWYgPSB1c2VSZWY8eyBkYXRhOiBBZ2VudFtdOyBoYXNfbW9yZT86IGJvb2xlYW47IG5leHRfb2Zmc2V0PzogbnVtYmVyIHwgbnVsbCB9IHwgbnVsbD4obnVsbClcblxuICBhZ2VudHNSZWYuY3VycmVudCA9IGFnZW50c1xuXG4gIGNvbnN0IGNhbkZldGNoQ2xvbmVBZ2VudHMgPSAhaXNNYWlhQ2xvbmVBZ2VudHNSb2xlQmxvY2tlZCh1c2VyLCBzZWN0aW9uKVxuXG4gIGNvbnN0IGFkZEFnZW50ID0gdXNlQ2FsbGJhY2soXG4gICAgKG5ld0FnZW50OiBBZ2VudCwgb3B0aW9ucz86IEFkZEFnZW50T3B0aW9ucykgPT4ge1xuICAgICAgc2V0QWdlbnRzKHByZXYgPT4ge1xuICAgICAgICAvLyBWZXJpZmljYXIgc2kgZWwgYWdlbnRlIHlhIGV4aXN0ZSBwYXJhIGV2aXRhciBkdXBsaWNhZG9zXG4gICAgICAgIGNvbnN0IGFnZW50RXhpc3RzID0gcHJldi5kYXRhLnNvbWUoZXhpc3RpbmdBZ2VudCA9PiBleGlzdGluZ0FnZW50LmlkID09PSBuZXdBZ2VudC5pZClcbiAgICAgICAgaWYgKGFnZW50RXhpc3RzKSB7XG4gICAgICAgICAgcmV0dXJuIHByZXZcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdEYXRhID0gWy4uLnByZXYuZGF0YSwgbmV3QWdlbnRdXG4gICAgICAgIGNvbnN0IHNvcnRlZERhdGEgPSBzb3J0QWdlbnRzKG5ld0RhdGEpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICBkYXRhOiBzb3J0ZWREYXRhLFxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgaWYgKG9wdGlvbnM/Lm5hdmlnYXRlSG9tZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgaGFuZGxlR29Ib21lKClcbiAgICAgIH1cbiAgICB9LFxuICAgIFtoYW5kbGVHb0hvbWVdXG4gIClcblxuICBjb25zdCByZW1vdmVBZ2VudCA9IHVzZUNhbGxiYWNrKChhZ2VudElkOiBudW1iZXIgfCBzdHJpbmcpID0+IHtcbiAgICBzZXRBZ2VudHMocHJldiA9PiAoe1xuICAgICAgLi4ucHJldixcbiAgICAgIGRhdGE6IHByZXYuZGF0YS5maWx0ZXIoYSA9PiBhLmlkICE9PSBhZ2VudElkLnRvU3RyaW5nKCkpLFxuICAgIH0pKVxuICB9LCBbXSlcblxuICBjb25zdCB1cGRhdGVBZ2VudCA9IHVzZUNhbGxiYWNrKCh1cGRhdGVkQWdlbnQ6IEFnZW50KSA9PiB7XG4gICAgc2V0QWdlbnRzKHByZXYgPT4ge1xuICAgICAgY29uc3QgdXBkYXRlZERhdGEgPSBwcmV2LmRhdGEubWFwKGV4aXN0aW5nQWdlbnQgPT5cbiAgICAgICAgZXhpc3RpbmdBZ2VudC5pZCA9PT0gdXBkYXRlZEFnZW50LmlkID8gdXBkYXRlZEFnZW50IDogZXhpc3RpbmdBZ2VudFxuICAgICAgKVxuICAgICAgY29uc3Qgc29ydGVkRGF0YSA9IHNvcnRBZ2VudHModXBkYXRlZERhdGEpXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5wcmV2LFxuICAgICAgICBkYXRhOiBzb3J0ZWREYXRhLFxuICAgICAgfVxuICAgIH0pXG4gIH0sIFtdKVxuXG4gIGNvbnN0IHVwZGF0ZUFnZW50RmF2b3JpdGUgPSB1c2VDYWxsYmFjayhcbiAgICAodXBkYXRlZEFnZW50OiBBZ2VudCwgc2hvdWxkU29ydDogYm9vbGVhbiA9IGZhbHNlKSA9PiB7XG4gICAgICBzZXRBZ2VudHMocHJldiA9PiB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWREYXRhID0gcHJldi5kYXRhLm1hcChleGlzdGluZ0FnZW50ID0+IHtcbiAgICAgICAgICBpZiAoZXhpc3RpbmdBZ2VudC5pZCA9PT0gdXBkYXRlZEFnZW50LmlkKSB7XG4gICAgICAgICAgICBjb25zdCB7IG1lc3NhZ2UsIC4uLmFnZW50RmllbGRzIH0gPSB1cGRhdGVkQWdlbnQgYXMgYW55XG4gICAgICAgICAgICBjb25zdCBtZXJnZWRBZ2VudCA9IHsgLi4uZXhpc3RpbmdBZ2VudCwgLi4uYWdlbnRGaWVsZHMgfVxuICAgICAgICAgICAgcmV0dXJuIG1lcmdlZEFnZW50XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBleGlzdGluZ0FnZW50XG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gU29sbyBvcmRlbmFyIHNpIHNob3VsZFNvcnQgZXMgdHJ1ZVxuICAgICAgICBjb25zdCBmaW5hbERhdGEgPSBzaG91bGRTb3J0ID8gc29ydEFnZW50cyh1cGRhdGVkRGF0YSkgOiB1cGRhdGVkRGF0YVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICBkYXRhOiBmaW5hbERhdGEsXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIC8vIEFjdHVhbGl6YXIgZWwgYWdlbnRlIHNlbGVjY2lvbmFkbyBzaSBlcyBlbCBxdWUgc2UgZXN0w6EgYWN0dWFsaXphbmRvXG4gICAgICBpZiAoYWdlbnQ/LmlkID09PSB1cGRhdGVkQWdlbnQuaWQpIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdBZ2VudCA9IGFnZW50cy5kYXRhLmZpbmQoYSA9PiBhLmlkID09PSB1cGRhdGVkQWdlbnQuaWQpXG4gICAgICAgIGlmIChleGlzdGluZ0FnZW50KSB7XG4gICAgICAgICAgY29uc3QgeyBtZXNzYWdlLCAuLi5hZ2VudEZpZWxkcyB9ID0gdXBkYXRlZEFnZW50IGFzIGFueVxuICAgICAgICAgIGNvbnN0IG1lcmdlZEFnZW50ID0geyAuLi5leGlzdGluZ0FnZW50LCAuLi5hZ2VudEZpZWxkcyB9XG4gICAgICAgICAgc2VsZWN0QWdlbnQobWVyZ2VkQWdlbnQpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgeyBtZXNzYWdlLCAuLi5hZ2VudEZpZWxkcyB9ID0gdXBkYXRlZEFnZW50IGFzIGFueVxuICAgICAgICAgIHNlbGVjdEFnZW50KGFnZW50RmllbGRzIGFzIEFnZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbYWdlbnQsIHNlbGVjdEFnZW50LCBhZ2VudHMuZGF0YV1cbiAgKVxuXG4gIGNvbnN0IHNvcnRBZ2VudHNMaXN0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldEFnZW50cyhwcmV2ID0+IHtcbiAgICAgIGNvbnN0IHNvcnRlZERhdGEgPSBzb3J0QWdlbnRzKHByZXYuZGF0YSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnByZXYsXG4gICAgICAgIGRhdGE6IHNvcnRlZERhdGEsXG4gICAgICB9XG4gICAgfSlcbiAgfSwgW10pXG5cbiAgY29uc3Qgc2VsZWN0Rmlyc3RBZ2VudCA9IHVzZUNhbGxiYWNrKFxuICAgIChhZ2VudElkPzogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoYWdlbnRzLmRhdGEubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0QWdlbnQgPSBhZ2VudHMuZGF0YS5maW5kSW5kZXgoYWdlbnREYXRhID0+IGFnZW50RGF0YS5pZCA9PT0gYWdlbnRJZClcbiAgICAgICAgbGFzdFNlbGVjdGVkQWdlbnRSZWYuY3VycmVudCA9IGFnZW50cy5kYXRhW2ZpcnN0QWdlbnQgPT09IDAgPyAxIDogMF1cbiAgICAgICAgc2VsZWN0QWdlbnQoYWdlbnRzLmRhdGFbZmlyc3RBZ2VudCA9PT0gMCA/IDEgOiAwXSlcbiAgICAgIH1cbiAgICB9LFxuICAgIFthZ2VudHMuZGF0YSwgc2VsZWN0QWdlbnRdXG4gIClcblxuICBjb25zdCBoYW5kbGVHZXRBZ2VudHMgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAoYWdlbnRUb1NlbGVjdD86IEFnZW50KSA9PiB7XG4gICAgICBpZiAoaXNSZWZyZXNoaW5nUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlcXVlc3RLZXkgPSBhZ2VudFRvU2VsZWN0Py5pZD8udG9TdHJpbmcoKSB8fCAnZGVmYXVsdCdcbiAgICAgIGlmIChsYXN0UmVxdWVzdFJlZi5jdXJyZW50ID09PSByZXF1ZXN0S2V5ICYmICFsb2FkaW5nKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpc1JlZnJlc2hpbmdSZWYuY3VycmVudCA9IHRydWVcbiAgICAgIGxhc3RSZXF1ZXN0UmVmLmN1cnJlbnQgPSByZXF1ZXN0S2V5XG4gICAgICBzZXRMb2FkaW5nKHRydWUpXG4gICAgICBzZXRFcnJvcihudWxsKVxuXG4gICAgICBjb25zdCBpc011bHRpQWdlbnRzID0gISF3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTICYmICEhd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFNcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0IGFnZW50UGFyc2VkOiBBZ2VudFtdID0gW11cbiAgICAgICAgbGV0IGhhc01vcmUgPSBmYWxzZVxuICAgICAgICBsZXQgbmV4dE9mZnNldDogbnVtYmVyIHwgbnVsbCA9IG51bGxcblxuICAgICAgICAvLyBTaSB0aWVuZSBmZWF0dXJlIGFjY2VzcyBtdWx0aSBhZ2VudHMsIGhhY2VyIGRvcyBxdWVyaWVzIChNYWlhICsgY3VzdG9tKSBlbiBjdWFscXVpZXIgc2VjY2nDs25cbiAgICAgICAgaWYgKGlzTXVsdGlBZ2VudHMpIHtcbiAgICAgICAgICAvLyBRdWVyeSBjbG9uZSAoTWFpYSkgeSBjdXN0b20gc29uIGluZGVwZW5kaWVudGVzIOKGkiBzZSBkaXNwYXJhbiBlbiBwYXJhbGVsby5cbiAgICAgICAgICBsZXQgY2xvbmVBZ2VudHM6IEFnZW50W10gPSBbXVxuICAgICAgICAgIGxldCBjdXN0b21BZ2VudHM6IEFnZW50W10gPSBbXVxuICAgICAgICAgIGxldCBjdXN0b21IYXNNb3JlID0gZmFsc2VcbiAgICAgICAgICBsZXQgY3VzdG9tTmV4dE9mZnNldDogbnVtYmVyIHwgbnVsbCA9IG51bGxcblxuICAgICAgICAgIGNvbnN0IGlzNDAzID0gKGVycjogYW55KTogYm9vbGVhbiA9PlxuICAgICAgICAgICAgZXJyPy5yZXNwb25zZT8uc3RhdHVzID09PSA0MDMgfHxcbiAgICAgICAgICAgIGVycj8uc3RhdHVzID09PSA0MDMgfHxcbiAgICAgICAgICAgIGVycj8ubWVzc2FnZT8uaW5jbHVkZXMoXCJZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIHZpZXcgYWdlbnRzXCIpIHx8XG4gICAgICAgICAgICBlcnI/Lm1lc3NhZ2U/LmluY2x1ZGVzKCdGYWlsZWQgZmV0Y2hpbmcgZGF0YScpIC8vIGZldGNoQ09SIGxhbnphIGVzdG8gcGFyYSA0MDMgc2luICdBY2Nlc3MgZGVuaWVkJ1xuXG4gICAgICAgICAgY29uc3QgbG9hZENsb25lQWdlbnRzID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFjYW5GZXRjaENsb25lQWdlbnRzKSByZXR1cm5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IG9yZGVyUGFyYW0gPVxuICAgICAgICAgICAgICAgIHNlY3Rpb24gPT09ICdjbGllbnQnXG4gICAgICAgICAgICAgICAgICA/ICcmb3JkZXI9Y2xpZW50LHByb2plY3QnXG4gICAgICAgICAgICAgICAgICA6IHNlY3Rpb24gPT09ICdwcm9qZWN0JyB8fCBzZWN0aW9uID09PSAnaGVhZGVyJyB8fCBzZWN0aW9uID09PSAndGFzaydcbiAgICAgICAgICAgICAgICAgICAgPyAnJm9yZGVyPXByb2plY3QsY2xpZW50J1xuICAgICAgICAgICAgICAgICAgICA6ICcnXG4gICAgICAgICAgICAgIGNvbnN0IG1haWFSZXNwb25zZSA9IGF3YWl0IGZldGNoTWFpYSh7XG4gICAgICAgICAgICAgICAgcGF0aDogYGFnZW50cz9hZ2VudF90eXBlPWNsb25lJmxhbmc9JHttYXBDT1JMYW5nKGkxOG4ubGFuZ3VhZ2UpfSR7b3JkZXJQYXJhbX1gLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIGNvbnN0IG1haWFEYXRhID0gYXdhaXQgbWFpYVJlc3BvbnNlLmpzb24oKVxuICAgICAgICAgICAgICBjbG9uZUFnZW50cyA9IG1haWFEYXRhLmRhdGE/LmZpbHRlcigoYWc6IEFnZW50KSA9PiBhZy50eXBlID09PSAnY2xvbmUnKSB8fCBbXVxuICAgICAgICAgICAgfSBjYXRjaCAobWFpYUVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgICAgLy8gU2kgZXMgNDAzLCBjb250aW51YXIgc2luIGxvcyBjbG9uZUFnZW50czsgc2kgZXMgb3RybyBlcnJvciwgcHJvcGFnYXJsb1xuICAgICAgICAgICAgICBpZiAoIWlzNDAzKG1haWFFcnJvcikpIHRocm93IG1haWFFcnJvclxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGxvYWRDdXN0b21BZ2VudHMgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBjdXN0b21SZXNwb25zZSA9IGF3YWl0IGZldGNoTWFpYSh7XG4gICAgICAgICAgICAgICAgcGF0aDogJ2FnZW50cz9hZ2VudF90eXBlPWN1c3RvbSZsaW1pdD03Jm9mZnNldD0wJyxcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICBjb25zdCBjdXN0b21EYXRhID0gYXdhaXQgY3VzdG9tUmVzcG9uc2UuanNvbigpXG4gICAgICAgICAgICAgIGN1c3RvbUFnZW50cyA9IGN1c3RvbURhdGEuZGF0YSB8fCBbXVxuICAgICAgICAgICAgICBjdXN0b21IYXNNb3JlID0gY3VzdG9tRGF0YS5oYXNfbW9yZSB8fCBmYWxzZVxuICAgICAgICAgICAgICBjdXN0b21OZXh0T2Zmc2V0ID0gY3VzdG9tRGF0YS5uZXh0X29mZnNldCB8fCBudWxsXG4gICAgICAgICAgICB9IGNhdGNoIChjdXN0b21FcnJvcjogYW55KSB7XG4gICAgICAgICAgICAgIC8vIFNpIGVzIDQwMywgY29udGludWFyIHNpbiBsb3MgY3VzdG9tQWdlbnRzIChxdWVkYSBjb21vIGFycmF5IHZhY8Otbyk7IHNpIG5vLCBwcm9wYWdhcmxvXG4gICAgICAgICAgICAgIGlmICghaXM0MDMoY3VzdG9tRXJyb3IpKSB0aHJvdyBjdXN0b21FcnJvclxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtsb2FkQ2xvbmVBZ2VudHMoKSwgbG9hZEN1c3RvbUFnZW50cygpXSlcblxuICAgICAgICAgIC8vIENvbWJpbmFyOiBhZ2VudGVzIGNsb25lIHByaW1lcm8sIGx1ZWdvIGxvcyBjdXN0b20gKHNpIGV4aXN0ZW4pXG4gICAgICAgICAgLy8gU2kgZWwgdXN1YXJpbyB0aWVuZSB1biByb2wgZGVzaGFiaWxpdGFkbywgbm8gaW5jbHVpciBjbG9uZUFnZW50c1xuICAgICAgICAgIGlmICghY2FuRmV0Y2hDbG9uZUFnZW50cykge1xuICAgICAgICAgICAgLy8gUm9sIHNpbiBhY2Nlc28gYSBjbG9uZXMgKHAuIGVqLiBjb2xhYm9yYWRvciBmdWVyYSBkZWwgcGlsb3RvKTogc29sbyBjdXN0b21BZ2VudHNcbiAgICAgICAgICAgIC8vIFNpIGN1c3RvbUFnZW50cyBlc3TDoSB2YWPDrW8gKHBvciA0MDMpLCBhZ2VudFBhcnNlZCBzZXLDoSBbXVxuICAgICAgICAgICAgYWdlbnRQYXJzZWQgPSBjdXN0b21BZ2VudHNcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUm9sIGNvbiBhY2Nlc28gYSBjbG9uZXM6IGNsb25lQWdlbnRzICsgY3VzdG9tQWdlbnRzXG4gICAgICAgICAgICAvLyBTaSBjdXN0b21BZ2VudHMgZXN0w6EgdmFjw61vIChwb3IgNDAzKSBwZXJvIGhheSBjbG9uZUFnZW50cywgYWdlbnRQYXJzZWQgdGVuZHLDoSBsb3MgY2xvbmVzXG4gICAgICAgICAgICAvLyBTaSBubyBoYXkgY2xvbmVBZ2VudHMgbmkgY3VzdG9tQWdlbnRzLCBhZ2VudFBhcnNlZCBzZXLDoSBbXVxuICAgICAgICAgICAgYWdlbnRQYXJzZWQgPSBjbG9uZUFnZW50cy5sZW5ndGggPyBbLi4uY2xvbmVBZ2VudHMsIC4uLmN1c3RvbUFnZW50c10gOiBjdXN0b21BZ2VudHNcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gT3JkZW5hcjogTWFpYSBwcmltZXJvLCBsdWVnbyBmYXZvcml0b3MgYWxmYWLDqXRpY2FtZW50ZSwgbHVlZ28gbm8gZmF2b3JpdG9zIGFsZmFiw6l0aWNhbWVudGVcbiAgICAgICAgICBhZ2VudFBhcnNlZCA9IHNvcnRBZ2VudHMoYWdlbnRQYXJzZWQpXG4gICAgICAgICAgaGFzTW9yZSA9IGN1c3RvbUhhc01vcmVcbiAgICAgICAgICBuZXh0T2Zmc2V0ID0gY3VzdG9tTmV4dE9mZnNldFxuXG4gICAgICAgICAgc2V0QWdlbnRzKHtcbiAgICAgICAgICAgIGRhdGE6IGFnZW50UGFyc2VkLFxuICAgICAgICAgICAgaGFzX21vcmU6IGhhc01vcmUsXG4gICAgICAgICAgICBuZXh0X29mZnNldDogbmV4dE9mZnNldCxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgLy8gU2kgbm8gaGF5IGFnZW50ZXMgZGVzcHXDqXMgZGUgcHJvY2VzYXIgbGFzIHF1ZXJpZXMsIGxpbXBpYXIgZWwgZXJyb3JcbiAgICAgICAgICBpZiAoYWdlbnRQYXJzZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBzZXRFcnJvcihudWxsKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBzaG91bGRSZXF1ZXN0Q2xvbmVBZ2VudHMgPVxuICAgICAgICAgICAgY2FuRmV0Y2hDbG9uZUFnZW50cyAmJlxuICAgICAgICAgICAgKHNlY3Rpb24gPT09ICdwcm9qZWN0JyB8fCBzZWN0aW9uID09PSAnY2xpZW50JyB8fCBzZWN0aW9uID09PSAnaGVhZGVyJyB8fCBzZWN0aW9uID09PSAndGFzaycpXG5cbiAgICAgICAgICBpZiAoIXNob3VsZFJlcXVlc3RDbG9uZUFnZW50cykge1xuICAgICAgICAgICAgc2V0QWdlbnRzKHsgZGF0YTogW10sIGhhc19tb3JlOiBmYWxzZSwgbmV4dF9vZmZzZXQ6IG51bGwgfSlcbiAgICAgICAgICAgIHNldEVycm9yKG51bGwpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpXG4gICAgICAgICAgICBxdWVyeVBhcmFtcy5hcHBlbmQoJ2FnZW50X3R5cGUnLCAnY2xvbmUnKVxuICAgICAgICAgICAgcXVlcnlQYXJhbXMuYXBwZW5kKCdsYW5nJywgbWFwQ09STGFuZyhpMThuLmxhbmd1YWdlKSlcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1zLmFwcGVuZCgnb3JkZXInLCBzZWN0aW9uID09PSAnY2xpZW50JyA/ICdjbGllbnQscHJvamVjdCcgOiAncHJvamVjdCxjbGllbnQnKVxuICAgICAgICAgICAgaWYgKHNlY3Rpb24gPT09ICdoZWFkZXInKSB7XG4gICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zLmFwcGVuZCgnbGltaXQnLCAnNycpXG4gICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zLmFwcGVuZCgnb2Zmc2V0JywgJzAnKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwYXRoID0gYGFnZW50cz8ke3F1ZXJ5UGFyYW1zLnRvU3RyaW5nKCl9YFxuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoTWFpYSh7XG4gICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgICAgICAgICAgICAgYWdlbnRQYXJzZWQgPSBkYXRhLmRhdGEgfHwgW11cbiAgICAgICAgICAgICAgYWdlbnRQYXJzZWQgPSBzb3J0QWdlbnRzKGFnZW50UGFyc2VkKVxuICAgICAgICAgICAgICBoYXNNb3JlID0gZGF0YS5oYXNfbW9yZVxuICAgICAgICAgICAgICBuZXh0T2Zmc2V0ID0gZGF0YS5uZXh0X29mZnNldFxuXG4gICAgICAgICAgICAgIHNldEFnZW50cyh7XG4gICAgICAgICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICAgICAgICBkYXRhOiBhZ2VudFBhcnNlZCxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0gY2F0Y2ggKHJlc3BvbnNlRXJyb3I6IGFueSkge1xuICAgICAgICAgICAgICAvLyBWZXJpZmljYXIgc2kgZWwgZXJyb3IgZXMgNDAzXG4gICAgICAgICAgICAgIC8vIGZldGNoQ09SIHB1ZWRlIGxhbnphciBkaWZlcmVudGVzIHRpcG9zIGRlIGVycm9yZXM6XG4gICAgICAgICAgICAgIC8vIDEuIEVycm9yIGNvbiBlcnJvckRhdGEuZGV0YWlsIHNpIGluY2x1eWUgJ0FjY2VzcyBkZW5pZWQnXG4gICAgICAgICAgICAgIC8vIDIuIEVycm9yIGdlbsOpcmljbyAnRmFpbGVkIGZldGNoaW5nIGRhdGEnIHNpIGVzIDQwMyBwZXJvIG5vIGluY2x1eWUgJ0FjY2VzcyBkZW5pZWQnXG4gICAgICAgICAgICAgIC8vIDMuIE5lY2VzaXRhbW9zIHZlcmlmaWNhciBlbCBzdGF0dXMgY29kZSBzaSBlc3TDoSBkaXNwb25pYmxlXG4gICAgICAgICAgICAgIGNvbnN0IGlzNDAzRXJyb3IgPVxuICAgICAgICAgICAgICAgIHJlc3BvbnNlRXJyb3I/LnJlc3BvbnNlPy5zdGF0dXMgPT09IDQwMyB8fFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlRXJyb3I/LnN0YXR1cyA9PT0gNDAzIHx8XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VFcnJvcj8ubWVzc2FnZT8uaW5jbHVkZXMoXCJZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIHZpZXcgYWdlbnRzXCIpIHx8XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VFcnJvcj8ubWVzc2FnZT8uaW5jbHVkZXMoJ0ZhaWxlZCBmZXRjaGluZyBkYXRhJykgLy8gZmV0Y2hDT1IgbGFuemEgZXN0byBwYXJhIDQwMyBzaW4gJ0FjY2VzcyBkZW5pZWQnXG5cbiAgICAgICAgICAgICAgaWYgKGlzNDAzRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAvLyBTaSBlcyA0MDMsIGVzdGFibGVjZXIgYWdlbnRlcyB2YWPDrW9zIHkgY29udGludWFyXG4gICAgICAgICAgICAgICAgc2V0QWdlbnRzKHtcbiAgICAgICAgICAgICAgICAgIGRhdGE6IFtdLFxuICAgICAgICAgICAgICAgICAgaGFzX21vcmU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgbmV4dF9vZmZzZXQ6IG51bGwsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBzZXRFcnJvcihudWxsKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFNpIGVzIG90cm8gZXJyb3IsIGxhbnphcmxvXG4gICAgICAgICAgICAgICAgdGhyb3cgcmVzcG9uc2VFcnJvclxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTMOzZ2ljYSBkZSBzZWxlY3QgYWdlbnQgLSBTb2xvIHNlbGVjY2lvbmFyIHNpIGhheSBhZ2VudGVzIGRpc3BvbmlibGVzXG4gICAgICAgIGlmIChhZ2VudFBhcnNlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgaWYgKGFnZW50VG9TZWxlY3QgJiYgYWdlbnRQYXJzZWQuZmluZCgoYWdlbnRUb1JlcXVlc3Q6IEFnZW50KSA9PiBhZ2VudFRvUmVxdWVzdC5pZCA9PT0gYWdlbnRUb1NlbGVjdC5pZCkpIHtcbiAgICAgICAgICAgIGlmIChsYXN0U2VsZWN0ZWRBZ2VudFJlZi5jdXJyZW50Py5pZCAhPT0gYWdlbnRUb1NlbGVjdC5pZCkge1xuICAgICAgICAgICAgICBsYXN0U2VsZWN0ZWRBZ2VudFJlZi5jdXJyZW50ID0gYWdlbnRUb1NlbGVjdFxuICAgICAgICAgICAgICBzZWxlY3RBZ2VudChhZ2VudFRvU2VsZWN0KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoYWdlbnRQYXJzZWQ/LlswXSAmJiAoIWFnZW50IHx8ICFhZ2VudFBhcnNlZC5maW5kKChhOiBBZ2VudCkgPT4gYS5pZCA9PT0gYWdlbnQuaWQpKSkge1xuICAgICAgICAgICAgY29uc3QgYXZhaWxhYmxlQWdlbnRzID1cbiAgICAgICAgICAgICAgd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTUyAmJiBjYW5GZXRjaENsb25lQWdlbnRzXG4gICAgICAgICAgICAgICAgPyBhZ2VudFBhcnNlZFxuICAgICAgICAgICAgICAgIDogYWdlbnRQYXJzZWQuZmlsdGVyKChhZ2VudEl0ZW06IEFnZW50KSA9PiBhZ2VudEl0ZW0udHlwZSAhPT0gJ2Nsb25lJylcblxuICAgICAgICAgICAgY29uc3QgW2ZpcnN0QWdlbnRdID0gYXZhaWxhYmxlQWdlbnRzXG4gICAgICAgICAgICBpZiAoZmlyc3RBZ2VudCAmJiBsYXN0U2VsZWN0ZWRBZ2VudFJlZi5jdXJyZW50Py5pZCAhPT0gZmlyc3RBZ2VudC5pZCkge1xuICAgICAgICAgICAgICBsYXN0U2VsZWN0ZWRBZ2VudFJlZi5jdXJyZW50ID0gZmlyc3RBZ2VudFxuICAgICAgICAgICAgICBzZWxlY3RBZ2VudChmaXJzdEFnZW50KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoYWdlbnRUb1NlbGVjdCAmJiBhZ2VudFBhcnNlZD8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBhdmFpbGFibGVBZ2VudHMgPVxuICAgICAgICAgICAgICB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTICYmIGNhbkZldGNoQ2xvbmVBZ2VudHNcbiAgICAgICAgICAgICAgICA/IGFnZW50UGFyc2VkXG4gICAgICAgICAgICAgICAgOiBhZ2VudFBhcnNlZC5maWx0ZXIoKGFnZW50SXRlbTogQWdlbnQpID0+IGFnZW50SXRlbS50eXBlICE9PSAnY2xvbmUnKVxuXG4gICAgICAgICAgICBjb25zdCBbZmlyc3RBdmFpbGFibGVBZ2VudF0gPSBhdmFpbGFibGVBZ2VudHNcbiAgICAgICAgICAgIGlmIChmaXJzdEF2YWlsYWJsZUFnZW50ICYmIGxhc3RTZWxlY3RlZEFnZW50UmVmLmN1cnJlbnQ/LmlkICE9PSBmaXJzdEF2YWlsYWJsZUFnZW50LmlkKSB7XG4gICAgICAgICAgICAgIGxhc3RTZWxlY3RlZEFnZW50UmVmLmN1cnJlbnQgPSBmaXJzdEF2YWlsYWJsZUFnZW50XG4gICAgICAgICAgICAgIHNlbGVjdEFnZW50KGZpcnN0QXZhaWxhYmxlQWdlbnQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSlcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBzZXRFcnJvcihlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogJ0FuIHVua25vd24gZXJyb3Igb2NjdXJyZWQnKVxuICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaXNSZWZyZXNoaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpZiAoIWlzUmVmcmVzaGluZ1JlZi5jdXJyZW50KSB7XG4gICAgICAgICAgICBsYXN0UmVxdWVzdFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgICAgIH1cbiAgICAgICAgfSwgMTAwKVxuICAgICAgfVxuICAgIH0sXG4gICAgW3NlbGVjdEFnZW50LCBzZWN0aW9uLCBhZ2VudCwgbG9hZGluZywgY2FuRmV0Y2hDbG9uZUFnZW50cywgaTE4bi5sYW5ndWFnZV1cbiAgKVxuXG4gIGNvbnN0IHNlYXJjaEN1c3RvbUFnZW50cyA9IHVzZUNhbGxiYWNrKGFzeW5jIChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgaWYgKCFxdWVyeSkge1xuICAgICAgaWYgKHByZVNlYXJjaEFnZW50c1JlZi5jdXJyZW50KSB7XG4gICAgICAgIHNldEFnZW50cyhwcmVTZWFyY2hBZ2VudHNSZWYuY3VycmVudClcbiAgICAgICAgcHJlU2VhcmNoQWdlbnRzUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIXByZVNlYXJjaEFnZW50c1JlZi5jdXJyZW50KSB7XG4gICAgICBwcmVTZWFyY2hBZ2VudHNSZWYuY3VycmVudCA9IGFnZW50c1JlZi5jdXJyZW50XG4gICAgfVxuXG4gICAgc2V0U2VhcmNoTG9hZGluZyh0cnVlKVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hNYWlhKHtcbiAgICAgICAgcGF0aDogYGFnZW50cz9hZ2VudF90eXBlPWN1c3RvbSZsaW1pdD0yMCZvZmZzZXQ9MCZxPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5KX1gLFxuICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgfSlcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKClcblxuICAgICAgc2V0QWdlbnRzKHByZXYgPT4ge1xuICAgICAgICBjb25zdCBjbG9uZUFnZW50cyA9IHByZXYuZGF0YS5maWx0ZXIoKGFnOiBBZ2VudCkgPT4gYWcudHlwZSA9PT0gJ2Nsb25lJylcbiAgICAgICAgY29uc3QgY3VzdG9tUmVzdWx0czogQWdlbnRbXSA9IGRhdGEuZGF0YSB8fCBbXVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRhdGE6IGNsb25lQWdlbnRzLmxlbmd0aCA/IFsuLi5jbG9uZUFnZW50cywgLi4uY3VzdG9tUmVzdWx0c10gOiBjdXN0b21SZXN1bHRzLFxuICAgICAgICAgIGhhc19tb3JlOiBmYWxzZSxcbiAgICAgICAgICBuZXh0X29mZnNldDogbnVsbCxcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGhhbmRsZVNuYWNrYmFyRXJyb3IodCgnc25hY2tiYXIubG9hZE1vcmVBZ2VudHMuZXJyb3InKSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0U2VhcmNoTG9hZGluZyhmYWxzZSlcbiAgICB9XG4gIH0sIFtdKVxuXG4gIGNvbnN0IGxvYWRNb3JlQWdlbnRzID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGlzTXVsdGlBZ2VudHMgPSAhIXdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MgJiYgISF3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UU1xuICAgIC8vIENhcmdhciBtw6FzOiBlbiBoZWFkZXIgc2llbXByZTsgZW4gcHJvamVjdCBzb2xvIHNpIGlzTXVsdGlBZ2VudHMgKHBvcnF1ZSBzb2xvIGVudG9uY2VzIGhheSBwYWdpbmFjacOzbiBkZSBjdXN0b20pXG4gICAgY29uc3QgY2FuTG9hZE1vcmUgPSBzZWN0aW9uID09PSAnaGVhZGVyJyB8fCBpc011bHRpQWdlbnRzXG4gICAgaWYgKCFjYW5Mb2FkTW9yZSB8fCAhYWdlbnRzLmhhc19tb3JlIHx8ICFhZ2VudHMubmV4dF9vZmZzZXQgfHwgbG9hZGluZ01vcmUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHNldExvYWRpbmdNb3JlKHRydWUpXG4gICAgc2V0RXJyb3IobnVsbClcblxuICAgIHRyeSB7XG4gICAgICBsZXQgcGF0aDogc3RyaW5nXG5cbiAgICAgIC8vIFNpIGVzIG11bHRpQWdlbnRzLCBzb2xvIGNhcmdhciBhZ2VudHMgY3VzdG9tIChNYWlhIHlhIGVzdMOhIGNhcmdhZG8pXG4gICAgICBpZiAoaXNNdWx0aUFnZW50cykge1xuICAgICAgICAvLyBNYW50ZW5lciBjYW50aWRhZCBpbXBhciBkZSBjYXJkczogcHJpbWVyYSBjYXJnYSA3LCBzaWd1aWVudGVzICs2ICg3LCAxMywgMTksIC4uLilcbiAgICAgICAgcGF0aCA9IGBhZ2VudHM/YWdlbnRfdHlwZT1jdXN0b20mbGltaXQ9NiZvZmZzZXQ9JHthZ2VudHMubmV4dF9vZmZzZXR9YFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gU2kgbm8gZXMgbXVsdGlBZ2VudHMsIGNhcmdhciBtw6FzIGFnZW50ZXMgY2xvbmUgKE1haWEpIOKAlCBtaXNtbyBvcmRlciBxdWUgcHJvamVjdCBwYXJhIGhlYWRlclxuICAgICAgICBjb25zdCBxdWVyeVBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKVxuICAgICAgICBxdWVyeVBhcmFtcy5hcHBlbmQoJ2FnZW50X3R5cGUnLCAnY2xvbmUnKVxuICAgICAgICBxdWVyeVBhcmFtcy5hcHBlbmQoJ2xhbmcnLCBtYXBDT1JMYW5nKGkxOG4ubGFuZ3VhZ2UpKVxuICAgICAgICBxdWVyeVBhcmFtcy5hcHBlbmQoJ29yZGVyJywgJ3Byb2plY3QsY2xpZW50JylcbiAgICAgICAgcXVlcnlQYXJhbXMuYXBwZW5kKCdsaW1pdCcsICc3JylcbiAgICAgICAgcXVlcnlQYXJhbXMuYXBwZW5kKCdvZmZzZXQnLCBhZ2VudHMubmV4dF9vZmZzZXQudG9TdHJpbmcoKSlcbiAgICAgICAgcGF0aCA9IGBhZ2VudHM/JHtxdWVyeVBhcmFtcy50b1N0cmluZygpfWBcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaE1haWEoe1xuICAgICAgICBwYXRoLFxuICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgfSlcblxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuXG4gICAgICAvLyBBY3VtdWxhciBhZ2VudGVzLCBleGNsdXllbmRvIGR1cGxpY2Fkb3NcbiAgICAgIHNldEFnZW50cyhwcmV2ID0+IHtcbiAgICAgICAgaWYgKGlzTXVsdGlBZ2VudHMpIHtcbiAgICAgICAgICAvLyBMw7NnaWNhIHBhcmEgbXVsdGlBZ2VudHM6IHNlcGFyYXIgY2xvbmUgeSBjdXN0b21cbiAgICAgICAgICAvLyBNYW50ZW5lciB0b2RvcyBsb3MgYWdlbnRlcyBjbG9uZSBleGlzdGVudGVzIGFsIGluaWNpb1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQ2xvbmVBZ2VudHMgPSBwcmV2LmRhdGEuZmlsdGVyKChhZzogQWdlbnQpID0+IGFnLnR5cGUgPT09ICdjbG9uZScpXG5cbiAgICAgICAgICAvLyBPYnRlbmVyIElEcyBleGlzdGVudGVzIChleGNsdXllbmRvIGNsb25lcylcbiAgICAgICAgICBjb25zdCBleGlzdGluZ0lkcyA9IG5ldyBTZXQocHJldi5kYXRhLmZpbHRlcigoYWc6IEFnZW50KSA9PiBhZy50eXBlICE9PSAnY2xvbmUnKS5tYXAoKGFnOiBBZ2VudCkgPT4gYWcuaWQpKVxuXG4gICAgICAgICAgLy8gRmlsdHJhciBudWV2b3MgYWdlbnRzIHF1ZSBubyBlc3TDqW4geWEgZW4gbGEgbGlzdGEgKHkgcXVlIG5vIHNlYW4gY2xvbmUpXG4gICAgICAgICAgY29uc3QgbmV3QWdlbnRzID0gZGF0YS5kYXRhLmZpbHRlcigoYWc6IEFnZW50KSA9PiBhZy50eXBlICE9PSAnY2xvbmUnICYmICFleGlzdGluZ0lkcy5oYXMoYWcuaWQpKVxuXG4gICAgICAgICAgLy8gQ29uc3RydWlyIGVsIG51ZXZvIGFycmF5OiBjbG9uZXMgcHJpbWVybywgbHVlZ28gbG9zIGFnZW50cyBleGlzdGVudGVzIHF1ZSBubyBzZWFuIGNsb25lLCBsdWVnbyBsb3MgbnVldm9zXG4gICAgICAgICAgY29uc3QgbmV3RGF0YSA9IGV4aXN0aW5nQ2xvbmVBZ2VudHMubGVuZ3RoXG4gICAgICAgICAgICA/IFsuLi5leGlzdGluZ0Nsb25lQWdlbnRzLCAuLi5wcmV2LmRhdGEuZmlsdGVyKChhZzogQWdlbnQpID0+IGFnLnR5cGUgIT09ICdjbG9uZScpLCAuLi5uZXdBZ2VudHNdXG4gICAgICAgICAgICA6IFsuLi5wcmV2LmRhdGEuZmlsdGVyKChhZzogQWdlbnQpID0+IGFnLnR5cGUgIT09ICdjbG9uZScpLCAuLi5uZXdBZ2VudHNdXG5cbiAgICAgICAgICAvLyBPcmRlbmFyOiBNYWlhIHByaW1lcm8sIGx1ZWdvIGZhdm9yaXRvcyBhbGZhYsOpdGljYW1lbnRlLCBsdWVnbyBubyBmYXZvcml0b3MgYWxmYWLDqXRpY2FtZW50ZVxuICAgICAgICAgIGNvbnN0IHNvcnRlZERhdGEgPSBzb3J0QWdlbnRzKG5ld0RhdGEpXG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF0YTogc29ydGVkRGF0YSxcbiAgICAgICAgICAgIGhhc19tb3JlOiBkYXRhLmhhc19tb3JlLFxuICAgICAgICAgICAgbmV4dF9vZmZzZXQ6IGRhdGEubmV4dF9vZmZzZXQsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEzDs2dpY2EgcGFyYSAhaXNNdWx0aUFnZW50czogdG9kb3MgbG9zIGFnZW50ZXMgc29uIGNsb25lLCBzaW1wbGVtZW50ZSBhZ3JlZ2FyIGV2aXRhbmRvIGR1cGxpY2Fkb3NcbiAgICAgICAgY29uc3QgZXhpc3RpbmdJZHMgPSBuZXcgU2V0KHByZXYuZGF0YS5tYXAoKGFnOiBBZ2VudCkgPT4gYWcuaWQpKVxuICAgICAgICBjb25zdCBuZXdBZ2VudHMgPSAoZGF0YS5kYXRhIHx8IFtdKS5maWx0ZXIoKGFnOiBBZ2VudCkgPT4gIWV4aXN0aW5nSWRzLmhhcyhhZy5pZCkpXG4gICAgICAgIGNvbnN0IG5ld0RhdGEgPSBbLi4ucHJldi5kYXRhLCAuLi5uZXdBZ2VudHNdXG5cbiAgICAgICAgLy8gT3JkZW5hcjogTWFpYSBwcmltZXJvLCBsdWVnbyBmYXZvcml0b3MgYWxmYWLDqXRpY2FtZW50ZSwgbHVlZ28gbm8gZmF2b3JpdG9zIGFsZmFiw6l0aWNhbWVudGVcbiAgICAgICAgY29uc3Qgc29ydGVkRGF0YSA9IHNvcnRBZ2VudHMobmV3RGF0YSlcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRhdGE6IHNvcnRlZERhdGEsXG4gICAgICAgICAgaGFzX21vcmU6IGRhdGEuaGFzX21vcmUsXG4gICAgICAgICAgbmV4dF9vZmZzZXQ6IGRhdGEubmV4dF9vZmZzZXQsXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIHNldExvYWRpbmdNb3JlKGZhbHNlKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaGFuZGxlU25hY2tiYXJFcnJvcih0KCdzbmFja2Jhci5sb2FkTW9yZUFnZW50cy5lcnJvcicpKVxuICAgICAgc2V0TG9hZGluZ01vcmUoZmFsc2UpXG4gICAgfVxuICB9LCBbc2VjdGlvbiwgYWdlbnRzLmhhc19tb3JlLCBhZ2VudHMubmV4dF9vZmZzZXQsIGxvYWRpbmdNb3JlLCBpMThuLmxhbmd1YWdlXSlcblxuICByZXR1cm4ge1xuICAgIGFnZW50cyxcbiAgICBsb2FkaW5nLFxuICAgIGxvYWRpbmdNb3JlLFxuICAgIGVycm9yLFxuICAgIGhhbmRsZUdldEFnZW50cyxcbiAgICBsb2FkTW9yZUFnZW50cyxcbiAgICBzZWFyY2hDdXN0b21BZ2VudHMsXG4gICAgc2VhcmNoTG9hZGluZyxcbiAgICBhZGRBZ2VudCxcbiAgICByZW1vdmVBZ2VudCxcbiAgICB1cGRhdGVBZ2VudCxcbiAgICB1cGRhdGVBZ2VudEZhdm9yaXRlLFxuICAgIHNlbGVjdEZpcnN0QWdlbnQsXG4gICAgc29ydEFnZW50c0xpc3QsXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLFFBQVEsRUFBRUMsV0FBVyxFQUFFQyxNQUFNLFFBQVEsT0FBTztBQUNyRCxTQUFTQyxjQUFjLFFBQVEsZUFBZTtBQUM5QyxTQUFTQyxrQkFBa0IsUUFBUSxzREFBc0Q7QUFDekYsU0FBU0MsU0FBUyxRQUFRLFdBQVc7QUFFckMsU0FBU0MsT0FBTyxRQUFRLDJCQUEyQjtBQUNuRCxTQUFTQyw0QkFBNEIsUUFBUSx3Q0FBd0M7QUFDckYsU0FBU0MsVUFBVSxRQUFRLHFCQUFx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
|