@projectcor/maia-components 2.49.0-beta.1 → 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 (493) 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.js +37 -0
  6. package/lib/components/atoms/ApprovalBox/ApprovalBox.helpers.spec.js +63 -0
  7. package/lib/components/atoms/ApprovalBox/ApprovalBox.js +3 -37
  8. package/lib/components/atoms/ApprovalBox/ApprovalBox.spec.js +183 -0
  9. package/lib/components/atoms/AttachmentCard/AttachmentCard.spec.js +123 -0
  10. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.js +117 -0
  11. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.spec.js +139 -0
  12. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.js +31 -101
  13. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.spec.js +385 -0
  14. package/lib/components/atoms/AttachmentCard/AttachmentCardImage.spec.js +78 -0
  15. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.js +91 -0
  16. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.spec.js +94 -0
  17. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +49 -140
  18. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.spec.js +396 -0
  19. package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.spec.js +80 -0
  20. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.js +257 -0
  21. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.spec.js +526 -0
  22. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.js +53 -205
  23. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.spec.js +137 -0
  24. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.js +4 -0
  25. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.spec.js +11 -0
  26. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.js +2 -4
  27. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.spec.js +77 -0
  28. package/lib/components/atoms/Backdrop/Backdrop.spec.js +28 -0
  29. package/lib/components/atoms/CardMenu/CardMenu.spec.js +56 -0
  30. package/lib/components/atoms/ChatClientSelector/ChatClientSelector.spec.js +67 -0
  31. package/lib/components/atoms/Checkbox/Checkbox.spec.js +27 -0
  32. package/lib/components/atoms/Chip/Chip.spec.js +82 -0
  33. package/lib/components/atoms/ChipLlm/ChipLlm.spec.js +26 -0
  34. package/lib/components/atoms/ClientSelector/ClientSelector.helpers.js +26 -0
  35. package/lib/components/atoms/ClientSelector/ClientSelector.helpers.spec.js +45 -0
  36. package/lib/components/atoms/ClientSelector/ClientSelector.js +12 -21
  37. package/lib/components/atoms/ClientSelector/ClientSelector.spec.js +133 -0
  38. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.spec.js +29 -0
  39. package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.spec.js +46 -0
  40. package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.js +227 -0
  41. package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.spec.js +109 -0
  42. package/lib/components/atoms/ContextMentionChip/buildChipElement.js +15 -255
  43. package/lib/components/atoms/ContextMentionChip/buildChipElement.spec.js +81 -0
  44. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.js +59 -0
  45. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.spec.js +92 -0
  46. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +12 -57
  47. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.spec.js +319 -0
  48. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.spec.js +107 -0
  49. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.spec.js +136 -0
  50. package/lib/components/atoms/CopyToClipboard.spec.js +74 -0
  51. package/lib/components/atoms/EditableLabel/EditableLabel.spec.js +76 -0
  52. package/lib/components/atoms/EntitySelector/EntitySelector.spec.js +86 -0
  53. package/lib/components/atoms/Expand/Expand.spec.js +57 -0
  54. package/lib/components/atoms/Fade/Fade.spec.js +31 -0
  55. package/lib/components/atoms/FeedbackButton/FeedbackButton.spec.js +75 -0
  56. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.spec.js +104 -0
  57. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +3 -1
  58. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.spec.js +91 -0
  59. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +19 -7
  60. package/lib/components/atoms/HelpButton.spec.js +87 -0
  61. package/lib/components/atoms/ImagePreview/ImagePreview.spec.js +96 -0
  62. package/lib/components/atoms/ListMenuOption/ListMenuOption.spec.js +54 -0
  63. package/lib/components/atoms/LoadingFaqs/LoadingFaqs.spec.js +21 -0
  64. package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.spec.js +20 -0
  65. package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.spec.js +26 -0
  66. package/lib/components/atoms/LoadingText/LoadingText.spec.js +25 -0
  67. package/lib/components/atoms/MAIAButton/MAIAButton.spec.js +42 -0
  68. package/lib/components/atoms/MAIAError/MAIAError.spec.js +27 -0
  69. package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.js +74 -0
  70. package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.spec.js +113 -0
  71. package/lib/components/atoms/MAIAInput/MAIAInput.helpers.js +184 -0
  72. package/lib/components/atoms/MAIAInput/MAIAInput.helpers.spec.js +381 -0
  73. package/lib/components/atoms/MAIAInput/MAIAInput.js +130 -177
  74. package/lib/components/atoms/MAIAInput/MAIAInput.spec.js +641 -0
  75. package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.js +96 -0
  76. package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.spec.js +92 -0
  77. package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +40 -113
  78. package/lib/components/atoms/MAIAInput/MAIAInputEditor.spec.js +193 -0
  79. package/lib/components/atoms/MAIAInput/maiaInputLayout.spec.js +32 -0
  80. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.spec.js +64 -0
  81. package/lib/components/atoms/MaiaWrapper/MaiaWrapper.spec.js +43 -0
  82. package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.spec.js +114 -0
  83. package/lib/components/atoms/MaiaWrapper/ModernMaiaWrapper.spec.js +51 -0
  84. package/lib/components/atoms/ModalClientAccess/ModalClientAccess.spec.js +48 -0
  85. package/lib/components/atoms/ModalProject/ModalProject.spec.js +66 -0
  86. package/lib/components/atoms/NextPageLoader.spec.js +37 -0
  87. package/lib/components/atoms/OnboardingModalButton/OnboardingModal.spec.js +20 -0
  88. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.js +17 -0
  89. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.spec.js +35 -0
  90. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.js +3 -15
  91. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.spec.js +47 -0
  92. package/lib/components/atoms/OptionAccessibility/OptionAccessibility.spec.js +146 -0
  93. package/lib/components/atoms/PrimaryButton.spec.js +42 -0
  94. package/lib/components/atoms/ProjectSelector/ProjectSelector.spec.js +69 -0
  95. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.js +7 -2
  96. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.spec.js +69 -0
  97. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.styles.js +41 -24
  98. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.js +27 -13
  99. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.spec.js +59 -0
  100. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.js +79 -52
  101. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.spec.js +170 -0
  102. package/lib/components/atoms/ReasoningBlock/groupParallelSteps.js +9 -11
  103. package/lib/components/atoms/ReasoningBlock/groupParallelSteps.spec.js +199 -0
  104. package/lib/components/atoms/ReasoningBlock/reasoningLeading.js +6 -1
  105. package/lib/components/atoms/ReasoningBlock/reasoningLeading.spec.js +70 -0
  106. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.js +36 -15
  107. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.spec.js +120 -0
  108. package/lib/components/atoms/ReasoningBlock/reasoningMotion.js +8 -0
  109. package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.js +10 -0
  110. package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.spec.js +31 -0
  111. package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.js +52 -0
  112. package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.spec.js +90 -0
  113. package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.js +29 -0
  114. package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.spec.js +38 -0
  115. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.spec.js +16 -0
  116. package/lib/components/atoms/SkillsDropdown/SkillsDropdown.spec.js +107 -0
  117. package/lib/components/atoms/SlashCommandChip/SlashCommandChip.spec.js +24 -0
  118. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.helpers.js +101 -0
  119. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.helpers.spec.js +71 -0
  120. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.js +21 -77
  121. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.spec.js +120 -0
  122. package/lib/components/atoms/Switch/Switch.spec.js +41 -0
  123. package/lib/components/atoms/TextArea/CustomTextArea.spec.js +52 -0
  124. package/lib/components/atoms/TextArea/TextArea.helpers.js +23 -0
  125. package/lib/components/atoms/TextArea/TextArea.helpers.spec.js +25 -0
  126. package/lib/components/atoms/TextArea/TextArea.js +11 -20
  127. package/lib/components/atoms/TextArea/TextArea.spec.js +126 -0
  128. package/lib/components/atoms/ThirdButton.spec.js +29 -0
  129. package/lib/components/atoms/VideoModal/VideoModal.spec.js +68 -0
  130. package/lib/components/atoms/WithAppCfg.spec.js +82 -0
  131. package/lib/components/index.js +2 -1
  132. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.js +37 -0
  133. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.spec.js +53 -0
  134. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +6 -29
  135. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.spec.js +742 -0
  136. package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.js +68 -0
  137. package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.spec.js +107 -0
  138. package/lib/components/molecules/AbmSection/AbmGeneralSection.js +17 -56
  139. package/lib/components/molecules/AbmSection/AbmGeneralSection.spec.js +256 -0
  140. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.js +133 -0
  141. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.spec.js +175 -0
  142. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.js +31 -112
  143. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.spec.js +318 -0
  144. package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.js +17 -0
  145. package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.spec.js +50 -0
  146. package/lib/components/molecules/AbmSection/AbmLoaderFiles.js +5 -15
  147. package/lib/components/molecules/AbmSection/AbmLoaderFiles.spec.js +94 -0
  148. package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.js +83 -0
  149. package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.styles.js +30 -0
  150. package/lib/components/molecules/AgentInputBlock/index.js +5 -0
  151. package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.js +52 -0
  152. package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.spec.js +76 -0
  153. package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.js +20 -0
  154. package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.spec.js +34 -0
  155. package/lib/components/molecules/AgentInputBlock/useAgentChangeModelAction.js +36 -0
  156. package/lib/components/molecules/ChatAIClientSelector/ChatAIClientSelector.spec.js +66 -0
  157. package/lib/components/molecules/ChatAIContent/ChatAIContent.js +7 -3
  158. package/lib/components/molecules/ChatAIContent/ChatAIContent.spec.js +145 -0
  159. package/lib/components/molecules/ChatAIHistory/ChatAIHistory.spec.js +204 -0
  160. package/lib/components/molecules/ChatAIHome/ChatAIHome.helpers.js +370 -0
  161. package/lib/components/molecules/ChatAIHome/ChatAIHome.helpers.spec.js +622 -0
  162. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +285 -302
  163. package/lib/components/molecules/ChatAIHome/ChatAIHome.spec.js +264 -0
  164. package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.spec.js +86 -0
  165. package/lib/components/molecules/ChatAIHome/styles.js +85 -78
  166. package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.spec.js +104 -0
  167. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.js +398 -0
  168. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.spec.js +742 -0
  169. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +235 -245
  170. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.spec.js +541 -0
  171. package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.spec.js +46 -0
  172. package/lib/components/molecules/ChatAIMessages/newStyles.js +32 -35
  173. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.js +522 -4
  174. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.spec.js +1394 -0
  175. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +250 -349
  176. package/lib/components/molecules/ChatAIModal/ChatAIModal.spec.js +1401 -0
  177. package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +2 -2
  178. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.js +5 -0
  179. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.spec.js +33 -0
  180. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.js +3 -2
  181. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.spec.js +116 -0
  182. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +15 -153
  183. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.spec.js +134 -0
  184. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.styles.js +2 -26
  185. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.js +49 -0
  186. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.spec.js +142 -0
  187. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +100 -93
  188. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.spec.js +241 -0
  189. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.spec.js +37 -0
  190. package/lib/components/molecules/ChatAIModal/constants.spec.js +16 -0
  191. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.spec.js +22 -0
  192. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/useFloatingPanelDragTilt.spec.js +67 -0
  193. package/lib/components/molecules/ChatAIModal/layout.spec.js +72 -0
  194. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.helpers.js +39 -0
  195. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.helpers.spec.js +93 -0
  196. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.js +30 -33
  197. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.spec.js +297 -0
  198. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.helpers.js +41 -0
  199. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.helpers.spec.js +62 -0
  200. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.js +9 -35
  201. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.spec.js +221 -0
  202. package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.spec.js +66 -0
  203. package/lib/components/molecules/ChatFooter/ChatFooter.js +10 -4
  204. package/lib/components/molecules/ChatFooter/ChatFooter.spec.js +369 -0
  205. package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.spec.js +10 -0
  206. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.js +48 -0
  207. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.spec.js +104 -0
  208. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +9 -44
  209. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.spec.js +139 -0
  210. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.spec.js +84 -0
  211. package/lib/components/molecules/MessageFeedback/MessageFeedback.spec.js +116 -0
  212. package/lib/components/molecules/ProjectSummaryChat/ProjectSummaryChat.spec.js +126 -0
  213. package/lib/components/molecules/ProjectSummaryConfig/ProjectSummaryConfig.spec.js +115 -0
  214. package/lib/components/molecules/ProjectSummaryContent/ProjectSummaryContent.spec.js +79 -0
  215. package/lib/components/molecules/ProjectSummaryModal/ProjectSummaryModal.spec.js +37 -0
  216. package/lib/components/molecules/Sidebar/Sidebar.helpers.js +43 -0
  217. package/lib/components/molecules/Sidebar/Sidebar.helpers.spec.js +119 -0
  218. package/lib/components/molecules/Sidebar/Sidebar.js +65 -44
  219. package/lib/components/molecules/Sidebar/Sidebar.spec.js +464 -0
  220. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.js +512 -0
  221. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.spec.js +1067 -0
  222. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +310 -644
  223. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.spec.js +1236 -0
  224. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.spec.js +112 -0
  225. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.helpers.js +37 -0
  226. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.helpers.spec.js +77 -0
  227. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.js +13 -25
  228. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.spec.js +503 -0
  229. package/lib/components/organisms/ChatAI/ChatAI.spec.js +174 -0
  230. package/lib/components/organisms/ChatAIPage/ChatAIPage.js +525 -0
  231. package/lib/components/organisms/ChatAIPage/ChatAIPage.spec.js +246 -0
  232. package/lib/components/organisms/ChatAIPage/ChatAIPage.styles.js +16 -0
  233. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.js +253 -0
  234. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.spec.js +139 -0
  235. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.styles.js +13 -0
  236. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.js +275 -0
  237. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.spec.js +275 -0
  238. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.styles.js +195 -0
  239. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.js +94 -0
  240. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.spec.js +69 -0
  241. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCards.skeleton.js +38 -0
  242. package/lib/components/organisms/ChatAIPage/getDaypart.js +9 -0
  243. package/lib/components/organisms/ChatAIPage/getDaypart.spec.js +19 -0
  244. package/lib/components/organisms/ChatAIPage/index.js +3 -0
  245. package/lib/components/organisms/ClientAIButton/ClientAIButton.spec.js +53 -0
  246. package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.spec.js +59 -0
  247. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.spec.js +79 -0
  248. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.spec.js +86 -0
  249. package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.spec.js +49 -0
  250. package/lib/components/organisms/ProjectAIButton/ProjectAIButton.spec.js +67 -0
  251. package/lib/components/organisms/ProjectSummary/ProjectSummary.spec.js +117 -0
  252. package/lib/components/organisms/SnackBar/Snackbar.spec.js +66 -0
  253. package/lib/components/organisms/SourcesInformation/SourceItem.spec.js +19 -0
  254. package/lib/components/organisms/SourcesInformation/SourcesInformationModal.spec.js +52 -0
  255. package/lib/constants/formatExtensions.js +7 -8
  256. package/lib/constants/formatExtensions.spec.js +14 -0
  257. package/lib/constants/maiaExternalConnectorsAccess.spec.js +29 -0
  258. package/lib/constants/maiaFeatureAccess.spec.js +30 -0
  259. package/lib/constants/maiaHourAgentAccess.spec.js +30 -0
  260. package/lib/constants/maiaTaskPanelAccess.spec.js +41 -0
  261. package/lib/constants/permissions/clientRoleAccess.spec.js +65 -0
  262. package/lib/constants/permissions/index.js +2 -2
  263. package/lib/constants/permissions/utils.js +4 -1
  264. package/lib/constants/permissions/utils.spec.js +128 -0
  265. package/lib/constants/plannerSyncEvents.spec.js +31 -0
  266. package/lib/constants/taskUrls.spec.js +9 -0
  267. package/lib/dev/DevMaiaPage.js +30 -0
  268. package/lib/dev/DevReasoningTimeline.js +75 -86
  269. package/lib/dev/Providers.js +5 -3
  270. package/lib/hooks/frequentlyUsedActionsCache.js +17 -0
  271. package/lib/hooks/frequentlyUsedActionsCache.spec.js +25 -0
  272. package/lib/hooks/useAccessClient/useAccessClient.spec.js +149 -0
  273. package/lib/hooks/useAgentModel/useAgentModel.spec.js +83 -0
  274. package/lib/hooks/useAgentModel/useCreateAgent.helpers.js +144 -0
  275. package/lib/hooks/useAgentModel/useCreateAgent.helpers.spec.js +268 -0
  276. package/lib/hooks/useAgentModel/useCreateAgent.js +38 -102
  277. package/lib/hooks/useAgentModel/useCreateAgent.spec.js +314 -0
  278. package/lib/hooks/useAgentModel/useDeleteAgent.spec.js +183 -0
  279. package/lib/hooks/useAgentModel/useUpdateAgent.spec.js +374 -0
  280. package/lib/hooks/useAgentSuggestions.spec.js +89 -0
  281. package/lib/hooks/useCaretPosition.spec.js +58 -0
  282. package/lib/hooks/useChatManager/useChatManager.helpers.js +902 -0
  283. package/lib/hooks/useChatManager/useChatManager.helpers.spec.js +2027 -0
  284. package/lib/hooks/useChatManager/useChatManager.js +272 -745
  285. package/lib/hooks/useChatManager/useChatManager.spec.js +2409 -0
  286. package/lib/hooks/useChatMessages/useChatMessages.helpers.js +365 -0
  287. package/lib/hooks/useChatMessages/useChatMessages.helpers.spec.js +491 -0
  288. package/lib/hooks/useChatMessages/useChatMessages.js +59 -285
  289. package/lib/hooks/useChatMessages/useChatMessages.spec.js +729 -0
  290. package/lib/hooks/useChats/useChats.spec.js +208 -0
  291. package/lib/hooks/useClientSearch.helpers.js +36 -0
  292. package/lib/hooks/useClientSearch.helpers.spec.js +52 -0
  293. package/lib/hooks/useClientSearch.js +4 -32
  294. package/lib/hooks/useClientSearch.spec.js +86 -0
  295. package/lib/hooks/useContextMentions.helpers.js +212 -0
  296. package/lib/hooks/useContextMentions.helpers.spec.js +267 -0
  297. package/lib/hooks/useContextMentions.js +5 -223
  298. package/lib/hooks/useContextMentions.spec.js +338 -0
  299. package/lib/hooks/useContextMentions.types.js +2 -0
  300. package/lib/hooks/useContextPinPopover.helpers.js +95 -0
  301. package/lib/hooks/useContextPinPopover.helpers.spec.js +183 -0
  302. package/lib/hooks/useContextPinPopover.js +16 -75
  303. package/lib/hooks/useContextPinPopover.spec.js +159 -0
  304. package/lib/hooks/useContinueLegacyContextInNewChat/index.js +2 -0
  305. package/lib/hooks/useContinueLegacyContextInNewChat/useContinueLegacyContextInNewChat.js +93 -0
  306. package/lib/hooks/useDebounce.spec.js +42 -0
  307. package/lib/hooks/useEntitySearch.helpers.js +407 -0
  308. package/lib/hooks/useEntitySearch.helpers.spec.js +723 -0
  309. package/lib/hooks/useEntitySearch.js +52 -436
  310. package/lib/hooks/useEntitySearch.spec.js +718 -0
  311. package/lib/hooks/useEvent.spec.js +45 -0
  312. package/lib/hooks/useFrequentlyAskedQuestions.spec.js +222 -0
  313. package/lib/hooks/useFrequentlyUsedActions.js +60 -22
  314. package/lib/hooks/useFrequentlyUsedActions.spec.js +135 -0
  315. package/lib/hooks/useIsMaiaPageRoute.js +26 -0
  316. package/lib/hooks/useIsMaiaPageRoute.spec.js +26 -0
  317. package/lib/hooks/useKnowledge/deleteKnowledge.spec.js +122 -0
  318. package/lib/hooks/useKnowledge/downloadKnowledge.spec.js +148 -0
  319. package/lib/hooks/useKnowledge/saveKnowledge.spec.js +104 -0
  320. package/lib/hooks/useKnowledge/useKnowledgeOperations.spec.js +178 -0
  321. package/lib/hooks/useMaiaChatSessionMeta/index.js +2 -0
  322. package/lib/hooks/useMaiaChatSessionMeta/useMaiaChatSessionMeta.js +24 -0
  323. package/lib/hooks/useMentionAllowedTypes.spec.js +89 -0
  324. package/lib/hooks/useMentionPopover.helpers.js +41 -0
  325. package/lib/hooks/useMentionPopover.helpers.spec.js +100 -0
  326. package/lib/hooks/useMentionPopover.js +9 -35
  327. package/lib/hooks/useMentionPopover.spec.js +392 -0
  328. package/lib/hooks/useMinimizedPillBottomOffset.helpers.js +47 -0
  329. package/lib/hooks/useMinimizedPillBottomOffset.helpers.spec.js +176 -0
  330. package/lib/hooks/useMinimizedPillBottomOffset.js +15 -45
  331. package/lib/hooks/useMinimizedPillBottomOffset.spec.js +89 -0
  332. package/lib/hooks/useMinimizedPillNoveltyDot/useMinimizedPillNoveltyDot.spec.js +67 -0
  333. package/lib/hooks/useModal/useModal.spec.js +73 -0
  334. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.helpers.js +86 -0
  335. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.helpers.spec.js +138 -0
  336. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +8 -82
  337. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.spec.js +417 -0
  338. package/lib/hooks/useProjectSearch.helpers.js +61 -0
  339. package/lib/hooks/useProjectSearch.helpers.spec.js +89 -0
  340. package/lib/hooks/useProjectSearch.js +4 -58
  341. package/lib/hooks/useProjectSearch.spec.js +91 -0
  342. package/lib/hooks/useProjectSummary.spec.js +193 -0
  343. package/lib/hooks/useProjectSummaryConfig.helpers.js +62 -0
  344. package/lib/hooks/useProjectSummaryConfig.helpers.spec.js +151 -0
  345. package/lib/hooks/useProjectSummaryConfig.js +14 -52
  346. package/lib/hooks/useProjectSummaryConfig.spec.js +133 -0
  347. package/lib/hooks/useReasoningTrace/reasoningStore.js +8 -39
  348. package/lib/hooks/useReasoningTrace/reasoningStore.spec.js +112 -0
  349. package/lib/hooks/useRecentClientsSearch.helpers.js +33 -0
  350. package/lib/hooks/useRecentClientsSearch.helpers.spec.js +33 -0
  351. package/lib/hooks/useRecentClientsSearch.js +4 -32
  352. package/lib/hooks/useRecentClientsSearch.spec.js +85 -0
  353. package/lib/hooks/useRecentContexts.spec.js +139 -0
  354. package/lib/hooks/useResize.spec.js +37 -0
  355. package/lib/hooks/useSkillsCatalog.spec.js +88 -0
  356. package/lib/hooks/useSlashCommands.spec.js +139 -0
  357. package/lib/hooks/useSmoothStreamText/useSmoothStreamText.spec.js +101 -0
  358. package/lib/hooks/useSnackBarManager/useSnackBarManager.spec.js +33 -0
  359. package/lib/hooks/useStreamResponse.spec.js +199 -0
  360. package/lib/hooks/useT.spec.js +20 -0
  361. package/lib/hooks/useToggle.spec.js +33 -0
  362. package/lib/hooks/useToggleFavorite/useToggleFavorite.spec.js +171 -0
  363. package/lib/index.js +5 -2
  364. package/lib/lang/br/index.js +26 -7
  365. package/lib/lang/en/index.js +26 -7
  366. package/lib/lang/es/index.js +26 -7
  367. package/lib/lang/fr/index.js +26 -7
  368. package/lib/services/appcues.spec.js +37 -0
  369. package/lib/services/maia/Access/updateAccess.spec.js +137 -0
  370. package/lib/services/maia/Actions/getFrequentlyUsedActions.js +1 -1
  371. package/lib/services/maia/Actions/getFrequentlyUsedActions.spec.js +56 -0
  372. package/lib/services/maia/Actions/getSlashCommands.spec.js +91 -0
  373. package/lib/services/maia/Agents/connectors.spec.js +496 -0
  374. package/lib/services/maia/Agents/createAgent.spec.js +55 -0
  375. package/lib/services/maia/Agents/deleteAgent.spec.js +57 -0
  376. package/lib/services/maia/Agents/fetchAgentDetail.spec.js +108 -0
  377. package/lib/services/maia/Agents/getAgentById.spec.js +190 -0
  378. package/lib/services/maia/Agents/getAgentModels.spec.js +190 -0
  379. package/lib/services/maia/Agents/getAgentSuggestions.spec.js +89 -0
  380. package/lib/services/maia/Agents/getAgents.helpers.js +241 -0
  381. package/lib/services/maia/Agents/getAgents.helpers.spec.js +325 -0
  382. package/lib/services/maia/Agents/getAgents.js +90 -282
  383. package/lib/services/maia/Agents/getAgents.spec.js +1135 -0
  384. package/lib/services/maia/Agents/setAgentToolGroups.spec.js +45 -0
  385. package/lib/services/maia/Agents/toggleFavorite.spec.js +59 -0
  386. package/lib/services/maia/Agents/updateAgent.spec.js +48 -0
  387. package/lib/services/maia/Chats/deleteChat.spec.js +31 -0
  388. package/lib/services/maia/Chats/getChatMessages.spec.js +150 -0
  389. package/lib/services/maia/Chats/getChatsByUserId.spec.js +149 -0
  390. package/lib/services/maia/Chats/markSessionAsRead.spec.js +30 -0
  391. package/lib/services/maia/Chats/patchChat.spec.js +41 -0
  392. package/lib/services/maia/Chats/wasHelpfulChat.spec.js +28 -0
  393. package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.spec.js +58 -0
  394. package/lib/services/maia/Knowledge/delete.spec.js +45 -0
  395. package/lib/services/maia/Knowledge/download.spec.js +78 -0
  396. package/lib/services/maia/Knowledge/save.spec.js +58 -0
  397. package/lib/services/maia/Orchestrator/orchestrator.helpers.js +130 -0
  398. package/lib/services/maia/Orchestrator/orchestrator.helpers.spec.js +225 -0
  399. package/lib/services/maia/Orchestrator/orchestrator.js +38 -121
  400. package/lib/services/maia/Orchestrator/orchestrator.spec.js +181 -0
  401. package/lib/services/maia/RecentClients/getRecentClients.spec.js +52 -0
  402. package/lib/services/maia/RecentContexts/getRecentContexts.spec.js +103 -0
  403. package/lib/services/maia/RecentProjects/getRecentProjects.spec.js +82 -0
  404. package/lib/services/maia/RecentTasks/getRecentTasks.spec.js +63 -0
  405. package/lib/services/maia/RecentUsers/getRecentUsers.spec.js +82 -0
  406. package/lib/services/maia/Skills/createSkill.spec.js +68 -0
  407. package/lib/services/maia/Skills/deleteSkill.spec.js +42 -0
  408. package/lib/services/maia/Skills/generateSkill.spec.js +48 -0
  409. package/lib/services/maia/Skills/getSkills.spec.js +152 -0
  410. package/lib/services/maia/Skills/updateSkill.spec.js +62 -0
  411. package/lib/services/maia/client.spec.js +56 -0
  412. package/lib/services/utils/fetchCOR.spec.js +211 -0
  413. package/lib/services/utils/getCookie.spec.js +20 -0
  414. package/lib/services/utils/mapChatMessages.helpers.js +223 -0
  415. package/lib/services/utils/mapChatMessages.helpers.spec.js +336 -0
  416. package/lib/services/utils/mapChatMessages.js +25 -254
  417. package/lib/services/utils/mapChatMessages.spec.js +254 -0
  418. package/lib/store/chatsSidebarOptimistic.spec.js +145 -0
  419. package/lib/store/maiaLastChatPersistence.spec.js +22 -0
  420. package/lib/store/maiaPanelSessionPersistence.spec.js +62 -0
  421. package/lib/store/sessions/sessionNotificationSound.spec.js +145 -0
  422. package/lib/store/sessions/sessionNotifications.helpers.js +45 -0
  423. package/lib/store/sessions/sessionNotifications.helpers.spec.js +63 -0
  424. package/lib/store/sessions/sessionNotifications.js +35 -41
  425. package/lib/store/sessions/sessionNotifications.spec.js +106 -0
  426. package/lib/store/sessions/sessionStreamManager.helpers.js +134 -0
  427. package/lib/store/sessions/sessionStreamManager.helpers.spec.js +177 -0
  428. package/lib/store/sessions/sessionStreamManager.js +209 -277
  429. package/lib/store/sessions/sessionStreamManager.spec.js +939 -0
  430. package/lib/store/sessions/sessions.types.spec.js +16 -0
  431. package/lib/store/sessions/useSessionsStore.spec.js +135 -0
  432. package/lib/store/useChatsStore.spec.js +619 -0
  433. package/lib/store/useFaqsStore.spec.js +57 -0
  434. package/lib/styles/cascade.js +29 -3
  435. package/lib/styles/transitions.js +3 -1
  436. package/lib/test/mockSseStream.js +121 -0
  437. package/lib/test/streamdownCodeMock.js +6 -0
  438. package/lib/test/streamdownMock.js +12 -0
  439. package/lib/types/Chat.js +1 -1
  440. package/lib/types/agentModal.js +1 -1
  441. package/lib/types/global.d.js +1 -1
  442. package/lib/types/reasoning.js +1 -1
  443. package/lib/utils/actionCategoryMap.spec.js +18 -0
  444. package/lib/utils/agentDisplayName.spec.js +48 -0
  445. package/lib/utils/autoApproveStorage.spec.js +25 -0
  446. package/lib/utils/chatInputFiles.spec.js +39 -0
  447. package/lib/utils/contextMentionIcons.spec.js +41 -0
  448. package/lib/utils/contextMentionLabel.spec.js +13 -0
  449. package/lib/utils/contextMentionTriggers.spec.js +44 -0
  450. package/lib/utils/contextMentionTypeLabel.spec.js +14 -0
  451. package/lib/utils/corConnectorMentionTypes.spec.js +23 -0
  452. package/lib/utils/entityLinkRender.spec.js +72 -0
  453. package/lib/utils/fileDownloadHelper.spec.js +67 -0
  454. package/lib/utils/formatQuickActionMessage.spec.js +27 -0
  455. package/lib/utils/formatUnreadCount.spec.js +12 -0
  456. package/lib/utils/getUnitFileSize.spec.js +18 -0
  457. package/lib/utils/hitlAnalytics.spec.js +136 -0
  458. package/lib/utils/hoursPlannerQuickActionType.js +74 -1
  459. package/lib/utils/hoursPlannerQuickActionType.spec.js +64 -0
  460. package/lib/utils/imagePreprocessor.helpers.js +28 -0
  461. package/lib/utils/imagePreprocessor.helpers.spec.js +28 -0
  462. package/lib/utils/imagePreprocessor.js +12 -37
  463. package/lib/utils/imagePreprocessor.spec.js +112 -0
  464. package/lib/utils/maiaPageRoute.js +24 -0
  465. package/lib/utils/maiaPageRoute.spec.js +23 -0
  466. package/lib/utils/mapBackendLang.spec.js +19 -0
  467. package/lib/utils/navigateContextEntity.spec.js +50 -0
  468. package/lib/utils/normalizeAgentConnectors.spec.js +98 -0
  469. package/lib/utils/openTaskInCorPanel.spec.js +43 -0
  470. package/lib/utils/orchestratorSubagents.spec.js +32 -0
  471. package/lib/utils/reasoningMappers.spec.js +103 -0
  472. package/lib/utils/recentContextsHomeLimit.spec.js +32 -0
  473. package/lib/utils/renderContextMentions.helpers.js +110 -0
  474. package/lib/utils/renderContextMentions.helpers.spec.js +87 -0
  475. package/lib/utils/renderContextMentions.js +4 -110
  476. package/lib/utils/renderContextMentions.spec.js +268 -0
  477. package/lib/utils/retryCompletion.spec.js +181 -0
  478. package/lib/utils/skillContentSize.spec.js +13 -0
  479. package/lib/utils/slashCommandMarker.spec.js +43 -0
  480. package/lib/utils/sortManagerHoursHomeFuas.spec.js +51 -0
  481. package/lib/utils/sseStreamContent.spec.js +31 -0
  482. package/lib/utils/streamActivityMessages.helpers.js +223 -0
  483. package/lib/utils/streamActivityMessages.helpers.spec.js +84 -0
  484. package/lib/utils/streamActivityMessages.js +33 -238
  485. package/lib/utils/streamActivityMessages.spec.js +336 -0
  486. package/lib/utils/validateTrimmedFields.spec.js +26 -0
  487. package/package.json +2 -2
  488. package/README.md +0 -2
  489. package/lib/components/atoms/ContextCompactedNotice/ContextCompactedNotice.js +0 -53
  490. package/lib/components/atoms/ContextCompactedNotice/ContextCompactedNotice.styles.js +0 -8
  491. package/lib/components/atoms/ContextCompactedNotice/index.js +0 -2
  492. package/lib/types/contextCompaction.js +0 -48
  493. package/lib/types/jest-dom.d.js +0 -2
