@projectcor/maia-components 2.35.4-0 → 2.35.4-1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/lib/App.js +44 -19
  2. package/lib/components/atoms/ApprovalBox/ApprovalBox.js +4 -63
  3. package/lib/components/atoms/ApprovalBox/ApprovalBox.spec.js +3 -31
  4. package/lib/components/atoms/ApprovalBox/ApprovalBox.styles.js +4 -16
  5. package/lib/components/atoms/ContextMentionChip/buildChipElement.js +1 -12
  6. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +5 -127
  7. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.js +29 -2
  8. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.styles.js +33 -24
  9. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.js +19 -2
  10. package/lib/components/atoms/MAIAInput/MAIAInput.js +17 -234
  11. package/lib/components/atoms/MAIAInput/MAIAInput.spec.js +2 -84
  12. package/lib/components/atoms/MAIAInput/styles.js +11 -15
  13. package/lib/components/atoms/icons/SkillsNavIcon.js +7 -4
  14. package/lib/components/atoms/icons/index.js +1 -5
  15. package/lib/components/index.js +2 -1
  16. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +11 -34
  17. package/lib/components/molecules/ChatAIContent/ChatAIContent.js +9 -7
  18. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +8 -4
  19. package/lib/components/molecules/ChatAIMessages/newStyles.js +29 -26
  20. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +23 -60
  21. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +69 -70
  22. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.js +242 -333
  23. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.styles.js +104 -131
  24. package/lib/components/molecules/ChatFooter/ChatFooter.js +5 -15
  25. package/lib/components/molecules/ChatFooter/ChatFooter.spec.js +8 -1
  26. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.js +3 -1
  27. package/lib/components/molecules/Sidebar/Sidebar.js +32 -34
  28. package/lib/components/molecules/Sidebar/Sidebar.layout.styles.js +2 -2
  29. package/lib/components/molecules/Sidebar/Sidebar.spec.js +22 -2
  30. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +12 -21
  31. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.js +1 -8
  32. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.js +184 -430
  33. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.spec.js +22 -78
  34. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.styles.js +72 -132
  35. package/lib/components/organisms/ChatAIPage/ChatAIPage.js +484 -0
  36. package/lib/components/organisms/ChatAIPage/ChatAIPage.spec.js +231 -0
  37. package/lib/components/organisms/ChatAIPage/ChatAIPage.styles.js +16 -0
  38. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.js +253 -0
  39. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.spec.js +139 -0
  40. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.styles.js +13 -0
  41. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.js +217 -0
  42. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.spec.js +102 -0
  43. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.styles.js +147 -0
  44. package/lib/components/organisms/ChatAIPage/getDaypart.js +9 -0
  45. package/lib/components/organisms/ChatAIPage/getDaypart.spec.js +19 -0
  46. package/lib/components/organisms/ChatAIPage/index.js +3 -0
  47. package/lib/components/organisms/ChatAIPage/pageHomeMockCards.js +17 -0
  48. package/lib/constants/config.js +4 -1
  49. package/lib/constants/permissions/index.js +2 -2
  50. package/lib/constants/permissions/utils.js +6 -3
  51. package/lib/dev/DevMaiaPage.js +30 -0
  52. package/lib/hooks/useAgentModel/useCreateAgent.js +6 -6
  53. package/lib/hooks/useAgentModel/useUpdateAgent.js +6 -6
  54. package/lib/hooks/useChatManager/useChatManager.js +4 -5
  55. package/lib/hooks/useContextMentions.js +56 -96
  56. package/lib/hooks/useEntitySearch.js +278 -92
  57. package/lib/hooks/useEvent.js +2 -15
  58. package/lib/hooks/useEvent.spec.js +2 -7
  59. package/lib/hooks/useIsMaiaPageRoute.js +26 -0
  60. package/lib/hooks/useIsMaiaPageRoute.spec.js +26 -0
  61. package/lib/hooks/useMentionAllowedTypes.js +25 -9
  62. package/lib/hooks/useMentionAllowedTypes.spec.js +15 -4
  63. package/lib/hooks/useMentionPopover.js +33 -9
  64. package/lib/index.js +5 -2
  65. package/lib/lang/br/index.js +32 -39
  66. package/lib/lang/en/index.js +32 -39
  67. package/lib/lang/es/index.js +33 -40
  68. package/lib/lang/fr/index.js +32 -39
  69. package/lib/services/maia/Agents/setAgentToolGroups.js +2 -2
  70. package/lib/services/maia/Agents/setAgentToolGroups.spec.js +3 -3
  71. package/lib/services/maia/Orchestrator/orchestrator.js +3 -6
  72. package/lib/services/maia/Skills/createSkill.js +1 -1
  73. package/lib/services/maia/Skills/createSkill.spec.js +5 -14
  74. package/lib/services/maia/Skills/getSkills.js +40 -70
  75. package/lib/services/maia/Skills/updateSkill.js +1 -1
  76. package/lib/services/maia/Skills/updateSkill.spec.js +4 -11
  77. package/lib/styles/cascade.js +29 -3
  78. package/lib/styles/transitions.js +3 -1
  79. package/lib/types/agentModal.js +1 -1
  80. package/lib/types/global.d.js +1 -1
  81. package/lib/types/skill.js +1 -1
  82. package/lib/utils/contextMentionTriggers.js +5 -2
  83. package/lib/utils/contextMentionTriggers.spec.js +6 -8
  84. package/lib/utils/maiaPageRoute.js +24 -0
  85. package/lib/utils/maiaPageRoute.spec.js +23 -0
  86. package/lib/utils/normalizeAgentConnectors.js +16 -44
  87. package/lib/utils/normalizeAgentConnectors.spec.js +13 -43
  88. package/lib/utils/renderContextMentions.js +18 -39
  89. package/package.json +1 -1
  90. package/lib/components/atoms/SkillsDropdown/SkillsDropdown.js +0 -208
  91. package/lib/components/atoms/SkillsDropdown/SkillsDropdown.spec.js +0 -107
  92. package/lib/components/atoms/SkillsDropdown/SkillsDropdown.styles.js +0 -77
  93. package/lib/components/atoms/SkillsDropdown/index.js +0 -2
  94. package/lib/components/atoms/icons/PlusIcon.js +0 -29
  95. package/lib/components/atoms/icons/SkillCreatedByIcon.js +0 -20
  96. package/lib/components/atoms/icons/SkillVisibilityEveryoneIcon.js +0 -23
  97. package/lib/components/atoms/icons/SkillVisibilityOnlyMeIcon.js +0 -23
  98. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.spec.js +0 -77
  99. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.spec.js +0 -128
  100. package/lib/hooks/useAgentModel/useCreateAgent.spec.js +0 -95
  101. package/lib/hooks/useAgentModel/useUpdateAgent.spec.js +0 -96
  102. package/lib/hooks/useSkillsCatalog.js +0 -66
  103. package/lib/hooks/useSkillsCatalog.spec.js +0 -88
  104. package/lib/services/maia/Orchestrator/orchestrator.spec.js +0 -72
  105. package/lib/services/maia/Skills/getSkills.spec.js +0 -152
