@projectcor/maia-components 2.42.1-3 → 2.43.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. package/README.md +2 -0
  2. package/lib/App.js +19 -44
  3. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +1 -3
  4. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +7 -19
  5. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.js +2 -7
  6. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.styles.js +14 -10
  7. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.js +1 -1
  8. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.js +37 -57
  9. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.js +12 -18
  10. package/lib/components/index.js +1 -2
  11. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +93 -6
  12. package/lib/components/molecules/ChatAIContent/ChatAIContent.js +3 -7
  13. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +6 -21
  14. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +3 -9
  15. package/lib/components/molecules/ChatAIMessages/newStyles.js +26 -29
  16. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.js +1 -8
  17. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +8 -25
  18. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +153 -15
  19. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.styles.js +26 -2
  20. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +61 -65
  21. package/lib/components/molecules/ChatFooter/ChatFooter.js +3 -5
  22. package/lib/components/molecules/Sidebar/Sidebar.js +23 -41
  23. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +38 -6
  24. package/lib/constants/maiaExternalConnectorsAccess.js +10 -0
  25. package/lib/constants/permissions/index.js +2 -2
  26. package/lib/constants/permissions/utils.js +1 -4
  27. package/lib/dev/DevReasoningTimeline.js +17 -11
  28. package/lib/dev/Providers.js +3 -5
  29. package/lib/hooks/useAgentModel/useCreateAgent.js +70 -15
  30. package/lib/hooks/useAgentModel/useUpdateAgent.js +67 -12
  31. package/lib/hooks/useChatManager/useChatManager.js +7 -7
  32. package/lib/hooks/useEvent.js +2 -1
  33. package/lib/hooks/useFrequentlyUsedActions.js +20 -63
  34. package/lib/index.js +2 -5
  35. package/lib/lang/br/index.js +9 -26
  36. package/lib/lang/en/index.js +9 -26
  37. package/lib/lang/es/index.js +9 -26
  38. package/lib/lang/fr/index.js +9 -26
  39. package/lib/services/maia/Actions/getFrequentlyUsedActions.js +1 -1
  40. package/lib/services/maia/Agents/connectors.js +258 -0
  41. package/lib/store/sessions/sessionStreamManager.js +52 -40
  42. package/lib/styles/cascade.js +3 -29
  43. package/lib/styles/transitions.js +1 -3
  44. package/lib/types/agentModal.js +1 -1
  45. package/lib/types/global.d.js +1 -1
  46. package/lib/utils/hoursPlannerQuickActionType.js +1 -74
  47. package/lib/utils/normalizeAgentConnectors.js +28 -3
  48. package/lib/utils/streamActivityMessages.js +19 -32
  49. package/package.json +14 -18
  50. package/lib/components/atoms/ApprovalBox/ApprovalBox.spec.js +0 -135
  51. package/lib/components/atoms/Checkbox/Checkbox.spec.js +0 -27
  52. package/lib/components/atoms/Chip/Chip.spec.js +0 -82
  53. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.spec.js +0 -29
  54. package/lib/components/atoms/Fade/Fade.spec.js +0 -31
  55. package/lib/components/atoms/MAIAButton/MAIAButton.spec.js +0 -42
  56. package/lib/components/atoms/MAIAInput/MAIAInput.spec.js +0 -303
  57. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.spec.js +0 -69
  58. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.spec.js +0 -59
  59. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.spec.js +0 -58
  60. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.spec.js +0 -68
  61. package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.js +0 -52
  62. package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.spec.js +0 -90
  63. package/lib/components/atoms/SkillsDropdown/SkillsDropdown.spec.js +0 -107
  64. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.spec.js +0 -85
  65. package/lib/components/atoms/Switch/Switch.spec.js +0 -41
  66. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.spec.js +0 -77
  67. package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.js +0 -83
  68. package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.styles.js +0 -30
  69. package/lib/components/molecules/AgentInputBlock/index.js +0 -5
  70. package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.js +0 -52
  71. package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.spec.js +0 -76
  72. package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.js +0 -20
  73. package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.spec.js +0 -34
  74. package/lib/components/molecules/AgentInputBlock/useAgentChangeModelAction.js +0 -36
  75. package/lib/components/molecules/ChatAIHome/ChatAIHome.spec.js +0 -246
  76. package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.spec.js +0 -104
  77. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.spec.js +0 -291
  78. package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.spec.js +0 -46
  79. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.spec.js +0 -148
  80. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.spec.js +0 -37
  81. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.spec.js +0 -128
  82. package/lib/components/molecules/ChatFooter/ChatFooter.spec.js +0 -112
  83. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.spec.js +0 -84
  84. package/lib/components/molecules/MessageFeedback/MessageFeedback.spec.js +0 -116
  85. package/lib/components/molecules/Sidebar/Sidebar.spec.js +0 -234
  86. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.spec.js +0 -335
  87. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.spec.js +0 -405
  88. package/lib/components/organisms/ChatAI/ChatAI.spec.js +0 -174
  89. package/lib/components/organisms/ChatAIPage/ChatAIPage.js +0 -525
  90. package/lib/components/organisms/ChatAIPage/ChatAIPage.spec.js +0 -231
  91. package/lib/components/organisms/ChatAIPage/ChatAIPage.styles.js +0 -16
  92. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.js +0 -253
  93. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.spec.js +0 -139
  94. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.styles.js +0 -13
  95. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.js +0 -267
  96. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.spec.js +0 -261
  97. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.styles.js +0 -194
  98. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.js +0 -105
  99. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.spec.js +0 -73
  100. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCards.skeleton.js +0 -38
  101. package/lib/components/organisms/ChatAIPage/getDaypart.js +0 -9
  102. package/lib/components/organisms/ChatAIPage/getDaypart.spec.js +0 -19
  103. package/lib/components/organisms/ChatAIPage/index.js +0 -3
  104. package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.spec.js +0 -59
  105. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.spec.js +0 -79
  106. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.spec.js +0 -86
  107. package/lib/constants/permissions/utils.spec.js +0 -34
  108. package/lib/dev/DevMaiaPage.js +0 -30
  109. package/lib/hooks/frequentlyUsedActionsCache.js +0 -17
  110. package/lib/hooks/frequentlyUsedActionsCache.spec.js +0 -25
  111. package/lib/hooks/useAgentModel/useCreateAgent.spec.js +0 -95
  112. package/lib/hooks/useAgentModel/useUpdateAgent.spec.js +0 -96
  113. package/lib/hooks/useCaretPosition.spec.js +0 -58
  114. package/lib/hooks/useChatMessages/useChatMessages.spec.js +0 -279
  115. package/lib/hooks/useContinueLegacyContextInNewChat/index.js +0 -2
  116. package/lib/hooks/useContinueLegacyContextInNewChat/useContinueLegacyContextInNewChat.js +0 -93
  117. package/lib/hooks/useDebounce.spec.js +0 -42
  118. package/lib/hooks/useEvent.spec.js +0 -40
  119. package/lib/hooks/useIsMaiaPageRoute.js +0 -26
  120. package/lib/hooks/useIsMaiaPageRoute.spec.js +0 -26
  121. package/lib/hooks/useMaiaChatSessionMeta/index.js +0 -2
  122. package/lib/hooks/useMaiaChatSessionMeta/useMaiaChatSessionMeta.js +0 -24
  123. package/lib/hooks/useMentionAllowedTypes.spec.js +0 -89
  124. package/lib/hooks/useMinimizedPillNoveltyDot/useMinimizedPillNoveltyDot.spec.js +0 -67
  125. package/lib/hooks/useModal/useModal.spec.js +0 -73
  126. package/lib/hooks/useResize.spec.js +0 -37
  127. package/lib/hooks/useSkillsCatalog.spec.js +0 -88
  128. package/lib/hooks/useSnackBarManager/useSnackBarManager.spec.js +0 -33
  129. package/lib/hooks/useT.spec.js +0 -20
  130. package/lib/hooks/useToggle.spec.js +0 -33
  131. package/lib/services/maia/Access/updateAccess.spec.js +0 -108
  132. package/lib/services/maia/Actions/getFrequentlyUsedActions.spec.js +0 -56
  133. package/lib/services/maia/Actions/getSlashCommands.spec.js +0 -74
  134. package/lib/services/maia/Agents/createAgent.spec.js +0 -55
  135. package/lib/services/maia/Agents/deleteAgent.spec.js +0 -42
  136. package/lib/services/maia/Agents/fetchAgentDetail.spec.js +0 -108
  137. package/lib/services/maia/Agents/getAgentById.spec.js +0 -55
  138. package/lib/services/maia/Agents/getAgentSuggestions.spec.js +0 -82
  139. package/lib/services/maia/Agents/setAgentToolGroups.spec.js +0 -45
  140. package/lib/services/maia/Agents/toggleFavorite.spec.js +0 -47
  141. package/lib/services/maia/Agents/updateAgent.spec.js +0 -48
  142. package/lib/services/maia/Chats/deleteChat.spec.js +0 -31
  143. package/lib/services/maia/Chats/getChatMessages.spec.js +0 -150
  144. package/lib/services/maia/Chats/getChatsByUserId.spec.js +0 -149
  145. package/lib/services/maia/Chats/markSessionAsRead.spec.js +0 -30
  146. package/lib/services/maia/Chats/patchChat.spec.js +0 -41
  147. package/lib/services/maia/Chats/wasHelpfulChat.spec.js +0 -28
  148. package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.spec.js +0 -58
  149. package/lib/services/maia/Knowledge/delete.spec.js +0 -45
  150. package/lib/services/maia/Knowledge/download.spec.js +0 -78
  151. package/lib/services/maia/Knowledge/save.spec.js +0 -58
  152. package/lib/services/maia/Orchestrator/orchestrator.spec.js +0 -72
  153. package/lib/services/maia/RecentClients/getRecentClients.spec.js +0 -52
  154. package/lib/services/maia/RecentContexts/getRecentContexts.spec.js +0 -83
  155. package/lib/services/maia/RecentProjects/getRecentProjects.spec.js +0 -82
  156. package/lib/services/maia/RecentTasks/getRecentTasks.spec.js +0 -63
  157. package/lib/services/maia/RecentUsers/getRecentUsers.spec.js +0 -82
  158. package/lib/services/maia/Skills/createSkill.spec.js +0 -68
  159. package/lib/services/maia/Skills/deleteSkill.spec.js +0 -42
  160. package/lib/services/maia/Skills/generateSkill.spec.js +0 -48
  161. package/lib/services/maia/Skills/getSkills.spec.js +0 -152
  162. package/lib/services/maia/Skills/updateSkill.spec.js +0 -62
  163. package/lib/services/maia/client.spec.js +0 -56
  164. package/lib/services/utils/fetchCOR.spec.js +0 -211
  165. package/lib/services/utils/getCookie.spec.js +0 -20
  166. package/lib/store/chatsSidebarOptimistic.spec.js +0 -120
  167. package/lib/store/maiaLastChatPersistence.spec.js +0 -22
  168. package/lib/store/maiaPanelSessionPersistence.spec.js +0 -62
  169. package/lib/store/sessions/sessions.types.spec.js +0 -16
  170. package/lib/store/sessions/useSessionsStore.spec.js +0 -135
  171. package/lib/store/useChatsStore.spec.js +0 -619
  172. package/lib/store/useFaqsStore.spec.js +0 -57
  173. package/lib/utils/agentDisplayName.spec.js +0 -44
  174. package/lib/utils/autoApproveStorage.spec.js +0 -25
  175. package/lib/utils/chatInputFiles.spec.js +0 -39
  176. package/lib/utils/contextMentionLabel.spec.js +0 -13
  177. package/lib/utils/contextMentionTriggers.spec.js +0 -38
  178. package/lib/utils/contextMentionTypeLabel.spec.js +0 -14
  179. package/lib/utils/corConnectorMentionTypes.spec.js +0 -23
  180. package/lib/utils/fileDownloadHelper.spec.js +0 -67
  181. package/lib/utils/formatQuickActionMessage.spec.js +0 -27
  182. package/lib/utils/formatUnreadCount.spec.js +0 -12
  183. package/lib/utils/getUnitFileSize.spec.js +0 -18
  184. package/lib/utils/hitlAnalytics.spec.js +0 -100
  185. package/lib/utils/hoursPlannerQuickActionType.spec.js +0 -64
  186. package/lib/utils/maiaPageRoute.js +0 -24
  187. package/lib/utils/maiaPageRoute.spec.js +0 -23
  188. package/lib/utils/mapBackendLang.spec.js +0 -19
  189. package/lib/utils/navigateContextEntity.spec.js +0 -50
  190. package/lib/utils/normalizeAgentConnectors.spec.js +0 -89
  191. package/lib/utils/orchestratorSubagents.spec.js +0 -32
  192. package/lib/utils/reasoningMappers.spec.js +0 -103
  193. package/lib/utils/retryCompletion.spec.js +0 -99
  194. package/lib/utils/skillContentSize.spec.js +0 -13
  195. package/lib/utils/slashCommandMarker.spec.js +0 -43
  196. package/lib/utils/sortManagerHoursHomeFuas.spec.js +0 -51
  197. package/lib/utils/sseStreamContent.spec.js +0 -31
  198. package/lib/utils/streamActivityMessages.spec.js +0 -131
  199. package/lib/utils/validateTrimmedFields.spec.js +0 -26