@@ -0,0 +1,512 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
4
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
5
+ import { COR_TOOL_GROUP_SLUGS, DEFAULT_COR_ACCESS, deriveCorAccessFromToolGroupSlugs, deriveMcpConnectorSlugs } from '../../../utils/normalizeAgentConnectors';
6
+ var KNOWLEDGE_ATTACHMENT_STATUSES = ['pending', 'processing', 'done', 'failed', 'started'];
7
+ export var normalizeKnowledgeAttachmentStatus = function normalizeKnowledgeAttachmentStatus(status) {
8
+ if (KNOWLEDGE_ATTACHMENT_STATUSES.includes(status)) {
9
+ return status;
10
+ }
11
+ return 'pending';
12
+ };
13
+ var isModalAccessType = function isModalAccessType(value) {
14
+ return value === 'company' || value === 'clients' || value === 'only_me';
15
+ };
16
+ export var validateFieldValues = function validateFieldValues(valueToValidate) {
17
+ if (!valueToValidate.general.name || !valueToValidate.general.userPrompt) {
18
+ return false;
19
+ }
20
+ return true;
21
+ };
22
+ /** Misma estructura que el efecto que hidrata desde useGetAgentById (todas las pestañas del ABM). */
23
+ export var buildEditingModalValuesFromAgentDetail = function buildEditingModalValuesFromAgentDetail(agentById, agentModels, prev) {
24
+ var _agentById$knowledgeB, _agentById$clients;
25
+ var agentModel = agentModels.find(function (model) {
26
+ return model.id === agentById.modelAiId;
27
+ });
28
+ return _objectSpread(_objectSpread({}, prev), {}, {
29
+ isEditing: true,
30
+ general: {
31
+ emoji: agentById.emoji,
32
+ name: agentById.name,
33
+ introduction: agentById.introduction,
34
+ inputPlaceholder: agentById.inputPlaceholder,
35
+ isActive: agentById.isActive,
36
+ aiModel: agentModel || null,
37
+ id: agentById.id,
38
+ userPrompt: agentById.userPrompt,
39
+ knowledgeBases: [],
40
+ is_favorite: agentById.is_favorite
41
+ },
42
+ knowledge: ((_agentById$knowledgeB = agentById.knowledgeBases) === null || _agentById$knowledgeB === void 0 ? void 0 : _agentById$knowledgeB.map(function (k) {
43
+ return {
44
+ file: new File([], k.filename),
45
+ id: k.id.toString(),
46
+ name: k.filename,
47
+ size: k.file_size_bytes || 0,
48
+ type: k.original_file_type,
49
+ status: normalizeKnowledgeAttachmentStatus(k.status),
50
+ url_original: k.url_original || undefined,
51
+ url_thumbnail: k.url_thumbnail || undefined
52
+ };
53
+ })) || [],
54
+ accessibility: {
55
+ accessType: isModalAccessType(agentById.access) ? agentById.access : 'company',
56
+ clients: ((_agentById$clients = agentById.clients) === null || _agentById$clients === void 0 ? void 0 : _agentById$clients.map(function (client) {
57
+ var _client$id, _client$is_active, _client$is_deleted;
58
+ return {
59
+ id: ((_client$id = client.id) === null || _client$id === void 0 ? void 0 : _client$id.toString()) || '',
60
+ name: client.name,
61
+ is_active: (_client$is_active = client.is_active) !== null && _client$is_active !== void 0 ? _client$is_active : false,
62
+ is_deleted: (_client$is_deleted = client.is_deleted) !== null && _client$is_deleted !== void 0 ? _client$is_deleted : false
63
+ };
64
+ })) || null,
65
+ corAccess: deriveCorAccessFromToolGroupSlugs(agentById.toolGroupSlugs),
66
+ selectedConnectors: deriveMcpConnectorSlugs(agentById.connectors)
67
+ }
68
+ });
69
+ };
70
+ export var areAbmClientsArraysEqual = function areAbmClientsArraysEqual(clients1, clients2) {
71
+ if (!clients1 && !clients2) return true;
72
+ if (!clients1 || !clients2) return false;
73
+ if (clients1.length !== clients2.length) return false;
74
+ var clients1Ids = clients1.map(function (client) {
75
+ var _client$clientId;
76
+ return (_client$clientId = client.clientId) !== null && _client$clientId !== void 0 ? _client$clientId : client.id;
77
+ }).sort();
78
+ var clients2Ids = clients2.map(function (client) {
79
+ var _client$clientId2;
80
+ return (_client$clientId2 = client.clientId) !== null && _client$clientId2 !== void 0 ? _client$clientId2 : client.id;
81
+ }).sort();
82
+ return clients1Ids.every(function (id, index) {
83
+ return id === clients2Ids[index];
84
+ });
85
+ };
86
+ export var hasAccessibilitySectionChanged = function hasAccessibilitySectionChanged(current, initial) {
87
+ var _current$corAccess, _initial$corAccess;
88
+ if (!initial || !current) return true;
89
+ var accessTypeSame = current.accessType === initial.accessType;
90
+ var clientsSame = areAbmClientsArraysEqual(current.clients, initial.clients);
91
+ var currentCorAccess = (_current$corAccess = current.corAccess) !== null && _current$corAccess !== void 0 ? _current$corAccess : DEFAULT_COR_ACCESS;
92
+ var initialCorAccess = (_initial$corAccess = initial.corAccess) !== null && _initial$corAccess !== void 0 ? _initial$corAccess : DEFAULT_COR_ACCESS;
93
+ var corAccessSame = COR_TOOL_GROUP_SLUGS.every(function (slug) {
94
+ return currentCorAccess[slug] === initialCorAccess[slug];
95
+ });
96
+ return !accessTypeSame || !clientsSame || !corAccessSame;
97
+ };
98
+ export var isSameAgentModalSnapshot = function isSameAgentModalSnapshot(current, initial, fileActions) {
99
+ var _current$general$aiMo, _initial$general$aiMo, _current$knowledge, _initial$knowledge, _current$knowledge2, _initial$knowledge2, _fileActions$toUpdate, _fileActions$toDelete;
100
+ if (!initial.general || !current.general) return false;
101
+ return current.general.name === initial.general.name && current.general.emoji === initial.general.emoji && current.general.introduction === initial.general.introduction && current.general.inputPlaceholder === initial.general.inputPlaceholder && ((_current$general$aiMo = current.general.aiModel) === null || _current$general$aiMo === void 0 ? void 0 : _current$general$aiMo.id) === ((_initial$general$aiMo = initial.general.aiModel) === null || _initial$general$aiMo === void 0 ? void 0 : _initial$general$aiMo.id) && current.general.userPrompt === initial.general.userPrompt && (((_current$knowledge = current.knowledge) === null || _current$knowledge === void 0 ? void 0 : _current$knowledge.length) === ((_initial$knowledge = initial.knowledge) === null || _initial$knowledge === void 0 ? void 0 : _initial$knowledge.length) || !((_current$knowledge2 = current.knowledge) !== null && _current$knowledge2 !== void 0 && _current$knowledge2.length) && !((_initial$knowledge2 = initial.knowledge) !== null && _initial$knowledge2 !== void 0 && _initial$knowledge2.length)) && !((_fileActions$toUpdate = fileActions.toUpdate) !== null && _fileActions$toUpdate !== void 0 && _fileActions$toUpdate.length) && !((_fileActions$toDelete = fileActions.toDelete) !== null && _fileActions$toDelete !== void 0 && _fileActions$toDelete.length) && !hasAccessibilitySectionChanged(current.accessibility, initial.accessibility);
102
+ };
103
+ export var hasAgentCreationDraft = function hasAgentCreationDraft(values, defaults) {
104
+ var _values$general$aiMod, _values$general$userP;
105
+ if (values.isEditing) return false;
106
+ var isDefaultAiModel = defaults.defaultAiModelId != null && ((_values$general$aiMod = values.general.aiModel) === null || _values$general$aiMod === void 0 ? void 0 : _values$general$aiMod.id) === defaults.defaultAiModelId;
107
+ var isDefaultInputPlaceholder = values.general.inputPlaceholder === defaults.defaultInputPlaceholder;
108
+ var isDefaultUserPrompt = values.general.userPrompt === defaults.defaultUserPromptPlaceholder || values.general.userPrompt === '' || values.general.userPrompt === null;
109
+ var hasName = values.general.name.trim() !== '';
110
+ var hasEmoji = values.general.emoji.trim() !== '';
111
+ var hasIntroduction = values.general.introduction.trim() !== '';
112
+ var hasInputPlaceholder = values.general.inputPlaceholder.trim() !== '' && !isDefaultInputPlaceholder;
113
+ var hasUserPrompt = ((_values$general$userP = values.general.userPrompt) === null || _values$general$userP === void 0 ? void 0 : _values$general$userP.trim()) !== '' && !isDefaultUserPrompt;
114
+ var hasKnowledge = !!values.knowledge.length;
115
+ var hasCustomAiModel = Boolean(values.general.aiModel && !isDefaultAiModel);
116
+ var hasAccessibility = values.accessibility.accessType !== 'company';
117
+ return hasName || hasEmoji || hasIntroduction || hasInputPlaceholder || hasUserPrompt || hasKnowledge || hasCustomAiModel || hasAccessibility;
118
+ };
119
+ export var hasAbmPendingChanges = function hasAbmPendingChanges(values, initial, fileActions, defaults) {
120
+ var _fileActions$toDelete2, _fileActions$toUpload;
121
+ var hasCreationDraft = hasAgentCreationDraft(values, defaults);
122
+ var hasEditingChanges = values.isEditing && Boolean(initial) && (!isSameAgentModalSnapshot(values, initial, fileActions) || Boolean((_fileActions$toDelete2 = fileActions.toDelete) === null || _fileActions$toDelete2 === void 0 ? void 0 : _fileActions$toDelete2.length) || Boolean((_fileActions$toUpload = fileActions.toUpload) === null || _fileActions$toUpload === void 0 ? void 0 : _fileActions$toUpload.length));
123
+ return hasCreationDraft || hasEditingChanges;
124
+ };
125
+ export var hasInactiveAccessibilityClients = function hasInactiveAccessibilityClients(clients) {
126
+ if (!(clients !== null && clients !== void 0 && clients.length)) return false;
127
+ return clients.some(function (client) {
128
+ return client.is_active === false || client.is_deleted === true;
129
+ });
130
+ };
131
+ export var resolveKnowledgeUploadOutcome = function resolveKnowledgeUploadOutcome(knowledge) {
132
+ var hasPendingFiles = knowledge.some(function (file) {
133
+ return file.status === 'pending';
134
+ });
135
+ var hasErrorFiles = knowledge.some(function (file) {
136
+ return file.status === 'failed';
137
+ });
138
+ if (hasPendingFiles) return 'pending';
139
+ if (hasErrorFiles) return 'error';
140
+ if (knowledge.length > 0) return 'complete';
141
+ return null;
142
+ };
143
+ export var isAbmSaveDisabled = function isAbmSaveDisabled(_ref) {
144
+ var _values$accessibility;
145
+ var values = _ref.values,
146
+ initial = _ref.initial,
147
+ fileActions = _ref.fileActions,
148
+ _ref$isLoading = _ref.isLoading,
149
+ isLoading = _ref$isLoading === void 0 ? false : _ref$isLoading,
150
+ _ref$isLoadingKnowled = _ref.isLoadingKnowledge,
151
+ isLoadingKnowledge = _ref$isLoadingKnowled === void 0 ? false : _ref$isLoadingKnowled,
152
+ _ref$isLoadingCreate = _ref.isLoadingCreate,
153
+ isLoadingCreate = _ref$isLoadingCreate === void 0 ? false : _ref$isLoadingCreate,
154
+ _ref$isLoadingUpdateA = _ref.isLoadingUpdateAccess,
155
+ isLoadingUpdateAccess = _ref$isLoadingUpdateA === void 0 ? false : _ref$isLoadingUpdateA,
156
+ _ref$hasFileErrors = _ref.hasFileErrors,
157
+ hasFileErrors = _ref$hasFileErrors === void 0 ? false : _ref$hasFileErrors;
158
+ var unchanged = Boolean(initial && isSameAgentModalSnapshot(values, initial, fileActions));
159
+ return !validateFieldValues(values) || unchanged || isLoading || isLoadingKnowledge || isLoadingCreate || isLoadingUpdateAccess || hasInactiveAccessibilityClients((_values$accessibility = values.accessibility) === null || _values$accessibility === void 0 ? void 0 : _values$accessibility.clients) || hasFileErrors;
160
+ };
161
+ export var applyKnowledgeFileStatusUpdate = function applyKnowledgeFileStatusUpdate(knowledge, fileStatus) {
162
+ return knowledge.map(function (file) {
163
+ var _fileStatus$knowledge;
164
+ if (file.name !== fileStatus.filename) {
165
+ return file;
166
+ }
167
+ return _objectSpread(_objectSpread({}, file), {}, {
168
+ status: normalizeKnowledgeAttachmentStatus(fileStatus.status),
169
+ id: ((_fileStatus$knowledge = fileStatus.knowledge_base_id) === null || _fileStatus$knowledge === void 0 ? void 0 : _fileStatus$knowledge.toString()) || file.id
170
+ });
171
+ });
172
+ };
173
+ export var shouldConfirmAbmClose = function shouldConfirmAbmClose(hasPendingChanges, successFlags) {
174
+ if (!hasPendingChanges) return false;
175
+ return !(successFlags.create || successFlags.update || successFlags["delete"]);
176
+ };
177
+ export var ABM_ACCESS_DENIED_ERROR = "Access denied: You don't have permission to access this agent";
178
+ export var isAbmAccessDeniedError = function isAbmAccessDeniedError(error) {
179
+ return error === ABM_ACCESS_DENIED_ERROR;
180
+ };
181
+ export var canRenderAbmAgentModal = function canRenderAbmAgentModal(permissions) {
182
+ return Boolean((permissions === null || permissions === void 0 ? void 0 : permissions.create) || (permissions === null || permissions === void 0 ? void 0 : permissions.edit) || (permissions === null || permissions === void 0 ? void 0 : permissions["delete"]));
183
+ };
184
+ export var shouldCloseAbmOnBackdropClick = function shouldCloseAbmOnBackdropClick(target, currentTarget, isProcessingFiles) {
185
+ return target === currentTarget && !isProcessingFiles;
186
+ };
187
+ export var resolveAbmProcessingKnowledgeLabelKey = function resolveAbmProcessingKnowledgeLabelKey(isEditing) {
188
+ return isEditing ? 'processingKnowledge.descriptionUpdate' : 'processingKnowledge.descriptionCreate';
189
+ };
190
+ var ABM_OPEN_INITIAL_SECTIONS = ['general', 'knowledge', 'accessibility'];
191
+ export var resolvePendingAbmInitialSection = function resolvePendingAbmInitialSection(initialSection) {
192
+ if (initialSection && ABM_OPEN_INITIAL_SECTIONS.includes(initialSection)) {
193
+ return initialSection;
194
+ }
195
+ return null;
196
+ };
197
+ export var shouldDenyAbmEditWithoutMultiAgents = function shouldDenyAbmEditWithoutMultiAgents(isEditing, hasMultiAgentsAccess) {
198
+ return Boolean(isEditing && !hasMultiAgentsAccess);
199
+ };
200
+ export var resolveAbmCreateAccessUpdateContext = function resolveAbmCreateAccessUpdateContext(accessType) {
201
+ return {
202
+ isFromCreation: true,
203
+ isFromEditing: false,
204
+ hasActionFiles: accessType !== 'company',
205
+ operationType: 'create',
206
+ hasBeenCalled: false
207
+ };
208
+ };
209
+ export var shouldSyncAbmClientAccessOnCreate = function shouldSyncAbmClientAccessOnCreate(accessType) {
210
+ return accessType !== 'company';
211
+ };
212
+ export var buildAbmFavoriteToggleAgents = function buildAbmFavoriteToggleAgents(createdAgent) {
213
+ return {
214
+ listAgent: _objectSpread(_objectSpread({}, createdAgent), {}, {
215
+ is_favorite: true
216
+ }),
217
+ toggleAgent: _objectSpread(_objectSpread({}, createdAgent), {}, {
218
+ is_favorite: false
219
+ })
220
+ };
221
+ };
222
+ export var resolveAbmCreateSuccessPlan = function resolveAbmCreateSuccessPlan(actions) {
223
+ var hasDelete = actions.toDelete.length > 0;
224
+ var hasUpload = actions.toUpload.length > 0;
225
+ if (hasDelete && hasUpload) return 'deleteAndCreate';
226
+ if (hasDelete) return 'deleteOnly';
227
+ if (hasUpload) return 'uploadOnly';
228
+ return 'accessOnly';
229
+ };
230
+ export var shouldShowProcessFilesForCreatePlan = function shouldShowProcessFilesForCreatePlan(plan) {
231
+ return plan !== 'accessOnly';
232
+ };
233
+ export var resolveAbmUpdateSuccessPlan = function resolveAbmUpdateSuccessPlan(actions, accessibilityChanged) {
234
+ var createPlan = resolveAbmCreateSuccessPlan(actions);
235
+ if (createPlan !== 'accessOnly') {
236
+ return createPlan;
237
+ }
238
+ if (accessibilityChanged) {
239
+ return 'accessOnly';
240
+ }
241
+ return 'generalOnly';
242
+ };
243
+ export var resolveAbmUpdateAccessUpdateContext = function resolveAbmUpdateAccessUpdateContext() {
244
+ return {
245
+ isFromCreation: false,
246
+ isFromEditing: true,
247
+ hasActionFiles: true,
248
+ operationType: 'update',
249
+ hasBeenCalled: false
250
+ };
251
+ };
252
+ export var resolveAbmUpdateAccessOnlyContext = function resolveAbmUpdateAccessOnlyContext(current) {
253
+ if (current.hasBeenCalled || current.hasActionFiles) {
254
+ return null;
255
+ }
256
+ return {
257
+ isFromCreation: false,
258
+ isFromEditing: true,
259
+ hasActionFiles: false,
260
+ operationType: 'update',
261
+ hasBeenCalled: false
262
+ };
263
+ };
264
+ export var resolveAbmCreateAccessOnlyDecision = function resolveAbmCreateAccessOnlyDecision(current, accessType) {
265
+ if (!shouldSyncAbmClientAccessOnCreate(accessType)) {
266
+ return {
267
+ nextContext: current,
268
+ shouldCallAccessClient: false
269
+ };
270
+ }
271
+ if (current.hasBeenCalled) {
272
+ return {
273
+ nextContext: current,
274
+ shouldCallAccessClient: false
275
+ };
276
+ }
277
+ return {
278
+ nextContext: {
279
+ isFromCreation: true,
280
+ isFromEditing: false,
281
+ hasActionFiles: current.hasActionFiles || false,
282
+ operationType: 'create',
283
+ hasBeenCalled: false
284
+ },
285
+ shouldCallAccessClient: true
286
+ };
287
+ };
288
+ export var createResetAbmAccessUpdateContext = function createResetAbmAccessUpdateContext() {
289
+ return {
290
+ isFromCreation: false,
291
+ isFromEditing: false,
292
+ hasActionFiles: false,
293
+ operationType: null,
294
+ hasBeenCalled: false
295
+ };
296
+ };
297
+ export var shouldFinalizeAbmUpdateWithoutPendingWork = function shouldFinalizeAbmUpdateWithoutPendingWork(input) {
298
+ return !input.hasPendingFiles && !input.isShowProcessFiles && input.toUploadCount === 0 && !input.accessHasActionFiles && !input.successUpdateAccess && !input.processFilesTimedOut;
299
+ };
300
+ export var resolveKnowledgeWsCompletionEffects = function resolveKnowledgeWsCompletionEffects(uploadOutcome, context, accessHandled, filesFinished) {
301
+ if (uploadOutcome === 'error' || uploadOutcome === 'complete') {
302
+ var incrementFilesProcessed = uploadOutcome === 'complete' && (context.hasActionFiles && accessHandled || context.operationType === 'create' && !context.hasActionFiles && !filesFinished);
303
+ var markFilesFinishedForCreate = uploadOutcome === 'complete' && context.operationType === 'create' && !context.hasActionFiles && !filesFinished;
304
+ return {
305
+ closeProcessFiles: true,
306
+ incrementFilesProcessed: incrementFilesProcessed,
307
+ markFilesFinishedForCreate: markFilesFinishedForCreate
308
+ };
309
+ }
310
+ return null;
311
+ };
312
+ export var resolveAbmKnowledgeErrorMessageKey = function resolveAbmKnowledgeErrorMessageKey(isEditing) {
313
+ return isEditing ? 'confirmAgentUpdatedWithFilesError' : 'confirmAgentWithFilesError';
314
+ };
315
+ export var shouldBlockKnowledgeDeleteSuccessClose = function shouldBlockKnowledgeDeleteSuccessClose(input) {
316
+ return input.hasPendingFiles || input.isShowProcessFiles || input.toUploadCount > 0 || input.processFilesTimedOut;
317
+ };
318
+ export var shouldDeferAccessUpdateUntilFilesComplete = function shouldDeferAccessUpdateUntilFilesComplete(context, hasPendingFiles, isShowProcessFiles) {
319
+ return context.hasActionFiles && (hasPendingFiles || isShowProcessFiles);
320
+ };
321
+ export var shouldCloseCreateAfterKnowledgeWithoutAccess = function shouldCloseCreateAfterKnowledgeWithoutAccess(input) {
322
+ return input.operationType === 'create' && !input.hasActionFiles && input.filesFinished && input.hasSuccessCreate && !input.hasPendingFiles && !input.isShowProcessFiles;
323
+ };
324
+ export var shouldCloseCreateAfterKnowledgeWithAccess = function shouldCloseCreateAfterKnowledgeWithAccess(input) {
325
+ return input.operationType === 'create' && input.hasActionFiles && input.accessHandled && input.hasSuccessCreate && !input.hasPendingFiles && !input.isShowProcessFiles;
326
+ };
327
+ export var shouldApplyPendingSectionAfterOpen = function shouldApplyPendingSectionAfterOpen(isEditing, pendingSection) {
328
+ return Boolean(pendingSection && !isEditing);
329
+ };
330
+ export var resolveAbmOpenModalLoadAction = function resolveAbmOpenModalLoadAction(params) {
331
+ if (!params.isEditing) {
332
+ return 'apply_create_values';
333
+ }
334
+ if (shouldDenyAbmEditWithoutMultiAgents(true, params.hasMultiAgentsAccess)) {
335
+ return 'deny_edit';
336
+ }
337
+ if (params.hasPrefetchedAgent) {
338
+ return 'prefetch_edit';
339
+ }
340
+ return 'fetch_edit';
341
+ };
342
+ export var canApplyAbmEditingAgentDetail = function canApplyAbmEditingAgentDetail(source, hasMultiAgentsAccess) {
343
+ return source.type === 'custom' && hasMultiAgentsAccess;
344
+ };
345
+ export var shouldSetDefaultAiModelForNewAgent = function shouldSetDefaultAiModelForNewAgent(params) {
346
+ return !params.isLoading && !params.agentLoading && !params.hasAgentById && !params.isEditing;
347
+ };
348
+ export var shouldSkipAbmConfirmWithoutMultiAgents = function shouldSkipAbmConfirmWithoutMultiAgents(hasMultiAgentsAccess) {
349
+ return !hasMultiAgentsAccess;
350
+ };
351
+ export var resolveAbmDraftFavoriteValue = function resolveAbmDraftFavoriteValue(currentIsFavorite) {
352
+ return !currentIsFavorite;
353
+ };
354
+ export var resolveAbmCreateFavoriteAgents = function resolveAbmCreateFavoriteAgents(createdAgent, markFavorite) {
355
+ if (!markFavorite) {
356
+ return {
357
+ listAgent: createdAgent,
358
+ toggleAgent: null
359
+ };
360
+ }
361
+ var _buildAbmFavoriteTogg = buildAbmFavoriteToggleAgents(createdAgent),
362
+ listAgent = _buildAbmFavoriteTogg.listAgent,
363
+ toggleAgent = _buildAbmFavoriteTogg.toggleAgent;
364
+ return {
365
+ listAgent: listAgent,
366
+ toggleAgent: toggleAgent
367
+ };
368
+ };
369
+ export var applyAbmKnowledgeFileActions = function applyAbmKnowledgeFileActions(value, deleteKnowledge, currentKnowledge, currentActions) {
370
+ if (!deleteKnowledge) {
371
+ return _objectSpread(_objectSpread({}, currentActions), {}, {
372
+ toUpload: [].concat(_toConsumableArray(currentActions.toUpload), _toConsumableArray(value || []))
373
+ });
374
+ }
375
+ var filesPrevIds = value !== null && value !== void 0 && value.length ? new Set(value.map(function (file) {
376
+ return file.id;
377
+ })) : new Set();
378
+ var newFiles = currentKnowledge.filter(function (file) {
379
+ return !filesPrevIds.has(file.id) && file.status !== 'started';
380
+ });
381
+ var nextToUpload = currentActions.toUpload;
382
+ if (!newFiles.length && currentActions.toUpload.length) {
383
+ var _value$map;
384
+ var valueIds = new Set((_value$map = value === null || value === void 0 ? void 0 : value.map(function (file) {
385
+ return file.id;
386
+ })) !== null && _value$map !== void 0 ? _value$map : []);
387
+ nextToUpload = currentActions.toUpload.filter(function (file) {
388
+ return valueIds.has(file.id);
389
+ });
390
+ }
391
+ return {
392
+ toUpload: nextToUpload,
393
+ toDelete: [].concat(_toConsumableArray(currentActions.toDelete), _toConsumableArray(newFiles))
394
+ };
395
+ };
396
+ export var mergeAbmAgentValuesByKey = function mergeAbmAgentValuesByKey(prev, key, value, deleteKnowledge) {
397
+ if (key === 'knowledge') {
398
+ return _objectSpread(_objectSpread({}, prev), {}, {
399
+ knowledge: deleteKnowledge ? value : [].concat(_toConsumableArray(prev.knowledge || []), _toConsumableArray(value || []))
400
+ });
401
+ }
402
+ if (key === 'accessibility') {
403
+ return _objectSpread(_objectSpread({}, prev), {}, {
404
+ accessibility: value
405
+ });
406
+ }
407
+ return _objectSpread(_objectSpread({}, prev), {}, {
408
+ general: _objectSpread(_objectSpread({}, prev.general), {}, _defineProperty({}, key, value))
409
+ });
410
+ };
411
+ export var shouldRunAbmCreateSuccessHandler = function shouldRunAbmCreateSuccessHandler(successCreateId, isLoadingCreate, lastHandledCreateId) {
412
+ return Boolean(successCreateId && !isLoadingCreate && lastHandledCreateId !== successCreateId);
413
+ };
414
+ export var mergeAbmOpenAgentValues = function mergeAbmOpenAgentValues(initialValues, incoming) {
415
+ if (!incoming) {
416
+ return initialValues;
417
+ }
418
+ return _objectSpread(_objectSpread(_objectSpread({}, initialValues), incoming), {}, {
419
+ general: _objectSpread(_objectSpread({}, initialValues.general), incoming.general || {}),
420
+ accessibility: _objectSpread(_objectSpread({}, initialValues.accessibility), incoming.accessibility || {}),
421
+ knowledge: incoming.knowledge || []
422
+ });
423
+ };
424
+ export var resolveAbmCreateKnowledgeHandler = function resolveAbmCreateKnowledgeHandler(plan) {
425
+ if (plan === 'deleteAndCreate') return 'deleteAndCreate';
426
+ if (plan === 'deleteOnly') return 'deleteOnly';
427
+ if (plan === 'uploadOnly') return 'uploadOnly';
428
+ return null;
429
+ };
430
+ export var shouldRepeatDeleteKnowledgesOnCreate = function shouldRepeatDeleteKnowledgesOnCreate(plan) {
431
+ return plan === 'deleteOnly';
432
+ };
433
+ export var shouldEnqueueAbmCreateFavoriteToggle = function shouldEnqueueAbmCreateFavoriteToggle(toggleAgent) {
434
+ return Boolean(toggleAgent);
435
+ };
436
+ export var shouldHandleAbmCreateAccessOnlyClient = function shouldHandleAbmCreateAccessOnlyClient(decision) {
437
+ return decision.shouldCallAccessClient;
438
+ };
439
+ export var createInitialAbmModalValues = function createInitialAbmModalValues() {
440
+ return {
441
+ isEditing: false,
442
+ knowledge: [],
443
+ general: {
444
+ name: '',
445
+ emoji: '',
446
+ introduction: '',
447
+ inputPlaceholder: '',
448
+ isActive: false,
449
+ aiModel: null,
450
+ id: null,
451
+ userPrompt: null,
452
+ knowledgeBases: [],
453
+ is_favorite: false
454
+ },
455
+ accessibility: {
456
+ accessType: 'company',
457
+ clients: null,
458
+ corAccess: DEFAULT_COR_ACCESS
459
+ }
460
+ };
461
+ };
462
+ export var shouldProcessKnowledgeWsStatus = function shouldProcessKnowledgeWsStatus(status) {
463
+ return status === 'done' || status === 'failed';
464
+ };
465
+ export var resolveAbmKnowledgeWsChannel = function resolveAbmKnowledgeWsChannel(agentById, successCreateId) {
466
+ var _agentById$id;
467
+ var agentId = (_agentById$id = agentById === null || agentById === void 0 ? void 0 : agentById.id) !== null && _agentById$id !== void 0 ? _agentById$id : successCreateId;
468
+ return agentId != null ? "knowledge-base.status:".concat(agentId) : null;
469
+ };
470
+ export var resolveAbmFavoriteTooltipKey = function resolveAbmFavoriteTooltipKey(isFavorite) {
471
+ return isFavorite ? 'generalSection.removeFavorite' : 'generalSection.addFavorite';
472
+ };
473
+ export var shouldSelectAgentAfterDelete = function shouldSelectAgentAfterDelete(currentSelectedAgentId, deletedAgentId) {
474
+ return currentSelectedAgentId != null && deletedAgentId != null && String(currentSelectedAgentId) === String(deletedAgentId);
475
+ };
476
+ export var shouldRunAbmProcessFilesTimeout = function shouldRunAbmProcessFilesTimeout(hasPendingFiles, isShowProcessFiles) {
477
+ return hasPendingFiles || isShowProcessFiles;
478
+ };
479
+ export var resolveAbmProcessFilesTimeoutSuccessKey = function resolveAbmProcessFilesTimeoutSuccessKey(isEditing) {
480
+ return isEditing ? 'confirmAgentUpdated' : 'confirmAgentCreated';
481
+ };
482
+ export var shouldSyncSelectedAgentAfterMutation = function shouldSyncSelectedAgentAfterMutation(currentSelectedAgentId, mutatedAgentId) {
483
+ return currentSelectedAgentId != null && mutatedAgentId != null && String(currentSelectedAgentId) === String(mutatedAgentId);
484
+ };
485
+ export var shouldIncludeAccessibilityUpdateInKnowledgeBatch = function shouldIncludeAccessibilityUpdateInKnowledgeBatch(accessibilityChanged) {
486
+ return accessibilityChanged;
487
+ };
488
+ export var shouldResetSuccessUpdateAccessOnCreateClose = function shouldResetSuccessUpdateAccessOnCreateClose(successUpdateAccess) {
489
+ return successUpdateAccess;
490
+ };
491
+ export var shouldHydrateAgentConnectorsOnEdit = function shouldHydrateAgentConnectorsOnEdit(agentId, externalConnectorsEnabled) {
492
+ return Boolean(agentId && externalConnectorsEnabled);
493
+ };
494
+ export var shouldShowAbmLoaderFiles = function shouldShowAbmLoaderFiles(isShowProcessFiles, hasPendingFiles) {
495
+ return isShowProcessFiles && hasPendingFiles;
496
+ };
497
+ export var resolveAbmModalTitleKey = function resolveAbmModalTitleKey(isEditing) {
498
+ return isEditing ? 'editAgent' : 'newAgent';
499
+ };
500
+ export var shouldDisableAbmHeaderClose = function shouldDisableAbmHeaderClose(isLoading, isLoadingKnowledge, isLoadingCreate, isLoadingUpdateAccess) {
501
+ return isLoading || isLoadingKnowledge || isLoadingCreate || isLoadingUpdateAccess;
502
+ };
503
+ export var resolveAbmSaveAction = function resolveAbmSaveAction(isEditing, hasSameValues) {
504
+ if (isEditing) {
505
+ return hasSameValues ? 'noop' : 'update';
506
+ }
507
+ return 'create';
508
+ };
509
+ export var resolveProcessFilesTimeoutFlagBeforeSave = function resolveProcessFilesTimeoutFlagBeforeSave() {
510
+ return false;
511
+ };
512
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDT1JfVE9PTF9HUk9VUF9TTFVHUyIsIkRFRkFVTFRfQ09SX0FDQ0VTUyIsImRlcml2ZUNvckFjY2Vzc0Zyb21Ub29sR3JvdXBTbHVncyIsImRlcml2ZU1jcENvbm5lY3RvclNsdWdzIiwiS05PV0xFREdFX0FUVEFDSE1FTlRfU1RBVFVTRVMiLCJub3JtYWxpemVLbm93bGVkZ2VBdHRhY2htZW50U3RhdHVzIiwic3RhdHVzIiwiaW5jbHVkZXMiLCJpc01vZGFsQWNjZXNzVHlwZSIsInZhbHVlIiwidmFsaWRhdGVGaWVsZFZhbHVlcyIsInZhbHVlVG9WYWxpZGF0ZSIsImdlbmVyYWwiLCJuYW1lIiwidXNlclByb21wdCIsImJ1aWxkRWRpdGluZ01vZGFsVmFsdWVzRnJvbUFnZW50RGV0YWlsIiwiYWdlbnRCeUlkIiwiYWdlbnRNb2RlbHMiLCJwcmV2IiwiX2FnZW50QnlJZCRrbm93bGVkZ2VCIiwiX2FnZW50QnlJZCRjbGllbnRzIiwiYWdlbnRNb2RlbCIsImZpbmQiLCJtb2RlbCIsImlkIiwibW9kZWxBaUlkIiwiX29iamVjdFNwcmVhZCIsImlzRWRpdGluZyIsImVtb2ppIiwiaW50cm9kdWN0aW9uIiwiaW5wdXRQbGFjZWhvbGRlciIsImlzQWN0aXZlIiwiYWlNb2RlbCIsImtub3dsZWRnZUJhc2VzIiwiaXNfZmF2b3JpdGUiLCJrbm93bGVkZ2UiLCJtYXAiLCJrIiwiZmlsZSIsIkZpbGUiLCJmaWxlbmFtZSIsInRvU3RyaW5nIiwic2l6ZSIsImZpbGVfc2l6ZV9ieXRlcyIsInR5cGUiLCJvcmlnaW5hbF9maWxlX3R5cGUiLCJ1cmxfb3JpZ2luYWwiLCJ1bmRlZmluZWQiLCJ1cmxfdGh1bWJuYWlsIiwiYWNjZXNzaWJpbGl0eSIsImFjY2Vzc1R5cGUiLCJhY2Nlc3MiLCJjbGllbnRzIiwiY2xpZW50IiwiX2NsaWVudCRpZCIsIl9jbGllbnQkaXNfYWN0aXZlIiwiX2NsaWVudCRpc19kZWxldGVkIiwiaXNfYWN0aXZlIiwiaXNfZGVsZXRlZCIsImNvckFjY2VzcyIsInRvb2xHcm91cFNsdWdzIiwic2VsZWN0ZWRDb25uZWN0b3JzIiwiY29ubmVjdG9ycyIsImFyZUFibUNsaWVudHNBcnJheXNFcXVhbCIsImNsaWVudHMxIiwiY2xpZW50czIiLCJsZW5ndGgiLCJjbGllbnRzMUlkcyIsIl9jbGllbnQkY2xpZW50SWQiLCJjbGllbnRJZCIsInNvcnQiLCJjbGllbnRzMklkcyIsIl9jbGllbnQkY2xpZW50SWQyIiwiZXZlcnkiLCJpbmRleCIsImhhc0FjY2Vzc2liaWxpdHlTZWN0aW9uQ2hhbmdlZCIsImN1cnJlbnQiLCJpbml0aWFsIiwiX2N1cnJlbnQkY29yQWNjZXNzIiwiX2luaXRpYWwkY29yQWNjZXNzIiwiYWNjZXNzVHlwZVNhbWUiLCJjbGllbnRzU2FtZSIsImN1cnJlbnRDb3JBY2Nlc3MiLCJpbml0aWFsQ29yQWNjZXNzIiwiY29yQWNjZXNzU2FtZSIsInNsdWciLCJpc1NhbWVBZ2VudE1vZGFsU25hcHNob3QiLCJmaWxlQWN0aW9ucyIsIl9jdXJyZW50JGdlbmVyYWwkYWlNbyIsIl9pbml0aWFsJGdlbmVyYWwkYWlNbyIsIl9jdXJyZW50JGtub3dsZWRnZSIsIl9pbml0aWFsJGtub3dsZWRnZSIsIl9jdXJyZW50JGtub3dsZWRnZTIiLCJfaW5pdGlhbCRrbm93bGVkZ2UyIiwiX2ZpbGVBY3Rpb25zJHRvVXBkYXRlIiwiX2ZpbGVBY3Rpb25zJHRvRGVsZXRlIiwidG9VcGRhdGUiLCJ0b0RlbGV0ZSIsImhhc0FnZW50Q3JlYXRpb25EcmFmdCIsInZhbHVlcyIsImRlZmF1bHRzIiwiX3ZhbHVlcyRnZW5lcmFsJGFpTW9kIiwiX3ZhbHVlcyRnZW5lcmFsJHVzZXJQIiwiaXNEZWZhdWx0QWlNb2RlbCIsImRlZmF1bHRBaU1vZGVsSWQiLCJpc0RlZmF1bHRJbnB1dFBsYWNlaG9sZGVyIiwiZGVmYXVsdElucHV0UGxhY2Vob2xkZXIiLCJpc0RlZmF1bHRVc2VyUHJvbXB0IiwiZGVmYXVsdFVzZXJQcm9tcHRQbGFjZWhvbGRlciIsImhhc05hbWUiLCJ0cmltIiwiaGFzRW1vamkiLCJoYXNJbnRyb2R1Y3Rpb24iLCJoYXNJbnB1dFBsYWNlaG9sZGVyIiwiaGFzVXNlclByb21wdCIsImhhc0tub3dsZWRnZSIsImhhc0N1c3RvbUFpTW9kZWwiLCJCb29sZWFuIiwiaGFzQWNjZXNzaWJpbGl0eSIsImhhc0FibVBlbmRpbmdDaGFuZ2VzIiwiX2ZpbGVBY3Rpb25zJHRvRGVsZXRlMiIsIl9maWxlQWN0aW9ucyR0b1VwbG9hZCIsImhhc0NyZWF0aW9uRHJhZnQiLCJoYXNFZGl0aW5nQ2hhbmdlcyIsInRvVXBsb2FkIiwiaGFzSW5hY3RpdmVBY2Nlc3NpYmlsaXR5Q2xpZW50cyIsInNvbWUiLCJyZXNvbHZlS25vd2xlZGdlVXBsb2FkT3V0Y29tZSIsImhhc1BlbmRpbmdGaWxlcyIsImhhc0Vycm9yRmlsZXMiLCJpc0FibVNhdmVEaXNhYmxlZCIsIl9yZWYiLCJfdmFsdWVzJGFjY2Vzc2liaWxpdHkiLCJfcmVmJGlzTG9hZGluZyIsImlzTG9hZGluZyIsIl9yZWYkaXNMb2FkaW5nS25vd2xlZCIsImlzTG9hZGluZ0tub3dsZWRnZSIsIl9yZWYkaXNMb2FkaW5nQ3JlYXRlIiwiaXNMb2FkaW5nQ3JlYXRlIiwiX3JlZiRpc0xvYWRpbmdVcGRhdGVBIiwiaXNMb2FkaW5nVXBkYXRlQWNjZXNzIiwiX3JlZiRoYXNGaWxlRXJyb3JzIiwiaGFzRmlsZUVycm9ycyIsInVuY2hhbmdlZCIsImFwcGx5S25vd2xlZGdlRmlsZVN0YXR1c1VwZGF0ZSIsImZpbGVTdGF0dXMiLCJfZmlsZVN0YXR1cyRrbm93bGVkZ2UiLCJrbm93bGVkZ2VfYmFzZV9pZCIsInNob3VsZENvbmZpcm1BYm1DbG9zZSIsImhhc1BlbmRpbmdDaGFuZ2VzIiwic3VjY2Vzc0ZsYWdzIiwiY3JlYXRlIiwidXBkYXRlIiwiQUJNX0FDQ0VTU19ERU5JRURfRVJST1IiLCJpc0FibUFjY2Vzc0RlbmllZEVycm9yIiwiZXJyb3IiLCJjYW5SZW5kZXJBYm1BZ2VudE1vZGFsIiwicGVybWlzc2lvbnMiLCJlZGl0Iiwic2hvdWxkQ2xvc2VBYm1PbkJhY2tkcm9wQ2xpY2siLCJ0YXJnZXQiLCJjdXJyZW50VGFyZ2V0IiwiaXNQcm9jZXNzaW5nRmlsZXMiLCJyZXNvbHZlQWJtUHJvY2Vzc2luZ0tub3dsZWRnZUxhYmVsS2V5IiwiQUJNX09QRU5fSU5JVElBTF9TRUNUSU9OUyIsInJlc29sdmVQZW5kaW5nQWJtSW5pdGlhbFNlY3Rpb24iLCJpbml0aWFsU2VjdGlvbiIsInNob3VsZERlbnlBYm1FZGl0V2l0aG91dE11bHRpQWdlbnRzIiwiaGFzTXVsdGlBZ2VudHNBY2Nlc3MiLCJyZXNvbHZlQWJtQ3JlYXRlQWNjZXNzVXBkYXRlQ29udGV4dCIsImlzRnJvbUNyZWF0aW9uIiwiaXNGcm9tRWRpdGluZyIsImhhc0FjdGlvbkZpbGVzIiwib3BlcmF0aW9uVHlwZSIsImhhc0JlZW5DYWxsZWQiLCJzaG91bGRTeW5jQWJtQ2xpZW50QWNjZXNzT25DcmVhdGUiLCJidWlsZEFibUZhdm9yaXRlVG9nZ2xlQWdlbnRzIiwiY3JlYXRlZEFnZW50IiwibGlzdEFnZW50IiwidG9nZ2xlQWdlbnQiLCJyZXNvbHZlQWJtQ3JlYXRlU3VjY2Vzc1BsYW4iLCJhY3Rpb25zIiwiaGFzRGVsZXRlIiwiaGFzVXBsb2FkIiwic2hvdWxkU2hvd1Byb2Nlc3NGaWxlc0ZvckNyZWF0ZVBsYW4iLCJwbGFuIiwicmVzb2x2ZUFibVVwZGF0ZVN1Y2Nlc3NQbGFuIiwiYWNjZXNzaWJpbGl0eUNoYW5nZWQiLCJjcmVhdGVQbGFuIiwicmVzb2x2ZUFibVVwZGF0ZUFjY2Vzc1VwZGF0ZUNvbnRleHQiLCJyZXNvbHZlQWJtVXBkYXRlQWNjZXNzT25seUNvbnRleHQiLCJyZXNvbHZlQWJtQ3JlYXRlQWNjZXNzT25seURlY2lzaW9uIiwibmV4dENvbnRleHQiLCJzaG91bGRDYWxsQWNjZXNzQ2xpZW50IiwiY3JlYXRlUmVzZXRBYm1BY2Nlc3NVcGRhdGVDb250ZXh0Iiwic2hvdWxkRmluYWxpemVBYm1VcGRhdGVXaXRob3V0UGVuZGluZ1dvcmsiLCJpbnB1dCIsImlzU2hvd1Byb2Nlc3NGaWxlcyIsInRvVXBsb2FkQ291bnQiLCJhY2Nlc3NIYXNBY3Rpb25GaWxlcyIsInN1Y2Nlc3NVcGRhdGVBY2Nlc3MiLCJwcm9jZXNzRmlsZXNUaW1lZE91dCIsInJlc29sdmVLbm93bGVkZ2VXc0NvbXBsZXRpb25FZmZlY3RzIiwidXBsb2FkT3V0Y29tZSIsImNvbnRleHQiLCJhY2Nlc3NIYW5kbGVkIiwiZmlsZXNGaW5pc2hlZCIsImluY3JlbWVudEZpbGVzUHJvY2Vzc2VkIiwibWFya0ZpbGVzRmluaXNoZWRGb3JDcmVhdGUiLCJjbG9zZVByb2Nlc3NGaWxlcyIsInJlc29sdmVBYm1Lbm93bGVkZ2VFcnJvck1lc3NhZ2VLZXkiLCJzaG91bGRCbG9ja0tub3dsZWRnZURlbGV0ZVN1Y2Nlc3NDbG9zZSIsInNob3VsZERlZmVyQWNjZXNzVXBkYXRlVW50aWxGaWxlc0NvbXBsZXRlIiwic2hvdWxkQ2xvc2VDcmVhdGVBZnRlcktub3dsZWRnZVdpdGhvdXRBY2Nlc3MiLCJoYXNTdWNjZXNzQ3JlYXRlIiwic2hvdWxkQ2xvc2VDcmVhdGVBZnRlcktub3dsZWRnZVdpdGhBY2Nlc3MiLCJzaG91bGRBcHBseVBlbmRpbmdTZWN0aW9uQWZ0ZXJPcGVuIiwicGVuZGluZ1NlY3Rpb24iLCJyZXNvbHZlQWJtT3Blbk1vZGFsTG9hZEFjdGlvbiIsInBhcmFtcyIsImhhc1ByZWZldGNoZWRBZ2VudCIsImNhbkFwcGx5QWJtRWRpdGluZ0FnZW50RGV0YWlsIiwic291cmNlIiwic2hvdWxkU2V0RGVmYXVsdEFpTW9kZWxGb3JOZXdBZ2VudCIsImFnZW50TG9hZGluZyIsImhhc0FnZW50QnlJZCIsInNob3VsZFNraXBBYm1Db25maXJtV2l0aG91dE11bHRpQWdlbnRzIiwicmVzb2x2ZUFibURyYWZ0RmF2b3JpdGVWYWx1ZSIsImN1cnJlbnRJc0Zhdm9yaXRlIiwicmVzb2x2ZUFibUNyZWF0ZUZhdm9yaXRlQWdlbnRzIiwibWFya0Zhdm9yaXRlIiwiX2J1aWxkQWJtRmF2b3JpdGVUb2dnIiwiYXBwbHlBYm1Lbm93bGVkZ2VGaWxlQWN0aW9ucyIsImRlbGV0ZUtub3dsZWRnZSIsImN1cnJlbnRLbm93bGVkZ2UiLCJjdXJyZW50QWN0aW9ucyIsImNvbmNhdCIsIl90b0NvbnN1bWFibGVBcnJheSIsImZpbGVzUHJldklkcyIsIlNldCIsIm5ld0ZpbGVzIiwiZmlsdGVyIiwiaGFzIiwibmV4dFRvVXBsb2FkIiwiX3ZhbHVlJG1hcCIsInZhbHVlSWRzIiwibWVyZ2VBYm1BZ2VudFZhbHVlc0J5S2V5Iiwia2V5IiwiX2RlZmluZVByb3BlcnR5Iiwic2hvdWxkUnVuQWJtQ3JlYXRlU3VjY2Vzc0hhbmRsZXIiLCJzdWNjZXNzQ3JlYXRlSWQiLCJsYXN0SGFuZGxlZENyZWF0ZUlkIiwibWVyZ2VBYm1PcGVuQWdlbnRWYWx1ZXMiLCJpbml0aWFsVmFsdWVzIiwiaW5jb21pbmciLCJyZXNvbHZlQWJtQ3JlYXRlS25vd2xlZGdlSGFuZGxlciIsInNob3VsZFJlcGVhdERlbGV0ZUtub3dsZWRnZXNPbkNyZWF0ZSIsInNob3VsZEVucXVldWVBYm1DcmVhdGVGYXZvcml0ZVRvZ2dsZSIsInNob3VsZEhhbmRsZUFibUNyZWF0ZUFjY2Vzc09ubHlDbGllbnQiLCJkZWNpc2lvbiIsImNyZWF0ZUluaXRpYWxBYm1Nb2RhbFZhbHVlcyIsInNob3VsZFByb2Nlc3NLbm93bGVkZ2VXc1N0YXR1cyIsInJlc29sdmVBYm1Lbm93bGVkZ2VXc0NoYW5uZWwiLCJfYWdlbnRCeUlkJGlkIiwiYWdlbnRJZCIsInJlc29sdmVBYm1GYXZvcml0ZVRvb2x0aXBLZXkiLCJpc0Zhdm9yaXRlIiwic2hvdWxkU2VsZWN0QWdlbnRBZnRlckRlbGV0ZSIsImN1cnJlbnRTZWxlY3RlZEFnZW50SWQiLCJkZWxldGVkQWdlbnRJZCIsIlN0cmluZyIsInNob3VsZFJ1bkFibVByb2Nlc3NGaWxlc1RpbWVvdXQiLCJyZXNvbHZlQWJtUHJvY2Vzc0ZpbGVzVGltZW91dFN1Y2Nlc3NLZXkiLCJzaG91bGRTeW5jU2VsZWN0ZWRBZ2VudEFmdGVyTXV0YXRpb24iLCJtdXRhdGVkQWdlbnRJZCIsInNob3VsZEluY2x1ZGVBY2Nlc3NpYmlsaXR5VXBkYXRlSW5Lbm93bGVkZ2VCYXRjaCIsInNob3VsZFJlc2V0U3VjY2Vzc1VwZGF0ZUFjY2Vzc09uQ3JlYXRlQ2xvc2UiLCJzaG91bGRIeWRyYXRlQWdlbnRDb25uZWN0b3JzT25FZGl0IiwiZXh0ZXJuYWxDb25uZWN0b3JzRW5hYmxlZCIsInNob3VsZFNob3dBYm1Mb2FkZXJGaWxlcyIsInJlc29sdmVBYm1Nb2RhbFRpdGxlS2V5Iiwic2hvdWxkRGlzYWJsZUFibUhlYWRlckNsb3NlIiwicmVzb2x2ZUFibVNhdmVBY3Rpb24iLCJoYXNTYW1lVmFsdWVzIiwicmVzb2x2ZVByb2Nlc3NGaWxlc1RpbWVvdXRGbGFnQmVmb3JlU2F2ZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL29yZ2FuaXNtcy9BYm1BZ2VudE1vZGFsL0FibUFnZW50TW9kYWwuaGVscGVycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZ2VudE1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvYWdlbnQnXG5pbXBvcnQgeyBNb2RhbFZhbHVlcyB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL2FnZW50TW9kYWwnXG5pbXBvcnQgdHlwZSB7IEF0dGFjaG1lbnRGaWxlIH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL0NoYXRGb290ZXIvQ2hhdEZvb3RlcidcbmltcG9ydCB7XG4gIENPUl9UT09MX0dST1VQX1NMVUdTLFxuICBERUZBVUxUX0NPUl9BQ0NFU1MsXG4gIGRlcml2ZUNvckFjY2Vzc0Zyb21Ub29sR3JvdXBTbHVncyxcbiAgZGVyaXZlTWNwQ29ubmVjdG9yU2x1Z3MsXG59IGZyb20gJy4uLy4uLy4uL3V0aWxzL25vcm1hbGl6ZUFnZW50Q29ubmVjdG9ycydcblxuY29uc3QgS05PV0xFREdFX0FUVEFDSE1FTlRfU1RBVFVTRVMgPSBbJ3BlbmRpbmcnLCAncHJvY2Vzc2luZycsICdkb25lJywgJ2ZhaWxlZCcsICdzdGFydGVkJ10gYXMgY29uc3RcblxuZXhwb3J0IGNvbnN0IG5vcm1hbGl6ZUtub3dsZWRnZUF0dGFjaG1lbnRTdGF0dXMgPSAoc3RhdHVzOiBzdHJpbmcpOiBOb25OdWxsYWJsZTxBdHRhY2htZW50RmlsZVsnc3RhdHVzJ10+ID0+IHtcbiAgaWYgKChLTk9XTEVER0VfQVRUQUNITUVOVF9TVEFUVVNFUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXMoc3RhdHVzKSkge1xuICAgIHJldHVybiBzdGF0dXMgYXMgKHR5cGVvZiBLTk9XTEVER0VfQVRUQUNITUVOVF9TVEFUVVNFUylbbnVtYmVyXVxuICB9XG4gIHJldHVybiAncGVuZGluZydcbn1cblxuY29uc3QgaXNNb2RhbEFjY2Vzc1R5cGUgPSAodmFsdWU6IHN0cmluZyk6IHZhbHVlIGlzIE1vZGFsVmFsdWVzWydhY2Nlc3NpYmlsaXR5J11bJ2FjY2Vzc1R5cGUnXSA9PlxuICB2YWx1ZSA9PT0gJ2NvbXBhbnknIHx8IHZhbHVlID09PSAnY2xpZW50cycgfHwgdmFsdWUgPT09ICdvbmx5X21lJ1xuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVGaWVsZFZhbHVlcyA9ICh2YWx1ZVRvVmFsaWRhdGU6IE1vZGFsVmFsdWVzKSA9PiB7XG4gIGlmICghdmFsdWVUb1ZhbGlkYXRlLmdlbmVyYWwubmFtZSB8fCAhdmFsdWVUb1ZhbGlkYXRlLmdlbmVyYWwudXNlclByb21wdCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbnR5cGUgQWdlbnREZXRhaWxTb3VyY2UgPSB7XG4gIGVtb2ppOiBzdHJpbmdcbiAgbmFtZTogc3RyaW5nXG4gIGludHJvZHVjdGlvbjogc3RyaW5nXG4gIGlucHV0UGxhY2Vob2xkZXI6IHN0cmluZ1xuICBpc0FjdGl2ZTogYm9vbGVhblxuICBtb2RlbEFpSWQ6IG51bWJlclxuICBpZDogc3RyaW5nIHwgbnVtYmVyXG4gIHVzZXJQcm9tcHQ6IHN0cmluZyB8IG51bGxcbiAgaXNfZmF2b3JpdGU6IGJvb2xlYW5cbiAgY3JlYXRlZEJ5PzogbnVtYmVyXG4gIGtub3dsZWRnZUJhc2VzPzogQXJyYXk8e1xuICAgIGlkOiBudW1iZXJcbiAgICBmaWxlbmFtZTogc3RyaW5nXG4gICAgZmlsZV9zaXplX2J5dGVzPzogbnVtYmVyXG4gICAgb3JpZ2luYWxfZmlsZV90eXBlOiBzdHJpbmdcbiAgICBzdGF0dXM6IHN0cmluZ1xuICAgIHVybF9vcmlnaW5hbD86IHN0cmluZ1xuICAgIHVybF90aHVtYm5haWw/OiBzdHJpbmdcbiAgfT5cbiAgYWNjZXNzOiBzdHJpbmdcbiAgY2xpZW50cz86IEFycmF5PHtcbiAgICBpZD86IG51bWJlciB8IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGlzX2FjdGl2ZT86IGJvb2xlYW5cbiAgICBpc19kZWxldGVkPzogYm9vbGVhblxuICB9PlxuICB0b29sR3JvdXBTbHVncz86IHVua25vd25cbiAgY29ubmVjdG9ycz86IHVua25vd25cbn1cblxuLyoqIE1pc21hIGVzdHJ1Y3R1cmEgcXVlIGVsIGVmZWN0byBxdWUgaGlkcmF0YSBkZXNkZSB1c2VHZXRBZ2VudEJ5SWQgKHRvZGFzIGxhcyBwZXN0YcOxYXMgZGVsIEFCTSkuICovXG5leHBvcnQgY29uc3QgYnVpbGRFZGl0aW5nTW9kYWxWYWx1ZXNGcm9tQWdlbnREZXRhaWwgPSAoXG4gIGFnZW50QnlJZDogQWdlbnREZXRhaWxTb3VyY2UsXG4gIGFnZW50TW9kZWxzOiBBZ2VudE1vZGVsW10sXG4gIHByZXY6IE1vZGFsVmFsdWVzXG4pOiBNb2RhbFZhbHVlcyA9PiB7XG4gIGNvbnN0IGFnZW50TW9kZWwgPSBhZ2VudE1vZGVscy5maW5kKG1vZGVsID0+IG1vZGVsLmlkID09PSBhZ2VudEJ5SWQubW9kZWxBaUlkKVxuICByZXR1cm4ge1xuICAgIC4uLnByZXYsXG4gICAgaXNFZGl0aW5nOiB0cnVlLFxuICAgIGdlbmVyYWw6IHtcbiAgICAgIGVtb2ppOiBhZ2VudEJ5SWQuZW1vamksXG4gICAgICBuYW1lOiBhZ2VudEJ5SWQubmFtZSxcbiAgICAgIGludHJvZHVjdGlvbjogYWdlbnRCeUlkLmludHJvZHVjdGlvbixcbiAgICAgIGlucHV0UGxhY2Vob2xkZXI6IGFnZW50QnlJZC5pbnB1dFBsYWNlaG9sZGVyLFxuICAgICAgaXNBY3RpdmU6IGFnZW50QnlJZC5pc0FjdGl2ZSxcbiAgICAgIGFpTW9kZWw6IGFnZW50TW9kZWwgfHwgbnVsbCxcbiAgICAgIGlkOiBhZ2VudEJ5SWQuaWQsXG4gICAgICB1c2VyUHJvbXB0OiBhZ2VudEJ5SWQudXNlclByb21wdCxcbiAgICAgIGtub3dsZWRnZUJhc2VzOiBbXSxcbiAgICAgIGlzX2Zhdm9yaXRlOiBhZ2VudEJ5SWQuaXNfZmF2b3JpdGUsXG4gICAgfSxcbiAgICBrbm93bGVkZ2U6XG4gICAgICBhZ2VudEJ5SWQua25vd2xlZGdlQmFzZXM/Lm1hcChrID0+ICh7XG4gICAgICAgIGZpbGU6IG5ldyBGaWxlKFtdLCBrLmZpbGVuYW1lKSxcbiAgICAgICAgaWQ6IGsuaWQudG9TdHJpbmcoKSxcbiAgICAgICAgbmFtZTogay5maWxlbmFtZSxcbiAgICAgICAgc2l6ZTogay5maWxlX3NpemVfYnl0ZXMgfHwgMCxcbiAgICAgICAgdHlwZTogay5vcmlnaW5hbF9maWxlX3R5cGUsXG4gICAgICAgIHN0YXR1czogbm9ybWFsaXplS25vd2xlZGdlQXR0YWNobWVudFN0YXR1cyhrLnN0YXR1cyksXG4gICAgICAgIHVybF9vcmlnaW5hbDogay51cmxfb3JpZ2luYWwgfHwgdW5kZWZpbmVkLFxuICAgICAgICB1cmxfdGh1bWJuYWlsOiBrLnVybF90aHVtYm5haWwgfHwgdW5kZWZpbmVkLFxuICAgICAgfSkpIHx8IFtdLFxuICAgIGFjY2Vzc2liaWxpdHk6IHtcbiAgICAgIGFjY2Vzc1R5cGU6IGlzTW9kYWxBY2Nlc3NUeXBlKGFnZW50QnlJZC5hY2Nlc3MpID8gYWdlbnRCeUlkLmFjY2VzcyA6ICdjb21wYW55JyxcbiAgICAgIGNsaWVudHM6XG4gICAgICAgIGFnZW50QnlJZC5jbGllbnRzPy5tYXAoY2xpZW50ID0+ICh7XG4gICAgICAgICAgaWQ6IGNsaWVudC5pZD8udG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICBuYW1lOiBjbGllbnQubmFtZSxcbiAgICAgICAgICBpc19hY3RpdmU6IGNsaWVudC5pc19hY3RpdmUgPz8gZmFsc2UsXG4gICAgICAgICAgaXNfZGVsZXRlZDogY2xpZW50LmlzX2RlbGV0ZWQgPz8gZmFsc2UsXG4gICAgICAgIH0pKSB8fCBudWxsLFxuICAgICAgY29yQWNjZXNzOiBkZXJpdmVDb3JBY2Nlc3NGcm9tVG9vbEdyb3VwU2x1Z3MoYWdlbnRCeUlkLnRvb2xHcm91cFNsdWdzKSxcbiAgICAgIHNlbGVjdGVkQ29ubmVjdG9yczogZGVyaXZlTWNwQ29ubmVjdG9yU2x1Z3MoYWdlbnRCeUlkLmNvbm5lY3RvcnMpLFxuICAgIH0sXG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgQWJtRmlsZUFjdGlvbnMgPSB7XG4gIHRvVXBkYXRlPzogdW5rbm93bltdXG4gIHRvRGVsZXRlPzogdW5rbm93bltdXG4gIHRvVXBsb2FkPzogdW5rbm93bltdXG59XG5cbnR5cGUgQWJtQ2xpZW50Um93ID0ge1xuICBjbGllbnRJZD86IHN0cmluZyB8IG51bWJlclxuICBpZD86IHN0cmluZyB8IG51bWJlclxufVxuXG5leHBvcnQgY29uc3QgYXJlQWJtQ2xpZW50c0FycmF5c0VxdWFsID0gKFxuICBjbGllbnRzMTogQWJtQ2xpZW50Um93W10gfCBudWxsIHwgdW5kZWZpbmVkLFxuICBjbGllbnRzMjogQWJtQ2xpZW50Um93W10gfCBudWxsIHwgdW5kZWZpbmVkXG4pOiBib29sZWFuID0+IHtcbiAgaWYgKCFjbGllbnRzMSAmJiAhY2xpZW50czIpIHJldHVybiB0cnVlXG4gIGlmICghY2xpZW50czEgfHwgIWNsaWVudHMyKSByZXR1cm4gZmFsc2VcbiAgaWYgKGNsaWVudHMxLmxlbmd0aCAhPT0gY2xpZW50czIubGVuZ3RoKSByZXR1cm4gZmFsc2VcblxuICBjb25zdCBjbGllbnRzMUlkcyA9IGNsaWVudHMxLm1hcChjbGllbnQgPT4gY2xpZW50LmNsaWVudElkID8/IGNsaWVudC5pZCkuc29ydCgpXG4gIGNvbnN0IGNsaWVudHMySWRzID0gY2xpZW50czIubWFwKGNsaWVudCA9PiBjbGllbnQuY2xpZW50SWQgPz8gY2xpZW50LmlkKS5zb3J0KClcblxuICByZXR1cm4gY2xpZW50czFJZHMuZXZlcnkoKGlkLCBpbmRleCkgPT4gaWQgPT09IGNsaWVudHMySWRzW2luZGV4XSlcbn1cblxuZXhwb3J0IGNvbnN0IGhhc0FjY2Vzc2liaWxpdHlTZWN0aW9uQ2hhbmdlZCA9IChcbiAgY3VycmVudDogTW9kYWxWYWx1ZXNbJ2FjY2Vzc2liaWxpdHknXSB8IHVuZGVmaW5lZCxcbiAgaW5pdGlhbDogTW9kYWxWYWx1ZXNbJ2FjY2Vzc2liaWxpdHknXSB8IHVuZGVmaW5lZFxuKTogYm9vbGVhbiA9PiB7XG4gIGlmICghaW5pdGlhbCB8fCAhY3VycmVudCkgcmV0dXJuIHRydWVcblxuICBjb25zdCBhY2Nlc3NUeXBlU2FtZSA9IGN1cnJlbnQuYWNjZXNzVHlwZSA9PT0gaW5pdGlhbC5hY2Nlc3NUeXBlXG4gIGNvbnN0IGNsaWVudHNTYW1lID0gYXJlQWJtQ2xpZW50c0FycmF5c0VxdWFsKGN1cnJlbnQuY2xpZW50cywgaW5pdGlhbC5jbGllbnRzKVxuICBjb25zdCBjdXJyZW50Q29yQWNjZXNzID0gY3VycmVudC5jb3JBY2Nlc3MgPz8gREVGQVVMVF9DT1JfQUNDRVNTXG4gIGNvbnN0IGluaXRpYWxDb3JBY2Nlc3MgPSBpbml0aWFsLmNvckFjY2VzcyA/PyBERUZBVUxUX0NPUl9BQ0NFU1NcbiAgY29uc3QgY29yQWNjZXNzU2FtZSA9IENPUl9UT09MX0dST1VQX1NMVUdTLmV2ZXJ5KHNsdWcgPT4gY3VycmVudENvckFjY2Vzc1tzbHVnXSA9PT0gaW5pdGlhbENvckFjY2Vzc1tzbHVnXSlcblxuICByZXR1cm4gIWFjY2Vzc1R5cGVTYW1lIHx8ICFjbGllbnRzU2FtZSB8fCAhY29yQWNjZXNzU2FtZVxufVxuXG5leHBvcnQgY29uc3QgaXNTYW1lQWdlbnRNb2RhbFNuYXBzaG90ID0gKFxuICBjdXJyZW50OiBNb2RhbFZhbHVlcyxcbiAgaW5pdGlhbDogTW9kYWxWYWx1ZXMsXG4gIGZpbGVBY3Rpb25zOiBBYm1GaWxlQWN0aW9uc1xuKTogYm9vbGVhbiA9PiB7XG4gIGlmICghaW5pdGlhbC5nZW5lcmFsIHx8ICFjdXJyZW50LmdlbmVyYWwpIHJldHVybiBmYWxzZVxuXG4gIHJldHVybiAoXG4gICAgY3VycmVudC5nZW5lcmFsLm5hbWUgPT09IGluaXRpYWwuZ2VuZXJhbC5uYW1lICYmXG4gICAgY3VycmVudC5nZW5lcmFsLmVtb2ppID09PSBpbml0aWFsLmdlbmVyYWwuZW1vamkgJiZcbiAgICBjdXJyZW50LmdlbmVyYWwuaW50cm9kdWN0aW9uID09PSBpbml0aWFsLmdlbmVyYWwuaW50cm9kdWN0aW9uICYmXG4gICAgY3VycmVudC5nZW5lcmFsLmlucHV0UGxhY2Vob2xkZXIgPT09IGluaXRpYWwuZ2VuZXJhbC5pbnB1dFBsYWNlaG9sZGVyICYmXG4gICAgY3VycmVudC5nZW5lcmFsLmFpTW9kZWw/LmlkID09PSBpbml0aWFsLmdlbmVyYWwuYWlNb2RlbD8uaWQgJiZcbiAgICBjdXJyZW50LmdlbmVyYWwudXNlclByb21wdCA9PT0gaW5pdGlhbC5nZW5lcmFsLnVzZXJQcm9tcHQgJiZcbiAgICAoY3VycmVudC5rbm93bGVkZ2U/Lmxlbmd0aCA9PT0gaW5pdGlhbC5rbm93bGVkZ2U/Lmxlbmd0aCB8fFxuICAgICAgKCFjdXJyZW50Lmtub3dsZWRnZT8ubGVuZ3RoICYmICFpbml0aWFsLmtub3dsZWRnZT8ubGVuZ3RoKSkgJiZcbiAgICAhZmlsZUFjdGlvbnMudG9VcGRhdGU/Lmxlbmd0aCAmJlxuICAgICFmaWxlQWN0aW9ucy50b0RlbGV0ZT8ubGVuZ3RoICYmXG4gICAgIWhhc0FjY2Vzc2liaWxpdHlTZWN0aW9uQ2hhbmdlZChjdXJyZW50LmFjY2Vzc2liaWxpdHksIGluaXRpYWwuYWNjZXNzaWJpbGl0eSlcbiAgKVxufVxuXG5leHBvcnQgdHlwZSBDcmVhdGlvbkRyYWZ0RGVmYXVsdHMgPSB7XG4gIGRlZmF1bHRJbnB1dFBsYWNlaG9sZGVyOiBzdHJpbmdcbiAgZGVmYXVsdFVzZXJQcm9tcHRQbGFjZWhvbGRlcjogc3RyaW5nXG4gIGRlZmF1bHRBaU1vZGVsSWQ/OiBudW1iZXIgfCBudWxsXG59XG5cbmV4cG9ydCBjb25zdCBoYXNBZ2VudENyZWF0aW9uRHJhZnQgPSAodmFsdWVzOiBNb2RhbFZhbHVlcywgZGVmYXVsdHM6IENyZWF0aW9uRHJhZnREZWZhdWx0cyk6IGJvb2xlYW4gPT4ge1xuICBpZiAodmFsdWVzLmlzRWRpdGluZykgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3QgaXNEZWZhdWx0QWlNb2RlbCA9IGRlZmF1bHRzLmRlZmF1bHRBaU1vZGVsSWQgIT0gbnVsbCAmJiB2YWx1ZXMuZ2VuZXJhbC5haU1vZGVsPy5pZCA9PT0gZGVmYXVsdHMuZGVmYXVsdEFpTW9kZWxJZFxuICBjb25zdCBpc0RlZmF1bHRJbnB1dFBsYWNlaG9sZGVyID0gdmFsdWVzLmdlbmVyYWwuaW5wdXRQbGFjZWhvbGRlciA9PT0gZGVmYXVsdHMuZGVmYXVsdElucHV0UGxhY2Vob2xkZXJcbiAgY29uc3QgaXNEZWZhdWx0VXNlclByb21wdCA9XG4gICAgdmFsdWVzLmdlbmVyYWwudXNlclByb21wdCA9PT0gZGVmYXVsdHMuZGVmYXVsdFVzZXJQcm9tcHRQbGFjZWhvbGRlciB8fFxuICAgIHZhbHVlcy5nZW5lcmFsLnVzZXJQcm9tcHQgPT09ICcnIHx8XG4gICAgdmFsdWVzLmdlbmVyYWwudXNlclByb21wdCA9PT0gbnVsbFxuXG4gIGNvbnN0IGhhc05hbWUgPSB2YWx1ZXMuZ2VuZXJhbC5uYW1lLnRyaW0oKSAhPT0gJydcbiAgY29uc3QgaGFzRW1vamkgPSB2YWx1ZXMuZ2VuZXJhbC5lbW9qaS50cmltKCkgIT09ICcnXG4gIGNvbnN0IGhhc0ludHJvZHVjdGlvbiA9IHZhbHVlcy5nZW5lcmFsLmludHJvZHVjdGlvbi50cmltKCkgIT09ICcnXG4gIGNvbnN0IGhhc0lucHV0UGxhY2Vob2xkZXIgPSB2YWx1ZXMuZ2VuZXJhbC5pbnB1dFBsYWNlaG9sZGVyLnRyaW0oKSAhPT0gJycgJiYgIWlzRGVmYXVsdElucHV0UGxhY2Vob2xkZXJcbiAgY29uc3QgaGFzVXNlclByb21wdCA9IHZhbHVlcy5nZW5lcmFsLnVzZXJQcm9tcHQ/LnRyaW0oKSAhPT0gJycgJiYgIWlzRGVmYXVsdFVzZXJQcm9tcHRcbiAgY29uc3QgaGFzS25vd2xlZGdlID0gISF2YWx1ZXMua25vd2xlZGdlLmxlbmd0aFxuICBjb25zdCBoYXNDdXN0b21BaU1vZGVsID0gQm9vbGVhbih2YWx1ZXMuZ2VuZXJhbC5haU1vZGVsICYmICFpc0RlZmF1bHRBaU1vZGVsKVxuICBjb25zdCBoYXNBY2Nlc3NpYmlsaXR5ID0gdmFsdWVzLmFjY2Vzc2liaWxpdHkuYWNjZXNzVHlwZSAhPT0gJ2NvbXBhbnknXG5cbiAgcmV0dXJuIChcbiAgICBoYXNOYW1lIHx8XG4gICAgaGFzRW1vamkgfHxcbiAgICBoYXNJbnRyb2R1Y3Rpb24gfHxcbiAgICBoYXNJbnB1dFBsYWNlaG9sZGVyIHx8XG4gICAgaGFzVXNlclByb21wdCB8fFxuICAgIGhhc0tub3dsZWRnZSB8fFxuICAgIGhhc0N1c3RvbUFpTW9kZWwgfHxcbiAgICBoYXNBY2Nlc3NpYmlsaXR5XG4gIClcbn1cblxuZXhwb3J0IGNvbnN0IGhhc0FibVBlbmRpbmdDaGFuZ2VzID0gKFxuICB2YWx1ZXM6IE1vZGFsVmFsdWVzLFxuICBpbml0aWFsOiBNb2RhbFZhbHVlcyB8IG51bGwsXG4gIGZpbGVBY3Rpb25zOiBBYm1GaWxlQWN0aW9ucyxcbiAgZGVmYXVsdHM6IENyZWF0aW9uRHJhZnREZWZhdWx0c1xuKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IGhhc0NyZWF0aW9uRHJhZnQgPSBoYXNBZ2VudENyZWF0aW9uRHJhZnQodmFsdWVzLCBkZWZhdWx0cylcbiAgY29uc3QgaGFzRWRpdGluZ0NoYW5nZXMgPVxuICAgIHZhbHVlcy5pc0VkaXRpbmcgJiZcbiAgICBCb29sZWFuKGluaXRpYWwpICYmXG4gICAgKCFpc1NhbWVBZ2VudE1vZGFsU25hcHNob3QodmFsdWVzLCBpbml0aWFsIGFzIE1vZGFsVmFsdWVzLCBmaWxlQWN0aW9ucykgfHxcbiAgICAgIEJvb2xlYW4oZmlsZUFjdGlvbnMudG9EZWxldGU/Lmxlbmd0aCkgfHxcbiAgICAgIEJvb2xlYW4oZmlsZUFjdGlvbnMudG9VcGxvYWQ/Lmxlbmd0aCkpXG5cbiAgcmV0dXJuIGhhc0NyZWF0aW9uRHJhZnQgfHwgaGFzRWRpdGluZ0NoYW5nZXNcbn1cblxuZXhwb3J0IGNvbnN0IGhhc0luYWN0aXZlQWNjZXNzaWJpbGl0eUNsaWVudHMgPSAoXG4gIGNsaWVudHM6IEFycmF5PHsgaXNfYWN0aXZlPzogYm9vbGVhbjsgaXNfZGVsZXRlZD86IGJvb2xlYW4gfT4gfCBudWxsIHwgdW5kZWZpbmVkXG4pOiBib29sZWFuID0+IHtcbiAgaWYgKCFjbGllbnRzPy5sZW5ndGgpIHJldHVybiBmYWxzZVxuICByZXR1cm4gY2xpZW50cy5zb21lKGNsaWVudCA9PiBjbGllbnQuaXNfYWN0aXZlID09PSBmYWxzZSB8fCBjbGllbnQuaXNfZGVsZXRlZCA9PT0gdHJ1ZSlcbn1cblxuZXhwb3J0IHR5cGUgS25vd2xlZGdlVXBsb2FkT3V0Y29tZSA9ICdwZW5kaW5nJyB8ICdlcnJvcicgfCAnY29tcGxldGUnXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlS25vd2xlZGdlVXBsb2FkT3V0Y29tZSA9IChcbiAga25vd2xlZGdlOiBQaWNrPEF0dGFjaG1lbnRGaWxlLCAnc3RhdHVzJz5bXVxuKTogS25vd2xlZGdlVXBsb2FkT3V0Y29tZSB8IG51bGwgPT4ge1xuICBjb25zdCBoYXNQZW5kaW5nRmlsZXMgPSBrbm93bGVkZ2Uuc29tZShmaWxlID0+IGZpbGUuc3RhdHVzID09PSAncGVuZGluZycpXG4gIGNvbnN0IGhhc0Vycm9yRmlsZXMgPSBrbm93bGVkZ2Uuc29tZShmaWxlID0+IGZpbGUuc3RhdHVzID09PSAnZmFpbGVkJylcblxuICBpZiAoaGFzUGVuZGluZ0ZpbGVzKSByZXR1cm4gJ3BlbmRpbmcnXG4gIGlmIChoYXNFcnJvckZpbGVzKSByZXR1cm4gJ2Vycm9yJ1xuICBpZiAoa25vd2xlZGdlLmxlbmd0aCA+IDApIHJldHVybiAnY29tcGxldGUnXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCB0eXBlIEFibVNhdmVEaXNhYmxlZElucHV0ID0ge1xuICB2YWx1ZXM6IE1vZGFsVmFsdWVzXG4gIGluaXRpYWw6IE1vZGFsVmFsdWVzIHwgbnVsbFxuICBmaWxlQWN0aW9uczogQWJtRmlsZUFjdGlvbnNcbiAgaXNMb2FkaW5nPzogYm9vbGVhblxuICBpc0xvYWRpbmdLbm93bGVkZ2U/OiBib29sZWFuXG4gIGlzTG9hZGluZ0NyZWF0ZT86IGJvb2xlYW5cbiAgaXNMb2FkaW5nVXBkYXRlQWNjZXNzPzogYm9vbGVhblxuICBoYXNGaWxlRXJyb3JzPzogYm9vbGVhblxufVxuXG5leHBvcnQgY29uc3QgaXNBYm1TYXZlRGlzYWJsZWQgPSAoe1xuICB2YWx1ZXMsXG4gIGluaXRpYWwsXG4gIGZpbGVBY3Rpb25zLFxuICBpc0xvYWRpbmcgPSBmYWxzZSxcbiAgaXNMb2FkaW5nS25vd2xlZGdlID0gZmFsc2UsXG4gIGlzTG9hZGluZ0NyZWF0ZSA9IGZhbHNlLFxuICBpc0xvYWRpbmdVcGRhdGVBY2Nlc3MgPSBmYWxzZSxcbiAgaGFzRmlsZUVycm9ycyA9IGZhbHNlLFxufTogQWJtU2F2ZURpc2FibGVkSW5wdXQpOiBib29sZWFuID0+IHtcbiAgY29uc3QgdW5jaGFuZ2VkID0gQm9vbGVhbihpbml0aWFsICYmIGlzU2FtZUFnZW50TW9kYWxTbmFwc2hvdCh2YWx1ZXMsIGluaXRpYWwsIGZpbGVBY3Rpb25zKSlcblxuICByZXR1cm4gKFxuICAgICF2YWxpZGF0ZUZpZWxkVmFsdWVzKHZhbHVlcykgfHxcbiAgICB1bmNoYW5nZWQgfHxcbiAgICBpc0xvYWRpbmcgfHxcbiAgICBpc0xvYWRpbmdLbm93bGVkZ2UgfHxcbiAgICBpc0xvYWRpbmdDcmVhdGUgfHxcbiAgICBpc0xvYWRpbmdVcGRhdGVBY2Nlc3MgfHxcbiAgICBoYXNJbmFjdGl2ZUFjY2Vzc2liaWxpdHlDbGllbnRzKHZhbHVlcy5hY2Nlc3NpYmlsaXR5Py5jbGllbnRzKSB8fFxuICAgIGhhc0ZpbGVFcnJvcnNcbiAgKVxufVxuXG5leHBvcnQgdHlwZSBLbm93bGVkZ2VGaWxlU3RhdHVzVXBkYXRlID0ge1xuICBmaWxlbmFtZTogc3RyaW5nXG4gIHN0YXR1czogc3RyaW5nXG4gIGtub3dsZWRnZV9iYXNlX2lkPzogc3RyaW5nIHwgbnVtYmVyXG59XG5cbmV4cG9ydCBjb25zdCBhcHBseUtub3dsZWRnZUZpbGVTdGF0dXNVcGRhdGUgPSAoXG4gIGtub3dsZWRnZTogQXR0YWNobWVudEZpbGVbXSxcbiAgZmlsZVN0YXR1czogS25vd2xlZGdlRmlsZVN0YXR1c1VwZGF0ZVxuKTogQXR0YWNobWVudEZpbGVbXSA9PlxuICBrbm93bGVkZ2UubWFwKGZpbGUgPT4ge1xuICAgIGlmIChmaWxlLm5hbWUgIT09IGZpbGVTdGF0dXMuZmlsZW5hbWUpIHtcbiAgICAgIHJldHVybiBmaWxlXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmZpbGUsXG4gICAgICBzdGF0dXM6IG5vcm1hbGl6ZUtub3dsZWRnZUF0dGFjaG1lbnRTdGF0dXMoZmlsZVN0YXR1cy5zdGF0dXMpLFxuICAgICAgaWQ6IGZpbGVTdGF0dXMua25vd2xlZGdlX2Jhc2VfaWQ/LnRvU3RyaW5nKCkgfHwgZmlsZS5pZCxcbiAgICB9XG4gIH0pXG5cbmV4cG9ydCBjb25zdCBzaG91bGRDb25maXJtQWJtQ2xvc2UgPSAoXG4gIGhhc1BlbmRpbmdDaGFuZ2VzOiBib29sZWFuLFxuICBzdWNjZXNzRmxhZ3M6IHsgY3JlYXRlPzogYm9vbGVhbjsgdXBkYXRlPzogYm9vbGVhbjsgZGVsZXRlPzogYm9vbGVhbiB9XG4pOiBib29sZWFuID0+IHtcbiAgaWYgKCFoYXNQZW5kaW5nQ2hhbmdlcykgcmV0dXJuIGZhbHNlXG4gIHJldHVybiAhKHN1Y2Nlc3NGbGFncy5jcmVhdGUgfHwgc3VjY2Vzc0ZsYWdzLnVwZGF0ZSB8fCBzdWNjZXNzRmxhZ3MuZGVsZXRlKVxufVxuXG5leHBvcnQgY29uc3QgQUJNX0FDQ0VTU19ERU5JRURfRVJST1IgPSBcIkFjY2VzcyBkZW5pZWQ6IFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoaXMgYWdlbnRcIlxuXG5leHBvcnQgY29uc3QgaXNBYm1BY2Nlc3NEZW5pZWRFcnJvciA9IChlcnJvcjogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4gPT4gZXJyb3IgPT09IEFCTV9BQ0NFU1NfREVOSUVEX0VSUk9SXG5cbmV4cG9ydCB0eXBlIEFibVVzZXJQZXJtaXNzaW9ucyA9IHtcbiAgY3JlYXRlPzogYm9vbGVhblxuICBlZGl0PzogYm9vbGVhblxuICBkZWxldGU/OiBib29sZWFuXG59XG5cbmV4cG9ydCBjb25zdCBjYW5SZW5kZXJBYm1BZ2VudE1vZGFsID0gKHBlcm1pc3Npb25zOiBBYm1Vc2VyUGVybWlzc2lvbnMgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiA9PlxuICBCb29sZWFuKHBlcm1pc3Npb25zPy5jcmVhdGUgfHwgcGVybWlzc2lvbnM/LmVkaXQgfHwgcGVybWlzc2lvbnM/LmRlbGV0ZSlcblxuZXhwb3J0IGNvbnN0IHNob3VsZENsb3NlQWJtT25CYWNrZHJvcENsaWNrID0gKFxuICB0YXJnZXQ6IEV2ZW50VGFyZ2V0IHwgbnVsbCxcbiAgY3VycmVudFRhcmdldDogRXZlbnRUYXJnZXQgfCBudWxsLFxuICBpc1Byb2Nlc3NpbmdGaWxlczogYm9vbGVhblxuKTogYm9vbGVhbiA9PiB0YXJnZXQgPT09IGN1cnJlbnRUYXJnZXQgJiYgIWlzUHJvY2Vzc2luZ0ZpbGVzXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlQWJtUHJvY2Vzc2luZ0tub3dsZWRnZUxhYmVsS2V5ID0gKGlzRWRpdGluZzogYm9vbGVhbik6IHN0cmluZyA9PlxuICBpc0VkaXRpbmcgPyAncHJvY2Vzc2luZ0tub3dsZWRnZS5kZXNjcmlwdGlvblVwZGF0ZScgOiAncHJvY2Vzc2luZ0tub3dsZWRnZS5kZXNjcmlwdGlvbkNyZWF0ZSdcblxuZXhwb3J0IHR5cGUgQWJtTW9kYWxJbml0aWFsU2VjdGlvbiA9ICdnZW5lcmFsJyB8ICdrbm93bGVkZ2UnIHwgJ2FjY2Vzc2liaWxpdHknXG5cbmNvbnN0IEFCTV9PUEVOX0lOSVRJQUxfU0VDVElPTlM6IHJlYWRvbmx5IEFibU1vZGFsSW5pdGlhbFNlY3Rpb25bXSA9IFsnZ2VuZXJhbCcsICdrbm93bGVkZ2UnLCAnYWNjZXNzaWJpbGl0eSddXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlUGVuZGluZ0FibUluaXRpYWxTZWN0aW9uID0gKGluaXRpYWxTZWN0aW9uPzogc3RyaW5nIHwgbnVsbCk6IEFibU1vZGFsSW5pdGlhbFNlY3Rpb24gfCBudWxsID0+IHtcbiAgaWYgKGluaXRpYWxTZWN0aW9uICYmIChBQk1fT1BFTl9JTklUSUFMX1NFQ1RJT05TIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyhpbml0aWFsU2VjdGlvbikpIHtcbiAgICByZXR1cm4gaW5pdGlhbFNlY3Rpb24gYXMgQWJtTW9kYWxJbml0aWFsU2VjdGlvblxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBjb25zdCBzaG91bGREZW55QWJtRWRpdFdpdGhvdXRNdWx0aUFnZW50cyA9IChpc0VkaXRpbmc6IGJvb2xlYW4sIGhhc011bHRpQWdlbnRzQWNjZXNzOiBib29sZWFuKTogYm9vbGVhbiA9PlxuICBCb29sZWFuKGlzRWRpdGluZyAmJiAhaGFzTXVsdGlBZ2VudHNBY2Nlc3MpXG5cbmV4cG9ydCB0eXBlIEFibUFjY2Vzc1VwZGF0ZUNvbnRleHQgPSB7XG4gIGlzRnJvbUNyZWF0aW9uOiBib29sZWFuXG4gIGlzRnJvbUVkaXRpbmc6IGJvb2xlYW5cbiAgaGFzQWN0aW9uRmlsZXM6IGJvb2xlYW5cbiAgb3BlcmF0aW9uVHlwZTogJ2NyZWF0ZScgfCAndXBkYXRlJyB8IG51bGxcbiAgaGFzQmVlbkNhbGxlZD86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGNvbnN0IHJlc29sdmVBYm1DcmVhdGVBY2Nlc3NVcGRhdGVDb250ZXh0ID0gKFxuICBhY2Nlc3NUeXBlOiBNb2RhbFZhbHVlc1snYWNjZXNzaWJpbGl0eSddWydhY2Nlc3NUeXBlJ11cbik6IEFibUFjY2Vzc1VwZGF0ZUNvbnRleHQgPT4gKHtcbiAgaXNGcm9tQ3JlYXRpb246IHRydWUsXG4gIGlzRnJvbUVkaXRpbmc6IGZhbHNlLFxuICBoYXNBY3Rpb25GaWxlczogYWNjZXNzVHlwZSAhPT0gJ2NvbXBhbnknLFxuICBvcGVyYXRpb25UeXBlOiAnY3JlYXRlJyxcbiAgaGFzQmVlbkNhbGxlZDogZmFsc2UsXG59KVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkU3luY0FibUNsaWVudEFjY2Vzc09uQ3JlYXRlID0gKGFjY2Vzc1R5cGU6IE1vZGFsVmFsdWVzWydhY2Nlc3NpYmlsaXR5J11bJ2FjY2Vzc1R5cGUnXSk6IGJvb2xlYW4gPT5cbiAgYWNjZXNzVHlwZSAhPT0gJ2NvbXBhbnknXG5cbmV4cG9ydCBjb25zdCBidWlsZEFibUZhdm9yaXRlVG9nZ2xlQWdlbnRzID0gPFQgZXh0ZW5kcyB7IGlzX2Zhdm9yaXRlPzogYm9vbGVhbiB9PihcbiAgY3JlYXRlZEFnZW50OiBUXG4pOiB7IGxpc3RBZ2VudDogVDsgdG9nZ2xlQWdlbnQ6IFQgfSA9PiAoe1xuICBsaXN0QWdlbnQ6IHsgLi4uY3JlYXRlZEFnZW50LCBpc19mYXZvcml0ZTogdHJ1ZSB9LFxuICB0b2dnbGVBZ2VudDogeyAuLi5jcmVhdGVkQWdlbnQsIGlzX2Zhdm9yaXRlOiBmYWxzZSB9LFxufSlcblxuZXhwb3J0IHR5cGUgQWJtQ3JlYXRlRmlsZUFjdGlvbnNTbmFwc2hvdCA9IHtcbiAgdG9EZWxldGU6IHVua25vd25bXVxuICB0b1VwbG9hZDogdW5rbm93bltdXG59XG5cbmV4cG9ydCB0eXBlIEFibUNyZWF0ZVN1Y2Nlc3NQbGFuID0gJ2RlbGV0ZUFuZENyZWF0ZScgfCAnZGVsZXRlT25seScgfCAndXBsb2FkT25seScgfCAnYWNjZXNzT25seSdcblxuZXhwb3J0IGNvbnN0IHJlc29sdmVBYm1DcmVhdGVTdWNjZXNzUGxhbiA9IChhY3Rpb25zOiBBYm1DcmVhdGVGaWxlQWN0aW9uc1NuYXBzaG90KTogQWJtQ3JlYXRlU3VjY2Vzc1BsYW4gPT4ge1xuICBjb25zdCBoYXNEZWxldGUgPSBhY3Rpb25zLnRvRGVsZXRlLmxlbmd0aCA+IDBcbiAgY29uc3QgaGFzVXBsb2FkID0gYWN0aW9ucy50b1VwbG9hZC5sZW5ndGggPiAwXG4gIGlmIChoYXNEZWxldGUgJiYgaGFzVXBsb2FkKSByZXR1cm4gJ2RlbGV0ZUFuZENyZWF0ZSdcbiAgaWYgKGhhc0RlbGV0ZSkgcmV0dXJuICdkZWxldGVPbmx5J1xuICBpZiAoaGFzVXBsb2FkKSByZXR1cm4gJ3VwbG9hZE9ubHknXG4gIHJldHVybiAnYWNjZXNzT25seSdcbn1cblxuZXhwb3J0IGNvbnN0IHNob3VsZFNob3dQcm9jZXNzRmlsZXNGb3JDcmVhdGVQbGFuID0gKHBsYW46IEFibUNyZWF0ZVN1Y2Nlc3NQbGFuKTogYm9vbGVhbiA9PiBwbGFuICE9PSAnYWNjZXNzT25seSdcblxuZXhwb3J0IHR5cGUgQWJtVXBkYXRlU3VjY2Vzc1BsYW4gPSAnZGVsZXRlQW5kQ3JlYXRlJyB8ICdkZWxldGVPbmx5JyB8ICd1cGxvYWRPbmx5JyB8ICdhY2Nlc3NPbmx5JyB8ICdnZW5lcmFsT25seSdcblxuZXhwb3J0IGNvbnN0IHJlc29sdmVBYm1VcGRhdGVTdWNjZXNzUGxhbiA9IChcbiAgYWN0aW9uczogQWJtQ3JlYXRlRmlsZUFjdGlvbnNTbmFwc2hvdCxcbiAgYWNjZXNzaWJpbGl0eUNoYW5nZWQ6IGJvb2xlYW5cbik6IEFibVVwZGF0ZVN1Y2Nlc3NQbGFuID0+IHtcbiAgY29uc3QgY3JlYXRlUGxhbiA9IHJlc29sdmVBYm1DcmVhdGVTdWNjZXNzUGxhbihhY3Rpb25zKVxuICBpZiAoY3JlYXRlUGxhbiAhPT0gJ2FjY2Vzc09ubHknKSB7XG4gICAgcmV0dXJuIGNyZWF0ZVBsYW5cbiAgfVxuICBpZiAoYWNjZXNzaWJpbGl0eUNoYW5nZWQpIHtcbiAgICByZXR1cm4gJ2FjY2Vzc09ubHknXG4gIH1cbiAgcmV0dXJuICdnZW5lcmFsT25seSdcbn1cblxuZXhwb3J0IGNvbnN0IHJlc29sdmVBYm1VcGRhdGVBY2Nlc3NVcGRhdGVDb250ZXh0ID0gKCk6IEFibUFjY2Vzc1VwZGF0ZUNvbnRleHQgPT4gKHtcbiAgaXNGcm9tQ3JlYXRpb246IGZhbHNlLFxuICBpc0Zyb21FZGl0aW5nOiB0cnVlLFxuICBoYXNBY3Rpb25GaWxlczogdHJ1ZSxcbiAgb3BlcmF0aW9uVHlwZTogJ3VwZGF0ZScsXG4gIGhhc0JlZW5DYWxsZWQ6IGZhbHNlLFxufSlcblxuZXhwb3J0IGNvbnN0IHJlc29sdmVBYm1VcGRhdGVBY2Nlc3NPbmx5Q29udGV4dCA9IChjdXJyZW50OiBBYm1BY2Nlc3NVcGRhdGVDb250ZXh0KTogQWJtQWNjZXNzVXBkYXRlQ29udGV4dCB8IG51bGwgPT4ge1xuICBpZiAoY3VycmVudC5oYXNCZWVuQ2FsbGVkIHx8IGN1cnJlbnQuaGFzQWN0aW9uRmlsZXMpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIHJldHVybiB7XG4gICAgaXNGcm9tQ3JlYXRpb246IGZhbHNlLFxuICAgIGlzRnJvbUVkaXRpbmc6IHRydWUsXG4gICAgaGFzQWN0aW9uRmlsZXM6IGZhbHNlLFxuICAgIG9wZXJhdGlvblR5cGU6ICd1cGRhdGUnLFxuICAgIGhhc0JlZW5DYWxsZWQ6IGZhbHNlLFxuICB9XG59XG5cbmV4cG9ydCB0eXBlIEFibUNyZWF0ZUFjY2Vzc09ubHlEZWNpc2lvbiA9IHtcbiAgbmV4dENvbnRleHQ6IEFibUFjY2Vzc1VwZGF0ZUNvbnRleHRcbiAgc2hvdWxkQ2FsbEFjY2Vzc0NsaWVudDogYm9vbGVhblxufVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUFibUNyZWF0ZUFjY2Vzc09ubHlEZWNpc2lvbiA9IChcbiAgY3VycmVudDogQWJtQWNjZXNzVXBkYXRlQ29udGV4dCxcbiAgYWNjZXNzVHlwZTogTW9kYWxWYWx1ZXNbJ2FjY2Vzc2liaWxpdHknXVsnYWNjZXNzVHlwZSddXG4pOiBBYm1DcmVhdGVBY2Nlc3NPbmx5RGVjaXNpb24gPT4ge1xuICBpZiAoIXNob3VsZFN5bmNBYm1DbGllbnRBY2Nlc3NPbkNyZWF0ZShhY2Nlc3NUeXBlKSkge1xuICAgIHJldHVybiB7IG5leHRDb250ZXh0OiBjdXJyZW50LCBzaG91bGRDYWxsQWNjZXNzQ2xpZW50OiBmYWxzZSB9XG4gIH1cbiAgaWYgKGN1cnJlbnQuaGFzQmVlbkNhbGxlZCkge1xuICAgIHJldHVybiB7IG5leHRDb250ZXh0OiBjdXJyZW50LCBzaG91bGRDYWxsQWNjZXNzQ2xpZW50OiBmYWxzZSB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG5leHRDb250ZXh0OiB7XG4gICAgICBpc0Zyb21DcmVhdGlvbjogdHJ1ZSxcbiAgICAgIGlzRnJvbUVkaXRpbmc6IGZhbHNlLFxuICAgICAgaGFzQWN0aW9uRmlsZXM6IGN1cnJlbnQuaGFzQWN0aW9uRmlsZXMgfHwgZmFsc2UsXG4gICAgICBvcGVyYXRpb25UeXBlOiAnY3JlYXRlJyxcbiAgICAgIGhhc0JlZW5DYWxsZWQ6IGZhbHNlLFxuICAgIH0sXG4gICAgc2hvdWxkQ2FsbEFjY2Vzc0NsaWVudDogdHJ1ZSxcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlUmVzZXRBYm1BY2Nlc3NVcGRhdGVDb250ZXh0ID0gKCk6IEFibUFjY2Vzc1VwZGF0ZUNvbnRleHQgPT4gKHtcbiAgaXNGcm9tQ3JlYXRpb246IGZhbHNlLFxuICBpc0Zyb21FZGl0aW5nOiBmYWxzZSxcbiAgaGFzQWN0aW9uRmlsZXM6IGZhbHNlLFxuICBvcGVyYXRpb25UeXBlOiBudWxsLFxuICBoYXNCZWVuQ2FsbGVkOiBmYWxzZSxcbn0pXG5cbmV4cG9ydCB0eXBlIEFibVVwZGF0ZUZpbmFsaXplSW5wdXQgPSB7XG4gIGhhc1BlbmRpbmdGaWxlczogYm9vbGVhblxuICBpc1Nob3dQcm9jZXNzRmlsZXM6IGJvb2xlYW5cbiAgdG9VcGxvYWRDb3VudDogbnVtYmVyXG4gIGFjY2Vzc0hhc0FjdGlvbkZpbGVzOiBib29sZWFuXG4gIHN1Y2Nlc3NVcGRhdGVBY2Nlc3M6IGJvb2xlYW5cbiAgcHJvY2Vzc0ZpbGVzVGltZWRPdXQ6IGJvb2xlYW5cbn1cblxuZXhwb3J0IGNvbnN0IHNob3VsZEZpbmFsaXplQWJtVXBkYXRlV2l0aG91dFBlbmRpbmdXb3JrID0gKGlucHV0OiBBYm1VcGRhdGVGaW5hbGl6ZUlucHV0KTogYm9vbGVhbiA9PlxuICAhaW5wdXQuaGFzUGVuZGluZ0ZpbGVzICYmXG4gICFpbnB1dC5pc1Nob3dQcm9jZXNzRmlsZXMgJiZcbiAgaW5wdXQudG9VcGxvYWRDb3VudCA9PT0gMCAmJlxuICAhaW5wdXQuYWNjZXNzSGFzQWN0aW9uRmlsZXMgJiZcbiAgIWlucHV0LnN1Y2Nlc3NVcGRhdGVBY2Nlc3MgJiZcbiAgIWlucHV0LnByb2Nlc3NGaWxlc1RpbWVkT3V0XG5cbmV4cG9ydCB0eXBlIEtub3dsZWRnZVdzQ29tcGxldGlvbkVmZmVjdHMgPSB7XG4gIGNsb3NlUHJvY2Vzc0ZpbGVzOiBib29sZWFuXG4gIGluY3JlbWVudEZpbGVzUHJvY2Vzc2VkOiBib29sZWFuXG4gIG1hcmtGaWxlc0ZpbmlzaGVkRm9yQ3JlYXRlOiBib29sZWFuXG59XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlS25vd2xlZGdlV3NDb21wbGV0aW9uRWZmZWN0cyA9IChcbiAgdXBsb2FkT3V0Y29tZTogS25vd2xlZGdlVXBsb2FkT3V0Y29tZSB8IG51bGwsXG4gIGNvbnRleHQ6IFBpY2s8QWJtQWNjZXNzVXBkYXRlQ29udGV4dCwgJ2hhc0FjdGlvbkZpbGVzJyB8ICdvcGVyYXRpb25UeXBlJz4sXG4gIGFjY2Vzc0hhbmRsZWQ6IGJvb2xlYW4sXG4gIGZpbGVzRmluaXNoZWQ6IGJvb2xlYW5cbik6IEtub3dsZWRnZVdzQ29tcGxldGlvbkVmZmVjdHMgfCBudWxsID0+IHtcbiAgaWYgKHVwbG9hZE91dGNvbWUgPT09ICdlcnJvcicgfHwgdXBsb2FkT3V0Y29tZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgIGNvbnN0IGluY3JlbWVudEZpbGVzUHJvY2Vzc2VkID1cbiAgICAgIHVwbG9hZE91dGNvbWUgPT09ICdjb21wbGV0ZScgJiZcbiAgICAgICgoY29udGV4dC5oYXNBY3Rpb25GaWxlcyAmJiBhY2Nlc3NIYW5kbGVkKSB8fFxuICAgICAgICAoY29udGV4dC5vcGVyYXRpb25UeXBlID09PSAnY3JlYXRlJyAmJiAhY29udGV4dC5oYXNBY3Rpb25GaWxlcyAmJiAhZmlsZXNGaW5pc2hlZCkpXG5cbiAgICBjb25zdCBtYXJrRmlsZXNGaW5pc2hlZEZvckNyZWF0ZSA9XG4gICAgICB1cGxvYWRPdXRjb21lID09PSAnY29tcGxldGUnICYmIGNvbnRleHQub3BlcmF0aW9uVHlwZSA9PT0gJ2NyZWF0ZScgJiYgIWNvbnRleHQuaGFzQWN0aW9uRmlsZXMgJiYgIWZpbGVzRmluaXNoZWRcblxuICAgIHJldHVybiB7XG4gICAgICBjbG9zZVByb2Nlc3NGaWxlczogdHJ1ZSxcbiAgICAgIGluY3JlbWVudEZpbGVzUHJvY2Vzc2VkLFxuICAgICAgbWFya0ZpbGVzRmluaXNoZWRGb3JDcmVhdGUsXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGNvbnN0IHJlc29sdmVBYm1Lbm93bGVkZ2VFcnJvck1lc3NhZ2VLZXkgPSAoaXNFZGl0aW5nOiBib29sZWFuKTogc3RyaW5nID0+XG4gIGlzRWRpdGluZyA/ICdjb25maXJtQWdlbnRVcGRhdGVkV2l0aEZpbGVzRXJyb3InIDogJ2NvbmZpcm1BZ2VudFdpdGhGaWxlc0Vycm9yJ1xuXG5leHBvcnQgY29uc3Qgc2hvdWxkQmxvY2tLbm93bGVkZ2VEZWxldGVTdWNjZXNzQ2xvc2UgPSAoaW5wdXQ6IHtcbiAgaGFzUGVuZGluZ0ZpbGVzOiBib29sZWFuXG4gIGlzU2hvd1Byb2Nlc3NGaWxlczogYm9vbGVhblxuICB0b1VwbG9hZENvdW50OiBudW1iZXJcbiAgcHJvY2Vzc0ZpbGVzVGltZWRPdXQ6IGJvb2xlYW5cbn0pOiBib29sZWFuID0+XG4gIGlucHV0Lmhhc1BlbmRpbmdGaWxlcyB8fCBpbnB1dC5pc1Nob3dQcm9jZXNzRmlsZXMgfHwgaW5wdXQudG9VcGxvYWRDb3VudCA+IDAgfHwgaW5wdXQucHJvY2Vzc0ZpbGVzVGltZWRPdXRcblxuZXhwb3J0IGNvbnN0IHNob3VsZERlZmVyQWNjZXNzVXBkYXRlVW50aWxGaWxlc0NvbXBsZXRlID0gKFxuICBjb250ZXh0OiBQaWNrPEFibUFjY2Vzc1VwZGF0ZUNvbnRleHQsICdoYXNBY3Rpb25GaWxlcyc+LFxuICBoYXNQZW5kaW5nRmlsZXM6IGJvb2xlYW4sXG4gIGlzU2hvd1Byb2Nlc3NGaWxlczogYm9vbGVhblxuKTogYm9vbGVhbiA9PiBjb250ZXh0Lmhhc0FjdGlvbkZpbGVzICYmIChoYXNQZW5kaW5nRmlsZXMgfHwgaXNTaG93UHJvY2Vzc0ZpbGVzKVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkQ2xvc2VDcmVhdGVBZnRlcktub3dsZWRnZVdpdGhvdXRBY2Nlc3MgPSAoaW5wdXQ6IHtcbiAgb3BlcmF0aW9uVHlwZTogQWJtQWNjZXNzVXBkYXRlQ29udGV4dFsnb3BlcmF0aW9uVHlwZSddXG4gIGhhc0FjdGlvbkZpbGVzOiBib29sZWFuXG4gIGZpbGVzRmluaXNoZWQ6IGJvb2xlYW5cbiAgaGFzU3VjY2Vzc0NyZWF0ZTogYm9vbGVhblxuICBoYXNQZW5kaW5nRmlsZXM6IGJvb2xlYW5cbiAgaXNTaG93UHJvY2Vzc0ZpbGVzOiBib29sZWFuXG59KTogYm9vbGVhbiA9PlxuICBpbnB1dC5vcGVyYXRpb25UeXBlID09PSAnY3JlYXRlJyAmJlxuICAhaW5wdXQuaGFzQWN0aW9uRmlsZXMgJiZcbiAgaW5wdXQuZmlsZXNGaW5pc2hlZCAmJlxuICBpbnB1dC5oYXNTdWNjZXNzQ3JlYXRlICYmXG4gICFpbnB1dC5oYXNQZW5kaW5nRmlsZXMgJiZcbiAgIWlucHV0LmlzU2hvd1Byb2Nlc3NGaWxlc1xuXG5leHBvcnQgY29uc3Qgc2hvdWxkQ2xvc2VDcmVhdGVBZnRlcktub3dsZWRnZVdpdGhBY2Nlc3MgPSAoaW5wdXQ6IHtcbiAgb3BlcmF0aW9uVHlwZTogQWJtQWNjZXNzVXBkYXRlQ29udGV4dFsnb3BlcmF0aW9uVHlwZSddXG4gIGhhc0FjdGlvbkZpbGVzOiBib29sZWFuXG4gIGFjY2Vzc0hhbmRsZWQ6IGJvb2xlYW5cbiAgaGFzU3VjY2Vzc0NyZWF0ZTogYm9vbGVhblxuICBoYXNQZW5kaW5nRmlsZXM6IGJvb2xlYW5cbiAgaXNTaG93UHJvY2Vzc0ZpbGVzOiBib29sZWFuXG59KTogYm9vbGVhbiA9PlxuICBpbnB1dC5vcGVyYXRpb25UeXBlID09PSAnY3JlYXRlJyAmJlxuICBpbnB1dC5oYXNBY3Rpb25GaWxlcyAmJlxuICBpbnB1dC5hY2Nlc3NIYW5kbGVkICYmXG4gIGlucHV0Lmhhc1N1Y2Nlc3NDcmVhdGUgJiZcbiAgIWlucHV0Lmhhc1BlbmRpbmdGaWxlcyAmJlxuICAhaW5wdXQuaXNTaG93UHJvY2Vzc0ZpbGVzXG5cbmV4cG9ydCBjb25zdCBzaG91bGRBcHBseVBlbmRpbmdTZWN0aW9uQWZ0ZXJPcGVuID0gKFxuICBpc0VkaXRpbmc6IGJvb2xlYW4sXG4gIHBlbmRpbmdTZWN0aW9uOiBBYm1Nb2RhbEluaXRpYWxTZWN0aW9uIHwgbnVsbFxuKTogYm9vbGVhbiA9PiBCb29sZWFuKHBlbmRpbmdTZWN0aW9uICYmICFpc0VkaXRpbmcpXG5cbmV4cG9ydCB0eXBlIEFibU9wZW5Nb2RhbExvYWRBY3Rpb24gPSAnZGVueV9lZGl0JyB8ICdwcmVmZXRjaF9lZGl0JyB8ICdmZXRjaF9lZGl0JyB8ICdhcHBseV9jcmVhdGVfdmFsdWVzJ1xuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUFibU9wZW5Nb2RhbExvYWRBY3Rpb24gPSAocGFyYW1zOiB7XG4gIGlzRWRpdGluZz86IGJvb2xlYW5cbiAgaGFzTXVsdGlBZ2VudHNBY2Nlc3M6IGJvb2xlYW5cbiAgaGFzUHJlZmV0Y2hlZEFnZW50OiBib29sZWFuXG59KTogQWJtT3Blbk1vZGFsTG9hZEFjdGlvbiA9PiB7XG4gIGlmICghcGFyYW1zLmlzRWRpdGluZykge1xuICAgIHJldHVybiAnYXBwbHlfY3JlYXRlX3ZhbHVlcydcbiAgfVxuICBpZiAoc2hvdWxkRGVueUFibUVkaXRXaXRob3V0TXVsdGlBZ2VudHModHJ1ZSwgcGFyYW1zLmhhc011bHRpQWdlbnRzQWNjZXNzKSkge1xuICAgIHJldHVybiAnZGVueV9lZGl0J1xuICB9XG4gIGlmIChwYXJhbXMuaGFzUHJlZmV0Y2hlZEFnZW50KSB7XG4gICAgcmV0dXJuICdwcmVmZXRjaF9lZGl0J1xuICB9XG4gIHJldHVybiAnZmV0Y2hfZWRpdCdcbn1cblxuZXhwb3J0IGNvbnN0IGNhbkFwcGx5QWJtRWRpdGluZ0FnZW50RGV0YWlsID0gKHNvdXJjZTogeyB0eXBlPzogc3RyaW5nIH0sIGhhc011bHRpQWdlbnRzQWNjZXNzOiBib29sZWFuKTogYm9vbGVhbiA9PlxuICBzb3VyY2UudHlwZSA9PT0gJ2N1c3RvbScgJiYgaGFzTXVsdGlBZ2VudHNBY2Nlc3NcblxuZXhwb3J0IGNvbnN0IHNob3VsZFNldERlZmF1bHRBaU1vZGVsRm9yTmV3QWdlbnQgPSAocGFyYW1zOiB7XG4gIGlzTG9hZGluZzogYm9vbGVhblxuICBhZ2VudExvYWRpbmc6IGJvb2xlYW5cbiAgaGFzQWdlbnRCeUlkOiBib29sZWFuXG4gIGlzRWRpdGluZzogYm9vbGVhblxufSk6IGJvb2xlYW4gPT4gIXBhcmFtcy5pc0xvYWRpbmcgJiYgIXBhcmFtcy5hZ2VudExvYWRpbmcgJiYgIXBhcmFtcy5oYXNBZ2VudEJ5SWQgJiYgIXBhcmFtcy5pc0VkaXRpbmdcblxuZXhwb3J0IGNvbnN0IHNob3VsZFNraXBBYm1Db25maXJtV2l0aG91dE11bHRpQWdlbnRzID0gKGhhc011bHRpQWdlbnRzQWNjZXNzOiBib29sZWFuKTogYm9vbGVhbiA9PiAhaGFzTXVsdGlBZ2VudHNBY2Nlc3NcblxuZXhwb3J0IGNvbnN0IHJlc29sdmVBYm1EcmFmdEZhdm9yaXRlVmFsdWUgPSAoY3VycmVudElzRmF2b3JpdGU6IGJvb2xlYW4pOiBib29sZWFuID0+ICFjdXJyZW50SXNGYXZvcml0ZVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUFibUNyZWF0ZUZhdm9yaXRlQWdlbnRzID0gPFQgZXh0ZW5kcyB7IGlzX2Zhdm9yaXRlPzogYm9vbGVhbiB9PihcbiAgY3JlYXRlZEFnZW50OiBULFxuICBtYXJrRmF2b3JpdGU6IGJvb2xlYW5cbik6IHsgbGlzdEFnZW50OiBUOyB0b2dnbGVBZ2VudDogVCB8IG51bGwgfSA9PiB7XG4gIGlmICghbWFya0Zhdm9yaXRlKSB7XG4gICAgcmV0dXJuIHsgbGlzdEFnZW50OiBjcmVhdGVkQWdlbnQsIHRvZ2dsZUFnZW50OiBudWxsIH1cbiAgfVxuXG4gIGNvbnN0IHsgbGlzdEFnZW50LCB0b2dnbGVBZ2VudCB9ID0gYnVpbGRBYm1GYXZvcml0ZVRvZ2dsZUFnZW50cyhjcmVhdGVkQWdlbnQpXG4gIHJldHVybiB7IGxpc3RBZ2VudCwgdG9nZ2xlQWdlbnQgfVxufVxuXG5leHBvcnQgdHlwZSBBYm1Lbm93bGVkZ2VGaWxlQWN0aW9ucyA9IHtcbiAgdG9VcGxvYWQ6IEF0dGFjaG1lbnRGaWxlW11cbiAgdG9EZWxldGU6IEF0dGFjaG1lbnRGaWxlW11cbn1cblxuZXhwb3J0IGNvbnN0IGFwcGx5QWJtS25vd2xlZGdlRmlsZUFjdGlvbnMgPSAoXG4gIHZhbHVlOiBBdHRhY2htZW50RmlsZVtdIHwgdW5kZWZpbmVkLFxuICBkZWxldGVLbm93bGVkZ2U6IGJvb2xlYW4sXG4gIGN1cnJlbnRLbm93bGVkZ2U6IEF0dGFjaG1lbnRGaWxlW10sXG4gIGN1cnJlbnRBY3Rpb25zOiBBYm1Lbm93bGVkZ2VGaWxlQWN0aW9uc1xuKTogQWJtS25vd2xlZGdlRmlsZUFjdGlvbnMgPT4ge1xuICBpZiAoIWRlbGV0ZUtub3dsZWRnZSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5jdXJyZW50QWN0aW9ucyxcbiAgICAgIHRvVXBsb2FkOiBbLi4uY3VycmVudEFjdGlvbnMudG9VcGxvYWQsIC4uLih2YWx1ZSB8fCBbXSldLFxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGZpbGVzUHJldklkcyA9IHZhbHVlPy5sZW5ndGggPyBuZXcgU2V0KHZhbHVlLm1hcChmaWxlID0+IGZpbGUuaWQpKSA6IG5ldyBTZXQ8c3RyaW5nPigpXG4gIGNvbnN0IG5ld0ZpbGVzID0gY3VycmVudEtub3dsZWRnZS5maWx0ZXIoZmlsZSA9PiAhZmlsZXNQcmV2SWRzLmhhcyhmaWxlLmlkKSAmJiBmaWxlLnN0YXR1cyAhPT0gJ3N0YXJ0ZWQnKVxuICBsZXQgbmV4dFRvVXBsb2FkID0gY3VycmVudEFjdGlvbnMudG9VcGxvYWRcblxuICBpZiAoIW5ld0ZpbGVzLmxlbmd0aCAmJiBjdXJyZW50QWN0aW9ucy50b1VwbG9hZC5sZW5ndGgpIHtcbiAgICBjb25zdCB2YWx1ZUlkcyA9IG5ldyBTZXQodmFsdWU/Lm1hcChmaWxlID0+IGZpbGUuaWQpID8/IFtdKVxuICAgIG5leHRUb1VwbG9hZCA9IGN1cnJlbnRBY3Rpb25zLnRvVXBsb2FkLmZpbHRlcihmaWxlID0+IHZhbHVlSWRzLmhhcyhmaWxlLmlkKSlcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdG9VcGxvYWQ6IG5leHRUb1VwbG9hZCxcbiAgICB0b0RlbGV0ZTogWy4uLmN1cnJlbnRBY3Rpb25zLnRvRGVsZXRlLCAuLi5uZXdGaWxlc10sXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG1lcmdlQWJtQWdlbnRWYWx1ZXNCeUtleSA9IChcbiAgcHJldjogTW9kYWxWYWx1ZXMsXG4gIGtleTogc3RyaW5nLFxuICB2YWx1ZTogdW5rbm93bixcbiAgZGVsZXRlS25vd2xlZGdlOiBib29sZWFuXG4pOiBNb2RhbFZhbHVlcyA9PiB7XG4gIGlmIChrZXkgPT09ICdrbm93bGVkZ2UnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnByZXYsXG4gICAgICBrbm93bGVkZ2U6IGRlbGV0ZUtub3dsZWRnZVxuICAgICAgICA/ICh2YWx1ZSBhcyBBdHRhY2htZW50RmlsZVtdKVxuICAgICAgICA6IFsuLi4ocHJldi5rbm93bGVkZ2UgfHwgW10pLCAuLi4oKHZhbHVlIGFzIEF0dGFjaG1lbnRGaWxlW10pIHx8IFtdKV0sXG4gICAgfVxuICB9XG5cbiAgaWYgKGtleSA9PT0gJ2FjY2Vzc2liaWxpdHknKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnByZXYsXG4gICAgICBhY2Nlc3NpYmlsaXR5OiB2YWx1ZSBhcyBNb2RhbFZhbHVlc1snYWNjZXNzaWJpbGl0eSddLFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4ucHJldixcbiAgICBnZW5lcmFsOiB7XG4gICAgICAuLi5wcmV2LmdlbmVyYWwsXG4gICAgICBba2V5XTogdmFsdWUsXG4gICAgfSxcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkUnVuQWJtQ3JlYXRlU3VjY2Vzc0hhbmRsZXIgPSAoXG4gIHN1Y2Nlc3NDcmVhdGVJZDogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkLFxuICBpc0xvYWRpbmdDcmVhdGU6IGJvb2xlYW4sXG4gIGxhc3RIYW5kbGVkQ3JlYXRlSWQ6IHN0cmluZyB8IG51bWJlciB8IG51bGxcbik6IGJvb2xlYW4gPT4gQm9vbGVhbihzdWNjZXNzQ3JlYXRlSWQgJiYgIWlzTG9hZGluZ0NyZWF0ZSAmJiBsYXN0SGFuZGxlZENyZWF0ZUlkICE9PSBzdWNjZXNzQ3JlYXRlSWQpXG5cbmV4cG9ydCBjb25zdCBtZXJnZUFibU9wZW5BZ2VudFZhbHVlcyA9IChpbml0aWFsVmFsdWVzOiBNb2RhbFZhbHVlcywgaW5jb21pbmc/OiBQYXJ0aWFsPE1vZGFsVmFsdWVzPik6IE1vZGFsVmFsdWVzID0+IHtcbiAgaWYgKCFpbmNvbWluZykge1xuICAgIHJldHVybiBpbml0aWFsVmFsdWVzXG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLmluaXRpYWxWYWx1ZXMsXG4gICAgLi4uaW5jb21pbmcsXG4gICAgZ2VuZXJhbDoge1xuICAgICAgLi4uaW5pdGlhbFZhbHVlcy5nZW5lcmFsLFxuICAgICAgLi4uKGluY29taW5nLmdlbmVyYWwgfHwge30pLFxuICAgIH0sXG4gICAgYWNjZXNzaWJpbGl0eToge1xuICAgICAgLi4uaW5pdGlhbFZhbHVlcy5hY2Nlc3NpYmlsaXR5LFxuICAgICAgLi4uKGluY29taW5nLmFjY2Vzc2liaWxpdHkgfHwge30pLFxuICAgIH0sXG4gICAga25vd2xlZGdlOiBpbmNvbWluZy5rbm93bGVkZ2UgfHwgW10sXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHJlc29sdmVBYm1DcmVhdGVLbm93bGVkZ2VIYW5kbGVyID0gKFxuICBwbGFuOiBBYm1DcmVhdGVTdWNjZXNzUGxhblxuKTogJ2RlbGV0ZUFuZENyZWF0ZScgfCAnZGVsZXRlT25seScgfCAndXBsb2FkT25seScgfCBudWxsID0+IHtcbiAgaWYgKHBsYW4gPT09ICdkZWxldGVBbmRDcmVhdGUnKSByZXR1cm4gJ2RlbGV0ZUFuZENyZWF0ZSdcbiAgaWYgKHBsYW4gPT09ICdkZWxldGVPbmx5JykgcmV0dXJuICdkZWxldGVPbmx5J1xuICBpZiAocGxhbiA9PT0gJ3VwbG9hZE9ubHknKSByZXR1cm4gJ3VwbG9hZE9ubHknXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBjb25zdCBzaG91bGRSZXBlYXREZWxldGVLbm93bGVkZ2VzT25DcmVhdGUgPSAocGxhbjogQWJtQ3JlYXRlU3VjY2Vzc1BsYW4pOiBib29sZWFuID0+IHBsYW4gPT09ICdkZWxldGVPbmx5J1xuXG5leHBvcnQgY29uc3Qgc2hvdWxkRW5xdWV1ZUFibUNyZWF0ZUZhdm9yaXRlVG9nZ2xlID0gKHRvZ2dsZUFnZW50OiB1bmtub3duKTogYm9vbGVhbiA9PiBCb29sZWFuKHRvZ2dsZUFnZW50KVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkSGFuZGxlQWJtQ3JlYXRlQWNjZXNzT25seUNsaWVudCA9IChkZWNpc2lvbjogQWJtQ3JlYXRlQWNjZXNzT25seURlY2lzaW9uKTogYm9vbGVhbiA9PlxuICBkZWNpc2lvbi5zaG91bGRDYWxsQWNjZXNzQ2xpZW50XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVJbml0aWFsQWJtTW9kYWxWYWx1ZXMgPSAoKTogTW9kYWxWYWx1ZXMgPT4gKHtcbiAgaXNFZGl0aW5nOiBmYWxzZSxcbiAga25vd2xlZGdlOiBbXSxcbiAgZ2VuZXJhbDoge1xuICAgIG5hbWU6ICcnLFxuICAgIGVtb2ppOiAnJyxcbiAgICBpbnRyb2R1Y3Rpb246ICcnLFxuICAgIGlucHV0UGxhY2Vob2xkZXI6ICcnLFxuICAgIGlzQWN0aXZlOiBmYWxzZSxcbiAgICBhaU1vZGVsOiBudWxsLFxuICAgIGlkOiBudWxsLFxuICAgIHVzZXJQcm9tcHQ6IG51bGwsXG4gICAga25vd2xlZGdlQmFzZXM6IFtdLFxuICAgIGlzX2Zhdm9yaXRlOiBmYWxzZSxcbiAgfSxcbiAgYWNjZXNzaWJpbGl0eToge1xuICAgIGFjY2Vzc1R5cGU6ICdjb21wYW55JyxcbiAgICBjbGllbnRzOiBudWxsLFxuICAgIGNvckFjY2VzczogREVGQVVMVF9DT1JfQUNDRVNTLFxuICB9LFxufSlcblxuZXhwb3J0IGNvbnN0IHNob3VsZFByb2Nlc3NLbm93bGVkZ2VXc1N0YXR1cyA9IChzdGF0dXM6IHN0cmluZyk6IGJvb2xlYW4gPT4gc3RhdHVzID09PSAnZG9uZScgfHwgc3RhdHVzID09PSAnZmFpbGVkJ1xuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUFibUtub3dsZWRnZVdzQ2hhbm5lbCA9IChcbiAgYWdlbnRCeUlkOiB7IGlkPzogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB9IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgc3VjY2Vzc0NyZWF0ZUlkOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkXG4pOiBzdHJpbmcgfCBudWxsID0+IHtcbiAgY29uc3QgYWdlbnRJZCA9IGFnZW50QnlJZD8uaWQgPz8gc3VjY2Vzc0NyZWF0ZUlkXG4gIHJldHVybiBhZ2VudElkICE9IG51bGwgPyBga25vd2xlZGdlLWJhc2Uuc3RhdHVzOiR7YWdlbnRJZH1gIDogbnVsbFxufVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUFibUZhdm9yaXRlVG9vbHRpcEtleSA9IChcbiAgaXNGYXZvcml0ZTogYm9vbGVhblxuKTogJ2dlbmVyYWxTZWN0aW9uLnJlbW92ZUZhdm9yaXRlJyB8ICdnZW5lcmFsU2VjdGlvbi5hZGRGYXZvcml0ZScgPT5cbiAgaXNGYXZvcml0ZSA/ICdnZW5lcmFsU2VjdGlvbi5yZW1vdmVGYXZvcml0ZScgOiAnZ2VuZXJhbFNlY3Rpb24uYWRkRmF2b3JpdGUnXG5cbmV4cG9ydCBjb25zdCBzaG91bGRTZWxlY3RBZ2VudEFmdGVyRGVsZXRlID0gKFxuICBjdXJyZW50U2VsZWN0ZWRBZ2VudElkOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBkZWxldGVkQWdlbnRJZDogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZFxuKTogYm9vbGVhbiA9PlxuICBjdXJyZW50U2VsZWN0ZWRBZ2VudElkICE9IG51bGwgJiYgZGVsZXRlZEFnZW50SWQgIT0gbnVsbCAmJiBTdHJpbmcoY3VycmVudFNlbGVjdGVkQWdlbnRJZCkgPT09IFN0cmluZyhkZWxldGVkQWdlbnRJZClcblxuZXhwb3J0IGNvbnN0IHNob3VsZFJ1bkFibVByb2Nlc3NGaWxlc1RpbWVvdXQgPSAoaGFzUGVuZGluZ0ZpbGVzOiBib29sZWFuLCBpc1Nob3dQcm9jZXNzRmlsZXM6IGJvb2xlYW4pOiBib29sZWFuID0+XG4gIGhhc1BlbmRpbmdGaWxlcyB8fCBpc1Nob3dQcm9jZXNzRmlsZXNcblxuZXhwb3J0IGNvbnN0IHJlc29sdmVBYm1Qcm9jZXNzRmlsZXNUaW1lb3V0U3VjY2Vzc0tleSA9IChcbiAgaXNFZGl0aW5nOiBib29sZWFuXG4pOiAnY29uZmlybUFnZW50VXBkYXRlZCcgfCAnY29uZmlybUFnZW50Q3JlYXRlZCcgPT4gKGlzRWRpdGluZyA/ICdjb25maXJtQWdlbnRVcGRhdGVkJyA6ICdjb25maXJtQWdlbnRDcmVhdGVkJylcblxuZXhwb3J0IGNvbnN0IHNob3VsZFN5bmNTZWxlY3RlZEFnZW50QWZ0ZXJNdXRhdGlvbiA9IChcbiAgY3VycmVudFNlbGVjdGVkQWdlbnRJZDogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgbXV0YXRlZEFnZW50SWQ6IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWRcbik6IGJvb2xlYW4gPT5cbiAgY3VycmVudFNlbGVjdGVkQWdlbnRJZCAhPSBudWxsICYmIG11dGF0ZWRBZ2VudElkICE9IG51bGwgJiYgU3RyaW5nKGN1cnJlbnRTZWxlY3RlZEFnZW50SWQpID09PSBTdHJpbmcobXV0YXRlZEFnZW50SWQpXG5cbmV4cG9ydCBjb25zdCBzaG91bGRJbmNsdWRlQWNjZXNzaWJpbGl0eVVwZGF0ZUluS25vd2xlZGdlQmF0Y2ggPSAoYWNjZXNzaWJpbGl0eUNoYW5nZWQ6IGJvb2xlYW4pOiBib29sZWFuID0+XG4gIGFjY2Vzc2liaWxpdHlDaGFuZ2VkXG5cbmV4cG9ydCBjb25zdCBzaG91bGRSZXNldFN1Y2Nlc3NVcGRhdGVBY2Nlc3NPbkNyZWF0ZUNsb3NlID0gKHN1Y2Nlc3NVcGRhdGVBY2Nlc3M6IGJvb2xlYW4pOiBib29sZWFuID0+XG4gIHN1Y2Nlc3NVcGRhdGVBY2Nlc3NcblxuZXhwb3J0IGNvbnN0IHNob3VsZEh5ZHJhdGVBZ2VudENvbm5lY3RvcnNPbkVkaXQgPSAoXG4gIGFnZW50SWQ6IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGV4dGVybmFsQ29ubmVjdG9yc0VuYWJsZWQ6IGJvb2xlYW5cbik6IGJvb2xlYW4gPT4gQm9vbGVhbihhZ2VudElkICYmIGV4dGVybmFsQ29ubmVjdG9yc0VuYWJsZWQpXG5cbmV4cG9ydCBjb25zdCBzaG91bGRTaG93QWJtTG9hZGVyRmlsZXMgPSAoaXNTaG93UHJvY2Vzc0ZpbGVzOiBib29sZWFuLCBoYXNQZW5kaW5nRmlsZXM6IGJvb2xlYW4pOiBib29sZWFuID0+XG4gIGlzU2hvd1Byb2Nlc3NGaWxlcyAmJiBoYXNQZW5kaW5nRmlsZXNcblxuZXhwb3J0IGNvbnN0IHJlc29sdmVBYm1Nb2RhbFRpdGxlS2V5ID0gKGlzRWRpdGluZzogYm9vbGVhbik6ICdlZGl0QWdlbnQnIHwgJ25ld0FnZW50JyA9PlxuICBpc0VkaXRpbmcgPyAnZWRpdEFnZW50JyA6ICduZXdBZ2VudCdcblxuZXhwb3J0IGNvbnN0IHNob3VsZERpc2FibGVBYm1IZWFkZXJDbG9zZSA9IChcbiAgaXNMb2FkaW5nOiBib29sZWFuLFxuICBpc0xvYWRpbmdLbm93bGVkZ2U6IGJvb2xlYW4sXG4gIGlzTG9hZGluZ0NyZWF0ZTogYm9vbGVhbixcbiAgaXNMb2FkaW5nVXBkYXRlQWNjZXNzOiBib29sZWFuXG4pOiBib29sZWFuID0+IGlzTG9hZGluZyB8fCBpc0xvYWRpbmdLbm93bGVkZ2UgfHwgaXNMb2FkaW5nQ3JlYXRlIHx8IGlzTG9hZGluZ1VwZGF0ZUFjY2Vzc1xuXG5leHBvcnQgdHlwZSBBYm1TYXZlQWN0aW9uID0gJ2NyZWF0ZScgfCAndXBkYXRlJyB8ICdub29wJ1xuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUFibVNhdmVBY3Rpb24gPSAoaXNFZGl0aW5nOiBib29sZWFuLCBoYXNTYW1lVmFsdWVzOiBib29sZWFuKTogQWJtU2F2ZUFjdGlvbiA9PiB7XG4gIGlmIChpc0VkaXRpbmcpIHtcbiAgICByZXR1cm4gaGFzU2FtZVZhbHVlcyA/ICdub29wJyA6ICd1cGRhdGUnXG4gIH1cbiAgcmV0dXJuICdjcmVhdGUnXG59XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlUHJvY2Vzc0ZpbGVzVGltZW91dEZsYWdCZWZvcmVTYXZlID0gKCk6IGJvb2xlYW4gPT4gZmFsc2VcbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUdBLFNBQ0VBLG9CQUFvQixFQUNwQkMsa0JBQWtCLEVBQ2xCQyxpQ0FBaUMsRUFDakNDLHVCQUF1QixRQUNsQix5Q0FBeUM7QUFFaEQsSUFBTUMsNkJBQTZCLEdBQUcsQ0FBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFVO0FBRXJHLE9BQU8sSUFBTUMsa0NBQWtDLEdBQUcsU0FBckNBLGtD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