@@ -0,0 +1,484 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
3
+ 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; }
4
+ 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; }
5
+ /* eslint-disable no-nested-ternary */
6
+ /* eslint-disable react/function-component-definition */
7
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
8
+ import moment from 'moment';
9
+ import { useTranslation } from 'react-i18next';
10
+ import { useUser } from '../../../context/cor-user';
11
+ import { MAIAError } from '../../atoms/MAIAError';
12
+ import { ChatAIContent } from '../../molecules/ChatAIContent';
13
+ import { buildHandlers, options } from '../../molecules/ChatAIModal/constants';
14
+ import { Sidebar } from '../../molecules/Sidebar';
15
+ import { useGetAgents } from '../../../services/maia/Agents/getAgents';
16
+ import { GlobalContext, useGlobalContext } from '../../../context/global-context';
17
+ import { Snackbar } from '../SnackBar/Snackbar';
18
+ import { ProjectSummaryContent } from '../../molecules/ProjectSummaryContent';
19
+ import { AbmAgentModal } from '../AbmAgentModal/AbmAgentModal';
20
+ import { ChatAiModalFooter } from '../../molecules/ChatAIModal/components/ChatAiModalFooter';
21
+ import { ChatAIPageHeader } from './ChatAIPageHeader';
22
+ import { ChatAIPageHome } from './ChatAIPageHome';
23
+ import { SECTIONS } from '../../../constants/config';
24
+ import { useStreamdownStyles } from '../../../hooks/useStreamdownStyles';
25
+ import { useProjectSummaryConfig } from '../../../hooks/useProjectSummaryConfig';
26
+ import { acquireChatsStore, releaseChatsStore } from '../../../store';
27
+ import { useEvent } from '../../../hooks/useEvent';
28
+ import { withAppCfg } from '../../atoms/WithAppCfg';
29
+ import { Features } from '../../atoms/WithFeatureValidation';
30
+ import { setMaiaPagePresence } from '../../../utils/maiaPageRoute';
31
+ import { SCPageMain, SCPageWrapper } from './ChatAIPage.styles';
32
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
33
+ var validateAccessByFeature = function validateAccessByFeature(section) {
34
+ if (section === 'header' && (window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS || window.MAIA_CHAT_AI_FEATURE_ACCESS)) {
35
+ return true;
36
+ }
37
+ if ((section === 'project' || section === 'client') && window.MAIA_CHAT_AI_FEATURE_ACCESS) {
38
+ return true;
39
+ }
40
+ return false;
41
+ };
42
+ export var ChatAIPage = withAppCfg(function (_ref) {
43
+ var _ref$entity = _ref.entity,
44
+ entity = _ref$entity === void 0 ? {
45
+ projectId: null,
46
+ clientId: null
47
+ } : _ref$entity,
48
+ _ref$project = _ref.project,
49
+ initialProject = _ref$project === void 0 ? null : _ref$project,
50
+ _ref$client = _ref.client,
51
+ initialClient = _ref$client === void 0 ? null : _ref$client,
52
+ _ref$section = _ref.section,
53
+ section = _ref$section === void 0 ? 'header' : _ref$section,
54
+ _ref$hasMultiAgents = _ref.hasMultiAgents,
55
+ hasMultiAgents = _ref$hasMultiAgents === void 0 ? false : _ref$hasMultiAgents,
56
+ className = _ref.className;
57
+ useStreamdownStyles();
58
+ useEffect(function () {
59
+ setMaiaPagePresence(true);
60
+ return function () {
61
+ setMaiaPagePresence(false);
62
+ };
63
+ }, []);
64
+ var initialProjectValue = section === 'project' ? initialProject : null;
65
+ var _useState = useState(initialProjectValue),
66
+ _useState2 = _slicedToArray(_useState, 2),
67
+ project = _useState2[0],
68
+ setProject = _useState2[1];
69
+ useEffect(function () {
70
+ if (section === 'project' && initialProject != null) {
71
+ setProject(initialProject);
72
+ }
73
+ }, [section, initialProject]);
74
+ var _useProjectSummaryCon = useProjectSummaryConfig({
75
+ section: section,
76
+ entity: entity,
77
+ project: project,
78
+ setProject: setProject,
79
+ client: section === 'client' ? initialClient !== null && initialClient !== void 0 ? initialClient : null : undefined,
80
+ hasMultiAgents: hasMultiAgents
81
+ }),
82
+ context = _useProjectSummaryCon.context,
83
+ restoreConfigureSettings = _useProjectSummaryCon.restoreConfigureSettings;
84
+ var providerValue = useMemo(function () {
85
+ return _objectSpread(_objectSpread({}, context), {}, {
86
+ section: section
87
+ });
88
+ }, [context, section]);
89
+ useEffect(function () {
90
+ acquireChatsStore();
91
+ return function () {
92
+ releaseChatsStore();
93
+ restoreConfigureSettings();
94
+ };
95
+ }, [restoreConfigureSettings]);
96
+ return /*#__PURE__*/_jsx(GlobalContext.Provider, {
97
+ value: providerValue,
98
+ children: /*#__PURE__*/_jsx(ChatAIPageContent, {
99
+ section: section,
100
+ className: className
101
+ })
102
+ });
103
+ }, Features.CHAT_AI);
104
+ var ChatAIPageContent = function ChatAIPageContent(_ref2) {
105
+ var _user$permissions, _user$permissions2, _user$permissions3;
106
+ var section = _ref2.section,
107
+ className = _ref2.className;
108
+ var user = useUser();
109
+ var _useTranslation = useTranslation([SECTIONS.abmAgent]),
110
+ i18n = _useTranslation.i18n;
111
+ var amplitudEvent = useEvent();
112
+ var lang = i18n.language === 'br' ? 'pt-br' : i18n.language;
113
+ moment.locale(lang);
114
+ var _useState3 = useState({
115
+ message: '',
116
+ attachments: []
117
+ }),
118
+ _useState4 = _slicedToArray(_useState3, 2),
119
+ userInitialMessage = _useState4[0],
120
+ setUserInitialMessage = _useState4[1];
121
+ var _useState5 = useState(null),
122
+ _useState6 = _slicedToArray(_useState5, 2),
123
+ initialChatId = _useState6[0],
124
+ setInitialChatId = _useState6[1];
125
+ var _useState7 = useState(0),
126
+ _useState8 = _slicedToArray(_useState7, 2),
127
+ newChatKey = _useState8[0],
128
+ setNewChatKey = _useState8[1];
129
+ var _useState9 = useState(null),
130
+ _useState0 = _slicedToArray(_useState9, 2),
131
+ sendMessageFunction = _useState0[0],
132
+ setSendMessageFunction = _useState0[1];
133
+ var _useState1 = useState(null),
134
+ _useState10 = _slicedToArray(_useState1, 2),
135
+ stopGenerationFunction = _useState10[0],
136
+ setStopGenerationFunction = _useState10[1];
137
+ var _useState11 = useState(false),
138
+ _useState12 = _slicedToArray(_useState11, 2),
139
+ isStreaming = _useState12[0],
140
+ setIsStreaming = _useState12[1];
141
+ var _useState13 = useState(false),
142
+ _useState14 = _slicedToArray(_useState13, 2),
143
+ isWriting = _useState14[0],
144
+ setIsWriting = _useState14[1];
145
+ var _useState15 = useState(false),
146
+ _useState16 = _slicedToArray(_useState15, 2),
147
+ refetchChats = _useState16[0],
148
+ setRefetchChats = _useState16[1];
149
+ var _useState17 = useState(options.home),
150
+ _useState18 = _slicedToArray(_useState17, 2),
151
+ currentOption = _useState18[0],
152
+ setCurrentOption = _useState18[1];
153
+ var _useState19 = useState(false),
154
+ _useState20 = _slicedToArray(_useState19, 2),
155
+ hasError = _useState20[0],
156
+ setHasError = _useState20[1];
157
+ var handlers = useMemo(function () {
158
+ return buildHandlers(setCurrentOption, setHasError);
159
+ }, []);
160
+ var _useState21 = useState(false),
161
+ _useState22 = _slicedToArray(_useState21, 2),
162
+ sidebarHasError = _useState22[0],
163
+ setSidebarHasError = _useState22[1];
164
+ var resetSelectedChatRef = useRef(null);
165
+ var _useState23 = useState('sidebar'),
166
+ _useState24 = _slicedToArray(_useState23, 2),
167
+ layoutMode = _useState24[0],
168
+ setLayoutMode = _useState24[1];
169
+ var _useState25 = useState(false),
170
+ _useState26 = _slicedToArray(_useState25, 2),
171
+ sidebarOpen = _useState26[0],
172
+ setSidebarOpen = _useState26[1];
173
+ var _useState27 = useState(false),
174
+ _useState28 = _slicedToArray(_useState27, 2),
175
+ homeLeaving = _useState28[0],
176
+ setHomeLeaving = _useState28[1];
177
+ var skipChatEnterRef = useRef(false);
178
+ var expanded = layoutMode === 'fullscreen';
179
+ var _useGlobalContext = useGlobalContext(),
180
+ selectAgent = _useGlobalContext.selectAgent,
181
+ agent = _useGlobalContext.agent,
182
+ toggleWebSearch = _useGlobalContext.toggleWebSearch,
183
+ isWebSearchActive = _useGlobalContext.isWebSearchActive,
184
+ setChipsProject = _useGlobalContext.setChipsProject,
185
+ setClient = _useGlobalContext.setClient,
186
+ setProject = _useGlobalContext.setProject;
187
+ var _useGetAgents = useGetAgents({
188
+ selectAgent: selectAgent,
189
+ section: section,
190
+ agent: agent,
191
+ handleGoHome: handlers.home
192
+ }),
193
+ agents = _useGetAgents.agents,
194
+ loading = _useGetAgents.loading,
195
+ loadingMore = _useGetAgents.loadingMore,
196
+ agentError = _useGetAgents.error,
197
+ handleGetAgents = _useGetAgents.handleGetAgents,
198
+ loadMoreAgents = _useGetAgents.loadMoreAgents,
199
+ sortAgentsList = _useGetAgents.sortAgentsList,
200
+ addAgent = _useGetAgents.addAgent,
201
+ removeAgent = _useGetAgents.removeAgent,
202
+ updateAgent = _useGetAgents.updateAgent,
203
+ updateAgentFavorite = _useGetAgents.updateAgentFavorite,
204
+ selectFirstAgent = _useGetAgents.selectFirstAgent;
205
+ 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;
206
+ var orchestrator = useMemo(function () {
207
+ var _agents$data$find;
208
+ return (_agents$data$find = agents.data.find(function (item) {
209
+ return item.type === 'orchestrator';
210
+ })) !== null && _agents$data$find !== void 0 ? _agents$data$find : null;
211
+ }, [agents.data]);
212
+ var computedCurrentOption = currentOption === options.chat ? options.chat : options.home;
213
+ var didInitAgentRef = useRef(false);
214
+ useEffect(function () {
215
+ if (didInitAgentRef.current || !orchestrator) return;
216
+ didInitAgentRef.current = true;
217
+ selectAgent(orchestrator);
218
+ }, [orchestrator, selectAgent]);
219
+ var agentsFetchedRef = useRef(false);
220
+ useEffect(function () {
221
+ if (!agentsFetchedRef.current) {
222
+ agentsFetchedRef.current = true;
223
+ handleGetAgents();
224
+ }
225
+ }, [handleGetAgents]);
226
+ useEffect(function () {
227
+ var onMergeCreatedAgent = function onMergeCreatedAgent(evt) {
228
+ var _ref3 = evt.detail || {},
229
+ nextAgent = _ref3.agent;
230
+ if (nextAgent !== null && nextAgent !== void 0 && nextAgent.id) addAgent(nextAgent, {
231
+ navigateHome: false
232
+ });
233
+ };
234
+ document.addEventListener('maia-merge-created-agent-into-list', onMergeCreatedAgent);
235
+ return function () {
236
+ return document.removeEventListener('maia-merge-created-agent-into-list', onMergeCreatedAgent);
237
+ };
238
+ }, [addAgent]);
239
+ useEffect(function () {
240
+ var onSyncEditedAgent = function onSyncEditedAgent(evt) {
241
+ var _ref4 = evt.detail || {},
242
+ nextAgent = _ref4.agent;
243
+ if (!(nextAgent !== null && nextAgent !== void 0 && nextAgent.id)) return;
244
+ updateAgent(nextAgent);
245
+ if ((agent === null || agent === void 0 ? void 0 : agent.id) === nextAgent.id) selectAgent(nextAgent);
246
+ };
247
+ document.addEventListener('maia-sync-edited-agent-from-chat', onSyncEditedAgent);
248
+ return function () {
249
+ return document.removeEventListener('maia-sync-edited-agent-from-chat', onSyncEditedAgent);
250
+ };
251
+ }, [updateAgent, selectAgent, agent === null || agent === void 0 ? void 0 : agent.id]);
252
+ useEffect(function () {
253
+ var openChatView = function openChatView() {
254
+ setHasError(false);
255
+ setInitialChatId(null);
256
+ setNewChatKey(function (prev) {
257
+ return prev + 1;
258
+ });
259
+ setUserInitialMessage({
260
+ message: '',
261
+ attachments: []
262
+ });
263
+ setCurrentOption(options.chat);
264
+ document.dispatchEvent(new CustomEvent('chat-session-changed'));
265
+ };
266
+ document.addEventListener('maia-open-chat-view', openChatView);
267
+ return function () {
268
+ return document.removeEventListener('maia-open-chat-view', openChatView);
269
+ };
270
+ }, []);
271
+ useEffect(function () {
272
+ var openNewChatWithAgent = function openNewChatWithAgent(event) {
273
+ var _detail;
274
+ var nextAgent = (_detail = event.detail) === null || _detail === void 0 ? void 0 : _detail.agent;
275
+ if (!nextAgent) return;
276
+ setProject(null);
277
+ setClient === null || setClient === void 0 || setClient(null);
278
+ selectAgent(nextAgent);
279
+ setHasError(false);
280
+ setCurrentOption(options.home);
281
+ };
282
+ document.addEventListener('maia-open-new-chat-with-agent', openNewChatWithAgent);
283
+ return function () {
284
+ return document.removeEventListener('maia-open-new-chat-with-agent', openNewChatWithAgent);
285
+ };
286
+ }, [selectAgent, setClient, setProject]);
287
+ var startChat = useCallback(function (message, attachments, faqId, agentSuggestionId, _mentions, fuaId) {
288
+ if (sidebarHasError) setSidebarHasError(false);
289
+ setInitialChatId(null);
290
+ setNewChatKey(function (prev) {
291
+ return prev + 1;
292
+ });
293
+ setUserInitialMessage(_objectSpread(_objectSpread(_objectSpread({
294
+ message: message || '',
295
+ attachments: attachments || []
296
+ }, faqId ? {
297
+ faqId: faqId
298
+ } : {}), agentSuggestionId ? {
299
+ agentSuggestionId: agentSuggestionId
300
+ } : {}), fuaId ? {
301
+ fuaId: fuaId
302
+ } : {}));
303
+ handlers.chat();
304
+ }, [handlers, sidebarHasError]);
305
+
306
+ // Sidebar types this prop as (chatId: string) but passes the full chat object at runtime
307
+ var goToChat = useCallback(function (chatArg) {
308
+ var chat = chatArg;
309
+ setUserInitialMessage({
310
+ message: '',
311
+ attachments: []
312
+ });
313
+ setInitialChatId(chat.sessionExternalId);
314
+ var selectedAgent = agents.data.find(function (agentItem) {
315
+ return agentItem.id === chat.agentId;
316
+ });
317
+ if (selectedAgent) selectAgent(selectedAgent);
318
+ skipChatEnterRef.current = false;
319
+ document.dispatchEvent(new CustomEvent('chat-session-changed'));
320
+ handlers.chat();
321
+ }, [handlers, agents, selectAgent]);
322
+ var handleSendMessageReady = useCallback(function (sendMessage, stopGeneration, streaming, writing) {
323
+ setSendMessageFunction(function () {
324
+ return sendMessage;
325
+ });
326
+ setStopGenerationFunction(function () {
327
+ return stopGeneration;
328
+ });
329
+ setIsStreaming(streaming);
330
+ setIsWriting(writing);
331
+ }, []);
332
+ var handleSendMessage = useCallback(function (message, attachments, faqId, agentSuggestionId, mentions, fuaId) {
333
+ if (sidebarHasError) setSidebarHasError(false);
334
+ if (sendMessageFunction && computedCurrentOption === options.chat) {
335
+ sendMessageFunction(message, attachments, faqId, agentSuggestionId);
336
+ } else {
337
+ startChat(message, attachments, faqId, agentSuggestionId, mentions, fuaId);
338
+ }
339
+ }, [sendMessageFunction, startChat, computedCurrentOption, sidebarHasError]);
340
+ var handleGoHome = useCallback(function () {
341
+ setHomeLeaving(false);
342
+ skipChatEnterRef.current = false;
343
+ if (currentOption === options.chat) {
344
+ setInitialChatId(null);
345
+ setNewChatKey(function (prev) {
346
+ return prev + 1;
347
+ });
348
+ if ((agent === null || agent === void 0 ? void 0 : agent.entity) !== 'client') setClient === null || setClient === void 0 || setClient(null);
349
+ }
350
+ if (orchestrator) {
351
+ selectAgent(orchestrator);
352
+ } else 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) {
353
+ selectAgent(agents.data[0]);
354
+ }
355
+ setCurrentOption(options.home);
356
+ setChipsProject(null);
357
+ setHasError(false);
358
+ if (isWebSearchActive) toggleWebSearch();
359
+ if (resetSelectedChatRef.current) resetSelectedChatRef.current();
360
+ }, [currentOption, isWebSearchActive, toggleWebSearch, agent, agents, orchestrator, selectAgent, setClient, setChipsProject]);
361
+ var handleResetChat = useCallback(function () {
362
+ setHomeLeaving(false);
363
+ skipChatEnterRef.current = false;
364
+ setInitialChatId(null);
365
+ setNewChatKey(function (prev) {
366
+ return prev + 1;
367
+ });
368
+ setUserInitialMessage({
369
+ message: '',
370
+ attachments: []
371
+ });
372
+ setCurrentOption(options.home);
373
+ setChipsProject(null);
374
+ setHasError(false);
375
+ if (isWebSearchActive) toggleWebSearch();
376
+ if (resetSelectedChatRef.current) resetSelectedChatRef.current();
377
+ document.dispatchEvent(new CustomEvent('chat-session-changed'));
378
+ }, [isWebSearchActive, toggleWebSearch, setChipsProject]);
379
+ var focusChatInput = useCallback(function () {
380
+ window.setTimeout(function () {
381
+ document.dispatchEvent(new CustomEvent('maia-input-refocus'));
382
+ }, 100);
383
+ }, []);
384
+ var handleStartNewChat = useCallback(function () {
385
+ if (currentOption === options.home) {
386
+ focusChatInput();
387
+ return;
388
+ }
389
+ if (orchestrator) selectAgent(orchestrator);
390
+ handleGoHome();
391
+ focusChatInput();
392
+ }, [currentOption, focusChatInput, handleGoHome, orchestrator, selectAgent]);
393
+ var noop = useCallback(function () {
394
+ return undefined;
395
+ }, []);
396
+
397
+ // Suppress unused variable warning — kept for potential Amplitude tracking parity
398
+ void amplitudEvent;
399
+ var canAccessPage = validateAccessByFeature(section);
400
+ var isHome = computedCurrentOption === options.home;
401
+ var showChatFooter = computedCurrentOption === options.chat && !hasError && !loading && canAccessPage;
402
+ return /*#__PURE__*/_jsxs(SCPageWrapper, {
403
+ className: className,
404
+ children: [canAccessPage ? /*#__PURE__*/_jsx(Sidebar, {
405
+ conversationsOnly: true,
406
+ open: sidebarOpen,
407
+ onOpenChange: setSidebarOpen,
408
+ onGoToChat: goToChat,
409
+ onError: function onError() {
410
+ return setSidebarHasError(true);
411
+ },
412
+ handleGoToHome: handleGoHome,
413
+ handleStartNewChat: handleStartNewChat,
414
+ handleOpenMarketplace: noop,
415
+ handleOpenSkills: noop,
416
+ showNewChat: false,
417
+ refetchChats: refetchChats,
418
+ handleSetRefetchChats: setRefetchChats,
419
+ hasError: sidebarHasError,
420
+ resetSelectedChatRef: resetSelectedChatRef
421
+ }) : null, /*#__PURE__*/_jsxs(SCPageMain, {
422
+ children: [/*#__PURE__*/_jsx(ChatAIPageHeader, {
423
+ overlay: isHome && !homeLeaving,
424
+ showBack: !isHome,
425
+ agents: agents.data,
426
+ loading: loading,
427
+ loadingMore: loadingMore,
428
+ hasMore: agents.has_more,
429
+ loadMoreAgents: loadMoreAgents,
430
+ sortAgentsList: sortAgentsList,
431
+ handleResetChat: handleResetChat,
432
+ onAgentUpdate: updateAgentFavorite
433
+ }), hasError ? /*#__PURE__*/_jsx(MAIAError, {}) : canAccessPage ? isHome ? /*#__PURE__*/_jsx(ChatAIPageHome, {
434
+ onSendMessage: function onSendMessage(message, attachments, faqId, agentSuggestionId, mentions, fuaId) {
435
+ setHomeLeaving(false);
436
+ handleSendMessage(message, attachments, faqId, agentSuggestionId, mentions, fuaId);
437
+ },
438
+ onLeaveStart: function onLeaveStart() {
439
+ skipChatEnterRef.current = true;
440
+ setHomeLeaving(true);
441
+ }
442
+ }, agent === null || agent === void 0 ? void 0 : agent.id) : /*#__PURE__*/_jsx(ChatAIContent, {
443
+ currentOption: options.chat,
444
+ handlers: _objectSpread(_objectSpread({}, handlers), {}, {
445
+ chat: startChat,
446
+ home: handlers.home,
447
+ handleGoHome: handleGoHome
448
+ }),
449
+ onError: function onError() {
450
+ return setHasError(true);
451
+ },
452
+ refs: {
453
+ userInitialMessage: userInitialMessage,
454
+ initialChatId: initialChatId
455
+ },
456
+ onSendMessageReady: handleSendMessageReady,
457
+ expanded: expanded,
458
+ floating: false,
459
+ agents: agents.data,
460
+ loadingAgents: loading,
461
+ agentError: agentError,
462
+ skipEnterAnimation: skipChatEnterRef.current
463
+ }) : /*#__PURE__*/_jsx(ProjectSummaryContent, {
464
+ onRestartSummary: handlers.home
465
+ }), showChatFooter ? /*#__PURE__*/_jsx(ChatAiModalFooter, {
466
+ agent: agent,
467
+ handleSendMessage: handleSendMessage,
468
+ handleStopGeneration: stopGenerationFunction,
469
+ isStreaming: isStreaming,
470
+ isWriting: isWriting,
471
+ chatId: initialChatId,
472
+ newChatKey: newChatKey,
473
+ layoutMode: layoutMode
474
+ }) : null]
475
+ }), userHasPermissions && /*#__PURE__*/_jsx(AbmAgentModal, {
476
+ addAgent: addAgent,
477
+ updateAgent: updateAgent,
478
+ removeAgent: removeAgent,
479
+ updateAgentFavorite: updateAgentFavorite,
480
+ selectFirstAgent: selectFirstAgent
481
+ }), /*#__PURE__*/_jsx(Snackbar, {})]
482
+ });
483
+ };
484
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZUVmZmVjdCIsInVzZU1lbW8iLCJ1c2VSZWYiLCJ1c2VTdGF0ZSIsIm1vbWVudCIsInVzZVRyYW5zbGF0aW9uIiwidXNlVXNlciIsIk1BSUFFcnJvciIsIkNoYXRBSUNvbnRlbnQiLCJidWlsZEhhbmRsZXJzIiwib3B0aW9ucyIsIlNpZGViYXIiLCJ1c2VHZXRBZ2VudHMiLCJHbG9iYWxDb250ZXh0IiwidXNlR2xvYmFsQ29udGV4dCIsIlNuYWNrYmFyIiwiUHJvamVjdFN1bW1hcnlDb250ZW50IiwiQWJtQWdlbnRNb2RhbCIsIkNoYXRBaU1vZGFsRm9vdGVyIiwiQ2hhdEFJUGFnZUhlYWRlciIsIkNoYXRBSVBhZ2VIb21lIiwiU0VDVElPTlMiLCJ1c2VTdHJlYW1kb3duU3R5bGVzIiwidXNlUHJvamVjdFN1bW1hcnlDb25maWciLCJhY3F1aXJlQ2hhdHNTdG9yZSIsInJlbGVhc2VDaGF0c1N0b3JlIiwidXNlRXZlbnQiLCJ3aXRoQXBwQ2ZnIiwiRmVhdHVyZXMiLCJzZXRNYWlhUGFnZVByZXNlbmNlIiwiU0NQYWdlTWFpbiIsIlNDUGFnZVdyYXBwZXIiLCJqc3giLCJfanN4IiwianN4cyIsIl9qc3hzIiwidmFsaWRhdGVBY2Nlc3NCeUZlYXR1cmUiLCJzZWN0aW9uIiwid2luZG93IiwiTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyIsIk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTUyIsIkNoYXRBSVBhZ2UiLCJfcmVmIiwiX3JlZiRlbnRpdHkiLCJlbnRpdHkiLCJwcm9qZWN0SWQiLCJjbGllbnRJZCIsIl9yZWYkcHJvamVjdCIsInByb2plY3QiLCJpbml0aWFsUHJvamVjdCIsIl9yZWYkY2xpZW50IiwiY2xpZW50IiwiaW5pdGlhbENsaWVudCIsIl9yZWYkc2VjdGlvbiIsIl9yZWYkaGFzTXVsdGlBZ2VudHMiLCJoYXNNdWx0aUFnZW50cyIsImNsYXNzTmFtZSIsImluaXRpYWxQcm9qZWN0VmFsdWUiLCJfdXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkiLCJzZXRQcm9qZWN0IiwiX3VzZVByb2plY3RTdW1tYXJ5Q29uIiwidW5kZWZpbmVkIiwiY29udGV4dCIsInJlc3RvcmVDb25maWd1cmVTZXR0aW5ncyIsInByb3ZpZGVyVmFsdWUiLCJfb2JqZWN0U3ByZWFkIiwiUHJvdmlkZXIiLCJ2YWx1ZSIsImNoaWxkcmVuIiwiQ2hhdEFJUGFnZUNvbnRlbnQiLCJDSEFUX0FJIiwiX3JlZjIiLCJfdXNlciRwZXJtaXNzaW9ucyIsIl91c2VyJHBlcm1pc3Npb25zMiIsIl91c2VyJHBlcm1pc3Npb25zMyIsInVzZXIiLCJfdXNlVHJhbnNsYXRpb24iLCJhYm1BZ2VudCIsImkxOG4iLCJhbXBsaXR1ZEV2ZW50IiwibGFuZyIsImxhbmd1YWdlIiwibG9jYWxlIiwiX3VzZVN0YXRlMyIsIm1lc3NhZ2UiLCJhdHRhY2htZW50cyIsIl91c2VTdGF0ZTQiLCJ1c2VySW5pdGlhbE1lc3NhZ2UiLCJzZXRVc2VySW5pdGlhbE1lc3NhZ2UiLCJfdXNlU3RhdGU1IiwiX3VzZVN0YXRlNiIsImluaXRpYWxDaGF0SWQiLCJzZXRJbml0aWFsQ2hhdElkIiwiX3VzZVN0YXRlNyIsIl91c2VTdGF0ZTgiLCJuZXdDaGF0S2V5Iiwic2V0TmV3Q2hhdEtleSIsIl91c2VTdGF0ZTkiLCJfdXNlU3RhdGUwIiwic2VuZE1lc3NhZ2VGdW5jdGlvbiIsInNldFNlbmRNZXNzYWdlRnVuY3Rpb24iLCJfdXNlU3RhdGUxIiwiX3VzZVN0YXRlMTAiLCJzdG9wR2VuZXJhdGlvbkZ1bmN0aW9uIiwic2V0U3RvcEdlbmVyYXRpb25GdW5jdGlvbiIsIl91c2VTdGF0ZTExIiwiX3VzZVN0YXRlMTIiLCJpc1N0cmVhbWluZyIsInNldElzU3RyZWFtaW5nIiwiX3VzZVN0YXRlMTMiLCJfdXNlU3RhdGUxNCIsImlzV3JpdGluZyIsInNldElzV3JpdGluZyIsIl91c2VTdGF0ZTE1IiwiX3VzZVN0YXRlMTYiLCJyZWZldGNoQ2hhdHMiLCJzZXRSZWZldGNoQ2hhdHMiLCJfdXNlU3RhdGUxNyIsImhvbWUiLCJfdXNlU3RhdGUxOCIsImN1cnJlbnRPcHRpb24iLCJzZXRDdXJyZW50T3B0aW9uIiwiX3VzZVN0YXRlMTkiLCJfdXNlU3RhdGUyMCIsImhhc0Vycm9yIiwic2V0SGFzRXJyb3IiLCJoYW5kbGVycyIsIl91c2VTdGF0ZTIxIiwiX3VzZVN0YXRlMjIiLCJzaWRlYmFySGFzRXJyb3IiLCJzZXRTaWRlYmFySGFzRXJyb3IiLCJyZXNldFNlbGVjdGVkQ2hhdFJlZiIsIl91c2VTdGF0ZTIzIiwiX3VzZVN0YXRlMjQiLCJsYXlvdXRNb2RlIiwic2V0TGF5b3V0TW9kZSIsIl91c2VTdGF0ZTI1IiwiX3VzZVN0YXRlMjYiLCJzaWRlYmFyT3BlbiIsInNldFNpZGViYXJPcGVuIiwiX3VzZVN0YXRlMjciLCJfdXNlU3RhdGUyOCIsImhvbWVMZWF2aW5nIiwic2V0SG9tZUxlYXZpbmciLCJza2lwQ2hhdEVudGVyUmVmIiwiZXhwYW5kZWQiLCJfdXNlR2xvYmFsQ29udGV4dCIsInNlbGVjdEFnZW50IiwiYWdlbnQiLCJ0b2dnbGVXZWJTZWFyY2giLCJpc1dlYlNlYXJjaEFjdGl2ZSIsInNldENoaXBzUHJvamVjdCIsInNldENsaWVudCIsIl91c2VHZXRBZ2VudHMiLCJoYW5kbGVHb0hvbWUiLCJhZ2VudHMiLCJsb2FkaW5nIiwibG9hZGluZ01vcmUiLCJhZ2VudEVycm9yIiwiZXJyb3IiLCJoYW5kbGVHZXRBZ2VudHMiLCJsb2FkTW9yZUFnZW50cyIsInNvcnRBZ2VudHNMaXN0IiwiYWRkQWdlbnQiLCJyZW1vdmVBZ2VudCIsInVwZGF0ZUFnZW50IiwidXBkYXRlQWdlbnRGYXZvcml0ZSIsInNlbGVjdEZpcnN0QWdlbnQiLCJ1c2VySGFzUGVybWlzc2lvbnMiLCJwZXJtaXNzaW9ucyIsImFpX2FnZW50cyIsImNyZWF0ZSIsImVkaXQiLCJvcmNoZXN0cmF0b3IiLCJfYWdlbnRzJGRhdGEkZmluZCIsImRhdGEiLCJmaW5kIiwiaXRlbSIsInR5cGUiLCJjb21wdXRlZEN1cnJlbnRPcHRpb24iLCJjaGF0IiwiZGlkSW5pdEFnZW50UmVmIiwiY3VycmVudCIsImFnZW50c0ZldGNoZWRSZWYiLCJvbk1lcmdlQ3JlYXRlZEFnZW50IiwiZXZ0IiwiX3JlZjMiLCJkZXRhaWwiLCJuZXh0QWdlbnQiLCJpZCIsIm5hdmlnYXRlSG9tZSIsImRvY3VtZW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJvblN5bmNFZGl0ZWRBZ2VudCIsIl9yZWY0Iiwib3BlbkNoYXRWaWV3IiwicHJldiIsImRpc3BhdGNoRXZlbnQiLCJDdXN0b21FdmVudCIsIm9wZW5OZXdDaGF0V2l0aEFnZW50IiwiZXZlbnQiLCJfZGV0YWlsIiwic3RhcnRDaGF0IiwiZmFxSWQiLCJhZ2VudFN1Z2dlc3Rpb25JZCIsIl9tZW50aW9ucyIsImZ1YUlkIiwiZ29Ub0NoYXQiLCJjaGF0QXJnIiwic2Vzc2lvbkV4dGVybmFsSWQiLCJzZWxlY3RlZEFnZW50IiwiYWdlbnRJdGVtIiwiYWdlbnRJZCIsImhhbmRsZVNlbmRNZXNzYWdlUmVhZHkiLCJzZW5kTWVzc2FnZSIsInN0b3BHZW5lcmF0aW9uIiwic3RyZWFtaW5nIiwid3JpdGluZyIsImhhbmRsZVNlbmRNZXNzYWdlIiwibWVudGlvbnMiLCJpc19kZWxldGVkIiwiaGFzX25vdF9wZXJtaXNzaW9ucyIsImhhc19ub3RfYWNjZXNzIiwicHJvamVjdF9kZWxldGVkIiwibGVuZ3RoIiwiaGFuZGxlUmVzZXRDaGF0IiwiZm9jdXNDaGF0SW5wdXQiLCJzZXRUaW1lb3V0IiwiaGFuZGxlU3RhcnROZXdDaGF0Iiwibm9vcCIsImNhbkFjY2Vzc1BhZ2UiLCJpc0hvbWUiLCJzaG93Q2hhdEZvb3RlciIsImNvbnZlcnNhdGlvbnNPbmx5Iiwib3BlbiIsIm9uT3BlbkNoYW5nZSIsIm9uR29Ub0NoYXQiLCJvbkVycm9yIiwiaGFuZGxlR29Ub0hvbWUiLCJoYW5kbGVPcGVuTWFya2V0cGxhY2UiLCJoYW5kbGVPcGVuU2tpbGxzIiwic2hvd05ld0NoYXQiLCJoYW5kbGVTZXRSZWZldGNoQ2hhdHMiLCJvdmVybGF5Iiwic2hvd0JhY2siLCJoYXNNb3JlIiwiaGFzX21vcmUiLCJvbkFnZW50VXBkYXRlIiwib25TZW5kTWVzc2FnZSIsIm9uTGVhdmVTdGFydCIsInJlZnMiLCJvblNlbmRNZXNzYWdlUmVhZHkiLCJmbG9hdGluZyIsImxvYWRpbmdBZ2VudHMiLCJza2lwRW50ZXJBbmltYXRpb24iLCJvblJlc3RhcnRTdW1tYXJ5IiwiaGFuZGxlU3RvcEdlbmVyYXRpb24iLCJjaGF0SWQiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9vcmdhbmlzbXMvQ2hhdEFJUGFnZS9DaGF0QUlQYWdlLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1uZXN0ZWQtdGVybmFyeSAqL1xuLyogZXNsaW50LWRpc2FibGUgcmVhY3QvZnVuY3Rpb24tY29tcG9uZW50LWRlZmluaXRpb24gKi9cbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50J1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tICdyZWFjdC1pMThuZXh0J1xuaW1wb3J0IHsgdXNlVXNlciB9IGZyb20gJy4uLy4uLy4uL2NvbnRleHQvY29yLXVzZXInXG5pbXBvcnQgeyBNQUlBRXJyb3IgfSBmcm9tICcuLi8uLi9hdG9tcy9NQUlBRXJyb3InXG5pbXBvcnQgeyBDaGF0QUlDb250ZW50IH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL0NoYXRBSUNvbnRlbnQnXG5pbXBvcnQgeyBidWlsZEhhbmRsZXJzLCBvcHRpb25zIH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL0NoYXRBSU1vZGFsL2NvbnN0YW50cydcbmltcG9ydCB7IFNpZGViYXIgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvU2lkZWJhcidcbmltcG9ydCB7IHVzZUdldEFnZW50cyB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL21haWEvQWdlbnRzL2dldEFnZW50cydcbmltcG9ydCB7IEdsb2JhbENvbnRleHQsIHVzZUdsb2JhbENvbnRleHQgfSBmcm9tICcuLi8uLi8uLi9jb250ZXh0L2dsb2JhbC1jb250ZXh0J1xuaW1wb3J0IHsgQXR0YWNobWVudEZpbGUgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvQ2hhdEZvb3Rlci9DaGF0Rm9vdGVyJ1xuaW1wb3J0IHsgU25hY2tiYXIgfSBmcm9tICcuLi9TbmFja0Jhci9TbmFja2JhcidcbmltcG9ydCB7IFByb2plY3RTdW1tYXJ5Q29udGVudCB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9Qcm9qZWN0U3VtbWFyeUNvbnRlbnQnXG5pbXBvcnQgeyBBYm1BZ2VudE1vZGFsIH0gZnJvbSAnLi4vQWJtQWdlbnRNb2RhbC9BYm1BZ2VudE1vZGFsJ1xuaW1wb3J0IHsgQ2hhdEFpTW9kYWxGb290ZXIgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvQ2hhdEFJTW9kYWwvY29tcG9uZW50cy9DaGF0QWlNb2RhbEZvb3RlcidcbmltcG9ydCB7IENoYXRBSVBhZ2VIZWFkZXIgfSBmcm9tICcuL0NoYXRBSVBhZ2VIZWFkZXInXG5pbXBvcnQgeyBDaGF0QUlQYWdlSG9tZSB9IGZyb20gJy4vQ2hhdEFJUGFnZUhvbWUnXG5pbXBvcnQgeyBTRUNUSU9OUyB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy9jb25maWcnXG5pbXBvcnQgeyBBZ2VudCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL2FnZW50J1xuaW1wb3J0IHsgdXNlU3RyZWFtZG93blN0eWxlcyB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZVN0cmVhbWRvd25TdHlsZXMnXG5pbXBvcnQgeyB1c2VQcm9qZWN0U3VtbWFyeUNvbmZpZyB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZVByb2plY3RTdW1tYXJ5Q29uZmlnJ1xuaW1wb3J0IHsgYWNxdWlyZUNoYXRzU3RvcmUsIHJlbGVhc2VDaGF0c1N0b3JlIH0gZnJvbSAnLi4vLi4vLi4vc3RvcmUnXG5pbXBvcnQgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvUHJvamVjdCdcbmltcG9ydCB7IENsaWVudCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL0NsaWVudCdcbmltcG9ydCB7IHVzZUV2ZW50IH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlRXZlbnQnXG5pbXBvcnQgeyBNYWlhQ2hhdE1vZGFsTGF5b3V0TW9kZSB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9DaGF0QUlNb2RhbC9sYXlvdXQnXG5pbXBvcnQgeyB3aXRoQXBwQ2ZnIH0gZnJvbSAnLi4vLi4vYXRvbXMvV2l0aEFwcENmZydcbmltcG9ydCB7IEZlYXR1cmVzIH0gZnJvbSAnLi4vLi4vYXRvbXMvV2l0aEZlYXR1cmVWYWxpZGF0aW9uJ1xuaW1wb3J0IHsgc2V0TWFpYVBhZ2VQcmVzZW5jZSB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL21haWFQYWdlUm91dGUnXG5pbXBvcnQgeyBTQ1BhZ2VNYWluLCBTQ1BhZ2VXcmFwcGVyIH0gZnJvbSAnLi9DaGF0QUlQYWdlLnN0eWxlcydcblxuZXhwb3J0IHR5cGUgQ2hhdEFJUGFnZVByb3BzID0ge1xuICBlbnRpdHk/OiB7IHByb2plY3RJZDogc3RyaW5nIHwgbnVsbDsgY2xpZW50SWQ6IHN0cmluZyB8IG51bGwgfVxuICBwcm9qZWN0PzogUHJvamVjdCB8IG51bGxcbiAgY2xpZW50PzogQ2xpZW50IHwgbnVsbFxuICBzZWN0aW9uPzogJ3Byb2plY3QnIHwgJ2hlYWRlcicgfCAnY2xpZW50J1xuICBoYXNNdWx0aUFnZW50cz86IGJvb2xlYW5cbiAgY2xhc3NOYW1lPzogc3RyaW5nXG59XG5cbnR5cGUgU2VjdGlvblR5cGUgPSAncHJvamVjdCcgfCAnaGVhZGVyJyB8ICdjbGllbnQnXG5cbnR5cGUgQ2hhdExpc3RJdGVtID0geyBzZXNzaW9uRXh0ZXJuYWxJZDogc3RyaW5nOyBhZ2VudElkOiBzdHJpbmcgfVxuXG5jb25zdCB2YWxpZGF0ZUFjY2Vzc0J5RmVhdHVyZSA9IChzZWN0aW9uOiBzdHJpbmcpID0+IHtcbiAgaWYgKHNlY3Rpb24gPT09ICdoZWFkZXInICYmICh3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyB8fCB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTKSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgaWYgKChzZWN0aW9uID09PSAncHJvamVjdCcgfHwgc2VjdGlvbiA9PT0gJ2NsaWVudCcpICYmIHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgY29uc3QgQ2hhdEFJUGFnZSA9IHdpdGhBcHBDZmcoXG4gICh7XG4gICAgZW50aXR5ID0geyBwcm9qZWN0SWQ6IG51bGwsIGNsaWVudElkOiBudWxsIH0sXG4gICAgcHJvamVjdDogaW5pdGlhbFByb2plY3QgPSBudWxsLFxuICAgIGNsaWVudDogaW5pdGlhbENsaWVudCA9IG51bGwsXG4gICAgc2VjdGlvbiA9ICdoZWFkZXInLFxuICAgIGhhc011bHRpQWdlbnRzID0gZmFsc2UsXG4gICAgY2xhc3NOYW1lLFxuICB9OiBDaGF0QUlQYWdlUHJvcHMpID0+IHtcbiAgICB1c2VTdHJlYW1kb3duU3R5bGVzKClcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICBzZXRNYWlhUGFnZVByZXNlbmNlKHRydWUpXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBzZXRNYWlhUGFnZVByZXNlbmNlKGZhbHNlKVxuICAgICAgfVxuICAgIH0sIFtdKVxuXG4gICAgY29uc3QgaW5pdGlhbFByb2plY3RWYWx1ZSA9IHNlY3Rpb24gPT09ICdwcm9qZWN0JyA/IGluaXRpYWxQcm9qZWN0IDogbnVsbFxuICAgIGNvbnN0IFtwcm9qZWN0LCBzZXRQcm9qZWN0XSA9IHVzZVN0YXRlPFByb2plY3QgfCBudWxsPihpbml0aWFsUHJvamVjdFZhbHVlKVxuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIGlmIChzZWN0aW9uID09PSAncHJvamVjdCcgJiYgaW5pdGlhbFByb2plY3QgIT0gbnVsbCkge1xuICAgICAgICBzZXRQcm9qZWN0KGluaXRpYWxQcm9qZWN0KVxuICAgICAgfVxuICAgIH0sIFtzZWN0aW9uLCBpbml0aWFsUHJvamVjdF0pXG5cbiAgICBjb25zdCB7IGNvbnRleHQsIHJlc3RvcmVDb25maWd1cmVTZXR0aW5ncyB9ID0gdXNlUHJvamVjdFN1bW1hcnlDb25maWcoe1xuICAgICAgc2VjdGlvbixcbiAgICAgIGVudGl0eSxcbiAgICAgIHByb2plY3QsXG4gICAgICBzZXRQcm9qZWN0LFxuICAgICAgY2xpZW50OiBzZWN0aW9uID09PSAnY2xpZW50JyA/IChpbml0aWFsQ2xpZW50ID8/IG51bGwpIDogdW5kZWZpbmVkLFxuICAgICAgaGFzTXVsdGlBZ2VudHMsXG4gICAgfSlcblxuICAgIGNvbnN0IHByb3ZpZGVyVmFsdWUgPSB1c2VNZW1vKFxuICAgICAgKCkgPT4gKHsgLi4uY29udGV4dCwgc2VjdGlvbjogc2VjdGlvbiBhcyAncHJvamVjdCcgfCAnaGVhZGVyJyB8ICdjbGllbnQnIH0pLFxuICAgICAgW2NvbnRleHQsIHNlY3Rpb25dXG4gICAgKVxuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIGFjcXVpcmVDaGF0c1N0b3JlKClcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHJlbGVhc2VDaGF0c1N0b3JlKClcbiAgICAgICAgcmVzdG9yZUNvbmZpZ3VyZVNldHRpbmdzKClcbiAgICAgIH1cbiAgICB9LCBbcmVzdG9yZUNvbmZpZ3VyZVNldHRpbmdzXSlcblxuICAgIHJldHVybiAoXG4gICAgICA8R2xvYmFsQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17cHJvdmlkZXJWYWx1ZX0+XG4gICAgICAgIDxDaGF0QUlQYWdlQ29udGVudCBzZWN0aW9uPXtzZWN0aW9uIGFzIFNlY3Rpb25UeXBlfSBjbGFzc05hbWU9e2NsYXNzTmFtZX0gLz5cbiAgICAgIDwvR2xvYmFsQ29udGV4dC5Qcm92aWRlcj5cbiAgICApXG4gIH0sXG4gIEZlYXR1cmVzLkNIQVRfQUlcbilcblxuY29uc3QgQ2hhdEFJUGFnZUNvbnRlbnQgPSAoeyBzZWN0aW9uLCBjbGFzc05hbWUgfTogeyBzZWN0aW9uOiBTZWN0aW9uVHlwZTsgY2xhc3NOYW1lPzogc3RyaW5nIH0pID0+IHtcbiAgY29uc3QgdXNlciA9IHVzZVVzZXIoKVxuICBjb25zdCB7IGkxOG4gfSA9IHVzZVRyYW5zbGF0aW9uKFtTRUNUSU9OUy5hYm1BZ2VudF0pXG4gIGNvbnN0IGFtcGxpdHVkRXZlbnQgPSB1c2VFdmVudCgpXG5cbiAgY29uc3QgbGFuZyA9IGkxOG4ubGFuZ3VhZ2UgPT09ICdicicgPyAncHQtYnInIDogaTE4bi5sYW5ndWFnZVxuICBtb21lbnQubG9jYWxlKGxhbmcpXG5cbiAgY29uc3QgW3VzZXJJbml0aWFsTWVzc2FnZSwgc2V0VXNlckluaXRpYWxNZXNzYWdlXSA9IHVzZVN0YXRlPHtcbiAgICBtZXNzYWdlOiBzdHJpbmdcbiAgICBhdHRhY2htZW50czogQXR0YWNobWVudEZpbGVbXVxuICAgIGZhcUlkPzogc3RyaW5nXG4gICAgYWdlbnRTdWdnZXN0aW9uSWQ/OiBzdHJpbmdcbiAgICBmdWFJZD86IHN0cmluZ1xuICB9Pih7IG1lc3NhZ2U6ICcnLCBhdHRhY2htZW50czogW10gfSlcbiAgY29uc3QgW2luaXRpYWxDaGF0SWQsIHNldEluaXRpYWxDaGF0SWRdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbClcbiAgY29uc3QgW25ld0NoYXRLZXksIHNldE5ld0NoYXRLZXldID0gdXNlU3RhdGUoMClcbiAgY29uc3QgW3NlbmRNZXNzYWdlRnVuY3Rpb24sIHNldFNlbmRNZXNzYWdlRnVuY3Rpb25dID0gdXNlU3RhdGU8XG4gICAgKChtZXNzYWdlOiBzdHJpbmcsIGF0dGFjaG1lbnRzPzogQXR0YWNobWVudEZpbGVbXSwgZmFxSWQ/OiBzdHJpbmcsIGFnZW50U3VnZ2VzdGlvbklkPzogc3RyaW5nKSA9PiB2b2lkKSB8IG51bGxcbiAgPihudWxsKVxuICBjb25zdCBbc3RvcEdlbmVyYXRpb25GdW5jdGlvbiwgc2V0U3RvcEdlbmVyYXRpb25GdW5jdGlvbl0gPSB1c2VTdGF0ZTwoKCkgPT4gdm9pZCkgfCBudWxsPihudWxsKVxuICBjb25zdCBbaXNTdHJlYW1pbmcsIHNldElzU3RyZWFtaW5nXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbaXNXcml0aW5nLCBzZXRJc1dyaXRpbmddID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtyZWZldGNoQ2hhdHMsIHNldFJlZmV0Y2hDaGF0c10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2N1cnJlbnRPcHRpb24sIHNldEN1cnJlbnRPcHRpb25dID0gdXNlU3RhdGUob3B0aW9ucy5ob21lKVxuICBjb25zdCBbaGFzRXJyb3IsIHNldEhhc0Vycm9yXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBoYW5kbGVycyA9IHVzZU1lbW8oKCkgPT4gYnVpbGRIYW5kbGVycyhzZXRDdXJyZW50T3B0aW9uLCBzZXRIYXNFcnJvciksIFtdKVxuICBjb25zdCBbc2lkZWJhckhhc0Vycm9yLCBzZXRTaWRlYmFySGFzRXJyb3JdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IHJlc2V0U2VsZWN0ZWRDaGF0UmVmID0gdXNlUmVmPCgoKSA9PiB2b2lkKSB8IG51bGw+KG51bGwpXG4gIGNvbnN0IFtsYXlvdXRNb2RlLCBzZXRMYXlvdXRNb2RlXSA9IHVzZVN0YXRlPE1haWFDaGF0TW9kYWxMYXlvdXRNb2RlPignc2lkZWJhcicpXG4gIGNvbnN0IFtzaWRlYmFyT3Blbiwgc2V0U2lkZWJhck9wZW5dID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtob21lTGVhdmluZywgc2V0SG9tZUxlYXZpbmddID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IHNraXBDaGF0RW50ZXJSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIGNvbnN0IGV4cGFuZGVkID0gbGF5b3V0TW9kZSA9PT0gJ2Z1bGxzY3JlZW4nXG5cbiAgY29uc3QgeyBzZWxlY3RBZ2VudCwgYWdlbnQsIHRvZ2dsZVdlYlNlYXJjaCwgaXNXZWJTZWFyY2hBY3RpdmUsIHNldENoaXBzUHJvamVjdCwgc2V0Q2xpZW50LCBzZXRQcm9qZWN0IH0gPVxuICAgIHVzZUdsb2JhbENvbnRleHQoKVxuXG4gIGNvbnN0IHtcbiAgICBhZ2VudHMsXG4gICAgbG9hZGluZyxcbiAgICBsb2FkaW5nTW9yZSxcbiAgICBlcnJvcjogYWdlbnRFcnJvcixcbiAgICBoYW5kbGVHZXRBZ2VudHMsXG4gICAgbG9hZE1vcmVBZ2VudHMsXG4gICAgc29ydEFnZW50c0xpc3QsXG4gICAgYWRkQWdlbnQsXG4gICAgcmVtb3ZlQWdlbnQsXG4gICAgdXBkYXRlQWdlbnQsXG4gICAgdXBkYXRlQWdlbnRGYXZvcml0ZSxcbiAgICBzZWxlY3RGaXJzdEFnZW50LFxuICB9ID0gdXNlR2V0QWdlbnRzKHsgc2VsZWN0QWdlbnQsIHNlY3Rpb24sIGFnZW50LCBoYW5kbGVHb0hvbWU6IGhhbmRsZXJzLmhvbWUgfSlcblxuICBjb25zdCB1c2VySGFzUGVybWlzc2lvbnMgPVxuICAgICh1c2VyPy5wZXJtaXNzaW9ucz8uYWlfYWdlbnRzPy5jcmVhdGUgfHxcbiAgICAgIHVzZXI/LnBlcm1pc3Npb25zPy5haV9hZ2VudHM/LmVkaXQgfHxcbiAgICAgIHVzZXI/LnBlcm1pc3Npb25zPy5haV9hZ2VudHM/LmRlbGV0ZSkgJiZcbiAgICB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UU1xuXG4gIGNvbnN0IG9yY2hlc3RyYXRvciA9IHVzZU1lbW8oKCkgPT4gYWdlbnRzLmRhdGEuZmluZChpdGVtID0+IGl0ZW0udHlwZSA9PT0gJ29yY2hlc3RyYXRvcicpID8/IG51bGwsIFthZ2VudHMuZGF0YV0pXG5cbiAgY29uc3QgY29tcHV0ZWRDdXJyZW50T3B0aW9uID0gY3VycmVudE9wdGlvbiA9PT0gb3B0aW9ucy5jaGF0ID8gb3B0aW9ucy5jaGF0IDogb3B0aW9ucy5ob21lXG5cbiAgY29uc3QgZGlkSW5pdEFnZW50UmVmID0gdXNlUmVmKGZhbHNlKVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChkaWRJbml0QWdlbnRSZWYuY3VycmVudCB8fCAhb3JjaGVzdHJhdG9yKSByZXR1cm5cbiAgICBkaWRJbml0QWdlbnRSZWYuY3VycmVudCA9IHRydWVcbiAgICBzZWxlY3RBZ2VudChvcmNoZXN0cmF0b3IpXG4gIH0sIFtvcmNoZXN0cmF0b3IsIHNlbGVjdEFnZW50XSlcblxuICBjb25zdCBhZ2VudHNGZXRjaGVkUmVmID0gdXNlUmVmKGZhbHNlKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFhZ2VudHNGZXRjaGVkUmVmLmN1cnJlbnQpIHtcbiAgICAgIGFnZW50c0ZldGNoZWRSZWYuY3VycmVudCA9IHRydWVcbiAgICAgIGhhbmRsZUdldEFnZW50cygpXG4gICAgfVxuICB9LCBbaGFuZGxlR2V0QWdlbnRzXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG9uTWVyZ2VDcmVhdGVkQWdlbnQgPSAoZXZ0OiBFdmVudCkgPT4ge1xuICAgICAgY29uc3QgeyBhZ2VudDogbmV4dEFnZW50IH0gPSAoZXZ0IGFzIEN1c3RvbUV2ZW50PHsgYWdlbnQ6IEFnZW50IH0+KS5kZXRhaWwgfHwge31cbiAgICAgIGlmIChuZXh0QWdlbnQ/LmlkKSBhZGRBZ2VudChuZXh0QWdlbnQsIHsgbmF2aWdhdGVIb21lOiBmYWxzZSB9KVxuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtYWlhLW1lcmdlLWNyZWF0ZWQtYWdlbnQtaW50by1saXN0Jywgb25NZXJnZUNyZWF0ZWRBZ2VudClcbiAgICByZXR1cm4gKCkgPT4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWFpYS1tZXJnZS1jcmVhdGVkLWFnZW50LWludG8tbGlzdCcsIG9uTWVyZ2VDcmVhdGVkQWdlbnQpXG4gIH0sIFthZGRBZ2VudF0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBvblN5bmNFZGl0ZWRBZ2VudCA9IChldnQ6IEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB7IGFnZW50OiBuZXh0QWdlbnQgfSA9IChldnQgYXMgQ3VzdG9tRXZlbnQ8eyBhZ2VudDogQWdlbnQgfT4pLmRldGFpbCB8fCB7fVxuICAgICAgaWYgKCFuZXh0QWdlbnQ/LmlkKSByZXR1cm5cbiAgICAgIHVwZGF0ZUFnZW50KG5leHRBZ2VudClcbiAgICAgIGlmIChhZ2VudD8uaWQgPT09IG5leHRBZ2VudC5pZCkgc2VsZWN0QWdlbnQobmV4dEFnZW50KVxuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtYWlhLXN5bmMtZWRpdGVkLWFnZW50LWZyb20tY2hhdCcsIG9uU3luY0VkaXRlZEFnZW50KVxuICAgIHJldHVybiAoKSA9PiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtYWlhLXN5bmMtZWRpdGVkLWFnZW50LWZyb20tY2hhdCcsIG9uU3luY0VkaXRlZEFnZW50KVxuICB9LCBbdXBkYXRlQWdlbnQsIHNlbGVjdEFnZW50LCBhZ2VudD8uaWRdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgb3BlbkNoYXRWaWV3ID0gKCkgPT4ge1xuICAgICAgc2V0SGFzRXJyb3IoZmFsc2UpXG4gICAgICBzZXRJbml0aWFsQ2hhdElkKG51bGwpXG4gICAgICBzZXROZXdDaGF0S2V5KHByZXYgPT4gcHJldiArIDEpXG4gICAgICBzZXRVc2VySW5pdGlhbE1lc3NhZ2UoeyBtZXNzYWdlOiAnJywgYXR0YWNobWVudHM6IFtdIH0pXG4gICAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMuY2hhdClcbiAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdjaGF0LXNlc3Npb24tY2hhbmdlZCcpKVxuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtYWlhLW9wZW4tY2hhdC12aWV3Jywgb3BlbkNoYXRWaWV3KVxuICAgIHJldHVybiAoKSA9PiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtYWlhLW9wZW4tY2hhdC12aWV3Jywgb3BlbkNoYXRWaWV3KVxuICB9LCBbXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG9wZW5OZXdDaGF0V2l0aEFnZW50ID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgY29uc3QgbmV4dEFnZW50ID0gKGV2ZW50IGFzIEN1c3RvbUV2ZW50PHsgYWdlbnQ6IEFnZW50IH0+KS5kZXRhaWw/LmFnZW50XG4gICAgICBpZiAoIW5leHRBZ2VudCkgcmV0dXJuXG4gICAgICBzZXRQcm9qZWN0KG51bGwpXG4gICAgICBzZXRDbGllbnQ/LihudWxsKVxuICAgICAgc2VsZWN0QWdlbnQobmV4dEFnZW50KVxuICAgICAgc2V0SGFzRXJyb3IoZmFsc2UpXG4gICAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMuaG9tZSlcbiAgICB9XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbWFpYS1vcGVuLW5ldy1jaGF0LXdpdGgtYWdlbnQnLCBvcGVuTmV3Q2hhdFdpdGhBZ2VudClcbiAgICByZXR1cm4gKCkgPT4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWFpYS1vcGVuLW5ldy1jaGF0LXdpdGgtYWdlbnQnLCBvcGVuTmV3Q2hhdFdpdGhBZ2VudClcbiAgfSwgW3NlbGVjdEFnZW50LCBzZXRDbGllbnQsIHNldFByb2plY3RdKVxuXG4gIGNvbnN0IHN0YXJ0Q2hhdCA9IHVzZUNhbGxiYWNrKFxuICAgIChcbiAgICAgIG1lc3NhZ2U/OiBzdHJpbmcsXG4gICAgICBhdHRhY2htZW50cz86IEF0dGFjaG1lbnRGaWxlW10sXG4gICAgICBmYXFJZD86IHN0cmluZyxcbiAgICAgIGFnZW50U3VnZ2VzdGlvbklkPzogc3RyaW5nLFxuICAgICAgX21lbnRpb25zPzogdW5rbm93bixcbiAgICAgIGZ1YUlkPzogc3RyaW5nXG4gICAgKSA9PiB7XG4gICAgICBpZiAoc2lkZWJhckhhc0Vycm9yKSBzZXRTaWRlYmFySGFzRXJyb3IoZmFsc2UpXG4gICAgICBzZXRJbml0aWFsQ2hhdElkKG51bGwpXG4gICAgICBzZXROZXdDaGF0S2V5KHByZXYgPT4gcHJldiArIDEpXG4gICAgICBzZXRVc2VySW5pdGlhbE1lc3NhZ2Uoe1xuICAgICAgICBtZXNzYWdlOiBtZXNzYWdlIHx8ICcnLFxuICAgICAgICBhdHRhY2htZW50czogYXR0YWNobWVudHMgfHwgW10sXG4gICAgICAgIC4uLihmYXFJZCA/IHsgZmFxSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKGFnZW50U3VnZ2VzdGlvbklkID8geyBhZ2VudFN1Z2dlc3Rpb25JZCB9IDoge30pLFxuICAgICAgICAuLi4oZnVhSWQgPyB7IGZ1YUlkIH0gOiB7fSksXG4gICAgICB9KVxuICAgICAgaGFuZGxlcnMuY2hhdCgpXG4gICAgfSxcbiAgICBbaGFuZGxlcnMsIHNpZGViYXJIYXNFcnJvcl1cbiAgKVxuXG4gIC8vIFNpZGViYXIgdHlwZXMgdGhpcyBwcm9wIGFzIChjaGF0SWQ6IHN0cmluZykgYnV0IHBhc3NlcyB0aGUgZnVsbCBjaGF0IG9iamVjdCBhdCBydW50aW1lXG4gIGNvbnN0IGdvVG9DaGF0ID0gdXNlQ2FsbGJhY2soXG4gICAgKGNoYXRBcmc6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgY2hhdCA9IGNoYXRBcmcgYXMgdW5rbm93biBhcyBDaGF0TGlzdEl0ZW1cbiAgICAgIHNldFVzZXJJbml0aWFsTWVzc2FnZSh7IG1lc3NhZ2U6ICcnLCBhdHRhY2htZW50czogW10gfSlcbiAgICAgIHNldEluaXRpYWxDaGF0SWQoY2hhdC5zZXNzaW9uRXh0ZXJuYWxJZClcbiAgICAgIGNvbnN0IHNlbGVjdGVkQWdlbnQgPSBhZ2VudHMuZGF0YS5maW5kKGFnZW50SXRlbSA9PiBhZ2VudEl0ZW0uaWQgPT09IGNoYXQuYWdlbnRJZClcbiAgICAgIGlmIChzZWxlY3RlZEFnZW50KSBzZWxlY3RBZ2VudChzZWxlY3RlZEFnZW50KVxuICAgICAgc2tpcENoYXRFbnRlclJlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdjaGF0LXNlc3Npb24tY2hhbmdlZCcpKVxuICAgICAgaGFuZGxlcnMuY2hhdCgpXG4gICAgfSxcbiAgICBbaGFuZGxlcnMsIGFnZW50cywgc2VsZWN0QWdlbnRdXG4gIClcblxuICBjb25zdCBoYW5kbGVTZW5kTWVzc2FnZVJlYWR5ID0gdXNlQ2FsbGJhY2soXG4gICAgKFxuICAgICAgc2VuZE1lc3NhZ2U6IChcbiAgICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgICBhdHRhY2htZW50cz86IEF0dGFjaG1lbnRGaWxlW10sXG4gICAgICAgIGZhcUlkPzogc3RyaW5nLFxuICAgICAgICBhZ2VudFN1Z2dlc3Rpb25JZD86IHN0cmluZ1xuICAgICAgKSA9PiB2b2lkLFxuICAgICAgc3RvcEdlbmVyYXRpb246ICgpID0+IHZvaWQsXG4gICAgICBzdHJlYW1pbmc6IGJvb2xlYW4sXG4gICAgICB3cml0aW5nOiBib29sZWFuXG4gICAgKSA9PiB7XG4gICAgICBzZXRTZW5kTWVzc2FnZUZ1bmN0aW9uKCgpID0+IHNlbmRNZXNzYWdlKVxuICAgICAgc2V0U3RvcEdlbmVyYXRpb25GdW5jdGlvbigoKSA9PiBzdG9wR2VuZXJhdGlvbilcbiAgICAgIHNldElzU3RyZWFtaW5nKHN0cmVhbWluZylcbiAgICAgIHNldElzV3JpdGluZyh3cml0aW5nKVxuICAgIH0sXG4gICAgW11cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZVNlbmRNZXNzYWdlID0gdXNlQ2FsbGJhY2soXG4gICAgKFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgYXR0YWNobWVudHM/OiBBdHRhY2htZW50RmlsZVtdLFxuICAgICAgZmFxSWQ/OiBzdHJpbmcsXG4gICAgICBhZ2VudFN1Z2dlc3Rpb25JZD86IHN0cmluZyxcbiAgICAgIG1lbnRpb25zPzogdW5rbm93bixcbiAgICAgIGZ1YUlkPzogc3RyaW5nXG4gICAgKSA9PiB7XG4gICAgICBpZiAoc2lkZWJhckhhc0Vycm9yKSBzZXRTaWRlYmFySGFzRXJyb3IoZmFsc2UpXG4gICAgICBpZiAoc2VuZE1lc3NhZ2VGdW5jdGlvbiAmJiBjb21wdXRlZEN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMuY2hhdCkge1xuICAgICAgICBzZW5kTWVzc2FnZUZ1bmN0aW9uKG1lc3NhZ2UsIGF0dGFjaG1lbnRzLCBmYXFJZCwgYWdlbnRTdWdnZXN0aW9uSWQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGFydENoYXQobWVzc2FnZSwgYXR0YWNobWVudHMsIGZhcUlkLCBhZ2VudFN1Z2dlc3Rpb25JZCwgbWVudGlvbnMsIGZ1YUlkKVxuICAgICAgfVxuICAgIH0sXG4gICAgW3NlbmRNZXNzYWdlRnVuY3Rpb24sIHN0YXJ0Q2hhdCwgY29tcHV0ZWRDdXJyZW50T3B0aW9uLCBzaWRlYmFySGFzRXJyb3JdXG4gIClcblxuICBjb25zdCBoYW5kbGVHb0hvbWUgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0SG9tZUxlYXZpbmcoZmFsc2UpXG4gICAgc2tpcENoYXRFbnRlclJlZi5jdXJyZW50ID0gZmFsc2VcbiAgICBpZiAoY3VycmVudE9wdGlvbiA9PT0gb3B0aW9ucy5jaGF0KSB7XG4gICAgICBzZXRJbml0aWFsQ2hhdElkKG51bGwpXG4gICAgICBzZXROZXdDaGF0S2V5KHByZXYgPT4gcHJldiArIDEpXG4gICAgICBpZiAoYWdlbnQ/LmVudGl0eSAhPT0gJ2NsaWVudCcpIHNldENsaWVudD8uKG51bGwpXG4gICAgfVxuICAgIGlmIChvcmNoZXN0cmF0b3IpIHtcbiAgICAgIHNlbGVjdEFnZW50KG9yY2hlc3RyYXRvcilcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgKCFhZ2VudCB8fCBhZ2VudD8uaXNfZGVsZXRlZCB8fCBhZ2VudD8uaGFzX25vdF9wZXJtaXNzaW9ucyB8fCBhZ2VudD8uaGFzX25vdF9hY2Nlc3MgfHwgYWdlbnQ/LnByb2plY3RfZGVsZXRlZCkgJiZcbiAgICAgIGFnZW50cy5kYXRhLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIHNlbGVjdEFnZW50KGFnZW50cy5kYXRhWzBdKVxuICAgIH1cbiAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMuaG9tZSlcbiAgICBzZXRDaGlwc1Byb2plY3QobnVsbClcbiAgICBzZXRIYXNFcnJvcihmYWxzZSlcbiAgICBpZiAoaXNXZWJTZWFyY2hBY3RpdmUpIHRvZ2dsZVdlYlNlYXJjaCgpXG4gICAgaWYgKHJlc2V0U2VsZWN0ZWRDaGF0UmVmLmN1cnJlbnQpIHJlc2V0U2VsZWN0ZWRDaGF0UmVmLmN1cnJlbnQoKVxuICB9LCBbXG4gICAgY3VycmVudE9wdGlvbixcbiAgICBpc1dlYlNlYXJjaEFjdGl2ZSxcbiAgICB0b2dnbGVXZWJTZWFyY2gsXG4gICAgYWdlbnQsXG4gICAgYWdlbnRzLFxuICAgIG9yY2hlc3RyYXRvcixcbiAgICBzZWxlY3RBZ2VudCxcbiAgICBzZXRDbGllbnQsXG4gICAgc2V0Q2hpcHNQcm9qZWN0LFxuICBdKVxuXG4gIGNvbnN0IGhhbmRsZVJlc2V0Q2hhdCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRIb21lTGVhdmluZyhmYWxzZSlcbiAgICBza2lwQ2hhdEVudGVyUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgIHNldEluaXRpYWxDaGF0SWQobnVsbClcbiAgICBzZXROZXdDaGF0S2V5KHByZXYgPT4gcHJldiArIDEpXG4gICAgc2V0VXNlckluaXRpYWxNZXNzYWdlKHsgbWVzc2FnZTogJycsIGF0dGFjaG1lbnRzOiBbXSB9KVxuICAgIHNldEN1cnJlbnRPcHRpb24ob3B0aW9ucy5ob21lKVxuICAgIHNldENoaXBzUHJvamVjdChudWxsKVxuICAgIHNldEhhc0Vycm9yKGZhbHNlKVxuICAgIGlmIChpc1dlYlNlYXJjaEFjdGl2ZSkgdG9nZ2xlV2ViU2VhcmNoKClcbiAgICBpZiAocmVzZXRTZWxlY3RlZENoYXRSZWYuY3VycmVudCkgcmVzZXRTZWxlY3RlZENoYXRSZWYuY3VycmVudCgpXG4gICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2NoYXQtc2Vzc2lvbi1jaGFuZ2VkJykpXG4gIH0sIFtpc1dlYlNlYXJjaEFjdGl2ZSwgdG9nZ2xlV2ViU2VhcmNoLCBzZXRDaGlwc1Byb2plY3RdKVxuXG4gIGNvbnN0IGZvY3VzQ2hhdElucHV0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdtYWlhLWlucHV0LXJlZm9jdXMnKSlcbiAgICB9LCAxMDApXG4gIH0sIFtdKVxuXG4gIGNvbnN0IGhhbmRsZVN0YXJ0TmV3Q2hhdCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAoY3VycmVudE9wdGlvbiA9PT0gb3B0aW9ucy5ob21lKSB7XG4gICAgICBmb2N1c0NoYXRJbnB1dCgpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKG9yY2hlc3RyYXRvcikgc2VsZWN0QWdlbnQob3JjaGVzdHJhdG9yKVxuICAgIGhhbmRsZUdvSG9tZSgpXG4gICAgZm9jdXNDaGF0SW5wdXQoKVxuICB9LCBbY3VycmVudE9wdGlvbiwgZm9jdXNDaGF0SW5wdXQsIGhhbmRsZUdvSG9tZSwgb3JjaGVzdHJhdG9yLCBzZWxlY3RBZ2VudF0pXG5cbiAgY29uc3Qgbm9vcCA9IHVzZUNhbGxiYWNrKCgpID0+IHVuZGVmaW5lZCwgW10pXG5cbiAgLy8gU3VwcHJlc3MgdW51c2VkIHZhcmlhYmxlIHdhcm5pbmcg4oCUIGtlcHQgZm9yIHBvdGVudGlhbCBBbXBsaXR1ZGUgdHJhY2tpbmcgcGFyaXR5XG4gIHZvaWQgYW1wbGl0dWRFdmVudFxuXG4gIGNvbnN0IGNhbkFjY2Vzc1BhZ2UgPSB2YWxpZGF0ZUFjY2Vzc0J5RmVhdHVyZShzZWN0aW9uKVxuICBjb25zdCBpc0hvbWUgPSBjb21wdXRlZEN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMuaG9tZVxuICBjb25zdCBzaG93Q2hhdEZvb3RlciA9IGNvbXB1dGVkQ3VycmVudE9wdGlvbiA9PT0gb3B0aW9ucy5jaGF0ICYmICFoYXNFcnJvciAmJiAhbG9hZGluZyAmJiBjYW5BY2Nlc3NQYWdlXG5cbiAgcmV0dXJuIChcbiAgICA8U0NQYWdlV3JhcHBlciBjbGFzc05hbWU9e2NsYXNzTmFtZX0+XG4gICAgICB7Y2FuQWNjZXNzUGFnZSA/IChcbiAgICAgICAgPFNpZGViYXJcbiAgICAgICAgICBjb252ZXJzYXRpb25zT25seVxuICAgICAgICAgIG9wZW49e3NpZGViYXJPcGVufVxuICAgICAgICAgIG9uT3BlbkNoYW5nZT17c2V0U2lkZWJhck9wZW59XG4gICAgICAgICAgb25Hb1RvQ2hhdD17Z29Ub0NoYXR9XG4gICAgICAgICAgb25FcnJvcj17KCkgPT4gc2V0U2lkZWJhckhhc0Vycm9yKHRydWUpfVxuICAgICAgICAgIGhhbmRsZUdvVG9Ib21lPXtoYW5kbGVHb0hvbWV9XG4gICAgICAgICAgaGFuZGxlU3RhcnROZXdDaGF0PXtoYW5kbGVTdGFydE5ld0NoYXR9XG4gICAgICAgICAgaGFuZGxlT3Blbk1hcmtldHBsYWNlPXtub29wfVxuICAgICAgICAgIGhhbmRsZU9wZW5Ta2lsbHM9e25vb3B9XG4gICAgICAgICAgc2hvd05ld0NoYXQ9e2ZhbHNlfVxuICAgICAgICAgIHJlZmV0Y2hDaGF0cz17cmVmZXRjaENoYXRzfVxuICAgICAgICAgIGhhbmRsZVNldFJlZmV0Y2hDaGF0cz17c2V0UmVmZXRjaENoYXRzfVxuICAgICAgICAgIGhhc0Vycm9yPXtzaWRlYmFySGFzRXJyb3J9XG4gICAgICAgICAgcmVzZXRTZWxlY3RlZENoYXRSZWY9e3Jlc2V0U2VsZWN0ZWRDaGF0UmVmfVxuICAgICAgICAvPlxuICAgICAgKSA6IG51bGx9XG4gICAgICA8U0NQYWdlTWFpbj5cbiAgICAgICAgPENoYXRBSVBhZ2VIZWFkZXJcbiAgICAgICAgICBvdmVybGF5PXtpc0hvbWUgJiYgIWhvbWVMZWF2aW5nfVxuICAgICAgICAgIHNob3dCYWNrPXshaXNIb21lfVxuICAgICAgICAgIGFnZW50cz17YWdlbnRzLmRhdGF9XG4gICAgICAgICAgbG9hZGluZz17bG9hZGluZ31cbiAgICAgICAgICBsb2FkaW5nTW9yZT17bG9hZGluZ01vcmV9XG4gICAgICAgICAgaGFzTW9yZT17YWdlbnRzLmhhc19tb3JlfVxuICAgICAgICAgIGxvYWRNb3JlQWdlbnRzPXtsb2FkTW9yZUFnZW50c31cbiAgICAgICAgICBzb3J0QWdlbnRzTGlzdD17c29ydEFnZW50c0xpc3R9XG4gICAgICAgICAgaGFuZGxlUmVzZXRDaGF0PXtoYW5kbGVSZXNldENoYXR9XG4gICAgICAgICAgb25BZ2VudFVwZGF0ZT17dXBkYXRlQWdlbnRGYXZvcml0ZX1cbiAgICAgICAgLz5cbiAgICAgICAge2hhc0Vycm9yID8gKFxuICAgICAgICAgIDxNQUlBRXJyb3IgLz5cbiAgICAgICAgKSA6IGNhbkFjY2Vzc1BhZ2UgPyAoXG4gICAgICAgICAgaXNIb21lID8gKFxuICAgICAgICAgICAgPENoYXRBSVBhZ2VIb21lXG4gICAgICAgICAgICAgIGtleT17YWdlbnQ/LmlkfVxuICAgICAgICAgICAgICBvblNlbmRNZXNzYWdlPXsobWVzc2FnZSwgYXR0YWNobWVudHMsIGZhcUlkLCBhZ2VudFN1Z2dlc3Rpb25JZCwgbWVudGlvbnMsIGZ1YUlkKSA9PiB7XG4gICAgICAgICAgICAgICAgc2V0SG9tZUxlYXZpbmcoZmFsc2UpXG4gICAgICAgICAgICAgICAgaGFuZGxlU2VuZE1lc3NhZ2UobWVzc2FnZSwgYXR0YWNobWVudHMsIGZhcUlkLCBhZ2VudFN1Z2dlc3Rpb25JZCwgbWVudGlvbnMsIGZ1YUlkKVxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICBvbkxlYXZlU3RhcnQ9eygpID0+IHtcbiAgICAgICAgICAgICAgICBza2lwQ2hhdEVudGVyUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICAgICAgICAgICAgc2V0SG9tZUxlYXZpbmcodHJ1ZSlcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxDaGF0QUlDb250ZW50XG4gICAgICAgICAgICAgIGN1cnJlbnRPcHRpb249e29wdGlvbnMuY2hhdH1cbiAgICAgICAgICAgICAgaGFuZGxlcnM9e3sgLi4uaGFuZGxlcnMsIGNoYXQ6IHN0YXJ0Q2hhdCwgaG9tZTogaGFuZGxlcnMuaG9tZSwgaGFuZGxlR29Ib21lIH19XG4gICAgICAgICAgICAgIG9uRXJyb3I9eygpID0+IHNldEhhc0Vycm9yKHRydWUpfVxuICAgICAgICAgICAgICByZWZzPXt7IHVzZXJJbml0aWFsTWVzc2FnZSwgaW5pdGlhbENoYXRJZCB9fVxuICAgICAgICAgICAgICBvblNlbmRNZXNzYWdlUmVhZHk9e2hhbmRsZVNlbmRNZXNzYWdlUmVhZHl9XG4gICAgICAgICAgICAgIGV4cGFuZGVkPXtleHBhbmRlZH1cbiAgICAgICAgICAgICAgZmxvYXRpbmc9e2ZhbHNlfVxuICAgICAgICAgICAgICBhZ2VudHM9e2FnZW50cy5kYXRhfVxuICAgICAgICAgICAgICBsb2FkaW5nQWdlbnRzPXtsb2FkaW5nfVxuICAgICAgICAgICAgICBhZ2VudEVycm9yPXthZ2VudEVycm9yfVxuICAgICAgICAgICAgICBza2lwRW50ZXJBbmltYXRpb249e3NraXBDaGF0RW50ZXJSZWYuY3VycmVudH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKVxuICAgICAgICApIDogKFxuICAgICAgICAgIDxQcm9qZWN0U3VtbWFyeUNvbnRlbnQgb25SZXN0YXJ0U3VtbWFyeT17aGFuZGxlcnMuaG9tZX0gLz5cbiAgICAgICAgKX1cbiAgICAgICAge3Nob3dDaGF0Rm9vdGVyID8gKFxuICAgICAgICAgIDxDaGF0QWlNb2RhbEZvb3RlclxuICAgICAgICAgICAgYWdlbnQ9e2FnZW50fVxuICAgICAgICAgICAgaGFuZGxlU2VuZE1lc3NhZ2U9e2hhbmRsZVNlbmRNZXNzYWdlfVxuICAgICAgICAgICAgaGFuZGxlU3RvcEdlbmVyYXRpb249e3N0b3BHZW5lcmF0aW9uRnVuY3Rpb259XG4gICAgICAgICAgICBpc1N0cmVhbWluZz17aXNTdHJlYW1pbmd9XG4gICAgICAgICAgICBpc1dyaXRpbmc9e2lzV3JpdGluZ31cbiAgICAgICAgICAgIGNoYXRJZD17aW5pdGlhbENoYXRJZH1cbiAgICAgICAgICAgIG5ld0NoYXRLZXk9e25ld0NoYXRLZXl9XG4gICAgICAgICAgICBsYXlvdXRNb2RlPXtsYXlvdXRNb2RlfVxuICAgICAgICAgIC8+XG4gICAgICAgICkgOiBudWxsfVxuICAgICAgPC9TQ1BhZ2VNYWluPlxuICAgICAge3VzZXJIYXNQZXJtaXNzaW9ucyAmJiAoXG4gICAgICAgIDxBYm1BZ2VudE1vZGFsXG4gICAgICAgICAgYWRkQWdlbnQ9e2FkZEFnZW50fVxuICAgICAgICAgIHVwZGF0ZUFnZW50PXt1cGRhdGVBZ2VudH1cbiAgICAgICAgICByZW1vdmVBZ2VudD17cmVtb3ZlQWdlbnR9XG4gICAgICAgICAgdXBkYXRlQWdlbnRGYXZvcml0ZT17dXBkYXRlQWdlbnRGYXZvcml0ZX1cbiAgICAgICAgICBzZWxlY3RGaXJzdEFnZW50PXtzZWxlY3RGaXJzdEFnZW50fVxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICAgIDxTbmFja2JhciAvPlxuICAgIDwvU0NQYWdlV3JhcHBlcj5cbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBLFNBQVNBLFdBQVcsRUFBRUMsU0FBUyxFQUFFQyxPQUFPLEVBQUVDLE1BQU0sRUFBRUMsUUFBUSxRQUFRLE9BQU87QUFDekUsT0FBT0MsTUFBTSxNQUFNLFFBQVE7QUFDM0IsU0FBU0MsY0FBYyxRQUFRLGVBQWU7QUFDOUMsU0FBU0MsT0FBTyxRQUFRLDJCQUEyQjtBQUNuRCxTQUFTQyxTQUFT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