@@ -1,525 +0,0 @@
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
- /* eslint-disable no-use-before-define */
8
- import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
9
- import moment from 'moment';
10
- import { useTranslation } from 'react-i18next';
11
- import { useUser } from '../../../context/cor-user';
12
- import { MAIAError } from '../../atoms/MAIAError';
13
- import { ChatAIContent } from '../../molecules/ChatAIContent';
14
- import { buildHandlers, options } from '../../molecules/ChatAIModal/constants';
15
- import { Sidebar } from '../../molecules/Sidebar';
16
- import { useGetAgents } from '../../../services/maia/Agents/getAgents';
17
- import { GlobalContext, useGlobalContext } from '../../../context/global-context';
18
- import { Snackbar } from '../SnackBar/Snackbar';
19
- import { ProjectSummaryContent } from '../../molecules/ProjectSummaryContent';
20
- import { AbmAgentModal } from '../AbmAgentModal/AbmAgentModal';
21
- import { ChatAiModalFooter } from '../../molecules/ChatAIModal/components/ChatAiModalFooter';
22
- import { ChatAIPageHeader } from './ChatAIPageHeader';
23
- import { ChatAIPageHome } from './ChatAIPageHome';
24
- import { SECTIONS } from '../../../constants/config';
25
- import { useStreamdownStyles } from '../../../hooks/useStreamdownStyles';
26
- import { useProjectSummaryConfig } from '../../../hooks/useProjectSummaryConfig';
27
- import { acquireChatsStore, releaseChatsStore } from '../../../store';
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 { useMaiaChatSessionMeta } from '../../../hooks/useMaiaChatSessionMeta';
33
- import { resolveLegacyContextSession } from '../../molecules/AgentInputBlock/resolveLegacyContextSession';
34
- import { useContinueLegacyContextInNewChat } from '../../../hooks/useContinueLegacyContextInNewChat';
35
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
36
- var validateAccessByFeature = function validateAccessByFeature(section) {
37
- if (section === 'header' && (window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS || window.MAIA_CHAT_AI_FEATURE_ACCESS)) {
38
- return true;
39
- }
40
- if ((section === 'project' || section === 'client') && window.MAIA_CHAT_AI_FEATURE_ACCESS) {
41
- return true;
42
- }
43
- return false;
44
- };
45
- export var ChatAIPage = withAppCfg(function (_ref) {
46
- var _ref$entity = _ref.entity,
47
- entity = _ref$entity === void 0 ? {
48
- projectId: null,
49
- clientId: null
50
- } : _ref$entity,
51
- _ref$project = _ref.project,
52
- initialProject = _ref$project === void 0 ? null : _ref$project,
53
- _ref$client = _ref.client,
54
- initialClient = _ref$client === void 0 ? null : _ref$client,
55
- _ref$section = _ref.section,
56
- section = _ref$section === void 0 ? 'header' : _ref$section,
57
- _ref$hasMultiAgents = _ref.hasMultiAgents,
58
- hasMultiAgents = _ref$hasMultiAgents === void 0 ? false : _ref$hasMultiAgents,
59
- className = _ref.className;
60
- useStreamdownStyles();
61
- useEffect(function () {
62
- setMaiaPagePresence(true);
63
- return function () {
64
- setMaiaPagePresence(false);
65
- };
66
- }, []);
67
- var initialProjectValue = section === 'project' ? initialProject : null;
68
- var _useState = useState(initialProjectValue),
69
- _useState2 = _slicedToArray(_useState, 2),
70
- project = _useState2[0],
71
- setProject = _useState2[1];
72
- useEffect(function () {
73
- if (section === 'project' && initialProject != null) {
74
- setProject(initialProject);
75
- }
76
- }, [section, initialProject]);
77
- var _useProjectSummaryCon = useProjectSummaryConfig({
78
- section: section,
79
- entity: entity,
80
- project: project,
81
- setProject: setProject,
82
- client: section === 'client' ? initialClient !== null && initialClient !== void 0 ? initialClient : null : undefined,
83
- hasMultiAgents: hasMultiAgents
84
- }),
85
- context = _useProjectSummaryCon.context,
86
- restoreConfigureSettings = _useProjectSummaryCon.restoreConfigureSettings;
87
- var providerValue = useMemo(function () {
88
- return _objectSpread(_objectSpread({}, context), {}, {
89
- section: section
90
- });
91
- }, [context, section]);
92
- useEffect(function () {
93
- acquireChatsStore();
94
- return function () {
95
- releaseChatsStore();
96
- restoreConfigureSettings();
97
- };
98
- }, [restoreConfigureSettings]);
99
- return /*#__PURE__*/_jsx(GlobalContext.Provider, {
100
- value: providerValue,
101
- children: /*#__PURE__*/_jsx(ChatAIPageContent, {
102
- section: section,
103
- className: className
104
- })
105
- });
106
- }, Features.CHAT_AI);
107
- var ChatAIPageContent = function ChatAIPageContent(_ref2) {
108
- var _user$permissions, _user$permissions2, _user$permissions3;
109
- var section = _ref2.section,
110
- className = _ref2.className;
111
- var user = useUser();
112
- var _useTranslation = useTranslation([SECTIONS.abmAgent]),
113
- i18n = _useTranslation.i18n;
114
- var lang = i18n.language === 'br' ? 'pt-br' : i18n.language;
115
- moment.locale(lang);
116
- var _useState3 = useState({
117
- message: '',
118
- attachments: []
119
- }),
120
- _useState4 = _slicedToArray(_useState3, 2),
121
- userInitialMessage = _useState4[0],
122
- setUserInitialMessage = _useState4[1];
123
- var _useState5 = useState(null),
124
- _useState6 = _slicedToArray(_useState5, 2),
125
- initialChatId = _useState6[0],
126
- setInitialChatId = _useState6[1];
127
- var _useState7 = useState(0),
128
- _useState8 = _slicedToArray(_useState7, 2),
129
- newChatKey = _useState8[0],
130
- setNewChatKey = _useState8[1];
131
- var _useState9 = useState(null),
132
- _useState0 = _slicedToArray(_useState9, 2),
133
- sendMessageFunction = _useState0[0],
134
- setSendMessageFunction = _useState0[1];
135
- var _useState1 = useState(null),
136
- _useState10 = _slicedToArray(_useState1, 2),
137
- stopGenerationFunction = _useState10[0],
138
- setStopGenerationFunction = _useState10[1];
139
- var _useState11 = useState(false),
140
- _useState12 = _slicedToArray(_useState11, 2),
141
- isStreaming = _useState12[0],
142
- setIsStreaming = _useState12[1];
143
- var _useState13 = useState(false),
144
- _useState14 = _slicedToArray(_useState13, 2),
145
- isWriting = _useState14[0],
146
- setIsWriting = _useState14[1];
147
- var _useState15 = useState(false),
148
- _useState16 = _slicedToArray(_useState15, 2),
149
- refetchChats = _useState16[0],
150
- setRefetchChats = _useState16[1];
151
- var _useState17 = useState(options.home),
152
- _useState18 = _slicedToArray(_useState17, 2),
153
- currentOption = _useState18[0],
154
- setCurrentOption = _useState18[1];
155
- var _useState19 = useState(false),
156
- _useState20 = _slicedToArray(_useState19, 2),
157
- hasError = _useState20[0],
158
- setHasError = _useState20[1];
159
- var handlers = useMemo(function () {
160
- return buildHandlers(setCurrentOption, setHasError);
161
- }, []);
162
- var _useState21 = useState(false),
163
- _useState22 = _slicedToArray(_useState21, 2),
164
- sidebarHasError = _useState22[0],
165
- setSidebarHasError = _useState22[1];
166
- var resetSelectedChatRef = useRef(null);
167
- var _useState23 = useState('sidebar'),
168
- _useState24 = _slicedToArray(_useState23, 1),
169
- layoutMode = _useState24[0];
170
- var _useState25 = useState(false),
171
- _useState26 = _slicedToArray(_useState25, 2),
172
- sidebarOpen = _useState26[0],
173
- setSidebarOpen = _useState26[1];
174
- var _useState27 = useState(false),
175
- _useState28 = _slicedToArray(_useState27, 2),
176
- homeLeaving = _useState28[0],
177
- setHomeLeaving = _useState28[1];
178
- var skipChatEnterRef = useRef(false);
179
- var expanded = layoutMode === 'fullscreen';
180
- var _useGlobalContext = useGlobalContext(),
181
- selectAgent = _useGlobalContext.selectAgent,
182
- agent = _useGlobalContext.agent,
183
- toggleWebSearch = _useGlobalContext.toggleWebSearch,
184
- isWebSearchActive = _useGlobalContext.isWebSearchActive,
185
- setChipsProject = _useGlobalContext.setChipsProject,
186
- setClient = _useGlobalContext.setClient,
187
- setProject = _useGlobalContext.setProject,
188
- setTask = _useGlobalContext.setTask;
189
- var _useGetAgents = useGetAgents({
190
- selectAgent: selectAgent,
191
- section: section,
192
- agent: agent,
193
- handleGoHome: handlers.home
194
- }),
195
- agents = _useGetAgents.agents,
196
- loading = _useGetAgents.loading,
197
- loadingMore = _useGetAgents.loadingMore,
198
- agentError = _useGetAgents.error,
199
- handleGetAgents = _useGetAgents.handleGetAgents,
200
- loadMoreAgents = _useGetAgents.loadMoreAgents,
201
- sortAgentsList = _useGetAgents.sortAgentsList,
202
- addAgent = _useGetAgents.addAgent,
203
- removeAgent = _useGetAgents.removeAgent,
204
- updateAgent = _useGetAgents.updateAgent,
205
- updateAgentFavorite = _useGetAgents.updateAgentFavorite,
206
- selectFirstAgent = _useGetAgents.selectFirstAgent;
207
- 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;
208
- var orchestrator = useMemo(function () {
209
- var _agents$data$find;
210
- return (_agents$data$find = agents.data.find(function (item) {
211
- return item.type === 'orchestrator';
212
- })) !== null && _agents$data$find !== void 0 ? _agents$data$find : null;
213
- }, [agents.data]);
214
- var computedCurrentOption = currentOption === options.chat ? options.chat : options.home;
215
- var isChatView = computedCurrentOption === options.chat;
216
- var sessionMeta = useMaiaChatSessionMeta(initialChatId);
217
- var legacyContextSession = useMemo(function () {
218
- return resolveLegacyContextSession(sessionMeta, isChatView);
219
- }, [isChatView, sessionMeta]);
220
- useEffect(function () {
221
- if (legacyContextSession && agent && !agent.is_legacy_context) {
222
- selectAgent(_objectSpread(_objectSpread({}, agent), {}, {
223
- is_legacy_context: true
224
- }));
225
- }
226
- }, [legacyContextSession, agent, selectAgent]);
227
- var handleContinueLegacyContextInNewChat = useContinueLegacyContextInNewChat({
228
- sessionMeta: sessionMeta,
229
- agents: agents.data,
230
- selectAgent: selectAgent,
231
- setClient: setClient,
232
- setProject: setProject,
233
- setTask: setTask,
234
- setChipsProject: setChipsProject,
235
- onResetChatSession: function onResetChatSession() {
236
- setInitialChatId(null);
237
- setNewChatKey(function (prev) {
238
- return prev + 1;
239
- });
240
- setUserInitialMessage({
241
- message: '',
242
- attachments: []
243
- });
244
- setHasError(false);
245
- },
246
- onGoToOrchestratorHome: function onGoToOrchestratorHome() {
247
- setHomeLeaving(false);
248
- skipChatEnterRef.current = false;
249
- setCurrentOption(options.home);
250
- }
251
- });
252
- var didInitAgentRef = useRef(false);
253
- useEffect(function () {
254
- if (didInitAgentRef.current || !orchestrator) return;
255
- didInitAgentRef.current = true;
256
- selectAgent(orchestrator);
257
- }, [orchestrator, selectAgent]);
258
- var agentsFetchedRef = useRef(false);
259
- useEffect(function () {
260
- if (!agentsFetchedRef.current) {
261
- agentsFetchedRef.current = true;
262
- handleGetAgents();
263
- }
264
- }, [handleGetAgents]);
265
- useEffect(function () {
266
- var onMergeCreatedAgent = function onMergeCreatedAgent(evt) {
267
- var _ref3 = evt.detail || {},
268
- nextAgent = _ref3.agent;
269
- if (nextAgent !== null && nextAgent !== void 0 && nextAgent.id) addAgent(nextAgent, {
270
- navigateHome: false
271
- });
272
- };
273
- document.addEventListener('maia-merge-created-agent-into-list', onMergeCreatedAgent);
274
- return function () {
275
- return document.removeEventListener('maia-merge-created-agent-into-list', onMergeCreatedAgent);
276
- };
277
- }, [addAgent]);
278
- useEffect(function () {
279
- var onSyncEditedAgent = function onSyncEditedAgent(evt) {
280
- var _ref4 = evt.detail || {},
281
- nextAgent = _ref4.agent;
282
- if (!(nextAgent !== null && nextAgent !== void 0 && nextAgent.id)) return;
283
- updateAgent(nextAgent);
284
- if ((agent === null || agent === void 0 ? void 0 : agent.id) === nextAgent.id) selectAgent(nextAgent);
285
- };
286
- document.addEventListener('maia-sync-edited-agent-from-chat', onSyncEditedAgent);
287
- return function () {
288
- return document.removeEventListener('maia-sync-edited-agent-from-chat', onSyncEditedAgent);
289
- };
290
- }, [updateAgent, selectAgent, agent === null || agent === void 0 ? void 0 : agent.id]);
291
- useEffect(function () {
292
- var openChatView = function openChatView() {
293
- setHasError(false);
294
- setInitialChatId(null);
295
- setNewChatKey(function (prev) {
296
- return prev + 1;
297
- });
298
- setUserInitialMessage({
299
- message: '',
300
- attachments: []
301
- });
302
- setCurrentOption(options.chat);
303
- document.dispatchEvent(new CustomEvent('chat-session-changed'));
304
- };
305
- document.addEventListener('maia-open-chat-view', openChatView);
306
- return function () {
307
- return document.removeEventListener('maia-open-chat-view', openChatView);
308
- };
309
- }, []);
310
- useEffect(function () {
311
- var openNewChatWithAgent = function openNewChatWithAgent(event) {
312
- var _detail;
313
- var nextAgent = (_detail = event.detail) === null || _detail === void 0 ? void 0 : _detail.agent;
314
- if (!nextAgent) return;
315
- setProject(null);
316
- setClient === null || setClient === void 0 || setClient(null);
317
- selectAgent(nextAgent);
318
- setHasError(false);
319
- setCurrentOption(options.home);
320
- };
321
- document.addEventListener('maia-open-new-chat-with-agent', openNewChatWithAgent);
322
- return function () {
323
- return document.removeEventListener('maia-open-new-chat-with-agent', openNewChatWithAgent);
324
- };
325
- }, [selectAgent, setClient, setProject]);
326
- var startChat = useCallback(function (message, attachments, faqId, agentSuggestionId, _mentions, fuaId) {
327
- if (sidebarHasError) setSidebarHasError(false);
328
- setInitialChatId(null);
329
- setNewChatKey(function (prev) {
330
- return prev + 1;
331
- });
332
- setUserInitialMessage(_objectSpread(_objectSpread(_objectSpread({
333
- message: message || '',
334
- attachments: attachments || []
335
- }, faqId ? {
336
- faqId: faqId
337
- } : {}), agentSuggestionId ? {
338
- agentSuggestionId: agentSuggestionId
339
- } : {}), fuaId ? {
340
- fuaId: fuaId
341
- } : {}));
342
- handlers.chat();
343
- }, [handlers, sidebarHasError]);
344
-
345
- // Sidebar types this prop as (chatId: string) but passes the full chat object at runtime
346
- var goToChat = useCallback(function (chatArg) {
347
- var chat = chatArg;
348
- setUserInitialMessage({
349
- message: '',
350
- attachments: []
351
- });
352
- setInitialChatId(chat.sessionExternalId);
353
- var selectedAgent = agents.data.find(function (agentItem) {
354
- return agentItem.id === chat.agentId;
355
- });
356
- if (selectedAgent) selectAgent(selectedAgent);
357
- skipChatEnterRef.current = false;
358
- document.dispatchEvent(new CustomEvent('chat-session-changed'));
359
- handlers.chat();
360
- }, [handlers, agents, selectAgent]);
361
- var handleSendMessageReady = useCallback(function (sendMessage, stopGeneration, streaming, writing) {
362
- setSendMessageFunction(function () {
363
- return sendMessage;
364
- });
365
- setStopGenerationFunction(function () {
366
- return stopGeneration;
367
- });
368
- setIsStreaming(streaming);
369
- setIsWriting(writing);
370
- }, []);
371
- var handleSendMessage = useCallback(function (message, attachments, faqId, agentSuggestionId, mentions, fuaId) {
372
- if (sidebarHasError) setSidebarHasError(false);
373
- if (sendMessageFunction && computedCurrentOption === options.chat) {
374
- sendMessageFunction(message, attachments, faqId, agentSuggestionId);
375
- } else {
376
- startChat(message, attachments, faqId, agentSuggestionId, mentions, fuaId);
377
- }
378
- }, [sendMessageFunction, startChat, computedCurrentOption, sidebarHasError]);
379
- var handleHomeLeaveStart = useCallback(function () {
380
- skipChatEnterRef.current = true;
381
- setHomeLeaving(true);
382
- }, []);
383
- var handleHomeSendMessage = useCallback(function (message, attachments, faqId, agentSuggestionId, mentions, fuaId) {
384
- setHomeLeaving(false);
385
- handleSendMessage(message, attachments, faqId, agentSuggestionId, mentions, fuaId);
386
- }, [handleSendMessage]);
387
- var handleGoHome = useCallback(function () {
388
- setHomeLeaving(false);
389
- skipChatEnterRef.current = false;
390
- if (currentOption === options.chat) {
391
- setInitialChatId(null);
392
- setNewChatKey(function (prev) {
393
- return prev + 1;
394
- });
395
- if ((agent === null || agent === void 0 ? void 0 : agent.entity) !== 'client') setClient === null || setClient === void 0 || setClient(null);
396
- }
397
- if (orchestrator) {
398
- selectAgent(orchestrator);
399
- } 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) {
400
- selectAgent(agents.data[0]);
401
- }
402
- setCurrentOption(options.home);
403
- setChipsProject(null);
404
- setHasError(false);
405
- if (isWebSearchActive) toggleWebSearch();
406
- if (resetSelectedChatRef.current) resetSelectedChatRef.current();
407
- }, [currentOption, isWebSearchActive, toggleWebSearch, agent, agents, orchestrator, selectAgent, setClient, setChipsProject]);
408
- var handleResetChat = useCallback(function () {
409
- setHomeLeaving(false);
410
- skipChatEnterRef.current = false;
411
- setInitialChatId(null);
412
- setNewChatKey(function (prev) {
413
- return prev + 1;
414
- });
415
- setUserInitialMessage({
416
- message: '',
417
- attachments: []
418
- });
419
- setCurrentOption(options.home);
420
- setChipsProject(null);
421
- setHasError(false);
422
- if (isWebSearchActive) toggleWebSearch();
423
- if (resetSelectedChatRef.current) resetSelectedChatRef.current();
424
- document.dispatchEvent(new CustomEvent('chat-session-changed'));
425
- }, [isWebSearchActive, toggleWebSearch, setChipsProject]);
426
- var focusChatInput = useCallback(function () {
427
- window.setTimeout(function () {
428
- document.dispatchEvent(new CustomEvent('maia-input-refocus'));
429
- }, 100);
430
- }, []);
431
- var handleStartNewChat = useCallback(function () {
432
- if (currentOption === options.home) {
433
- focusChatInput();
434
- return;
435
- }
436
- if (orchestrator) selectAgent(orchestrator);
437
- handleGoHome();
438
- focusChatInput();
439
- }, [currentOption, focusChatInput, handleGoHome, orchestrator, selectAgent]);
440
- var noop = useCallback(function () {
441
- return undefined;
442
- }, []);
443
- var canAccessPage = validateAccessByFeature(section);
444
- var isHome = computedCurrentOption === options.home;
445
- var showChatFooter = computedCurrentOption === options.chat && !hasError && !loading && canAccessPage;
446
- return /*#__PURE__*/_jsxs(SCPageWrapper, {
447
- className: className,
448
- children: [canAccessPage ? /*#__PURE__*/_jsx(Sidebar, {
449
- conversationsOnly: true,
450
- open: sidebarOpen,
451
- onOpenChange: setSidebarOpen,
452
- onGoToChat: goToChat,
453
- onError: function onError() {
454
- return setSidebarHasError(true);
455
- },
456
- handleGoToHome: handleGoHome,
457
- handleStartNewChat: handleStartNewChat,
458
- handleOpenMarketplace: noop,
459
- handleOpenSkills: noop,
460
- showNewChat: false,
461
- refetchChats: refetchChats,
462
- handleSetRefetchChats: setRefetchChats,
463
- hasError: sidebarHasError,
464
- resetSelectedChatRef: resetSelectedChatRef,
465
- isLegacyContextSession: !!legacyContextSession
466
- }) : null, /*#__PURE__*/_jsxs(SCPageMain, {
467
- children: [/*#__PURE__*/_jsx(ChatAIPageHeader, {
468
- overlay: isHome && !homeLeaving,
469
- showBack: !isHome,
470
- agents: agents.data,
471
- loading: loading,
472
- loadingMore: loadingMore,
473
- hasMore: agents.has_more,
474
- loadMoreAgents: loadMoreAgents,
475
- sortAgentsList: sortAgentsList,
476
- handleResetChat: handleResetChat,
477
- onAgentUpdate: updateAgentFavorite
478
- }), hasError ? /*#__PURE__*/_jsx(MAIAError, {}) : canAccessPage ? isHome ? /*#__PURE__*/_jsx(ChatAIPageHome, {
479
- onSendMessage: handleHomeSendMessage,
480
- onLeaveStart: handleHomeLeaveStart
481
- }) : /*#__PURE__*/_jsx(ChatAIContent, {
482
- currentOption: options.chat,
483
- handlers: _objectSpread(_objectSpread({}, handlers), {}, {
484
- chat: startChat,
485
- home: handlers.home,
486
- handleGoHome: handleGoHome
487
- }),
488
- onError: function onError() {
489
- return setHasError(true);
490
- },
491
- refs: {
492
- userInitialMessage: userInitialMessage,
493
- initialChatId: initialChatId
494
- },
495
- onSendMessageReady: handleSendMessageReady,
496
- expanded: expanded,
497
- floating: false,
498
- agents: agents.data,
499
- loadingAgents: loading,
500
- agentError: agentError,
501
- skipEnterAnimation: skipChatEnterRef.current
502
- }) : /*#__PURE__*/_jsx(ProjectSummaryContent, {
503
- onRestartSummary: handlers.home
504
- }), showChatFooter ? /*#__PURE__*/_jsx(ChatAiModalFooter, {
505
- agent: agent,
506
- handleSendMessage: handleSendMessage,
507
- handleStopGeneration: stopGenerationFunction,
508
- isStreaming: isStreaming,
509
- isWriting: isWriting,
510
- chatId: initialChatId,
511
- newChatKey: newChatKey,
512
- layoutMode: layoutMode,
513
- legacyContextSession: legacyContextSession,
514
- onContinueInNewChat: handleContinueLegacyContextInNewChat
515
- }) : null]
516
- }), userHasPermissions && /*#__PURE__*/_jsx(AbmAgentModal, {
517
- addAgent: addAgent,
518
- updateAgent: updateAgent,
519
- removeAgent: removeAgent,
520
- updateAgentFavorite: updateAgentFavorite,
521
- selectFirstAgent: selectFirstAgent
522
- }), /*#__PURE__*/_jsx(Snackbar, {})]
523
- });
524
- };
525
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZUVmZmVjdCIsInVzZU1lbW8iLCJ1c2VSZWYiLCJ1c2VTdGF0ZSIsIm1vbWVudCIsInVzZVRyYW5zbGF0aW9uIiwidXNlVXNlciIsIk1BSUFFcnJvciIsIkNoYXRBSUNvbnRlbnQiLCJidWlsZEhhbmRsZXJzIiwib3B0aW9ucyIsIlNpZGViYXIiLCJ1c2VHZXRBZ2VudHMiLCJHbG9iYWxDb250ZXh0IiwidXNlR2xvYmFsQ29udGV4dCIsIlNuYWNrYmFyIiwiUHJvamVjdFN1bW1hcnlDb250ZW50IiwiQWJtQWdlbnRNb2RhbCIsIkNoYXRBaU1vZGFsRm9vdGVyIiwiQ2hhdEFJUGFnZUhlYWRlciIsIkNoYXRBSVBhZ2VIb21lIiwiU0VDVElPTlMiLCJ1c2VTdHJlYW1kb3duU3R5bGVzIiwidXNlUHJvamVjdFN1bW1hcnlDb25maWciLCJhY3F1aXJlQ2hhdHNTdG9yZSIsInJlbGVhc2VDaGF0c1N0b3JlIiwid2l0aEFwcENmZyIsIkZlYXR1cmVzIiwic2V0TWFpYVBhZ2VQcmVzZW5jZSIsIlNDUGFnZU1haW4iLCJTQ1BhZ2VXcmFwcGVyIiwidXNlTWFpYUNoYXRTZXNzaW9uTWV0YSIsInJlc29sdmVMZWdhY3lDb250ZXh0U2Vzc2lvbiIsInVzZUNvbnRpbnVlTGVnYWN5Q29udGV4dEluTmV3Q2hhdCIsImpzeCIsIl9qc3giLCJqc3hzIiwiX2pzeHMiLCJ2YWxpZGF0ZUFjY2Vzc0J5RmVhdHVyZSIsInNlY3Rpb24iLCJ3aW5kb3ciLCJNQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTIiwiTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTIiwiQ2hhdEFJUGFnZSIsIl9yZWYiLCJfcmVmJGVudGl0eSIsImVudGl0eSIsInByb2plY3RJZCIsImNsaWVudElkIiwiX3JlZiRwcm9qZWN0IiwicHJvamVjdCIsImluaXRpYWxQcm9qZWN0IiwiX3JlZiRjbGllbnQiLCJjbGllbnQiLCJpbml0aWFsQ2xpZW50IiwiX3JlZiRzZWN0aW9uIiwiX3JlZiRoYXNNdWx0aUFnZW50cyIsImhhc011bHRpQWdlbnRzIiwiY2xhc3NOYW1lIiwiaW5pdGlhbFByb2plY3RWYWx1ZSIsIl91c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheSIsInNldFByb2plY3QiLCJfdXNlUHJvamVjdFN1bW1hcnlDb24iLCJ1bmRlZmluZWQiLCJjb250ZXh0IiwicmVzdG9yZUNvbmZpZ3VyZVNldHRpbmdzIiwicHJvdmlkZXJWYWx1ZSIsIl9vYmplY3RTcHJlYWQiLCJQcm92aWRlciIsInZhbHVlIiwiY2hpbGRyZW4iLCJDaGF0QUlQYWdlQ29udGVudCIsIkNIQVRfQUkiLCJfcmVmMiIsIl91c2VyJHBlcm1pc3Npb25zIiwiX3VzZXIkcGVybWlzc2lvbnMyIiwiX3VzZXIkcGVybWlzc2lvbnMzIiwidXNlciIsIl91c2VUcmFuc2xhdGlvbiIsImFibUFnZW50IiwiaTE4biIsImxhbmciLCJsYW5ndWFnZSIsImxvY2FsZSIsIl91c2VTdGF0ZTMiLCJtZXNzYWdlIiwiYXR0YWNobWVudHMiLCJfdXNlU3RhdGU0IiwidXNlckluaXRpYWxNZXNzYWdlIiwic2V0VXNlckluaXRpYWxNZXNzYWdlIiwiX3VzZVN0YXRlNSIsIl91c2VTdGF0ZTYiLCJpbml0aWFsQ2hhdElkIiwic2V0SW5pdGlhbENoYXRJZCIsIl91c2VTdGF0ZTciLCJfdXNlU3RhdGU4IiwibmV3Q2hhdEtleSIsInNldE5ld0NoYXRLZXkiLCJfdXNlU3RhdGU5IiwiX3VzZVN0YXRlMCIsInNlbmRNZXNzYWdlRnVuY3Rpb24iLCJzZXRTZW5kTWVzc2FnZUZ1bmN0aW9uIiwiX3VzZVN0YXRlMSIsIl91c2VTdGF0ZTEwIiwic3RvcEdlbmVyYXRpb25GdW5jdGlvbiIsInNldFN0b3BHZW5lcmF0aW9uRnVuY3Rpb24iLCJfdXNlU3RhdGUxMSIsIl91c2VTdGF0ZTEyIiwiaXNTdHJlYW1pbmciLCJzZXRJc1N0cmVhbWluZyIsIl91c2VTdGF0ZTEzIiwiX3VzZVN0YXRlMTQiLCJpc1dyaXRpbmciLCJzZXRJc1dyaXRpbmciLCJfdXNlU3RhdGUxNSIsIl91c2VTdGF0ZTE2IiwicmVmZXRjaENoYXRzIiwic2V0UmVmZXRjaENoYXRzIiwiX3VzZVN0YXRlMTciLCJob21lIiwiX3VzZVN0YXRlMTgiLCJjdXJyZW50T3B0aW9uIiwic2V0Q3VycmVudE9wdGlvbiIsIl91c2VTdGF0ZTE5IiwiX3VzZVN0YXRlMjAiLCJoYXNFcnJvciIsInNldEhhc0Vycm9yIiwiaGFuZGxlcnMiLCJfdXNlU3RhdGUyMSIsIl91c2VTdGF0ZTIyIiwic2lkZWJhckhhc0Vycm9yIiwic2V0U2lkZWJhckhhc0Vycm9yIiwicmVzZXRTZWxlY3RlZENoYXRSZWYiLCJfdXNlU3RhdGUyMyIsIl91c2VTdGF0ZTI0IiwibGF5b3V0TW9kZSIsIl91c2VTdGF0ZTI1IiwiX3VzZVN0YXRlMjYiLCJzaWRlYmFyT3BlbiIsInNldFNpZGViYXJPcGVuIiwiX3VzZVN0YXRlMjciLCJfdXNlU3RhdGUyOCIsImhvbWVMZWF2aW5nIiwic2V0SG9tZUxlYXZpbmciLCJza2lwQ2hhdEVudGVyUmVmIiwiZXhwYW5kZWQiLCJfdXNlR2xvYmFsQ29udGV4dCIsInNlbGVjdEFnZW50IiwiYWdlbnQiLCJ0b2dnbGVXZWJTZWFyY2giLCJpc1dlYlNlYXJjaEFjdGl2ZSIsInNldENoaXBzUHJvamVjdCIsInNldENsaWVudCIsInNldFRhc2siLCJfdXNlR2V0QWdlbnRzIiwiaGFuZGxlR29Ib21lIiwiYWdlbnRzIiwibG9hZGluZyIsImxvYWRpbmdNb3JlIiwiYWdlbnRFcnJvciIsImVycm9yIiwiaGFuZGxlR2V0QWdlbnRzIiwibG9hZE1vcmVBZ2VudHMiLCJzb3J0QWdlbnRzTGlzdCIsImFkZEFnZW50IiwicmVtb3ZlQWdlbnQiLCJ1cGRhdGVBZ2VudCIsInVwZGF0ZUFnZW50RmF2b3JpdGUiLCJzZWxlY3RGaXJzdEFnZW50IiwidXNlckhhc1Blcm1pc3Npb25zIiwicGVybWlzc2lvbnMiLCJhaV9hZ2VudHMiLCJjcmVhdGUiLCJlZGl0Iiwib3JjaGVzdHJhdG9yIiwiX2FnZW50cyRkYXRhJGZpbmQiLCJkYXRhIiwiZmluZCIsIml0ZW0iLCJ0eXBlIiwiY29tcHV0ZWRDdXJyZW50T3B0aW9uIiwiY2hhdCIsImlzQ2hhdFZpZXciLCJzZXNzaW9uTWV0YSIsImxlZ2FjeUNvbnRleHRTZXNzaW9uIiwiaXNfbGVnYWN5X2NvbnRleHQiLCJoYW5kbGVDb250aW51ZUxlZ2FjeUNvbnRleHRJbk5ld0NoYXQiLCJvblJlc2V0Q2hhdFNlc3Npb24iLCJwcmV2Iiwib25Hb1RvT3JjaGVzdHJhdG9ySG9tZSIsImN1cnJlbnQiLCJkaWRJbml0QWdlbnRSZWYiLCJhZ2VudHNGZXRjaGVkUmVmIiwib25NZXJnZUNyZWF0ZWRBZ2VudCIsImV2dCIsIl9yZWYzIiwiZGV0YWlsIiwibmV4dEFnZW50IiwiaWQiLCJuYXZpZ2F0ZUhvbWUiLCJkb2N1bWVudCIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwib25TeW5jRWRpdGVkQWdlbnQiLCJfcmVmNCIsIm9wZW5DaGF0VmlldyIsImRpc3BhdGNoRXZlbnQiLCJDdXN0b21FdmVudCIsIm9wZW5OZXdDaGF0V2l0aEFnZW50IiwiZXZlbnQiLCJfZGV0YWlsIiwic3RhcnRDaGF0IiwiZmFxSWQiLCJhZ2VudFN1Z2dlc3Rpb25JZCIsIl9tZW50aW9ucyIsImZ1YUlkIiwiZ29Ub0NoYXQiLCJjaGF0QXJnIiwic2Vzc2lvbkV4dGVybmFsSWQiLCJzZWxlY3RlZEFnZW50IiwiYWdlbnRJdGVtIiwiYWdlbnRJZCIsImhhbmRsZVNlbmRNZXNzYWdlUmVhZHkiLCJzZW5kTWVzc2FnZSIsInN0b3BHZW5lcmF0aW9uIiwic3RyZWFtaW5nIiwid3JpdGluZyIsImhhbmRsZVNlbmRNZXNzYWdlIiwibWVudGlvbnMiLCJoYW5kbGVIb21lTGVhdmVTdGFydCIsImhhbmRsZUhvbWVTZW5kTWVzc2FnZSIsImlzX2RlbGV0ZWQiLCJoYXNfbm90X3Blcm1pc3Npb25zIiwiaGFzX25vdF9hY2Nlc3MiLCJwcm9qZWN0X2RlbGV0ZWQiLCJsZW5ndGgiLCJoYW5kbGVSZXNldENoYXQiLCJmb2N1c0NoYXRJbnB1dCIsInNldFRpbWVvdXQiLCJoYW5kbGVTdGFydE5ld0NoYXQiLCJub29wIiwiY2FuQWNjZXNzUGFnZSIsImlzSG9tZSIsInNob3dDaGF0Rm9vdGVyIiwiY29udmVyc2F0aW9uc09ubHkiLCJvcGVuIiwib25PcGVuQ2hhbmdlIiwib25Hb1RvQ2hhdCIsIm9uRXJyb3IiLCJoYW5kbGVHb1RvSG9tZSIsImhhbmRsZU9wZW5NYXJrZXRwbGFjZSIsImhhbmRsZU9wZW5Ta2lsbHMiLCJzaG93TmV3Q2hhdCIsImhhbmRsZVNldFJlZmV0Y2hDaGF0cyIsImlzTGVnYWN5Q29udGV4dFNlc3Npb24iLCJvdmVybGF5Iiwic2hvd0JhY2siLCJoYXNNb3JlIiwiaGFzX21vcmUiLCJvbkFnZW50VXBkYXRlIiwib25TZW5kTWVzc2FnZSIsIm9uTGVhdmVTdGFydCIsInJlZnMiLCJvblNlbmRNZXNzYWdlUmVhZHkiLCJmbG9hdGluZyIsImxvYWRpbmdBZ2VudHMiLCJza2lwRW50ZXJBbmltYXRpb24iLCJvblJlc3RhcnRTdW1tYXJ5IiwiaGFuZGxlU3RvcEdlbmVyYXRpb24iLCJjaGF0SWQiLCJvbkNvbnRpbnVlSW5OZXdDaGF0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvb3JnYW5pc21zL0NoYXRBSVBhZ2UvQ2hhdEFJUGFnZS50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tbmVzdGVkLXRlcm5hcnkgKi9cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0L2Z1bmN0aW9uLWNvbXBvbmVudC1kZWZpbml0aW9uICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11c2UtYmVmb3JlLWRlZmluZSAqL1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnXG5pbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gJ3JlYWN0LWkxOG5leHQnXG5pbXBvcnQgeyB1c2VVc2VyIH0gZnJvbSAnLi4vLi4vLi4vY29udGV4dC9jb3ItdXNlcidcbmltcG9ydCB7IE1BSUFFcnJvciB9IGZyb20gJy4uLy4uL2F0b21zL01BSUFFcnJvcidcbmltcG9ydCB7IENoYXRBSUNvbnRlbnQgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvQ2hhdEFJQ29udGVudCdcbmltcG9ydCB7IGJ1aWxkSGFuZGxlcnMsIG9wdGlvbnMgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvQ2hhdEFJTW9kYWwvY29uc3RhbnRzJ1xuaW1wb3J0IHsgU2lkZWJhciB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9TaWRlYmFyJ1xuaW1wb3J0IHsgdXNlR2V0QWdlbnRzIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbWFpYS9BZ2VudHMvZ2V0QWdlbnRzJ1xuaW1wb3J0IHsgR2xvYmFsQ29udGV4dCwgdXNlR2xvYmFsQ29udGV4dCB9IGZyb20gJy4uLy4uLy4uL2NvbnRleHQvZ2xvYmFsLWNvbnRleHQnXG5pbXBvcnQgeyBBdHRhY2htZW50RmlsZSB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9DaGF0Rm9vdGVyL0NoYXRGb290ZXInXG5pbXBvcnQgeyBTbmFja2JhciB9IGZyb20gJy4uL1NuYWNrQmFyL1NuYWNrYmFyJ1xuaW1wb3J0IHsgUHJvamVjdFN1bW1hcnlDb250ZW50IH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL1Byb2plY3RTdW1tYXJ5Q29udGVudCdcbmltcG9ydCB7IEFibUFnZW50TW9kYWwgfSBmcm9tICcuLi9BYm1BZ2VudE1vZGFsL0FibUFnZW50TW9kYWwnXG5pbXBvcnQgeyBDaGF0QWlNb2RhbEZvb3RlciB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9DaGF0QUlNb2RhbC9jb21wb25lbnRzL0NoYXRBaU1vZGFsRm9vdGVyJ1xuaW1wb3J0IHsgQ2hhdEFJUGFnZUhlYWRlciB9IGZyb20gJy4vQ2hhdEFJUGFnZUhlYWRlcidcbmltcG9ydCB7IENoYXRBSVBhZ2VIb21lIH0gZnJvbSAnLi9DaGF0QUlQYWdlSG9tZSdcbmltcG9ydCB7IFNFQ1RJT05TIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzL2NvbmZpZydcbmltcG9ydCB7IEFnZW50IH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvYWdlbnQnXG5pbXBvcnQgeyB1c2VTdHJlYW1kb3duU3R5bGVzIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlU3RyZWFtZG93blN0eWxlcydcbmltcG9ydCB7IHVzZVByb2plY3RTdW1tYXJ5Q29uZmlnIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlUHJvamVjdFN1bW1hcnlDb25maWcnXG5pbXBvcnQgeyBhY3F1aXJlQ2hhdHNTdG9yZSwgcmVsZWFzZUNoYXRzU3RvcmUgfSBmcm9tICcuLi8uLi8uLi9zdG9yZSdcbmltcG9ydCB7IFByb2plY3QgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9Qcm9qZWN0J1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvQ2xpZW50J1xuaW1wb3J0IHsgTWFpYUNoYXRNb2RhbExheW91dE1vZGUgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvQ2hhdEFJTW9kYWwvbGF5b3V0J1xuaW1wb3J0IHsgd2l0aEFwcENmZyB9IGZyb20gJy4uLy4uL2F0b21zL1dpdGhBcHBDZmcnXG5pbXBvcnQgeyBGZWF0dXJlcyB9IGZyb20gJy4uLy4uL2F0b21zL1dpdGhGZWF0dXJlVmFsaWRhdGlvbidcbmltcG9ydCB7IHNldE1haWFQYWdlUHJlc2VuY2UgfSBmcm9tICcuLi8uLi8uLi91dGlscy9tYWlhUGFnZVJvdXRlJ1xuaW1wb3J0IHsgU0NQYWdlTWFpbiwgU0NQYWdlV3JhcHBlciB9IGZyb20gJy4vQ2hhdEFJUGFnZS5zdHlsZXMnXG5pbXBvcnQgeyB1c2VNYWlhQ2hhdFNlc3Npb25NZXRhIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlTWFpYUNoYXRTZXNzaW9uTWV0YSdcbmltcG9ydCB7IHJlc29sdmVMZWdhY3lDb250ZXh0U2Vzc2lvbiB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9BZ2VudElucHV0QmxvY2svcmVzb2x2ZUxlZ2FjeUNvbnRleHRTZXNzaW9uJ1xuaW1wb3J0IHsgdXNlQ29udGludWVMZWdhY3lDb250ZXh0SW5OZXdDaGF0IH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlQ29udGludWVMZWdhY3lDb250ZXh0SW5OZXdDaGF0J1xuXG5leHBvcnQgdHlwZSBDaGF0QUlQYWdlUHJvcHMgPSB7XG4gIGVudGl0eT86IHsgcHJvamVjdElkOiBzdHJpbmcgfCBudWxsOyBjbGllbnRJZDogc3RyaW5nIHwgbnVsbCB9XG4gIHByb2plY3Q/OiBQcm9qZWN0IHwgbnVsbFxuICBjbGllbnQ/OiBDbGllbnQgfCBudWxsXG4gIHNlY3Rpb24/OiAncHJvamVjdCcgfCAnaGVhZGVyJyB8ICdjbGllbnQnXG4gIGhhc011bHRpQWdlbnRzPzogYm9vbGVhblxuICBjbGFzc05hbWU/OiBzdHJpbmdcbn1cblxudHlwZSBTZWN0aW9uVHlwZSA9ICdwcm9qZWN0JyB8ICdoZWFkZXInIHwgJ2NsaWVudCdcblxudHlwZSBDaGF0TGlzdEl0ZW0gPSB7IHNlc3Npb25FeHRlcm5hbElkOiBzdHJpbmc7IGFnZW50SWQ6IHN0cmluZyB9XG5cbmNvbnN0IHZhbGlkYXRlQWNjZXNzQnlGZWF0dXJlID0gKHNlY3Rpb246IHN0cmluZykgPT4ge1xuICBpZiAoc2VjdGlvbiA9PT0gJ2hlYWRlcicgJiYgKHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTIHx8IHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MpKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICBpZiAoKHNlY3Rpb24gPT09ICdwcm9qZWN0JyB8fCBzZWN0aW9uID09PSAnY2xpZW50JykgJiYgd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTUykge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBjb25zdCBDaGF0QUlQYWdlID0gd2l0aEFwcENmZyhcbiAgKHtcbiAgICBlbnRpdHkgPSB7IHByb2plY3RJZDogbnVsbCwgY2xpZW50SWQ6IG51bGwgfSxcbiAgICBwcm9qZWN0OiBpbml0aWFsUHJvamVjdCA9IG51bGwsXG4gICAgY2xpZW50OiBpbml0aWFsQ2xpZW50ID0gbnVsbCxcbiAgICBzZWN0aW9uID0gJ2hlYWRlcicsXG4gICAgaGFzTXVsdGlBZ2VudHMgPSBmYWxzZSxcbiAgICBjbGFzc05hbWUsXG4gIH06IENoYXRBSVBhZ2VQcm9wcykgPT4ge1xuICAgIHVzZVN0cmVhbWRvd25TdHlsZXMoKVxuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIHNldE1haWFQYWdlUHJlc2VuY2UodHJ1ZSlcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHNldE1haWFQYWdlUHJlc2VuY2UoZmFsc2UpXG4gICAgICB9XG4gICAgfSwgW10pXG5cbiAgICBjb25zdCBpbml0aWFsUHJvamVjdFZhbHVlID0gc2VjdGlvbiA9PT0gJ3Byb2plY3QnID8gaW5pdGlhbFByb2plY3QgOiBudWxsXG4gICAgY29uc3QgW3Byb2plY3QsIHNldFByb2plY3RdID0gdXNlU3RhdGU8UHJvamVjdCB8IG51bGw+KGluaXRpYWxQcm9qZWN0VmFsdWUpXG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHNlY3Rpb24gPT09ICdwcm9qZWN0JyAmJiBpbml0aWFsUHJvamVjdCAhPSBudWxsKSB7XG4gICAgICAgIHNldFByb2plY3QoaW5pdGlhbFByb2plY3QpXG4gICAgICB9XG4gICAgfSwgW3NlY3Rpb24sIGluaXRpYWxQcm9qZWN0XSlcblxuICAgIGNvbnN0IHsgY29udGV4dCwgcmVzdG9yZUNvbmZpZ3VyZVNldHRpbmdzIH0gPSB1c2VQcm9qZWN0U3VtbWFyeUNvbmZpZyh7XG4gICAgICBzZWN0aW9uLFxuICAgICAgZW50aXR5LFxuICAgICAgcHJvamVjdCxcbiAgICAgIHNldFByb2plY3QsXG4gICAgICBjbGllbnQ6IHNlY3Rpb24gPT09ICdjbGllbnQnID8gKGluaXRpYWxDbGllbnQgPz8gbnVsbCkgOiB1bmRlZmluZWQsXG4gICAgICBoYXNNdWx0aUFnZW50cyxcbiAgICB9KVxuXG4gICAgY29uc3QgcHJvdmlkZXJWYWx1ZSA9IHVzZU1lbW8oXG4gICAgICAoKSA9PiAoeyAuLi5jb250ZXh0LCBzZWN0aW9uOiBzZWN0aW9uIGFzICdwcm9qZWN0JyB8ICdoZWFkZXInIHwgJ2NsaWVudCcgfSksXG4gICAgICBbY29udGV4dCwgc2VjdGlvbl1cbiAgICApXG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgYWNxdWlyZUNoYXRzU3RvcmUoKVxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgcmVsZWFzZUNoYXRzU3RvcmUoKVxuICAgICAgICByZXN0b3JlQ29uZmlndXJlU2V0dGluZ3MoKVxuICAgICAgfVxuICAgIH0sIFtyZXN0b3JlQ29uZmlndXJlU2V0dGluZ3NdKVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxHbG9iYWxDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtwcm92aWRlclZhbHVlfT5cbiAgICAgICAgPENoYXRBSVBhZ2VDb250ZW50IHNlY3Rpb249e3NlY3Rpb24gYXMgU2VjdGlvblR5cGV9IGNsYXNzTmFtZT17Y2xhc3NOYW1lfSAvPlxuICAgICAgPC9HbG9iYWxDb250ZXh0LlByb3ZpZGVyPlxuICAgIClcbiAgfSxcbiAgRmVhdHVyZXMuQ0hBVF9BSVxuKVxuXG5jb25zdCBDaGF0QUlQYWdlQ29udGVudCA9ICh7IHNlY3Rpb24sIGNsYXNzTmFtZSB9OiB7IHNlY3Rpb246IFNlY3Rpb25UeXBlOyBjbGFzc05hbWU/OiBzdHJpbmcgfSkgPT4ge1xuICBjb25zdCB1c2VyID0gdXNlVXNlcigpXG4gIGNvbnN0IHsgaTE4biB9ID0gdXNlVHJhbnNsYXRpb24oW1NFQ1RJT05TLmFibUFnZW50XSlcblxuICBjb25zdCBsYW5nID0gaTE4bi5sYW5ndWFnZSA9PT0gJ2JyJyA/ICdwdC1icicgOiBpMThuLmxhbmd1YWdlXG4gIG1vbWVudC5sb2NhbGUobGFuZylcblxuICBjb25zdCBbdXNlckluaXRpYWxNZXNzYWdlLCBzZXRVc2VySW5pdGlhbE1lc3NhZ2VdID0gdXNlU3RhdGU8e1xuICAgIG1lc3NhZ2U6IHN0cmluZ1xuICAgIGF0dGFjaG1lbnRzOiBBdHRhY2htZW50RmlsZVtdXG4gICAgZmFxSWQ/OiBzdHJpbmdcbiAgICBhZ2VudFN1Z2dlc3Rpb25JZD86IHN0cmluZ1xuICAgIGZ1YUlkPzogc3RyaW5nXG4gIH0+KHsgbWVzc2FnZTogJycsIGF0dGFjaG1lbnRzOiBbXSB9KVxuICBjb25zdCBbaW5pdGlhbENoYXRJZCwgc2V0SW5pdGlhbENoYXRJZF0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCBbbmV3Q2hhdEtleSwgc2V0TmV3Q2hhdEtleV0gPSB1c2VTdGF0ZSgwKVxuICB0eXBlIFBhZ2VTZW5kTWVzc2FnZUZuID0gKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBhdHRhY2htZW50cz86IEF0dGFjaG1lbnRGaWxlW10sXG4gICAgZmFxSWQ/OiBzdHJpbmcsXG4gICAgYWdlbnRTdWdnZXN0aW9uSWQ/OiBzdHJpbmdcbiAgKSA9PiB2b2lkXG4gIGNvbnN0IFtzZW5kTWVzc2FnZUZ1bmN0aW9uLCBzZXRTZW5kTWVzc2FnZUZ1bmN0aW9uXSA9IHVzZVN0YXRlPFBhZ2VTZW5kTWVzc2FnZUZuIHwgbnVsbD4obnVsbClcbiAgY29uc3QgW3N0b3BHZW5lcmF0aW9uRnVuY3Rpb24sIHNldFN0b3BHZW5lcmF0aW9uRnVuY3Rpb25dID0gdXNlU3RhdGU8KCgpID0+IHZvaWQpIHwgbnVsbD4obnVsbClcbiAgY29uc3QgW2lzU3RyZWFtaW5nLCBzZXRJc1N0cmVhbWluZ10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2lzV3JpdGluZywgc2V0SXNXcml0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbcmVmZXRjaENoYXRzLCBzZXRSZWZldGNoQ2hhdHNdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtjdXJyZW50T3B0aW9uLCBzZXRDdXJyZW50T3B0aW9uXSA9IHVzZVN0YXRlKG9wdGlvbnMuaG9tZSlcbiAgY29uc3QgW2hhc0Vycm9yLCBzZXRIYXNFcnJvcl0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgaGFuZGxlcnMgPSB1c2VNZW1vKCgpID0+IGJ1aWxkSGFuZGxlcnMoc2V0Q3VycmVudE9wdGlvbiwgc2V0SGFzRXJyb3IpLCBbXSlcbiAgY29uc3QgW3NpZGViYXJIYXNFcnJvciwgc2V0U2lkZWJhckhhc0Vycm9yXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCByZXNldFNlbGVjdGVkQ2hhdFJlZiA9IHVzZVJlZjwoKCkgPT4gdm9pZCkgfCBudWxsPihudWxsKVxuICBjb25zdCBbbGF5b3V0TW9kZV0gPSB1c2VTdGF0ZTxNYWlhQ2hhdE1vZGFsTGF5b3V0TW9kZT4oJ3NpZGViYXInKVxuICBjb25zdCBbc2lkZWJhck9wZW4sIHNldFNpZGViYXJPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbaG9tZUxlYXZpbmcsIHNldEhvbWVMZWF2aW5nXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBza2lwQ2hhdEVudGVyUmVmID0gdXNlUmVmKGZhbHNlKVxuICBjb25zdCBleHBhbmRlZCA9IGxheW91dE1vZGUgPT09ICdmdWxsc2NyZWVuJ1xuXG4gIGNvbnN0IHsgc2VsZWN0QWdlbnQsIGFnZW50LCB0b2dnbGVXZWJTZWFyY2gsIGlzV2ViU2VhcmNoQWN0aXZlLCBzZXRDaGlwc1Byb2plY3QsIHNldENsaWVudCwgc2V0UHJvamVjdCwgc2V0VGFzayB9ID1cbiAgICB1c2VHbG9iYWxDb250ZXh0KClcblxuICBjb25zdCB7XG4gICAgYWdlbnRzLFxuICAgIGxvYWRpbmcsXG4gICAgbG9hZGluZ01vcmUsXG4gICAgZXJyb3I6IGFnZW50RXJyb3IsXG4gICAgaGFuZGxlR2V0QWdlbnRzLFxuICAgIGxvYWRNb3JlQWdlbnRzLFxuICAgIHNvcnRBZ2VudHNMaXN0LFxuICAgIGFkZEFnZW50LFxuICAgIHJlbW92ZUFnZW50LFxuICAgIHVwZGF0ZUFnZW50LFxuICAgIHVwZGF0ZUFnZW50RmF2b3JpdGUsXG4gICAgc2VsZWN0Rmlyc3RBZ2VudCxcbiAgfSA9IHVzZUdldEFnZW50cyh7IHNlbGVjdEFnZW50LCBzZWN0aW9uLCBhZ2VudCwgaGFuZGxlR29Ib21lOiBoYW5kbGVycy5ob21lIH0pXG5cbiAgY29uc3QgdXNlckhhc1Blcm1pc3Npb25zID1cbiAgICAodXNlcj8ucGVybWlzc2lvbnM/LmFpX2FnZW50cz8uY3JlYXRlIHx8XG4gICAgICB1c2VyPy5wZXJtaXNzaW9ucz8uYWlfYWdlbnRzPy5lZGl0IHx8XG4gICAgICB1c2VyPy5wZXJtaXNzaW9ucz8uYWlfYWdlbnRzPy5kZWxldGUpICYmXG4gICAgd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFNcblxuICBjb25zdCBvcmNoZXN0cmF0b3IgPSB1c2VNZW1vKCgpID0+IGFnZW50cy5kYXRhLmZpbmQoaXRlbSA9PiBpdGVtLnR5cGUgPT09ICdvcmNoZXN0cmF0b3InKSA/PyBudWxsLCBbYWdlbnRzLmRhdGFdKVxuXG4gIGNvbnN0IGNvbXB1dGVkQ3VycmVudE9wdGlvbiA9IGN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMuY2hhdCA/IG9wdGlvbnMuY2hhdCA6IG9wdGlvbnMuaG9tZVxuICBjb25zdCBpc0NoYXRWaWV3ID0gY29tcHV0ZWRDdXJyZW50T3B0aW9uID09PSBvcHRpb25zLmNoYXRcbiAgY29uc3Qgc2Vzc2lvbk1ldGEgPSB1c2VNYWlhQ2hhdFNlc3Npb25NZXRhKGluaXRpYWxDaGF0SWQpXG4gIGNvbnN0IGxlZ2FjeUNvbnRleHRTZXNzaW9uID0gdXNlTWVtbyhcbiAgICAoKSA9PiByZXNvbHZlTGVnYWN5Q29udGV4dFNlc3Npb24oc2Vzc2lvbk1ldGEsIGlzQ2hhdFZpZXcpLFxuICAgIFtpc0NoYXRWaWV3LCBzZXNzaW9uTWV0YV1cbiAgKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGxlZ2FjeUNvbnRleHRTZXNzaW9uICYmIGFnZW50ICYmICFhZ2VudC5pc19sZWdhY3lfY29udGV4dCkge1xuICAgICAgc2VsZWN0QWdlbnQoeyAuLi5hZ2VudCwgaXNfbGVnYWN5X2NvbnRleHQ6IHRydWUgfSlcbiAgICB9XG4gIH0sIFtsZWdhY3lDb250ZXh0U2Vzc2lvbiwgYWdlbnQsIHNlbGVjdEFnZW50XSlcblxuICBjb25zdCBoYW5kbGVDb250aW51ZUxlZ2FjeUNvbnRleHRJbk5ld0NoYXQgPSB1c2VDb250aW51ZUxlZ2FjeUNvbnRleHRJbk5ld0NoYXQoe1xuICAgIHNlc3Npb25NZXRhLFxuICAgIGFnZW50czogYWdlbnRzLmRhdGEsXG4gICAgc2VsZWN0QWdlbnQsXG4gICAgc2V0Q2xpZW50LFxuICAgIHNldFByb2plY3QsXG4gICAgc2V0VGFzayxcbiAgICBzZXRDaGlwc1Byb2plY3QsXG4gICAgb25SZXNldENoYXRTZXNzaW9uOiAoKSA9PiB7XG4gICAgICBzZXRJbml0aWFsQ2hhdElkKG51bGwpXG4gICAgICBzZXROZXdDaGF0S2V5KHByZXYgPT4gcHJldiArIDEpXG4gICAgICBzZXRVc2VySW5pdGlhbE1lc3NhZ2UoeyBtZXNzYWdlOiAnJywgYXR0YWNobWVudHM6IFtdIH0pXG4gICAgICBzZXRIYXNFcnJvcihmYWxzZSlcbiAgICB9LFxuICAgIG9uR29Ub09yY2hlc3RyYXRvckhvbWU6ICgpID0+IHtcbiAgICAgIHNldEhvbWVMZWF2aW5nKGZhbHNlKVxuICAgICAgc2tpcENoYXRFbnRlclJlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgIHNldEN1cnJlbnRPcHRpb24ob3B0aW9ucy5ob21lKVxuICAgIH0sXG4gIH0pXG5cbiAgY29uc3QgZGlkSW5pdEFnZW50UmVmID0gdXNlUmVmKGZhbHNlKVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChkaWRJbml0QWdlbnRSZWYuY3VycmVudCB8fCAhb3JjaGVzdHJhdG9yKSByZXR1cm5cbiAgICBkaWRJbml0QWdlbnRSZWYuY3VycmVudCA9IHRydWVcbiAgICBzZWxlY3RBZ2VudChvcmNoZXN0cmF0b3IpXG4gIH0sIFtvcmNoZXN0cmF0b3IsIHNlbGVjdEFnZW50XSlcblxuICBjb25zdCBhZ2VudHNGZXRjaGVkUmVmID0gdXNlUmVmKGZhbHNlKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFhZ2VudHNGZXRjaGVkUmVmLmN1cnJlbnQpIHtcbiAgICAgIGFnZW50c0ZldGNoZWRSZWYuY3VycmVudCA9IHRydWVcbiAgICAgIGhhbmRsZUdldEFnZW50cygpXG4gICAgfVxuICB9LCBbaGFuZGxlR2V0QWdlbnRzXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG9uTWVyZ2VDcmVhdGVkQWdlbnQgPSAoZXZ0OiBFdmVudCkgPT4ge1xuICAgICAgY29uc3QgeyBhZ2VudDogbmV4dEFnZW50IH0gPSAoZXZ0IGFzIEN1c3RvbUV2ZW50PHsgYWdlbnQ6IEFnZW50IH0+KS5kZXRhaWwgfHwge31cbiAgICAgIGlmIChuZXh0QWdlbnQ/LmlkKSBhZGRBZ2VudChuZXh0QWdlbnQsIHsgbmF2aWdhdGVIb21lOiBmYWxzZSB9KVxuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtYWlhLW1lcmdlLWNyZWF0ZWQtYWdlbnQtaW50by1saXN0Jywgb25NZXJnZUNyZWF0ZWRBZ2VudClcbiAgICByZXR1cm4gKCkgPT4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWFpYS1tZXJnZS1jcmVhdGVkLWFnZW50LWludG8tbGlzdCcsIG9uTWVyZ2VDcmVhdGVkQWdlbnQpXG4gIH0sIFthZGRBZ2VudF0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBvblN5bmNFZGl0ZWRBZ2VudCA9IChldnQ6IEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB7IGFnZW50OiBuZXh0QWdlbnQgfSA9IChldnQgYXMgQ3VzdG9tRXZlbnQ8eyBhZ2VudDogQWdlbnQgfT4pLmRldGFpbCB8fCB7fVxuICAgICAgaWYgKCFuZXh0QWdlbnQ/LmlkKSByZXR1cm5cbiAgICAgIHVwZGF0ZUFnZW50KG5leHRBZ2VudClcbiAgICAgIGlmIChhZ2VudD8uaWQgPT09IG5leHRBZ2VudC5pZCkgc2VsZWN0QWdlbnQobmV4dEFnZW50KVxuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtYWlhLXN5bmMtZWRpdGVkLWFnZW50LWZyb20tY2hhdCcsIG9uU3luY0VkaXRlZEFnZW50KVxuICAgIHJldHVybiAoKSA9PiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtYWlhLXN5bmMtZWRpdGVkLWFnZW50LWZyb20tY2hhdCcsIG9uU3luY0VkaXRlZEFnZW50KVxuICB9LCBbdXBkYXRlQWdlbnQsIHNlbGVjdEFnZW50LCBhZ2VudD8uaWRdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgb3BlbkNoYXRWaWV3ID0gKCkgPT4ge1xuICAgICAgc2V0SGFzRXJyb3IoZmFsc2UpXG4gICAgICBzZXRJbml0aWFsQ2hhdElkKG51bGwpXG4gICAgICBzZXROZXdDaGF0S2V5KHByZXYgPT4gcHJldiArIDEpXG4gICAgICBzZXRVc2VySW5pdGlhbE1lc3NhZ2UoeyBtZXNzYWdlOiAnJywgYXR0YWNobWVudHM6IFtdIH0pXG4gICAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMuY2hhdClcbiAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdjaGF0LXNlc3Npb24tY2hhbmdlZCcpKVxuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtYWlhLW9wZW4tY2hhdC12aWV3Jywgb3BlbkNoYXRWaWV3KVxuICAgIHJldHVybiAoKSA9PiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtYWlhLW9wZW4tY2hhdC12aWV3Jywgb3BlbkNoYXRWaWV3KVxuICB9LCBbXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG9wZW5OZXdDaGF0V2l0aEFnZW50ID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgY29uc3QgbmV4dEFnZW50ID0gKGV2ZW50IGFzIEN1c3RvbUV2ZW50PHsgYWdlbnQ6IEFnZW50IH0+KS5kZXRhaWw/LmFnZW50XG4gICAgICBpZiAoIW5leHRBZ2VudCkgcmV0dXJuXG4gICAgICBzZXRQcm9qZWN0KG51bGwpXG4gICAgICBzZXRDbGllbnQ/LihudWxsKVxuICAgICAgc2VsZWN0QWdlbnQobmV4dEFnZW50KVxuICAgICAgc2V0SGFzRXJyb3IoZmFsc2UpXG4gICAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMuaG9tZSlcbiAgICB9XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbWFpYS1vcGVuLW5ldy1jaGF0LXdpdGgtYWdlbnQnLCBvcGVuTmV3Q2hhdFdpdGhBZ2VudClcbiAgICByZXR1cm4gKCkgPT4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWFpYS1vcGVuLW5ldy1jaGF0LXdpdGgtYWdlbnQnLCBvcGVuTmV3Q2hhdFdpdGhBZ2VudClcbiAgfSwgW3NlbGVjdEFnZW50LCBzZXRDbGllbnQsIHNldFByb2plY3RdKVxuXG4gIGNvbnN0IHN0YXJ0Q2hhdCA9IHVzZUNhbGxiYWNrKFxuICAgIChcbiAgICAgIG1lc3NhZ2U/OiBzdHJpbmcsXG4gICAgICBhdHRhY2htZW50cz86IEF0dGFjaG1lbnRGaWxlW10sXG4gICAgICBmYXFJZD86IHN0cmluZyxcbiAgICAgIGFnZW50U3VnZ2VzdGlvbklkPzogc3RyaW5nLFxuICAgICAgX21lbnRpb25zPzogdW5rbm93bixcbiAgICAgIGZ1YUlkPzogc3RyaW5nXG4gICAgKSA9PiB7XG4gICAgICBpZiAoc2lkZWJhckhhc0Vycm9yKSBzZXRTaWRlYmFySGFzRXJyb3IoZmFsc2UpXG4gICAgICBzZXRJbml0aWFsQ2hhdElkKG51bGwpXG4gICAgICBzZXROZXdDaGF0S2V5KHByZXYgPT4gcHJldiArIDEpXG4gICAgICBzZXRVc2VySW5pdGlhbE1lc3NhZ2Uoe1xuICAgICAgICBtZXNzYWdlOiBtZXNzYWdlIHx8ICcnLFxuICAgICAgICBhdHRhY2htZW50czogYXR0YWNobWVudHMgfHwgW10sXG4gICAgICAgIC4uLihmYXFJZCA/IHsgZmFxSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKGFnZW50U3VnZ2VzdGlvbklkID8geyBhZ2VudFN1Z2dlc3Rpb25JZCB9IDoge30pLFxuICAgICAgICAuLi4oZnVhSWQgPyB7IGZ1YUlkIH0gOiB7fSksXG4gICAgICB9KVxuICAgICAgaGFuZGxlcnMuY2hhdCgpXG4gICAgfSxcbiAgICBbaGFuZGxlcnMsIHNpZGViYXJIYXNFcnJvcl1cbiAgKVxuXG4gIC8vIFNpZGViYXIgdHlwZXMgdGhpcyBwcm9wIGFzIChjaGF0SWQ6IHN0cmluZykgYnV0IHBhc3NlcyB0aGUgZnVsbCBjaGF0IG9iamVjdCBhdCBydW50aW1lXG4gIGNvbnN0IGdvVG9DaGF0ID0gdXNlQ2FsbGJhY2soXG4gICAgKGNoYXRBcmc6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgY2hhdCA9IGNoYXRBcmcgYXMgdW5rbm93biBhcyBDaGF0TGlzdEl0ZW1cbiAgICAgIHNldFVzZXJJbml0aWFsTWVzc2FnZSh7IG1lc3NhZ2U6ICcnLCBhdHRhY2htZW50czogW10gfSlcbiAgICAgIHNldEluaXRpYWxDaGF0SWQoY2hhdC5zZXNzaW9uRXh0ZXJuYWxJZClcbiAgICAgIGNvbnN0IHNlbGVjdGVkQWdlbnQgPSBhZ2VudHMuZGF0YS5maW5kKGFnZW50SXRlbSA9PiBhZ2VudEl0ZW0uaWQgPT09IGNoYXQuYWdlbnRJZClcbiAgICAgIGlmIChzZWxlY3RlZEFnZW50KSBzZWxlY3RBZ2VudChzZWxlY3RlZEFnZW50KVxuICAgICAgc2tpcENoYXRFbnRlclJlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdjaGF0LXNlc3Npb24tY2hhbmdlZCcpKVxuICAgICAgaGFuZGxlcnMuY2hhdCgpXG4gICAgfSxcbiAgICBbaGFuZGxlcnMsIGFnZW50cywgc2VsZWN0QWdlbnRdXG4gIClcblxuICBjb25zdCBoYW5kbGVTZW5kTWVzc2FnZVJlYWR5ID0gdXNlQ2FsbGJhY2soXG4gICAgKFxuICAgICAgc2VuZE1lc3NhZ2U6IChcbiAgICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgICBhdHRhY2htZW50cz86IEF0dGFjaG1lbnRGaWxlW10sXG4gICAgICAgIGZhcUlkPzogc3RyaW5nLFxuICAgICAgICBhZ2VudFN1Z2dlc3Rpb25JZD86IHN0cmluZ1xuICAgICAgKSA9PiB2b2lkLFxuICAgICAgc3RvcEdlbmVyYXRpb246ICgpID0+IHZvaWQsXG4gICAgICBzdHJlYW1pbmc6IGJvb2xlYW4sXG4gICAgICB3cml0aW5nOiBib29sZWFuXG4gICAgKSA9PiB7XG4gICAgICBzZXRTZW5kTWVzc2FnZUZ1bmN0aW9uKCgpID0+IHNlbmRNZXNzYWdlKVxuICAgICAgc2V0U3RvcEdlbmVyYXRpb25GdW5jdGlvbigoKSA9PiBzdG9wR2VuZXJhdGlvbilcbiAgICAgIHNldElzU3RyZWFtaW5nKHN0cmVhbWluZylcbiAgICAgIHNldElzV3JpdGluZyh3cml0aW5nKVxuICAgIH0sXG4gICAgW11cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZVNlbmRNZXNzYWdlID0gdXNlQ2FsbGJhY2soXG4gICAgKFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgYXR0YWNobWVudHM/OiBBdHRhY2htZW50RmlsZVtdLFxuICAgICAgZmFxSWQ/OiBzdHJpbmcsXG4gICAgICBhZ2VudFN1Z2dlc3Rpb25JZD86IHN0cmluZyxcbiAgICAgIG1lbnRpb25zPzogdW5rbm93bixcbiAgICAgIGZ1YUlkPzogc3RyaW5nXG4gICAgKSA9PiB7XG4gICAgICBpZiAoc2lkZWJhckhhc0Vycm9yKSBzZXRTaWRlYmFySGFzRXJyb3IoZmFsc2UpXG4gICAgICBpZiAoc2VuZE1lc3NhZ2VGdW5jdGlvbiAmJiBjb21wdXRlZEN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMuY2hhdCkge1xuICAgICAgICBzZW5kTWVzc2FnZUZ1bmN0aW9uKG1lc3NhZ2UsIGF0dGFjaG1lbnRzLCBmYXFJZCwgYWdlbnRTdWdnZXN0aW9uSWQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGFydENoYXQobWVzc2FnZSwgYXR0YWNobWVudHMsIGZhcUlkLCBhZ2VudFN1Z2dlc3Rpb25JZCwgbWVudGlvbnMsIGZ1YUlkKVxuICAgICAgfVxuICAgIH0sXG4gICAgW3NlbmRNZXNzYWdlRnVuY3Rpb24sIHN0YXJ0Q2hhdCwgY29tcHV0ZWRDdXJyZW50T3B0aW9uLCBzaWRlYmFySGFzRXJyb3JdXG4gIClcblxuICBjb25zdCBoYW5kbGVIb21lTGVhdmVTdGFydCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBza2lwQ2hhdEVudGVyUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgc2V0SG9tZUxlYXZpbmcodHJ1ZSlcbiAgfSwgW10pXG5cbiAgY29uc3QgaGFuZGxlSG9tZVNlbmRNZXNzYWdlID0gdXNlQ2FsbGJhY2soXG4gICAgKFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgYXR0YWNobWVudHM/OiBBdHRhY2htZW50RmlsZVtdLFxuICAgICAgZmFxSWQ/OiBzdHJpbmcsXG4gICAgICBhZ2VudFN1Z2dlc3Rpb25JZD86IHN0cmluZyxcbiAgICAgIG1lbnRpb25zPzogdW5rbm93bixcbiAgICAgIGZ1YUlkPzogc3RyaW5nXG4gICAgKSA9PiB7XG4gICAgICBzZXRIb21lTGVhdmluZyhmYWxzZSlcbiAgICAgIGhhbmRsZVNlbmRNZXNzYWdlKG1lc3NhZ2UsIGF0dGFjaG1lbnRzLCBmYXFJZCwgYWdlbnRTdWdnZXN0aW9uSWQsIG1lbnRpb25zLCBmdWFJZClcbiAgICB9LFxuICAgIFtoYW5kbGVTZW5kTWVzc2FnZV1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZUdvSG9tZSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRIb21lTGVhdmluZyhmYWxzZSlcbiAgICBza2lwQ2hhdEVudGVyUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgIGlmIChjdXJyZW50T3B0aW9uID09PSBvcHRpb25zLmNoYXQpIHtcbiAgICAgIHNldEluaXRpYWxDaGF0SWQobnVsbClcbiAgICAgIHNldE5ld0NoYXRLZXkocHJldiA9PiBwcmV2ICsgMSlcbiAgICAgIGlmIChhZ2VudD8uZW50aXR5ICE9PSAnY2xpZW50Jykgc2V0Q2xpZW50Py4obnVsbClcbiAgICB9XG4gICAgaWYgKG9yY2hlc3RyYXRvcikge1xuICAgICAgc2VsZWN0QWdlbnQob3JjaGVzdHJhdG9yKVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICAoIWFnZW50IHx8IGFnZW50Py5pc19kZWxldGVkIHx8IGFnZW50Py5oYXNfbm90X3Blcm1pc3Npb25zIHx8IGFnZW50Py5oYXNfbm90X2FjY2VzcyB8fCBhZ2VudD8ucHJvamVjdF9kZWxldGVkKSAmJlxuICAgICAgYWdlbnRzLmRhdGEubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgc2VsZWN0QWdlbnQoYWdlbnRzLmRhdGFbMF0pXG4gICAgfVxuICAgIHNldEN1cnJlbnRPcHRpb24ob3B0aW9ucy5ob21lKVxuICAgIHNldENoaXBzUHJvamVjdChudWxsKVxuICAgIHNldEhhc0Vycm9yKGZhbHNlKVxuICAgIGlmIChpc1dlYlNlYXJjaEFjdGl2ZSkgdG9nZ2xlV2ViU2VhcmNoKClcbiAgICBpZiAocmVzZXRTZWxlY3RlZENoYXRSZWYuY3VycmVudCkgcmVzZXRTZWxlY3RlZENoYXRSZWYuY3VycmVudCgpXG4gIH0sIFtcbiAgICBjdXJyZW50T3B0aW9uLFxuICAgIGlzV2ViU2VhcmNoQWN0aXZlLFxuICAgIHRvZ2dsZVdlYlNlYXJjaCxcbiAgICBhZ2VudCxcbiAgICBhZ2VudHMsXG4gICAgb3JjaGVzdHJhdG9yLFxuICAgIHNlbGVjdEFnZW50LFxuICAgIHNldENsaWVudCxcbiAgICBzZXRDaGlwc1Byb2plY3QsXG4gIF0pXG5cbiAgY29uc3QgaGFuZGxlUmVzZXRDaGF0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldEhvbWVMZWF2aW5nKGZhbHNlKVxuICAgIHNraXBDaGF0RW50ZXJSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgc2V0SW5pdGlhbENoYXRJZChudWxsKVxuICAgIHNldE5ld0NoYXRLZXkocHJldiA9PiBwcmV2ICsgMSlcbiAgICBzZXRVc2VySW5pdGlhbE1lc3NhZ2UoeyBtZXNzYWdlOiAnJywgYXR0YWNobWVudHM6IFtdIH0pXG4gICAgc2V0Q3VycmVudE9wdGlvbihvcHRpb25zLmhvbWUpXG4gICAgc2V0Q2hpcHNQcm9qZWN0KG51bGwpXG4gICAgc2V0SGFzRXJyb3IoZmFsc2UpXG4gICAgaWYgKGlzV2ViU2VhcmNoQWN0aXZlKSB0b2dnbGVXZWJTZWFyY2goKVxuICAgIGlmIChyZXNldFNlbGVjdGVkQ2hhdFJlZi5jdXJyZW50KSByZXNldFNlbGVjdGVkQ2hhdFJlZi5jdXJyZW50KClcbiAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnY2hhdC1zZXNzaW9uLWNoYW5nZWQnKSlcbiAgfSwgW2lzV2ViU2VhcmNoQWN0aXZlLCB0b2dnbGVXZWJTZWFyY2gsIHNldENoaXBzUHJvamVjdF0pXG5cbiAgY29uc3QgZm9jdXNDaGF0SW5wdXQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ21haWEtaW5wdXQtcmVmb2N1cycpKVxuICAgIH0sIDEwMClcbiAgfSwgW10pXG5cbiAgY29uc3QgaGFuZGxlU3RhcnROZXdDaGF0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmIChjdXJyZW50T3B0aW9uID09PSBvcHRpb25zLmhvbWUpIHtcbiAgICAgIGZvY3VzQ2hhdElucHV0KClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAob3JjaGVzdHJhdG9yKSBzZWxlY3RBZ2VudChvcmNoZXN0cmF0b3IpXG4gICAgaGFuZGxlR29Ib21lKClcbiAgICBmb2N1c0NoYXRJbnB1dCgpXG4gIH0sIFtjdXJyZW50T3B0aW9uLCBmb2N1c0NoYXRJbnB1dCwgaGFuZGxlR29Ib21lLCBvcmNoZXN0cmF0b3IsIHNlbGVjdEFnZW50XSlcblxuICBjb25zdCBub29wID0gdXNlQ2FsbGJhY2soKCkgPT4gdW5kZWZpbmVkLCBbXSlcblxuICBjb25zdCBjYW5BY2Nlc3NQYWdlID0gdmFsaWRhdGVBY2Nlc3NCeUZlYXR1cmUoc2VjdGlvbilcbiAgY29uc3QgaXNIb21lID0gY29tcHV0ZWRDdXJyZW50T3B0aW9uID09PSBvcHRpb25zLmhvbWVcbiAgY29uc3Qgc2hvd0NoYXRGb290ZXIgPSBjb21wdXRlZEN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMuY2hhdCAmJiAhaGFzRXJyb3IgJiYgIWxvYWRpbmcgJiYgY2FuQWNjZXNzUGFnZVxuXG4gIHJldHVybiAoXG4gICAgPFNDUGFnZVdyYXBwZXIgY2xhc3NOYW1lPXtjbGFzc05hbWV9PlxuICAgICAge2NhbkFjY2Vzc1BhZ2UgPyAoXG4gICAgICAgIDxTaWRlYmFyXG4gICAgICAgICAgY29udmVyc2F0aW9uc09ubHlcbiAgICAgICAgICBvcGVuPXtzaWRlYmFyT3Blbn1cbiAgICAgICAgICBvbk9wZW5DaGFuZ2U9e3NldFNpZGViYXJPcGVufVxuICAgICAgICAgIG9uR29Ub0NoYXQ9e2dvVG9DaGF0fVxuICAgICAgICAgIG9uRXJyb3I9eygpID0+IHNldFNpZGViYXJIYXNFcnJvcih0cnVlKX1cbiAgICAgICAgICBoYW5kbGVHb1RvSG9tZT17aGFuZGxlR29Ib21lfVxuICAgICAgICAgIGhhbmRsZVN0YXJ0TmV3Q2hhdD17aGFuZGxlU3RhcnROZXdDaGF0fVxuICAgICAgICAgIGhhbmRsZU9wZW5NYXJrZXRwbGFjZT17bm9vcH1cbiAgICAgICAgICBoYW5kbGVPcGVuU2tpbGxzPXtub29wfVxuICAgICAgICAgIHNob3dOZXdDaGF0PXtmYWxzZX1cbiAgICAgICAgICByZWZldGNoQ2hhdHM9e3JlZmV0Y2hDaGF0c31cbiAgICAgICAgICBoYW5kbGVTZXRSZWZldGNoQ2hhdHM9e3NldFJlZmV0Y2hDaGF0c31cbiAgICAgICAgICBoYXNFcnJvcj17c2lkZWJhckhhc0Vycm9yfVxuICAgICAgICAgIHJlc2V0U2VsZWN0ZWRDaGF0UmVmPXtyZXNldFNlbGVjdGVkQ2hhdFJlZn1cbiAgICAgICAgICBpc0xlZ2FjeUNvbnRleHRTZXNzaW9uPXshIWxlZ2FjeUNvbnRleHRTZXNzaW9ufVxuICAgICAgICAvPlxuICAgICAgKSA6IG51bGx9XG4gICAgICA8U0NQYWdlTWFpbj5cbiAgICAgICAgPENoYXRBSVBhZ2VIZWFkZXJcbiAgICAgICAgICBvdmVybGF5PXtpc0hvbWUgJiYgIWhvbWVMZWF2aW5nfVxuICAgICAgICAgIHNob3dCYWNrPXshaXNIb21lfVxuICAgICAgICAgIGFnZW50cz17YWdlbnRzLmRhdGF9XG4gICAgICAgICAgbG9hZGluZz17bG9hZGluZ31cbiAgICAgICAgICBsb2FkaW5nTW9yZT17bG9hZGluZ01vcmV9XG4gICAgICAgICAgaGFzTW9yZT17YWdlbnRzLmhhc19tb3JlfVxuICAgICAgICAgIGxvYWRNb3JlQWdlbnRzPXtsb2FkTW9yZUFnZW50c31cbiAgICAgICAgICBzb3J0QWdlbnRzTGlzdD17c29ydEFnZW50c0xpc3R9XG4gICAgICAgICAgaGFuZGxlUmVzZXRDaGF0PXtoYW5kbGVSZXNldENoYXR9XG4gICAgICAgICAgb25BZ2VudFVwZGF0ZT17dXBkYXRlQWdlbnRGYXZvcml0ZX1cbiAgICAgICAgLz5cbiAgICAgICAge2hhc0Vycm9yID8gKFxuICAgICAgICAgIDxNQUlBRXJyb3IgLz5cbiAgICAgICAgKSA6IGNhbkFjY2Vzc1BhZ2UgPyAoXG4gICAgICAgICAgaXNIb21lID8gKFxuICAgICAgICAgICAgPENoYXRBSVBhZ2VIb21lIG9uU2VuZE1lc3NhZ2U9e2hhbmRsZUhvbWVTZW5kTWVzc2FnZX0gb25MZWF2ZVN0YXJ0PXtoYW5kbGVIb21lTGVhdmVTdGFydH0gLz5cbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPENoYXRBSUNvbnRlbnRcbiAgICAgICAgICAgICAgY3VycmVudE9wdGlvbj17b3B0aW9ucy5jaGF0fVxuICAgICAgICAgICAgICBoYW5kbGVycz17eyAuLi5oYW5kbGVycywgY2hhdDogc3RhcnRDaGF0LCBob21lOiBoYW5kbGVycy5ob21lLCBoYW5kbGVHb0hvbWUgfX1cbiAgICAgICAgICAgICAgb25FcnJvcj17KCkgPT4gc2V0SGFzRXJyb3IodHJ1ZSl9XG4gICAgICAgICAgICAgIHJlZnM9e3sgdXNlckluaXRpYWxNZXNzYWdlLCBpbml0aWFsQ2hhdElkIH19XG4gICAgICAgICAgICAgIG9uU2VuZE1lc3NhZ2VSZWFkeT17aGFuZGxlU2VuZE1lc3NhZ2VSZWFkeX1cbiAgICAgICAgICAgICAgZXhwYW5kZWQ9e2V4cGFuZGVkfVxuICAgICAgICAgICAgICBmbG9hdGluZz17ZmFsc2V9XG4gICAgICAgICAgICAgIGFnZW50cz17YWdlbnRzLmRhdGF9XG4gICAgICAgICAgICAgIGxvYWRpbmdBZ2VudHM9e2xvYWRpbmd9XG4gICAgICAgICAgICAgIGFnZW50RXJyb3I9e2FnZW50RXJyb3J9XG4gICAgICAgICAgICAgIHNraXBFbnRlckFuaW1hdGlvbj17c2tpcENoYXRFbnRlclJlZi5jdXJyZW50fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApXG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPFByb2plY3RTdW1tYXJ5Q29udGVudCBvblJlc3RhcnRTdW1tYXJ5PXtoYW5kbGVycy5ob21lfSAvPlxuICAgICAgICApfVxuICAgICAgICB7c2hvd0NoYXRGb290ZXIgPyAoXG4gICAgICAgICAgPENoYXRBaU1vZGFsRm9vdGVyXG4gICAgICAgICAgICBhZ2VudD17YWdlbnR9XG4gICAgICAgICAgICBoYW5kbGVTZW5kTWVzc2FnZT17aGFuZGxlU2VuZE1lc3NhZ2V9XG4gICAgICAgICAgICBoYW5kbGVTdG9wR2VuZXJhdGlvbj17c3RvcEdlbmVyYXRpb25GdW5jdGlvbn1cbiAgICAgICAgICAgIGlzU3RyZWFtaW5nPXtpc1N0cmVhbWluZ31cbiAgICAgICAgICAgIGlzV3JpdGluZz17aXNXcml0aW5nfVxuICAgICAgICAgICAgY2hhdElkPXtpbml0aWFsQ2hhdElkfVxuICAgICAgICAgICAgbmV3Q2hhdEtleT17bmV3Q2hhdEtleX1cbiAgICAgICAgICAgIGxheW91dE1vZGU9e2xheW91dE1vZGV9XG4gICAgICAgICAgICBsZWdhY3lDb250ZXh0U2Vzc2lvbj17bGVnYWN5Q29udGV4dFNlc3Npb259XG4gICAgICAgICAgICBvbkNvbnRpbnVlSW5OZXdDaGF0PXtoYW5kbGVDb250aW51ZUxlZ2FjeUNvbnRleHRJbk5ld0NoYXR9XG4gICAgICAgICAgLz5cbiAgICAgICAgKSA6IG51bGx9XG4gICAgICA8L1NDUGFnZU1haW4+XG4gICAgICB7dXNlckhhc1Blcm1pc3Npb25zICYmIChcbiAgICAgICAgPEFibUFnZW50TW9kYWxcbiAgICAgICAgICBhZGRBZ2VudD17YWRkQWdlbnR9XG4gICAgICAgICAgdXBkYXRlQWdlbnQ9e3VwZGF0ZUFnZW50fVxuICAgICAgICAgIHJlbW92ZUFnZW50PXtyZW1vdmVBZ2VudH1cbiAgICAgICAgICB1cGRhdGVBZ2VudEZhdm9yaXRlPXt1cGRhdGVBZ2VudEZhdm9yaXRlfVxuICAgICAgICAgIHNlbGVjdEZpcnN0QWdlbnQ9e3NlbGVjdEZpcnN0QWdlbnR9XG4gICAgICAgIC8+XG4gICAgICApfVxuICAgICAgPFNuYWNrYmFyIC8+XG4gICAgPC9TQ1BhZ2VXcmFwcGVyPlxuICApXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQSxTQUFTQSxXQUFXLEVBQUVDLFNBQVMsRUFBRUMsT0FBTyxFQUFFQyxNQUFNLEVBQUVDLFFBQVEsUUFBUSxPQUFPO0FBQ3pFLE9BQU9DLE1BQU0s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