@projectcor/maia-components 2.11.110-1 → 2.26.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 (668) hide show
  1. package/README.md +2 -0
  2. package/package.json +3 -3
  3. package/CHANGELOG.md +0 -642
  4. package/lib/App.js +0 -55
  5. package/lib/components/atoms/ActionableButton.js +0 -60
  6. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.js +0 -89
  7. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.styles.js +0 -21
  8. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.utils.js +0 -9
  9. package/lib/components/atoms/AgentActivityIndicator/index.js +0 -2
  10. package/lib/components/atoms/ApprovalBox/ApprovalBox.js +0 -209
  11. package/lib/components/atoms/ApprovalBox/ApprovalBox.styles.js +0 -93
  12. package/lib/components/atoms/ApprovalBox/index.js +0 -2
  13. package/lib/components/atoms/AttachmentCard/AttachmentCard.js +0 -218
  14. package/lib/components/atoms/AttachmentCard/AttachmentCard.styles.js +0 -52
  15. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.js +0 -448
  16. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.styles.js +0 -58
  17. package/lib/components/atoms/AttachmentCard/AttachmentCardImage.js +0 -55
  18. package/lib/components/atoms/AttachmentCard/AttachmentCardImage.styles.js +0 -14
  19. package/lib/components/atoms/AttachmentCard/index.js +0 -4
  20. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +0 -442
  21. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.styles.js +0 -119
  22. package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.js +0 -222
  23. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.js +0 -313
  24. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.js +0 -128
  25. package/lib/components/atoms/AttachmentPreviewModal/index.js +0 -2
  26. package/lib/components/atoms/Backdrop/Backdrop.js +0 -17
  27. package/lib/components/atoms/Backdrop/Backdrop.styles.js +0 -9
  28. package/lib/components/atoms/Backdrop/index.js +0 -2
  29. package/lib/components/atoms/CardItem.js +0 -7
  30. package/lib/components/atoms/CardMenu/CardMenu.js +0 -131
  31. package/lib/components/atoms/CardMenu/index.js +0 -2
  32. package/lib/components/atoms/CardMenu/styles.js +0 -21
  33. package/lib/components/atoms/ChatClientSelector/ChatClientSelector.js +0 -77
  34. package/lib/components/atoms/ChatClientSelector/index.js +0 -2
  35. package/lib/components/atoms/ChatDisclaimerMessage/ChatDisclaimerMessage.js +0 -9
  36. package/lib/components/atoms/ChatDisclaimerMessage/index.js +0 -2
  37. package/lib/components/atoms/ChatDisclaimerMessage/styles.js +0 -6
  38. package/lib/components/atoms/Checkbox/Checkbox.js +0 -34
  39. package/lib/components/atoms/Checkbox/index.js +0 -2
  40. package/lib/components/atoms/Checkbox/styles.js +0 -39
  41. package/lib/components/atoms/Chip/Chip.js +0 -150
  42. package/lib/components/atoms/Chip/index.js +0 -2
  43. package/lib/components/atoms/Chip/styles.js +0 -43
  44. package/lib/components/atoms/ChipLlm/ChipLlm.js +0 -45
  45. package/lib/components/atoms/ChipLlm/ChipLlm.style.js +0 -21
  46. package/lib/components/atoms/ChipLlm/index.js +0 -2
  47. package/lib/components/atoms/ChipStatus/ChipStatus.interface.js +0 -2
  48. package/lib/components/atoms/ChipStatus/ChipStatus.js +0 -14
  49. package/lib/components/atoms/ChipStatus/ChipStatus.styles.js +0 -27
  50. package/lib/components/atoms/ChipStatus/index.js +0 -2
  51. package/lib/components/atoms/ClearButton.js +0 -6
  52. package/lib/components/atoms/ClientSelector/ClientSelector.js +0 -146
  53. package/lib/components/atoms/ClientSelector/ClientSelector.styles.js +0 -15
  54. package/lib/components/atoms/ClientSelector/index.js +0 -2
  55. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.js +0 -38
  56. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.styles.js +0 -188
  57. package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.js +0 -39
  58. package/lib/components/atoms/ContextMentionChip/buildChipElement.js +0 -445
  59. package/lib/components/atoms/ContextMentionChip/index.js +0 -4
  60. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +0 -533
  61. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.styles.js +0 -10
  62. package/lib/components/atoms/ContextMentionEditor/index.js +0 -2
  63. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.js +0 -282
  64. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.styles.js +0 -148
  65. package/lib/components/atoms/ContextMentionItem/index.js +0 -2
  66. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.js +0 -290
  67. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.styles.js +0 -108
  68. package/lib/components/atoms/ContextMentionPopover/index.js +0 -3
  69. package/lib/components/atoms/CopyToClipboard.js +0 -70
  70. package/lib/components/atoms/EditableLabel/EditableLabel.js +0 -110
  71. package/lib/components/atoms/EditableLabel/index.js +0 -2
  72. package/lib/components/atoms/EditableLabel/styles.js +0 -7
  73. package/lib/components/atoms/EmptySearchClients/EmptySearchClients.js +0 -22
  74. package/lib/components/atoms/EmptySearchClients/EmptySearchClients.styles.js +0 -18
  75. package/lib/components/atoms/EmptySearchClients/index.js +0 -2
  76. package/lib/components/atoms/EmptySearchProjects/EmptySearchProjects.js +0 -19
  77. package/lib/components/atoms/EmptySearchProjects/EmptySearchProjects.styles.js +0 -15
  78. package/lib/components/atoms/EmptySearchProjects/index.js +0 -2
  79. package/lib/components/atoms/EntitySelector/EntitySelector.js +0 -247
  80. package/lib/components/atoms/EntitySelector/EntitySelector.skeleton.js +0 -38
  81. package/lib/components/atoms/EntitySelector/EntitySelector.styles.js +0 -67
  82. package/lib/components/atoms/EntitySelector/index.js +0 -2
  83. package/lib/components/atoms/ErrorSearchClients/ErrorSearchClients.js +0 -14
  84. package/lib/components/atoms/ErrorSearchClients/ErrorSearchClients.styles.js +0 -15
  85. package/lib/components/atoms/ErrorSearchFaqs/ErrorSearchFaqs.js +0 -14
  86. package/lib/components/atoms/ErrorSearchFaqs/ErrorSearchFaqs.style.js +0 -15
  87. package/lib/components/atoms/ErrorSearchFaqs/index.js +0 -2
  88. package/lib/components/atoms/ErrorSearchProjects/ErrorSearchProjects.js +0 -18
  89. package/lib/components/atoms/ErrorSearchProjects/ErrorSearchProjects.style.js +0 -15
  90. package/lib/components/atoms/ErrorSearchProjects/index.js +0 -2
  91. package/lib/components/atoms/Expand/Expand.js +0 -32
  92. package/lib/components/atoms/Expand/index.js +0 -2
  93. package/lib/components/atoms/Fade/Fade.js +0 -56
  94. package/lib/components/atoms/Fade/index.js +0 -2
  95. package/lib/components/atoms/FeedbackButton/FeedbackButton.js +0 -59
  96. package/lib/components/atoms/FeedbackButton/FeedbackButton.styles.js +0 -14
  97. package/lib/components/atoms/FeedbackButton/index.js +0 -2
  98. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.js +0 -138
  99. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.skeleton.js +0 -44
  100. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.styles.js +0 -43
  101. package/lib/components/atoms/FrequentlyAskedQuestions/index.js +0 -2
  102. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +0 -122
  103. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.skeleton.js +0 -43
  104. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +0 -62
  105. package/lib/components/atoms/FrequentlyUsedActions/index.js +0 -2
  106. package/lib/components/atoms/GoBackButton.js +0 -24
  107. package/lib/components/atoms/HelpButton.js +0 -44
  108. package/lib/components/atoms/IconButton.js +0 -56
  109. package/lib/components/atoms/ImagePreview/ImagePreview.js +0 -96
  110. package/lib/components/atoms/ImagePreview/ImagePreview.styles.js +0 -70
  111. package/lib/components/atoms/Input/CustomInput.interface.js +0 -2
  112. package/lib/components/atoms/Input/CustomInput.js +0 -91
  113. package/lib/components/atoms/Input/CustomInput.styles.js +0 -39
  114. package/lib/components/atoms/Input/index.js +0 -2
  115. package/lib/components/atoms/ListMenuOption/ListMenuOption.js +0 -41
  116. package/lib/components/atoms/ListMenuOption/index.js +0 -2
  117. package/lib/components/atoms/ListMenuOption/styles.js +0 -9
  118. package/lib/components/atoms/Loader.js +0 -41
  119. package/lib/components/atoms/LoadingFaqs/LoadingFaqs.js +0 -11
  120. package/lib/components/atoms/LoadingFaqs/LoadingFaqs.style.js +0 -6
  121. package/lib/components/atoms/LoadingFaqs/index.js +0 -2
  122. package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.js +0 -11
  123. package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.styles.js +0 -6
  124. package/lib/components/atoms/LoadingSearchClients/index.js +0 -2
  125. package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.js +0 -14
  126. package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.style.js +0 -10
  127. package/lib/components/atoms/LoadingSearchProjects/index.js +0 -2
  128. package/lib/components/atoms/LoadingText/LoadingText.js +0 -18
  129. package/lib/components/atoms/LoadingText/index.js +0 -2
  130. package/lib/components/atoms/LoadingText/styles.js +0 -7
  131. package/lib/components/atoms/MAIAButton/MAIAButton.js +0 -33
  132. package/lib/components/atoms/MAIAButton/index.js +0 -2
  133. package/lib/components/atoms/MAIAError/MAIAError.js +0 -15
  134. package/lib/components/atoms/MAIAError/index.js +0 -2
  135. package/lib/components/atoms/MAIAInput/MAIAInput.js +0 -1233
  136. package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +0 -266
  137. package/lib/components/atoms/MAIAInput/index.js +0 -2
  138. package/lib/components/atoms/MAIAInput/maiaInputLayout.js +0 -25
  139. package/lib/components/atoms/MAIAInput/styles.js +0 -186
  140. package/lib/components/atoms/MAIAMessage/MAIAMessage.interfaces.js +0 -2
  141. package/lib/components/atoms/MAIAMessage/MAIAMessage.js +0 -22
  142. package/lib/components/atoms/MAIAMessage/index.js +0 -2
  143. package/lib/components/atoms/MAIAMessage/styles.js +0 -7
  144. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.config.js +0 -23
  145. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.interfaces.js +0 -2
  146. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.js +0 -51
  147. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.styles.js +0 -26
  148. package/lib/components/atoms/MaiaStreamdown/index.js +0 -2
  149. package/lib/components/atoms/MaiaWrapper/MaiaWrapper.js +0 -18
  150. package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.js +0 -84
  151. package/lib/components/atoms/MaiaWrapper/ModernMaiaWrapper.js +0 -15
  152. package/lib/components/atoms/MaiaWrapper/index.js +0 -3
  153. package/lib/components/atoms/MaiaWrapper/styles.js +0 -21
  154. package/lib/components/atoms/ModalClientAccess/ModalClientAccess.interface.js +0 -2
  155. package/lib/components/atoms/ModalClientAccess/ModalClientAccess.js +0 -84
  156. package/lib/components/atoms/ModalClientAccess/ModalClientAccess.styles.js +0 -53
  157. package/lib/components/atoms/ModalClientAccess/index.js +0 -2
  158. package/lib/components/atoms/ModalInfo/ModalInfo.js +0 -52
  159. package/lib/components/atoms/ModalInfo/ModalInfoContent.js +0 -7
  160. package/lib/components/atoms/ModalInfo/index.js +0 -3
  161. package/lib/components/atoms/ModalInfo/styles.js +0 -7
  162. package/lib/components/atoms/ModalProject/ModalProject.interface.js +0 -2
  163. package/lib/components/atoms/ModalProject/ModalProject.js +0 -112
  164. package/lib/components/atoms/ModalProject/ModalProject.style.js +0 -59
  165. package/lib/components/atoms/ModalProject/index.js +0 -2
  166. package/lib/components/atoms/NextPageLoader.js +0 -33
  167. package/lib/components/atoms/OnboardingModalButton/OnboardingModal.js +0 -28
  168. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.js +0 -180
  169. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.styles.js +0 -34
  170. package/lib/components/atoms/OnboardingModalButton/index.js +0 -3
  171. package/lib/components/atoms/OptionAccessibility/OptionAccessibility.js +0 -131
  172. package/lib/components/atoms/OptionAccessibility/OptionAccessibility.styles.js +0 -59
  173. package/lib/components/atoms/OptionAccessibility/index.js +0 -2
  174. package/lib/components/atoms/OptionCorPermission/OptionCorPermission.js +0 -27
  175. package/lib/components/atoms/OptionCorPermission/OptionCorPermission.styles.js +0 -18
  176. package/lib/components/atoms/OptionCorPermission/index.js +0 -2
  177. package/lib/components/atoms/PrimaryButton.js +0 -31
  178. package/lib/components/atoms/ProjectSelector/ProjectSelector.js +0 -77
  179. package/lib/components/atoms/ProjectSelector/ProjectSelector.styles.js +0 -61
  180. package/lib/components/atoms/ProjectSelector/index.js +0 -2
  181. package/lib/components/atoms/SecondaryButton.js +0 -20
  182. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.js +0 -20
  183. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.styles.js +0 -20
  184. package/lib/components/atoms/SessionGeneratingDot/index.js +0 -2
  185. package/lib/components/atoms/Skeleton/Skeleton.js +0 -36
  186. package/lib/components/atoms/Skeleton/index.js +0 -2
  187. package/lib/components/atoms/SkillsDropdown/SkillsDropdown.js +0 -208
  188. package/lib/components/atoms/SkillsDropdown/SkillsDropdown.styles.js +0 -77
  189. package/lib/components/atoms/SkillsDropdown/index.js +0 -2
  190. package/lib/components/atoms/SlashCommandChip/SlashCommandChip.js +0 -16
  191. package/lib/components/atoms/SlashCommandChip/SlashCommandChip.styles.js +0 -24
  192. package/lib/components/atoms/SlashCommandChip/buildSlashChipElement.js +0 -18
  193. package/lib/components/atoms/SlashCommandChip/index.js +0 -4
  194. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.js +0 -210
  195. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.styles.js +0 -53
  196. package/lib/components/atoms/SlashCommandDropdown/index.js +0 -2
  197. package/lib/components/atoms/Switch/Switch.js +0 -27
  198. package/lib/components/atoms/Switch/Switch.styles.js +0 -22
  199. package/lib/components/atoms/Switch/index.js +0 -2
  200. package/lib/components/atoms/TextArea/CustomTextArea.interface.js +0 -2
  201. package/lib/components/atoms/TextArea/CustomTextArea.js +0 -93
  202. package/lib/components/atoms/TextArea/CustomTextArea.styles.js +0 -25
  203. package/lib/components/atoms/TextArea/TextArea.interfaces.js +0 -2
  204. package/lib/components/atoms/TextArea/TextArea.js +0 -172
  205. package/lib/components/atoms/TextArea/TextArea.styles.js +0 -16
  206. package/lib/components/atoms/TextArea/index.js +0 -2
  207. package/lib/components/atoms/ThirdButton.js +0 -19
  208. package/lib/components/atoms/VideoModal/VideoModal.js +0 -76
  209. package/lib/components/atoms/VideoModal/index.js +0 -2
  210. package/lib/components/atoms/WithAppCfg.js +0 -26
  211. package/lib/components/atoms/WithFeatureValidation.js +0 -23
  212. package/lib/components/atoms/WrapperCenterIcon/WrapperCenterIcon.js +0 -9
  213. package/lib/components/atoms/WrapperCenterIcon/WrapperCenterIcon.styles.js +0 -6
  214. package/lib/components/atoms/WrapperCenterIcon/index.js +0 -2
  215. package/lib/components/atoms/icons/AIIcon.js +0 -23
  216. package/lib/components/atoms/icons/AacFile.js +0 -39
  217. package/lib/components/atoms/icons/AccessibilityIcon.js +0 -42
  218. package/lib/components/atoms/icons/ActionAssignIcon.js +0 -111
  219. package/lib/components/atoms/icons/ActionCalendarIcon.js +0 -112
  220. package/lib/components/atoms/icons/ActionChargeHoursIcon.js +0 -111
  221. package/lib/components/atoms/icons/ActionChatIcon.js +0 -71
  222. package/lib/components/atoms/icons/ActionCreateIcon.js +0 -91
  223. package/lib/components/atoms/icons/ActionCreateReworkIcon.js +0 -39
  224. package/lib/components/atoms/icons/ActionCreateSubtaskIcon.js +0 -37
  225. package/lib/components/atoms/icons/ActionEditIcon.js +0 -39
  226. package/lib/components/atoms/icons/ActionSummaryMessagesIcon.js +0 -88
  227. package/lib/components/atoms/icons/ActionSummaryTaskIcon.js +0 -37
  228. package/lib/components/atoms/icons/ActionTimeBackIcon.js +0 -112
  229. package/lib/components/atoms/icons/AgentMaiaIcon.js +0 -31
  230. package/lib/components/atoms/icons/Brain.js +0 -77
  231. package/lib/components/atoms/icons/CorAccessIcon.js +0 -41
  232. package/lib/components/atoms/icons/CorLogo.js +0 -76
  233. package/lib/components/atoms/icons/CsvFile.js +0 -41
  234. package/lib/components/atoms/icons/DocFile.js +0 -41
  235. package/lib/components/atoms/icons/DocxFile.js +0 -41
  236. package/lib/components/atoms/icons/EmptyClientIllustration.js +0 -67
  237. package/lib/components/atoms/icons/EmptyHistory.js +0 -46
  238. package/lib/components/atoms/icons/EmptySearchIllustration.js +0 -37
  239. package/lib/components/atoms/icons/EmptyState.js +0 -84
  240. package/lib/components/atoms/icons/EmptyStateAgents.js +0 -58
  241. package/lib/components/atoms/icons/ErrorIcon.js +0 -14
  242. package/lib/components/atoms/icons/ErrorSearchIllustration.js +0 -52
  243. package/lib/components/atoms/icons/ErrorState.js +0 -51
  244. package/lib/components/atoms/icons/FaqChevronIcon.js +0 -39
  245. package/lib/components/atoms/icons/FaqsIcon.js +0 -51
  246. package/lib/components/atoms/icons/FlacIcon.js +0 -39
  247. package/lib/components/atoms/icons/FolderIcon.js +0 -29
  248. package/lib/components/atoms/icons/HomeIcon.js +0 -30
  249. package/lib/components/atoms/icons/ImageFile.js +0 -46
  250. package/lib/components/atoms/icons/M4aFile.js +0 -39
  251. package/lib/components/atoms/icons/MAIAIcon.js +0 -20
  252. package/lib/components/atoms/icons/MAIAIsologo.js +0 -65
  253. package/lib/components/atoms/icons/MDFile.js +0 -41
  254. package/lib/components/atoms/icons/MaiaChatLayoutFloatingIcon.js +0 -41
  255. package/lib/components/atoms/icons/MaiaChatLayoutFullscreenIcon.js +0 -41
  256. package/lib/components/atoms/icons/MaiaChatLayoutMenuIcon.js +0 -33
  257. package/lib/components/atoms/icons/MaiaChatLayoutSidebarIcon.js +0 -41
  258. package/lib/components/atoms/icons/MaiaInputAddIcon.js +0 -42
  259. package/lib/components/atoms/icons/MaiaInputAttachIcon.js +0 -29
  260. package/lib/components/atoms/icons/MaiaInputAttachmentImageIcon.js +0 -33
  261. package/lib/components/atoms/icons/MaiaInputDeepSearchIcon.js +0 -35
  262. package/lib/components/atoms/icons/MaiaInputMentionIcon.js +0 -44
  263. package/lib/components/atoms/icons/MaiaInputRobotIcon.js +0 -29
  264. package/lib/components/atoms/icons/MaiaInputSendIcon.js +0 -29
  265. package/lib/components/atoms/icons/MaiaInputSlashIcon.js +0 -29
  266. package/lib/components/atoms/icons/MaiaInputWebSearchIcon.js +0 -35
  267. package/lib/components/atoms/icons/MaiaSettingsProject.js +0 -111
  268. package/lib/components/atoms/icons/MaiaSettingsProjectV2.js +0 -193
  269. package/lib/components/atoms/icons/MaiaSparkleIcon.js +0 -75
  270. package/lib/components/atoms/icons/MaiaStoreIcon.js +0 -31
  271. package/lib/components/atoms/icons/Mp3File.js +0 -39
  272. package/lib/components/atoms/icons/Mp4File.js +0 -39
  273. package/lib/components/atoms/icons/MyAgentsNavIcon.js +0 -51
  274. package/lib/components/atoms/icons/NewChat.js +0 -29
  275. package/lib/components/atoms/icons/NotionIcon.js +0 -36
  276. package/lib/components/atoms/icons/OgaFile.js +0 -39
  277. package/lib/components/atoms/icons/OggFile.js +0 -39
  278. package/lib/components/atoms/icons/PdfFile.js +0 -39
  279. package/lib/components/atoms/icons/PlusIcon.js +0 -29
  280. package/lib/components/atoms/icons/PptFile.js +0 -47
  281. package/lib/components/atoms/icons/PptxFile.js +0 -49
  282. package/lib/components/atoms/icons/RetryIcon.js +0 -34
  283. package/lib/components/atoms/icons/SkillCreatedByIcon.js +0 -20
  284. package/lib/components/atoms/icons/SkillIcon.js +0 -30
  285. package/lib/components/atoms/icons/SkillVisibilityEveryoneIcon.js +0 -23
  286. package/lib/components/atoms/icons/SkillVisibilityOnlyMeIcon.js +0 -23
  287. package/lib/components/atoms/icons/SkillsNavIcon.js +0 -24
  288. package/lib/components/atoms/icons/SubtaskIcon.js +0 -36
  289. package/lib/components/atoms/icons/TaskLinkIcon.js +0 -27
  290. package/lib/components/atoms/icons/TelescopeIcon.js +0 -60
  291. package/lib/components/atoms/icons/TemplateGradientIcon.js +0 -42
  292. package/lib/components/atoms/icons/TextFile.js +0 -41
  293. package/lib/components/atoms/icons/WavFile.js +0 -39
  294. package/lib/components/atoms/icons/WebmFile.js +0 -50
  295. package/lib/components/atoms/icons/XlsFile.js +0 -42
  296. package/lib/components/atoms/icons/XlsxFile.js +0 -42
  297. package/lib/components/atoms/icons/index.js +0 -54
  298. package/lib/components/atoms/index.js +0 -42
  299. package/lib/components/index.js +0 -11
  300. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.interface.js +0 -2
  301. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +0 -149
  302. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.styles.js +0 -53
  303. package/lib/components/molecules/AbmSection/AbmGeneralSection.js +0 -415
  304. package/lib/components/molecules/AbmSection/AbmGeneralSection.styles.js +0 -152
  305. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.js +0 -374
  306. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.styles.js +0 -106
  307. package/lib/components/molecules/AbmSection/AbmLoaderFiles.js +0 -92
  308. package/lib/components/molecules/AbmSection/AbmLoaderFiles.styles.js +0 -57
  309. package/lib/components/molecules/AbmSection/index.js +0 -4
  310. package/lib/components/molecules/ChatAIClientSelector/ChatAIClientSelector.js +0 -52
  311. package/lib/components/molecules/ChatAIClientSelector/index.js +0 -2
  312. package/lib/components/molecules/ChatAIContent/ChatAIContent.js +0 -119
  313. package/lib/components/molecules/ChatAIContent/ChatAIContent.skeleton.js +0 -187
  314. package/lib/components/molecules/ChatAIContent/ChatAIContent.styles.js +0 -6
  315. package/lib/components/molecules/ChatAIContent/index.js +0 -2
  316. package/lib/components/molecules/ChatAIHistory/ChatAIHistory.js +0 -241
  317. package/lib/components/molecules/ChatAIHistory/index.js +0 -2
  318. package/lib/components/molecules/ChatAIHistory/styles.js +0 -22
  319. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +0 -649
  320. package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.js +0 -115
  321. package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.styles.js +0 -95
  322. package/lib/components/molecules/ChatAIHome/index.js +0 -2
  323. package/lib/components/molecules/ChatAIHome/styles.js +0 -335
  324. package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.js +0 -137
  325. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +0 -853
  326. package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.js +0 -47
  327. package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.styles.js +0 -37
  328. package/lib/components/molecules/ChatAIMessages/README.md +0 -101
  329. package/lib/components/molecules/ChatAIMessages/index.js +0 -2
  330. package/lib/components/molecules/ChatAIMessages/newStyles.js +0 -131
  331. package/lib/components/molecules/ChatAIMessages/styles.js +0 -94
  332. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +0 -1254
  333. package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +0 -58
  334. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.js +0 -127
  335. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.styles.js +0 -34
  336. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/index.js +0 -2
  337. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +0 -189
  338. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.styles.js +0 -26
  339. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/index.js +0 -2
  340. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +0 -453
  341. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.styles.js +0 -108
  342. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/index.js +0 -2
  343. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.js +0 -48
  344. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.styles.js +0 -38
  345. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/index.js +0 -2
  346. package/lib/components/molecules/ChatAIModal/constants.js +0 -40
  347. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.js +0 -16
  348. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.styles.js +0 -12
  349. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/constants.js +0 -13
  350. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/index.js +0 -3
  351. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/useFloatingPanelDragTilt.js +0 -57
  352. package/lib/components/molecules/ChatAIModal/index.js +0 -2
  353. package/lib/components/molecules/ChatAIModal/layout.js +0 -74
  354. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.js +0 -457
  355. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.styles.js +0 -218
  356. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.js +0 -430
  357. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.styles.js +0 -169
  358. package/lib/components/molecules/ChatAIMySkills/index.js +0 -2
  359. package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.js +0 -48
  360. package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.styles.js +0 -49
  361. package/lib/components/molecules/ChatAIProjectSelector/index.js +0 -2
  362. package/lib/components/molecules/ChatFooter/ChatFooter.js +0 -337
  363. package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.js +0 -32
  364. package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.styles.js +0 -14
  365. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +0 -201
  366. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.styles.js +0 -51
  367. package/lib/components/molecules/ChatFooter/index.js +0 -2
  368. package/lib/components/molecules/ChatFooter/styles.js +0 -23
  369. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.js +0 -60
  370. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.styles.js +0 -6
  371. package/lib/components/molecules/ContextMentionInput/index.js +0 -2
  372. package/lib/components/molecules/MessageFeedback/MessageFeedback.js +0 -118
  373. package/lib/components/molecules/MessageFeedback/index.js +0 -2
  374. package/lib/components/molecules/MessageFeedback/styles.js +0 -14
  375. package/lib/components/molecules/ProjectSummaryChat/ProjectSummaryChat.js +0 -127
  376. package/lib/components/molecules/ProjectSummaryChat/index.js +0 -2
  377. package/lib/components/molecules/ProjectSummaryChat/styles.js +0 -8
  378. package/lib/components/molecules/ProjectSummaryConfig/ProjectSummaryConfig.js +0 -152
  379. package/lib/components/molecules/ProjectSummaryConfig/index.js +0 -2
  380. package/lib/components/molecules/ProjectSummaryConfig/styles.js +0 -86
  381. package/lib/components/molecules/ProjectSummaryContent/ProjectSummaryContent.js +0 -49
  382. package/lib/components/molecules/ProjectSummaryContent/index.js +0 -2
  383. package/lib/components/molecules/ProjectSummaryModal/ProjectSummaryModal.js +0 -19
  384. package/lib/components/molecules/ProjectSummaryModal/index.js +0 -2
  385. package/lib/components/molecules/ProjectSummaryModal/styles.js +0 -2
  386. package/lib/components/molecules/Sidebar/Sidebar.js +0 -716
  387. package/lib/components/molecules/Sidebar/Sidebar.layout.styles.js +0 -157
  388. package/lib/components/molecules/Sidebar/Sidebar.skeleton.js +0 -48
  389. package/lib/components/molecules/Sidebar/Sidebar.styles.js +0 -75
  390. package/lib/components/molecules/Sidebar/index.js +0 -2
  391. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +0 -1420
  392. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.styles.js +0 -93
  393. package/lib/components/organisms/AbmAgentModal/index.js +0 -2
  394. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.js +0 -182
  395. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.styles.js +0 -34
  396. package/lib/components/organisms/AbmSkillGenerateModal/index.js +0 -2
  397. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.js +0 -585
  398. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.styles.js +0 -154
  399. package/lib/components/organisms/AbmSkillModal/index.js +0 -2
  400. package/lib/components/organisms/ChatAI/ChatAI.js +0 -167
  401. package/lib/components/organisms/ChatAI/index.js +0 -2
  402. package/lib/components/organisms/ChatAI/styles.js +0 -7
  403. package/lib/components/organisms/ClientAIButton/ClientAIButton.js +0 -23
  404. package/lib/components/organisms/ClientAIButton/index.js +0 -2
  405. package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.js +0 -86
  406. package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.styles.js +0 -39
  407. package/lib/components/organisms/DeleteAgentModal/index.js +0 -2
  408. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.js +0 -122
  409. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.styles.js +0 -47
  410. package/lib/components/organisms/DeleteQuestionModal/index.js +0 -2
  411. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.js +0 -138
  412. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.styles.js +0 -69
  413. package/lib/components/organisms/EditQuestionModal/index.js +0 -2
  414. package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.js +0 -113
  415. package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.styles.js +0 -54
  416. package/lib/components/organisms/ModalFileExceeds/index.js +0 -2
  417. package/lib/components/organisms/ProjectAIButton/ProjectAIButton.js +0 -26
  418. package/lib/components/organisms/ProjectAIButton/index.js +0 -2
  419. package/lib/components/organisms/ProjectSummary/ProjectSummary.js +0 -60
  420. package/lib/components/organisms/ProjectSummary/index.js +0 -2
  421. package/lib/components/organisms/ProjectSummary/styles.js +0 -7
  422. package/lib/components/organisms/SnackBar/Snackbar.interface.js +0 -2
  423. package/lib/components/organisms/SnackBar/Snackbar.js +0 -73
  424. package/lib/components/organisms/SnackBar/Snackbar.styles.js +0 -9
  425. package/lib/components/organisms/SnackBar/index.js +0 -2
  426. package/lib/components/organisms/SourcesInformation/SourceItem.js +0 -18
  427. package/lib/components/organisms/SourcesInformation/SourceItem.styles.js +0 -14
  428. package/lib/components/organisms/SourcesInformation/SourcesInformationModal.js +0 -66
  429. package/lib/components/organisms/SourcesInformation/SourcesInformationModal.styles.js +0 -27
  430. package/lib/components/organisms/SourcesInformation/index.js +0 -2
  431. package/lib/constants/config.js +0 -10
  432. package/lib/constants/formatExtensions.js +0 -55
  433. package/lib/constants/gqlClient.js +0 -4
  434. package/lib/constants/maiaHourAgentAccess.js +0 -15
  435. package/lib/constants/maiaTaskPanelAccess.js +0 -24
  436. package/lib/constants/maiaTaskPanelOutsideClick.js +0 -9
  437. package/lib/constants/maiaTaskPanelZIndex.js +0 -19
  438. package/lib/constants/permissions/config.js +0 -72
  439. package/lib/constants/permissions/index.js +0 -3
  440. package/lib/constants/permissions/types.js +0 -2
  441. package/lib/constants/permissions/utils.js +0 -18
  442. package/lib/constants/plannerSyncEvents.js +0 -15
  443. package/lib/constants/taskLinkIcon.js +0 -15
  444. package/lib/constants/taskUrls.js +0 -11
  445. package/lib/context/cor-user.js +0 -31
  446. package/lib/context/global-context.js +0 -39
  447. package/lib/dev/DevChatAI.js +0 -101
  448. package/lib/dev/DevContextMentionInput.js +0 -67
  449. package/lib/dev/ProjectSummary.js +0 -9
  450. package/lib/dev/Providers.js +0 -27
  451. package/lib/exports.js +0 -2
  452. package/lib/hooks/README.md +0 -192
  453. package/lib/hooks/index.js +0 -30
  454. package/lib/hooks/useAccessClient/index.js +0 -2
  455. package/lib/hooks/useAccessClient/useAccessClient.js +0 -81
  456. package/lib/hooks/useAgentModel/index.js +0 -2
  457. package/lib/hooks/useAgentModel/useAgentModel.js +0 -62
  458. package/lib/hooks/useAgentModel/useCreateAgent.js +0 -128
  459. package/lib/hooks/useAgentModel/useDeleteAgent.js +0 -88
  460. package/lib/hooks/useAgentModel/useUpdateAgent.js +0 -129
  461. package/lib/hooks/useAgentSuggestions.js +0 -60
  462. package/lib/hooks/useCaretPosition.js +0 -65
  463. package/lib/hooks/useChatManager/index.js +0 -2
  464. package/lib/hooks/useChatManager/useChatManager.interface.js +0 -2
  465. package/lib/hooks/useChatManager/useChatManager.js +0 -1782
  466. package/lib/hooks/useChatMessages/index.js +0 -2
  467. package/lib/hooks/useChatMessages/useChatMessages.interface.js +0 -2
  468. package/lib/hooks/useChatMessages/useChatMessages.js +0 -722
  469. package/lib/hooks/useChats/index.js +0 -2
  470. package/lib/hooks/useChats/useChats.interfaces.js +0 -2
  471. package/lib/hooks/useChats/useChats.js +0 -187
  472. package/lib/hooks/useClientSearch.js +0 -163
  473. package/lib/hooks/useContextMentions.js +0 -500
  474. package/lib/hooks/useContextPinPopover.js +0 -228
  475. package/lib/hooks/useDebounce.js +0 -18
  476. package/lib/hooks/useEntitySearch.js +0 -1053
  477. package/lib/hooks/useEvent.js +0 -93
  478. package/lib/hooks/useFrequentlyAskedQuestions.js +0 -150
  479. package/lib/hooks/useFrequentlyUsedActions.js +0 -94
  480. package/lib/hooks/useKnowledge/deleteKnowledge.js +0 -69
  481. package/lib/hooks/useKnowledge/downloadKnowledge.js +0 -81
  482. package/lib/hooks/useKnowledge/index.js +0 -4
  483. package/lib/hooks/useKnowledge/saveKnowledge.js +0 -107
  484. package/lib/hooks/useKnowledge/useKnowledgeOperations.js +0 -156
  485. package/lib/hooks/useMaiaTaskPanelZIndex.js +0 -17
  486. package/lib/hooks/useMentionAllowedTypes.js +0 -120
  487. package/lib/hooks/useMentionPopover.js +0 -342
  488. package/lib/hooks/useMinimizedPillBottomOffset.js +0 -110
  489. package/lib/hooks/useModal/index.js +0 -2
  490. package/lib/hooks/useModal/useModal.interfaces.js +0 -2
  491. package/lib/hooks/useModal/useModal.js +0 -47
  492. package/lib/hooks/useOnboardingNavigation.js +0 -20
  493. package/lib/hooks/useOrchestratorStream/index.js +0 -2
  494. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.interface.js +0 -2
  495. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +0 -269
  496. package/lib/hooks/useProjectSearch.js +0 -183
  497. package/lib/hooks/useProjectSummary.js +0 -101
  498. package/lib/hooks/useProjectSummaryConfig.js +0 -211
  499. package/lib/hooks/useProjects.js +0 -46
  500. package/lib/hooks/useRecentClientsSearch.js +0 -150
  501. package/lib/hooks/useRecentContexts.js +0 -86
  502. package/lib/hooks/useResize.js +0 -29
  503. package/lib/hooks/useSkillsCatalog.js +0 -66
  504. package/lib/hooks/useSlashCommands.js +0 -84
  505. package/lib/hooks/useSmoothStreamText/index.js +0 -2
  506. package/lib/hooks/useSmoothStreamText/useSmoothStreamText.js +0 -197
  507. package/lib/hooks/useSnackBarManager/useSnackBarManager.js +0 -41
  508. package/lib/hooks/useStreamResponse.js +0 -112
  509. package/lib/hooks/useStreamdownStyles.js +0 -13
  510. package/lib/hooks/useStreamingMessage/index.js +0 -2
  511. package/lib/hooks/useStreamingMessage/useStreamingMessage.js +0 -18
  512. package/lib/hooks/useT.js +0 -17
  513. package/lib/hooks/useTabTaskDefault.js +0 -33
  514. package/lib/hooks/useTaskPanel.js +0 -22
  515. package/lib/hooks/useTextOverflowEllipsisTooltip.js +0 -34
  516. package/lib/hooks/useToggle.js +0 -19
  517. package/lib/hooks/useToggleFavorite/index.js +0 -2
  518. package/lib/hooks/useToggleFavorite/useToggleFavorite.js +0 -83
  519. package/lib/index.css +0 -76
  520. package/lib/index.js +0 -30
  521. package/lib/lang/br/index.js +0 -785
  522. package/lib/lang/en/index.js +0 -785
  523. package/lib/lang/es/index.js +0 -786
  524. package/lib/lang/fr/index.js +0 -606
  525. package/lib/lang/index.js +0 -24
  526. package/lib/lang/utils.js +0 -33
  527. package/lib/mocks/mockChats.js +0 -395
  528. package/lib/mocks/mockOrchestrator.js +0 -5
  529. package/lib/mocks/mockProject.js +0 -11
  530. package/lib/mocks/mockProjectSummary.js +0 -6
  531. package/lib/mocks/mockedUser.js +0 -169
  532. package/lib/services/apolloClient.js +0 -3
  533. package/lib/services/appcues.js +0 -19
  534. package/lib/services/corpilot/ProjectSummary/getProjectSummary.js +0 -31
  535. package/lib/services/corpilot/ProjectSummary/index.js +0 -5
  536. package/lib/services/corpilot/client.js +0 -27
  537. package/lib/services/corpilot/index.js +0 -5
  538. package/lib/services/maia/Access/updateAccess.js +0 -59
  539. package/lib/services/maia/Actions/getFrequentlyUsedActions.js +0 -46
  540. package/lib/services/maia/Actions/getSlashCommands.js +0 -39
  541. package/lib/services/maia/Actions/index.js +0 -7
  542. package/lib/services/maia/Agents/createAgent.js +0 -39
  543. package/lib/services/maia/Agents/deleteAgent.js +0 -38
  544. package/lib/services/maia/Agents/fetchAgentDetail.js +0 -122
  545. package/lib/services/maia/Agents/getAgentById.js +0 -162
  546. package/lib/services/maia/Agents/getAgentModels.js +0 -112
  547. package/lib/services/maia/Agents/getAgentSuggestions.js +0 -44
  548. package/lib/services/maia/Agents/getAgents.js +0 -718
  549. package/lib/services/maia/Agents/setAgentToolGroups.js +0 -42
  550. package/lib/services/maia/Agents/toggleFavorite.js +0 -34
  551. package/lib/services/maia/Agents/updateAgent.js +0 -39
  552. package/lib/services/maia/Chats/deleteChat.js +0 -32
  553. package/lib/services/maia/Chats/getChatMessages.js +0 -144
  554. package/lib/services/maia/Chats/getChatsByUserId.js +0 -82
  555. package/lib/services/maia/Chats/index.js +0 -15
  556. package/lib/services/maia/Chats/markSessionAsRead.js +0 -32
  557. package/lib/services/maia/Chats/patchChat.js +0 -43
  558. package/lib/services/maia/Chats/wasHelpfulChat.js +0 -31
  559. package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.js +0 -55
  560. package/lib/services/maia/Faqs/index.js +0 -5
  561. package/lib/services/maia/Knowledge/delete.js +0 -41
  562. package/lib/services/maia/Knowledge/download.js +0 -48
  563. package/lib/services/maia/Knowledge/index.js +0 -3
  564. package/lib/services/maia/Knowledge/save.js +0 -43
  565. package/lib/services/maia/Orchestrator/index.js +0 -7
  566. package/lib/services/maia/Orchestrator/orchestrator.js +0 -246
  567. package/lib/services/maia/RecentClients/getRecentClients.js +0 -43
  568. package/lib/services/maia/RecentClients/index.js +0 -6
  569. package/lib/services/maia/RecentContexts/getRecentContexts.js +0 -54
  570. package/lib/services/maia/RecentContexts/index.js +0 -6
  571. package/lib/services/maia/RecentProjects/getRecentProjects.js +0 -55
  572. package/lib/services/maia/RecentProjects/index.js +0 -6
  573. package/lib/services/maia/RecentTasks/getRecentTasks.js +0 -54
  574. package/lib/services/maia/RecentTasks/index.js +0 -6
  575. package/lib/services/maia/RecentUsers/getRecentUsers.js +0 -59
  576. package/lib/services/maia/RecentUsers/index.js +0 -6
  577. package/lib/services/maia/Skills/createSkill.js +0 -39
  578. package/lib/services/maia/Skills/deleteSkill.js +0 -38
  579. package/lib/services/maia/Skills/generateSkill.js +0 -41
  580. package/lib/services/maia/Skills/getSkills.js +0 -120
  581. package/lib/services/maia/Skills/updateSkill.js +0 -39
  582. package/lib/services/maia/client.js +0 -27
  583. package/lib/services/maia/index.js +0 -17
  584. package/lib/services/query/ClientSearchQuery.js +0 -5
  585. package/lib/services/query/entitySearchQuery.js +0 -18
  586. package/lib/services/query/index.js +0 -2
  587. package/lib/services/query/projectSearchByValueQuery.js +0 -5
  588. package/lib/services/query/taskUserTabQuery.js +0 -8
  589. package/lib/services/query/usersDirectoryQuery.js +0 -19
  590. package/lib/services/types.js +0 -6
  591. package/lib/services/utils/fetchCOR.js +0 -117
  592. package/lib/services/utils/getCookie.js +0 -10
  593. package/lib/services/utils/index.js +0 -3
  594. package/lib/services/utils/mapChatMessages.js +0 -287
  595. package/lib/services/utils/validateIsMaia.js +0 -4
  596. package/lib/store/chatsSidebarOptimistic.js +0 -92
  597. package/lib/store/chatsStore.types.js +0 -2
  598. package/lib/store/chatsStoreLifecycle.js +0 -8
  599. package/lib/store/faqsStore.types.js +0 -2
  600. package/lib/store/index.js +0 -4
  601. package/lib/store/maiaLastChatPersistence.js +0 -35
  602. package/lib/store/sessions/activeView.js +0 -22
  603. package/lib/store/sessions/index.js +0 -9
  604. package/lib/store/sessions/sessionHitlContext.js +0 -15
  605. package/lib/store/sessions/sessionNotificationSound.js +0 -57
  606. package/lib/store/sessions/sessionNotifications.js +0 -110
  607. package/lib/store/sessions/sessionNotifications.types.js +0 -2
  608. package/lib/store/sessions/sessionStreamManager.js +0 -715
  609. package/lib/store/sessions/sessionStreamingText.js +0 -80
  610. package/lib/store/sessions/sessions.types.js +0 -35
  611. package/lib/store/sessions/useSessionMeta.js +0 -39
  612. package/lib/store/sessions/useSessionStreamingText.js +0 -18
  613. package/lib/store/sessions/useSessionsStore.js +0 -197
  614. package/lib/store/useChatsStore.js +0 -387
  615. package/lib/store/useFaqsStore.js +0 -27
  616. package/lib/streamdownStyles.js +0 -9
  617. package/lib/styles/StyledCleanContainer.js +0 -7
  618. package/lib/styles/cascade.js +0 -14
  619. package/lib/styles/config.js +0 -47
  620. package/lib/styles/shared/scrollable.js +0 -3
  621. package/lib/styles/transitions.js +0 -21
  622. package/lib/types/Action.js +0 -2
  623. package/lib/types/AgentSuggestion.js +0 -2
  624. package/lib/types/Chat.js +0 -10
  625. package/lib/types/Client.js +0 -2
  626. package/lib/types/FrequentlyAskedQuestion.js +0 -2
  627. package/lib/types/Project.js +0 -2
  628. package/lib/types/ProjectSummaryConfigKeys.js +0 -9
  629. package/lib/types/Task.js +0 -2
  630. package/lib/types/agent.js +0 -2
  631. package/lib/types/agentModal.js +0 -2
  632. package/lib/types/contextMention.js +0 -37
  633. package/lib/types/global.d.js +0 -2
  634. package/lib/types/skill.js +0 -2
  635. package/lib/types/streamActivity.js +0 -2
  636. package/lib/types/userType.d.js +0 -2
  637. package/lib/utils/actionCategoryMap.js +0 -37
  638. package/lib/utils/actionIconMap.js +0 -61
  639. package/lib/utils/agentDisplayName.js +0 -42
  640. package/lib/utils/chatInputFiles.js +0 -52
  641. package/lib/utils/contextMentionIcons.js +0 -134
  642. package/lib/utils/contextMentionLabel.js +0 -4
  643. package/lib/utils/contextMentionTriggers.js +0 -51
  644. package/lib/utils/contextMentionTypeLabel.js +0 -17
  645. package/lib/utils/corConnectorMentionTypes.js +0 -41
  646. package/lib/utils/ensureStreamdownStyles.js +0 -21
  647. package/lib/utils/entityLinkRender.js +0 -135
  648. package/lib/utils/fileDownloadHelper.js +0 -40
  649. package/lib/utils/formatQuickActionMessage.js +0 -16
  650. package/lib/utils/formatUnreadCount.js +0 -6
  651. package/lib/utils/getUnitFileSize.js +0 -13
  652. package/lib/utils/hitlAnalytics.js +0 -65
  653. package/lib/utils/hoursPlannerQuickActionType.js +0 -64
  654. package/lib/utils/imagePreprocessor.js +0 -108
  655. package/lib/utils/index.js +0 -3
  656. package/lib/utils/maiaHostOpen.js +0 -19
  657. package/lib/utils/maiaStreamdownRehypePlugins.js +0 -27
  658. package/lib/utils/mapBackendLang.js +0 -8
  659. package/lib/utils/normalizeAgentConnectors.js +0 -70
  660. package/lib/utils/openTaskInCorPanel.js +0 -22
  661. package/lib/utils/orchestratorSubagents.js +0 -11
  662. package/lib/utils/renderContextMentions.js +0 -420
  663. package/lib/utils/retryCompletion.js +0 -85
  664. package/lib/utils/slashCommandMarker.js +0 -30
  665. package/lib/utils/sortManagerHoursHomeFuas.js +0 -14
  666. package/lib/utils/sseStreamContent.js +0 -17
  667. package/lib/utils/streamActivityMessages.js +0 -359
  668. package/lib/utils/validateTrimmedFields.js +0 -8
