@projectcor/maia-components 2.49.0 → 2.49.1-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 (391) hide show
  1. package/lib/App.js +44 -19
  2. package/lib/components/atoms/ActionableButton.spec.js +111 -0
  3. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.spec.js +52 -0
  4. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.utils.spec.js +11 -0
  5. package/lib/components/atoms/ApprovalBox/ApprovalBox.helpers.spec.js +63 -0
  6. package/lib/components/atoms/ApprovalBox/ApprovalBox.spec.js +183 -0
  7. package/lib/components/atoms/AttachmentCard/AttachmentCard.spec.js +123 -0
  8. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.spec.js +139 -0
  9. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.spec.js +385 -0
  10. package/lib/components/atoms/AttachmentCard/AttachmentCardImage.spec.js +78 -0
  11. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.spec.js +94 -0
  12. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.spec.js +396 -0
  13. package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.spec.js +80 -0
  14. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.spec.js +526 -0
  15. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.spec.js +137 -0
  16. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.spec.js +11 -0
  17. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.spec.js +77 -0
  18. package/lib/components/atoms/Backdrop/Backdrop.spec.js +28 -0
  19. package/lib/components/atoms/CardMenu/CardMenu.spec.js +56 -0
  20. package/lib/components/atoms/ChatClientSelector/ChatClientSelector.spec.js +67 -0
  21. package/lib/components/atoms/Checkbox/Checkbox.spec.js +27 -0
  22. package/lib/components/atoms/Chip/Chip.spec.js +82 -0
  23. package/lib/components/atoms/ChipLlm/ChipLlm.spec.js +26 -0
  24. package/lib/components/atoms/ClientSelector/ClientSelector.helpers.spec.js +45 -0
  25. package/lib/components/atoms/ClientSelector/ClientSelector.spec.js +133 -0
  26. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.spec.js +29 -0
  27. package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.spec.js +46 -0
  28. package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.spec.js +109 -0
  29. package/lib/components/atoms/ContextMentionChip/buildChipElement.spec.js +81 -0
  30. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.spec.js +92 -0
  31. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.spec.js +319 -0
  32. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.spec.js +107 -0
  33. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.spec.js +136 -0
  34. package/lib/components/atoms/CopyToClipboard.spec.js +74 -0
  35. package/lib/components/atoms/EditableLabel/EditableLabel.spec.js +76 -0
  36. package/lib/components/atoms/EntitySelector/EntitySelector.spec.js +86 -0
  37. package/lib/components/atoms/Expand/Expand.spec.js +57 -0
  38. package/lib/components/atoms/Fade/Fade.spec.js +31 -0
  39. package/lib/components/atoms/FeedbackButton/FeedbackButton.spec.js +75 -0
  40. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.spec.js +104 -0
  41. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +3 -1
  42. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.spec.js +91 -0
  43. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +19 -7
  44. package/lib/components/atoms/HelpButton.spec.js +87 -0
  45. package/lib/components/atoms/ImagePreview/ImagePreview.spec.js +96 -0
  46. package/lib/components/atoms/ListMenuOption/ListMenuOption.spec.js +54 -0
  47. package/lib/components/atoms/LoadingFaqs/LoadingFaqs.spec.js +21 -0
  48. package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.spec.js +20 -0
  49. package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.spec.js +26 -0
  50. package/lib/components/atoms/LoadingText/LoadingText.spec.js +25 -0
  51. package/lib/components/atoms/MAIAButton/MAIAButton.spec.js +42 -0
  52. package/lib/components/atoms/MAIAError/MAIAError.spec.js +27 -0
  53. package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.spec.js +113 -0
  54. package/lib/components/atoms/MAIAInput/MAIAInput.helpers.spec.js +381 -0
  55. package/lib/components/atoms/MAIAInput/MAIAInput.js +5 -3
  56. package/lib/components/atoms/MAIAInput/MAIAInput.spec.js +641 -0
  57. package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.spec.js +92 -0
  58. package/lib/components/atoms/MAIAInput/MAIAInputEditor.spec.js +193 -0
  59. package/lib/components/atoms/MAIAInput/maiaInputLayout.spec.js +32 -0
  60. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.spec.js +64 -0
  61. package/lib/components/atoms/MaiaWrapper/MaiaWrapper.spec.js +43 -0
  62. package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.spec.js +114 -0
  63. package/lib/components/atoms/MaiaWrapper/ModernMaiaWrapper.spec.js +51 -0
  64. package/lib/components/atoms/ModalClientAccess/ModalClientAccess.spec.js +48 -0
  65. package/lib/components/atoms/ModalProject/ModalProject.spec.js +66 -0
  66. package/lib/components/atoms/NextPageLoader.spec.js +37 -0
  67. package/lib/components/atoms/OnboardingModalButton/OnboardingModal.spec.js +20 -0
  68. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.spec.js +35 -0
  69. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.spec.js +47 -0
  70. package/lib/components/atoms/OptionAccessibility/OptionAccessibility.spec.js +146 -0
  71. package/lib/components/atoms/PrimaryButton.spec.js +42 -0
  72. package/lib/components/atoms/ProjectSelector/ProjectSelector.spec.js +69 -0
  73. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.js +7 -2
  74. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.spec.js +69 -0
  75. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.styles.js +41 -24
  76. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.js +25 -10
  77. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.spec.js +59 -0
  78. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.js +78 -43
  79. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.spec.js +170 -0
  80. package/lib/components/atoms/ReasoningBlock/groupParallelSteps.js +9 -11
  81. package/lib/components/atoms/ReasoningBlock/groupParallelSteps.spec.js +199 -0
  82. package/lib/components/atoms/ReasoningBlock/reasoningLeading.spec.js +70 -0
  83. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.js +37 -15
  84. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.spec.js +120 -0
  85. package/lib/components/atoms/ReasoningBlock/reasoningMotion.js +8 -0
  86. package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.spec.js +31 -0
  87. package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.js +52 -0
  88. package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.spec.js +90 -0
  89. package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.js +29 -0
  90. package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.spec.js +38 -0
  91. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.spec.js +16 -0
  92. package/lib/components/atoms/SkillsDropdown/SkillsDropdown.spec.js +107 -0
  93. package/lib/components/atoms/SlashCommandChip/SlashCommandChip.spec.js +24 -0
  94. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.helpers.spec.js +71 -0
  95. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.spec.js +120 -0
  96. package/lib/components/atoms/Switch/Switch.spec.js +41 -0
  97. package/lib/components/atoms/TextArea/CustomTextArea.spec.js +52 -0
  98. package/lib/components/atoms/TextArea/TextArea.helpers.spec.js +25 -0
  99. package/lib/components/atoms/TextArea/TextArea.spec.js +126 -0
  100. package/lib/components/atoms/ThirdButton.spec.js +29 -0
  101. package/lib/components/atoms/VideoModal/VideoModal.spec.js +68 -0
  102. package/lib/components/atoms/WithAppCfg.spec.js +82 -0
  103. package/lib/components/index.js +2 -1
  104. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.spec.js +53 -0
  105. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.spec.js +742 -0
  106. package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.spec.js +107 -0
  107. package/lib/components/molecules/AbmSection/AbmGeneralSection.spec.js +256 -0
  108. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.spec.js +175 -0
  109. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.spec.js +318 -0
  110. package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.spec.js +50 -0
  111. package/lib/components/molecules/AbmSection/AbmLoaderFiles.spec.js +94 -0
  112. package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.js +83 -0
  113. package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.styles.js +30 -0
  114. package/lib/components/molecules/AgentInputBlock/index.js +5 -0
  115. package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.js +52 -0
  116. package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.spec.js +76 -0
  117. package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.js +20 -0
  118. package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.spec.js +34 -0
  119. package/lib/components/molecules/AgentInputBlock/useAgentChangeModelAction.js +36 -0
  120. package/lib/components/molecules/ChatAIClientSelector/ChatAIClientSelector.spec.js +66 -0
  121. package/lib/components/molecules/ChatAIContent/ChatAIContent.js +7 -3
  122. package/lib/components/molecules/ChatAIContent/ChatAIContent.spec.js +145 -0
  123. package/lib/components/molecules/ChatAIHistory/ChatAIHistory.spec.js +204 -0
  124. package/lib/components/molecules/ChatAIHome/ChatAIHome.helpers.spec.js +622 -0
  125. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +91 -72
  126. package/lib/components/molecules/ChatAIHome/ChatAIHome.spec.js +264 -0
  127. package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.spec.js +86 -0
  128. package/lib/components/molecules/ChatAIHome/styles.js +85 -78
  129. package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.spec.js +104 -0
  130. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.spec.js +742 -0
  131. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +30 -14
  132. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.spec.js +541 -0
  133. package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.spec.js +46 -0
  134. package/lib/components/molecules/ChatAIMessages/newStyles.js +32 -35
  135. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.js +8 -1
  136. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.spec.js +1394 -0
  137. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +25 -8
  138. package/lib/components/molecules/ChatAIModal/ChatAIModal.spec.js +1401 -0
  139. package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +2 -2
  140. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.spec.js +33 -0
  141. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.spec.js +116 -0
  142. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +15 -153
  143. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.spec.js +134 -0
  144. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.styles.js +2 -26
  145. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.spec.js +142 -0
  146. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +65 -61
  147. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.spec.js +241 -0
  148. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.spec.js +37 -0
  149. package/lib/components/molecules/ChatAIModal/constants.spec.js +16 -0
  150. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.spec.js +22 -0
  151. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/useFloatingPanelDragTilt.spec.js +67 -0
  152. package/lib/components/molecules/ChatAIModal/layout.spec.js +72 -0
  153. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.helpers.spec.js +93 -0
  154. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.spec.js +297 -0
  155. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.helpers.spec.js +62 -0
  156. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.spec.js +221 -0
  157. package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.spec.js +66 -0
  158. package/lib/components/molecules/ChatFooter/ChatFooter.js +10 -4
  159. package/lib/components/molecules/ChatFooter/ChatFooter.spec.js +369 -0
  160. package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.spec.js +10 -0
  161. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.spec.js +104 -0
  162. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.spec.js +139 -0
  163. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.spec.js +84 -0
  164. package/lib/components/molecules/MessageFeedback/MessageFeedback.spec.js +116 -0
  165. package/lib/components/molecules/ProjectSummaryChat/ProjectSummaryChat.spec.js +126 -0
  166. package/lib/components/molecules/ProjectSummaryConfig/ProjectSummaryConfig.spec.js +115 -0
  167. package/lib/components/molecules/ProjectSummaryContent/ProjectSummaryContent.spec.js +79 -0
  168. package/lib/components/molecules/ProjectSummaryModal/ProjectSummaryModal.spec.js +37 -0
  169. package/lib/components/molecules/Sidebar/Sidebar.helpers.spec.js +119 -0
  170. package/lib/components/molecules/Sidebar/Sidebar.js +41 -23
  171. package/lib/components/molecules/Sidebar/Sidebar.spec.js +464 -0
  172. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.spec.js +1067 -0
  173. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +2 -2
  174. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.spec.js +1236 -0
  175. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.spec.js +112 -0
  176. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.helpers.spec.js +77 -0
  177. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.spec.js +503 -0
  178. package/lib/components/organisms/ChatAI/ChatAI.spec.js +174 -0
  179. package/lib/components/organisms/ChatAIPage/ChatAIPage.js +525 -0
  180. package/lib/components/organisms/ChatAIPage/ChatAIPage.spec.js +246 -0
  181. package/lib/components/organisms/ChatAIPage/ChatAIPage.styles.js +16 -0
  182. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.js +253 -0
  183. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.spec.js +139 -0
  184. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.styles.js +13 -0
  185. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.js +275 -0
  186. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.spec.js +275 -0
  187. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.styles.js +195 -0
  188. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.js +94 -0
  189. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.spec.js +69 -0
  190. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCards.skeleton.js +38 -0
  191. package/lib/components/organisms/ChatAIPage/getDaypart.js +9 -0
  192. package/lib/components/organisms/ChatAIPage/getDaypart.spec.js +19 -0
  193. package/lib/components/organisms/ChatAIPage/index.js +3 -0
  194. package/lib/components/organisms/ClientAIButton/ClientAIButton.spec.js +53 -0
  195. package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.spec.js +59 -0
  196. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.spec.js +79 -0
  197. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.spec.js +86 -0
  198. package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.spec.js +49 -0
  199. package/lib/components/organisms/ProjectAIButton/ProjectAIButton.spec.js +67 -0
  200. package/lib/components/organisms/ProjectSummary/ProjectSummary.spec.js +117 -0
  201. package/lib/components/organisms/SnackBar/Snackbar.spec.js +66 -0
  202. package/lib/components/organisms/SourcesInformation/SourceItem.spec.js +19 -0
  203. package/lib/components/organisms/SourcesInformation/SourcesInformationModal.spec.js +52 -0
  204. package/lib/constants/formatExtensions.spec.js +14 -0
  205. package/lib/constants/maiaExternalConnectorsAccess.spec.js +29 -0
  206. package/lib/constants/maiaFeatureAccess.spec.js +30 -0
  207. package/lib/constants/maiaHourAgentAccess.spec.js +30 -0
  208. package/lib/constants/maiaTaskPanelAccess.spec.js +41 -0
  209. package/lib/constants/permissions/clientRoleAccess.spec.js +65 -0
  210. package/lib/constants/permissions/index.js +2 -2
  211. package/lib/constants/permissions/utils.js +4 -1
  212. package/lib/constants/permissions/utils.spec.js +128 -0
  213. package/lib/constants/plannerSyncEvents.spec.js +31 -0
  214. package/lib/constants/taskUrls.spec.js +9 -0
  215. package/lib/dev/DevMaiaPage.js +30 -0
  216. package/lib/dev/DevReasoningTimeline.js +68 -37
  217. package/lib/dev/Providers.js +5 -3
  218. package/lib/hooks/frequentlyUsedActionsCache.js +17 -0
  219. package/lib/hooks/frequentlyUsedActionsCache.spec.js +25 -0
  220. package/lib/hooks/useAccessClient/useAccessClient.spec.js +149 -0
  221. package/lib/hooks/useAgentModel/useAgentModel.spec.js +83 -0
  222. package/lib/hooks/useAgentModel/useCreateAgent.helpers.spec.js +268 -0
  223. package/lib/hooks/useAgentModel/useCreateAgent.spec.js +314 -0
  224. package/lib/hooks/useAgentModel/useDeleteAgent.spec.js +183 -0
  225. package/lib/hooks/useAgentModel/useUpdateAgent.spec.js +374 -0
  226. package/lib/hooks/useAgentSuggestions.spec.js +89 -0
  227. package/lib/hooks/useCaretPosition.spec.js +58 -0
  228. package/lib/hooks/useChatManager/useChatManager.helpers.js +3 -3
  229. package/lib/hooks/useChatManager/useChatManager.helpers.spec.js +2027 -0
  230. package/lib/hooks/useChatManager/useChatManager.js +8 -7
  231. package/lib/hooks/useChatManager/useChatManager.spec.js +2409 -0
  232. package/lib/hooks/useChatMessages/useChatMessages.helpers.spec.js +491 -0
  233. package/lib/hooks/useChatMessages/useChatMessages.spec.js +729 -0
  234. package/lib/hooks/useChats/useChats.spec.js +208 -0
  235. package/lib/hooks/useClientSearch.helpers.spec.js +52 -0
  236. package/lib/hooks/useClientSearch.spec.js +86 -0
  237. package/lib/hooks/useContextMentions.helpers.spec.js +267 -0
  238. package/lib/hooks/useContextMentions.spec.js +338 -0
  239. package/lib/hooks/useContextPinPopover.helpers.spec.js +183 -0
  240. package/lib/hooks/useContextPinPopover.spec.js +159 -0
  241. package/lib/hooks/useContinueLegacyContextInNewChat/index.js +2 -0
  242. package/lib/hooks/useContinueLegacyContextInNewChat/useContinueLegacyContextInNewChat.js +93 -0
  243. package/lib/hooks/useDebounce.spec.js +42 -0
  244. package/lib/hooks/useEntitySearch.helpers.spec.js +723 -0
  245. package/lib/hooks/useEntitySearch.spec.js +718 -0
  246. package/lib/hooks/useEvent.spec.js +45 -0
  247. package/lib/hooks/useFrequentlyAskedQuestions.spec.js +222 -0
  248. package/lib/hooks/useFrequentlyUsedActions.js +60 -22
  249. package/lib/hooks/useFrequentlyUsedActions.spec.js +135 -0
  250. package/lib/hooks/useIsMaiaPageRoute.js +26 -0
  251. package/lib/hooks/useIsMaiaPageRoute.spec.js +26 -0
  252. package/lib/hooks/useKnowledge/deleteKnowledge.spec.js +122 -0
  253. package/lib/hooks/useKnowledge/downloadKnowledge.spec.js +148 -0
  254. package/lib/hooks/useKnowledge/saveKnowledge.spec.js +104 -0
  255. package/lib/hooks/useKnowledge/useKnowledgeOperations.spec.js +178 -0
  256. package/lib/hooks/useMaiaChatSessionMeta/index.js +2 -0
  257. package/lib/hooks/useMaiaChatSessionMeta/useMaiaChatSessionMeta.js +24 -0
  258. package/lib/hooks/useMentionAllowedTypes.spec.js +89 -0
  259. package/lib/hooks/useMentionPopover.helpers.spec.js +100 -0
  260. package/lib/hooks/useMentionPopover.spec.js +392 -0
  261. package/lib/hooks/useMinimizedPillBottomOffset.helpers.spec.js +176 -0
  262. package/lib/hooks/useMinimizedPillBottomOffset.spec.js +89 -0
  263. package/lib/hooks/useMinimizedPillNoveltyDot/useMinimizedPillNoveltyDot.spec.js +67 -0
  264. package/lib/hooks/useModal/useModal.spec.js +73 -0
  265. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.helpers.spec.js +138 -0
  266. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.spec.js +417 -0
  267. package/lib/hooks/useProjectSearch.helpers.spec.js +89 -0
  268. package/lib/hooks/useProjectSearch.spec.js +91 -0
  269. package/lib/hooks/useProjectSummary.spec.js +193 -0
  270. package/lib/hooks/useProjectSummaryConfig.helpers.spec.js +151 -0
  271. package/lib/hooks/useProjectSummaryConfig.spec.js +133 -0
  272. package/lib/hooks/useReasoningTrace/reasoningStore.spec.js +112 -0
  273. package/lib/hooks/useRecentClientsSearch.helpers.spec.js +33 -0
  274. package/lib/hooks/useRecentClientsSearch.spec.js +85 -0
  275. package/lib/hooks/useRecentContexts.spec.js +139 -0
  276. package/lib/hooks/useResize.spec.js +37 -0
  277. package/lib/hooks/useSkillsCatalog.spec.js +88 -0
  278. package/lib/hooks/useSlashCommands.spec.js +139 -0
  279. package/lib/hooks/useSmoothStreamText/useSmoothStreamText.spec.js +101 -0
  280. package/lib/hooks/useSnackBarManager/useSnackBarManager.spec.js +33 -0
  281. package/lib/hooks/useStreamResponse.spec.js +199 -0
  282. package/lib/hooks/useT.spec.js +20 -0
  283. package/lib/hooks/useToggle.spec.js +33 -0
  284. package/lib/hooks/useToggleFavorite/useToggleFavorite.spec.js +171 -0
  285. package/lib/index.js +5 -2
  286. package/lib/lang/br/index.js +26 -1
  287. package/lib/lang/en/index.js +26 -1
  288. package/lib/lang/es/index.js +26 -1
  289. package/lib/lang/fr/index.js +26 -1
  290. package/lib/services/appcues.spec.js +37 -0
  291. package/lib/services/maia/Access/updateAccess.spec.js +137 -0
  292. package/lib/services/maia/Actions/getFrequentlyUsedActions.js +1 -1
  293. package/lib/services/maia/Actions/getFrequentlyUsedActions.spec.js +56 -0
  294. package/lib/services/maia/Actions/getSlashCommands.spec.js +91 -0
  295. package/lib/services/maia/Agents/connectors.spec.js +496 -0
  296. package/lib/services/maia/Agents/createAgent.spec.js +55 -0
  297. package/lib/services/maia/Agents/deleteAgent.spec.js +57 -0
  298. package/lib/services/maia/Agents/fetchAgentDetail.spec.js +108 -0
  299. package/lib/services/maia/Agents/getAgentById.spec.js +190 -0
  300. package/lib/services/maia/Agents/getAgentModels.spec.js +190 -0
  301. package/lib/services/maia/Agents/getAgentSuggestions.spec.js +89 -0
  302. package/lib/services/maia/Agents/getAgents.helpers.spec.js +325 -0
  303. package/lib/services/maia/Agents/getAgents.spec.js +1135 -0
  304. package/lib/services/maia/Agents/setAgentToolGroups.spec.js +45 -0
  305. package/lib/services/maia/Agents/toggleFavorite.spec.js +59 -0
  306. package/lib/services/maia/Agents/updateAgent.spec.js +48 -0
  307. package/lib/services/maia/Chats/deleteChat.spec.js +31 -0
  308. package/lib/services/maia/Chats/getChatMessages.spec.js +150 -0
  309. package/lib/services/maia/Chats/getChatsByUserId.spec.js +149 -0
  310. package/lib/services/maia/Chats/markSessionAsRead.spec.js +30 -0
  311. package/lib/services/maia/Chats/patchChat.spec.js +41 -0
  312. package/lib/services/maia/Chats/wasHelpfulChat.spec.js +28 -0
  313. package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.spec.js +58 -0
  314. package/lib/services/maia/Knowledge/delete.spec.js +45 -0
  315. package/lib/services/maia/Knowledge/download.spec.js +78 -0
  316. package/lib/services/maia/Knowledge/save.spec.js +58 -0
  317. package/lib/services/maia/Orchestrator/orchestrator.helpers.spec.js +225 -0
  318. package/lib/services/maia/Orchestrator/orchestrator.spec.js +181 -0
  319. package/lib/services/maia/RecentClients/getRecentClients.spec.js +52 -0
  320. package/lib/services/maia/RecentContexts/getRecentContexts.spec.js +103 -0
  321. package/lib/services/maia/RecentProjects/getRecentProjects.spec.js +82 -0
  322. package/lib/services/maia/RecentTasks/getRecentTasks.spec.js +63 -0
  323. package/lib/services/maia/RecentUsers/getRecentUsers.spec.js +82 -0
  324. package/lib/services/maia/Skills/createSkill.spec.js +68 -0
  325. package/lib/services/maia/Skills/deleteSkill.spec.js +42 -0
  326. package/lib/services/maia/Skills/generateSkill.spec.js +48 -0
  327. package/lib/services/maia/Skills/getSkills.spec.js +152 -0
  328. package/lib/services/maia/Skills/updateSkill.spec.js +62 -0
  329. package/lib/services/maia/client.spec.js +56 -0
  330. package/lib/services/utils/fetchCOR.spec.js +211 -0
  331. package/lib/services/utils/getCookie.spec.js +20 -0
  332. package/lib/services/utils/mapChatMessages.helpers.spec.js +336 -0
  333. package/lib/services/utils/mapChatMessages.spec.js +254 -0
  334. package/lib/store/chatsSidebarOptimistic.spec.js +145 -0
  335. package/lib/store/maiaLastChatPersistence.spec.js +22 -0
  336. package/lib/store/maiaPanelSessionPersistence.spec.js +62 -0
  337. package/lib/store/sessions/sessionNotificationSound.spec.js +145 -0
  338. package/lib/store/sessions/sessionNotifications.helpers.spec.js +63 -0
  339. package/lib/store/sessions/sessionNotifications.spec.js +106 -0
  340. package/lib/store/sessions/sessionStreamManager.helpers.spec.js +177 -0
  341. package/lib/store/sessions/sessionStreamManager.js +51 -55
  342. package/lib/store/sessions/sessionStreamManager.spec.js +939 -0
  343. package/lib/store/sessions/sessions.types.spec.js +16 -0
  344. package/lib/store/sessions/useSessionsStore.spec.js +135 -0
  345. package/lib/store/useChatsStore.spec.js +619 -0
  346. package/lib/store/useFaqsStore.spec.js +57 -0
  347. package/lib/styles/cascade.js +29 -3
  348. package/lib/styles/transitions.js +3 -1
  349. package/lib/types/global.d.js +1 -1
  350. package/lib/utils/actionCategoryMap.spec.js +18 -0
  351. package/lib/utils/agentDisplayName.spec.js +48 -0
  352. package/lib/utils/autoApproveStorage.spec.js +25 -0
  353. package/lib/utils/chatInputFiles.spec.js +39 -0
  354. package/lib/utils/contextMentionIcons.spec.js +41 -0
  355. package/lib/utils/contextMentionLabel.spec.js +13 -0
  356. package/lib/utils/contextMentionTriggers.spec.js +44 -0
  357. package/lib/utils/contextMentionTypeLabel.spec.js +14 -0
  358. package/lib/utils/corConnectorMentionTypes.spec.js +23 -0
  359. package/lib/utils/entityLinkRender.spec.js +72 -0
  360. package/lib/utils/fileDownloadHelper.spec.js +67 -0
  361. package/lib/utils/formatQuickActionMessage.spec.js +27 -0
  362. package/lib/utils/formatUnreadCount.spec.js +12 -0
  363. package/lib/utils/getUnitFileSize.spec.js +18 -0
  364. package/lib/utils/hitlAnalytics.spec.js +136 -0
  365. package/lib/utils/hoursPlannerQuickActionType.js +74 -1
  366. package/lib/utils/hoursPlannerQuickActionType.spec.js +64 -0
  367. package/lib/utils/imagePreprocessor.helpers.spec.js +28 -0
  368. package/lib/utils/imagePreprocessor.spec.js +112 -0
  369. package/lib/utils/maiaPageRoute.js +24 -0
  370. package/lib/utils/maiaPageRoute.spec.js +23 -0
  371. package/lib/utils/mapBackendLang.spec.js +19 -0
  372. package/lib/utils/navigateContextEntity.spec.js +50 -0
  373. package/lib/utils/normalizeAgentConnectors.spec.js +98 -0
  374. package/lib/utils/openTaskInCorPanel.spec.js +43 -0
  375. package/lib/utils/orchestratorSubagents.spec.js +32 -0
  376. package/lib/utils/reasoningMappers.spec.js +103 -0
  377. package/lib/utils/recentContextsHomeLimit.spec.js +32 -0
  378. package/lib/utils/renderContextMentions.helpers.spec.js +87 -0
  379. package/lib/utils/renderContextMentions.spec.js +268 -0
  380. package/lib/utils/retryCompletion.spec.js +181 -0
  381. package/lib/utils/skillContentSize.spec.js +13 -0
  382. package/lib/utils/slashCommandMarker.spec.js +43 -0
  383. package/lib/utils/sortManagerHoursHomeFuas.spec.js +51 -0
  384. package/lib/utils/sseStreamContent.spec.js +31 -0
  385. package/lib/utils/streamActivityMessages.helpers.js +3 -2
  386. package/lib/utils/streamActivityMessages.helpers.spec.js +84 -0
  387. package/lib/utils/streamActivityMessages.js +32 -20
  388. package/lib/utils/streamActivityMessages.spec.js +336 -0
  389. package/lib/utils/validateTrimmedFields.spec.js +26 -0
  390. package/package.json +1 -1
  391. package/README.md +0 -2
