@projectcor/maia-components 2.11.103-3 → 2.11.103-5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/App.js +44 -19
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +7 -6
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +9 -12
- package/lib/components/index.js +2 -1
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +91 -4
- package/lib/components/molecules/ChatAIHome/ChatAIHome.js +68 -97
- package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.js +9 -18
- package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.styles.js +3 -3
- package/lib/components/molecules/ChatAIHome/styles.js +26 -32
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +60 -56
- package/lib/components/molecules/Sidebar/Sidebar.js +4 -2
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +35 -6
- package/lib/components/organisms/ChatAIPage/ChatAIPage.js +543 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPage.styles.js +16 -0
- package/lib/components/organisms/ChatAIPage/index.js +3 -0
- package/lib/context/cor-user.js +1 -5
- package/lib/dev/DevMaiaPage.js +30 -0
- package/lib/hooks/useAgentModel/useCreateAgent.js +61 -14
- package/lib/hooks/useAgentModel/useUpdateAgent.js +58 -11
- package/lib/hooks/useEvent.js +2 -1
- package/lib/index.js +5 -2
- package/lib/lang/br/index.js +9 -6
- package/lib/lang/en/index.js +9 -6
- package/lib/lang/es/index.js +9 -6
- package/lib/lang/fr/index.js +9 -6
- package/lib/services/maia/Agents/connectors.js +250 -0
- package/lib/types/agentModal.js +1 -1
- package/lib/utils/normalizeAgentConnectors.js +28 -3
- package/package.json +1 -1
- package/lib/utils/managerHoursHomeFuas.js +0 -54
|
@@ -0,0 +1,543 @@
|
|
|
1
|
+
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
|
|
2
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
3
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
4
|
+
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
5
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
6
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
7
|
+
/* eslint-disable no-nested-ternary */
|
|
8
|
+
/* eslint-disable react/function-component-definition */
|
|
9
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
10
|
+
import moment from 'moment';
|
|
11
|
+
import { useTranslation } from 'react-i18next';
|
|
12
|
+
import { useUser } from '../../../context/cor-user';
|
|
13
|
+
import { MAIAError } from '../../atoms/MAIAError';
|
|
14
|
+
import { ChatAIContent } from '../../molecules/ChatAIContent';
|
|
15
|
+
import { buildHandlers, options } from '../../molecules/ChatAIModal/constants';
|
|
16
|
+
import { Sidebar } from '../../molecules/Sidebar';
|
|
17
|
+
import { useGetAgents } from '../../../services/maia/Agents/getAgents';
|
|
18
|
+
import { GlobalContext, useGlobalContext } from '../../../context/global-context';
|
|
19
|
+
import { ChatAIModalHeader } from '../../molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader';
|
|
20
|
+
import { Snackbar } from '../SnackBar/Snackbar';
|
|
21
|
+
import { ProjectSummaryContent } from '../../molecules/ProjectSummaryContent';
|
|
22
|
+
import { AbmAgentModal } from '../AbmAgentModal/AbmAgentModal';
|
|
23
|
+
import { ChatAiModalFooter } from '../../molecules/ChatAIModal/components/ChatAiModalFooter';
|
|
24
|
+
import { SECTIONS } from '../../../constants/config';
|
|
25
|
+
import { validateIsMaia } from '../../../services/utils/validateIsMaia';
|
|
26
|
+
import { fetchMaia } from '../../../services/maia/client';
|
|
27
|
+
import { mapCORLang } from '../../../lang/utils';
|
|
28
|
+
import { useStreamdownStyles } from '../../../hooks/useStreamdownStyles';
|
|
29
|
+
import { useProjectSummaryConfig } from '../../../hooks/useProjectSummaryConfig';
|
|
30
|
+
import { acquireChatsStore, releaseChatsStore } from '../../../store';
|
|
31
|
+
import { useEvent } from '../../../hooks/useEvent';
|
|
32
|
+
import { useGetSkills } from '../../../services/maia/Skills/getSkills';
|
|
33
|
+
import { isMarketplaceGlobalCloneAgent } from '../../../utils/agentDisplayName';
|
|
34
|
+
import { withAppCfg } from '../../atoms/WithAppCfg';
|
|
35
|
+
import { Features } from '../../atoms/WithFeatureValidation';
|
|
36
|
+
import { SCPageMain, SCPageWrapper } from './ChatAIPage.styles';
|
|
37
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
38
|
+
var validateAccessByFeature = function validateAccessByFeature(section) {
|
|
39
|
+
if (section === 'header' && (window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS || window.MAIA_CHAT_AI_FEATURE_ACCESS)) {
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
if ((section === 'project' || section === 'client') && window.MAIA_CHAT_AI_FEATURE_ACCESS) {
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
return false;
|
|
46
|
+
};
|
|
47
|
+
export var ChatAIPage = withAppCfg(function (_ref) {
|
|
48
|
+
var _ref$entity = _ref.entity,
|
|
49
|
+
entity = _ref$entity === void 0 ? {
|
|
50
|
+
projectId: null,
|
|
51
|
+
clientId: null
|
|
52
|
+
} : _ref$entity,
|
|
53
|
+
_ref$project = _ref.project,
|
|
54
|
+
initialProject = _ref$project === void 0 ? null : _ref$project,
|
|
55
|
+
_ref$client = _ref.client,
|
|
56
|
+
initialClient = _ref$client === void 0 ? null : _ref$client,
|
|
57
|
+
_ref$section = _ref.section,
|
|
58
|
+
section = _ref$section === void 0 ? 'header' : _ref$section,
|
|
59
|
+
_ref$hasMultiAgents = _ref.hasMultiAgents,
|
|
60
|
+
hasMultiAgents = _ref$hasMultiAgents === void 0 ? false : _ref$hasMultiAgents,
|
|
61
|
+
className = _ref.className;
|
|
62
|
+
useStreamdownStyles();
|
|
63
|
+
var initialProjectValue = section === 'project' ? initialProject : null;
|
|
64
|
+
var _useState = useState(initialProjectValue),
|
|
65
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
66
|
+
project = _useState2[0],
|
|
67
|
+
setProject = _useState2[1];
|
|
68
|
+
useEffect(function () {
|
|
69
|
+
if (section === 'project' && initialProject != null) {
|
|
70
|
+
setProject(initialProject);
|
|
71
|
+
}
|
|
72
|
+
}, [section, initialProject]);
|
|
73
|
+
var _useProjectSummaryCon = useProjectSummaryConfig({
|
|
74
|
+
section: section,
|
|
75
|
+
entity: entity,
|
|
76
|
+
project: project,
|
|
77
|
+
setProject: setProject,
|
|
78
|
+
client: section === 'client' ? initialClient !== null && initialClient !== void 0 ? initialClient : null : undefined,
|
|
79
|
+
hasMultiAgents: hasMultiAgents
|
|
80
|
+
}),
|
|
81
|
+
context = _useProjectSummaryCon.context,
|
|
82
|
+
restoreConfigureSettings = _useProjectSummaryCon.restoreConfigureSettings;
|
|
83
|
+
var providerValue = useMemo(function () {
|
|
84
|
+
return _objectSpread(_objectSpread({}, context), {}, {
|
|
85
|
+
section: section
|
|
86
|
+
});
|
|
87
|
+
}, [context, section]);
|
|
88
|
+
useEffect(function () {
|
|
89
|
+
acquireChatsStore();
|
|
90
|
+
return function () {
|
|
91
|
+
releaseChatsStore();
|
|
92
|
+
restoreConfigureSettings();
|
|
93
|
+
};
|
|
94
|
+
}, [restoreConfigureSettings]);
|
|
95
|
+
return /*#__PURE__*/_jsx(GlobalContext.Provider, {
|
|
96
|
+
value: providerValue,
|
|
97
|
+
children: /*#__PURE__*/_jsx(ChatAIPageContent, {
|
|
98
|
+
section: section,
|
|
99
|
+
className: className
|
|
100
|
+
})
|
|
101
|
+
});
|
|
102
|
+
}, Features.CHAT_AI);
|
|
103
|
+
var ChatAIPageContent = function ChatAIPageContent(_ref2) {
|
|
104
|
+
var _user$permissions, _user$permissions2, _user$permissions3, _agents$data;
|
|
105
|
+
var section = _ref2.section,
|
|
106
|
+
className = _ref2.className;
|
|
107
|
+
var user = useUser();
|
|
108
|
+
var _useTranslation = useTranslation([SECTIONS.abmAgent]),
|
|
109
|
+
i18n = _useTranslation.i18n;
|
|
110
|
+
var amplitudEvent = useEvent();
|
|
111
|
+
var lang = i18n.language === 'br' ? 'pt-br' : i18n.language;
|
|
112
|
+
moment.locale(lang);
|
|
113
|
+
var _useState3 = useState({
|
|
114
|
+
message: '',
|
|
115
|
+
attachments: []
|
|
116
|
+
}),
|
|
117
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
118
|
+
userInitialMessage = _useState4[0],
|
|
119
|
+
setUserInitialMessage = _useState4[1];
|
|
120
|
+
var _useState5 = useState(null),
|
|
121
|
+
_useState6 = _slicedToArray(_useState5, 2),
|
|
122
|
+
initialChatId = _useState6[0],
|
|
123
|
+
setInitialChatId = _useState6[1];
|
|
124
|
+
var _useState7 = useState(0),
|
|
125
|
+
_useState8 = _slicedToArray(_useState7, 2),
|
|
126
|
+
newChatKey = _useState8[0],
|
|
127
|
+
setNewChatKey = _useState8[1];
|
|
128
|
+
var _useState9 = useState(null),
|
|
129
|
+
_useState0 = _slicedToArray(_useState9, 2),
|
|
130
|
+
sendMessageFunction = _useState0[0],
|
|
131
|
+
setSendMessageFunction = _useState0[1];
|
|
132
|
+
var _useState1 = useState(null),
|
|
133
|
+
_useState10 = _slicedToArray(_useState1, 2),
|
|
134
|
+
stopGenerationFunction = _useState10[0],
|
|
135
|
+
setStopGenerationFunction = _useState10[1];
|
|
136
|
+
var _useState11 = useState(false),
|
|
137
|
+
_useState12 = _slicedToArray(_useState11, 2),
|
|
138
|
+
isStreaming = _useState12[0],
|
|
139
|
+
setIsStreaming = _useState12[1];
|
|
140
|
+
var _useState13 = useState(false),
|
|
141
|
+
_useState14 = _slicedToArray(_useState13, 2),
|
|
142
|
+
isWriting = _useState14[0],
|
|
143
|
+
setIsWriting = _useState14[1];
|
|
144
|
+
var _useState15 = useState(false),
|
|
145
|
+
_useState16 = _slicedToArray(_useState15, 2),
|
|
146
|
+
refetchChats = _useState16[0],
|
|
147
|
+
setRefetchChats = _useState16[1];
|
|
148
|
+
var _useState17 = useState(options.home),
|
|
149
|
+
_useState18 = _slicedToArray(_useState17, 2),
|
|
150
|
+
currentOption = _useState18[0],
|
|
151
|
+
setCurrentOption = _useState18[1];
|
|
152
|
+
var _useState19 = useState(false),
|
|
153
|
+
_useState20 = _slicedToArray(_useState19, 2),
|
|
154
|
+
hasError = _useState20[0],
|
|
155
|
+
setHasError = _useState20[1];
|
|
156
|
+
var handlers = useMemo(function () {
|
|
157
|
+
return buildHandlers(setCurrentOption, setHasError);
|
|
158
|
+
}, []);
|
|
159
|
+
var _useState21 = useState(false),
|
|
160
|
+
_useState22 = _slicedToArray(_useState21, 2),
|
|
161
|
+
sidebarHasError = _useState22[0],
|
|
162
|
+
setSidebarHasError = _useState22[1];
|
|
163
|
+
var resetSelectedChatRef = useRef(null);
|
|
164
|
+
var _useState23 = useState('sidebar'),
|
|
165
|
+
_useState24 = _slicedToArray(_useState23, 2),
|
|
166
|
+
layoutMode = _useState24[0],
|
|
167
|
+
setLayoutMode = _useState24[1];
|
|
168
|
+
var expanded = layoutMode === 'fullscreen';
|
|
169
|
+
var _useGlobalContext = useGlobalContext(),
|
|
170
|
+
selectAgent = _useGlobalContext.selectAgent,
|
|
171
|
+
agent = _useGlobalContext.agent,
|
|
172
|
+
project = _useGlobalContext.project,
|
|
173
|
+
client = _useGlobalContext.client,
|
|
174
|
+
toggleWebSearch = _useGlobalContext.toggleWebSearch,
|
|
175
|
+
isWebSearchActive = _useGlobalContext.isWebSearchActive,
|
|
176
|
+
setChipsProject = _useGlobalContext.setChipsProject,
|
|
177
|
+
setClient = _useGlobalContext.setClient,
|
|
178
|
+
setProject = _useGlobalContext.setProject;
|
|
179
|
+
var _useGetAgents = useGetAgents({
|
|
180
|
+
selectAgent: selectAgent,
|
|
181
|
+
section: section,
|
|
182
|
+
agent: agent,
|
|
183
|
+
handleGoHome: handlers.home
|
|
184
|
+
}),
|
|
185
|
+
agents = _useGetAgents.agents,
|
|
186
|
+
loading = _useGetAgents.loading,
|
|
187
|
+
loadingMore = _useGetAgents.loadingMore,
|
|
188
|
+
agentError = _useGetAgents.error,
|
|
189
|
+
handleGetAgents = _useGetAgents.handleGetAgents,
|
|
190
|
+
loadMoreAgents = _useGetAgents.loadMoreAgents,
|
|
191
|
+
addAgent = _useGetAgents.addAgent,
|
|
192
|
+
removeAgent = _useGetAgents.removeAgent,
|
|
193
|
+
updateAgent = _useGetAgents.updateAgent,
|
|
194
|
+
updateAgentFavorite = _useGetAgents.updateAgentFavorite,
|
|
195
|
+
selectFirstAgent = _useGetAgents.selectFirstAgent,
|
|
196
|
+
sortAgentsList = _useGetAgents.sortAgentsList;
|
|
197
|
+
var _useGetSkills = useGetSkills(),
|
|
198
|
+
skills = _useGetSkills.skills,
|
|
199
|
+
loadingSkills = _useGetSkills.loading,
|
|
200
|
+
handleGetSkills = _useGetSkills.handleGetSkills,
|
|
201
|
+
removeSkill = _useGetSkills.removeSkill;
|
|
202
|
+
var isMAIA = validateIsMaia(agent);
|
|
203
|
+
var userHasPermissions = ((user === null || user === void 0 || (_user$permissions = user.permissions) === null || _user$permissions === void 0 || (_user$permissions = _user$permissions.ai_agents) === null || _user$permissions === void 0 ? void 0 : _user$permissions.create) || (user === null || user === void 0 || (_user$permissions2 = user.permissions) === null || _user$permissions2 === void 0 || (_user$permissions2 = _user$permissions2.ai_agents) === null || _user$permissions2 === void 0 ? void 0 : _user$permissions2.edit) || (user === null || user === void 0 || (_user$permissions3 = user.permissions) === null || _user$permissions3 === void 0 || (_user$permissions3 = _user$permissions3.ai_agents) === null || _user$permissions3 === void 0 ? void 0 : _user$permissions3["delete"])) && window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS;
|
|
204
|
+
var computedCurrentOption = useMemo(function () {
|
|
205
|
+
var isGlobalSpecialist = isMAIA && (agent === null || agent === void 0 ? void 0 : agent.entity) === 'global';
|
|
206
|
+
var isProjectSpecialist = isMAIA && ((agent === null || agent === void 0 ? void 0 : agent.entity) === 'project' || (agent === null || agent === void 0 ? void 0 : agent.entity) == null);
|
|
207
|
+
var isClientSpecialist = isMAIA && (agent === null || agent === void 0 ? void 0 : agent.entity) === 'client';
|
|
208
|
+
var isMaiaker = isMarketplaceGlobalCloneAgent(agent);
|
|
209
|
+
if (currentOption === options.myAgents && window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS) {
|
|
210
|
+
return options.myAgents;
|
|
211
|
+
}
|
|
212
|
+
if (currentOption === options.mySkills && window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS) {
|
|
213
|
+
return options.mySkills;
|
|
214
|
+
}
|
|
215
|
+
if (isGlobalSpecialist && !isMaiaker && (agent === null || agent === void 0 ? void 0 : agent.type) !== 'orchestrator' && currentOption === options.home) {
|
|
216
|
+
return options.chat;
|
|
217
|
+
}
|
|
218
|
+
var shouldShowProjectSelector = currentOption !== options.chat && isProjectSpecialist && !project;
|
|
219
|
+
var shouldShowClientSelector = currentOption !== options.chat && isClientSpecialist && !client;
|
|
220
|
+
if (shouldShowProjectSelector) return options.projectSelector;
|
|
221
|
+
if (shouldShowClientSelector) return options.clientSelector;
|
|
222
|
+
return currentOption;
|
|
223
|
+
}, [currentOption, project, client, isMAIA, agent === null || agent === void 0 ? void 0 : agent.entity, agent === null || agent === void 0 ? void 0 : agent.name, agent === null || agent === void 0 ? void 0 : agent.type]);
|
|
224
|
+
var isMaiakerAgentSelected = useMemo(function () {
|
|
225
|
+
return isMarketplaceGlobalCloneAgent(agent);
|
|
226
|
+
}, [agent]);
|
|
227
|
+
var sidebarAgentsNavActive = useMemo(function () {
|
|
228
|
+
if (computedCurrentOption === options.mySkills) return 'mySkills';
|
|
229
|
+
if (computedCurrentOption === options.myAgents) return 'myAgents';
|
|
230
|
+
if (isMaiakerAgentSelected) return 'maiaker';
|
|
231
|
+
return null;
|
|
232
|
+
}, [computedCurrentOption, isMaiakerAgentSelected]);
|
|
233
|
+
var agentsFetchedRef = useRef(false);
|
|
234
|
+
useEffect(function () {
|
|
235
|
+
if (!agentsFetchedRef.current) {
|
|
236
|
+
agentsFetchedRef.current = true;
|
|
237
|
+
handleGetAgents();
|
|
238
|
+
}
|
|
239
|
+
}, [handleGetAgents]);
|
|
240
|
+
useEffect(function () {
|
|
241
|
+
var onMergeCreatedAgent = function onMergeCreatedAgent(evt) {
|
|
242
|
+
var _ref3 = evt.detail || {},
|
|
243
|
+
nextAgent = _ref3.agent;
|
|
244
|
+
if (nextAgent !== null && nextAgent !== void 0 && nextAgent.id) addAgent(nextAgent, {
|
|
245
|
+
navigateHome: false
|
|
246
|
+
});
|
|
247
|
+
};
|
|
248
|
+
document.addEventListener('maia-merge-created-agent-into-list', onMergeCreatedAgent);
|
|
249
|
+
return function () {
|
|
250
|
+
return document.removeEventListener('maia-merge-created-agent-into-list', onMergeCreatedAgent);
|
|
251
|
+
};
|
|
252
|
+
}, [addAgent]);
|
|
253
|
+
useEffect(function () {
|
|
254
|
+
var onSyncEditedAgent = function onSyncEditedAgent(evt) {
|
|
255
|
+
var _ref4 = evt.detail || {},
|
|
256
|
+
nextAgent = _ref4.agent;
|
|
257
|
+
if (!(nextAgent !== null && nextAgent !== void 0 && nextAgent.id)) return;
|
|
258
|
+
updateAgent(nextAgent);
|
|
259
|
+
if ((agent === null || agent === void 0 ? void 0 : agent.id) === nextAgent.id) selectAgent(nextAgent);
|
|
260
|
+
};
|
|
261
|
+
document.addEventListener('maia-sync-edited-agent-from-chat', onSyncEditedAgent);
|
|
262
|
+
return function () {
|
|
263
|
+
return document.removeEventListener('maia-sync-edited-agent-from-chat', onSyncEditedAgent);
|
|
264
|
+
};
|
|
265
|
+
}, [updateAgent, selectAgent, agent === null || agent === void 0 ? void 0 : agent.id]);
|
|
266
|
+
useEffect(function () {
|
|
267
|
+
var openChatView = function openChatView() {
|
|
268
|
+
setHasError(false);
|
|
269
|
+
setInitialChatId(null);
|
|
270
|
+
setNewChatKey(function (prev) {
|
|
271
|
+
return prev + 1;
|
|
272
|
+
});
|
|
273
|
+
setUserInitialMessage({
|
|
274
|
+
message: '',
|
|
275
|
+
attachments: []
|
|
276
|
+
});
|
|
277
|
+
setCurrentOption(options.chat);
|
|
278
|
+
document.dispatchEvent(new CustomEvent('chat-session-changed'));
|
|
279
|
+
};
|
|
280
|
+
document.addEventListener('maia-open-chat-view', openChatView);
|
|
281
|
+
return function () {
|
|
282
|
+
return document.removeEventListener('maia-open-chat-view', openChatView);
|
|
283
|
+
};
|
|
284
|
+
}, []);
|
|
285
|
+
useEffect(function () {
|
|
286
|
+
var openNewChatWithAgent = function openNewChatWithAgent(event) {
|
|
287
|
+
var _detail;
|
|
288
|
+
var nextAgent = (_detail = event.detail) === null || _detail === void 0 ? void 0 : _detail.agent;
|
|
289
|
+
if (!nextAgent) return;
|
|
290
|
+
setProject(null);
|
|
291
|
+
setClient === null || setClient === void 0 || setClient(null);
|
|
292
|
+
selectAgent(nextAgent);
|
|
293
|
+
setHasError(false);
|
|
294
|
+
setCurrentOption(options.home);
|
|
295
|
+
};
|
|
296
|
+
document.addEventListener('maia-open-new-chat-with-agent', openNewChatWithAgent);
|
|
297
|
+
return function () {
|
|
298
|
+
return document.removeEventListener('maia-open-new-chat-with-agent', openNewChatWithAgent);
|
|
299
|
+
};
|
|
300
|
+
}, [selectAgent, setClient, setProject]);
|
|
301
|
+
var startChat = useCallback(function (message, attachments, faqId, agentSuggestionId) {
|
|
302
|
+
if (sidebarHasError) setSidebarHasError(false);
|
|
303
|
+
setInitialChatId(null);
|
|
304
|
+
setNewChatKey(function (prev) {
|
|
305
|
+
return prev + 1;
|
|
306
|
+
});
|
|
307
|
+
setUserInitialMessage(_objectSpread(_objectSpread({
|
|
308
|
+
message: message || '',
|
|
309
|
+
attachments: attachments || []
|
|
310
|
+
}, faqId ? {
|
|
311
|
+
faqId: faqId
|
|
312
|
+
} : {}), agentSuggestionId ? {
|
|
313
|
+
agentSuggestionId: agentSuggestionId
|
|
314
|
+
} : {}));
|
|
315
|
+
handlers.chat();
|
|
316
|
+
}, [handlers, sidebarHasError]);
|
|
317
|
+
|
|
318
|
+
// Sidebar types this prop as (chatId: string) but passes the full chat object at runtime
|
|
319
|
+
var goToChat = useCallback(function (chatArg) {
|
|
320
|
+
var chat = chatArg;
|
|
321
|
+
setUserInitialMessage({
|
|
322
|
+
message: '',
|
|
323
|
+
attachments: []
|
|
324
|
+
});
|
|
325
|
+
setInitialChatId(chat.sessionExternalId);
|
|
326
|
+
var selectedAgent = agents.data.find(function (agentItem) {
|
|
327
|
+
return agentItem.id === chat.agentId;
|
|
328
|
+
});
|
|
329
|
+
if (selectedAgent) selectAgent(selectedAgent);
|
|
330
|
+
document.dispatchEvent(new CustomEvent('chat-session-changed'));
|
|
331
|
+
handlers.chat();
|
|
332
|
+
}, [handlers, agents, selectAgent]);
|
|
333
|
+
var handleSendMessageReady = useCallback(function (sendMessage, stopGeneration, streaming, writing) {
|
|
334
|
+
setSendMessageFunction(function () {
|
|
335
|
+
return sendMessage;
|
|
336
|
+
});
|
|
337
|
+
setStopGenerationFunction(function () {
|
|
338
|
+
return stopGeneration;
|
|
339
|
+
});
|
|
340
|
+
setIsStreaming(streaming);
|
|
341
|
+
setIsWriting(writing);
|
|
342
|
+
}, []);
|
|
343
|
+
var handleSendMessage = useCallback(function (message, attachments, faqId, agentSuggestionId) {
|
|
344
|
+
if (sidebarHasError) setSidebarHasError(false);
|
|
345
|
+
if (sendMessageFunction && computedCurrentOption === options.chat) {
|
|
346
|
+
sendMessageFunction(message, attachments, faqId, agentSuggestionId);
|
|
347
|
+
} else {
|
|
348
|
+
startChat(message, attachments, faqId, agentSuggestionId);
|
|
349
|
+
}
|
|
350
|
+
}, [sendMessageFunction, startChat, computedCurrentOption, sidebarHasError]);
|
|
351
|
+
var handleGoHome = useCallback(function () {
|
|
352
|
+
if (currentOption === options.chat) {
|
|
353
|
+
setInitialChatId(null);
|
|
354
|
+
setNewChatKey(function (prev) {
|
|
355
|
+
return prev + 1;
|
|
356
|
+
});
|
|
357
|
+
if ((agent === null || agent === void 0 ? void 0 : agent.entity) !== 'client') setClient === null || setClient === void 0 || setClient(null);
|
|
358
|
+
}
|
|
359
|
+
if ((!agent || agent !== null && agent !== void 0 && agent.is_deleted || agent !== null && agent !== void 0 && agent.has_not_permissions || agent !== null && agent !== void 0 && agent.has_not_access || agent !== null && agent !== void 0 && agent.project_deleted) && agents.data.length > 0) {
|
|
360
|
+
selectAgent(agents.data[0]);
|
|
361
|
+
}
|
|
362
|
+
setCurrentOption(options.home);
|
|
363
|
+
setChipsProject(null);
|
|
364
|
+
setHasError(false);
|
|
365
|
+
if (isWebSearchActive) toggleWebSearch();
|
|
366
|
+
if (resetSelectedChatRef.current) resetSelectedChatRef.current();
|
|
367
|
+
}, [currentOption, isWebSearchActive, toggleWebSearch, agent, agents, selectAgent, setClient, setChipsProject]);
|
|
368
|
+
var handleResetChat = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
|
|
369
|
+
return _regeneratorRuntime.wrap(function (_context) {
|
|
370
|
+
while (1) switch (_context.prev = _context.next) {
|
|
371
|
+
case 0:
|
|
372
|
+
setUserInitialMessage({
|
|
373
|
+
message: '',
|
|
374
|
+
attachments: []
|
|
375
|
+
});
|
|
376
|
+
setInitialChatId(null);
|
|
377
|
+
document.dispatchEvent(new CustomEvent('chat-session-changed'));
|
|
378
|
+
handleGoHome();
|
|
379
|
+
case 1:
|
|
380
|
+
case "end":
|
|
381
|
+
return _context.stop();
|
|
382
|
+
}
|
|
383
|
+
}, _callee);
|
|
384
|
+
})), [handleGoHome]);
|
|
385
|
+
var handleOpenMarketplace = useCallback(function () {
|
|
386
|
+
if (!window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS) {
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
setCurrentOption(options.myAgents);
|
|
390
|
+
}, []);
|
|
391
|
+
var handleOpenSkills = useCallback(function () {
|
|
392
|
+
if (!window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS) {
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
setHasError(false);
|
|
396
|
+
setCurrentOption(options.mySkills);
|
|
397
|
+
handleGetSkills();
|
|
398
|
+
}, [handleGetSkills]);
|
|
399
|
+
var handleGoToMaiaker = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
|
|
400
|
+
var maiakerAgent, response, data, _t;
|
|
401
|
+
return _regeneratorRuntime.wrap(function (_context2) {
|
|
402
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
403
|
+
case 0:
|
|
404
|
+
setHasError(false);
|
|
405
|
+
maiakerAgent = agents.data.find(function (a) {
|
|
406
|
+
return isMarketplaceGlobalCloneAgent(a);
|
|
407
|
+
});
|
|
408
|
+
if (maiakerAgent) {
|
|
409
|
+
_context2.next = 5;
|
|
410
|
+
break;
|
|
411
|
+
}
|
|
412
|
+
_context2.prev = 1;
|
|
413
|
+
_context2.next = 2;
|
|
414
|
+
return fetchMaia({
|
|
415
|
+
path: "agents?agent_type=clone&lang=".concat(mapCORLang(i18n.language)),
|
|
416
|
+
method: 'GET'
|
|
417
|
+
});
|
|
418
|
+
case 2:
|
|
419
|
+
response = _context2.sent;
|
|
420
|
+
_context2.next = 3;
|
|
421
|
+
return response.json();
|
|
422
|
+
case 3:
|
|
423
|
+
data = _context2.sent;
|
|
424
|
+
maiakerAgent = (data.data || []).find(function (a) {
|
|
425
|
+
return isMarketplaceGlobalCloneAgent(a);
|
|
426
|
+
});
|
|
427
|
+
_context2.next = 5;
|
|
428
|
+
break;
|
|
429
|
+
case 4:
|
|
430
|
+
_context2.prev = 4;
|
|
431
|
+
_t = _context2["catch"](1);
|
|
432
|
+
return _context2.abrupt("return");
|
|
433
|
+
case 5:
|
|
434
|
+
if (maiakerAgent) {
|
|
435
|
+
_context2.next = 6;
|
|
436
|
+
break;
|
|
437
|
+
}
|
|
438
|
+
return _context2.abrupt("return");
|
|
439
|
+
case 6:
|
|
440
|
+
setProject(null);
|
|
441
|
+
setClient === null || setClient === void 0 || setClient(null);
|
|
442
|
+
selectAgent(maiakerAgent);
|
|
443
|
+
setCurrentOption(options.home);
|
|
444
|
+
if (resetSelectedChatRef.current) resetSelectedChatRef.current();
|
|
445
|
+
case 7:
|
|
446
|
+
case "end":
|
|
447
|
+
return _context2.stop();
|
|
448
|
+
}
|
|
449
|
+
}, _callee2, null, [[1, 4]]);
|
|
450
|
+
})), [agents.data, i18n.language, selectAgent, setClient, setProject]);
|
|
451
|
+
var handleDeleteAgentFromMyAgents = useCallback(function (agentId) {
|
|
452
|
+
removeAgent(agentId);
|
|
453
|
+
if ((agent === null || agent === void 0 ? void 0 : agent.id) === agentId) selectFirstAgent(agentId);
|
|
454
|
+
}, [agent === null || agent === void 0 ? void 0 : agent.id, removeAgent, selectFirstAgent]);
|
|
455
|
+
var showNewChat = computedCurrentOption !== options.chat;
|
|
456
|
+
var hideHeaderAgentSelector = computedCurrentOption === options.myAgents || computedCurrentOption === options.mySkills;
|
|
457
|
+
var hideFooterOnMaiakerMarketplaceHome = computedCurrentOption === options.home && isMaiakerAgentSelected;
|
|
458
|
+
|
|
459
|
+
// Suppress unused variable warning — kept for potential Amplitude tracking parity
|
|
460
|
+
void amplitudEvent;
|
|
461
|
+
return /*#__PURE__*/_jsxs(SCPageWrapper, {
|
|
462
|
+
className: className,
|
|
463
|
+
children: [validateAccessByFeature(section) ? /*#__PURE__*/_jsx(Sidebar, {
|
|
464
|
+
onGoToChat: goToChat,
|
|
465
|
+
onError: function onError() {
|
|
466
|
+
return setSidebarHasError(true);
|
|
467
|
+
},
|
|
468
|
+
handleGoToHome: handleGoHome,
|
|
469
|
+
handleOpenMarketplace: handleOpenMarketplace,
|
|
470
|
+
handleOpenSkills: handleOpenSkills,
|
|
471
|
+
showNewChat: showNewChat,
|
|
472
|
+
refetchChats: refetchChats,
|
|
473
|
+
handleSetRefetchChats: setRefetchChats,
|
|
474
|
+
hasError: sidebarHasError,
|
|
475
|
+
resetSelectedChatRef: resetSelectedChatRef,
|
|
476
|
+
agentsNavActive: sidebarAgentsNavActive
|
|
477
|
+
}) : null, /*#__PURE__*/_jsxs(SCPageMain, {
|
|
478
|
+
children: [/*#__PURE__*/_jsx(ChatAIModalHeader, {
|
|
479
|
+
layoutMode: layoutMode,
|
|
480
|
+
onLayoutModeChange: setLayoutMode,
|
|
481
|
+
expanded: expanded,
|
|
482
|
+
agents: agents.data,
|
|
483
|
+
hasError: !!agentError,
|
|
484
|
+
loading: loading,
|
|
485
|
+
loadingMore: loadingMore,
|
|
486
|
+
hasMore: agents.has_more,
|
|
487
|
+
handleResetChat: handleResetChat,
|
|
488
|
+
onAgentUpdate: updateAgentFavorite,
|
|
489
|
+
loadMoreAgents: loadMoreAgents,
|
|
490
|
+
sortAgentsList: sortAgentsList,
|
|
491
|
+
hideAgentSelector: hideHeaderAgentSelector,
|
|
492
|
+
hideControls: true
|
|
493
|
+
}), hasError ? /*#__PURE__*/_jsx(MAIAError, {}) : validateAccessByFeature(section) ? /*#__PURE__*/_jsx(ChatAIContent, {
|
|
494
|
+
currentOption: computedCurrentOption,
|
|
495
|
+
handlers: _objectSpread(_objectSpread({}, handlers), {}, {
|
|
496
|
+
chat: startChat,
|
|
497
|
+
home: handlers.home,
|
|
498
|
+
handleGoHome: handleGoHome
|
|
499
|
+
}),
|
|
500
|
+
onError: function onError() {
|
|
501
|
+
return setHasError(true);
|
|
502
|
+
},
|
|
503
|
+
refs: {
|
|
504
|
+
userInitialMessage: userInitialMessage,
|
|
505
|
+
initialChatId: initialChatId
|
|
506
|
+
},
|
|
507
|
+
onSendMessageReady: handleSendMessageReady,
|
|
508
|
+
expanded: expanded,
|
|
509
|
+
floating: false,
|
|
510
|
+
agents: agents.data,
|
|
511
|
+
onDeleteAgent: handleDeleteAgentFromMyAgents,
|
|
512
|
+
onFavoriteAgentUpdate: updateAgentFavorite,
|
|
513
|
+
hasMoreAgents: !!agents.has_more,
|
|
514
|
+
loadingMoreAgents: loadingMore,
|
|
515
|
+
onLoadMoreAgents: loadMoreAgents,
|
|
516
|
+
onGoToMaiaker: handleGoToMaiaker,
|
|
517
|
+
skills: skills,
|
|
518
|
+
loadingSkills: loadingSkills,
|
|
519
|
+
onDeleteSkill: removeSkill,
|
|
520
|
+
loadingAgents: loading,
|
|
521
|
+
agentError: agentError
|
|
522
|
+
}) : /*#__PURE__*/_jsx(ProjectSummaryContent, {
|
|
523
|
+
onRestartSummary: handlers.home
|
|
524
|
+
}), (computedCurrentOption === options.home && !!(agents !== null && agents !== void 0 && (_agents$data = agents.data) !== null && _agents$data !== void 0 && _agents$data.length) || computedCurrentOption === options.chat) && !hideFooterOnMaiakerMarketplaceHome && !hasError && !loading && validateAccessByFeature(section) && /*#__PURE__*/_jsx(ChatAiModalFooter, {
|
|
525
|
+
agent: agent,
|
|
526
|
+
handleSendMessage: handleSendMessage,
|
|
527
|
+
handleStopGeneration: stopGenerationFunction,
|
|
528
|
+
isStreaming: isStreaming,
|
|
529
|
+
isWriting: isWriting,
|
|
530
|
+
chatId: initialChatId,
|
|
531
|
+
newChatKey: newChatKey,
|
|
532
|
+
layoutMode: layoutMode
|
|
533
|
+
})]
|
|
534
|
+
}), userHasPermissions && /*#__PURE__*/_jsx(AbmAgentModal, {
|
|
535
|
+
addAgent: addAgent,
|
|
536
|
+
updateAgent: updateAgent,
|
|
537
|
+
removeAgent: removeAgent,
|
|
538
|
+
updateAgentFavorite: updateAgentFavorite,
|
|
539
|
+
selectFirstAgent: selectFirstAgent
|
|
540
|
+
}), /*#__PURE__*/_jsx(Snackbar, {})]
|
|
541
|
+
});
|
|
542
|
+
};
|
|
543
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZUVmZmVjdCIsInVzZU1lbW8iLCJ1c2VSZWYiLCJ1c2VTdGF0ZSIsIm1vbWVudCIsInVzZVRyYW5zbGF0aW9uIiwidXNlVXNlciIsIk1BSUFFcnJvciIsIkNoYXRBSUNvbnRlbnQiLCJidWlsZEhhbmRsZXJzIiwib3B0aW9ucyIsIlNpZGViYXIiLCJ1c2VHZXRBZ2VudHMiLCJHbG9iYWxDb250ZXh0IiwidXNlR2xvYmFsQ29udGV4dCIsIkNoYXRBSU1vZGFsSGVhZGVyIiwiU25hY2tiYXIiLCJQcm9qZWN0U3VtbWFyeUNvbnRlbnQiLCJBYm1BZ2VudE1vZGFsIiwiQ2hhdEFpTW9kYWxGb290ZXIiLCJTRUNUSU9OUyIsInZhbGlkYXRlSXNNYWlhIiwiZmV0Y2hNYWlhIiwibWFwQ09STGFuZyIsInVzZVN0cmVhbWRvd25TdHlsZXMiLCJ1c2VQcm9qZWN0U3VtbWFyeUNvbmZpZyIsImFjcXVpcmVDaGF0c1N0b3JlIiwicmVsZWFzZUNoYXRzU3RvcmUiLCJ1c2VFdmVudCIsInVzZUdldFNraWxscyIsImlzTWFya2V0cGxhY2VHbG9iYWxDbG9uZUFnZW50Iiwid2l0aEFwcENmZyIsIkZlYXR1cmVzIiwiU0NQYWdlTWFpbiIsIlNDUGFnZVdyYXBwZXIiLCJqc3giLCJfanN4IiwianN4cyIsIl9qc3hzIiwidmFsaWRhdGVBY2Nlc3NCeUZlYXR1cmUiLCJzZWN0aW9uIiwid2luZG93IiwiTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyIsIk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTUyIsIkNoYXRBSVBhZ2UiLCJfcmVmIiwiX3JlZiRlbnRpdHkiLCJlbnRpdHkiLCJwcm9qZWN0SWQiLCJjbGllbnRJZCIsIl9yZWYkcHJvamVjdCIsInByb2plY3QiLCJpbml0aWFsUHJvamVjdCIsIl9yZWYkY2xpZW50IiwiY2xpZW50IiwiaW5pdGlhbENsaWVudCIsIl9yZWYkc2VjdGlvbiIsIl9yZWYkaGFzTXVsdGlBZ2VudHMiLCJoYXNNdWx0aUFnZW50cyIsImNsYXNzTmFtZSIsImluaXRpYWxQcm9qZWN0VmFsdWUiLCJfdXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkiLCJzZXRQcm9qZWN0IiwiX3VzZVByb2plY3RTdW1tYXJ5Q29uIiwidW5kZWZpbmVkIiwiY29udGV4dCIsInJlc3RvcmVDb25maWd1cmVTZXR0aW5ncyIsInByb3ZpZGVyVmFsdWUiLCJfb2JqZWN0U3ByZWFkIiwiUHJvdmlkZXIiLCJ2YWx1ZSIsImNoaWxkcmVuIiwiQ2hhdEFJUGFnZUNvbnRlbnQiLCJDSEFUX0FJIiwiX3JlZjIiLCJfdXNlciRwZXJtaXNzaW9ucyIsIl91c2VyJHBlcm1pc3Npb25zMiIsIl91c2VyJHBlcm1pc3Npb25zMyIsIl9hZ2VudHMkZGF0YSIsInVzZXIiLCJfdXNlVHJhbnNsYXRpb24iLCJhYm1BZ2VudCIsImkxOG4iLCJhbXBsaXR1ZEV2ZW50IiwibGFuZyIsImxhbmd1YWdlIiwibG9jYWxlIiwiX3VzZVN0YXRlMyIsIm1lc3NhZ2UiLCJhdHRhY2htZW50cyIsIl91c2VTdGF0ZTQiLCJ1c2VySW5pdGlhbE1lc3NhZ2UiLCJzZXRVc2VySW5pdGlhbE1lc3NhZ2UiLCJfdXNlU3RhdGU1IiwiX3VzZVN0YXRlNiIsImluaXRpYWxDaGF0SWQiLCJzZXRJbml0aWFsQ2hhdElkIiwiX3VzZVN0YXRlNyIsIl91c2VTdGF0ZTgiLCJuZXdDaGF0S2V5Iiwic2V0TmV3Q2hhdEtleSIsIl91c2VTdGF0ZTkiLCJfdXNlU3RhdGUwIiwic2VuZE1lc3NhZ2VGdW5jdGlvbiIsInNldFNlbmRNZXNzYWdlRnVuY3Rpb24iLCJfdXNlU3RhdGUxIiwiX3VzZVN0YXRlMTAiLCJzdG9wR2VuZXJhdGlvbkZ1bmN0aW9uIiwic2V0U3RvcEdlbmVyYXRpb25GdW5jdGlvbiIsIl91c2VTdGF0ZTExIiwiX3VzZVN0YXRlMTIiLCJpc1N0cmVhbWluZyIsInNldElzU3RyZWFtaW5nIiwiX3VzZVN0YXRlMTMiLCJfdXNlU3RhdGUxNCIsImlzV3JpdGluZyIsInNldElzV3JpdGluZyIsIl91c2VTdGF0ZTE1IiwiX3VzZVN0YXRlMTYiLCJyZWZldGNoQ2hhdHMiLCJzZXRSZWZldGNoQ2hhdHMiLCJfdXNlU3RhdGUxNyIsImhvbWUiLCJfdXNlU3RhdGUxOCIsImN1cnJlbnRPcHRpb24iLCJzZXRDdXJyZW50T3B0aW9uIiwiX3VzZVN0YXRlMTkiLCJfdXNlU3RhdGUyMCIsImhhc0Vycm9yIiwic2V0SGFzRXJyb3IiLCJoYW5kbGVycyIsIl91c2VTdGF0ZTIxIiwiX3VzZVN0YXRlMjIiLCJzaWRlYmFySGFzRXJyb3IiLCJzZXRTaWRlYmFySGFzRXJyb3IiLCJyZXNldFNlbGVjdGVkQ2hhdFJlZiIsIl91c2VTdGF0ZTIzIiwiX3VzZVN0YXRlMjQiLCJsYXlvdXRNb2RlIiwic2V0TGF5b3V0TW9kZSIsImV4cGFuZGVkIiwiX3VzZUdsb2JhbENvbnRleHQiLCJzZWxlY3RBZ2VudCIsImFnZW50IiwidG9nZ2xlV2ViU2VhcmNoIiwiaXNXZWJTZWFyY2hBY3RpdmUiLCJzZXRDaGlwc1Byb2plY3QiLCJzZXRDbGllbnQiLCJfdXNlR2V0QWdlbnRzIiwiaGFuZGxlR29Ib21lIiwiYWdlbnRzIiwibG9hZGluZyIsImxvYWRpbmdNb3JlIiwiYWdlbnRFcnJvciIsImVycm9yIiwiaGFuZGxlR2V0QWdlbnRzIiwibG9hZE1vcmVBZ2VudHMiLCJhZGRBZ2VudCIsInJlbW92ZUFnZW50IiwidXBkYXRlQWdlbnQiLCJ1cGRhdGVBZ2VudEZhdm9yaXRlIiwic2VsZWN0Rmlyc3RBZ2VudCIsInNvcnRBZ2VudHNMaXN0IiwiX3VzZUdldFNraWxscyIsInNraWxscyIsImxvYWRpbmdTa2lsbHMiLCJoYW5kbGVHZXRTa2lsbHMiLCJyZW1vdmVTa2lsbCIsImlzTUFJQSIsInVzZXJIYXNQZXJtaXNzaW9ucyIsInBlcm1pc3Npb25zIiwiYWlfYWdlbnRzIiwiY3JlYXRlIiwiZWRpdCIsImNvbXB1dGVkQ3VycmVudE9wdGlvbiIsImlzR2xvYmFsU3BlY2lhbGlzdCIsImlzUHJvamVjdFNwZWNpYWxpc3QiLCJpc0NsaWVudFNwZWNpYWxpc3QiLCJpc01haWFrZXIiLCJteUFnZW50cyIsIm15U2tpbGxzIiwidHlwZSIsImNoYXQiLCJzaG91bGRTaG93UHJvamVjdFNlbGVjdG9yIiwic2hvdWxkU2hvd0NsaWVudFNlbGVjdG9yIiwicHJvamVjdFNlbGVjdG9yIiwiY2xpZW50U2VsZWN0b3IiLCJuYW1lIiwiaXNNYWlha2VyQWdlbnRTZWxlY3RlZCIsInNpZGViYXJBZ2VudHNOYXZBY3RpdmUiLCJhZ2VudHNGZXRjaGVkUmVmIiwiY3VycmVudCIsIm9uTWVyZ2VDcmVhdGVkQWdlbnQiLCJldnQiLCJfcmVmMyIsImRldGFpbCIsIm5leHRBZ2VudCIsImlkIiwibmF2aWdhdGVIb21lIiwiZG9jdW1lbnQiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIm9uU3luY0VkaXRlZEFnZW50IiwiX3JlZjQiLCJvcGVuQ2hhdFZpZXciLCJwcmV2IiwiZGlzcGF0Y2hFdmVudCIsIkN1c3RvbUV2ZW50Iiwib3Blbk5ld0NoYXRXaXRoQWdlbnQiLCJldmVudCIsIl9kZXRhaWwiLCJzdGFydENoYXQiLCJmYXFJZCIsImFnZW50U3VnZ2VzdGlvbklkIiwiZ29Ub0NoYXQiLCJjaGF0QXJnIiwic2Vzc2lvbkV4dGVybmFsSWQiLCJzZWxlY3RlZEFnZW50IiwiZGF0YSIsImZpbmQiLCJhZ2VudEl0ZW0iLCJhZ2VudElkIiwiaGFuZGxlU2VuZE1lc3NhZ2VSZWFkeSIsInNlbmRNZXNzYWdlIiwic3RvcEdlbmVyYXRpb24iLCJzdHJlYW1pbmciLCJ3cml0aW5nIiwiaGFuZGxlU2VuZE1lc3NhZ2UiLCJpc19kZWxldGVkIiwiaGFzX25vdF9wZXJtaXNzaW9ucyIsImhhc19ub3RfYWNjZXNzIiwicHJvamVjdF9kZWxldGVkIiwibGVuZ3RoIiwiaGFuZGxlUmVzZXRDaGF0IiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJ3cmFwIiwiX2NvbnRleHQiLCJuZXh0Iiwic3RvcCIsImhhbmRsZU9wZW5NYXJrZXRwbGFjZSIsImhhbmRsZU9wZW5Ta2lsbHMiLCJoYW5kbGVHb1RvTWFpYWtlciIsIl9jYWxsZWUyIiwibWFpYWtlckFnZW50IiwicmVzcG9uc2UiLCJfdCIsIl9jb250ZXh0MiIsImEiLCJwYXRoIiwiY29uY2F0IiwibWV0aG9kIiwic2VudCIsImpzb24iLCJhYnJ1cHQiLCJoYW5kbGVEZWxldGVBZ2VudEZyb21NeUFnZW50cyIsInNob3dOZXdDaGF0IiwiaGlkZUhlYWRlckFnZW50U2VsZWN0b3IiLCJoaWRlRm9vdGVyT25NYWlha2VyTWFya2V0cGxhY2VIb21lIiwib25Hb1RvQ2hhdCIsIm9uRXJyb3IiLCJoYW5kbGVHb1RvSG9tZSIsImhhbmRsZVNldFJlZmV0Y2hDaGF0cyIsImFnZW50c05hdkFjdGl2ZSIsIm9uTGF5b3V0TW9kZUNoYW5nZSIsImhhc01vcmUiLCJoYXNfbW9yZSIsIm9uQWdlbnRVcGRhdGUiLCJoaWRlQWdlbnRTZWxlY3RvciIsImhpZGVDb250cm9scyIsInJlZnMiLCJvblNlbmRNZXNzYWdlUmVhZHkiLCJmbG9hdGluZyIsIm9uRGVsZXRlQWdlbnQiLCJvbkZhdm9yaXRlQWdlbnRVcGRhdGUiLCJoYXNNb3JlQWdlbnRzIiwibG9hZGluZ01vcmVBZ2VudHMiLCJvbkxvYWRNb3JlQWdlbnRzIiwib25Hb1RvTWFpYWtlciIsIm9uRGVsZXRlU2tpbGwiLCJsb2FkaW5nQWdlbnRzIiwib25SZXN0YXJ0U3VtbWFyeSIsImhhbmRsZVN0b3BHZW5lcmF0aW9uIiwiY2hhdElkIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvb3JnYW5pc21zL0NoYXRBSVBhZ2UvQ2hhdEFJUGFnZS50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tbmVzdGVkLXRlcm5hcnkgKi9cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0L2Z1bmN0aW9uLWNvbXBvbmVudC1kZWZpbml0aW9uICovXG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCdcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSAncmVhY3QtaTE4bmV4dCdcbmltcG9ydCB7IHVzZVVzZXIgfSBmcm9tICcuLi8uLi8uLi9jb250ZXh0L2Nvci11c2VyJ1xuaW1wb3J0IHsgTUFJQUVycm9yIH0gZnJvbSAnLi4vLi4vYXRvbXMvTUFJQUVycm9yJ1xuaW1wb3J0IHsgQ2hhdEFJQ29udGVudCB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9DaGF0QUlDb250ZW50J1xuaW1wb3J0IHsgYnVpbGRIYW5kbGVycywgb3B0aW9ucyB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9DaGF0QUlNb2RhbC9jb25zdGFudHMnXG5pbXBvcnQgeyBTaWRlYmFyIH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL1NpZGViYXInXG5pbXBvcnQgeyB1c2VHZXRBZ2VudHMgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tYWlhL0FnZW50cy9nZXRBZ2VudHMnXG5pbXBvcnQgeyBHbG9iYWxDb250ZXh0LCB1c2VHbG9iYWxDb250ZXh0IH0gZnJvbSAnLi4vLi4vLi4vY29udGV4dC9nbG9iYWwtY29udGV4dCdcbmltcG9ydCB7IEF0dGFjaG1lbnRGaWxlIH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL0NoYXRGb290ZXIvQ2hhdEZvb3RlcidcbmltcG9ydCB7IENoYXRBSU1vZGFsSGVhZGVyIH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL0NoYXRBSU1vZGFsL2NvbXBvbmVudHMvQ2hhdEFpTW9kYWxIZWFkZXIvQ2hhdEFpTW9kYWxIZWFkZXInXG5pbXBvcnQgeyBTbmFja2JhciB9IGZyb20gJy4uL1NuYWNrQmFyL1NuYWNrYmFyJ1xuaW1wb3J0IHsgUHJvamVjdFN1bW1hcnlDb250ZW50IH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL1Byb2plY3RTdW1tYXJ5Q29udGVudCdcbmltcG9ydCB7IEFibUFnZW50TW9kYWwgfSBmcm9tICcuLi9BYm1BZ2VudE1vZGFsL0FibUFnZW50TW9kYWwnXG5pbXBvcnQgeyBDaGF0QWlNb2RhbEZvb3RlciB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9DaGF0QUlNb2RhbC9jb21wb25lbnRzL0NoYXRBaU1vZGFsRm9vdGVyJ1xuaW1wb3J0IHsgU0VDVElPTlMgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvY29uZmlnJ1xuaW1wb3J0IHsgdmFsaWRhdGVJc01haWEgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy91dGlscy92YWxpZGF0ZUlzTWFpYSdcbmltcG9ydCB7IEFnZW50IH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvYWdlbnQnXG5pbXBvcnQgeyBmZXRjaE1haWEgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tYWlhL2NsaWVudCdcbmltcG9ydCB7IG1hcENPUkxhbmcgfSBmcm9tICcuLi8uLi8uLi9sYW5nL3V0aWxzJ1xuaW1wb3J0IHsgdXNlU3RyZWFtZG93blN0eWxlcyB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZVN0cmVhbWRvd25TdHlsZXMnXG5pbXBvcnQgeyB1c2VQcm9qZWN0U3VtbWFyeUNvbmZpZyB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZVByb2plY3RTdW1tYXJ5Q29uZmlnJ1xuaW1wb3J0IHsgYWNxdWlyZUNoYXRzU3RvcmUsIHJlbGVhc2VDaGF0c1N0b3JlIH0gZnJvbSAnLi4vLi4vLi4vc3RvcmUnXG5pbXBvcnQgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvUHJvamVjdCdcbmltcG9ydCB7IENsaWVudCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL0NsaWVudCdcbmltcG9ydCB7IEVWRU5UUywgdXNlRXZlbnQgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VFdmVudCdcbmltcG9ydCB7IE1haWFDaGF0TW9kYWxMYXlvdXRNb2RlIH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL0NoYXRBSU1vZGFsL2xheW91dCdcbmltcG9ydCB7IHVzZUdldFNraWxscyB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL21haWEvU2tpbGxzL2dldFNraWxscydcbmltcG9ydCB7IGlzTWFya2V0cGxhY2VHbG9iYWxDbG9uZUFnZW50IH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvYWdlbnREaXNwbGF5TmFtZSdcbmltcG9ydCB7IHdpdGhBcHBDZmcgfSBmcm9tICcuLi8uLi9hdG9tcy9XaXRoQXBwQ2ZnJ1xuaW1wb3J0IHsgRmVhdHVyZXMgfSBmcm9tICcuLi8uLi9hdG9tcy9XaXRoRmVhdHVyZVZhbGlkYXRpb24nXG5pbXBvcnQgeyBTQ1BhZ2VNYWluLCBTQ1BhZ2VXcmFwcGVyIH0gZnJvbSAnLi9DaGF0QUlQYWdlLnN0eWxlcydcblxuZXhwb3J0IHR5cGUgQ2hhdEFJUGFnZVByb3BzID0ge1xuICBlbnRpdHk/OiB7IHByb2plY3RJZDogc3RyaW5nIHwgbnVsbDsgY2xpZW50SWQ6IHN0cmluZyB8IG51bGwgfVxuICBwcm9qZWN0PzogUHJvamVjdCB8IG51bGxcbiAgY2xpZW50PzogQ2xpZW50IHwgbnVsbFxuICBzZWN0aW9uPzogJ3Byb2plY3QnIHwgJ2hlYWRlcicgfCAnY2xpZW50J1xuICBoYXNNdWx0aUFnZW50cz86IGJvb2xlYW5cbiAgY2xhc3NOYW1lPzogc3RyaW5nXG59XG5cbnR5cGUgU2VjdGlvblR5cGUgPSAncHJvamVjdCcgfCAnaGVhZGVyJyB8ICdjbGllbnQnXG5cbnR5cGUgQ2hhdExpc3RJdGVtID0geyBzZXNzaW9uRXh0ZXJuYWxJZDogc3RyaW5nOyBhZ2VudElkOiBzdHJpbmcgfVxuXG5jb25zdCB2YWxpZGF0ZUFjY2Vzc0J5RmVhdHVyZSA9IChzZWN0aW9uOiBzdHJpbmcpID0+IHtcbiAgaWYgKHNlY3Rpb24gPT09ICdoZWFkZXInICYmICh3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyB8fCB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTKSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgaWYgKChzZWN0aW9uID09PSAncHJvamVjdCcgfHwgc2VjdGlvbiA9PT0gJ2NsaWVudCcpICYmIHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgY29uc3QgQ2hhdEFJUGFnZSA9IHdpdGhBcHBDZmcoXG4gICh7XG4gICAgZW50aXR5ID0geyBwcm9qZWN0SWQ6IG51bGwsIGNsaWVudElkOiBudWxsIH0sXG4gICAgcHJvamVjdDogaW5pdGlhbFByb2plY3QgPSBudWxsLFxuICAgIGNsaWVudDogaW5pdGlhbENsaWVudCA9IG51bGwsXG4gICAgc2VjdGlvbiA9ICdoZWFkZXInLFxuICAgIGhhc011bHRpQWdlbnRzID0gZmFsc2UsXG4gICAgY2xhc3NOYW1lLFxuICB9OiBDaGF0QUlQYWdlUHJvcHMpID0+IHtcbiAgICB1c2VTdHJlYW1kb3duU3R5bGVzKClcblxuICAgIGNvbnN0IGluaXRpYWxQcm9qZWN0VmFsdWUgPSBzZWN0aW9uID09PSAncHJvamVjdCcgPyBpbml0aWFsUHJvamVjdCA6IG51bGxcbiAgICBjb25zdCBbcHJvamVjdCwgc2V0UHJvamVjdF0gPSB1c2VTdGF0ZTxQcm9qZWN0IHwgbnVsbD4oaW5pdGlhbFByb2plY3RWYWx1ZSlcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAoc2VjdGlvbiA9PT0gJ3Byb2plY3QnICYmIGluaXRpYWxQcm9qZWN0ICE9IG51bGwpIHtcbiAgICAgICAgc2V0UHJvamVjdChpbml0aWFsUHJvamVjdClcbiAgICAgIH1cbiAgICB9LCBbc2VjdGlvbiwgaW5pdGlhbFByb2plY3RdKVxuXG4gICAgY29uc3QgeyBjb250ZXh0LCByZXN0b3JlQ29uZmlndXJlU2V0dGluZ3MgfSA9IHVzZVByb2plY3RTdW1tYXJ5Q29uZmlnKHtcbiAgICAgIHNlY3Rpb24sXG4gICAgICBlbnRpdHksXG4gICAgICBwcm9qZWN0LFxuICAgICAgc2V0UHJvamVjdCxcbiAgICAgIGNsaWVudDogc2VjdGlvbiA9PT0gJ2NsaWVudCcgPyAoaW5pdGlhbENsaWVudCA/PyBudWxsKSA6IHVuZGVmaW5lZCxcbiAgICAgIGhhc011bHRpQWdlbnRzLFxuICAgIH0pXG5cbiAgICBjb25zdCBwcm92aWRlclZhbHVlID0gdXNlTWVtbyhcbiAgICAgICgpID0+ICh7IC4uLmNvbnRleHQsIHNlY3Rpb246IHNlY3Rpb24gYXMgJ3Byb2plY3QnIHwgJ2hlYWRlcicgfCAnY2xpZW50JyB9KSxcbiAgICAgIFtjb250ZXh0LCBzZWN0aW9uXVxuICAgIClcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICBhY3F1aXJlQ2hhdHNTdG9yZSgpXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICByZWxlYXNlQ2hhdHNTdG9yZSgpXG4gICAgICAgIHJlc3RvcmVDb25maWd1cmVTZXR0aW5ncygpXG4gICAgICB9XG4gICAgfSwgW3Jlc3RvcmVDb25maWd1cmVTZXR0aW5nc10pXG5cbiAgICByZXR1cm4gKFxuICAgICAgPEdsb2JhbENvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3Byb3ZpZGVyVmFsdWV9PlxuICAgICAgICA8Q2hhdEFJUGFnZUNvbnRlbnQgc2VjdGlvbj17c2VjdGlvbiBhcyBTZWN0aW9uVHlwZX0gY2xhc3NOYW1lPXtjbGFzc05hbWV9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHQuUHJvdmlkZXI+XG4gICAgKVxuICB9LFxuICBGZWF0dXJlcy5DSEFUX0FJXG4pXG5cbmNvbnN0IENoYXRBSVBhZ2VDb250ZW50ID0gKHsgc2VjdGlvbiwgY2xhc3NOYW1lIH06IHsgc2VjdGlvbjogU2VjdGlvblR5cGU7IGNsYXNzTmFtZT86IHN0cmluZyB9KSA9PiB7XG4gIGNvbnN0IHVzZXIgPSB1c2VVc2VyKClcbiAgY29uc3QgeyBpMThuIH0gPSB1c2VUcmFuc2xhdGlvbihbU0VDVElPTlMuYWJtQWdlbnRdKVxuICBjb25zdCBhbXBsaXR1ZEV2ZW50ID0gdXNlRXZlbnQoKVxuXG4gIGNvbnN0IGxhbmcgPSBpMThuLmxhbmd1YWdlID09PSAnYnInID8gJ3B0LWJyJyA6IGkxOG4ubGFuZ3VhZ2VcbiAgbW9tZW50LmxvY2FsZShsYW5nKVxuXG4gIGNvbnN0IFt1c2VySW5pdGlhbE1lc3NhZ2UsIHNldFVzZXJJbml0aWFsTWVzc2FnZV0gPSB1c2VTdGF0ZTx7XG4gICAgbWVzc2FnZTogc3RyaW5nXG4gICAgYXR0YWNobWVudHM6IEF0dGFjaG1lbnRGaWxlW11cbiAgICBmYXFJZD86IHN0cmluZ1xuICAgIGFnZW50U3VnZ2VzdGlvbklkPzogc3RyaW5nXG4gIH0+KHsgbWVzc2FnZTogJycsIGF0dGFjaG1lbnRzOiBbXSB9KVxuICBjb25zdCBbaW5pdGlhbENoYXRJZCwgc2V0SW5pdGlhbENoYXRJZF0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCBbbmV3Q2hhdEtleSwgc2V0TmV3Q2hhdEtleV0gPSB1c2VTdGF0ZSgwKVxuICBjb25zdCBbc2VuZE1lc3NhZ2VGdW5jdGlvbiwgc2V0U2VuZE1lc3NhZ2VGdW5jdGlvbl0gPSB1c2VTdGF0ZTxcbiAgICAoKG1lc3NhZ2U6IHN0cmluZywgYXR0YWNobWVudHM/OiBBdHRhY2htZW50RmlsZVtdLCBmYXFJZD86IHN0cmluZywgYWdlbnRTdWdnZXN0aW9uSWQ/OiBzdHJpbmcpID0+IHZvaWQpIHwgbnVsbFxuICA+KG51bGwpXG4gIGNvbnN0IFtzdG9wR2VuZXJhdGlvbkZ1bmN0aW9uLCBzZXRTdG9wR2VuZXJhdGlvbkZ1bmN0aW9uXSA9IHVzZVN0YXRlPCgoKSA9PiB2b2lkKSB8IG51bGw+KG51bGwpXG4gIGNvbnN0IFtpc1N0cmVhbWluZywgc2V0SXNTdHJlYW1pbmddID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtpc1dyaXRpbmcsIHNldElzV3JpdGluZ10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW3JlZmV0Y2hDaGF0cywgc2V0UmVmZXRjaENoYXRzXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbY3VycmVudE9wdGlvbiwgc2V0Q3VycmVudE9wdGlvbl0gPSB1c2VTdGF0ZShvcHRpb25zLmhvbWUpXG4gIGNvbnN0IFtoYXNFcnJvciwgc2V0SGFzRXJyb3JdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IGhhbmRsZXJzID0gdXNlTWVtbygoKSA9PiBidWlsZEhhbmRsZXJzKHNldEN1cnJlbnRPcHRpb24sIHNldEhhc0Vycm9yKSwgW10pXG4gIGNvbnN0IFtzaWRlYmFySGFzRXJyb3IsIHNldFNpZGViYXJIYXNFcnJvcl0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgcmVzZXRTZWxlY3RlZENoYXRSZWYgPSB1c2VSZWY8KCgpID0+IHZvaWQpIHwgbnVsbD4obnVsbClcbiAgY29uc3QgW2xheW91dE1vZGUsIHNldExheW91dE1vZGVdID0gdXNlU3RhdGU8TWFpYUNoYXRNb2RhbExheW91dE1vZGU+KCdzaWRlYmFyJylcbiAgY29uc3QgZXhwYW5kZWQgPSBsYXlvdXRNb2RlID09PSAnZnVsbHNjcmVlbidcblxuICBjb25zdCB7XG4gICAgc2VsZWN0QWdlbnQsXG4gICAgYWdlbnQsXG4gICAgcHJvamVjdCxcbiAgICBjbGllbnQsXG4gICAgdG9nZ2xlV2ViU2VhcmNoLFxuICAgIGlzV2ViU2VhcmNoQWN0aXZlLFxuICAgIHNldENoaXBzUHJvamVjdCxcbiAgICBzZXRDbGllbnQsXG4gICAgc2V0UHJvamVjdCxcbiAgfSA9IHVzZUdsb2JhbENvbnRleHQoKVxuXG4gIGNvbnN0IHtcbiAgICBhZ2VudHMsXG4gICAgbG9hZGluZyxcbiAgICBsb2FkaW5nTW9yZSxcbiAgICBlcnJvcjogYWdlbnRFcnJvcixcbiAgICBoYW5kbGVHZXRBZ2VudHMsXG4gICAgbG9hZE1vcmVBZ2VudHMsXG4gICAgYWRkQWdlbnQsXG4gICAgcmVtb3ZlQWdlbnQsXG4gICAgdXBkYXRlQWdlbnQsXG4gICAgdXBkYXRlQWdlbnRGYXZvcml0ZSxcbiAgICBzZWxlY3RGaXJzdEFnZW50LFxuICAgIHNvcnRBZ2VudHNMaXN0LFxuICB9ID0gdXNlR2V0QWdlbnRzKHsgc2VsZWN0QWdlbnQsIHNlY3Rpb24sIGFnZW50LCBoYW5kbGVHb0hvbWU6IGhhbmRsZXJzLmhvbWUgfSlcblxuICBjb25zdCB7IHNraWxscywgbG9hZGluZzogbG9hZGluZ1NraWxscywgaGFuZGxlR2V0U2tpbGxzLCByZW1vdmVTa2lsbCB9ID0gdXNlR2V0U2tpbGxzKClcblxuICBjb25zdCBpc01BSUEgPSB2YWxpZGF0ZUlzTWFpYShhZ2VudCBhcyBBZ2VudClcblxuICBjb25zdCB1c2VySGFzUGVybWlzc2lvbnMgPVxuICAgICh1c2VyPy5wZXJtaXNzaW9ucz8uYWlfYWdlbnRzPy5jcmVhdGUgfHxcbiAgICAgIHVzZXI/LnBlcm1pc3Npb25zPy5haV9hZ2VudHM/LmVkaXQgfHxcbiAgICAgIHVzZXI/LnBlcm1pc3Npb25zPy5haV9hZ2VudHM/LmRlbGV0ZSkgJiZcbiAgICB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UU1xuXG4gIGNvbnN0IGNvbXB1dGVkQ3VycmVudE9wdGlvbiA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IGlzR2xvYmFsU3BlY2lhbGlzdCA9IGlzTUFJQSAmJiBhZ2VudD8uZW50aXR5ID09PSAnZ2xvYmFsJ1xuICAgIGNvbnN0IGlzUHJvamVjdFNwZWNpYWxpc3QgPSBpc01BSUEgJiYgKGFnZW50Py5lbnRpdHkgPT09ICdwcm9qZWN0JyB8fCBhZ2VudD8uZW50aXR5ID09IG51bGwpXG4gICAgY29uc3QgaXNDbGllbnRTcGVjaWFsaXN0ID0gaXNNQUlBICYmIGFnZW50Py5lbnRpdHkgPT09ICdjbGllbnQnXG4gICAgY29uc3QgaXNNYWlha2VyID0gaXNNYXJrZXRwbGFjZUdsb2JhbENsb25lQWdlbnQoYWdlbnQpXG5cbiAgICBpZiAoY3VycmVudE9wdGlvbiA9PT0gb3B0aW9ucy5teUFnZW50cyAmJiB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUykge1xuICAgICAgcmV0dXJuIG9wdGlvbnMubXlBZ2VudHNcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudE9wdGlvbiA9PT0gb3B0aW9ucy5teVNraWxscyAmJiB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUykge1xuICAgICAgcmV0dXJuIG9wdGlvbnMubXlTa2lsbHNcbiAgICB9XG5cbiAgICBpZiAoaXNHbG9iYWxTcGVjaWFsaXN0ICYmICFpc01haWFrZXIgJiYgYWdlbnQ/LnR5cGUgIT09ICdvcmNoZXN0cmF0b3InICYmIGN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMuaG9tZSkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuY2hhdFxuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFNob3dQcm9qZWN0U2VsZWN0b3IgPSBjdXJyZW50T3B0aW9uICE9PSBvcHRpb25zLmNoYXQgJiYgaXNQcm9qZWN0U3BlY2lhbGlzdCAmJiAhcHJvamVjdFxuICAgIGNvbnN0IHNob3VsZFNob3dDbGllbnRTZWxlY3RvciA9IGN1cnJlbnRPcHRpb24gIT09IG9wdGlvbnMuY2hhdCAmJiBpc0NsaWVudFNwZWNpYWxpc3QgJiYgIWNsaWVudFxuXG4gICAgaWYgKHNob3VsZFNob3dQcm9qZWN0U2VsZWN0b3IpIHJldHVybiBvcHRpb25zLnByb2plY3RTZWxlY3RvclxuICAgIGlmIChzaG91bGRTaG93Q2xpZW50U2VsZWN0b3IpIHJldHVybiBvcHRpb25zLmNsaWVudFNlbGVjdG9yXG4gICAgcmV0dXJuIGN1cnJlbnRPcHRpb25cbiAgfSwgW2N1cnJlbnRPcHRpb24sIHByb2plY3QsIGNsaWVudCwgaXNNQUlBLCBhZ2VudD8uZW50aXR5LCBhZ2VudD8ubmFtZSwgYWdlbnQ/LnR5cGVdKVxuXG4gIGNvbnN0IGlzTWFpYWtlckFnZW50U2VsZWN0ZWQgPSB1c2VNZW1vKCgpID0+IGlzTWFya2V0cGxhY2VHbG9iYWxDbG9uZUFnZW50KGFnZW50KSwgW2FnZW50XSlcblxuICBjb25zdCBzaWRlYmFyQWdlbnRzTmF2QWN0aXZlID0gdXNlTWVtbygoKTogJ21haWFrZXInIHwgJ215QWdlbnRzJyB8ICdteVNraWxscycgfCBudWxsID0+IHtcbiAgICBpZiAoY29tcHV0ZWRDdXJyZW50T3B0aW9uID09PSBvcHRpb25zLm15U2tpbGxzKSByZXR1cm4gJ215U2tpbGxzJ1xuICAgIGlmIChjb21wdXRlZEN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMubXlBZ2VudHMpIHJldHVybiAnbXlBZ2VudHMnXG4gICAgaWYgKGlzTWFpYWtlckFnZW50U2VsZWN0ZWQpIHJldHVybiAnbWFpYWtlcidcbiAgICByZXR1cm4gbnVsbFxuICB9LCBbY29tcHV0ZWRDdXJyZW50T3B0aW9uLCBpc01haWFrZXJBZ2VudFNlbGVjdGVkXSlcblxuICBjb25zdCBhZ2VudHNGZXRjaGVkUmVmID0gdXNlUmVmKGZhbHNlKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFhZ2VudHNGZXRjaGVkUmVmLmN1cnJlbnQpIHtcbiAgICAgIGFnZW50c0ZldGNoZWRSZWYuY3VycmVudCA9IHRydWVcbiAgICAgIGhhbmRsZUdldEFnZW50cygpXG4gICAgfVxuICB9LCBbaGFuZGxlR2V0QWdlbnRzXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG9uTWVyZ2VDcmVhdGVkQWdlbnQgPSAoZXZ0OiBFdmVudCkgPT4ge1xuICAgICAgY29uc3QgeyBhZ2VudDogbmV4dEFnZW50IH0gPSAoZXZ0IGFzIEN1c3RvbUV2ZW50PHsgYWdlbnQ6IEFnZW50IH0+KS5kZXRhaWwgfHwge31cbiAgICAgIGlmIChuZXh0QWdlbnQ/LmlkKSBhZGRBZ2VudChuZXh0QWdlbnQsIHsgbmF2aWdhdGVIb21lOiBmYWxzZSB9KVxuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtYWlhLW1lcmdlLWNyZWF0ZWQtYWdlbnQtaW50by1saXN0Jywgb25NZXJnZUNyZWF0ZWRBZ2VudClcbiAgICByZXR1cm4gKCkgPT4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWFpYS1tZXJnZS1jcmVhdGVkLWFnZW50LWludG8tbGlzdCcsIG9uTWVyZ2VDcmVhdGVkQWdlbnQpXG4gIH0sIFthZGRBZ2VudF0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBvblN5bmNFZGl0ZWRBZ2VudCA9IChldnQ6IEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB7IGFnZW50OiBuZXh0QWdlbnQgfSA9IChldnQgYXMgQ3VzdG9tRXZlbnQ8eyBhZ2VudDogQWdlbnQgfT4pLmRldGFpbCB8fCB7fVxuICAgICAgaWYgKCFuZXh0QWdlbnQ/LmlkKSByZXR1cm5cbiAgICAgIHVwZGF0ZUFnZW50KG5leHRBZ2VudClcbiAgICAgIGlmIChhZ2VudD8uaWQgPT09IG5leHRBZ2VudC5pZCkgc2VsZWN0QWdlbnQobmV4dEFnZW50KVxuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtYWlhLXN5bmMtZWRpdGVkLWFnZW50LWZyb20tY2hhdCcsIG9uU3luY0VkaXRlZEFnZW50KVxuICAgIHJldHVybiAoKSA9PiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtYWlhLXN5bmMtZWRpdGVkLWFnZW50LWZyb20tY2hhdCcsIG9uU3luY0VkaXRlZEFnZW50KVxuICB9LCBbdXBkYXRlQWdlbnQsIHNlbGVjdEFnZW50LCBhZ2VudD8uaWRdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgb3BlbkNoYXRWaWV3ID0gKCkgPT4ge1xuICAgICAgc2V0SGFzRXJyb3IoZmFsc2UpXG4gICAgICBzZXRJbml0aWFsQ2hhdElkKG51bGwpXG4gICAgICBzZXROZXdDaGF0S2V5KHByZXYgPT4gcHJldiArIDEpXG4gICAgICBzZXRVc2VySW5pdGlhbE1lc3NhZ2UoeyBtZXNzYWdlOiAnJywgYXR0YWNobWVudHM6IFtdIH0pXG4gICAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMuY2hhdClcbiAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdjaGF0LXNlc3Npb24tY2hhbmdlZCcpKVxuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtYWlhLW9wZW4tY2hhdC12aWV3Jywgb3BlbkNoYXRWaWV3KVxuICAgIHJldHVybiAoKSA9PiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtYWlhLW9wZW4tY2hhdC12aWV3Jywgb3BlbkNoYXRWaWV3KVxuICB9LCBbXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG9wZW5OZXdDaGF0V2l0aEFnZW50ID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgY29uc3QgbmV4dEFnZW50ID0gKGV2ZW50IGFzIEN1c3RvbUV2ZW50PHsgYWdlbnQ6IEFnZW50IH0+KS5kZXRhaWw/LmFnZW50XG4gICAgICBpZiAoIW5leHRBZ2VudCkgcmV0dXJuXG4gICAgICBzZXRQcm9qZWN0KG51bGwpXG4gICAgICBzZXRDbGllbnQ/LihudWxsKVxuICAgICAgc2VsZWN0QWdlbnQobmV4dEFnZW50KVxuICAgICAgc2V0SGFzRXJyb3IoZmFsc2UpXG4gICAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMuaG9tZSlcbiAgICB9XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbWFpYS1vcGVuLW5ldy1jaGF0LXdpdGgtYWdlbnQnLCBvcGVuTmV3Q2hhdFdpdGhBZ2VudClcbiAgICByZXR1cm4gKCkgPT4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWFpYS1vcGVuLW5ldy1jaGF0LXdpdGgtYWdlbnQnLCBvcGVuTmV3Q2hhdFdpdGhBZ2VudClcbiAgfSwgW3NlbGVjdEFnZW50LCBzZXRDbGllbnQsIHNldFByb2plY3RdKVxuXG4gIGNvbnN0IHN0YXJ0Q2hhdCA9IHVzZUNhbGxiYWNrKFxuICAgIChtZXNzYWdlPzogc3RyaW5nLCBhdHRhY2htZW50cz86IEF0dGFjaG1lbnRGaWxlW10sIGZhcUlkPzogc3RyaW5nLCBhZ2VudFN1Z2dlc3Rpb25JZD86IHN0cmluZykgPT4ge1xuICAgICAgaWYgKHNpZGViYXJIYXNFcnJvcikgc2V0U2lkZWJhckhhc0Vycm9yKGZhbHNlKVxuICAgICAgc2V0SW5pdGlhbENoYXRJZChudWxsKVxuICAgICAgc2V0TmV3Q2hhdEtleShwcmV2ID0+IHByZXYgKyAxKVxuICAgICAgc2V0VXNlckluaXRpYWxNZXNzYWdlKHtcbiAgICAgICAgbWVzc2FnZTogbWVzc2FnZSB8fCAnJyxcbiAgICAgICAgYXR0YWNobWVudHM6IGF0dGFjaG1lbnRzIHx8IFtdLFxuICAgICAgICAuLi4oZmFxSWQgPyB7IGZhcUlkIH0gOiB7fSksXG4gICAgICAgIC4uLihhZ2VudFN1Z2dlc3Rpb25JZCA/IHsgYWdlbnRTdWdnZXN0aW9uSWQgfSA6IHt9KSxcbiAgICAgIH0pXG4gICAgICBoYW5kbGVycy5jaGF0KClcbiAgICB9LFxuICAgIFtoYW5kbGVycywgc2lkZWJhckhhc0Vycm9yXVxuICApXG5cbiAgLy8gU2lkZWJhciB0eXBlcyB0aGlzIHByb3AgYXMgKGNoYXRJZDogc3RyaW5nKSBidXQgcGFzc2VzIHRoZSBmdWxsIGNoYXQgb2JqZWN0IGF0IHJ1bnRpbWVcbiAgY29uc3QgZ29Ub0NoYXQgPSB1c2VDYWxsYmFjayhcbiAgICAoY2hhdEFyZzogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBjaGF0ID0gY2hhdEFyZyBhcyB1bmtub3duIGFzIENoYXRMaXN0SXRlbVxuICAgICAgc2V0VXNlckluaXRpYWxNZXNzYWdlKHsgbWVzc2FnZTogJycsIGF0dGFjaG1lbnRzOiBbXSB9KVxuICAgICAgc2V0SW5pdGlhbENoYXRJZChjaGF0LnNlc3Npb25FeHRlcm5hbElkKVxuICAgICAgY29uc3Qgc2VsZWN0ZWRBZ2VudCA9IGFnZW50cy5kYXRhLmZpbmQoYWdlbnRJdGVtID0+IGFnZW50SXRlbS5pZCA9PT0gY2hhdC5hZ2VudElkKVxuICAgICAgaWYgKHNlbGVjdGVkQWdlbnQpIHNlbGVjdEFnZW50KHNlbGVjdGVkQWdlbnQpXG4gICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnY2hhdC1zZXNzaW9uLWNoYW5nZWQnKSlcbiAgICAgIGhhbmRsZXJzLmNoYXQoKVxuICAgIH0sXG4gICAgW2hhbmRsZXJzLCBhZ2VudHMsIHNlbGVjdEFnZW50XVxuICApXG5cbiAgY29uc3QgaGFuZGxlU2VuZE1lc3NhZ2VSZWFkeSA9IHVzZUNhbGxiYWNrKFxuICAgIChcbiAgICAgIHNlbmRNZXNzYWdlOiAoXG4gICAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgICAgYXR0YWNobWVudHM/OiBBdHRhY2htZW50RmlsZVtdLFxuICAgICAgICBmYXFJZD86IHN0cmluZyxcbiAgICAgICAgYWdlbnRTdWdnZXN0aW9uSWQ/OiBzdHJpbmdcbiAgICAgICkgPT4gdm9pZCxcbiAgICAgIHN0b3BHZW5lcmF0aW9uOiAoKSA9PiB2b2lkLFxuICAgICAgc3RyZWFtaW5nOiBib29sZWFuLFxuICAgICAgd3JpdGluZzogYm9vbGVhblxuICAgICkgPT4ge1xuICAgICAgc2V0U2VuZE1lc3NhZ2VGdW5jdGlvbigoKSA9PiBzZW5kTWVzc2FnZSlcbiAgICAgIHNldFN0b3BHZW5lcmF0aW9uRnVuY3Rpb24oKCkgPT4gc3RvcEdlbmVyYXRpb24pXG4gICAgICBzZXRJc1N0cmVhbWluZyhzdHJlYW1pbmcpXG4gICAgICBzZXRJc1dyaXRpbmcod3JpdGluZylcbiAgICB9LFxuICAgIFtdXG4gIClcblxuICBjb25zdCBoYW5kbGVTZW5kTWVzc2FnZSA9IHVzZUNhbGxiYWNrKFxuICAgIChtZXNzYWdlOiBzdHJpbmcsIGF0dGFjaG1lbnRzPzogQXR0YWNobWVudEZpbGVbXSwgZmFxSWQ/OiBzdHJpbmcsIGFnZW50U3VnZ2VzdGlvbklkPzogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoc2lkZWJhckhhc0Vycm9yKSBzZXRTaWRlYmFySGFzRXJyb3IoZmFsc2UpXG4gICAgICBpZiAoc2VuZE1lc3NhZ2VGdW5jdGlvbiAmJiBjb21wdXRlZEN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMuY2hhdCkge1xuICAgICAgICBzZW5kTWVzc2FnZUZ1bmN0aW9uKG1lc3NhZ2UsIGF0dGFjaG1lbnRzLCBmYXFJZCwgYWdlbnRTdWdnZXN0aW9uSWQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGFydENoYXQobWVzc2FnZSwgYXR0YWNobWVudHMsIGZhcUlkLCBhZ2VudFN1Z2dlc3Rpb25JZClcbiAgICAgIH1cbiAgICB9LFxuICAgIFtzZW5kTWVzc2FnZUZ1bmN0aW9uLCBzdGFydENoYXQsIGNvbXB1dGVkQ3VycmVudE9wdGlvbiwgc2lkZWJhckhhc0Vycm9yXVxuICApXG5cbiAgY29uc3QgaGFuZGxlR29Ib21lID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmIChjdXJyZW50T3B0aW9uID09PSBvcHRpb25zLmNoYXQpIHtcbiAgICAgIHNldEluaXRpYWxDaGF0SWQobnVsbClcbiAgICAgIHNldE5ld0NoYXRLZXkocHJldiA9PiBwcmV2ICsgMSlcbiAgICAgIGlmIChhZ2VudD8uZW50aXR5ICE9PSAnY2xpZW50Jykgc2V0Q2xpZW50Py4obnVsbClcbiAgICB9XG4gICAgaWYgKFxuICAgICAgKCFhZ2VudCB8fCBhZ2VudD8uaXNfZGVsZXRlZCB8fCBhZ2VudD8uaGFzX25vdF9wZXJtaXNzaW9ucyB8fCBhZ2VudD8uaGFzX25vdF9hY2Nlc3MgfHwgYWdlbnQ/LnByb2plY3RfZGVsZXRlZCkgJiZcbiAgICAgIGFnZW50cy5kYXRhLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIHNlbGVjdEFnZW50KGFnZW50cy5kYXRhWzBdKVxuICAgIH1cbiAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMuaG9tZSlcbiAgICBzZXRDaGlwc1Byb2plY3QobnVsbClcbiAgICBzZXRIYXNFcnJvcihmYWxzZSlcbiAgICBpZiAoaXNXZWJTZWFyY2hBY3RpdmUpIHRvZ2dsZVdlYlNlYXJjaCgpXG4gICAgaWYgKHJlc2V0U2VsZWN0ZWRDaGF0UmVmLmN1cnJlbnQpIHJlc2V0U2VsZWN0ZWRDaGF0UmVmLmN1cnJlbnQoKVxuICB9LCBbY3VycmVudE9wdGlvbiwgaXNXZWJTZWFyY2hBY3RpdmUsIHRvZ2dsZVdlYlNlYXJjaCwgYWdlbnQsIGFnZW50cywgc2VsZWN0QWdlbnQsIHNldENsaWVudCwgc2V0Q2hpcHNQcm9qZWN0XSlcblxuICBjb25zdCBoYW5kbGVSZXNldENoYXQgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgc2V0VXNlckluaXRpYWxNZXNzYWdlKHsgbWVzc2FnZTogJycsIGF0dGFjaG1lbnRzOiBbXSB9KVxuICAgIHNldEluaXRpYWxDaGF0SWQobnVsbClcbiAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnY2hhdC1zZXNzaW9uLWNoYW5nZWQnKSlcbiAgICBoYW5kbGVHb0hvbWUoKVxuICB9LCBbaGFuZGxlR29Ib21lXSlcblxuICBjb25zdCBoYW5kbGVPcGVuTWFya2V0cGxhY2UgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKCF3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHNldEN1cnJlbnRPcHRpb24ob3B0aW9ucy5teUFnZW50cylcbiAgfSwgW10pXG5cbiAgY29uc3QgaGFuZGxlT3BlblNraWxscyA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAoIXdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgc2V0SGFzRXJyb3IoZmFsc2UpXG4gICAgc2V0Q3VycmVudE9wdGlvbihvcHRpb25zLm15U2tpbGxzKVxuICAgIGhhbmRsZUdldFNraWxscygpXG4gIH0sIFtoYW5kbGVHZXRTa2lsbHNdKVxuXG4gIGNvbnN0IGhhbmRsZUdvVG9NYWlha2VyID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIHNldEhhc0Vycm9yKGZhbHNlKVxuICAgIGxldCBtYWlha2VyQWdlbnQgPSBhZ2VudHMuZGF0YS5maW5kKChhOiBBZ2VudCkgPT4gaXNNYXJrZXRwbGFjZUdsb2JhbENsb25lQWdlbnQoYSkpXG4gICAgaWYgKCFtYWlha2VyQWdlbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hNYWlhKHtcbiAgICAgICAgICBwYXRoOiBgYWdlbnRzP2FnZW50X3R5cGU9Y2xvbmUmbGFuZz0ke21hcENPUkxhbmcoaTE4bi5sYW5ndWFnZSl9YCxcbiAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gICAgICAgIG1haWFrZXJBZ2VudCA9IChkYXRhLmRhdGEgfHwgW10pLmZpbmQoKGE6IEFnZW50KSA9PiBpc01hcmtldHBsYWNlR2xvYmFsQ2xvbmVBZ2VudChhKSlcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFtYWlha2VyQWdlbnQpIHJldHVyblxuICAgIHNldFByb2plY3QobnVsbClcbiAgICBzZXRDbGllbnQ/LihudWxsKVxuICAgIHNlbGVjdEFnZW50KG1haWFrZXJBZ2VudClcbiAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMuaG9tZSlcbiAgICBpZiAocmVzZXRTZWxlY3RlZENoYXRSZWYuY3VycmVudCkgcmVzZXRTZWxlY3RlZENoYXRSZWYuY3VycmVudCgpXG4gIH0sIFthZ2VudHMuZGF0YSwgaTE4bi5sYW5ndWFnZSwgc2VsZWN0QWdlbnQsIHNldENsaWVudCwgc2V0UHJvamVjdF0pXG5cbiAgY29uc3QgaGFuZGxlRGVsZXRlQWdlbnRGcm9tTXlBZ2VudHMgPSB1c2VDYWxsYmFjayhcbiAgICAoYWdlbnRJZDogc3RyaW5nKSA9PiB7XG4gICAgICByZW1vdmVBZ2VudChhZ2VudElkKVxuICAgICAgaWYgKGFnZW50Py5pZCA9PT0gYWdlbnRJZCkgc2VsZWN0Rmlyc3RBZ2VudChhZ2VudElkKVxuICAgIH0sXG4gICAgW2FnZW50Py5pZCwgcmVtb3ZlQWdlbnQsIHNlbGVjdEZpcnN0QWdlbnRdXG4gIClcblxuICBjb25zdCBzaG93TmV3Q2hhdCA9IGNvbXB1dGVkQ3VycmVudE9wdGlvbiAhPT0gb3B0aW9ucy5jaGF0XG4gIGNvbnN0IGhpZGVIZWFkZXJBZ2VudFNlbGVjdG9yID1cbiAgICBjb21wdXRlZEN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMubXlBZ2VudHMgfHwgY29tcHV0ZWRDdXJyZW50T3B0aW9uID09PSBvcHRpb25zLm15U2tpbGxzXG4gIGNvbnN0IGhpZGVGb290ZXJPbk1haWFrZXJNYXJrZXRwbGFjZUhvbWUgPSBjb21wdXRlZEN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMuaG9tZSAmJiBpc01haWFrZXJBZ2VudFNlbGVjdGVkXG5cbiAgLy8gU3VwcHJlc3MgdW51c2VkIHZhcmlhYmxlIHdhcm5pbmcg4oCUIGtlcHQgZm9yIHBvdGVudGlhbCBBbXBsaXR1ZGUgdHJhY2tpbmcgcGFyaXR5XG4gIHZvaWQgYW1wbGl0dWRFdmVudFxuXG4gIHJldHVybiAoXG4gICAgPFNDUGFnZVdyYXBwZXIgY2xhc3NOYW1lPXtjbGFzc05hbWV9PlxuICAgICAge3ZhbGlkYXRlQWNjZXNzQnlGZWF0dXJlKHNlY3Rpb24pID8gKFxuICAgICAgICA8U2lkZWJhclxuICAgICAgICAgIG9uR29Ub0NoYXQ9e2dvVG9DaGF0fVxuICAgICAgICAgIG9uRXJyb3I9eygpID0+IHNldFNpZGViYXJIYXNFcnJvcih0cnVlKX1cbiAgICAgICAgICBoYW5kbGVHb1RvSG9tZT17aGFuZGxlR29Ib21lfVxuICAgICAgICAgIGhhbmRsZU9wZW5NYXJrZXRwbGFjZT17aGFuZGxlT3Blbk1hcmtldHBsYWNlfVxuICAgICAgICAgIGhhbmRsZU9wZW5Ta2lsbHM9e2hhbmRsZU9wZW5Ta2lsbHN9XG4gICAgICAgICAgc2hvd05ld0NoYXQ9e3Nob3dOZXdDaGF0fVxuICAgICAgICAgIHJlZmV0Y2hDaGF0cz17cmVmZXRjaENoYXRzfVxuICAgICAgICAgIGhhbmRsZVNldFJlZmV0Y2hDaGF0cz17c2V0UmVmZXRjaENoYXRzfVxuICAgICAgICAgIGhhc0Vycm9yPXtzaWRlYmFySGFzRXJyb3J9XG4gICAgICAgICAgcmVzZXRTZWxlY3RlZENoYXRSZWY9e3Jlc2V0U2VsZWN0ZWRDaGF0UmVmfVxuICAgICAgICAgIGFnZW50c05hdkFjdGl2ZT17c2lkZWJhckFnZW50c05hdkFjdGl2ZX1cbiAgICAgICAgLz5cbiAgICAgICkgOiBudWxsfVxuICAgICAgPFNDUGFnZU1haW4+XG4gICAgICAgIDxDaGF0QUlNb2RhbEhlYWRlclxuICAgICAgICAgIGxheW91dE1vZGU9e2xheW91dE1vZGV9XG4gICAgICAgICAgb25MYXlvdXRNb2RlQ2hhbmdlPXtzZXRMYXlvdXRNb2RlfVxuICAgICAgICAgIGV4cGFuZGVkPXtleHBhbmRlZH1cbiAgICAgICAgICBhZ2VudHM9e2FnZW50cy5kYXRhfVxuICAgICAgICAgIGhhc0Vycm9yPXshIWFnZW50RXJyb3J9XG4gICAgICAgICAgbG9hZGluZz17bG9hZGluZ31cbiAgICAgICAgICBsb2FkaW5nTW9yZT17bG9hZGluZ01vcmV9XG4gICAgICAgICAgaGFzTW9yZT17YWdlbnRzLmhhc19tb3JlfVxuICAgICAgICAgIGhhbmRsZVJlc2V0Q2hhdD17aGFuZGxlUmVzZXRDaGF0fVxuICAgICAgICAgIG9uQWdlbnRVcGRhdGU9e3VwZGF0ZUFnZW50RmF2b3JpdGV9XG4gICAgICAgICAgbG9hZE1vcmVBZ2VudHM9e2xvYWRNb3JlQWdlbnRzfVxuICAgICAgICAgIHNvcnRBZ2VudHNMaXN0PXtzb3J0QWdlbnRzTGlzdH1cbiAgICAgICAgICBoaWRlQWdlbnRTZWxlY3Rvcj17aGlkZUhlYWRlckFnZW50U2VsZWN0b3J9XG4gICAgICAgICAgaGlkZUNvbnRyb2xzXG4gICAgICAgIC8+XG4gICAgICAgIHtoYXNFcnJvciA/IChcbiAgICAgICAgICA8TUFJQUVycm9yIC8+XG4gICAgICAgICkgOiB2YWxpZGF0ZUFjY2Vzc0J5RmVhdHVyZShzZWN0aW9uKSA/IChcbiAgICAgICAgICA8Q2hhdEFJQ29udGVudFxuICAgICAgICAgICAgY3VycmVudE9wdGlvbj17Y29tcHV0ZWRDdXJyZW50T3B0aW9ufVxuICAgICAgICAgICAgaGFuZGxlcnM9e3sgLi4uaGFuZGxlcnMsIGNoYXQ6IHN0YXJ0Q2hhdCwgaG9tZTogaGFuZGxlcnMuaG9tZSwgaGFuZGxlR29Ib21lIH19XG4gICAgICAgICAgICBvbkVycm9yPXsoKSA9PiBzZXRIYXNFcnJvcih0cnVlKX1cbiAgICAgICAgICAgIHJlZnM9e3sgdXNlckluaXRpYWxNZXNzYWdlLCBpbml0aWFsQ2hhdElkIH19XG4gICAgICAgICAgICBvblNlbmRNZXNzYWdlUmVhZHk9e2hhbmRsZVNlbmRNZXNzYWdlUmVhZHl9XG4gICAgICAgICAgICBleHBhbmRlZD17ZXhwYW5kZWR9XG4gICAgICAgICAgICBmbG9hdGluZz17ZmFsc2V9XG4gICAgICAgICAgICBhZ2VudHM9e2FnZW50cy5kYXRhfVxuICAgICAgICAgICAgb25EZWxldGVBZ2VudD17aGFuZGxlRGVsZXRlQWdlbnRGcm9tTXlBZ2VudHN9XG4gICAgICAgICAgICBvbkZhdm9yaXRlQWdlbnRVcGRhdGU9e3VwZGF0ZUFnZW50RmF2b3JpdGV9XG4gICAgICAgICAgICBoYXNNb3JlQWdlbnRzPXshIWFnZW50cy5oYXNfbW9yZX1cbiAgICAgICAgICAgIGxvYWRpbmdNb3JlQWdlbnRzPXtsb2FkaW5nTW9yZX1cbiAgICAgICAgICAgIG9uTG9hZE1vcmVBZ2VudHM9e2xvYWRNb3JlQWdlbnRzfVxuICAgICAgICAgICAgb25Hb1RvTWFpYWtlcj17aGFuZGxlR29Ub01haWFrZXJ9XG4gICAgICAgICAgICBza2lsbHM9e3NraWxsc31cbiAgICAgICAgICAgIGxvYWRpbmdTa2lsbHM9e2xvYWRpbmdTa2lsbHN9XG4gICAgICAgICAgICBvbkRlbGV0ZVNraWxsPXtyZW1vdmVTa2lsbH1cbiAgICAgICAgICAgIGxvYWRpbmdBZ2VudHM9e2xvYWRpbmd9XG4gICAgICAgICAgICBhZ2VudEVycm9yPXthZ2VudEVycm9yfVxuICAgICAgICAgIC8+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPFByb2plY3RTdW1tYXJ5Q29udGVudCBvblJlc3RhcnRTdW1tYXJ5PXtoYW5kbGVycy5ob21lfSAvPlxuICAgICAgICApfVxuICAgICAgICB7KChjb21wdXRlZEN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMuaG9tZSAmJiAhIWFnZW50cz8uZGF0YT8ubGVuZ3RoKSB8fFxuICAgICAgICAgIGNvbXB1dGVkQ3VycmVudE9wdGlvbiA9PT0gb3B0aW9ucy5jaGF0KSAmJlxuICAgICAgICAgICFoaWRlRm9vdGVyT25NYWlha2VyTWFya2V0cGxhY2VIb21lICYmXG4gICAgICAgICAgIWhhc0Vycm9yICYmXG4gICAgICAgICAgIWxvYWRpbmcgJiZcbiAgICAgICAgICB2YWxpZGF0ZUFjY2Vzc0J5RmVhdHVyZShzZWN0aW9uKSAmJiAoXG4gICAgICAgICAgICA8Q2hhdEFpTW9kYWxGb290ZXJcbiAgICAgICAgICAgICAgYWdlbnQ9e2FnZW50fVxuICAgICAgICAgICAgICBoYW5kbGVTZW5kTWVzc2FnZT17aGFuZGxlU2VuZE1lc3NhZ2V9XG4gICAgICAgICAgICAgIGhhbmRsZVN0b3BHZW5lcmF0aW9uPXtzdG9wR2VuZXJhdGlvbkZ1bmN0aW9ufVxuICAgICAgICAgICAgICBpc1N0cmVhbWluZz17aXNTdHJlYW1pbmd9XG4gICAgICAgICAgICAgIGlzV3JpdGluZz17aXNXcml0aW5nfVxuICAgICAgICAgICAgICBjaGF0SWQ9e2luaXRpYWxDaGF0SWR9XG4gICAgICAgICAgICAgIG5ld0NoYXRLZXk9e25ld0NoYXRLZXl9XG4gICAgICAgICAgICAgIGxheW91dE1vZGU9e2xheW91dE1vZGV9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICl9XG4gICAgICA8L1NDUGFnZU1haW4+XG4gICAgICB7dXNlckhhc1Blcm1pc3Npb25zICYmIChcbiAgICAgICAgPEFibUFnZW50TW9kYWxcbiAgICAgICAgICBhZGRBZ2VudD17YWRkQWdlbnR9XG4gICAgICAgICAgdXBkYXRlQWdlbnQ9e3VwZGF0ZUFnZW50fVxuICAgICAgICAgIHJlbW92ZUFnZW50PXtyZW1vdmVBZ2VudH1cbiAgICAgICAgICB1cGRhdGVBZ2VudEZhdm9yaXRlPXt1cGRhdGVBZ2VudEZhdm9yaXRlfVxuICAgICAgICAgIHNlbGVjdEZpcnN0QWdlbnQ9e3NlbGVjdEZpcnN0QWdlbnR9XG4gICAgICAgIC8+XG4gICAgICApfVxuICAgICAgPFNuYWNrYmFyIC8+XG4gICAgPC9TQ1BhZ2VXcmFwcGVyPlxuICApXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFDQSxTQUFTQSxXQUFXLEVBQUVDLFNBQVMsRUFBRUMsT0FBTyxFQUFFQyxNQUFNLEVBQUVDLFFBQVEsUUFBUSxPQUFPO0FBQ3pFLE9BQU9DLE1BQU0sTUFBTSxRQUFRO0FBQzNCLFNBQVNDLGNBQWMsUUFBUSxlQUFlO0FBQzlDLFNBQVNDLE9BQU8sUUFBUSwyQkFBMkI7QUFDbkQsU0FBU0MsU0FBUyxRQUFRLHVCQUF1QjtBQUNqRCxTQUFTQyxhQUFhLFFBQVEsK0JBQStCO0FBQzdELFNBQVNDLGFBQWEsRUFBRUMsT0FBTyxRQUFRLHVDQUF1QztBQUM5RSxTQUFTQyxPQUFPLFFBQVEseUJBQXlCO0FBQ2pELFNBQVNDLFlBQVksUUFBUSx5Q0FBeUM7QUFDdEUsU0FBU0MsYUFBYSxFQUFFQyxnQkFBZ0IsUUFBUSxpQ0FBaUM7QUFFakYsU0FBU0MsaUJBQWlCLFFBQVEsNEVBQTRFO0FBQzlHLFNBQVNDLFFBQVEsUUFBUSxzQkFBc0I7QUFDL0MsU0FBU0MscUJBQXFCLFFBQVEsdUNBQXVDO0FBQzdFLFNBQVNDLGFBQWEsUUFBUSxnQ0FBZ0M7QUFDOUQsU0FBU0MsaUJBQWlCLFFBQVEsMERBQTBEO0FB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
|