@projectcor/maia-components 2.52.0 → 2.52.1-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (430) hide show
  1. package/lib/App.js +44 -19
  2. package/lib/components/atoms/ActionableButton.spec.js +111 -0
  3. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.spec.js +52 -0
  4. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.utils.spec.js +11 -0
  5. package/lib/components/atoms/ApprovalBox/ApprovalBox.helpers.spec.js +63 -0
  6. package/lib/components/atoms/ApprovalBox/ApprovalBox.spec.js +183 -0
  7. package/lib/components/atoms/AttachmentCard/AttachmentCard.spec.js +123 -0
  8. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.js +3 -1
  9. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.spec.js +139 -0
  10. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.spec.js +385 -0
  11. package/lib/components/atoms/AttachmentCard/AttachmentCardImage.js +3 -1
  12. package/lib/components/atoms/AttachmentCard/AttachmentCardImage.spec.js +78 -0
  13. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.spec.js +94 -0
  14. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +24 -14
  15. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.spec.js +396 -0
  16. package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.js +28 -10
  17. package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.spec.js +80 -0
  18. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.spec.js +526 -0
  19. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.js +19 -15
  20. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.spec.js +169 -0
  21. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.spec.js +11 -0
  22. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.js +8 -4
  23. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.spec.js +77 -0
  24. package/lib/components/atoms/Backdrop/Backdrop.spec.js +28 -0
  25. package/lib/components/atoms/CardMenu/CardMenu.spec.js +56 -0
  26. package/lib/components/atoms/ChatClientSelector/ChatClientSelector.spec.js +67 -0
  27. package/lib/components/atoms/Checkbox/Checkbox.spec.js +27 -0
  28. package/lib/components/atoms/Chip/Chip.spec.js +82 -0
  29. package/lib/components/atoms/ChipLlm/ChipLlm.spec.js +26 -0
  30. package/lib/components/atoms/ClientSelector/ClientSelector.helpers.spec.js +45 -0
  31. package/lib/components/atoms/ClientSelector/ClientSelector.js +15 -13
  32. package/lib/components/atoms/ClientSelector/ClientSelector.spec.js +133 -0
  33. package/lib/components/atoms/ContextCompactedNotice/ContextCompactedNotice.spec.js +107 -0
  34. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.spec.js +29 -0
  35. package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.spec.js +46 -0
  36. package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.spec.js +109 -0
  37. package/lib/components/atoms/ContextMentionChip/buildChipElement.spec.js +81 -0
  38. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.spec.js +92 -0
  39. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.spec.js +319 -0
  40. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.spec.js +107 -0
  41. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.spec.js +136 -0
  42. package/lib/components/atoms/CopyToClipboard.spec.js +74 -0
  43. package/lib/components/atoms/EditableLabel/EditableLabel.spec.js +76 -0
  44. package/lib/components/atoms/EntitySelector/EntitySelector.spec.js +86 -0
  45. package/lib/components/atoms/Expand/Expand.spec.js +57 -0
  46. package/lib/components/atoms/Fade/Fade.js +10 -6
  47. package/lib/components/atoms/Fade/Fade.spec.js +66 -0
  48. package/lib/components/atoms/FeedbackButton/FeedbackButton.spec.js +75 -0
  49. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.spec.js +104 -0
  50. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +3 -1
  51. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.spec.js +91 -0
  52. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +19 -7
  53. package/lib/components/atoms/HelpButton.spec.js +87 -0
  54. package/lib/components/atoms/ImagePreview/ImagePreview.spec.js +96 -0
  55. package/lib/components/atoms/ListMenuOption/ListMenuOption.spec.js +54 -0
  56. package/lib/components/atoms/LoadingFaqs/LoadingFaqs.spec.js +21 -0
  57. package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.spec.js +20 -0
  58. package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.spec.js +26 -0
  59. package/lib/components/atoms/LoadingText/LoadingText.spec.js +25 -0
  60. package/lib/components/atoms/MAIAButton/MAIAButton.spec.js +42 -0
  61. package/lib/components/atoms/MAIAError/MAIAError.spec.js +27 -0
  62. package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.js +3 -2
  63. package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.spec.js +113 -0
  64. package/lib/components/atoms/MAIAInput/MAIAInput.helpers.js +3 -2
  65. package/lib/components/atoms/MAIAInput/MAIAInput.helpers.spec.js +381 -0
  66. package/lib/components/atoms/MAIAInput/MAIAInput.js +123 -99
  67. package/lib/components/atoms/MAIAInput/MAIAInput.spec.js +719 -0
  68. package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.spec.js +92 -0
  69. package/lib/components/atoms/MAIAInput/MAIAInputEditor.spec.js +193 -0
  70. package/lib/components/atoms/MAIAInput/maiaInputLayout.spec.js +32 -0
  71. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.spec.js +64 -0
  72. package/lib/components/atoms/MaiaWrapper/MaiaWrapper.spec.js +43 -0
  73. package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.js +9 -4
  74. package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.spec.js +114 -0
  75. package/lib/components/atoms/MaiaWrapper/ModernMaiaWrapper.spec.js +51 -0
  76. package/lib/components/atoms/ModalClientAccess/ModalClientAccess.spec.js +48 -0
  77. package/lib/components/atoms/ModalProject/ModalProject.spec.js +66 -0
  78. package/lib/components/atoms/NextPageLoader.spec.js +37 -0
  79. package/lib/components/atoms/OnboardingModalButton/OnboardingModal.spec.js +20 -0
  80. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.spec.js +35 -0
  81. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.spec.js +47 -0
  82. package/lib/components/atoms/OptionAccessibility/OptionAccessibility.js +4 -5
  83. package/lib/components/atoms/OptionAccessibility/OptionAccessibility.spec.js +146 -0
  84. package/lib/components/atoms/PrimaryButton.spec.js +42 -0
  85. package/lib/components/atoms/ProjectSelector/ProjectSelector.spec.js +69 -0
  86. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.js +7 -2
  87. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.spec.js +69 -0
  88. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.styles.js +41 -24
  89. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.js +25 -10
  90. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.spec.js +59 -0
  91. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.js +78 -43
  92. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.spec.js +170 -0
  93. package/lib/components/atoms/ReasoningBlock/groupParallelSteps.js +9 -11
  94. package/lib/components/atoms/ReasoningBlock/groupParallelSteps.spec.js +199 -0
  95. package/lib/components/atoms/ReasoningBlock/reasoningLeading.spec.js +70 -0
  96. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.js +37 -15
  97. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.spec.js +120 -0
  98. package/lib/components/atoms/ReasoningBlock/reasoningMotion.js +8 -0
  99. package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.spec.js +31 -0
  100. package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.js +52 -0
  101. package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.spec.js +90 -0
  102. package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.js +29 -0
  103. package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.spec.js +38 -0
  104. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.spec.js +16 -0
  105. package/lib/components/atoms/SkillsDropdown/SkillsDropdown.spec.js +107 -0
  106. package/lib/components/atoms/SlashCommandChip/SlashCommandChip.spec.js +24 -0
  107. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.helpers.spec.js +71 -0
  108. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.spec.js +120 -0
  109. package/lib/components/atoms/Switch/Switch.spec.js +41 -0
  110. package/lib/components/atoms/TextArea/CustomTextArea.spec.js +52 -0
  111. package/lib/components/atoms/TextArea/TextArea.helpers.spec.js +25 -0
  112. package/lib/components/atoms/TextArea/TextArea.spec.js +126 -0
  113. package/lib/components/atoms/ThirdButton.spec.js +29 -0
  114. package/lib/components/atoms/VideoModal/VideoModal.spec.js +68 -0
  115. package/lib/components/atoms/WithAppCfg.spec.js +82 -0
  116. package/lib/components/index.js +2 -1
  117. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.spec.js +53 -0
  118. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +3 -2
  119. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.spec.js +780 -0
  120. package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.spec.js +107 -0
  121. package/lib/components/molecules/AbmSection/AbmGeneralSection.spec.js +256 -0
  122. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.js +6 -4
  123. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.spec.js +175 -0
  124. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.js +25 -16
  125. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.spec.js +318 -0
  126. package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.spec.js +50 -0
  127. package/lib/components/molecules/AbmSection/AbmLoaderFiles.spec.js +94 -0
  128. package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.js +83 -0
  129. package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.styles.js +30 -0
  130. package/lib/components/molecules/AgentInputBlock/index.js +5 -0
  131. package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.js +52 -0
  132. package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.spec.js +76 -0
  133. package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.js +20 -0
  134. package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.spec.js +34 -0
  135. package/lib/components/molecules/AgentInputBlock/useAgentChangeModelAction.js +36 -0
  136. package/lib/components/molecules/ChatAIClientSelector/ChatAIClientSelector.spec.js +66 -0
  137. package/lib/components/molecules/ChatAIContent/ChatAIContent.js +7 -3
  138. package/lib/components/molecules/ChatAIContent/ChatAIContent.spec.js +145 -0
  139. package/lib/components/molecules/ChatAIHistory/ChatAIHistory.spec.js +204 -0
  140. package/lib/components/molecules/ChatAIHome/ChatAIHome.helpers.spec.js +622 -0
  141. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +93 -72
  142. package/lib/components/molecules/ChatAIHome/ChatAIHome.spec.js +264 -0
  143. package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.spec.js +86 -0
  144. package/lib/components/molecules/ChatAIHome/styles.js +85 -78
  145. package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.spec.js +104 -0
  146. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.spec.js +967 -0
  147. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +30 -14
  148. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.spec.js +646 -0
  149. package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.spec.js +46 -0
  150. package/lib/components/molecules/ChatAIMessages/newStyles.js +32 -35
  151. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.js +8 -1
  152. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.spec.js +1395 -0
  153. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +23 -8
  154. package/lib/components/molecules/ChatAIModal/ChatAIModal.spec.js +1434 -0
  155. package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +2 -2
  156. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.spec.js +33 -0
  157. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.spec.js +116 -0
  158. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +15 -153
  159. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.spec.js +134 -0
  160. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.styles.js +2 -26
  161. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.spec.js +142 -0
  162. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +63 -367
  163. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.spec.js +241 -0
  164. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.utils.js +69 -0
  165. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.utils.spec.js +144 -0
  166. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeaderAgentDropdown.js +95 -0
  167. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeaderAgentSelector.js +174 -0
  168. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeaderLayoutMenu.js +99 -0
  169. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeaderLayoutMenu.spec.js +65 -0
  170. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.spec.js +37 -0
  171. package/lib/components/molecules/ChatAIModal/constants.spec.js +16 -0
  172. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.spec.js +22 -0
  173. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/useFloatingPanelDragTilt.spec.js +67 -0
  174. package/lib/components/molecules/ChatAIModal/layout.spec.js +72 -0
  175. package/lib/components/molecules/ChatAIMultipleChoice/ChatAIMultipleChoice.spec.js +102 -0
  176. package/lib/components/molecules/ChatAIMultipleChoice/ChatAIMultipleChoiceAnswer.spec.js +49 -0
  177. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.helpers.spec.js +93 -0
  178. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.spec.js +297 -0
  179. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.helpers.spec.js +62 -0
  180. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.spec.js +221 -0
  181. package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.spec.js +66 -0
  182. package/lib/components/molecules/ChatFooter/ChatFooter.js +10 -4
  183. package/lib/components/molecules/ChatFooter/ChatFooter.spec.js +548 -0
  184. package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.spec.js +10 -0
  185. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.spec.js +104 -0
  186. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +5 -2
  187. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.spec.js +139 -0
  188. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.spec.js +84 -0
  189. package/lib/components/molecules/MessageFeedback/MessageFeedback.spec.js +116 -0
  190. package/lib/components/molecules/ProjectSummaryChat/ProjectSummaryChat.spec.js +126 -0
  191. package/lib/components/molecules/ProjectSummaryConfig/ProjectSummaryConfig.spec.js +115 -0
  192. package/lib/components/molecules/ProjectSummaryContent/ProjectSummaryContent.spec.js +79 -0
  193. package/lib/components/molecules/ProjectSummaryModal/ProjectSummaryModal.spec.js +37 -0
  194. package/lib/components/molecules/Sidebar/Sidebar.helpers.spec.js +119 -0
  195. package/lib/components/molecules/Sidebar/Sidebar.js +41 -23
  196. package/lib/components/molecules/Sidebar/Sidebar.spec.js +526 -0
  197. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.spec.js +1067 -0
  198. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +2 -2
  199. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.spec.js +1236 -0
  200. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.spec.js +112 -0
  201. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.helpers.spec.js +77 -0
  202. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.spec.js +503 -0
  203. package/lib/components/organisms/ChatAI/ChatAI.spec.js +217 -0
  204. package/lib/components/organisms/ChatAIPage/ChatAIPage.js +525 -0
  205. package/lib/components/organisms/ChatAIPage/ChatAIPage.spec.js +246 -0
  206. package/lib/components/organisms/ChatAIPage/ChatAIPage.styles.js +16 -0
  207. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.js +253 -0
  208. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.spec.js +291 -0
  209. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.styles.js +13 -0
  210. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.js +284 -0
  211. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.spec.js +343 -0
  212. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.styles.js +197 -0
  213. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.js +94 -0
  214. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.spec.js +69 -0
  215. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCards.skeleton.js +38 -0
  216. package/lib/components/organisms/ChatAIPage/getDaypart.js +9 -0
  217. package/lib/components/organisms/ChatAIPage/getDaypart.spec.js +19 -0
  218. package/lib/components/organisms/ChatAIPage/index.js +3 -0
  219. package/lib/components/organisms/ClientAIButton/ClientAIButton.spec.js +53 -0
  220. package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.spec.js +59 -0
  221. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.spec.js +79 -0
  222. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.spec.js +86 -0
  223. package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.spec.js +49 -0
  224. package/lib/components/organisms/ProjectAIButton/ProjectAIButton.spec.js +67 -0
  225. package/lib/components/organisms/ProjectSummary/ProjectSummary.js +11 -7
  226. package/lib/components/organisms/ProjectSummary/ProjectSummary.spec.js +117 -0
  227. package/lib/components/organisms/SnackBar/Snackbar.spec.js +66 -0
  228. package/lib/components/organisms/SourcesInformation/SourceItem.spec.js +19 -0
  229. package/lib/components/organisms/SourcesInformation/SourcesInformationModal.js +4 -1
  230. package/lib/components/organisms/SourcesInformation/SourcesInformationModal.spec.js +52 -0
  231. package/lib/constants/formatExtensions.spec.js +15 -0
  232. package/lib/constants/maiaExternalConnectorsAccess.spec.js +29 -0
  233. package/lib/constants/maiaFeatureAccess.spec.js +30 -0
  234. package/lib/constants/maiaHourAgentAccess.spec.js +30 -0
  235. package/lib/constants/maiaTaskPanelAccess.spec.js +41 -0
  236. package/lib/constants/permissions/clientRoleAccess.spec.js +65 -0
  237. package/lib/constants/permissions/index.js +2 -2
  238. package/lib/constants/permissions/utils.js +4 -1
  239. package/lib/constants/permissions/utils.spec.js +128 -0
  240. package/lib/constants/plannerSyncEvents.spec.js +31 -0
  241. package/lib/constants/taskUrls.spec.js +9 -0
  242. package/lib/dev/DevMaiaPage.js +30 -0
  243. package/lib/dev/DevReasoningTimeline.js +68 -37
  244. package/lib/dev/Providers.js +5 -3
  245. package/lib/hooks/frequentlyUsedActionsCache.js +17 -0
  246. package/lib/hooks/frequentlyUsedActionsCache.spec.js +25 -0
  247. package/lib/hooks/useAccessClient/useAccessClient.spec.js +149 -0
  248. package/lib/hooks/useAgentModel/useAgentModel.spec.js +83 -0
  249. package/lib/hooks/useAgentModel/useCreateAgent.helpers.spec.js +268 -0
  250. package/lib/hooks/useAgentModel/useCreateAgent.spec.js +314 -0
  251. package/lib/hooks/useAgentModel/useDeleteAgent.spec.js +183 -0
  252. package/lib/hooks/useAgentModel/useUpdateAgent.js +7 -6
  253. package/lib/hooks/useAgentModel/useUpdateAgent.spec.js +374 -0
  254. package/lib/hooks/useAgentSuggestions.spec.js +89 -0
  255. package/lib/hooks/useCaretPosition.spec.js +58 -0
  256. package/lib/hooks/useChatManager/useChatManager.helpers.js +3 -3
  257. package/lib/hooks/useChatManager/useChatManager.helpers.spec.js +2027 -0
  258. package/lib/hooks/useChatManager/useChatManager.js +8 -7
  259. package/lib/hooks/useChatManager/useChatManager.spec.js +2467 -0
  260. package/lib/hooks/useChatMessages/useChatMessages.helpers.spec.js +491 -0
  261. package/lib/hooks/useChatMessages/useChatMessages.spec.js +729 -0
  262. package/lib/hooks/useChats/useChats.spec.js +208 -0
  263. package/lib/hooks/useClientSearch.helpers.spec.js +52 -0
  264. package/lib/hooks/useClientSearch.spec.js +86 -0
  265. package/lib/hooks/useContextMentions.helpers.spec.js +267 -0
  266. package/lib/hooks/useContextMentions.spec.js +338 -0
  267. package/lib/hooks/useContextPinPopover.helpers.spec.js +183 -0
  268. package/lib/hooks/useContextPinPopover.spec.js +159 -0
  269. package/lib/hooks/useContinueLegacyContextInNewChat/index.js +2 -0
  270. package/lib/hooks/useContinueLegacyContextInNewChat/useContinueLegacyContextInNewChat.js +93 -0
  271. package/lib/hooks/useContinueLegacyContextInNewChat/useContinueLegacyContextInNewChat.spec.js +257 -0
  272. package/lib/hooks/useDebounce.spec.js +42 -0
  273. package/lib/hooks/useEntitySearch.helpers.spec.js +723 -0
  274. package/lib/hooks/useEntitySearch.js +3 -1
  275. package/lib/hooks/useEntitySearch.spec.js +718 -0
  276. package/lib/hooks/useEvent.spec.js +45 -0
  277. package/lib/hooks/useFrequentlyAskedQuestions.spec.js +222 -0
  278. package/lib/hooks/useFrequentlyUsedActions.js +61 -22
  279. package/lib/hooks/useFrequentlyUsedActions.spec.js +293 -0
  280. package/lib/hooks/useIsMaiaPageRoute.spec.js +26 -0
  281. package/lib/hooks/useKnowledge/deleteKnowledge.spec.js +122 -0
  282. package/lib/hooks/useKnowledge/downloadKnowledge.js +4 -4
  283. package/lib/hooks/useKnowledge/downloadKnowledge.spec.js +148 -0
  284. package/lib/hooks/useKnowledge/saveKnowledge.spec.js +104 -0
  285. package/lib/hooks/useKnowledge/useKnowledgeOperations.js +16 -15
  286. package/lib/hooks/useKnowledge/useKnowledgeOperations.spec.js +178 -0
  287. package/lib/hooks/useLatestRef.spec.js +50 -0
  288. package/lib/hooks/useMaiaChatSessionMeta/index.js +2 -0
  289. package/lib/hooks/useMaiaChatSessionMeta/useMaiaChatSessionMeta.js +24 -0
  290. package/lib/hooks/useMentionAllowedTypes.spec.js +89 -0
  291. package/lib/hooks/useMentionPopover.helpers.spec.js +100 -0
  292. package/lib/hooks/useMentionPopover.spec.js +392 -0
  293. package/lib/hooks/useMinimizedPillBottomOffset.helpers.spec.js +176 -0
  294. package/lib/hooks/useMinimizedPillBottomOffset.spec.js +89 -0
  295. package/lib/hooks/useMinimizedPillNoveltyDot/useMinimizedPillNoveltyDot.spec.js +67 -0
  296. package/lib/hooks/useModal/useModal.spec.js +73 -0
  297. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.helpers.spec.js +138 -0
  298. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.spec.js +485 -0
  299. package/lib/hooks/useProjectSearch.helpers.spec.js +89 -0
  300. package/lib/hooks/useProjectSearch.spec.js +91 -0
  301. package/lib/hooks/useProjectSummary.spec.js +193 -0
  302. package/lib/hooks/useProjectSummaryConfig.helpers.spec.js +151 -0
  303. package/lib/hooks/useProjectSummaryConfig.js +10 -5
  304. package/lib/hooks/useProjectSummaryConfig.spec.js +133 -0
  305. package/lib/hooks/useReasoningTrace/reasoningStore.spec.js +112 -0
  306. package/lib/hooks/useRecentClientsSearch.helpers.spec.js +33 -0
  307. package/lib/hooks/useRecentClientsSearch.spec.js +85 -0
  308. package/lib/hooks/useRecentContexts.spec.js +139 -0
  309. package/lib/hooks/useResize.spec.js +37 -0
  310. package/lib/hooks/useSkillsCatalog.spec.js +88 -0
  311. package/lib/hooks/useSlashCommands.spec.js +139 -0
  312. package/lib/hooks/useSmoothStreamText/useSmoothStreamText.spec.js +101 -0
  313. package/lib/hooks/useSnackBarManager/useSnackBarManager.spec.js +33 -0
  314. package/lib/hooks/useStreamResponse.spec.js +199 -0
  315. package/lib/hooks/useT.spec.js +20 -0
  316. package/lib/hooks/useToggle.spec.js +33 -0
  317. package/lib/hooks/useToggleFavorite/useToggleFavorite.spec.js +171 -0
  318. package/lib/index.js +5 -2
  319. package/lib/lang/br/index.js +26 -1
  320. package/lib/lang/en/index.js +26 -1
  321. package/lib/lang/es/index.js +26 -1
  322. package/lib/lang/fr/index.js +26 -1
  323. package/lib/services/appcues.spec.js +37 -0
  324. package/lib/services/maia/Access/updateAccess.spec.js +137 -0
  325. package/lib/services/maia/Actions/getFrequentlyUsedActions.js +1 -1
  326. package/lib/services/maia/Actions/getFrequentlyUsedActions.spec.js +121 -0
  327. package/lib/services/maia/Actions/getSlashCommands.spec.js +91 -0
  328. package/lib/services/maia/Agents/connectors.js +3 -1
  329. package/lib/services/maia/Agents/connectors.spec.js +496 -0
  330. package/lib/services/maia/Agents/createAgent.spec.js +55 -0
  331. package/lib/services/maia/Agents/deleteAgent.spec.js +57 -0
  332. package/lib/services/maia/Agents/fetchAgentDetail.spec.js +108 -0
  333. package/lib/services/maia/Agents/getAgentById.spec.js +190 -0
  334. package/lib/services/maia/Agents/getAgentModels.spec.js +190 -0
  335. package/lib/services/maia/Agents/getAgentSuggestions.spec.js +89 -0
  336. package/lib/services/maia/Agents/getAgents.helpers.spec.js +325 -0
  337. package/lib/services/maia/Agents/getAgents.spec.js +1135 -0
  338. package/lib/services/maia/Agents/setAgentToolGroups.spec.js +45 -0
  339. package/lib/services/maia/Agents/toggleFavorite.spec.js +59 -0
  340. package/lib/services/maia/Agents/updateAgent.spec.js +48 -0
  341. package/lib/services/maia/Chats/deleteChat.spec.js +31 -0
  342. package/lib/services/maia/Chats/getChatMessages.spec.js +150 -0
  343. package/lib/services/maia/Chats/getChatsByUserId.spec.js +181 -0
  344. package/lib/services/maia/Chats/markSessionAsRead.spec.js +30 -0
  345. package/lib/services/maia/Chats/patchChat.spec.js +41 -0
  346. package/lib/services/maia/Chats/wasHelpfulChat.spec.js +28 -0
  347. package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.spec.js +58 -0
  348. package/lib/services/maia/Knowledge/delete.spec.js +45 -0
  349. package/lib/services/maia/Knowledge/download.spec.js +78 -0
  350. package/lib/services/maia/Knowledge/save.spec.js +58 -0
  351. package/lib/services/maia/Orchestrator/orchestrator.helpers.spec.js +261 -0
  352. package/lib/services/maia/Orchestrator/orchestrator.spec.js +181 -0
  353. package/lib/services/maia/RecentClients/getRecentClients.spec.js +52 -0
  354. package/lib/services/maia/RecentContexts/getRecentContexts.spec.js +103 -0
  355. package/lib/services/maia/RecentProjects/getRecentProjects.spec.js +82 -0
  356. package/lib/services/maia/RecentTasks/getRecentTasks.spec.js +63 -0
  357. package/lib/services/maia/RecentUsers/getRecentUsers.spec.js +82 -0
  358. package/lib/services/maia/Skills/createSkill.spec.js +68 -0
  359. package/lib/services/maia/Skills/deleteSkill.spec.js +42 -0
  360. package/lib/services/maia/Skills/generateSkill.spec.js +48 -0
  361. package/lib/services/maia/Skills/getSkills.spec.js +152 -0
  362. package/lib/services/maia/Skills/updateSkill.spec.js +62 -0
  363. package/lib/services/maia/client.spec.js +56 -0
  364. package/lib/services/utils/fetchCOR.spec.js +211 -0
  365. package/lib/services/utils/getCookie.spec.js +20 -0
  366. package/lib/services/utils/mapChatMessages.helpers.spec.js +336 -0
  367. package/lib/services/utils/mapChatMessages.multipleChoice.spec.js +87 -0
  368. package/lib/services/utils/mapChatMessages.spec.js +254 -0
  369. package/lib/store/chatsSidebarOptimistic.spec.js +145 -0
  370. package/lib/store/maiaLastChatPersistence.spec.js +22 -0
  371. package/lib/store/maiaPanelSessionPersistence.spec.js +62 -0
  372. package/lib/store/sessions/sessionNotificationSound.spec.js +145 -0
  373. package/lib/store/sessions/sessionNotifications.helpers.spec.js +63 -0
  374. package/lib/store/sessions/sessionNotifications.spec.js +106 -0
  375. package/lib/store/sessions/sessionStreamManager.helpers.spec.js +177 -0
  376. package/lib/store/sessions/sessionStreamManager.js +51 -55
  377. package/lib/store/sessions/sessionStreamManager.spec.js +939 -0
  378. package/lib/store/sessions/sessions.types.spec.js +16 -0
  379. package/lib/store/sessions/useSessionsStore.spec.js +135 -0
  380. package/lib/store/useChatsStore.js +4 -3
  381. package/lib/store/useChatsStore.spec.js +690 -0
  382. package/lib/store/useFaqsStore.spec.js +57 -0
  383. package/lib/store/useMultipleChoiceStore.spec.js +44 -0
  384. package/lib/styles/cascade.js +29 -3
  385. package/lib/styles/transitions.js +3 -1
  386. package/lib/types/global.d.js +1 -1
  387. package/lib/utils/actionCategoryMap.spec.js +18 -0
  388. package/lib/utils/agentDisplayName.spec.js +48 -0
  389. package/lib/utils/autoApproveStorage.spec.js +25 -0
  390. package/lib/utils/chatInputFiles.spec.js +39 -0
  391. package/lib/utils/contextMentionIcons.spec.js +41 -0
  392. package/lib/utils/contextMentionLabel.spec.js +13 -0
  393. package/lib/utils/contextMentionTriggers.spec.js +44 -0
  394. package/lib/utils/contextMentionTypeLabel.spec.js +14 -0
  395. package/lib/utils/corConnectorMentionTypes.spec.js +23 -0
  396. package/lib/utils/entityLinkRender.spec.js +72 -0
  397. package/lib/utils/fileDownloadHelper.spec.js +67 -0
  398. package/lib/utils/formatQuickActionMessage.spec.js +27 -0
  399. package/lib/utils/formatUnreadCount.spec.js +12 -0
  400. package/lib/utils/getUnitFileSize.spec.js +18 -0
  401. package/lib/utils/hitlAnalytics.spec.js +136 -0
  402. package/lib/utils/hoursPlannerQuickActionType.js +116 -1
  403. package/lib/utils/hoursPlannerQuickActionType.spec.js +124 -0
  404. package/lib/utils/imagePreprocessor.helpers.spec.js +28 -0
  405. package/lib/utils/imagePreprocessor.js +14 -3
  406. package/lib/utils/imagePreprocessor.spec.js +112 -0
  407. package/lib/utils/maiaPageRoute.spec.js +23 -0
  408. package/lib/utils/mapBackendLang.spec.js +19 -0
  409. package/lib/utils/navigateContextEntity.js +2 -2
  410. package/lib/utils/navigateContextEntity.spec.js +50 -0
  411. package/lib/utils/normalizeAgentConnectors.spec.js +98 -0
  412. package/lib/utils/openTaskInCorPanel.js +2 -2
  413. package/lib/utils/openTaskInCorPanel.spec.js +43 -0
  414. package/lib/utils/orchestratorSubagents.spec.js +32 -0
  415. package/lib/utils/reasoningMappers.spec.js +103 -0
  416. package/lib/utils/recentContextsHomeLimit.spec.js +32 -0
  417. package/lib/utils/renderContextMentions.helpers.spec.js +87 -0
  418. package/lib/utils/renderContextMentions.spec.js +268 -0
  419. package/lib/utils/retryCompletion.spec.js +181 -0
  420. package/lib/utils/skillContentSize.spec.js +13 -0
  421. package/lib/utils/slashCommandMarker.spec.js +43 -0
  422. package/lib/utils/sortManagerHoursHomeFuas.spec.js +51 -0
  423. package/lib/utils/sseStreamContent.spec.js +31 -0
  424. package/lib/utils/streamActivityMessages.helpers.js +5 -4
  425. package/lib/utils/streamActivityMessages.helpers.spec.js +84 -0
  426. package/lib/utils/streamActivityMessages.js +32 -20
  427. package/lib/utils/streamActivityMessages.spec.js +336 -0
  428. package/lib/utils/validateTrimmedFields.spec.js +26 -0
  429. package/package.json +1 -1
  430. package/README.md +0 -2
@@ -0,0 +1,1395 @@
1
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
4
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
5
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
6
+ import { CORUserRole } from '../../../context/cor-user';
7
+ import { options } from './constants';
8
+ import { clampFloatingPanelPosition, dispatchSkillMentionInsert, ensureAgentsBeforeSkillUse, getMaiaHostPanelPresentation, hasAnyActiveSessionInMeta, isBannerFaqReadyToAutoSend, isLegacyContextEntity, resolveAiChatBackDestination, resolveComputedCurrentOption, resolveDefaultFloatingPanelPosition, resolveInitialCurrentOption, resolveLegacyContextSession, resolveSidebarAgentsNavActive, shouldRestoreExpandedPanel, shouldSkipFloatingDragTarget, validateAccessByFeature, resolveHostTakeoverEntityState, buildHostTakeoverPersistContext, buildMaiaPanelSessionPatch, resolveFloatingPanelDragPosition, resolveHostTakeoverAgentId, resolveMaiaModalI18nLang, resolveMinimizedRestoreTarget, resolveNextDragPosition, resolveUserHasAgentManagementPermissions, shouldBackClearPinnedContext, shouldBackStartNewChatPreservingContext, shouldMarkOrchestratorContextReset, shouldStartNewChatFromCatalog, resolveHasPinnedContext, resolveOrchestratorHomeNavFlags, shouldShowOrchestratorBackButton, shouldClearClientOnGoHomeFromChat, shouldResetAgentToFirstOnGoHome, shouldUseActiveChatSendHandler, buildLegacyContextMigrationPatch, findOrchestratorAgent, buildLegacyContextAgent, shouldMarkAgentAsLegacyContext, canOpenMaiaMarketplace, shouldSetChatViewHiddenOnMount, shouldPersistLastActiveChatId, hasBannerFaqTitle, shouldSyncPanelSessionOnPageHide, resolveCachedAgentsIfAvailable, shouldAttemptInitialAgentsFetch, findAgentForChatItem, shouldApplyClientOnHostTakeover, shouldSelectFirstAgentOnHostTakeover, shouldResetChatStateOnGoHome, shouldClearContextForCatalogOrSkillAgent, resolveOpenNewChatWithAgentContext, canContinueLegacyContextInNewChat, resolveSessionRestoreNavRoute, shouldSkipAgentsLoadOnSessionRestore, shouldFetchAgentDetailOnSessionRestore, shouldPassAgentToGetAgentsOnRestore, shouldSelectFetchedAgentAfterRestore, resolveSnapshotChipsProject, resolveChatModalSectionFlags, shouldRenderChatSidebar, resolveChatModalMainContentView, shouldShowChatModalFooter, shouldUseElevatedMaiaPanel, shouldReselectAgentAfterDelete, shouldClearDragPositionOnLayoutChange, shouldPersistDragPositionOnDragEnd, shouldStartFloatingPanelDrag, isActiveFloatingDragPointer, shouldOpenSkillsCatalog, shouldUseDragClampFallback, resolveLayoutDragPositionUpdate, resolvePersistedDragPositionOnEnd, buildUserInitialMessageFromStartChat, shouldResetSidebarErrorOnStartChat, shouldClearTaskOnGoHomeFromChat, shouldClearOrchestratorGlobalContextOnGoHome, shouldPrefetchAgentsForCatalogNewChat, isGlobalMaiaSection } from './ChatAIModal.helpers';
9
+ var baseUser = {
10
+ id: 1,
11
+ company_id: 10,
12
+ role_id: CORUserRole.PROJECT_MANAGER
13
+ };
14
+ var orchestratorAgent = {
15
+ id: '1',
16
+ name: 'MAIA',
17
+ type: 'orchestrator',
18
+ entity: 'global'
19
+ };
20
+ var agent = function agent(id) {
21
+ return {
22
+ id: id,
23
+ name: "Agent ".concat(id),
24
+ type: 'custom'
25
+ };
26
+ };
27
+ describe('ChatAIModal.helpers', function () {
28
+ var originalChatAccess = window.MAIA_CHAT_AI_FEATURE_ACCESS;
29
+ var originalMultiAgents = window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS;
30
+ var originalSkillsAccess = window.MAIA_SKILLS_ACCESS;
31
+ var originalProjectSummary = window.MAIA_PROJECT_SUMMARY_FEATURE_ACCESS;
32
+ afterEach(function () {
33
+ window.MAIA_CHAT_AI_FEATURE_ACCESS = originalChatAccess;
34
+ window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = originalMultiAgents;
35
+ window.MAIA_SKILLS_ACCESS = originalSkillsAccess;
36
+ window.MAIA_PROJECT_SUMMARY_FEATURE_ACCESS = originalProjectSummary;
37
+ });
38
+ describe('resolveAiChatBackDestination', function () {
39
+ it('returns global home for orchestrator on header home', function () {
40
+ expect(resolveAiChatBackDestination('header', 'orchestrator', options.home, options.home)).toBe('global_context_home');
41
+ });
42
+ it('maps section-specific homes', function () {
43
+ expect(resolveAiChatBackDestination('task', 'orchestrator', options.chat, options.home)).toBe('task_home');
44
+ expect(resolveAiChatBackDestination('planner', 'clone', options.chat, options.home)).toBe('planner_home');
45
+ expect(resolveAiChatBackDestination('project', 'clone', options.chat, options.home)).toBe('project_home');
46
+ expect(resolveAiChatBackDestination('client', 'clone', options.chat, options.home)).toBe('client_home');
47
+ });
48
+ it('falls back to global home for unsupported combinations', function () {
49
+ expect(resolveAiChatBackDestination('header', 'custom', options.chat, options.chat)).toBe('global_context_home');
50
+ });
51
+ });
52
+ describe('validateAccessByFeature', function () {
53
+ it('denies access without section or chat permission', function () {
54
+ window.MAIA_CHAT_AI_FEATURE_ACCESS = true;
55
+ expect(validateAccessByFeature(null, baseUser)).toBe(false);
56
+ expect(validateAccessByFeature('header', _objectSpread(_objectSpread({}, baseUser), {}, {
57
+ role_id: CORUserRole.CLIENT
58
+ }))).toBe(false);
59
+ });
60
+ it('allows task and planner when chat AI is enabled for the user', function () {
61
+ window.MAIA_CHAT_AI_FEATURE_ACCESS = false;
62
+ window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = false;
63
+ window.MAIA_PROJECT_SUMMARY_FEATURE_ACCESS = true;
64
+ expect(validateAccessByFeature('task', baseUser)).toBe(true);
65
+ expect(validateAccessByFeature('planner', baseUser)).toBe(true);
66
+ });
67
+ it('requires chat flags for header and project sections', function () {
68
+ window.MAIA_CHAT_AI_FEATURE_ACCESS = false;
69
+ window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = false;
70
+ expect(validateAccessByFeature('header', baseUser)).toBe(false);
71
+ expect(validateAccessByFeature('project', baseUser)).toBe(false);
72
+ window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
73
+ expect(validateAccessByFeature('header', baseUser)).toBe(true);
74
+ window.MAIA_CHAT_AI_FEATURE_ACCESS = true;
75
+ window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = false;
76
+ expect(validateAccessByFeature('project', baseUser)).toBe(true);
77
+ });
78
+ });
79
+ describe('resolveComputedCurrentOption', function () {
80
+ it('falls back to the current option when myAgents is unavailable', function () {
81
+ expect(resolveComputedCurrentOption({
82
+ currentOption: options.myAgents,
83
+ agent: orchestratorAgent,
84
+ project: null,
85
+ client: null,
86
+ user: baseUser,
87
+ multiAgentsAccess: false
88
+ })).toBe(options.myAgents);
89
+ });
90
+ it('keeps myAgents and mySkills when feature access allows', function () {
91
+ window.MAIA_SKILLS_ACCESS = true;
92
+ expect(resolveComputedCurrentOption({
93
+ currentOption: options.myAgents,
94
+ agent: orchestratorAgent,
95
+ project: null,
96
+ client: null,
97
+ user: baseUser,
98
+ multiAgentsAccess: true
99
+ })).toBe(options.myAgents);
100
+ expect(resolveComputedCurrentOption({
101
+ currentOption: options.mySkills,
102
+ agent: orchestratorAgent,
103
+ project: null,
104
+ client: null,
105
+ user: baseUser,
106
+ multiAgentsAccess: false
107
+ })).toBe(options.mySkills);
108
+ });
109
+ it('redirects non-orchestrator global specialists from home to chat', function () {
110
+ var globalClone = {
111
+ id: '2',
112
+ name: 'Sales Bot',
113
+ type: 'clone',
114
+ entity: 'global'
115
+ };
116
+ expect(resolveComputedCurrentOption({
117
+ currentOption: options.home,
118
+ agent: globalClone,
119
+ project: null,
120
+ client: null,
121
+ user: baseUser,
122
+ multiAgentsAccess: false
123
+ })).toBe(options.chat);
124
+ });
125
+ it('keeps chat option when project or client context is already set', function () {
126
+ var projectAgent = {
127
+ id: '3',
128
+ name: 'Proj',
129
+ type: 'clone',
130
+ entity: 'project'
131
+ };
132
+ var clientAgent = {
133
+ id: '4',
134
+ name: 'Client',
135
+ type: 'clone',
136
+ entity: 'client'
137
+ };
138
+ expect(resolveComputedCurrentOption({
139
+ currentOption: options.home,
140
+ agent: projectAgent,
141
+ project: {
142
+ id: 10,
143
+ name: 'Alpha'
144
+ },
145
+ client: null,
146
+ user: baseUser,
147
+ multiAgentsAccess: false
148
+ })).toBe(options.home);
149
+ expect(resolveComputedCurrentOption({
150
+ currentOption: options.home,
151
+ agent: clientAgent,
152
+ project: null,
153
+ client: {
154
+ id: 5,
155
+ name: 'Beta'
156
+ },
157
+ user: baseUser,
158
+ multiAgentsAccess: false
159
+ })).toBe(options.home);
160
+ });
161
+ it('does not redirect orchestrator global clones from home', function () {
162
+ var orchestratorGlobal = {
163
+ id: '1',
164
+ name: 'MAIA',
165
+ type: 'orchestrator',
166
+ entity: 'global'
167
+ };
168
+ expect(resolveComputedCurrentOption({
169
+ currentOption: options.home,
170
+ agent: orchestratorGlobal,
171
+ project: null,
172
+ client: null,
173
+ user: baseUser,
174
+ multiAgentsAccess: false
175
+ })).toBe(options.home);
176
+ });
177
+ it('shows project and client selectors when context is missing', function () {
178
+ var projectAgent = {
179
+ id: '3',
180
+ name: 'Proj',
181
+ type: 'clone',
182
+ entity: 'project'
183
+ };
184
+ var clientAgent = {
185
+ id: '4',
186
+ name: 'Client',
187
+ type: 'clone',
188
+ entity: 'client'
189
+ };
190
+ expect(resolveComputedCurrentOption({
191
+ currentOption: options.home,
192
+ agent: projectAgent,
193
+ project: null,
194
+ client: null,
195
+ user: baseUser,
196
+ multiAgentsAccess: false
197
+ })).toBe(options.projectSelector);
198
+ expect(resolveComputedCurrentOption({
199
+ currentOption: options.home,
200
+ agent: clientAgent,
201
+ project: null,
202
+ client: null,
203
+ user: baseUser,
204
+ multiAgentsAccess: false
205
+ })).toBe(options.clientSelector);
206
+ });
207
+ });
208
+ describe('resolveSidebarAgentsNavActive', function () {
209
+ it('maps computed options and maiaker selection', function () {
210
+ expect(resolveSidebarAgentsNavActive(options.mySkills, false)).toBe('mySkills');
211
+ expect(resolveSidebarAgentsNavActive(options.myAgents, false)).toBe('myAgents');
212
+ expect(resolveSidebarAgentsNavActive(options.home, true)).toBe('maiaker');
213
+ expect(resolveSidebarAgentsNavActive(options.chat, false)).toBeNull();
214
+ });
215
+ });
216
+ describe('resolveInitialCurrentOption', function () {
217
+ it('restores saved nav and validates saved option', function () {
218
+ window.MAIA_SKILLS_ACCESS = true;
219
+ expect(resolveInitialCurrentOption('myAgents', null, baseUser)).toBe(options.myAgents);
220
+ expect(resolveInitialCurrentOption('mySkills', null, baseUser)).toBe(options.mySkills);
221
+ expect(resolveInitialCurrentOption(null, 'chat', baseUser)).toBe(options.chat);
222
+ expect(resolveInitialCurrentOption(null, 'invalid', baseUser)).toBe(options.home);
223
+ });
224
+ it('ignores saved mySkills when the user lacks skills access', function () {
225
+ window.MAIA_SKILLS_ACCESS = false;
226
+ expect(resolveInitialCurrentOption('mySkills', null, baseUser)).toBe(options.home);
227
+ });
228
+ });
229
+ describe('clampFloatingPanelPosition', function () {
230
+ it('keeps the panel inside the viewport with padding', function () {
231
+ expect(clampFloatingPanelPosition(0, 0, 400, 600, 1200, 800)).toEqual({
232
+ x: 16,
233
+ y: 16
234
+ });
235
+ expect(clampFloatingPanelPosition(2000, 2000, 400, 600, 1200, 800)).toEqual({
236
+ x: 784,
237
+ y: 184
238
+ });
239
+ });
240
+ });
241
+ describe('resolveLegacyContextSession', function () {
242
+ it('returns legacy clone context only on chat view', function () {
243
+ expect(resolveLegacyContextSession(options.chat, options.chat, {
244
+ agentType: 'clone',
245
+ agentEntity: 'project',
246
+ projectName: 'Alpha'
247
+ })).toEqual({
248
+ entityType: 'project',
249
+ contextName: 'Alpha'
250
+ });
251
+ expect(resolveLegacyContextSession(options.home, options.chat, {
252
+ agentType: 'clone',
253
+ agentEntity: 'project',
254
+ projectName: 'Alpha'
255
+ })).toBeNull();
256
+ });
257
+ it('maps task and client names and ignores invalid entities', function () {
258
+ expect(resolveLegacyContextSession(options.chat, options.chat, {
259
+ agentType: 'clone',
260
+ agentEntity: 'task'
261
+ })).toEqual({
262
+ entityType: 'task',
263
+ contextName: ''
264
+ });
265
+ expect(resolveLegacyContextSession(options.chat, options.chat, {
266
+ agentType: 'clone',
267
+ agentEntity: 'task',
268
+ taskName: 'Bugfix'
269
+ })).toEqual({
270
+ entityType: 'task',
271
+ contextName: 'Bugfix'
272
+ });
273
+ expect(resolveLegacyContextSession(options.chat, options.chat, {
274
+ agentType: 'clone',
275
+ agentEntity: 'client',
276
+ clientName: 'Acme'
277
+ })).toEqual({
278
+ entityType: 'client',
279
+ contextName: 'Acme'
280
+ });
281
+ expect(resolveLegacyContextSession(options.chat, options.chat, {
282
+ agentType: 'clone',
283
+ agentEntity: 'global',
284
+ projectName: 'Ignored'
285
+ })).toBeNull();
286
+ });
287
+ });
288
+ describe('hasAnyActiveSessionInMeta', function () {
289
+ it('detects thinking, writing and approval sessions', function () {
290
+ expect(hasAnyActiveSessionInMeta({
291
+ a: {
292
+ status: 'thinking'
293
+ },
294
+ b: {
295
+ status: 'complete'
296
+ }
297
+ })).toBe(true);
298
+ expect(hasAnyActiveSessionInMeta({
299
+ a: {
300
+ status: 'complete'
301
+ }
302
+ })).toBe(false);
303
+ });
304
+ });
305
+ describe('panel restore and floating helpers', function () {
306
+ it('restores expanded panels from saved session snapshots', function () {
307
+ expect(shouldRestoreExpandedPanel({
308
+ isExpanded: true
309
+ })).toBe(true);
310
+ expect(shouldRestoreExpandedPanel({
311
+ isExpanded: false
312
+ })).toBe(false);
313
+ expect(shouldRestoreExpandedPanel(undefined)).toBe(false);
314
+ });
315
+ it('anchors the default floating panel to the bottom-right corner', function () {
316
+ expect(resolveDefaultFloatingPanelPosition(1200, 480)).toEqual({
317
+ x: 704,
318
+ y: 16
319
+ });
320
+ });
321
+ it('skips drag on interactive targets', function () {
322
+ var button = document.createElement('button');
323
+ expect(shouldSkipFloatingDragTarget(button)).toBe(true);
324
+ expect(shouldSkipFloatingDragTarget(document.createElement('div'))).toBe(false);
325
+ });
326
+ });
327
+ describe('isBannerFaqReadyToAutoSend', function () {
328
+ it('blocks auto send when the FAQ is empty or already sent', function () {
329
+ expect(isBannerFaqReadyToAutoSend({
330
+ faqTitle: ' ',
331
+ alreadySent: false,
332
+ loading: false,
333
+ agentId: '1',
334
+ section: 'header'
335
+ })).toBe(false);
336
+ expect(isBannerFaqReadyToAutoSend({
337
+ faqTitle: 'Pregunta',
338
+ alreadySent: true,
339
+ loading: false,
340
+ agentId: '1',
341
+ section: 'header'
342
+ })).toBe(false);
343
+ });
344
+ it('waits for project and client context before auto sending', function () {
345
+ expect(isBannerFaqReadyToAutoSend({
346
+ faqTitle: 'Resumí el proyecto',
347
+ alreadySent: false,
348
+ loading: false,
349
+ agentId: '1',
350
+ section: 'project',
351
+ projectId: null
352
+ })).toBe(false);
353
+ expect(isBannerFaqReadyToAutoSend({
354
+ faqTitle: 'Resumí el proyecto',
355
+ alreadySent: false,
356
+ loading: false,
357
+ agentId: '1',
358
+ section: 'project',
359
+ projectId: 42
360
+ })).toBe(true);
361
+ });
362
+ it('requires client context for client sections and allows header FAQs', function () {
363
+ expect(isBannerFaqReadyToAutoSend({
364
+ faqTitle: 'Pregunta',
365
+ alreadySent: false,
366
+ loading: false,
367
+ agentId: '1',
368
+ section: 'client',
369
+ clientId: null
370
+ })).toBe(false);
371
+ expect(isBannerFaqReadyToAutoSend({
372
+ faqTitle: 'Pregunta',
373
+ alreadySent: false,
374
+ loading: false,
375
+ agentId: '1',
376
+ section: 'client',
377
+ clientId: 9
378
+ })).toBe(true);
379
+ expect(isBannerFaqReadyToAutoSend({
380
+ faqTitle: 'Pregunta',
381
+ alreadySent: false,
382
+ loading: false,
383
+ agentId: '1',
384
+ section: 'header'
385
+ })).toBe(true);
386
+ });
387
+ });
388
+ describe('isLegacyContextEntity', function () {
389
+ it('accepts only project, task and client entities', function () {
390
+ expect(isLegacyContextEntity('project')).toBe(true);
391
+ expect(isLegacyContextEntity('global')).toBe(false);
392
+ });
393
+ });
394
+ describe('getMaiaHostPanelPresentation', function () {
395
+ it('hides expanded panel on maia page route without showing the pill', function () {
396
+ expect(getMaiaHostPanelPresentation(false, true)).toEqual({
397
+ hidePanelContent: true,
398
+ showMinimizedPill: false
399
+ });
400
+ });
401
+ it('keeps the panel visible on other routes when expanded', function () {
402
+ expect(getMaiaHostPanelPresentation(false, false)).toEqual({
403
+ hidePanelContent: false,
404
+ showMinimizedPill: false
405
+ });
406
+ });
407
+ it('shows the pill only when minimized outside maia page', function () {
408
+ expect(getMaiaHostPanelPresentation(true, false)).toEqual({
409
+ hidePanelContent: true,
410
+ showMinimizedPill: true
411
+ });
412
+ expect(getMaiaHostPanelPresentation(true, true)).toEqual({
413
+ hidePanelContent: true,
414
+ showMinimizedPill: false
415
+ });
416
+ });
417
+ });
418
+ describe('ensureAgentsBeforeSkillUse', function () {
419
+ it('returns undefined when useFirstAgent is false', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
420
+ var ensureAgentsLoaded;
421
+ return _regeneratorRuntime.wrap(function (_context) {
422
+ while (1) switch (_context.prev = _context.next) {
423
+ case 0:
424
+ ensureAgentsLoaded = jest.fn().mockResolvedValue([agent('a1')]);
425
+ _context.next = 1;
426
+ return expect(ensureAgentsBeforeSkillUse({
427
+ useFirstAgent: false,
428
+ agents: [],
429
+ ensureAgentsLoaded: ensureAgentsLoaded
430
+ })).resolves.toBeUndefined();
431
+ case 1:
432
+ expect(ensureAgentsLoaded).not.toHaveBeenCalled();
433
+ case 2:
434
+ case "end":
435
+ return _context.stop();
436
+ }
437
+ }, _callee);
438
+ })));
439
+ it('uses the in-memory agents list when it is already populated', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
440
+ var ensureAgentsLoaded;
441
+ return _regeneratorRuntime.wrap(function (_context2) {
442
+ while (1) switch (_context2.prev = _context2.next) {
443
+ case 0:
444
+ ensureAgentsLoaded = jest.fn().mockResolvedValue([agent('a2')]);
445
+ _context2.next = 1;
446
+ return expect(ensureAgentsBeforeSkillUse({
447
+ useFirstAgent: true,
448
+ agents: [agent('a1')],
449
+ ensureAgentsLoaded: ensureAgentsLoaded
450
+ })).resolves.toEqual(agent('a1'));
451
+ case 1:
452
+ expect(ensureAgentsLoaded).not.toHaveBeenCalled();
453
+ case 2:
454
+ case "end":
455
+ return _context2.stop();
456
+ }
457
+ }, _callee2);
458
+ })));
459
+ it('loads agents when the list is empty', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
460
+ var ensureAgentsLoaded;
461
+ return _regeneratorRuntime.wrap(function (_context3) {
462
+ while (1) switch (_context3.prev = _context3.next) {
463
+ case 0:
464
+ ensureAgentsLoaded = jest.fn().mockResolvedValue([agent('a1'), agent('a2')]);
465
+ _context3.next = 1;
466
+ return expect(ensureAgentsBeforeSkillUse({
467
+ useFirstAgent: true,
468
+ agents: [],
469
+ ensureAgentsLoaded: ensureAgentsLoaded
470
+ })).resolves.toEqual(agent('a1'));
471
+ case 1:
472
+ expect(ensureAgentsLoaded).toHaveBeenCalledTimes(1);
473
+ case 2:
474
+ case "end":
475
+ return _context3.stop();
476
+ }
477
+ }, _callee3);
478
+ })));
479
+ it('returns undefined when agents cannot be loaded', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4() {
480
+ var ensureAgentsLoaded;
481
+ return _regeneratorRuntime.wrap(function (_context4) {
482
+ while (1) switch (_context4.prev = _context4.next) {
483
+ case 0:
484
+ ensureAgentsLoaded = jest.fn().mockResolvedValue([]);
485
+ _context4.next = 1;
486
+ return expect(ensureAgentsBeforeSkillUse({
487
+ useFirstAgent: true,
488
+ agents: [],
489
+ ensureAgentsLoaded: ensureAgentsLoaded
490
+ })).resolves.toBeUndefined();
491
+ case 1:
492
+ case "end":
493
+ return _context4.stop();
494
+ }
495
+ }, _callee4);
496
+ })));
497
+ });
498
+ describe('host takeover context helpers', function () {
499
+ it('maps project/task sections to project and task entities', function () {
500
+ var project = {
501
+ id: 1,
502
+ name: 'Alpha'
503
+ };
504
+ var task = {
505
+ id: 9,
506
+ name: 'Bug'
507
+ };
508
+ expect(resolveHostTakeoverEntityState({
509
+ section: 'task',
510
+ project: project,
511
+ task: task
512
+ })).toMatchObject({
513
+ project: project,
514
+ task: task,
515
+ clearGlobalPinnedContext: false
516
+ });
517
+ expect(resolveHostTakeoverEntityState({
518
+ section: 'task',
519
+ project: project,
520
+ task: task
521
+ }).client).toBeUndefined();
522
+ });
523
+ it('clears client on header/planner takeover and sets client on client section', function () {
524
+ var client = {
525
+ id: 2,
526
+ name: 'Acme'
527
+ };
528
+ expect(resolveHostTakeoverEntityState({
529
+ section: 'header'
530
+ })).toMatchObject({
531
+ project: null,
532
+ client: null,
533
+ task: null,
534
+ clearGlobalPinnedContext: true
535
+ });
536
+ expect(resolveHostTakeoverEntityState({
537
+ section: 'client',
538
+ client: client
539
+ })).toMatchObject({
540
+ project: null,
541
+ client: client,
542
+ clearGlobalPinnedContext: false
543
+ });
544
+ });
545
+ it('builds persist host context for panel session patch', function () {
546
+ var project = {
547
+ id: 3,
548
+ name: 'Beta'
549
+ };
550
+ expect(buildHostTakeoverPersistContext({
551
+ section: 'project',
552
+ project: project
553
+ })).toEqual({
554
+ section: 'project',
555
+ project: project,
556
+ client: null,
557
+ task: null,
558
+ chipsProject: null
559
+ });
560
+ });
561
+ it('defaults missing project, client and task entities on takeover', function () {
562
+ expect(resolveHostTakeoverEntityState({
563
+ section: 'project'
564
+ })).toMatchObject({
565
+ project: null,
566
+ task: null
567
+ });
568
+ expect(resolveHostTakeoverEntityState({
569
+ section: 'client'
570
+ })).toMatchObject({
571
+ client: null
572
+ });
573
+ expect(resolveHostTakeoverEntityState({
574
+ section: 'task',
575
+ project: {
576
+ id: 1
577
+ }
578
+ })).toMatchObject({
579
+ task: null
580
+ });
581
+ expect(buildHostTakeoverPersistContext({
582
+ section: 'planner'
583
+ })).toMatchObject({
584
+ project: null,
585
+ client: null,
586
+ task: null
587
+ });
588
+ expect(buildHostTakeoverPersistContext({
589
+ section: 'client'
590
+ })).toMatchObject({
591
+ client: null
592
+ });
593
+ expect(buildHostTakeoverPersistContext({
594
+ section: 'client',
595
+ client: {
596
+ id: 9,
597
+ name: 'Client'
598
+ }
599
+ }).client).toEqual({
600
+ id: 9,
601
+ name: 'Client'
602
+ });
603
+ expect(buildHostTakeoverPersistContext({
604
+ section: 'task',
605
+ task: {
606
+ id: 1,
607
+ name: 'T'
608
+ }
609
+ }).task).toEqual({
610
+ id: 1,
611
+ name: 'T'
612
+ });
613
+ var project = {
614
+ id: 4,
615
+ name: 'P'
616
+ };
617
+ expect(buildHostTakeoverPersistContext({
618
+ section: 'task',
619
+ project: project,
620
+ task: {
621
+ id: 1,
622
+ name: 'T'
623
+ }
624
+ })).toMatchObject({
625
+ project: project,
626
+ task: {
627
+ id: 1,
628
+ name: 'T'
629
+ }
630
+ });
631
+ });
632
+ });
633
+ describe('modal navigation and session helpers', function () {
634
+ it('normalizes br to pt-br for modal i18n', function () {
635
+ expect(resolveMaiaModalI18nLang('br')).toBe('pt-br');
636
+ expect(resolveMaiaModalI18nLang('es')).toBe('es');
637
+ });
638
+ it('checks agent management permissions with multi-agents flag', function () {
639
+ expect(resolveUserHasAgentManagementPermissions({
640
+ ai_agents: {
641
+ create: true
642
+ }
643
+ }, true)).toBe(true);
644
+ expect(resolveUserHasAgentManagementPermissions({
645
+ ai_agents: {
646
+ edit: true
647
+ }
648
+ }, true)).toBe(true);
649
+ expect(resolveUserHasAgentManagementPermissions({
650
+ ai_agents: {
651
+ "delete": true
652
+ }
653
+ }, true)).toBe(true);
654
+ expect(resolveUserHasAgentManagementPermissions({
655
+ ai_agents: {
656
+ create: true
657
+ }
658
+ }, false)).toBe(false);
659
+ });
660
+ it('decides when to start a new chat from catalog views', function () {
661
+ expect(shouldStartNewChatFromCatalog(options.myAgents, false)).toBe(true);
662
+ expect(shouldStartNewChatFromCatalog(options.home, true)).toBe(true);
663
+ expect(shouldStartNewChatFromCatalog(options.home, false)).toBe(false);
664
+ });
665
+ it('handles back navigation branches', function () {
666
+ expect(shouldBackStartNewChatPreservingContext(options.chat, options.chat)).toBe(true);
667
+ expect(shouldBackClearPinnedContext(options.home, options.home, 'header', false)).toBe(true);
668
+ expect(shouldBackClearPinnedContext(options.home, options.home, 'project', false)).toBe(false);
669
+ });
670
+ it('marks orchestrator context reset on pinned-to-empty transition', function () {
671
+ expect(shouldMarkOrchestratorContextReset('project', 'orchestrator', true, false)).toBe(true);
672
+ expect(shouldMarkOrchestratorContextReset('header', 'orchestrator', true, false)).toBe(false);
673
+ });
674
+ it('prefers unread chats when restoring from minimized', function () {
675
+ var _resolveMinimizedRest, _resolveMinimizedRest2;
676
+ var chats = [{
677
+ sessionExternalId: 's1',
678
+ isRead: true
679
+ }, {
680
+ sessionExternalId: 's2',
681
+ isRead: false
682
+ }];
683
+ expect((_resolveMinimizedRest = resolveMinimizedRestoreTarget(chats, 's1')) === null || _resolveMinimizedRest === void 0 ? void 0 : _resolveMinimizedRest.sessionExternalId).toBe('s2');
684
+ expect((_resolveMinimizedRest2 = resolveMinimizedRestoreTarget([{
685
+ sessionExternalId: 's1',
686
+ isRead: true
687
+ }], 's1')) === null || _resolveMinimizedRest2 === void 0 ? void 0 : _resolveMinimizedRest2.sessionExternalId).toBe('s1');
688
+ expect(resolveMinimizedRestoreTarget([{
689
+ sessionExternalId: 's1',
690
+ isRead: true
691
+ }], undefined)).toBeUndefined();
692
+ });
693
+ it('resolves host takeover agent id', function () {
694
+ expect(resolveHostTakeoverAgentId(false, [agent('a1')], 'current')).toBe('current');
695
+ expect(resolveHostTakeoverAgentId(false, [agent('a1')], undefined)).toBeNull();
696
+ expect(resolveHostTakeoverAgentId(true, [agent('a1')], 'current')).toBe('a1');
697
+ expect(resolveHostTakeoverAgentId(true, [], 'current')).toBeNull();
698
+ });
699
+ it('builds panel session patch only when expanded', function () {
700
+ expect(buildMaiaPanelSessionPatch({
701
+ isMinimized: true,
702
+ currentOption: options.home,
703
+ agentsNavActive: null,
704
+ activeChatId: null,
705
+ agentId: null,
706
+ sidebarOpen: false,
707
+ layoutMode: 'floating',
708
+ dragPosition: {
709
+ x: 1,
710
+ y: 2
711
+ },
712
+ hostContext: {
713
+ section: 'header',
714
+ project: null,
715
+ client: null,
716
+ task: null,
717
+ chipsProject: null
718
+ }
719
+ })).toBeNull();
720
+ expect(buildMaiaPanelSessionPatch({
721
+ isMinimized: false,
722
+ currentOption: options.chat,
723
+ agentsNavActive: 'myAgents',
724
+ activeChatId: 'chat-1',
725
+ agentId: '1',
726
+ sidebarOpen: true,
727
+ layoutMode: 'sidebar',
728
+ dragPosition: {
729
+ x: 1,
730
+ y: 2
731
+ },
732
+ hostContext: {
733
+ section: 'header',
734
+ project: null,
735
+ client: null,
736
+ task: null,
737
+ chipsProject: null
738
+ }
739
+ })).toMatchObject({
740
+ activeChatId: 'chat-1',
741
+ dragPosition: null
742
+ });
743
+ expect(buildMaiaPanelSessionPatch({
744
+ isMinimized: false,
745
+ currentOption: options.chat,
746
+ agentsNavActive: null,
747
+ activeChatId: 'chat-1',
748
+ agentId: '1',
749
+ sidebarOpen: false,
750
+ layoutMode: 'floating',
751
+ dragPosition: {
752
+ x: 3,
753
+ y: 4
754
+ },
755
+ hostContext: {
756
+ section: 'header',
757
+ project: null,
758
+ client: null,
759
+ task: null,
760
+ chipsProject: null
761
+ }
762
+ })).toMatchObject({
763
+ dragPosition: {
764
+ x: 3,
765
+ y: 4
766
+ }
767
+ });
768
+ });
769
+ it('resolves floating drag position with clamp fallback', function () {
770
+ var clamp = function clamp(x, y) {
771
+ return {
772
+ x: x,
773
+ y: y
774
+ };
775
+ };
776
+ expect(resolveFloatingPanelDragPosition({
777
+ layoutMode: 'sidebar',
778
+ dragPosition: {
779
+ x: 5,
780
+ y: 6
781
+ },
782
+ viewportWidth: 1200,
783
+ panelWidth: 400,
784
+ clamp: clamp
785
+ })).toEqual({
786
+ x: 5,
787
+ y: 6
788
+ });
789
+ expect(resolveFloatingPanelDragPosition({
790
+ layoutMode: 'floating',
791
+ dragPosition: null,
792
+ viewportWidth: 1200,
793
+ panelWidth: 400,
794
+ clamp: clamp
795
+ })).toEqual({
796
+ x: 784,
797
+ y: 16
798
+ });
799
+ expect(resolveFloatingPanelDragPosition({
800
+ layoutMode: 'floating',
801
+ dragPosition: {
802
+ x: 40,
803
+ y: 50
804
+ },
805
+ viewportWidth: 1200,
806
+ panelWidth: 400,
807
+ clamp: clamp
808
+ })).toEqual({
809
+ x: 40,
810
+ y: 50
811
+ });
812
+ });
813
+ it('reuses previous drag position when unchanged', function () {
814
+ var prev = {
815
+ x: 10,
816
+ y: 20
817
+ };
818
+ expect(resolveNextDragPosition(prev, {
819
+ x: 10,
820
+ y: 20
821
+ })).toBe(prev);
822
+ expect(resolveNextDragPosition(prev, {
823
+ x: 11,
824
+ y: 20
825
+ })).toEqual({
826
+ x: 11,
827
+ y: 20
828
+ });
829
+ });
830
+ });
831
+ describe('navigation and legacy context helpers', function () {
832
+ it('resolves pinned context and back button visibility', function () {
833
+ expect(resolveHasPinnedContext({
834
+ taskId: 1
835
+ })).toBe(true);
836
+ expect(resolveHasPinnedContext({})).toBe(false);
837
+ var flags = resolveOrchestratorHomeNavFlags({
838
+ computedCurrentOption: options.chat,
839
+ homeOption: options.home,
840
+ chatOption: options.chat,
841
+ hasPinnedContext: true,
842
+ section: 'header',
843
+ didResetContextInSection: false
844
+ });
845
+ expect(flags.isChatView).toBe(true);
846
+ expect(shouldShowOrchestratorBackButton(_objectSpread({
847
+ agentType: 'orchestrator',
848
+ hasError: false,
849
+ loading: false
850
+ }, flags))).toBe(true);
851
+ var sectionResetFlags = resolveOrchestratorHomeNavFlags({
852
+ computedCurrentOption: options.home,
853
+ homeOption: options.home,
854
+ chatOption: options.chat,
855
+ hasPinnedContext: true,
856
+ section: 'project',
857
+ didResetContextInSection: true
858
+ });
859
+ expect(sectionResetFlags.isSectionResetHomeStep2).toBe(true);
860
+ expect(shouldShowOrchestratorBackButton(_objectSpread({
861
+ agentType: 'orchestrator',
862
+ hasError: true,
863
+ loading: false
864
+ }, sectionResetFlags))).toBe(false);
865
+ expect(shouldShowOrchestratorBackButton({
866
+ agentType: 'orchestrator',
867
+ hasError: false,
868
+ loading: true,
869
+ isChatView: true,
870
+ isHeaderHomeStep2: false,
871
+ isSectionResetHomeStep2: false
872
+ })).toBe(false);
873
+ expect(shouldShowOrchestratorBackButton({
874
+ agentType: 'orchestrator',
875
+ hasError: false,
876
+ loading: false,
877
+ isChatView: false,
878
+ isHeaderHomeStep2: false,
879
+ isSectionResetHomeStep2: true
880
+ })).toBe(true);
881
+ });
882
+ it('builds legacy migration patches for client, project and task entities', function () {
883
+ var _buildLegacyContextMi, _buildLegacyContextMi2, _buildLegacyContextMi3, _buildLegacyContextMi4, _buildLegacyContextMi5, _buildLegacyContextMi6, _buildLegacyContextMi7, _buildLegacyContextMi8, _buildLegacyContextMi9;
884
+ expect(buildLegacyContextMigrationPatch(null)).toBeNull();
885
+ expect(buildLegacyContextMigrationPatch({
886
+ agentEntity: 'client'
887
+ })).toBeNull();
888
+ expect((_buildLegacyContextMi = buildLegacyContextMigrationPatch({
889
+ agentEntity: 'client',
890
+ clientId: 3,
891
+ clientName: 'ACME'
892
+ })) === null || _buildLegacyContextMi === void 0 ? void 0 : _buildLegacyContextMi.client).toEqual({
893
+ id: 3,
894
+ name: 'ACME'
895
+ });
896
+ expect((_buildLegacyContextMi2 = buildLegacyContextMigrationPatch({
897
+ agentEntity: 'project',
898
+ projectId: 9,
899
+ projectName: 'P'
900
+ })) === null || _buildLegacyContextMi2 === void 0 || (_buildLegacyContextMi2 = _buildLegacyContextMi2.chipsProject) === null || _buildLegacyContextMi2 === void 0 ? void 0 : _buildLegacyContextMi2.projectId).toBe('9');
901
+ expect((_buildLegacyContextMi3 = buildLegacyContextMigrationPatch({
902
+ agentEntity: 'task',
903
+ taskId: 1,
904
+ taskName: 'T',
905
+ projectId: 2,
906
+ projectName: 'P',
907
+ clientId: 4,
908
+ clientName: 'C'
909
+ })) === null || _buildLegacyContextMi3 === void 0 ? void 0 : _buildLegacyContextMi3.task).toMatchObject({
910
+ id: 1,
911
+ name: 'T',
912
+ projectId: 2
913
+ });
914
+ expect((_buildLegacyContextMi4 = buildLegacyContextMigrationPatch({
915
+ agentEntity: 'project',
916
+ projectId: 9,
917
+ projectName: 'P',
918
+ clientId: 4,
919
+ clientName: 'C'
920
+ })) === null || _buildLegacyContextMi4 === void 0 ? void 0 : _buildLegacyContextMi4.project).toMatchObject({
921
+ clientId: 4
922
+ });
923
+ expect((_buildLegacyContextMi5 = buildLegacyContextMigrationPatch({
924
+ agentEntity: 'task',
925
+ taskId: 5,
926
+ taskName: 'Only task'
927
+ })) === null || _buildLegacyContextMi5 === void 0 ? void 0 : _buildLegacyContextMi5.task).toEqual({
928
+ id: 5,
929
+ name: 'Only task'
930
+ });
931
+ expect((_buildLegacyContextMi6 = buildLegacyContextMigrationPatch({
932
+ agentEntity: 'client',
933
+ clientId: 1
934
+ })) === null || _buildLegacyContextMi6 === void 0 ? void 0 : _buildLegacyContextMi6.client).toEqual({
935
+ id: 1,
936
+ name: ''
937
+ });
938
+ expect((_buildLegacyContextMi7 = buildLegacyContextMigrationPatch({
939
+ agentEntity: 'task',
940
+ taskId: 8,
941
+ taskName: 'T',
942
+ projectId: 2,
943
+ projectName: 'P'
944
+ })) === null || _buildLegacyContextMi7 === void 0 || (_buildLegacyContextMi7 = _buildLegacyContextMi7.chipsProject) === null || _buildLegacyContextMi7 === void 0 ? void 0 : _buildLegacyContextMi7.projectId).toBe('2');
945
+ expect((_buildLegacyContextMi8 = buildLegacyContextMigrationPatch({
946
+ agentEntity: 'task',
947
+ taskId: 6,
948
+ taskName: 'T',
949
+ clientId: 3,
950
+ clientName: 'C'
951
+ })) === null || _buildLegacyContextMi8 === void 0 ? void 0 : _buildLegacyContextMi8.client).toEqual({
952
+ id: 3,
953
+ name: 'C'
954
+ });
955
+ expect((_buildLegacyContextMi9 = buildLegacyContextMigrationPatch({
956
+ agentEntity: 'project',
957
+ projectId: 9,
958
+ projectName: 'P'
959
+ })) === null || _buildLegacyContextMi9 === void 0 ? void 0 : _buildLegacyContextMi9.project).not.toHaveProperty('clientId');
960
+ expect(buildLegacyContextMigrationPatch({
961
+ agentEntity: 'task',
962
+ taskId: 10,
963
+ taskName: 'Full task',
964
+ projectId: 11,
965
+ projectName: 'Proj',
966
+ clientId: 12,
967
+ clientName: 'Client'
968
+ })).toMatchObject({
969
+ task: {
970
+ id: 10,
971
+ name: 'Full task',
972
+ projectId: 11,
973
+ clientId: 12
974
+ },
975
+ client: {
976
+ id: 12,
977
+ name: 'Client'
978
+ },
979
+ chipsProject: {
980
+ projectId: '11',
981
+ projectName: 'Proj',
982
+ clientName: 'Client'
983
+ }
984
+ });
985
+ });
986
+ it('resolves floating drag clamp and layout position updates', function () {
987
+ expect(shouldUseDragClampFallback(null)).toBe(true);
988
+ var clamp = function clamp(x, y) {
989
+ return {
990
+ x: x,
991
+ y: y
992
+ };
993
+ };
994
+ expect(resolveLayoutDragPositionUpdate('floating', {
995
+ x: 4,
996
+ y: 8
997
+ }, clamp, {
998
+ innerWidth: 1000,
999
+ panelWidth: 400,
1000
+ pad: 16
1001
+ })).toEqual({
1002
+ x: 4,
1003
+ y: 8
1004
+ });
1005
+ expect(resolveLayoutDragPositionUpdate('floating', null, clamp, {
1006
+ innerWidth: 1000,
1007
+ panelWidth: 400,
1008
+ pad: 16
1009
+ })).toEqual({
1010
+ x: 584,
1011
+ y: 16
1012
+ });
1013
+ expect(resolveLayoutDragPositionUpdate('sidebar', null, clamp, {
1014
+ innerWidth: 0,
1015
+ panelWidth: 0,
1016
+ pad: 0
1017
+ })).toBeNull();
1018
+ expect(resolvePersistedDragPositionOnEnd('floating', {})).toBe(true);
1019
+ expect(resolvePersistedDragPositionOnEnd('sidebar', {})).toBe(false);
1020
+ });
1021
+ it('builds initial chat message payload from start chat args', function () {
1022
+ expect(buildUserInitialMessageFromStartChat({
1023
+ message: 'hola',
1024
+ faqId: 'f1'
1025
+ })).toMatchObject({
1026
+ message: 'hola',
1027
+ faqId: 'f1',
1028
+ attachments: []
1029
+ });
1030
+ expect(buildUserInitialMessageFromStartChat({
1031
+ attachments: [{
1032
+ id: '1'
1033
+ }],
1034
+ agentSuggestionId: 's1',
1035
+ mentions: [{
1036
+ id: 'm1'
1037
+ }],
1038
+ fuaId: 'fua',
1039
+ scId: 'sc',
1040
+ contextData: {
1041
+ taskId: 1
1042
+ }
1043
+ })).toMatchObject({
1044
+ message: '',
1045
+ attachments: [{
1046
+ id: '1'
1047
+ }],
1048
+ agentSuggestionId: 's1',
1049
+ mentions: [{
1050
+ id: 'm1'
1051
+ }],
1052
+ fuaId: 'fua',
1053
+ scId: 'sc',
1054
+ contextData: {
1055
+ taskId: 1
1056
+ }
1057
+ });
1058
+ expect(shouldResetSidebarErrorOnStartChat(true)).toBe(true);
1059
+ });
1060
+ it('supports go-home and send routing guards', function () {
1061
+ var _findOrchestratorAgen;
1062
+ expect(shouldClearClientOnGoHomeFromChat('client')).toBe(false);
1063
+ expect(shouldResetAgentToFirstOnGoHome({
1064
+ has_not_access: true
1065
+ }, 2)).toBe(true);
1066
+ expect(shouldResetAgentToFirstOnGoHome(null, 2)).toBe(true);
1067
+ expect(shouldResetAgentToFirstOnGoHome({
1068
+ is_deleted: true
1069
+ }, 1)).toBe(true);
1070
+ expect(shouldResetAgentToFirstOnGoHome({
1071
+ has_not_access: true
1072
+ }, 0)).toBe(false);
1073
+ expect(shouldUseActiveChatSendHandler(options.chat, options.chat, true)).toBe(true);
1074
+ expect(canOpenMaiaMarketplace(false)).toBe(false);
1075
+ expect((_findOrchestratorAgen = findOrchestratorAgent([agent('2'), orchestratorAgent])) === null || _findOrchestratorAgen === void 0 ? void 0 : _findOrchestratorAgen.type).toBe('orchestrator');
1076
+ expect(shouldMarkAgentAsLegacyContext({}, {
1077
+ id: '1'
1078
+ })).toBe(true);
1079
+ expect(shouldMarkAgentAsLegacyContext({}, {
1080
+ id: '1',
1081
+ is_legacy_context: true
1082
+ })).toBe(false);
1083
+ expect(buildLegacyContextAgent({
1084
+ id: '1',
1085
+ name: 'A',
1086
+ type: 'custom'
1087
+ }).is_legacy_context).toBe(true);
1088
+ });
1089
+ });
1090
+ describe('mount, banner and agents loading helpers', function () {
1091
+ it('controls chat visibility and last active chat persistence', function () {
1092
+ expect(shouldSetChatViewHiddenOnMount(false)).toBe(true);
1093
+ expect(shouldSetChatViewHiddenOnMount(true)).toBe(false);
1094
+ expect(shouldPersistLastActiveChatId('chat-1')).toBe(true);
1095
+ expect(shouldPersistLastActiveChatId(null)).toBe(false);
1096
+ expect(shouldSyncPanelSessionOnPageHide(false)).toBe(true);
1097
+ expect(shouldSyncPanelSessionOnPageHide(true)).toBe(false);
1098
+ });
1099
+ it('detects banner FAQ titles', function () {
1100
+ expect(hasBannerFaqTitle(' ')).toBe(false);
1101
+ expect(hasBannerFaqTitle('Pregunta')).toBe(true);
1102
+ });
1103
+ it('resolves cached agents and initial fetch attempts', function () {
1104
+ expect(resolveCachedAgentsIfAvailable([agent('1')])).toEqual([agent('1')]);
1105
+ expect(resolveCachedAgentsIfAvailable([])).toBeNull();
1106
+ expect(shouldAttemptInitialAgentsFetch(0, false)).toBe(true);
1107
+ expect(shouldAttemptInitialAgentsFetch(0, true)).toBe(false);
1108
+ expect(shouldAttemptInitialAgentsFetch(2, false)).toBe(false);
1109
+ });
1110
+ it('finds agents for chat items with numeric ids', function () {
1111
+ var _findAgentForChatItem;
1112
+ expect((_findAgentForChatItem = findAgentForChatItem([_objectSpread(_objectSpread({}, agent('7')), {}, {
1113
+ id: '7'
1114
+ })], 7)) === null || _findAgentForChatItem === void 0 ? void 0 : _findAgentForChatItem.id).toBe('7');
1115
+ expect(findAgentForChatItem([agent('1')], 99)).toBeUndefined();
1116
+ });
1117
+ });
1118
+ describe('host takeover and navigation guards', function () {
1119
+ it('applies client updates only when defined', function () {
1120
+ expect(shouldApplyClientOnHostTakeover(undefined)).toBe(false);
1121
+ expect(shouldApplyClientOnHostTakeover(null)).toBe(true);
1122
+ expect(shouldApplyClientOnHostTakeover({
1123
+ id: 1,
1124
+ name: 'Acme'
1125
+ })).toBe(true);
1126
+ });
1127
+ it('selects first agent on global host takeover', function () {
1128
+ expect(shouldSelectFirstAgentOnHostTakeover(true, agent('1'))).toBe(true);
1129
+ expect(shouldSelectFirstAgentOnHostTakeover(false, agent('1'))).toBe(false);
1130
+ expect(shouldSelectFirstAgentOnHostTakeover(true, undefined)).toBe(false);
1131
+ });
1132
+ it('covers go-home, catalog and skill agent guards', function () {
1133
+ expect(shouldResetChatStateOnGoHome(options.chat, options.chat)).toBe(true);
1134
+ expect(shouldResetChatStateOnGoHome(options.home, options.chat)).toBe(false);
1135
+ expect(shouldClearContextForCatalogOrSkillAgent(agent('1'))).toBe(true);
1136
+ expect(shouldClearContextForCatalogOrSkillAgent(undefined)).toBe(false);
1137
+ expect(shouldClearTaskOnGoHomeFromChat('task')).toBe(false);
1138
+ expect(shouldClearTaskOnGoHomeFromChat('header')).toBe(true);
1139
+ expect(shouldClearOrchestratorGlobalContextOnGoHome('header', 'orchestrator')).toBe(true);
1140
+ expect(shouldClearOrchestratorGlobalContextOnGoHome('project', 'orchestrator')).toBe(false);
1141
+ expect(shouldPrefetchAgentsForCatalogNewChat(options.myAgents, options.myAgents, options.mySkills)).toBe(true);
1142
+ expect(shouldPrefetchAgentsForCatalogNewChat(options.home, options.myAgents, options.mySkills)).toBe(false);
1143
+ });
1144
+ it('resolves open-new-chat-with-agent context patches', function () {
1145
+ expect(resolveOpenNewChatWithAgentContext({
1146
+ project: {
1147
+ id: 1,
1148
+ name: 'P'
1149
+ }
1150
+ })).toMatchObject({
1151
+ project: {
1152
+ id: 1,
1153
+ name: 'P'
1154
+ },
1155
+ shouldSetTask: false
1156
+ });
1157
+ expect(resolveOpenNewChatWithAgentContext({
1158
+ task: {
1159
+ id: 2,
1160
+ name: 'T'
1161
+ }
1162
+ }).shouldSetTask).toBe(true);
1163
+ });
1164
+ it('validates legacy context continuation', function () {
1165
+ expect(canContinueLegacyContextInNewChat({
1166
+ agentEntity: 'task'
1167
+ }, orchestratorAgent)).toBe(true);
1168
+ expect(canContinueLegacyContextInNewChat(null, orchestratorAgent)).toBe(false);
1169
+ });
1170
+ });
1171
+ describe('session restore routing', function () {
1172
+ it('maps snapshot nav routes', function () {
1173
+ expect(resolveSessionRestoreNavRoute({
1174
+ agentsNavActive: 'myAgents'
1175
+ })).toBe('myAgents');
1176
+ expect(resolveSessionRestoreNavRoute({
1177
+ agentsNavActive: 'mySkills'
1178
+ })).toBe('mySkills');
1179
+ expect(resolveSessionRestoreNavRoute({
1180
+ agentsNavActive: 'maiaker'
1181
+ })).toBe('maiaker');
1182
+ expect(resolveSessionRestoreNavRoute({
1183
+ currentOption: 'chat',
1184
+ activeChatId: 's-1'
1185
+ })).toBe('chat');
1186
+ expect(resolveSessionRestoreNavRoute({
1187
+ currentOption: 'home'
1188
+ })).toBe('savedOption');
1189
+ expect(resolveSessionRestoreNavRoute({
1190
+ currentOption: 'invalid'
1191
+ })).toBe('none');
1192
+ });
1193
+ it('controls agents load branches during restore', function () {
1194
+ expect(shouldSkipAgentsLoadOnSessionRestore('mySkills')).toBe(true);
1195
+ expect(shouldSkipAgentsLoadOnSessionRestore('myAgents')).toBe(false);
1196
+ expect(shouldFetchAgentDetailOnSessionRestore('a1', 'maiaker')).toBe(true);
1197
+ expect(shouldFetchAgentDetailOnSessionRestore('a1', 'myAgents')).toBe(false);
1198
+ expect(shouldPassAgentToGetAgentsOnRestore('myAgents')).toBe(false);
1199
+ expect(shouldPassAgentToGetAgentsOnRestore('maiaker')).toBe(true);
1200
+ expect(shouldSelectFetchedAgentAfterRestore(agent('1'), 'maiaker')).toBe(true);
1201
+ expect(shouldSelectFetchedAgentAfterRestore(agent('1'), 'myAgents')).toBe(false);
1202
+ });
1203
+ it('restores chips project from snapshot host context', function () {
1204
+ var _resolveSnapshotChips;
1205
+ expect((_resolveSnapshotChips = resolveSnapshotChipsProject({
1206
+ chipsProject: {
1207
+ projectId: '9',
1208
+ projectName: 'P',
1209
+ clientName: 'C'
1210
+ }
1211
+ })) === null || _resolveSnapshotChips === void 0 ? void 0 : _resolveSnapshotChips.projectId).toBe('9');
1212
+ expect(resolveSnapshotChipsProject(null)).toBeNull();
1213
+ });
1214
+ });
1215
+ describe('layout and modal visibility helpers', function () {
1216
+ it('resolves section flags and sidebar visibility', function () {
1217
+ expect(resolveChatModalSectionFlags(options.chat, false)).toMatchObject({
1218
+ showNewChat: false,
1219
+ isMyAgentsSection: false
1220
+ });
1221
+ expect(resolveChatModalSectionFlags(options.home, true)).toMatchObject({
1222
+ isMaiakerCreatorHome: true
1223
+ });
1224
+ expect(shouldRenderChatSidebar(true, false)).toBe(true);
1225
+ expect(shouldRenderChatSidebar(true, true)).toBe(false);
1226
+ expect(shouldRenderChatSidebar(true, false, true)).toBe(false);
1227
+ });
1228
+ it('resolves main content view and footer visibility', function () {
1229
+ expect(resolveChatModalMainContentView(true, true)).toBe('error');
1230
+ expect(resolveChatModalMainContentView(false, true)).toBe('chat');
1231
+ expect(resolveChatModalMainContentView(false, false)).toBe('projectSummary');
1232
+ expect(shouldShowChatModalFooter({
1233
+ computedCurrentOption: options.chat,
1234
+ homeOption: options.home,
1235
+ chatOption: options.chat,
1236
+ agentsCount: 0,
1237
+ isMaiakerCreatorHome: false,
1238
+ hasError: false,
1239
+ loading: false,
1240
+ hasAccess: true
1241
+ })).toBe(true);
1242
+ expect(shouldShowChatModalFooter({
1243
+ computedCurrentOption: options.home,
1244
+ homeOption: options.home,
1245
+ chatOption: options.chat,
1246
+ agentsCount: 0,
1247
+ isMaiakerCreatorHome: false,
1248
+ hasError: false,
1249
+ loading: false,
1250
+ hasAccess: true
1251
+ })).toBe(false);
1252
+ expect(shouldShowChatModalFooter({
1253
+ computedCurrentOption: options.home,
1254
+ homeOption: options.home,
1255
+ chatOption: options.chat,
1256
+ agentsCount: 2,
1257
+ isMaiakerCreatorHome: false,
1258
+ hasError: false,
1259
+ loading: false,
1260
+ hasAccess: true
1261
+ })).toBe(true);
1262
+ });
1263
+ it('covers floating drag and elevated panel branches', function () {
1264
+ expect(shouldClearDragPositionOnLayoutChange('sidebar')).toBe(true);
1265
+ expect(shouldClearDragPositionOnLayoutChange('floating')).toBe(false);
1266
+ expect(shouldPersistDragPositionOnDragEnd('floating')).toBe(true);
1267
+ expect(shouldStartFloatingPanelDrag(true, 0)).toBe(true);
1268
+ expect(shouldStartFloatingPanelDrag(true, 1)).toBe(false);
1269
+ expect(isActiveFloatingDragPointer(1, 1)).toBe(true);
1270
+ expect(isActiveFloatingDragPointer(1, 2)).toBe(false);
1271
+ expect(shouldUseElevatedMaiaPanel('task')).toBe(true);
1272
+ expect(isGlobalMaiaSection('header')).toBe(true);
1273
+ });
1274
+ it('covers delete agent and skills catalog guards', function () {
1275
+ expect(shouldReselectAgentAfterDelete('a1', 'a1')).toBe(true);
1276
+ expect(shouldReselectAgentAfterDelete('a1', 'a2')).toBe(false);
1277
+ expect(shouldOpenSkillsCatalog(true)).toBe(true);
1278
+ expect(shouldOpenSkillsCatalog(false)).toBe(false);
1279
+ });
1280
+ it('hides the footer on maiaker home, errors, loading or missing access', function () {
1281
+ var base = {
1282
+ computedCurrentOption: options.chat,
1283
+ homeOption: options.home,
1284
+ chatOption: options.chat,
1285
+ agentsCount: 0,
1286
+ isMaiakerCreatorHome: false,
1287
+ hasError: false,
1288
+ loading: false,
1289
+ hasAccess: true
1290
+ };
1291
+ expect(shouldShowChatModalFooter(_objectSpread(_objectSpread({}, base), {}, {
1292
+ isMaiakerCreatorHome: true
1293
+ }))).toBe(false);
1294
+ expect(shouldShowChatModalFooter(_objectSpread(_objectSpread({}, base), {}, {
1295
+ hasError: true
1296
+ }))).toBe(false);
1297
+ expect(shouldShowChatModalFooter(_objectSpread(_objectSpread({}, base), {}, {
1298
+ loading: true
1299
+ }))).toBe(false);
1300
+ expect(shouldShowChatModalFooter(_objectSpread(_objectSpread({}, base), {}, {
1301
+ hasAccess: false
1302
+ }))).toBe(false);
1303
+ });
1304
+ it('builds start-chat payloads and drag position updates', function () {
1305
+ expect(buildUserInitialMessageFromStartChat({
1306
+ message: 'Hola',
1307
+ attachments: [{
1308
+ id: '1'
1309
+ }],
1310
+ faqId: 'faq-1',
1311
+ agentSuggestionId: 'sug-1',
1312
+ mentions: [{
1313
+ id: 'm1'
1314
+ }],
1315
+ fuaId: 'fua-1',
1316
+ scId: 'sc-1',
1317
+ contextData: {
1318
+ projectId: 1
1319
+ }
1320
+ })).toMatchObject({
1321
+ message: 'Hola',
1322
+ faqId: 'faq-1',
1323
+ agentSuggestionId: 'sug-1',
1324
+ mentions: [{
1325
+ id: 'm1'
1326
+ }],
1327
+ fuaId: 'fua-1',
1328
+ scId: 'sc-1',
1329
+ contextData: {
1330
+ projectId: 1
1331
+ }
1332
+ });
1333
+ expect(resolveLayoutDragPositionUpdate('sidebar', {
1334
+ x: 1,
1335
+ y: 2
1336
+ }, function (x, y) {
1337
+ return {
1338
+ x: x,
1339
+ y: y
1340
+ };
1341
+ }, {
1342
+ innerWidth: 1000,
1343
+ panelWidth: 400,
1344
+ pad: 16
1345
+ })).toBeNull();
1346
+ expect(resolveLayoutDragPositionUpdate('floating', null, function (x, y) {
1347
+ return {
1348
+ x: x,
1349
+ y: y
1350
+ };
1351
+ }, {
1352
+ innerWidth: 1000,
1353
+ panelWidth: 400,
1354
+ pad: 16
1355
+ })).toEqual({
1356
+ x: 584,
1357
+ y: 16
1358
+ });
1359
+ expect(resolvePersistedDragPositionOnEnd('floating', document.createElement('div'))).toBe(true);
1360
+ expect(resolvePersistedDragPositionOnEnd('sidebar', document.createElement('div'))).toBe(false);
1361
+ });
1362
+ });
1363
+ describe('dispatchSkillMentionInsert', function () {
1364
+ it('dispatches the skill mention after two animation frames', function () {
1365
+ jest.useFakeTimers();
1366
+ var raf = jest.spyOn(window, 'requestAnimationFrame').mockImplementation(function (callback) {
1367
+ return window.setTimeout(function () {
1368
+ return callback(0);
1369
+ }, 0);
1370
+ });
1371
+ var onInsert = jest.fn();
1372
+ var onRefocus = jest.fn();
1373
+ document.addEventListener('maia-insert-skill-mention', onInsert);
1374
+ document.addEventListener('maia-input-refocus', onRefocus);
1375
+ dispatchSkillMentionInsert({
1376
+ id: 'sk1',
1377
+ name: 'Resumir'
1378
+ });
1379
+ expect(onInsert).not.toHaveBeenCalled();
1380
+ jest.runAllTimers();
1381
+ expect(onInsert).toHaveBeenCalledTimes(1);
1382
+ expect(onRefocus).toHaveBeenCalledTimes(1);
1383
+ var event = onInsert.mock.calls[0][0];
1384
+ expect(event.detail.skill).toEqual({
1385
+ id: 'sk1',
1386
+ name: 'Resumir'
1387
+ });
1388
+ document.removeEventListener('maia-insert-skill-mention', onInsert);
1389
+ document.removeEventListener('maia-input-refocus', onRefocus);
1390
+ raf.mockRestore();
1391
+ jest.useRealTimers();
1392
+ });
1393
+ });
1394
+ });
1395
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDT1JVc2VyUm9sZSIsIm9wdGlvbnMiLCJjbGFtcEZsb2F0aW5nUGFuZWxQb3NpdGlvbiIsImRpc3BhdGNoU2tpbGxNZW50aW9uSW5zZXJ0IiwiZW5zdXJlQWdlbnRzQmVmb3JlU2tpbGxVc2UiLCJnZXRNYWlhSG9zdFBhbmVsUHJlc2VudGF0aW9uIiwiaGFzQW55QWN0aXZlU2Vzc2lvbkluTWV0YSIsImlzQmFubmVyRmFxUmVhZHlUb0F1dG9TZW5kIiwiaXNMZWdhY3lDb250ZXh0RW50aXR5IiwicmVzb2x2ZUFpQ2hhdEJhY2tEZXN0aW5hdGlvbiIsInJlc29sdmVDb21wdXRlZEN1cnJlbnRPcHRpb24iLCJyZXNvbHZlRGVmYXVsdEZsb2F0aW5nUGFuZWxQb3NpdGlvbiIsInJlc29sdmVJbml0aWFsQ3VycmVudE9wdGlvbiIsInJlc29sdmVMZWdhY3lDb250ZXh0U2Vzc2lvbiIsInJlc29sdmVTaWRlYmFyQWdlbnRzTmF2QWN0aXZlIiwic2hvdWxkUmVzdG9yZUV4cGFuZGVkUGFuZWwiLCJzaG91bGRTa2lwRmxvYXRpbmdEcmFnVGFyZ2V0IiwidmFsaWRhdGVBY2Nlc3NCeUZlYXR1cmUiLCJyZXNvbHZlSG9zdFRha2VvdmVyRW50aXR5U3RhdGUiLCJidWlsZEhvc3RUYWtlb3ZlclBlcnNpc3RDb250ZXh0IiwiYnVpbGRNYWlhUGFuZWxTZXNzaW9uUGF0Y2giLCJyZXNvbHZlRmxvYXRpbmdQYW5lbERyYWdQb3NpdGlvbiIsInJlc29sdmVIb3N0VGFrZW92ZXJBZ2VudElkIiwicmVzb2x2ZU1haWFNb2RhbEkxOG5MYW5nIiwicmVzb2x2ZU1pbmltaXplZFJlc3RvcmVUYXJnZXQiLCJyZXNvbHZlTmV4dERyYWdQb3NpdGlvbiIsInJlc29sdmVVc2VySGFzQWdlbnRNYW5hZ2VtZW50UGVybWlzc2lvbnMiLCJzaG91bGRCYWNrQ2xlYXJQaW5uZWRDb250ZXh0Iiwic2hvdWxkQmFja1N0YXJ0TmV3Q2hhdFByZXNlcnZpbmdDb250ZXh0Iiwic2hvdWxkTWFya09yY2hlc3RyYXRvckNvbnRleHRSZXNldCIsInNob3VsZFN0YXJ0TmV3Q2hhdEZyb21DYXRhbG9nIiwicmVzb2x2ZUhhc1Bpbm5lZENvbnRleHQiLCJyZXNvbHZlT3JjaGVzdHJhdG9ySG9tZU5hdkZsYWdzIiwic2hvdWxkU2hvd09yY2hlc3RyYXRvckJhY2tCdXR0b24iLCJzaG91bGRDbGVhckNsaWVudE9uR29Ib21lRnJvbUNoYXQiLCJzaG91bGRSZXNldEFnZW50VG9GaXJzdE9uR29Ib21lIiwic2hvdWxkVXNlQWN0aXZlQ2hhdFNlbmRIYW5kbGVyIiwiYnVpbGRMZWdhY3lDb250ZXh0TWlncmF0aW9uUGF0Y2giLCJmaW5kT3JjaGVzdHJhdG9yQWdlbnQiLCJidWlsZExlZ2FjeUNvbnRleHRBZ2VudCIsInNob3VsZE1hcmtBZ2VudEFzTGVnYWN5Q29udGV4dCIsImNhbk9wZW5NYWlhTWFya2V0cGxhY2UiLCJzaG91bGRTZXRDaGF0Vmlld0hpZGRlbk9uTW91bnQiLCJzaG91bGRQZXJzaXN0TGFzdEFjdGl2ZUNoYXRJZCIsImhhc0Jhbm5lckZhcVRpdGxlIiwic2hvdWxkU3luY1BhbmVsU2Vzc2lvbk9uUGFnZUhpZGUiLCJyZXNvbHZlQ2FjaGVkQWdlbnRzSWZBdmFpbGFibGUiLCJzaG91bGRBdHRlbXB0SW5pdGlhbEFnZW50c0ZldGNoIiwiZmluZEFnZW50Rm9yQ2hhdEl0ZW0iLCJzaG91bGRBcHBseUNsaWVudE9uSG9zdFRha2VvdmVyIiwic2hvdWxkU2VsZWN0Rmlyc3RBZ2VudE9uSG9zdFRha2VvdmVyIiwic2hvdWxkUmVzZXRDaGF0U3RhdGVPbkdvSG9tZSIsInNob3VsZENsZWFyQ29udGV4dEZvckNhdGFsb2dPclNraWxsQWdlbnQiLCJyZXNvbHZlT3Blbk5ld0NoYXRXaXRoQWdlbnRDb250ZXh0IiwiY2FuQ29udGludWVMZWdhY3lDb250ZXh0SW5OZXdDaGF0IiwicmVzb2x2ZVNlc3Npb25SZXN0b3JlTmF2Um91dGUiLCJzaG91bGRTa2lwQWdlbnRzTG9hZE9uU2Vzc2lvblJlc3RvcmUiLCJzaG91bGRGZXRjaEFnZW50RGV0YWlsT25TZXNzaW9uUmVzdG9yZSIsInNob3VsZFBhc3NBZ2VudFRvR2V0QWdlbnRzT25SZXN0b3JlIiwic2hvdWxkU2VsZWN0RmV0Y2hlZEFnZW50QWZ0ZXJSZXN0b3JlIiwicmVzb2x2ZVNuYXBzaG90Q2hpcHNQcm9qZWN0IiwicmVzb2x2ZUNoYXRNb2RhbFNlY3Rpb25GbGFncyIsInNob3VsZFJlbmRlckNoYXRTaWRlYmFyIiwicmVzb2x2ZUNoYXRNb2RhbE1haW5Db250ZW50VmlldyIsInNob3VsZFNob3dDaGF0TW9kYWxGb290ZXIiLCJzaG91bGRVc2VFbGV2YXRlZE1haWFQYW5lbCIsInNob3VsZFJlc2VsZWN0QWdlbnRBZnRlckRlbGV0ZSIsInNob3VsZENsZWFyRHJhZ1Bvc2l0aW9uT25MYXlvdXRDaGFuZ2UiLCJzaG91bGRQZXJzaXN0RHJhZ1Bvc2l0aW9uT25EcmFnRW5kIiwic2hvdWxkU3RhcnRGbG9hdGluZ1BhbmVsRHJhZyIsImlzQWN0aXZlRmxvYXRpbmdEcmFnUG9pbnRlciIsInNob3VsZE9wZW5Ta2lsbHNDYXRhbG9nIiwic2hvdWxkVXNlRHJhZ0NsYW1wRmFsbGJhY2siLCJyZXNvbHZlTGF5b3V0RHJhZ1Bvc2l0aW9uVXBkYXRlIiwicmVzb2x2ZVBlcnNpc3RlZERyYWdQb3NpdGlvbk9uRW5kIiwiYnVpbGRVc2VySW5pdGlhbE1lc3NhZ2VGcm9tU3RhcnRDaGF0Iiwic2hvdWxkUmVzZXRTaWRlYmFyRXJyb3JPblN0YXJ0Q2hhdCIsInNob3VsZENsZWFyVGFza09uR29Ib21lRnJvbUNoYXQiLCJzaG91bGRDbGVhck9yY2hlc3RyYXRvckdsb2JhbENvbnRleHRPbkdvSG9tZSIsInNob3VsZFByZWZldGNoQWdlbnRzRm9yQ2F0YWxvZ05ld0NoYXQiLCJpc0dsb2JhbE1haWFTZWN0aW9uIiwiYmFzZVVzZXIiLCJpZCIsImNvbXBhbnlfaWQiLCJyb2xlX2lkIiwiUFJPSkVDVF9NQU5BR0VSIiwib3JjaGVzdHJhdG9yQWdlbnQiLCJuYW1lIiwidHlwZSIsImVudGl0eSIsImFnZW50IiwiY29uY2F0IiwiZGVzY3JpYmUiLCJvcmlnaW5hbENoYXRBY2Nlc3MiLCJ3aW5kb3ciLCJNQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MiLCJvcmlnaW5hbE11bHRpQWdlbnRzIiwiTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyIsIm9yaWdpbmFsU2tpbGxzQWNjZXNzIiwiTUFJQV9TS0lMTFNfQUNDRVNTIiwib3JpZ2luYWxQcm9qZWN0U3VtbWFyeSIsIk1BSUFfUFJPSkVDVF9TVU1NQVJZX0ZFQVRVUkVfQUNDRVNTIiwiYWZ0ZXJFYWNoIiwiaXQiLCJleHBlY3QiLCJob21lIiwidG9CZSIsImNoYXQiLCJfb2JqZWN0U3ByZWFkIiwiQ0xJRU5UIiwiY3VycmVudE9wdGlvbiIsIm15QWdlbnRzIiwicHJvamVjdCIsImNsaWVudCIsInVzZXIiLCJtdWx0aUFnZW50c0FjY2VzcyIsIm15U2tpbGxzIiwiZ2xvYmFsQ2xvbmUiLCJwcm9qZWN0QWdlbnQiLCJjbGllbnRBZ2VudCIsIm9yY2hlc3RyYXRvckdsb2JhbCIsInByb2plY3RTZWxlY3RvciIsImNsaWVudFNlbGVjdG9yIiwidG9CZU51bGwiLCJ0b0VxdWFsIiwieCIsInkiLCJhZ2VudFR5cGUiLCJhZ2VudEVudGl0eSIsInByb2plY3ROYW1lIiwiZW50aXR5VHlwZSIsImNvbnRleHROYW1lIiwidGFza05hbWUiLCJjbGllbnROYW1lIiwiYSIsInN0YXR1cyIsImIiLCJpc0V4cGFuZGVkIiwidW5kZWZpbmVkIiwiYnV0dG9uIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiZmFxVGl0bGUiLCJhbHJlYWR5U2VudCIsImxvYWRpbmciLCJhZ2VudElkIiwic2VjdGlvbiIsInByb2plY3RJZCIsImNsaWVudElkIiwiaGlkZVBhbmVsQ29udGVudCIsInNob3dNaW5pbWl6ZWRQaWxsIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJlbnN1cmVBZ2VudHNMb2FkZWQiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsImplc3QiLCJmbiIsIm1vY2tSZXNvbHZlZFZhbHVlIiwidXNlRmlyc3RBZ2VudCIsImFnZW50cyIsInJlc29sdmVzIiwidG9CZVVuZGVmaW5lZCIsIm5vdCIsInRvSGF2ZUJlZW5DYWxsZWQiLCJzdG9wIiwiX2NhbGxlZTIiLCJfY29udGV4dDIiLCJfY2FsbGVlMyIsIl9jb250ZXh0MyIsInRvSGF2ZUJlZW5DYWxsZWRUaW1lcyIsIl9jYWxsZWU0IiwiX2NvbnRleHQ0IiwidGFzayIsInRvTWF0Y2hPYmplY3QiLCJjbGVhckdsb2JhbFBpbm5lZENvbnRleHQiLCJjaGlwc1Byb2plY3QiLCJhaV9hZ2VudHMiLCJjcmVhdGUiLCJlZGl0IiwiX3Jlc29sdmVNaW5pbWl6ZWRSZXN0IiwiX3Jlc29sdmVNaW5pbWl6ZWRSZXN0MiIsImNoYXRzIiwic2Vzc2lvbkV4dGVybmFsSWQiLCJpc1JlYWQiLCJpc01pbmltaXplZCIsImFnZW50c05hdkFjdGl2ZSIsImFjdGl2ZUNoYXRJZCIsInNpZGViYXJPcGVuIiwibGF5b3V0TW9kZSIsImRyYWdQb3NpdGlvbiIsImhvc3RDb250ZXh0IiwiY2xhbXAiLCJ2aWV3cG9ydFdpZHRoIiwicGFuZWxXaWR0aCIsInRhc2tJZCIsImZsYWdzIiwiY29tcHV0ZWRDdXJyZW50T3B0aW9uIiwiaG9tZU9wdGlvbiIsImNoYXRPcHRpb24iLCJoYXNQaW5uZWRDb250ZXh0IiwiZGlkUmVzZXRDb250ZXh0SW5TZWN0aW9uIiwiaXNDaGF0VmlldyIsImhhc0Vycm9yIiwic2VjdGlvblJlc2V0RmxhZ3MiLCJpc1NlY3Rpb25SZXNldEhvbWVTdGVwMiIsImlzSGVhZGVySG9tZVN0ZXAyIiwiX2J1aWxkTGVnYWN5Q29udGV4dE1pIiwiX2J1aWxkTGVnYWN5Q29udGV4dE1pMiIsIl9idWlsZExlZ2FjeUNvbnRleHRNaTMiLCJfYnVpbGRMZWdhY3lDb250ZXh0TWk0IiwiX2J1aWxkTGVnYWN5Q29udGV4dE1pNSIsIl9idWlsZExlZ2FjeUNvbnRleHRNaTYiLCJfYnVpbGRMZWdhY3lDb250ZXh0TWk3IiwiX2J1aWxkTGVnYWN5Q29udGV4dE1pOCIsIl9idWlsZExlZ2FjeUNvbnRleHRNaTkiLCJ0b0hhdmVQcm9wZXJ0eSIsImlubmVyV2lkdGgiLCJwYWQiLCJtZXNzYWdlIiwiZmFxSWQiLCJhdHRhY2htZW50cyIsImFnZW50U3VnZ2VzdGlvbklkIiwibWVudGlvbnMiLCJmdWFJZCIsInNjSWQiLCJjb250ZXh0RGF0YSIsIl9maW5kT3JjaGVzdHJhdG9yQWdlbiIsImhhc19ub3RfYWNjZXNzIiwiaXNfZGVsZXRlZCIsImlzX2xlZ2FjeV9jb250ZXh0IiwiX2ZpbmRBZ2VudEZvckNoYXRJdGVtIiwic2hvdWxkU2V0VGFzayIsIl9yZXNvbHZlU25hcHNob3RDaGlwcyIsInNob3dOZXdDaGF0IiwiaXNNeUFnZW50c1NlY3Rpb24iLCJpc01haWFrZXJDcmVhdG9ySG9tZSIsImFnZW50c0NvdW50IiwiaGFzQWNjZXNzIiwiYmFzZSIsInVzZUZha2VUaW1lcnMiLCJyYWYiLCJzcHlPbiIsIm1vY2tJbXBsZW1lbnRhdGlvbiIsImNhbGxiYWNrIiwic2V0VGltZW91dCIsIm9uSW5zZXJ0Iiwib25SZWZvY3VzIiwiYWRkRXZlbnRMaXN0ZW5lciIsInJ1bkFsbFRpbWVycyIsImV2ZW50IiwibW9jayIsImNhbGxzIiwiZGV0YWlsIiwic2tpbGwiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwibW9ja1Jlc3RvcmUiLCJ1c2VSZWFsVGltZXJzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvbW9sZWN1bGVzL0NoYXRBSU1vZGFsL0NoYXRBSU1vZGFsLmhlbHBlcnMuc3BlYy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDT1JVc2VyUm9sZSB9IGZyb20gJy4uLy4uLy4uL2NvbnRleHQvY29yLXVzZXInXG5pbXBvcnQgdHlwZSB7IEFnZW50IH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvYWdlbnQnXG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9jb25zdGFudHMnXG5pbXBvcnQge1xuICBjbGFtcEZsb2F0aW5nUGFuZWxQb3NpdGlvbixcbiAgZGlzcGF0Y2hTa2lsbE1lbnRpb25JbnNlcnQsXG4gIGVuc3VyZUFnZW50c0JlZm9yZVNraWxsVXNlLFxuICBnZXRNYWlhSG9zdFBhbmVsUHJlc2VudGF0aW9uLFxuICBoYXNBbnlBY3RpdmVTZXNzaW9uSW5NZXRhLFxuICBpc0Jhbm5lckZhcVJlYWR5VG9BdXRvU2VuZCxcbiAgaXNMZWdhY3lDb250ZXh0RW50aXR5LFxuICByZXNvbHZlQWlDaGF0QmFja0Rlc3RpbmF0aW9uLFxuICByZXNvbHZlQ29tcHV0ZWRDdXJyZW50T3B0aW9uLFxuICByZXNvbHZlRGVmYXVsdEZsb2F0aW5nUGFuZWxQb3NpdGlvbixcbiAgcmVzb2x2ZUluaXRpYWxDdXJyZW50T3B0aW9uLFxuICByZXNvbHZlTGVnYWN5Q29udGV4dFNlc3Npb24sXG4gIHJlc29sdmVTaWRlYmFyQWdlbnRzTmF2QWN0aXZlLFxuICBzaG91bGRSZXN0b3JlRXhwYW5kZWRQYW5lbCxcbiAgc2hvdWxkU2tpcEZsb2F0aW5nRHJhZ1RhcmdldCxcbiAgdmFsaWRhdGVBY2Nlc3NCeUZlYXR1cmUsXG4gIHJlc29sdmVIb3N0VGFrZW92ZXJFbnRpdHlTdGF0ZSxcbiAgYnVpbGRIb3N0VGFrZW92ZXJQZXJzaXN0Q29udGV4dCxcbiAgYnVpbGRNYWlhUGFuZWxTZXNzaW9uUGF0Y2gsXG4gIHJlc29sdmVGbG9hdGluZ1BhbmVsRHJhZ1Bvc2l0aW9uLFxuICByZXNvbHZlSG9zdFRha2VvdmVyQWdlbnRJZCxcbiAgcmVzb2x2ZU1haWFNb2RhbEkxOG5MYW5nLFxuICByZXNvbHZlTWluaW1pemVkUmVzdG9yZVRhcmdldCxcbiAgcmVzb2x2ZU5leHREcmFnUG9zaXRpb24sXG4gIHJlc29sdmVVc2VySGFzQWdlbnRNYW5hZ2VtZW50UGVybWlzc2lvbnMsXG4gIHNob3VsZEJhY2tDbGVhclBpbm5lZENvbnRleHQsXG4gIHNob3VsZEJhY2tTdGFydE5ld0NoYXRQcmVzZXJ2aW5nQ29udGV4dCxcbiAgc2hvdWxkTWFya09yY2hlc3RyYXRvckNvbnRleHRSZXNldCxcbiAgc2hvdWxkU3RhcnROZXdDaGF0RnJvbUNhdGFsb2csXG4gIHJlc29sdmVIYXNQaW5uZWRDb250ZXh0LFxuICByZXNvbHZlT3JjaGVzdHJhdG9ySG9tZU5hdkZsYWdzLFxuICBzaG91bGRTaG93T3JjaGVzdHJhdG9yQmFja0J1dHRvbixcbiAgc2hvdWxkQ2xlYXJDbGllbnRPbkdvSG9tZUZyb21DaGF0LFxuICBzaG91bGRSZXNldEFnZW50VG9GaXJzdE9uR29Ib21lLFxuICBzaG91bGRVc2VBY3RpdmVDaGF0U2VuZEhhbmRsZXIsXG4gIGJ1aWxkTGVnYWN5Q29udGV4dE1pZ3JhdGlvblBhdGNoLFxuICBmaW5kT3JjaGVzdHJhdG9yQWdlbnQsXG4gIGJ1aWxkTGVnYWN5Q29udGV4dEFnZW50LFxuICBzaG91bGRNYXJrQWdlbnRBc0xlZ2FjeUNvbnRleHQsXG4gIGNhbk9wZW5NYWlhTWFya2V0cGxhY2UsXG4gIHNob3VsZFNldENoYXRWaWV3SGlkZGVuT25Nb3VudCxcbiAgc2hvdWxkUGVyc2lzdExhc3RBY3RpdmVDaGF0SWQsXG4gIGhhc0Jhbm5lckZhcVRpdGxlLFxuICBzaG91bGRTeW5jUGFuZWxTZXNzaW9uT25QYWdlSGlkZSxcbiAgcmVzb2x2ZUNhY2hlZEFnZW50c0lmQXZhaWxhYmxlLFxuICBzaG91bGRBdHRlbXB0SW5pdGlhbEFnZW50c0ZldGNoLFxuICBmaW5kQWdlbnRGb3JDaGF0SXRlbSxcbiAgc2hvdWxkQXBwbHlDbGllbnRPbkhvc3RUYWtlb3ZlcixcbiAgc2hvdWxkU2VsZWN0Rmlyc3RBZ2VudE9uSG9zdFRha2VvdmVyLFxuICBzaG91bGRSZXNldENoYXRTdGF0ZU9uR29Ib21lLFxuICBzaG91bGRDbGVhckNvbnRleHRGb3JDYXRhbG9nT3JTa2lsbEFnZW50LFxuICByZXNvbHZlT3Blbk5ld0NoYXRXaXRoQWdlbnRDb250ZXh0LFxuICBjYW5Db250aW51ZUxlZ2FjeUNvbnRleHRJbk5ld0NoYXQsXG4gIHJlc29sdmVTZXNzaW9uUmVzdG9yZU5hdlJvdXRlLFxuICBzaG91bGRTa2lwQWdlbnRzTG9hZE9uU2Vzc2lvblJlc3RvcmUsXG4gIHNob3VsZEZldGNoQWdlbnREZXRhaWxPblNlc3Npb25SZXN0b3JlLFxuICBzaG91bGRQYXNzQWdlbnRUb0dldEFnZW50c09uUmVzdG9yZSxcbiAgc2hvdWxkU2VsZWN0RmV0Y2hlZEFnZW50QWZ0ZXJSZXN0b3JlLFxuICByZXNvbHZlU25hcHNob3RDaGlwc1Byb2plY3QsXG4gIHJlc29sdmVDaGF0TW9kYWxTZWN0aW9uRmxhZ3MsXG4gIHNob3VsZFJlbmRlckNoYXRTaWRlYmFyLFxuICByZXNvbHZlQ2hhdE1vZGFsTWFpbkNvbnRlbnRWaWV3LFxuICBzaG91bGRTaG93Q2hhdE1vZGFsRm9vdGVyLFxuICBzaG91bGRVc2VFbGV2YXRlZE1haWFQYW5lbCxcbiAgc2hvdWxkUmVzZWxlY3RBZ2VudEFmdGVyRGVsZXRlLFxuICBzaG91bGRDbGVhckRyYWdQb3NpdGlvbk9uTGF5b3V0Q2hhbmdlLFxuICBzaG91bGRQZXJzaXN0RHJhZ1Bvc2l0aW9uT25EcmFnRW5kLFxuICBzaG91bGRTdGFydEZsb2F0aW5nUGFuZWxEcmFnLFxuICBpc0FjdGl2ZUZsb2F0aW5nRHJhZ1BvaW50ZXIsXG4gIHNob3VsZE9wZW5Ta2lsbHNDYXRhbG9nLFxuICBzaG91bGRVc2VEcmFnQ2xhbXBGYWxsYmFjayxcbiAgcmVzb2x2ZUxheW91dERyYWdQb3NpdGlvblVwZGF0ZSxcbiAgcmVzb2x2ZVBlcnNpc3RlZERyYWdQb3NpdGlvbk9uRW5kLFxuICBidWlsZFVzZXJJbml0aWFsTWVzc2FnZUZyb21TdGFydENoYXQsXG4gIHNob3VsZFJlc2V0U2lkZWJhckVycm9yT25TdGFydENoYXQsXG4gIHNob3VsZENsZWFyVGFza09uR29Ib21lRnJvbUNoYXQsXG4gIHNob3VsZENsZWFyT3JjaGVzdHJhdG9yR2xvYmFsQ29udGV4dE9uR29Ib21lLFxuICBzaG91bGRQcmVmZXRjaEFnZW50c0ZvckNhdGFsb2dOZXdDaGF0LFxuICBpc0dsb2JhbE1haWFTZWN0aW9uLFxufSBmcm9tICcuL0NoYXRBSU1vZGFsLmhlbHBlcnMnXG5cbmNvbnN0IGJhc2VVc2VyID0ge1xuICBpZDogMSxcbiAgY29tcGFueV9pZDogMTAsXG4gIHJvbGVfaWQ6IENPUlVzZXJSb2xlLlBST0pFQ1RfTUFOQUdFUixcbn1cblxuY29uc3Qgb3JjaGVzdHJhdG9yQWdlbnQ6IEFnZW50ID0ge1xuICBpZDogJzEnLFxuICBuYW1lOiAnTUFJQScsXG4gIHR5cGU6ICdvcmNoZXN0cmF0b3InLFxuICBlbnRpdHk6ICdnbG9iYWwnLFxufVxuXG5jb25zdCBhZ2VudCA9IChpZDogc3RyaW5nKTogQWdlbnQgPT5cbiAgKHtcbiAgICBpZCxcbiAgICBuYW1lOiBgQWdlbnQgJHtpZH1gLFxuICAgIHR5cGU6ICdjdXN0b20nLFxuICB9KSBhcyBBZ2VudFxuXG5kZXNjcmliZSgnQ2hhdEFJTW9kYWwuaGVscGVycycsICgpID0+IHtcbiAgY29uc3Qgb3JpZ2luYWxDaGF0QWNjZXNzID0gd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU1xuICBjb25zdCBvcmlnaW5hbE11bHRpQWdlbnRzID0gd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFNcbiAgY29uc3Qgb3JpZ2luYWxTa2lsbHNBY2Nlc3MgPSB3aW5kb3cuTUFJQV9TS0lMTFNfQUNDRVNTXG4gIGNvbnN0IG9yaWdpbmFsUHJvamVjdFN1bW1hcnkgPSB3aW5kb3cuTUFJQV9QUk9KRUNUX1NVTU1BUllfRkVBVFVSRV9BQ0NFU1NcblxuICBhZnRlckVhY2goKCkgPT4ge1xuICAgIHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MgPSBvcmlnaW5hbENoYXRBY2Nlc3NcbiAgICB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyA9IG9yaWdpbmFsTXVsdGlBZ2VudHNcbiAgICB3aW5kb3cuTUFJQV9TS0lMTFNfQUNDRVNTID0gb3JpZ2luYWxTa2lsbHNBY2Nlc3NcbiAgICB3aW5kb3cuTUFJQV9QUk9KRUNUX1NVTU1BUllfRkVBVFVSRV9BQ0NFU1MgPSBvcmlnaW5hbFByb2plY3RTdW1tYXJ5XG4gIH0pXG5cbiAgZGVzY3JpYmUoJ3Jlc29sdmVBaUNoYXRCYWNrRGVzdGluYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3JldHVybnMgZ2xvYmFsIGhvbWUgZm9yIG9yY2hlc3RyYXRvciBvbiBoZWFkZXIgaG9tZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQWlDaGF0QmFja0Rlc3RpbmF0aW9uKCdoZWFkZXInLCAnb3JjaGVzdHJhdG9yJywgb3B0aW9ucy5ob21lLCBvcHRpb25zLmhvbWUpKS50b0JlKFxuICAgICAgICAnZ2xvYmFsX2NvbnRleHRfaG9tZSdcbiAgICAgIClcbiAgICB9KVxuXG4gICAgaXQoJ21hcHMgc2VjdGlvbi1zcGVjaWZpYyBob21lcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQWlDaGF0QmFja0Rlc3RpbmF0aW9uKCd0YXNrJywgJ29yY2hlc3RyYXRvcicsIG9wdGlvbnMuY2hhdCwgb3B0aW9ucy5ob21lKSkudG9CZSgndGFza19ob21lJylcbiAgICAgIGV4cGVjdChyZXNvbHZlQWlDaGF0QmFja0Rlc3RpbmF0aW9uKCdwbGFubmVyJywgJ2Nsb25lJywgb3B0aW9ucy5jaGF0LCBvcHRpb25zLmhvbWUpKS50b0JlKCdwbGFubmVyX2hvbWUnKVxuICAgICAgZXhwZWN0KHJlc29sdmVBaUNoYXRCYWNrRGVzdGluYXRpb24oJ3Byb2plY3QnLCAnY2xvbmUnLCBvcHRpb25zLmNoYXQsIG9wdGlvbnMuaG9tZSkpLnRvQmUoJ3Byb2plY3RfaG9tZScpXG4gICAgICBleHBlY3QocmVzb2x2ZUFpQ2hhdEJhY2tEZXN0aW5hdGlvbignY2xpZW50JywgJ2Nsb25lJywgb3B0aW9ucy5jaGF0LCBvcHRpb25zLmhvbWUpKS50b0JlKCdjbGllbnRfaG9tZScpXG4gICAgfSlcblxuICAgIGl0KCdmYWxscyBiYWNrIHRvIGdsb2JhbCBob21lIGZvciB1bnN1cHBvcnRlZCBjb21iaW5hdGlvbnMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZUFpQ2hhdEJhY2tEZXN0aW5hdGlvbignaGVhZGVyJywgJ2N1c3RvbScsIG9wdGlvbnMuY2hhdCwgb3B0aW9ucy5jaGF0KSkudG9CZSgnZ2xvYmFsX2NvbnRleHRfaG9tZScpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgndmFsaWRhdGVBY2Nlc3NCeUZlYXR1cmUnLCAoKSA9PiB7XG4gICAgaXQoJ2RlbmllcyBhY2Nlc3Mgd2l0aG91dCBzZWN0aW9uIG9yIGNoYXQgcGVybWlzc2lvbicsICgpID0+IHtcbiAgICAgIHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MgPSB0cnVlXG4gICAgICBleHBlY3QodmFsaWRhdGVBY2Nlc3NCeUZlYXR1cmUobnVsbCwgYmFzZVVzZXIpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHZhbGlkYXRlQWNjZXNzQnlGZWF0dXJlKCdoZWFkZXInLCB7IC4uLmJhc2VVc2VyLCByb2xlX2lkOiBDT1JVc2VyUm9sZS5DTElFTlQgfSkpLnRvQmUoZmFsc2UpXG4gICAgfSlcblxuICAgIGl0KCdhbGxvd3MgdGFzayBhbmQgcGxhbm5lciB3aGVuIGNoYXQgQUkgaXMgZW5hYmxlZCBmb3IgdGhlIHVzZXInLCAoKSA9PiB7XG4gICAgICB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTID0gZmFsc2VcbiAgICAgIHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTID0gZmFsc2VcbiAgICAgIHdpbmRvdy5NQUlBX1BST0pFQ1RfU1VNTUFSWV9GRUFUVVJFX0FDQ0VTUyA9IHRydWVcbiAgICAgIGV4cGVjdCh2YWxpZGF0ZUFjY2Vzc0J5RmVhdHVyZSgndGFzaycsIGJhc2VVc2VyKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHZhbGlkYXRlQWNjZXNzQnlGZWF0dXJlKCdwbGFubmVyJywgYmFzZVVzZXIpKS50b0JlKHRydWUpXG4gICAgfSlcblxuICAgIGl0KCdyZXF1aXJlcyBjaGF0IGZsYWdzIGZvciBoZWFkZXIgYW5kIHByb2plY3Qgc2VjdGlvbnMnLCAoKSA9PiB7XG4gICAgICB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTID0gZmFsc2VcbiAgICAgIHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTID0gZmFsc2VcbiAgICAgIGV4cGVjdCh2YWxpZGF0ZUFjY2Vzc0J5RmVhdHVyZSgnaGVhZGVyJywgYmFzZVVzZXIpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHZhbGlkYXRlQWNjZXNzQnlGZWF0dXJlKCdwcm9qZWN0JywgYmFzZVVzZXIpKS50b0JlKGZhbHNlKVxuXG4gICAgICB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyA9IHRydWVcbiAgICAgIGV4cGVjdCh2YWxpZGF0ZUFjY2Vzc0J5RmVhdHVyZSgnaGVhZGVyJywgYmFzZVVzZXIpKS50b0JlKHRydWUpXG5cbiAgICAgIHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MgPSB0cnVlXG4gICAgICB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyA9IGZhbHNlXG4gICAgICBleHBlY3QodmFsaWRhdGVBY2Nlc3NCeUZlYXR1cmUoJ3Byb2plY3QnLCBiYXNlVXNlcikpLnRvQmUodHJ1ZSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdyZXNvbHZlQ29tcHV0ZWRDdXJyZW50T3B0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdmYWxscyBiYWNrIHRvIHRoZSBjdXJyZW50IG9wdGlvbiB3aGVuIG15QWdlbnRzIGlzIHVuYXZhaWxhYmxlJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlQ29tcHV0ZWRDdXJyZW50T3B0aW9uKHtcbiAgICAgICAgICBjdXJyZW50T3B0aW9uOiBvcHRpb25zLm15QWdlbnRzLFxuICAgICAgICAgIGFnZW50OiBvcmNoZXN0cmF0b3JBZ2VudCxcbiAgICAgICAgICBwcm9qZWN0OiBudWxsLFxuICAgICAgICAgIGNsaWVudDogbnVsbCxcbiAgICAgICAgICB1c2VyOiBiYXNlVXNlcixcbiAgICAgICAgICBtdWx0aUFnZW50c0FjY2VzczogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUob3B0aW9ucy5teUFnZW50cylcbiAgICB9KVxuXG4gICAgaXQoJ2tlZXBzIG15QWdlbnRzIGFuZCBteVNraWxscyB3aGVuIGZlYXR1cmUgYWNjZXNzIGFsbG93cycsICgpID0+IHtcbiAgICAgIHdpbmRvdy5NQUlBX1NLSUxMU19BQ0NFU1MgPSB0cnVlXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVDb21wdXRlZEN1cnJlbnRPcHRpb24oe1xuICAgICAgICAgIGN1cnJlbnRPcHRpb246IG9wdGlvbnMubXlBZ2VudHMsXG4gICAgICAgICAgYWdlbnQ6IG9yY2hlc3RyYXRvckFnZW50LFxuICAgICAgICAgIHByb2plY3Q6IG51bGwsXG4gICAgICAgICAgY2xpZW50OiBudWxsLFxuICAgICAgICAgIHVzZXI6IGJhc2VVc2VyLFxuICAgICAgICAgIG11bHRpQWdlbnRzQWNjZXNzOiB0cnVlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKG9wdGlvbnMubXlBZ2VudHMpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUNvbXB1dGVkQ3VycmVudE9wdGlvbih7XG4gICAgICAgICAgY3VycmVudE9wdGlvbjogb3B0aW9ucy5teVNraWxscyxcbiAgICAgICAgICBhZ2VudDogb3JjaGVzdHJhdG9yQWdlbnQsXG4gICAgICAgICAgcHJvamVjdDogbnVsbCxcbiAgICAgICAgICBjbGllbnQ6IG51bGwsXG4gICAgICAgICAgdXNlcjogYmFzZVVzZXIsXG4gICAgICAgICAgbXVsdGlBZ2VudHNBY2Nlc3M6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKG9wdGlvbnMubXlTa2lsbHMpXG4gICAgfSlcblxuICAgIGl0KCdyZWRpcmVjdHMgbm9uLW9yY2hlc3RyYXRvciBnbG9iYWwgc3BlY2lhbGlzdHMgZnJvbSBob21lIHRvIGNoYXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBnbG9iYWxDbG9uZTogQWdlbnQgPSB7XG4gICAgICAgIGlkOiAnMicsXG4gICAgICAgIG5hbWU6ICdTYWxlcyBCb3QnLFxuICAgICAgICB0eXBlOiAnY2xvbmUnLFxuICAgICAgICBlbnRpdHk6ICdnbG9iYWwnLFxuICAgICAgfVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVDb21wdXRlZEN1cnJlbnRPcHRpb24oe1xuICAgICAgICAgIGN1cnJlbnRPcHRpb246IG9wdGlvbnMuaG9tZSxcbiAgICAgICAgICBhZ2VudDogZ2xvYmFsQ2xvbmUsXG4gICAgICAgICAgcHJvamVjdDogbnVsbCxcbiAgICAgICAgICBjbGllbnQ6IG51bGwsXG4gICAgICAgICAgdXNlcjogYmFzZVVzZXIsXG4gICAgICAgICAgbXVsdGlBZ2VudHNBY2Nlc3M6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKG9wdGlvbnMuY2hhdClcbiAgICB9KVxuXG4gICAgaXQoJ2tlZXBzIGNoYXQgb3B0aW9uIHdoZW4gcHJvamVjdCBvciBjbGllbnQgY29udGV4dCBpcyBhbHJlYWR5IHNldCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb2plY3RBZ2VudDogQWdlbnQgPSB7IGlkOiAnMycsIG5hbWU6ICdQcm9qJywgdHlwZTogJ2Nsb25lJywgZW50aXR5OiAncHJvamVjdCcgfVxuICAgICAgY29uc3QgY2xpZW50QWdlbnQ6IEFnZW50ID0geyBpZDogJzQnLCBuYW1lOiAnQ2xpZW50JywgdHlwZTogJ2Nsb25lJywgZW50aXR5OiAnY2xpZW50JyB9XG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUNvbXB1dGVkQ3VycmVudE9wdGlvbih7XG4gICAgICAgICAgY3VycmVudE9wdGlvbjogb3B0aW9ucy5ob21lLFxuICAgICAgICAgIGFnZW50OiBwcm9qZWN0QWdlbnQsXG4gICAgICAgICAgcHJvamVjdDogeyBpZDogMTAsIG5hbWU6ICdBbHBoYScgfSBhcyBuZXZlcixcbiAgICAgICAgICBjbGllbnQ6IG51bGwsXG4gICAgICAgICAgdXNlcjogYmFzZVVzZXIsXG4gICAgICAgICAgbXVsdGlBZ2VudHNBY2Nlc3M6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKG9wdGlvbnMuaG9tZSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlQ29tcHV0ZWRDdXJyZW50T3B0aW9uKHtcbiAgICAgICAgICBjdXJyZW50T3B0aW9uOiBvcHRpb25zLmhvbWUsXG4gICAgICAgICAgYWdlbnQ6IGNsaWVudEFnZW50LFxuICAgICAgICAgIHByb2plY3Q6IG51bGwsXG4gICAgICAgICAgY2xpZW50OiB7IGlkOiA1LCBuYW1lOiAnQmV0YScgfSBhcyBuZXZlcixcbiAgICAgICAgICB1c2VyOiBiYXNlVXNlcixcbiAgICAgICAgICBtdWx0aUFnZW50c0FjY2VzczogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUob3B0aW9ucy5ob21lKVxuICAgIH0pXG5cbiAgICBpdCgnZG9lcyBub3QgcmVkaXJlY3Qgb3JjaGVzdHJhdG9yIGdsb2JhbCBjbG9uZXMgZnJvbSBob21lJywgKCkgPT4ge1xuICAgICAgY29uc3Qgb3JjaGVzdHJhdG9yR2xvYmFsOiBBZ2VudCA9IHtcbiAgICAgICAgaWQ6ICcxJyxcbiAgICAgICAgbmFtZTogJ01BSUEnLFxuICAgICAgICB0eXBlOiAnb3JjaGVzdHJhdG9yJyxcbiAgICAgICAgZW50aXR5OiAnZ2xvYmFsJyxcbiAgICAgIH1cblxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlQ29tcHV0ZWRDdXJyZW50T3B0aW9uKHtcbiAgICAgICAgICBjdXJyZW50T3B0aW9uOiBvcHRpb25zLmhvbWUsXG4gICAgICAgICAgYWdlbnQ6IG9yY2hlc3RyYXRvckdsb2JhbCxcbiAgICAgICAgICBwcm9qZWN0OiBudWxsLFxuICAgICAgICAgIGNsaWVudDogbnVsbCxcbiAgICAgICAgICB1c2VyOiBiYXNlVXNlcixcbiAgICAgICAgICBtdWx0aUFnZW50c0FjY2VzczogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUob3B0aW9ucy5ob21lKVxuICAgIH0pXG5cbiAgICBpdCgnc2hvd3MgcHJvamVjdCBhbmQgY2xpZW50IHNlbGVjdG9ycyB3aGVuIGNvbnRleHQgaXMgbWlzc2luZycsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb2plY3RBZ2VudDogQWdlbnQgPSB7IGlkOiAnMycsIG5hbWU6ICdQcm9qJywgdHlwZTogJ2Nsb25lJywgZW50aXR5OiAncHJvamVjdCcgfVxuICAgICAgY29uc3QgY2xpZW50QWdlbnQ6IEFnZW50ID0geyBpZDogJzQnLCBuYW1lOiAnQ2xpZW50JywgdHlwZTogJ2Nsb25lJywgZW50aXR5OiAnY2xpZW50JyB9XG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUNvbXB1dGVkQ3VycmVudE9wdGlvbih7XG4gICAgICAgICAgY3VycmVudE9wdGlvbjogb3B0aW9ucy5ob21lLFxuICAgICAgICAgIGFnZW50OiBwcm9qZWN0QWdlbnQsXG4gICAgICAgICAgcHJvamVjdDogbnVsbCxcbiAgICAgICAgICBjbGllbnQ6IG51bGwsXG4gICAgICAgICAgdXNlcjogYmFzZVVzZXIsXG4gICAgICAgICAgbXVsdGlBZ2VudHNBY2Nlc3M6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKG9wdGlvbnMucHJvamVjdFNlbGVjdG9yKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVDb21wdXRlZEN1cnJlbnRPcHRpb24oe1xuICAgICAgICAgIGN1cnJlbnRPcHRpb246IG9wdGlvbnMuaG9tZSxcbiAgICAgICAgICBhZ2VudDogY2xpZW50QWdlbnQsXG4gICAgICAgICAgcHJvamVjdDogbnVsbCxcbiAgICAgICAgICBjbGllbnQ6IG51bGwsXG4gICAgICAgICAgdXNlcjogYmFzZVVzZXIsXG4gICAgICAgICAgbXVsdGlBZ2VudHNBY2Nlc3M6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKG9wdGlvbnMuY2xpZW50U2VsZWN0b3IpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgncmVzb2x2ZVNpZGViYXJBZ2VudHNOYXZBY3RpdmUnLCAoKSA9PiB7XG4gICAgaXQoJ21hcHMgY29tcHV0ZWQgb3B0aW9ucyBhbmQgbWFpYWtlciBzZWxlY3Rpb24nLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZVNpZGViYXJBZ2VudHNOYXZBY3RpdmUob3B0aW9ucy5teVNraWxscywgZmFsc2UpKS50b0JlKCdteVNraWxscycpXG4gICAgICBleHBlY3QocmVzb2x2ZVNpZGViYXJBZ2VudHNOYXZBY3RpdmUob3B0aW9ucy5teUFnZW50cywgZmFsc2UpKS50b0JlKCdteUFnZW50cycpXG4gICAgICBleHBlY3QocmVzb2x2ZVNpZGViYXJBZ2VudHNOYXZBY3RpdmUob3B0aW9ucy5ob21lLCB0cnVlKSkudG9CZSgnbWFpYWtlcicpXG4gICAgICBleHBlY3QocmVzb2x2ZVNpZGViYXJBZ2VudHNOYXZBY3RpdmUob3B0aW9ucy5jaGF0LCBmYWxzZSkpLnRvQmVOdWxsKClcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdyZXNvbHZlSW5pdGlhbEN1cnJlbnRPcHRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Jlc3RvcmVzIHNhdmVkIG5hdiBhbmQgdmFsaWRhdGVzIHNhdmVkIG9wdGlvbicsICgpID0+IHtcbiAgICAgIHdpbmRvdy5NQUlBX1NLSUxMU19BQ0NFU1MgPSB0cnVlXG4gICAgICBleHBlY3QocmVzb2x2ZUluaXRpYWxDdXJyZW50T3B0aW9uKCdteUFnZW50cycsIG51bGwsIGJhc2VVc2VyKSkudG9CZShvcHRpb25zLm15QWdlbnRzKVxuICAgICAgZXhwZWN0KHJlc29sdmVJbml0aWFsQ3VycmVudE9wdGlvbignbXlTa2lsbHMnLCBudWxsLCBiYXNlVXNlcikpLnRvQmUob3B0aW9ucy5teVNraWxscylcbiAgICAgIGV4cGVjdChyZXNvbHZlSW5pdGlhbEN1cnJlbnRPcHRpb24obnVsbCwgJ2NoYXQnLCBiYXNlVXNlcikpLnRvQmUob3B0aW9ucy5jaGF0KVxuICAgICAgZXhwZWN0KHJlc29sdmVJbml0aWFsQ3VycmVudE9wdGlvbihudWxsLCAnaW52YWxpZCcsIGJhc2VVc2VyKSkudG9CZShvcHRpb25zLmhvbWUpXG4gICAgfSlcblxuICAgIGl0KCdpZ25vcmVzIHNhdmVkIG15U2tpbGxzIHdoZW4gdGhlIHVzZXIgbGFja3Mgc2tpbGxzIGFjY2VzcycsICgpID0+IHtcbiAgICAgIHdpbmRvdy5NQUlBX1NLSUxMU19BQ0NFU1MgPSBmYWxzZVxuICAgICAgZXhwZWN0KHJlc29sdmVJbml0aWFsQ3VycmVudE9wdGlvbignbXlTa2lsbHMnLCBudWxsLCBiYXNlVXNlcikpLnRvQmUob3B0aW9ucy5ob21lKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ2NsYW1wRmxvYXRpbmdQYW5lbFBvc2l0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdrZWVwcyB0aGUgcGFuZWwgaW5zaWRlIHRoZSB2aWV3cG9ydCB3aXRoIHBhZGRpbmcnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2xhbXBGbG9hdGluZ1BhbmVsUG9zaXRpb24oMCwgMCwgNDAwLCA2MDAsIDEyMDAsIDgwMCkpLnRvRXF1YWwoeyB4OiAxNiwgeTogMTYgfSlcbiAgICAgIGV4cGVjdChjbGFtcEZsb2F0aW5nUGFuZWxQb3NpdGlvbigyMDAwLCAyMDAwLCA0MDAsIDYwMCwgMTIwMCwgODAwKSkudG9FcXVhbCh7IHg6IDc4NCwgeTogMTg0IH0pXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgncmVzb2x2ZUxlZ2FjeUNvbnRleHRTZXNzaW9uJywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIGxlZ2FjeSBjbG9uZSBjb250ZXh0IG9ubHkgb24gY2hhdCB2aWV3JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlTGVnYWN5Q29udGV4dFNlc3Npb24ob3B0aW9ucy5jaGF0LCBvcHRpb25zLmNoYXQsIHtcbiAgICAgICAgICBhZ2VudFR5cGU6ICdjbG9uZScsXG4gICAgICAgICAgYWdlbnRFbnRpdHk6ICdwcm9qZWN0JyxcbiAgICAgICAgICBwcm9qZWN0TmFtZTogJ0FscGhhJyxcbiAgICAgICAgfSlcbiAgICAgICkudG9FcXVhbCh7IGVudGl0eVR5cGU6ICdwcm9qZWN0JywgY29udGV4dE5hbWU6ICdBbHBoYScgfSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlTGVnYWN5Q29udGV4dFNlc3Npb24ob3B0aW9ucy5ob21lLCBvcHRpb25zLmNoYXQsIHtcbiAgICAgICAgICBhZ2VudFR5cGU6ICdjbG9uZScsXG4gICAgICAgICAgYWdlbnRFbnRpdHk6ICdwcm9qZWN0JyxcbiAgICAgICAgICBwcm9qZWN0TmFtZTogJ0FscGhhJyxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZU51bGwoKVxuICAgIH0pXG5cbiAgICBpdCgnbWFwcyB0YXNrIGFuZCBjbGllbnQgbmFtZXMgYW5kIGlnbm9yZXMgaW52YWxpZCBlbnRpdGllcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUxlZ2FjeUNvbnRleHRTZXNzaW9uKG9wdGlvbnMuY2hhdCwgb3B0aW9ucy5jaGF0LCB7XG4gICAgICAgICAgYWdlbnRUeXBlOiAnY2xvbmUnLFxuICAgICAgICAgIGFnZW50RW50aXR5OiAndGFzaycsXG4gICAgICAgIH0pXG4gICAgICApLnRvRXF1YWwoeyBlbnRpdHlUeXBlOiAndGFzaycsIGNvbnRleHROYW1lOiAnJyB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVMZWdhY3lDb250ZXh0U2Vzc2lvbihvcHRpb25zLmNoYXQsIG9wdGlvbnMuY2hhdCwge1xuICAgICAgICAgIGFnZW50VHlwZTogJ2Nsb25lJyxcbiAgICAgICAgICBhZ2VudEVudGl0eTogJ3Rhc2snLFxuICAgICAgICAgIHRhc2tOYW1lOiAnQnVnZml4JyxcbiAgICAgICAgfSlcbiAgICAgICkudG9FcXVhbCh7IGVudGl0eVR5cGU6ICd0YXNrJywgY29udGV4dE5hbWU6ICdCdWdmaXgnIH0pXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUxlZ2FjeUNvbnRleHRTZXNzaW9uKG9wdGlvbnMuY2hhdCwgb3B0aW9ucy5jaGF0LCB7XG4gICAgICAgICAgYWdlbnRUeXBlOiAnY2xvbmUnLFxuICAgICAgICAgIGFnZW50RW50aXR5OiAnY2xpZW50JyxcbiAgICAgICAgICBjbGllbnROYW1lOiAnQWNtZScsXG4gICAgICAgIH0pXG4gICAgICApLnRvRXF1YWwoeyBlbnRpdHlUeXBlOiAnY2xpZW50JywgY29udGV4dE5hbWU6ICdBY21lJyB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVMZWdhY3lDb250ZXh0U2Vzc2lvbihvcHRpb25zLmNoYXQsIG9wdGlvbnMuY2hhdCwge1xuICAgICAgICAgIGFnZW50VHlwZTogJ2Nsb25lJyxcbiAgICAgICAgICBhZ2VudEVudGl0eTogJ2dsb2JhbCcsXG4gICAgICAgICAgcHJvamVjdE5hbWU6ICdJZ25vcmVkJyxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZU51bGwoKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ2hhc0FueUFjdGl2ZVNlc3Npb25Jbk1ldGEnLCAoKSA9PiB7XG4gICAgaXQoJ2RldGVjdHMgdGhpbmtpbmcsIHdyaXRpbmcgYW5kIGFwcHJvdmFsIHNlc3Npb25zJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICBoYXNBbnlBY3RpdmVTZXNzaW9uSW5NZXRhKHtcbiAgICAgICAgICBhOiB7IHN0YXR1czogJ3RoaW5raW5nJyB9LFxuICAgICAgICAgIGI6IHsgc3RhdHVzOiAnY29tcGxldGUnIH0sXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChoYXNBbnlBY3RpdmVTZXNzaW9uSW5NZXRhKHsgYTogeyBzdGF0dXM6ICdjb21wbGV0ZScgfSB9KSkudG9CZShmYWxzZSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdwYW5lbCByZXN0b3JlIGFuZCBmbG9hdGluZyBoZWxwZXJzJywgKCkgPT4ge1xuICAgIGl0KCdyZXN0b3JlcyBleHBhbmRlZCBwYW5lbHMgZnJvbSBzYXZlZCBzZXNzaW9uIHNuYXBzaG90cycsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRSZXN0b3JlRXhwYW5kZWRQYW5lbCh7IGlzRXhwYW5kZWQ6IHRydWUgfSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRSZXN0b3JlRXhwYW5kZWRQYW5lbCh7IGlzRXhwYW5kZWQ6IGZhbHNlIH0pKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFJlc3RvcmVFeHBhbmRlZFBhbmVsKHVuZGVmaW5lZCkpLnRvQmUoZmFsc2UpXG4gICAgfSlcblxuICAgIGl0KCdhbmNob3JzIHRoZSBkZWZhdWx0IGZsb2F0aW5nIHBhbmVsIHRvIHRoZSBib3R0b20tcmlnaHQgY29ybmVyJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVEZWZhdWx0RmxvYXRpbmdQYW5lbFBvc2l0aW9uKDEyMDAsIDQ4MCkpLnRvRXF1YWwoeyB4OiA3MDQsIHk6IDE2IH0pXG4gICAgfSlcblxuICAgIGl0KCdza2lwcyBkcmFnIG9uIGludGVyYWN0aXZlIHRhcmdldHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKVxuICAgICAgZXhwZWN0KHNob3VsZFNraXBGbG9hdGluZ0RyYWdUYXJnZXQoYnV0dG9uKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFNraXBGbG9hdGluZ0RyYWdUYXJnZXQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpKS50b0JlKGZhbHNlKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ2lzQmFubmVyRmFxUmVhZHlUb0F1dG9TZW5kJywgKCkgPT4ge1xuICAgIGl0KCdibG9ja3MgYXV0byBzZW5kIHdoZW4gdGhlIEZBUSBpcyBlbXB0eSBvciBhbHJlYWR5IHNlbnQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGlzQmFubmVyRmFxUmVhZHlUb0F1dG9TZW5kKHtcbiAgICAgICAgICBmYXFUaXRsZTogJyAgICcsXG4gICAgICAgICAgYWxyZWFkeVNlbnQ6IGZhbHNlLFxuICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgIGFnZW50SWQ6ICcxJyxcbiAgICAgICAgICBzZWN0aW9uOiAnaGVhZGVyJyxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZShmYWxzZSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBpc0Jhbm5lckZhcVJlYWR5VG9BdXRvU2VuZCh7XG4gICAgICAgICAgZmFxVGl0bGU6ICdQcmVndW50YScsXG4gICAgICAgICAgYWxyZWFkeVNlbnQ6IHRydWUsXG4gICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgYWdlbnRJZDogJzEnLFxuICAgICAgICAgIHNlY3Rpb246ICdoZWFkZXInLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgnd2FpdHMgZm9yIHByb2plY3QgYW5kIGNsaWVudCBjb250ZXh0IGJlZm9yZSBhdXRvIHNlbmRpbmcnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGlzQmFubmVyRmFxUmVhZHlUb0F1dG9TZW5kKHtcbiAgICAgICAgICBmYXFUaXRsZTogJ1Jlc3Vtw60gZWwgcHJveWVjdG8nLFxuICAgICAgICAgIGFscmVhZHlTZW50OiBmYWxzZSxcbiAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICBhZ2VudElkOiAnMScsXG4gICAgICAgICAgc2VjdGlvbjogJ3Byb2plY3QnLFxuICAgICAgICAgIHByb2plY3RJZDogbnVsbCxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZShmYWxzZSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBpc0Jhbm5lckZhcVJlYWR5VG9BdXRvU2VuZCh7XG4gICAgICAgICAgZmFxVGl0bGU6ICdSZXN1bcOtIGVsIHByb3llY3RvJyxcbiAgICAgICAgICBhbHJlYWR5U2VudDogZmFsc2UsXG4gICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgYWdlbnRJZDogJzEnLFxuICAgICAgICAgIHNlY3Rpb246ICdwcm9qZWN0JyxcbiAgICAgICAgICBwcm9qZWN0SWQ6IDQyLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKHRydWUpXG4gICAgfSlcblxuICAgIGl0KCdyZXF1aXJlcyBjbGllbnQgY29udGV4dCBmb3IgY2xpZW50IHNlY3Rpb25zIGFuZCBhbGxvd3MgaGVhZGVyIEZBUXMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGlzQmFubmVyRmFxUmVhZHlUb0F1dG9TZW5kKHtcbiAgICAgICAgICBmYXFUaXRsZTogJ1ByZWd1bnRhJyxcbiAgICAgICAgICBhbHJlYWR5U2VudDogZmFsc2UsXG4gICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgYWdlbnRJZDogJzEnLFxuICAgICAgICAgIHNlY3Rpb246ICdjbGllbnQnLFxuICAgICAgICAgIGNsaWVudElkOiBudWxsLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKGZhbHNlKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIGlzQmFubmVyRmFxUmVhZHlUb0F1dG9TZW5kKHtcbiAgICAgICAgICBmYXFUaXRsZTogJ1ByZWd1bnRhJyxcbiAgICAgICAgICBhbHJlYWR5U2VudDogZmFsc2UsXG4gICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgYWdlbnRJZDogJzEnLFxuICAgICAgICAgIHNlY3Rpb246ICdjbGllbnQnLFxuICAgICAgICAgIGNsaWVudElkOiA5LFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKHRydWUpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgaXNCYW5uZXJGYXFSZWFkeVRvQXV0b1NlbmQoe1xuICAgICAgICAgIGZhcVRpdGxlOiAnUHJlZ3VudGEnLFxuICAgICAgICAgIGFscmVhZHlTZW50OiBmYWxzZSxcbiAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICBhZ2VudElkOiAnMScsXG4gICAgICAgICAgc2VjdGlvbjogJ2hlYWRlcicsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUodHJ1ZSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdpc0xlZ2FjeUNvbnRleHRFbnRpdHknLCAoKSA9PiB7XG4gICAgaXQoJ2FjY2VwdHMgb25seSBwcm9qZWN0LCB0YXNrIGFuZCBjbGllbnQgZW50aXRpZXMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNMZWdhY3lDb250ZXh0RW50aXR5KCdwcm9qZWN0JykpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChpc0xlZ2FjeUNvbnRleHRFbnRpdHkoJ2dsb2JhbCcpKS50b0JlKGZhbHNlKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ2dldE1haWFIb3N0UGFuZWxQcmVzZW50YXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ2hpZGVzIGV4cGFuZGVkIHBhbmVsIG9uIG1haWEgcGFnZSByb3V0ZSB3aXRob3V0IHNob3dpbmcgdGhlIHBpbGwnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoZ2V0TWFpYUhvc3RQYW5lbFByZXNlbnRhdGlvbihmYWxzZSwgdHJ1ZSkpLnRvRXF1YWwoe1xuICAgICAgICBoaWRlUGFuZWxDb250ZW50OiB0cnVlLFxuICAgICAgICBzaG93TWluaW1pemVkUGlsbDogZmFsc2UsXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgna2VlcHMgdGhlIHBhbmVsIHZpc2libGUgb24gb3RoZXIgcm91dGVzIHdoZW4gZXhwYW5kZWQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoZ2V0TWFpYUhvc3RQYW5lbFByZXNlbnRhdGlvbihmYWxzZSwgZmFsc2UpKS50b0VxdWFsKHtcbiAgICAgICAgaGlkZVBhbmVsQ29udGVudDogZmFsc2UsXG4gICAgICAgIHNob3dNaW5pbWl6ZWRQaWxsOiBmYWxzZSxcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KCdzaG93cyB0aGUgcGlsbCBvbmx5IHdoZW4gbWluaW1pemVkIG91dHNpZGUgbWFpYSBwYWdlJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGdldE1haWFIb3N0UGFuZWxQcmVzZW50YXRpb24odHJ1ZSwgZmFsc2UpKS50b0VxdWFsKHtcbiAgICAgICAgaGlkZVBhbmVsQ29udGVudDogdHJ1ZSxcbiAgICAgICAgc2hvd01pbmltaXplZFBpbGw6IHRydWUsXG4gICAgICB9KVxuICAgICAgZXhwZWN0KGdldE1haWFIb3N0UGFuZWxQcmVzZW50YXRpb24odHJ1ZSwgdHJ1ZSkpLnRvRXF1YWwoe1xuICAgICAgICBoaWRlUGFuZWxDb250ZW50OiB0cnVlLFxuICAgICAgICBzaG93TWluaW1pemVkUGlsbDogZmFsc2UsXG4gICAgICB9KVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ2Vuc3VyZUFnZW50c0JlZm9yZVNraWxsVXNlJywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIHVuZGVmaW5lZCB3aGVuIHVzZUZpcnN0QWdlbnQgaXMgZmFsc2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlbnN1cmVBZ2VudHNMb2FkZWQgPSBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoW2FnZW50KCdhMScpXSlcblxuICAgICAgYXdhaXQgZXhwZWN0KFxuICAgICAgICBlbnN1cmVBZ2VudHNCZWZvcmVTa2lsbFVzZSh7XG4gICAgICAgICAgdXNlRmlyc3RBZ2VudDogZmFsc2UsXG4gICAgICAgICAgYWdlbnRzOiBbXSxcbiAgICAgICAgICBlbnN1cmVBZ2VudHNMb2FkZWQsXG4gICAgICAgIH0pXG4gICAgICApLnJlc29sdmVzLnRvQmVVbmRlZmluZWQoKVxuXG4gICAgICBleHBlY3QoZW5zdXJlQWdlbnRzTG9hZGVkKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpXG4gICAgfSlcblxuICAgIGl0KCd1c2VzIHRoZSBpbi1tZW1vcnkgYWdlbnRzIGxpc3Qgd2hlbiBpdCBpcyBhbHJlYWR5IHBvcHVsYXRlZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGVuc3VyZUFnZW50c0xvYWRlZCA9IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShbYWdlbnQoJ2EyJyldKVxuXG4gICAgICBhd2FpdCBleHBlY3QoXG4gICAgICAgIGVuc3VyZUFnZW50c0JlZm9yZVNraWxsVXNlKHtcbiAgICAgICAgICB1c2VGaXJzdEFnZW50OiB0cnVlLFxuICAgICAgICAgIGFnZW50czogW2FnZW50KCdhMScpXSxcbiAgICAgICAgICBlbnN1cmVBZ2VudHNMb2FkZWQsXG4gICAgICAgIH0pXG4gICAgICApLnJlc29sdmVzLnRvRXF1YWwoYWdlbnQoJ2ExJykpXG5cbiAgICAgIGV4cGVjdChlbnN1cmVBZ2VudHNMb2FkZWQpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKClcbiAgICB9KVxuXG4gICAgaXQoJ2xvYWRzIGFnZW50cyB3aGVuIHRoZSBsaXN0IGlzIGVtcHR5JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZW5zdXJlQWdlbnRzTG9hZGVkID0gamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKFthZ2VudCgnYTEnKSwgYWdlbnQoJ2EyJyldKVxuXG4gICAgICBhd2FpdCBleHBlY3QoXG4gICAgICAgIGVuc3VyZUFnZW50c0JlZm9yZVNraWxsVXNlKHtcbiAgICAgICAgICB1c2VGaXJzdEFnZW50OiB0cnVlLFxuICAgICAgICAgIGFnZW50czogW10sXG4gICAgICAgICAgZW5zdXJlQWdlbnRzTG9hZGVkLFxuICAgICAgICB9KVxuICAgICAgKS5yZXNvbHZlcy50b0VxdWFsKGFnZW50KCdhMScpKVxuXG4gICAgICBleHBlY3QoZW5zdXJlQWdlbnRzTG9hZGVkKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSlcbiAgICB9KVxuXG4gICAgaXQoJ3JldHVybnMgdW5kZWZpbmVkIHdoZW4gYWdlbnRzIGNhbm5vdCBiZSBsb2FkZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlbnN1cmVBZ2VudHNMb2FkZWQgPSBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoW10pXG5cbiAgICAgIGF3YWl0IGV4cGVjdChcbiAgICAgICAgZW5zdXJlQWdlbnRzQmVmb3JlU2tpbGxVc2Uoe1xuICAgICAgICAgIHVzZUZpcnN0QWdlbnQ6IHRydWUsXG4gICAgICAgICAgYWdlbnRzOiBbXSxcbiAgICAgICAgICBlbnN1cmVBZ2VudHNMb2FkZWQsXG4gICAgICAgIH0pXG4gICAgICApLnJlc29sdmVzLnRvQmVVbmRlZmluZWQoKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ2hvc3QgdGFrZW92ZXIgY29udGV4dCBoZWxwZXJzJywgKCkgPT4ge1xuICAgIGl0KCdtYXBzIHByb2plY3QvdGFzayBzZWN0aW9ucyB0byBwcm9qZWN0IGFuZCB0YXNrIGVudGl0aWVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvamVjdCA9IHsgaWQ6IDEsIG5hbWU6ICdBbHBoYScgfSBhcyBjb25zdFxuICAgICAgY29uc3QgdGFzayA9IHsgaWQ6IDksIG5hbWU6ICdCdWcnIH0gYXMgY29uc3RcblxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlSG9zdFRha2VvdmVyRW50aXR5U3RhdGUoe1xuICAgICAgICAgIHNlY3Rpb246ICd0YXNrJyxcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIHRhc2ssXG4gICAgICAgIH0pXG4gICAgICApLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgICBwcm9qZWN0LFxuICAgICAgICB0YXNrLFxuICAgICAgICBjbGVhckdsb2JhbFBpbm5lZENvbnRleHQ6IGZhbHNlLFxuICAgICAgfSlcbiAgICAgIGV4cGVjdChyZXNvbHZlSG9zdFRha2VvdmVyRW50aXR5U3RhdGUoeyBzZWN0aW9uOiAndGFzaycsIHByb2plY3QsIHRhc2sgfSkuY2xpZW50KS50b0JlVW5kZWZpbmVkKClcbiAgICB9KVxuXG4gICAgaXQoJ2NsZWFycyBjbGllbnQgb24gaGVhZGVyL3BsYW5uZXIgdGFrZW92ZXIgYW5kIHNldHMgY2xpZW50IG9uIGNsaWVudCBzZWN0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0geyBpZDogMiwgbmFtZTogJ0FjbWUnIH0gYXMgY29uc3RcblxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlSG9zdFRha2VvdmVyRW50aXR5U3RhdGUoe1xuICAgICAgICAgIHNlY3Rpb246ICdoZWFkZXInLFxuICAgICAgICB9KVxuICAgICAgKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgcHJvamVjdDogbnVsbCxcbiAgICAgICAgY2xpZW50OiBudWxsLFxuICAgICAgICB0YXNrOiBudWxsLFxuICAgICAgICBjbGVhckdsb2JhbFBpbm5lZENvbnRleHQ6IHRydWUsXG4gICAgICB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVIb3N0VGFrZW92ZXJFbnRpdHlTdGF0ZSh7XG4gICAgICAgICAgc2VjdGlvbjogJ2NsaWVudCcsXG4gICAgICAgICAgY2xpZW50LFxuICAgICAgICB9KVxuICAgICAgKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgcHJvamVjdDogbnVsbCxcbiAgICAgICAgY2xpZW50LFxuICAgICAgICBjbGVhckdsb2JhbFBpbm5lZENvbnRleHQ6IGZhbHNlLFxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgaXQoJ2J1aWxkcyBwZXJzaXN0IGhvc3QgY29udGV4dCBmb3IgcGFuZWwgc2Vzc2lvbiBwYXRjaCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb2plY3QgPSB7IGlkOiAzLCBuYW1lOiAnQmV0YScgfSBhcyBjb25zdFxuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZEhvc3RUYWtlb3ZlclBlcnNpc3RDb250ZXh0KHtcbiAgICAgICAgICBzZWN0aW9uOiAncHJvamVjdCcsXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgfSlcbiAgICAgICkudG9FcXVhbCh7XG4gICAgICAgIHNlY3Rpb246ICdwcm9qZWN0JyxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgY2xpZW50OiBudWxsLFxuICAgICAgICB0YXNrOiBudWxsLFxuICAgICAgICBjaGlwc1Byb2plY3Q6IG51bGwsXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgnZGVmYXVsdHMgbWlzc2luZyBwcm9qZWN0LCBjbGllbnQgYW5kIHRhc2sgZW50aXRpZXMgb24gdGFrZW92ZXInLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZUhvc3RUYWtlb3ZlckVudGl0eVN0YXRlKHsgc2VjdGlvbjogJ3Byb2plY3QnIH0pKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgcHJvamVjdDogbnVsbCxcbiAgICAgICAgdGFzazogbnVsbCxcbiAgICAgIH0pXG4gICAgICBleHBlY3QocmVzb2x2ZUhvc3RUYWtlb3ZlckVudGl0eVN0YXRlKHsgc2VjdGlvbjogJ2NsaWVudCcgfSkpLnRvTWF0Y2hPYmplY3QoeyBjbGllbnQ6IG51bGwgfSlcbiAgICAgIGV4cGVjdChyZXNvbHZlSG9zdFRha2VvdmVyRW50aXR5U3RhdGUoeyBzZWN0aW9uOiAndGFzaycsIHByb2plY3Q6IHsgaWQ6IDEgfSBhcyBuZXZlciB9KSkudG9NYXRjaE9iamVjdCh7XG4gICAgICAgIHRhc2s6IG51bGwsXG4gICAgICB9KVxuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZEhvc3RUYWtlb3ZlclBlcnNpc3RDb250ZXh0KHtcbiAgICAgICAgICBzZWN0aW9uOiAncGxhbm5lcicsXG4gICAgICAgIH0pXG4gICAgICApLnRvTWF0Y2hPYmplY3QoeyBwcm9qZWN0OiBudWxsLCBjbGllbnQ6IG51bGwsIHRhc2s6IG51bGwgfSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZEhvc3RUYWtlb3ZlclBlcnNpc3RDb250ZXh0KHtcbiAgICAgICAgICBzZWN0aW9uOiAnY2xpZW50JyxcbiAgICAgICAgfSlcbiAgICAgICkudG9NYXRjaE9iamVjdCh7IGNsaWVudDogbnVsbCB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIGJ1aWxkSG9zdFRha2VvdmVyUGVyc2lzdENvbnRleHQoe1xuICAgICAgICAgIHNlY3Rpb246ICdjbGllbnQnLFxuICAgICAgICAgIGNsaWVudDogeyBpZDogOSwgbmFtZTogJ0NsaWVudCcgfSBhcyBuZXZlcixcbiAgICAgICAgfSkuY2xpZW50XG4gICAgICApLnRvRXF1YWwoeyBpZDogOSwgbmFtZTogJ0NsaWVudCcgfSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZEhvc3RUYWtlb3ZlclBlcnNpc3RDb250ZXh0KHtcbiAgICAgICAgICBzZWN0aW9uOiAndGFzaycsXG4gICAgICAgICAgdGFzazogeyBpZDogMSwgbmFtZTogJ1QnIH0gYXMgbmV2ZXIsXG4gICAgICAgIH0pLnRhc2tcbiAgICAgICkudG9FcXVhbCh7IGlkOiAxLCBuYW1lOiAnVCcgfSlcblxuICAgICAgY29uc3QgcHJvamVjdCA9IHsgaWQ6IDQsIG5hbWU6ICdQJyB9IGFzIGNvbnN0XG4gICAgICBleHBlY3QoXG4gICAgICAgIGJ1aWxkSG9zdFRha2VvdmVyUGVyc2lzdENvbnRleHQoe1xuICAgICAgICAgIHNlY3Rpb246ICd0YXNrJyxcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIHRhc2s6IHsgaWQ6IDEsIG5hbWU6ICdUJyB9IGFzIG5ldmVyLFxuICAgICAgICB9KVxuICAgICAgKS50b01hdGNoT2JqZWN0KHsgcHJvamVjdCwgdGFzazogeyBpZDogMSwgbmFtZTogJ1QnIH0gfSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdtb2RhbCBuYXZpZ2F0aW9uIGFuZCBzZXNzaW9uIGhlbHBlcnMnLCAoKSA9PiB7XG4gICAgaXQoJ25vcm1hbGl6ZXMgYnIgdG8gcHQtYnIgZm9yIG1vZGFsIGkxOG4nLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZU1haWFNb2RhbEkxOG5MYW5nKCdicicpKS50b0JlKCdwdC1icicpXG4gICAgICBleHBlY3QocmVzb2x2ZU1haWFNb2RhbEkxOG5MYW5nKCdlcycpKS50b0JlKCdlcycpXG4gICAgfSlcblxuICAgIGl0KCdjaGVja3MgYWdlbnQgbWFuYWdlbWVudCBwZXJtaXNzaW9ucyB3aXRoIG11bHRpLWFnZW50cyBmbGFnJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVVc2VySGFzQWdlbnRNYW5hZ2VtZW50UGVybWlzc2lvbnMoeyBhaV9hZ2VudHM6IHsgY3JlYXRlOiB0cnVlIH0gfSwgdHJ1ZSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChyZXNvbHZlVXNlckhhc0FnZW50TWFuYWdlbWVudFBlcm1pc3Npb25zKHsgYWlfYWdlbnRzOiB7IGVkaXQ6IHRydWUgfSB9LCB0cnVlKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHJlc29sdmVVc2VySGFzQWdlbnRNYW5hZ2VtZW50UGVybWlzc2lvbnMoeyBhaV9hZ2VudHM6IHsgZGVsZXRlOiB0cnVlIH0gfSwgdHJ1ZSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChyZXNvbHZlVXNlckhhc0FnZW50TWFuYWdlbWVudFBlcm1pc3Npb25zKHsgYWlfYWdlbnRzOiB7IGNyZWF0ZTogdHJ1ZSB9IH0sIGZhbHNlKSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgaXQoJ2RlY2lkZXMgd2hlbiB0byBzdGFydCBhIG5ldyBjaGF0IGZyb20gY2F0YWxvZyB2aWV3cycsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRTdGFydE5ld0NoYXRGcm9tQ2F0YWxvZyhvcHRpb25zLm15QWdlbnRzLCBmYWxzZSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRTdGFydE5ld0NoYXRGcm9tQ2F0YWxvZyhvcHRpb25zLmhvbWUsIHRydWUpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkU3RhcnROZXdDaGF0RnJvbUNhdGFsb2cob3B0aW9ucy5ob21lLCBmYWxzZSkpLnRvQmUoZmFsc2UpXG4gICAgfSlcblxuICAgIGl0KCdoYW5kbGVzIGJhY2sgbmF2aWdhdGlvbiBicmFuY2hlcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRCYWNrU3RhcnROZXdDaGF0UHJlc2VydmluZ0NvbnRleHQob3B0aW9ucy5jaGF0LCBvcHRpb25zLmNoYXQpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkQmFja0NsZWFyUGlubmVkQ29udGV4dChvcHRpb25zLmhvbWUsIG9wdGlvbnMuaG9tZSwgJ2hlYWRlcicsIGZhbHNlKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZEJhY2tDbGVhclBpbm5lZENvbnRleHQob3B0aW9ucy5ob21lLCBvcHRpb25zLmhvbWUsICdwcm9qZWN0JywgZmFsc2UpKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgnbWFya3Mgb3JjaGVzdHJhdG9yIGNvbnRleHQgcmVzZXQgb24gcGlubmVkLXRvLWVtcHR5IHRyYW5zaXRpb24nLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoc2hvdWxkTWFya09yY2hlc3RyYXRvckNvbnRleHRSZXNldCgncHJvamVjdCcsICdvcmNoZXN0cmF0b3InLCB0cnVlLCBmYWxzZSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRNYXJrT3JjaGVzdHJhdG9yQ29udGV4dFJlc2V0KCdoZWFkZXInLCAnb3JjaGVzdHJhdG9yJywgdHJ1ZSwgZmFsc2UpKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgncHJlZmVycyB1bnJlYWQgY2hhdHMgd2hlbiByZXN0b3JpbmcgZnJvbSBtaW5pbWl6ZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjaGF0cyA9IFtcbiAgICAgICAgeyBzZXNzaW9uRXh0ZXJuYWxJZDogJ3MxJywgaXNSZWFkOiB0cnVlIH0sXG4gICAgICAgIHsgc2Vzc2lvbkV4dGVybmFsSWQ6ICdzMicsIGlzUmVhZDogZmFsc2UgfSxcbiAgICAgIF1cbiAgICAgIGV4cGVjdChyZXNvbHZlTWluaW1pemVkUmVzdG9yZVRhcmdldChjaGF0cywgJ3MxJyk/LnNlc3Npb25FeHRlcm5hbElkKS50b0JlKCdzMicpXG4gICAgICBleHBlY3QocmVzb2x2ZU1pbmltaXplZFJlc3RvcmVUYXJnZXQoW3sgc2Vzc2lvbkV4dGVybmFsSWQ6ICdzMScsIGlzUmVhZDogdHJ1ZSB9XSwgJ3MxJyk/LnNlc3Npb25FeHRlcm5hbElkKS50b0JlKFxuICAgICAgICAnczEnXG4gICAgICApXG4gICAgICBleHBlY3QocmVzb2x2ZU1pbmltaXplZFJlc3RvcmVUYXJnZXQoW3sgc2Vzc2lvbkV4dGVybmFsSWQ6ICdzMScsIGlzUmVhZDogdHJ1ZSB9XSwgdW5kZWZpbmVkKSkudG9CZVVuZGVmaW5lZCgpXG4gICAgfSlcblxuICAgIGl0KCdyZXNvbHZlcyBob3N0IHRha2VvdmVyIGFnZW50IGlkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVIb3N0VGFrZW92ZXJBZ2VudElkKGZhbHNlLCBbYWdlbnQoJ2ExJyldLCAnY3VycmVudCcpKS50b0JlKCdjdXJyZW50JylcbiAgICAgIGV4cGVjdChyZXNvbHZlSG9zdFRha2VvdmVyQWdlbnRJZChmYWxzZSwgW2FnZW50KCdhMScpXSwgdW5kZWZpbmVkKSkudG9CZU51bGwoKVxuICAgICAgZXhwZWN0KHJlc29sdmVIb3N0VGFrZW92ZXJBZ2VudElkKHRydWUsIFthZ2VudCgnYTEnKV0sICdjdXJyZW50JykpLnRvQmUoJ2ExJylcbiAgICAgIGV4cGVjdChyZXNvbHZlSG9zdFRha2VvdmVyQWdlbnRJZCh0cnVlLCBbXSwgJ2N1cnJlbnQnKSkudG9CZU51bGwoKVxuICAgIH0pXG5cbiAgICBpdCgnYnVpbGRzIHBhbmVsIHNlc3Npb24gcGF0Y2ggb25seSB3aGVuIGV4cGFuZGVkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZE1haWFQYW5lbFNlc3Npb25QYXRjaCh7XG4gICAgICAgICAgaXNNaW5pbWl6ZWQ6IHRydWUsXG4gICAgICAgICAgY3VycmVudE9wdGlvbjogb3B0aW9ucy5ob21lLFxuICAgICAgICAgIGFnZW50c05hdkFjdGl2ZTogbnVsbCxcbiAgICAgICAgICBhY3RpdmVDaGF0SWQ6IG51bGwsXG4gICAgICAgICAgYWdlbnRJZDogbnVsbCxcbiAgICAgICAgICBzaWRlYmFyT3BlbjogZmFsc2UsXG4gICAgICAgICAgbGF5b3V0TW9kZTogJ2Zsb2F0aW5nJyxcbiAgICAgICAgICBkcmFnUG9zaXRpb246IHsgeDogMSwgeTogMiB9LFxuICAgICAgICAgIGhvc3RDb250ZXh0OiB7XG4gICAgICAgICAgICBzZWN0aW9uOiAnaGVhZGVyJyxcbiAgICAgICAgICAgIHByb2plY3Q6IG51bGwsXG4gICAgICAgICAgICBjbGllbnQ6IG51bGwsXG4gICAgICAgICAgICB0YXNrOiBudWxsLFxuICAgICAgICAgICAgY2hpcHNQcm9qZWN0OiBudWxsLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICApLnRvQmVOdWxsKClcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZE1haWFQYW5lbFNlc3Npb25QYXRjaCh7XG4gICAgICAgICAgaXNNaW5pbWl6ZWQ6IGZhbHNlLFxuICAgICAgICAgIGN1cnJlbnRPcHRpb246IG9wdGlvbnMuY2hhdCxcbiAgICAgICAgICBhZ2VudHNOYXZBY3RpdmU6ICdteUFnZW50cycsXG4gICAgICAgICAgYWN0aXZlQ2hhdElkOiAnY2hhdC0xJyxcbiAgICAgICAgICBhZ2VudElkOiAnMScsXG4gICAgICAgICAgc2lkZWJhck9wZW46IHRydWUsXG4gICAgICAgICAgbGF5b3V0TW9kZTogJ3NpZGViYXInLFxuICAgICAgICAgIGRyYWdQb3NpdGlvbjogeyB4OiAxLCB5OiAyIH0sXG4gICAgICAgICAgaG9zdENvbnRleHQ6IHtcbiAgICAgICAgICAgIHNlY3Rpb246ICdoZWFkZXInLFxuICAgICAgICAgICAgcHJvamVjdDogbnVsbCxcbiAgICAgICAgICAgIGNsaWVudDogbnVsbCxcbiAgICAgICAgICAgIHRhc2s6IG51bGwsXG4gICAgICAgICAgICBjaGlwc1Byb2plY3Q6IG51bGwsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICkudG9NYXRjaE9iamVjdCh7IGFjdGl2ZUNoYXRJZDogJ2NoYXQtMScsIGRyYWdQb3NpdGlvbjogbnVsbCB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIGJ1aWxkTWFpYVBhbmVsU2Vzc2lvblBhdGNoKHtcbiAgICAgICAgICBpc01pbmltaXplZDogZmFsc2UsXG4gICAgICAgICAgY3VycmVudE9wdGlvbjogb3B0aW9ucy5jaGF0LFxuICAgICAgICAgIGFnZW50c05hdkFjdGl2ZTogbnVsbCxcbiAgICAgICAgICBhY3RpdmVDaGF0SWQ6ICdjaGF0LTEnLFxuICAgICAgICAgIGFnZW50SWQ6ICcxJyxcbiAgICAgICAgICBzaWRlYmFyT3BlbjogZmFsc2UsXG4gICAgICAgICAgbGF5b3V0TW9kZTogJ2Zsb2F0aW5nJyxcbiAgICAgICAgICBkcmFnUG9zaXRpb246IHsgeDogMywgeTogNCB9LFxuICAgICAgICAgIGhvc3RDb250ZXh0OiB7XG4gICAgICAgICAgICBzZWN0aW9uOiAnaGVhZGVyJyxcbiAgICAgICAgICAgIHByb2plY3Q6IG51bGwsXG4gICAgICAgICAgICBjbGllbnQ6IG51bGwsXG4gICAgICAgICAgICB0YXNrOiBudWxsLFxuICAgICAgICAgICAgY2hpcHNQcm9qZWN0OiBudWxsLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICApLnRvTWF0Y2hPYmplY3QoeyBkcmFnUG9zaXRpb246IHsgeDogMywgeTogNCB9IH0pXG4gICAgfSlcblxuICAgIGl0KCdyZXNvbHZlcyBmbG9hdGluZyBkcmFnIHBvc2l0aW9uIHdpdGggY2xhbXAgZmFsbGJhY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBjbGFtcCA9ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gKHsgeCwgeSB9KVxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlRmxvYXRpbmdQYW5lbERyYWdQb3NpdGlvbih7XG4gICAgICAgICAgbGF5b3V0TW9kZTogJ3NpZGViYXInLFxuICAgICAgICAgIGRyYWdQb3NpdGlvbjogeyB4OiA1LCB5OiA2IH0sXG4gICAgICAgICAgdmlld3BvcnRXaWR0aDogMTIwMCxcbiAgICAgICAgICBwYW5lbFdpZHRoOiA0MDAsXG4gICAgICAgICAgY2xhbXAsXG4gICAgICAgIH0pXG4gICAgICApLnRvRXF1YWwoeyB4OiA1LCB5OiA2IH0pXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUZsb2F0aW5nUGFuZWxEcmFnUG9zaXRpb24oe1xuICAgICAgICAgIGxheW91dE1vZGU6ICdmbG9hdGluZycsXG4gICAgICAgICAgZHJhZ1Bvc2l0aW9uOiBudWxsLFxuICAgICAgICAgIHZpZXdwb3J0V2lkdGg6IDEyMDAsXG4gICAgICAgICAgcGFuZWxXaWR0aDogNDAwLFxuICAgICAgICAgIGNsYW1wLFxuICAgICAgICB9KVxuICAgICAgKS50b0VxdWFsKHsgeDogNzg0LCB5OiAxNiB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVGbG9hdGluZ1BhbmVsRHJhZ1Bvc2l0aW9uKHtcbiAgICAgICAgICBsYXlvdXRNb2RlOiAnZmxvYXRpbmcnLFxuICAgICAgICAgIGRyYWdQb3NpdGlvbjogeyB4OiA0MCwgeTogNTAgfSxcbiAgICAgICAgICB2aWV3cG9ydFdpZHRoOiAxMjAwLFxuICAgICAgICAgIHBhbmVsV2lkdGg6IDQwMCxcbiAgICAgICAgICBjbGFtcCxcbiAgICAgICAgfSlcbiAgICAgICkudG9FcXVhbCh7IHg6IDQwLCB5OiA1MCB9KVxuICAgIH0pXG5cbiAgICBpdCgncmV1c2VzIHByZXZpb3VzIGRyYWcgcG9zaXRpb24gd2hlbiB1bmNoYW5nZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwcmV2ID0geyB4OiAxMCwgeTogMjAgfVxuICAgICAgZXhwZWN0KHJlc29sdmVOZXh0RHJhZ1Bvc2l0aW9uKHByZXYsIHsgeDogMTAsIHk6IDIwIH0pKS50b0JlKHByZXYpXG4gICAgICBleHBlY3QocmVzb2x2ZU5leHREcmFnUG9zaXRpb24ocHJldiwgeyB4OiAxMSwgeTogMjAgfSkpLnRvRXF1YWwoeyB4OiAxMSwgeTogMjAgfSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCduYXZpZ2F0aW9uIGFuZCBsZWdhY3kgY29udGV4dCBoZWxwZXJzJywgKCkgPT4ge1xuICAgIGl0KCdyZXNvbHZlcyBwaW5uZWQgY29udGV4dCBhbmQgYmFjayBidXR0b24gdmlzaWJpbGl0eScsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlSGFzUGlubmVkQ29udGV4dCh7IHRhc2tJZDogMSB9KSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHJlc29sdmVIYXNQaW5uZWRDb250ZXh0KHt9KSkudG9CZShmYWxzZSlcblxuICAgICAgY29uc3QgZmxhZ3MgPSByZXNvbHZlT3JjaGVzdHJhdG9ySG9tZU5hdkZsYWdzKHtcbiAgICAgICAgY29tcHV0ZWRDdXJyZW50T3B0aW9uOiBvcHRpb25zLmNoYXQsXG4gICAgICAgIGhvbWVPcHRpb246IG9wdGlvbnMuaG9tZSxcbiAgICAgICAgY2hhdE9wdGlvbjogb3B0aW9ucy5jaGF0LFxuICAgICAgICBoYXNQaW5uZWRDb250ZXh0OiB0cnVlLFxuICAgICAgICBzZWN0aW9uOiAnaGVhZGVyJyxcbiAgICAgICAgZGlkUmVzZXRDb250ZXh0SW5TZWN0aW9uOiBmYWxzZSxcbiAgICAgIH0pXG4gICAgICBleHBlY3QoZmxhZ3MuaXNDaGF0VmlldykudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KFxuICAgICAgICBzaG91bGRTaG93T3JjaGVzdHJhdG9yQmFja0J1dHRvbih7XG4gICAgICAgICAgYWdlbnRUeXBlOiAnb3JjaGVzdHJhdG9yJyxcbiAgICAgICAgICBoYXNFcnJvcjogZmFsc2UsXG4gICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgLi4uZmxhZ3MsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUodHJ1ZSlcblxuICAgICAgY29uc3Qgc2VjdGlvblJlc2V0RmxhZ3MgPSByZXNvbHZlT3JjaGVzdHJhdG9ySG9tZU5hdkZsYWdzKHtcbiAgICAgICAgY29tcHV0ZWRDdXJyZW50T3B0aW9uOiBvcHRpb25zLmhvbWUsXG4gICAgICAgIGhvbWVPcHRpb246IG9wdGlvbnMuaG9tZSxcbiAgICAgICAgY2hhdE9wdGlvbjogb3B0aW9ucy5jaGF0LFxuICAgICAgICBoYXNQaW5uZWRDb250ZXh0OiB0cnVlLFxuICAgICAgICBzZWN0aW9uOiAncHJvamVjdCcsXG4gICAgICAgIGRpZFJlc2V0Q29udGV4dEluU2VjdGlvbjogdHJ1ZSxcbiAgICAgIH0pXG4gICAgICBleHBlY3Qoc2VjdGlvblJlc2V0RmxhZ3MuaXNTZWN0aW9uUmVzZXRIb21lU3RlcDIpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2hvdWxkU2hvd09yY2hlc3RyYXRvckJhY2tCdXR0b24oe1xuICAgICAgICAgIGFnZW50VHlwZTogJ29yY2hlc3RyYXRvcicsXG4gICAgICAgICAgaGFzRXJyb3I6IHRydWUsXG4gICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgLi4uc2VjdGlvblJlc2V0RmxhZ3MsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUoZmFsc2UpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2hvdWxkU2hvd09yY2hlc3RyYXRvckJhY2tCdXR0b24oe1xuICAgICAgICAgIGFnZW50VHlwZTogJ29yY2hlc3RyYXRvcicsXG4gICAgICAgICAgaGFzRXJyb3I6IGZhbHNlLFxuICAgICAgICAgIGxvYWRpbmc6IHRydWUsXG4gICAgICAgICAgaXNDaGF0VmlldzogdHJ1ZSxcbiAgICAgICAgICBpc0hlYWRlckhvbWVTdGVwMjogZmFsc2UsXG4gICAgICAgICAgaXNTZWN0aW9uUmVzZXRIb21lU3RlcDI6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKGZhbHNlKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHNob3VsZFNob3dPcmNoZXN0cmF0b3JCYWNrQnV0dG9uKHtcbiAgICAgICAgICBhZ2VudFR5cGU6ICdvcmNoZXN0cmF0b3InLFxuICAgICAgICAgIGhhc0Vycm9yOiBmYWxzZSxcbiAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICBpc0NoYXRWaWV3OiBmYWxzZSxcbiAgICAgICAgICBpc0hlYWRlckhvbWVTdGVwMjogZmFsc2UsXG4gICAgICAgICAgaXNTZWN0aW9uUmVzZXRIb21lU3RlcDI6IHRydWUsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUodHJ1ZSlcbiAgICB9KVxuXG4gICAgaXQoJ2J1aWxkcyBsZWdhY3kgbWlncmF0aW9uIHBhdGNoZXMgZm9yIGNsaWVudCwgcHJvamVjdCBhbmQgdGFzayBlbnRpdGllcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChidWlsZExlZ2FjeUNvbnRleHRNaWdyYXRpb25QYXRjaChudWxsKSkudG9CZU51bGwoKVxuICAgICAgZXhwZWN0KGJ1aWxkTGVnYWN5Q29udGV4dE1pZ3JhdGlvblBhdGNoKHsgYWdlbnRFbnRpdHk6ICdjbGllbnQnIH0pKS50b0JlTnVsbCgpXG4gICAgICBleHBlY3QoXG4gICAgICAgIGJ1aWxkTGVnYWN5Q29udGV4dE1pZ3JhdGlvblBhdGNoKHsgYWdlbnRFbnRpdHk6ICdjbGllbnQnLCBjbGllbnRJZDogMywgY2xpZW50TmFtZTogJ0FDTUUnIH0pPy5jbGllbnRcbiAgICAgICkudG9FcXVhbCh7XG4gICAgICAgIGlkOiAzLFxuICAgICAgICBuYW1lOiAnQUNNRScsXG4gICAgICB9KVxuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZExlZ2FjeUNvbnRleHRNaWdyYXRpb25QYXRjaCh7IGFnZW50RW50aXR5OiAncHJvamVjdCcsIHByb2plY3RJZDogOSwgcHJvamVjdE5hbWU6ICdQJyB9KT8uY2hpcHNQcm9qZWN0XG4gICAgICAgICAgPy5wcm9qZWN0SWRcbiAgICAgICkudG9CZSgnOScpXG4gICAgICBleHBlY3QoXG4gICAgICAgIGJ1aWxkTGVnYWN5Q29udGV4dE1pZ3JhdGlvblBhdGNoKHtcbiAgICAgICAgICBhZ2VudEVudGl0eTogJ3Rhc2snLFxuICAgICAgICAgIHRhc2tJZDogMSxcbiAgICAgICAgICB0YXNrTmFtZTogJ1QnLFxuICAgICAgICAgIHByb2plY3RJZDogMixcbiAgICAgICAgICBwcm9qZWN0TmFtZTogJ1AnLFxuICAgICAgICAgIGNsaWVudElkOiA0LFxuICAgICAgICAgIGNsaWVudE5hbWU6ICdDJyxcbiAgICAgICAgfSk/LnRhc2tcbiAgICAgICkudG9NYXRjaE9iamVjdCh7IGlkOiAxLCBuYW1lOiAnVCcsIHByb2plY3RJZDogMiB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIGJ1aWxkTGVnYWN5Q29udGV4dE1pZ3JhdGlvblBhdGNoKHtcbiAgICAgICAgICBhZ2VudEVudGl0eTogJ3Byb2plY3QnLFxuICAgICAgICAgIHByb2plY3RJZDogOSxcbiAgICAgICAgICBwcm9qZWN0TmFtZTogJ1AnLFxuICAgICAgICAgIGNsaWVudElkOiA0LFxuICAgICAgICAgIGNsaWVudE5hbWU6ICdDJyxcbiAgICAgICAgfSk/LnByb2plY3RcbiAgICAgICkudG9NYXRjaE9iamVjdCh7IGNsaWVudElkOiA0IH0pXG5cbiAgICAgIGV4cGVjdChidWlsZExlZ2FjeUNvbnRleHRNaWdyYXRpb25QYXRjaCh7IGFnZW50RW50aXR5OiAndGFzaycsIHRhc2tJZDogNSwgdGFza05hbWU6ICdPbmx5IHRhc2snIH0pPy50YXNrKS50b0VxdWFsKFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6IDUsXG4gICAgICAgICAgbmFtZTogJ09ubHkgdGFzaycsXG4gICAgICAgIH1cbiAgICAgIClcblxuICAgICAgZXhwZWN0KGJ1aWxkTGVnYWN5Q29udGV4dE1pZ3JhdGlvblBhdGNoKHsgYWdlbnRFbnRpdHk6ICdjbGllbnQnLCBjbGllbnRJZDogMSB9KT8uY2xpZW50KS50b0VxdWFsKHtcbiAgICAgICAgaWQ6IDEsXG4gICAgICAgIG5hbWU6ICcnLFxuICAgICAgfSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZExlZ2FjeUNvbnRleHRNaWdyYXRpb25QYXRjaCh7XG4gICAgICAgICAgYWdlbnRFbnRpdHk6ICd0YXNrJyxcbiAgICAgICAgICB0YXNrSWQ6IDgsXG4gICAgICAgICAgdGFza05hbWU6ICdUJyxcbiAgICAgICAgICBwcm9qZWN0SWQ6IDIsXG4gICAgICAgICAgcHJvamVjdE5hbWU6ICdQJyxcbiAgICAgICAgfSk/LmNoaXBzUHJvamVjdD8ucHJvamVjdElkXG4gICAgICApLnRvQmUoJzInKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIGJ1aWxkTGVnYWN5Q29udGV4dE1pZ3JhdGlvblBhdGNoKHtcbiAgICAgICAgICBhZ2VudEVudGl0eTogJ3Rhc2snLFxuICAgICAgICAgIHRhc2tJZDogNixcbiAgICAgICAgICB0YXNrTmFtZTogJ1QnLFxuICAgICAgICAgIGNsaWVudElkOiAzLFxuICAgICAgICAgIGNsaWVudE5hbWU6ICdDJyxcbiAgICAgICAgfSk/LmNsaWVudFxuICAgICAgKS50b0VxdWFsKHsgaWQ6IDMsIG5hbWU6ICdDJyB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIGJ1aWxkTGVnYWN5Q29udGV4dE1pZ3JhdGlvblBhdGNoKHtcbiAgICAgICAgICBhZ2VudEVudGl0eTogJ3Byb2plY3QnLFxuICAgICAgICAgIHByb2plY3RJZDogOSxcbiAgICAgICAgICBwcm9qZWN0TmFtZTogJ1AnLFxuICAgICAgICB9KT8ucHJvamVjdFxuICAgICAgKS5ub3QudG9IYXZlUHJvcGVydHkoJ2NsaWVudElkJylcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZExlZ2FjeUNvbnRleHRNaWdyYXRpb25QYXRjaCh7XG4gICAgICAgICAgYWdlbnRFbnRpdHk6ICd0YXNrJyxcbiAgICAgICAgICB0YXNrSWQ6IDEwLFxuICAgICAgICAgIHRhc2tOYW1lOiAnRnVsbCB0YXNrJyxcbiAgICAgICAgICBwcm9qZWN0SWQ6IDExLFxuICAgICAgICAgIHByb2plY3ROYW1lOiAnUHJvaicsXG4gICAgICAgICAgY2xpZW50SWQ6IDEyLFxuICAgICAgICAgIGNsaWVudE5hbWU6ICdDbGllbnQnLFxuICAgICAgICB9KVxuICAgICAgKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgdGFzazogeyBpZDogMTAsIG5hbWU6ICdGdWxsIHRhc2snLCBwcm9qZWN0SWQ6IDExLCBjbGllbnRJZDogMTIgfSxcbiAgICAgICAgY2xpZW50OiB7IGlkOiAxMiwgbmFtZTogJ0NsaWVudCcgfSxcbiAgICAgICAgY2hpcHNQcm9qZWN0OiB7IHByb2plY3RJZDogJzExJywgcHJvamVjdE5hbWU6ICdQcm9qJywgY2xpZW50TmFtZTogJ0NsaWVudCcgfSxcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KCdyZXNvbHZlcyBmbG9hdGluZyBkcmFnIGNsYW1wIGFuZCBsYXlvdXQgcG9zaXRpb24gdXBkYXRlcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRVc2VEcmFnQ2xhbXBGYWxsYmFjayhudWxsKSkudG9CZSh0cnVlKVxuICAgICAgY29uc3QgY2xhbXAgPSAoeDogbnVtYmVyLCB5OiBudW1iZXIpID0+ICh7IHgsIHkgfSlcbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUxheW91dERyYWdQb3NpdGlvblVwZGF0ZSgnZmxvYXRpbmcnLCB7IHg6IDQsIHk6IDggfSwgY2xhbXAsIHtcbiAgICAgICAgICBpbm5lcldpZHRoOiAxMDAwLFxuICAgICAgICAgIHBhbmVsV2lkdGg6IDQwMCxcbiAgICAgICAgICBwYWQ6IDE2LFxuICAgICAgICB9KVxuICAgICAgKS50b0VxdWFsKHsgeDogNCwgeTogOCB9KVxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlTGF5b3V0RHJhZ1Bvc2l0aW9uVXBkYXRlKCdmbG9hdGluZycsIG51bGwsIGNsYW1wLCB7XG4gICAgICAgICAgaW5uZXJXaWR0aDogMTAwMCxcbiAgICAgICAgICBwYW5lbFdpZHRoOiA0MDAsXG4gICAgICAgICAgcGFkOiAxNixcbiAgICAgICAgfSlcbiAgICAgICkudG9FcXVhbCh7IHg6IDU4NCwgeTogMTYgfSlcbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUxheW91dERyYWdQb3NpdGlvblVwZGF0ZSgnc2lkZWJhcicsIG51bGwsIGNsYW1wLCB7IGlubmVyV2lkdGg6IDAsIHBhbmVsV2lkdGg6IDAsIHBhZDogMCB9KVxuICAgICAgKS50b0JlTnVsbCgpXG4gICAgICBleHBlY3QocmVzb2x2ZVBlcnNpc3RlZERyYWdQb3NpdGlvbk9uRW5kKCdmbG9hdGluZycsIHt9IGFzIEhUTUxFbGVtZW50KSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHJlc29sdmVQZXJzaXN0ZWREcmFnUG9zaXRpb25PbkVuZCgnc2lkZWJhcicsIHt9IGFzIEhUTUxFbGVtZW50KSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgaXQoJ2J1aWxkcyBpbml0aWFsIGNoYXQgbWVzc2FnZSBwYXlsb2FkIGZyb20gc3RhcnQgY2hhdCBhcmdzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGJ1aWxkVXNlckluaXRpYWxNZXNzYWdlRnJvbVN0YXJ0Q2hhdCh7IG1lc3NhZ2U6ICdob2xhJywgZmFxSWQ6ICdmMScgfSkpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgICBtZXNzYWdlOiAnaG9sYScsXG4gICAgICAgIGZhcUlkOiAnZjEnLFxuICAgICAgICBhdHRhY2htZW50czogW10sXG4gICAgICB9KVxuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZFVzZXJJbml0aWFsTWVzc2FnZUZyb21TdGFydENoYXQoe1xuICAgICAgICAgIGF0dGFjaG1lbnRzOiBbeyBpZDogJzEnIH1dLFxuICAgICAgICAgIGFnZW50U3VnZ2VzdGlvbklkOiAnczEnLFxuICAgICAgICAgIG1lbnRpb25zOiBbeyBpZDogJ20xJyB9XSxcbiAgICAgICAgICBmdWFJZDogJ2Z1YScsXG4gICAgICAgICAgc2NJZDogJ3NjJyxcbiAgICAgICAgICBjb250ZXh0RGF0YTogeyB0YXNrSWQ6IDEgfSxcbiAgICAgICAgfSlcbiAgICAgICkudG9NYXRjaE9iamVjdCh7XG4gICAgICAgIG1lc3NhZ2U6ICcnLFxuICAgICAgICBhdHRhY2htZW50czogW3sgaWQ6ICcxJyB9XSxcbiAgICAgICAgYWdlbnRTdWdnZXN0aW9uSWQ6ICdzMScsXG4gICAgICAgIG1lbnRpb25zOiBbeyBpZDogJ20xJyB9XSxcbiAgICAgICAgZnVhSWQ6ICdmdWEnLFxuICAgICAgICBzY0lkOiAnc2MnLFxuICAgICAgICBjb250ZXh0RGF0YTogeyB0YXNrSWQ6IDEgfSxcbiAgICAgIH0pXG4gICAgICBleHBlY3Qoc2hvdWxkUmVzZXRTaWRlYmFyRXJyb3JPblN0YXJ0Q2hhdCh0cnVlKSkudG9CZSh0cnVlKVxuICAgIH0pXG5cbiAgICBpdCgnc3VwcG9ydHMgZ28taG9tZSBhbmQgc2VuZCByb3V0aW5nIGd1YXJkcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRDbGVhckNsaWVudE9uR29Ib21lRnJvbUNoYXQoJ2NsaWVudCcpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFJlc2V0QWdlbnRUb0ZpcnN0T25Hb0hvbWUoeyBoYXNfbm90X2FjY2VzczogdHJ1ZSB9IGFzIEFnZW50LCAyKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFJlc2V0QWdlbnRUb0ZpcnN0T25Hb0hvbWUobnVsbCwgMikpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRSZXNldEFnZW50VG9GaXJzdE9uR29Ib21lKHsgaXNfZGVsZXRlZDogdHJ1ZSB9IGFzIEFnZW50LCAxKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFJlc2V0QWdlbnRUb0ZpcnN0T25Hb0hvbWUoeyBoYXNfbm90X2FjY2VzczogdHJ1ZSB9IGFzIEFnZW50LCAwKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRVc2VBY3RpdmVDaGF0U2VuZEhhbmRsZXIob3B0aW9ucy5jaGF0LCBvcHRpb25zLmNoYXQsIHRydWUpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoY2FuT3Blbk1haWFNYXJrZXRwbGFjZShmYWxzZSkpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3QoZmluZE9yY2hlc3RyYXRvckFnZW50KFthZ2VudCgnMicpLCBvcmNoZXN0cmF0b3JBZ2VudF0pPy50eXBlKS50b0JlKCdvcmNoZXN0cmF0b3InKVxuICAgICAgZXhwZWN0KHNob3VsZE1hcmtBZ2VudEFzTGVnYWN5Q29udGV4dCh7fSwgeyBpZDogJzEnIH0gYXMgQWdlbnQpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkTWFya0FnZW50QXNMZWdhY3lDb250ZXh0KHt9LCB7IGlkOiAnMScsIGlzX2xlZ2FjeV9jb250ZXh0OiB0cnVlIH0gYXMgQWdlbnQpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KGJ1aWxkTGVnYWN5Q29udGV4dEFnZW50KHsgaWQ6ICcxJywgbmFtZTogJ0EnLCB0eXBlOiAnY3VzdG9tJyB9IGFzIEFnZW50KS5pc19sZWdhY3lfY29udGV4dCkudG9CZSh0cnVlKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ21vdW50LCBiYW5uZXIgYW5kIGFnZW50cyBsb2FkaW5nIGhlbHBlcnMnLCAoKSA9PiB7XG4gICAgaXQoJ2NvbnRyb2xzIGNoYXQgdmlzaWJpbGl0eSBhbmQgbGFzdCBhY3RpdmUgY2hhdCBwZXJzaXN0ZW5jZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRTZXRDaGF0Vmlld0hpZGRlbk9uTW91bnQoZmFsc2UpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkU2V0Q2hhdFZpZXdIaWRkZW5Pbk1vdW50KHRydWUpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFBlcnNpc3RMYXN0QWN0aXZlQ2hhdElkKCdjaGF0LTEnKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFBlcnNpc3RMYXN0QWN0aXZlQ2hhdElkKG51bGwpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFN5bmNQYW5lbFNlc3Npb25PblBhZ2VIaWRlKGZhbHNlKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFN5bmNQYW5lbFNlc3Npb25PblBhZ2VIaWRlKHRydWUpKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgnZGV0ZWN0cyBiYW5uZXIgRkFRIHRpdGxlcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChoYXNCYW5uZXJGYXFUaXRsZSgnICAnKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChoYXNCYW5uZXJGYXFUaXRsZSgnUHJlZ3VudGEnKSkudG9CZSh0cnVlKVxuICAgIH0pXG5cbiAgICBpdCgncmVzb2x2ZXMgY2FjaGVkIGFnZW50cyBhbmQgaW5pdGlhbCBmZXRjaCBhdHRlbXB0cycsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQ2FjaGVkQWdlbnRzSWZBdmFpbGFibGUoW2FnZW50KCcxJyldKSkudG9FcXVhbChbYWdlbnQoJzEnKV0pXG4gICAgICBleHBlY3QocmVzb2x2ZUNhY2hlZEFnZW50c0lmQXZhaWxhYmxlKFtdKSkudG9CZU51bGwoKVxuICAgICAgZXhwZWN0KHNob3VsZEF0dGVtcHRJbml0aWFsQWdlbnRzRmV0Y2goMCwgZmFsc2UpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkQXR0ZW1wdEluaXRpYWxBZ2VudHNGZXRjaCgwLCB0cnVlKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRBdHRlbXB0SW5pdGlhbEFnZW50c0ZldGNoKDIsIGZhbHNlKSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgaXQoJ2ZpbmRzIGFnZW50cyBmb3IgY2hhdCBpdGVtcyB3aXRoIG51bWVyaWMgaWRzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGZpbmRBZ2VudEZvckNoYXRJdGVtKFt7IC4uLmFnZW50KCc3JyksIGlkOiAnNycgfSBhcyBBZ2VudF0sIDcpPy5pZCkudG9CZSgnNycpXG4gICAgICBleHBlY3QoZmluZEFnZW50Rm9yQ2hhdEl0ZW0oW2FnZW50KCcxJyldLCA5OSkpLnRvQmVVbmRlZmluZWQoKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ2hvc3QgdGFrZW92ZXIgYW5kIG5hdmlnYXRpb24gZ3VhcmRzJywgKCkgPT4ge1xuICAgIGl0KCdhcHBsaWVzIGNsaWVudCB1cGRhdGVzIG9ubHkgd2hlbiBkZWZpbmVkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHNob3VsZEFwcGx5Q2xpZW50T25Ib3N0VGFrZW92ZXIodW5kZWZpbmVkKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRBcHBseUNsaWVudE9uSG9zdFRha2VvdmVyKG51bGwpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkQXBwbHlDbGllbnRPbkhvc3RUYWtlb3Zlcih7IGlkOiAxLCBuYW1lOiAnQWNtZScgfSBhcyBuZXZlcikpLnRvQmUodHJ1ZSlcbiAgICB9KVxuXG4gICAgaXQoJ3NlbGVjdHMgZmlyc3QgYWdlbnQgb24gZ2xvYmFsIGhvc3QgdGFrZW92ZXInLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoc2hvdWxkU2VsZWN0Rmlyc3RBZ2VudE9uSG9zdFRha2VvdmVyKHRydWUsIGFnZW50KCcxJykpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkU2VsZWN0Rmlyc3RBZ2VudE9uSG9zdFRha2VvdmVyKGZhbHNlLCBhZ2VudCgnMScpKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRTZWxlY3RGaXJzdEFnZW50T25Ib3N0VGFrZW92ZXIodHJ1ZSwgdW5kZWZpbmVkKSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgaXQoJ2NvdmVycyBnby1ob21lLCBjYXRhbG9nIGFuZCBza2lsbCBhZ2VudCBndWFyZHMnLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoc2hvdWxkUmVzZXRDaGF0U3RhdGVPbkdvSG9tZShvcHRpb25zLmNoYXQsIG9wdGlvbnMuY2hhdCkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRSZXNldENoYXRTdGF0ZU9uR29Ib21lKG9wdGlvbnMuaG9tZSwgb3B0aW9ucy5jaGF0KSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRDbGVhckNvbnRleHRGb3JDYXRhbG9nT3JTa2lsbEFnZW50KGFnZW50KCcxJykpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkQ2xlYXJDb250ZXh0Rm9yQ2F0YWxvZ09yU2tpbGxBZ2VudCh1bmRlZmluZWQpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZENsZWFyVGFza09uR29Ib21lRnJvbUNoYXQoJ3Rhc2snKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRDbGVhclRhc2tPbkdvSG9tZUZyb21DaGF0KCdoZWFkZXInKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZENsZWFyT3JjaGVzdHJhdG9yR2xvYmFsQ29udGV4dE9uR29Ib21lKCdoZWFkZXInLCAnb3JjaGVzdHJhdG9yJykpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRDbGVhck9yY2hlc3RyYXRvckdsb2JhbENvbnRleHRPbkdvSG9tZSgncHJvamVjdCcsICdvcmNoZXN0cmF0b3InKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRQcmVmZXRjaEFnZW50c0ZvckNhdGFsb2dOZXdDaGF0KG9wdGlvbnMubXlBZ2VudHMsIG9wdGlvbnMubXlBZ2VudHMsIG9wdGlvbnMubXlTa2lsbHMpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkUHJlZmV0Y2hBZ2VudHNGb3JDYXRhbG9nTmV3Q2hhdChvcHRpb25zLmhvbWUsIG9wdGlvbnMubXlBZ2VudHMsIG9wdGlvbnMubXlTa2lsbHMpKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgncmVzb2x2ZXMgb3Blbi1uZXctY2hhdC13aXRoLWFnZW50IGNvbnRleHQgcGF0Y2hlcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlT3Blbk5ld0NoYXRXaXRoQWdlbnRDb250ZXh0KHsgcHJvamVjdDogeyBpZDogMSwgbmFtZTogJ1AnIH0gYXMgbmV2ZXIgfSkpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgICBwcm9qZWN0OiB7IGlkOiAxLCBuYW1lOiAnUCcgfSxcbiAgICAgICAgc2hvdWxkU2V0VGFzazogZmFsc2UsXG4gICAgICB9KVxuICAgICAgZXhwZWN0KHJlc29sdmVPcGVuTmV3Q2hhdFdpdGhBZ2VudENvbnRleHQoeyB0YXNrOiB7IGlkOiAyLCBuYW1lOiAnVCcgfSBhcyBuZXZlciB9KS5zaG91bGRTZXRUYXNrKS50b0JlKHRydWUpXG4gICAgfSlcblxuICAgIGl0KCd2YWxpZGF0ZXMgbGVnYWN5IGNvbnRleHQgY29udGludWF0aW9uJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGNhbkNvbnRpbnVlTGVnYWN5Q29udGV4dEluTmV3Q2hhdCh7IGFnZW50RW50aXR5OiAndGFzaycgfSwgb3JjaGVzdHJhdG9yQWdlbnQpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoY2FuQ29udGludWVMZWdhY3lDb250ZXh0SW5OZXdDaGF0KG51bGwsIG9yY2hlc3RyYXRvckFnZW50KSkudG9CZShmYWxzZSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdzZXNzaW9uIHJlc3RvcmUgcm91dGluZycsICgpID0+IHtcbiAgICBpdCgnbWFwcyBzbmFwc2hvdCBuYXYgcm91dGVzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVTZXNzaW9uUmVzdG9yZU5hdlJvdXRlKHsgYWdlbnRzTmF2QWN0aXZlOiAnbXlBZ2VudHMnIH0pKS50b0JlKCdteUFnZW50cycpXG4gICAgICBleHBlY3QocmVzb2x2ZVNlc3Npb25SZXN0b3JlTmF2Um91dGUoeyBhZ2VudHNOYXZBY3RpdmU6ICdteVNraWxscycgfSkpLnRvQmUoJ215U2tpbGxzJylcbiAgICAgIGV4cGVjdChyZXNvbHZlU2Vzc2lvblJlc3RvcmVOYXZSb3V0ZSh7IGFnZW50c05hdkFjdGl2ZTogJ21haWFrZXInIH0pKS50b0JlKCdtYWlha2VyJylcbiAgICAgIGV4cGVjdChyZXNvbHZlU2Vzc2lvblJlc3RvcmVOYXZSb3V0ZSh7IGN1cnJlbnRPcHRpb246ICdjaGF0JywgYWN0aXZlQ2hhdElkOiAncy0xJyB9KSkudG9CZSgnY2hhdCcpXG4gICAgICBleHBlY3QocmVzb2x2ZVNlc3Npb25SZXN0b3JlTmF2Um91dGUoeyBjdXJyZW50T3B0aW9uOiAnaG9tZScgfSkpLnRvQmUoJ3NhdmVkT3B0aW9uJylcbiAgICAgIGV4cGVjdChyZXNvbHZlU2Vzc2lvblJlc3RvcmVOYXZSb3V0ZSh7IGN1cnJlbnRPcHRpb246ICdpbnZhbGlkJyB9KSkudG9CZSgnbm9uZScpXG4gICAgfSlcblxuICAgIGl0KCdjb250cm9scyBhZ2VudHMgbG9hZCBicmFuY2hlcyBkdXJpbmcgcmVzdG9yZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRTa2lwQWdlbnRzTG9hZE9uU2Vzc2lvblJlc3RvcmUoJ215U2tpbGxzJykpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRTa2lwQWdlbnRzTG9hZE9uU2Vzc2lvblJlc3RvcmUoJ215QWdlbnRzJykpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3Qoc2hvdWxkRmV0Y2hBZ2VudERldGFpbE9uU2Vzc2lvblJlc3RvcmUoJ2ExJywgJ21haWFrZXInKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZEZldGNoQWdlbnREZXRhaWxPblNlc3Npb25SZXN0b3JlKCdhMScsICdteUFnZW50cycpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFBhc3NBZ2VudFRvR2V0QWdlbnRzT25SZXN0b3JlKCdteUFnZW50cycpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFBhc3NBZ2VudFRvR2V0QWdlbnRzT25SZXN0b3JlKCdtYWlha2VyJykpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRTZWxlY3RGZXRjaGVkQWdlbnRBZnRlclJlc3RvcmUoYWdlbnQoJzEnKSwgJ21haWFrZXInKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFNlbGVjdEZldGNoZWRBZ2VudEFmdGVyUmVzdG9yZShhZ2VudCgnMScpLCAnbXlBZ2VudHMnKSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgaXQoJ3Jlc3RvcmVzIGNoaXBzIHByb2plY3QgZnJvbSBzbmFwc2hvdCBob3N0IGNvbnRleHQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVTbmFwc2hvdENoaXBzUHJvamVjdCh7XG4gICAgICAgICAgY2hpcHNQcm9qZWN0OiB7IHByb2plY3RJZDogJzknLCBwcm9qZWN0TmFtZTogJ1AnLCBjbGllbnROYW1lOiAnQycgfSxcbiAgICAgICAgfSk/LnByb2plY3RJZFxuICAgICAgKS50b0JlKCc5JylcbiAgICAgIGV4cGVjdChyZXNvbHZlU25hcHNob3RDaGlwc1Byb2plY3QobnVsbCkpLnRvQmVOdWxsKClcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdsYXlvdXQgYW5kIG1vZGFsIHZpc2liaWxpdHkgaGVscGVycycsICgpID0+IHtcbiAgICBpdCgncmVzb2x2ZXMgc2VjdGlvbiBmbGFncyBhbmQgc2lkZWJhciB2aXNpYmlsaXR5JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVDaGF0TW9kYWxTZWN0aW9uRmxhZ3Mob3B0aW9ucy5jaGF0LCBmYWxzZSkpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgICBzaG93TmV3Q2hhdDogZmFsc2UsXG4gICAgICAgIGlzTXlBZ2VudHNTZWN0aW9uOiBmYWxzZSxcbiAgICAgIH0pXG4gICAgICBleHBlY3QocmVzb2x2ZUNoYXRNb2RhbFNlY3Rpb25GbGFncyhvcHRpb25zLmhvbWUsIHRydWUpKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgaXNNYWlha2VyQ3JlYXRvckhvbWU6IHRydWUsXG4gICAgICB9KVxuICAgICAgZXhwZWN0KHNob3VsZFJlbmRlckNoYXRTaWRlYmFyKHRydWUsIGZhbHNlKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFJlbmRlckNoYXRTaWRlYmFyKHRydWUsIHRydWUpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFJlbmRlckNoYXRTaWRlYmFyKHRydWUsIGZhbHNlLCB0cnVlKSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgaXQoJ3Jlc29sdmVzIG1haW4gY29udGVudCB2aWV3IGFuZCBmb290ZXIgdmlzaWJpbGl0eScsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQ2hhdE1vZGFsTWFpbkNvbnRlbnRWaWV3KHRydWUsIHRydWUpKS50b0JlKCdlcnJvcicpXG4gICAgICBleHBlY3QocmVzb2x2ZUNoYXRNb2RhbE1haW5Db250ZW50VmlldyhmYWxzZSwgdHJ1ZSkpLnRvQmUoJ2NoYXQnKVxuICAgICAgZXhwZWN0KHJlc29sdmVDaGF0TW9kYWxNYWluQ29udGVudFZpZXcoZmFsc2UsIGZhbHNlKSkudG9CZSgncHJvamVjdFN1bW1hcnknKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHNob3VsZFNob3dDaGF0TW9kYWxGb290ZXIoe1xuICAgICAgICAgIGNvbXB1dGVkQ3VycmVudE9wdGlvbjogb3B0aW9ucy5jaGF0LFxuICAgICAgICAgIGhvbWVPcHRpb246IG9wdGlvbnMuaG9tZSxcbiAgICAgICAgICBjaGF0T3B0aW9uOiBvcHRpb25zLmNoYXQsXG4gICAgICAgICAgYWdlbnRzQ291bnQ6IDAsXG4gICAgICAgICAgaXNNYWlha2VyQ3JlYXRvckhvbWU6IGZhbHNlLFxuICAgICAgICAgIGhhc0Vycm9yOiBmYWxzZSxcbiAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICBoYXNBY2Nlc3M6IHRydWUsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUodHJ1ZSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBzaG91bGRTaG93Q2hhdE1vZGFsRm9vdGVyKHtcbiAgICAgICAgICBjb21wdXRlZEN1cnJlbnRPcHRpb246IG9wdGlvbnMuaG9tZSxcbiAgICAgICAgICBob21lT3B0aW9uOiBvcHRpb25zLmhvbWUsXG4gICAgICAgICAgY2hhdE9wdGlvbjogb3B0aW9ucy5jaGF0LFxuICAgICAgICAgIGFnZW50c0NvdW50OiAwLFxuICAgICAgICAgIGlzTWFpYWtlckNyZWF0b3JIb21lOiBmYWxzZSxcbiAgICAgICAgICBoYXNFcnJvcjogZmFsc2UsXG4gICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgaGFzQWNjZXNzOiB0cnVlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKGZhbHNlKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHNob3VsZFNob3dDaGF0TW9kYWxGb290ZXIoe1xuICAgICAgICAgIGNvbXB1dGVkQ3VycmVudE9wdGlvbjogb3B0aW9ucy5ob21lLFxuICAgICAgICAgIGhvbWVPcHRpb246IG9wdGlvbnMuaG9tZSxcbiAgICAgICAgICBjaGF0T3B0aW9uOiBvcHRpb25zLmNoYXQsXG4gICAgICAgICAgYWdlbnRzQ291bnQ6IDIsXG4gICAgICAgICAgaXNNYWlha2VyQ3JlYXRvckhvbWU6IGZhbHNlLFxuICAgICAgICAgIGhhc0Vycm9yOiBmYWxzZSxcbiAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICBoYXNBY2Nlc3M6IHRydWUsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUodHJ1ZSlcbiAgICB9KVxuXG4gICAgaXQoJ2NvdmVycyBmbG9hdGluZyBkcmFnIGFuZCBlbGV2YXRlZCBwYW5lbCBicmFuY2hlcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRDbGVhckRyYWdQb3NpdGlvbk9uTGF5b3V0Q2hhbmdlKCdzaWRlYmFyJykpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRDbGVhckRyYWdQb3NpdGlvbk9uTGF5b3V0Q2hhbmdlKCdmbG9hdGluZycpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFBlcnNpc3REcmFnUG9zaXRpb25PbkRyYWdFbmQoJ2Zsb2F0aW5nJykpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRTdGFydEZsb2F0aW5nUGFuZWxEcmFnKHRydWUsIDApKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkU3RhcnRGbG9hdGluZ1BhbmVsRHJhZyh0cnVlLCAxKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChpc0FjdGl2ZUZsb2F0aW5nRHJhZ1BvaW50ZXIoMSwgMSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChpc0FjdGl2ZUZsb2F0aW5nRHJhZ1BvaW50ZXIoMSwgMikpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3Qoc2hvdWxkVXNlRWxldmF0ZWRNYWlhUGFuZWwoJ3Rhc2snKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KGlzR2xvYmFsTWFpYVNlY3Rpb24oJ2hlYWRlcicpKS50b0JlKHRydWUpXG4gICAgfSlcblxuICAgIGl0KCdjb3ZlcnMgZGVsZXRlIGFnZW50IGFuZCBza2lsbHMgY2F0YWxvZyBndWFyZHMnLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoc2hvdWxkUmVzZWxlY3RBZ2VudEFmdGVyRGVsZXRlKCdhMScsICdhMScpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkUmVzZWxlY3RBZ2VudEFmdGVyRGVsZXRlKCdhMScsICdhMicpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZE9wZW5Ta2lsbHNDYXRhbG9nKHRydWUpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkT3BlblNraWxsc0NhdGFsb2coZmFsc2UpKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgnaGlkZXMgdGhlIGZvb3RlciBvbiBtYWlha2VyIGhvbWUsIGVycm9ycywgbG9hZGluZyBvciBtaXNzaW5nIGFjY2VzcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGJhc2UgPSB7XG4gICAgICAgIGNvbXB1dGVkQ3VycmVudE9wdGlvbjogb3B0aW9ucy5jaGF0LFxuICAgICAgICBob21lT3B0aW9uOiBvcHRpb25zLmhvbWUsXG4gICAgICAgIGNoYXRPcHRpb246IG9wdGlvbnMuY2hhdCxcbiAgICAgICAgYWdlbnRzQ291bnQ6IDAsXG4gICAgICAgIGlzTWFpYWtlckNyZWF0b3JIb21lOiBmYWxzZSxcbiAgICAgICAgaGFzRXJyb3I6IGZhbHNlLFxuICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgaGFzQWNjZXNzOiB0cnVlLFxuICAgICAgfVxuXG4gICAgICBleHBlY3Qoc2hvdWxkU2hvd0NoYXRNb2RhbEZvb3Rlcih7IC4uLmJhc2UsIGlzTWFpYWtlckNyZWF0b3JIb21lOiB0cnVlIH0pKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFNob3dDaGF0TW9kYWxGb290ZXIoeyAuLi5iYXNlLCBoYXNFcnJvcjogdHJ1ZSB9KSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRTaG93Q2hhdE1vZGFsRm9vdGVyKHsgLi4uYmFzZSwgbG9hZGluZzogdHJ1ZSB9KSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRTaG93Q2hhdE1vZGFsRm9vdGVyKHsgLi4uYmFzZSwgaGFzQWNjZXNzOiBmYWxzZSB9KSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgaXQoJ2J1aWxkcyBzdGFydC1jaGF0IHBheWxvYWRzIGFuZCBkcmFnIHBvc2l0aW9uIHVwZGF0ZXMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGJ1aWxkVXNlckluaXRpYWxNZXNzYWdlRnJvbVN0YXJ0Q2hhdCh7XG4gICAgICAgICAgbWVzc2FnZTogJ0hvbGEnLFxuICAgICAgICAgIGF0dGFjaG1lbnRzOiBbeyBpZDogJzEnIH1dLFxuICAgICAgICAgIGZhcUlkOiAnZmFxLTEnLFxuICAgICAgICAgIGFnZW50U3VnZ2VzdGlvbklkOiAnc3VnLTEnLFxuICAgICAgICAgIG1lbnRpb25zOiBbeyBpZDogJ20xJyB9XSxcbiAgICAgICAgICBmdWFJZDogJ2Z1YS0xJyxcbiAgICAgICAgICBzY0lkOiAnc2MtMScsXG4gICAgICAgICAgY29udGV4dERhdGE6IHsgcHJvamVjdElkOiAxIH0sXG4gICAgICAgIH0pXG4gICAgICApLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgICBtZXNzYWdlOiAnSG9sYScsXG4gICAgICAgIGZhcUlkOiAnZmFxLTEnLFxuICAgICAgICBhZ2VudFN1Z2dlc3Rpb25JZDogJ3N1Zy0xJyxcbiAgICAgICAgbWVudGlvbnM6IFt7IGlkOiAnbTEnIH1dLFxuICAgICAgICBmdWFJZDogJ2Z1YS0xJyxcbiAgICAgICAgc2NJZDogJ3NjLTEnLFxuICAgICAgICBjb250ZXh0RGF0YTogeyBwcm9qZWN0SWQ6IDEgfSxcbiAgICAgIH0pXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUxheW91dERyYWdQb3NpdGlvblVwZGF0ZSgnc2lkZWJhcicsIHsgeDogMSwgeTogMiB9LCAoeCwgeSkgPT4gKHsgeCwgeSB9KSwge1xuICAgICAgICAgIGlubmVyV2lkdGg6IDEwMDAsXG4gICAgICAgICAgcGFuZWxXaWR0aDogNDAwLFxuICAgICAgICAgIHBhZDogMTYsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmVOdWxsKClcblxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlTGF5b3V0RHJhZ1Bvc2l0aW9uVXBkYXRlKCdmbG9hdGluZycsIG51bGwsICh4LCB5KSA9PiAoeyB4LCB5IH0pLCB7XG4gICAgICAgICAgaW5uZXJXaWR0aDogMTAwMCxcbiAgICAgICAgICBwYW5lbFdpZHRoOiA0MDAsXG4gICAgICAgICAgcGFkOiAxNixcbiAgICAgICAgfSlcbiAgICAgICkudG9FcXVhbCh7IHg6IDU4NCwgeTogMTYgfSlcblxuICAgICAgZXhwZWN0KHJlc29sdmVQZXJzaXN0ZWREcmFnUG9zaXRpb25PbkVuZCgnZmxvYXRpbmcnLCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChyZXNvbHZlUGVyc2lzdGVkRHJhZ1Bvc2l0aW9uT25FbmQoJ3NpZGViYXInLCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkpLnRvQmUoZmFsc2UpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnZGlzcGF0Y2hTa2lsbE1lbnRpb25JbnNlcnQnLCAoKSA9PiB7XG4gICAgaXQoJ2Rpc3BhdGNoZXMgdGhlIHNraWxsIG1lbnRpb24gYWZ0ZXIgdHdvIGFuaW1hdGlvbiBmcmFtZXMnLCAoKSA9PiB7XG4gICAgICBqZXN0LnVzZUZha2VUaW1lcnMoKVxuICAgICAgY29uc3QgcmFmID0gamVzdFxuICAgICAgICAuc3B5T24od2luZG93LCAncmVxdWVzdEFuaW1hdGlvbkZyYW1lJylcbiAgICAgICAgLm1vY2tJbXBsZW1lbnRhdGlvbihjYWxsYmFjayA9PiB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiBjYWxsYmFjaygwKSwgMCkgYXMgdW5rbm93biBhcyBudW1iZXIpXG5cbiAgICAgIGNvbnN0IG9uSW5zZXJ0ID0gamVzdC5mbigpXG4gICAgICBjb25zdCBvblJlZm9jdXMgPSBqZXN0LmZuKClcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21haWEtaW5zZXJ0LXNraWxsLW1lbnRpb24nLCBvbkluc2VydClcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21haWEtaW5wdXQtcmVmb2N1cycsIG9uUmVmb2N1cylcblxuICAgICAgZGlzcGF0Y2hTa2lsbE1lbnRpb25JbnNlcnQoeyBpZDogJ3NrMScsIG5hbWU6ICdSZXN1bWlyJyB9KVxuXG4gICAgICBleHBlY3Qob25JbnNlcnQpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKClcblxuICAgICAgamVzdC5ydW5BbGxUaW1lcnMoKVxuXG4gICAgICBleHBlY3Qob25JbnNlcnQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKVxuICAgICAgZXhwZWN0KG9uUmVmb2N1cykudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpXG4gICAgICBjb25zdCBldmVudCA9IG9uSW5zZXJ0Lm1vY2suY2FsbHNbMF1bMF0gYXMgQ3VzdG9tRXZlbnRcbiAgICAgIGV4cGVjdChldmVudC5kZXRhaWwuc2tpbGwpLnRvRXF1YWwoeyBpZDogJ3NrMScsIG5hbWU6ICdSZXN1bWlyJyB9KVxuXG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtYWlhLWluc2VydC1za2lsbC1tZW50aW9uJywgb25JbnNlcnQpXG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtYWlhLWlucHV0LXJlZm9jdXMnLCBvblJlZm9jdXMpXG4gICAgICByYWYubW9ja1Jlc3RvcmUoKVxuICAgICAgamVzdC51c2VSZWFsVGltZXJzKClcbiAgICB9KVxuICB9KVxufSlcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxTQUFTQSxXQUFXLFFBQVEsMkJBQTJCO0FBRXZELFNBQVNDLE9BQU8sUUFBUSxhQUFhO0FBQ3JDLFNBQ0VDLDBCQUEwQixFQUMxQkMsMEJBQTBCLEVBQzFCQywwQkFBMEIsRUFDMUJDLDRCQUE0QixFQUM1QkMseUJBQXlCLEVBQ3pCQywwQkFBMEIsRUFDMUJDLHFCQUFxQixFQUNyQkMsNEJBQTRCLEVBQzVCQyw0QkFBNEIsRUFDNUJDLG1DQUFtQyxFQUNuQ0MsMkJBQTJCLEVBQzNCQywyQkFBMkIsRUFDM0JDLDZCQUE2QixFQUM3QkMsMEJBQTBCLEVBQzFCQyw0QkFBNEIsRUFDNUJDLHVCQUF1QixFQUN2QkMsOEJBQThCLEVBQzlCQywrQkFBK0IsRUFDL0JDLDBCQUEwQixFQUMxQkMsZ0NBQWdDLEVBQ2hDQywwQkFBMEIsRUFDMUJDLHdCQUF3QixFQUN4QkMsNkJBQTZCLEVBQzdCQyx1QkFBdUIsRUFDdkJDLHdDQUF3QyxFQUN4Q0MsNEJBQTRCLEVBQzVCQyx1Q0FBdUMsRUFDdkNDLGtDQUFrQyxFQUNsQ0MsNkJBQTZCLEVBQzdCQyx1QkFBdUIsRUFDdkJDLCtCQUErQixFQUMvQkMsZ0NBQWdDLEVBQ2hDQyxpQ0FBaUMsRUFDakNDLCtCQUErQixFQUMvQkMsOEJBQThCLEVBQzlCQyxnQ0FBZ0MsRUFDaENDLHFCQUFxQixFQUNyQkMsdUJBQXVCLEVBQ3ZCQyw4QkFBOEIsRUFDOUJDLHNCQUFzQixFQUN0QkMsOEJBQThCLEVBQzlCQyw2QkFBNkIsRUFDN0JDLGlCQUFpQixFQUNqQkMsZ0NBQWdDLEVBQ2hDQyw4QkFBOEIsRUFDOUJDLCtCQUErQixFQUMvQkMsb0JBQW9CLEVBQ3BCQywrQkFBK0IsRUFDL0JDLG9DQUFvQyxFQUNwQ0MsNEJBQTRCLEVBQzVCQyx3Q0FBd0MsRUFDeENDLGtDQUFrQyxFQUNsQ0MsaUNBQWlDLEVBQ2pDQyw2QkFBNkIsRUFDN0JDLG9DQUFvQyxFQUNwQ0Msc0NBQXNDLEVBQ3RDQyxtQ0FBbUMsRUFDbkNDLG9DQUFvQyxFQUNwQ0MsMkJBQTJCLEVBQzNCQyw0QkFBNEIsRUFDNUJDLHVCQUF1QixFQUN2QkMsK0JBQStCLEVBQy9CQyx5QkFBeUIsRUFDekJDLDBCQUEwQixFQUMxQkMsOEJBQThCLEVBQzlCQyxxQ0FBcUMsRUFDckNDLGtDQUFrQyxFQUNsQ0MsNEJBQTRCLEVBQzVCQywyQkFBMkIsRUFDM0JDLHVCQUF1QixFQUN2QkMsMEJBQTBCLEVBQzFCQywrQkFBK0IsRUFDL0JDLGlDQUFpQyxFQUNqQ0Msb0NBQW9DLEVBQ3BDQyxrQ0FBa0MsRUFDbENDLCtCQUErQixFQUMvQkMsNENBQTRDLEVBQzVDQyxxQ0FBcUMsRUFDckNDLG1CQUFtQixRQUNkLHVCQUF1QjtBQUU5QixJQUFNQyxRQUFRLEdBQUc7RUFDZkMsRUFBRSxFQUFFLENBQUM7RUFDTEMsVUFBVSxFQUFFLEVBQUU7RUFDZEMsT0FBTyxFQUFFcEYsV0FBVyxDQUFDcUY7QUFDdkIsQ0FBQztBQUVELElBQU1DLGlCQUF3QixHQUFHO0VBQy9CSixFQUFFLEVBQUUsR0FBRztFQUNQSyxJQUFJLEVBQUUsTUFBTTtFQUNaQyxJQUFJLEVBQUUsY0FBYztFQUNwQkMsTUFBTSxFQUFFO0FBQ1YsQ0FBQztBQUVELElBQU1DLEtBQUssR0FBRyxTQUFSQSxLQUFLQSxDQUFJUixFQUFVO0VBQUEsT0FDdEI7SUFDQ0EsRUFBRSxFQUFGQSxFQUFFO0lBQ0ZLLElBQUksV0FBQUksTUFBQSxDQUFXVCxFQUFFLENBQUU7SUFDbkJNLElBQUksRUFBRTtFQUNSLENBQUM7QUFBQSxDQUFVO0FBRWJJLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxZQUFNO0VBQ3BDLElBQU1DLGtCQUFrQixHQUFHQyxNQUFNLENBQUNDLDJCQUEyQjtFQUM3RCxJQUFNQyxtQkFBbUIsR0FBR0YsTUFBTSxDQUFDRyx3Q0FBd0M7RUFDM0UsSUFBTUMsb0JBQW9CLEdBQUdKLE1BQU0sQ0FBQ0ssa0JBQWtCO0VBQ3RELElBQU1DLHNCQUFzQixHQUFHTixNQUFNLENBQUNPLG1DQUFtQztFQUV6RUMsU0FBUyxDQUFDLFlBQU07SUFDZFIsTUFBTSxDQUFDQywyQkFBMkIsR0FBR0Ysa0JBQWtCO0lBQ3ZEQyxNQUFNLENBQUNHLHdDQUF3QyxHQUFHRCxtQkFBbUI7SUFDckVGLE1BQU0sQ0FBQ0ssa0JBQWtCLEdBQUdELG9CQUFvQjtJQUNoREosTUFBTSxDQUFDTyxtQ0FBbUMsR0FBR0Qsc0JBQXNCO0VBQ3JFLENBQUMsQ0FBQztFQUVGUixRQUFRLENBQUMsOEJBQThCLEVBQUUsWUFBTTtJQUM3Q1csRUFBRSxDQUFDLHFEQUFxRCxFQUFFLFlBQU07TUFDOURDLE1BQU0sQ0FBQy9GLDRCQUE0QixDQUFDLFFBQVEsRUFBRSxjQUFjLEVBQUVSLE9BQU8sQ0FBQ3dHLElBQUksRUFBRXhHLE9BQU8sQ0FBQ3dHLElBQUksQ0FBQyxDQUFDLENBQUNDLElBQUksQ0FDN0YscUJBQ0YsQ0FBQztJQUNILENBQUMsQ0FBQztJQUVGSCxFQUFFLENBQUMsNkJBQTZCLEVBQUUsWUFBTTtNQUN0Q0MsTUFBTSxDQUFDL0YsNEJBQTRCLENBQUMsTUFBTSxFQUFFLGNBQWMsRUFBRVIsT0FBTyxDQUFDMEcsSUFBSSxFQUFFMUcsT0FBTyxDQUFDd0csSUFBSSxDQUFDLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLFdBQVcsQ0FBQztNQUMxR0YsTUFBTSxDQUFDL0YsNEJBQTRCLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRVIsT0FBTyxDQUFDMEcsSUFBSSxFQUFFMUcsT0FBTyxDQUFDd0csSUFBSSxDQUFDLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLGNBQWMsQ0FBQztNQUN6R0YsTUFBTSxDQUFDL0YsNEJBQTRCLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRVIsT0FBTyxDQUFDMEcsSUFBSSxFQUFFMUcsT0FBTyxDQUFDd0csSUFBSSxDQUFDLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLGNBQWMsQ0FBQztNQUN6R0YsTUFBTSxDQUFDL0YsNEJBQTRCLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRVIsT0FBTyxDQUFDMEcsSUFBSSxFQUFFMUcsT0FBTyxDQUFDd0csSUFBSSxDQUFDLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUN6RyxDQUFDLENBQUM7SUFFRkgsRUFBRSxDQUFDLHdEQUF3RCxFQUFFLFlBQU07TUFDakVDLE1BQU0sQ0FBQy9GLDRCQUE0QixDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUVSLE9BQU8sQ0FBQzBHLElBQUksRUFBRTFHLE9BQU8sQ0FBQzBHLElBQUksQ0FBQyxDQUFDLENBQUNELElBQUksQ0FBQyxxQkFBcUIsQ0FBQztJQUNsSCxDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7RUFFRmQsUUFBUSxDQUFDLHlCQUF5QixFQUFFLFlBQU07SUFDeENXLEVBQUUsQ0FBQyxrREFBa0QsRUFBRSxZQUFNO01BQzNEVCxNQUFNLENBQUNDLDJCQUEyQixHQUFHLElBQUk7TUFDekNTLE1BQU0sQ0FBQ3ZGLHVCQUF1QixDQUFDLElBQUksRUFBRWdFLFFBQVEsQ0FBQyxDQUFDLENBQUN5QixJQUFJLENBQUMsS0FBSyxDQUFDO01BQzNERixNQUFNLENBQUN2Rix1QkFBdUIsQ0FBQyxRQUFRLEVBQUEyRixhQUFBLENBQUFBLGFBQUEsS0FBTzNCLFFBQVE7UUFBRUcsT0FBTyxFQUFFcEYsV0FBVyxDQUFDNkc7TUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDSCxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3JHLENBQUMsQ0FBQztJQUVGSCxFQUFFLENBQUMsOERBQThELEVBQUUsWUFBTTtNQUN2RVQsTUFBTSxDQUFDQywyQkFBMkIsR0FBRyxLQUFLO01BQzFDRCxNQUFNLENBQUNHLHdDQUF3QyxHQUFHLEtBQUs7TUFDdkRILE1BQU0sQ0FBQ08sbUNBQW1DLEdBQUcsSUFBSTtNQUNqREcsTUFBTSxDQUFDdkYsdUJBQXVCLENBQUMsTUFBTSxFQUFFZ0UsUUFBUSxDQUFDLENBQUMsQ0FBQ3lCLElBQUksQ0FBQyxJQUFJLENBQUM7TUFDNURGLE1BQU0sQ0FBQ3ZGLHVCQUF1QixDQUFDLFNBQVMsRUFBRWdFLFFBQVEsQ0FBQyxDQUFDLENBQUN5QixJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ2pFLENBQUMsQ0FBQztJQUVGSCxFQUFFLENBQUMscURBQXFELEVBQUUsWUFBTTtNQUM5RFQsTUFBTSxDQUFDQywyQkFBMkIsR0FBRyxLQUFLO01BQzFDRCxNQUFNLENBQUNHLHdDQUF3QyxHQUFHLEtBQUs7TUFDdkRPLE1BQU0sQ0FBQ3ZGLHVCQUF1QixDQUFDLFFBQVEsRUFBRWdFLFFBQVEsQ0FBQyxDQUFDLENBQUN5QixJQUFJLENBQUMsS0FBSyxDQUFDO01BQy9ERixNQUFNLENBQUN2Rix1QkFBdUIsQ0FBQyxTQUFTLEVBQUVnRSxRQUFRLENBQUMsQ0FBQyxDQUFDeUIsSUFBSSxDQUFDLEtBQUssQ0FBQztNQUVoRVosTUFBTSxDQUFDRyx3Q0FBd0MsR0FBRyxJQUFJO01BQ3RETyxNQUFNLENBQUN2Rix1QkFBdUIsQ0FBQyxRQUFRLEVBQUVnRSxRQUFRLENBQUMsQ0FBQyxDQUFDeUIsSUFBSSxDQUFDLElBQUksQ0FBQztNQUU5RFosTUFBTSxDQUFDQywyQkFBMkIsR0FBRyxJQUFJO01BQ3pDRCxNQUFNLENBQUNHLHdDQUF3QyxHQUFHLEtBQUs7TUFDdkRPLE1BQU0sQ0FBQ3ZGLHVCQUF1QixDQUFDLFNBQVMsRUFBRWdFLFFBQVEsQ0FBQyxDQUFDLENBQUN5QixJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ2pFLENBQUMsQ0FBQztFQUNKLENBQUMsQ0FBQztFQUVGZCxRQUFRLENBQUMsOEJBQThCLEVBQUUsWUFBTTtJQUM3Q1csRUFBRSxDQUFDLCtEQUErRCxFQUFFLFlBQU07TUFDeEVDLE1BQU0sQ0FDSjlGLDRCQUE0QixDQUFDO1FBQzNCb0csYUFBYSxFQUFFN0csT0FBTyxDQUFDOEcsUUFBUTtRQUMvQnJCLEtBQUssRUFBRUosaUJBQWlCO1FBQ3hCMEIsT0FBTyxFQUFFLElBQUk7UUFDYkMsTUFBTSxFQUFFLElBQUk7UUFDWkMsSUFBSSxFQUFFakMsUUFBUTtRQUNka0MsaUJBQWlCLEVBQUU7TUFDckIsQ0FBQyxDQUNILENBQUMsQ0FBQ1QsSUFBSSxDQUFDekcsT0FBTyxDQUFDOEcsUUFBUSxDQUFDO0lBQzFCLENBQUMsQ0FBQztJQUVGUixFQUFFLENBQUMsd0RBQXdELEVBQUUsWUFBTTtNQUNqRVQsTUFBTSxDQUFDSyxrQkFBa0IsR0FBRyxJQUFJO01BQ2hDSyxNQUFNLENBQ0o5Riw0QkFBNEIsQ0FBQztRQUMzQm9HLGFBQWEsRUFBRTdHLE9BQU8sQ0FBQzhHLFFBQVE7UUFDL0JyQixLQUFLLEVBQUVKLGlCQUFpQjtRQUN4QjBCLE9BQU8sRUFBRSxJQUFJO1FBQ2JDLE1BQU0sRUFBRSxJQUFJO1FBQ1pDLElBQUksRUFBRWpDLFFBQVE7UUFDZGtDLGlCQUFpQixFQUFFO01BQ3JCLENBQUMsQ0FDSCxDQUFDLENBQUNULElBQUksQ0FBQ3pHLE9BQU8sQ0FBQzhHLFFBQVEsQ0FBQztNQUV4QlAsTUFBTSxDQUNKOUYsNEJBQTRCLENBQUM7UUFDM0JvRyxhQUFhLEVBQUU3RyxPQUFPLENBQUNtSCxRQUFRO1FBQy9CMUIsS0FBSyxFQUFFSixpQkFBaUI7UUFDeEIwQixPQUFPLEVBQUUsSUFBSTtRQUNiQyxNQUFNLEVBQUUsSUFBSTtRQUNaQyxJQUFJLEVBQUVqQyxRQUFRO1FBQ2RrQyxpQkFBaUIsRUFBRTtNQUNyQixDQUFDLENBQ0gsQ0FBQyxDQUFDVCxJQUFJLENBQUN6RyxPQUFPLENBQUNtSCxRQUFRLENBQUM7SUFDMUIsQ0FBQyxDQUFDO0lBRUZiLEVBQUUsQ0FBQyxpRUFBaUUsRUFBRSxZQUFNO01BQzFFLElBQU1jLFdBQWtCLEdBQUc7UUFDekJuQyxFQUFFLEVBQUUsR0FBRztRQUNQSyxJQUFJLEVBQUUsV0FBVztRQUNqQkMsSUFBSSxFQUFFLE9BQU87UUFDYkMsTUFBTSxFQUFFO01BQ1YsQ0FBQztNQUVEZSxNQUFNLENBQ0o5Riw0QkFBNEIsQ0FBQztRQUMzQm9HLGFBQWEsRUFBRTdHLE9BQU8sQ0FBQ3dHLElBQUk7UUFDM0JmLEtBQUssRUFBRTJCLFdBQVc7UUFDbEJMLE9BQU8sRUFBRSxJQUFJO1FBQ2JDLE1BQU0sRUFBRSxJQUFJO1FBQ1pDLElBQUksRUFBRWpDLFFBQVE7UUFDZGtDLGlCQUFpQixFQUFFO01BQ3JCLENBQUMsQ0FDSCxDQUFDLENBQUNULElBQUksQ0FBQ3pHLE9BQU8sQ0FBQzBHLElBQUksQ0FBQztJQUN0QixDQUFDLENBQUM7SUFFRkosRUFBRSxDQUFDLGlFQUFpRSxFQUFFLFlBQU07TUFDMUUsSUFBTWUsWUFBbUIsR0FBRztRQUFFcEMsRUFBRSxFQUFFLEdBQUc7UUFBRUssSUFBSSxFQUFFLE1BQU07UUFBRUMsSUFBSSxFQUFFLE9BQU87UUFBRUMsTUFBTSxFQUFFO01BQVUsQ0FBQztNQUN2RixJQUFNOEIsV0FBa0IsR0FBRztRQUFFckMsRUFBRSxFQUFFLEdBQUc7UUFBRUssSUFBSSxFQUFFLFFBQVE7UUFBRUMsSUFBSSxFQUFFLE9BQU87UUFBRUMsTUFBTSxFQUFFO01BQVMsQ0FBQztNQUV2RmUsTUFBTSxDQUNKOUYsNEJBQTRCLENBQUM7UUFDM0JvRyxhQUFhLEVBQUU3RyxPQUFPLENBQUN3RyxJQUFJO1FBQzNCZixLQUFLLEVBQUU0QixZQUFZO1FBQ25CTixPQUFPLEVBQUU7VUFBRTlCLEVBQUUsRUFBRSxFQUFFO1VBQUVLLElBQUksRUFBRTtRQUFRLENBQVU7UUFDM0MwQixNQUFNLEVBQUUsSUFBSTtRQUNaQyxJQUFJLEVBQUVqQyxRQUFRO1FBQ2RrQyxpQkFBaUIsRUFBRTtNQUNyQixDQUFDLENBQ0gsQ0FBQyxDQUFDVCxJQUFJLENBQUN6RyxPQUFPLENBQUN3RyxJQUFJLENBQUM7TUFFcEJELE1BQU0sQ0FDSjlGLDRCQUE0QixDQUFDO1FBQzNCb0csYUFBYSxFQUFFN0csT0FBTyxDQUFDd0csSUFBSTtRQUMzQmYsS0FBSyxFQUFFNkIsV0FBVztRQUNsQlAsT0FBTyxFQUFFLElBQUk7UUFDYkMsTUFBTSxFQUFFO1VBQUUvQixFQUFFLEVBQUUsQ0FBQztVQUFFSyxJQUFJLEVBQUU7UUFBTyxDQUFVO1FBQ3hDMkIsSUFBSSxFQUFFakMsUUFBUTtRQUNka0MsaUJBQWlCLEVBQUU7TUFDckIsQ0FBQyxDQUNILENBQUMsQ0FBQ1QsSUFBSSxDQUFDekcsT0FBTyxDQUFDd0csSUFBSSxDQUFDO0lBQ3RCLENBQUMsQ0FBQztJQUVGRixFQUFFLENBQUMsd0RBQXdELEVBQUUsWUFBTTtNQUNqRSxJQUFNaUIsa0JBQXlCLEdBQUc7UUFDaEN0QyxFQUFFLEVBQUUsR0FBRztRQUNQSyxJQUFJLEVBQUUsTUFBTTtRQUNaQyxJQUFJLEVBQUUsY0FBYztRQUNwQkMsTUFBTSxFQUFFO01BQ1YsQ0FBQztNQUVEZSxNQUFNLENBQ0o5Riw0QkFBNEIsQ0FBQztRQUMzQm9HLGFBQWEsRUFBRTdHLE9BQU8sQ0FBQ3dHLElBQUk7UUFDM0JmLEtBQUssRUFBRThCLGtCQUFrQjtRQUN6QlIsT0FBTyxFQUFFLElBQUk7UUFDYkMsTUFBTSxFQUFFLElBQUk7UUFDWkMsSUFBSSxFQUFFakMsUUFBUTtRQUNka0MsaUJBQWlCLEVBQUU7TUFDckIsQ0FBQyxDQUNILENBQUMsQ0FBQ1QsSUFBSSxDQUFDekcsT0FBTyxDQUFDd0csSUFBSSxDQUFDO0lBQ3RCLENBQUMsQ0FBQztJQUVGRixFQUFFLENBQUMsNERBQTRELEVBQUUsWUFBTTtNQUNyRSxJQUFNZSxZQUFtQixHQUFHO1FBQUVwQyxFQUFFLEVBQUUsR0FBRztRQUFFSyxJQUFJLEVBQUUsTUFBTTtRQUFFQyxJQUFJLEVBQUUsT0FBTztRQUFFQyxNQUFNLEVBQUU7TUFBVSxDQUFDO01BQ3ZGLElBQU04QixXQUFrQixHQUFHO1FBQUVyQyxFQUFFLEVBQUUsR0FBRztRQUFFSyxJQUFJLEVBQUUsUUFBUTtRQUFFQyxJQUFJLEVBQUUsT0FBTztRQUFFQyxNQUFNLEVBQUU7TUFBUyxDQUFDO01BRXZGZSxNQUFNLENBQ0o5Riw0QkFBNEIsQ0FBQztRQUMzQm9HLGFBQWEsRUFBRTdHLE9BQU8sQ0FBQ3dHLElBQUk7UUFDM0JmLEtBQUssRUFBRTRCLFlBQVk7UUFDbkJOLE9BQU8sRUFBRSxJQUFJO1FBQ2JDLE1BQU0sRUFBRSxJQUFJO1FBQ1pDLElBQUksRUFBRWpDLFFBQVE7UUFDZGtDLGlCQUFpQixFQUFFO01BQ3JCLENBQUMsQ0FDSCxDQUFDLENBQUNULElBQUksQ0FBQ3pHLE9BQU8sQ0FBQ3dILGVBQWUsQ0FBQztNQUUvQmpCLE1BQU0sQ0FDSjlGLDRCQUE0QixDQUFDO1FBQzNCb0csYUFBYSxFQUFFN0csT0FBTyxDQUFDd0csSUFBSTtRQUMzQmYsS0FBSyxFQUFFNkIsV0FBVztRQUNsQlAsT0FBTyxFQUFFLElBQUk7UUFDYkMsTUFBTSxFQUFFLElBQUk7UUFDWkMsSUFBSSxFQUFFakMsUUFBUTtRQUNka0MsaUJBQWlCLEVBQUU7TUFDckIsQ0FBQyxDQUNILENBQUMsQ0FBQ1QsSUFBSSxDQUFDekcsT0FBTyxDQUFDeUgsY0FBYyxDQUFDO0lBQ2hDLENBQUMsQ0FBQztFQUNKLENBQUMsQ0FBQztFQUVGOUIsUUFBUSxDQUFDLCtCQUErQixFQUFFLFlBQU07SUFDOUNXLEVBQUUsQ0FBQyw2Q0FBNkMsRUFBRSxZQUFNO01BQ3REQyxNQUFNLENBQUMxRiw2QkFBNkIsQ0FBQ2IsT0FBTyxDQUFDbUgsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUNWLElBQUksQ0FBQyxVQUFVLENBQUM7TUFDL0VGLE1BQU0sQ0FBQzFGLDZCQUE2QixDQUFDYixPQUFPLENBQUM4RyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQ0wsSUFBSSxDQUFDLFVBQVUsQ0FBQztNQUMvRUYsTUFBTSxDQUFDMUYsNkJBQTZCLENBQUNiLE9BQU8sQ0FBQ3dHLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDQyxJQUFJLENBQUMsU0FBUyxDQUFDO01BQ3pFRixNQUFNLENBQUMxRiw2QkFBNkIsQ0FBQ2IsT0FBTyxDQUFDMEcsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUNnQixRQUFRLENBQUMsQ0FBQztJQUN2RSxDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7RUFFRi9CLFFBQVEsQ0FBQyw2QkFBNkIsRUFBRSxZQUFNO0lBQzVDVyxFQUFFLENBQUMsK0NBQStDLEVBQUUsWUFBTTtNQUN4RFQsTUFBTSxDQUFDSyxrQkFBa0IsR0FBRyxJQUFJO01BQ2hDSyxNQUFNLENBQUM1RiwyQkFBMkIsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFcUUsUUFBUSxDQUFDLENBQUMsQ0FBQ3lCLElBQUksQ0FBQ3pHLE9BQU8sQ0FBQzhHLFFBQVEsQ0FBQztNQUN0RlAsTUFBTSxDQUFDNUYsMkJBQTJCLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRXFFLFFBQVEsQ0FBQyxDQUFDLENBQUN5QixJQUFJLENBQUN6RyxPQUFPLENBQUNtSCxRQUFRLENBQUM7TUFDdEZaLE1BQU0sQ0FBQzVGLDJCQUEyQixDQUFDLElBQUksRUFBRSxNQUFNLEVBQUVxRSxRQUFRLENBQUMsQ0FBQyxDQUFDeUIsSUFBSSxDQUFDekcsT0FBTyxDQUFDMEcsSUFBSSxDQUFDO01BQzlFSCxNQUFNLENBQUM1RiwyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFcUUsUUFBUSxDQUFDLENBQUMsQ0FBQ3lCLElBQUksQ0FBQ3pHLE9BQU8sQ0FBQ3dHLElBQUksQ0FBQztJQUNuRixDQUFDLENBQUM7SUFFRkYsRUFBRSxDQUFDLDBEQUEwRCxFQUFFLFlBQU07TUFDbkVULE1BQU0sQ0FBQ0ssa0JBQWtCLEdBQUcsS0FBSztNQUNqQ0ssTUFBTSxDQUFDNUYsMkJBQTJCLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRXFFLFFBQVEsQ0FBQyxDQUFDLENBQUN5QixJQUFJLENBQUN6RyxPQUFPLENBQUN3RyxJQUFJLENBQUM7SUFDcEYsQ0FBQyxDQUFDO0VBQ0osQ0FBQyxDQUFDO0VBRUZiLFFBQVEsQ0FBQyw0QkFBNEIsRUFBRSxZQUFNO0lBQzNDVyxFQUFFLENBQUMsa0RBQWtELEVBQUUsWUFBTTtNQUMzREMsTUFBTSxDQUFDdEcsMEJBQTBCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDMEgsT0FBTyxDQUFDO1FBQUVDLENBQUMsRUFBRSxFQUFFO1FBQUVDLENBQUMsRUFBRTtNQUFHLENBQUMsQ0FBQztNQUN2RnRCLE1BQU0sQ0FBQ3RHLDBCQUEwQixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQzBILE9BQU8sQ0FBQztRQUFFQyxDQUFDLEVBQUUsR0FBRztRQUFFQyxDQUFDLEVBQUU7TUFBSSxDQUFDLENBQUM7SUFDakcsQ0FBQyxDQUFDO0VBQ0osQ0FBQyxDQUFDO0VBRUZsQyxRQUFRLENBQUMsNkJBQTZCLEVBQUUsWUFBTTtJQUM1Q1csRUFBRSxDQUFDLGdEQUFnRCxFQUFFLFlBQU07TUFDekRDLE1BQU0sQ0FDSjNGLDJCQUEyQixDQUFDWixPQUFPLENBQUMwRyxJQUFJLEVBQUUxRyxPQUFPLENBQUMwRyxJQUFJLEVBQUU7UUFDdERvQixTQUFTLEVBQUUsT0FBTztRQUNsQkMsV0FBVyxFQUFFLFNBQVM7UUFDdEJDLFdBQVcsRUFBRTtNQUNmLENBQUMsQ0FDSCxDQUFDLENBQUNMLE9BQU8sQ0FBQztRQUFFTSxVQUFVLEVBQUUsU0FBUztRQUFFQyxXQUFXLEVBQUU7TUFBUSxDQUFDLENBQUM7TUFFMUQzQixNQUFNLENBQ0ozRiwyQkFBMkIsQ0FBQ1osT0FBTyxDQUFDd0csSUFBSSxFQUFFeEcsT0FBTyxDQUFDMEcsSUFBSSxFQUFFO1FBQ3REb0IsU0FBUyxFQUFFLE9BQU87UUFDbEJDLFdBQVcsRUFBRSxTQUFTO1FBQ3RCQyxXQUFXLEVBQUU7TUFDZixDQUFDLENBQ0gsQ0FBQyxDQUFDTixRQUFRLENBQUMsQ0FBQztJQUNkLENBQUMsQ0FBQztJQUVGcEIsRUFBRSxDQUFDLHlEQUF5RCxFQUFFLFlBQU07TUFDbEVDLE1BQU0sQ0FDSjNGLDJCQUEyQixDQUFDWixPQUFPLENBQUMwRyxJQUFJLEVBQUUxRyxPQUFPLENBQUMwRyxJQUFJLEVBQUU7UUFDdERvQixTQUFTLEVBQUUsT0FBTztRQUNsQkMsV0FBVyxFQUFFO01BQ2YsQ0FBQyxDQUNILENBQUMsQ0FBQ0osT0FBTyxDQUFDO1FBQUVNLFVBQVUsRUFBRSxNQUFNO1FBQUVDLFdBQVcsRUFBRTtNQUFHLENBQUMsQ0FBQztNQUVsRDNCLE1BQU0sQ0FDSjNGLDJCQUEyQixDQUFDWixPQUFPLENBQUMwRyxJQUFJLEVBQUUxRyxPQUFPLENBQUMwRyxJQUFJLEVBQUU7UUFDdERvQixTQUFTLEVBQUUsT0FBTztRQUNsQkMsV0FBVyxFQUFFLE1BQU07UUFDbkJJLFFBQVEsRUFBRTtNQUNaLENBQUMsQ0FDSCxDQUFDLENBQUNSLE9BQU8sQ0FBQztRQUFFTSxVQUFVLEVBQUUsTUFBTTtRQUFFQyxXQUFXLEVBQUU7TUFBUyxDQUFDLENBQUM7TUFFeEQzQixNQUFNLENBQ0ozRiwyQkFBMkIsQ0FBQ1osT0FBTyxDQUFDMEcsSUFBSSxFQUFFMUcsT0FBTyxDQUFDMEcsSUFBSSxFQUFFO1FBQ3REb0IsU0FBUyxFQUFFLE9BQU87UUFDbEJDLFdBQVcsRUFBRSxRQUFRO1FBQ3JCSyxVQUFVLEVBQUU7TUFDZCxDQUFDLENBQ0gsQ0FBQyxDQUFDVCxPQUFPLENBQUM7UUFBRU0sVUFBVSxFQUFFLFFBQVE7UUFBRUMsV0FBVyxFQUFFO01BQU8sQ0FBQyxDQUFDO01BRXhEM0IsTUFBTSxDQUNKM0YsMkJBQTJCLENBQUNaLE9BQU8sQ0FBQzBHLElBQUksRUFBRTFHLE9BQU8sQ0FBQzBHLElBQUksRUFBRTtRQUN0RG9CLFNBQVMsRUFBRSxPQUFPO1FBQ2xCQyxXQUFXLEVBQUUsUUFBUTtRQUNyQkMsV0FBVyxFQUFFO01BQ2YsQ0FBQyxDQUNILENBQUMsQ0FBQ04sUUFBUSxDQUFDLENBQUM7SUFDZCxDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7RUFFRi9CLFFBQVEsQ0FBQywyQkFBMkIsRUFBRSxZQUFNO0lBQzFDVyxFQUFFLENBQUMsaURBQWlELEVBQUUsWUFBTTtNQUMxREMsTUFBTSxDQUNKbEcseUJBQXlCLENBQUM7UUFDeEJnSSxDQUFDLEVBQUU7VUFBRUMsTUFBTSxFQUFFO1FBQVcsQ0FBQztRQUN6QkMsQ0FBQyxFQUFFO1VBQUVELE1BQU0sRUFBRTtRQUFXO01BQzFCLENBQUMsQ0FDSCxDQUFDLENBQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDO01BQ1pGLE1BQU0sQ0FBQ2xHLHlCQUF5QixDQUFDO1FBQUVnSSxDQUFDLEVBQUU7VUFBRUMsTUFBTSxFQUFFO1FBQVc7TUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDN0IsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUM5RSxDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7RUFFRmQsUUFBUSxDQUFDLG9DQUFvQyxFQUFFLFlBQU07SUFDbkRXLEVBQUUsQ0FBQyx1REFBdUQsRUFBRSxZQUFNO01BQ2hFQyxNQUFNLENBQUN6RiwwQkFBMEIsQ0FBQztRQUFFMEgsVUFBVSxFQUFFO01BQUssQ0FBQyxDQUFDLENBQUMsQ0FBQy9CLElBQUksQ0FBQyxJQUFJLENBQUM7TUFDbkVGLE1BQU0sQ0FBQ3pGLDBCQUEwQixDQUFDO1FBQUUwSCxVQUFVLEVBQUU7TUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDL0IsSUFBSSxDQUFDLEtBQUssQ0FBQztNQUNyRUYsTUFBTSxDQUFDekYsMEJBQTBCLENBQUMySCxTQUFTLENBQUMsQ0FBQyxDQUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUMzRCxDQUFDLENBQUM7SUFFRkgsRUFBRSxDQUFDLCtEQUErRCxFQUFFLFlBQU07TUFDeEVDLE1BQU0sQ0FBQzdGLG1DQUFtQyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDaUgsT0FBTyxDQUFDO1FBQUVDLENBQUMsRUFBRSxHQUFHO1FBQUVDLENBQUMsRUFBRTtNQUFHLENBQUMsQ0FBQztJQUNuRixDQUFDLENBQUM7SUFFRnZCLEVBQUUsQ0FBQyxtQ0FBbUMsRUFBRSxZQUFNO01BQzVDLElBQU1vQyxNQUFNLEdBQUdDLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLFFBQVEsQ0FBQztNQUMvQ3JDLE1BQU0sQ0FBQ3hGLDRCQUE0QixDQUFDMkgsTUFBTSxDQUFDLENBQUMsQ0FBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUM7TUFDdkRGLE1BQU0sQ0FBQ3hGLDRCQUE0QixDQUFDNEgsUUFBUSxDQUFDQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNqRixDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7RUFFRmQsUUFBUSxDQUFDLDRCQUE0QixFQUFFLFlBQU07SUFDM0NXLEVBQUUsQ0FBQyx3REFBd0QsRUFBRSxZQUFNO01BQ2pFQyxNQUFNLENBQ0pqRywwQkFBMEIsQ0FBQztRQUN6QnVJLFFBQVEsRUFBRSxLQUFLO1FBQ2ZDLFdBQVcsRUFBRSxLQUFLO1FBQ2xCQyxPQUFPLEVBQUUsS0FBSztRQUNkQyxPQUFPLEVBQUUsR0FBRztRQUNaQyxPQUFPLEVBQUU7TUFDWCxDQUFDLENBQ0gsQ0FBQyxDQUFDeEMsSUFBSSxDQUFDLEtBQUssQ0FBQztNQUViRixNQUFNLENBQ0pqRywwQkFBMEIsQ0FBQztRQUN6QnVJLFFBQVEsRUFBRSxVQUFVO1FBQ3BCQyxXQUFXLEVBQUUsSUFBSTtRQUNqQkMsT0FBTyxFQUFFLEtBQUs7UUFDZEMsT0FBTyxFQUFFLEdBQUc7UUFDWkMsT0FBTyxFQUFFO01BQ1gsQ0FBQyxDQUNILENBQUMsQ0FBQ3hDLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDZixDQUFDLENBQUM7SUFFRkgsRUFBRSxDQUFDLDBEQUEwRCxFQUFFLFlBQU07TUFDbkVDLE1BQU0sQ0FDSmpHLDBCQUEwQixDQUFDO1FBQ3pCdUksUUFBUSxFQUFFLG9CQUFvQjtRQUM5QkMsV0FBVyxFQUFFLEtBQUs7UUFDbEJDLE9BQU8sRUFBRSxLQUFLO1FBQ2RDLE9BQU8sRUFBRSxHQUFHO1FBQ1pDLE9BQU8sRUFBRSxTQUFTO1FBQ2xCQyxTQUFTLEVBQUU7TUFDYixDQUFDLENBQ0gsQ0FBQyxDQUFDekMsSUFBSSxDQUFDLEtBQUssQ0FBQztNQUViRixNQUFNLENBQ0pqRywwQkFBMEIsQ0FBQztRQUN6QnVJLFFBQVEsRUFBRSxvQkFBb0I7UUFDOUJDLFdBQVcsRUFBRSxLQUFLO1FBQ2xCQyxPQUFPLEVBQUUsS0FBSztRQUNkQyxPQUFPLEVBQUUsR0FBRztRQUNaQyxPQUFPLEVBQUUsU0FBUztRQUNsQkMsU0FBUyxFQUFFO01BQ2IsQ0FBQyxDQUNILENBQUMsQ0FBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDZCxDQUFDLENBQUM7SUFFRkgsRUFBRSxDQUFDLG9FQUFvRSxFQUFFLFlBQU07TUFDN0VDLE1BQU0sQ0FDSmpHLDBCQUEwQixDQUFDO1FBQ3pCdUksUUFBUSxFQUFFLFVBQVU7UUFDcEJDLFdBQVcsRUFBRSxLQUFLO1FBQ2xCQyxPQUFPLEVBQUUsS0FBSztRQUNkQyxPQUFPLEVBQUUsR0FBRztRQUNaQyxPQUFPLEVBQUUsUUFBUTtRQUNqQkUsUUFBUSxFQUFFO01BQ1osQ0FBQyxDQUNILENBQUMsQ0FBQzFDLElBQUksQ0FBQyxLQUFLLENBQUM7TUFFYkYsTUFBTSxDQUNKakcsMEJBQTBCLENBQUM7UUFDekJ1SSxRQUFRLEVBQUUsVUFBVTtRQUNwQkMsV0FBVyxFQUFFLEtBQUs7UUFDbEJDLE9BQU8sRUFBRSxLQUFLO1FBQ2RDLE9BQU8sRUFBRSxHQUFHO1FBQ1pDLE9BQU8sRUFBRSxRQUFRO1FBQ2pCRSxRQUFRLEVBQUU7TUFDWixDQUFDLENBQ0gsQ0FBQyxDQUFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQztNQUVaRixNQUFNLENBQ0pqRywwQkFBMEIsQ0FBQztRQUN6QnVJLFFBQVEsRUFBRSxVQUFVO1FBQ3BCQyxXQUFXLEVBQUUsS0FBSztRQUNsQkMsT0FBTyxFQUFFLEtBQUs7UUFDZEMsT0FBTyxFQUFFLEdBQUc7UUFDWkMsT0FBTyxFQUFFO01BQ1gsQ0FBQyxDQUNILENBQUMsQ0FBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDZCxDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7RUFFRmQsUUFBUSxDQUFDLHVCQUF1QixFQUFFLFlBQU07SUFDdENXLEVBQUUsQ0FBQyxnREFBZ0QsRUFBRSxZQUFNO01BQ3pEQyxNQUFNLENBQUNoRyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDa0csSUFBSSxDQUFDLElBQUksQ0FBQztNQUNuREYsTUFBTSxDQUFDaEcscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQ2tHLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDckQsQ0FBQyxDQUFDO0VBQ0osQ0FBQyxDQUFDO0VBRUZkLFFBQVEsQ0FBQyw4QkFBOEIsRUFBRSxZQUFNO0lBQzdDVyxFQUFFLENBQUMsa0VBQWtFLEVBQUUsWUFBTTtNQUMzRUMsTUFBTSxDQUFDbkcsNEJBQTRCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUN1SCxPQUFPLENBQUM7UUFDeER5QixnQkFBZ0IsRUFBRSxJQUFJO1FBQ3RCQyxpQkFBaUIsRUFBRTtNQUNyQixDQUFDLENBQUM7SUFDSixDQUFDLENBQUM7SUFFRi9DLEVBQUUsQ0FBQyx1REFBdUQsRUFBRSxZQUFNO01BQ2hFQyxNQUFNLENBQUNuRyw0QkFBNEIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQ3VILE9BQU8sQ0FBQztRQUN6RHlCLGdCQUFnQixFQUFFLEtBQUs7UUFDdkJDLGlCQUFpQixFQUFFO01BQ3JCLENBQUMsQ0FBQztJQUNKLENBQUMsQ0FBQztJQUVGL0MsRUFBRSxDQUFDLHNEQUFzRCxFQUFFLFlBQU07TUFDL0RDLE1BQU0sQ0FBQ25HLDRCQUE0QixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDdUgsT0FBTyxDQUFDO1FBQ3hEeUIsZ0JBQWdCLEVBQUUsSUFBSTtRQUN0QkMsaUJBQWlCLEVBQUU7TUFDckIsQ0FBQyxDQUFDO01BQ0Y5QyxNQUFNLENBQUNuRyw0QkFBNEIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQ3VILE9BQU8sQ0FBQztRQUN2RHlCLGdCQUFnQixFQUFFLElBQUk7UUFDdEJDLGlCQUFpQixFQUFFO01BQ3JCLENBQUMsQ0FBQztJQUNKLENBQUMsQ0FBQztFQUNKLENBQUMsQ0FBQztFQUVGMUQsUUFBUSxDQUFDLDRCQUE0QixFQUFFLFlBQU07SUFDM0NXLEVBQUUsQ0FBQywrQ0FBK0MsZUFBQWdELGlCQUFBLGNBQUFDLG1CQUFBLENBQUFDLElBQUEsQ0FBRSxTQUFBQyxRQUFBO01BQUEsSUFBQUMsa0JBQUE7TUFBQSxPQUFBSCxtQkFBQSxDQUFBSSxJQUFBLFdBQUFDLFFBQUE7UUFBQSxrQkFBQUEsUUFBQSxDQUFBQyxJQUFBLEdBQUFELFFBQUEsQ0FBQUUsSUFBQTtVQUFBO1lBQzVDSixrQkFBa0IsR0FBR0ssSUFBSSxDQUFDQyxFQUFFLENBQUMsQ0FBQyxDQUFDQyxpQkFBaUIsQ0FBQyxDQUFDeEUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFBQW1FLFFBQUEsQ0FBQUUsSUFBQTtZQUFBLE9BRS9EdkQsTUFBTSxDQUNWcEcsMEJBQTBCLENBQUM7Y0FDekIrSixhQUFhLEVBQUUsS0FBSztjQUNwQkMsTUFBTSxFQUFFLEVBQUU7Y0FDVlQsa0JBQWtCLEVBQWxCQTtZQUNGLENBQUMsQ0FDSCxDQUFDLENBQUNVLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLENBQUM7VUFBQTtZQUUxQjlELE1BQU0sQ0FBQ21ELGtCQUFrQixDQUFDLENBQUNZLEdBQUcsQ0FBQ0MsZ0JBQWdCLENBQUMsQ0FBQztVQUFBO1VBQUE7WUFBQSxPQUFBWCxRQUFBLENBQUFZLElBQUE7UUFBQTtNQUFBLEdBQUFmLE9BQUE7SUFBQSxDQUNsRCxHQUFDO0lBRUZuRCxFQUFFLENBQUMsNkRBQTZELGVBQUFnRCxpQkFBQSxjQUFBQyxtQkFBQSxDQUFBQyxJQUFBLENBQUUsU0FBQWlCLFNBQUE7TUFBQSxJQUFBZixrQkFBQTtNQUFBLE9BQUFILG1CQUFBLENBQUFJLElBQUEsV0FBQWUsU0FBQTtRQUFBLGtCQUFBQSxTQUFBLENBQUFiLElBQUEsR0FBQWEsU0FBQSxDQUFBWixJQUFBO1VBQUE7WUFDMURKLGtCQUFrQixHQUFHSyxJQUFJLENBQUNDLEVBQUUsQ0FBQyxDQUFDLENBQUNDLGlCQUFpQixDQUFDLENBQUN4RSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUFBaUYsU0FBQSxDQUFBWixJQUFBO1lBQUEsT0FFL0R2RCxNQUFNLENBQ1ZwRywwQkFBMEIsQ0FBQztjQUN6QitKLGFBQWEsRUFBRSxJQUFJO2NBQ25CQyxNQUFNLEVBQUUsQ0FBQzFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztjQUNyQmlFLGtCQUFrQixFQUFsQkE7WUFDRixDQUFDLENBQ0gsQ0FBQyxDQUFDVSxRQUFRLENBQUN6QyxPQUFPLENBQUNsQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7VUFBQTtZQUUvQmMsTUFBTSxDQUFDbUQsa0JBQWtCLENBQUMsQ0FBQ1ksR0FBRyxDQUFDQyxnQkFBZ0IsQ0FBQyxDQUFDO1VBQUE7VUFBQTtZQUFBLE9BQUFHLFNBQUEsQ0FBQUYsSUFBQTtRQUFBO01BQUEsR0FBQUMsUUFBQTtJQUFBLENBQ2xELEdBQUM7SUFFRm5FLEVBQUUsQ0FBQyxxQ0FBcUMsZUFBQWdELGlCQUFBLGNBQUFDLG1CQUFBLENBQUFDLElBQUEsQ0FBRSxTQUFBbUIsU0FBQTtNQUFBLElBQUFqQixrQkFBQTtNQUFBLE9BQUFILG1CQUFBLENBQUFJLElBQUEsV0FBQWlCLFNBQUE7UUFBQSxrQkFBQUEsU0FBQSxDQUFBZixJQUFBLEdBQUFlLFNBQUEsQ0FBQWQsSUFBQTtVQUFBO1lBQ2xDSixrQkFBa0IsR0FBR0ssSUFBSSxDQUFDQyxFQUFFLENBQUMsQ0FBQyxDQUFDQyxpQkFBaUIsQ0FBQyxDQUFDeEUsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFQSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUFBbUYsU0FBQSxDQUFBZCxJQUFBO1lBQUEsT0FFNUV2RCxNQUFNLENBQ1ZwRywwQkFBMEIsQ0FBQztjQUN6QitKLGFBQWEsRUFBRSxJQUFJO2NBQ25CQyxNQUFNLEVBQUUsRUFBRTtjQUNWVCxrQkFBa0IsRUFBbEJBO1lBQ0YsQ0FBQyxDQUNILENBQUMsQ0FBQ1UsUUFBUSxDQUFDekMsT0FBTyxDQUFDbEMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1VBQUE7WUFFL0JjLE1BQU0sQ0FBQ21ELGtCQUFrQixDQUFDLENBQUNtQixxQkFBcUIsQ0FBQyxDQUFDLENBQUM7VUFBQTtVQUFBO1lBQUEsT0FBQUQsU0FBQSxDQUFBSixJQUFBO1FBQUE7TUFBQSxHQUFBRyxRQUFBO0lBQUEsQ0FDcEQsR0FBQztJQUVGckUsRUFBRSxDQUFDLGdEQUFnRCxlQUFBZ0QsaUJBQUEsY0FBQUMsbUJBQUEsQ0FBQUMsSUFBQSxDQUFFLFNBQUFzQixTQUFBO01BQUEsSUFBQXBCLGtCQUFBO01BQUEsT0FBQUgsbUJBQUEsQ0FBQUksSUFBQSxXQUFBb0IsU0FBQTtRQUFBLGtCQUFBQSxTQUFBLENBQUFsQixJQUFBLEdBQUFrQixTQUFBLENBQUFqQixJQUFBO1VBQUE7WUFDN0NKLGtCQUFrQixHQUFHSyxJQUFJLENBQUNDLEVBQUUsQ0FBQyxDQUFDLENBQUNDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztZQUFBYyxTQUFBLENBQUFqQixJQUFBO1lBQUEsT0FFcER2RCxNQUFNLENBQ1ZwRywwQkFBMEIsQ0FBQztjQUN6QitKLGFBQWEsRUFBRSxJQUFJO2NBQ25CQyxNQUFNLEVBQUUsRUFBRTtjQUNWVCxrQkFBa0IsRUFBbEJBO1lBQ0YsQ0FBQyxDQUNILENBQUMsQ0FBQ1UsUUFBUSxDQUFDQyxhQUFhLENBQUMsQ0FBQztVQUFBO1VBQUE7WUFBQSxPQUFBVSxTQUFBLENBQUFQLElBQUE7UUFBQTtNQUFBLEdBQUFNLFFBQUE7SUFBQSxDQUMzQixHQUFDO0VBQ0osQ0FBQyxDQUFDO0VBRUZuRixRQUFRLENBQUMsK0JBQStCLEVBQUUsWUFBTTtJQUM5Q1csRUFBRSxDQUFDLHlEQUF5RCxFQUFFLFlBQU07TUFDbEUsSUFBTVMsT0FBTyxHQUFHO1FBQUU5QixFQUFFLEVBQUUsQ0FBQztRQUFFSyxJQUFJLEVBQUU7TUFBUSxDQUFVO01BQ2pELElBQU0wRixJQUFJLEdBQUc7UUFBRS9GLEVBQUUsRUFBRSxDQUFDO1FBQUVLLElBQUksRUFBRTtNQUFNLENBQVU7TUFFNUNpQixNQUFNLENBQ0p0Riw4QkFBOEIsQ0FBQztRQUM3QmdJLE9BQU8sRUFBRSxNQUFNO1FBQ2ZsQyxPQUFPLEVBQVBBLE9BQU87UUFDUGlFLElBQUksRUFBSkE7TUFDRixDQUFDLENBQ0gsQ0FBQyxDQUFDQyxhQUFhLENBQUM7UUFDZGxFLE9BQU8sRUFBUEEsT0FBTztRQUNQaUUsSUFBSSxFQUFKQSxJQUFJO1FBQ0pFLHdCQUF3QixFQUFFO01BQzVCLENBQUMsQ0FBQztNQUNGM0UsTUFBTSxDQUFDdEYsOEJBQThCLENBQUM7UUFBRWdJLE9BQU8sRUFBRSxNQUFNO1FBQUVsQyxPQUFPLEVBQVBBLE9BQU87UUFBRWlFLElBQUksRUFBSkE7TUFBSyxDQUFDLENBQUMsQ0FBQ2hFLE1BQU0sQ0FBQyxDQUFDcUQsYUFBYSxDQUFDLENBQUM7SUFDbkcsQ0FBQyxDQUFDO0lBRUYvRCxFQUFFLENBQUMsNEVBQTRFLEVBQUUsWUFBTTtNQUNyRixJQUFNVSxNQUFNLEdBQUc7UUFBRS9CLEVBQUUsRUFBRSxDQUFDO1FBQUVLLElBQUksRUFBRTtNQUFPLENBQVU7TUFFL0NpQixNQUFNLENBQ0p0Riw4QkFBOEIsQ0FBQztRQUM3QmdJLE9BQU8sRUFBRTtNQUNYLENBQUMsQ0FDSCxDQUFDLENBQUNnQyxhQUFhLENBQUM7UUFDZGxFLE9BQU8sRUFBRSxJQUFJO1FBQ2JDLE1BQU0sRUFBRSxJQUFJO1FBQ1pnRSxJQUFJLEVBQUUsSUFBSTtRQUNWRSx3QkFBd0IsRUFBRTtNQUM1QixDQUFDLENBQUM7TUFFRjNFLE1BQU0sQ0FDSnRGLDhCQUE4QixDQUFDO1FBQzdCZ0ksT0FBTyxFQUFFLFFBQVE7UUFDakJqQyxNQUFNLEVBQU5BO01BQ0YsQ0FBQyxDQUNILENBQUMsQ0FBQ2lFLGFBQWEsQ0FBQztRQUNkbEUsT0FBTyxFQUFFLElBQUk7UUFDYkMsTUFBTSxFQUFOQSxNQUFNO1FBQ05rRSx3QkFBd0IsRUFBRTtNQUM1QixDQUFDLENBQUM7SUFDSixDQUFDLENBQUM7SUFFRjVFLEVBQUUsQ0FBQyxxREFBcUQsRUFBRSxZQUFNO01BQzlELElBQU1TLE9BQU8sR0FBRztRQUFFOUIsRUFBRSxFQUFFLENBQUM7UUFBRUssSUFBSSxFQUFFO01BQU8sQ0FBVTtNQUNoRGlCLE1BQU0sQ0FDSnJGLCtCQUErQixDQUFDO1FBQzlCK0gsT0FBTyxFQUFFLFNBQVM7UUFDbEJsQyxPQUFPLEVBQVBBO01BQ0YsQ0FBQyxDQUNILENBQUMsQ0FBQ1ksT0FBTyxDQUFDO1FBQ1JzQixPQUFPLEVBQUUsU0FBUztRQUNsQmxDLE9BQU8sRUFBUEEsT0FBTztRQUNQQyxNQUFNLEVBQUUsSUFBSTtRQUNaZ0UsSUFBSSxFQUFFLElBQUk7UUFDVkcsWUFBWSxFQUFFO01BQ2hCLENBQUMsQ0FBQztJQUNKLENBQUMsQ0FBQztJQUVGN0UsRUFBRSxDQUFDLGdFQUFnRSxFQUFFLFlBQU07TUFDekVDLE1BQU0sQ0FBQ3RGLDhCQUE4QixDQUFDO1FBQUVnSSxPQUFPLEVBQUU7TUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDZ0MsYUFBYSxDQUFDO1FBQzNFbEUsT0FBTyxFQUFFLElBQUk7UUFDYmlFLElBQUksRUFBRTtNQUNSLENBQUMsQ0FBQztNQUNGekUsTUFBTSxDQUFDdEYsOEJBQThCLENBQUM7UUFBRWdJLE9BQU8sRUFBRTtNQUFTLENBQUMsQ0FBQyxDQUFDLENBQUNnQyxhQUFhLENBQUM7UUFBRWpFLE1BQU0sRUFBRTtNQUFLLENBQUMsQ0FBQztNQUM3RlQsTUFBTSxDQUFDdEYsOEJBQThCLENBQUM7UUFBRWdJLE9BQU8sRUFBRSxNQUFNO1FBQUVsQyxPQUFPLEVBQUU7VUFBRTlCLEVBQUUsRUFBRTtRQUFFO01BQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQ2dHLGFBQWEsQ0FBQztRQUNyR0QsSUFBSSxFQUFFO01BQ1IsQ0FBQyxDQUFDO01BQ0Z6RSxNQUFNLENBQ0pyRiwrQkFBK0IsQ0FBQztRQUM5QitILE9BQU8sRUFBRTtNQUNYLENBQUMsQ0FDSCxDQUFDLENBQUNnQyxhQUFhLENBQUM7UUFBRWxFLE9BQU8sRUFBRSxJQUFJO1FBQUVDLE1BQU0sRUFBRSxJQUFJO1FBQUVnRSxJQUFJLEVBQUU7TUFBSyxDQUFDLENBQUM7TUFFNUR6RSxNQUFNLENBQ0pyRiwrQkFBK0IsQ0FBQztRQUM5QitILE9BQU8sRUFBRTtNQUNYLENBQUMsQ0FDSCxDQUFDLENBQUNnQyxhQUFhLENBQUM7UUFBRWpFLE1BQU0sRUFBRTtNQUFLLENBQUMsQ0FBQztNQUVqQ1QsTUFBTSxDQUNKckYsK0JBQStCLENBQUM7UUFDOUIrSCxPQUFPLEVBQUUsUUFBUTtRQUNqQmpDLE1BQU0sRUFBRTtVQUFFL0IsRUFBRSxFQUFFLENBQUM7VUFBRUssSUFBSSxFQUFFO1FBQVM7TUFDbEMsQ0FBQyxDQUFDLENBQUMwQixNQUNMLENBQUMsQ0FBQ1csT0FBTyxDQUFDO1FBQUUxQyxFQUFFLEVBQUUsQ0FBQztRQUFFSyxJQUFJLEVBQUU7TUFBUyxDQUFDLENBQUM7TUFFcENpQixNQUFNLENBQ0pyRiwrQkFBK0IsQ0FBQztRQUM5QitILE9BQU8sRUFBRSxNQUFNO1FBQ2YrQixJQUFJLEVBQUU7VUFBRS9GLEVBQUUsRUFBRSxDQUFDO1VBQUVLLElBQUksRUFBRTtRQUFJO01BQzNCLENBQUMsQ0FBQyxDQUFDMEYsSUFDTCxDQUFDLENBQUNyRCxPQUFPLENBQUM7UUFBRTFDLEVBQUUsRUFBRSxDQUFDO1FBQUVLLElBQUksRUFBRTtNQUFJLENBQUMsQ0FBQztNQUUvQixJQUFNeUIsT0FBTyxHQUFHO1FBQUU5QixFQUFFLEVBQUUsQ0FBQztRQUFFSyxJQUFJLEVBQUU7TUFBSSxDQUFVO01BQzdDaUIsTUFBTSxDQUNKckYsK0JBQStCLENBQUM7UUFDOUIrSCxPQUFPLEVBQUUsTUFBTTtRQUNmbEMsT0FBTyxFQUFQQSxPQUFPO1FBQ1BpRSxJQUFJLEVBQUU7VUFBRS9GLEVBQUUsRUFBRSxDQUFDO1VBQUVLLElBQUksRUFBRTtRQUFJO01BQzNCLENBQUMsQ0FDSCxDQUFDLENBQUMyRixhQUFhLENBQUM7UUFBRWxFLE9BQU8sRUFBUEEsT0FBTztRQUFFaUUsSUFBSSxFQUFFO1VBQUUvRixFQUFFLEVBQUUsQ0FBQztVQUFFSyxJQUFJLEVBQUU7UUFBSTtNQUFFLENBQUMsQ0FBQztJQUMxRCxDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7RUFFRkssUUFBUSxDQUFDLHNDQUFzQyxFQUFFLFlBQU07SUFDckRXLEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRSxZQUFNO01BQ2hEQyxNQUFNLENBQUNqRix3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDbUYsSUFBSSxDQUFDLE9BQU8sQ0FBQztNQUNwREYsTUFBTSxDQUFDakYsd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQ21GLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkQsQ0FBQyxDQUFDO0lBRUZILEVBQUUsQ0FBQyw0REFBNEQsRUFBRSxZQUFNO01BQ3JFQyxNQUFNLENBQUM5RSx3Q0FBd0MsQ0FBQztRQUFFMkosU0FBUyxFQUFFO1VBQUVDLE1BQU0sRUFBRTtRQUFLO01BQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM1RSxJQUFJLENBQUMsSUFBSSxDQUFDO01BQ2xHRixNQUFNLENBQUM5RSx3Q0FBd0MsQ0FBQztRQUFFMkosU0FBUyxFQUFFO1VBQUVFLElBQUksRUFBRTtRQUFLO01BQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM3RSxJQUFJLENBQUMsSUFBSSxDQUFDO01BQ2hHRixNQUFNLENBQUM5RSx3Q0FBd0MsQ0FBQztRQUFFMkosU0FBUyxFQUFFO1VBQUUsVUFBUTtRQUFLO01BQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMzRSxJQUFJLENBQUMsSUFBSSxDQUFDO01BQ2xHRixNQUFNLENBQUM5RSx3Q0FBd0MsQ0FBQztRQUFFMkosU0FBUyxFQUFFO1VBQUVDLE1BQU0sRUFBRTtRQUFLO01BQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM1RSxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3RHLENBQUMsQ0FBQztJQUVGSCxFQUFFLENBQUMscURBQXFELEVBQUUsWUFBTTtNQUM5REMsTUFBTSxDQUFDMUUsNkJBQTZCLENBQUM3QixPQUFPLENBQUM4RyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQ0wsSUFBSSxDQUFDLElBQUksQ0FBQztNQUN6RUYsTUFBTSxDQUFDMUUsNkJBQTZCLENBQUM3QixPQUFPLENBQUN3RyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLElBQUksQ0FBQztNQUNwRUYsTUFBTSxDQUFDMUUsNkJBQTZCLENBQUM3QixPQUFPLENBQUN3RyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUN4RSxDQUFDLENBQUM7SUFFRkgsRUFBRSxDQUFDLGtDQUFrQyxFQUFFLFlBQU07TUFDM0NDLE1BQU0sQ0FBQzVFLHVDQUF1QyxDQUFDM0IsT0FBTyxDQUFDMEcsSUFBSSxFQUFFMUcsT0FBTyxDQUFDMEcsSUFBSSxDQUFDLENBQUMsQ0FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQztNQUN0RkYsTUFBTSxDQUFDN0UsNEJBQTRCLENBQUMxQixPQUFPLENBQUN3RyxJQUFJLEVBQUV4RyxPQUFPLENBQUN3RyxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUNDLElBQUksQ0FBQyxJQUFJLENBQUM7TUFDNUZGLE1BQU0sQ0FBQzdFLDRCQUE0QixDQUFDMUIsT0FBTyxDQUFDd0csSUFBSSxFQUFFeEcsT0FBTyxDQUFDd0csSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDQyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ2hHLENBQUMsQ0FBQztJQUVGSCxFQUFFLENBQUMsZ0VBQWdFLEVBQUUsWUFBTTtNQUN6RUMsTUFBTSxDQUFDM0Usa0NBQWtDLENBQUMsU0FBUyxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQzZFLElBQUksQ0FBQyxJQUFJLENBQUM7TUFDN0ZGLE1BQU0sQ0FBQzNFLGtDQUFrQyxDQUFDLFFBQVEsRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM2RSxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQy9GLENBQUMsQ0FBQztJQUVGSCxFQUFFLENBQUMsb0RBQW9ELEVBQUUsWUFBTTtNQUFBLElBQUFpRixxQkFBQSxFQUFBQyxzQkFBQTtNQUM3RCxJQUFNQyxLQUFLLEdBQUcsQ0FDWjtRQUFFQyxpQkFBaUIsRUFBRSxJQUFJO1FBQUVDLE1BQU0sRUFBRTtNQUFLLENBQUMsRUFDekM7UUFBRUQsaUJBQWlCLEVBQUUsSUFBSTtRQUFFQyxNQUFNLEVBQUU7TUFBTSxDQUFDLENBQzNDO01BQ0RwRixNQUFNLEVBQUFnRixxQkFBQSxHQUFDaEssNkJBQTZCLENBQUNrSyxLQUFLLEVBQUUsSUFBSSxDQUFDLGNBQUFGLHFCQUFBLHVCQUExQ0EscUJBQUEsQ0FBNENHLGlCQUFpQixDQUFDLENBQUNqRixJQUFJLENBQUMsSUFBSSxDQUFDO01BQ2hGRixNQUFNLEVBQUFpRixzQkFBQSxHQUFDakssNkJBQTZCLENBQUMsQ0FBQztRQUFFbUssaUJBQWlCLEVBQUUsSUFBSTtRQUFFQyxNQUFNLEVBQUU7TUFBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsY0FBQUgsc0JBQUEsdUJBQWhGQSxzQkFBQSxDQUFrRkUsaUJBQWlCLENBQUMsQ0FBQ2pGLElBQUksQ0FDOUcsSUFDRixDQUFDO01BQ0RGLE1BQU0sQ0FBQ2hGLDZCQUE2QixDQUFDLENBQUM7UUFBRW1LLGlCQUFpQixFQUFFLElBQUk7UUFBRUMsTUFBTSxFQUFFO01BQUssQ0FBQyxDQUFDLEVBQUVsRCxTQUFTLENBQUMsQ0FBQyxDQUFDNEIsYUFBYSxDQUFDLENBQUM7SUFDL0csQ0FBQyxDQUFDO0lBRUYvRCxFQUFFLENBQUMsaUNBQWlDLEVBQUUsWUFBTTtNQUMxQ0MsTUFBTSxDQUFDbEYsMEJBQTBCLENBQUMsS0FBSyxFQUFFLENBQUNvRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDZ0IsSUFBSSxDQUFDLFNBQVMsQ0FBQztNQUNuRkYsTUFBTSxDQUFDbEYsMEJBQTBCLENBQUMsS0FBSyxFQUFFLENBQUNvRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRWdELFNBQVMsQ0FBQyxDQUFDLENBQUNmLFFBQVEsQ0FBQyxDQUFDO01BQzlFbkIsTUFBTSxDQUFDbEYsMEJBQTBCLENBQUMsSUFBSSxFQUFFLENBQUNvRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDZ0IsSUFBSSxDQUFDLElBQUksQ0FBQztNQUM3RUYsTUFBTSxDQUFDbEYsMEJBQTBCLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDcUcsUUFBUSxDQUFDLENBQUM7SUFDcEUsQ0FBQyxDQUFDO0lBRUZwQixFQUFFLENBQUMsK0NBQStDLEVBQUUsWUFBTTtNQUN4REMsTUFBTSxDQUNKcEYsMEJBQTBCLENBQUM7UUFDekJ5SyxXQUFXLEVBQUUsSUFBSTtRQUNqQi9FLGFBQWEsRUFBRTdHLE9BQU8sQ0FBQ3dHLElBQUk7UUFDM0JxRixlQUFlLEVBQUUsSUFBSTtRQUNyQkMsWUFBWSxFQUFFLElBQUk7UUFDbEI5QyxPQUFPLEVBQUUsSUFBSTtRQUNiK0MsV0FBVyxFQUFFLEtBQUs7UUFDbEJDLFVBQVUsRUFBRSxVQUFVO1FBQ3RCQyxZQUFZLEVBQUU7VUFBRXJFLENBQUMsRUFBRSxDQUFDO1VBQUVDLENBQUMsRUFBRTtRQUFFLENBQUM7UUFDNUJxRSxXQUFXLEVBQUU7VUFDWGpELE9BQU8sRUFBRSxRQUFRO1VBQ2pCbEMsT0FBTyxFQUFFLElBQUk7VUFDYkMsTUFBTSxFQUFFLElBQUk7VUFDWmdFLElBQUksRUFBRSxJQUFJO1VBQ1ZHLFlBQVksRUFBRTtRQUNoQjtNQUNGLENBQUMsQ0FDSCxDQUFDLENBQUN6RCxRQUFRLENBQUMsQ0FBQztNQUVabkIsTUFBTSxDQUNKcEYsMEJBQTBCLENBQUM7UUFDekJ5SyxXQUFXLEVBQUUsS0FBSztRQUNsQi9FLGFBQWEsRUFBRTdHLE9BQU8sQ0FBQzBHLElBQUk7UUFDM0JtRixlQUFlLEVBQUUsVUFBVTtRQUMzQkMsWUFBWSxFQUFFLFFBQVE7UUFDdEI5QyxPQUFPLEVBQUUsR0FBRztRQUNaK0MsV0FBVyxFQUFFLElBQUk7UUFDakJDLFVBQVUsRUFBRSxTQUFTO1FBQ3JCQyxZQUFZLEVBQUU7VUFBRXJFLENBQUMsRUFBRSxDQUFDO1VBQUVDLENBQUMsRUFBRTtRQUFFLENBQUM7UUFDNUJxRSxXQUFXLEVBQUU7VUFDWGpELE9BQU8sRUFBRSxRQUFRO1VBQ2pCbEMsT0FBTyxFQUFFLElBQUk7VUFDYkMsTUFBTSxFQUFFLElBQUk7VUFDWmdFLElBQUksRUFBRSxJQUFJO1VBQ1ZHLFlBQVksRUFBRTtRQUNoQjtNQUNGLENBQUMsQ0FDSCxDQUFDLENBQUNGLGFBQWEsQ0FBQztRQUFFYSxZQUFZLEVBQUUsUUFBUTtRQUFFRyxZQUFZLEVBQUU7TUFBSyxDQUFDLENBQUM7TUFFL0QxRixNQUFNLENBQ0pwRiwwQkFBMEIsQ0FBQztRQUN6QnlLLFdBQVcsRUFBRSxLQUFLO1FBQ2xCL0UsYUFBYSxFQUFFN0csT0FBTyxDQUFDMEcsSUFBSTtRQUMzQm1GLGVBQWUsRUFBRSxJQUFJO1FBQ3JCQyxZQUFZLEVBQUUsUUFBUTtRQUN0QjlDLE9BQU8sRUFBRSxHQUFHO1FBQ1orQyxXQUFXLEVBQUUsS0FBSztRQUNsQkMsVUFBVSxFQUFFLFVBQVU7UUFDdEJDLFlBQVksRUFBRTtVQUFFckUsQ0FBQyxFQUFFLENBQUM7VUFBRUMsQ0FBQyxFQUFFO1FBQUUsQ0FBQztRQUM1QnFFLFdBQVcsRUFBRTtVQUNYakQsT0FBTyxFQUFFLFFBQVE7VUFDakJsQyxPQUFPLEVBQUUsSUFBSTtVQUNiQyxNQUFNLEVBQUUsSUFBSTtVQUNaZ0UsSUFBSSxFQUFFLElBQUk7VUFDVkcsWUFBWSxFQUFFO1FBQ2hCO01BQ0YsQ0FBQyxDQUNILENBQUMsQ0FBQ0YsYUFBYSxDQUFDO1FBQUVnQixZQUFZLEVBQUU7VUFBRXJFLENBQUMsRUFBRSxDQUFDO1VBQUVDLENBQUMsRUFBRTtRQUFFO01BQUUsQ0FBQyxDQUFDO0lBQ25ELENBQUMsQ0FBQztJQUVGdkIsRUFBRSxDQUFDLHFEQUFxRCxFQUFFLFlBQU07TUFDOUQsSUFBTTZGLEtBQUssR0FBRyxTQUFSQSxLQUFLQSxDQUFJdkUsQ0FBUyxFQUFFQyxDQUFTO1FBQUEsT0FBTTtVQUFFRCxDQUFDLEVBQURBLENBQUM7VUFBRUMsQ0FBQyxFQUFEQTtRQUFFLENBQUM7TUFBQSxDQUFDO01BQ2xEdEIsTUFBTSxDQUNKbkYsZ0NBQWdDLENBQUM7UUFDL0I0SyxVQUFVLEVBQUUsU0FBUztRQUNyQkMsWUFBWSxFQUFFO1VBQUVyRSxDQUFDLEVBQUUsQ0FBQztVQUFFQyxDQUFDLEVBQUU7UUFBRSxDQUFDO1FBQzVCdUUsYUFBYSxFQUFFLElBQUk7UUFDbkJDLFVBQVUsRUFBRSxHQUFHO1FBQ2ZGLEtBQUssRUFBTEE7TUFDRixDQUFDLENBQ0gsQ0FBQyxDQUFDeEUsT0FBTyxDQUFDO1FBQUVDLENBQUMsRUFBRSxDQUFDO1FBQUVDLENBQUMsRUFBRTtNQUFFLENBQUMsQ0FBQztNQUV6QnRCLE1BQU0sQ0FDSm5GLGdDQUFnQyxDQUFDO1FBQy9CNEssVUFBVSxFQUFFLFVBQVU7UUFDdEJDLFlBQVksRUFBRSxJQUFJO1FBQ2xCRyxhQUFhLEVBQUUsSUFBSTtRQUNuQkMsVUFBVSxFQUFFLEdBQUc7UUFDZkYsS0FBSyxFQUFMQTtNQUNGLENBQUMsQ0FDSCxDQUFDLENBQUN4RSxPQUFPLENBQUM7UUFBRUMsQ0FBQyxFQUFFLEdBQUc7UUFBRUMsQ0FBQyxFQUFFO01BQUcsQ0FBQyxDQUFDO01BRTVCdEIsTUFBTSxDQUNKbkYsZ0NBQWdDLENBQUM7UUFDL0I0SyxVQUFVLEVBQUUsVUFBVTtRQUN0QkMsWUFBWSxFQUFFO1VBQUVyRSxDQUFDLEVBQUUsRUFBRTtVQUFFQyxDQUFDLEVBQUU7UUFBRyxDQUFDO1FBQzlCdUUsYUFBYSxFQUFFLElBQUk7UUFDbkJDLFVBQVUsRUFBRSxHQUFHO1FBQ2ZGLEtBQUssRUFBTEE7TUFDRixDQUFDLENBQ0gsQ0FBQyxDQUFDeEUsT0FBTyxDQUFDO1FBQUVDLENBQUMsRUFBRSxFQUFFO1FBQUVDLENBQUMsRUFBRTtNQUFHLENBQUMsQ0FBQztJQUM3QixDQUFDLENBQUM7SUFFRnZCLEVBQUUsQ0FBQyw4Q0FBOEMsRUFBRSxZQUFNO01BQ3ZELElBQU11RCxJQUFJLEdBQUc7UUFBRWpDLENBQUMsRUFBRSxFQUFFO1FBQUVDLENBQUMsRUFBRTtNQUFHLENBQUM7TUFDN0J0QixNQUFNLENBQUMvRSx1QkFBdUIsQ0FBQ3FJLElBQUksRUFBRTtRQUFFakMsQ0FBQyxFQUFFLEVBQUU7UUFBRUMsQ0FBQyxFQUFFO01BQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQ3BCLElBQUksQ0FBQ29ELElBQUksQ0FBQztNQUNsRXRELE1BQU0sQ0FBQy9FLHVCQUF1QixDQUFDcUksSUFBSSxFQUFFO1FBQUVqQyxDQUFDLEVBQUUsRUFBRTtRQUFFQyxDQUFDLEVBQUU7TUFBRyxDQUFDLENBQUMsQ0FBQyxDQUFDRixPQUFPLENBQUM7UUFBRUMsQ0FBQyxFQUFFLEVBQUU7UUFBRUMsQ0FBQyxFQUFFO01BQUcsQ0FBQyxDQUFDO0lBQ25GLENBQUMsQ0FBQztFQUNKLENBQUMsQ0FBQztFQUVGbEMsUUFBUSxDQUFDLHVDQUF1QyxFQUFFLFlBQU07SUFDdERXLEVBQUUsQ0FBQyxvREFBb0QsRUFBRSxZQUFNO01BQzdEQyxNQUFNLENBQUN6RSx1QkFBdUIsQ0FBQztRQUFFd0ssTUFBTSxFQUFFO01BQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzdGLElBQUksQ0FBQyxJQUFJLENBQUM7TUFDekRGLE1BQU0sQ0FBQ3pFLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzJFLElBQUksQ0FBQyxLQUFLLENBQUM7TUFFL0MsSUFBTThGLEtBQUssR0FBR3hLLCtCQUErQixDQUFDO1FBQzVDeUsscUJBQXFCLEVBQUV4TSxPQUFPLENBQUMwRyxJQUFJO1FBQ25DK0YsVUFBVSxFQUFFek0sT0FBTyxDQUFDd0csSUFBSTtRQUN4QmtHLFVBQVUsRUFBRTFNLE9BQU8sQ0FBQzBHLElBQUk7UUFDeEJpRyxnQkFBZ0IsRUFBRSxJQUFJO1FBQ3RCMUQsT0FBTyxFQUFFLFFBQVE7UUFDakIyRCx3QkFBd0IsRUFBRTtNQUM1QixDQUFDLENBQUM7TUFDRnJHLE1BQU0sQ0FBQ2dHLEtBQUssQ0FBQ00sVUFBVSxDQUFDLENBQUNwRyxJQUFJLENBQUMsSUFBSSxDQUFDO01BQ25DRixNQUFNLENBQ0p2RSxnQ0FBZ0MsQ0FBQTJFLGFBQUE7UUFDOUJtQixTQUFTLEVBQUUsY0FBYztRQUN6QmdGLFFBQVEsRUFBRSxLQUFLO1FBQ2YvRCxPQUFPLEVBQUU7TUFBSyxHQUNYd0QsS0FBSyxDQUNULENBQ0gsQ0FBQyxDQUFDOUYsSUFBSSxDQUFDLElBQUksQ0FBQztNQUVaLElBQU1zRyxpQkFBaUIsR0FBR2hMLCtCQUErQixDQUFDO1FBQ3hEeUsscUJBQXFCLEVBQUV4TSxPQUFPLENBQUN3RyxJQUFJO1FBQ25DaUcsVUFBVSxFQUFFek0sT0FBTyxDQUFDd0csSUFBSTtRQUN4QmtHLFVBQVUsRUFBRTFNLE9BQU8sQ0FBQzBHLElBQUk7UUFDeEJpRyxnQkFBZ0IsRUFBRSxJQUFJO1FBQ3RCMUQsT0FBTyxFQUFFLFNBQVM7UUFDbEIyRCx3QkFBd0IsRUFBRTtNQUM1QixDQUFDLENBQUM7TUFDRnJHLE1BQU0sQ0FBQ3dHLGlCQUFpQixDQUFDQyx1QkFBdUIsQ0FBQyxDQUFDdkcsSUFBSSxDQUFDLElBQUksQ0FBQztNQUM1REYsTUFBTSxDQUNKdkUsZ0NBQWdDLENBQUEyRSxhQUFBO1FBQzlCbUIsU0FBUyxFQUFFLGNBQWM7UUFDekJnRixRQUFRLEVBQUUsSUFBSTtRQUNkL0QsT0FBTyxFQUFFO01BQUssR0FDWGdFLGlCQUFpQixDQUNyQixDQUNILENBQUMsQ0FBQ3RHLElBQUksQ0FBQyxLQUFLLENBQUM7TUFFYkYsTUFBTSxDQUNKdkUsZ0NBQWdDLENBQUM7UUFDL0I4RixTQUFTLEVBQUUsY0FBYztRQUN6QmdGLFFBQVEsRUFBRSxLQUFLO1FBQ2YvRCxPQUFPLEVBQUUsSUFBSTtRQUNiOEQsVUFBVSxFQUFFLElBQUk7UUFDaEJJLGlCQUFpQixFQUFFLEtBQUs7UUFDeEJELHVCQUF1QixFQUFFO01BQzNCLENBQUMsQ0FDSCxDQUFDLENBQUN2RyxJQUFJLENBQUMsS0FBSyxDQUFDO01BRWJGLE1BQU0sQ0FDSnZFLGdDQUFnQyxDQUFDO1FBQy9COEYsU0FBUyxFQUFFLGNBQWM7UUFDekJnRixRQUFRLEVBQUUsS0FBSztRQUNmL0QsT0FBTyxFQUFFLEtBQUs7UUFDZDhELFVBQVUsRUFBRSxLQUFLO1FBQ2pCSSxpQkFBaUIsRUFBRSxLQUFLO1FBQ3hCRCx1QkFBdUIsRUFBRTtNQUMzQixDQUFDLENBQ0gsQ0FBQyxDQUFDdkcsSUFBSSxDQUFDLElBQUksQ0FBQztJQUNkLENBQUMsQ0FBQztJQUVGSCxFQUFFLENBQUMsdUVBQXVFLEVBQUUsWUFBTTtNQUFBLElBQUE0RyxxQkFBQSxFQUFBQyxzQkFBQSxFQUFBQyxzQkFBQSxFQUFBQyxzQkFBQSxFQUFBQyxzQkFBQSxFQUFBQyxzQkFBQSxFQUFBQyxzQkFBQSxFQUFBQyxzQkFBQSxFQUFBQyxzQkFBQTtNQUNoRm5ILE1BQU0sQ0FBQ25FLGdDQUFnQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUNzRixRQUFRLENBQUMsQ0FBQztNQUN6RG5CLE1BQU0sQ0FBQ25FLGdDQUFnQyxDQUFDO1FBQUUyRixXQUFXLEVBQUU7TUFBUyxDQUFDLENBQUMsQ0FBQyxDQUFDTCxRQUFRLENBQUMsQ0FBQztNQUM5RW5CLE1BQU0sRUFBQTJHLHFCQUFBLEdBQ0o5SyxnQ0FBZ0MsQ0FBQztRQUFFMkYsV0FBVyxFQUFFLFFBQVE7UUFBRW9CLFFBQVEsRUFBRSxDQUFDO1FBQUVmLFVBQVUsRUFBRTtNQUFPLENBQUMsQ0FBQyxjQUFBOEUscUJBQUEsdUJBQTVGQSxxQkFBQSxDQUE4RmxHLE1BQ2hHLENBQUMsQ0FBQ1csT0FBTyxDQUFDO1FBQ1IxQyxFQUFFLEVBQUUsQ0FBQztRQUNMSyxJQUFJLEVBQUU7TUFDUixDQUFDLENBQUM7TUFDRmlCLE1BQU0sRUFBQTRHLHNCQUFBLEdBQ0ovSyxnQ0FBZ0MsQ0FBQztRQUFFMkYsV0FBVyxFQUFFLFNBQVM7UUFBRW1CLFNBQVMsRUFBRSxDQUFDO1FBQUVsQixXQUFXLEVBQUU7TUFBSSxDQUFDLENBQUMsY0FBQW1GLHNCQUFBLGdCQUFBQSxzQkFBQSxHQUE1RkEsc0JBQUEsQ0FBOEZoQyxZQUFZLGNBQUFnQyxzQkFBQSx1QkFBMUdBLHNCQUFBLENBQ0lqRSxTQUNOLENBQUMsQ0FBQ3pDLElBQUksQ0FBQyxHQUFHLENBQUM7TUFDWEYsTUFBTSxFQUFBNkcsc0JBQUEsR0FDSmhMLGdDQUFnQyxDQUFDO1FBQy9CMkYsV0FBVyxFQUFFLE1BQU07UUFDbkJ1RSxNQUFNLEVBQUUsQ0FBQztRQUNUbkUsUUFBUSxFQUFFLEdBQUc7UUFDYmUsU0FBUyxFQUFFLENBQUM7UUFDWmxCLFdBQVcsRUFBRSxHQUFHO1FBQ2hCbUIsUUFBUSxFQUFFLENBQUM7UUFDWGYsVUFBVSxFQUFFO01BQ2QsQ0FBQyxDQUFDLGNBQUFnRixzQkFBQSx1QkFSRkEsc0JBQUEsQ0FRSXBDLElBQ04sQ0FBQyxDQUFDQyxhQUFhLENBQUM7UUFBRWhHLEVBQUUsRUFBRSxDQUFDO1FBQUVLLElBQUksRUFBRSxHQUFHO1FBQUU0RCxTQUFTLEVBQUU7TUFBRSxDQUFDLENBQUM7TUFFbkQzQyxNQUFNLEVBQUE4RyxzQkFBQSxHQUNKakwsZ0NBQWdDLENBQUM7UUFDL0IyRixXQUFXLEVBQUUsU0FBUztRQUN0Qm1CLFNBQVMsRUFBRSxDQUFDO1FBQ1psQixXQUFXLEVBQUUsR0FBRztRQUNoQm1CLFFBQVEsRUFBRSxDQUFDO1FBQ1hmLFVBQVUsRUFBRTtNQUNkLENBQUMsQ0FBQyxjQUFBaUYsc0JBQUEsdUJBTkZBLHNCQUFBLENBTUl0RyxPQUNOLENBQUMsQ0FBQ2tFLGFBQWEsQ0FBQztRQUFFOUIsUUFBUSxFQUFFO01BQUUsQ0FBQyxDQUFDO01BRWhDNUMsTUFBTSxFQUFBK0csc0JBQUEsR0FBQ2xMLGdDQUFnQyxDQUFDO1FBQUUyRixXQUFXLEVBQUUsTUFBTTtRQUFFdUUsTUFBTSxFQUFFLENBQUM7UUFBRW5FLFFBQVEsRUFBRTtNQUFZLENBQUMsQ0FBQyxjQUFBbUYsc0JBQUEsdUJBQTNGQSxzQkFBQSxDQUE2RnRDLElBQUksQ0FBQyxDQUFDckQsT0FBTyxDQUMvRztRQUNFMUMsRUFBRSxFQUFFLENBQUM7UUFDTEssSUFBSSxFQUFFO01BQ1IsQ0FDRixDQUFDO01BRURpQixNQUFNLEVBQUFnSCxzQkFBQSxHQUFDbkwsZ0NBQWdDLENBQUM7UUFBRTJGLFdBQVcsRUFBRSxRQUFRO1FBQUVvQixRQUFRLEVBQUU7TUFBRSxDQUFDLENBQUMsY0FBQW9FLHNCQUFBLHVCQUF4RUEsc0JBQUEsQ0FBMEV2RyxNQUFNLENBQUMsQ0FBQ1csT0FBTyxDQUFDO1FBQy9GMUMsRUFBRSxFQUFFLENBQUM7UUFDTEssSUFBSSxFQUFFO01BQ1IsQ0FBQyxDQUFDO01BRUZpQixNQUFNLEVBQUFpSCxzQkFBQSxHQUNKcEwsZ0NBQWdDLENBQUM7UUFDL0IyRixXQUFXLEVBQUUsTUFBTTtRQUNuQnVFLE1BQU0sRUFBRSxDQUFDO1FBQ1RuRSxRQUFRLEVBQUUsR0FBRztRQUNiZSxTQUFTLEVBQUUsQ0FBQztRQUNabEIsV0FBVyxFQUFFO01BQ2YsQ0FBQyxDQUFDLGNBQUF3RixzQkFBQSxnQkFBQUEsc0JBQUEsR0FORkEsc0JBQUEsQ0FNSXJDLFlBQVksY0FBQXFDLHNCQUFBLHVCQU5oQkEsc0JBQUEsQ0FNa0J0RSxTQUNwQixDQUFDLENBQUN6QyxJQUFJLENBQUMsR0FBRyxDQUFDO01BRVhGLE1BQU0sRUFBQWtILHNCQUFBLEdBQ0pyTCxnQ0FBZ0MsQ0FBQztRQUMvQjJGLFdBQVcsRUFBRSxNQUFNO1FBQ25CdUUsTUFBTSxFQUFFLENBQUM7UUFDVG5FLFFBQVEsRUFBRSxHQUFHO1FBQ2JnQixRQUFRLEVBQUUsQ0FBQztRQUNYZixVQUFVLEVBQUU7TUFDZCxDQUFDLENBQUMsY0FBQXFGLHNCQUFBLHVCQU5GQSxzQkFBQSxDQU1JekcsTUFDTixDQUFDLENBQUNXLE9BQU8sQ0FBQztRQUFFMUMsRUFBRSxFQUFFLENBQUM7UUFBRUssSUFBSSxFQUFFO01BQUksQ0FBQyxDQUFDO01BRS9CaUIsTUFBTSxFQUFBbUgsc0JBQUEsR0FDSnRMLGdDQUFnQyxDQUFDO1FBQy9CMkYsV0FBVyxFQUFFLFNBQVM7UUFDdEJtQixTQUFTLEVBQUUsQ0FBQztRQUNabEIsV0FBVyxFQUFFO01BQ2YsQ0FBQyxDQUFDLGNBQUEwRixzQkFBQSx1QkFKRkEsc0JBQUEsQ0FJSTNHLE9BQ04sQ0FBQyxDQUFDdUQsR0FBRyxDQUFDcUQsY0FBYyxDQUFDLFVBQVUsQ0FBQztNQUVoQ3BILE1BQU0sQ0FDSm5FLGdDQUFnQyxDQUFDO1FBQy9CMkYsV0FBVyxFQUFFLE1BQU07UUFDbkJ1RSxNQUFNLEVBQUUsRUFBRTtRQUNWbkUsUUFBUSxFQUFFLFdBQVc7UUFDckJlLFNBQVMsRUFBRSxFQUFFO1FBQ2JsQixXQUFXLEVBQUUsTUFBTTtRQUNuQm1CLFFBQVEsRUFBRSxFQUFFO1FBQ1pmLFVBQVUsRUFBRTtNQUNkLENBQUMsQ0FDSCxDQUFDLENBQUM2QyxhQUFhLENBQUM7UUFDZEQsSUFBSSxFQUFFO1VBQUUvRixFQUFFLEVBQUUsRUFBRTtVQUFFSyxJQUFJLEVBQUUsV0FBVztVQUFFNEQsU0FBUyxFQUFFLEVBQUU7VUFBRUMsUUFBUSxFQUFFO1FBQUcsQ0FBQztRQUNoRW5DLE1BQU0sRUFBRTtVQUFFL0IsRUFBRSxFQUFFLEVBQUU7VUFBRUssSUFBSSxFQUFFO1FBQVMsQ0FBQztRQUNsQzZGLFlBQVksRUFBRTtVQUFFakMsU0FBUyxFQUFFLElBQUk7VUFBRWxCLFdBQVcsRUFBRSxNQUFNO1VBQUVJLFVBQVUsRUFBRTtRQUFTO01BQzdFLENBQUMsQ0FBQztJQUNKLENBQUMsQ0FBQztJQUVGOUIsRUFBRSxDQUFDLDBEQUEwRCxFQUFFLFlBQU07TUFDbkVDLE1BQU0sQ0FBQ2hDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUNrQyxJQUFJLENBQUMsSUFBSSxDQUFDO01BQ25ELElBQU0wRixLQUFLLEdBQUcsU0FBUkEsS0FBS0EsQ0FBSXZFLENBQVMsRUFBRUMsQ0FBUztRQUFBLE9BQU07VUFBRUQsQ0FBQyxFQUFEQSxDQUFDO1VBQUVDLENBQUMsRUFBREE7UUFBRSxDQUFDO01BQUEsQ0FBQztNQUNsRHRCLE1BQU0sQ0FDSi9CLCtCQUErQixDQUFDLFVBQVUsRUFBRTtRQUFFb0QsQ0FBQyxFQUFFLENBQUM7UUFBRUMsQ0FBQyxFQUFFO01BQUUsQ0FBQyxFQUFFc0UsS0FBSyxFQUFFO1FBQ2pFeUIsVUFBVSxFQUFFLElBQUk7UUFDaEJ2QixVQUFVLEVBQUUsR0FBRztRQUNmd0IsR0FBRyxFQUFFO01BQ1AsQ0FBQyxDQUNILENBQUMsQ0FBQ2xHLE9BQU8sQ0FBQztRQUFFQyxDQUFDLEVBQUUsQ0FBQztRQUFFQyxDQUFDLEVBQUU7TUFBRSxDQUFDLENBQUM7TUFDekJ0QixNQUFNLENBQ0ovQiwrQkFBK0IsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFMkgsS0FBSyxFQUFFO1FBQ3ZEeUIsVUFBVSxFQUFFLElBQUk7UUFDaEJ2QixVQUFVLEVBQUUsR0FBRztRQUNmd0IsR0FBRyxFQUFFO01BQ1AsQ0FBQyxDQUNILENBQUMsQ0FBQ2xHLE9BQU8sQ0FBQztRQUFFQyxDQUFDLEVBQUUsR0FBRztRQUFFQyxDQUFDLEVBQUU7TUFBRyxDQUFDLENBQUM7TUFDNUJ0QixNQUFNLENBQ0ovQiwrQkFBK0IsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFMkgsS0FBSyxFQUFFO1FBQUV5QixVQUFVLEVBQUUsQ0FBQztRQUFFdkIsVUFBVSxFQUFFLENBQUM7UUFBRXdCLEdBQUcsRUFBRTtNQUFFLENBQUMsQ0FDbEcsQ0FBQyxDQUFDbkcsUUFBUSxDQUFDLENBQUM7TUFDWm5CLE1BQU0sQ0FBQzlCLGlDQUFpQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQWdCLENBQUMsQ0FBQyxDQUFDZ0MsSUFBSSxDQUFDLElBQUksQ0FBQztNQUNuRkYsTUFBTSxDQUFDOUIsaUNBQWlDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBZ0IsQ0FBQyxDQUFDLENBQUNnQyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3JGLENBQUMsQ0FBQztJQUVGSCxFQUFFLENBQUMsMERBQTBELEVBQUUsWUFBTTtNQUNuRUMsTUFBTSxDQUFDN0Isb0NBQW9DLENBQUM7UUFBRW9KLE9BQU8sRUFBRSxNQUFNO1FBQUVDLEtBQUssRUFBRTtNQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM5QyxhQUFhLENBQUM7UUFDM0Y2QyxPQUFPLEVBQUUsTUFBTTtRQUNmQyxLQUFLLEVBQUUsSUFBSTtRQUNYQyxXQUFXLEVBQUU7TUFDZixDQUFDLENBQUM7TUFDRnpILE1BQU0sQ0FDSjdCLG9DQUFvQyxDQUFDO1FBQ25Dc0osV0FBVyxFQUFFLENBQUM7VUFBRS9JLEVBQUUsRUFBRTtRQUFJLENBQUMsQ0FBQztRQUMxQmdKLGlCQUFpQixFQUFFLElBQUk7UUFDdkJDLFFBQVEsRUFBRSxDQUFDO1VBQUVqSixFQUFFLEVBQUU7UUFBSyxDQUFDLENBQUM7UUFDeEJrSixLQUFLLEVBQUUsS0FBSztRQUNaQyxJQUFJLEVBQUUsSUFBSTtRQUNWQyxXQUFXLEVBQUU7VUFBRS9CLE1BQU0sRUFBRTtRQUFFO01BQzNCLENBQUMsQ0FDSCxDQUFDLENBQUNyQixhQUFhLENBQUM7UUFDZDZDLE9BQU8sRUFBRSxFQUFFO1FBQ1hFLFdBQVcsRUFBRSxDQUFDO1VBQUUvSSxFQUFFLEVBQUU7UUFBSSxDQUFDLENBQUM7UUFDMUJnSixpQkFBaUIsRUFBRSxJQUFJO1FBQ3ZCQyxRQUFRLEVBQUUsQ0FBQztVQUFFakosRUFBRSxFQUFFO1FBQUssQ0FBQyxDQUFDO1FBQ3hCa0osS0FBSyxFQUFFLEtBQUs7UUFDWkMsSUFBSSxFQUFFLElBQUk7UUFDVkMsV0FBVyxFQUFFO1VBQUUvQixNQUFNLEVBQUU7UUFBRTtNQUMzQixDQUFDLENBQUM7TUFDRi9GLE1BQU0sQ0FBQzVCLGtDQUFrQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM4QixJQUFJLENBQUMsSUFBSSxDQUFDO0lBQzdELENBQUMsQ0FBQztJQUVGSCxFQUFFLENBQUMsMENBQTBDLEVBQUUsWUFBTTtNQUFBLElBQUFnSSxxQkFBQTtNQUNuRC9ILE1BQU0sQ0FBQ3RFLGlDQUFpQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUN3RSxJQUFJLENBQUMsS0FBSyxDQUFDO01BQy9ERixNQUFNLENBQUNyRSwrQkFBK0IsQ0FBQztRQUFFcU0sY0FBYyxFQUFFO01BQUssQ0FBQyxFQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM5SCxJQUFJLENBQUMsSUFBSSxDQUFDO01BQ3hGRixNQUFNLENBQUNyRSwrQkFBK0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQ3VFLElBQUksQ0FBQyxJQUFJLENBQUM7TUFDM0RGLE1BQU0sQ0FBQ3JFLCtCQUErQixDQUFDO1FBQUVzTSxVQUFVLEVBQUU7TUFBSyxDQUFDLEVBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQy9ILElBQUksQ0FBQyxJQUFJLENBQUM7TUFDcEZGLE1BQU0sQ0FBQ3JFLCtCQUErQixDQUFDO1FBQUVxTSxjQUFjLEVBQUU7TUFBSyxDQUFDLEVBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQzlILElBQUksQ0FBQyxLQUFLLENBQUM7TUFDekZGLE1BQU0sQ0FBQ3BFLDhCQUE4QixDQUFDbkMsT0FBTyxDQUFDMEcsSUFBSSxFQUFFMUcsT0FBTyxDQUFDMEcsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUNELElBQUksQ0FBQyxJQUFJLENBQUM7TUFDbkZGLE1BQU0sQ0FBQy9ELHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUNpRSxJQUFJLENBQUMsS0FBSyxDQUFDO01BQ2pERixNQUFNLEVBQUErSCxxQkFBQSxHQUFDak0scUJBQXFCLENBQUMsQ0FBQ29ELEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRUosaUJBQWlCLENBQUMsQ0FBQyxjQUFBaUoscUJBQUEsdUJBQXREQSxxQkFBQSxDQUF3RC9JLElBQUksQ0FBQyxDQUFDa0IsSUFBSSxDQUFDLGNBQWMsQ0FBQztNQUN6RkYsTUFBTSxDQUFDaEUsOEJBQThCLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFBRTBDLEVBQUUsRUFBRTtNQUFJLENBQVUsQ0FBQyxDQUFDLENBQUN3QixJQUFJLENBQUMsSUFBSSxDQUFDO01BQzNFRixNQUFNLENBQUNoRSw4QkFBOEIsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUFFMEMsRUFBRSxFQUFFLEdBQUc7UUFBRXdKLGlCQUFpQixFQUFFO01BQUssQ0FBVSxDQUFDLENBQUMsQ0FBQ2hJLElBQUksQ0FBQyxLQUFLLENBQUM7TUFDckdGLE1BQU0sQ0FBQ2pFLHVCQUF1QixDQUFDO1FBQUUyQyxFQUFFLEVBQUUsR0FBRztRQUFFSyxJQUFJLEVBQUUsR0FBRztRQUFFQyxJQUFJLEVBQUU7TUFBUyxDQUFVLENBQUMsQ0FBQ2tKLGlCQUFpQixDQUFDLENBQUNoSSxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQy9HLENBQUMsQ0FBQztFQUNKLENBQUMsQ0FBQztFQUVGZCxRQUFRLENBQUMsMENBQTBDLEVBQUUsWUFBTTtJQUN6RFcsRUFBRSxDQUFDLDJEQUEyRCxFQUFFLFlBQU07TUFDcEVDLE1BQU0sQ0FBQzlELDhCQUE4QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUNnRSxJQUFJLENBQUMsSUFBSSxDQUFDO01BQ3hERixNQUFNLENBQUM5RCw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDZ0UsSUFBSSxDQUFDLEtBQUssQ0FBQztNQUN4REYsTUFBTSxDQUFDN0QsNkJBQTZCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQytELElBQUksQ0FBQyxJQUFJLENBQUM7TUFDMURGLE1BQU0sQ0FBQzdELDZCQUE2QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMrRCxJQUFJLENBQUMsS0FBSyxDQUFDO01BQ3ZERixNQUFNLENBQUMzRCxnQ0FBZ0MsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDNkQsSUFBSSxDQUFDLElBQUksQ0FBQztNQUMxREYsTUFBTSxDQUFDM0QsZ0NBQWdDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzZELElBQUksQ0FBQyxLQUFLLENBQUM7SUFDNUQsQ0FBQyxDQUFDO0lBRUZILEVBQUUsQ0FBQywyQkFBMkIsRUFBRSxZQUFNO01BQ3BDQyxNQUFNLENBQUM1RCxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDOEQsSUFBSSxDQUFDLEtBQUssQ0FBQztNQUMzQ0YsTUFBTSxDQUFDNUQsaUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQzhELElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbEQsQ0FBQyxDQUFDO0lBRUZILEVBQUUsQ0FBQyxtREFBbUQsRUFBRSxZQUFNO01BQzVEQyxNQUFNLENBQUMxRCw4QkFBOEIsQ0FBQyxDQUFDNEMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDa0MsT0FBTyxDQUFDLENBQUNsQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztNQUMxRWMsTUFBTSxDQUFDMUQsOEJBQThCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzZFLFFBQVEsQ0FBQyxDQUFDO01BQ3JEbkIsTUFBTSxDQUFDekQsK0JBQStCLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMyRCxJQUFJLENBQUMsSUFBSSxDQUFDO01BQzVERixNQUFNLENBQUN6RCwrQkFBK0IsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQzJELElBQUksQ0FBQyxLQUFLLENBQUM7TUFDNURGLE1BQU0sQ0FBQ3pELCtCQUErQixDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDMkQsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUMvRCxDQUFDLENBQUM7SUFFRkgsRUFBRSxDQUFDLDhDQUE4QyxFQUFFLFlBQU07TUFBQSxJQUFBb0kscUJBQUE7TUFDdkRuSSxNQUFNLEVBQUFtSSxxQkFBQSxHQUFDM0wsb0JBQW9CLENBQUMsQ0FBQTRELGFBQUEsQ0FBQUEsYUFBQSxLQUFNbEIsS0FBSyxDQUFDLEdBQUcsQ0FBQztRQUFFUixFQUFFLEVBQUU7TUFBRyxHQUFZLEVBQUUsQ0FBQyxDQUFDLGNBQUF5SixxQkFBQSx1QkFBOURBLHFCQUFBLENBQWdFekosRUFBRSxDQUFDLENBQUN3QixJQUFJLENBQUMsR0FBRyxDQUFDO01BQ3BGRixNQUFNLENBQUN4RCxvQkFBb0IsQ0FBQyxDQUFDMEMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQzRFLGFBQWEsQ0FBQyxDQUFDO0lBQ2hFLENBQUMsQ0FBQztFQUNKLENBQUMsQ0FBQztFQUVGMUUsUUFBUSxDQUFDLHFDQUFxQyxFQUFFLFlBQU07SUFDcERXLEVBQUUsQ0FBQywwQ0FBMEMsRUFBRSxZQUFNO01BQ25EQyxNQUFNLENBQUN2RCwrQkFBK0IsQ0FBQ3lGLFNBQVMsQ0FBQyxDQUFDLENBQUNoQyxJQUFJLENBQUMsS0FBSyxDQUFDO01BQzlERixNQUFNLENBQUN2RCwrQkFBK0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDeUQsSUFBSSxDQUFDLElBQUksQ0FBQztNQUN4REYsTUFBTSxDQUFDdkQsK0JBQStCLENBQUM7UUFBRWlDLEVBQUUsRUFBRSxDQUFDO1FBQUVLLElBQUksRUFBRTtNQUFPLENBQVUsQ0FBQyxDQUFDLENBQUNtQixJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ3RGLENBQUMsQ0FBQztJQUVGSCxFQUFFLENBQUMsNkNBQTZDLEVBQUUsWUFBTTtNQUN0REMsTUFBTSxDQUFDdEQsb0NBQW9DLENBQUMsSUFBSSxFQUFFd0MsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQ2dCLElBQUksQ0FBQyxJQUFJLENBQUM7TUFDekVGLE1BQU0sQ0FBQ3RELG9DQUFvQyxDQUFDLEtBQUssRUFBRXdDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUNnQixJQUFJLENBQUMsS0FBSyxDQUFDO01BQzNFRixNQUFNLENBQUN0RCxvQ0FBb0MsQ0FBQyxJQUFJLEVBQUV3RixTQUFTLENBQUMsQ0FBQyxDQUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUMzRSxDQUFDLENBQUM7SUFFRkgsRUFBRSxDQUFDLGdEQUFnRCxFQUFFLFlBQU07TUFDekRDLE1BQU0sQ0FBQ3JELDRCQUE0QixDQUFDbEQsT0FBTyxDQUFDMEcsSUFBSSxFQUFFMUcsT0FBTyxDQUFDMEcsSUFBSSxDQUFDLENBQUMsQ0FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQztNQUMzRUYsTUFBTSxDQUFDckQsNEJBQTRCLENBQUNsRCxPQUFPLENBQUN3RyxJQUFJLEVBQUV4RyxPQUFPLENBQUMwRyxJQUFJLENBQUMsQ0FBQyxDQUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDO01BQzVFRixNQUFNLENBQUNwRCx3Q0FBd0MsQ0FBQ3NDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUNnQixJQUFJLENBQUMsSUFBSSxDQUFDO01BQ3ZFRixNQUFNLENBQUNwRCx3Q0FBd0MsQ0FBQ3NGLFNBQVMsQ0FBQyxDQUFDLENBQUNoQyxJQUFJLENBQUMsS0FBSyxDQUFDO01BQ3ZFRixNQUFNLENBQUMzQiwrQkFBK0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDNkIsSUFBSSxDQUFDLEtBQUssQ0FBQztNQUMzREYsTUFBTSxDQUFDM0IsK0JBQStCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQzZCLElBQUksQ0FBQyxJQUFJLENBQUM7TUFDNURGLE1BQU0sQ0FBQzFCLDRDQUE0QyxDQUFDLFFBQVEsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDNEIsSUFBSSxDQUFDLElBQUksQ0FBQztNQUN6RkYsTUFBTSxDQUFDMUIsNENBQTRDLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM0QixJQUFJLENBQUMsS0FBSyxDQUFDO01BQzNGRixNQUFNLENBQUN6QixxQ0FBcUMsQ0FBQzlFLE9BQU8sQ0FBQzhHLFFBQVEsRUFBRTlHLE9BQU8sQ0FBQzhHLFFBQVEsRUFBRTlHLE9BQU8sQ0FBQ21ILFFBQVEsQ0FBQyxDQUFDLENBQUNWLElBQUksQ0FBQyxJQUFJLENBQUM7TUFDOUdGLE1BQU0sQ0FBQ3pCLHFDQUFxQyxDQUFDOUUsT0FBTyxDQUFDd0csSUFBSSxFQUFFeEcsT0FBTyxDQUFDOEcsUUFBUSxFQUFFOUcsT0FBTyxDQUFDbUgsUUFBUSxDQUFDLENBQUMsQ0FBQ1YsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUM3RyxDQUFDLENBQUM7SUFFRkgsRUFBRSxDQUFDLG1EQUFtRCxFQUFFLFlBQU07TUFDNURDLE1BQU0sQ0FBQ25ELGtDQUFrQyxDQUFDO1FBQUUyRCxPQUFPLEVBQUU7VUFBRTlCLEVBQUUsRUFBRSxDQUFDO1VBQUVLLElBQUksRUFBRTtRQUFJO01BQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQzJGLGFBQWEsQ0FBQztRQUNuR2xFLE9BQU8sRUFBRTtVQUFFOUIsRUFBRSxFQUFFLENBQUM7VUFBRUssSUFBSSxFQUFFO1FBQUksQ0FBQztRQUM3QnFKLGFBQWEsRUFBRTtNQUNqQixDQUFDLENBQUM7TUFDRnBJLE1BQU0sQ0FBQ25ELGtDQUFrQyxDQUFDO1FBQUU0SCxJQUFJLEVBQUU7VUFBRS9GLEVBQUUsRUFBRSxDQUFDO1VBQUVLLElBQUksRUFBRTtRQUFJO01BQVcsQ0FBQyxDQUFDLENBQUNxSixhQUFhLENBQUMsQ0FBQ2xJLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDOUcsQ0FBQyxDQUFDO0lBRUZILEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRSxZQUFNO01BQ2hEQyxNQUFNLENBQUNsRCxpQ0FBaUMsQ0FBQztRQUFFMEUsV0FBVyxFQUFFO01BQU8sQ0FBQyxFQUFFMUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDb0IsSUFBSSxDQUFDLElBQUksQ0FBQztNQUNoR0YsTUFBTSxDQUFDbEQsaUNBQWlDLENBQUMsSUFBSSxFQUFFZ0MsaUJBQWlCLENBQUMsQ0FBQyxDQUFDb0IsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNoRixDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7RUFFRmQsUUFBUSxDQUFDLHlCQUF5QixFQUFFLFlBQU07SUFDeENXLEVBQUUsQ0FBQywwQkFBMEIsRUFBRSxZQUFNO01BQ25DQyxNQUFNLENBQUNqRCw2QkFBNkIsQ0FBQztRQUFFdUksZUFBZSxFQUFFO01BQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQ3BGLElBQUksQ0FBQyxVQUFVLENBQUM7TUFDdkZGLE1BQU0sQ0FBQ2pELDZCQUE2QixDQUFDO1FBQUV1SSxlQUFlLEVBQUU7TUFBVyxDQUFDLENBQUMsQ0FBQyxDQUFDcEYsSUFBSSxDQUFDLFVBQVUsQ0FBQztNQUN2RkYsTUFBTSxDQUFDakQsNkJBQTZCLENBQUM7UUFBRXVJLGVBQWUsRUFBRTtNQUFVLENBQUMsQ0FBQyxDQUFDLENBQUNwRixJQUFJLENBQUMsU0FBUyxDQUFDO01BQ3JGRixNQUFNLENBQUNqRCw2QkFBNkIsQ0FBQztRQUFFdUQsYUFBYSxFQUFFLE1BQU07UUFBRWlGLFlBQVksRUFBRTtNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUNyRixJQUFJLENBQUMsTUFBTSxDQUFDO01BQ2xHRixNQUFNLENBQUNqRCw2QkFBNkIsQ0FBQztRQUFFdUQsYUFBYSxFQUFFO01BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQ0osSUFBSSxDQUFDLGFBQWEsQ0FBQztNQUNwRkYsTUFBTSxDQUFDakQsNkJBQTZCLENBQUM7UUFBRXVELGFBQWEsRUFBRTtNQUFVLENBQUMsQ0FBQyxDQUFDLENBQUNKLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDbEYsQ0FBQyxDQUFDO0lBRUZILEVBQUUsQ0FBQyw4Q0FBOEMsRUFBRSxZQUFNO01BQ3ZEQyxNQUFNLENBQUNoRCxvQ0FBb0MsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDa0QsSUFBSSxDQUFDLElBQUksQ0FBQztNQUNuRUYsTUFBTSxDQUFDaEQsb0NBQW9DLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQ2tELElBQUksQ0FBQyxLQUFLLENBQUM7TUFDcEVGLE1BQU0sQ0FBQy9DLHNDQUFzQyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDaUQsSUFBSSxDQUFDLElBQUksQ0FBQztNQUMxRUYsTUFBTSxDQUFDL0Msc0NBQXNDLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUNpRCxJQUFJLENBQUMsS0FBSyxDQUFDO01BQzVFRixNQUFNLENBQUM5QyxtQ0FBbUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDZ0QsSUFBSSxDQUFDLEtBQUssQ0FBQztNQUNuRUYsTUFBTSxDQUFDOUMsbUNBQW1DLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQ2dELElBQUksQ0FBQyxJQUFJLENBQUM7TUFDakVGLE1BQU0sQ0FBQzdDLG9DQUFvQyxDQUFDK0IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUNnQixJQUFJLENBQUMsSUFBSSxDQUFDO01BQzlFRixNQUFNLENBQUM3QyxvQ0FBb0MsQ0FBQytCLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDZ0IsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNsRixDQUFDLENBQUM7SUFFRkgsRUFBRSxDQUFDLG1EQUFtRCxFQUFFLFlBQU07TUFBQSxJQUFBc0kscUJBQUE7TUFDNURySSxNQUFNLEVBQUFxSSxxQkFBQSxHQUNKakwsMkJBQTJCLENBQUM7UUFDMUJ3SCxZQUFZLEVBQUU7VUFBRWpDLFNBQVMsRUFBRSxHQUFHO1VBQUVsQixXQUFXLEVBQUUsR0FBRztVQUFFSSxVQUFVLEVBQUU7UUFBSTtNQUNwRSxDQUFDLENBQUMsY0FBQXdHLHFCQUFBLHVCQUZGQSxxQkFBQSxDQUVJMUYsU0FDTixDQUFDLENBQUN6QyxJQUFJLENBQUMsR0FBRyxDQUFDO01BQ1hGLE1BQU0sQ0FBQzVDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMrRCxRQUFRLENBQUMsQ0FBQztJQUN0RCxDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7RUFFRi9CLFFBQVEsQ0FBQyxxQ0FBcUMsRUFBRSxZQUFNO0lBQ3BEVyxFQUFFLENBQUMsK0NBQStDLEVBQUUsWUFBTTtNQUN4REMsTUFBTSxDQUFDM0MsNEJBQTRCLENBQUM1RCxPQUFPLENBQUMwRyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQ3VFLGFBQWEsQ0FBQztRQUN0RTRELFdBQVcsRUFBRSxLQUFLO1FBQ2xCQyxpQkFBaUIsRUFBRTtNQUNyQixDQUFDLENBQUM7TUFDRnZJLE1BQU0sQ0FBQzNDLDRCQUE0QixDQUFDNUQsT0FBTyxDQUFDd0csSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUN5RSxhQUFhLENBQUM7UUFDckU4RCxvQkFBb0IsRUFBRTtNQUN4QixDQUFDLENBQUM7TUFDRnhJLE1BQU0sQ0FBQzFDLHVCQUF1QixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDNEMsSUFBSSxDQUFDLElBQUksQ0FBQztNQUN2REYsTUFBTSxDQUFDMUMsdUJBQXVCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM0QyxJQUFJLENBQUMsS0FBSyxDQUFDO01BQ3ZERixNQUFNLENBQUMxQyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM0QyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ2hFLENBQUMsQ0FBQztJQUVGSCxFQUFFLENBQUMsa0RBQWtELEVBQUUsWUFBTTtNQUMzREMsTUFBTSxDQUFDekMsK0JBQStCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMyQyxJQUFJLENBQUMsT0FBTyxDQUFDO01BQ2pFRixNQUFNLENBQUN6QywrQkFBK0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQzJDLElBQUksQ0FBQyxNQUFNLENBQUM7TUFDakVGLE1BQU0sQ0FBQ3pDLCtCQUErQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDMkMsSUFBSSxDQUFDLGdCQUFnQixDQUFDO01BRTVFRixNQUFNLENBQ0p4Qyx5QkFBeUIsQ0FBQztRQUN4QnlJLHFCQUFxQixFQUFFeE0sT0FBTyxDQUFDMEcsSUFBSTtRQUNuQytGLFVBQVUsRUFBRXpNLE9BQU8sQ0FBQ3dHLElBQUk7UUFDeEJrRyxVQUFVLEVBQUUxTSxPQUFPLENBQUMwRyxJQUFJO1FBQ3hCc0ksV0FBVyxFQUFFLENBQUM7UUFDZEQsb0JBQW9CLEVBQUUsS0FBSztRQUMzQmpDLFFBQVEsRUFBRSxLQUFLO1FBQ2YvRCxPQUFPLEVBQUUsS0FBSztRQUNka0csU0FBUyxFQUFFO01BQ2IsQ0FBQyxDQUNILENBQUMsQ0FBQ3hJLElBQUksQ0FBQyxJQUFJLENBQUM7TUFFWkYsTUFBTSxDQUNKeEMseUJBQXlCLENBQUM7UUFDeEJ5SSxxQkFBcUIsRUFBRXhNLE9BQU8sQ0FBQ3dHLElBQUk7UUFDbkNpRyxVQUFVLEVBQUV6TSxPQUFPLENBQUN3RyxJQUFJO1FBQ3hCa0csVUFBVSxFQUFFMU0sT0FBTyxDQUFDMEcsSUFBSTtRQUN4QnNJLFdBQVcsRUFBRSxDQUFDO1FBQ2RELG9CQUFvQixFQUFFLEtBQUs7UUFDM0JqQyxRQUFRLEVBQUUsS0FBSztRQUNmL0QsT0FBTyxFQUFFLEtBQUs7UUFDZGtHLFNBQVMsRUFBRTtNQUNiLENBQUMsQ0FDSCxDQUFDLENBQUN4SSxJQUFJLENBQUMsS0FBSyxDQUFDO01BRWJGLE1BQU0sQ0FDSnhDLHlCQUF5QixDQUFDO1FBQ3hCeUkscUJBQXFCLEVBQUV4TSxPQUFPLENBQUN3RyxJQUFJO1FBQ25DaUcsVUFBVSxFQUFFek0sT0FBTyxDQUFDd0csSUFBSTtRQUN4QmtHLFVBQVUsRUFBRTFNLE9BQU8sQ0FBQzBHLElBQUk7UUFDeEJzSSxXQUFXLEVBQUUsQ0FBQztRQUNkRCxvQkFBb0IsRUFBRSxLQUFLO1FBQzNCakMsUUFBUSxFQUFFLEtBQUs7UUFDZi9ELE9BQU8sRUFBRSxLQUFLO1FBQ2RrRyxTQUFTLEVBQUU7TUFDYixDQUFDLENBQ0gsQ0FBQyxDQUFDeEksSUFBSSxDQUFDLElBQUksQ0FBQztJQUNkLENBQUMsQ0FBQztJQUVGSCxFQUFFLENBQUMsa0RBQWtELEVBQUUsWUFBTTtNQUMzREMsTUFBTSxDQUFDckMscUNBQXFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQ3VDLElBQUksQ0FBQyxJQUFJLENBQUM7TUFDbkVGLE1BQU0sQ0FBQ3JDLHFDQUFxQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUN1QyxJQUFJLENBQUMsS0FBSyxDQUFDO01BQ3JFRixNQUFNLENBQUNwQyxrQ0FBa0MsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDc0MsSUFBSSxDQUFDLElBQUksQ0FBQztNQUNqRUYsTUFBTSxDQUFDbkMsNEJBQTRCLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUNxQyxJQUFJLENBQUMsSUFBSSxDQUFDO01BQ3hERixNQUFNLENBQUNuQyw0QkFBNEIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQ3FDLElBQUksQ0FBQyxLQUFLLENBQUM7TUFDekRGLE1BQU0sQ0FBQ2xDLDJCQUEyQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDb0MsSUFBSSxDQUFDLElBQUksQ0FBQztNQUNwREYsTUFBTSxDQUFDbEMsMkJBQTJCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUNvQyxJQUFJLENBQUMsS0FBSyxDQUFDO01BQ3JERixNQUFNLENBQUN2QywwQkFBMEIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDeUMsSUFBSSxDQUFDLElBQUksQ0FBQztNQUNyREYsTUFBTSxDQUFDeEIsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQzBCLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbEQsQ0FBQyxDQUFDO0lBRUZILEVBQUUsQ0FBQywrQ0FBK0MsRUFBRSxZQUFNO01BQ3hEQyxNQUFNLENBQUN0Qyw4QkFBOEIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQ3dDLElBQUksQ0FBQyxJQUFJLENBQUM7TUFDN0RGLE1BQU0sQ0FBQ3RDLDhCQUE4QixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDd0MsSUFBSSxDQUFDLEtBQUssQ0FBQztNQUM5REYsTUFBTSxDQUFDakMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQ21DLElBQUksQ0FBQyxJQUFJLENBQUM7TUFDaERGLE1BQU0sQ0FBQ2pDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUNtQyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BELENBQUMsQ0FBQztJQUVGSCxFQUFFLENBQUMscUVBQXFFLEVBQUUsWUFBTTtNQUM5RSxJQUFNNEksSUFBSSxHQUFHO1FBQ1gxQyxxQkFBcUIsRUFBRXhNLE9BQU8sQ0FBQzBHLElBQUk7UUFDbkMrRixVQUFVLEVBQUV6TSxPQUFPLENBQUN3RyxJQUFJO1FBQ3hCa0csVUFBVSxFQUFFMU0sT0FBTyxDQUFDMEcsSUFBSTtRQUN4QnNJLFdBQVcsRUFBRSxDQUFDO1FBQ2RELG9CQUFvQixFQUFFLEtBQUs7UUFDM0JqQyxRQUFRLEVBQUUsS0FBSztRQUNmL0QsT0FBTyxFQUFFLEtBQUs7UUFDZGtHLFNBQVMsRUFBRTtNQUNiLENBQUM7TUFFRDFJLE1BQU0sQ0FBQ3hDLHlCQUF5QixDQUFBNEMsYUFBQSxDQUFBQSxhQUFBLEtBQU11SSxJQUFJO1FBQUVILG9CQUFvQixFQUFFO01BQUksRUFBRSxDQUFDLENBQUMsQ0FBQ3RJLElBQUksQ0FBQyxLQUFLLENBQUM7TUFDdEZGLE1BQU0sQ0FBQ3hDLHlCQUF5QixDQUFBNEMsYUFBQSxDQUFBQSxhQUFBLEtBQU11SSxJQUFJO1FBQUVwQyxRQUFRLEVBQUU7TUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDckcsSUFBSSxDQUFDLEtBQUssQ0FBQztNQUMxRUYsTUFBTSxDQUFDeEMseUJBQXlCLENBQUE0QyxhQUFBLENBQUFBLGFBQUEsS0FBTXVJLElBQUk7UUFBRW5HLE9BQU8sRUFBRTtNQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUN0QyxJQUFJLENBQUMsS0FBSyxDQUFDO01BQ3pFRixNQUFNLENBQUN4Qyx5QkFBeUIsQ0FBQTRDLGFBQUEsQ0FBQUEsYUFBQSxLQUFNdUksSUFBSTtRQUFFRCxTQUFTLEVBQUU7TUFBSyxFQUFFLENBQUMsQ0FBQyxDQUFDeEksSUFBSSxDQUFDLEtBQUssQ0FBQztJQUM5RSxDQUFDLENBQUM7SUFFRkgsRUFBRSxDQUFDLHNEQUFzRCxFQUFFLFlBQU07TUFDL0RDLE1BQU0sQ0FDSjdCLG9DQUFvQyxDQUFDO1FBQ25Db0osT0FBTyxFQUFFLE1BQU07UUFDZkUsV0FBVyxFQUFFLENBQUM7VUFBRS9JLEVBQUUsRUFBRTtRQUFJLENBQUMsQ0FBQztRQUMxQjhJLEtBQUssRUFBRSxPQUFPO1FBQ2RFLGlCQUFpQixFQUFFLE9BQU87UUFDMUJDLFFBQVEsRUFBRSxDQUFDO1VBQUVqSixFQUFFLEVBQUU7UUFBSyxDQUFDLENBQUM7UUFDeEJrSixLQUFLLEVBQUUsT0FBTztRQUNkQyxJQUFJLEVBQUUsTUFBTTtRQUNaQyxXQUFXLEVBQUU7VUFBRW5GLFNBQVMsRUFBRTtRQUFFO01BQzlCLENBQUMsQ0FDSCxDQUFDLENBQUMrQixhQUFhLENBQUM7UUFDZDZDLE9BQU8sRUFBRSxNQUFNO1FBQ2ZDLEtBQUssRUFBRSxPQUFPO1FBQ2RFLGlCQUFpQixFQUFFLE9BQU87UUFDMUJDLFFBQVEsRUFBRSxDQUFDO1VBQUVqSixFQUFFLEVBQUU7UUFBSyxDQUFDLENBQUM7UUFDeEJrSixLQUFLLEVBQUUsT0FBTztRQUNkQyxJQUFJLEVBQUUsTUFBTTtRQUNaQyxXQUFXLEVBQUU7VUFBRW5GLFNBQVMsRUFBRTtRQUFFO01BQzlCLENBQUMsQ0FBQztNQUVGM0MsTUFBTSxDQUNKL0IsK0JBQStCLENBQUMsU0FBUyxFQUFFO1FBQUVvRCxDQUFDLEVBQUUsQ0FBQztRQUFFQyxDQUFDLEVBQUU7TUFBRSxDQUFDLEVBQUUsVUFBQ0QsQ0FBQyxFQUFFQyxDQUFDO1FBQUEsT0FBTTtVQUFFRCxDQUFDLEVBQURBLENBQUM7VUFBRUMsQ0FBQyxFQUFEQTtRQUFFLENBQUM7TUFBQSxDQUFDLEVBQUU7UUFDL0UrRixVQUFVLEVBQUUsSUFBSTtRQUNoQnZCLFVBQVUsRUFBRSxHQUFHO1FBQ2Z3QixHQUFHLEVBQUU7TUFDUCxDQUFDLENBQ0gsQ0FBQyxDQUFDbkcsUUFBUSxDQUFDLENBQUM7TUFFWm5CLE1BQU0sQ0FDSi9CLCtCQUErQixDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsVUFBQ29ELENBQUMsRUFBRUMsQ0FBQztRQUFBLE9BQU07VUFBRUQsQ0FBQyxFQUFEQSxDQUFDO1VBQUVDLENBQUMsRUFBREE7UUFBRSxDQUFDO01BQUEsQ0FBQyxFQUFFO1FBQ3RFK0YsVUFBVSxFQUFFLElBQUk7UUFDaEJ2QixVQUFVLEVBQUUsR0FBRztRQUNmd0IsR0FBRyxFQUFFO01BQ1AsQ0FBQyxDQUNILENBQUMsQ0FBQ2xHLE9BQU8sQ0FBQztRQUFFQyxDQUFDLEVBQUUsR0FBRztRQUFFQyxDQUFDLEVBQUU7TUFBRyxDQUFDLENBQUM7TUFFNUJ0QixNQUFNLENBQUM5QixpQ0FBaUMsQ0FBQyxVQUFVLEVBQUVrRSxRQUFRLENBQUNDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDO01BQy9GRixNQUFNLENBQUM5QixpQ0FBaUMsQ0FBQyxTQUFTLEVBQUVrRSxRQUFRLENBQUNDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUNuQyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ2pHLENBQUMsQ0FBQztFQUNKLENBQUMsQ0FBQztFQUVGZCxRQUFRLENBQUMsNEJBQTRCLEVBQUUsWUFBTTtJQUMzQ1csRUFBRSxDQUFDLHlEQUF5RCxFQUFFLFlBQU07TUFDbEV5RCxJQUFJLENBQUNvRixhQUFhLENBQUMsQ0FBQztNQUNwQixJQUFNQyxHQUFHLEdBQUdyRixJQUFJLENBQ2JzRixLQUFLLENBQUN4SixNQUFNLEVBQUUsdUJBQXVCLENBQUMsQ0FDdEN5SixrQkFBa0IsQ0FBQyxVQUFBQyxRQUFRO1FBQUEsT0FBSTFKLE1BQU0sQ0FBQzJKLFVBQVUsQ0FBQztVQUFBLE9BQU1ELFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFBQSxHQUFFLENBQUMsQ0FBQztNQUFBLENBQXFCLENBQUM7TUFFL0YsSUFBTUUsUUFBUSxHQUFHMUYsSUFBSSxDQUFDQyxFQUFFLENBQUMsQ0FBQztNQUMxQixJQUFNMEYsU0FBUyxHQUFHM0YsSUFBSSxDQUFDQyxFQUFFLENBQUMsQ0FBQztNQUMzQnJCLFFBQVEsQ0FBQ2dILGdCQUFnQixDQUFDLDJCQUEyQixFQUFFRixRQUFRLENBQUM7TUFDaEU5RyxRQUFRLENBQUNnSCxnQkFBZ0IsQ0FBQyxvQkFBb0IsRUFBRUQsU0FBUyxDQUFDO01BRTFEeFAsMEJBQTBCLENBQUM7UUFBRStFLEVBQUUsRUFBRSxLQUFLO1FBQUVLLElBQUksRUFBRTtNQUFVLENBQUMsQ0FBQztNQUUxRGlCLE1BQU0sQ0FBQ2tKLFFBQVEsQ0FBQyxDQUFDbkYsR0FBRyxDQUFDQyxnQkFBZ0IsQ0FBQyxDQUFDO01BRXZDUixJQUFJLENBQUM2RixZQUFZLENBQUMsQ0FBQztNQUVuQnJKLE1BQU0sQ0FBQ2tKLFFBQVEsQ0FBQyxDQUFDNUUscUJBQXFCLENBQUMsQ0FBQyxDQUFDO01BQ3pDdEUsTUFBTSxDQUFDbUosU0FBUyxDQUFDLENBQUM3RSxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7TUFDMUMsSUFBTWdGLEtBQUssR0FBR0osUUFBUSxDQUFDSyxJQUFJLENBQUNDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQWdCO01BQ3REeEosTUFBTSxDQUFDc0osS0FBSyxDQUFDRyxNQUFNLENBQUNDLEtBQUssQ0FBQyxDQUFDdEksT0FBTyxDQUFDO1FBQUUxQyxFQUFFLEVBQUUsS0FBSztRQUFFSyxJQUFJLEVBQUU7TUFBVSxDQUFDLENBQUM7TUFFbEVxRCxRQUFRLENBQUN1SCxtQkFBbUIsQ0FBQywyQkFBMkIsRUFBRVQsUUFBUSxDQUFDO01BQ25FOUcsUUFBUSxDQUFDdUgsbUJBQW1CLENBQUMsb0JBQW9CLEVBQUVSLFNBQVMsQ0FBQztNQUM3RE4sR0FBRyxDQUFDZSxXQUFXLENBQUMsQ0FBQztNQUNqQnBHLElBQUksQ0FBQ3FHLGFBQWEsQ0FBQyxDQUFDO0lBQ3RCLENBQUMsQ0FBQztFQUNKLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==