@@ -0,0 +1,1236 @@
1
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
4
+ 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; }
5
+ 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; }
6
+ import { act, fireEvent, renderWithProviders, screen, waitFor } from '../../../test/test-utils';
7
+ import { ensurePortalRoot } from '../../../test/portalRoot';
8
+ import { GlobalContextTestProvider } from '../../../test/global-context';
9
+ import { getAgentConnectors } from '../../../services/maia/Agents/connectors';
10
+ import { AbmAgentModal } from './AbmAgentModal';
11
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
12
+ var handleCreateAgent = jest.fn();
13
+ var handleUpdateAgent = jest.fn();
14
+ var handleSnackbarError = jest.fn();
15
+ var handleSnackbarSuccess = jest.fn();
16
+ var handleAccessClient = jest.fn();
17
+ var accessClientHook = {
18
+ success: false,
19
+ resetSuccessUpdateAccess: jest.fn(function () {
20
+ accessClientHook.success = false;
21
+ })
22
+ };
23
+ var createAgentHook = {
24
+ isLoading: false,
25
+ success: false,
26
+ resetSuccess: jest.fn(function () {
27
+ createAgentHook.success = false;
28
+ })
29
+ };
30
+ var deleteAgentHook = {
31
+ success: false,
32
+ resetSuccess: jest.fn(function () {
33
+ deleteAgentHook.success = false;
34
+ })
35
+ };
36
+ var updateAgentHook = {
37
+ success: false,
38
+ resetSuccess: jest.fn(function () {
39
+ updateAgentHook.success = false;
40
+ })
41
+ };
42
+ var mockedGetAgentConnectors = getAgentConnectors;
43
+ jest.mock('../../../services/maia/Agents/connectors', function () {
44
+ return {
45
+ getAgentConnectors: jest.fn()
46
+ };
47
+ });
48
+ jest.mock('@projectcor/cor-commons/lib/components/spinner-lottie', function () {
49
+ return {
50
+ SpinnerLottie: function SpinnerLottie() {
51
+ return /*#__PURE__*/_jsx("div", {
52
+ children: "spinner"
53
+ });
54
+ }
55
+ };
56
+ });
57
+ jest.mock('../../../hooks/useEvent', function () {
58
+ return {
59
+ EVENTS: {
60
+ confirmAction: 'AI_CHAT_ABM_CONFIRM',
61
+ "delete": 'AI_CHAT_ABM_DELETE_AGENT'
62
+ },
63
+ useEvent: function useEvent() {
64
+ return jest.fn();
65
+ }
66
+ };
67
+ });
68
+ jest.mock('../../../hooks/useSnackBarManager/useSnackBarManager', function () {
69
+ return {
70
+ useSnackBarManager: function useSnackBarManager() {
71
+ return {
72
+ handleSnackbarError: handleSnackbarError,
73
+ handleSnackbarSuccess: handleSnackbarSuccess
74
+ };
75
+ }
76
+ };
77
+ });
78
+ jest.mock('../../../context/cor-user', function () {
79
+ return {
80
+ useUser: function useUser() {
81
+ return {
82
+ id: 99,
83
+ permissions: {
84
+ ai_agents: {
85
+ create: true,
86
+ edit: true,
87
+ "delete": true
88
+ }
89
+ }
90
+ };
91
+ }
92
+ };
93
+ });
94
+ jest.mock('../../../hooks/useMaiaTaskPanelZIndex', function () {
95
+ return {
96
+ useMaiaTaskPanelZIndex: function useMaiaTaskPanelZIndex() {
97
+ return 1200;
98
+ }
99
+ };
100
+ });
101
+ jest.mock('../../../services/maia/Agents/getAgentById', function () {
102
+ return {
103
+ useGetAgentById: function useGetAgentById() {
104
+ return {
105
+ loading: false,
106
+ handleGetAgentById: jest.fn(),
107
+ agent: null,
108
+ handleCleanAgent: jest.fn(),
109
+ error: null
110
+ };
111
+ }
112
+ };
113
+ });
114
+ jest.mock('../../../hooks/useAgentModel/useAgentModel', function () {
115
+ var agentModels = [{
116
+ id: 1,
117
+ display_name: 'GPT',
118
+ model_name: 'gpt'
119
+ }];
120
+ return {
121
+ useAgentModel: function useAgentModel() {
122
+ return {
123
+ agentModels: agentModels,
124
+ getAllAgentModels: jest.fn()
125
+ };
126
+ }
127
+ };
128
+ });
129
+ jest.mock('../../../hooks/useAgentModel/useCreateAgent', function () {
130
+ return {
131
+ useCreateAgent: function useCreateAgent() {
132
+ return {
133
+ handleCreateAgent: handleCreateAgent,
134
+ isLoading: createAgentHook.isLoading,
135
+ success: createAgentHook.success,
136
+ resetSuccess: createAgentHook.resetSuccess
137
+ };
138
+ }
139
+ };
140
+ });
141
+ jest.mock('../../../hooks/useAgentModel/useUpdateAgent', function () {
142
+ return {
143
+ useUpdateAgent: function useUpdateAgent() {
144
+ return {
145
+ handleUpdateAgent: handleUpdateAgent,
146
+ success: updateAgentHook.success,
147
+ resetSuccess: updateAgentHook.resetSuccess
148
+ };
149
+ }
150
+ };
151
+ });
152
+ jest.mock('../../../hooks/useAgentModel/useDeleteAgent', function () {
153
+ return {
154
+ useDeleteAgent: function useDeleteAgent() {
155
+ return {
156
+ handleDeleteAgent: jest.fn(),
157
+ success: deleteAgentHook.success,
158
+ resetSuccess: deleteAgentHook.resetSuccess
159
+ };
160
+ }
161
+ };
162
+ });
163
+ var knowledgeOperationsHook = {
164
+ isLoading: false,
165
+ error: null,
166
+ successDelete: false
167
+ };
168
+ jest.mock('../../../hooks/useKnowledge', function () {
169
+ return {
170
+ useKnowledgeOperations: function useKnowledgeOperations() {
171
+ return {
172
+ handleCreateKnowledges: jest.fn(),
173
+ handleDeleteKnowledges: jest.fn(),
174
+ handleDeleteAndCreateKnowledges: jest.fn(),
175
+ isLoading: knowledgeOperationsHook.isLoading,
176
+ error: knowledgeOperationsHook.error,
177
+ successDelete: knowledgeOperationsHook.successDelete,
178
+ handleResetSuccessSave: jest.fn(),
179
+ handleResetSuccessDelete: jest.fn()
180
+ };
181
+ }
182
+ };
183
+ });
184
+ jest.mock('../../../hooks/useAccessClient/useAccessClient', function () {
185
+ return {
186
+ useAccessClient: function useAccessClient() {
187
+ return {
188
+ handleAccessClient: handleAccessClient,
189
+ isLoading: false,
190
+ success: accessClientHook.success,
191
+ handleResetSuccess: accessClientHook.resetSuccessUpdateAccess
192
+ };
193
+ }
194
+ };
195
+ });
196
+ jest.mock('../../../hooks', function () {
197
+ return {
198
+ useToggleFavorite: function useToggleFavorite() {
199
+ return {
200
+ toggleFavorite: jest.fn()
201
+ };
202
+ }
203
+ };
204
+ });
205
+ jest.mock('../../molecules/AbmSection', function () {
206
+ return {
207
+ AbmGeneralSection: function AbmGeneralSection(_ref) {
208
+ var values = _ref.values,
209
+ handleSetAgentValues = _ref.handleSetAgentValues;
210
+ return /*#__PURE__*/_jsxs("div", {
211
+ children: [/*#__PURE__*/_jsx("input", {
212
+ "aria-label": "agent-name",
213
+ value: values.general.name || '',
214
+ onChange: function onChange(event) {
215
+ return handleSetAgentValues({
216
+ key: 'name',
217
+ value: event.target.value
218
+ });
219
+ }
220
+ }), /*#__PURE__*/_jsx("textarea", {
221
+ "aria-label": "agent-prompt",
222
+ value: values.general.userPrompt || '',
223
+ onChange: function onChange(event) {
224
+ return handleSetAgentValues({
225
+ key: 'userPrompt',
226
+ value: event.target.value
227
+ });
228
+ }
229
+ })]
230
+ });
231
+ },
232
+ AbmKnowledgeSection: function AbmKnowledgeSection(_ref2) {
233
+ var handleSetAgentValues = _ref2.handleSetAgentValues;
234
+ return /*#__PURE__*/_jsxs("div", {
235
+ children: ["knowledge", /*#__PURE__*/_jsx("button", {
236
+ type: "button",
237
+ onClick: function onClick() {
238
+ return handleSetAgentValues({
239
+ key: 'knowledge',
240
+ value: [{
241
+ id: 'file-1',
242
+ name: 'guide.pdf',
243
+ size: 10,
244
+ type: 'application/pdf',
245
+ status: 'pending',
246
+ file: new File([], 'guide.pdf')
247
+ }]
248
+ });
249
+ },
250
+ children: "add-knowledge-file"
251
+ })]
252
+ });
253
+ }
254
+ };
255
+ });
256
+ jest.mock('../../molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection', function () {
257
+ return {
258
+ AbmAccessibilitySection: function AbmAccessibilitySection(_ref3) {
259
+ var _values$accessibility, _values$accessibility2;
260
+ var values = _ref3.values,
261
+ handleSetAgentValues = _ref3.handleSetAgentValues;
262
+ return /*#__PURE__*/_jsxs("div", {
263
+ children: ["accessibility", /*#__PURE__*/_jsxs("span", {
264
+ "data-testid": "accessibility-state",
265
+ children: [(_values$accessibility = values.accessibility) === null || _values$accessibility === void 0 || (_values$accessibility = _values$accessibility.selectedConnectors) === null || _values$accessibility === void 0 ? void 0 : _values$accessibility.join(','), ":", (_values$accessibility2 = values.accessibility) === null || _values$accessibility2 === void 0 || (_values$accessibility2 = _values$accessibility2.connectorStatuses) === null || _values$accessibility2 === void 0 ? void 0 : _values$accessibility2.netsuite]
266
+ }), /*#__PURE__*/_jsx("button", {
267
+ type: "button",
268
+ onClick: function onClick() {
269
+ return handleSetAgentValues({
270
+ key: 'accessibility',
271
+ value: {
272
+ accessType: 'clients',
273
+ clients: [{
274
+ id: '1',
275
+ name: 'Active Co',
276
+ is_active: true,
277
+ is_deleted: false
278
+ }],
279
+ corAccess: {
280
+ clientes: true,
281
+ proyectos: false,
282
+ tareas: false
283
+ }
284
+ }
285
+ });
286
+ },
287
+ children: "set-client-access"
288
+ })]
289
+ });
290
+ }
291
+ };
292
+ });
293
+ jest.mock('../../molecules/AbmSection/AbmLoaderFiles', function () {
294
+ return {
295
+ AbmLoaderFiles: function AbmLoaderFiles(_ref4) {
296
+ var onTimeout = _ref4.onTimeout;
297
+ return /*#__PURE__*/_jsxs("div", {
298
+ children: ["loader-files", /*#__PURE__*/_jsx("button", {
299
+ type: "button",
300
+ onClick: onTimeout,
301
+ children: "files-timeout"
302
+ })]
303
+ });
304
+ }
305
+ };
306
+ });
307
+ jest.mock('../DeleteQuestionModal/DeleteQuestionModal', function () {
308
+ return {
309
+ DeleteQuestionModal: function DeleteQuestionModal() {
310
+ return /*#__PURE__*/_jsx("div", {
311
+ children: "delete-modal"
312
+ });
313
+ }
314
+ };
315
+ });
316
+ var flags = window;
317
+ var openAgent = function openAgent() {
318
+ var _ref5 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
319
+ values = _ref5.values,
320
+ initialSection = _ref5.initialSection,
321
+ prefetchedAgentById = _ref5.prefetchedAgentById;
322
+ act(function () {
323
+ document.dispatchEvent(new CustomEvent('abm-agent-modal-set-values', {
324
+ detail: {
325
+ agentValues: {
326
+ values: values !== null && values !== void 0 ? values : {
327
+ isEditing: false,
328
+ general: {
329
+ name: '',
330
+ userPrompt: ''
331
+ }
332
+ },
333
+ initialSection: initialSection,
334
+ prefetchedAgentById: prefetchedAgentById
335
+ }
336
+ }
337
+ }));
338
+ });
339
+ };
340
+ var prefetchedCustomAgent = {
341
+ type: 'custom',
342
+ emoji: '🤖',
343
+ name: 'Support',
344
+ introduction: 'Hi',
345
+ inputPlaceholder: 'Ask',
346
+ isActive: true,
347
+ modelAiId: 1,
348
+ id: 'agent-1',
349
+ userPrompt: 'You help users',
350
+ is_favorite: false,
351
+ createdBy: 99,
352
+ knowledgeBases: [],
353
+ access: 'company',
354
+ clients: [],
355
+ toolGroupSlugs: []
356
+ };
357
+ var clickModalClose = function clickModalClose() {
358
+ var _title$parentElement;
359
+ var title = screen.getByText(/newAgent|editAgent/);
360
+ var header = (_title$parentElement = title.parentElement) === null || _title$parentElement === void 0 ? void 0 : _title$parentElement.parentElement;
361
+ var closeButton = header === null || header === void 0 ? void 0 : header.lastElementChild;
362
+ if (!closeButton) {
363
+ throw new Error('Close button not found');
364
+ }
365
+ fireEvent.click(closeButton);
366
+ };
367
+ var agentProps = {
368
+ addAgent: jest.fn(),
369
+ removeAgent: jest.fn(),
370
+ updateAgent: jest.fn(),
371
+ updateAgentFavorite: jest.fn(),
372
+ selectFirstAgent: jest.fn()
373
+ };
374
+ describe('AbmAgentModal', function () {
375
+ var cleanupPortal;
376
+ beforeEach(function () {
377
+ cleanupPortal = ensurePortalRoot('abm-agent-modal');
378
+ handleCreateAgent.mockClear();
379
+ handleUpdateAgent.mockClear();
380
+ handleSnackbarError.mockClear();
381
+ handleSnackbarSuccess.mockClear();
382
+ handleAccessClient.mockClear();
383
+ accessClientHook.success = false;
384
+ accessClientHook.resetSuccessUpdateAccess.mockClear();
385
+ createAgentHook.isLoading = false;
386
+ createAgentHook.success = false;
387
+ deleteAgentHook.success = false;
388
+ updateAgentHook.success = false;
389
+ delete flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS;
390
+ delete flags.MAIA_EXTERNAL_CONNECTORS;
391
+ mockedGetAgentConnectors.mockReset();
392
+ knowledgeOperationsHook.isLoading = false;
393
+ knowledgeOperationsHook.error = null;
394
+ knowledgeOperationsHook.successDelete = false;
395
+ jest.spyOn(window, 'confirm').mockReturnValue(true);
396
+ });
397
+ afterEach(function () {
398
+ jest.restoreAllMocks();
399
+ cleanupPortal();
400
+ });
401
+ it('stays closed until the open event', function () {
402
+ var _renderWithProviders = renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
403
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
404
+ })),
405
+ container = _renderWithProviders.container;
406
+ expect(container).toBeEmptyDOMElement();
407
+ });
408
+ it('keeps save disabled without name or prompt', function () {
409
+ renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
410
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
411
+ }));
412
+ openAgent();
413
+ expect(screen.getByRole('button', {
414
+ name: 'createAgentLabelButton'
415
+ })).toBeDisabled();
416
+ });
417
+ it('does not create without the multi-agents flag', function () {
418
+ renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
419
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
420
+ }));
421
+ openAgent();
422
+ fireEvent.change(screen.getByLabelText('agent-name'), {
423
+ target: {
424
+ value: 'Custom'
425
+ }
426
+ });
427
+ fireEvent.change(screen.getByLabelText('agent-prompt'), {
428
+ target: {
429
+ value: 'Sos un agente'
430
+ }
431
+ });
432
+ fireEvent.click(screen.getByRole('button', {
433
+ name: 'createAgentLabelButton'
434
+ }));
435
+ expect(handleCreateAgent).not.toHaveBeenCalled();
436
+ });
437
+ it('creates the agent when the flag is on and the form is valid', function () {
438
+ flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
439
+ renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
440
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
441
+ }));
442
+ openAgent();
443
+ fireEvent.change(screen.getByLabelText('agent-name'), {
444
+ target: {
445
+ value: 'Custom'
446
+ }
447
+ });
448
+ fireEvent.change(screen.getByLabelText('agent-prompt'), {
449
+ target: {
450
+ value: 'Sos un agente'
451
+ }
452
+ });
453
+ fireEvent.click(screen.getByRole('button', {
454
+ name: 'createAgentLabelButton'
455
+ }));
456
+ expect(handleCreateAgent).toHaveBeenCalled();
457
+ });
458
+ it('blocks edit when the multi-agents flag is off', function () {
459
+ renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
460
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
461
+ }));
462
+ openAgent({
463
+ values: {
464
+ isEditing: true,
465
+ general: {
466
+ id: 'a1',
467
+ name: 'X',
468
+ userPrompt: 'Y'
469
+ }
470
+ }
471
+ });
472
+ expect(handleSnackbarError).toHaveBeenCalledWith('errorAccessDenied');
473
+ expect(screen.queryByRole('button', {
474
+ name: 'saveChanges'
475
+ })).not.toBeInTheDocument();
476
+ });
477
+ it('switches sidebar sections', function () {
478
+ renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
479
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
480
+ }));
481
+ openAgent();
482
+ expect(screen.getByLabelText('agent-name')).toBeInTheDocument();
483
+ fireEvent.click(document.getElementById('abm-agent-modal-knowledge'));
484
+ expect(screen.getByText('knowledge')).toBeInTheDocument();
485
+ expect(screen.queryByLabelText('agent-name')).not.toBeInTheDocument();
486
+ fireEvent.click(document.getElementById('abm-agent-modal-accessibility'));
487
+ expect(screen.getByText('accessibility')).toBeInTheDocument();
488
+ });
489
+ it('opens on the requested initial section', function () {
490
+ renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
491
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
492
+ }));
493
+ openAgent({
494
+ initialSection: 'knowledge'
495
+ });
496
+ expect(screen.getByText('knowledge')).toBeInTheDocument();
497
+ });
498
+ it('closes the modal when there are no pending changes', function () {
499
+ renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
500
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
501
+ }));
502
+ openAgent();
503
+ clickModalClose();
504
+ expect(screen.queryByText('newAgent')).not.toBeInTheDocument();
505
+ expect(window.confirm).not.toHaveBeenCalled();
506
+ });
507
+ it('closes the modal when pending changes are confirmed on close', function () {
508
+ renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
509
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
510
+ }));
511
+ openAgent();
512
+ fireEvent.change(screen.getByLabelText('agent-name'), {
513
+ target: {
514
+ value: 'Draft'
515
+ }
516
+ });
517
+ clickModalClose();
518
+ expect(window.confirm).toHaveBeenCalled();
519
+ expect(screen.queryByText('newAgent')).not.toBeInTheDocument();
520
+ });
521
+ it('keeps the modal open when closing with pending changes is cancelled', function () {
522
+ jest.spyOn(window, 'confirm').mockReturnValue(false);
523
+ renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
524
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
525
+ }));
526
+ openAgent();
527
+ fireEvent.change(screen.getByLabelText('agent-name'), {
528
+ target: {
529
+ value: 'Draft'
530
+ }
531
+ });
532
+ clickModalClose();
533
+ expect(window.confirm).toHaveBeenCalled();
534
+ expect(screen.getByText('newAgent')).toBeInTheDocument();
535
+ });
536
+ it('loads edit mode from prefetched agent data when the flag is on', function () {
537
+ flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
538
+ renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
539
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
540
+ }));
541
+ openAgent({
542
+ values: {
543
+ isEditing: true,
544
+ general: {
545
+ id: 'agent-1'
546
+ }
547
+ },
548
+ prefetchedAgentById: prefetchedCustomAgent
549
+ });
550
+ expect(screen.getByText('editAgent')).toBeInTheDocument();
551
+ expect(screen.getByLabelText('agent-name')).toHaveValue('Support');
552
+ expect(screen.getByRole('button', {
553
+ name: 'saveChanges'
554
+ })).toBeDisabled();
555
+ expect(screen.getByRole('button', {
556
+ name: 'deleteAgent'
557
+ })).toBeInTheDocument();
558
+ });
559
+ it('fetches external connectors when opening edit mode with the connectors feature', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
560
+ return _regeneratorRuntime.wrap(function (_context) {
561
+ while (1) switch (_context.prev = _context.next) {
562
+ case 0:
563
+ flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
564
+ flags.MAIA_EXTERNAL_CONNECTORS = true;
565
+ mockedGetAgentConnectors.mockResolvedValue([{
566
+ slug: 'jira_cloud',
567
+ requires_auth: false,
568
+ enabled_for_agent: true,
569
+ user_authorized: false
570
+ }]);
571
+ renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
572
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
573
+ }));
574
+ openAgent({
575
+ values: {
576
+ isEditing: true,
577
+ general: {
578
+ id: 'agent-1'
579
+ }
580
+ },
581
+ prefetchedAgentById: prefetchedCustomAgent
582
+ });
583
+ _context.next = 1;
584
+ return waitFor(function () {
585
+ expect(mockedGetAgentConnectors).toHaveBeenCalledWith('agent-1');
586
+ });
587
+ case 1:
588
+ case "end":
589
+ return _context.stop();
590
+ }
591
+ }, _callee);
592
+ })));
593
+ it('updates the agent after editing prefetched data', function () {
594
+ flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
595
+ renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
596
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
597
+ }));
598
+ openAgent({
599
+ values: {
600
+ isEditing: true,
601
+ general: {
602
+ id: 'agent-1'
603
+ }
604
+ },
605
+ prefetchedAgentById: prefetchedCustomAgent
606
+ });
607
+ fireEvent.change(screen.getByLabelText('agent-name'), {
608
+ target: {
609
+ value: 'Support v2'
610
+ }
611
+ });
612
+ fireEvent.click(screen.getByRole('button', {
613
+ name: 'saveChanges'
614
+ }));
615
+ expect(handleUpdateAgent).toHaveBeenCalled();
616
+ });
617
+ it('keeps save disabled when selected clients are inactive', function () {
618
+ flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
619
+ renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
620
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
621
+ }));
622
+ openAgent({
623
+ values: {
624
+ isEditing: true,
625
+ general: {
626
+ id: 'agent-1',
627
+ name: 'Support',
628
+ userPrompt: 'Help'
629
+ },
630
+ accessibility: {
631
+ accessType: 'clients',
632
+ clients: [{
633
+ id: '1',
634
+ name: 'Inactive Co',
635
+ is_active: false,
636
+ is_deleted: false
637
+ }]
638
+ }
639
+ },
640
+ prefetchedAgentById: _objectSpread(_objectSpread({}, prefetchedCustomAgent), {}, {
641
+ access: 'clients',
642
+ clients: [{
643
+ id: 1,
644
+ name: 'Inactive Co',
645
+ is_active: false,
646
+ is_deleted: false
647
+ }]
648
+ })
649
+ });
650
+ fireEvent.change(screen.getByLabelText('agent-name'), {
651
+ target: {
652
+ value: 'Support v2'
653
+ }
654
+ });
655
+ expect(screen.getByRole('button', {
656
+ name: 'saveChanges'
657
+ })).toBeDisabled();
658
+ });
659
+ it('opens the delete confirmation modal from edit mode', function () {
660
+ flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
661
+ renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
662
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
663
+ }));
664
+ openAgent({
665
+ values: {
666
+ isEditing: true,
667
+ general: {
668
+ id: 'agent-1'
669
+ }
670
+ },
671
+ prefetchedAgentById: prefetchedCustomAgent
672
+ });
673
+ fireEvent.click(screen.getByRole('button', {
674
+ name: 'deleteAgent'
675
+ }));
676
+ expect(screen.getByText('delete-modal')).toBeInTheDocument();
677
+ });
678
+ it('finishes the happy path after update succeeds', function () {
679
+ flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
680
+ var updateAgent = jest.fn();
681
+ var selectAgent = jest.fn();
682
+ var onRefetchSession = jest.fn();
683
+ document.addEventListener('refetch-session', onRefetchSession);
684
+ var selectedAgent = {
685
+ id: 'agent-1',
686
+ name: 'Support',
687
+ type: 'custom'
688
+ };
689
+ var _renderWithProviders2 = renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
690
+ value: {
691
+ agent: selectedAgent,
692
+ selectAgent: selectAgent
693
+ },
694
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
695
+ updateAgent: updateAgent
696
+ }))
697
+ })),
698
+ rerender = _renderWithProviders2.rerender;
699
+ openAgent({
700
+ values: {
701
+ isEditing: true,
702
+ general: {
703
+ id: 'agent-1'
704
+ }
705
+ },
706
+ prefetchedAgentById: prefetchedCustomAgent
707
+ });
708
+ fireEvent.change(screen.getByLabelText('agent-name'), {
709
+ target: {
710
+ value: 'Support v2'
711
+ }
712
+ });
713
+ fireEvent.click(screen.getByRole('button', {
714
+ name: 'saveChanges'
715
+ }));
716
+ expect(handleUpdateAgent).toHaveBeenCalled();
717
+ updateAgentHook.success = {
718
+ id: 'agent-1',
719
+ type: 'custom',
720
+ name: 'Support v2'
721
+ };
722
+ rerender(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
723
+ value: {
724
+ agent: selectedAgent,
725
+ selectAgent: selectAgent
726
+ },
727
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
728
+ updateAgent: updateAgent
729
+ }))
730
+ }));
731
+ expect(handleSnackbarSuccess).toHaveBeenCalledWith('confirmAgentUpdated');
732
+ expect(updateAgent).toHaveBeenCalledWith(expect.objectContaining({
733
+ id: 'agent-1',
734
+ name: 'Support v2'
735
+ }));
736
+ expect(selectAgent).toHaveBeenCalledWith(expect.objectContaining({
737
+ id: 'agent-1'
738
+ }));
739
+ expect(updateAgentHook.resetSuccess).toHaveBeenCalled();
740
+ expect(onRefetchSession).toHaveBeenCalledTimes(1);
741
+ expect(screen.queryByText('editAgent')).not.toBeInTheDocument();
742
+ document.removeEventListener('refetch-session', onRefetchSession);
743
+ });
744
+ it('finishes the happy path after create succeeds', function () {
745
+ flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
746
+ var addAgent = jest.fn();
747
+ var selectAgent = jest.fn();
748
+ var _renderWithProviders3 = renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
749
+ value: {
750
+ selectAgent: selectAgent
751
+ },
752
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
753
+ addAgent: addAgent
754
+ }))
755
+ })),
756
+ rerender = _renderWithProviders3.rerender;
757
+ openAgent();
758
+ fireEvent.change(screen.getByLabelText('agent-name'), {
759
+ target: {
760
+ value: 'Custom'
761
+ }
762
+ });
763
+ fireEvent.change(screen.getByLabelText('agent-prompt'), {
764
+ target: {
765
+ value: 'Sos un agente'
766
+ }
767
+ });
768
+ fireEvent.click(screen.getByRole('button', {
769
+ name: 'createAgentLabelButton'
770
+ }));
771
+ expect(handleCreateAgent).toHaveBeenCalled();
772
+ createAgentHook.success = {
773
+ id: 'created-1',
774
+ type: 'custom'
775
+ };
776
+ rerender(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
777
+ value: {
778
+ selectAgent: selectAgent
779
+ },
780
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
781
+ addAgent: addAgent
782
+ }))
783
+ }));
784
+ expect(handleSnackbarSuccess).toHaveBeenCalledWith('confirmAgentCreated');
785
+ expect(addAgent).toHaveBeenCalledWith(expect.objectContaining({
786
+ id: 'created-1'
787
+ }));
788
+ expect(selectAgent).toHaveBeenCalledWith(expect.objectContaining({
789
+ id: 'created-1'
790
+ }));
791
+ expect(createAgentHook.resetSuccess).toHaveBeenCalled();
792
+ expect(screen.queryByText('newAgent')).not.toBeInTheDocument();
793
+ });
794
+ it('closes and removes the agent after delete succeeds', function () {
795
+ flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
796
+ var removeAgent = jest.fn();
797
+ var _renderWithProviders4 = renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
798
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
799
+ removeAgent: removeAgent
800
+ }))
801
+ })),
802
+ rerender = _renderWithProviders4.rerender;
803
+ openAgent({
804
+ values: {
805
+ isEditing: true,
806
+ general: {
807
+ id: 'agent-1'
808
+ }
809
+ },
810
+ prefetchedAgentById: prefetchedCustomAgent
811
+ });
812
+ deleteAgentHook.success = true;
813
+ rerender(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
814
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
815
+ removeAgent: removeAgent
816
+ }))
817
+ }));
818
+ expect(handleSnackbarSuccess).toHaveBeenCalledWith('confirmAgentDeleted');
819
+ expect(removeAgent).toHaveBeenCalledWith('agent-1');
820
+ expect(deleteAgentHook.resetSuccess).toHaveBeenCalled();
821
+ expect(screen.queryByText('editAgent')).not.toBeInTheDocument();
822
+ });
823
+ it('requests client access after create when visibility is not company', function () {
824
+ flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
825
+ var _renderWithProviders5 = renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
826
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
827
+ })),
828
+ rerender = _renderWithProviders5.rerender;
829
+ openAgent({
830
+ values: {
831
+ isEditing: false,
832
+ general: {
833
+ name: '',
834
+ userPrompt: ''
835
+ },
836
+ accessibility: {
837
+ accessType: 'clients',
838
+ clients: [{
839
+ id: '1',
840
+ name: 'Active Co',
841
+ is_active: true,
842
+ is_deleted: false
843
+ }]
844
+ }
845
+ }
846
+ });
847
+ fireEvent.change(screen.getByLabelText('agent-name'), {
848
+ target: {
849
+ value: 'Custom'
850
+ }
851
+ });
852
+ fireEvent.change(screen.getByLabelText('agent-prompt'), {
853
+ target: {
854
+ value: 'Sos un agente'
855
+ }
856
+ });
857
+ fireEvent.click(screen.getByRole('button', {
858
+ name: 'createAgentLabelButton'
859
+ }));
860
+ createAgentHook.success = {
861
+ id: 'created-1',
862
+ type: 'custom'
863
+ };
864
+ rerender(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
865
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
866
+ }));
867
+ expect(handleAccessClient).toHaveBeenCalledWith('created-1', expect.objectContaining({
868
+ accessType: 'clients'
869
+ }));
870
+ expect(handleSnackbarSuccess).not.toHaveBeenCalledWith('confirmAgentCreated');
871
+ expect(screen.getByText('newAgent')).toBeInTheDocument();
872
+ });
873
+ it('closes edit after client access succeeds on update', function () {
874
+ flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
875
+ var updateAgent = jest.fn();
876
+ var selectAgent = jest.fn();
877
+ var _renderWithProviders6 = renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
878
+ value: {
879
+ agent: {
880
+ id: 'agent-1',
881
+ name: 'Support',
882
+ type: 'custom'
883
+ },
884
+ selectAgent: selectAgent
885
+ },
886
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
887
+ updateAgent: updateAgent
888
+ }))
889
+ })),
890
+ rerender = _renderWithProviders6.rerender;
891
+ openAgent({
892
+ values: {
893
+ isEditing: true,
894
+ general: {
895
+ id: 'agent-1'
896
+ }
897
+ },
898
+ prefetchedAgentById: prefetchedCustomAgent
899
+ });
900
+ fireEvent.change(screen.getByLabelText('agent-name'), {
901
+ target: {
902
+ value: 'Support v2'
903
+ }
904
+ });
905
+ fireEvent.click(document.getElementById('abm-agent-modal-accessibility'));
906
+ fireEvent.click(screen.getByRole('button', {
907
+ name: 'set-client-access'
908
+ }));
909
+ fireEvent.click(screen.getByRole('button', {
910
+ name: 'saveChanges'
911
+ }));
912
+ expect(handleUpdateAgent).toHaveBeenCalled();
913
+ updateAgentHook.success = {
914
+ id: 'agent-1',
915
+ type: 'custom',
916
+ name: 'Support v2'
917
+ };
918
+ rerender(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
919
+ value: {
920
+ agent: {
921
+ id: 'agent-1',
922
+ name: 'Support',
923
+ type: 'custom'
924
+ },
925
+ selectAgent: selectAgent
926
+ },
927
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
928
+ updateAgent: updateAgent
929
+ }))
930
+ }));
931
+ expect(handleAccessClient).toHaveBeenCalledWith('agent-1', expect.objectContaining({
932
+ accessType: 'clients'
933
+ }));
934
+ accessClientHook.success = {
935
+ ok: true
936
+ };
937
+ rerender(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
938
+ value: {
939
+ agent: {
940
+ id: 'agent-1',
941
+ name: 'Support',
942
+ type: 'custom'
943
+ },
944
+ selectAgent: selectAgent
945
+ },
946
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
947
+ updateAgent: updateAgent
948
+ }))
949
+ }));
950
+ expect(handleSnackbarSuccess).toHaveBeenCalledWith('confirmAgentUpdated');
951
+ expect(updateAgent).toHaveBeenCalledWith(expect.objectContaining({
952
+ id: 'agent-1'
953
+ }));
954
+ expect(selectAgent).toHaveBeenCalledWith(expect.objectContaining({
955
+ id: 'agent-1'
956
+ }));
957
+ expect(screen.queryByText('editAgent')).not.toBeInTheDocument();
958
+ });
959
+ it('closes create after client access succeeds', function () {
960
+ flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
961
+ var addAgent = jest.fn();
962
+ var selectAgent = jest.fn();
963
+ var _renderWithProviders7 = renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
964
+ value: {
965
+ selectAgent: selectAgent
966
+ },
967
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
968
+ addAgent: addAgent
969
+ }))
970
+ })),
971
+ rerender = _renderWithProviders7.rerender;
972
+ openAgent({
973
+ values: {
974
+ isEditing: false,
975
+ general: {
976
+ name: '',
977
+ userPrompt: ''
978
+ },
979
+ accessibility: {
980
+ accessType: 'clients',
981
+ clients: [{
982
+ id: '1',
983
+ name: 'Active Co',
984
+ is_active: true,
985
+ is_deleted: false
986
+ }]
987
+ }
988
+ }
989
+ });
990
+ fireEvent.change(screen.getByLabelText('agent-name'), {
991
+ target: {
992
+ value: 'Custom'
993
+ }
994
+ });
995
+ fireEvent.change(screen.getByLabelText('agent-prompt'), {
996
+ target: {
997
+ value: 'Sos un agente'
998
+ }
999
+ });
1000
+ fireEvent.click(screen.getByRole('button', {
1001
+ name: 'createAgentLabelButton'
1002
+ }));
1003
+ createAgentHook.success = {
1004
+ id: 'created-1',
1005
+ type: 'custom'
1006
+ };
1007
+ rerender(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
1008
+ value: {
1009
+ selectAgent: selectAgent
1010
+ },
1011
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
1012
+ addAgent: addAgent
1013
+ }))
1014
+ }));
1015
+ accessClientHook.success = {
1016
+ ok: true
1017
+ };
1018
+ rerender(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
1019
+ value: {
1020
+ selectAgent: selectAgent
1021
+ },
1022
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
1023
+ addAgent: addAgent
1024
+ }))
1025
+ }));
1026
+ expect(handleSnackbarSuccess).toHaveBeenCalledWith('confirmAgentCreated');
1027
+ expect(addAgent).toHaveBeenCalledWith(expect.objectContaining({
1028
+ id: 'created-1'
1029
+ }));
1030
+ expect(selectAgent).toHaveBeenCalledWith(expect.objectContaining({
1031
+ id: 'created-1'
1032
+ }));
1033
+ expect(accessClientHook.resetSuccessUpdateAccess).toHaveBeenCalled();
1034
+ expect(screen.queryByText('newAgent')).not.toBeInTheDocument();
1035
+ });
1036
+ it('closes create after knowledge processing times out', function () {
1037
+ flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
1038
+ var _renderWithProviders8 = renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
1039
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
1040
+ })),
1041
+ rerender = _renderWithProviders8.rerender;
1042
+ openAgent();
1043
+ fireEvent.change(screen.getByLabelText('agent-name'), {
1044
+ target: {
1045
+ value: 'Custom'
1046
+ }
1047
+ });
1048
+ fireEvent.change(screen.getByLabelText('agent-prompt'), {
1049
+ target: {
1050
+ value: 'Sos un agente'
1051
+ }
1052
+ });
1053
+ fireEvent.click(document.getElementById('abm-agent-modal-knowledge'));
1054
+ fireEvent.click(screen.getByRole('button', {
1055
+ name: 'add-knowledge-file'
1056
+ }));
1057
+ fireEvent.click(screen.getByRole('button', {
1058
+ name: 'createAgentLabelButton'
1059
+ }));
1060
+ createAgentHook.success = {
1061
+ id: 'created-1',
1062
+ type: 'custom'
1063
+ };
1064
+ rerender(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
1065
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
1066
+ }));
1067
+ expect(screen.getByText('loader-files')).toBeInTheDocument();
1068
+ fireEvent.click(screen.getByRole('button', {
1069
+ name: 'files-timeout'
1070
+ }));
1071
+ expect(handleSnackbarSuccess).toHaveBeenCalledWith('confirmAgentCreated');
1072
+ expect(createAgentHook.resetSuccess).toHaveBeenCalled();
1073
+ expect(screen.queryByText('newAgent')).not.toBeInTheDocument();
1074
+ });
1075
+ it('shows an error snackbar when knowledge operations fail', function () {
1076
+ flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
1077
+ var _renderWithProviders9 = renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
1078
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
1079
+ })),
1080
+ rerender = _renderWithProviders9.rerender;
1081
+ openAgent();
1082
+ knowledgeOperationsHook.error = 'upload failed';
1083
+ rerender(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
1084
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
1085
+ }));
1086
+ expect(handleSnackbarError).toHaveBeenCalledWith('confirmAgentWithFilesError');
1087
+ });
1088
+ it('closes edit after knowledge delete succeeds without pending uploads', function () {
1089
+ flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
1090
+ var _renderWithProviders0 = renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
1091
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
1092
+ })),
1093
+ rerender = _renderWithProviders0.rerender;
1094
+ openAgent({
1095
+ values: {
1096
+ isEditing: true,
1097
+ general: {
1098
+ id: 'agent-1'
1099
+ }
1100
+ },
1101
+ prefetchedAgentById: prefetchedCustomAgent
1102
+ });
1103
+ knowledgeOperationsHook.successDelete = true;
1104
+ rerender(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
1105
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
1106
+ }));
1107
+ expect(handleSnackbarSuccess).toHaveBeenCalledWith('confirmAgentUpdated');
1108
+ expect(screen.queryByText('editAgent')).not.toBeInTheDocument();
1109
+ });
1110
+ it('closes edit after knowledge processing times out', function () {
1111
+ flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
1112
+ var updateAgent = jest.fn();
1113
+ var _renderWithProviders1 = renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
1114
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
1115
+ updateAgent: updateAgent
1116
+ }))
1117
+ })),
1118
+ rerender = _renderWithProviders1.rerender;
1119
+ openAgent({
1120
+ values: {
1121
+ isEditing: true,
1122
+ general: {
1123
+ id: 'agent-1'
1124
+ }
1125
+ },
1126
+ prefetchedAgentById: prefetchedCustomAgent
1127
+ });
1128
+ fireEvent.change(screen.getByLabelText('agent-name'), {
1129
+ target: {
1130
+ value: 'Support v2'
1131
+ }
1132
+ });
1133
+ fireEvent.click(document.getElementById('abm-agent-modal-knowledge'));
1134
+ fireEvent.click(screen.getByRole('button', {
1135
+ name: 'add-knowledge-file'
1136
+ }));
1137
+ fireEvent.click(screen.getByRole('button', {
1138
+ name: 'saveChanges'
1139
+ }));
1140
+ updateAgentHook.success = {
1141
+ id: 'agent-1',
1142
+ type: 'custom',
1143
+ name: 'Support v2'
1144
+ };
1145
+ rerender(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
1146
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
1147
+ updateAgent: updateAgent
1148
+ }))
1149
+ }));
1150
+ expect(screen.getByText('loader-files')).toBeInTheDocument();
1151
+ fireEvent.click(screen.getByRole('button', {
1152
+ name: 'files-timeout'
1153
+ }));
1154
+ expect(handleSnackbarSuccess).toHaveBeenCalledWith('confirmAgentUpdated');
1155
+ expect(updateAgent).toHaveBeenCalledWith(expect.objectContaining({
1156
+ id: 'agent-1'
1157
+ }));
1158
+ expect(updateAgentHook.resetSuccess).toHaveBeenCalled();
1159
+ expect(screen.queryByText('editAgent')).not.toBeInTheDocument();
1160
+ });
1161
+ it('waits for connector status before showing an edited agent', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
1162
+ var resolveConnectors;
1163
+ return _regeneratorRuntime.wrap(function (_context3) {
1164
+ while (1) switch (_context3.prev = _context3.next) {
1165
+ case 0:
1166
+ flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
1167
+ flags.MAIA_EXTERNAL_CONNECTORS = true;
1168
+ resolveConnectors = function resolveConnectors() {};
1169
+ mockedGetAgentConnectors.mockReturnValue(new Promise(function (resolve) {
1170
+ resolveConnectors = resolve;
1171
+ }));
1172
+ renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
1173
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
1174
+ }));
1175
+ act(function () {
1176
+ document.dispatchEvent(new CustomEvent('abm-agent-modal-set-values', {
1177
+ detail: {
1178
+ agentValues: {
1179
+ values: {
1180
+ isEditing: true,
1181
+ general: {
1182
+ id: 'a1'
1183
+ }
1184
+ },
1185
+ initialSection: 'accessibility',
1186
+ prefetchedAgentById: {
1187
+ id: 'a1',
1188
+ type: 'custom',
1189
+ name: 'Agent',
1190
+ userPrompt: 'Prompt',
1191
+ modelAiId: 1,
1192
+ access: 'company',
1193
+ toolGroupSlugs: [],
1194
+ connectors: [{
1195
+ group: 'MCP',
1196
+ slugs: ['netsuite']
1197
+ }]
1198
+ }
1199
+ }
1200
+ }
1201
+ }));
1202
+ });
1203
+ expect(screen.getByText('spinner')).toBeInTheDocument();
1204
+ expect(screen.queryByTestId('accessibility-state')).not.toBeInTheDocument();
1205
+ _context3.next = 1;
1206
+ return act(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
1207
+ return _regeneratorRuntime.wrap(function (_context2) {
1208
+ while (1) switch (_context2.prev = _context2.next) {
1209
+ case 0:
1210
+ resolveConnectors([{
1211
+ id: 1,
1212
+ slug: 'netsuite',
1213
+ name: 'NetSuite',
1214
+ requires_auth: true,
1215
+ is_active: true,
1216
+ enabled_for_agent: true,
1217
+ user_authorized: false,
1218
+ connection_status: 'error'
1219
+ }]);
1220
+ case 1:
1221
+ case "end":
1222
+ return _context2.stop();
1223
+ }
1224
+ }, _callee2);
1225
+ })));
1226
+ case 1:
1227
+ expect(screen.getByTestId('accessibility-state')).toHaveTextContent('netsuite:error');
1228
+ expect(mockedGetAgentConnectors).toHaveBeenCalledTimes(1);
1229
+ case 2:
1230
+ case "end":
1231
+ return _context3.stop();
1232
+ }
1233
+ }, _callee3);
1234
+ })));
1235
+ });
1236
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhY3QiLCJmaXJlRXZlbnQiLCJyZW5kZXJXaXRoUHJvdmlkZXJzIiwic2NyZWVuIiwid2FpdEZvciIsImVuc3VyZVBvcnRhbFJvb3QiLCJHbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyIiwiZ2V0QWdlbnRDb25uZWN0b3JzIiwiQWJtQWdlbnRNb2RhbCIsImpzeCIsIl9qc3giLCJqc3hzIiwiX2pzeHMiLCJoYW5kbGVDcmVhdGVBZ2VudCIsImplc3QiLCJmbiIsImhhbmRsZVVwZGF0ZUFnZW50IiwiaGFuZGxlU25hY2tiYXJFcnJvciIsImhhbmRsZVNuYWNrYmFyU3VjY2VzcyIsImhhbmRsZUFjY2Vzc0NsaWVudCIsImFjY2Vzc0NsaWVudEhvb2siLCJzdWNjZXNzIiwicmVzZXRTdWNjZXNzVXBkYXRlQWNjZXNzIiwiY3JlYXRlQWdlbnRIb29rIiwiaXNMb2FkaW5nIiwicmVzZXRTdWNjZXNzIiwiZGVsZXRlQWdlbnRIb29rIiwidXBkYXRlQWdlbnRIb29rIiwibW9ja2VkR2V0QWdlbnRDb25uZWN0b3JzIiwibW9jayIsIlNwaW5uZXJMb3R0aWUiLCJjaGlsZHJlbiIsIkVWRU5UUyIsImNvbmZpcm1BY3Rpb24iLCJ1c2VFdmVudCIsInVzZVNuYWNrQmFyTWFuYWdlciIsInVzZVVzZXIiLCJpZCIsInBlcm1pc3Npb25zIiwiYWlfYWdlbnRzIiwiY3JlYXRlIiwiZWRpdCIsInVzZU1haWFUYXNrUGFuZWxaSW5kZXgiLCJ1c2VHZXRBZ2VudEJ5SWQiLCJsb2FkaW5nIiwiaGFuZGxlR2V0QWdlbnRCeUlkIiwiYWdlbnQiLCJoYW5kbGVDbGVhbkFnZW50IiwiZXJyb3IiLCJhZ2VudE1vZGVscyIsImRpc3BsYXlfbmFtZSIsIm1vZGVsX25hbWUiLCJ1c2VBZ2VudE1vZGVsIiwiZ2V0QWxsQWdlbnRNb2RlbHMiLCJ1c2VDcmVhdGVBZ2VudCIsInVzZVVwZGF0ZUFnZW50IiwidXNlRGVsZXRlQWdlbnQiLCJoYW5kbGVEZWxldGVBZ2VudCIsImtub3dsZWRnZU9wZXJhdGlvbnNIb29rIiwic3VjY2Vzc0RlbGV0ZSIsInVzZUtub3dsZWRnZU9wZXJhdGlvbnMiLCJoYW5kbGVDcmVhdGVLbm93bGVkZ2VzIiwiaGFuZGxlRGVsZXRlS25vd2xlZGdlcyIsImhhbmRsZURlbGV0ZUFuZENyZWF0ZUtub3dsZWRnZXMiLCJoYW5kbGVSZXNldFN1Y2Nlc3NTYXZlIiwiaGFuZGxlUmVzZXRTdWNjZXNzRGVsZXRlIiwidXNlQWNjZXNzQ2xpZW50IiwiaGFuZGxlUmVzZXRTdWNjZXNzIiwidXNlVG9nZ2xlRmF2b3JpdGUiLCJ0b2dnbGVGYXZvcml0ZSIsIkFibUdlbmVyYWxTZWN0aW9uIiwiX3JlZiIsInZhbHVlcyIsImhhbmRsZVNldEFnZW50VmFsdWVzIiwidmFsdWUiLCJnZW5lcmFsIiwibmFtZSIsIm9uQ2hhbmdlIiwiZXZlbnQiLCJrZXkiLCJ0YXJnZXQiLCJ1c2VyUHJvbXB0IiwiQWJtS25vd2xlZGdlU2VjdGlvbiIsIl9yZWYyIiwidHlwZSIsIm9uQ2xpY2siLCJzaXplIiwic3RhdHVzIiwiZmlsZSIsIkZpbGUiLCJBYm1BY2Nlc3NpYmlsaXR5U2VjdGlvbiIsIl9yZWYzIiwiX3ZhbHVlcyRhY2Nlc3NpYmlsaXR5IiwiX3ZhbHVlcyRhY2Nlc3NpYmlsaXR5MiIsImFjY2Vzc2liaWxpdHkiLCJzZWxlY3RlZENvbm5lY3RvcnMiLCJqb2luIiwiY29ubmVjdG9yU3RhdHVzZXMiLCJuZXRzdWl0ZSIsImFjY2Vzc1R5cGUiLCJjbGllbnRzIiwiaXNfYWN0aXZlIiwiaXNfZGVsZXRlZCIsImNvckFjY2VzcyIsImNsaWVudGVzIiwicHJveWVjdG9zIiwidGFyZWFzIiwiQWJtTG9hZGVyRmlsZXMiLCJfcmVmNCIsIm9uVGltZW91dCIsIkRlbGV0ZVF1ZXN0aW9uTW9kYWwiLCJmbGFncyIsIndpbmRvdyIsIm9wZW5BZ2VudCIsIl9yZWY1IiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwiaW5pdGlhbFNlY3Rpb24iLCJwcmVmZXRjaGVkQWdlbnRCeUlkIiwiZG9jdW1lbnQiLCJkaXNwYXRjaEV2ZW50IiwiQ3VzdG9tRXZlbnQiLCJkZXRhaWwiLCJhZ2VudFZhbHVlcyIsImlzRWRpdGluZyIsInByZWZldGNoZWRDdXN0b21BZ2VudCIsImVtb2ppIiwiaW50cm9kdWN0aW9uIiwiaW5wdXRQbGFjZWhvbGRlciIsImlzQWN0aXZlIiwibW9kZWxBaUlkIiwiaXNfZmF2b3JpdGUiLCJjcmVhdGVkQnkiLCJrbm93bGVkZ2VCYXNlcyIsImFjY2VzcyIsInRvb2xHcm91cFNsdWdzIiwiY2xpY2tNb2RhbENsb3NlIiwiX3RpdGxlJHBhcmVudEVsZW1lbnQiLCJ0aXRsZSIsImdldEJ5VGV4dCIsImhlYWRlciIsInBhcmVudEVsZW1lbnQiLCJjbG9zZUJ1dHRvbiIsImxhc3RFbGVtZW50Q2hpbGQiLCJFcnJvciIsImNsaWNrIiwiYWdlbnRQcm9wcyIsImFkZEFnZW50IiwicmVtb3ZlQWdlbnQiLCJ1cGRhdGVBZ2VudCIsInVwZGF0ZUFnZW50RmF2b3JpdGUiLCJzZWxlY3RGaXJzdEFnZW50IiwiZGVzY3JpYmUiLCJjbGVhbnVwUG9ydGFsIiwiYmVmb3JlRWFjaCIsIm1vY2tDbGVhciIsIk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMiLCJNQUlBX0VYVEVSTkFMX0NPTk5FQ1RPUlMiLCJtb2NrUmVzZXQiLCJzcHlPbiIsIm1vY2tSZXR1cm5WYWx1ZSIsImFmdGVyRWFjaCIsInJlc3RvcmVBbGxNb2NrcyIsIml0IiwiX3JlbmRlcldpdGhQcm92aWRlcnMiLCJfb2JqZWN0U3ByZWFkIiwiY29udGFpbmVyIiwiZXhwZWN0IiwidG9CZUVtcHR5RE9NRWxlbWVudCIsImdldEJ5Um9sZSIsInRvQmVEaXNhYmxlZCIsImNoYW5nZSIsImdldEJ5TGFiZWxUZXh0Iiwibm90IiwidG9IYXZlQmVlbkNhbGxlZCIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwicXVlcnlCeVJvbGUiLCJ0b0JlSW5UaGVEb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwicXVlcnlCeUxhYmVsVGV4dCIsInF1ZXJ5QnlUZXh0IiwiY29uZmlybSIsInRvSGF2ZVZhbHVlIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsIm1vY2tSZXNvbHZlZFZhbHVlIiwic2x1ZyIsInJlcXVpcmVzX2F1dGgiLCJlbmFibGVkX2Zvcl9hZ2VudCIsInVzZXJfYXV0aG9yaXplZCIsInN0b3AiLCJzZWxlY3RBZ2VudCIsIm9uUmVmZXRjaFNlc3Npb24iLCJhZGRFdmVudExpc3RlbmVyIiwic2VsZWN0ZWRBZ2VudCIsIl9yZW5kZXJXaXRoUHJvdmlkZXJzMiIsInJlcmVuZGVyIiwib2JqZWN0Q29udGFpbmluZyIsInRvSGF2ZUJlZW5DYWxsZWRUaW1lcyIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJfcmVuZGVyV2l0aFByb3ZpZGVyczMiLCJfcmVuZGVyV2l0aFByb3ZpZGVyczQiLCJfcmVuZGVyV2l0aFByb3ZpZGVyczUiLCJfcmVuZGVyV2l0aFByb3ZpZGVyczYiLCJvayIsIl9yZW5kZXJXaXRoUHJvdmlkZXJzNyIsIl9yZW5kZXJXaXRoUHJvdmlkZXJzOCIsIl9yZW5kZXJXaXRoUHJvdmlkZXJzOSIsIl9yZW5kZXJXaXRoUHJvdmlkZXJzMCIsIl9yZW5kZXJXaXRoUHJvdmlkZXJzMSIsIl9jYWxsZWUzIiwicmVzb2x2ZUNvbm5lY3RvcnMiLCJfY29udGV4dDMiLCJQcm9taXNlIiwicmVzb2x2ZSIsImNvbm5lY3RvcnMiLCJncm91cCIsInNsdWdzIiwicXVlcnlCeVRlc3RJZCIsIl9jYWxsZWUyIiwiX2NvbnRleHQyIiwiY29ubmVjdGlvbl9zdGF0dXMiLCJnZXRCeVRlc3RJZCIsInRvSGF2ZVRleHRDb250ZW50Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvb3JnYW5pc21zL0FibUFnZW50TW9kYWwvQWJtQWdlbnRNb2RhbC5zcGVjLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhY3QsIGZpcmVFdmVudCwgcmVuZGVyV2l0aFByb3ZpZGVycywgc2NyZWVuLCB3YWl0Rm9yIH0gZnJvbSAnLi4vLi4vLi4vdGVzdC90ZXN0LXV0aWxzJ1xuaW1wb3J0IHsgZW5zdXJlUG9ydGFsUm9vdCB9IGZyb20gJy4uLy4uLy4uL3Rlc3QvcG9ydGFsUm9vdCdcbmltcG9ydCB7IEdsb2JhbENvbnRleHRUZXN0UHJvdmlkZXIgfSBmcm9tICcuLi8uLi8uLi90ZXN0L2dsb2JhbC1jb250ZXh0J1xuaW1wb3J0IHsgZ2V0QWdlbnRDb25uZWN0b3JzLCB0eXBlIEFnZW50Q29ubmVjdG9yIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbWFpYS9BZ2VudHMvY29ubmVjdG9ycydcbmltcG9ydCB7IEFibUFnZW50TW9kYWwgfSBmcm9tICcuL0FibUFnZW50TW9kYWwnXG5cbmNvbnN0IGhhbmRsZUNyZWF0ZUFnZW50ID0gamVzdC5mbigpXG5jb25zdCBoYW5kbGVVcGRhdGVBZ2VudCA9IGplc3QuZm4oKVxuY29uc3QgaGFuZGxlU25hY2tiYXJFcnJvciA9IGplc3QuZm4oKVxuY29uc3QgaGFuZGxlU25hY2tiYXJTdWNjZXNzID0gamVzdC5mbigpXG5jb25zdCBoYW5kbGVBY2Nlc3NDbGllbnQgPSBqZXN0LmZuKClcblxuY29uc3QgYWNjZXNzQ2xpZW50SG9vayA9IHtcbiAgc3VjY2VzczogZmFsc2UgYXMgZmFsc2UgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgcmVzZXRTdWNjZXNzVXBkYXRlQWNjZXNzOiBqZXN0LmZuKCgpID0+IHtcbiAgICBhY2Nlc3NDbGllbnRIb29rLnN1Y2Nlc3MgPSBmYWxzZVxuICB9KSxcbn1cblxuY29uc3QgY3JlYXRlQWdlbnRIb29rID0ge1xuICBpc0xvYWRpbmc6IGZhbHNlLFxuICBzdWNjZXNzOiBmYWxzZSBhcyBmYWxzZSB8IHsgaWQ6IHN0cmluZzsgdHlwZTogc3RyaW5nIH0sXG4gIHJlc2V0U3VjY2VzczogamVzdC5mbigoKSA9PiB7XG4gICAgY3JlYXRlQWdlbnRIb29rLnN1Y2Nlc3MgPSBmYWxzZVxuICB9KSxcbn1cblxuY29uc3QgZGVsZXRlQWdlbnRIb29rID0ge1xuICBzdWNjZXNzOiBmYWxzZSxcbiAgcmVzZXRTdWNjZXNzOiBqZXN0LmZuKCgpID0+IHtcbiAgICBkZWxldGVBZ2VudEhvb2suc3VjY2VzcyA9IGZhbHNlXG4gIH0pLFxufVxuXG5jb25zdCB1cGRhdGVBZ2VudEhvb2sgPSB7XG4gIHN1Y2Nlc3M6IGZhbHNlIGFzIGZhbHNlIHwgeyBpZDogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9LFxuICByZXNldFN1Y2Nlc3M6IGplc3QuZm4oKCkgPT4ge1xuICAgIHVwZGF0ZUFnZW50SG9vay5zdWNjZXNzID0gZmFsc2VcbiAgfSksXG59XG5jb25zdCBtb2NrZWRHZXRBZ2VudENvbm5lY3RvcnMgPSBnZXRBZ2VudENvbm5lY3RvcnMgYXMgamVzdC5Nb2NrZWRGdW5jdGlvbjx0eXBlb2YgZ2V0QWdlbnRDb25uZWN0b3JzPlxuXG5qZXN0Lm1vY2soJy4uLy4uLy4uL3NlcnZpY2VzL21haWEvQWdlbnRzL2Nvbm5lY3RvcnMnLCAoKSA9PiAoe1xuICBnZXRBZ2VudENvbm5lY3RvcnM6IGplc3QuZm4oKSxcbn0pKVxuXG5qZXN0Lm1vY2soJ0Bwcm9qZWN0Y29yL2Nvci1jb21tb25zL2xpYi9jb21wb25lbnRzL3NwaW5uZXItbG90dGllJywgKCkgPT4gKHtcbiAgU3Bpbm5lckxvdHRpZTogKCkgPT4gPGRpdj5zcGlubmVyPC9kaXY+LFxufSkpXG5cbmplc3QubW9jaygnLi4vLi4vLi4vaG9va3MvdXNlRXZlbnQnLCAoKSA9PiAoe1xuICBFVkVOVFM6IHsgY29uZmlybUFjdGlvbjogJ0FJX0NIQVRfQUJNX0NPTkZJUk0nLCBkZWxldGU6ICdBSV9DSEFUX0FCTV9ERUxFVEVfQUdFTlQnIH0sXG4gIHVzZUV2ZW50OiAoKSA9PiBqZXN0LmZuKCksXG59KSlcblxuamVzdC5tb2NrKCcuLi8uLi8uLi9ob29rcy91c2VTbmFja0Jhck1hbmFnZXIvdXNlU25hY2tCYXJNYW5hZ2VyJywgKCkgPT4gKHtcbiAgdXNlU25hY2tCYXJNYW5hZ2VyOiAoKSA9PiAoe1xuICAgIGhhbmRsZVNuYWNrYmFyRXJyb3IsXG4gICAgaGFuZGxlU25hY2tiYXJTdWNjZXNzLFxuICB9KSxcbn0pKVxuXG5qZXN0Lm1vY2soJy4uLy4uLy4uL2NvbnRleHQvY29yLXVzZXInLCAoKSA9PiAoe1xuICB1c2VVc2VyOiAoKSA9PiAoe1xuICAgIGlkOiA5OSxcbiAgICBwZXJtaXNzaW9uczogeyBhaV9hZ2VudHM6IHsgY3JlYXRlOiB0cnVlLCBlZGl0OiB0cnVlLCBkZWxldGU6IHRydWUgfSB9LFxuICB9KSxcbn0pKVxuXG5qZXN0Lm1vY2soJy4uLy4uLy4uL2hvb2tzL3VzZU1haWFUYXNrUGFuZWxaSW5kZXgnLCAoKSA9PiAoe1xuICB1c2VNYWlhVGFza1BhbmVsWkluZGV4OiAoKSA9PiAxMjAwLFxufSkpXG5cbmplc3QubW9jaygnLi4vLi4vLi4vc2VydmljZXMvbWFpYS9BZ2VudHMvZ2V0QWdlbnRCeUlkJywgKCkgPT4gKHtcbiAgdXNlR2V0QWdlbnRCeUlkOiAoKSA9PiAoe1xuICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgIGhhbmRsZUdldEFnZW50QnlJZDogamVzdC5mbigpLFxuICAgIGFnZW50OiBudWxsLFxuICAgIGhhbmRsZUNsZWFuQWdlbnQ6IGplc3QuZm4oKSxcbiAgICBlcnJvcjogbnVsbCxcbiAgfSksXG59KSlcblxuamVzdC5tb2NrKCcuLi8uLi8uLi9ob29rcy91c2VBZ2VudE1vZGVsL3VzZUFnZW50TW9kZWwnLCAoKSA9PiB7XG4gIGNvbnN0IGFnZW50TW9kZWxzID0gW3sgaWQ6IDEsIGRpc3BsYXlfbmFtZTogJ0dQVCcsIG1vZGVsX25hbWU6ICdncHQnIH1dXG4gIHJldHVybiB7XG4gICAgdXNlQWdlbnRNb2RlbDogKCkgPT4gKHtcbiAgICAgIGFnZW50TW9kZWxzLFxuICAgICAgZ2V0QWxsQWdlbnRNb2RlbHM6IGplc3QuZm4oKSxcbiAgICB9KSxcbiAgfVxufSlcblxuamVzdC5tb2NrKCcuLi8uLi8uLi9ob29rcy91c2VBZ2VudE1vZGVsL3VzZUNyZWF0ZUFnZW50JywgKCkgPT4gKHtcbiAgdXNlQ3JlYXRlQWdlbnQ6ICgpID0+ICh7XG4gICAgaGFuZGxlQ3JlYXRlQWdlbnQsXG4gICAgaXNMb2FkaW5nOiBjcmVhdGVBZ2VudEhvb2suaXNMb2FkaW5nLFxuICAgIHN1Y2Nlc3M6IGNyZWF0ZUFnZW50SG9vay5zdWNjZXNzLFxuICAgIHJlc2V0U3VjY2VzczogY3JlYXRlQWdlbnRIb29rLnJlc2V0U3VjY2VzcyxcbiAgfSksXG59KSlcblxuamVzdC5tb2NrKCcuLi8uLi8uLi9ob29rcy91c2VBZ2VudE1vZGVsL3VzZVVwZGF0ZUFnZW50JywgKCkgPT4gKHtcbiAgdXNlVXBkYXRlQWdlbnQ6ICgpID0+ICh7XG4gICAgaGFuZGxlVXBkYXRlQWdlbnQsXG4gICAgc3VjY2VzczogdXBkYXRlQWdlbnRIb29rLnN1Y2Nlc3MsXG4gICAgcmVzZXRTdWNjZXNzOiB1cGRhdGVBZ2VudEhvb2sucmVzZXRTdWNjZXNzLFxuICB9KSxcbn0pKVxuXG5qZXN0Lm1vY2soJy4uLy4uLy4uL2hvb2tzL3VzZUFnZW50TW9kZWwvdXNlRGVsZXRlQWdlbnQnLCAoKSA9PiAoe1xuICB1c2VEZWxldGVBZ2VudDogKCkgPT4gKHtcbiAgICBoYW5kbGVEZWxldGVBZ2VudDogamVzdC5mbigpLFxuICAgIHN1Y2Nlc3M6IGRlbGV0ZUFnZW50SG9vay5zdWNjZXNzLFxuICAgIHJlc2V0U3VjY2VzczogZGVsZXRlQWdlbnRIb29rLnJlc2V0U3VjY2VzcyxcbiAgfSksXG59KSlcblxuY29uc3Qga25vd2xlZGdlT3BlcmF0aW9uc0hvb2sgPSB7XG4gIGlzTG9hZGluZzogZmFsc2UsXG4gIGVycm9yOiBudWxsIGFzIHN0cmluZyB8IG51bGwsXG4gIHN1Y2Nlc3NEZWxldGU6IGZhbHNlLFxufVxuXG5qZXN0Lm1vY2soJy4uLy4uLy4uL2hvb2tzL3VzZUtub3dsZWRnZScsICgpID0+ICh7XG4gIHVzZUtub3dsZWRnZU9wZXJhdGlvbnM6ICgpID0+ICh7XG4gICAgaGFuZGxlQ3JlYXRlS25vd2xlZGdlczogamVzdC5mbigpLFxuICAgIGhhbmRsZURlbGV0ZUtub3dsZWRnZXM6IGplc3QuZm4oKSxcbiAgICBoYW5kbGVEZWxldGVBbmRDcmVhdGVLbm93bGVkZ2VzOiBqZXN0LmZuKCksXG4gICAgaXNMb2FkaW5nOiBrbm93bGVkZ2VPcGVyYXRpb25zSG9vay5pc0xvYWRpbmcsXG4gICAgZXJyb3I6IGtub3dsZWRnZU9wZXJhdGlvbnNIb29rLmVycm9yLFxuICAgIHN1Y2Nlc3NEZWxldGU6IGtub3dsZWRnZU9wZXJhdGlvbnNIb29rLnN1Y2Nlc3NEZWxldGUsXG4gICAgaGFuZGxlUmVzZXRTdWNjZXNzU2F2ZTogamVzdC5mbigpLFxuICAgIGhhbmRsZVJlc2V0U3VjY2Vzc0RlbGV0ZTogamVzdC5mbigpLFxuICB9KSxcbn0pKVxuXG5qZXN0Lm1vY2soJy4uLy4uLy4uL2hvb2tzL3VzZUFjY2Vzc0NsaWVudC91c2VBY2Nlc3NDbGllbnQnLCAoKSA9PiAoe1xuICB1c2VBY2Nlc3NDbGllbnQ6ICgpID0+ICh7XG4gICAgaGFuZGxlQWNjZXNzQ2xpZW50LFxuICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgc3VjY2VzczogYWNjZXNzQ2xpZW50SG9vay5zdWNjZXNzLFxuICAgIGhhbmRsZVJlc2V0U3VjY2VzczogYWNjZXNzQ2xpZW50SG9vay5yZXNldFN1Y2Nlc3NVcGRhdGVBY2Nlc3MsXG4gIH0pLFxufSkpXG5cbmplc3QubW9jaygnLi4vLi4vLi4vaG9va3MnLCAoKSA9PiAoe1xuICB1c2VUb2dnbGVGYXZvcml0ZTogKCkgPT4gKHsgdG9nZ2xlRmF2b3JpdGU6IGplc3QuZm4oKSB9KSxcbn0pKVxuXG5qZXN0Lm1vY2soJy4uLy4uL21vbGVjdWxlcy9BYm1TZWN0aW9uJywgKCkgPT4gKHtcbiAgQWJtR2VuZXJhbFNlY3Rpb246ICh7XG4gICAgdmFsdWVzLFxuICAgIGhhbmRsZVNldEFnZW50VmFsdWVzLFxuICB9OiB7XG4gICAgdmFsdWVzOiB7IGdlbmVyYWw6IHsgbmFtZT86IHN0cmluZzsgdXNlclByb21wdD86IHN0cmluZyB8IG51bGwgfSB9XG4gICAgaGFuZGxlU2V0QWdlbnRWYWx1ZXM6IChwYXlsb2FkOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9KSA9PiB2b2lkXG4gIH0pID0+IChcbiAgICA8ZGl2PlxuICAgICAgPGlucHV0XG4gICAgICAgIGFyaWEtbGFiZWw9XCJhZ2VudC1uYW1lXCJcbiAgICAgICAgdmFsdWU9e3ZhbHVlcy5nZW5lcmFsLm5hbWUgfHwgJyd9XG4gICAgICAgIG9uQ2hhbmdlPXtldmVudCA9PiBoYW5kbGVTZXRBZ2VudFZhbHVlcyh7IGtleTogJ25hbWUnLCB2YWx1ZTogZXZlbnQudGFyZ2V0LnZhbHVlIH0pfVxuICAgICAgLz5cbiAgICAgIDx0ZXh0YXJlYVxuICAgICAgICBhcmlhLWxhYmVsPVwiYWdlbnQtcHJvbXB0XCJcbiAgICAgICAgdmFsdWU9e3ZhbHVlcy5nZW5lcmFsLnVzZXJQcm9tcHQgfHwgJyd9XG4gICAgICAgIG9uQ2hhbmdlPXtldmVudCA9PiBoYW5kbGVTZXRBZ2VudFZhbHVlcyh7IGtleTogJ3VzZXJQcm9tcHQnLCB2YWx1ZTogZXZlbnQudGFyZ2V0LnZhbHVlIH0pfVxuICAgICAgLz5cbiAgICA8L2Rpdj5cbiAgKSxcbiAgQWJtS25vd2xlZGdlU2VjdGlvbjogKHtcbiAgICBoYW5kbGVTZXRBZ2VudFZhbHVlcyxcbiAgfToge1xuICAgIGhhbmRsZVNldEFnZW50VmFsdWVzOiAocGF5bG9hZDogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHVua25vd25bXTsgZGVsZXRlS25vd2xlZGdlPzogYm9vbGVhbiB9KSA9PiB2b2lkXG4gIH0pID0+IChcbiAgICA8ZGl2PlxuICAgICAga25vd2xlZGdlXG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgIGhhbmRsZVNldEFnZW50VmFsdWVzKHtcbiAgICAgICAgICAgIGtleTogJ2tub3dsZWRnZScsXG4gICAgICAgICAgICB2YWx1ZTogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWQ6ICdmaWxlLTEnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdndWlkZS5wZGYnLFxuICAgICAgICAgICAgICAgIHNpemU6IDEwLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdhcHBsaWNhdGlvbi9wZGYnLFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ3BlbmRpbmcnLFxuICAgICAgICAgICAgICAgIGZpbGU6IG5ldyBGaWxlKFtdLCAnZ3VpZGUucGRmJyksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgID5cbiAgICAgICAgYWRkLWtub3dsZWRnZS1maWxlXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgKSxcbn0pKVxuXG5qZXN0Lm1vY2soJy4uLy4uL21vbGVjdWxlcy9BYm1TZWN0aW9uL0FibUFjY2Vzc2liaWxpdHlTZWN0aW9uL0FibUFjY2Vzc2liaWxpdHlTZWN0aW9uJywgKCkgPT4gKHtcbiAgQWJtQWNjZXNzaWJpbGl0eVNlY3Rpb246ICh7XG4gICAgdmFsdWVzLFxuICAgIGhhbmRsZVNldEFnZW50VmFsdWVzLFxuICB9OiB7XG4gICAgdmFsdWVzOiB7IGFjY2Vzc2liaWxpdHk/OiB7IHNlbGVjdGVkQ29ubmVjdG9ycz86IHN0cmluZ1tdOyBjb25uZWN0b3JTdGF0dXNlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfSB9XG4gICAgaGFuZGxlU2V0QWdlbnRWYWx1ZXM6IChwYXlsb2FkOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9KSA9PiB2b2lkXG4gIH0pID0+IChcbiAgICA8ZGl2PlxuICAgICAgYWNjZXNzaWJpbGl0eVxuICAgICAgPHNwYW4gZGF0YS10ZXN0aWQ9XCJhY2Nlc3NpYmlsaXR5LXN0YXRlXCI+XG4gICAgICAgIHt2YWx1ZXMuYWNjZXNzaWJpbGl0eT8uc2VsZWN0ZWRDb25uZWN0b3JzPy5qb2luKCcsJyl9Ont2YWx1ZXMuYWNjZXNzaWJpbGl0eT8uY29ubmVjdG9yU3RhdHVzZXM/Lm5ldHN1aXRlfVxuICAgICAgPC9zcGFuPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgb25DbGljaz17KCkgPT5cbiAgICAgICAgICBoYW5kbGVTZXRBZ2VudFZhbHVlcyh7XG4gICAgICAgICAgICBrZXk6ICdhY2Nlc3NpYmlsaXR5JyxcbiAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgIGFjY2Vzc1R5cGU6ICdjbGllbnRzJyxcbiAgICAgICAgICAgICAgY2xpZW50czogW3sgaWQ6ICcxJywgbmFtZTogJ0FjdGl2ZSBDbycsIGlzX2FjdGl2ZTogdHJ1ZSwgaXNfZGVsZXRlZDogZmFsc2UgfV0sXG4gICAgICAgICAgICAgIGNvckFjY2VzczogeyBjbGllbnRlczogdHJ1ZSwgcHJveWVjdG9zOiBmYWxzZSwgdGFyZWFzOiBmYWxzZSB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICA+XG4gICAgICAgIHNldC1jbGllbnQtYWNjZXNzXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgKSxcbn0pKVxuXG5qZXN0Lm1vY2soJy4uLy4uL21vbGVjdWxlcy9BYm1TZWN0aW9uL0FibUxvYWRlckZpbGVzJywgKCkgPT4gKHtcbiAgQWJtTG9hZGVyRmlsZXM6ICh7IG9uVGltZW91dCB9OiB7IG9uVGltZW91dD86ICgpID0+IHZvaWQgfSkgPT4gKFxuICAgIDxkaXY+XG4gICAgICBsb2FkZXItZmlsZXNcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG9uQ2xpY2s9e29uVGltZW91dH0+XG4gICAgICAgIGZpbGVzLXRpbWVvdXRcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICApLFxufSkpXG5cbmplc3QubW9jaygnLi4vRGVsZXRlUXVlc3Rpb25Nb2RhbC9EZWxldGVRdWVzdGlvbk1vZGFsJywgKCkgPT4gKHtcbiAgRGVsZXRlUXVlc3Rpb25Nb2RhbDogKCkgPT4gPGRpdj5kZWxldGUtbW9kYWw8L2Rpdj4sXG59KSlcblxudHlwZSBNdWx0aUFnZW50V2luZG93ID0gV2luZG93ICYge1xuICBNQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTPzogYm9vbGVhblxuICBNQUlBX0VYVEVSTkFMX0NPTk5FQ1RPUlM/OiBib29sZWFuXG59XG5jb25zdCBmbGFncyA9IHdpbmRvdyBhcyBNdWx0aUFnZW50V2luZG93XG5cbnR5cGUgT3BlbkFnZW50T3B0aW9ucyA9IHtcbiAgdmFsdWVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgaW5pdGlhbFNlY3Rpb24/OiAnZ2VuZXJhbCcgfCAna25vd2xlZGdlJyB8ICdhY2Nlc3NpYmlsaXR5J1xuICBwcmVmZXRjaGVkQWdlbnRCeUlkPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbn1cblxuY29uc3Qgb3BlbkFnZW50ID0gKHsgdmFsdWVzLCBpbml0aWFsU2VjdGlvbiwgcHJlZmV0Y2hlZEFnZW50QnlJZCB9OiBPcGVuQWdlbnRPcHRpb25zID0ge30pID0+IHtcbiAgYWN0KCgpID0+IHtcbiAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdhYm0tYWdlbnQtbW9kYWwtc2V0LXZhbHVlcycsIHtcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgYWdlbnRWYWx1ZXM6IHtcbiAgICAgICAgICAgIHZhbHVlczogdmFsdWVzID8/IHsgaXNFZGl0aW5nOiBmYWxzZSwgZ2VuZXJhbDogeyBuYW1lOiAnJywgdXNlclByb21wdDogJycgfSB9LFxuICAgICAgICAgICAgaW5pdGlhbFNlY3Rpb24sXG4gICAgICAgICAgICBwcmVmZXRjaGVkQWdlbnRCeUlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIClcbiAgfSlcbn1cblxuY29uc3QgcHJlZmV0Y2hlZEN1c3RvbUFnZW50ID0ge1xuICB0eXBlOiAnY3VzdG9tJyxcbiAgZW1vamk6ICfwn6SWJyxcbiAgbmFtZTogJ1N1cHBvcnQnLFxuICBpbnRyb2R1Y3Rpb246ICdIaScsXG4gIGlucHV0UGxhY2Vob2xkZXI6ICdBc2snLFxuICBpc0FjdGl2ZTogdHJ1ZSxcbiAgbW9kZWxBaUlkOiAxLFxuICBpZDogJ2FnZW50LTEnLFxuICB1c2VyUHJvbXB0OiAnWW91IGhlbHAgdXNlcnMnLFxuICBpc19mYXZvcml0ZTogZmFsc2UsXG4gIGNyZWF0ZWRCeTogOTksXG4gIGtub3dsZWRnZUJhc2VzOiBbXSxcbiAgYWNjZXNzOiAnY29tcGFueScsXG4gIGNsaWVudHM6IFtdLFxuICB0b29sR3JvdXBTbHVnczogW10sXG59XG5cbmNvbnN0IGNsaWNrTW9kYWxDbG9zZSA9ICgpID0+IHtcbiAgY29uc3QgdGl0bGUgPSBzY3JlZW4uZ2V0QnlUZXh0KC9uZXdBZ2VudHxlZGl0QWdlbnQvKVxuICBjb25zdCBoZWFkZXIgPSB0aXRsZS5wYXJlbnRFbGVtZW50Py5wYXJlbnRFbGVtZW50XG4gIGNvbnN0IGNsb3NlQnV0dG9uID0gaGVhZGVyPy5sYXN0RWxlbWVudENoaWxkXG4gIGlmICghY2xvc2VCdXR0b24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nsb3NlIGJ1dHRvbiBub3QgZm91bmQnKVxuICB9XG4gIGZpcmVFdmVudC5jbGljayhjbG9zZUJ1dHRvbilcbn1cblxuY29uc3QgYWdlbnRQcm9wcyA9IHtcbiAgYWRkQWdlbnQ6IGplc3QuZm4oKSxcbiAgcmVtb3ZlQWdlbnQ6IGplc3QuZm4oKSxcbiAgdXBkYXRlQWdlbnQ6IGplc3QuZm4oKSxcbiAgdXBkYXRlQWdlbnRGYXZvcml0ZTogamVzdC5mbigpLFxuICBzZWxlY3RGaXJzdEFnZW50OiBqZXN0LmZuKCksXG59XG5cbmRlc2NyaWJlKCdBYm1BZ2VudE1vZGFsJywgKCkgPT4ge1xuICBsZXQgY2xlYW51cFBvcnRhbDogKCkgPT4gdm9pZFxuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIGNsZWFudXBQb3J0YWwgPSBlbnN1cmVQb3J0YWxSb290KCdhYm0tYWdlbnQtbW9kYWwnKVxuICAgIGhhbmRsZUNyZWF0ZUFnZW50Lm1vY2tDbGVhcigpXG4gICAgaGFuZGxlVXBkYXRlQWdlbnQubW9ja0NsZWFyKClcbiAgICBoYW5kbGVTbmFja2JhckVycm9yLm1vY2tDbGVhcigpXG4gICAgaGFuZGxlU25hY2tiYXJTdWNjZXNzLm1vY2tDbGVhcigpXG4gICAgaGFuZGxlQWNjZXNzQ2xpZW50Lm1vY2tDbGVhcigpXG4gICAgYWNjZXNzQ2xpZW50SG9vay5zdWNjZXNzID0gZmFsc2VcbiAgICBhY2Nlc3NDbGllbnRIb29rLnJlc2V0U3VjY2Vzc1VwZGF0ZUFjY2Vzcy5tb2NrQ2xlYXIoKVxuICAgIGNyZWF0ZUFnZW50SG9vay5pc0xvYWRpbmcgPSBmYWxzZVxuICAgIGNyZWF0ZUFnZW50SG9vay5zdWNjZXNzID0gZmFsc2VcbiAgICBkZWxldGVBZ2VudEhvb2suc3VjY2VzcyA9IGZhbHNlXG4gICAgdXBkYXRlQWdlbnRIb29rLnN1Y2Nlc3MgPSBmYWxzZVxuICAgIGRlbGV0ZSBmbGFncy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTXG4gICAgZGVsZXRlIGZsYWdzLk1BSUFfRVhURVJOQUxfQ09OTkVDVE9SU1xuICAgIG1vY2tlZEdldEFnZW50Q29ubmVjdG9ycy5tb2NrUmVzZXQoKVxuICAgIGtub3dsZWRnZU9wZXJhdGlvbnNIb29rLmlzTG9hZGluZyA9IGZhbHNlXG4gICAga25vd2xlZGdlT3BlcmF0aW9uc0hvb2suZXJyb3IgPSBudWxsXG4gICAga25vd2xlZGdlT3BlcmF0aW9uc0hvb2suc3VjY2Vzc0RlbGV0ZSA9IGZhbHNlXG4gICAgamVzdC5zcHlPbih3aW5kb3csICdjb25maXJtJykubW9ja1JldHVyblZhbHVlKHRydWUpXG4gIH0pXG5cbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBqZXN0LnJlc3RvcmVBbGxNb2NrcygpXG4gICAgY2xlYW51cFBvcnRhbCgpXG4gIH0pXG5cbiAgaXQoJ3N0YXlzIGNsb3NlZCB1bnRpbCB0aGUgb3BlbiBldmVudCcsICgpID0+IHtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyV2l0aFByb3ZpZGVycyhcbiAgICAgIDxHbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgICAgICA8QWJtQWdlbnRNb2RhbCB7Li4uYWdlbnRQcm9wc30gLz5cbiAgICAgIDwvR2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICApXG5cbiAgICBleHBlY3QoY29udGFpbmVyKS50b0JlRW1wdHlET01FbGVtZW50KClcbiAgfSlcblxuICBpdCgna2VlcHMgc2F2ZSBkaXNhYmxlZCB3aXRob3V0IG5hbWUgb3IgcHJvbXB0JywgKCkgPT4ge1xuICAgIHJlbmRlcldpdGhQcm92aWRlcnMoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuICAgIG9wZW5BZ2VudCgpXG5cbiAgICBleHBlY3Qoc2NyZWVuLmdldEJ5Um9sZSgnYnV0dG9uJywgeyBuYW1lOiAnY3JlYXRlQWdlbnRMYWJlbEJ1dHRvbicgfSkpLnRvQmVEaXNhYmxlZCgpXG4gIH0pXG5cbiAgaXQoJ2RvZXMgbm90IGNyZWF0ZSB3aXRob3V0IHRoZSBtdWx0aS1hZ2VudHMgZmxhZycsICgpID0+IHtcbiAgICByZW5kZXJXaXRoUHJvdmlkZXJzKFxuICAgICAgPEdsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgICAgIDxBYm1BZ2VudE1vZGFsIHsuLi5hZ2VudFByb3BzfSAvPlxuICAgICAgPC9HbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgIClcbiAgICBvcGVuQWdlbnQoKVxuXG4gICAgZmlyZUV2ZW50LmNoYW5nZShzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ2FnZW50LW5hbWUnKSwgeyB0YXJnZXQ6IHsgdmFsdWU6ICdDdXN0b20nIH0gfSlcbiAgICBmaXJlRXZlbnQuY2hhbmdlKHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnYWdlbnQtcHJvbXB0JyksIHsgdGFyZ2V0OiB7IHZhbHVlOiAnU29zIHVuIGFnZW50ZScgfSB9KVxuICAgIGZpcmVFdmVudC5jbGljayhzY3JlZW4uZ2V0QnlSb2xlKCdidXR0b24nLCB7IG5hbWU6ICdjcmVhdGVBZ2VudExhYmVsQnV0dG9uJyB9KSlcblxuICAgIGV4cGVjdChoYW5kbGVDcmVhdGVBZ2VudCkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKVxuICB9KVxuXG4gIGl0KCdjcmVhdGVzIHRoZSBhZ2VudCB3aGVuIHRoZSBmbGFnIGlzIG9uIGFuZCB0aGUgZm9ybSBpcyB2YWxpZCcsICgpID0+IHtcbiAgICBmbGFncy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTID0gdHJ1ZVxuICAgIHJlbmRlcldpdGhQcm92aWRlcnMoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuICAgIG9wZW5BZ2VudCgpXG5cbiAgICBmaXJlRXZlbnQuY2hhbmdlKHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnYWdlbnQtbmFtZScpLCB7IHRhcmdldDogeyB2YWx1ZTogJ0N1c3RvbScgfSB9KVxuICAgIGZpcmVFdmVudC5jaGFuZ2Uoc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdhZ2VudC1wcm9tcHQnKSwgeyB0YXJnZXQ6IHsgdmFsdWU6ICdTb3MgdW4gYWdlbnRlJyB9IH0pXG4gICAgZmlyZUV2ZW50LmNsaWNrKHNjcmVlbi5nZXRCeVJvbGUoJ2J1dHRvbicsIHsgbmFtZTogJ2NyZWF0ZUFnZW50TGFiZWxCdXR0b24nIH0pKVxuXG4gICAgZXhwZWN0KGhhbmRsZUNyZWF0ZUFnZW50KS50b0hhdmVCZWVuQ2FsbGVkKClcbiAgfSlcblxuICBpdCgnYmxvY2tzIGVkaXQgd2hlbiB0aGUgbXVsdGktYWdlbnRzIGZsYWcgaXMgb2ZmJywgKCkgPT4ge1xuICAgIHJlbmRlcldpdGhQcm92aWRlcnMoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuXG4gICAgb3BlbkFnZW50KHsgdmFsdWVzOiB7IGlzRWRpdGluZzogdHJ1ZSwgZ2VuZXJhbDogeyBpZDogJ2ExJywgbmFtZTogJ1gnLCB1c2VyUHJvbXB0OiAnWScgfSB9IH0pXG5cbiAgICBleHBlY3QoaGFuZGxlU25hY2tiYXJFcnJvcikudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2Vycm9yQWNjZXNzRGVuaWVkJylcbiAgICBleHBlY3Qoc2NyZWVuLnF1ZXJ5QnlSb2xlKCdidXR0b24nLCB7IG5hbWU6ICdzYXZlQ2hhbmdlcycgfSkpLm5vdC50b0JlSW5UaGVEb2N1bWVudCgpXG4gIH0pXG5cbiAgaXQoJ3N3aXRjaGVzIHNpZGViYXIgc2VjdGlvbnMnLCAoKSA9PiB7XG4gICAgcmVuZGVyV2l0aFByb3ZpZGVycyhcbiAgICAgIDxHbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgICAgICA8QWJtQWdlbnRNb2RhbCB7Li4uYWdlbnRQcm9wc30gLz5cbiAgICAgIDwvR2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICApXG4gICAgb3BlbkFnZW50KClcblxuICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ2FnZW50LW5hbWUnKSkudG9CZUluVGhlRG9jdW1lbnQoKVxuXG4gICAgZmlyZUV2ZW50LmNsaWNrKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhYm0tYWdlbnQtbW9kYWwta25vd2xlZGdlJykhKVxuICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdrbm93bGVkZ2UnKSkudG9CZUluVGhlRG9jdW1lbnQoKVxuICAgIGV4cGVjdChzY3JlZW4ucXVlcnlCeUxhYmVsVGV4dCgnYWdlbnQtbmFtZScpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKVxuXG4gICAgZmlyZUV2ZW50LmNsaWNrKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhYm0tYWdlbnQtbW9kYWwtYWNjZXNzaWJpbGl0eScpISlcbiAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgnYWNjZXNzaWJpbGl0eScpKS50b0JlSW5UaGVEb2N1bWVudCgpXG4gIH0pXG5cbiAgaXQoJ29wZW5zIG9uIHRoZSByZXF1ZXN0ZWQgaW5pdGlhbCBzZWN0aW9uJywgKCkgPT4ge1xuICAgIHJlbmRlcldpdGhQcm92aWRlcnMoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuXG4gICAgb3BlbkFnZW50KHsgaW5pdGlhbFNlY3Rpb246ICdrbm93bGVkZ2UnIH0pXG5cbiAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgna25vd2xlZGdlJykpLnRvQmVJblRoZURvY3VtZW50KClcbiAgfSlcblxuICBpdCgnY2xvc2VzIHRoZSBtb2RhbCB3aGVuIHRoZXJlIGFyZSBubyBwZW5kaW5nIGNoYW5nZXMnLCAoKSA9PiB7XG4gICAgcmVuZGVyV2l0aFByb3ZpZGVycyhcbiAgICAgIDxHbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgICAgICA8QWJtQWdlbnRNb2RhbCB7Li4uYWdlbnRQcm9wc30gLz5cbiAgICAgIDwvR2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICApXG4gICAgb3BlbkFnZW50KClcblxuICAgIGNsaWNrTW9kYWxDbG9zZSgpXG5cbiAgICBleHBlY3Qoc2NyZWVuLnF1ZXJ5QnlUZXh0KCduZXdBZ2VudCcpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKVxuICAgIGV4cGVjdCh3aW5kb3cuY29uZmlybSkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKVxuICB9KVxuXG4gIGl0KCdjbG9zZXMgdGhlIG1vZGFsIHdoZW4gcGVuZGluZyBjaGFuZ2VzIGFyZSBjb25maXJtZWQgb24gY2xvc2UnLCAoKSA9PiB7XG4gICAgcmVuZGVyV2l0aFByb3ZpZGVycyhcbiAgICAgIDxHbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgICAgICA8QWJtQWdlbnRNb2RhbCB7Li4uYWdlbnRQcm9wc30gLz5cbiAgICAgIDwvR2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICApXG4gICAgb3BlbkFnZW50KClcblxuICAgIGZpcmVFdmVudC5jaGFuZ2Uoc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdhZ2VudC1uYW1lJyksIHsgdGFyZ2V0OiB7IHZhbHVlOiAnRHJhZnQnIH0gfSlcbiAgICBjbGlja01vZGFsQ2xvc2UoKVxuXG4gICAgZXhwZWN0KHdpbmRvdy5jb25maXJtKS50b0hhdmVCZWVuQ2FsbGVkKClcbiAgICBleHBlY3Qoc2NyZWVuLnF1ZXJ5QnlUZXh0KCduZXdBZ2VudCcpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKVxuICB9KVxuXG4gIGl0KCdrZWVwcyB0aGUgbW9kYWwgb3BlbiB3aGVuIGNsb3Npbmcgd2l0aCBwZW5kaW5nIGNoYW5nZXMgaXMgY2FuY2VsbGVkJywgKCkgPT4ge1xuICAgIGplc3Quc3B5T24od2luZG93LCAnY29uZmlybScpLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSlcblxuICAgIHJlbmRlcldpdGhQcm92aWRlcnMoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuICAgIG9wZW5BZ2VudCgpXG5cbiAgICBmaXJlRXZlbnQuY2hhbmdlKHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnYWdlbnQtbmFtZScpLCB7IHRhcmdldDogeyB2YWx1ZTogJ0RyYWZ0JyB9IH0pXG4gICAgY2xpY2tNb2RhbENsb3NlKClcblxuICAgIGV4cGVjdCh3aW5kb3cuY29uZmlybSkudG9IYXZlQmVlbkNhbGxlZCgpXG4gICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoJ25ld0FnZW50JykpLnRvQmVJblRoZURvY3VtZW50KClcbiAgfSlcblxuICBpdCgnbG9hZHMgZWRpdCBtb2RlIGZyb20gcHJlZmV0Y2hlZCBhZ2VudCBkYXRhIHdoZW4gdGhlIGZsYWcgaXMgb24nLCAoKSA9PiB7XG4gICAgZmxhZ3MuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyA9IHRydWVcbiAgICByZW5kZXJXaXRoUHJvdmlkZXJzKFxuICAgICAgPEdsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgICAgIDxBYm1BZ2VudE1vZGFsIHsuLi5hZ2VudFByb3BzfSAvPlxuICAgICAgPC9HbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgIClcblxuICAgIG9wZW5BZ2VudCh7XG4gICAgICB2YWx1ZXM6IHsgaXNFZGl0aW5nOiB0cnVlLCBnZW5lcmFsOiB7IGlkOiAnYWdlbnQtMScgfSB9LFxuICAgICAgcHJlZmV0Y2hlZEFnZW50QnlJZDogcHJlZmV0Y2hlZEN1c3RvbUFnZW50LFxuICAgIH0pXG5cbiAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgnZWRpdEFnZW50JykpLnRvQmVJblRoZURvY3VtZW50KClcbiAgICBleHBlY3Qoc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdhZ2VudC1uYW1lJykpLnRvSGF2ZVZhbHVlKCdTdXBwb3J0JylcbiAgICBleHBlY3Qoc2NyZWVuLmdldEJ5Um9sZSgnYnV0dG9uJywgeyBuYW1lOiAnc2F2ZUNoYW5nZXMnIH0pKS50b0JlRGlzYWJsZWQoKVxuICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlSb2xlKCdidXR0b24nLCB7IG5hbWU6ICdkZWxldGVBZ2VudCcgfSkpLnRvQmVJblRoZURvY3VtZW50KClcbiAgfSlcblxuICBpdCgnZmV0Y2hlcyBleHRlcm5hbCBjb25uZWN0b3JzIHdoZW4gb3BlbmluZyBlZGl0IG1vZGUgd2l0aCB0aGUgY29ubmVjdG9ycyBmZWF0dXJlJywgYXN5bmMgKCkgPT4ge1xuICAgIGZsYWdzLk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMgPSB0cnVlXG4gICAgZmxhZ3MuTUFJQV9FWFRFUk5BTF9DT05ORUNUT1JTID0gdHJ1ZVxuICAgIG1vY2tlZEdldEFnZW50Q29ubmVjdG9ycy5tb2NrUmVzb2x2ZWRWYWx1ZShbXG4gICAgICB7IHNsdWc6ICdqaXJhX2Nsb3VkJywgcmVxdWlyZXNfYXV0aDogZmFsc2UsIGVuYWJsZWRfZm9yX2FnZW50OiB0cnVlLCB1c2VyX2F1dGhvcml6ZWQ6IGZhbHNlIH0sXG4gICAgXSlcblxuICAgIHJlbmRlcldpdGhQcm92aWRlcnMoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuXG4gICAgb3BlbkFnZW50KHtcbiAgICAgIHZhbHVlczogeyBpc0VkaXRpbmc6IHRydWUsIGdlbmVyYWw6IHsgaWQ6ICdhZ2VudC0xJyB9IH0sXG4gICAgICBwcmVmZXRjaGVkQWdlbnRCeUlkOiBwcmVmZXRjaGVkQ3VzdG9tQWdlbnQsXG4gICAgfSlcblxuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgZXhwZWN0KG1vY2tlZEdldEFnZW50Q29ubmVjdG9ycykudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2FnZW50LTEnKVxuICAgIH0pXG4gIH0pXG5cbiAgaXQoJ3VwZGF0ZXMgdGhlIGFnZW50IGFmdGVyIGVkaXRpbmcgcHJlZmV0Y2hlZCBkYXRhJywgKCkgPT4ge1xuICAgIGZsYWdzLk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMgPSB0cnVlXG4gICAgcmVuZGVyV2l0aFByb3ZpZGVycyhcbiAgICAgIDxHbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgICAgICA8QWJtQWdlbnRNb2RhbCB7Li4uYWdlbnRQcm9wc30gLz5cbiAgICAgIDwvR2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICApXG5cbiAgICBvcGVuQWdlbnQoe1xuICAgICAgdmFsdWVzOiB7IGlzRWRpdGluZzogdHJ1ZSwgZ2VuZXJhbDogeyBpZDogJ2FnZW50LTEnIH0gfSxcbiAgICAgIHByZWZldGNoZWRBZ2VudEJ5SWQ6IHByZWZldGNoZWRDdXN0b21BZ2VudCxcbiAgICB9KVxuXG4gICAgZmlyZUV2ZW50LmNoYW5nZShzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ2FnZW50LW5hbWUnKSwgeyB0YXJnZXQ6IHsgdmFsdWU6ICdTdXBwb3J0IHYyJyB9IH0pXG4gICAgZmlyZUV2ZW50LmNsaWNrKHNjcmVlbi5nZXRCeVJvbGUoJ2J1dHRvbicsIHsgbmFtZTogJ3NhdmVDaGFuZ2VzJyB9KSlcblxuICAgIGV4cGVjdChoYW5kbGVVcGRhdGVBZ2VudCkudG9IYXZlQmVlbkNhbGxlZCgpXG4gIH0pXG5cbiAgaXQoJ2tlZXBzIHNhdmUgZGlzYWJsZWQgd2hlbiBzZWxlY3RlZCBjbGllbnRzIGFyZSBpbmFjdGl2ZScsICgpID0+IHtcbiAgICBmbGFncy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTID0gdHJ1ZVxuICAgIHJlbmRlcldpdGhQcm92aWRlcnMoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuXG4gICAgb3BlbkFnZW50KHtcbiAgICAgIHZhbHVlczoge1xuICAgICAgICBpc0VkaXRpbmc6IHRydWUsXG4gICAgICAgIGdlbmVyYWw6IHsgaWQ6ICdhZ2VudC0xJywgbmFtZTogJ1N1cHBvcnQnLCB1c2VyUHJvbXB0OiAnSGVscCcgfSxcbiAgICAgICAgYWNjZXNzaWJpbGl0eToge1xuICAgICAgICAgIGFjY2Vzc1R5cGU6ICdjbGllbnRzJyxcbiAgICAgICAgICBjbGllbnRzOiBbeyBpZDogJzEnLCBuYW1lOiAnSW5hY3RpdmUgQ28nLCBpc19hY3RpdmU6IGZhbHNlLCBpc19kZWxldGVkOiBmYWxzZSB9XSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBwcmVmZXRjaGVkQWdlbnRCeUlkOiB7XG4gICAgICAgIC4uLnByZWZldGNoZWRDdXN0b21BZ2VudCxcbiAgICAgICAgYWNjZXNzOiAnY2xpZW50cycsXG4gICAgICAgIGNsaWVudHM6IFt7IGlkOiAxLCBuYW1lOiAnSW5hY3RpdmUgQ28nLCBpc19hY3RpdmU6IGZhbHNlLCBpc19kZWxldGVkOiBmYWxzZSB9XSxcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIGZpcmVFdmVudC5jaGFuZ2Uoc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdhZ2VudC1uYW1lJyksIHsgdGFyZ2V0OiB7IHZhbHVlOiAnU3VwcG9ydCB2MicgfSB9KVxuICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlSb2xlKCdidXR0b24nLCB7IG5hbWU6ICdzYXZlQ2hhbmdlcycgfSkpLnRvQmVEaXNhYmxlZCgpXG4gIH0pXG5cbiAgaXQoJ29wZW5zIHRoZSBkZWxldGUgY29uZmlybWF0aW9uIG1vZGFsIGZyb20gZWRpdCBtb2RlJywgKCkgPT4ge1xuICAgIGZsYWdzLk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMgPSB0cnVlXG4gICAgcmVuZGVyV2l0aFByb3ZpZGVycyhcbiAgICAgIDxHbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgICAgICA8QWJtQWdlbnRNb2RhbCB7Li4uYWdlbnRQcm9wc30gLz5cbiAgICAgIDwvR2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICApXG5cbiAgICBvcGVuQWdlbnQoe1xuICAgICAgdmFsdWVzOiB7IGlzRWRpdGluZzogdHJ1ZSwgZ2VuZXJhbDogeyBpZDogJ2FnZW50LTEnIH0gfSxcbiAgICAgIHByZWZldGNoZWRBZ2VudEJ5SWQ6IHByZWZldGNoZWRDdXN0b21BZ2VudCxcbiAgICB9KVxuXG4gICAgZmlyZUV2ZW50LmNsaWNrKHNjcmVlbi5nZXRCeVJvbGUoJ2J1dHRvbicsIHsgbmFtZTogJ2RlbGV0ZUFnZW50JyB9KSlcblxuICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdkZWxldGUtbW9kYWwnKSkudG9CZUluVGhlRG9jdW1lbnQoKVxuICB9KVxuXG4gIGl0KCdmaW5pc2hlcyB0aGUgaGFwcHkgcGF0aCBhZnRlciB1cGRhdGUgc3VjY2VlZHMnLCAoKSA9PiB7XG4gICAgZmxhZ3MuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyA9IHRydWVcbiAgICBjb25zdCB1cGRhdGVBZ2VudCA9IGplc3QuZm4oKVxuICAgIGNvbnN0IHNlbGVjdEFnZW50ID0gamVzdC5mbigpXG4gICAgY29uc3Qgb25SZWZldGNoU2Vzc2lvbiA9IGplc3QuZm4oKVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3JlZmV0Y2gtc2Vzc2lvbicsIG9uUmVmZXRjaFNlc3Npb24pXG5cbiAgICBjb25zdCBzZWxlY3RlZEFnZW50ID0geyBpZDogJ2FnZW50LTEnLCBuYW1lOiAnU3VwcG9ydCcsIHR5cGU6ICdjdXN0b20nIGFzIGNvbnN0IH1cblxuICAgIGNvbnN0IHsgcmVyZW5kZXIgfSA9IHJlbmRlcldpdGhQcm92aWRlcnMoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlciB2YWx1ZT17eyBhZ2VudDogc2VsZWN0ZWRBZ2VudCwgc2VsZWN0QWdlbnQgfX0+XG4gICAgICAgIDxBYm1BZ2VudE1vZGFsIHsuLi5hZ2VudFByb3BzfSB1cGRhdGVBZ2VudD17dXBkYXRlQWdlbnR9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuXG4gICAgb3BlbkFnZW50KHtcbiAgICAgIHZhbHVlczogeyBpc0VkaXRpbmc6IHRydWUsIGdlbmVyYWw6IHsgaWQ6ICdhZ2VudC0xJyB9IH0sXG4gICAgICBwcmVmZXRjaGVkQWdlbnRCeUlkOiBwcmVmZXRjaGVkQ3VzdG9tQWdlbnQsXG4gICAgfSlcblxuICAgIGZpcmVFdmVudC5jaGFuZ2Uoc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdhZ2VudC1uYW1lJyksIHsgdGFyZ2V0OiB7IHZhbHVlOiAnU3VwcG9ydCB2MicgfSB9KVxuICAgIGZpcmVFdmVudC5jbGljayhzY3JlZW4uZ2V0QnlSb2xlKCdidXR0b24nLCB7IG5hbWU6ICdzYXZlQ2hhbmdlcycgfSkpXG5cbiAgICBleHBlY3QoaGFuZGxlVXBkYXRlQWdlbnQpLnRvSGF2ZUJlZW5DYWxsZWQoKVxuXG4gICAgdXBkYXRlQWdlbnRIb29rLnN1Y2Nlc3MgPSB7IGlkOiAnYWdlbnQtMScsIHR5cGU6ICdjdXN0b20nLCBuYW1lOiAnU3VwcG9ydCB2MicgfVxuICAgIHJlcmVuZGVyKFxuICAgICAgPEdsb2JhbENvbnRleHRUZXN0UHJvdmlkZXIgdmFsdWU9e3sgYWdlbnQ6IHNlbGVjdGVkQWdlbnQsIHNlbGVjdEFnZW50IH19PlxuICAgICAgICA8QWJtQWdlbnRNb2RhbCB7Li4uYWdlbnRQcm9wc30gdXBkYXRlQWdlbnQ9e3VwZGF0ZUFnZW50fSAvPlxuICAgICAgPC9HbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgIClcblxuICAgIGV4cGVjdChoYW5kbGVTbmFja2JhclN1Y2Nlc3MpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdjb25maXJtQWdlbnRVcGRhdGVkJylcbiAgICBleHBlY3QodXBkYXRlQWdlbnQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgaWQ6ICdhZ2VudC0xJywgbmFtZTogJ1N1cHBvcnQgdjInIH0pKVxuICAgIGV4cGVjdChzZWxlY3RBZ2VudCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoeyBpZDogJ2FnZW50LTEnIH0pKVxuICAgIGV4cGVjdCh1cGRhdGVBZ2VudEhvb2sucmVzZXRTdWNjZXNzKS50b0hhdmVCZWVuQ2FsbGVkKClcbiAgICBleHBlY3Qob25SZWZldGNoU2Vzc2lvbikudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpXG4gICAgZXhwZWN0KHNjcmVlbi5xdWVyeUJ5VGV4dCgnZWRpdEFnZW50JykpLm5vdC50b0JlSW5UaGVEb2N1bWVudCgpXG5cbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdyZWZldGNoLXNlc3Npb24nLCBvblJlZmV0Y2hTZXNzaW9uKVxuICB9KVxuXG4gIGl0KCdmaW5pc2hlcyB0aGUgaGFwcHkgcGF0aCBhZnRlciBjcmVhdGUgc3VjY2VlZHMnLCAoKSA9PiB7XG4gICAgZmxhZ3MuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyA9IHRydWVcbiAgICBjb25zdCBhZGRBZ2VudCA9IGplc3QuZm4oKVxuICAgIGNvbnN0IHNlbGVjdEFnZW50ID0gamVzdC5mbigpXG5cbiAgICBjb25zdCB7IHJlcmVuZGVyIH0gPSByZW5kZXJXaXRoUHJvdmlkZXJzKFxuICAgICAgPEdsb2JhbENvbnRleHRUZXN0UHJvdmlkZXIgdmFsdWU9e3sgc2VsZWN0QWdlbnQgfX0+XG4gICAgICAgIDxBYm1BZ2VudE1vZGFsIHsuLi5hZ2VudFByb3BzfSBhZGRBZ2VudD17YWRkQWdlbnR9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuXG4gICAgb3BlbkFnZW50KClcbiAgICBmaXJlRXZlbnQuY2hhbmdlKHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnYWdlbnQtbmFtZScpLCB7IHRhcmdldDogeyB2YWx1ZTogJ0N1c3RvbScgfSB9KVxuICAgIGZpcmVFdmVudC5jaGFuZ2Uoc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdhZ2VudC1wcm9tcHQnKSwgeyB0YXJnZXQ6IHsgdmFsdWU6ICdTb3MgdW4gYWdlbnRlJyB9IH0pXG4gICAgZmlyZUV2ZW50LmNsaWNrKHNjcmVlbi5nZXRCeVJvbGUoJ2J1dHRvbicsIHsgbmFtZTogJ2NyZWF0ZUFnZW50TGFiZWxCdXR0b24nIH0pKVxuXG4gICAgZXhwZWN0KGhhbmRsZUNyZWF0ZUFnZW50KS50b0hhdmVCZWVuQ2FsbGVkKClcblxuICAgIGNyZWF0ZUFnZW50SG9vay5zdWNjZXNzID0geyBpZDogJ2NyZWF0ZWQtMScsIHR5cGU6ICdjdXN0b20nIH1cbiAgICByZXJlbmRlcihcbiAgICAgIDxHbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyIHZhbHVlPXt7IHNlbGVjdEFnZW50IH19PlxuICAgICAgICA8QWJtQWdlbnRNb2RhbCB7Li4uYWdlbnRQcm9wc30gYWRkQWdlbnQ9e2FkZEFnZW50fSAvPlxuICAgICAgPC9HbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgIClcblxuICAgIGV4cGVjdChoYW5kbGVTbmFja2JhclN1Y2Nlc3MpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdjb25maXJtQWdlbnRDcmVhdGVkJylcbiAgICBleHBlY3QoYWRkQWdlbnQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgaWQ6ICdjcmVhdGVkLTEnIH0pKVxuICAgIGV4cGVjdChzZWxlY3RBZ2VudCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoeyBpZDogJ2NyZWF0ZWQtMScgfSkpXG4gICAgZXhwZWN0KGNyZWF0ZUFnZW50SG9vay5yZXNldFN1Y2Nlc3MpLnRvSGF2ZUJlZW5DYWxsZWQoKVxuICAgIGV4cGVjdChzY3JlZW4ucXVlcnlCeVRleHQoJ25ld0FnZW50JykpLm5vdC50b0JlSW5UaGVEb2N1bWVudCgpXG4gIH0pXG5cbiAgaXQoJ2Nsb3NlcyBhbmQgcmVtb3ZlcyB0aGUgYWdlbnQgYWZ0ZXIgZGVsZXRlIHN1Y2NlZWRzJywgKCkgPT4ge1xuICAgIGZsYWdzLk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMgPSB0cnVlXG4gICAgY29uc3QgcmVtb3ZlQWdlbnQgPSBqZXN0LmZuKClcblxuICAgIGNvbnN0IHsgcmVyZW5kZXIgfSA9IHJlbmRlcldpdGhQcm92aWRlcnMoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IHJlbW92ZUFnZW50PXtyZW1vdmVBZ2VudH0gLz5cbiAgICAgIDwvR2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICApXG5cbiAgICBvcGVuQWdlbnQoe1xuICAgICAgdmFsdWVzOiB7IGlzRWRpdGluZzogdHJ1ZSwgZ2VuZXJhbDogeyBpZDogJ2FnZW50LTEnIH0gfSxcbiAgICAgIHByZWZldGNoZWRBZ2VudEJ5SWQ6IHByZWZldGNoZWRDdXN0b21BZ2VudCxcbiAgICB9KVxuXG4gICAgZGVsZXRlQWdlbnRIb29rLnN1Y2Nlc3MgPSB0cnVlXG4gICAgcmVyZW5kZXIoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IHJlbW92ZUFnZW50PXtyZW1vdmVBZ2VudH0gLz5cbiAgICAgIDwvR2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICApXG5cbiAgICBleHBlY3QoaGFuZGxlU25hY2tiYXJTdWNjZXNzKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnY29uZmlybUFnZW50RGVsZXRlZCcpXG4gICAgZXhwZWN0KHJlbW92ZUFnZW50KS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnYWdlbnQtMScpXG4gICAgZXhwZWN0KGRlbGV0ZUFnZW50SG9vay5yZXNldFN1Y2Nlc3MpLnRvSGF2ZUJlZW5DYWxsZWQoKVxuICAgIGV4cGVjdChzY3JlZW4ucXVlcnlCeVRleHQoJ2VkaXRBZ2VudCcpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKVxuICB9KVxuXG4gIGl0KCdyZXF1ZXN0cyBjbGllbnQgYWNjZXNzIGFmdGVyIGNyZWF0ZSB3aGVuIHZpc2liaWxpdHkgaXMgbm90IGNvbXBhbnknLCAoKSA9PiB7XG4gICAgZmxhZ3MuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyA9IHRydWVcblxuICAgIGNvbnN0IHsgcmVyZW5kZXIgfSA9IHJlbmRlcldpdGhQcm92aWRlcnMoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuXG4gICAgb3BlbkFnZW50KHtcbiAgICAgIHZhbHVlczoge1xuICAgICAgICBpc0VkaXRpbmc6IGZhbHNlLFxuICAgICAgICBnZW5lcmFsOiB7IG5hbWU6ICcnLCB1c2VyUHJvbXB0OiAnJyB9LFxuICAgICAgICBhY2Nlc3NpYmlsaXR5OiB7XG4gICAgICAgICAgYWNjZXNzVHlwZTogJ2NsaWVudHMnLFxuICAgICAgICAgIGNsaWVudHM6IFt7IGlkOiAnMScsIG5hbWU6ICdBY3RpdmUgQ28nLCBpc19hY3RpdmU6IHRydWUsIGlzX2RlbGV0ZWQ6IGZhbHNlIH1dLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgZmlyZUV2ZW50LmNoYW5nZShzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ2FnZW50LW5hbWUnKSwgeyB0YXJnZXQ6IHsgdmFsdWU6ICdDdXN0b20nIH0gfSlcbiAgICBmaXJlRXZlbnQuY2hhbmdlKHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnYWdlbnQtcHJvbXB0JyksIHsgdGFyZ2V0OiB7IHZhbHVlOiAnU29zIHVuIGFnZW50ZScgfSB9KVxuICAgIGZpcmVFdmVudC5jbGljayhzY3JlZW4uZ2V0QnlSb2xlKCdidXR0b24nLCB7IG5hbWU6ICdjcmVhdGVBZ2VudExhYmVsQnV0dG9uJyB9KSlcblxuICAgIGNyZWF0ZUFnZW50SG9vay5zdWNjZXNzID0geyBpZDogJ2NyZWF0ZWQtMScsIHR5cGU6ICdjdXN0b20nIH1cbiAgICByZXJlbmRlcihcbiAgICAgIDxHbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgICAgICA8QWJtQWdlbnRNb2RhbCB7Li4uYWdlbnRQcm9wc30gLz5cbiAgICAgIDwvR2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICApXG5cbiAgICBleHBlY3QoaGFuZGxlQWNjZXNzQ2xpZW50KS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnY3JlYXRlZC0xJywgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoeyBhY2Nlc3NUeXBlOiAnY2xpZW50cycgfSkpXG4gICAgZXhwZWN0KGhhbmRsZVNuYWNrYmFyU3VjY2Vzcykubm90LnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdjb25maXJtQWdlbnRDcmVhdGVkJylcbiAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgnbmV3QWdlbnQnKSkudG9CZUluVGhlRG9jdW1lbnQoKVxuICB9KVxuXG4gIGl0KCdjbG9zZXMgZWRpdCBhZnRlciBjbGllbnQgYWNjZXNzIHN1Y2NlZWRzIG9uIHVwZGF0ZScsICgpID0+IHtcbiAgICBmbGFncy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTID0gdHJ1ZVxuICAgIGNvbnN0IHVwZGF0ZUFnZW50ID0gamVzdC5mbigpXG4gICAgY29uc3Qgc2VsZWN0QWdlbnQgPSBqZXN0LmZuKClcblxuICAgIGNvbnN0IHsgcmVyZW5kZXIgfSA9IHJlbmRlcldpdGhQcm92aWRlcnMoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlciB2YWx1ZT17eyBhZ2VudDogeyBpZDogJ2FnZW50LTEnLCBuYW1lOiAnU3VwcG9ydCcsIHR5cGU6ICdjdXN0b20nIH0sIHNlbGVjdEFnZW50IH19PlxuICAgICAgICA8QWJtQWdlbnRNb2RhbCB7Li4uYWdlbnRQcm9wc30gdXBkYXRlQWdlbnQ9e3VwZGF0ZUFnZW50fSAvPlxuICAgICAgPC9HbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgIClcblxuICAgIG9wZW5BZ2VudCh7XG4gICAgICB2YWx1ZXM6IHsgaXNFZGl0aW5nOiB0cnVlLCBnZW5lcmFsOiB7IGlkOiAnYWdlbnQtMScgfSB9LFxuICAgICAgcHJlZmV0Y2hlZEFnZW50QnlJZDogcHJlZmV0Y2hlZEN1c3RvbUFnZW50LFxuICAgIH0pXG5cbiAgICBmaXJlRXZlbnQuY2hhbmdlKHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnYWdlbnQtbmFtZScpLCB7IHRhcmdldDogeyB2YWx1ZTogJ1N1cHBvcnQgdjInIH0gfSlcbiAgICBmaXJlRXZlbnQuY2xpY2soZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FibS1hZ2VudC1tb2RhbC1hY2Nlc3NpYmlsaXR5JykhKVxuICAgIGZpcmVFdmVudC5jbGljayhzY3JlZW4uZ2V0QnlSb2xlKCdidXR0b24nLCB7IG5hbWU6ICdzZXQtY2xpZW50LWFjY2VzcycgfSkpXG4gICAgZmlyZUV2ZW50LmNsaWNrKHNjcmVlbi5nZXRCeVJvbGUoJ2J1dHRvbicsIHsgbmFtZTogJ3NhdmVDaGFuZ2VzJyB9KSlcblxuICAgIGV4cGVjdChoYW5kbGVVcGRhdGVBZ2VudCkudG9IYXZlQmVlbkNhbGxlZCgpXG5cbiAgICB1cGRhdGVBZ2VudEhvb2suc3VjY2VzcyA9IHsgaWQ6ICdhZ2VudC0xJywgdHlwZTogJ2N1c3RvbScsIG5hbWU6ICdTdXBwb3J0IHYyJyB9XG4gICAgcmVyZW5kZXIoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlciB2YWx1ZT17eyBhZ2VudDogeyBpZDogJ2FnZW50LTEnLCBuYW1lOiAnU3VwcG9ydCcsIHR5cGU6ICdjdXN0b20nIH0sIHNlbGVjdEFnZW50IH19PlxuICAgICAgICA8QWJtQWdlbnRNb2RhbCB7Li4uYWdlbnRQcm9wc30gdXBkYXRlQWdlbnQ9e3VwZGF0ZUFnZW50fSAvPlxuICAgICAgPC9HbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgIClcblxuICAgIGV4cGVjdChoYW5kbGVBY2Nlc3NDbGllbnQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdhZ2VudC0xJywgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoeyBhY2Nlc3NUeXBlOiAnY2xpZW50cycgfSkpXG5cbiAgICBhY2Nlc3NDbGllbnRIb29rLnN1Y2Nlc3MgPSB7IG9rOiB0cnVlIH1cbiAgICByZXJlbmRlcihcbiAgICAgIDxHbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyIHZhbHVlPXt7IGFnZW50OiB7IGlkOiAnYWdlbnQtMScsIG5hbWU6ICdTdXBwb3J0JywgdHlwZTogJ2N1c3RvbScgfSwgc2VsZWN0QWdlbnQgfX0+XG4gICAgICAgIDxBYm1BZ2VudE1vZGFsIHsuLi5hZ2VudFByb3BzfSB1cGRhdGVBZ2VudD17dXBkYXRlQWdlbnR9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuXG4gICAgZXhwZWN0KGhhbmRsZVNuYWNrYmFyU3VjY2VzcykudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2NvbmZpcm1BZ2VudFVwZGF0ZWQnKVxuICAgIGV4cGVjdCh1cGRhdGVBZ2VudCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoeyBpZDogJ2FnZW50LTEnIH0pKVxuICAgIGV4cGVjdChzZWxlY3RBZ2VudCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoeyBpZDogJ2FnZW50LTEnIH0pKVxuICAgIGV4cGVjdChzY3JlZW4ucXVlcnlCeVRleHQoJ2VkaXRBZ2VudCcpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKVxuICB9KVxuXG4gIGl0KCdjbG9zZXMgY3JlYXRlIGFmdGVyIGNsaWVudCBhY2Nlc3Mgc3VjY2VlZHMnLCAoKSA9PiB7XG4gICAgZmxhZ3MuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyA9IHRydWVcbiAgICBjb25zdCBhZGRBZ2VudCA9IGplc3QuZm4oKVxuICAgIGNvbnN0IHNlbGVjdEFnZW50ID0gamVzdC5mbigpXG5cbiAgICBjb25zdCB7IHJlcmVuZGVyIH0gPSByZW5kZXJXaXRoUHJvdmlkZXJzKFxuICAgICAgPEdsb2JhbENvbnRleHRUZXN0UHJvdmlkZXIgdmFsdWU9e3sgc2VsZWN0QWdlbnQgfX0+XG4gICAgICAgIDxBYm1BZ2VudE1vZGFsIHsuLi5hZ2VudFByb3BzfSBhZGRBZ2VudD17YWRkQWdlbnR9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuXG4gICAgb3BlbkFnZW50KHtcbiAgICAgIHZhbHVlczoge1xuICAgICAgICBpc0VkaXRpbmc6IGZhbHNlLFxuICAgICAgICBnZW5lcmFsOiB7IG5hbWU6ICcnLCB1c2VyUHJvbXB0OiAnJyB9LFxuICAgICAgICBhY2Nlc3NpYmlsaXR5OiB7XG4gICAgICAgICAgYWNjZXNzVHlwZTogJ2NsaWVudHMnLFxuICAgICAgICAgIGNsaWVudHM6IFt7IGlkOiAnMScsIG5hbWU6ICdBY3RpdmUgQ28nLCBpc19hY3RpdmU6IHRydWUsIGlzX2RlbGV0ZWQ6IGZhbHNlIH1dLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgZmlyZUV2ZW50LmNoYW5nZShzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ2FnZW50LW5hbWUnKSwgeyB0YXJnZXQ6IHsgdmFsdWU6ICdDdXN0b20nIH0gfSlcbiAgICBmaXJlRXZlbnQuY2hhbmdlKHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnYWdlbnQtcHJvbXB0JyksIHsgdGFyZ2V0OiB7IHZhbHVlOiAnU29zIHVuIGFnZW50ZScgfSB9KVxuICAgIGZpcmVFdmVudC5jbGljayhzY3JlZW4uZ2V0QnlSb2xlKCdidXR0b24nLCB7IG5hbWU6ICdjcmVhdGVBZ2VudExhYmVsQnV0dG9uJyB9KSlcblxuICAgIGNyZWF0ZUFnZW50SG9vay5zdWNjZXNzID0geyBpZDogJ2NyZWF0ZWQtMScsIHR5cGU6ICdjdXN0b20nIH1cbiAgICByZXJlbmRlcihcbiAgICAgIDxHbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyIHZhbHVlPXt7IHNlbGVjdEFnZW50IH19PlxuICAgICAgICA8QWJtQWdlbnRNb2RhbCB7Li4uYWdlbnRQcm9wc30gYWRkQWdlbnQ9e2FkZEFnZW50fSAvPlxuICAgICAgPC9HbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgIClcblxuICAgIGFjY2Vzc0NsaWVudEhvb2suc3VjY2VzcyA9IHsgb2s6IHRydWUgfVxuICAgIHJlcmVuZGVyKFxuICAgICAgPEdsb2JhbENvbnRleHRUZXN0UHJvdmlkZXIgdmFsdWU9e3sgc2VsZWN0QWdlbnQgfX0+XG4gICAgICAgIDxBYm1BZ2VudE1vZGFsIHsuLi5hZ2VudFByb3BzfSBhZGRBZ2VudD17YWRkQWdlbnR9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuXG4gICAgZXhwZWN0KGhhbmRsZVNuYWNrYmFyU3VjY2VzcykudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2NvbmZpcm1BZ2VudENyZWF0ZWQnKVxuICAgIGV4cGVjdChhZGRBZ2VudCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoeyBpZDogJ2NyZWF0ZWQtMScgfSkpXG4gICAgZXhwZWN0KHNlbGVjdEFnZW50KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7IGlkOiAnY3JlYXRlZC0xJyB9KSlcbiAgICBleHBlY3QoYWNjZXNzQ2xpZW50SG9vay5yZXNldFN1Y2Nlc3NVcGRhdGVBY2Nlc3MpLnRvSGF2ZUJlZW5DYWxsZWQoKVxuICAgIGV4cGVjdChzY3JlZW4ucXVlcnlCeVRleHQoJ25ld0FnZW50JykpLm5vdC50b0JlSW5UaGVEb2N1bWVudCgpXG4gIH0pXG5cbiAgaXQoJ2Nsb3NlcyBjcmVhdGUgYWZ0ZXIga25vd2xlZGdlIHByb2Nlc3NpbmcgdGltZXMgb3V0JywgKCkgPT4ge1xuICAgIGZsYWdzLk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMgPSB0cnVlXG5cbiAgICBjb25zdCB7IHJlcmVuZGVyIH0gPSByZW5kZXJXaXRoUHJvdmlkZXJzKFxuICAgICAgPEdsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgICAgIDxBYm1BZ2VudE1vZGFsIHsuLi5hZ2VudFByb3BzfSAvPlxuICAgICAgPC9HbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgIClcblxuICAgIG9wZW5BZ2VudCgpXG4gICAgZmlyZUV2ZW50LmNoYW5nZShzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ2FnZW50LW5hbWUnKSwgeyB0YXJnZXQ6IHsgdmFsdWU6ICdDdXN0b20nIH0gfSlcbiAgICBmaXJlRXZlbnQuY2hhbmdlKHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnYWdlbnQtcHJvbXB0JyksIHsgdGFyZ2V0OiB7IHZhbHVlOiAnU29zIHVuIGFnZW50ZScgfSB9KVxuICAgIGZpcmVFdmVudC5jbGljayhkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWJtLWFnZW50LW1vZGFsLWtub3dsZWRnZScpISlcbiAgICBmaXJlRXZlbnQuY2xpY2soc2NyZWVuLmdldEJ5Um9sZSgnYnV0dG9uJywgeyBuYW1lOiAnYWRkLWtub3dsZWRnZS1maWxlJyB9KSlcbiAgICBmaXJlRXZlbnQuY2xpY2soc2NyZWVuLmdldEJ5Um9sZSgnYnV0dG9uJywgeyBuYW1lOiAnY3JlYXRlQWdlbnRMYWJlbEJ1dHRvbicgfSkpXG5cbiAgICBjcmVhdGVBZ2VudEhvb2suc3VjY2VzcyA9IHsgaWQ6ICdjcmVhdGVkLTEnLCB0eXBlOiAnY3VzdG9tJyB9XG4gICAgcmVyZW5kZXIoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuXG4gICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoJ2xvYWRlci1maWxlcycpKS50b0JlSW5UaGVEb2N1bWVudCgpXG4gICAgZmlyZUV2ZW50LmNsaWNrKHNjcmVlbi5nZXRCeVJvbGUoJ2J1dHRvbicsIHsgbmFtZTogJ2ZpbGVzLXRpbWVvdXQnIH0pKVxuXG4gICAgZXhwZWN0KGhhbmRsZVNuYWNrYmFyU3VjY2VzcykudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2NvbmZpcm1BZ2VudENyZWF0ZWQnKVxuICAgIGV4cGVjdChjcmVhdGVBZ2VudEhvb2sucmVzZXRTdWNjZXNzKS50b0hhdmVCZWVuQ2FsbGVkKClcbiAgICBleHBlY3Qoc2NyZWVuLnF1ZXJ5QnlUZXh0KCduZXdBZ2VudCcpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKVxuICB9KVxuXG4gIGl0KCdzaG93cyBhbiBlcnJvciBzbmFja2JhciB3aGVuIGtub3dsZWRnZSBvcGVyYXRpb25zIGZhaWwnLCAoKSA9PiB7XG4gICAgZmxhZ3MuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyA9IHRydWVcblxuICAgIGNvbnN0IHsgcmVyZW5kZXIgfSA9IHJlbmRlcldpdGhQcm92aWRlcnMoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuXG4gICAgb3BlbkFnZW50KClcblxuICAgIGtub3dsZWRnZU9wZXJhdGlvbnNIb29rLmVycm9yID0gJ3VwbG9hZCBmYWlsZWQnXG4gICAgcmVyZW5kZXIoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuXG4gICAgZXhwZWN0KGhhbmRsZVNuYWNrYmFyRXJyb3IpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdjb25maXJtQWdlbnRXaXRoRmlsZXNFcnJvcicpXG4gIH0pXG5cbiAgaXQoJ2Nsb3NlcyBlZGl0IGFmdGVyIGtub3dsZWRnZSBkZWxldGUgc3VjY2VlZHMgd2l0aG91dCBwZW5kaW5nIHVwbG9hZHMnLCAoKSA9PiB7XG4gICAgZmxhZ3MuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyA9IHRydWVcblxuICAgIGNvbnN0IHsgcmVyZW5kZXIgfSA9IHJlbmRlcldpdGhQcm92aWRlcnMoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuXG4gICAgb3BlbkFnZW50KHtcbiAgICAgIHZhbHVlczogeyBpc0VkaXRpbmc6IHRydWUsIGdlbmVyYWw6IHsgaWQ6ICdhZ2VudC0xJyB9IH0sXG4gICAgICBwcmVmZXRjaGVkQWdlbnRCeUlkOiBwcmVmZXRjaGVkQ3VzdG9tQWdlbnQsXG4gICAgfSlcblxuICAgIGtub3dsZWRnZU9wZXJhdGlvbnNIb29rLnN1Y2Nlc3NEZWxldGUgPSB0cnVlXG4gICAgcmVyZW5kZXIoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuXG4gICAgZXhwZWN0KGhhbmRsZVNuYWNrYmFyU3VjY2VzcykudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2NvbmZpcm1BZ2VudFVwZGF0ZWQnKVxuICAgIGV4cGVjdChzY3JlZW4ucXVlcnlCeVRleHQoJ2VkaXRBZ2VudCcpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKVxuICB9KVxuXG4gIGl0KCdjbG9zZXMgZWRpdCBhZnRlciBrbm93bGVkZ2UgcHJvY2Vzc2luZyB0aW1lcyBvdXQnLCAoKSA9PiB7XG4gICAgZmxhZ3MuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyA9IHRydWVcbiAgICBjb25zdCB1cGRhdGVBZ2VudCA9IGplc3QuZm4oKVxuXG4gICAgY29uc3QgeyByZXJlbmRlciB9ID0gcmVuZGVyV2l0aFByb3ZpZGVycyhcbiAgICAgIDxHbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgICAgICA8QWJtQWdlbnRNb2RhbCB7Li4uYWdlbnRQcm9wc30gdXBkYXRlQWdlbnQ9e3VwZGF0ZUFnZW50fSAvPlxuICAgICAgPC9HbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgIClcblxuICAgIG9wZW5BZ2VudCh7XG4gICAgICB2YWx1ZXM6IHsgaXNFZGl0aW5nOiB0cnVlLCBnZW5lcmFsOiB7IGlkOiAnYWdlbnQtMScgfSB9LFxuICAgICAgcHJlZmV0Y2hlZEFnZW50QnlJZDogcHJlZmV0Y2hlZEN1c3RvbUFnZW50LFxuICAgIH0pXG5cbiAgICBmaXJlRXZlbnQuY2hhbmdlKHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnYWdlbnQtbmFtZScpLCB7IHRhcmdldDogeyB2YWx1ZTogJ1N1cHBvcnQgdjInIH0gfSlcbiAgICBmaXJlRXZlbnQuY2xpY2soZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FibS1hZ2VudC1tb2RhbC1rbm93bGVkZ2UnKSEpXG4gICAgZmlyZUV2ZW50LmNsaWNrKHNjcmVlbi5nZXRCeVJvbGUoJ2J1dHRvbicsIHsgbmFtZTogJ2FkZC1rbm93bGVkZ2UtZmlsZScgfSkpXG4gICAgZmlyZUV2ZW50LmNsaWNrKHNjcmVlbi5nZXRCeVJvbGUoJ2J1dHRvbicsIHsgbmFtZTogJ3NhdmVDaGFuZ2VzJyB9KSlcblxuICAgIHVwZGF0ZUFnZW50SG9vay5zdWNjZXNzID0geyBpZDogJ2FnZW50LTEnLCB0eXBlOiAnY3VzdG9tJywgbmFtZTogJ1N1cHBvcnQgdjInIH1cbiAgICByZXJlbmRlcihcbiAgICAgIDxHbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgICAgICA8QWJtQWdlbnRNb2RhbCB7Li4uYWdlbnRQcm9wc30gdXBkYXRlQWdlbnQ9e3VwZGF0ZUFnZW50fSAvPlxuICAgICAgPC9HbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgIClcblxuICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdsb2FkZXItZmlsZXMnKSkudG9CZUluVGhlRG9jdW1lbnQoKVxuICAgIGZpcmVFdmVudC5jbGljayhzY3JlZW4uZ2V0QnlSb2xlKCdidXR0b24nLCB7IG5hbWU6ICdmaWxlcy10aW1lb3V0JyB9KSlcblxuICAgIGV4cGVjdChoYW5kbGVTbmFja2JhclN1Y2Nlc3MpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdjb25maXJtQWdlbnRVcGRhdGVkJylcbiAgICBleHBlY3QodXBkYXRlQWdlbnQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgaWQ6ICdhZ2VudC0xJyB9KSlcbiAgICBleHBlY3QodXBkYXRlQWdlbnRIb29rLnJlc2V0U3VjY2VzcykudG9IYXZlQmVlbkNhbGxlZCgpXG4gICAgZXhwZWN0KHNjcmVlbi5xdWVyeUJ5VGV4dCgnZWRpdEFnZW50JykpLm5vdC50b0JlSW5UaGVEb2N1bWVudCgpXG4gIH0pXG5cbiAgaXQoJ3dhaXRzIGZvciBjb25uZWN0b3Igc3RhdHVzIGJlZm9yZSBzaG93aW5nIGFuIGVkaXRlZCBhZ2VudCcsIGFzeW5jICgpID0+IHtcbiAgICBmbGFncy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTID0gdHJ1ZVxuICAgIGZsYWdzLk1BSUFfRVhURVJOQUxfQ09OTkVDVE9SUyA9IHRydWVcbiAgICBsZXQgcmVzb2x2ZUNvbm5lY3RvcnM6IChjb25uZWN0b3JzOiBBZ2VudENvbm5lY3RvcltdKSA9PiB2b2lkID0gKCkgPT4ge31cbiAgICBtb2NrZWRHZXRBZ2VudENvbm5lY3RvcnMubW9ja1JldHVyblZhbHVlKFxuICAgICAgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgIHJlc29sdmVDb25uZWN0b3JzID0gcmVzb2x2ZVxuICAgICAgfSlcbiAgICApXG4gICAgcmVuZGVyV2l0aFByb3ZpZGVycyhcbiAgICAgIDxHbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgICAgICA8QWJtQWdlbnRNb2RhbCB7Li4uYWdlbnRQcm9wc30gLz5cbiAgICAgIDwvR2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICApXG5cbiAgICBhY3QoKCkgPT4ge1xuICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCdhYm0tYWdlbnQtbW9kYWwtc2V0LXZhbHVlcycsIHtcbiAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgIGFnZW50VmFsdWVzOiB7XG4gICAgICAgICAgICAgIHZhbHVlczogeyBpc0VkaXRpbmc6IHRydWUsIGdlbmVyYWw6IHsgaWQ6ICdhMScgfSB9LFxuICAgICAgICAgICAgICBpbml0aWFsU2VjdGlvbjogJ2FjY2Vzc2liaWxpdHknLFxuICAgICAgICAgICAgICBwcmVmZXRjaGVkQWdlbnRCeUlkOiB7XG4gICAgICAgICAgICAgICAgaWQ6ICdhMScsXG4gICAgICAgICAgICAgICAgdHlwZTogJ2N1c3RvbScsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0FnZW50JyxcbiAgICAgICAgICAgICAgICB1c2VyUHJvbXB0OiAnUHJvbXB0JyxcbiAgICAgICAgICAgICAgICBtb2RlbEFpSWQ6IDEsXG4gICAgICAgICAgICAgICAgYWNjZXNzOiAnY29tcGFueScsXG4gICAgICAgICAgICAgICAgdG9vbEdyb3VwU2x1Z3M6IFtdLFxuICAgICAgICAgICAgICAgIGNvbm5lY3RvcnM6IFt7IGdyb3VwOiAnTUNQJywgc2x1Z3M6IFsnbmV0c3VpdGUnXSB9XSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9KVxuXG4gICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoJ3NwaW5uZXInKSkudG9CZUluVGhlRG9jdW1lbnQoKVxuICAgIGV4cGVjdChzY3JlZW4ucXVlcnlCeVRlc3RJZCgnYWNjZXNzaWJpbGl0eS1zdGF0ZScpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKVxuXG4gICAgYXdhaXQgYWN0KGFzeW5jICgpID0+IHtcbiAgICAgIHJlc29sdmVDb25uZWN0b3JzKFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAxLFxuICAgICAgICAgIHNsdWc6ICduZXRzdWl0ZScsXG4gICAgICAgICAgbmFtZTogJ05ldFN1aXRlJyxcbiAgICAgICAgICByZXF1aXJlc19hdXRoOiB0cnVlLFxuICAgICAgICAgIGlzX2FjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICBlbmFibGVkX2Zvcl9hZ2VudDogdHJ1ZSxcbiAgICAgICAgICB1c2VyX2F1dGhvcml6ZWQ6IGZhbHNlLFxuICAgICAgICAgIGNvbm5lY3Rpb25fc3RhdHVzOiAnZXJyb3InLFxuICAgICAgICB9LFxuICAgICAgXSlcbiAgICB9KVxuXG4gICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRlc3RJZCgnYWNjZXNzaWJpbGl0eS1zdGF0ZScpKS50b0hhdmVUZXh0Q29udGVudCgnbmV0c3VpdGU6ZXJyb3InKVxuICAgIGV4cGVjdChtb2NrZWRHZXRBZ2VudENvbm5lY3RvcnMpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKVxuICB9KVxufSlcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxTQUFTQSxHQUFHLEVBQUVDLFNBQVMsRUFBRUMsbUJBQW1CLEVBQUVDLE1BQU0sRUFBRUMsT0FBTyxRQUFRLDBCQUEwQjtBQUMvRixTQUFTQyxnQkFBZ0IsUUFBUSwwQkFBMEI7QUFDM0QsU0FBU0MseUJBQXlCLFFBQVEsOEJBQThCO0FBQ3hFLFNBQVNDLGtCQUFrQixRQUE2QiwwQ0FBMEM7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