@@ -1,1254 +0,0 @@
1
- import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
- import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
4
- import _regeneratorRuntime from "@babel/runtime/regenerator";
5
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
6
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
7
- /* eslint-disable no-nested-ternary */
8
- /* eslint-disable @typescript-eslint/indent */
9
- /* eslint-disable react/jsx-no-useless-fragment */
10
- /* eslint-disable @typescript-eslint/no-explicit-any */
11
- /* eslint-disable react/no-array-index-key */
12
- /* eslint-disable jsx-a11y/click-events-have-key-events */
13
- /* eslint-disable jsx-a11y/no-static-element-interactions */
14
- /* eslint-disable react/function-component-definition */
15
- /* eslint-disable react/require-default-props */
16
- /* eslint-disable no-console */
17
- import { useCallback, useMemo, useState, useRef, useEffect, useLayoutEffect } from 'react';
18
- import ReactDOM from 'react-dom';
19
- import moment from 'moment';
20
- import { useTranslation } from 'react-i18next';
21
- import { useUser } from '../../../context/cor-user';
22
- import { canAccessToChatAI, canAccessToSkills } from '../../../constants/permissions';
23
- import { MAIAError } from '../../atoms/MAIAError';
24
- import { useMaiaTaskPanelZIndex } from '../../../hooks/useMaiaTaskPanelZIndex';
25
- import { ChatAIContent } from '../ChatAIContent';
26
- import { buildHandlers, options } from './constants';
27
- import { Sidebar } from '../Sidebar';
28
- import { useGetAgents } from '../../../services/maia/Agents/getAgents';
29
- import { useGetSkills } from '../../../services/maia/Skills/getSkills';
30
- import { useGlobalContext } from '../../../context/global-context';
31
- import { ChatAIModalHeader } from './components/ChatAiModalHeader/ChatAiModalHeader';
32
- import { Snackbar } from '../../organisms/SnackBar/Snackbar';
33
- import { ProjectSummaryContent } from '../ProjectSummaryContent';
34
- import { AbmAgentModal } from '../../organisms/AbmAgentModal/AbmAgentModal';
35
- import { AbmSkillModal, SKILL_USE_AFTER_SAVE_EVENT } from '../../organisms/AbmSkillModal/AbmSkillModal';
36
- import { AbmSkillGenerateModal } from '../../organisms/AbmSkillGenerateModal/AbmSkillGenerateModal';
37
- import { SECTIONS } from '../../../constants/config';
38
- import { SCCAIMContent, SCCAIMContentWrapper, SCCAIMMinimizedHide, SCCAIMWrapper } from './ChatAIModal.styles';
39
- import { MaiaMinimizedPill } from './components/MaiaMinimizedPill';
40
- import { getMaiaFloatingPanelWidthPx, resolveInitialMaiaChatLayoutMode, setStoredMaiaChatLayoutMode } from './layout';
41
- import { FloatingPanelMotion, useFloatingPanelDragTilt } from './floatingPanelMotion';
42
- import { ChatAiModalFooter } from './components/ChatAiModalFooter';
43
- import { validateIsMaia } from '../../../services/utils/validateIsMaia';
44
- import { isMarketplaceGlobalCloneAgent } from '../../../utils/agentDisplayName';
45
- import { useFaqsStore } from '../../../store/useFaqsStore';
46
- import { getChatsStoreState, useChatsStore } from '../../../store/useChatsStore';
47
- import { readLastActiveChatId, writeLastActiveChatId } from '../../../store/maiaLastChatPersistence';
48
- import { useSessionsStore } from '../../../store/sessions/useSessionsStore';
49
- import { isActiveSessionStatus } from '../../../store/sessions/sessions.types';
50
- import { fetchMaia } from '../../../services/maia/client';
51
- import { mapCORLang } from '../../../lang/utils';
52
- import { EVENTS, useEvent } from '../../../hooks/useEvent';
53
- import { MAIA_OPEN_FROM_HOST_EVENT } from '../../../utils/maiaHostOpen';
54
-
55
- /** Metadata de la session abierta (emitida por useChatMessages al cargar una conversación). */
56
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
57
- var LEGACY_CONTEXT_ENTITIES = ['project', 'task', 'client'];
58
- /** Home global del orchestrator (solo header). Planner es home de FUAs, no de contextos. */
59
- var isGlobalMaiaSection = function isGlobalMaiaSection(section) {
60
- return section === 'header';
61
- };
62
- var resolveAiChatBackDestination = function resolveAiChatBackDestination(section, agentType, currentOption, homeOption) {
63
- if (isGlobalMaiaSection(section) && agentType === 'orchestrator' && currentOption === homeOption) {
64
- return 'global_context_home';
65
- }
66
- if (section === 'task') return 'task_home';
67
- if (section === 'planner') return 'planner_home';
68
- if (section === 'project') return 'project_home';
69
- if (section === 'client') return 'client_home';
70
- return 'global_context_home';
71
- };
72
- export var ID_MODAL_CHAT_AGENT = 'modals-portal-maia-chat-agent';
73
- var validateAccessByFeature = function validateAccessByFeature(section, user) {
74
- if (!section || !canAccessToChatAI(user)) {
75
- return false;
76
- }
77
-
78
- // Planner y task abren siempre el chat (home de FUAs), nunca resumen de proyectos.
79
- if (section === 'planner' || section === 'task') {
80
- return true;
81
- }
82
- if (section === 'header') {
83
- return Boolean(window.MAIA_CHAT_AI_FEATURE_ACCESS || window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS);
84
- }
85
- return Boolean(window.MAIA_CHAT_AI_FEATURE_ACCESS);
86
- };
87
- export var ChatAIModal = function ChatAIModal() {
88
- var _user$permissions, _user$permissions2, _user$permissions3, _agents$data;
89
- var user = useUser();
90
- var _useTranslation = useTranslation([SECTIONS.abmAgent]),
91
- i18n = _useTranslation.i18n;
92
- var amplitudEvent = useEvent();
93
-
94
- // MAIA vive montada en todas las pantallas: el panel arranca siempre cerrado (pill visible)
95
- // y sólo se abre por acción del usuario — navegar o refrescar no lo reabre.
96
- var _useState = useState(true),
97
- _useState2 = _slicedToArray(_useState, 2),
98
- isMinimized = _useState2[0],
99
- setIsMinimized = _useState2[1];
100
- var setChatViewVisible = useChatsStore(function (state) {
101
- return state.setChatViewVisible;
102
- });
103
- var unreadCount = useChatsStore(function (state) {
104
- return state.unreadCount;
105
- });
106
- var activeChatId = useChatsStore(function (state) {
107
- return state.activeChatId;
108
- });
109
- // Los "..." del pill salen del motor, no de isStreaming/isWriting: esos reflejan
110
- // la sesión activa y quedan stale cuando una respuesta termina en background.
111
- var hasActiveStream = useSessionsStore(function (state) {
112
- return Object.values(state.meta).some(function (meta) {
113
- return isActiveSessionStatus(meta.status);
114
- });
115
- });
116
-
117
- /** goToChat / handleGoHome se definen más abajo; los refs evitan depender del orden de declaración. */
118
- var goToChatRef = useRef(null);
119
- var goHomeRef = useRef(null);
120
-
121
- // Monta cerrada: el chat no está a la vista, así que las respuestas que lleguen
122
- // tienen que quedar como no leídas.
123
- useEffect(function () {
124
- setChatViewVisible(false);
125
- // Sólo al montar: después lo manejan minimizar/restaurar.
126
- }, []);
127
-
128
- // Persistimos la conversación abierta para poder volver a ella desde el pill después
129
- // de navegar o refrescar. El takeover desde un host la limpia (va al Home).
130
- useEffect(function () {
131
- if (activeChatId) {
132
- writeLastActiveChatId(user.id, activeChatId);
133
- }
134
- }, [activeChatId, user.id]);
135
- var handleMinimize = useCallback(function () {
136
- amplitudEvent(EVENTS.aiChatMinimize);
137
- setIsMinimized(true);
138
- setChatViewVisible(false);
139
- }, [amplitudEvent, setChatViewVisible]);
140
- var focusChatInput = useCallback(function () {
141
- window.setTimeout(function () {
142
- document.dispatchEvent(new CustomEvent('maia-input-refocus'));
143
- }, 100);
144
- }, []);
145
- var _useState3 = useState({
146
- message: '',
147
- attachments: []
148
- }),
149
- _useState4 = _slicedToArray(_useState3, 2),
150
- userInitialMessage = _useState4[0],
151
- setUserInitialMessage = _useState4[1];
152
- var _useState5 = useState(null),
153
- _useState6 = _slicedToArray(_useState5, 2),
154
- initialChatId = _useState6[0],
155
- setInitialChatId = _useState6[1];
156
- var _useState7 = useState(0),
157
- _useState8 = _slicedToArray(_useState7, 2),
158
- newChatKey = _useState8[0],
159
- setNewChatKey = _useState8[1];
160
- var _useState9 = useState(null),
161
- _useState0 = _slicedToArray(_useState9, 2),
162
- sessionMeta = _useState0[0],
163
- setSessionMeta = _useState0[1];
164
- var _useState1 = useState(null),
165
- _useState10 = _slicedToArray(_useState1, 2),
166
- sendMessageFunction = _useState10[0],
167
- setSendMessageFunction = _useState10[1];
168
- var _useState11 = useState(null),
169
- _useState12 = _slicedToArray(_useState11, 2),
170
- stopGenerationFunction = _useState12[0],
171
- setStopGenerationFunction = _useState12[1];
172
- var _useState13 = useState(false),
173
- _useState14 = _slicedToArray(_useState13, 2),
174
- isStreaming = _useState14[0],
175
- setIsStreaming = _useState14[1];
176
- var _useState15 = useState(false),
177
- _useState16 = _slicedToArray(_useState15, 2),
178
- isWriting = _useState16[0],
179
- setIsWriting = _useState16[1];
180
- var _useState17 = useState(false),
181
- _useState18 = _slicedToArray(_useState17, 2),
182
- refetchChats = _useState18[0],
183
- setRefetchChats = _useState18[1];
184
- var _useState19 = useState(options.home),
185
- _useState20 = _slicedToArray(_useState19, 2),
186
- currentOption = _useState20[0],
187
- setCurrentOption = _useState20[1];
188
- var _useState21 = useState(false),
189
- _useState22 = _slicedToArray(_useState21, 2),
190
- hasError = _useState22[0],
191
- setHasError = _useState22[1];
192
- // En project/client/task: el usuario reinició el contexto del orchestrator (lo limpió y pasó por
193
- // el selector de contextos recientes). Habilita el botón "volver" en el home paso 2 de esas
194
- // secciones. Se resetea al cerrar/reabrir el modal (el componente se desmonta).
195
- var _useState23 = useState(false),
196
- _useState24 = _slicedToArray(_useState23, 2),
197
- didResetContextInSection = _useState24[0],
198
- setDidResetContextInSection = _useState24[1];
199
- var prevHasPinnedContextRef = useRef(false);
200
- var handlers = useMemo(function () {
201
- return buildHandlers(setCurrentOption, setHasError);
202
- }, []);
203
- var _useState25 = useState(false),
204
- _useState26 = _slicedToArray(_useState25, 2),
205
- sidebarHasError = _useState26[0],
206
- setSidebarHasError = _useState26[1];
207
- var resetSelectedChatRef = useRef(null);
208
- var lang = i18n.language === 'br' ? 'pt-br' : i18n.language;
209
- moment.locale(lang);
210
- var _useGlobalContext = useGlobalContext(),
211
- selectAgent = _useGlobalContext.selectAgent,
212
- clearAgent = _useGlobalContext.clearAgent,
213
- section = _useGlobalContext.section,
214
- agent = _useGlobalContext.agent,
215
- project = _useGlobalContext.project,
216
- client = _useGlobalContext.client,
217
- task = _useGlobalContext.task,
218
- chipsProject = _useGlobalContext.chipsProject,
219
- toggleWebSearch = _useGlobalContext.toggleWebSearch,
220
- isWebSearchActive = _useGlobalContext.isWebSearchActive,
221
- setChipsProject = _useGlobalContext.setChipsProject,
222
- setClient = _useGlobalContext.setClient,
223
- setProject = _useGlobalContext.setProject,
224
- bannerEntryFaq = _useGlobalContext.bannerEntryFaq,
225
- setTask = _useGlobalContext.setTask;
226
-
227
- // Z-index para tooltips en section 'task' (modal flotante elevado)
228
- var tooltipZIndex = useMaiaTaskPanelZIndex(1500, 'overlay');
229
- var _useGetAgents = useGetAgents({
230
- selectAgent: selectAgent,
231
- section: section,
232
- agent: agent,
233
- handleGoHome: handlers.home
234
- }),
235
- agents = _useGetAgents.agents,
236
- loading = _useGetAgents.loading,
237
- loadingMore = _useGetAgents.loadingMore,
238
- agentError = _useGetAgents.error,
239
- handleGetAgents = _useGetAgents.handleGetAgents,
240
- loadMoreAgents = _useGetAgents.loadMoreAgents,
241
- searchCustomAgents = _useGetAgents.searchCustomAgents,
242
- searchLoading = _useGetAgents.searchLoading,
243
- addAgent = _useGetAgents.addAgent,
244
- removeAgent = _useGetAgents.removeAgent,
245
- updateAgent = _useGetAgents.updateAgent,
246
- updateAgentFavorite = _useGetAgents.updateAgentFavorite,
247
- selectFirstAgent = _useGetAgents.selectFirstAgent,
248
- sortAgentsList = _useGetAgents.sortAgentsList;
249
- var _useGetSkills = useGetSkills(),
250
- mySkills = _useGetSkills.mySkills,
251
- sharedSkills = _useGetSkills.sharedSkills,
252
- loadingSkills = _useGetSkills.loading,
253
- handleGetSkills = _useGetSkills.handleGetSkills,
254
- addSkill = _useGetSkills.addSkill,
255
- updateSkillInList = _useGetSkills.updateSkillInList,
256
- removeSkill = _useGetSkills.removeSkill;
257
- var isMAIA = validateIsMaia(agent);
258
- var userHasPermissions = ((user === null || user === void 0 || (_user$permissions = user.permissions) === null || _user$permissions === void 0 || (_user$permissions = _user$permissions.ai_agents) === null || _user$permissions === void 0 ? void 0 : _user$permissions.create) || (user === null || user === void 0 || (_user$permissions2 = user.permissions) === null || _user$permissions2 === void 0 || (_user$permissions2 = _user$permissions2.ai_agents) === null || _user$permissions2 === void 0 ? void 0 : _user$permissions2.edit) || (user === null || user === void 0 || (_user$permissions3 = user.permissions) === null || _user$permissions3 === void 0 || (_user$permissions3 = _user$permissions3.ai_agents) === null || _user$permissions3 === void 0 ? void 0 : _user$permissions3["delete"])) && window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS;
259
- var computedCurrentOption = useMemo(function () {
260
- var isGlobalSpecialist = isMAIA && (agent === null || agent === void 0 ? void 0 : agent.entity) === 'global';
261
- var isProjectSpecialist = isMAIA && ((agent === null || agent === void 0 ? void 0 : agent.entity) === 'project' || (agent === null || agent === void 0 ? void 0 : agent.entity) == null);
262
- var isClientSpecialist = isMAIA && (agent === null || agent === void 0 ? void 0 : agent.entity) === 'client';
263
- var isMaiaker = isMarketplaceGlobalCloneAgent(agent);
264
- if (currentOption === options.myAgents && window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS) {
265
- return options.myAgents;
266
- }
267
- if (currentOption === options.mySkills && canAccessToSkills(user)) {
268
- return options.mySkills;
269
- }
270
-
271
- // El orchestrator (MAIA) muestra su home con FAQs/acciones frecuentes; el resto de
272
- // los global specialists (clones globales no-maiaker) siguen yendo directo al chat.
273
- if (isGlobalSpecialist && !isMaiaker && (agent === null || agent === void 0 ? void 0 : agent.type) !== 'orchestrator' && currentOption === options.home) {
274
- return options.chat;
275
- }
276
- var shouldShowProjectSelector = currentOption !== options.chat && isProjectSpecialist && !project;
277
- var shouldShowClientSelector = currentOption !== options.chat && isClientSpecialist && !client;
278
- if (shouldShowProjectSelector) {
279
- return options.projectSelector;
280
- }
281
- if (shouldShowClientSelector) {
282
- return options.clientSelector;
283
- }
284
- return currentOption;
285
- }, [currentOption, project, client, isMAIA, agent === null || agent === void 0 ? void 0 : agent.entity, agent === null || agent === void 0 ? void 0 : agent.name, agent === null || agent === void 0 ? void 0 : agent.type, user]);
286
- var isMaiakerAgentSelected = useMemo(function () {
287
- return isMarketplaceGlobalCloneAgent(agent);
288
- }, [agent]);
289
- var sidebarAgentsNavActive = useMemo(function () {
290
- if (computedCurrentOption === options.mySkills) return 'mySkills';
291
- if (computedCurrentOption === options.myAgents) return 'myAgents';
292
- if (isMaiakerAgentSelected) return 'maiaker';
293
- return null;
294
- }, [computedCurrentOption, isMaiakerAgentSelected]);
295
-
296
- /* Reactivar con la fila “Mis agentes” en Sidebar: myAgentsCount prop
297
- const sidebarMyAgentsCount = useMemo(() => {
298
- return agents.data.filter(
299
- a => !(a.type === 'orchestrator' || (a.type === 'clone' && a.entity === 'global' && /(maiaker|marketplace)/i.test(a.name || '')))
300
- )
301
- .length
302
- }, [agents.data])
303
- */
304
-
305
- var agentsFetchedRef = useRef(false);
306
- var selector = document.querySelector("#".concat(ID_MODAL_CHAT_AGENT));
307
-
308
- // Task panel, planner y banner de proyecto abren en flotante por default (no tapar el contexto detrás).
309
- // Fuera de esos contextos se respeta la preferencia guardada en localStorage.
310
- var _useState27 = useState(function () {
311
- return resolveInitialMaiaChatLayoutMode({
312
- section: section,
313
- bannerEntryFaq: bannerEntryFaq
314
- });
315
- }),
316
- _useState28 = _slicedToArray(_useState27, 2),
317
- layoutMode = _useState28[0],
318
- setLayoutMode = _useState28[1];
319
- var handleLayoutModeChange = useCallback(function (mode) {
320
- setStoredMaiaChatLayoutMode(mode);
321
- setLayoutMode(mode);
322
- }, []);
323
- var expanded = layoutMode === 'fullscreen';
324
- var isFloating = layoutMode === 'floating';
325
- var contentWrapperRef = useRef(null);
326
- var _useState29 = useState(null),
327
- _useState30 = _slicedToArray(_useState29, 2),
328
- dragPosition = _useState30[0],
329
- setDragPosition = _useState30[1];
330
- var _useFloatingPanelDrag = useFloatingPanelDragTilt(isFloating),
331
- tiltMotion = _useFloatingPanelDrag.tiltMotion,
332
- startPointerTracking = _useFloatingPanelDrag.startPointerTracking,
333
- samplePointerMove = _useFloatingPanelDrag.samplePointerMove,
334
- endPointerTracking = _useFloatingPanelDrag.endPointerTracking;
335
- var dragStateRef = useRef(null);
336
- var clampDragPosition = useCallback(function (x, y) {
337
- var contentWrapper = contentWrapperRef.current;
338
- if (!contentWrapper) {
339
- return {
340
- x: x,
341
- y: y
342
- };
343
- }
344
- var _contentWrapper$getBo = contentWrapper.getBoundingClientRect(),
345
- width = _contentWrapper$getBo.width,
346
- height = _contentWrapper$getBo.height;
347
- var offset = 16;
348
- var maxX = Math.max(offset, window.innerWidth - width - offset);
349
- var maxY = Math.max(offset, window.innerHeight - height - offset);
350
- return {
351
- x: Math.min(Math.max(x, offset), maxX),
352
- y: Math.min(Math.max(y, offset), maxY)
353
- };
354
- }, []);
355
- useLayoutEffect(function () {
356
- if (layoutMode !== 'floating') {
357
- setDragPosition(null);
358
- return;
359
- }
360
- setDragPosition(function (prev) {
361
- if (prev) {
362
- return clampDragPosition(prev.x, prev.y);
363
- }
364
- var pad = 16;
365
- var x = window.innerWidth - getMaiaFloatingPanelWidthPx() - pad;
366
- return clampDragPosition(x, pad);
367
- });
368
- }, [layoutMode, clampDragPosition]);
369
- var handleDragEnd = useCallback(function (event) {
370
- var _dragStateRef$current;
371
- endPointerTracking();
372
- if (((_dragStateRef$current = dragStateRef.current) === null || _dragStateRef$current === void 0 ? void 0 : _dragStateRef$current.pointerId) !== event.pointerId) {
373
- return;
374
- }
375
- dragStateRef.current = null;
376
- document.body.style.userSelect = '';
377
- document.body.style.cursor = '';
378
- }, [endPointerTracking]);
379
- var handleDragMove = useCallback(function (event) {
380
- var dragState = dragStateRef.current;
381
- if (!dragState || dragState.pointerId !== event.pointerId) {
382
- return;
383
- }
384
- samplePointerMove(event.clientX, event.clientY);
385
- var nextPosition = clampDragPosition(event.clientX - dragState.offsetX, event.clientY - dragState.offsetY);
386
- setDragPosition(function (prev) {
387
- if (prev && prev.x === nextPosition.x && prev.y === nextPosition.y) {
388
- return prev;
389
- }
390
- return nextPosition;
391
- });
392
- }, [clampDragPosition, samplePointerMove]);
393
- var resolvedDragPosition = useMemo(function () {
394
- if (layoutMode !== 'floating') {
395
- return dragPosition;
396
- }
397
- if (dragPosition) {
398
- return dragPosition;
399
- }
400
- var pad = 16;
401
- var x = typeof window !== 'undefined' ? window.innerWidth - getMaiaFloatingPanelWidthPx() - pad : pad;
402
- return clampDragPosition(x, pad);
403
- }, [layoutMode, dragPosition, clampDragPosition]);
404
- var handleDragStart = useCallback(function (event) {
405
- if (!isFloating || event.button !== 0) {
406
- return;
407
- }
408
- var target = event.target;
409
- if (target.closest('button, a, input, textarea, select, [role="button"], [data-no-drag="true"]')) {
410
- return;
411
- }
412
- var contentWrapper = contentWrapperRef.current;
413
- if (!contentWrapper) {
414
- return;
415
- }
416
- var rect = contentWrapper.getBoundingClientRect();
417
- var initialPosition = resolvedDragPosition !== null && resolvedDragPosition !== void 0 ? resolvedDragPosition : clampDragPosition(rect.left, rect.top);
418
- var pointerOffsetX = event.clientX - initialPosition.x;
419
- var pointerOffsetY = event.clientY - initialPosition.y;
420
- setDragPosition(initialPosition);
421
- dragStateRef.current = {
422
- pointerId: event.pointerId,
423
- offsetX: pointerOffsetX,
424
- offsetY: pointerOffsetY
425
- };
426
- event.currentTarget.setPointerCapture(event.pointerId);
427
- event.preventDefault();
428
- document.body.style.userSelect = 'none';
429
- document.body.style.cursor = 'grabbing';
430
- amplitudEvent(EVENTS.aiChatDraggable);
431
- startPointerTracking(event.clientX, event.clientY);
432
- }, [clampDragPosition, isFloating, resolvedDragPosition, startPointerTracking]);
433
- var startChat = useCallback(function (message, attachments, faqId, agentSuggestionId, mentions, fuaId, scId, contextData) {
434
- if (sidebarHasError) {
435
- setSidebarHasError(false);
436
- }
437
- setInitialChatId(null);
438
- setNewChatKey(function (prev) {
439
- return prev + 1;
440
- });
441
- setUserInitialMessage(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
442
- message: message || '',
443
- attachments: attachments || []
444
- }, faqId ? {
445
- faqId: faqId
446
- } : {}), agentSuggestionId ? {
447
- agentSuggestionId: agentSuggestionId
448
- } : {}), mentions && mentions.length > 0 ? {
449
- mentions: mentions
450
- } : {}), fuaId ? {
451
- fuaId: fuaId
452
- } : {}), scId ? {
453
- scId: scId
454
- } : {}), contextData ? {
455
- contextData: contextData
456
- } : {}));
457
- handlers.chat();
458
- }, [handlers, sidebarHasError]);
459
- var bannerFaqAutoSentRef = useRef(false);
460
- useEffect(function () {
461
- var _bannerEntryFaq$faqTi;
462
- var entityReady = section === 'project' ? Boolean(project === null || project === void 0 ? void 0 : project.id) : section === 'client' ? Boolean(client === null || client === void 0 ? void 0 : client.id) : true;
463
- if (!(bannerEntryFaq !== null && bannerEntryFaq !== void 0 && (_bannerEntryFaq$faqTi = bannerEntryFaq.faqTitle) !== null && _bannerEntryFaq$faqTi !== void 0 && _bannerEntryFaq$faqTi.trim()) || bannerFaqAutoSentRef.current || loading || !(agent !== null && agent !== void 0 && agent.id) || !entityReady) {
464
- return;
465
- }
466
- bannerFaqAutoSentRef.current = true;
467
- startChat(bannerEntryFaq.faqTitle, [], bannerEntryFaq.faqId, undefined, undefined, undefined, undefined, bannerEntryFaq.contextData);
468
- }, [bannerEntryFaq === null || bannerEntryFaq === void 0 ? void 0 : bannerEntryFaq.faqId, bannerEntryFaq === null || bannerEntryFaq === void 0 ? void 0 : bannerEntryFaq.faqTitle, bannerEntryFaq === null || bannerEntryFaq === void 0 ? void 0 : bannerEntryFaq.contextData, loading, agent === null || agent === void 0 ? void 0 : agent.id, agent === null || agent === void 0 ? void 0 : agent.entity, project === null || project === void 0 ? void 0 : project.id, client === null || client === void 0 ? void 0 : client.id, section, startChat]);
469
- var goToChat = useCallback(function (chat) {
470
- setUserInitialMessage({
471
- message: '',
472
- attachments: []
473
- });
474
- setInitialChatId(chat.sessionExternalId);
475
- var selectedAgent = agents.data.find(function (agentItem) {
476
- return agentItem.id === chat.agentId;
477
- });
478
- if (selectedAgent) {
479
- selectAgent(selectedAgent);
480
- }
481
- // Dispatch event to clear the input textarea
482
- document.dispatchEvent(new CustomEvent('chat-session-changed'));
483
- handlers.chat();
484
- }, [handlers, agents, selectAgent]);
485
- goToChatRef.current = goToChat;
486
-
487
- /** Los agentes se piden recién al abrir el panel: en modo pill no hace falta ninguna request. */
488
- var ensureAgentsLoaded = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
489
- return _regeneratorRuntime.wrap(function (_context) {
490
- while (1) switch (_context.prev = _context.next) {
491
- case 0:
492
- if (!agentsFetchedRef.current) {
493
- _context.next = 1;
494
- break;
495
- }
496
- return _context.abrupt("return");
497
- case 1:
498
- agentsFetchedRef.current = true;
499
- _context.next = 2;
500
- return handleGetAgents();
501
- case 2:
502
- case "end":
503
- return _context.stop();
504
- }
505
- }, _callee);
506
- })), [handleGetAgents]);
507
- var handleRestoreFromMinimized = useCallback(function () {
508
- setIsMinimized(false);
509
- setChatViewVisible(true);
510
- amplitudEvent(EVENTS.aiChatOpen, {
511
- option: 'minimize'
512
- });
513
-
514
- // goToChat necesita la lista de agentes para seleccionar el de la conversación.
515
- ensureAgentsLoaded().then(function () {
516
- var _chats$find;
517
- // Prioridad al reabrir: primer chat sin leer → última conversación abierta → Home.
518
- var _getChatsStoreState = getChatsStoreState(),
519
- chats = _getChatsStoreState.chats;
520
- var lastActiveChatId = readLastActiveChatId(user.id);
521
- var target = (_chats$find = chats.find(function (chat) {
522
- return chat.isRead === false;
523
- })) !== null && _chats$find !== void 0 ? _chats$find : lastActiveChatId ? chats.find(function (chat) {
524
- return chat.sessionExternalId === lastActiveChatId;
525
- }) : undefined;
526
- if (target) {
527
- var _goToChatRef$current;
528
- (_goToChatRef$current = goToChatRef.current) === null || _goToChatRef$current === void 0 || _goToChatRef$current.call(goToChatRef, target);
529
- } else {
530
- var _goHomeRef$current;
531
- (_goHomeRef$current = goHomeRef.current) === null || _goHomeRef$current === void 0 || _goHomeRef$current.call(goHomeRef);
532
- }
533
- focusChatInput();
534
- });
535
- }, [amplitudEvent, ensureAgentsLoaded, focusChatInput, setChatViewVisible, user.id]);
536
-
537
- /**
538
- * Toma control desde un host (header, proyecto, cliente…): abre el panel, descarta la
539
- * conversación abierta y aplica el contexto del host. NO vuelve a la última conversación
540
- * — eso sólo lo hace el pill (`handleRestoreFromMinimized`).
541
- */
542
- var applyExpandedHostTakeover = useCallback(function (detail) {
543
- var _resetSelectedChatRef;
544
- setIsMinimized(false);
545
- setChatViewVisible(true);
546
- writeLastActiveChatId(user.id, null);
547
- ensureAgentsLoaded();
548
- setInitialChatId(null);
549
- setNewChatKey(function (prev) {
550
- return prev + 1;
551
- });
552
- setUserInitialMessage({
553
- message: '',
554
- attachments: []
555
- });
556
- setCurrentOption(options.home);
557
- setDidResetContextInSection(false);
558
- setHasError(false);
559
- setIsWriting(false);
560
- useFaqsStore.getState().clearFaqs();
561
- bannerFaqAutoSentRef.current = false;
562
- (_resetSelectedChatRef = resetSelectedChatRef.current) === null || _resetSelectedChatRef === void 0 || _resetSelectedChatRef.call(resetSelectedChatRef);
563
- getChatsStoreState().setActiveChatId(null);
564
- document.dispatchEvent(new CustomEvent('chat-session-changed'));
565
- if (detail.section === 'project' || detail.section === 'task') {
566
- var _detail$project;
567
- setProject === null || setProject === void 0 || setProject((_detail$project = detail.project) !== null && _detail$project !== void 0 ? _detail$project : null);
568
- } else {
569
- setProject === null || setProject === void 0 || setProject(null);
570
- }
571
- if (detail.section === 'client') {
572
- var _detail$client;
573
- setClient === null || setClient === void 0 || setClient((_detail$client = detail.client) !== null && _detail$client !== void 0 ? _detail$client : null);
574
- } else if (detail.section === 'header' || detail.section === 'planner') {
575
- setClient === null || setClient === void 0 || setClient(null);
576
- }
577
- if (detail.section === 'task') {
578
- var _detail$task;
579
- setTask === null || setTask === void 0 || setTask((_detail$task = detail.task) !== null && _detail$task !== void 0 ? _detail$task : null);
580
- } else {
581
- setTask === null || setTask === void 0 || setTask(null);
582
- }
583
- if (detail.section === 'header' || detail.section === 'planner') {
584
- setChipsProject(null);
585
- }
586
- var nextLayout = resolveInitialMaiaChatLayoutMode({
587
- section: detail.section,
588
- bannerEntryFaq: detail.faq
589
- });
590
- setLayoutMode(nextLayout);
591
- setDragPosition(null);
592
- focusChatInput();
593
- }, [ensureAgentsLoaded, focusChatInput, setChatViewVisible, setChipsProject, setClient, setProject, setTask, user.id]);
594
- var handleSendMessageReady = useCallback(function (sendMessage, stopGeneration, streaming, writing) {
595
- setSendMessageFunction(function () {
596
- return sendMessage;
597
- });
598
- setStopGenerationFunction(function () {
599
- return stopGeneration;
600
- });
601
- setIsStreaming(streaming);
602
- setIsWriting(writing);
603
- }, []);
604
- var handleSendMessage = useCallback(function (message, attachments, faqId, agentSuggestionId, mentions, fuaId, scId) {
605
- if (sidebarHasError) {
606
- setSidebarHasError(false);
607
- }
608
- if (sendMessageFunction && computedCurrentOption === options.chat) {
609
- sendMessageFunction(message, attachments, faqId, agentSuggestionId, mentions, fuaId, scId);
610
- } else {
611
- startChat(message, attachments, faqId, agentSuggestionId, mentions, fuaId, scId);
612
- }
613
- }, [sendMessageFunction, startChat, computedCurrentOption, sidebarHasError]);
614
- var handleGoHome = useCallback(function () {
615
- // Si estamos en una conversación y vamos a home, resetear initialChatId y incrementar newChatKey
616
- if (currentOption === options.chat) {
617
- // No cortamos la generación: la sesión sigue respondiendo en background.
618
- setInitialChatId(null);
619
- setNewChatKey(function (prev) {
620
- return prev + 1;
621
- });
622
- setIsWriting(false);
623
- // No borrar el cliente si es agente de clientes (igual que el proyecto se mantiene)
624
- if ((agent === null || agent === void 0 ? void 0 : agent.entity) !== 'client') {
625
- setClient === null || setClient === void 0 || setClient(null);
626
- }
627
- if (section !== 'task') {
628
- setTask === null || setTask === void 0 || setTask(null);
629
- }
630
- }
631
- if ((!agent || agent !== null && agent !== void 0 && agent.is_deleted || agent !== null && agent !== void 0 && agent.has_not_permissions || agent !== null && agent !== void 0 && agent.has_not_access || agent !== null && agent !== void 0 && agent.project_deleted) && agents.data.length > 0) {
632
- selectAgent(agents.data[0]);
633
- }
634
- // Orchestrator en home global (header/planner): al iniciar un chat nuevo se debe volver al paso 1
635
- // (lista de contextos recientes), por lo que hay que limpiar todo el contexto pineado.
636
- if (isGlobalMaiaSection(section) && (agent === null || agent === void 0 ? void 0 : agent.type) === 'orchestrator') {
637
- setProject(null);
638
- setClient === null || setClient === void 0 || setClient(null);
639
- setTask === null || setTask === void 0 || setTask(null);
640
- }
641
- setCurrentOption(options.home);
642
- setChipsProject(null);
643
- setHasError(false);
644
- isWebSearchActive && toggleWebSearch();
645
- if (resetSelectedChatRef.current) {
646
- resetSelectedChatRef.current();
647
- }
648
- }, [options.home, options.chat, currentOption, isWebSearchActive, toggleWebSearch, agent, agents, selectAgent, setProject, setClient, setTask, stopGenerationFunction, section]);
649
- goHomeRef.current = handleGoHome;
650
- var handleStartNewChat = useCallback(function () {
651
- var fromMyAgents = computedCurrentOption === options.myAgents;
652
- var fromMaiakerHome = computedCurrentOption === options.home && isMaiakerAgentSelected;
653
- if (fromMyAgents || fromMaiakerHome) {
654
- var _resetSelectedChatRef2;
655
- var firstAgent = agents.data[0];
656
- if (firstAgent) {
657
- setProject(null);
658
- setClient === null || setClient === void 0 || setClient(null);
659
- setTask === null || setTask === void 0 || setTask(null);
660
- selectAgent(firstAgent);
661
- }
662
- setInitialChatId(null);
663
- setNewChatKey(function (prev) {
664
- return prev + 1;
665
- });
666
- setCurrentOption(options.home);
667
- setChipsProject(null);
668
- setHasError(false);
669
- if (isWebSearchActive) toggleWebSearch();
670
- (_resetSelectedChatRef2 = resetSelectedChatRef.current) === null || _resetSelectedChatRef2 === void 0 || _resetSelectedChatRef2.call(resetSelectedChatRef);
671
- document.dispatchEvent(new CustomEvent('chat-session-changed'));
672
- return;
673
- }
674
- handleGoHome();
675
- }, [agents.data, computedCurrentOption, handleGoHome, isMaiakerAgentSelected, isWebSearchActive, selectAgent, setClient, setProject, setTask, toggleWebSearch]);
676
- var handleResetChat = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
677
- return _regeneratorRuntime.wrap(function (_context2) {
678
- while (1) switch (_context2.prev = _context2.next) {
679
- case 0:
680
- setUserInitialMessage({
681
- message: '',
682
- attachments: []
683
- });
684
- setInitialChatId(null);
685
- // Dispatch event to clear the input textarea
686
- document.dispatchEvent(new CustomEvent('chat-session-changed'));
687
- handleGoHome();
688
- case 1:
689
- case "end":
690
- return _context2.stop();
691
- }
692
- }, _callee2);
693
- })), [handleGoHome]);
694
-
695
- // Botón "volver" del header (solo orchestrator):
696
- // - Desde el chat (header o project/client/task): inicia una conversación nueva conservando el
697
- // contexto pineado y vuelve al home (paso 2 con FAQs/FUAs).
698
- // - En el home paso 2 (FAQs/FUAs con contexto): limpia el contexto pineado y vuelve al paso 1
699
- // (selector de contextos recientes). En header siempre; en project/client/task solo si el
700
- // usuario reinició el contexto (didResetContextInSection).
701
- var handleBack = useCallback(function () {
702
- var to = resolveAiChatBackDestination(section, agent === null || agent === void 0 ? void 0 : agent.type, computedCurrentOption, options.home);
703
- amplitudEvent(EVENTS.aiChatBack, {
704
- to: to
705
- });
706
-
707
- // Desde el chat → nueva conversación SIN borrar el contexto pineado, volviendo al home.
708
- if (computedCurrentOption === options.chat) {
709
- // No cortamos la generación: la sesión sigue respondiendo en background.
710
- setIsWriting(false);
711
- setUserInitialMessage({
712
- message: '',
713
- attachments: []
714
- });
715
- setInitialChatId(null);
716
- setNewChatKey(function (prev) {
717
- return prev + 1;
718
- });
719
- setHasError(false);
720
- isWebSearchActive && toggleWebSearch();
721
- if (resetSelectedChatRef.current) {
722
- resetSelectedChatRef.current();
723
- }
724
- setCurrentOption(options.home);
725
- document.dispatchEvent(new CustomEvent('chat-session-changed'));
726
- return;
727
- }
728
-
729
- // Home paso 2 (contexto pineado) → limpiar el contexto y volver al paso 1 (contextos recientes).
730
- if (computedCurrentOption === options.home && (isGlobalMaiaSection(section) || didResetContextInSection)) {
731
- setProject(null);
732
- setClient === null || setClient === void 0 || setClient(null);
733
- setTask === null || setTask === void 0 || setTask(null);
734
- setChipsProject(null);
735
- }
736
- }, [computedCurrentOption, section, agent === null || agent === void 0 ? void 0 : agent.type, amplitudEvent, options.home, stopGenerationFunction, isWebSearchActive, toggleWebSearch, didResetContextInSection, setProject, setClient, setTask, setChipsProject]);
737
-
738
- // Detecta el reinicio de contexto en project/client/task: contexto pineado → vacío con el
739
- // orchestrator (p. ej. al reseleccionar MAIA en el listado). Solo la transición cuenta, así una
740
- // apertura fresca (contexto pineado desde la sección) no lo activa.
741
- useEffect(function () {
742
- var pinned = !!(task !== null && task !== void 0 && task.id || chipsProject !== null && chipsProject !== void 0 && chipsProject.projectId || client !== null && client !== void 0 && client.id || project !== null && project !== void 0 && project.id);
743
- var wasPinned = prevHasPinnedContextRef.current;
744
- prevHasPinnedContextRef.current = pinned;
745
- if (!isGlobalMaiaSection(section) && (agent === null || agent === void 0 ? void 0 : agent.type) === 'orchestrator' && wasPinned && !pinned) {
746
- setDidResetContextInSection(true);
747
- }
748
- }, [task === null || task === void 0 ? void 0 : task.id, chipsProject === null || chipsProject === void 0 ? void 0 : chipsProject.projectId, client === null || client === void 0 ? void 0 : client.id, project === null || project === void 0 ? void 0 : project.id, section, agent === null || agent === void 0 ? void 0 : agent.type]);
749
- useEffect(function () {
750
- var onMergeCreatedAgent = function onMergeCreatedAgent(evt) {
751
- var _ref3 = evt.detail || {},
752
- nextAgent = _ref3.agent;
753
- if (nextAgent !== null && nextAgent !== void 0 && nextAgent.id) {
754
- addAgent(nextAgent, {
755
- navigateHome: false
756
- });
757
- }
758
- };
759
- document.addEventListener('maia-merge-created-agent-into-list', onMergeCreatedAgent);
760
- return function () {
761
- document.removeEventListener('maia-merge-created-agent-into-list', onMergeCreatedAgent);
762
- };
763
- }, [addAgent]);
764
- useEffect(function () {
765
- var onSyncEditedAgent = function onSyncEditedAgent(evt) {
766
- var _ref4 = evt.detail || {},
767
- nextAgent = _ref4.agent;
768
- if (!(nextAgent !== null && nextAgent !== void 0 && nextAgent.id)) return;
769
- updateAgent(nextAgent);
770
- if ((agent === null || agent === void 0 ? void 0 : agent.id) === nextAgent.id) {
771
- selectAgent(nextAgent);
772
- }
773
- };
774
- document.addEventListener('maia-sync-edited-agent-from-chat', onSyncEditedAgent);
775
- return function () {
776
- document.removeEventListener('maia-sync-edited-agent-from-chat', onSyncEditedAgent);
777
- };
778
- }, [updateAgent, selectAgent, agent === null || agent === void 0 ? void 0 : agent.id]);
779
- useEffect(function () {
780
- var openChatView = function openChatView() {
781
- setHasError(false);
782
- setInitialChatId(null);
783
- setNewChatKey(function (prev) {
784
- return prev + 1;
785
- });
786
- setUserInitialMessage({
787
- message: '',
788
- attachments: []
789
- });
790
- setCurrentOption(options.chat);
791
- document.dispatchEvent(new CustomEvent('chat-session-changed'));
792
- };
793
- document.addEventListener('maia-open-chat-view', openChatView);
794
- return function () {
795
- document.removeEventListener('maia-open-chat-view', openChatView);
796
- };
797
- }, []);
798
-
799
- /**
800
- * El ícono de MAIA del header lleva siempre al Home. Si MAIA ya está montada pero
801
- * minimizada, el host no puede resolverlo cambiando `isOpen` (ya está en true),
802
- * así que avisa por evento y acá restauramos y vamos al Home.
803
- */
804
- useEffect(function () {
805
- var openHome = function openHome() {
806
- applyExpandedHostTakeover({
807
- section: 'header',
808
- entity: {
809
- projectId: null,
810
- clientId: null
811
- }
812
- });
813
- };
814
- document.addEventListener('maia-open-home', openHome);
815
- return function () {
816
- document.removeEventListener('maia-open-home', openHome);
817
- };
818
- }, [applyExpandedHostTakeover]);
819
-
820
- /**
821
- * Otro host (proyecto, cliente, banner, header…) pide abrir MAIA mientras ya hay una
822
- * instancia montada. Expande si estaba minimizado, aplica el contexto del host nuevo
823
- * y va al home — sin restaurar la conversación previa (eso lo hace el pill).
824
- */
825
- useEffect(function () {
826
- var openFromHost = function openFromHost(event) {
827
- var _ref5 = event,
828
- detail = _ref5.detail;
829
- if (!detail) return;
830
- applyExpandedHostTakeover(detail);
831
- };
832
- document.addEventListener(MAIA_OPEN_FROM_HOST_EVENT, openFromHost);
833
- return function () {
834
- document.removeEventListener(MAIA_OPEN_FROM_HOST_EVENT, openFromHost);
835
- };
836
- }, [applyExpandedHostTakeover]);
837
-
838
- /** Mismo flujo que ChatAIMyAgents.handleUseAgent + onBack (handlers.home).
839
- * El detail puede traer opcionalmente `project`, `client`, `task` para flows que
840
- * necesitan preservar contexto (ej. selector de agentes desde una tarea). Si no vienen,
841
- * se mantiene el comportamiento original de limpiar project/client. */
842
- useEffect(function () {
843
- var openNewChatWithAgent = function openNewChatWithAgent(event) {
844
- var _detail$project2, _detail$client2;
845
- var _ref6 = event,
846
- detail = _ref6.detail;
847
- var nextAgent = detail === null || detail === void 0 ? void 0 : detail.agent;
848
- if (!nextAgent) return;
849
- setProject((_detail$project2 = detail === null || detail === void 0 ? void 0 : detail.project) !== null && _detail$project2 !== void 0 ? _detail$project2 : null);
850
- setClient === null || setClient === void 0 || setClient((_detail$client2 = detail === null || detail === void 0 ? void 0 : detail.client) !== null && _detail$client2 !== void 0 ? _detail$client2 : null);
851
- if ((detail === null || detail === void 0 ? void 0 : detail.task) !== undefined) {
852
- setTask === null || setTask === void 0 || setTask(detail.task);
853
- }
854
- selectAgent(nextAgent);
855
- setHasError(false);
856
- setCurrentOption(options.home);
857
- };
858
- document.addEventListener('maia-open-new-chat-with-agent', openNewChatWithAgent);
859
- return function () {
860
- document.removeEventListener('maia-open-new-chat-with-agent', openNewChatWithAgent);
861
- };
862
- }, [selectAgent, setClient, setProject, setTask]);
863
- useEffect(function () {
864
- var handleUseSkillAfterSave = function handleUseSkillAfterSave(event) {
865
- var _ref7 = event.detail || {},
866
- skill = _ref7.skill,
867
- useFirstAgent = _ref7.useFirstAgent;
868
- if (!skill) return;
869
- if (useFirstAgent && agents.data.length) {
870
- selectAgent(agents.data[0]);
871
- }
872
- setHasError(false);
873
- setInitialChatId(null);
874
- setNewChatKey(function (prev) {
875
- return prev + 1;
876
- });
877
- setUserInitialMessage({
878
- message: '',
879
- attachments: []
880
- });
881
- setCurrentOption(options.home);
882
- document.dispatchEvent(new CustomEvent('chat-session-changed'));
883
- requestAnimationFrame(function () {
884
- document.dispatchEvent(new CustomEvent('maia-insert-skill-mention', {
885
- detail: {
886
- skill: skill
887
- }
888
- }));
889
- document.dispatchEvent(new CustomEvent('maia-input-refocus'));
890
- });
891
- };
892
- document.addEventListener(SKILL_USE_AFTER_SAVE_EVENT, handleUseSkillAfterSave);
893
- return function () {
894
- document.removeEventListener(SKILL_USE_AFTER_SAVE_EVENT, handleUseSkillAfterSave);
895
- };
896
- }, [agents.data, selectAgent]);
897
-
898
- // Metadata de la session abierta (agent_type/agent_entity + contexto), emitida por useChatMessages.
899
- useEffect(function () {
900
- var onSessionMeta = function onSessionMeta(evt) {
901
- var _ref8 = evt,
902
- detail = _ref8.detail;
903
- if (detail) setSessionMeta(detail);
904
- };
905
- document.addEventListener('maia-chat-session-meta', onSessionMeta);
906
- return function () {
907
- document.removeEventListener('maia-chat-session-meta', onSessionMeta);
908
- };
909
- }, []);
910
-
911
- // Al cambiar de conversación limpiamos la metadata; el load de la nueva session la vuelve a emitir.
912
- useEffect(function () {
913
- setSessionMeta(null);
914
- }, [initialChatId]);
915
-
916
- // Cartel "continuar en un chat nuevo": se muestra al abrir una conversación de un clone legacy
917
- // (agent_type === 'clone' con entity project/task/client). El input se reemplaza por el cartel.
918
- var legacyContextSession = useMemo(function () {
919
- if (computedCurrentOption !== options.chat) return null;
920
- if (!sessionMeta || sessionMeta.agentType !== 'clone') return null;
921
- var entity = sessionMeta.agentEntity;
922
- if (!entity || !LEGACY_CONTEXT_ENTITIES.includes(entity)) return null;
923
- var contextName = entity === 'task' ? sessionMeta.taskName : entity === 'project' ? sessionMeta.projectName : sessionMeta.clientName;
924
- return {
925
- entityType: entity,
926
- contextName: contextName || ''
927
- };
928
- }, [computedCurrentOption, sessionMeta]);
929
-
930
- // Marca el agente de la conversación legacy para que header, selector y avatar muestren el logo
931
- // MAIA y el nombre tachado (agente obsoleto), sin depender del `type` resuelto de la sesión vieja.
932
- useEffect(function () {
933
- if (legacyContextSession && agent && !agent.is_legacy_context) {
934
- selectAgent(_objectSpread(_objectSpread({}, agent), {}, {
935
- is_legacy_context: true
936
- }));
937
- }
938
- }, [legacyContextSession, agent, selectAgent]);
939
-
940
- // Abre un chat nuevo con el orchestrator seteando el contexto del clone legacy (mismo criterio
941
- // que clickear un contexto reciente en el home → paso 2 con FAQs/acciones de ese contexto).
942
- var handleContinueLegacyContextInNewChat = useCallback(function () {
943
- if (!sessionMeta) return;
944
- var agentEntity = sessionMeta.agentEntity,
945
- pId = sessionMeta.projectId,
946
- pName = sessionMeta.projectName,
947
- cId = sessionMeta.clientId,
948
- cName = sessionMeta.clientName,
949
- tId = sessionMeta.taskId,
950
- tName = sessionMeta.taskName;
951
- var orchestrator = agents.data.find(function (a) {
952
- return a.type === 'orchestrator';
953
- });
954
- if (!orchestrator) return;
955
-
956
- // Reset del chat → conversación nueva (la anterior sigue en background)
957
- setIsWriting(false);
958
- setUserInitialMessage({
959
- message: '',
960
- attachments: []
961
- });
962
- setInitialChatId(null);
963
- setNewChatKey(function (prev) {
964
- return prev + 1;
965
- });
966
- setHasError(false);
967
-
968
- // Setear contexto (mismo criterio que handleSelectRecentContext del home)
969
- setTask === null || setTask === void 0 || setTask(null);
970
- setProject(null);
971
- setClient === null || setClient === void 0 || setClient(null);
972
- setChipsProject(null);
973
- if (agentEntity === 'client' && cId != null) {
974
- setClient === null || setClient === void 0 || setClient({
975
- id: cId,
976
- name: cName || ''
977
- });
978
- } else if (agentEntity === 'project' && pId != null) {
979
- setProject(_objectSpread({
980
- id: pId,
981
- name: pName || ''
982
- }, cId != null ? {
983
- clientId: cId,
984
- client: {
985
- id: cId,
986
- name: cName || ''
987
- }
988
- } : {}));
989
- setChipsProject({
990
- projectId: String(pId),
991
- projectName: pName || '',
992
- clientName: cName || ''
993
- });
994
- } else if (agentEntity === 'task' && tId != null) {
995
- setTask === null || setTask === void 0 || setTask(_objectSpread(_objectSpread({
996
- id: tId,
997
- name: tName || ''
998
- }, pId != null ? {
999
- projectId: pId
1000
- } : {}), cId != null ? {
1001
- clientId: cId
1002
- } : {}));
1003
- if (cId != null) setClient === null || setClient === void 0 || setClient({
1004
- id: cId,
1005
- name: cName || ''
1006
- });
1007
- if (pId != null) {
1008
- setProject(_objectSpread({
1009
- id: pId,
1010
- name: pName || ''
1011
- }, cId != null ? {
1012
- clientId: cId,
1013
- client: {
1014
- id: cId,
1015
- name: cName || ''
1016
- }
1017
- } : {}));
1018
- setChipsProject({
1019
- projectId: String(pId),
1020
- projectName: pName || '',
1021
- clientName: cName || ''
1022
- });
1023
- }
1024
- }
1025
- selectAgent(orchestrator);
1026
- setSessionMeta(null);
1027
- setCurrentOption(options.home);
1028
- document.dispatchEvent(new CustomEvent('chat-session-changed'));
1029
- }, [sessionMeta, agents.data, selectAgent, setClient, setProject, setTask, setChipsProject, stopGenerationFunction]);
1030
- var showNewChat = computedCurrentOption !== options.chat;
1031
- var isMyAgentsSection = computedCurrentOption === options.myAgents;
1032
- var isMySkillsSection = computedCurrentOption === options.mySkills;
1033
-
1034
- // Botón "volver": solo para el orchestrator.
1035
- // - En el chat: disponible en todas las secciones (header y project/client/task).
1036
- // - En el home paso 2 (FAQs/FUAs con contexto pineado): en el header siempre; en
1037
- // project/client/task solo si el usuario reinició el contexto (pasó por el selector de
1038
- // contextos recientes). En el paso 1 (sin contexto) NO se muestra.
1039
- var hasPinnedContext = !!(task !== null && task !== void 0 && task.id || chipsProject !== null && chipsProject !== void 0 && chipsProject.projectId || client !== null && client !== void 0 && client.id || project !== null && project !== void 0 && project.id);
1040
- var isChatView = computedCurrentOption === options.chat;
1041
- var isHomeStep2 = computedCurrentOption === options.home && hasPinnedContext;
1042
- var isHeaderHomeStep2 = isGlobalMaiaSection(section) && isHomeStep2;
1043
- var isSectionResetHomeStep2 = !isGlobalMaiaSection(section) && isHomeStep2 && didResetContextInSection;
1044
- var showBackButton = (agent === null || agent === void 0 ? void 0 : agent.type) === 'orchestrator' && !hasError && !loading && (isChatView || isHeaderHomeStep2 || isSectionResetHomeStep2);
1045
- var handleOpenMarketplace = useCallback(function () {
1046
- if (!window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS) {
1047
- return;
1048
- }
1049
- clearAgent();
1050
- setCurrentOption(options.myAgents);
1051
- }, [clearAgent]);
1052
- var handleOpenSkills = useCallback(function () {
1053
- if (!window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS) {
1054
- return;
1055
- }
1056
- clearAgent();
1057
- setHasError(false);
1058
- setCurrentOption(options.mySkills);
1059
- handleGetSkills();
1060
- }, [clearAgent, handleGetSkills]);
1061
- var handleGoToMaiaker = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
1062
- var maiakerAgent, response, data, _t;
1063
- return _regeneratorRuntime.wrap(function (_context3) {
1064
- while (1) switch (_context3.prev = _context3.next) {
1065
- case 0:
1066
- setHasError(false);
1067
- maiakerAgent = agents.data.find(function (a) {
1068
- return isMarketplaceGlobalCloneAgent(a);
1069
- });
1070
- if (maiakerAgent) {
1071
- _context3.next = 5;
1072
- break;
1073
- }
1074
- _context3.prev = 1;
1075
- _context3.next = 2;
1076
- return fetchMaia({
1077
- path: "agents?agent_type=clone&entity=global&lang=".concat(mapCORLang(i18n.language)),
1078
- method: 'GET'
1079
- });
1080
- case 2:
1081
- response = _context3.sent;
1082
- _context3.next = 3;
1083
- return response.json();
1084
- case 3:
1085
- data = _context3.sent;
1086
- maiakerAgent = (data.data || []).find(function (a) {
1087
- return isMarketplaceGlobalCloneAgent(a);
1088
- });
1089
- _context3.next = 5;
1090
- break;
1091
- case 4:
1092
- _context3.prev = 4;
1093
- _t = _context3["catch"](1);
1094
- return _context3.abrupt("return");
1095
- case 5:
1096
- if (maiakerAgent) {
1097
- _context3.next = 6;
1098
- break;
1099
- }
1100
- return _context3.abrupt("return");
1101
- case 6:
1102
- setProject(null);
1103
- setClient === null || setClient === void 0 || setClient(null);
1104
- setTask === null || setTask === void 0 || setTask(null);
1105
- selectAgent(maiakerAgent);
1106
- setCurrentOption(options.home);
1107
- if (resetSelectedChatRef.current) {
1108
- resetSelectedChatRef.current();
1109
- }
1110
- case 7:
1111
- case "end":
1112
- return _context3.stop();
1113
- }
1114
- }, _callee3, null, [[1, 4]]);
1115
- })), [agents.data, i18n.language, selectAgent, setClient, setProject, setTask]);
1116
- var handleDeleteAgentFromMyAgents = useCallback(function (agentId) {
1117
- removeAgent(agentId);
1118
- if ((agent === null || agent === void 0 ? void 0 : agent.id) === agentId) {
1119
- selectFirstAgent(agentId);
1120
- }
1121
- }, [agent === null || agent === void 0 ? void 0 : agent.id, removeAgent, selectFirstAgent]);
1122
-
1123
- // El footer (input) se oculta solo en el home marketplace de Maiaker (browse de agentes).
1124
- // El home del orchestrator sí permite escribir, así que mantiene el footer.
1125
- var isMaiakerCreatorHome = computedCurrentOption === options.home && isMaiakerAgentSelected;
1126
- var modalPanel = /*#__PURE__*/_jsxs(_Fragment, {
1127
- children: [validateAccessByFeature(section, user) && !isFloating ? /*#__PURE__*/_jsx(Sidebar, {
1128
- onGoToChat: goToChat,
1129
- onError: function onError() {
1130
- return setSidebarHasError(true);
1131
- },
1132
- handleGoToHome: handleGoHome,
1133
- handleStartNewChat: handleStartNewChat,
1134
- handleOpenMarketplace: handleOpenMarketplace,
1135
- showNewChat: showNewChat,
1136
- refetchChats: refetchChats,
1137
- handleSetRefetchChats: setRefetchChats,
1138
- hasError: sidebarHasError,
1139
- resetSelectedChatRef: resetSelectedChatRef,
1140
- agentsNavActive: sidebarAgentsNavActive,
1141
- handleOpenSkills: handleOpenSkills,
1142
- isLegacyContextSession: !!legacyContextSession
1143
- }) : null, /*#__PURE__*/_jsxs(SCCAIMContent, {
1144
- expanded: expanded,
1145
- floating: isFloating,
1146
- children: [/*#__PURE__*/_jsx(ChatAIModalHeader, {
1147
- layoutMode: layoutMode,
1148
- onLayoutModeChange: handleLayoutModeChange,
1149
- expanded: expanded,
1150
- draggable: isFloating,
1151
- onDragStart: handleDragStart,
1152
- onDragMove: handleDragMove,
1153
- onDragEnd: handleDragEnd,
1154
- handleMinimize: handleMinimize,
1155
- agents: agents.data,
1156
- hasError: !!agentError,
1157
- loading: loading,
1158
- loadingMore: loadingMore,
1159
- hasMore: agents.has_more,
1160
- handleResetChat: handleResetChat,
1161
- onAgentUpdate: updateAgentFavorite,
1162
- loadMoreAgents: loadMoreAgents,
1163
- sortAgentsList: sortAgentsList,
1164
- isMyAgentsSection: isMyAgentsSection,
1165
- isMySkillsSection: isMySkillsSection,
1166
- isMaiakerSection: isMaiakerCreatorHome,
1167
- showBackButton: showBackButton,
1168
- onBack: handleBack
1169
- }), hasError ? /*#__PURE__*/_jsx(MAIAError, {}) : validateAccessByFeature(section, user) ? /*#__PURE__*/_jsx(ChatAIContent, {
1170
- currentOption: computedCurrentOption,
1171
- handlers: _objectSpread(_objectSpread({}, handlers), {}, {
1172
- chat: startChat,
1173
- home: handlers.home,
1174
- handleGoHome: handleGoHome
1175
- }),
1176
- onError: function onError() {
1177
- return setHasError(true);
1178
- },
1179
- refs: {
1180
- userInitialMessage: userInitialMessage,
1181
- initialChatId: initialChatId
1182
- },
1183
- onSendMessageReady: handleSendMessageReady,
1184
- expanded: expanded,
1185
- floating: isFloating,
1186
- agents: agents.data,
1187
- loadingAgents: loading,
1188
- onDeleteAgent: handleDeleteAgentFromMyAgents,
1189
- onFavoriteAgentUpdate: updateAgentFavorite,
1190
- hasMoreAgents: !!agents.has_more,
1191
- loadingMoreAgents: loadingMore,
1192
- onLoadMoreAgents: loadMoreAgents,
1193
- onGoToMaiaker: handleGoToMaiaker,
1194
- mySkills: mySkills,
1195
- sharedSkills: sharedSkills,
1196
- loadingSkills: loadingSkills,
1197
- onDeleteSkill: removeSkill,
1198
- onSearchAgents: searchCustomAgents,
1199
- searchLoadingAgents: searchLoading,
1200
- agentError: agentError
1201
- }) : /*#__PURE__*/_jsx(ProjectSummaryContent, {
1202
- onRestartSummary: handlers.home
1203
- }), (computedCurrentOption === options.home && !!(agents !== null && agents !== void 0 && (_agents$data = agents.data) !== null && _agents$data !== void 0 && _agents$data.length) || computedCurrentOption === options.chat) && !isMaiakerCreatorHome && !hasError && !loading && validateAccessByFeature(section, user) && /*#__PURE__*/_jsx(ChatAiModalFooter, {
1204
- agent: agent,
1205
- handleSendMessage: handleSendMessage,
1206
- handleStopGeneration: stopGenerationFunction,
1207
- isStreaming: isStreaming,
1208
- isWriting: isWriting,
1209
- chatId: initialChatId,
1210
- newChatKey: newChatKey,
1211
- tooltipZIndex: tooltipZIndex,
1212
- legacyContextSession: legacyContextSession,
1213
- onContinueInNewChat: handleContinueLegacyContextInNewChat,
1214
- layoutMode: layoutMode
1215
- })]
1216
- })]
1217
- });
1218
- var contentWrapper = /*#__PURE__*/_jsx(SCCAIMContentWrapper, {
1219
- expanded: expanded,
1220
- floating: isFloating,
1221
- ref: contentWrapperRef,
1222
- children: modalPanel
1223
- });
1224
- return selector && /*#__PURE__*/ReactDOM.createPortal(/*#__PURE__*/_jsxs(SCCAIMWrapper, {
1225
- expanded: expanded,
1226
- layoutMode: layoutMode,
1227
- dragPosition: resolvedDragPosition,
1228
- elevated: section === 'task',
1229
- $minimized: isMinimized,
1230
- children: [/*#__PURE__*/_jsx(SCCAIMMinimizedHide, {
1231
- $hidden: isMinimized,
1232
- children: /*#__PURE__*/_jsx(FloatingPanelMotion, {
1233
- tilt: tiltMotion,
1234
- expanded: expanded,
1235
- children: contentWrapper
1236
- })
1237
- }), isMinimized && /*#__PURE__*/_jsx(MaiaMinimizedPill, {
1238
- unreadCount: unreadCount,
1239
- isStreaming: hasActiveStream,
1240
- onRestore: handleRestoreFromMinimized
1241
- }), userHasPermissions && /*#__PURE__*/_jsx(AbmAgentModal, {
1242
- addAgent: addAgent,
1243
- updateAgent: updateAgent,
1244
- removeAgent: removeAgent,
1245
- updateAgentFavorite: updateAgentFavorite,
1246
- selectFirstAgent: selectFirstAgent
1247
- }), userHasPermissions && /*#__PURE__*/_jsx(AbmSkillModal, {
1248
- addSkill: addSkill,
1249
- updateSkillInList: updateSkillInList,
1250
- removeSkill: removeSkill
1251
- }), userHasPermissions && /*#__PURE__*/_jsx(AbmSkillGenerateModal, {}), /*#__PURE__*/_jsx(Snackbar, {})]
1252
- }), selector);
1253
- };
1254
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZU1lbW8iLCJ1c2VTdGF0ZSIsInVzZVJlZiIsInVzZUVmZmVjdCIsInVzZUxheW91dEVmZmVjdCIsIlJlYWN0RE9NIiwibW9tZW50IiwidXNlVHJhbnNsYXRpb24iLCJ1c2VVc2VyIiwiY2FuQWNjZXNzVG9DaGF0QUkiLCJjYW5BY2Nlc3NUb1NraWxscyIsIk1BSUFFcnJvciIsInVzZU1haWFUYXNrUGFuZWxaSW5kZXgiLCJDaGF0QUlDb250ZW50IiwiYnVpbGRIYW5kbGVycyIsIm9wdGlvbnMiLCJTaWRlYmFyIiwidXNlR2V0QWdlbnRzIiwidXNlR2V0U2tpbGxzIiwidXNlR2xvYmFsQ29udGV4dCIsIkNoYXRBSU1vZGFsSGVhZGVyIiwiU25hY2tiYXIiLCJQcm9qZWN0U3VtbWFyeUNvbnRlbnQiLCJBYm1BZ2VudE1vZGFsIiwiQWJtU2tpbGxNb2RhbCIsIlNLSUxMX1VTRV9BRlRFUl9TQVZFX0VWRU5UIiwiQWJtU2tpbGxHZW5lcmF0ZU1vZGFsIiwiU0VDVElPTlMiLCJTQ0NBSU1Db250ZW50IiwiU0NDQUlNQ29udGVudFdyYXBwZXIiLCJTQ0NBSU1NaW5pbWl6ZWRIaWRlIiwiU0NDQUlNV3JhcHBlciIsIk1haWFNaW5pbWl6ZWRQaWxsIiwiZ2V0TWFpYUZsb2F0aW5nUGFuZWxXaWR0aFB4IiwicmVzb2x2ZUluaXRpYWxNYWlhQ2hhdExheW91dE1vZGUiLCJzZXRTdG9yZWRNYWlhQ2hhdExheW91dE1vZGUiLCJGbG9hdGluZ1BhbmVsTW90aW9uIiwidXNlRmxvYXRpbmdQYW5lbERyYWdUaWx0IiwiQ2hhdEFpTW9kYWxGb290ZXIiLCJ2YWxpZGF0ZUlzTWFpYSIsImlzTWFya2V0cGxhY2VHbG9iYWxDbG9uZUFnZW50IiwidXNlRmFxc1N0b3JlIiwiZ2V0Q2hhdHNTdG9yZVN0YXRlIiwidXNlQ2hhdHNTdG9yZSIsInJlYWRMYXN0QWN0aXZlQ2hhdElkIiwid3JpdGVMYXN0QWN0aXZlQ2hhdElkIiwidXNlU2Vzc2lvbnNTdG9yZSIsImlzQWN0aXZlU2Vzc2lvblN0YXR1cyIsImZldGNoTWFpYSIsIm1hcENPUkxhbmciLCJFVkVOVFMiLCJ1c2VFdmVudCIsIk1BSUFfT1BFTl9GUk9NX0hPU1RfRVZFTlQiLCJqc3giLCJfanN4IiwianN4cyIsIl9qc3hzIiwiRnJhZ21lbnQiLCJfRnJhZ21lbnQiLCJMRUdBQ1lfQ09OVEVYVF9FTlRJVElFUyIsImlzR2xvYmFsTWFpYVNlY3Rpb24iLCJzZWN0aW9uIiwicmVzb2x2ZUFpQ2hhdEJhY2tEZXN0aW5hdGlvbiIsImFnZW50VHlwZSIsImN1cnJlbnRPcHRpb24iLCJob21lT3B0aW9uIiwiSURfTU9EQUxfQ0hBVF9BR0VOVCIsInZhbGlkYXRlQWNjZXNzQnlGZWF0dXJlIiwidXNlciIsIkJvb2xlYW4iLCJ3aW5kb3ciLCJNQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MiLCJNQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTIiwiQ2hhdEFJTW9kYWwiLCJfdXNlciRwZXJtaXNzaW9ucyIsIl91c2VyJHBlcm1pc3Npb25zMiIsIl91c2VyJHBlcm1pc3Npb25zMyIsIl9hZ2VudHMkZGF0YSIsIl91c2VUcmFuc2xhdGlvbiIsImFibUFnZW50IiwiaTE4biIsImFtcGxpdHVkRXZlbnQiLCJfdXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkiLCJpc01pbmltaXplZCIsInNldElzTWluaW1pemVkIiwic2V0Q2hhdFZpZXdWaXNpYmxlIiwic3RhdGUiLCJ1bnJlYWRDb3VudCIsImFjdGl2ZUNoYXRJZCIsImhhc0FjdGl2ZVN0cmVhbSIsIk9iamVjdCIsInZhbHVlcyIsIm1ldGEiLCJzb21lIiwic3RhdHVzIiwiZ29Ub0NoYXRSZWYiLCJnb0hvbWVSZWYiLCJpZCIsImhhbmRsZU1pbmltaXplIiwiYWlDaGF0TWluaW1pemUiLCJmb2N1c0NoYXRJbnB1dCIsInNldFRpbWVvdXQiLCJkb2N1bWVudCIsImRpc3BhdGNoRXZlbnQiLCJDdXN0b21FdmVudCIsIl91c2VTdGF0ZTMiLCJtZXNzYWdlIiwiYXR0YWNobWVudHMiLCJfdXNlU3RhdGU0IiwidXNlckluaXRpYWxNZXNzYWdlIiwic2V0VXNlckluaXRpYWxNZXNzYWdlIiwiX3VzZVN0YXRlNSIsIl91c2VTdGF0ZTYiLCJpbml0aWFsQ2hhdElkIiwic2V0SW5pdGlhbENoYXRJZCIsIl91c2VTdGF0ZTciLCJfdXNlU3RhdGU4IiwibmV3Q2hhdEtleSIsInNldE5ld0NoYXRLZXkiLCJfdXNlU3RhdGU5IiwiX3VzZVN0YXRlMCIsInNlc3Npb25NZXRhIiwic2V0U2Vzc2lvbk1ldGEiLCJfdXNlU3RhdGUxIiwiX3VzZVN0YXRlMTAiLCJzZW5kTWVzc2FnZUZ1bmN0aW9uIiwic2V0U2VuZE1lc3NhZ2VGdW5jdGlvbiIsIl91c2VTdGF0ZTExIiwiX3VzZVN0YXRlMTIiLCJzdG9wR2VuZXJhdGlvbkZ1bmN0aW9uIiwic2V0U3RvcEdlbmVyYXRpb25GdW5jdGlvbiIsIl91c2VTdGF0ZTEzIiwiX3VzZVN0YXRlMTQiLCJpc1N0cmVhbWluZyIsInNldElzU3RyZWFtaW5nIiwiX3VzZVN0YXRlMTUiLCJfdXNlU3RhdGUxNiIsImlzV3JpdGluZyIsInNldElzV3JpdGluZyIsIl91c2VTdGF0ZTE3IiwiX3VzZVN0YXRlMTgiLCJyZWZldGNoQ2hhdHMiLCJzZXRSZWZldGNoQ2hhdHMiLCJfdXNlU3RhdGUxOSIsImhvbWUiLCJfdXNlU3RhdGUyMCIsInNldEN1cnJlbnRPcHRpb24iLCJfdXNlU3RhdGUyMSIsIl91c2VTdGF0ZTIyIiwiaGFzRXJyb3IiLCJzZXRIYXNFcnJvciIsIl91c2VTdGF0ZTIzIiwiX3VzZVN0YXRlMjQiLCJkaWRSZXNldENvbnRleHRJblNlY3Rpb24iLCJzZXREaWRSZXNldENvbnRleHRJblNlY3Rpb24iLCJwcmV2SGFzUGlubmVkQ29udGV4dFJlZiIsImhhbmRsZXJzIiwiX3VzZVN0YXRlMjUiLCJfdXNlU3RhdGUyNiIsInNpZGViYXJIYXNFcnJvciIsInNldFNpZGViYXJIYXNFcnJvciIsInJlc2V0U2VsZWN0ZWRDaGF0UmVmIiwibGFuZyIsImxhbmd1YWdlIiwibG9jYWxlIiwiX3VzZUdsb2JhbENvbnRleHQiLCJzZWxlY3RBZ2VudCIsImNsZWFyQWdlbnQiLCJhZ2VudCIsInByb2plY3QiLCJjbGllbnQiLCJ0YXNrIiwiY2hpcHNQcm9qZWN0IiwidG9nZ2xlV2ViU2VhcmNoIiwiaXNXZWJTZWFyY2hBY3RpdmUiLCJzZXRDaGlwc1Byb2plY3QiLCJzZXRDbGllbnQiLCJzZXRQcm9qZWN0IiwiYmFubmVyRW50cnlGYXEiLCJzZXRUYXNrIiwidG9vbHRpcFpJbmRleCIsIl91c2VHZXRBZ2VudHMiLCJoYW5kbGVHb0hvbWUiLCJhZ2VudHMiLCJsb2FkaW5nIiwibG9hZGluZ01vcmUiLCJhZ2VudEVycm9yIiwiZXJyb3IiLCJoYW5kbGVHZXRBZ2VudHMiLCJsb2FkTW9yZUFnZW50cyIsInNlYXJjaEN1c3RvbUFnZW50cyIsInNlYXJjaExvYWRpbmciLCJhZGRBZ2VudCIsInJlbW92ZUFnZW50IiwidXBkYXRlQWdlbnQiLCJ1cGRhdGVBZ2VudEZhdm9yaXRlIiwic2VsZWN0Rmlyc3RBZ2VudCIsInNvcnRBZ2VudHNMaXN0IiwiX3VzZUdldFNraWxscyIsIm15U2tpbGxzIiwic2hhcmVkU2tpbGxzIiwibG9hZGluZ1NraWxscyIsImhhbmRsZUdldFNraWxscyIsImFkZFNraWxsIiwidXBkYXRlU2tpbGxJbkxpc3QiLCJyZW1vdmVTa2lsbCIsImlzTUFJQSIsInVzZXJIYXNQZXJtaXNzaW9ucyIsInBlcm1pc3Npb25zIiwiYWlfYWdlbnRzIiwiY3JlYXRlIiwiZWRpdCIsImNvbXB1dGVkQ3VycmVudE9wdGlvbiIsImlzR2xvYmFsU3BlY2lhbGlzdCIsImVudGl0eSIsImlzUHJvamVjdFNwZWNpYWxpc3QiLCJpc0NsaWVudFNwZWNpYWxpc3QiLCJpc01haWFrZXIiLCJteUFnZW50cyIsInR5cGUiLCJjaGF0Iiwic2hvdWxkU2hvd1Byb2plY3RTZWxlY3RvciIsInNob3VsZFNob3dDbGllbnRTZWxlY3RvciIsInByb2plY3RTZWxlY3RvciIsImNsaWVudFNlbGVjdG9yIiwibmFtZSIsImlzTWFpYWtlckFnZW50U2VsZWN0ZWQiLCJzaWRlYmFyQWdlbnRzTmF2QWN0aXZlIiwiYWdlbnRzRmV0Y2hlZFJlZiIsInNlbGVjdG9yIiwicXVlcnlTZWxlY3RvciIsImNvbmNhdCIsIl91c2VTdGF0ZTI3IiwiX3VzZVN0YXRlMjgiLCJsYXlvdXRNb2RlIiwic2V0TGF5b3V0TW9kZSIsImhhbmRsZUxheW91dE1vZGVDaGFuZ2UiLCJtb2RlIiwiZXhwYW5kZWQiLCJpc0Zsb2F0aW5nIiwiY29udGVudFdyYXBwZXJSZWYiLCJfdXNlU3RhdGUyOSIsIl91c2VTdGF0ZTMwIiwiZHJhZ1Bvc2l0aW9uIiwic2V0RHJhZ1Bvc2l0aW9uIiwiX3VzZUZsb2F0aW5nUGFuZWxEcmFnIiwidGlsdE1vdGlvbiIsInN0YXJ0UG9pbnRlclRyYWNraW5nIiwic2FtcGxlUG9pbnRlck1vdmUiLCJlbmRQb2ludGVyVHJhY2tpbmciLCJkcmFnU3RhdGVSZWYiLCJjbGFtcERyYWdQb3NpdGlvbiIsIngiLCJ5IiwiY29udGVudFdyYXBwZXIiLCJjdXJyZW50IiwiX2NvbnRlbnRXcmFwcGVyJGdldEJvIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0Iiwid2lkdGgiLCJoZWlnaHQiLCJvZmZzZXQiLCJtYXhYIiwiTWF0aCIsIm1heCIsImlubmVyV2lkdGgiLCJtYXhZIiwiaW5uZXJIZWlnaHQiLCJtaW4iLCJwcmV2IiwicGFkIiwiaGFuZGxlRHJhZ0VuZCIsImV2ZW50IiwiX2RyYWdTdGF0ZVJlZiRjdXJyZW50IiwicG9pbnRlcklkIiwiYm9keSIsInN0eWxlIiwidXNlclNlbGVjdCIsImN1cnNvciIsImhhbmRsZURyYWdNb3ZlIiwiZHJhZ1N0YXRlIiwiY2xpZW50WCIsImNsaWVudFkiLCJuZXh0UG9zaXRpb24iLCJvZmZzZXRYIiwib2Zmc2V0WSIsInJlc29sdmVkRHJhZ1Bvc2l0aW9uIiwiaGFuZGxlRHJhZ1N0YXJ0IiwiYnV0dG9uIiwidGFyZ2V0IiwiY2xvc2VzdCIsInJlY3QiLCJpbml0aWFsUG9zaXRpb24iLCJsZWZ0IiwidG9wIiwicG9pbnRlck9mZnNldFgiLCJwb2ludGVyT2Zmc2V0WSIsImN1cnJlbnRUYXJnZXQiLCJzZXRQb2ludGVyQ2FwdHVyZSIsInByZXZlbnREZWZhdWx0IiwiYWlDaGF0RHJhZ2dhYmxlIiwic3RhcnRDaGF0IiwiZmFxSWQiLCJhZ2VudFN1Z2dlc3Rpb25JZCIsIm1lbnRpb25zIiwiZnVhSWQiLCJzY0lkIiwiY29udGV4dERhdGEiLCJfb2JqZWN0U3ByZWFkIiwibGVuZ3RoIiwiYmFubmVyRmFxQXV0b1NlbnRSZWYiLCJfYmFubmVyRW50cnlGYXEkZmFxVGkiLCJlbnRpdHlSZWFkeSIsImZhcVRpdGxlIiwidHJpbSIsInVuZGVmaW5lZCIsImdvVG9DaGF0Iiwic2Vzc2lvbkV4dGVybmFsSWQiLCJzZWxlY3RlZEFnZW50IiwiZGF0YSIsImZpbmQiLCJhZ2VudEl0ZW0iLCJhZ2VudElkIiwiZW5zdXJlQWdlbnRzTG9hZGVkIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJ3cmFwIiwiX2NvbnRleHQiLCJuZXh0IiwiYWJydXB0Iiwic3RvcCIsImhhbmRsZVJlc3RvcmVGcm9tTWluaW1pemVkIiwiYWlDaGF0T3BlbiIsIm9wdGlvbiIsInRoZW4iLCJfY2hhdHMkZmluZCIsIl9nZXRDaGF0c1N0b3JlU3RhdGUiLCJjaGF0cyIsImxhc3RBY3RpdmVDaGF0SWQiLCJpc1JlYWQiLCJfZ29Ub0NoYXRSZWYkY3VycmVudCIsImNhbGwiLCJfZ29Ib21lUmVmJGN1cnJlbnQiLCJhcHBseUV4cGFuZGVkSG9zdFRha2VvdmVyIiwiZGV0YWlsIiwiX3Jlc2V0U2VsZWN0ZWRDaGF0UmVmIiwiZ2V0U3RhdGUiLCJjbGVhckZhcXMiLCJzZXRBY3RpdmVDaGF0SWQiLCJfZGV0YWlsJHByb2plY3QiLCJfZGV0YWlsJGNsaWVudCIsIl9kZXRhaWwkdGFzayIsIm5leHRMYXlvdXQiLCJmYXEiLCJoYW5kbGVTZW5kTWVzc2FnZVJlYWR5Iiwic2VuZE1lc3NhZ2UiLCJzdG9wR2VuZXJhdGlvbiIsInN0cmVhbWluZyIsIndyaXRpbmciLCJoYW5kbGVTZW5kTWVzc2FnZSIsImlzX2RlbGV0ZWQiLCJoYXNfbm90X3Blcm1pc3Npb25zIiwiaGFzX25vdF9hY2Nlc3MiLCJwcm9qZWN0X2RlbGV0ZWQiLCJoYW5kbGVTdGFydE5ld0NoYXQiLCJmcm9tTXlBZ2VudHMiLCJmcm9tTWFpYWtlckhvbWUiLCJfcmVzZXRTZWxlY3RlZENoYXRSZWYyIiwiZmlyc3RBZ2VudCIsImhhbmRsZVJlc2V0Q2hhdCIsIl9jYWxsZWUyIiwiX2NvbnRleHQyIiwiaGFuZGxlQmFjayIsInRvIiwiYWlDaGF0QmFjayIsInBpbm5lZCIsInByb2plY3RJZCIsIndhc1Bpbm5lZCIsIm9uTWVyZ2VDcmVhdGVkQWdlbnQiLCJldnQiLCJfcmVmMyIsIm5leHRBZ2VudCIsIm5hdmlnYXRlSG9tZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwib25TeW5jRWRpdGVkQWdlbnQiLCJfcmVmNCIsIm9wZW5DaGF0VmlldyIsIm9wZW5Ib21lIiwiY2xpZW50SWQiLCJvcGVuRnJvbUhvc3QiLCJfcmVmNSIsIm9wZW5OZXdDaGF0V2l0aEFnZW50IiwiX2RldGFpbCRwcm9qZWN0MiIsIl9kZXRhaWwkY2xpZW50MiIsIl9yZWY2IiwiaGFuZGxlVXNlU2tpbGxBZnRlclNhdmUiLCJfcmVmNyIsInNraWxsIiwidXNlRmlyc3RBZ2VudCIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsIm9uU2Vzc2lvbk1ldGEiLCJfcmVmOCIsImxlZ2FjeUNvbnRleHRTZXNzaW9uIiwiYWdlbnRFbnRpdHkiLCJpbmNsdWRlcyIsImNvbnRleHROYW1lIiwidGFza05hbWUiLCJwcm9qZWN0TmFtZSIsImNsaWVudE5hbWUiLCJlbnRpdHlUeXBlIiwiaXNfbGVnYWN5X2NvbnRleHQiLCJoYW5kbGVDb250aW51ZUxlZ2FjeUNvbnRleHRJbk5ld0NoYXQiLCJwSWQiLCJwTmFtZSIsImNJZCIsImNOYW1lIiwidElkIiwidGFza0lkIiwidE5hbWUiLCJvcmNoZXN0cmF0b3IiLCJhIiwiU3RyaW5nIiwic2hvd05ld0NoYXQiLCJpc015QWdlbnRzU2VjdGlvbiIsImlzTXlTa2lsbHNTZWN0aW9uIiwiaGFzUGlubmVkQ29udGV4dCIsImlzQ2hhdFZpZXciLCJpc0hvbWVTdGVwMiIsImlzSGVhZGVySG9tZVN0ZXAyIiwiaXNTZWN0aW9uUmVzZXRIb21lU3RlcDIiLCJzaG93QmFja0J1dHRvbiIsImhhbmRsZU9wZW5NYXJrZXRwbGFjZSIsImhhbmRsZU9wZW5Ta2lsbHMiLCJoYW5kbGVHb1RvTWFpYWtlciIsIl9jYWxsZWUzIiwibWFpYWtlckFnZW50IiwicmVzcG9uc2UiLCJfdCIsIl9jb250ZXh0MyIsInBhdGgiLCJtZXRob2QiLCJzZW50IiwianNvbiIsImhhbmRsZURlbGV0ZUFnZW50RnJvbU15QWdlbnRzIiwiaXNNYWlha2VyQ3JlYXRvckhvbWUiLCJtb2RhbFBhbmVsIiwiY2hpbGRyZW4iLCJvbkdvVG9DaGF0Iiwib25FcnJvciIsImhhbmRsZUdvVG9Ib21lIiwiaGFuZGxlU2V0UmVmZXRjaENoYXRzIiwiYWdlbnRzTmF2QWN0aXZlIiwiaXNMZWdhY3lDb250ZXh0U2Vzc2lvbiIsImZsb2F0aW5nIiwib25MYXlvdXRNb2RlQ2hhbmdlIiwiZHJhZ2dhYmxlIiwib25EcmFnU3RhcnQiLCJvbkRyYWdNb3ZlIiwib25EcmFnRW5kIiwiaGFzTW9yZSIsImhhc19tb3JlIiwib25BZ2VudFVwZGF0ZSIsImlzTWFpYWtlclNlY3Rpb24iLCJvbkJhY2siLCJyZWZzIiwib25TZW5kTWVzc2FnZVJlYWR5IiwibG9hZGluZ0FnZW50cyIsIm9uRGVsZXRlQWdlbnQiLCJvbkZhdm9yaXRlQWdlbnRVcGRhdGUiLCJoYXNNb3JlQWdlbnRzIiwibG9hZGluZ01vcmVBZ2VudHMiLCJvbkxvYWRNb3JlQWdlbnRzIiwib25Hb1RvTWFpYWtlciIsIm9uRGVsZXRlU2tpbGwiLCJvblNlYXJjaEFnZW50cyIsInNlYXJjaExvYWRpbmdBZ2VudHMiLCJvblJlc3RhcnRTdW1tYXJ5IiwiaGFuZGxlU3RvcEdlbmVyYXRpb24iLCJjaGF0SWQiLCJvbkNvbnRpbnVlSW5OZXdDaGF0IiwicmVmIiwiY3JlYXRlUG9ydGFsIiwiZWxldmF0ZWQiLCIkbWluaW1pemVkIiwiJGhpZGRlbiIsInRpbHQiLCJvblJlc3RvcmUiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9tb2xlY3VsZXMvQ2hhdEFJTW9kYWwvQ2hhdEFJTW9kYWwudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLW5lc3RlZC10ZXJuYXJ5ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvaW5kZW50ICovXG4vKiBlc2xpbnQtZGlzYWJsZSByZWFjdC9qc3gtbm8tdXNlbGVzcy1mcmFnbWVudCAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuLyogZXNsaW50LWRpc2FibGUgcmVhY3Qvbm8tYXJyYXktaW5kZXgta2V5ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBqc3gtYTExeS9jbGljay1ldmVudHMtaGF2ZS1rZXktZXZlbnRzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBqc3gtYTExeS9uby1zdGF0aWMtZWxlbWVudC1pbnRlcmFjdGlvbnMgKi9cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0L2Z1bmN0aW9uLWNvbXBvbmVudC1kZWZpbml0aW9uICovXG4vKiBlc2xpbnQtZGlzYWJsZSByZWFjdC9yZXF1aXJlLWRlZmF1bHQtcHJvcHMgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbmltcG9ydCB7XG4gIHVzZUNhbGxiYWNrLFxuICB1c2VNZW1vLFxuICB1c2VTdGF0ZSxcbiAgdXNlUmVmLFxuICB1c2VFZmZlY3QsXG4gIHVzZUxheW91dEVmZmVjdCxcbiAgUG9pbnRlckV2ZW50IGFzIFJlYWN0UG9pbnRlckV2ZW50LFxufSBmcm9tICdyZWFjdCdcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nXG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCdcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSAncmVhY3QtaTE4bmV4dCdcbmltcG9ydCB7IHVzZVVzZXIgfSBmcm9tICcuLi8uLi8uLi9jb250ZXh0L2Nvci11c2VyJ1xuaW1wb3J0IHsgY2FuQWNjZXNzVG9DaGF0QUksIGNhbkFjY2Vzc1RvU2tpbGxzIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzL3Blcm1pc3Npb25zJ1xuaW1wb3J0IHsgTUFJQUVycm9yIH0gZnJvbSAnLi4vLi4vYXRvbXMvTUFJQUVycm9yJ1xuaW1wb3J0IHsgdXNlTWFpYVRhc2tQYW5lbFpJbmRleCB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZU1haWFUYXNrUGFuZWxaSW5kZXgnXG5cbmltcG9ydCB7IENoYXRBSUNvbnRlbnQgfSBmcm9tICcuLi9DaGF0QUlDb250ZW50J1xuaW1wb3J0IHsgYnVpbGRIYW5kbGVycywgb3B0aW9ucyB9IGZyb20gJy4vY29uc3RhbnRzJ1xuaW1wb3J0IHsgU2lkZWJhciB9IGZyb20gJy4uL1NpZGViYXInXG5pbXBvcnQgeyB1c2VHZXRBZ2VudHMgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tYWlhL0FnZW50cy9nZXRBZ2VudHMnXG5pbXBvcnQgeyB1c2VHZXRTa2lsbHMgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tYWlhL1NraWxscy9nZXRTa2lsbHMnXG5pbXBvcnQgeyB1c2VHbG9iYWxDb250ZXh0LCB0eXBlIFNlY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9jb250ZXh0L2dsb2JhbC1jb250ZXh0J1xuaW1wb3J0IHsgQXR0YWNobWVudEZpbGUgfSBmcm9tICcuLi9DaGF0Rm9vdGVyL0NoYXRGb290ZXInXG5pbXBvcnQgeyBDb250ZXh0TWVudGlvbiB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL2NvbnRleHRNZW50aW9uJ1xuaW1wb3J0IHsgQ2hhdEFJTW9kYWxIZWFkZXIgfSBmcm9tICcuL2NvbXBvbmVudHMvQ2hhdEFpTW9kYWxIZWFkZXIvQ2hhdEFpTW9kYWxIZWFkZXInXG5pbXBvcnQgeyBTbmFja2JhciB9IGZyb20gJy4uLy4uL29yZ2FuaXNtcy9TbmFja0Jhci9TbmFja2JhcidcbmltcG9ydCB7IFByb2plY3RTdW1tYXJ5Q29udGVudCB9IGZyb20gJy4uL1Byb2plY3RTdW1tYXJ5Q29udGVudCdcbmltcG9ydCB7IEFibUFnZW50TW9kYWwgfSBmcm9tICcuLi8uLi9vcmdhbmlzbXMvQWJtQWdlbnRNb2RhbC9BYm1BZ2VudE1vZGFsJ1xuaW1wb3J0IHsgQWJtU2tpbGxNb2RhbCwgU0tJTExfVVNFX0FGVEVSX1NBVkVfRVZFTlQgfSBmcm9tICcuLi8uLi9vcmdhbmlzbXMvQWJtU2tpbGxNb2RhbC9BYm1Ta2lsbE1vZGFsJ1xuaW1wb3J0IHsgQWJtU2tpbGxHZW5lcmF0ZU1vZGFsIH0gZnJvbSAnLi4vLi4vb3JnYW5pc21zL0FibVNraWxsR2VuZXJhdGVNb2RhbC9BYm1Ta2lsbEdlbmVyYXRlTW9kYWwnXG5pbXBvcnQgeyBTRUNUSU9OUyB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy9jb25maWcnXG5pbXBvcnQgeyBTQ0NBSU1Db250ZW50LCBTQ0NBSU1Db250ZW50V3JhcHBlciwgU0NDQUlNTWluaW1pemVkSGlkZSwgU0NDQUlNV3JhcHBlciB9IGZyb20gJy4vQ2hhdEFJTW9kYWwuc3R5bGVzJ1xuaW1wb3J0IHsgTWFpYU1pbmltaXplZFBpbGwgfSBmcm9tICcuL2NvbXBvbmVudHMvTWFpYU1pbmltaXplZFBpbGwnXG5pbXBvcnQge1xuICBnZXRNYWlhRmxvYXRpbmdQYW5lbFdpZHRoUHgsXG4gIE1haWFDaGF0TW9kYWxMYXlvdXRNb2RlLFxuICByZXNvbHZlSW5pdGlhbE1haWFDaGF0TGF5b3V0TW9kZSxcbiAgc2V0U3RvcmVkTWFpYUNoYXRMYXlvdXRNb2RlLFxufSBmcm9tICcuL2xheW91dCdcbmltcG9ydCB7IEZsb2F0aW5nUGFuZWxNb3Rpb24sIHVzZUZsb2F0aW5nUGFuZWxEcmFnVGlsdCB9IGZyb20gJy4vZmxvYXRpbmdQYW5lbE1vdGlvbidcbmltcG9ydCB7IENoYXRBaU1vZGFsRm9vdGVyIH0gZnJvbSAnLi9jb21wb25lbnRzL0NoYXRBaU1vZGFsRm9vdGVyJ1xuaW1wb3J0IHsgdmFsaWRhdGVJc01haWEgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy91dGlscy92YWxpZGF0ZUlzTWFpYSdcbmltcG9ydCB7IGlzTWFya2V0cGxhY2VHbG9iYWxDbG9uZUFnZW50IH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvYWdlbnREaXNwbGF5TmFtZSdcbmltcG9ydCB7IEFnZW50IH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvYWdlbnQnXG5pbXBvcnQgeyBTa2lsbCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL3NraWxsJ1xuaW1wb3J0IHsgUHJvamVjdCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL1Byb2plY3QnXG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9DbGllbnQnXG5pbXBvcnQgeyBUYXNrIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvVGFzaydcbmltcG9ydCB7IHVzZUZhcXNTdG9yZSB9IGZyb20gJy4uLy4uLy4uL3N0b3JlL3VzZUZhcXNTdG9yZSdcbmltcG9ydCB7IGdldENoYXRzU3RvcmVTdGF0ZSwgdXNlQ2hhdHNTdG9yZSB9IGZyb20gJy4uLy4uLy4uL3N0b3JlL3VzZUNoYXRzU3RvcmUnXG5pbXBvcnQgdHlwZSB7IENoYXRMaXN0SXRlbSB9IGZyb20gJy4uLy4uLy4uL3N0b3JlL2NoYXRzU3RvcmUudHlwZXMnXG5pbXBvcnQgeyByZWFkTGFzdEFjdGl2ZUNoYXRJZCwgd3JpdGVMYXN0QWN0aXZlQ2hhdElkIH0gZnJvbSAnLi4vLi4vLi4vc3RvcmUvbWFpYUxhc3RDaGF0UGVyc2lzdGVuY2UnXG5pbXBvcnQgeyB1c2VTZXNzaW9uc1N0b3JlIH0gZnJvbSAnLi4vLi4vLi4vc3RvcmUvc2Vzc2lvbnMvdXNlU2Vzc2lvbnNTdG9yZSdcbmltcG9ydCB7IGlzQWN0aXZlU2Vzc2lvblN0YXR1cyB9IGZyb20gJy4uLy4uLy4uL3N0b3JlL3Nlc3Npb25zL3Nlc3Npb25zLnR5cGVzJ1xuaW1wb3J0IHsgZmV0Y2hNYWlhIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbWFpYS9jbGllbnQnXG5pbXBvcnQgeyBtYXBDT1JMYW5nIH0gZnJvbSAnLi4vLi4vLi4vbGFuZy91dGlscydcbmltcG9ydCB7IEVWRU5UUywgdXNlRXZlbnQgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VFdmVudCdcbmltcG9ydCB7IE1BSUFfT1BFTl9GUk9NX0hPU1RfRVZFTlQsIHR5cGUgTWFpYUhvc3RPcGVuRGV0YWlsIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvbWFpYUhvc3RPcGVuJ1xuXG4vKiogTWV0YWRhdGEgZGUgbGEgc2Vzc2lvbiBhYmllcnRhIChlbWl0aWRhIHBvciB1c2VDaGF0TWVzc2FnZXMgYWwgY2FyZ2FyIHVuYSBjb252ZXJzYWNpw7NuKS4gKi9cbnR5cGUgU2Vzc2lvbk1ldGEgPSB7XG4gIGNoYXRJZDogc3RyaW5nXG4gIGFnZW50VHlwZT86IHN0cmluZ1xuICBhZ2VudEVudGl0eT86IHN0cmluZ1xuICBwcm9qZWN0SWQ/OiBudW1iZXJcbiAgcHJvamVjdE5hbWU/OiBzdHJpbmdcbiAgY2xpZW50SWQ/OiBudW1iZXJcbiAgY2xpZW50TmFtZT86IHN0cmluZ1xuICB0YXNrSWQ/OiBudW1iZXJcbiAgdGFza05hbWU/OiBzdHJpbmdcbn1cblxuY29uc3QgTEVHQUNZX0NPTlRFWFRfRU5USVRJRVMgPSBbJ3Byb2plY3QnLCAndGFzaycsICdjbGllbnQnXSBhcyBjb25zdFxudHlwZSBMZWdhY3lDb250ZXh0RW50aXR5ID0gKHR5cGVvZiBMRUdBQ1lfQ09OVEVYVF9FTlRJVElFUylbbnVtYmVyXVxuXG50eXBlIEFpQ2hhdEJhY2tEZXN0aW5hdGlvbiA9ICdnbG9iYWxfY29udGV4dF9ob21lJyB8ICd0YXNrX2hvbWUnIHwgJ3BsYW5uZXJfaG9tZScgfCAncHJvamVjdF9ob21lJyB8ICdjbGllbnRfaG9tZSdcblxuLyoqIEhvbWUgZ2xvYmFsIGRlbCBvcmNoZXN0cmF0b3IgKHNvbG8gaGVhZGVyKS4gUGxhbm5lciBlcyBob21lIGRlIEZVQXMsIG5vIGRlIGNvbnRleHRvcy4gKi9cbmNvbnN0IGlzR2xvYmFsTWFpYVNlY3Rpb24gPSAoc2VjdGlvbjogU2VjdGlvbik6IGJvb2xlYW4gPT4gc2VjdGlvbiA9PT0gJ2hlYWRlcidcblxuY29uc3QgcmVzb2x2ZUFpQ2hhdEJhY2tEZXN0aW5hdGlvbiA9IChcbiAgc2VjdGlvbjogU2VjdGlvbixcbiAgYWdlbnRUeXBlOiBBZ2VudFsndHlwZSddIHwgdW5kZWZpbmVkLFxuICBjdXJyZW50T3B0aW9uOiBzdHJpbmcsXG4gIGhvbWVPcHRpb246IHN0cmluZ1xuKTogQWlDaGF0QmFja0Rlc3RpbmF0aW9uID0+IHtcbiAgaWYgKGlzR2xvYmFsTWFpYVNlY3Rpb24oc2VjdGlvbikgJiYgYWdlbnRUeXBlID09PSAnb3JjaGVzdHJhdG9yJyAmJiBjdXJyZW50T3B0aW9uID09PSBob21lT3B0aW9uKSB7XG4gICAgcmV0dXJuICdnbG9iYWxfY29udGV4dF9ob21lJ1xuICB9XG4gIGlmIChzZWN0aW9uID09PSAndGFzaycpIHJldHVybiAndGFza19ob21lJ1xuICBpZiAoc2VjdGlvbiA9PT0gJ3BsYW5uZXInKSByZXR1cm4gJ3BsYW5uZXJfaG9tZSdcbiAgaWYgKHNlY3Rpb24gPT09ICdwcm9qZWN0JykgcmV0dXJuICdwcm9qZWN0X2hvbWUnXG4gIGlmIChzZWN0aW9uID09PSAnY2xpZW50JykgcmV0dXJuICdjbGllbnRfaG9tZSdcbiAgcmV0dXJuICdnbG9iYWxfY29udGV4dF9ob21lJ1xufVxuXG5leHBvcnQgY29uc3QgSURfTU9EQUxfQ0hBVF9BR0VOVCA9ICdtb2RhbHMtcG9ydGFsLW1haWEtY2hhdC1hZ2VudCdcblxuY29uc3QgdmFsaWRhdGVBY2Nlc3NCeUZlYXR1cmUgPSAoc2VjdGlvbjogU2VjdGlvbiB8IG51bGwgfCB1bmRlZmluZWQsIHVzZXI6IFJldHVyblR5cGU8dHlwZW9mIHVzZVVzZXI+KSA9PiB7XG4gIGlmICghc2VjdGlvbiB8fCAhY2FuQWNjZXNzVG9DaGF0QUkodXNlcikpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIFBsYW5uZXIgeSB0YXNrIGFicmVuIHNpZW1wcmUgZWwgY2hhdCAoaG9tZSBkZSBGVUFzKSwgbnVuY2EgcmVzdW1lbiBkZSBwcm95ZWN0b3MuXG4gIGlmIChzZWN0aW9uID09PSAncGxhbm5lcicgfHwgc2VjdGlvbiA9PT0gJ3Rhc2snKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmIChzZWN0aW9uID09PSAnaGVhZGVyJykge1xuICAgIHJldHVybiBCb29sZWFuKHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MgfHwgd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMpXG4gIH1cblxuICByZXR1cm4gQm9vbGVhbih3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTKVxufVxuXG5leHBvcnQgY29uc3QgQ2hhdEFJTW9kYWwgPSAoKSA9PiB7XG4gIGNvbnN0IHVzZXIgPSB1c2VVc2VyKClcbiAgY29uc3QgeyBpMThuIH0gPSB1c2VUcmFuc2xhdGlvbihbU0VDVElPTlMuYWJtQWdlbnRdKVxuICBjb25zdCBhbXBsaXR1ZEV2ZW50ID0gdXNlRXZlbnQoKVxuXG4gIC8vIE1BSUEgdml2ZSBtb250YWRhIGVuIHRvZGFzIGxhcyBwYW50YWxsYXM6IGVsIHBhbmVsIGFycmFuY2Egc2llbXByZSBjZXJyYWRvIChwaWxsIHZpc2libGUpXG4gIC8vIHkgc8OzbG8gc2UgYWJyZSBwb3IgYWNjacOzbiBkZWwgdXN1YXJpbyDigJQgbmF2ZWdhciBvIHJlZnJlc2NhciBubyBsbyByZWFicmUuXG4gIGNvbnN0IFtpc01pbmltaXplZCwgc2V0SXNNaW5pbWl6ZWRdID0gdXNlU3RhdGUodHJ1ZSlcbiAgY29uc3Qgc2V0Q2hhdFZpZXdWaXNpYmxlID0gdXNlQ2hhdHNTdG9yZShzdGF0ZSA9PiBzdGF0ZS5zZXRDaGF0Vmlld1Zpc2libGUpXG4gIGNvbnN0IHVucmVhZENvdW50ID0gdXNlQ2hhdHNTdG9yZShzdGF0ZSA9PiBzdGF0ZS51bnJlYWRDb3VudClcbiAgY29uc3QgYWN0aXZlQ2hhdElkID0gdXNlQ2hhdHNTdG9yZShzdGF0ZSA9PiBzdGF0ZS5hY3RpdmVDaGF0SWQpXG4gIC8vIExvcyBcIi4uLlwiIGRlbCBwaWxsIHNhbGVuIGRlbCBtb3Rvciwgbm8gZGUgaXNTdHJlYW1pbmcvaXNXcml0aW5nOiBlc29zIHJlZmxlamFuXG4gIC8vIGxhIHNlc2nDs24gYWN0aXZhIHkgcXVlZGFuIHN0YWxlIGN1YW5kbyB1bmEgcmVzcHVlc3RhIHRlcm1pbmEgZW4gYmFja2dyb3VuZC5cbiAgY29uc3QgaGFzQWN0aXZlU3RyZWFtID0gdXNlU2Vzc2lvbnNTdG9yZShzdGF0ZSA9PlxuICAgIE9iamVjdC52YWx1ZXMoc3RhdGUubWV0YSkuc29tZShtZXRhID0+IGlzQWN0aXZlU2Vzc2lvblN0YXR1cyhtZXRhLnN0YXR1cykpXG4gIClcblxuICAvKiogZ29Ub0NoYXQgLyBoYW5kbGVHb0hvbWUgc2UgZGVmaW5lbiBtw6FzIGFiYWpvOyBsb3MgcmVmcyBldml0YW4gZGVwZW5kZXIgZGVsIG9yZGVuIGRlIGRlY2xhcmFjacOzbi4gKi9cbiAgY29uc3QgZ29Ub0NoYXRSZWYgPSB1c2VSZWY8KChjaGF0OiBDaGF0TGlzdEl0ZW0pID0+IHZvaWQpIHwgbnVsbD4obnVsbClcbiAgY29uc3QgZ29Ib21lUmVmID0gdXNlUmVmPCgoKSA9PiB2b2lkKSB8IG51bGw+KG51bGwpXG5cbiAgLy8gTW9udGEgY2VycmFkYTogZWwgY2hhdCBubyBlc3TDoSBhIGxhIHZpc3RhLCBhc8OtIHF1ZSBsYXMgcmVzcHVlc3RhcyBxdWUgbGxlZ3VlblxuICAvLyB0aWVuZW4gcXVlIHF1ZWRhciBjb21vIG5vIGxlw61kYXMuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgc2V0Q2hhdFZpZXdWaXNpYmxlKGZhbHNlKVxuICAgIC8vIFPDs2xvIGFsIG1vbnRhcjogZGVzcHXDqXMgbG8gbWFuZWphbiBtaW5pbWl6YXIvcmVzdGF1cmFyLlxuICB9LCBbXSlcblxuICAvLyBQZXJzaXN0aW1vcyBsYSBjb252ZXJzYWNpw7NuIGFiaWVydGEgcGFyYSBwb2RlciB2b2x2ZXIgYSBlbGxhIGRlc2RlIGVsIHBpbGwgZGVzcHXDqXNcbiAgLy8gZGUgbmF2ZWdhciBvIHJlZnJlc2Nhci4gRWwgdGFrZW92ZXIgZGVzZGUgdW4gaG9zdCBsYSBsaW1waWEgKHZhIGFsIEhvbWUpLlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChhY3RpdmVDaGF0SWQpIHtcbiAgICAgIHdyaXRlTGFzdEFjdGl2ZUNoYXRJZCh1c2VyLmlkLCBhY3RpdmVDaGF0SWQpXG4gICAgfVxuICB9LCBbYWN0aXZlQ2hhdElkLCB1c2VyLmlkXSlcblxuICBjb25zdCBoYW5kbGVNaW5pbWl6ZSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBhbXBsaXR1ZEV2ZW50KEVWRU5UUy5haUNoYXRNaW5pbWl6ZSlcbiAgICBzZXRJc01pbmltaXplZCh0cnVlKVxuICAgIHNldENoYXRWaWV3VmlzaWJsZShmYWxzZSlcbiAgfSwgW2FtcGxpdHVkRXZlbnQsIHNldENoYXRWaWV3VmlzaWJsZV0pXG5cbiAgY29uc3QgZm9jdXNDaGF0SW5wdXQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ21haWEtaW5wdXQtcmVmb2N1cycpKVxuICAgIH0sIDEwMClcbiAgfSwgW10pXG5cbiAgY29uc3QgW3VzZXJJbml0aWFsTWVzc2FnZSwgc2V0VXNlckluaXRpYWxNZXNzYWdlXSA9IHVzZVN0YXRlPHtcbiAgICBtZXNzYWdlOiBzdHJpbmdcbiAgICBhdHRhY2htZW50czogQXR0YWNobWVudEZpbGVbXVxuICAgIGZhcUlkPzogc3RyaW5nXG4gICAgYWdlbnRTdWdnZXN0aW9uSWQ/OiBzdHJpbmdcbiAgICBtZW50aW9ucz86IENvbnRleHRNZW50aW9uW11cbiAgICBmdWFJZD86IHN0cmluZ1xuICAgIHNjSWQ/OiBzdHJpbmdcbiAgICBjb250ZXh0RGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIH0+KHtcbiAgICBtZXNzYWdlOiAnJyxcbiAgICBhdHRhY2htZW50czogW10sXG4gIH0pXG4gIGNvbnN0IFtpbml0aWFsQ2hhdElkLCBzZXRJbml0aWFsQ2hhdElkXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IFtuZXdDaGF0S2V5LCBzZXROZXdDaGF0S2V5XSA9IHVzZVN0YXRlKDApXG4gIGNvbnN0IFtzZXNzaW9uTWV0YSwgc2V0U2Vzc2lvbk1ldGFdID0gdXNlU3RhdGU8U2Vzc2lvbk1ldGEgfCBudWxsPihudWxsKVxuICBjb25zdCBbc2VuZE1lc3NhZ2VGdW5jdGlvbiwgc2V0U2VuZE1lc3NhZ2VGdW5jdGlvbl0gPSB1c2VTdGF0ZTxcbiAgICB8ICgoXG4gICAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgICAgYXR0YWNobWVudHM/OiBBdHRhY2htZW50RmlsZVtdLFxuICAgICAgICBmYXFJZD86IHN0cmluZyxcbiAgICAgICAgYWdlbnRTdWdnZXN0aW9uSWQ/OiBzdHJpbmcsXG4gICAgICAgIG1lbnRpb25zPzogQ29udGV4dE1lbnRpb25bXSxcbiAgICAgICAgZnVhSWQ/OiBzdHJpbmcsXG4gICAgICAgIHNjSWQ/OiBzdHJpbmdcbiAgICAgICkgPT4gdm9pZClcbiAgICB8IG51bGxcbiAgPihudWxsKVxuICBjb25zdCBbc3RvcEdlbmVyYXRpb25GdW5jdGlvbiwgc2V0U3RvcEdlbmVyYXRpb25GdW5jdGlvbl0gPSB1c2VTdGF0ZTwoKCkgPT4gdm9pZCkgfCBudWxsPihudWxsKVxuICBjb25zdCBbaXNTdHJlYW1pbmcsIHNldElzU3RyZWFtaW5nXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbaXNXcml0aW5nLCBzZXRJc1dyaXRpbmddID0gdXNlU3RhdGUoZmFsc2UpXG5cbiAgY29uc3QgW3JlZmV0Y2hDaGF0cywgc2V0UmVmZXRjaENoYXRzXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbY3VycmVudE9wdGlvbiwgc2V0Q3VycmVudE9wdGlvbl0gPSB1c2VTdGF0ZShvcHRpb25zLmhvbWUpXG4gIGNvbnN0IFtoYXNFcnJvciwgc2V0SGFzRXJyb3JdID0gdXNlU3RhdGUoZmFsc2UpXG4gIC8vIEVuIHByb2plY3QvY2xpZW50L3Rhc2s6IGVsIHVzdWFyaW8gcmVpbmljacOzIGVsIGNvbnRleHRvIGRlbCBvcmNoZXN0cmF0b3IgKGxvIGxpbXBpw7MgeSBwYXPDsyBwb3JcbiAgLy8gZWwgc2VsZWN0b3IgZGUgY29udGV4dG9zIHJlY2llbnRlcykuIEhhYmlsaXRhIGVsIGJvdMOzbiBcInZvbHZlclwiIGVuIGVsIGhvbWUgcGFzbyAyIGRlIGVzYXNcbiAgLy8gc2VjY2lvbmVzLiBTZSByZXNldGVhIGFsIGNlcnJhci9yZWFicmlyIGVsIG1vZGFsIChlbCBjb21wb25lbnRlIHNlIGRlc21vbnRhKS5cbiAgY29uc3QgW2RpZFJlc2V0Q29udGV4dEluU2VjdGlvbiwgc2V0RGlkUmVzZXRDb250ZXh0SW5TZWN0aW9uXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBwcmV2SGFzUGlubmVkQ29udGV4dFJlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgaGFuZGxlcnMgPSB1c2VNZW1vKCgpID0+IGJ1aWxkSGFuZGxlcnMoc2V0Q3VycmVudE9wdGlvbiwgc2V0SGFzRXJyb3IpLCBbXSlcbiAgY29uc3QgW3NpZGViYXJIYXNFcnJvciwgc2V0U2lkZWJhckhhc0Vycm9yXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCByZXNldFNlbGVjdGVkQ2hhdFJlZiA9IHVzZVJlZjwoKCkgPT4gdm9pZCkgfCBudWxsPihudWxsKVxuICBjb25zdCBsYW5nID0gaTE4bi5sYW5ndWFnZSA9PT0gJ2JyJyA/ICdwdC1icicgOiBpMThuLmxhbmd1YWdlXG5cbiAgbW9tZW50LmxvY2FsZShsYW5nKVxuXG4gIGNvbnN0IHtcbiAgICBzZWxlY3RBZ2VudCxcbiAgICBjbGVhckFnZW50LFxuICAgIHNlY3Rpb24sXG4gICAgYWdlbnQsXG4gICAgcHJvamVjdCxcbiAgICBjbGllbnQsXG4gICAgdGFzayxcbiAgICBjaGlwc1Byb2plY3QsXG4gICAgdG9nZ2xlV2ViU2VhcmNoLFxuICAgIGlzV2ViU2VhcmNoQWN0aXZlLFxuICAgIHNldENoaXBzUHJvamVjdCxcbiAgICBzZXRDbGllbnQsXG4gICAgc2V0UHJvamVjdCxcbiAgICBiYW5uZXJFbnRyeUZhcSxcbiAgICBzZXRUYXNrLFxuICB9ID0gdXNlR2xvYmFsQ29udGV4dCgpXG5cbiAgLy8gWi1pbmRleCBwYXJhIHRvb2x0aXBzIGVuIHNlY3Rpb24gJ3Rhc2snIChtb2RhbCBmbG90YW50ZSBlbGV2YWRvKVxuICBjb25zdCB0b29sdGlwWkluZGV4ID0gdXNlTWFpYVRhc2tQYW5lbFpJbmRleCgxNTAwLCAnb3ZlcmxheScpXG5cbiAgY29uc3Qge1xuICAgIGFnZW50cyxcbiAgICBsb2FkaW5nLFxuICAgIGxvYWRpbmdNb3JlLFxuICAgIGVycm9yOiBhZ2VudEVycm9yLFxuICAgIGhhbmRsZUdldEFnZW50cyxcbiAgICBsb2FkTW9yZUFnZW50cyxcbiAgICBzZWFyY2hDdXN0b21BZ2VudHMsXG4gICAgc2VhcmNoTG9hZGluZyxcbiAgICBhZGRBZ2VudCxcbiAgICByZW1vdmVBZ2VudCxcbiAgICB1cGRhdGVBZ2VudCxcbiAgICB1cGRhdGVBZ2VudEZhdm9yaXRlLFxuICAgIHNlbGVjdEZpcnN0QWdlbnQsXG4gICAgc29ydEFnZW50c0xpc3QsXG4gIH0gPSB1c2VHZXRBZ2VudHMoeyBzZWxlY3RBZ2VudCwgc2VjdGlvbiwgYWdlbnQsIGhhbmRsZUdvSG9tZTogaGFuZGxlcnMuaG9tZSB9KVxuXG4gIGNvbnN0IHtcbiAgICBteVNraWxscyxcbiAgICBzaGFyZWRTa2lsbHMsXG4gICAgbG9hZGluZzogbG9hZGluZ1NraWxscyxcbiAgICBoYW5kbGVHZXRTa2lsbHMsXG4gICAgYWRkU2tpbGwsXG4gICAgdXBkYXRlU2tpbGxJbkxpc3QsXG4gICAgcmVtb3ZlU2tpbGwsXG4gIH0gPSB1c2VHZXRTa2lsbHMoKVxuXG4gIGNvbnN0IGlzTUFJQSA9IHZhbGlkYXRlSXNNYWlhKGFnZW50IGFzIEFnZW50KVxuXG4gIGNvbnN0IHVzZXJIYXNQZXJtaXNzaW9ucyA9XG4gICAgKHVzZXI/LnBlcm1pc3Npb25zPy5haV9hZ2VudHM/LmNyZWF0ZSB8fFxuICAgICAgdXNlcj8ucGVybWlzc2lvbnM/LmFpX2FnZW50cz8uZWRpdCB8fFxuICAgICAgdXNlcj8ucGVybWlzc2lvbnM/LmFpX2FnZW50cz8uZGVsZXRlKSAmJlxuICAgIHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTXG5cbiAgY29uc3QgY29tcHV0ZWRDdXJyZW50T3B0aW9uID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgaXNHbG9iYWxTcGVjaWFsaXN0ID0gaXNNQUlBICYmIGFnZW50Py5lbnRpdHkgPT09ICdnbG9iYWwnXG4gICAgY29uc3QgaXNQcm9qZWN0U3BlY2lhbGlzdCA9IGlzTUFJQSAmJiAoYWdlbnQ/LmVudGl0eSA9PT0gJ3Byb2plY3QnIHx8IGFnZW50Py5lbnRpdHkgPT0gbnVsbClcbiAgICBjb25zdCBpc0NsaWVudFNwZWNpYWxpc3QgPSBpc01BSUEgJiYgYWdlbnQ/LmVudGl0eSA9PT0gJ2NsaWVudCdcbiAgICBjb25zdCBpc01haWFrZXIgPSBpc01hcmtldHBsYWNlR2xvYmFsQ2xvbmVBZ2VudChhZ2VudClcblxuICAgIGlmIChjdXJyZW50T3B0aW9uID09PSBvcHRpb25zLm15QWdlbnRzICYmIHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5teUFnZW50c1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50T3B0aW9uID09PSBvcHRpb25zLm15U2tpbGxzICYmIGNhbkFjY2Vzc1RvU2tpbGxzKHVzZXIpKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5teVNraWxsc1xuICAgIH1cblxuICAgIC8vIEVsIG9yY2hlc3RyYXRvciAoTUFJQSkgbXVlc3RyYSBzdSBob21lIGNvbiBGQVFzL2FjY2lvbmVzIGZyZWN1ZW50ZXM7IGVsIHJlc3RvIGRlXG4gICAgLy8gbG9zIGdsb2JhbCBzcGVjaWFsaXN0cyAoY2xvbmVzIGdsb2JhbGVzIG5vLW1haWFrZXIpIHNpZ3VlbiB5ZW5kbyBkaXJlY3RvIGFsIGNoYXQuXG4gICAgaWYgKGlzR2xvYmFsU3BlY2lhbGlzdCAmJiAhaXNNYWlha2VyICYmIGFnZW50Py50eXBlICE9PSAnb3JjaGVzdHJhdG9yJyAmJiBjdXJyZW50T3B0aW9uID09PSBvcHRpb25zLmhvbWUpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmNoYXRcbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGRTaG93UHJvamVjdFNlbGVjdG9yID0gY3VycmVudE9wdGlvbiAhPT0gb3B0aW9ucy5jaGF0ICYmIGlzUHJvamVjdFNwZWNpYWxpc3QgJiYgIXByb2plY3RcbiAgICBjb25zdCBzaG91bGRTaG93Q2xpZW50U2VsZWN0b3IgPSBjdXJyZW50T3B0aW9uICE9PSBvcHRpb25zLmNoYXQgJiYgaXNDbGllbnRTcGVjaWFsaXN0ICYmICFjbGllbnRcblxuICAgIGlmIChzaG91bGRTaG93UHJvamVjdFNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5wcm9qZWN0U2VsZWN0b3JcbiAgICB9XG4gICAgaWYgKHNob3VsZFNob3dDbGllbnRTZWxlY3Rvcikge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuY2xpZW50U2VsZWN0b3JcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnRPcHRpb25cbiAgfSwgW2N1cnJlbnRPcHRpb24sIHByb2plY3QsIGNsaWVudCwgaXNNQUlBLCBhZ2VudD8uZW50aXR5LCBhZ2VudD8ubmFtZSwgYWdlbnQ/LnR5cGUsIHVzZXJdKVxuXG4gIGNvbnN0IGlzTWFpYWtlckFnZW50U2VsZWN0ZWQgPSB1c2VNZW1vKCgpID0+IGlzTWFya2V0cGxhY2VHbG9iYWxDbG9uZUFnZW50KGFnZW50KSwgW2FnZW50XSlcblxuICBjb25zdCBzaWRlYmFyQWdlbnRzTmF2QWN0aXZlID0gdXNlTWVtbygoKTogJ21haWFrZXInIHwgJ215QWdlbnRzJyB8ICdteVNraWxscycgfCBudWxsID0+IHtcbiAgICBpZiAoY29tcHV0ZWRDdXJyZW50T3B0aW9uID09PSBvcHRpb25zLm15U2tpbGxzKSByZXR1cm4gJ215U2tpbGxzJ1xuICAgIGlmIChjb21wdXRlZEN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMubXlBZ2VudHMpIHJldHVybiAnbXlBZ2VudHMnXG4gICAgaWYgKGlzTWFpYWtlckFnZW50U2VsZWN0ZWQpIHJldHVybiAnbWFpYWtlcidcbiAgICByZXR1cm4gbnVsbFxuICB9LCBbY29tcHV0ZWRDdXJyZW50T3B0aW9uLCBpc01haWFrZXJBZ2VudFNlbGVjdGVkXSlcblxuICAvKiBSZWFjdGl2YXIgY29uIGxhIGZpbGEg4oCcTWlzIGFnZW50ZXPigJ0gZW4gU2lkZWJhcjogbXlBZ2VudHNDb3VudCBwcm9wXG4gIGNvbnN0IHNpZGViYXJNeUFnZW50c0NvdW50ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgcmV0dXJuIGFnZW50cy5kYXRhLmZpbHRlcihcbiAgICAgIGEgPT4gIShhLnR5cGUgPT09ICdvcmNoZXN0cmF0b3InIHx8IChhLnR5cGUgPT09ICdjbG9uZScgJiYgYS5lbnRpdHkgPT09ICdnbG9iYWwnICYmIC8obWFpYWtlcnxtYXJrZXRwbGFjZSkvaS50ZXN0KGEubmFtZSB8fCAnJykpKVxuICAgIClcbiAgICAgIC5sZW5ndGhcbiAgfSwgW2FnZW50cy5kYXRhXSlcbiAgKi9cblxuICBjb25zdCBhZ2VudHNGZXRjaGVkUmVmID0gdXNlUmVmKGZhbHNlKVxuXG4gIGNvbnN0IHNlbGVjdG9yID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7SURfTU9EQUxfQ0hBVF9BR0VOVH1gKVxuXG4gIC8vIFRhc2sgcGFuZWwsIHBsYW5uZXIgeSBiYW5uZXIgZGUgcHJveWVjdG8gYWJyZW4gZW4gZmxvdGFudGUgcG9yIGRlZmF1bHQgKG5vIHRhcGFyIGVsIGNvbnRleHRvIGRldHLDoXMpLlxuICAvLyBGdWVyYSBkZSBlc29zIGNvbnRleHRvcyBzZSByZXNwZXRhIGxhIHByZWZlcmVuY2lhIGd1YXJkYWRhIGVuIGxvY2FsU3RvcmFnZS5cbiAgY29uc3QgW2xheW91dE1vZGUsIHNldExheW91dE1vZGVdID0gdXNlU3RhdGU8TWFpYUNoYXRNb2RhbExheW91dE1vZGU+KCgpID0+XG4gICAgcmVzb2x2ZUluaXRpYWxNYWlhQ2hhdExheW91dE1vZGUoeyBzZWN0aW9uLCBiYW5uZXJFbnRyeUZhcSB9KVxuICApXG5cbiAgY29uc3QgaGFuZGxlTGF5b3V0TW9kZUNoYW5nZSA9IHVzZUNhbGxiYWNrKChtb2RlOiBNYWlhQ2hhdE1vZGFsTGF5b3V0TW9kZSkgPT4ge1xuICAgIHNldFN0b3JlZE1haWFDaGF0TGF5b3V0TW9kZShtb2RlKVxuICAgIHNldExheW91dE1vZGUobW9kZSlcbiAgfSwgW10pXG4gIGNvbnN0IGV4cGFuZGVkID0gbGF5b3V0TW9kZSA9PT0gJ2Z1bGxzY3JlZW4nXG4gIGNvbnN0IGlzRmxvYXRpbmcgPSBsYXlvdXRNb2RlID09PSAnZmxvYXRpbmcnXG4gIGNvbnN0IGNvbnRlbnRXcmFwcGVyUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKVxuICBjb25zdCBbZHJhZ1Bvc2l0aW9uLCBzZXREcmFnUG9zaXRpb25dID0gdXNlU3RhdGU8eyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbD4obnVsbClcbiAgY29uc3QgeyB0aWx0TW90aW9uLCBzdGFydFBvaW50ZXJUcmFja2luZywgc2FtcGxlUG9pbnRlck1vdmUsIGVuZFBvaW50ZXJUcmFja2luZyB9ID1cbiAgICB1c2VGbG9hdGluZ1BhbmVsRHJhZ1RpbHQoaXNGbG9hdGluZylcbiAgY29uc3QgZHJhZ1N0YXRlUmVmID0gdXNlUmVmPHtcbiAgICBwb2ludGVySWQ6IG51bWJlclxuICAgIG9mZnNldFg6IG51bWJlclxuICAgIG9mZnNldFk6IG51bWJlclxuICB9IHwgbnVsbD4obnVsbClcblxuICBjb25zdCBjbGFtcERyYWdQb3NpdGlvbiA9IHVzZUNhbGxiYWNrKCh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IGNvbnRlbnRXcmFwcGVyID0gY29udGVudFdyYXBwZXJSZWYuY3VycmVudFxuICAgIGlmICghY29udGVudFdyYXBwZXIpIHtcbiAgICAgIHJldHVybiB7IHgsIHkgfVxuICAgIH1cblxuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gY29udGVudFdyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICBjb25zdCBvZmZzZXQgPSAxNlxuICAgIGNvbnN0IG1heFggPSBNYXRoLm1heChvZmZzZXQsIHdpbmRvdy5pbm5lcldpZHRoIC0gd2lkdGggLSBvZmZzZXQpXG4gICAgY29uc3QgbWF4WSA9IE1hdGgubWF4KG9mZnNldCwgd2luZG93LmlubmVySGVpZ2h0IC0gaGVpZ2h0IC0gb2Zmc2V0KVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IE1hdGgubWluKE1hdGgubWF4KHgsIG9mZnNldCksIG1heFgpLFxuICAgICAgeTogTWF0aC5taW4oTWF0aC5tYXgoeSwgb2Zmc2V0KSwgbWF4WSksXG4gICAgfVxuICB9LCBbXSlcblxuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChsYXlvdXRNb2RlICE9PSAnZmxvYXRpbmcnKSB7XG4gICAgICBzZXREcmFnUG9zaXRpb24obnVsbClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHNldERyYWdQb3NpdGlvbihwcmV2ID0+IHtcbiAgICAgIGlmIChwcmV2KSB7XG4gICAgICAgIHJldHVybiBjbGFtcERyYWdQb3NpdGlvbihwcmV2LngsIHByZXYueSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhZCA9IDE2XG4gICAgICBjb25zdCB4ID0gd2luZG93LmlubmVyV2lkdGggLSBnZXRNYWlhRmxvYXRpbmdQYW5lbFdpZHRoUHgoKSAtIHBhZFxuICAgICAgcmV0dXJuIGNsYW1wRHJhZ1Bvc2l0aW9uKHgsIHBhZClcbiAgICB9KVxuICB9LCBbbGF5b3V0TW9kZSwgY2xhbXBEcmFnUG9zaXRpb25dKVxuXG4gIGNvbnN0IGhhbmRsZURyYWdFbmQgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQ6IFJlYWN0UG9pbnRlckV2ZW50PEhUTUxEaXZFbGVtZW50PikgPT4ge1xuICAgICAgZW5kUG9pbnRlclRyYWNraW5nKClcbiAgICAgIGlmIChkcmFnU3RhdGVSZWYuY3VycmVudD8ucG9pbnRlcklkICE9PSBldmVudC5wb2ludGVySWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGRyYWdTdGF0ZVJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS51c2VyU2VsZWN0ID0gJydcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gJydcbiAgICB9LFxuICAgIFtlbmRQb2ludGVyVHJhY2tpbmddXG4gIClcblxuICBjb25zdCBoYW5kbGVEcmFnTW92ZSA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudDogUmVhY3RQb2ludGVyRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgICBjb25zdCBkcmFnU3RhdGUgPSBkcmFnU3RhdGVSZWYuY3VycmVudFxuICAgICAgaWYgKCFkcmFnU3RhdGUgfHwgZHJhZ1N0YXRlLnBvaW50ZXJJZCAhPT0gZXZlbnQucG9pbnRlcklkKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBzYW1wbGVQb2ludGVyTW92ZShldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKVxuXG4gICAgICBjb25zdCBuZXh0UG9zaXRpb24gPSBjbGFtcERyYWdQb3NpdGlvbihldmVudC5jbGllbnRYIC0gZHJhZ1N0YXRlLm9mZnNldFgsIGV2ZW50LmNsaWVudFkgLSBkcmFnU3RhdGUub2Zmc2V0WSlcblxuICAgICAgc2V0RHJhZ1Bvc2l0aW9uKHByZXYgPT4ge1xuICAgICAgICBpZiAocHJldiAmJiBwcmV2LnggPT09IG5leHRQb3NpdGlvbi54ICYmIHByZXYueSA9PT0gbmV4dFBvc2l0aW9uLnkpIHtcbiAgICAgICAgICByZXR1cm4gcHJldlxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXh0UG9zaXRpb25cbiAgICAgIH0pXG4gICAgfSxcbiAgICBbY2xhbXBEcmFnUG9zaXRpb24sIHNhbXBsZVBvaW50ZXJNb3ZlXVxuICApXG5cbiAgY29uc3QgcmVzb2x2ZWREcmFnUG9zaXRpb24gPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAobGF5b3V0TW9kZSAhPT0gJ2Zsb2F0aW5nJykge1xuICAgICAgcmV0dXJuIGRyYWdQb3NpdGlvblxuICAgIH1cbiAgICBpZiAoZHJhZ1Bvc2l0aW9uKSB7XG4gICAgICByZXR1cm4gZHJhZ1Bvc2l0aW9uXG4gICAgfVxuICAgIGNvbnN0IHBhZCA9IDE2XG4gICAgY29uc3QgeCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93LmlubmVyV2lkdGggLSBnZXRNYWlhRmxvYXRpbmdQYW5lbFdpZHRoUHgoKSAtIHBhZCA6IHBhZFxuICAgIHJldHVybiBjbGFtcERyYWdQb3NpdGlvbih4LCBwYWQpXG4gIH0sIFtsYXlvdXRNb2RlLCBkcmFnUG9zaXRpb24sIGNsYW1wRHJhZ1Bvc2l0aW9uXSlcblxuICBjb25zdCBoYW5kbGVEcmFnU3RhcnQgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQ6IFJlYWN0UG9pbnRlckV2ZW50PEhUTUxEaXZFbGVtZW50PikgPT4ge1xuICAgICAgaWYgKCFpc0Zsb2F0aW5nIHx8IGV2ZW50LmJ1dHRvbiAhPT0gMCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50XG4gICAgICBpZiAodGFyZ2V0LmNsb3Nlc3QoJ2J1dHRvbiwgYSwgaW5wdXQsIHRleHRhcmVhLCBzZWxlY3QsIFtyb2xlPVwiYnV0dG9uXCJdLCBbZGF0YS1uby1kcmFnPVwidHJ1ZVwiXScpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBjb250ZW50V3JhcHBlciA9IGNvbnRlbnRXcmFwcGVyUmVmLmN1cnJlbnRcbiAgICAgIGlmICghY29udGVudFdyYXBwZXIpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlY3QgPSBjb250ZW50V3JhcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgY29uc3QgaW5pdGlhbFBvc2l0aW9uID0gcmVzb2x2ZWREcmFnUG9zaXRpb24gPz8gY2xhbXBEcmFnUG9zaXRpb24ocmVjdC5sZWZ0LCByZWN0LnRvcClcbiAgICAgIGNvbnN0IHBvaW50ZXJPZmZzZXRYID0gZXZlbnQuY2xpZW50WCAtIGluaXRpYWxQb3NpdGlvbi54XG4gICAgICBjb25zdCBwb2ludGVyT2Zmc2V0WSA9IGV2ZW50LmNsaWVudFkgLSBpbml0aWFsUG9zaXRpb24ueVxuXG4gICAgICBzZXREcmFnUG9zaXRpb24oaW5pdGlhbFBvc2l0aW9uKVxuICAgICAgZHJhZ1N0YXRlUmVmLmN1cnJlbnQgPSB7XG4gICAgICAgIHBvaW50ZXJJZDogZXZlbnQucG9pbnRlcklkLFxuICAgICAgICBvZmZzZXRYOiBwb2ludGVyT2Zmc2V0WCxcbiAgICAgICAgb2Zmc2V0WTogcG9pbnRlck9mZnNldFksXG4gICAgICB9XG5cbiAgICAgIGV2ZW50LmN1cnJlbnRUYXJnZXQuc2V0UG9pbnRlckNhcHR1cmUoZXZlbnQucG9pbnRlcklkKVxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuXG4gICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnVzZXJTZWxlY3QgPSAnbm9uZSdcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gJ2dyYWJiaW5nJ1xuICAgICAgYW1wbGl0dWRFdmVudChFVkVOVFMuYWlDaGF0RHJhZ2dhYmxlKVxuICAgICAgc3RhcnRQb2ludGVyVHJhY2tpbmcoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSlcbiAgICB9LFxuICAgIFtjbGFtcERyYWdQb3NpdGlvbiwgaXNGbG9hdGluZywgcmVzb2x2ZWREcmFnUG9zaXRpb24sIHN0YXJ0UG9pbnRlclRyYWNraW5nXVxuICApXG5cbiAgY29uc3Qgc3RhcnRDaGF0ID0gdXNlQ2FsbGJhY2soXG4gICAgKFxuICAgICAgbWVzc2FnZT86IHN0cmluZyxcbiAgICAgIGF0dGFjaG1lbnRzPzogQXR0YWNobWVudEZpbGVbXSxcbiAgICAgIGZhcUlkPzogc3RyaW5nLFxuICAgICAgYWdlbnRTdWdnZXN0aW9uSWQ/OiBzdHJpbmcsXG4gICAgICBtZW50aW9ucz86IENvbnRleHRNZW50aW9uW10sXG4gICAgICBmdWFJZD86IHN0cmluZyxcbiAgICAgIHNjSWQ/OiBzdHJpbmcsXG4gICAgICBjb250ZXh0RGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKSA9PiB7XG4gICAgICBpZiAoc2lkZWJhckhhc0Vycm9yKSB7XG4gICAgICAgIHNldFNpZGViYXJIYXNFcnJvcihmYWxzZSlcbiAgICAgIH1cbiAgICAgIHNldEluaXRpYWxDaGF0SWQobnVsbClcbiAgICAgIHNldE5ld0NoYXRLZXkocHJldiA9PiBwcmV2ICsgMSlcbiAgICAgIHNldFVzZXJJbml0aWFsTWVzc2FnZSh7XG4gICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UgfHwgJycsXG4gICAgICAgIGF0dGFjaG1lbnRzOiBhdHRhY2htZW50cyB8fCBbXSxcbiAgICAgICAgLi4uKGZhcUlkID8geyBmYXFJZCB9IDoge30pLFxuICAgICAgICAuLi4oYWdlbnRTdWdnZXN0aW9uSWQgPyB7IGFnZW50U3VnZ2VzdGlvbklkIH0gOiB7fSksXG4gICAgICAgIC4uLihtZW50aW9ucyAmJiBtZW50aW9ucy5sZW5ndGggPiAwID8geyBtZW50aW9ucyB9IDoge30pLFxuICAgICAgICAuLi4oZnVhSWQgPyB7IGZ1YUlkIH0gOiB7fSksXG4gICAgICAgIC4uLihzY0lkID8geyBzY0lkIH0gOiB7fSksXG4gICAgICAgIC4uLihjb250ZXh0RGF0YSA/IHsgY29udGV4dERhdGEgfSA6IHt9KSxcbiAgICAgIH0pXG4gICAgICBoYW5kbGVycy5jaGF0KClcbiAgICB9LFxuICAgIFtoYW5kbGVycywgc2lkZWJhckhhc0Vycm9yXVxuICApXG5cbiAgY29uc3QgYmFubmVyRmFxQXV0b1NlbnRSZWYgPSB1c2VSZWYoZmFsc2UpXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBlbnRpdHlSZWFkeSA9IHNlY3Rpb24gPT09ICdwcm9qZWN0JyA/IEJvb2xlYW4ocHJvamVjdD8uaWQpIDogc2VjdGlvbiA9PT0gJ2NsaWVudCcgPyBCb29sZWFuKGNsaWVudD8uaWQpIDogdHJ1ZVxuXG4gICAgaWYgKCFiYW5uZXJFbnRyeUZhcT8uZmFxVGl0bGU/LnRyaW0oKSB8fCBiYW5uZXJGYXFBdXRvU2VudFJlZi5jdXJyZW50IHx8IGxvYWRpbmcgfHwgIWFnZW50Py5pZCB8fCAhZW50aXR5UmVhZHkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGJhbm5lckZhcUF1dG9TZW50UmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgc3RhcnRDaGF0KFxuICAgICAgYmFubmVyRW50cnlGYXEuZmFxVGl0bGUsXG4gICAgICBbXSxcbiAgICAgIGJhbm5lckVudHJ5RmFxLmZhcUlkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgYmFubmVyRW50cnlGYXEuY29udGV4dERhdGFcbiAgICApXG4gIH0sIFtcbiAgICBiYW5uZXJFbnRyeUZhcT8uZmFxSWQsXG4gICAgYmFubmVyRW50cnlGYXE/LmZhcVRpdGxlLFxuICAgIGJhbm5lckVudHJ5RmFxPy5jb250ZXh0RGF0YSxcbiAgICBsb2FkaW5nLFxuICAgIGFnZW50Py5pZCxcbiAgICBhZ2VudD8uZW50aXR5LFxuICAgIHByb2plY3Q/LmlkLFxuICAgIGNsaWVudD8uaWQsXG4gICAgc2VjdGlvbixcbiAgICBzdGFydENoYXQsXG4gIF0pXG5cbiAgY29uc3QgZ29Ub0NoYXQgPSB1c2VDYWxsYmFjayhcbiAgICAoY2hhdDogYW55KSA9PiB7XG4gICAgICBzZXRVc2VySW5pdGlhbE1lc3NhZ2UoeyBtZXNzYWdlOiAnJywgYXR0YWNobWVudHM6IFtdIH0pXG4gICAgICBzZXRJbml0aWFsQ2hhdElkKGNoYXQuc2Vzc2lvbkV4dGVybmFsSWQpXG4gICAgICBjb25zdCBzZWxlY3RlZEFnZW50ID0gYWdlbnRzLmRhdGEuZmluZChhZ2VudEl0ZW0gPT4gYWdlbnRJdGVtLmlkID09PSBjaGF0LmFnZW50SWQpXG4gICAgICBpZiAoc2VsZWN0ZWRBZ2VudCkge1xuICAgICAgICBzZWxlY3RBZ2VudChzZWxlY3RlZEFnZW50KVxuICAgICAgfVxuICAgICAgLy8gRGlzcGF0Y2ggZXZlbnQgdG8gY2xlYXIgdGhlIGlucHV0IHRleHRhcmVhXG4gICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnY2hhdC1zZXNzaW9uLWNoYW5nZWQnKSlcbiAgICAgIGhhbmRsZXJzLmNoYXQoKVxuICAgIH0sXG4gICAgW2hhbmRsZXJzLCBhZ2VudHMsIHNlbGVjdEFnZW50XVxuICApXG5cbiAgZ29Ub0NoYXRSZWYuY3VycmVudCA9IGdvVG9DaGF0XG5cbiAgLyoqIExvcyBhZ2VudGVzIHNlIHBpZGVuIHJlY2nDqW4gYWwgYWJyaXIgZWwgcGFuZWw6IGVuIG1vZG8gcGlsbCBubyBoYWNlIGZhbHRhIG5pbmd1bmEgcmVxdWVzdC4gKi9cbiAgY29uc3QgZW5zdXJlQWdlbnRzTG9hZGVkID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIGlmIChhZ2VudHNGZXRjaGVkUmVmLmN1cnJlbnQpIHJldHVyblxuICAgIGFnZW50c0ZldGNoZWRSZWYuY3VycmVudCA9IHRydWVcbiAgICBhd2FpdCBoYW5kbGVHZXRBZ2VudHMoKVxuICB9LCBbaGFuZGxlR2V0QWdlbnRzXSlcblxuICBjb25zdCBoYW5kbGVSZXN0b3JlRnJvbU1pbmltaXplZCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRJc01pbmltaXplZChmYWxzZSlcbiAgICBzZXRDaGF0Vmlld1Zpc2libGUodHJ1ZSlcbiAgICBhbXBsaXR1ZEV2ZW50KEVWRU5UUy5haUNoYXRPcGVuLCB7IG9wdGlvbjogJ21pbmltaXplJyB9KVxuXG4gICAgLy8gZ29Ub0NoYXQgbmVjZXNpdGEgbGEgbGlzdGEgZGUgYWdlbnRlcyBwYXJhIHNlbGVjY2lvbmFyIGVsIGRlIGxhIGNvbnZlcnNhY2nDs24uXG4gICAgZW5zdXJlQWdlbnRzTG9hZGVkKCkudGhlbigoKSA9PiB7XG4gICAgICAvLyBQcmlvcmlkYWQgYWwgcmVhYnJpcjogcHJpbWVyIGNoYXQgc2luIGxlZXIg4oaSIMO6bHRpbWEgY29udmVyc2FjacOzbiBhYmllcnRhIOKGkiBIb21lLlxuICAgICAgY29uc3QgeyBjaGF0cyB9ID0gZ2V0Q2hhdHNTdG9yZVN0YXRlKClcbiAgICAgIGNvbnN0IGxhc3RBY3RpdmVDaGF0SWQgPSByZWFkTGFzdEFjdGl2ZUNoYXRJZCh1c2VyLmlkKVxuICAgICAgY29uc3QgdGFyZ2V0ID1cbiAgICAgICAgY2hhdHMuZmluZChjaGF0ID0+IGNoYXQuaXNSZWFkID09PSBmYWxzZSkgPz9cbiAgICAgICAgKGxhc3RBY3RpdmVDaGF0SWQgPyBjaGF0cy5maW5kKGNoYXQgPT4gY2hhdC5zZXNzaW9uRXh0ZXJuYWxJZCA9PT0gbGFzdEFjdGl2ZUNoYXRJZCkgOiB1bmRlZmluZWQpXG5cbiAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgZ29Ub0NoYXRSZWYuY3VycmVudD8uKHRhcmdldClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGdvSG9tZVJlZi5jdXJyZW50Py4oKVxuICAgICAgfVxuXG4gICAgICBmb2N1c0NoYXRJbnB1dCgpXG4gICAgfSlcbiAgfSwgW2FtcGxpdHVkRXZlbnQsIGVuc3VyZUFnZW50c0xvYWRlZCwgZm9jdXNDaGF0SW5wdXQsIHNldENoYXRWaWV3VmlzaWJsZSwgdXNlci5pZF0pXG5cbiAgLyoqXG4gICAqIFRvbWEgY29udHJvbCBkZXNkZSB1biBob3N0IChoZWFkZXIsIHByb3llY3RvLCBjbGllbnRl4oCmKTogYWJyZSBlbCBwYW5lbCwgZGVzY2FydGEgbGFcbiAgICogY29udmVyc2FjacOzbiBhYmllcnRhIHkgYXBsaWNhIGVsIGNvbnRleHRvIGRlbCBob3N0LiBOTyB2dWVsdmUgYSBsYSDDumx0aW1hIGNvbnZlcnNhY2nDs25cbiAgICog4oCUIGVzbyBzw7NsbyBsbyBoYWNlIGVsIHBpbGwgKGBoYW5kbGVSZXN0b3JlRnJvbU1pbmltaXplZGApLlxuICAgKi9cbiAgY29uc3QgYXBwbHlFeHBhbmRlZEhvc3RUYWtlb3ZlciA9IHVzZUNhbGxiYWNrKFxuICAgIChkZXRhaWw6IE1haWFIb3N0T3BlbkRldGFpbCkgPT4ge1xuICAgICAgc2V0SXNNaW5pbWl6ZWQoZmFsc2UpXG4gICAgICBzZXRDaGF0Vmlld1Zpc2libGUodHJ1ZSlcbiAgICAgIHdyaXRlTGFzdEFjdGl2ZUNoYXRJZCh1c2VyLmlkLCBudWxsKVxuICAgICAgZW5zdXJlQWdlbnRzTG9hZGVkKClcblxuICAgICAgc2V0SW5pdGlhbENoYXRJZChudWxsKVxuICAgICAgc2V0TmV3Q2hhdEtleShwcmV2ID0+IHByZXYgKyAxKVxuICAgICAgc2V0VXNlckluaXRpYWxNZXNzYWdlKHsgbWVzc2FnZTogJycsIGF0dGFjaG1lbnRzOiBbXSB9KVxuICAgICAgc2V0Q3VycmVudE9wdGlvbihvcHRpb25zLmhvbWUpXG4gICAgICBzZXREaWRSZXNldENvbnRleHRJblNlY3Rpb24oZmFsc2UpXG4gICAgICBzZXRIYXNFcnJvcihmYWxzZSlcbiAgICAgIHNldElzV3JpdGluZyhmYWxzZSlcbiAgICAgIHVzZUZhcXNTdG9yZS5nZXRTdGF0ZSgpLmNsZWFyRmFxcygpXG4gICAgICBiYW5uZXJGYXFBdXRvU2VudFJlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgIHJlc2V0U2VsZWN0ZWRDaGF0UmVmLmN1cnJlbnQ/LigpXG4gICAgICBnZXRDaGF0c1N0b3JlU3RhdGUoKS5zZXRBY3RpdmVDaGF0SWQobnVsbClcbiAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdjaGF0LXNlc3Npb24tY2hhbmdlZCcpKVxuXG4gICAgICBpZiAoZGV0YWlsLnNlY3Rpb24gPT09ICdwcm9qZWN0JyB8fCBkZXRhaWwuc2VjdGlvbiA9PT0gJ3Rhc2snKSB7XG4gICAgICAgIHNldFByb2plY3Q/LihkZXRhaWwucHJvamVjdCA/PyBudWxsKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0UHJvamVjdD8uKG51bGwpXG4gICAgICB9XG5cbiAgICAgIGlmIChkZXRhaWwuc2VjdGlvbiA9PT0gJ2NsaWVudCcpIHtcbiAgICAgICAgc2V0Q2xpZW50Py4oZGV0YWlsLmNsaWVudCA/PyBudWxsKVxuICAgICAgfSBlbHNlIGlmIChkZXRhaWwuc2VjdGlvbiA9PT0gJ2hlYWRlcicgfHwgZGV0YWlsLnNlY3Rpb24gPT09ICdwbGFubmVyJykge1xuICAgICAgICBzZXRDbGllbnQ/LihudWxsKVxuICAgICAgfVxuXG4gICAgICBpZiAoZGV0YWlsLnNlY3Rpb24gPT09ICd0YXNrJykge1xuICAgICAgICBzZXRUYXNrPy4oZGV0YWlsLnRhc2sgPz8gbnVsbClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFRhc2s/LihudWxsKVxuICAgICAgfVxuXG4gICAgICBpZiAoZGV0YWlsLnNlY3Rpb24gPT09ICdoZWFkZXInIHx8IGRldGFpbC5zZWN0aW9uID09PSAncGxhbm5lcicpIHtcbiAgICAgICAgc2V0Q2hpcHNQcm9qZWN0KG51bGwpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5leHRMYXlvdXQgPSByZXNvbHZlSW5pdGlhbE1haWFDaGF0TGF5b3V0TW9kZSh7XG4gICAgICAgIHNlY3Rpb246IGRldGFpbC5zZWN0aW9uIGFzIFNlY3Rpb24sXG4gICAgICAgIGJhbm5lckVudHJ5RmFxOiBkZXRhaWwuZmFxLFxuICAgICAgfSlcbiAgICAgIHNldExheW91dE1vZGUobmV4dExheW91dClcbiAgICAgIHNldERyYWdQb3NpdGlvbihudWxsKVxuXG4gICAgICBmb2N1c0NoYXRJbnB1dCgpXG4gICAgfSxcbiAgICBbZW5zdXJlQWdlbnRzTG9hZGVkLCBmb2N1c0NoYXRJbnB1dCwgc2V0Q2hhdFZpZXdWaXNpYmxlLCBzZXRDaGlwc1Byb2plY3QsIHNldENsaWVudCwgc2V0UHJvamVjdCwgc2V0VGFzaywgdXNlci5pZF1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZVNlbmRNZXNzYWdlUmVhZHkgPSB1c2VDYWxsYmFjayhcbiAgICAoXG4gICAgICBzZW5kTWVzc2FnZTogKFxuICAgICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICAgIGF0dGFjaG1lbnRzPzogQXR0YWNobWVudEZpbGVbXSxcbiAgICAgICAgZmFxSWQ/OiBzdHJpbmcsXG4gICAgICAgIGFnZW50U3VnZ2VzdGlvbklkPzogc3RyaW5nLFxuICAgICAgICBtZW50aW9ucz86IENvbnRleHRNZW50aW9uW10sXG4gICAgICAgIGZ1YUlkPzogc3RyaW5nLFxuICAgICAgICBzY0lkPzogc3RyaW5nXG4gICAgICApID0+IHZvaWQsXG4gICAgICBzdG9wR2VuZXJhdGlvbjogKCkgPT4gdm9pZCxcbiAgICAgIHN0cmVhbWluZzogYm9vbGVhbixcbiAgICAgIHdyaXRpbmc6IGJvb2xlYW5cbiAgICApID0+IHtcbiAgICAgIHNldFNlbmRNZXNzYWdlRnVuY3Rpb24oKCkgPT4gc2VuZE1lc3NhZ2UpXG4gICAgICBzZXRTdG9wR2VuZXJhdGlvbkZ1bmN0aW9uKCgpID0+IHN0b3BHZW5lcmF0aW9uKVxuICAgICAgc2V0SXNTdHJlYW1pbmcoc3RyZWFtaW5nKVxuICAgICAgc2V0SXNXcml0aW5nKHdyaXRpbmcpXG4gICAgfSxcbiAgICBbXVxuICApXG5cbiAgY29uc3QgaGFuZGxlU2VuZE1lc3NhZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAoXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBhdHRhY2htZW50cz86IEF0dGFjaG1lbnRGaWxlW10sXG4gICAgICBmYXFJZD86IHN0cmluZyxcbiAgICAgIGFnZW50U3VnZ2VzdGlvbklkPzogc3RyaW5nLFxuICAgICAgbWVudGlvbnM/OiBDb250ZXh0TWVudGlvbltdLFxuICAgICAgZnVhSWQ/OiBzdHJpbmcsXG4gICAgICBzY0lkPzogc3RyaW5nXG4gICAgKSA9PiB7XG4gICAgICBpZiAoc2lkZWJhckhhc0Vycm9yKSB7XG4gICAgICAgIHNldFNpZGViYXJIYXNFcnJvcihmYWxzZSlcbiAgICAgIH1cbiAgICAgIGlmIChzZW5kTWVzc2FnZUZ1bmN0aW9uICYmIGNvbXB1dGVkQ3VycmVudE9wdGlvbiA9PT0gb3B0aW9ucy5jaGF0KSB7XG4gICAgICAgIHNlbmRNZXNzYWdlRnVuY3Rpb24obWVzc2FnZSwgYXR0YWNobWVudHMsIGZhcUlkLCBhZ2VudFN1Z2dlc3Rpb25JZCwgbWVudGlvbnMsIGZ1YUlkLCBzY0lkKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhcnRDaGF0KG1lc3NhZ2UsIGF0dGFjaG1lbnRzLCBmYXFJZCwgYWdlbnRTdWdnZXN0aW9uSWQsIG1lbnRpb25zLCBmdWFJZCwgc2NJZClcbiAgICAgIH1cbiAgICB9LFxuICAgIFtzZW5kTWVzc2FnZUZ1bmN0aW9uLCBzdGFydENoYXQsIGNvbXB1dGVkQ3VycmVudE9wdGlvbiwgc2lkZWJhckhhc0Vycm9yXVxuICApXG5cbiAgY29uc3QgaGFuZGxlR29Ib21lID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIC8vIFNpIGVzdGFtb3MgZW4gdW5hIGNvbnZlcnNhY2nDs24geSB2YW1vcyBhIGhvbWUsIHJlc2V0ZWFyIGluaXRpYWxDaGF0SWQgeSBpbmNyZW1lbnRhciBuZXdDaGF0S2V5XG4gICAgaWYgKGN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMuY2hhdCkge1xuICAgICAgLy8gTm8gY29ydGFtb3MgbGEgZ2VuZXJhY2nDs246IGxhIHNlc2nDs24gc2lndWUgcmVzcG9uZGllbmRvIGVuIGJhY2tncm91bmQuXG4gICAgICBzZXRJbml0aWFsQ2hhdElkKG51bGwpXG4gICAgICBzZXROZXdDaGF0S2V5KHByZXYgPT4gcHJldiArIDEpXG4gICAgICBzZXRJc1dyaXRpbmcoZmFsc2UpXG4gICAgICAvLyBObyBib3JyYXIgZWwgY2xpZW50ZSBzaSBlcyBhZ2VudGUgZGUgY2xpZW50ZXMgKGlndWFsIHF1ZSBlbCBwcm95ZWN0byBzZSBtYW50aWVuZSlcbiAgICAgIGlmIChhZ2VudD8uZW50aXR5ICE9PSAnY2xpZW50Jykge1xuICAgICAgICBzZXRDbGllbnQ/LihudWxsKVxuICAgICAgfVxuICAgICAgaWYgKHNlY3Rpb24gIT09ICd0YXNrJykge1xuICAgICAgICBzZXRUYXNrPy4obnVsbClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKFxuICAgICAgKCFhZ2VudCB8fCBhZ2VudD8uaXNfZGVsZXRlZCB8fCBhZ2VudD8uaGFzX25vdF9wZXJtaXNzaW9ucyB8fCBhZ2VudD8uaGFzX25vdF9hY2Nlc3MgfHwgYWdlbnQ/LnByb2plY3RfZGVsZXRlZCkgJiZcbiAgICAgIGFnZW50cy5kYXRhLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIHNlbGVjdEFnZW50KGFnZW50cy5kYXRhWzBdKVxuICAgIH1cbiAgICAvLyBPcmNoZXN0cmF0b3IgZW4gaG9tZSBnbG9iYWwgKGhlYWRlci9wbGFubmVyKTogYWwgaW5pY2lhciB1biBjaGF0IG51ZXZvIHNlIGRlYmUgdm9sdmVyIGFsIHBhc28gMVxuICAgIC8vIChsaXN0YSBkZSBjb250ZXh0b3MgcmVjaWVudGVzKSwgcG9yIGxvIHF1ZSBoYXkgcXVlIGxpbXBpYXIgdG9kbyBlbCBjb250ZXh0byBwaW5lYWRvLlxuICAgIGlmIChpc0dsb2JhbE1haWFTZWN0aW9uKHNlY3Rpb24pICYmIGFnZW50Py50eXBlID09PSAnb3JjaGVzdHJhdG9yJykge1xuICAgICAgc2V0UHJvamVjdChudWxsKVxuICAgICAgc2V0Q2xpZW50Py4obnVsbClcbiAgICAgIHNldFRhc2s/LihudWxsKVxuICAgIH1cbiAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMuaG9tZSlcbiAgICBzZXRDaGlwc1Byb2plY3QobnVsbClcbiAgICBzZXRIYXNFcnJvcihmYWxzZSlcbiAgICBpc1dlYlNlYXJjaEFjdGl2ZSAmJiB0b2dnbGVXZWJTZWFyY2goKVxuICAgIGlmIChyZXNldFNlbGVjdGVkQ2hhdFJlZi5jdXJyZW50KSB7XG4gICAgICByZXNldFNlbGVjdGVkQ2hhdFJlZi5jdXJyZW50KClcbiAgICB9XG4gIH0sIFtcbiAgICBvcHRpb25zLmhvbWUsXG4gICAgb3B0aW9ucy5jaGF0LFxuICAgIGN1cnJlbnRPcHRpb24sXG4gICAgaXNXZWJTZWFyY2hBY3RpdmUsXG4gICAgdG9nZ2xlV2ViU2VhcmNoLFxuICAgIGFnZW50LFxuICAgIGFnZW50cyxcbiAgICBzZWxlY3RBZ2VudCxcbiAgICBzZXRQcm9qZWN0LFxuICAgIHNldENsaWVudCxcbiAgICBzZXRUYXNrLFxuICAgIHN0b3BHZW5lcmF0aW9uRnVuY3Rpb24sXG4gICAgc2VjdGlvbixcbiAgXSlcblxuICBnb0hvbWVSZWYuY3VycmVudCA9IGhhbmRsZUdvSG9tZVxuXG4gIGNvbnN0IGhhbmRsZVN0YXJ0TmV3Q2hhdCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBjb25zdCBmcm9tTXlBZ2VudHMgPSBjb21wdXRlZEN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMubXlBZ2VudHNcbiAgICBjb25zdCBmcm9tTWFpYWtlckhvbWUgPSBjb21wdXRlZEN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMuaG9tZSAmJiBpc01haWFrZXJBZ2VudFNlbGVjdGVkXG5cbiAgICBpZiAoZnJvbU15QWdlbnRzIHx8IGZyb21NYWlha2VySG9tZSkge1xuICAgICAgY29uc3QgZmlyc3RBZ2VudCA9IGFnZW50cy5kYXRhWzBdXG4gICAgICBpZiAoZmlyc3RBZ2VudCkge1xuICAgICAgICBzZXRQcm9qZWN0KG51bGwpXG4gICAgICAgIHNldENsaWVudD8uKG51bGwpXG4gICAgICAgIHNldFRhc2s/LihudWxsKVxuICAgICAgICBzZWxlY3RBZ2VudChmaXJzdEFnZW50KVxuICAgICAgfVxuICAgICAgc2V0SW5pdGlhbENoYXRJZChudWxsKVxuICAgICAgc2V0TmV3Q2hhdEtleShwcmV2ID0+IHByZXYgKyAxKVxuICAgICAgc2V0Q3VycmVudE9wdGlvbihvcHRpb25zLmhvbWUpXG4gICAgICBzZXRDaGlwc1Byb2plY3QobnVsbClcbiAgICAgIHNldEhhc0Vycm9yKGZhbHNlKVxuICAgICAgaWYgKGlzV2ViU2VhcmNoQWN0aXZlKSB0b2dnbGVXZWJTZWFyY2goKVxuICAgICAgcmVzZXRTZWxlY3RlZENoYXRSZWYuY3VycmVudD8uKClcbiAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdjaGF0LXNlc3Npb24tY2hhbmdlZCcpKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaGFuZGxlR29Ib21lKClcbiAgfSwgW1xuICAgIGFnZW50cy5kYXRhLFxuICAgIGNvbXB1dGVkQ3VycmVudE9wdGlvbixcbiAgICBoYW5kbGVHb0hvbWUsXG4gICAgaXNNYWlha2VyQWdlbnRTZWxlY3RlZCxcbiAgICBpc1dlYlNlYXJjaEFjdGl2ZSxcbiAgICBzZWxlY3RBZ2VudCxcbiAgICBzZXRDbGllbnQsXG4gICAgc2V0UHJvamVjdCxcbiAgICBzZXRUYXNrLFxuICAgIHRvZ2dsZVdlYlNlYXJjaCxcbiAgXSlcblxuICBjb25zdCBoYW5kbGVSZXNldENoYXQgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgc2V0VXNlckluaXRpYWxNZXNzYWdlKHsgbWVzc2FnZTogJycsIGF0dGFjaG1lbnRzOiBbXSB9KVxuICAgIHNldEluaXRpYWxDaGF0SWQobnVsbClcbiAgICAvLyBEaXNwYXRjaCBldmVudCB0byBjbGVhciB0aGUgaW5wdXQgdGV4dGFyZWFcbiAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnY2hhdC1zZXNzaW9uLWNoYW5nZWQnKSlcbiAgICBoYW5kbGVHb0hvbWUoKVxuICB9LCBbaGFuZGxlR29Ib21lXSlcblxuICAvLyBCb3TDs24gXCJ2b2x2ZXJcIiBkZWwgaGVhZGVyIChzb2xvIG9yY2hlc3RyYXRvcik6XG4gIC8vIC0gRGVzZGUgZWwgY2hhdCAoaGVhZGVyIG8gcHJvamVjdC9jbGllbnQvdGFzayk6IGluaWNpYSB1bmEgY29udmVyc2FjacOzbiBudWV2YSBjb25zZXJ2YW5kbyBlbFxuICAvLyAgIGNvbnRleHRvIHBpbmVhZG8geSB2dWVsdmUgYWwgaG9tZSAocGFzbyAyIGNvbiBGQVFzL0ZVQXMpLlxuICAvLyAtIEVuIGVsIGhvbWUgcGFzbyAyIChGQVFzL0ZVQXMgY29uIGNvbnRleHRvKTogbGltcGlhIGVsIGNvbnRleHRvIHBpbmVhZG8geSB2dWVsdmUgYWwgcGFzbyAxXG4gIC8vICAgKHNlbGVjdG9yIGRlIGNvbnRleHRvcyByZWNpZW50ZXMpLiBFbiBoZWFkZXIgc2llbXByZTsgZW4gcHJvamVjdC9jbGllbnQvdGFzayBzb2xvIHNpIGVsXG4gIC8vICAgdXN1YXJpbyByZWluaWNpw7MgZWwgY29udGV4dG8gKGRpZFJlc2V0Q29udGV4dEluU2VjdGlvbikuXG4gIGNvbnN0IGhhbmRsZUJhY2sgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY29uc3QgdG8gPSByZXNvbHZlQWlDaGF0QmFja0Rlc3RpbmF0aW9uKHNlY3Rpb24sIGFnZW50Py50eXBlLCBjb21wdXRlZEN1cnJlbnRPcHRpb24sIG9wdGlvbnMuaG9tZSlcbiAgICBhbXBsaXR1ZEV2ZW50KEVWRU5UUy5haUNoYXRCYWNrLCB7IHRvIH0pXG5cbiAgICAvLyBEZXNkZSBlbCBjaGF0IOKGkiBudWV2YSBjb252ZXJzYWNpw7NuIFNJTiBib3JyYXIgZWwgY29udGV4dG8gcGluZWFkbywgdm9sdmllbmRvIGFsIGhvbWUuXG4gICAgaWYgKGNvbXB1dGVkQ3VycmVudE9wdGlvbiA9PT0gb3B0aW9ucy5jaGF0KSB7XG4gICAgICAvLyBObyBjb3J0YW1vcyBsYSBnZW5lcmFjacOzbjogbGEgc2VzacOzbiBzaWd1ZSByZXNwb25kaWVuZG8gZW4gYmFja2dyb3VuZC5cbiAgICAgIHNldElzV3JpdGluZyhmYWxzZSlcbiAgICAgIHNldFVzZXJJbml0aWFsTWVzc2FnZSh7IG1lc3NhZ2U6ICcnLCBhdHRhY2htZW50czogW10gfSlcbiAgICAgIHNldEluaXRpYWxDaGF0SWQobnVsbClcbiAgICAgIHNldE5ld0NoYXRLZXkocHJldiA9PiBwcmV2ICsgMSlcbiAgICAgIHNldEhhc0Vycm9yKGZhbHNlKVxuICAgICAgaXNXZWJTZWFyY2hBY3RpdmUgJiYgdG9nZ2xlV2ViU2VhcmNoKClcbiAgICAgIGlmIChyZXNldFNlbGVjdGVkQ2hhdFJlZi5jdXJyZW50KSB7XG4gICAgICAgIHJlc2V0U2VsZWN0ZWRDaGF0UmVmLmN1cnJlbnQoKVxuICAgICAgfVxuICAgICAgc2V0Q3VycmVudE9wdGlvbihvcHRpb25zLmhvbWUpXG4gICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnY2hhdC1zZXNzaW9uLWNoYW5nZWQnKSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIEhvbWUgcGFzbyAyIChjb250ZXh0byBwaW5lYWRvKSDihpIgbGltcGlhciBlbCBjb250ZXh0byB5IHZvbHZlciBhbCBwYXNvIDEgKGNvbnRleHRvcyByZWNpZW50ZXMpLlxuICAgIGlmIChjb21wdXRlZEN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMuaG9tZSAmJiAoaXNHbG9iYWxNYWlhU2VjdGlvbihzZWN0aW9uKSB8fCBkaWRSZXNldENvbnRleHRJblNlY3Rpb24pKSB7XG4gICAgICBzZXRQcm9qZWN0KG51bGwpXG4gICAgICBzZXRDbGllbnQ/LihudWxsKVxuICAgICAgc2V0VGFzaz8uKG51bGwpXG4gICAgICBzZXRDaGlwc1Byb2plY3QobnVsbClcbiAgICB9XG4gIH0sIFtcbiAgICBjb21wdXRlZEN1cnJlbnRPcHRpb24sXG4gICAgc2VjdGlvbixcbiAgICBhZ2VudD8udHlwZSxcbiAgICBhbXBsaXR1ZEV2ZW50LFxuICAgIG9wdGlvbnMuaG9tZSxcbiAgICBzdG9wR2VuZXJhdGlvbkZ1bmN0aW9uLFxuICAgIGlzV2ViU2VhcmNoQWN0aXZlLFxuICAgIHRvZ2dsZVdlYlNlYXJjaCxcbiAgICBkaWRSZXNldENvbnRleHRJblNlY3Rpb24sXG4gICAgc2V0UHJvamVjdCxcbiAgICBzZXRDbGllbnQsXG4gICAgc2V0VGFzayxcbiAgICBzZXRDaGlwc1Byb2plY3QsXG4gIF0pXG5cbiAgLy8gRGV0ZWN0YSBlbCByZWluaWNpbyBkZSBjb250ZXh0byBlbiBwcm9qZWN0L2NsaWVudC90YXNrOiBjb250ZXh0byBwaW5lYWRvIOKGkiB2YWPDrW8gY29uIGVsXG4gIC8vIG9yY2hlc3RyYXRvciAocC4gZWouIGFsIHJlc2VsZWNjaW9uYXIgTUFJQSBlbiBlbCBsaXN0YWRvKS4gU29sbyBsYSB0cmFuc2ljacOzbiBjdWVudGEsIGFzw60gdW5hXG4gIC8vIGFwZXJ0dXJhIGZyZXNjYSAoY29udGV4dG8gcGluZWFkbyBkZXNkZSBsYSBzZWNjacOzbikgbm8gbG8gYWN0aXZhLlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHBpbm5lZCA9ICEhKHRhc2s/LmlkIHx8IGNoaXBzUHJvamVjdD8ucHJvamVjdElkIHx8IGNsaWVudD8uaWQgfHwgcHJvamVjdD8uaWQpXG4gICAgY29uc3Qgd2FzUGlubmVkID0gcHJldkhhc1Bpbm5lZENvbnRleHRSZWYuY3VycmVudFxuICAgIHByZXZIYXNQaW5uZWRDb250ZXh0UmVmLmN1cnJlbnQgPSBwaW5uZWRcbiAgICBpZiAoIWlzR2xvYmFsTWFpYVNlY3Rpb24oc2VjdGlvbikgJiYgYWdlbnQ/LnR5cGUgPT09ICdvcmNoZXN0cmF0b3InICYmIHdhc1Bpbm5lZCAmJiAhcGlubmVkKSB7XG4gICAgICBzZXREaWRSZXNldENvbnRleHRJblNlY3Rpb24odHJ1ZSlcbiAgICB9XG4gIH0sIFt0YXNrPy5pZCwgY2hpcHNQcm9qZWN0Py5wcm9qZWN0SWQsIGNsaWVudD8uaWQsIHByb2plY3Q/LmlkLCBzZWN0aW9uLCBhZ2VudD8udHlwZV0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBvbk1lcmdlQ3JlYXRlZEFnZW50ID0gKGV2dDogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHsgYWdlbnQ6IG5leHRBZ2VudCB9ID0gKGV2dCBhcyBDdXN0b21FdmVudDx7IGFnZW50OiBBZ2VudCB9PikuZGV0YWlsIHx8IHt9XG4gICAgICBpZiAobmV4dEFnZW50Py5pZCkge1xuICAgICAgICBhZGRBZ2VudChuZXh0QWdlbnQsIHsgbmF2aWdhdGVIb21lOiBmYWxzZSB9KVxuICAgICAgfVxuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtYWlhLW1lcmdlLWNyZWF0ZWQtYWdlbnQtaW50by1saXN0Jywgb25NZXJnZUNyZWF0ZWRBZ2VudClcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWFpYS1tZXJnZS1jcmVhdGVkLWFnZW50LWludG8tbGlzdCcsIG9uTWVyZ2VDcmVhdGVkQWdlbnQpXG4gICAgfVxuICB9LCBbYWRkQWdlbnRdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgb25TeW5jRWRpdGVkQWdlbnQgPSAoZXZ0OiBFdmVudCkgPT4ge1xuICAgICAgY29uc3QgeyBhZ2VudDogbmV4dEFnZW50IH0gPSAoZXZ0IGFzIEN1c3RvbUV2ZW50PHsgYWdlbnQ6IEFnZW50IH0+KS5kZXRhaWwgfHwge31cbiAgICAgIGlmICghbmV4dEFnZW50Py5pZCkgcmV0dXJuXG4gICAgICB1cGRhdGVBZ2VudChuZXh0QWdlbnQpXG4gICAgICBpZiAoYWdlbnQ/LmlkID09PSBuZXh0QWdlbnQuaWQpIHtcbiAgICAgICAgc2VsZWN0QWdlbnQobmV4dEFnZW50KVxuICAgICAgfVxuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtYWlhLXN5bmMtZWRpdGVkLWFnZW50LWZyb20tY2hhdCcsIG9uU3luY0VkaXRlZEFnZW50KVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtYWlhLXN5bmMtZWRpdGVkLWFnZW50LWZyb20tY2hhdCcsIG9uU3luY0VkaXRlZEFnZW50KVxuICAgIH1cbiAgfSwgW3VwZGF0ZUFnZW50LCBzZWxlY3RBZ2VudCwgYWdlbnQ/LmlkXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG9wZW5DaGF0VmlldyA9ICgpID0+IHtcbiAgICAgIHNldEhhc0Vycm9yKGZhbHNlKVxuICAgICAgc2V0SW5pdGlhbENoYXRJZChudWxsKVxuICAgICAgc2V0TmV3Q2hhdEtleShwcmV2ID0+IHByZXYgKyAxKVxuICAgICAgc2V0VXNlckluaXRpYWxNZXNzYWdlKHsgbWVzc2FnZTogJycsIGF0dGFjaG1lbnRzOiBbXSB9KVxuICAgICAgc2V0Q3VycmVudE9wdGlvbihvcHRpb25zLmNoYXQpXG4gICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnY2hhdC1zZXNzaW9uLWNoYW5nZWQnKSlcbiAgICB9XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbWFpYS1vcGVuLWNoYXQtdmlldycsIG9wZW5DaGF0VmlldylcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWFpYS1vcGVuLWNoYXQtdmlldycsIG9wZW5DaGF0VmlldylcbiAgICB9XG4gIH0sIFtdKVxuXG4gIC8qKlxuICAgKiBFbCDDrWNvbm8gZGUgTUFJQSBkZWwgaGVhZGVyIGxsZXZhIHNpZW1wcmUgYWwgSG9tZS4gU2kgTUFJQSB5YSBlc3TDoSBtb250YWRhIHBlcm9cbiAgICogbWluaW1pemFkYSwgZWwgaG9zdCBubyBwdWVkZSByZXNvbHZlcmxvIGNhbWJpYW5kbyBgaXNPcGVuYCAoeWEgZXN0w6EgZW4gdHJ1ZSksXG4gICAqIGFzw60gcXVlIGF2aXNhIHBvciBldmVudG8geSBhY8OhIHJlc3RhdXJhbW9zIHkgdmFtb3MgYWwgSG9tZS5cbiAgICovXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgb3BlbkhvbWUgPSAoKSA9PiB7XG4gICAgICBhcHBseUV4cGFuZGVkSG9zdFRha2VvdmVyKHtcbiAgICAgICAgc2VjdGlvbjogJ2hlYWRlcicsXG4gICAgICAgIGVudGl0eTogeyBwcm9qZWN0SWQ6IG51bGwsIGNsaWVudElkOiBudWxsIH0sXG4gICAgICB9KVxuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtYWlhLW9wZW4taG9tZScsIG9wZW5Ib21lKVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtYWlhLW9wZW4taG9tZScsIG9wZW5Ib21lKVxuICAgIH1cbiAgfSwgW2FwcGx5RXhwYW5kZWRIb3N0VGFrZW92ZXJdKVxuXG4gIC8qKlxuICAgKiBPdHJvIGhvc3QgKHByb3llY3RvLCBjbGllbnRlLCBiYW5uZXIsIGhlYWRlcuKApikgcGlkZSBhYnJpciBNQUlBIG1pZW50cmFzIHlhIGhheSB1bmFcbiAgICogaW5zdGFuY2lhIG1vbnRhZGEuIEV4cGFuZGUgc2kgZXN0YWJhIG1pbmltaXphZG8sIGFwbGljYSBlbCBjb250ZXh0byBkZWwgaG9zdCBudWV2b1xuICAgKiB5IHZhIGFsIGhvbWUg4oCUIHNpbiByZXN0YXVyYXIgbGEgY29udmVyc2FjacOzbiBwcmV2aWEgKGVzbyBsbyBoYWNlIGVsIHBpbGwpLlxuICAgKi9cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBvcGVuRnJvbUhvc3QgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB7IGRldGFpbCB9ID0gZXZlbnQgYXMgQ3VzdG9tRXZlbnQ8TWFpYUhvc3RPcGVuRGV0YWlsPlxuICAgICAgaWYgKCFkZXRhaWwpIHJldHVyblxuICAgICAgYXBwbHlFeHBhbmRlZEhvc3RUYWtlb3ZlcihkZXRhaWwpXG4gICAgfVxuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihNQUlBX09QRU5fRlJPTV9IT1NUX0VWRU5ULCBvcGVuRnJvbUhvc3QpXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoTUFJQV9PUEVOX0ZST01fSE9TVF9FVkVOVCwgb3BlbkZyb21Ib3N0KVxuICAgIH1cbiAgfSwgW2FwcGx5RXhwYW5kZWRIb3N0VGFrZW92ZXJdKVxuXG4gIC8qKiBNaXNtbyBmbHVqbyBxdWUgQ2hhdEFJTXlBZ2VudHMuaGFuZGxlVXNlQWdlbnQgKyBvbkJhY2sgKGhhbmRsZXJzLmhvbWUpLlxuICAgKiAgRWwgZGV0YWlsIHB1ZWRlIHRyYWVyIG9wY2lvbmFsbWVudGUgYHByb2plY3RgLCBgY2xpZW50YCwgYHRhc2tgIHBhcmEgZmxvd3MgcXVlXG4gICAqICBuZWNlc2l0YW4gcHJlc2VydmFyIGNvbnRleHRvIChlai4gc2VsZWN0b3IgZGUgYWdlbnRlcyBkZXNkZSB1bmEgdGFyZWEpLiBTaSBubyB2aWVuZW4sXG4gICAqICBzZSBtYW50aWVuZSBlbCBjb21wb3J0YW1pZW50byBvcmlnaW5hbCBkZSBsaW1waWFyIHByb2plY3QvY2xpZW50LiAqL1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG9wZW5OZXdDaGF0V2l0aEFnZW50ID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgY29uc3QgeyBkZXRhaWwgfSA9IGV2ZW50IGFzIEN1c3RvbUV2ZW50PHtcbiAgICAgICAgYWdlbnQ6IEFnZW50XG4gICAgICAgIHByb2plY3Q/OiBQcm9qZWN0IHwgbnVsbFxuICAgICAgICBjbGllbnQ/OiBDbGllbnQgfCBudWxsXG4gICAgICAgIHRhc2s/OiBUYXNrIHwgbnVsbFxuICAgICAgfT5cbiAgICAgIGNvbnN0IG5leHRBZ2VudCA9IGRldGFpbD8uYWdlbnRcbiAgICAgIGlmICghbmV4dEFnZW50KSByZXR1cm5cblxuICAgICAgc2V0UHJvamVjdChkZXRhaWw/LnByb2plY3QgPz8gbnVsbClcbiAgICAgIHNldENsaWVudD8uKGRldGFpbD8uY2xpZW50ID8/IG51bGwpXG4gICAgICBpZiAoZGV0YWlsPy50YXNrICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2V0VGFzaz8uKGRldGFpbC50YXNrKVxuICAgICAgfVxuICAgICAgc2VsZWN0QWdlbnQobmV4dEFnZW50KVxuICAgICAgc2V0SGFzRXJyb3IoZmFsc2UpXG4gICAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMuaG9tZSlcbiAgICB9XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtYWlhLW9wZW4tbmV3LWNoYXQtd2l0aC1hZ2VudCcsIG9wZW5OZXdDaGF0V2l0aEFnZW50KVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtYWlhLW9wZW4tbmV3LWNoYXQtd2l0aC1hZ2VudCcsIG9wZW5OZXdDaGF0V2l0aEFnZW50KVxuICAgIH1cbiAgfSwgW3NlbGVjdEFnZW50LCBzZXRDbGllbnQsIHNldFByb2plY3QsIHNldFRhc2tdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlVXNlU2tpbGxBZnRlclNhdmUgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB7IHNraWxsLCB1c2VGaXJzdEFnZW50IH0gPSAoZXZlbnQgYXMgQ3VzdG9tRXZlbnQ8eyBza2lsbDogU2tpbGw7IHVzZUZpcnN0QWdlbnQ/OiBib29sZWFuIH0+KS5kZXRhaWwgfHwge31cbiAgICAgIGlmICghc2tpbGwpIHJldHVyblxuXG4gICAgICBpZiAodXNlRmlyc3RBZ2VudCAmJiBhZ2VudHMuZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgc2VsZWN0QWdlbnQoYWdlbnRzLmRhdGFbMF0pXG4gICAgICB9XG5cbiAgICAgIHNldEhhc0Vycm9yKGZhbHNlKVxuICAgICAgc2V0SW5pdGlhbENoYXRJZChudWxsKVxuICAgICAgc2V0TmV3Q2hhdEtleShwcmV2ID0+IHByZXYgKyAxKVxuICAgICAgc2V0VXNlckluaXRpYWxNZXNzYWdlKHsgbWVzc2FnZTogJycsIGF0dGFjaG1lbnRzOiBbXSB9KVxuICAgICAgc2V0Q3VycmVudE9wdGlvbihvcHRpb25zLmhvbWUpXG4gICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnY2hhdC1zZXNzaW9uLWNoYW5nZWQnKSlcblxuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ21haWEtaW5zZXJ0LXNraWxsLW1lbnRpb24nLCB7IGRldGFpbDogeyBza2lsbCB9IH0pKVxuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnbWFpYS1pbnB1dC1yZWZvY3VzJykpXG4gICAgICB9KVxuICAgIH1cblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoU0tJTExfVVNFX0FGVEVSX1NBVkVfRVZFTlQsIGhhbmRsZVVzZVNraWxsQWZ0ZXJTYXZlKVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFNLSUxMX1VTRV9BRlRFUl9TQVZFX0VWRU5ULCBoYW5kbGVVc2VTa2lsbEFmdGVyU2F2ZSlcbiAgICB9XG4gIH0sIFthZ2VudHMuZGF0YSwgc2VsZWN0QWdlbnRdKVxuXG4gIC8vIE1ldGFkYXRhIGRlIGxhIHNlc3Npb24gYWJpZXJ0YSAoYWdlbnRfdHlwZS9hZ2VudF9lbnRpdHkgKyBjb250ZXh0byksIGVtaXRpZGEgcG9yIHVzZUNoYXRNZXNzYWdlcy5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBvblNlc3Npb25NZXRhID0gKGV2dDogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHsgZGV0YWlsIH0gPSBldnQgYXMgQ3VzdG9tRXZlbnQ8U2Vzc2lvbk1ldGE+XG4gICAgICBpZiAoZGV0YWlsKSBzZXRTZXNzaW9uTWV0YShkZXRhaWwpXG4gICAgfVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21haWEtY2hhdC1zZXNzaW9uLW1ldGEnLCBvblNlc3Npb25NZXRhKVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtYWlhLWNoYXQtc2Vzc2lvbi1tZXRhJywgb25TZXNzaW9uTWV0YSlcbiAgICB9XG4gIH0sIFtdKVxuXG4gIC8vIEFsIGNhbWJpYXIgZGUgY29udmVyc2FjacOzbiBsaW1waWFtb3MgbGEgbWV0YWRhdGE7IGVsIGxvYWQgZGUgbGEgbnVldmEgc2Vzc2lvbiBsYSB2dWVsdmUgYSBlbWl0aXIuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgc2V0U2Vzc2lvbk1ldGEobnVsbClcbiAgfSwgW2luaXRpYWxDaGF0SWRdKVxuXG4gIC8vIENhcnRlbCBcImNvbnRpbnVhciBlbiB1biBjaGF0IG51ZXZvXCI6IHNlIG11ZXN0cmEgYWwgYWJyaXIgdW5hIGNvbnZlcnNhY2nDs24gZGUgdW4gY2xvbmUgbGVnYWN5XG4gIC8vIChhZ2VudF90eXBlID09PSAnY2xvbmUnIGNvbiBlbnRpdHkgcHJvamVjdC90YXNrL2NsaWVudCkuIEVsIGlucHV0IHNlIHJlZW1wbGF6YSBwb3IgZWwgY2FydGVsLlxuICBjb25zdCBsZWdhY3lDb250ZXh0U2Vzc2lvbiA9IHVzZU1lbW88eyBlbnRpdHlUeXBlOiBMZWdhY3lDb250ZXh0RW50aXR5OyBjb250ZXh0TmFtZTogc3RyaW5nIH0gfCBudWxsPigoKSA9PiB7XG4gICAgaWYgKGNvbXB1dGVkQ3VycmVudE9wdGlvbiAhPT0gb3B0aW9ucy5jaGF0KSByZXR1cm4gbnVsbFxuICAgIGlmICghc2Vzc2lvbk1ldGEgfHwgc2Vzc2lvbk1ldGEuYWdlbnRUeXBlICE9PSAnY2xvbmUnKSByZXR1cm4gbnVsbFxuICAgIGNvbnN0IGVudGl0eSA9IHNlc3Npb25NZXRhLmFnZW50RW50aXR5XG4gICAgaWYgKCFlbnRpdHkgfHwgIUxFR0FDWV9DT05URVhUX0VOVElUSUVTLmluY2x1ZGVzKGVudGl0eSBhcyBMZWdhY3lDb250ZXh0RW50aXR5KSkgcmV0dXJuIG51bGxcbiAgICBjb25zdCBjb250ZXh0TmFtZSA9XG4gICAgICBlbnRpdHkgPT09ICd0YXNrJyA/IHNlc3Npb25NZXRhLnRhc2tOYW1lIDogZW50aXR5ID09PSAncHJvamVjdCcgPyBzZXNzaW9uTWV0YS5wcm9qZWN0TmFtZSA6IHNlc3Npb25NZXRhLmNsaWVudE5hbWVcbiAgICByZXR1cm4geyBlbnRpdHlUeXBlOiBlbnRpdHkgYXMgTGVnYWN5Q29udGV4dEVudGl0eSwgY29udGV4dE5hbWU6IGNvbnRleHROYW1lIHx8ICcnIH1cbiAgfSwgW2NvbXB1dGVkQ3VycmVudE9wdGlvbiwgc2Vzc2lvbk1ldGFdKVxuXG4gIC8vIE1hcmNhIGVsIGFnZW50ZSBkZSBsYSBjb252ZXJzYWNpw7NuIGxlZ2FjeSBwYXJhIHF1ZSBoZWFkZXIsIHNlbGVjdG9yIHkgYXZhdGFyIG11ZXN0cmVuIGVsIGxvZ29cbiAgLy8gTUFJQSB5IGVsIG5vbWJyZSB0YWNoYWRvIChhZ2VudGUgb2Jzb2xldG8pLCBzaW4gZGVwZW5kZXIgZGVsIGB0eXBlYCByZXN1ZWx0byBkZSBsYSBzZXNpw7NuIHZpZWphLlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChsZWdhY3lDb250ZXh0U2Vzc2lvbiAmJiBhZ2VudCAmJiAhYWdlbnQuaXNfbGVnYWN5X2NvbnRleHQpIHtcbiAgICAgIHNlbGVjdEFnZW50KHsgLi4uYWdlbnQsIGlzX2xlZ2FjeV9jb250ZXh0OiB0cnVlIH0pXG4gICAgfVxuICB9LCBbbGVnYWN5Q29udGV4dFNlc3Npb24sIGFnZW50LCBzZWxlY3RBZ2VudF0pXG5cbiAgLy8gQWJyZSB1biBjaGF0IG51ZXZvIGNvbiBlbCBvcmNoZXN0cmF0b3Igc2V0ZWFuZG8gZWwgY29udGV4dG8gZGVsIGNsb25lIGxlZ2FjeSAobWlzbW8gY3JpdGVyaW9cbiAgLy8gcXVlIGNsaWNrZWFyIHVuIGNvbnRleHRvIHJlY2llbnRlIGVuIGVsIGhvbWUg4oaSIHBhc28gMiBjb24gRkFRcy9hY2Npb25lcyBkZSBlc2UgY29udGV4dG8pLlxuICBjb25zdCBoYW5kbGVDb250aW51ZUxlZ2FjeUNvbnRleHRJbk5ld0NoYXQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKCFzZXNzaW9uTWV0YSkgcmV0dXJuXG4gICAgY29uc3Qge1xuICAgICAgYWdlbnRFbnRpdHksXG4gICAgICBwcm9qZWN0SWQ6IHBJZCxcbiAgICAgIHByb2plY3ROYW1lOiBwTmFtZSxcbiAgICAgIGNsaWVudElkOiBjSWQsXG4gICAgICBjbGllbnROYW1lOiBjTmFtZSxcbiAgICAgIHRhc2tJZDogdElkLFxuICAgICAgdGFza05hbWU6IHROYW1lLFxuICAgIH0gPSBzZXNzaW9uTWV0YVxuXG4gICAgY29uc3Qgb3JjaGVzdHJhdG9yID0gYWdlbnRzLmRhdGEuZmluZCgoYTogQWdlbnQpID0+IGEudHlwZSA9PT0gJ29yY2hlc3RyYXRvcicpXG4gICAgaWYgKCFvcmNoZXN0cmF0b3IpIHJldHVyblxuXG4gICAgLy8gUmVzZXQgZGVsIGNoYXQg4oaSIGNvbnZlcnNhY2nDs24gbnVldmEgKGxhIGFudGVyaW9yIHNpZ3VlIGVuIGJhY2tncm91bmQpXG4gICAgc2V0SXNXcml0aW5nKGZhbHNlKVxuICAgIHNldFVzZXJJbml0aWFsTWVzc2FnZSh7IG1lc3NhZ2U6ICcnLCBhdHRhY2htZW50czogW10gfSlcbiAgICBzZXRJbml0aWFsQ2hhdElkKG51bGwpXG4gICAgc2V0TmV3Q2hhdEtleShwcmV2ID0+IHByZXYgKyAxKVxuICAgIHNldEhhc0Vycm9yKGZhbHNlKVxuXG4gICAgLy8gU2V0ZWFyIGNvbnRleHRvIChtaXNtbyBjcml0ZXJpbyBxdWUgaGFuZGxlU2VsZWN0UmVjZW50Q29udGV4dCBkZWwgaG9tZSlcbiAgICBzZXRUYXNrPy4obnVsbClcbiAgICBzZXRQcm9qZWN0KG51bGwpXG4gICAgc2V0Q2xpZW50Py4obnVsbClcbiAgICBzZXRDaGlwc1Byb2plY3QobnVsbClcblxuICAgIGlmIChhZ2VudEVudGl0eSA9PT0gJ2NsaWVudCcgJiYgY0lkICE9IG51bGwpIHtcbiAgICAgIHNldENsaWVudD8uKHsgaWQ6IGNJZCwgbmFtZTogY05hbWUgfHwgJycgfSlcbiAgICB9IGVsc2UgaWYgKGFnZW50RW50aXR5ID09PSAncHJvamVjdCcgJiYgcElkICE9IG51bGwpIHtcbiAgICAgIHNldFByb2plY3Qoe1xuICAgICAgICBpZDogcElkLFxuICAgICAgICBuYW1lOiBwTmFtZSB8fCAnJyxcbiAgICAgICAgLi4uKGNJZCAhPSBudWxsID8geyBjbGllbnRJZDogY0lkLCBjbGllbnQ6IHsgaWQ6IGNJZCwgbmFtZTogY05hbWUgfHwgJycgfSB9IDoge30pLFxuICAgICAgfSlcbiAgICAgIHNldENoaXBzUHJvamVjdCh7IHByb2plY3RJZDogU3RyaW5nKHBJZCksIHByb2plY3ROYW1lOiBwTmFtZSB8fCAnJywgY2xpZW50TmFtZTogY05hbWUgfHwgJycgfSlcbiAgICB9IGVsc2UgaWYgKGFnZW50RW50aXR5ID09PSAndGFzaycgJiYgdElkICE9IG51bGwpIHtcbiAgICAgIHNldFRhc2s/Lih7XG4gICAgICAgIGlkOiB0SWQsXG4gICAgICAgIG5hbWU6IHROYW1lIHx8ICcnLFxuICAgICAgICAuLi4ocElkICE9IG51bGwgPyB7IHByb2plY3RJZDogcElkIH0gOiB7fSksXG4gICAgICAgIC4uLihjSWQgIT0gbnVsbCA/IHsgY2xpZW50SWQ6IGNJZCB9IDoge30pLFxuICAgICAgfSlcbiAgICAgIGlmIChjSWQgIT0gbnVsbCkgc2V0Q2xpZW50Py4oeyBpZDogY0lkLCBuYW1lOiBjTmFtZSB8fCAnJyB9KVxuICAgICAgaWYgKHBJZCAhPSBudWxsKSB7XG4gICAgICAgIHNldFByb2plY3Qoe1xuICAgICAgICAgIGlkOiBwSWQsXG4gICAgICAgICAgbmFtZTogcE5hbWUgfHwgJycsXG4gICAgICAgICAgLi4uKGNJZCAhPSBudWxsID8geyBjbGllbnRJZDogY0lkLCBjbGllbnQ6IHsgaWQ6IGNJZCwgbmFtZTogY05hbWUgfHwgJycgfSB9IDoge30pLFxuICAgICAgICB9KVxuICAgICAgICBzZXRDaGlwc1Byb2plY3QoeyBwcm9qZWN0SWQ6IFN0cmluZyhwSWQpLCBwcm9qZWN0TmFtZTogcE5hbWUgfHwgJycsIGNsaWVudE5hbWU6IGNOYW1lIHx8ICcnIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgc2VsZWN0QWdlbnQob3JjaGVzdHJhdG9yKVxuICAgIHNldFNlc3Npb25NZXRhKG51bGwpXG4gICAgc2V0Q3VycmVudE9wdGlvbihvcHRpb25zLmhvbWUpXG4gICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2NoYXQtc2Vzc2lvbi1jaGFuZ2VkJykpXG4gIH0sIFtzZXNzaW9uTWV0YSwgYWdlbnRzLmRhdGEsIHNlbGVjdEFnZW50LCBzZXRDbGllbnQsIHNldFByb2plY3QsIHNldFRhc2ssIHNldENoaXBzUHJvamVjdCwgc3RvcEdlbmVyYXRpb25GdW5jdGlvbl0pXG5cbiAgY29uc3Qgc2hvd05ld0NoYXQgPSBjb21wdXRlZEN1cnJlbnRPcHRpb24gIT09IG9wdGlvbnMuY2hhdFxuICBjb25zdCBpc015QWdlbnRzU2VjdGlvbiA9IGNvbXB1dGVkQ3VycmVudE9wdGlvbiA9PT0gb3B0aW9ucy5teUFnZW50c1xuICBjb25zdCBpc015U2tpbGxzU2VjdGlvbiA9IGNvbXB1dGVkQ3VycmVudE9wdGlvbiA9PT0gb3B0aW9ucy5teVNraWxsc1xuXG4gIC8vIEJvdMOzbiBcInZvbHZlclwiOiBzb2xvIHBhcmEgZWwgb3JjaGVzdHJhdG9yLlxuICAvLyAtIEVuIGVsIGNoYXQ6IGRpc3BvbmlibGUgZW4gdG9kYXMgbGFzIHNlY2Npb25lcyAoaGVhZGVyIHkgcHJvamVjdC9jbGllbnQvdGFzaykuXG4gIC8vIC0gRW4gZWwgaG9tZSBwYXNvIDIgKEZBUXMvRlVBcyBjb24gY29udGV4dG8gcGluZWFkbyk6IGVuIGVsIGhlYWRlciBzaWVtcHJlOyBlblxuICAvLyAgIHByb2plY3QvY2xpZW50L3Rhc2sgc29sbyBzaSBlbCB1c3VhcmlvIHJlaW5pY2nDsyBlbCBjb250ZXh0byAocGFzw7MgcG9yIGVsIHNlbGVjdG9yIGRlXG4gIC8vICAgY29udGV4dG9zIHJlY2llbnRlcykuIEVuIGVsIHBhc28gMSAoc2luIGNvbnRleHRvKSBOTyBzZSBtdWVzdHJhLlxuICBjb25zdCBoYXNQaW5uZWRDb250ZXh0ID0gISEodGFzaz8uaWQgfHwgY2hpcHNQcm9qZWN0Py5wcm9qZWN0SWQgfHwgY2xpZW50Py5pZCB8fCBwcm9qZWN0Py5pZClcbiAgY29uc3QgaXNDaGF0VmlldyA9IGNvbXB1dGVkQ3VycmVudE9wdGlvbiA9PT0gb3B0aW9ucy5jaGF0XG4gIGNvbnN0IGlzSG9tZVN0ZXAyID0gY29tcHV0ZWRDdXJyZW50T3B0aW9uID09PSBvcHRpb25zLmhvbWUgJiYgaGFzUGlubmVkQ29udGV4dFxuICBjb25zdCBpc0hlYWRlckhvbWVTdGVwMiA9IGlzR2xvYmFsTWFpYVNlY3Rpb24oc2VjdGlvbikgJiYgaXNIb21lU3RlcDJcbiAgY29uc3QgaXNTZWN0aW9uUmVzZXRIb21lU3RlcDIgPSAhaXNHbG9iYWxNYWlhU2VjdGlvbihzZWN0aW9uKSAmJiBpc0hvbWVTdGVwMiAmJiBkaWRSZXNldENvbnRleHRJblNlY3Rpb25cbiAgY29uc3Qgc2hvd0JhY2tCdXR0b24gPVxuICAgIGFnZW50Py50eXBlID09PSAnb3JjaGVzdHJhdG9yJyAmJlxuICAgICFoYXNFcnJvciAmJlxuICAgICFsb2FkaW5nICYmXG4gICAgKGlzQ2hhdFZpZXcgfHwgaXNIZWFkZXJIb21lU3RlcDIgfHwgaXNTZWN0aW9uUmVzZXRIb21lU3RlcDIpXG4gIGNvbnN0IGhhbmRsZU9wZW5NYXJrZXRwbGFjZSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAoIXdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY2xlYXJBZ2VudCgpXG4gICAgc2V0Q3VycmVudE9wdGlvbihvcHRpb25zLm15QWdlbnRzKVxuICB9LCBbY2xlYXJBZ2VudF0pXG5cbiAgY29uc3QgaGFuZGxlT3BlblNraWxscyA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAoIXdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY2xlYXJBZ2VudCgpXG4gICAgc2V0SGFzRXJyb3IoZmFsc2UpXG4gICAgc2V0Q3VycmVudE9wdGlvbihvcHRpb25zLm15U2tpbGxzKVxuICAgIGhhbmRsZUdldFNraWxscygpXG4gIH0sIFtjbGVhckFnZW50LCBoYW5kbGVHZXRTa2lsbHNdKVxuXG4gIGNvbnN0IGhhbmRsZUdvVG9NYWlha2VyID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIHNldEhhc0Vycm9yKGZhbHNlKVxuICAgIGxldCBtYWlha2VyQWdlbnQgPSBhZ2VudHMuZGF0YS5maW5kKChhOiBBZ2VudCkgPT4gaXNNYXJrZXRwbGFjZUdsb2JhbENsb25lQWdlbnQoYSkpXG4gICAgaWYgKCFtYWlha2VyQWdlbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hNYWlhKHtcbiAgICAgICAgICBwYXRoOiBgYWdlbnRzP2FnZW50X3R5cGU9Y2xvbmUmZW50aXR5PWdsb2JhbCZsYW5nPSR7bWFwQ09STGFuZyhpMThuLmxhbmd1YWdlKX1gLFxuICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgICAgICAgbWFpYWtlckFnZW50ID0gKGRhdGEuZGF0YSB8fCBbXSkuZmluZCgoYTogQWdlbnQpID0+IGlzTWFya2V0cGxhY2VHbG9iYWxDbG9uZUFnZW50KGEpKVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIW1haWFrZXJBZ2VudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHNldFByb2plY3QobnVsbClcbiAgICBzZXRDbGllbnQ/LihudWxsKVxuICAgIHNldFRhc2s/LihudWxsKVxuICAgIHNlbGVjdEFnZW50KG1haWFrZXJBZ2VudClcbiAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMuaG9tZSlcbiAgICBpZiAocmVzZXRTZWxlY3RlZENoYXRSZWYuY3VycmVudCkge1xuICAgICAgcmVzZXRTZWxlY3RlZENoYXRSZWYuY3VycmVudCgpXG4gICAgfVxuICB9LCBbYWdlbnRzLmRhdGEsIGkxOG4ubGFuZ3VhZ2UsIHNlbGVjdEFnZW50LCBzZXRDbGllbnQsIHNldFByb2plY3QsIHNldFRhc2tdKVxuICBjb25zdCBoYW5kbGVEZWxldGVBZ2VudEZyb21NeUFnZW50cyA9IHVzZUNhbGxiYWNrKFxuICAgIChhZ2VudElkOiBzdHJpbmcpID0+IHtcbiAgICAgIHJlbW92ZUFnZW50KGFnZW50SWQpXG4gICAgICBpZiAoYWdlbnQ/LmlkID09PSBhZ2VudElkKSB7XG4gICAgICAgIHNlbGVjdEZpcnN0QWdlbnQoYWdlbnRJZClcbiAgICAgIH1cbiAgICB9LFxuICAgIFthZ2VudD8uaWQsIHJlbW92ZUFnZW50LCBzZWxlY3RGaXJzdEFnZW50XVxuICApXG5cbiAgLy8gRWwgZm9vdGVyIChpbnB1dCkgc2Ugb2N1bHRhIHNvbG8gZW4gZWwgaG9tZSBtYXJrZXRwbGFjZSBkZSBNYWlha2VyIChicm93c2UgZGUgYWdlbnRlcykuXG4gIC8vIEVsIGhvbWUgZGVsIG9yY2hlc3RyYXRvciBzw60gcGVybWl0ZSBlc2NyaWJpciwgYXPDrSBxdWUgbWFudGllbmUgZWwgZm9vdGVyLlxuICBjb25zdCBpc01haWFrZXJDcmVhdG9ySG9tZSA9IGNvbXB1dGVkQ3VycmVudE9wdGlvbiA9PT0gb3B0aW9ucy5ob21lICYmIGlzTWFpYWtlckFnZW50U2VsZWN0ZWRcblxuICBjb25zdCBtb2RhbFBhbmVsID0gKFxuICAgIDw+XG4gICAgICB7dmFsaWRhdGVBY2Nlc3NCeUZlYXR1cmUoc2VjdGlvbiwgdXNlcikgJiYgIWlzRmxvYXRpbmcgPyAoXG4gICAgICAgIDxTaWRlYmFyXG4gICAgICAgICAgb25Hb1RvQ2hhdD17Z29Ub0NoYXR9XG4gICAgICAgICAgb25FcnJvcj17KCkgPT4gc2V0U2lkZWJhckhhc0Vycm9yKHRydWUpfVxuICAgICAgICAgIGhhbmRsZUdvVG9Ib21lPXtoYW5kbGVHb0hvbWV9XG4gICAgICAgICAgaGFuZGxlU3RhcnROZXdDaGF0PXtoYW5kbGVTdGFydE5ld0NoYXR9XG4gICAgICAgICAgaGFuZGxlT3Blbk1hcmtldHBsYWNlPXtoYW5kbGVPcGVuTWFya2V0cGxhY2V9XG4gICAgICAgICAgc2hvd05ld0NoYXQ9e3Nob3dOZXdDaGF0fVxuICAgICAgICAgIHJlZmV0Y2hDaGF0cz17cmVmZXRjaENoYXRzfVxuICAgICAgICAgIGhhbmRsZVNldFJlZmV0Y2hDaGF0cz17c2V0UmVmZXRjaENoYXRzfVxuICAgICAgICAgIGhhc0Vycm9yPXtzaWRlYmFySGFzRXJyb3J9XG4gICAgICAgICAgcmVzZXRTZWxlY3RlZENoYXRSZWY9e3Jlc2V0U2VsZWN0ZWRDaGF0UmVmfVxuICAgICAgICAgIGFnZW50c05hdkFjdGl2ZT17c2lkZWJhckFnZW50c05hdkFjdGl2ZX1cbiAgICAgICAgICBoYW5kbGVPcGVuU2tpbGxzPXtoYW5kbGVPcGVuU2tpbGxzfVxuICAgICAgICAgIGlzTGVnYWN5Q29udGV4dFNlc3Npb249eyEhbGVnYWN5Q29udGV4dFNlc3Npb259XG4gICAgICAgIC8+XG4gICAgICApIDogbnVsbH1cbiAgICAgIDxTQ0NBSU1Db250ZW50IGV4cGFuZGVkPXtleHBhbmRlZH0gZmxvYXRpbmc9e2lzRmxvYXRpbmd9PlxuICAgICAgICA8Q2hhdEFJTW9kYWxIZWFkZXJcbiAgICAgICAgICBsYXlvdXRNb2RlPXtsYXlvdXRNb2RlfVxuICAgICAgICAgIG9uTGF5b3V0TW9kZUNoYW5nZT17aGFuZGxlTGF5b3V0TW9kZUNoYW5nZX1cbiAgICAgICAgICBleHBhbmRlZD17ZXhwYW5kZWR9XG4gICAgICAgICAgZHJhZ2dhYmxlPXtpc0Zsb2F0aW5nfVxuICAgICAgICAgIG9uRHJhZ1N0YXJ0PXtoYW5kbGVEcmFnU3RhcnR9XG4gICAgICAgICAgb25EcmFnTW92ZT17aGFuZGxlRHJhZ01vdmV9XG4gICAgICAgICAgb25EcmFnRW5kPXtoYW5kbGVEcmFnRW5kfVxuICAgICAgICAgIGhhbmRsZU1pbmltaXplPXtoYW5kbGVNaW5pbWl6ZX1cbiAgICAgICAgICBhZ2VudHM9e2FnZW50cy5kYXRhfVxuICAgICAgICAgIGhhc0Vycm9yPXshIWFnZW50RXJyb3J9XG4gICAgICAgICAgbG9hZGluZz17bG9hZGluZ31cbiAgICAgICAgICBsb2FkaW5nTW9yZT17bG9hZGluZ01vcmV9XG4gICAgICAgICAgaGFzTW9yZT17YWdlbnRzLmhhc19tb3JlfVxuICAgICAgICAgIGhhbmRsZVJlc2V0Q2hhdD17aGFuZGxlUmVzZXRDaGF0fVxuICAgICAgICAgIG9uQWdlbnRVcGRhdGU9e3VwZGF0ZUFnZW50RmF2b3JpdGV9XG4gICAgICAgICAgbG9hZE1vcmVBZ2VudHM9e2xvYWRNb3JlQWdlbnRzfVxuICAgICAgICAgIHNvcnRBZ2VudHNMaXN0PXtzb3J0QWdlbnRzTGlzdH1cbiAgICAgICAgICBpc015QWdlbnRzU2VjdGlvbj17aXNNeUFnZW50c1NlY3Rpb259XG4gICAgICAgICAgaXNNeVNraWxsc1NlY3Rpb249e2lzTXlTa2lsbHNTZWN0aW9ufVxuICAgICAgICAgIGlzTWFpYWtlclNlY3Rpb249e2lzTWFpYWtlckNyZWF0b3JIb21lfVxuICAgICAgICAgIHNob3dCYWNrQnV0dG9uPXtzaG93QmFja0J1dHRvbn1cbiAgICAgICAgICBvbkJhY2s9e2hhbmRsZUJhY2t9XG4gICAgICAgIC8+XG4gICAgICAgIHtoYXNFcnJvciA/IChcbiAgICAgICAgICA8TUFJQUVycm9yIC8+XG4gICAgICAgICkgOiB2YWxpZGF0ZUFjY2Vzc0J5RmVhdHVyZShzZWN0aW9uLCB1c2VyKSA/IChcbiAgICAgICAgICA8Q2hhdEFJQ29udGVudFxuICAgICAgICAgICAgY3VycmVudE9wdGlvbj17Y29tcHV0ZWRDdXJyZW50T3B0aW9ufVxuICAgICAgICAgICAgaGFuZGxlcnM9e3sgLi4uaGFuZGxlcnMsIGNoYXQ6IHN0YXJ0Q2hhdCwgaG9tZTogaGFuZGxlcnMuaG9tZSwgaGFuZGxlR29Ib21lIH19XG4gICAgICAgICAgICBvbkVycm9yPXsoKSA9PiBzZXRIYXNFcnJvcih0cnVlKX1cbiAgICAgICAgICAgIHJlZnM9e3sgdXNlckluaXRpYWxNZXNzYWdlLCBpbml0aWFsQ2hhdElkIH19XG4gICAgICAgICAgICBvblNlbmRNZXNzYWdlUmVhZHk9e2hhbmRsZVNlbmRNZXNzYWdlUmVhZHl9XG4gICAgICAgICAgICBleHBhbmRlZD17ZXhwYW5kZWR9XG4gICAgICAgICAgICBmbG9hdGluZz17aXNGbG9hdGluZ31cbiAgICAgICAgICAgIGFnZW50cz17YWdlbnRzLmRhdGF9XG4gICAgICAgICAgICBsb2FkaW5nQWdlbnRzPXtsb2FkaW5nfVxuICAgICAgICAgICAgb25EZWxldGVBZ2VudD17aGFuZGxlRGVsZXRlQWdlbnRGcm9tTXlBZ2VudHN9XG4gICAgICAgICAgICBvbkZhdm9yaXRlQWdlbnRVcGRhdGU9e3VwZGF0ZUFnZW50RmF2b3JpdGV9XG4gICAgICAgICAgICBoYXNNb3JlQWdlbnRzPXshIWFnZW50cy5oYXNfbW9yZX1cbiAgICAgICAgICAgIGxvYWRpbmdNb3JlQWdlbnRzPXtsb2FkaW5nTW9yZX1cbiAgICAgICAgICAgIG9uTG9hZE1vcmVBZ2VudHM9e2xvYWRNb3JlQWdlbnRzfVxuICAgICAgICAgICAgb25Hb1RvTWFpYWtlcj17aGFuZGxlR29Ub01haWFrZXJ9XG4gICAgICAgICAgICBteVNraWxscz17bXlTa2lsbHN9XG4gICAgICAgICAgICBzaGFyZWRTa2lsbHM9e3NoYXJlZFNraWxsc31cbiAgICAgICAgICAgIGxvYWRpbmdTa2lsbHM9e2xvYWRpbmdTa2lsbHN9XG4gICAgICAgICAgICBvbkRlbGV0ZVNraWxsPXtyZW1vdmVTa2lsbH1cbiAgICAgICAgICAgIG9uU2VhcmNoQWdlbnRzPXtzZWFyY2hDdXN0b21BZ2VudHN9XG4gICAgICAgICAgICBzZWFyY2hMb2FkaW5nQWdlbnRzPXtzZWFyY2hMb2FkaW5nfVxuICAgICAgICAgICAgYWdlbnRFcnJvcj17YWdlbnRFcnJvcn1cbiAgICAgICAgICAvPlxuICAgICAgICApIDogKFxuICAgICAgICAgIDxQcm9qZWN0U3VtbWFyeUNvbnRlbnQgb25SZXN0YXJ0U3VtbWFyeT17aGFuZGxlcnMuaG9tZX0gLz5cbiAgICAgICAgKX1cbiAgICAgICAgeygoY29tcHV0ZWRDdXJyZW50T3B0aW9uID09PSBvcHRpb25zLmhvbWUgJiYgISFhZ2VudHM/LmRhdGE/Lmxlbmd0aCkgfHxcbiAgICAgICAgICBjb21wdXRlZEN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMuY2hhdCkgJiZcbiAgICAgICAgICAhaXNNYWlha2VyQ3JlYXRvckhvbWUgJiZcbiAgICAgICAgICAhaGFzRXJyb3IgJiZcbiAgICAgICAgICAhbG9hZGluZyAmJlxuICAgICAgICAgIHZhbGlkYXRlQWNjZXNzQnlGZWF0dXJlKHNlY3Rpb24sIHVzZXIpICYmIChcbiAgICAgICAgICAgIDxDaGF0QWlNb2RhbEZvb3RlclxuICAgICAgICAgICAgICBhZ2VudD17YWdlbnR9XG4gICAgICAgICAgICAgIGhhbmRsZVNlbmRNZXNzYWdlPXtoYW5kbGVTZW5kTWVzc2FnZX1cbiAgICAgICAgICAgICAgaGFuZGxlU3RvcEdlbmVyYXRpb249e3N0b3BHZW5lcmF0aW9uRnVuY3Rpb259XG4gICAgICAgICAgICAgIGlzU3RyZWFtaW5nPXtpc1N0cmVhbWluZ31cbiAgICAgICAgICAgICAgaXNXcml0aW5nPXtpc1dyaXRpbmd9XG4gICAgICAgICAgICAgIGNoYXRJZD17aW5pdGlhbENoYXRJZH1cbiAgICAgICAgICAgICAgbmV3Q2hhdEtleT17bmV3Q2hhdEtleX1cbiAgICAgICAgICAgICAgdG9vbHRpcFpJbmRleD17dG9vbHRpcFpJbmRleH1cbiAgICAgICAgICAgICAgbGVnYWN5Q29udGV4dFNlc3Npb249e2xlZ2FjeUNvbnRleHRTZXNzaW9ufVxuICAgICAgICAgICAgICBvbkNvbnRpbnVlSW5OZXdDaGF0PXtoYW5kbGVDb250aW51ZUxlZ2FjeUNvbnRleHRJbk5ld0NoYXR9XG4gICAgICAgICAgICAgIGxheW91dE1vZGU9e2xheW91dE1vZGV9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICl9XG4gICAgICA8L1NDQ0FJTUNvbnRlbnQ+XG4gICAgPC8+XG4gIClcblxuICBjb25zdCBjb250ZW50V3JhcHBlciA9IChcbiAgICA8U0NDQUlNQ29udGVudFdyYXBwZXIgZXhwYW5kZWQ9e2V4cGFuZGVkfSBmbG9hdGluZz17aXNGbG9hdGluZ30gcmVmPXtjb250ZW50V3JhcHBlclJlZn0+XG4gICAgICB7bW9kYWxQYW5lbH1cbiAgICA8L1NDQ0FJTUNvbnRlbnRXcmFwcGVyPlxuICApXG5cbiAgcmV0dXJuIChcbiAgICBzZWxlY3RvciAmJlxuICAgIFJlYWN0RE9NLmNyZWF0ZVBvcnRhbChcbiAgICAgIDxTQ0NBSU1XcmFwcGVyXG4gICAgICAgIGV4cGFuZGVkPXtleHBhbmRlZH1cbiAgICAgICAgbGF5b3V0TW9kZT17bGF5b3V0TW9kZX1cbiAgICAgICAgZHJhZ1Bvc2l0aW9uPXtyZXNvbHZlZERyYWdQb3NpdGlvbn1cbiAgICAgICAgZWxldmF0ZWQ9e3NlY3Rpb24gPT09ICd0YXNrJ31cbiAgICAgICAgJG1pbmltaXplZD17aXNNaW5pbWl6ZWR9XG4gICAgICA+XG4gICAgICAgIDxTQ0NBSU1NaW5pbWl6ZWRIaWRlICRoaWRkZW49e2lzTWluaW1pemVkfT5cbiAgICAgICAgICA8RmxvYXRpbmdQYW5lbE1vdGlvbiB0aWx0PXt0aWx0TW90aW9ufSBleHBhbmRlZD17ZXhwYW5kZWR9PlxuICAgICAgICAgICAge2NvbnRlbnRXcmFwcGVyfVxuICAgICAgICAgIDwvRmxvYXRpbmdQYW5lbE1vdGlvbj5cbiAgICAgICAgPC9TQ0NBSU1NaW5pbWl6ZWRIaWRlPlxuICAgICAgICB7aXNNaW5pbWl6ZWQgJiYgKFxuICAgICAgICAgIDxNYWlhTWluaW1pemVkUGlsbFxuICAgICAgICAgICAgdW5yZWFkQ291bnQ9e3VucmVhZENvdW50fVxuICAgICAgICAgICAgaXNTdHJlYW1pbmc9e2hhc0FjdGl2ZVN0cmVhbX1cbiAgICAgICAgICAgIG9uUmVzdG9yZT17aGFuZGxlUmVzdG9yZUZyb21NaW5pbWl6ZWR9XG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cbiAgICAgICAge3VzZXJIYXNQZXJtaXNzaW9ucyAmJiAoXG4gICAgICAgICAgPEFibUFnZW50TW9kYWxcbiAgICAgICAgICAgIGFkZEFnZW50PXthZGRBZ2VudH1cbiAgICAgICAgICAgIHVwZGF0ZUFnZW50PXt1cGRhdGVBZ2VudH1cbiAgICAgICAgICAgIHJlbW92ZUFnZW50PXtyZW1vdmVBZ2VudH1cbiAgICAgICAgICAgIHVwZGF0ZUFnZW50RmF2b3JpdGU9e3VwZGF0ZUFnZW50RmF2b3JpdGV9XG4gICAgICAgICAgICBzZWxlY3RGaXJzdEFnZW50PXtzZWxlY3RGaXJzdEFnZW50fVxuICAgICAgICAgIC8+XG4gICAgICAgICl9XG4gICAgICAgIHt1c2VySGFzUGVybWlzc2lvbnMgJiYgKFxuICAgICAgICAgIDxBYm1Ta2lsbE1vZGFsIGFkZFNraWxsPXthZGRTa2lsbH0gdXBkYXRlU2tpbGxJbkxpc3Q9e3VwZGF0ZVNraWxsSW5MaXN0fSByZW1vdmVTa2lsbD17cmVtb3ZlU2tpbGx9IC8+XG4gICAgICAgICl9XG4gICAgICAgIHt1c2VySGFzUGVybWlzc2lvbnMgJiYgPEFibVNraWxsR2VuZXJhdGVNb2RhbCAvPn1cbiAgICAgICAgPFNuYWNrYmFyIC8+XG4gICAgICA8L1NDQ0FJTVdyYXBwZXI+LFxuICAgICAgc2VsZWN0b3JcbiAgICApXG4gIClcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUNFQSxXQUFXLEVBQ1hDLE9BQU8sRUFDUEMsUUFBUSxFQUNSQyxNQUFNLEVBQ05DLFNBQVMsRUFDVEMsZUFBZSxRQUVWLE9BQU87QUFDZCxPQUFPQyxRQUFRLE1BQU0sV0FBVztBQUNoQyxPQUFPQyxNQUFNLE1BQU0sUUFBUTtBQUMzQixTQUFTQyxjQUFjLFFBQVEsZUFBZTtBQUM5QyxTQUFTQyxPQUFPLFFBQVEsMkJBQTJCO0FBQ25ELFNBQVNDLGlCQUFpQixFQUFFQyxpQkFBaUIsUUFBUSxnQ0FBZ0M7QUFDckYsU0FBU0MsU0FBUyxRQUFRLHVCQUF1QjtBQUNqRCxTQUFTQyxzQkFBc0IsUUFBUSx1Q0FBdUM7QUFFOUUsU0FBU0MsYUFBYSxRQUFRLGtCQUFrQjtBQUNoRCxTQUFTQyxhQUFhLEVBQUVDLE9BQU8sUUFBUSxhQUFhO0FBQ3BELFNBQVNDLE9BQU8sUUFBUSxZQUFZO0FBQ3BDLFNBQVNDLFlBQVksUUFBUSx5Q0FBeUM7QUFDdEUsU0FBU0MsWUFBWSxRQUFRLHlDQUF5QztBQUN0RSxTQUFTQyxnQkFBZ0IsUUFBc0IsaUNBQWlDO0FBR2hGLFNBQVNDLGlCQUFpQixRQUFRLGtEQUFrRDtBQUNwRixTQUFTQyxRQUFRLFFBQVEsbUNBQW1DO0FBQzVELFNBQVNDLHFCQUFxQixRQUFRLDBCQUEwQjtBQUNoRSxTQUFTQyxhQUFhLFFBQVEsNkNBQTZDO0FBQzNFLFNB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