@projectcor/maia-components 2.49.0-beta.1 → 2.49.1-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/App.js +44 -19
- package/lib/components/atoms/ActionableButton.spec.js +111 -0
- package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.spec.js +52 -0
- package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.utils.spec.js +11 -0
- package/lib/components/atoms/ApprovalBox/ApprovalBox.helpers.js +37 -0
- package/lib/components/atoms/ApprovalBox/ApprovalBox.helpers.spec.js +63 -0
- package/lib/components/atoms/ApprovalBox/ApprovalBox.js +3 -37
- package/lib/components/atoms/ApprovalBox/ApprovalBox.spec.js +183 -0
- package/lib/components/atoms/AttachmentCard/AttachmentCard.spec.js +123 -0
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.js +117 -0
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.spec.js +139 -0
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.js +31 -101
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.spec.js +385 -0
- package/lib/components/atoms/AttachmentCard/AttachmentCardImage.spec.js +78 -0
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.js +91 -0
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.spec.js +94 -0
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +49 -140
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.spec.js +396 -0
- package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.spec.js +80 -0
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.js +257 -0
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.spec.js +526 -0
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.js +53 -205
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.spec.js +137 -0
- package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.js +4 -0
- package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.spec.js +11 -0
- package/lib/components/atoms/AttachmentPreviewModal/WordPreview.js +2 -4
- package/lib/components/atoms/AttachmentPreviewModal/WordPreview.spec.js +77 -0
- package/lib/components/atoms/Backdrop/Backdrop.spec.js +28 -0
- package/lib/components/atoms/CardMenu/CardMenu.spec.js +56 -0
- package/lib/components/atoms/ChatClientSelector/ChatClientSelector.spec.js +67 -0
- package/lib/components/atoms/Checkbox/Checkbox.spec.js +27 -0
- package/lib/components/atoms/Chip/Chip.spec.js +82 -0
- package/lib/components/atoms/ChipLlm/ChipLlm.spec.js +26 -0
- package/lib/components/atoms/ClientSelector/ClientSelector.helpers.js +26 -0
- package/lib/components/atoms/ClientSelector/ClientSelector.helpers.spec.js +45 -0
- package/lib/components/atoms/ClientSelector/ClientSelector.js +12 -21
- package/lib/components/atoms/ClientSelector/ClientSelector.spec.js +133 -0
- package/lib/components/atoms/ContextMentionChip/ContextMentionChip.spec.js +29 -0
- package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.spec.js +46 -0
- package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.js +227 -0
- package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.spec.js +109 -0
- package/lib/components/atoms/ContextMentionChip/buildChipElement.js +15 -255
- package/lib/components/atoms/ContextMentionChip/buildChipElement.spec.js +81 -0
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.js +59 -0
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.spec.js +92 -0
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +12 -57
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.spec.js +319 -0
- package/lib/components/atoms/ContextMentionItem/ContextMentionItem.spec.js +107 -0
- package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.spec.js +136 -0
- package/lib/components/atoms/CopyToClipboard.spec.js +74 -0
- package/lib/components/atoms/EditableLabel/EditableLabel.spec.js +76 -0
- package/lib/components/atoms/EntitySelector/EntitySelector.spec.js +86 -0
- package/lib/components/atoms/Expand/Expand.spec.js +57 -0
- package/lib/components/atoms/Fade/Fade.spec.js +31 -0
- package/lib/components/atoms/FeedbackButton/FeedbackButton.spec.js +75 -0
- package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.spec.js +104 -0
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +3 -1
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.spec.js +91 -0
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +19 -7
- package/lib/components/atoms/HelpButton.spec.js +87 -0
- package/lib/components/atoms/ImagePreview/ImagePreview.spec.js +96 -0
- package/lib/components/atoms/ListMenuOption/ListMenuOption.spec.js +54 -0
- package/lib/components/atoms/LoadingFaqs/LoadingFaqs.spec.js +21 -0
- package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.spec.js +20 -0
- package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.spec.js +26 -0
- package/lib/components/atoms/LoadingText/LoadingText.spec.js +25 -0
- package/lib/components/atoms/MAIAButton/MAIAButton.spec.js +42 -0
- package/lib/components/atoms/MAIAError/MAIAError.spec.js +27 -0
- package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.js +74 -0
- package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.spec.js +113 -0
- package/lib/components/atoms/MAIAInput/MAIAInput.helpers.js +184 -0
- package/lib/components/atoms/MAIAInput/MAIAInput.helpers.spec.js +381 -0
- package/lib/components/atoms/MAIAInput/MAIAInput.js +130 -177
- package/lib/components/atoms/MAIAInput/MAIAInput.spec.js +641 -0
- package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.js +96 -0
- package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.spec.js +92 -0
- package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +40 -113
- package/lib/components/atoms/MAIAInput/MAIAInputEditor.spec.js +193 -0
- package/lib/components/atoms/MAIAInput/maiaInputLayout.spec.js +32 -0
- package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.spec.js +64 -0
- package/lib/components/atoms/MaiaWrapper/MaiaWrapper.spec.js +43 -0
- package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.spec.js +114 -0
- package/lib/components/atoms/MaiaWrapper/ModernMaiaWrapper.spec.js +51 -0
- package/lib/components/atoms/ModalClientAccess/ModalClientAccess.spec.js +48 -0
- package/lib/components/atoms/ModalProject/ModalProject.spec.js +66 -0
- package/lib/components/atoms/NextPageLoader.spec.js +37 -0
- package/lib/components/atoms/OnboardingModalButton/OnboardingModal.spec.js +20 -0
- package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.js +17 -0
- package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.spec.js +35 -0
- package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.js +3 -15
- package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.spec.js +47 -0
- package/lib/components/atoms/OptionAccessibility/OptionAccessibility.spec.js +146 -0
- package/lib/components/atoms/PrimaryButton.spec.js +42 -0
- package/lib/components/atoms/ProjectSelector/ProjectSelector.spec.js +69 -0
- package/lib/components/atoms/ReasoningBlock/ReasoningBlock.js +7 -2
- package/lib/components/atoms/ReasoningBlock/ReasoningBlock.spec.js +69 -0
- package/lib/components/atoms/ReasoningBlock/ReasoningBlock.styles.js +41 -24
- package/lib/components/atoms/ReasoningBlock/ReasoningSteps.js +27 -13
- package/lib/components/atoms/ReasoningBlock/ReasoningSteps.spec.js +59 -0
- package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.js +79 -52
- package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.spec.js +170 -0
- package/lib/components/atoms/ReasoningBlock/groupParallelSteps.js +9 -11
- package/lib/components/atoms/ReasoningBlock/groupParallelSteps.spec.js +199 -0
- package/lib/components/atoms/ReasoningBlock/reasoningLeading.js +6 -1
- package/lib/components/atoms/ReasoningBlock/reasoningLeading.spec.js +70 -0
- package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.js +36 -15
- package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.spec.js +120 -0
- package/lib/components/atoms/ReasoningBlock/reasoningMotion.js +8 -0
- package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.js +10 -0
- package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.spec.js +31 -0
- package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.js +52 -0
- package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.spec.js +90 -0
- package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.js +29 -0
- package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.spec.js +38 -0
- package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.spec.js +16 -0
- package/lib/components/atoms/SkillsDropdown/SkillsDropdown.spec.js +107 -0
- package/lib/components/atoms/SlashCommandChip/SlashCommandChip.spec.js +24 -0
- package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.helpers.js +101 -0
- package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.helpers.spec.js +71 -0
- package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.js +21 -77
- package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.spec.js +120 -0
- package/lib/components/atoms/Switch/Switch.spec.js +41 -0
- package/lib/components/atoms/TextArea/CustomTextArea.spec.js +52 -0
- package/lib/components/atoms/TextArea/TextArea.helpers.js +23 -0
- package/lib/components/atoms/TextArea/TextArea.helpers.spec.js +25 -0
- package/lib/components/atoms/TextArea/TextArea.js +11 -20
- package/lib/components/atoms/TextArea/TextArea.spec.js +126 -0
- package/lib/components/atoms/ThirdButton.spec.js +29 -0
- package/lib/components/atoms/VideoModal/VideoModal.spec.js +68 -0
- package/lib/components/atoms/WithAppCfg.spec.js +82 -0
- package/lib/components/index.js +2 -1
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.js +37 -0
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.spec.js +53 -0
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +6 -29
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.spec.js +742 -0
- package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.js +68 -0
- package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.spec.js +107 -0
- package/lib/components/molecules/AbmSection/AbmGeneralSection.js +17 -56
- package/lib/components/molecules/AbmSection/AbmGeneralSection.spec.js +256 -0
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.js +133 -0
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.spec.js +175 -0
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.js +31 -112
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.spec.js +318 -0
- package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.js +17 -0
- package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.spec.js +50 -0
- package/lib/components/molecules/AbmSection/AbmLoaderFiles.js +5 -15
- package/lib/components/molecules/AbmSection/AbmLoaderFiles.spec.js +94 -0
- package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.js +83 -0
- package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.styles.js +30 -0
- package/lib/components/molecules/AgentInputBlock/index.js +5 -0
- package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.js +52 -0
- package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.spec.js +76 -0
- package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.js +20 -0
- package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.spec.js +34 -0
- package/lib/components/molecules/AgentInputBlock/useAgentChangeModelAction.js +36 -0
- package/lib/components/molecules/ChatAIClientSelector/ChatAIClientSelector.spec.js +66 -0
- package/lib/components/molecules/ChatAIContent/ChatAIContent.js +7 -3
- package/lib/components/molecules/ChatAIContent/ChatAIContent.spec.js +145 -0
- package/lib/components/molecules/ChatAIHistory/ChatAIHistory.spec.js +204 -0
- package/lib/components/molecules/ChatAIHome/ChatAIHome.helpers.js +370 -0
- package/lib/components/molecules/ChatAIHome/ChatAIHome.helpers.spec.js +622 -0
- package/lib/components/molecules/ChatAIHome/ChatAIHome.js +285 -302
- package/lib/components/molecules/ChatAIHome/ChatAIHome.spec.js +264 -0
- package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.spec.js +86 -0
- package/lib/components/molecules/ChatAIHome/styles.js +85 -78
- package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.spec.js +104 -0
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.js +398 -0
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.spec.js +742 -0
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +235 -245
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.spec.js +541 -0
- package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.spec.js +46 -0
- package/lib/components/molecules/ChatAIMessages/newStyles.js +32 -35
- package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.js +522 -4
- package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.spec.js +1394 -0
- package/lib/components/molecules/ChatAIModal/ChatAIModal.js +250 -349
- package/lib/components/molecules/ChatAIModal/ChatAIModal.spec.js +1401 -0
- package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +2 -2
- package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.js +5 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.spec.js +33 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.js +3 -2
- package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.spec.js +116 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +15 -153
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.spec.js +134 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.styles.js +2 -26
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.js +49 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.spec.js +142 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +100 -93
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.spec.js +241 -0
- package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.spec.js +37 -0
- package/lib/components/molecules/ChatAIModal/constants.spec.js +16 -0
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.spec.js +22 -0
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/useFloatingPanelDragTilt.spec.js +67 -0
- package/lib/components/molecules/ChatAIModal/layout.spec.js +72 -0
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.helpers.js +39 -0
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.helpers.spec.js +93 -0
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.js +30 -33
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.spec.js +297 -0
- package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.helpers.js +41 -0
- package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.helpers.spec.js +62 -0
- package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.js +9 -35
- package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.spec.js +221 -0
- package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.spec.js +66 -0
- package/lib/components/molecules/ChatFooter/ChatFooter.js +10 -4
- package/lib/components/molecules/ChatFooter/ChatFooter.spec.js +369 -0
- package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.spec.js +10 -0
- package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.js +48 -0
- package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.spec.js +104 -0
- package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +9 -44
- package/lib/components/molecules/ChatFooter/ChatFooterFaqs.spec.js +139 -0
- package/lib/components/molecules/ContextMentionInput/ContextMentionInput.spec.js +84 -0
- package/lib/components/molecules/MessageFeedback/MessageFeedback.spec.js +116 -0
- package/lib/components/molecules/ProjectSummaryChat/ProjectSummaryChat.spec.js +126 -0
- package/lib/components/molecules/ProjectSummaryConfig/ProjectSummaryConfig.spec.js +115 -0
- package/lib/components/molecules/ProjectSummaryContent/ProjectSummaryContent.spec.js +79 -0
- package/lib/components/molecules/ProjectSummaryModal/ProjectSummaryModal.spec.js +37 -0
- package/lib/components/molecules/Sidebar/Sidebar.helpers.js +43 -0
- package/lib/components/molecules/Sidebar/Sidebar.helpers.spec.js +119 -0
- package/lib/components/molecules/Sidebar/Sidebar.js +65 -44
- package/lib/components/molecules/Sidebar/Sidebar.spec.js +464 -0
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.js +512 -0
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.spec.js +1067 -0
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +310 -644
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.spec.js +1236 -0
- package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.spec.js +112 -0
- package/lib/components/organisms/AbmSkillModal/AbmSkillModal.helpers.js +37 -0
- package/lib/components/organisms/AbmSkillModal/AbmSkillModal.helpers.spec.js +77 -0
- package/lib/components/organisms/AbmSkillModal/AbmSkillModal.js +13 -25
- package/lib/components/organisms/AbmSkillModal/AbmSkillModal.spec.js +503 -0
- package/lib/components/organisms/ChatAI/ChatAI.spec.js +174 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPage.js +525 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPage.spec.js +246 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPage.styles.js +16 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.js +253 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.spec.js +139 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.styles.js +13 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPageHome.js +275 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPageHome.spec.js +275 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPageHome.styles.js +195 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.js +94 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.spec.js +69 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCards.skeleton.js +38 -0
- package/lib/components/organisms/ChatAIPage/getDaypart.js +9 -0
- package/lib/components/organisms/ChatAIPage/getDaypart.spec.js +19 -0
- package/lib/components/organisms/ChatAIPage/index.js +3 -0
- package/lib/components/organisms/ClientAIButton/ClientAIButton.spec.js +53 -0
- package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.spec.js +59 -0
- package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.spec.js +79 -0
- package/lib/components/organisms/EditQuestionModal/EditQuestionModal.spec.js +86 -0
- package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.spec.js +49 -0
- package/lib/components/organisms/ProjectAIButton/ProjectAIButton.spec.js +67 -0
- package/lib/components/organisms/ProjectSummary/ProjectSummary.spec.js +117 -0
- package/lib/components/organisms/SnackBar/Snackbar.spec.js +66 -0
- package/lib/components/organisms/SourcesInformation/SourceItem.spec.js +19 -0
- package/lib/components/organisms/SourcesInformation/SourcesInformationModal.spec.js +52 -0
- package/lib/constants/formatExtensions.js +7 -8
- package/lib/constants/formatExtensions.spec.js +14 -0
- package/lib/constants/maiaExternalConnectorsAccess.spec.js +29 -0
- package/lib/constants/maiaFeatureAccess.spec.js +30 -0
- package/lib/constants/maiaHourAgentAccess.spec.js +30 -0
- package/lib/constants/maiaTaskPanelAccess.spec.js +41 -0
- package/lib/constants/permissions/clientRoleAccess.spec.js +65 -0
- package/lib/constants/permissions/index.js +2 -2
- package/lib/constants/permissions/utils.js +4 -1
- package/lib/constants/permissions/utils.spec.js +128 -0
- package/lib/constants/plannerSyncEvents.spec.js +31 -0
- package/lib/constants/taskUrls.spec.js +9 -0
- package/lib/dev/DevMaiaPage.js +30 -0
- package/lib/dev/DevReasoningTimeline.js +75 -86
- package/lib/dev/Providers.js +5 -3
- package/lib/hooks/frequentlyUsedActionsCache.js +17 -0
- package/lib/hooks/frequentlyUsedActionsCache.spec.js +25 -0
- package/lib/hooks/useAccessClient/useAccessClient.spec.js +149 -0
- package/lib/hooks/useAgentModel/useAgentModel.spec.js +83 -0
- package/lib/hooks/useAgentModel/useCreateAgent.helpers.js +144 -0
- package/lib/hooks/useAgentModel/useCreateAgent.helpers.spec.js +268 -0
- package/lib/hooks/useAgentModel/useCreateAgent.js +38 -102
- package/lib/hooks/useAgentModel/useCreateAgent.spec.js +314 -0
- package/lib/hooks/useAgentModel/useDeleteAgent.spec.js +183 -0
- package/lib/hooks/useAgentModel/useUpdateAgent.spec.js +374 -0
- package/lib/hooks/useAgentSuggestions.spec.js +89 -0
- package/lib/hooks/useCaretPosition.spec.js +58 -0
- package/lib/hooks/useChatManager/useChatManager.helpers.js +902 -0
- package/lib/hooks/useChatManager/useChatManager.helpers.spec.js +2027 -0
- package/lib/hooks/useChatManager/useChatManager.js +272 -745
- package/lib/hooks/useChatManager/useChatManager.spec.js +2409 -0
- package/lib/hooks/useChatMessages/useChatMessages.helpers.js +365 -0
- package/lib/hooks/useChatMessages/useChatMessages.helpers.spec.js +491 -0
- package/lib/hooks/useChatMessages/useChatMessages.js +59 -285
- package/lib/hooks/useChatMessages/useChatMessages.spec.js +729 -0
- package/lib/hooks/useChats/useChats.spec.js +208 -0
- package/lib/hooks/useClientSearch.helpers.js +36 -0
- package/lib/hooks/useClientSearch.helpers.spec.js +52 -0
- package/lib/hooks/useClientSearch.js +4 -32
- package/lib/hooks/useClientSearch.spec.js +86 -0
- package/lib/hooks/useContextMentions.helpers.js +212 -0
- package/lib/hooks/useContextMentions.helpers.spec.js +267 -0
- package/lib/hooks/useContextMentions.js +5 -223
- package/lib/hooks/useContextMentions.spec.js +338 -0
- package/lib/hooks/useContextMentions.types.js +2 -0
- package/lib/hooks/useContextPinPopover.helpers.js +95 -0
- package/lib/hooks/useContextPinPopover.helpers.spec.js +183 -0
- package/lib/hooks/useContextPinPopover.js +16 -75
- package/lib/hooks/useContextPinPopover.spec.js +159 -0
- package/lib/hooks/useContinueLegacyContextInNewChat/index.js +2 -0
- package/lib/hooks/useContinueLegacyContextInNewChat/useContinueLegacyContextInNewChat.js +93 -0
- package/lib/hooks/useDebounce.spec.js +42 -0
- package/lib/hooks/useEntitySearch.helpers.js +407 -0
- package/lib/hooks/useEntitySearch.helpers.spec.js +723 -0
- package/lib/hooks/useEntitySearch.js +52 -436
- package/lib/hooks/useEntitySearch.spec.js +718 -0
- package/lib/hooks/useEvent.spec.js +45 -0
- package/lib/hooks/useFrequentlyAskedQuestions.spec.js +222 -0
- package/lib/hooks/useFrequentlyUsedActions.js +60 -22
- package/lib/hooks/useFrequentlyUsedActions.spec.js +135 -0
- package/lib/hooks/useIsMaiaPageRoute.js +26 -0
- package/lib/hooks/useIsMaiaPageRoute.spec.js +26 -0
- package/lib/hooks/useKnowledge/deleteKnowledge.spec.js +122 -0
- package/lib/hooks/useKnowledge/downloadKnowledge.spec.js +148 -0
- package/lib/hooks/useKnowledge/saveKnowledge.spec.js +104 -0
- package/lib/hooks/useKnowledge/useKnowledgeOperations.spec.js +178 -0
- package/lib/hooks/useMaiaChatSessionMeta/index.js +2 -0
- package/lib/hooks/useMaiaChatSessionMeta/useMaiaChatSessionMeta.js +24 -0
- package/lib/hooks/useMentionAllowedTypes.spec.js +89 -0
- package/lib/hooks/useMentionPopover.helpers.js +41 -0
- package/lib/hooks/useMentionPopover.helpers.spec.js +100 -0
- package/lib/hooks/useMentionPopover.js +9 -35
- package/lib/hooks/useMentionPopover.spec.js +392 -0
- package/lib/hooks/useMinimizedPillBottomOffset.helpers.js +47 -0
- package/lib/hooks/useMinimizedPillBottomOffset.helpers.spec.js +176 -0
- package/lib/hooks/useMinimizedPillBottomOffset.js +15 -45
- package/lib/hooks/useMinimizedPillBottomOffset.spec.js +89 -0
- package/lib/hooks/useMinimizedPillNoveltyDot/useMinimizedPillNoveltyDot.spec.js +67 -0
- package/lib/hooks/useModal/useModal.spec.js +73 -0
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.helpers.js +86 -0
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.helpers.spec.js +138 -0
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +8 -82
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.spec.js +417 -0
- package/lib/hooks/useProjectSearch.helpers.js +61 -0
- package/lib/hooks/useProjectSearch.helpers.spec.js +89 -0
- package/lib/hooks/useProjectSearch.js +4 -58
- package/lib/hooks/useProjectSearch.spec.js +91 -0
- package/lib/hooks/useProjectSummary.spec.js +193 -0
- package/lib/hooks/useProjectSummaryConfig.helpers.js +62 -0
- package/lib/hooks/useProjectSummaryConfig.helpers.spec.js +151 -0
- package/lib/hooks/useProjectSummaryConfig.js +14 -52
- package/lib/hooks/useProjectSummaryConfig.spec.js +133 -0
- package/lib/hooks/useReasoningTrace/reasoningStore.js +8 -39
- package/lib/hooks/useReasoningTrace/reasoningStore.spec.js +112 -0
- package/lib/hooks/useRecentClientsSearch.helpers.js +33 -0
- package/lib/hooks/useRecentClientsSearch.helpers.spec.js +33 -0
- package/lib/hooks/useRecentClientsSearch.js +4 -32
- package/lib/hooks/useRecentClientsSearch.spec.js +85 -0
- package/lib/hooks/useRecentContexts.spec.js +139 -0
- package/lib/hooks/useResize.spec.js +37 -0
- package/lib/hooks/useSkillsCatalog.spec.js +88 -0
- package/lib/hooks/useSlashCommands.spec.js +139 -0
- package/lib/hooks/useSmoothStreamText/useSmoothStreamText.spec.js +101 -0
- package/lib/hooks/useSnackBarManager/useSnackBarManager.spec.js +33 -0
- package/lib/hooks/useStreamResponse.spec.js +199 -0
- package/lib/hooks/useT.spec.js +20 -0
- package/lib/hooks/useToggle.spec.js +33 -0
- package/lib/hooks/useToggleFavorite/useToggleFavorite.spec.js +171 -0
- package/lib/index.js +5 -2
- package/lib/lang/br/index.js +26 -7
- package/lib/lang/en/index.js +26 -7
- package/lib/lang/es/index.js +26 -7
- package/lib/lang/fr/index.js +26 -7
- package/lib/services/appcues.spec.js +37 -0
- package/lib/services/maia/Access/updateAccess.spec.js +137 -0
- package/lib/services/maia/Actions/getFrequentlyUsedActions.js +1 -1
- package/lib/services/maia/Actions/getFrequentlyUsedActions.spec.js +56 -0
- package/lib/services/maia/Actions/getSlashCommands.spec.js +91 -0
- package/lib/services/maia/Agents/connectors.spec.js +496 -0
- package/lib/services/maia/Agents/createAgent.spec.js +55 -0
- package/lib/services/maia/Agents/deleteAgent.spec.js +57 -0
- package/lib/services/maia/Agents/fetchAgentDetail.spec.js +108 -0
- package/lib/services/maia/Agents/getAgentById.spec.js +190 -0
- package/lib/services/maia/Agents/getAgentModels.spec.js +190 -0
- package/lib/services/maia/Agents/getAgentSuggestions.spec.js +89 -0
- package/lib/services/maia/Agents/getAgents.helpers.js +241 -0
- package/lib/services/maia/Agents/getAgents.helpers.spec.js +325 -0
- package/lib/services/maia/Agents/getAgents.js +90 -282
- package/lib/services/maia/Agents/getAgents.spec.js +1135 -0
- package/lib/services/maia/Agents/setAgentToolGroups.spec.js +45 -0
- package/lib/services/maia/Agents/toggleFavorite.spec.js +59 -0
- package/lib/services/maia/Agents/updateAgent.spec.js +48 -0
- package/lib/services/maia/Chats/deleteChat.spec.js +31 -0
- package/lib/services/maia/Chats/getChatMessages.spec.js +150 -0
- package/lib/services/maia/Chats/getChatsByUserId.spec.js +149 -0
- package/lib/services/maia/Chats/markSessionAsRead.spec.js +30 -0
- package/lib/services/maia/Chats/patchChat.spec.js +41 -0
- package/lib/services/maia/Chats/wasHelpfulChat.spec.js +28 -0
- package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.spec.js +58 -0
- package/lib/services/maia/Knowledge/delete.spec.js +45 -0
- package/lib/services/maia/Knowledge/download.spec.js +78 -0
- package/lib/services/maia/Knowledge/save.spec.js +58 -0
- package/lib/services/maia/Orchestrator/orchestrator.helpers.js +130 -0
- package/lib/services/maia/Orchestrator/orchestrator.helpers.spec.js +225 -0
- package/lib/services/maia/Orchestrator/orchestrator.js +38 -121
- package/lib/services/maia/Orchestrator/orchestrator.spec.js +181 -0
- package/lib/services/maia/RecentClients/getRecentClients.spec.js +52 -0
- package/lib/services/maia/RecentContexts/getRecentContexts.spec.js +103 -0
- package/lib/services/maia/RecentProjects/getRecentProjects.spec.js +82 -0
- package/lib/services/maia/RecentTasks/getRecentTasks.spec.js +63 -0
- package/lib/services/maia/RecentUsers/getRecentUsers.spec.js +82 -0
- package/lib/services/maia/Skills/createSkill.spec.js +68 -0
- package/lib/services/maia/Skills/deleteSkill.spec.js +42 -0
- package/lib/services/maia/Skills/generateSkill.spec.js +48 -0
- package/lib/services/maia/Skills/getSkills.spec.js +152 -0
- package/lib/services/maia/Skills/updateSkill.spec.js +62 -0
- package/lib/services/maia/client.spec.js +56 -0
- package/lib/services/utils/fetchCOR.spec.js +211 -0
- package/lib/services/utils/getCookie.spec.js +20 -0
- package/lib/services/utils/mapChatMessages.helpers.js +223 -0
- package/lib/services/utils/mapChatMessages.helpers.spec.js +336 -0
- package/lib/services/utils/mapChatMessages.js +25 -254
- package/lib/services/utils/mapChatMessages.spec.js +254 -0
- package/lib/store/chatsSidebarOptimistic.spec.js +145 -0
- package/lib/store/maiaLastChatPersistence.spec.js +22 -0
- package/lib/store/maiaPanelSessionPersistence.spec.js +62 -0
- package/lib/store/sessions/sessionNotificationSound.spec.js +145 -0
- package/lib/store/sessions/sessionNotifications.helpers.js +45 -0
- package/lib/store/sessions/sessionNotifications.helpers.spec.js +63 -0
- package/lib/store/sessions/sessionNotifications.js +35 -41
- package/lib/store/sessions/sessionNotifications.spec.js +106 -0
- package/lib/store/sessions/sessionStreamManager.helpers.js +134 -0
- package/lib/store/sessions/sessionStreamManager.helpers.spec.js +177 -0
- package/lib/store/sessions/sessionStreamManager.js +209 -277
- package/lib/store/sessions/sessionStreamManager.spec.js +939 -0
- package/lib/store/sessions/sessions.types.spec.js +16 -0
- package/lib/store/sessions/useSessionsStore.spec.js +135 -0
- package/lib/store/useChatsStore.spec.js +619 -0
- package/lib/store/useFaqsStore.spec.js +57 -0
- package/lib/styles/cascade.js +29 -3
- package/lib/styles/transitions.js +3 -1
- package/lib/test/mockSseStream.js +121 -0
- package/lib/test/streamdownCodeMock.js +6 -0
- package/lib/test/streamdownMock.js +12 -0
- package/lib/types/Chat.js +1 -1
- package/lib/types/agentModal.js +1 -1
- package/lib/types/global.d.js +1 -1
- package/lib/types/reasoning.js +1 -1
- package/lib/utils/actionCategoryMap.spec.js +18 -0
- package/lib/utils/agentDisplayName.spec.js +48 -0
- package/lib/utils/autoApproveStorage.spec.js +25 -0
- package/lib/utils/chatInputFiles.spec.js +39 -0
- package/lib/utils/contextMentionIcons.spec.js +41 -0
- package/lib/utils/contextMentionLabel.spec.js +13 -0
- package/lib/utils/contextMentionTriggers.spec.js +44 -0
- package/lib/utils/contextMentionTypeLabel.spec.js +14 -0
- package/lib/utils/corConnectorMentionTypes.spec.js +23 -0
- package/lib/utils/entityLinkRender.spec.js +72 -0
- package/lib/utils/fileDownloadHelper.spec.js +67 -0
- package/lib/utils/formatQuickActionMessage.spec.js +27 -0
- package/lib/utils/formatUnreadCount.spec.js +12 -0
- package/lib/utils/getUnitFileSize.spec.js +18 -0
- package/lib/utils/hitlAnalytics.spec.js +136 -0
- package/lib/utils/hoursPlannerQuickActionType.js +74 -1
- package/lib/utils/hoursPlannerQuickActionType.spec.js +64 -0
- package/lib/utils/imagePreprocessor.helpers.js +28 -0
- package/lib/utils/imagePreprocessor.helpers.spec.js +28 -0
- package/lib/utils/imagePreprocessor.js +12 -37
- package/lib/utils/imagePreprocessor.spec.js +112 -0
- package/lib/utils/maiaPageRoute.js +24 -0
- package/lib/utils/maiaPageRoute.spec.js +23 -0
- package/lib/utils/mapBackendLang.spec.js +19 -0
- package/lib/utils/navigateContextEntity.spec.js +50 -0
- package/lib/utils/normalizeAgentConnectors.spec.js +98 -0
- package/lib/utils/openTaskInCorPanel.spec.js +43 -0
- package/lib/utils/orchestratorSubagents.spec.js +32 -0
- package/lib/utils/reasoningMappers.spec.js +103 -0
- package/lib/utils/recentContextsHomeLimit.spec.js +32 -0
- package/lib/utils/renderContextMentions.helpers.js +110 -0
- package/lib/utils/renderContextMentions.helpers.spec.js +87 -0
- package/lib/utils/renderContextMentions.js +4 -110
- package/lib/utils/renderContextMentions.spec.js +268 -0
- package/lib/utils/retryCompletion.spec.js +181 -0
- package/lib/utils/skillContentSize.spec.js +13 -0
- package/lib/utils/slashCommandMarker.spec.js +43 -0
- package/lib/utils/sortManagerHoursHomeFuas.spec.js +51 -0
- package/lib/utils/sseStreamContent.spec.js +31 -0
- package/lib/utils/streamActivityMessages.helpers.js +223 -0
- package/lib/utils/streamActivityMessages.helpers.spec.js +84 -0
- package/lib/utils/streamActivityMessages.js +33 -238
- package/lib/utils/streamActivityMessages.spec.js +336 -0
- package/lib/utils/validateTrimmedFields.spec.js +26 -0
- package/package.json +2 -2
- package/README.md +0 -2
- package/lib/components/atoms/ContextCompactedNotice/ContextCompactedNotice.js +0 -53
- package/lib/components/atoms/ContextCompactedNotice/ContextCompactedNotice.styles.js +0 -8
- package/lib/components/atoms/ContextCompactedNotice/index.js +0 -2
- package/lib/types/contextCompaction.js +0 -48
- package/lib/types/jest-dom.d.js +0 -2
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
-
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
3
2
|
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
|
|
3
|
+
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
4
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
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 _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
7
6
|
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
|
|
8
7
|
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
9
8
|
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
@@ -14,13 +13,14 @@ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length)
|
|
|
14
13
|
/* eslint-disable no-constant-condition */
|
|
15
14
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
16
15
|
import maia from '../../services/maia';
|
|
17
|
-
import { getInitialStreamActivity,
|
|
16
|
+
import { getInitialStreamActivity, getThinkingStreamActivity, getUsingSkillActivity, getWritingStreamActivity, resolveInitialHitlStreamActivity } from '../../utils/streamActivityMessages';
|
|
18
17
|
import { isCompleteLikeSsePayload, mergeStreamChunk } from '../../utils/sseStreamContent';
|
|
19
18
|
import { reasoningStore } from '../../hooks/useReasoningTrace';
|
|
20
19
|
import { sessionStreamingText } from './sessionStreamingText';
|
|
21
20
|
import { useSessionsStore } from './useSessionsStore';
|
|
22
21
|
import { ensureSessionNotificationsInitialized } from './sessionNotifications';
|
|
23
22
|
import { sessionHitlContext } from './sessionHitlContext';
|
|
23
|
+
import { buildSessionFinishPayload, isAgentTransferNode, isApprovalPreApproved, isRetryTurnNotFoundResponse, parseSseBlock, patchMetaAgentFields, resolveNodeStreamMessage, resolveReasoningStepTool, resolveReasoningStepType, resolveStartStreamGuard, resolveStreamTextChunk, resolveThinkingDelta, shouldAbortSessionStreamOnStop, shouldApplyReasoningStepIndex, shouldAppendThinkingStep, shouldResumeHitlAfterPreApproval, shouldSetIdleOnSilentAbort, shouldShowReasoningToolActivity, splitSseBuffer } from './sessionStreamManager.helpers';
|
|
24
24
|
|
|
25
25
|
/** Compatible con el `t` de i18next (uso de una sola key). */
|
|
26
26
|
|
|
@@ -42,13 +42,12 @@ var getActiveStreamCount = function getActiveStreamCount() {
|
|
|
42
42
|
};
|
|
43
43
|
var parseSessionSSE = /*#__PURE__*/function () {
|
|
44
44
|
var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(response, active, params) {
|
|
45
|
-
var
|
|
46
|
-
var sessionId, placeholderId, callbacks, t,
|
|
45
|
+
var _response$body, _data$error, _data$error2, _callbacks$onError, _data$error3, _data$error4;
|
|
46
|
+
var sessionId, placeholderId, callbacks, t, pendingContent, throttleTimer, flushToStores, emitThrottled, flushPending, reader, decoder, buffer, accumulatedContent, hasStartedWriting, isUsingSkill, setThinkingActivity, ensureWritingStarted, applyStreamChunk, clearStreamLikeAnswerReset, applyStreamComplete, _yield$reader$read, done, value, _splitSseBuffer, blocks, remainder, _iterator, _step, line, parsedBlock, eventType, dataStr, data, _resolveThinkingDelta, index, thinkingDelta, stepTool, stepType, _data$args, stepIndex, chunk, _chunk, _callbacks$onApproval, isPreApproved, _ref2, _t, _t2, _t3;
|
|
47
47
|
return _regeneratorRuntime.wrap(function (_context) {
|
|
48
48
|
while (1) switch (_context.prev = _context.next) {
|
|
49
49
|
case 0:
|
|
50
50
|
sessionId = params.sessionId, placeholderId = params.placeholderId, callbacks = params.callbacks, t = params.t;
|
|
51
|
-
hitlExecutionContext = (_params$hitlExecution = params.hitlExecutionContext) !== null && _params$hitlExecution !== void 0 ? _params$hitlExecution : sessionHitlContext.get(sessionId);
|
|
52
51
|
pendingContent = null;
|
|
53
52
|
throttleTimer = null;
|
|
54
53
|
flushToStores = function flushToStores(content) {
|
|
@@ -92,17 +91,39 @@ var parseSessionSSE = /*#__PURE__*/function () {
|
|
|
92
91
|
hasStartedWriting = false; // "Usando Skill" queda visible mientras el modelo piensa con la skill cargada;
|
|
93
92
|
// los deltas de `thinking` no lo pisan hasta la próxima acción o el primer token.
|
|
94
93
|
isUsingSkill = false;
|
|
95
|
-
|
|
96
|
-
var
|
|
97
|
-
|
|
98
|
-
|
|
94
|
+
setThinkingActivity = function setThinkingActivity() {
|
|
95
|
+
var _store$getMeta;
|
|
96
|
+
var thinkingActivity = getThinkingStreamActivity(t);
|
|
97
|
+
var current = (_store$getMeta = store().getMeta(sessionId)) === null || _store$getMeta === void 0 ? void 0 : _store$getMeta.streamActivity;
|
|
98
|
+
if ((current === null || current === void 0 ? void 0 : current.phase) === 'thinking' && current.message === thinkingActivity.message) return;
|
|
99
99
|
store().patchMeta(sessionId, {
|
|
100
|
-
isLoading: true
|
|
101
|
-
isWriting: true
|
|
100
|
+
isLoading: true
|
|
102
101
|
});
|
|
103
|
-
store().setStatus(sessionId, '
|
|
104
|
-
store().setActivity(sessionId,
|
|
105
|
-
|
|
102
|
+
store().setStatus(sessionId, 'thinking');
|
|
103
|
+
store().setActivity(sessionId, thinkingActivity);
|
|
104
|
+
};
|
|
105
|
+
ensureWritingStarted = function ensureWritingStarted() {
|
|
106
|
+
var _store$getMeta2;
|
|
107
|
+
// Cualquier token corta "Usando Skill": el indicador vuelve a alternar pensando / escribiendo.
|
|
108
|
+
isUsingSkill = false;
|
|
109
|
+
if (!hasStartedWriting) {
|
|
110
|
+
var _callbacks$onStartWri;
|
|
111
|
+
hasStartedWriting = true;
|
|
112
|
+
store().patchMeta(sessionId, {
|
|
113
|
+
isLoading: true,
|
|
114
|
+
isWriting: true
|
|
115
|
+
});
|
|
116
|
+
(_callbacks$onStartWri = callbacks.onStartWriting) === null || _callbacks$onStartWri === void 0 || _callbacks$onStartWri.call(callbacks);
|
|
117
|
+
}
|
|
118
|
+
var current = (_store$getMeta2 = store().getMeta(sessionId)) === null || _store$getMeta2 === void 0 ? void 0 : _store$getMeta2.streamActivity;
|
|
119
|
+
if ((current === null || current === void 0 ? void 0 : current.phase) !== 'writing') {
|
|
120
|
+
store().patchMeta(sessionId, {
|
|
121
|
+
isLoading: true,
|
|
122
|
+
isWriting: true
|
|
123
|
+
});
|
|
124
|
+
store().setStatus(sessionId, 'writing');
|
|
125
|
+
store().setActivity(sessionId, getWritingStreamActivity(t));
|
|
126
|
+
}
|
|
106
127
|
};
|
|
107
128
|
applyStreamChunk = function applyStreamChunk(chunk) {
|
|
108
129
|
if (!chunk) return;
|
|
@@ -121,23 +142,9 @@ var parseSessionSSE = /*#__PURE__*/function () {
|
|
|
121
142
|
reasoningStore.markAnswerReset(placeholderId);
|
|
122
143
|
};
|
|
123
144
|
applyStreamComplete = function applyStreamComplete(payload) {
|
|
124
|
-
var
|
|
125
|
-
var
|
|
126
|
-
|
|
127
|
-
var memorySessionId = payload.memory_session_id || '';
|
|
128
|
-
var attachments = Array.isArray(payload.attachments) ? payload.attachments : null;
|
|
129
|
-
var suggestions = null;
|
|
130
|
-
if (Array.isArray(payload.suggest_reply)) {
|
|
131
|
-
suggestions = payload.suggest_reply;
|
|
132
|
-
} else if (Array.isArray(payload.suggestions)) {
|
|
133
|
-
suggestions = payload.suggestions;
|
|
134
|
-
}
|
|
135
|
-
var agentIdRaw = (_payload$agent_id = payload.agent_id) !== null && _payload$agent_id !== void 0 ? _payload$agent_id : payload.agentId;
|
|
136
|
-
var completedAgentId = agentIdRaw != null && String(agentIdRaw).trim() !== '' ? String(agentIdRaw).trim() : null;
|
|
137
|
-
var subagentRaw = payload.subagent;
|
|
138
|
-
var resolvedContext = (_subagentRaw$resolved = subagentRaw === null || subagentRaw === void 0 ? void 0 : subagentRaw.resolved_context) !== null && _subagentRaw$resolved !== void 0 ? _subagentRaw$resolved : null;
|
|
139
|
-
var reasoning = (_ref2 = payload.reasoning) !== null && _ref2 !== void 0 ? _ref2 : null;
|
|
140
|
-
reasoningStore.finish(placeholderId, reasoning);
|
|
145
|
+
var _callbacks$onFinishSt;
|
|
146
|
+
var finishPayload = buildSessionFinishPayload(payload, accumulatedContent);
|
|
147
|
+
reasoningStore.finish(placeholderId, finishPayload.reasoning);
|
|
141
148
|
flushPending();
|
|
142
149
|
store().patchMeta(sessionId, {
|
|
143
150
|
isLoading: false,
|
|
@@ -145,16 +152,6 @@ var parseSessionSSE = /*#__PURE__*/function () {
|
|
|
145
152
|
});
|
|
146
153
|
store().setActivity(sessionId, null);
|
|
147
154
|
store().setStatus(sessionId, 'complete');
|
|
148
|
-
var finishPayload = {
|
|
149
|
-
content: finalContent,
|
|
150
|
-
sources: sources,
|
|
151
|
-
memorySessionId: memorySessionId,
|
|
152
|
-
attachments: attachments,
|
|
153
|
-
suggestions: suggestions,
|
|
154
|
-
completedAgentId: completedAgentId,
|
|
155
|
-
resolvedContext: resolvedContext,
|
|
156
|
-
reasoning: reasoning
|
|
157
|
-
};
|
|
158
155
|
(_callbacks$onFinishSt = callbacks.onFinishStream) === null || _callbacks$onFinishSt === void 0 || _callbacks$onFinishSt.call(callbacks, finishPayload);
|
|
159
156
|
|
|
160
157
|
// El texto en vivo NO se limpia acá a propósito. El placeholder se va con el
|
|
@@ -168,15 +165,15 @@ var parseSessionSSE = /*#__PURE__*/function () {
|
|
|
168
165
|
_context.prev = 2;
|
|
169
166
|
case 3:
|
|
170
167
|
if (!true) {
|
|
171
|
-
_context.next =
|
|
168
|
+
_context.next = 30;
|
|
172
169
|
break;
|
|
173
170
|
}
|
|
174
|
-
if (!active.isStopped) {
|
|
171
|
+
if (!shouldAbortSessionStreamOnStop(active.isStopped)) {
|
|
175
172
|
_context.next = 4;
|
|
176
173
|
break;
|
|
177
174
|
}
|
|
178
175
|
reader.cancel();
|
|
179
|
-
return _context.abrupt("continue",
|
|
176
|
+
return _context.abrupt("continue", 30);
|
|
180
177
|
case 4:
|
|
181
178
|
_context.next = 5;
|
|
182
179
|
return reader.read();
|
|
@@ -188,68 +185,53 @@ var parseSessionSSE = /*#__PURE__*/function () {
|
|
|
188
185
|
_context.next = 6;
|
|
189
186
|
break;
|
|
190
187
|
}
|
|
191
|
-
return _context.abrupt("continue",
|
|
188
|
+
return _context.abrupt("continue", 30);
|
|
192
189
|
case 6:
|
|
193
|
-
if (!active.isStopped) {
|
|
190
|
+
if (!shouldAbortSessionStreamOnStop(active.isStopped)) {
|
|
194
191
|
_context.next = 7;
|
|
195
192
|
break;
|
|
196
193
|
}
|
|
197
194
|
reader.cancel();
|
|
198
|
-
return _context.abrupt("continue",
|
|
195
|
+
return _context.abrupt("continue", 30);
|
|
199
196
|
case 7:
|
|
200
197
|
buffer += decoder.decode(value, {
|
|
201
198
|
stream: true
|
|
202
199
|
});
|
|
203
|
-
|
|
204
|
-
buffer =
|
|
205
|
-
_iterator = _createForOfIteratorHelper(
|
|
200
|
+
_splitSseBuffer = splitSseBuffer(buffer), blocks = _splitSseBuffer.blocks, remainder = _splitSseBuffer.remainder;
|
|
201
|
+
buffer = remainder;
|
|
202
|
+
_iterator = _createForOfIteratorHelper(blocks);
|
|
206
203
|
_context.prev = 8;
|
|
207
204
|
_iterator.s();
|
|
208
205
|
case 9:
|
|
209
206
|
if ((_step = _iterator.n()).done) {
|
|
210
|
-
_context.next =
|
|
207
|
+
_context.next = 26;
|
|
211
208
|
break;
|
|
212
209
|
}
|
|
213
210
|
line = _step.value;
|
|
214
|
-
|
|
211
|
+
parsedBlock = parseSseBlock(line);
|
|
212
|
+
if (parsedBlock) {
|
|
215
213
|
_context.next = 10;
|
|
216
214
|
break;
|
|
217
215
|
}
|
|
218
|
-
return _context.abrupt("continue",
|
|
216
|
+
return _context.abrupt("continue", 25);
|
|
219
217
|
case 10:
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
_context.next = 11;
|
|
223
|
-
break;
|
|
224
|
-
}
|
|
225
|
-
return _context.abrupt("continue", 27);
|
|
226
|
-
case 11:
|
|
227
|
-
eventType = eventLine.replace('event: ', '').trim();
|
|
228
|
-
dataStr = dataLine.replace('data: ', '').trim();
|
|
229
|
-
_context.prev = 12;
|
|
218
|
+
eventType = parsedBlock.eventType, dataStr = parsedBlock.dataStr;
|
|
219
|
+
_context.prev = 11;
|
|
230
220
|
data = JSON.parse(dataStr);
|
|
231
221
|
_t = eventType;
|
|
232
|
-
_context.next = _t === 'thinking' ?
|
|
222
|
+
_context.next = _t === 'thinking' ? 12 : _t === 'using_skill' ? 13 : _t === 'answer_reset' ? 14 : _t === 'reasoning_step' ? 15 : _t === 'token' ? 16 : _t === 'content' ? 17 : _t === 'node' ? 18 : _t === 'complete' ? 19 : _t === 'approval_required' ? 20 : _t === 'error' ? 21 : 22;
|
|
233
223
|
break;
|
|
234
|
-
case
|
|
235
|
-
|
|
236
|
-
if (
|
|
237
|
-
reasoningStore.appendThinking(placeholderId,
|
|
224
|
+
case 12:
|
|
225
|
+
_resolveThinkingDelta = resolveThinkingDelta(data), index = _resolveThinkingDelta.index, thinkingDelta = _resolveThinkingDelta.delta;
|
|
226
|
+
if (shouldAppendThinkingStep(index, thinkingDelta)) {
|
|
227
|
+
reasoningStore.appendThinking(placeholderId, index, thinkingDelta);
|
|
238
228
|
}
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
});
|
|
243
|
-
store().setStatus(sessionId, 'thinking');
|
|
244
|
-
if (!isUsingSkill) {
|
|
245
|
-
store().setActivity(sessionId, {
|
|
246
|
-
phase: 'thinking',
|
|
247
|
-
message: getThinkingLoadingMessage(0, t)
|
|
248
|
-
});
|
|
249
|
-
}
|
|
229
|
+
// Mientras dura "Usando Skill" los deltas de thinking no pisan la actividad.
|
|
230
|
+
if (!isUsingSkill) {
|
|
231
|
+
setThinkingActivity();
|
|
250
232
|
}
|
|
251
|
-
return _context.abrupt("continue",
|
|
252
|
-
case
|
|
233
|
+
return _context.abrupt("continue", 23);
|
|
234
|
+
case 13:
|
|
253
235
|
if (!hasStartedWriting) {
|
|
254
236
|
isUsingSkill = true;
|
|
255
237
|
store().patchMeta(sessionId, {
|
|
@@ -258,79 +240,69 @@ var parseSessionSSE = /*#__PURE__*/function () {
|
|
|
258
240
|
store().setStatus(sessionId, 'thinking');
|
|
259
241
|
store().setActivity(sessionId, getUsingSkillActivity(t, data.skill));
|
|
260
242
|
}
|
|
261
|
-
return _context.abrupt("continue",
|
|
262
|
-
case
|
|
243
|
+
return _context.abrupt("continue", 23);
|
|
244
|
+
case 14:
|
|
263
245
|
clearStreamLikeAnswerReset();
|
|
264
|
-
return _context.abrupt("continue",
|
|
265
|
-
case
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
label = resolveToolActionLabel(stepTool, t, 'present');
|
|
273
|
-
if (label) {
|
|
274
|
-
isUsingSkill = stepTool === 'get_skill';
|
|
246
|
+
return _context.abrupt("continue", 23);
|
|
247
|
+
case 15:
|
|
248
|
+
stepTool = resolveReasoningStepTool(data);
|
|
249
|
+
stepType = resolveReasoningStepType(data);
|
|
250
|
+
if (shouldShowReasoningToolActivity(stepTool, stepType, data.status)) {
|
|
251
|
+
isUsingSkill = stepTool === 'get_skill';
|
|
252
|
+
if (isUsingSkill) {
|
|
253
|
+
// El step de `get_skill` llega justo después de `using_skill`: mantiene el nombre.
|
|
275
254
|
store().patchMeta(sessionId, {
|
|
276
255
|
isLoading: true
|
|
277
256
|
});
|
|
278
|
-
|
|
279
|
-
store().setActivity(sessionId,
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
});
|
|
257
|
+
store().setStatus(sessionId, 'thinking');
|
|
258
|
+
store().setActivity(sessionId, getUsingSkillActivity(t, (_data$args = data.args) === null || _data$args === void 0 ? void 0 : _data$args.name));
|
|
259
|
+
} else {
|
|
260
|
+
setThinkingActivity();
|
|
283
261
|
}
|
|
284
262
|
}
|
|
285
|
-
if (
|
|
263
|
+
if (shouldApplyReasoningStepIndex(data.i)) {
|
|
264
|
+
stepIndex = data.i;
|
|
286
265
|
reasoningStore.captureLeadingFromBody(placeholderId, accumulatedContent);
|
|
287
|
-
reasoningStore.applyStep(placeholderId, data)
|
|
266
|
+
reasoningStore.applyStep(placeholderId, _objectSpread(_objectSpread({}, data), {}, {
|
|
267
|
+
i: stepIndex
|
|
268
|
+
}));
|
|
288
269
|
if (reasoningStore.shouldClearStreamForLeading(placeholderId, accumulatedContent)) {
|
|
289
270
|
clearStreamLikeAnswerReset();
|
|
290
271
|
}
|
|
291
272
|
}
|
|
292
|
-
return _context.abrupt("continue",
|
|
293
|
-
case
|
|
294
|
-
chunk =
|
|
273
|
+
return _context.abrupt("continue", 23);
|
|
274
|
+
case 16:
|
|
275
|
+
chunk = resolveStreamTextChunk(data);
|
|
295
276
|
ensureWritingStarted();
|
|
296
277
|
applyStreamChunk(chunk);
|
|
297
|
-
return _context.abrupt("continue",
|
|
298
|
-
case
|
|
299
|
-
_chunk =
|
|
278
|
+
return _context.abrupt("continue", 23);
|
|
279
|
+
case 17:
|
|
280
|
+
_chunk = resolveStreamTextChunk(data);
|
|
300
281
|
ensureWritingStarted();
|
|
301
282
|
applyStreamChunk(_chunk);
|
|
302
283
|
if (isCompleteLikeSsePayload(data)) {
|
|
303
284
|
applyStreamComplete(data);
|
|
304
285
|
}
|
|
305
|
-
return _context.abrupt("continue",
|
|
306
|
-
case
|
|
286
|
+
return _context.abrupt("continue", 23);
|
|
287
|
+
case 18:
|
|
307
288
|
isUsingSkill = false;
|
|
308
|
-
if (data
|
|
309
|
-
|
|
310
|
-
isLoading: true
|
|
311
|
-
});
|
|
312
|
-
store().setStatus(sessionId, 'thinking');
|
|
313
|
-
} else if (data.message && typeof data.message === 'string') {
|
|
314
|
-
store().patchMeta(sessionId, {
|
|
315
|
-
isLoading: true
|
|
316
|
-
});
|
|
317
|
-
store().setStatus(sessionId, 'thinking');
|
|
318
|
-
store().setActivity(sessionId, resolveHitlNodeStreamActivity(data.message, t, hitlExecutionContext !== null && hitlExecutionContext !== void 0 ? hitlExecutionContext : undefined, typeof data.thread_id === 'string' ? data.thread_id : undefined));
|
|
289
|
+
if (isAgentTransferNode(data) || resolveNodeStreamMessage(data)) {
|
|
290
|
+
setThinkingActivity();
|
|
319
291
|
}
|
|
320
|
-
return _context.abrupt("continue",
|
|
321
|
-
case
|
|
292
|
+
return _context.abrupt("continue", 23);
|
|
293
|
+
case 19:
|
|
322
294
|
applyStreamComplete(data);
|
|
323
|
-
return _context.abrupt("continue",
|
|
324
|
-
case
|
|
295
|
+
return _context.abrupt("continue", 23);
|
|
296
|
+
case 20:
|
|
325
297
|
flushPending();
|
|
326
298
|
// Preaprobado (auto-approve o detección manual): el stream no se corta,
|
|
327
299
|
// sigue ejecutando las acciones sin esperar decisión del usuario.
|
|
328
|
-
isPreApproved = data
|
|
300
|
+
isPreApproved = isApprovalPreApproved(data);
|
|
329
301
|
store().patchMeta(sessionId, {
|
|
330
302
|
isWriting: false
|
|
331
303
|
});
|
|
332
304
|
if (!isPreApproved) {
|
|
333
|
-
reasoningStore.finish(placeholderId, (
|
|
305
|
+
reasoningStore.finish(placeholderId, (_ref2 = data.reasoning) !== null && _ref2 !== void 0 ? _ref2 : null);
|
|
334
306
|
store().patchMeta(sessionId, {
|
|
335
307
|
isLoading: false
|
|
336
308
|
});
|
|
@@ -339,15 +311,11 @@ var parseSessionSSE = /*#__PURE__*/function () {
|
|
|
339
311
|
}
|
|
340
312
|
store().setStatus(sessionId, 'awaiting_approval');
|
|
341
313
|
(_callbacks$onApproval = callbacks.onApprovalRequired) === null || _callbacks$onApproval === void 0 || _callbacks$onApproval.call(callbacks, data, accumulatedContent);
|
|
342
|
-
if (isPreApproved
|
|
343
|
-
|
|
344
|
-
isLoading: true
|
|
345
|
-
});
|
|
346
|
-
store().setStatus(sessionId, 'thinking');
|
|
347
|
-
store().setActivity(sessionId, resolveInitialHitlStreamActivity(t, hitlExecutionContext !== null && hitlExecutionContext !== void 0 ? hitlExecutionContext : undefined));
|
|
314
|
+
if (shouldResumeHitlAfterPreApproval(isPreApproved, data.pending_actions)) {
|
|
315
|
+
setThinkingActivity();
|
|
348
316
|
}
|
|
349
|
-
return _context.abrupt("continue",
|
|
350
|
-
case
|
|
317
|
+
return _context.abrupt("continue", 23);
|
|
318
|
+
case 21:
|
|
351
319
|
console.error('SSE Error:', data.error);
|
|
352
320
|
flushPending();
|
|
353
321
|
sessionStreamingText.clear(sessionId);
|
|
@@ -362,43 +330,43 @@ var parseSessionSSE = /*#__PURE__*/function () {
|
|
|
362
330
|
});
|
|
363
331
|
store().setStatus(sessionId, 'error');
|
|
364
332
|
(_callbacks$onError = callbacks.onError) === null || _callbacks$onError === void 0 || _callbacks$onError.call(callbacks, (_data$error3 = data.error) === null || _data$error3 === void 0 ? void 0 : _data$error3.type, (_data$error4 = data.error) === null || _data$error4 === void 0 ? void 0 : _data$error4.message);
|
|
365
|
-
return _context.abrupt("continue",
|
|
366
|
-
case
|
|
333
|
+
return _context.abrupt("continue", 23);
|
|
334
|
+
case 22:
|
|
367
335
|
console.warn('Unknown SSE event type:', eventType);
|
|
368
|
-
return _context.abrupt("continue",
|
|
369
|
-
case
|
|
370
|
-
_context.next =
|
|
336
|
+
return _context.abrupt("continue", 23);
|
|
337
|
+
case 23:
|
|
338
|
+
_context.next = 25;
|
|
371
339
|
break;
|
|
372
|
-
case
|
|
373
|
-
_context.prev =
|
|
374
|
-
_t2 = _context["catch"](
|
|
340
|
+
case 24:
|
|
341
|
+
_context.prev = 24;
|
|
342
|
+
_t2 = _context["catch"](11);
|
|
375
343
|
console.error('Error parsing SSE data:', _t2, dataStr);
|
|
376
|
-
case
|
|
344
|
+
case 25:
|
|
377
345
|
_context.next = 9;
|
|
378
346
|
break;
|
|
379
|
-
case
|
|
380
|
-
_context.next =
|
|
347
|
+
case 26:
|
|
348
|
+
_context.next = 28;
|
|
381
349
|
break;
|
|
382
|
-
case
|
|
383
|
-
_context.prev =
|
|
350
|
+
case 27:
|
|
351
|
+
_context.prev = 27;
|
|
384
352
|
_t3 = _context["catch"](8);
|
|
385
353
|
_iterator.e(_t3);
|
|
386
|
-
case
|
|
387
|
-
_context.prev =
|
|
354
|
+
case 28:
|
|
355
|
+
_context.prev = 28;
|
|
388
356
|
_iterator.f();
|
|
389
|
-
return _context.finish(
|
|
390
|
-
case
|
|
357
|
+
return _context.finish(28);
|
|
358
|
+
case 29:
|
|
391
359
|
_context.next = 3;
|
|
392
360
|
break;
|
|
393
|
-
case
|
|
394
|
-
_context.prev =
|
|
361
|
+
case 30:
|
|
362
|
+
_context.prev = 30;
|
|
395
363
|
flushPending();
|
|
396
|
-
return _context.finish(
|
|
397
|
-
case
|
|
364
|
+
return _context.finish(30);
|
|
365
|
+
case 31:
|
|
398
366
|
case "end":
|
|
399
367
|
return _context.stop();
|
|
400
368
|
}
|
|
401
|
-
}, _callee, null, [[2,,
|
|
369
|
+
}, _callee, null, [[2,, 30, 31], [8, 27, 28, 29], [11, 24]]);
|
|
402
370
|
}));
|
|
403
371
|
return function parseSessionSSE(_x, _x2, _x3) {
|
|
404
372
|
return _ref.apply(this, arguments);
|
|
@@ -419,30 +387,22 @@ export var sessionStreamManager = {
|
|
|
419
387
|
},
|
|
420
388
|
startStream: function startStream(params) {
|
|
421
389
|
return _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
|
|
422
|
-
var sessionId, placeholderId, request, callbacks, t, activityOptions, agentId, agentName, controller, active, response, _callbacks$onError2, _t4;
|
|
390
|
+
var sessionId, placeholderId, request, callbacks, t, activityOptions, agentId, agentName, startGuard, controller, active, response, _callbacks$onError2, _t4;
|
|
423
391
|
return _regeneratorRuntime.wrap(function (_context2) {
|
|
424
392
|
while (1) switch (_context2.prev = _context2.next) {
|
|
425
393
|
case 0:
|
|
426
394
|
ensureSessionNotificationsInitialized();
|
|
427
395
|
sessionId = params.sessionId, placeholderId = params.placeholderId, request = params.request, callbacks = params.callbacks, t = params.t, activityOptions = params.activityOptions, agentId = params.agentId, agentName = params.agentName;
|
|
428
|
-
|
|
396
|
+
startGuard = resolveStartStreamGuard(isStreamActive(sessionId), getActiveStreamCount(), MAX_CONCURRENT_STREAMS);
|
|
397
|
+
if (startGuard.allowed) {
|
|
429
398
|
_context2.next = 1;
|
|
430
399
|
break;
|
|
431
400
|
}
|
|
432
401
|
return _context2.abrupt("return", {
|
|
433
402
|
started: false,
|
|
434
|
-
reason:
|
|
403
|
+
reason: startGuard.reason
|
|
435
404
|
});
|
|
436
405
|
case 1:
|
|
437
|
-
if (!(getActiveStreamCount() >= MAX_CONCURRENT_STREAMS)) {
|
|
438
|
-
_context2.next = 2;
|
|
439
|
-
break;
|
|
440
|
-
}
|
|
441
|
-
return _context2.abrupt("return", {
|
|
442
|
-
started: false,
|
|
443
|
-
reason: 'limit'
|
|
444
|
-
});
|
|
445
|
-
case 2:
|
|
446
406
|
controller = new AbortController();
|
|
447
407
|
active = {
|
|
448
408
|
sessionId: sessionId,
|
|
@@ -451,33 +411,29 @@ export var sessionStreamManager = {
|
|
|
451
411
|
};
|
|
452
412
|
activeStreams.set(sessionId, active);
|
|
453
413
|
store().ensureSession(sessionId);
|
|
454
|
-
store().patchMeta(sessionId, _objectSpread(
|
|
414
|
+
store().patchMeta(sessionId, _objectSpread({
|
|
455
415
|
placeholderId: placeholderId,
|
|
456
416
|
error: null,
|
|
457
417
|
isLoading: true,
|
|
458
418
|
isWriting: false
|
|
459
|
-
}, agentId
|
|
460
|
-
agentId: agentId
|
|
461
|
-
} : {}), agentName != null ? {
|
|
462
|
-
agentName: agentName
|
|
463
|
-
} : {}));
|
|
419
|
+
}, patchMetaAgentFields(agentId, agentName)));
|
|
464
420
|
store().setStatus(sessionId, 'thinking');
|
|
465
421
|
sessionStreamingText.start(sessionId, placeholderId);
|
|
466
422
|
reasoningStore.start(placeholderId);
|
|
467
423
|
store().setActivity(sessionId, getInitialStreamActivity(t, activityOptions !== null && activityOptions !== void 0 ? activityOptions : {}));
|
|
468
|
-
_context2.prev =
|
|
469
|
-
_context2.next =
|
|
424
|
+
_context2.prev = 2;
|
|
425
|
+
_context2.next = 3;
|
|
470
426
|
return maia.Orchestrator.orchestrator(request, controller.signal);
|
|
471
|
-
case
|
|
427
|
+
case 3:
|
|
472
428
|
response = _context2.sent;
|
|
473
|
-
_context2.next =
|
|
429
|
+
_context2.next = 4;
|
|
474
430
|
return parseSessionSSE(response, active, params);
|
|
475
|
-
case
|
|
476
|
-
_context2.next =
|
|
431
|
+
case 4:
|
|
432
|
+
_context2.next = 6;
|
|
477
433
|
break;
|
|
478
|
-
case
|
|
479
|
-
_context2.prev =
|
|
480
|
-
_t4 = _context2["catch"](
|
|
434
|
+
case 5:
|
|
435
|
+
_context2.prev = 5;
|
|
436
|
+
_t4 = _context2["catch"](2);
|
|
481
437
|
if (!active.isStopped) {
|
|
482
438
|
sessionStreamingText.clear(sessionId);
|
|
483
439
|
store().patchMeta(sessionId, {
|
|
@@ -488,48 +444,40 @@ export var sessionStreamManager = {
|
|
|
488
444
|
store().setStatus(sessionId, 'error');
|
|
489
445
|
(_callbacks$onError2 = callbacks.onError) === null || _callbacks$onError2 === void 0 || _callbacks$onError2.call(callbacks);
|
|
490
446
|
}
|
|
491
|
-
case
|
|
492
|
-
_context2.prev =
|
|
447
|
+
case 6:
|
|
448
|
+
_context2.prev = 6;
|
|
493
449
|
activeStreams["delete"](sessionId);
|
|
494
|
-
return _context2.finish(
|
|
495
|
-
case
|
|
450
|
+
return _context2.finish(6);
|
|
451
|
+
case 7:
|
|
496
452
|
return _context2.abrupt("return", {
|
|
497
453
|
started: true
|
|
498
454
|
});
|
|
499
|
-
case
|
|
455
|
+
case 8:
|
|
500
456
|
case "end":
|
|
501
457
|
return _context2.stop();
|
|
502
458
|
}
|
|
503
|
-
}, _callee2, null, [[
|
|
459
|
+
}, _callee2, null, [[2, 5, 6, 7]]);
|
|
504
460
|
}))();
|
|
505
461
|
},
|
|
506
462
|
/** Resume HITL (`continue-thread`) keyed por sessionId — mismo motor que orchestrator. */startContinueStream: function startContinueStream(params) {
|
|
507
463
|
return _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
|
|
508
|
-
var
|
|
509
|
-
var sessionId, placeholderId, continueRequest, callbacks, t, hitlExecutionContext, agentId, agentName, controller, active, sseParams, response, _callbacks$onError3, _t5;
|
|
464
|
+
var _ref3;
|
|
465
|
+
var sessionId, placeholderId, continueRequest, callbacks, t, hitlExecutionContext, agentId, agentName, continueGuard, controller, active, sseParams, response, _callbacks$onError3, _t5;
|
|
510
466
|
return _regeneratorRuntime.wrap(function (_context3) {
|
|
511
467
|
while (1) switch (_context3.prev = _context3.next) {
|
|
512
468
|
case 0:
|
|
513
469
|
ensureSessionNotificationsInitialized();
|
|
514
470
|
sessionId = params.sessionId, placeholderId = params.placeholderId, continueRequest = params.continueRequest, callbacks = params.callbacks, t = params.t, hitlExecutionContext = params.hitlExecutionContext, agentId = params.agentId, agentName = params.agentName;
|
|
515
|
-
|
|
471
|
+
continueGuard = resolveStartStreamGuard(isStreamActive(sessionId), getActiveStreamCount(), MAX_CONCURRENT_STREAMS);
|
|
472
|
+
if (continueGuard.allowed) {
|
|
516
473
|
_context3.next = 1;
|
|
517
474
|
break;
|
|
518
475
|
}
|
|
519
476
|
return _context3.abrupt("return", {
|
|
520
477
|
started: false,
|
|
521
|
-
reason:
|
|
478
|
+
reason: continueGuard.reason
|
|
522
479
|
});
|
|
523
480
|
case 1:
|
|
524
|
-
if (!(getActiveStreamCount() >= MAX_CONCURRENT_STREAMS)) {
|
|
525
|
-
_context3.next = 2;
|
|
526
|
-
break;
|
|
527
|
-
}
|
|
528
|
-
return _context3.abrupt("return", {
|
|
529
|
-
started: false,
|
|
530
|
-
reason: 'limit'
|
|
531
|
-
});
|
|
532
|
-
case 2:
|
|
533
481
|
if (hitlExecutionContext) {
|
|
534
482
|
sessionHitlContext.set(sessionId, hitlExecutionContext);
|
|
535
483
|
}
|
|
@@ -541,19 +489,15 @@ export var sessionStreamManager = {
|
|
|
541
489
|
};
|
|
542
490
|
activeStreams.set(sessionId, active);
|
|
543
491
|
store().ensureSession(sessionId);
|
|
544
|
-
store().patchMeta(sessionId, _objectSpread(
|
|
492
|
+
store().patchMeta(sessionId, _objectSpread({
|
|
545
493
|
placeholderId: placeholderId,
|
|
546
494
|
error: null,
|
|
547
495
|
isLoading: true,
|
|
548
496
|
isWriting: false
|
|
549
|
-
}, agentId
|
|
550
|
-
agentId: agentId
|
|
551
|
-
} : {}), agentName != null ? {
|
|
552
|
-
agentName: agentName
|
|
553
|
-
} : {}));
|
|
497
|
+
}, patchMetaAgentFields(agentId, agentName)));
|
|
554
498
|
store().setStatus(sessionId, 'thinking');
|
|
555
499
|
sessionStreamingText.start(sessionId, placeholderId);
|
|
556
|
-
store().setActivity(sessionId, resolveInitialHitlStreamActivity(t, (
|
|
500
|
+
store().setActivity(sessionId, resolveInitialHitlStreamActivity(t, (_ref3 = hitlExecutionContext !== null && hitlExecutionContext !== void 0 ? hitlExecutionContext : sessionHitlContext.get(sessionId)) !== null && _ref3 !== void 0 ? _ref3 : undefined));
|
|
557
501
|
sseParams = {
|
|
558
502
|
sessionId: sessionId,
|
|
559
503
|
placeholderId: placeholderId,
|
|
@@ -564,25 +508,25 @@ export var sessionStreamManager = {
|
|
|
564
508
|
agentId: agentId,
|
|
565
509
|
agentName: agentName
|
|
566
510
|
};
|
|
567
|
-
_context3.prev =
|
|
568
|
-
_context3.next =
|
|
511
|
+
_context3.prev = 2;
|
|
512
|
+
_context3.next = 3;
|
|
569
513
|
return maia.Orchestrator.continueThread(continueRequest, controller.signal);
|
|
570
|
-
case
|
|
514
|
+
case 3:
|
|
571
515
|
response = _context3.sent;
|
|
572
516
|
if (response.ok) {
|
|
573
|
-
_context3.next =
|
|
517
|
+
_context3.next = 4;
|
|
574
518
|
break;
|
|
575
519
|
}
|
|
576
520
|
throw new Error("continue-thread failed: ".concat(response.status));
|
|
577
|
-
case
|
|
578
|
-
_context3.next =
|
|
521
|
+
case 4:
|
|
522
|
+
_context3.next = 5;
|
|
579
523
|
return parseSessionSSE(response, active, sseParams);
|
|
580
|
-
case
|
|
581
|
-
_context3.next =
|
|
524
|
+
case 5:
|
|
525
|
+
_context3.next = 7;
|
|
582
526
|
break;
|
|
583
|
-
case
|
|
584
|
-
_context3.prev =
|
|
585
|
-
_t5 = _context3["catch"](
|
|
527
|
+
case 6:
|
|
528
|
+
_context3.prev = 6;
|
|
529
|
+
_t5 = _context3["catch"](2);
|
|
586
530
|
if (!active.isStopped) {
|
|
587
531
|
sessionStreamingText.clear(sessionId);
|
|
588
532
|
store().patchMeta(sessionId, {
|
|
@@ -593,48 +537,40 @@ export var sessionStreamManager = {
|
|
|
593
537
|
store().setStatus(sessionId, 'error');
|
|
594
538
|
(_callbacks$onError3 = callbacks.onError) === null || _callbacks$onError3 === void 0 || _callbacks$onError3.call(callbacks);
|
|
595
539
|
}
|
|
596
|
-
case
|
|
597
|
-
_context3.prev =
|
|
540
|
+
case 7:
|
|
541
|
+
_context3.prev = 7;
|
|
598
542
|
activeStreams["delete"](sessionId);
|
|
599
543
|
sessionHitlContext.clear(sessionId);
|
|
600
|
-
return _context3.finish(
|
|
601
|
-
case
|
|
544
|
+
return _context3.finish(7);
|
|
545
|
+
case 8:
|
|
602
546
|
return _context3.abrupt("return", {
|
|
603
547
|
started: true
|
|
604
548
|
});
|
|
605
|
-
case
|
|
549
|
+
case 9:
|
|
606
550
|
case "end":
|
|
607
551
|
return _context3.stop();
|
|
608
552
|
}
|
|
609
|
-
}, _callee3, null, [[
|
|
553
|
+
}, _callee3, null, [[2, 6, 7, 8]]);
|
|
610
554
|
}))();
|
|
611
555
|
},
|
|
612
556
|
/** Regenera la respuesta de un turno (`retry_completion`) — mismo motor SSE que orchestrator. */startRetryStream: function startRetryStream(params) {
|
|
613
557
|
return _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4() {
|
|
614
|
-
var sessionId, placeholderId, retryRequest, callbacks, t, activityOptions, agentId, agentName, controller, active, sseParams, response, detail, data, _callbacks$onError4, _t6, _t7;
|
|
558
|
+
var sessionId, placeholderId, retryRequest, callbacks, t, activityOptions, agentId, agentName, retryGuard, controller, active, sseParams, response, detail, data, _callbacks$onError4, _t6, _t7;
|
|
615
559
|
return _regeneratorRuntime.wrap(function (_context4) {
|
|
616
560
|
while (1) switch (_context4.prev = _context4.next) {
|
|
617
561
|
case 0:
|
|
618
562
|
ensureSessionNotificationsInitialized();
|
|
619
563
|
sessionId = params.sessionId, placeholderId = params.placeholderId, retryRequest = params.retryRequest, callbacks = params.callbacks, t = params.t, activityOptions = params.activityOptions, agentId = params.agentId, agentName = params.agentName;
|
|
620
|
-
|
|
564
|
+
retryGuard = resolveStartStreamGuard(isStreamActive(sessionId), getActiveStreamCount(), MAX_CONCURRENT_STREAMS);
|
|
565
|
+
if (retryGuard.allowed) {
|
|
621
566
|
_context4.next = 1;
|
|
622
567
|
break;
|
|
623
568
|
}
|
|
624
569
|
return _context4.abrupt("return", {
|
|
625
570
|
started: false,
|
|
626
|
-
reason:
|
|
571
|
+
reason: retryGuard.reason
|
|
627
572
|
});
|
|
628
573
|
case 1:
|
|
629
|
-
if (!(getActiveStreamCount() >= MAX_CONCURRENT_STREAMS)) {
|
|
630
|
-
_context4.next = 2;
|
|
631
|
-
break;
|
|
632
|
-
}
|
|
633
|
-
return _context4.abrupt("return", {
|
|
634
|
-
started: false,
|
|
635
|
-
reason: 'limit'
|
|
636
|
-
});
|
|
637
|
-
case 2:
|
|
638
574
|
controller = new AbortController();
|
|
639
575
|
active = {
|
|
640
576
|
sessionId: sessionId,
|
|
@@ -643,16 +579,12 @@ export var sessionStreamManager = {
|
|
|
643
579
|
};
|
|
644
580
|
activeStreams.set(sessionId, active);
|
|
645
581
|
store().ensureSession(sessionId);
|
|
646
|
-
store().patchMeta(sessionId, _objectSpread(
|
|
582
|
+
store().patchMeta(sessionId, _objectSpread({
|
|
647
583
|
placeholderId: placeholderId,
|
|
648
584
|
error: null,
|
|
649
585
|
isLoading: true,
|
|
650
586
|
isWriting: false
|
|
651
|
-
}, agentId
|
|
652
|
-
agentId: agentId
|
|
653
|
-
} : {}), agentName != null ? {
|
|
654
|
-
agentName: agentName
|
|
655
|
-
} : {}));
|
|
587
|
+
}, patchMetaAgentFields(agentId, agentName)));
|
|
656
588
|
store().setStatus(sessionId, 'thinking');
|
|
657
589
|
sessionStreamingText.start(sessionId, placeholderId);
|
|
658
590
|
store().setActivity(sessionId, getInitialStreamActivity(t, activityOptions !== null && activityOptions !== void 0 ? activityOptions : {}));
|
|
@@ -666,34 +598,34 @@ export var sessionStreamManager = {
|
|
|
666
598
|
agentId: agentId,
|
|
667
599
|
agentName: agentName
|
|
668
600
|
};
|
|
669
|
-
_context4.prev =
|
|
670
|
-
_context4.next =
|
|
601
|
+
_context4.prev = 2;
|
|
602
|
+
_context4.next = 3;
|
|
671
603
|
return maia.Orchestrator.retryCompletion(retryRequest, controller.signal);
|
|
672
|
-
case
|
|
604
|
+
case 3:
|
|
673
605
|
response = _context4.sent;
|
|
674
606
|
if (response.ok) {
|
|
675
|
-
_context4.next =
|
|
607
|
+
_context4.next = 9;
|
|
676
608
|
break;
|
|
677
609
|
}
|
|
678
610
|
if (!(response.status === 404)) {
|
|
679
|
-
_context4.next =
|
|
611
|
+
_context4.next = 8;
|
|
680
612
|
break;
|
|
681
613
|
}
|
|
682
|
-
_context4.prev =
|
|
683
|
-
_context4.next =
|
|
614
|
+
_context4.prev = 4;
|
|
615
|
+
_context4.next = 5;
|
|
684
616
|
return response.json();
|
|
685
|
-
case
|
|
617
|
+
case 5:
|
|
686
618
|
data = _context4.sent;
|
|
687
619
|
detail = typeof data.detail === 'string' ? data.detail : undefined;
|
|
688
|
-
_context4.next =
|
|
620
|
+
_context4.next = 7;
|
|
689
621
|
break;
|
|
690
|
-
case
|
|
691
|
-
_context4.prev =
|
|
692
|
-
_t6 = _context4["catch"](
|
|
622
|
+
case 6:
|
|
623
|
+
_context4.prev = 6;
|
|
624
|
+
_t6 = _context4["catch"](4);
|
|
693
625
|
detail = undefined;
|
|
694
|
-
case
|
|
695
|
-
if (!(detail
|
|
696
|
-
_context4.next =
|
|
626
|
+
case 7:
|
|
627
|
+
if (!isRetryTurnNotFoundResponse(response.status, detail)) {
|
|
628
|
+
_context4.next = 8;
|
|
697
629
|
break;
|
|
698
630
|
}
|
|
699
631
|
sessionStreamingText.clear(sessionId);
|
|
@@ -709,17 +641,17 @@ export var sessionStreamManager = {
|
|
|
709
641
|
started: false,
|
|
710
642
|
reason: 'turn_not_found'
|
|
711
643
|
});
|
|
712
|
-
case
|
|
644
|
+
case 8:
|
|
713
645
|
throw new Error("retry_completion failed: ".concat(response.status));
|
|
714
|
-
case
|
|
715
|
-
_context4.next =
|
|
646
|
+
case 9:
|
|
647
|
+
_context4.next = 10;
|
|
716
648
|
return parseSessionSSE(response, active, sseParams);
|
|
717
|
-
case
|
|
718
|
-
_context4.next =
|
|
649
|
+
case 10:
|
|
650
|
+
_context4.next = 12;
|
|
719
651
|
break;
|
|
720
|
-
case
|
|
721
|
-
_context4.prev =
|
|
722
|
-
_t7 = _context4["catch"](
|
|
652
|
+
case 11:
|
|
653
|
+
_context4.prev = 11;
|
|
654
|
+
_t7 = _context4["catch"](2);
|
|
723
655
|
if (!active.isStopped) {
|
|
724
656
|
sessionStreamingText.clear(sessionId);
|
|
725
657
|
store().patchMeta(sessionId, {
|
|
@@ -730,19 +662,19 @@ export var sessionStreamManager = {
|
|
|
730
662
|
store().setStatus(sessionId, 'error');
|
|
731
663
|
(_callbacks$onError4 = callbacks.onError) === null || _callbacks$onError4 === void 0 || _callbacks$onError4.call(callbacks);
|
|
732
664
|
}
|
|
733
|
-
case
|
|
734
|
-
_context4.prev =
|
|
665
|
+
case 12:
|
|
666
|
+
_context4.prev = 12;
|
|
735
667
|
activeStreams["delete"](sessionId);
|
|
736
|
-
return _context4.finish(
|
|
737
|
-
case
|
|
668
|
+
return _context4.finish(12);
|
|
669
|
+
case 13:
|
|
738
670
|
return _context4.abrupt("return", {
|
|
739
671
|
started: true
|
|
740
672
|
});
|
|
741
|
-
case
|
|
673
|
+
case 14:
|
|
742
674
|
case "end":
|
|
743
675
|
return _context4.stop();
|
|
744
676
|
}
|
|
745
|
-
}, _callee4, null, [[
|
|
677
|
+
}, _callee4, null, [[2, 11, 12, 13], [4, 6]]);
|
|
746
678
|
}))();
|
|
747
679
|
},
|
|
748
680
|
/** Cancelación explícita del usuario (mensaje "cancelado"). */stopStream: function stopStream(sessionId, callbacks) {
|
|
@@ -765,7 +697,7 @@ export var sessionStreamManager = {
|
|
|
765
697
|
callbacks === null || callbacks === void 0 || (_callbacks$onStop = callbacks.onStop) === null || _callbacks$onStop === void 0 || _callbacks$onStop.call(callbacks, partialText);
|
|
766
698
|
},
|
|
767
699
|
/** Aborta sin marcar "cancelado" (uso interno / limpieza). */abortSilently: function abortSilently(sessionId) {
|
|
768
|
-
var _store$
|
|
700
|
+
var _store$getMeta3;
|
|
769
701
|
var active = activeStreams.get(sessionId);
|
|
770
702
|
if (!active) return;
|
|
771
703
|
active.isStopped = true;
|
|
@@ -777,7 +709,7 @@ export var sessionStreamManager = {
|
|
|
777
709
|
isWriting: false
|
|
778
710
|
});
|
|
779
711
|
store().setActivity(sessionId, null);
|
|
780
|
-
if (((_store$
|
|
712
|
+
if (shouldSetIdleOnSilentAbort((_store$getMeta3 = store().getMeta(sessionId)) === null || _store$getMeta3 === void 0 ? void 0 : _store$getMeta3.status)) {
|
|
781
713
|
store().setStatus(sessionId, 'idle');
|
|
782
714
|
}
|
|
783
715
|
},
|
|
@@ -788,4 +720,4 @@ export var sessionStreamManager = {
|
|
|
788
720
|
});
|
|
789
721
|
}
|
|
790
722
|
};
|
|
791
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJtYWlhIiwiZ2V0SW5pdGlhbFN0cmVhbUFjdGl2aXR5IiwiZ2V0VGhpbmtpbmdMb2FkaW5nTWVzc2FnZSIsImdldFVzaW5nU2tpbGxBY3Rpdml0eSIsImdldFdyaXRpbmdTdHJlYW1BY3Rpdml0eSIsInJlc29sdmVIaXRsTm9kZVN0cmVhbUFjdGl2aXR5IiwicmVzb2x2ZUluaXRpYWxIaXRsU3RyZWFtQWN0aXZpdHkiLCJyZXNvbHZlVG9vbEFjdGlvbkxhYmVsIiwiaXNDb21wbGV0ZUxpa2VTc2VQYXlsb2FkIiwibWVyZ2VTdHJlYW1DaHVuayIsInJlYXNvbmluZ1N0b3JlIiwic2Vzc2lvblN0cmVhbWluZ1RleHQiLCJ1c2VTZXNzaW9uc1N0b3JlIiwiZW5zdXJlU2Vzc2lvbk5vdGlmaWNhdGlvbnNJbml0aWFsaXplZCIsInNlc3Npb25IaXRsQ29udGV4dCIsIk1BWF9DT05DVVJSRU5UX1NUUkVBTVMiLCJTVFJFQU1fVEhST1RUTEVfTVMiLCJhY3RpdmVTdHJlYW1zIiwiTWFwIiwic3RvcmUiLCJnZXRTdGF0ZSIsImlzU3RyZWFtQWN0aXZlIiwic2Vzc2lvbklkIiwiaGFzIiwiZ2V0QWN0aXZlU3RyZWFtQ291bnQiLCJzaXplIiwicGFyc2VTZXNzaW9uU1NFIiwiX3JlZiIsIl9hc3luY1RvR2VuZXJhdG9yIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlIiwicmVzcG9uc2UiLCJhY3RpdmUiLCJwYXJhbXMiLCJfcGFyYW1zJGhpdGxFeGVjdXRpb24iLCJfcmVzcG9uc2UkYm9keSIsIl9kYXRhJGVycm9yIiwiX2RhdGEkZXJyb3IyIiwiX2NhbGxiYWNrcyRvbkVycm9yIiwiX2RhdGEkZXJyb3IzIiwiX2RhdGEkZXJyb3I0IiwicGxhY2Vob2xkZXJJZCIsImNhbGxiYWNrcyIsInQiLCJoaXRsRXhlY3V0aW9uQ29udGV4dCIsInBlbmRpbmdDb250ZW50IiwidGhyb3R0bGVUaW1lciIsImZsdXNoVG9TdG9yZXMiLCJlbWl0VGhyb3R0bGVkIiwiZmx1c2hQZW5kaW5nIiwicmVhZGVyIiwiZGVjb2RlciIsImJ1ZmZlciIsImFjY3VtdWxhdGVkQ29udGVudCIsImhhc1N0YXJ0ZWRXcml0aW5nIiwiaXNVc2luZ1NraWxsIiwiZW5zdXJlV3JpdGluZ1N0YXJ0ZWQiLCJhcHBseVN0cmVhbUNodW5rIiwiY2xlYXJTdHJlYW1MaWtlQW5zd2VyUmVzZXQiLCJhcHBseVN0cmVhbUNvbXBsZXRlIiwiX3lpZWxkJHJlYWRlciRyZWFkIiwiZG9uZSIsInZhbHVlIiwibGluZXMiLCJfaXRlcmF0b3IiLCJfc3RlcCIsImxpbmUiLCJfbGluZSRzcGxpdCIsIl9saW5lJHNwbGl0MiIsImV2ZW50TGluZSIsImRhdGFMaW5lIiwiZXZlbnRUeXBlIiwiZGF0YVN0ciIsImRhdGEiLCJ0aGlua2luZ0RlbHRhIiwic3RlcFRvb2wiLCJzdGVwVHlwZSIsImxhYmVsIiwiX2RhdGEkYXJncyIsImNodW5rIiwiX2NodW5rIiwiX2NhbGxiYWNrcyRvbkFwcHJvdmFsIiwiaXNQcmVBcHByb3ZlZCIsIl9yZWYzIiwiX3QiLCJfdDIiLCJfdDMiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsImdldCIsImNvbnRlbnQiLCJfY2FsbGJhY2tzJG9uU3RyZWFtVXAiLCJzZXRUZXh0Iiwib25TdHJlYW1VcGRhdGUiLCJjYWxsIiwid2luZG93Iiwic2V0VGltZW91dCIsInRvRW1pdCIsImNsZWFyVGltZW91dCIsImJvZHkiLCJnZXRSZWFkZXIiLCJFcnJvciIsIlRleHREZWNvZGVyIiwiX2NhbGxiYWNrcyRvblN0YXJ0V3JpIiwicGF0Y2hNZXRhIiwiaXNMb2FkaW5nIiwiaXNXcml0aW5nIiwic2V0U3RhdHVzIiwic2V0QWN0aXZpdHkiLCJvblN0YXJ0V3JpdGluZyIsInN5bmNMaXZlTmFycmF0aW9uIiwibWFya0Fuc3dlclJlc2V0IiwicGF5bG9hZCIsIl9wYXlsb2FkJGFnZW50X2lkIiwiX3N1YmFnZW50UmF3JHJlc29sdmVkIiwiX3JlZjIiLCJfY2FsbGJhY2tzJG9uRmluaXNoU3QiLCJmaW5hbENvbnRlbnQiLCJzb3VyY2VzIiwibWVtb3J5U2Vzc2lvbklkIiwibWVtb3J5X3Nlc3Npb25faWQiLCJhdHRhY2htZW50cyIsIkFycmF5IiwiaXNBcnJheSIsInN1Z2dlc3Rpb25zIiwic3VnZ2VzdF9yZXBseSIsImFnZW50SWRSYXciLCJhZ2VudF9pZCIsImFnZW50SWQiLCJjb21wbGV0ZWRBZ2VudElkIiwiU3RyaW5nIiwidHJpbSIsInN1YmFnZW50UmF3Iiwic3ViYWdlbnQiLCJyZXNvbHZlZENvbnRleHQiLCJyZXNvbHZlZF9jb250ZXh0IiwicmVhc29uaW5nIiwiZmluaXNoIiwiZmluaXNoUGF5bG9hZCIsIm9uRmluaXNoU3RyZWFtIiwiaXNTdG9wcGVkIiwiY2FuY2VsIiwiYWJydXB0IiwicmVhZCIsInNlbnQiLCJkZWNvZGUiLCJzdHJlYW0iLCJzcGxpdCIsInBvcCIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwicyIsIm4iLCJfc2xpY2VkVG9BcnJheSIsInJlcGxhY2UiLCJKU09OIiwicGFyc2UiLCJkZWx0YSIsImkiLCJhcHBlbmRUaGlua2luZyIsInBoYXNlIiwibWVzc2FnZSIsInNraWxsIiwic2V0Q29tcGFjdGlvbiIsInRvb2wiLCJ0eXBlIiwic3RhdHVzIiwiYXJncyIsIm5hbWUiLCJjYXB0dXJlTGVhZGluZ0Zyb21Cb2R5IiwiYXBwbHlTdGVwIiwic2hvdWxkQ2xlYXJTdHJlYW1Gb3JMZWFkaW5nIiwibm9kZSIsInVuZGVmaW5lZCIsInRocmVhZF9pZCIsIm1hbnVhbF9hcHByb3ZhbF9kZXRlY3RlZCIsImF1dG9fYXBwcm92ZWQiLCJhcHByb3ZhbF9zdGF0dXMiLCJjbGVhciIsIm9uQXBwcm92YWxSZXF1aXJlZCIsInBlbmRpbmdfYWN0aW9ucyIsImxlbmd0aCIsImNvbnNvbGUiLCJlcnJvciIsInNldEVycm9yIiwib25FcnJvciIsIndhcm4iLCJlIiwiZiIsInN0b3AiLCJfeCIsIl94MiIsIl94MyIsImFwcGx5IiwiYXJndW1lbnRzIiwic2Vzc2lvblN0cmVhbU1hbmFnZXIiLCJpc0FjdGl2ZSIsImdldEFjdGl2ZUNvdW50IiwiZ2V0QWN0aXZlU2Vzc2lvbklkcyIsImZyb20iLCJrZXlzIiwic3RhcnRTdHJlYW0iLCJfY2FsbGVlMiIsInJlcXVlc3QiLCJhY3Rpdml0eU9wdGlvbnMiLCJhZ2VudE5hbWUiLCJjb250cm9sbGVyIiwiX2NhbGxiYWNrcyRvbkVycm9yMiIsIl90NCIsIl9jb250ZXh0MiIsInN0YXJ0ZWQiLCJyZWFzb24iLCJBYm9ydENvbnRyb2xsZXIiLCJzZXQiLCJlbnN1cmVTZXNzaW9uIiwiX29iamVjdFNwcmVhZCIsInN0YXJ0IiwiT3JjaGVzdHJhdG9yIiwib3JjaGVzdHJhdG9yIiwic2lnbmFsIiwic3RhcnRDb250aW51ZVN0cmVhbSIsIl9jYWxsZWUzIiwiX3JlZjQiLCJjb250aW51ZVJlcXVlc3QiLCJzc2VQYXJhbXMiLCJfY2FsbGJhY2tzJG9uRXJyb3IzIiwiX3Q1IiwiX2NvbnRleHQzIiwiY29udGludWVUaHJlYWQiLCJvayIsImNvbmNhdCIsInN0YXJ0UmV0cnlTdHJlYW0iLCJfY2FsbGVlNCIsInJldHJ5UmVxdWVzdCIsImRldGFpbCIsIl9jYWxsYmFja3Mkb25FcnJvcjQiLCJfdDYiLCJfdDciLCJfY29udGV4dDQiLCJyZXRyeUNvbXBsZXRpb24iLCJqc29uIiwic3RvcFN0cmVhbSIsIl9jYWxsYmFja3Mkb25TdG9wIiwiYWJvcnQiLCJwYXJ0aWFsVGV4dCIsImdldFNuYXBzaG90IiwidGV4dCIsIm9uU3RvcCIsImFib3J0U2lsZW50bHkiLCJfc3RvcmUkZ2V0TWV0YSIsImdldE1ldGEiLCJhYm9ydEFsbCIsIl90aGlzIiwiZm9yRWFjaCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zdG9yZS9zZXNzaW9ucy9zZXNzaW9uU3RyZWFtTWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1jb250aW51ZSAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tYXdhaXQtaW4tbG9vcCAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcmVzdHJpY3RlZC1zeW50YXggKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnN0YW50LWNvbmRpdGlvbiAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IG1haWEgZnJvbSAnLi4vLi4vc2VydmljZXMvbWFpYSdcbmltcG9ydCB0eXBlIHsgQXBwcm92YWxSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vdHlwZXMvQ2hhdCdcbmltcG9ydCB7XG4gIGdldEluaXRpYWxTdHJlYW1BY3Rpdml0eSxcbiAgZ2V0VGhpbmtpbmdMb2FkaW5nTWVzc2FnZSxcbiAgZ2V0VXNpbmdTa2lsbEFjdGl2aXR5LFxuICBnZXRXcml0aW5nU3RyZWFtQWN0aXZpdHksXG4gIHJlc29sdmVIaXRsTm9kZVN0cmVhbUFjdGl2aXR5LFxuICByZXNvbHZlSW5pdGlhbEhpdGxTdHJlYW1BY3Rpdml0eSxcbiAgcmVzb2x2ZVRvb2xBY3Rpb25MYWJlbCxcbn0gZnJvbSAnLi4vLi4vdXRpbHMvc3RyZWFtQWN0aXZpdHlNZXNzYWdlcydcbmltcG9ydCB0eXBlIHsgSGl0bEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tICcuLi8uLi91dGlscy9zdHJlYW1BY3Rpdml0eU1lc3NhZ2VzJ1xuaW1wb3J0IHsgaXNDb21wbGV0ZUxpa2VTc2VQYXlsb2FkLCBtZXJnZVN0cmVhbUNodW5rIH0gZnJvbSAnLi4vLi4vdXRpbHMvc3NlU3RyZWFtQ29udGVudCdcbmltcG9ydCB7IHJlYXNvbmluZ1N0b3JlIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlUmVhc29uaW5nVHJhY2UnXG5pbXBvcnQgdHlwZSB7IFJlYXNvbmluZ1N0ZXBQYXlsb2FkLCBSZWFzb25pbmdUcmFjZVBheWxvYWQgfSBmcm9tICcuLi8uLi90eXBlcy9yZWFzb25pbmcnXG5pbXBvcnQgdHlwZSB7IENvbnRleHRDb21wYWN0aW9uUGF5bG9hZCB9IGZyb20gJy4uLy4uL3R5cGVzL2NvbnRleHRDb21wYWN0aW9uJ1xuaW1wb3J0IHsgc2Vzc2lvblN0cmVhbWluZ1RleHQgfSBmcm9tICcuL3Nlc3Npb25TdHJlYW1pbmdUZXh0J1xuaW1wb3J0IHsgdXNlU2Vzc2lvbnNTdG9yZSB9IGZyb20gJy4vdXNlU2Vzc2lvbnNTdG9yZSdcbmltcG9ydCB7IGVuc3VyZVNlc3Npb25Ob3RpZmljYXRpb25zSW5pdGlhbGl6ZWQgfSBmcm9tICcuL3Nlc3Npb25Ob3RpZmljYXRpb25zJ1xuaW1wb3J0IHsgc2Vzc2lvbkhpdGxDb250ZXh0IH0gZnJvbSAnLi9zZXNzaW9uSGl0bENvbnRleHQnXG5pbXBvcnQgdHlwZSB7IFNlc3Npb25GaW5pc2hQYXlsb2FkLCBTZXNzaW9uU3RyZWFtQ2FsbGJhY2tzLCBTdGFydFN0cmVhbVJlc3VsdCB9IGZyb20gJy4vc2Vzc2lvbnMudHlwZXMnXG5cbnR5cGUgT3JjaGVzdHJhdG9yUmVxdWVzdCA9IFBhcmFtZXRlcnM8dHlwZW9mIG1haWEuT3JjaGVzdHJhdG9yLm9yY2hlc3RyYXRvcj5bMF1cbnR5cGUgQ29udGludWVUaHJlYWRSZXF1ZXN0ID0gUGFyYW1ldGVyczx0eXBlb2YgbWFpYS5PcmNoZXN0cmF0b3IuY29udGludWVUaHJlYWQ+WzBdXG50eXBlIFJldHJ5Q29tcGxldGlvblJlcXVlc3QgPSBQYXJhbWV0ZXJzPHR5cGVvZiBtYWlhLk9yY2hlc3RyYXRvci5yZXRyeUNvbXBsZXRpb24+WzBdXG5cbi8qKiBDb21wYXRpYmxlIGNvbiBlbCBgdGAgZGUgaTE4bmV4dCAodXNvIGRlIHVuYSBzb2xhIGtleSkuICovXG50eXBlIFRyYW5zbGF0ZUZuID0gKGtleTogc3RyaW5nKSA9PiBzdHJpbmdcblxudHlwZSBTdGFydFN0cmVhbVBhcmFtcyA9IHtcbiAgc2Vzc2lvbklkOiBzdHJpbmdcbiAgcGxhY2Vob2xkZXJJZDogc3RyaW5nXG4gIHJlcXVlc3Q6IE9yY2hlc3RyYXRvclJlcXVlc3RcbiAgY2FsbGJhY2tzOiBTZXNzaW9uU3RyZWFtQ2FsbGJhY2tzXG4gIHQ6IFRyYW5zbGF0ZUZuXG4gIGFjdGl2aXR5T3B0aW9ucz86IHtcbiAgICBpc1dlYlNlYXJjaEFjdGl2ZT86IGJvb2xlYW5cbiAgICBpc0RlZXBTZWFyY2hBY3RpdmU/OiBib29sZWFuXG4gICAgaGFzQXR0YWNobWVudHM/OiBib29sZWFuXG4gICAgYXR0YWNobWVudHNDb3VudD86IG51bWJlclxuICB9XG4gIGhpdGxFeGVjdXRpb25Db250ZXh0PzogSGl0bEV4ZWN1dGlvbkNvbnRleHQgfCBudWxsXG4gIGFnZW50SWQ/OiBzdHJpbmcgfCBudW1iZXJcbiAgYWdlbnROYW1lPzogc3RyaW5nXG59XG5cbnR5cGUgU3RhcnRDb250aW51ZVN0cmVhbVBhcmFtcyA9IHtcbiAgc2Vzc2lvbklkOiBzdHJpbmdcbiAgcGxhY2Vob2xkZXJJZDogc3RyaW5nXG4gIGNvbnRpbnVlUmVxdWVzdDogQ29udGludWVUaHJlYWRSZXF1ZXN0XG4gIGNhbGxiYWNrczogU2Vzc2lvblN0cmVhbUNhbGxiYWNrc1xuICB0OiBUcmFuc2xhdGVGblxuICBoaXRsRXhlY3V0aW9uQ29udGV4dD86IEhpdGxFeGVjdXRpb25Db250ZXh0IHwgbnVsbFxuICBhZ2VudElkPzogc3RyaW5nIHwgbnVtYmVyXG4gIGFnZW50TmFtZT86IHN0cmluZ1xufVxuXG50eXBlIFN0YXJ0UmV0cnlTdHJlYW1QYXJhbXMgPSB7XG4gIHNlc3Npb25JZDogc3RyaW5nXG4gIHBsYWNlaG9sZGVySWQ6IHN0cmluZ1xuICByZXRyeVJlcXVlc3Q6IFJldHJ5Q29tcGxldGlvblJlcXVlc3RcbiAgY2FsbGJhY2tzOiBTZXNzaW9uU3RyZWFtQ2FsbGJhY2tzXG4gIHQ6IFRyYW5zbGF0ZUZuXG4gIGFjdGl2aXR5T3B0aW9ucz86IHtcbiAgICBpc1dlYlNlYXJjaEFjdGl2ZT86IGJvb2xlYW5cbiAgICBpc0RlZXBTZWFyY2hBY3RpdmU/OiBib29sZWFuXG4gICAgaGFzQXR0YWNobWVudHM/OiBib29sZWFuXG4gICAgYXR0YWNobWVudHNDb3VudD86IG51bWJlclxuICB9XG4gIGFnZW50SWQ/OiBzdHJpbmcgfCBudW1iZXJcbiAgYWdlbnROYW1lPzogc3RyaW5nXG59XG5cbnR5cGUgQWN0aXZlU3RyZWFtID0ge1xuICBzZXNzaW9uSWQ6IHN0cmluZ1xuICBjb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXJcbiAgaXNTdG9wcGVkOiBib29sZWFuXG59XG5cbi8qKlxuICogTcOheGltbyBkZSBzZXNpb25lcyBnZW5lcmFuZG8gZW4gcGFyYWxlbG8uIFByb3RlZ2UgcmVkL3JlY3Vyc29zIGRlbCBjbGllbnRlLlxuICogQWp1c3RhYmxlIGEgZnV0dXJvIHbDrWEgZmxhZyBkZWwgaG9zdC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9DT05DVVJSRU5UX1NUUkVBTVMgPSA0XG5cbmNvbnN0IFNUUkVBTV9USFJPVFRMRV9NUyA9IDE2XG5cbmNvbnN0IGFjdGl2ZVN0cmVhbXMgPSBuZXcgTWFwPHN0cmluZywgQWN0aXZlU3RyZWFtPigpXG5cbmNvbnN0IHN0b3JlID0gKCkgPT4gdXNlU2Vzc2lvbnNTdG9yZS5nZXRTdGF0ZSgpXG5cbmNvbnN0IGlzU3RyZWFtQWN0aXZlID0gKHNlc3Npb25JZDogc3RyaW5nKTogYm9vbGVhbiA9PiBhY3RpdmVTdHJlYW1zLmhhcyhzZXNzaW9uSWQpXG5cbmNvbnN0IGdldEFjdGl2ZVN0cmVhbUNvdW50ID0gKCk6IG51bWJlciA9PiBhY3RpdmVTdHJlYW1zLnNpemVcblxuY29uc3QgcGFyc2VTZXNzaW9uU1NFID0gYXN5bmMgKHJlc3BvbnNlOiBSZXNwb25zZSwgYWN0aXZlOiBBY3RpdmVTdHJlYW0sIHBhcmFtczogU3RhcnRTdHJlYW1QYXJhbXMpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgeyBzZXNzaW9uSWQsIHBsYWNlaG9sZGVySWQsIGNhbGxiYWNrcywgdCB9ID0gcGFyYW1zXG4gIGNvbnN0IGhpdGxFeGVjdXRpb25Db250ZXh0ID0gcGFyYW1zLmhpdGxFeGVjdXRpb25Db250ZXh0ID8/IHNlc3Npb25IaXRsQ29udGV4dC5nZXQoc2Vzc2lvbklkKVxuXG4gIGxldCBwZW5kaW5nQ29udGVudDogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgbGV0IHRocm90dGxlVGltZXI6IG51bWJlciB8IG51bGwgPSBudWxsXG5cbiAgY29uc3QgZmx1c2hUb1N0b3JlcyA9IChjb250ZW50OiBzdHJpbmcpID0+IHtcbiAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5zZXRUZXh0KHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZCwgY29udGVudClcbiAgICBjYWxsYmFja3Mub25TdHJlYW1VcGRhdGU/Lihjb250ZW50KVxuICB9XG5cbiAgY29uc3QgZW1pdFRocm90dGxlZCA9IChjb250ZW50OiBzdHJpbmcpID0+IHtcbiAgICBwZW5kaW5nQ29udGVudCA9IGNvbnRlbnRcbiAgICBpZiAodGhyb3R0bGVUaW1lciAhPSBudWxsKSByZXR1cm5cbiAgICB0aHJvdHRsZVRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhyb3R0bGVUaW1lciA9IG51bGxcbiAgICAgIGlmIChwZW5kaW5nQ29udGVudCAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHRvRW1pdCA9IHBlbmRpbmdDb250ZW50XG4gICAgICAgIHBlbmRpbmdDb250ZW50ID0gbnVsbFxuICAgICAgICBmbHVzaFRvU3RvcmVzKHRvRW1pdClcbiAgICAgIH1cbiAgICB9LCBTVFJFQU1fVEhST1RUTEVfTVMpXG4gIH1cblxuICBjb25zdCBmbHVzaFBlbmRpbmcgPSAoKSA9PiB7XG4gICAgaWYgKHRocm90dGxlVGltZXIgIT0gbnVsbCkge1xuICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aHJvdHRsZVRpbWVyKVxuICAgICAgdGhyb3R0bGVUaW1lciA9IG51bGxcbiAgICB9XG4gICAgaWYgKHBlbmRpbmdDb250ZW50ICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHRvRW1pdCA9IHBlbmRpbmdDb250ZW50XG4gICAgICBwZW5kaW5nQ29udGVudCA9IG51bGxcbiAgICAgIGZsdXNoVG9TdG9yZXModG9FbWl0KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlYWRlciA9IHJlc3BvbnNlLmJvZHk/LmdldFJlYWRlcigpXG4gIGlmICghcmVhZGVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyByZWFkZXIgYXZhaWxhYmxlJylcbiAgfVxuXG4gIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKVxuICBsZXQgYnVmZmVyID0gJydcbiAgbGV0IGFjY3VtdWxhdGVkQ29udGVudCA9ICcnXG4gIGxldCBoYXNTdGFydGVkV3JpdGluZyA9IGZhbHNlXG4gIC8vIFwiVXNhbmRvIFNraWxsXCIgcXVlZGEgdmlzaWJsZSBtaWVudHJhcyBlbCBtb2RlbG8gcGllbnNhIGNvbiBsYSBza2lsbCBjYXJnYWRhO1xuICAvLyBsb3MgZGVsdGFzIGRlIGB0aGlua2luZ2Agbm8gbG8gcGlzYW4gaGFzdGEgbGEgcHLDs3hpbWEgYWNjacOzbiBvIGVsIHByaW1lciB0b2tlbi5cbiAgbGV0IGlzVXNpbmdTa2lsbCA9IGZhbHNlXG5cbiAgY29uc3QgZW5zdXJlV3JpdGluZ1N0YXJ0ZWQgPSAoKSA9PiB7XG4gICAgaWYgKGhhc1N0YXJ0ZWRXcml0aW5nKSByZXR1cm5cbiAgICBoYXNTdGFydGVkV3JpdGluZyA9IHRydWVcbiAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiB0cnVlLCBpc1dyaXRpbmc6IHRydWUgfSlcbiAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICd3cml0aW5nJylcbiAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgZ2V0V3JpdGluZ1N0cmVhbUFjdGl2aXR5KHQpKVxuICAgIGNhbGxiYWNrcy5vblN0YXJ0V3JpdGluZz8uKClcbiAgfVxuXG4gIGNvbnN0IGFwcGx5U3RyZWFtQ2h1bmsgPSAoY2h1bms6IHN0cmluZykgPT4ge1xuICAgIGlmICghY2h1bmspIHJldHVyblxuICAgIGFjY3VtdWxhdGVkQ29udGVudCA9IG1lcmdlU3RyZWFtQ2h1bmsoYWNjdW11bGF0ZWRDb250ZW50LCBjaHVuaylcbiAgICByZWFzb25pbmdTdG9yZS5zeW5jTGl2ZU5hcnJhdGlvbihwbGFjZWhvbGRlcklkLCBhY2N1bXVsYXRlZENvbnRlbnQpXG4gICAgZW1pdFRocm90dGxlZChhY2N1bXVsYXRlZENvbnRlbnQpXG4gIH1cblxuICBjb25zdCBjbGVhclN0cmVhbUxpa2VBbnN3ZXJSZXNldCA9ICgpID0+IHtcbiAgICBpZiAodGhyb3R0bGVUaW1lciAhPSBudWxsKSB7XG4gICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRocm90dGxlVGltZXIpXG4gICAgICB0aHJvdHRsZVRpbWVyID0gbnVsbFxuICAgIH1cbiAgICBwZW5kaW5nQ29udGVudCA9IG51bGxcbiAgICBhY2N1bXVsYXRlZENvbnRlbnQgPSAnJ1xuICAgIGZsdXNoVG9TdG9yZXMoJycpXG4gICAgcmVhc29uaW5nU3RvcmUubWFya0Fuc3dlclJlc2V0KHBsYWNlaG9sZGVySWQpXG4gIH1cblxuICBjb25zdCBhcHBseVN0cmVhbUNvbXBsZXRlID0gKHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgY29uc3QgZmluYWxDb250ZW50ID0gKHBheWxvYWQuY29udGVudCBhcyBzdHJpbmcpIHx8IGFjY3VtdWxhdGVkQ29udGVudFxuICAgIGNvbnN0IHNvdXJjZXMgPSBwYXlsb2FkLnNvdXJjZXMgfHwgbnVsbFxuICAgIGNvbnN0IG1lbW9yeVNlc3Npb25JZCA9IChwYXlsb2FkLm1lbW9yeV9zZXNzaW9uX2lkIGFzIHN0cmluZykgfHwgJydcbiAgICBjb25zdCBhdHRhY2htZW50cyA9IEFycmF5LmlzQXJyYXkocGF5bG9hZC5hdHRhY2htZW50cykgPyBwYXlsb2FkLmF0dGFjaG1lbnRzIDogbnVsbFxuICAgIGxldCBzdWdnZXN0aW9uczogc3RyaW5nW10gfCBudWxsID0gbnVsbFxuICAgIGlmIChBcnJheS5pc0FycmF5KHBheWxvYWQuc3VnZ2VzdF9yZXBseSkpIHtcbiAgICAgIHN1Z2dlc3Rpb25zID0gcGF5bG9hZC5zdWdnZXN0X3JlcGx5IGFzIHN0cmluZ1tdXG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHBheWxvYWQuc3VnZ2VzdGlvbnMpKSB7XG4gICAgICBzdWdnZXN0aW9ucyA9IHBheWxvYWQuc3VnZ2VzdGlvbnMgYXMgc3RyaW5nW11cbiAgICB9XG4gICAgY29uc3QgYWdlbnRJZFJhdyA9IHBheWxvYWQuYWdlbnRfaWQgPz8gcGF5bG9hZC5hZ2VudElkXG4gICAgY29uc3QgY29tcGxldGVkQWdlbnRJZCA9IGFnZW50SWRSYXcgIT0gbnVsbCAmJiBTdHJpbmcoYWdlbnRJZFJhdykudHJpbSgpICE9PSAnJyA/IFN0cmluZyhhZ2VudElkUmF3KS50cmltKCkgOiBudWxsXG4gICAgY29uc3Qgc3ViYWdlbnRSYXcgPSBwYXlsb2FkLnN1YmFnZW50IGFzIHsgcmVzb2x2ZWRfY29udGV4dD86IHVua25vd24gfSB8IG51bGwgfCB1bmRlZmluZWRcbiAgICBjb25zdCByZXNvbHZlZENvbnRleHQgPSBzdWJhZ2VudFJhdz8ucmVzb2x2ZWRfY29udGV4dCA/PyBudWxsXG4gICAgY29uc3QgcmVhc29uaW5nID0gKHBheWxvYWQucmVhc29uaW5nIGFzIFJlYXNvbmluZ1RyYWNlUGF5bG9hZCB8IG51bGwpID8/IG51bGxcblxuICAgIHJlYXNvbmluZ1N0b3JlLmZpbmlzaChwbGFjZWhvbGRlcklkLCByZWFzb25pbmcpXG4gICAgZmx1c2hQZW5kaW5nKClcbiAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSwgaXNXcml0aW5nOiBmYWxzZSB9KVxuICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBudWxsKVxuICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ2NvbXBsZXRlJylcblxuICAgIGNvbnN0IGZpbmlzaFBheWxvYWQ6IFNlc3Npb25GaW5pc2hQYXlsb2FkID0ge1xuICAgICAgY29udGVudDogZmluYWxDb250ZW50LFxuICAgICAgc291cmNlcyxcbiAgICAgIG1lbW9yeVNlc3Npb25JZCxcbiAgICAgIGF0dGFjaG1lbnRzLFxuICAgICAgc3VnZ2VzdGlvbnMsXG4gICAgICBjb21wbGV0ZWRBZ2VudElkLFxuICAgICAgcmVzb2x2ZWRDb250ZXh0LFxuICAgICAgcmVhc29uaW5nLFxuICAgIH1cbiAgICBjYWxsYmFja3Mub25GaW5pc2hTdHJlYW0/LihmaW5pc2hQYXlsb2FkKVxuXG4gICAgLy8gRWwgdGV4dG8gZW4gdml2byBOTyBzZSBsaW1waWEgYWPDoSBhIHByb3DDs3NpdG8uIEVsIHBsYWNlaG9sZGVyIHNlIHZhIGNvbiBlbFxuICAgIC8vIGBkcm9wYCBxdWUgaGFjZSBlbCBjb25zdW1pZG9yLCB5IGNvbiDDqWwgc3Ugc3VzY3JpcGNpw7NuOyB2YWNpYXJsbyBhbnRlcyBsb1xuICAgIC8vIGRlamFiYSBtb250YWRvIHkgc2luIHRleHRvIChhbHR1cmEgMCkgZHVyYW50ZSB+MjVtczogZWwgZmxpY2tlciBkZSBmaW4gZGVcbiAgICAvLyBzdHJlYW0uIE5vIGFsY2FuemEgY29uIGRpZmVyaXJsbywgcG9ycXVlIGVzdGUgY2xlYXIgdmlhamEgZW4gU3luY0xhbmVcbiAgICAvLyAoc3RvcmUgZXh0ZXJubykgeSBlbCBzd2FwIGRlIG1lbnNhamVzIGVuIERlZmF1bHRMYW5lLCBhc8OtIHF1ZSBzaWVtcHJlIHNlXG4gICAgLy8gY3VlbGEgZW4gZWwgbWVkaW8uIEVsIHNsb3Qgc2UgbGliZXJhIGVuIGVsIHByw7N4aW1vIGBzdGFydCgpYCBkZSBsYSBzZXNpw7NuLFxuICAgIC8vIHkgZW4gc3RvcC9lcnJvci9hcHByb3ZhbC9jYW1iaW8gZGUgc2VzacOzbiwgcXVlIHPDrSBsbGFtYW4gYGNsZWFyYC5cbiAgfVxuXG4gIHRyeSB7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChhY3RpdmUuaXNTdG9wcGVkKSB7XG4gICAgICAgIHJlYWRlci5jYW5jZWwoKVxuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpXG4gICAgICBpZiAoZG9uZSkgYnJlYWtcblxuICAgICAgaWYgKGFjdGl2ZS5pc1N0b3BwZWQpIHtcbiAgICAgICAgcmVhZGVyLmNhbmNlbCgpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGJ1ZmZlciArPSBkZWNvZGVyLmRlY29kZSh2YWx1ZSwgeyBzdHJlYW06IHRydWUgfSlcbiAgICAgIGNvbnN0IGxpbmVzID0gYnVmZmVyLnNwbGl0KCdcXG5cXG4nKVxuICAgICAgYnVmZmVyID0gbGluZXMucG9wKCkgfHwgJydcblxuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgIGlmIChsaW5lLnRyaW0oKSA9PT0gJycpIGNvbnRpbnVlXG5cbiAgICAgICAgY29uc3QgW2V2ZW50TGluZSwgZGF0YUxpbmVdID0gbGluZS5zcGxpdCgnXFxuJylcbiAgICAgICAgaWYgKCFldmVudExpbmUgfHwgIWRhdGFMaW5lKSBjb250aW51ZVxuXG4gICAgICAgIGNvbnN0IGV2ZW50VHlwZSA9IGV2ZW50TGluZS5yZXBsYWNlKCdldmVudDogJywgJycpLnRyaW0oKVxuICAgICAgICBjb25zdCBkYXRhU3RyID0gZGF0YUxpbmUucmVwbGFjZSgnZGF0YTogJywgJycpLnRyaW0oKVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZGF0YVN0cilcblxuICAgICAgICAgIHN3aXRjaCAoZXZlbnRUeXBlKSB7XG4gICAgICAgICAgICBjYXNlICd0aGlua2luZyc6IHtcbiAgICAgICAgICAgICAgY29uc3QgdGhpbmtpbmdEZWx0YSA9IHR5cGVvZiBkYXRhLmRlbHRhID09PSAnc3RyaW5nJyA/IGRhdGEuZGVsdGEgOiAnJ1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEuaSA9PT0gJ251bWJlcicgJiYgdGhpbmtpbmdEZWx0YSkge1xuICAgICAgICAgICAgICAgIHJlYXNvbmluZ1N0b3JlLmFwcGVuZFRoaW5raW5nKHBsYWNlaG9sZGVySWQsIGRhdGEuaSwgdGhpbmtpbmdEZWx0YSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoIWhhc1N0YXJ0ZWRXcml0aW5nKSB7XG4gICAgICAgICAgICAgICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7IGlzTG9hZGluZzogdHJ1ZSB9KVxuICAgICAgICAgICAgICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ3RoaW5raW5nJylcbiAgICAgICAgICAgICAgICBpZiAoIWlzVXNpbmdTa2lsbCkge1xuICAgICAgICAgICAgICAgICAgc3RvcmUoKS5zZXRBY3Rpdml0eShzZXNzaW9uSWQsIHsgcGhhc2U6ICd0aGlua2luZycsIG1lc3NhZ2U6IGdldFRoaW5raW5nTG9hZGluZ01lc3NhZ2UoMCwgdCkgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2tpbGwgQC1tZW5jaW9uYWRhIChhbCBhYnJpciBlbCBzdHJlYW0pIG8gbGxhbWFkYSBhIGBnZXRfc2tpbGxgLlxuICAgICAgICAgICAgY2FzZSAndXNpbmdfc2tpbGwnOlxuICAgICAgICAgICAgICBpZiAoIWhhc1N0YXJ0ZWRXcml0aW5nKSB7XG4gICAgICAgICAgICAgICAgaXNVc2luZ1NraWxsID0gdHJ1ZVxuICAgICAgICAgICAgICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IHRydWUgfSlcbiAgICAgICAgICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICd0aGlua2luZycpXG4gICAgICAgICAgICAgICAgc3RvcmUoKS5zZXRBY3Rpdml0eShzZXNzaW9uSWQsIGdldFVzaW5nU2tpbGxBY3Rpdml0eSh0LCBkYXRhLnNraWxsKSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgICAvLyBFbCBiYWNrZW5kIGRlc2NhcnRhIGxvIGVtaXRpZG8geSByZWluaWNpYSBsYSByZXNwdWVzdGEgZGVzZGUgY2Vyby5cbiAgICAgICAgICAgIGNhc2UgJ2Fuc3dlcl9yZXNldCc6XG4gICAgICAgICAgICAgIGNsZWFyU3RyZWFtTGlrZUFuc3dlclJlc2V0KClcbiAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgLy8gTUFJQSByZWNvcnTDsyBlbCBjb250ZXh0byBwYXJhIHF1ZSBlbCByZXF1ZXN0IGVudHJhcmEuIFPDs2xvIGxsZWdhXG4gICAgICAgICAgICAvLyBjdWFuZG8gZWwgcmVjb3J0ZSBzZSBub3RhIChpbcOhZ2VuZXMgdmllamFzLCB0dXJub3MgZW50ZXJvcyBvIGVsXG4gICAgICAgICAgICAvLyB0ZXh0byBsaXRlcmFsIGRlIHR1cm5vcyB2aWVqb3MpLCB5IHZpYWphIGp1bnRvIGEgbGEgdHJhemEgcG9ycXVlXG4gICAgICAgICAgICAvLyBjb21wYXJ0ZSBzdSBjaWNsbyBkZSB2aWRhOiBtaXNtbyBwbGFjZWhvbGRlciwgbWlzbW8gcmVuYW1lLlxuICAgICAgICAgICAgY2FzZSAnY29udGV4dF9jb21wYWN0ZWQnOlxuICAgICAgICAgICAgICByZWFzb25pbmdTdG9yZS5zZXRDb21wYWN0aW9uKHBsYWNlaG9sZGVySWQsIGRhdGEgYXMgQ29udGV4dENvbXBhY3Rpb25QYXlsb2FkKVxuICAgICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgICBjYXNlICdyZWFzb25pbmdfc3RlcCc6IHtcbiAgICAgICAgICAgICAgY29uc3Qgc3RlcFRvb2wgPSB0eXBlb2YgZGF0YS50b29sID09PSAnc3RyaW5nJyA/IGRhdGEudG9vbCA6ICcnXG4gICAgICAgICAgICAgIGNvbnN0IHN0ZXBUeXBlID0gdHlwZW9mIGRhdGEudHlwZSA9PT0gJ3N0cmluZycgPyBkYXRhLnR5cGUgOiAnJ1xuICAgICAgICAgICAgICBpZiAoc3RlcFRvb2wgJiYgc3RlcFR5cGUgIT09ICdoYW5kb2ZmJyAmJiBkYXRhLnN0YXR1cyA9PT0gJ3J1bm5pbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSByZXNvbHZlVG9vbEFjdGlvbkxhYmVsKHN0ZXBUb29sLCB0LCAncHJlc2VudCcpXG4gICAgICAgICAgICAgICAgaWYgKGxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICBpc1VzaW5nU2tpbGwgPSBzdGVwVG9vbCA9PT0gJ2dldF9za2lsbCdcbiAgICAgICAgICAgICAgICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IHRydWUgfSlcbiAgICAgICAgICAgICAgICAgIC8vIEVsIHN0ZXAgZGUgYGdldF9za2lsbGAgbGxlZ2EganVzdG8gZGVzcHXDqXMgZGUgYHVzaW5nX3NraWxsYDogbWFudGllbmUgZWwgbm9tYnJlLlxuICAgICAgICAgICAgICAgICAgc3RvcmUoKS5zZXRBY3Rpdml0eShcbiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgICAgICAgICBpc1VzaW5nU2tpbGwgPyBnZXRVc2luZ1NraWxsQWN0aXZpdHkodCwgZGF0YS5hcmdzPy5uYW1lKSA6IHsgcGhhc2U6ICdhY3Rpb24nLCBtZXNzYWdlOiBsYWJlbCB9XG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YS5pID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHJlYXNvbmluZ1N0b3JlLmNhcHR1cmVMZWFkaW5nRnJvbUJvZHkocGxhY2Vob2xkZXJJZCwgYWNjdW11bGF0ZWRDb250ZW50KVxuICAgICAgICAgICAgICAgIHJlYXNvbmluZ1N0b3JlLmFwcGx5U3RlcChwbGFjZWhvbGRlcklkLCBkYXRhIGFzIFJlYXNvbmluZ1N0ZXBQYXlsb2FkKVxuICAgICAgICAgICAgICAgIGlmIChyZWFzb25pbmdTdG9yZS5zaG91bGRDbGVhclN0cmVhbUZvckxlYWRpbmcocGxhY2Vob2xkZXJJZCwgYWNjdW11bGF0ZWRDb250ZW50KSkge1xuICAgICAgICAgICAgICAgICAgY2xlYXJTdHJlYW1MaWtlQW5zd2VyUmVzZXQoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlICd0b2tlbic6IHtcbiAgICAgICAgICAgICAgY29uc3QgY2h1bmsgPSB0eXBlb2YgZGF0YS5jb250ZW50ID09PSAnc3RyaW5nJyA/IGRhdGEuY29udGVudCA6ICcnXG4gICAgICAgICAgICAgIGVuc3VyZVdyaXRpbmdTdGFydGVkKClcbiAgICAgICAgICAgICAgYXBwbHlTdHJlYW1DaHVuayhjaHVuaylcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSAnY29udGVudCc6IHtcbiAgICAgICAgICAgICAgY29uc3QgY2h1bmsgPSB0eXBlb2YgZGF0YS5jb250ZW50ID09PSAnc3RyaW5nJyA/IGRhdGEuY29udGVudCA6ICcnXG4gICAgICAgICAgICAgIGVuc3VyZVdyaXRpbmdTdGFydGVkKClcbiAgICAgICAgICAgICAgYXBwbHlTdHJlYW1DaHVuayhjaHVuaylcbiAgICAgICAgICAgICAgaWYgKGlzQ29tcGxldGVMaWtlU3NlUGF5bG9hZChkYXRhKSkge1xuICAgICAgICAgICAgICAgIGFwcGx5U3RyZWFtQ29tcGxldGUoZGF0YSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlICdub2RlJzpcbiAgICAgICAgICAgICAgaXNVc2luZ1NraWxsID0gZmFsc2VcbiAgICAgICAgICAgICAgaWYgKGRhdGEubm9kZSA9PT0gJ2FnZW50X3RyYW5zZmVyJykge1xuICAgICAgICAgICAgICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IHRydWUgfSlcbiAgICAgICAgICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICd0aGlua2luZycpXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS5tZXNzYWdlICYmIHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7IGlzTG9hZGluZzogdHJ1ZSB9KVxuICAgICAgICAgICAgICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ3RoaW5raW5nJylcbiAgICAgICAgICAgICAgICBzdG9yZSgpLnNldEFjdGl2aXR5KFxuICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgICAgICAgcmVzb2x2ZUhpdGxOb2RlU3RyZWFtQWN0aXZpdHkoXG4gICAgICAgICAgICAgICAgICAgIGRhdGEubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgdCxcbiAgICAgICAgICAgICAgICAgICAgaGl0bEV4ZWN1dGlvbkNvbnRleHQgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgZGF0YS50aHJlYWRfaWQgPT09ICdzdHJpbmcnID8gZGF0YS50aHJlYWRfaWQgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgY2FzZSAnY29tcGxldGUnOlxuICAgICAgICAgICAgICBhcHBseVN0cmVhbUNvbXBsZXRlKGRhdGEpXG4gICAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICAgIGNhc2UgJ2FwcHJvdmFsX3JlcXVpcmVkJzoge1xuICAgICAgICAgICAgICBmbHVzaFBlbmRpbmcoKVxuICAgICAgICAgICAgICAvLyBQcmVhcHJvYmFkbyAoYXV0by1hcHByb3ZlIG8gZGV0ZWNjacOzbiBtYW51YWwpOiBlbCBzdHJlYW0gbm8gc2UgY29ydGEsXG4gICAgICAgICAgICAgIC8vIHNpZ3VlIGVqZWN1dGFuZG8gbGFzIGFjY2lvbmVzIHNpbiBlc3BlcmFyIGRlY2lzacOzbiBkZWwgdXN1YXJpby5cbiAgICAgICAgICAgICAgY29uc3QgaXNQcmVBcHByb3ZlZCA9XG4gICAgICAgICAgICAgICAgZGF0YS5tYW51YWxfYXBwcm92YWxfZGV0ZWN0ZWQgPT09IHRydWUgfHxcbiAgICAgICAgICAgICAgICBkYXRhLmF1dG9fYXBwcm92ZWQgPT09IHRydWUgfHxcbiAgICAgICAgICAgICAgICBkYXRhLmFwcHJvdmFsX3N0YXR1cyA9PT0gJ2FwcHJvdmVkJ1xuICAgICAgICAgICAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNXcml0aW5nOiBmYWxzZSB9KVxuICAgICAgICAgICAgICBpZiAoIWlzUHJlQXBwcm92ZWQpIHtcbiAgICAgICAgICAgICAgICByZWFzb25pbmdTdG9yZS5maW5pc2gocGxhY2Vob2xkZXJJZCwgKGRhdGEucmVhc29uaW5nIGFzIFJlYXNvbmluZ1RyYWNlUGF5bG9hZCB8IG51bGwpID8/IG51bGwpXG4gICAgICAgICAgICAgICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7IGlzTG9hZGluZzogZmFsc2UgfSlcbiAgICAgICAgICAgICAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5jbGVhcihzZXNzaW9uSWQpXG4gICAgICAgICAgICAgICAgc3RvcmUoKS5zZXRBY3Rpdml0eShzZXNzaW9uSWQsIG51bGwpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAnYXdhaXRpbmdfYXBwcm92YWwnKVxuICAgICAgICAgICAgICBjYWxsYmFja3Mub25BcHByb3ZhbFJlcXVpcmVkPy4oZGF0YSBhcyBBcHByb3ZhbFJlcXVlc3QsIGFjY3VtdWxhdGVkQ29udGVudClcbiAgICAgICAgICAgICAgaWYgKGlzUHJlQXBwcm92ZWQgJiYgQXJyYXkuaXNBcnJheShkYXRhLnBlbmRpbmdfYWN0aW9ucykgJiYgZGF0YS5wZW5kaW5nX2FjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IHRydWUgfSlcbiAgICAgICAgICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICd0aGlua2luZycpXG4gICAgICAgICAgICAgICAgc3RvcmUoKS5zZXRBY3Rpdml0eShzZXNzaW9uSWQsIHJlc29sdmVJbml0aWFsSGl0bFN0cmVhbUFjdGl2aXR5KHQsIGhpdGxFeGVjdXRpb25Db250ZXh0ID8/IHVuZGVmaW5lZCkpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdTU0UgRXJyb3I6JywgZGF0YS5lcnJvcilcbiAgICAgICAgICAgICAgZmx1c2hQZW5kaW5nKClcbiAgICAgICAgICAgICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgICAgICAgICAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSwgaXNXcml0aW5nOiBmYWxzZSB9KVxuICAgICAgICAgICAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgbnVsbClcbiAgICAgICAgICAgICAgc3RvcmUoKS5zZXRFcnJvcihzZXNzaW9uSWQsIHsgdHlwZTogZGF0YS5lcnJvcj8udHlwZSwgbWVzc2FnZTogZGF0YS5lcnJvcj8ubWVzc2FnZSB9KVxuICAgICAgICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICdlcnJvcicpXG4gICAgICAgICAgICAgIGNhbGxiYWNrcy5vbkVycm9yPy4oZGF0YS5lcnJvcj8udHlwZSwgZGF0YS5lcnJvcj8ubWVzc2FnZSlcbiAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdVbmtub3duIFNTRSBldmVudCB0eXBlOicsIGV2ZW50VHlwZSlcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKHBhcnNlRXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIFNTRSBkYXRhOicsIHBhcnNlRXJyb3IsIGRhdGFTdHIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgZmx1c2hQZW5kaW5nKClcbiAgfVxufVxuXG4vKipcbiAqIE1hbmFnZXIgc2luZ2xldG9uIChtb2R1bGUtbGV2ZWwpIHF1ZSBjb3JyZSBOIHN0cmVhbXMgZGVsIG9yY2hlc3RyYXRvciBlblxuICogcGFyYWxlbG8sIHVubyBwb3IgYHNlc3Npb25JZGAuIFNvYnJldml2ZSBhIGNhbWJpb3MgZGUgdmlzdGEgeSBhbCBjaWVycmUgZGVsXG4gKiBtb2RhbDogbG9zIHN0cmVhbXMgc29sbyBzZSBjYW5jZWxhbiBjb24gc3RvcCBleHBsw61jaXRvIGRlbCB1c3VhcmlvIG8gYWxcbiAqIGNvbXBsZXRhci9lcnJvcmFyLlxuICovXG5leHBvcnQgY29uc3Qgc2Vzc2lvblN0cmVhbU1hbmFnZXIgPSB7XG4gIGlzQWN0aXZlOiBpc1N0cmVhbUFjdGl2ZSxcbiAgZ2V0QWN0aXZlQ291bnQ6IGdldEFjdGl2ZVN0cmVhbUNvdW50LFxuICBnZXRBY3RpdmVTZXNzaW9uSWRzOiAoKTogc3RyaW5nW10gPT4gQXJyYXkuZnJvbShhY3RpdmVTdHJlYW1zLmtleXMoKSksXG5cbiAgYXN5bmMgc3RhcnRTdHJlYW0ocGFyYW1zOiBTdGFydFN0cmVhbVBhcmFtcyk6IFByb21pc2U8U3RhcnRTdHJlYW1SZXN1bHQ+IHtcbiAgICBlbnN1cmVTZXNzaW9uTm90aWZpY2F0aW9uc0luaXRpYWxpemVkKClcblxuICAgIGNvbnN0IHsgc2Vzc2lvbklkLCBwbGFjZWhvbGRlcklkLCByZXF1ZXN0LCBjYWxsYmFja3MsIHQsIGFjdGl2aXR5T3B0aW9ucywgYWdlbnRJZCwgYWdlbnROYW1lIH0gPSBwYXJhbXNcblxuICAgIGlmIChpc1N0cmVhbUFjdGl2ZShzZXNzaW9uSWQpKSB7XG4gICAgICByZXR1cm4geyBzdGFydGVkOiBmYWxzZSwgcmVhc29uOiAnYWxyZWFkeV9hY3RpdmUnIH1cbiAgICB9XG4gICAgaWYgKGdldEFjdGl2ZVN0cmVhbUNvdW50KCkgPj0gTUFYX0NPTkNVUlJFTlRfU1RSRUFNUykge1xuICAgICAgcmV0dXJuIHsgc3RhcnRlZDogZmFsc2UsIHJlYXNvbjogJ2xpbWl0JyB9XG4gICAgfVxuXG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgIGNvbnN0IGFjdGl2ZTogQWN0aXZlU3RyZWFtID0geyBzZXNzaW9uSWQsIGNvbnRyb2xsZXIsIGlzU3RvcHBlZDogZmFsc2UgfVxuICAgIGFjdGl2ZVN0cmVhbXMuc2V0KHNlc3Npb25JZCwgYWN0aXZlKVxuXG4gICAgc3RvcmUoKS5lbnN1cmVTZXNzaW9uKHNlc3Npb25JZClcbiAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHtcbiAgICAgIHBsYWNlaG9sZGVySWQsXG4gICAgICBlcnJvcjogbnVsbCxcbiAgICAgIGlzTG9hZGluZzogdHJ1ZSxcbiAgICAgIGlzV3JpdGluZzogZmFsc2UsXG4gICAgICAuLi4oYWdlbnRJZCAhPSBudWxsID8geyBhZ2VudElkIH0gOiB7fSksXG4gICAgICAuLi4oYWdlbnROYW1lICE9IG51bGwgPyB7IGFnZW50TmFtZSB9IDoge30pLFxuICAgIH0pXG4gICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAndGhpbmtpbmcnKVxuICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LnN0YXJ0KHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZClcbiAgICByZWFzb25pbmdTdG9yZS5zdGFydChwbGFjZWhvbGRlcklkKVxuICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBnZXRJbml0aWFsU3RyZWFtQWN0aXZpdHkodCwgYWN0aXZpdHlPcHRpb25zID8/IHt9KSlcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1haWEuT3JjaGVzdHJhdG9yLm9yY2hlc3RyYXRvcihyZXF1ZXN0LCBjb250cm9sbGVyLnNpZ25hbClcbiAgICAgIGF3YWl0IHBhcnNlU2Vzc2lvblNTRShyZXNwb25zZSwgYWN0aXZlLCBwYXJhbXMpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghYWN0aXZlLmlzU3RvcHBlZCkge1xuICAgICAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5jbGVhcihzZXNzaW9uSWQpXG4gICAgICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IGZhbHNlLCBpc1dyaXRpbmc6IGZhbHNlIH0pXG4gICAgICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBudWxsKVxuICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICdlcnJvcicpXG4gICAgICAgIGNhbGxiYWNrcy5vbkVycm9yPy4oKVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhY3RpdmVTdHJlYW1zLmRlbGV0ZShzZXNzaW9uSWQpXG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc3RhcnRlZDogdHJ1ZSB9XG4gIH0sXG5cbiAgLyoqIFJlc3VtZSBISVRMIChgY29udGludWUtdGhyZWFkYCkga2V5ZWQgcG9yIHNlc3Npb25JZCDigJQgbWlzbW8gbW90b3IgcXVlIG9yY2hlc3RyYXRvci4gKi9cbiAgYXN5bmMgc3RhcnRDb250aW51ZVN0cmVhbShwYXJhbXM6IFN0YXJ0Q29udGludWVTdHJlYW1QYXJhbXMpOiBQcm9taXNlPFN0YXJ0U3RyZWFtUmVzdWx0PiB7XG4gICAgZW5zdXJlU2Vzc2lvbk5vdGlmaWNhdGlvbnNJbml0aWFsaXplZCgpXG5cbiAgICBjb25zdCB7IHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZCwgY29udGludWVSZXF1ZXN0LCBjYWxsYmFja3MsIHQsIGhpdGxFeGVjdXRpb25Db250ZXh0LCBhZ2VudElkLCBhZ2VudE5hbWUgfSA9IHBhcmFtc1xuXG4gICAgaWYgKGlzU3RyZWFtQWN0aXZlKHNlc3Npb25JZCkpIHtcbiAgICAgIHJldHVybiB7IHN0YXJ0ZWQ6IGZhbHNlLCByZWFzb246ICdhbHJlYWR5X2FjdGl2ZScgfVxuICAgIH1cbiAgICBpZiAoZ2V0QWN0aXZlU3RyZWFtQ291bnQoKSA+PSBNQVhfQ09OQ1VSUkVOVF9TVFJFQU1TKSB7XG4gICAgICByZXR1cm4geyBzdGFydGVkOiBmYWxzZSwgcmVhc29uOiAnbGltaXQnIH1cbiAgICB9XG5cbiAgICBpZiAoaGl0bEV4ZWN1dGlvbkNvbnRleHQpIHtcbiAgICAgIHNlc3Npb25IaXRsQ29udGV4dC5zZXQoc2Vzc2lvbklkLCBoaXRsRXhlY3V0aW9uQ29udGV4dClcbiAgICB9XG5cbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gICAgY29uc3QgYWN0aXZlOiBBY3RpdmVTdHJlYW0gPSB7IHNlc3Npb25JZCwgY29udHJvbGxlciwgaXNTdG9wcGVkOiBmYWxzZSB9XG4gICAgYWN0aXZlU3RyZWFtcy5zZXQoc2Vzc2lvbklkLCBhY3RpdmUpXG5cbiAgICBzdG9yZSgpLmVuc3VyZVNlc3Npb24oc2Vzc2lvbklkKVxuICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwge1xuICAgICAgcGxhY2Vob2xkZXJJZCxcbiAgICAgIGVycm9yOiBudWxsLFxuICAgICAgaXNMb2FkaW5nOiB0cnVlLFxuICAgICAgaXNXcml0aW5nOiBmYWxzZSxcbiAgICAgIC4uLihhZ2VudElkICE9IG51bGwgPyB7IGFnZW50SWQgfSA6IHt9KSxcbiAgICAgIC4uLihhZ2VudE5hbWUgIT0gbnVsbCA/IHsgYWdlbnROYW1lIH0gOiB7fSksXG4gICAgfSlcbiAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICd0aGlua2luZycpXG4gICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuc3RhcnQoc2Vzc2lvbklkLCBwbGFjZWhvbGRlcklkKVxuICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoXG4gICAgICBzZXNzaW9uSWQsXG4gICAgICByZXNvbHZlSW5pdGlhbEhpdGxTdHJlYW1BY3Rpdml0eSh0LCBoaXRsRXhlY3V0aW9uQ29udGV4dCA/PyBzZXNzaW9uSGl0bENvbnRleHQuZ2V0KHNlc3Npb25JZCkgPz8gdW5kZWZpbmVkKVxuICAgIClcblxuICAgIGNvbnN0IHNzZVBhcmFtczogU3RhcnRTdHJlYW1QYXJhbXMgPSB7XG4gICAgICBzZXNzaW9uSWQsXG4gICAgICBwbGFjZWhvbGRlcklkLFxuICAgICAgcmVxdWVzdDoge30gYXMgT3JjaGVzdHJhdG9yUmVxdWVzdCxcbiAgICAgIGNhbGxiYWNrcyxcbiAgICAgIHQsXG4gICAgICBoaXRsRXhlY3V0aW9uQ29udGV4dDogaGl0bEV4ZWN1dGlvbkNvbnRleHQgPz8gc2Vzc2lvbkhpdGxDb250ZXh0LmdldChzZXNzaW9uSWQpLFxuICAgICAgYWdlbnRJZCxcbiAgICAgIGFnZW50TmFtZSxcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBtYWlhLk9yY2hlc3RyYXRvci5jb250aW51ZVRocmVhZChjb250aW51ZVJlcXVlc3QsIGNvbnRyb2xsZXIuc2lnbmFsKVxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNvbnRpbnVlLXRocmVhZCBmYWlsZWQ6ICR7cmVzcG9uc2Uuc3RhdHVzfWApXG4gICAgICB9XG4gICAgICBhd2FpdCBwYXJzZVNlc3Npb25TU0UocmVzcG9uc2UsIGFjdGl2ZSwgc3NlUGFyYW1zKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWFjdGl2ZS5pc1N0b3BwZWQpIHtcbiAgICAgICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgICAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSwgaXNXcml0aW5nOiBmYWxzZSB9KVxuICAgICAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgbnVsbClcbiAgICAgICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAnZXJyb3InKVxuICAgICAgICBjYWxsYmFja3Mub25FcnJvcj8uKClcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgYWN0aXZlU3RyZWFtcy5kZWxldGUoc2Vzc2lvbklkKVxuICAgICAgc2Vzc2lvbkhpdGxDb250ZXh0LmNsZWFyKHNlc3Npb25JZClcbiAgICB9XG5cbiAgICByZXR1cm4geyBzdGFydGVkOiB0cnVlIH1cbiAgfSxcblxuICAvKiogUmVnZW5lcmEgbGEgcmVzcHVlc3RhIGRlIHVuIHR1cm5vIChgcmV0cnlfY29tcGxldGlvbmApIOKAlCBtaXNtbyBtb3RvciBTU0UgcXVlIG9yY2hlc3RyYXRvci4gKi9cbiAgYXN5bmMgc3RhcnRSZXRyeVN0cmVhbShwYXJhbXM6IFN0YXJ0UmV0cnlTdHJlYW1QYXJhbXMpOiBQcm9taXNlPFN0YXJ0U3RyZWFtUmVzdWx0PiB7XG4gICAgZW5zdXJlU2Vzc2lvbk5vdGlmaWNhdGlvbnNJbml0aWFsaXplZCgpXG5cbiAgICBjb25zdCB7IHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZCwgcmV0cnlSZXF1ZXN0LCBjYWxsYmFja3MsIHQsIGFjdGl2aXR5T3B0aW9ucywgYWdlbnRJZCwgYWdlbnROYW1lIH0gPSBwYXJhbXNcblxuICAgIGlmIChpc1N0cmVhbUFjdGl2ZShzZXNzaW9uSWQpKSB7XG4gICAgICByZXR1cm4geyBzdGFydGVkOiBmYWxzZSwgcmVhc29uOiAnYWxyZWFkeV9hY3RpdmUnIH1cbiAgICB9XG4gICAgaWYgKGdldEFjdGl2ZVN0cmVhbUNvdW50KCkgPj0gTUFYX0NPTkNVUlJFTlRfU1RSRUFNUykge1xuICAgICAgcmV0dXJuIHsgc3RhcnRlZDogZmFsc2UsIHJlYXNvbjogJ2xpbWl0JyB9XG4gICAgfVxuXG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgIGNvbnN0IGFjdGl2ZTogQWN0aXZlU3RyZWFtID0geyBzZXNzaW9uSWQsIGNvbnRyb2xsZXIsIGlzU3RvcHBlZDogZmFsc2UgfVxuICAgIGFjdGl2ZVN0cmVhbXMuc2V0KHNlc3Npb25JZCwgYWN0aXZlKVxuXG4gICAgc3RvcmUoKS5lbnN1cmVTZXNzaW9uKHNlc3Npb25JZClcbiAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHtcbiAgICAgIHBsYWNlaG9sZGVySWQsXG4gICAgICBlcnJvcjogbnVsbCxcbiAgICAgIGlzTG9hZGluZzogdHJ1ZSxcbiAgICAgIGlzV3JpdGluZzogZmFsc2UsXG4gICAgICAuLi4oYWdlbnRJZCAhPSBudWxsID8geyBhZ2VudElkIH0gOiB7fSksXG4gICAgICAuLi4oYWdlbnROYW1lICE9IG51bGwgPyB7IGFnZW50TmFtZSB9IDoge30pLFxuICAgIH0pXG4gICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAndGhpbmtpbmcnKVxuICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LnN0YXJ0KHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZClcbiAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgZ2V0SW5pdGlhbFN0cmVhbUFjdGl2aXR5KHQsIGFjdGl2aXR5T3B0aW9ucyA/PyB7fSkpXG5cbiAgICBjb25zdCBzc2VQYXJhbXM6IFN0YXJ0U3RyZWFtUGFyYW1zID0ge1xuICAgICAgc2Vzc2lvbklkLFxuICAgICAgcGxhY2Vob2xkZXJJZCxcbiAgICAgIHJlcXVlc3Q6IHt9IGFzIE9yY2hlc3RyYXRvclJlcXVlc3QsXG4gICAgICBjYWxsYmFja3MsXG4gICAgICB0LFxuICAgICAgYWN0aXZpdHlPcHRpb25zLFxuICAgICAgYWdlbnRJZCxcbiAgICAgIGFnZW50TmFtZSxcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBtYWlhLk9yY2hlc3RyYXRvci5yZXRyeUNvbXBsZXRpb24ocmV0cnlSZXF1ZXN0LCBjb250cm9sbGVyLnNpZ25hbClcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgbGV0IGRldGFpbDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7IGRldGFpbD86IHN0cmluZyB9XG4gICAgICAgICAgICBkZXRhaWwgPSB0eXBlb2YgZGF0YS5kZXRhaWwgPT09ICdzdHJpbmcnID8gZGF0YS5kZXRhaWwgOiB1bmRlZmluZWRcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIGRldGFpbCA9IHVuZGVmaW5lZFxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGV0YWlsID09PSAnVHVybiBub3QgZm91bmQnKSB7XG4gICAgICAgICAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5jbGVhcihzZXNzaW9uSWQpXG4gICAgICAgICAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSwgaXNXcml0aW5nOiBmYWxzZSwgcGxhY2Vob2xkZXJJZDogbnVsbCB9KVxuICAgICAgICAgICAgc3RvcmUoKS5zZXRBY3Rpdml0eShzZXNzaW9uSWQsIG51bGwpXG4gICAgICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICdpZGxlJylcbiAgICAgICAgICAgIGFjdGl2ZVN0cmVhbXMuZGVsZXRlKHNlc3Npb25JZClcbiAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0ZWQ6IGZhbHNlLCByZWFzb246ICd0dXJuX25vdF9mb3VuZCcgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHJldHJ5X2NvbXBsZXRpb24gZmFpbGVkOiAke3Jlc3BvbnNlLnN0YXR1c31gKVxuICAgICAgfVxuICAgICAgYXdhaXQgcGFyc2VTZXNzaW9uU1NFKHJlc3BvbnNlLCBhY3RpdmUsIHNzZVBhcmFtcylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFhY3RpdmUuaXNTdG9wcGVkKSB7XG4gICAgICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LmNsZWFyKHNlc3Npb25JZClcbiAgICAgICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7IGlzTG9hZGluZzogZmFsc2UsIGlzV3JpdGluZzogZmFsc2UgfSlcbiAgICAgICAgc3RvcmUoKS5zZXRBY3Rpdml0eShzZXNzaW9uSWQsIG51bGwpXG4gICAgICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ2Vycm9yJylcbiAgICAgICAgY2FsbGJhY2tzLm9uRXJyb3I/LigpXG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGFjdGl2ZVN0cmVhbXMuZGVsZXRlKHNlc3Npb25JZClcbiAgICB9XG5cbiAgICByZXR1cm4geyBzdGFydGVkOiB0cnVlIH1cbiAgfSxcblxuICAvKiogQ2FuY2VsYWNpw7NuIGV4cGzDrWNpdGEgZGVsIHVzdWFyaW8gKG1lbnNhamUgXCJjYW5jZWxhZG9cIikuICovXG4gIHN0b3BTdHJlYW0oc2Vzc2lvbklkOiBzdHJpbmcsIGNhbGxiYWNrcz86IFNlc3Npb25TdHJlYW1DYWxsYmFja3MpIHtcbiAgICBjb25zdCBhY3RpdmUgPSBhY3RpdmVTdHJlYW1zLmdldChzZXNzaW9uSWQpXG4gICAgaWYgKCFhY3RpdmUpIHJldHVyblxuICAgIGFjdGl2ZS5pc1N0b3BwZWQgPSB0cnVlXG4gICAgYWN0aXZlLmNvbnRyb2xsZXIuYWJvcnQoKVxuICAgIGFjdGl2ZVN0cmVhbXMuZGVsZXRlKHNlc3Npb25JZClcbiAgICAvLyBFbCBwYXJjaWFsIHNlIHJlc2NhdGEgYW50ZXMgZGUgbGltcGlhcjogZWwgYmFja2VuZCBsbyBwZXJzaXN0ZSwgcGVybyBzaSBubyBsb1xuICAgIC8vIHBhc2Ftb3MgYWwgY2FsbGJhY2sgZGVzYXBhcmVjZSBkZSBwYW50YWxsYSBoYXN0YSBlbCBwcsOzeGltbyBmZXRjaCBkZSBsYSBzZXNpw7NuLlxuICAgIGNvbnN0IHBhcnRpYWxUZXh0ID0gc2Vzc2lvblN0cmVhbWluZ1RleHQuZ2V0U25hcHNob3Qoc2Vzc2lvbklkKS50ZXh0XG4gICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IGZhbHNlLCBpc1dyaXRpbmc6IGZhbHNlIH0pXG4gICAgc3RvcmUoKS5zZXRBY3Rpdml0eShzZXNzaW9uSWQsIG51bGwpXG4gICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAnY2FuY2VsbGVkJylcbiAgICBjYWxsYmFja3M/Lm9uU3RvcD8uKHBhcnRpYWxUZXh0KVxuICB9LFxuXG4gIC8qKiBBYm9ydGEgc2luIG1hcmNhciBcImNhbmNlbGFkb1wiICh1c28gaW50ZXJubyAvIGxpbXBpZXphKS4gKi9cbiAgYWJvcnRTaWxlbnRseShzZXNzaW9uSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGFjdGl2ZSA9IGFjdGl2ZVN0cmVhbXMuZ2V0KHNlc3Npb25JZClcbiAgICBpZiAoIWFjdGl2ZSkgcmV0dXJuXG4gICAgYWN0aXZlLmlzU3RvcHBlZCA9IHRydWVcbiAgICBhY3RpdmUuY29udHJvbGxlci5hYm9ydCgpXG4gICAgYWN0aXZlU3RyZWFtcy5kZWxldGUoc2Vzc2lvbklkKVxuICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LmNsZWFyKHNlc3Npb25JZClcbiAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSwgaXNXcml0aW5nOiBmYWxzZSB9KVxuICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBudWxsKVxuICAgIGlmIChzdG9yZSgpLmdldE1ldGEoc2Vzc2lvbklkKT8uc3RhdHVzICE9PSAnY29tcGxldGUnKSB7XG4gICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICdpZGxlJylcbiAgICB9XG4gIH0sXG5cbiAgYWJvcnRBbGwoKSB7XG4gICAgQXJyYXkuZnJvbShhY3RpdmVTdHJlYW1zLmtleXMoKSkuZm9yRWFjaChzZXNzaW9uSWQgPT4gdGhpcy5hYm9ydFNpbGVudGx5KHNlc3Npb25JZCkpXG4gIH0sXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU9BLElBQUksTUFBTSxxQkFBcUI7QUFFdEMsU0FDRUMsd0JBQXdCLEVBQ3hCQyx5QkFBeUIsRUFDekJDLHFCQUFxQixFQUNyQkMsd0JBQXdCLEVBQ3hCQyw2QkFBNkIsRUFDN0JDLGdDQUFnQyxFQUNoQ0Msc0JBQXNCLFFBQ2pCLG9DQUFvQztBQUUzQyxTQUFTQyx3QkFBd0IsRUFBRUMsZ0JBQWdCLFFBQVEsOEJBQThCO0FBQ3pGLFNBQVNDLGNBQWMsUUFBUSwrQkFBK0I7QUFHOUQsU0FBU0Msb0JBQW9CLFFBQVEsd0JBQXdCO0FBQzdELFNBQVNDLGdCQUFnQixRQUFRLG9CQUFvQjtBQUNyRCxTQUFTQyxxQ0FBcUMsUUFBUSx3QkFBd0I7QUFDOUUsU0FBU0Msa0JBQWtCLFFBQVEsc0JBQXNCOztBQU96RDs7QUFxREE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLElBQU1DLHNCQUFzQixHQUFHLENBQUM7QUFFdkMsSUFBTUMsa0JBQWtCLEdBQUcsRUFBRTtBQUU3QixJQUFNQyxhQUFhLEdBQUcsSUFBSUMsR0FBRyxDQUF1QixDQUFDO0FBRXJELElBQU1DLEtBQUssR0FBRyxTQUFSQSxLQUFL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
|
|
723
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJtYWlhIiwiZ2V0SW5pdGlhbFN0cmVhbUFjdGl2aXR5IiwiZ2V0VGhpbmtpbmdTdHJlYW1BY3Rpdml0eSIsImdldFVzaW5nU2tpbGxBY3Rpdml0eSIsImdldFdyaXRpbmdTdHJlYW1BY3Rpdml0eSIsInJlc29sdmVJbml0aWFsSGl0bFN0cmVhbUFjdGl2aXR5IiwiaXNDb21wbGV0ZUxpa2VTc2VQYXlsb2FkIiwibWVyZ2VTdHJlYW1DaHVuayIsInJlYXNvbmluZ1N0b3JlIiwic2Vzc2lvblN0cmVhbWluZ1RleHQiLCJ1c2VTZXNzaW9uc1N0b3JlIiwiZW5zdXJlU2Vzc2lvbk5vdGlmaWNhdGlvbnNJbml0aWFsaXplZCIsInNlc3Npb25IaXRsQ29udGV4dCIsImJ1aWxkU2Vzc2lvbkZpbmlzaFBheWxvYWQiLCJpc0FnZW50VHJhbnNmZXJOb2RlIiwiaXNBcHByb3ZhbFByZUFwcHJvdmVkIiwiaXNSZXRyeVR1cm5Ob3RGb3VuZFJlc3BvbnNlIiwicGFyc2VTc2VCbG9jayIsInBhdGNoTWV0YUFnZW50RmllbGRzIiwicmVzb2x2ZU5vZGVTdHJlYW1NZXNzYWdlIiwicmVzb2x2ZVJlYXNvbmluZ1N0ZXBUb29sIiwicmVzb2x2ZVJlYXNvbmluZ1N0ZXBUeXBlIiwicmVzb2x2ZVN0YXJ0U3RyZWFtR3VhcmQiLCJyZXNvbHZlU3RyZWFtVGV4dENodW5rIiwicmVzb2x2ZVRoaW5raW5nRGVsdGEiLCJzaG91bGRBYm9ydFNlc3Npb25TdHJlYW1PblN0b3AiLCJzaG91bGRBcHBseVJlYXNvbmluZ1N0ZXBJbmRleCIsInNob3VsZEFwcGVuZFRoaW5raW5nU3RlcCIsInNob3VsZFJlc3VtZUhpdGxBZnRlclByZUFwcHJvdmFsIiwic2hvdWxkU2V0SWRsZU9uU2lsZW50QWJvcnQiLCJzaG91bGRTaG93UmVhc29uaW5nVG9vbEFjdGl2aXR5Iiwic3BsaXRTc2VCdWZmZXIiLCJNQVhfQ09OQ1VSUkVOVF9TVFJFQU1TIiwiU1RSRUFNX1RIUk9UVExFX01TIiwiYWN0aXZlU3RyZWFtcyIsIk1hcCIsInN0b3JlIiwiZ2V0U3RhdGUiLCJpc1N0cmVhbUFjdGl2ZSIsInNlc3Npb25JZCIsImhhcyIsImdldEFjdGl2ZVN0cmVhbUNvdW50Iiwic2l6ZSIsInBhcnNlU2Vzc2lvblNTRSIsIl9yZWYiLCJfYXN5bmNUb0dlbmVyYXRvciIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJtYXJrIiwiX2NhbGxlZSIsInJlc3BvbnNlIiwiYWN0aXZlIiwicGFyYW1zIiwiX3Jlc3BvbnNlJGJvZHkiLCJfZGF0YSRlcnJvciIsIl9kYXRhJGVycm9yMiIsIl9jYWxsYmFja3Mkb25FcnJvciIsIl9kYXRhJGVycm9yMyIsIl9kYXRhJGVycm9yNCIsInBsYWNlaG9sZGVySWQiLCJjYWxsYmFja3MiLCJ0IiwicGVuZGluZ0NvbnRlbnQiLCJ0aHJvdHRsZVRpbWVyIiwiZmx1c2hUb1N0b3JlcyIsImVtaXRUaHJvdHRsZWQiLCJmbHVzaFBlbmRpbmciLCJyZWFkZXIiLCJkZWNvZGVyIiwiYnVmZmVyIiwiYWNjdW11bGF0ZWRDb250ZW50IiwiaGFzU3RhcnRlZFdyaXRpbmciLCJpc1VzaW5nU2tpbGwiLCJzZXRUaGlua2luZ0FjdGl2aXR5IiwiZW5zdXJlV3JpdGluZ1N0YXJ0ZWQiLCJhcHBseVN0cmVhbUNodW5rIiwiY2xlYXJTdHJlYW1MaWtlQW5zd2VyUmVzZXQiLCJhcHBseVN0cmVhbUNvbXBsZXRlIiwiX3lpZWxkJHJlYWRlciRyZWFkIiwiZG9uZSIsInZhbHVlIiwiX3NwbGl0U3NlQnVmZmVyIiwiYmxvY2tzIiwicmVtYWluZGVyIiwiX2l0ZXJhdG9yIiwiX3N0ZXAiLCJsaW5lIiwicGFyc2VkQmxvY2siLCJldmVudFR5cGUiLCJkYXRhU3RyIiwiZGF0YSIsIl9yZXNvbHZlVGhpbmtpbmdEZWx0YSIsImluZGV4IiwidGhpbmtpbmdEZWx0YSIsInN0ZXBUb29sIiwic3RlcFR5cGUiLCJfZGF0YSRhcmdzIiwic3RlcEluZGV4IiwiY2h1bmsiLCJfY2h1bmsiLCJfY2FsbGJhY2tzJG9uQXBwcm92YWwiLCJpc1ByZUFwcHJvdmVkIiwiX3JlZjIiLCJfdCIsIl90MiIsIl90MyIsIndyYXAiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwiY29udGVudCIsIl9jYWxsYmFja3Mkb25TdHJlYW1VcCIsInNldFRleHQiLCJvblN0cmVhbVVwZGF0ZSIsImNhbGwiLCJ3aW5kb3ciLCJzZXRUaW1lb3V0IiwidG9FbWl0IiwiY2xlYXJUaW1lb3V0IiwiYm9keSIsImdldFJlYWRlciIsIkVycm9yIiwiVGV4dERlY29kZXIiLCJfc3RvcmUkZ2V0TWV0YSIsInRoaW5raW5nQWN0aXZpdHkiLCJjdXJyZW50IiwiZ2V0TWV0YSIsInN0cmVhbUFjdGl2aXR5IiwicGhhc2UiLCJtZXNzYWdlIiwicGF0Y2hNZXRhIiwiaXNMb2FkaW5nIiwic2V0U3RhdHVzIiwic2V0QWN0aXZpdHkiLCJfc3RvcmUkZ2V0TWV0YTIiLCJfY2FsbGJhY2tzJG9uU3RhcnRXcmkiLCJpc1dyaXRpbmciLCJvblN0YXJ0V3JpdGluZyIsInN5bmNMaXZlTmFycmF0aW9uIiwibWFya0Fuc3dlclJlc2V0IiwicGF5bG9hZCIsIl9jYWxsYmFja3Mkb25GaW5pc2hTdCIsImZpbmlzaFBheWxvYWQiLCJmaW5pc2giLCJyZWFzb25pbmciLCJvbkZpbmlzaFN0cmVhbSIsImlzU3RvcHBlZCIsImNhbmNlbCIsImFicnVwdCIsInJlYWQiLCJzZW50IiwiZGVjb2RlIiwic3RyZWFtIiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJzIiwibiIsIkpTT04iLCJwYXJzZSIsImRlbHRhIiwiYXBwZW5kVGhpbmtpbmciLCJza2lsbCIsInN0YXR1cyIsImFyZ3MiLCJuYW1lIiwiaSIsImNhcHR1cmVMZWFkaW5nRnJvbUJvZHkiLCJhcHBseVN0ZXAiLCJfb2JqZWN0U3ByZWFkIiwic2hvdWxkQ2xlYXJTdHJlYW1Gb3JMZWFkaW5nIiwiY2xlYXIiLCJvbkFwcHJvdmFsUmVxdWlyZWQiLCJwZW5kaW5nX2FjdGlvbnMiLCJjb25zb2xlIiwiZXJyb3IiLCJzZXRFcnJvciIsInR5cGUiLCJvbkVycm9yIiwid2FybiIsImUiLCJmIiwic3RvcCIsIl94IiwiX3gyIiwiX3gzIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJzZXNzaW9uU3RyZWFtTWFuYWdlciIsImlzQWN0aXZlIiwiZ2V0QWN0aXZlQ291bnQiLCJnZXRBY3RpdmVTZXNzaW9uSWRzIiwiQXJyYXkiLCJmcm9tIiwia2V5cyIsInN0YXJ0U3RyZWFtIiwiX2NhbGxlZTIiLCJyZXF1ZXN0IiwiYWN0aXZpdHlPcHRpb25zIiwiYWdlbnRJZCIsImFnZW50TmFtZSIsInN0YXJ0R3VhcmQiLCJjb250cm9sbGVyIiwiX2NhbGxiYWNrcyRvbkVycm9yMiIsIl90NCIsIl9jb250ZXh0MiIsImFsbG93ZWQiLCJzdGFydGVkIiwicmVhc29uIiwiQWJvcnRDb250cm9sbGVyIiwic2V0IiwiZW5zdXJlU2Vzc2lvbiIsInN0YXJ0IiwiT3JjaGVzdHJhdG9yIiwib3JjaGVzdHJhdG9yIiwic2lnbmFsIiwic3RhcnRDb250aW51ZVN0cmVhbSIsIl9jYWxsZWUzIiwiX3JlZjMiLCJjb250aW51ZVJlcXVlc3QiLCJoaXRsRXhlY3V0aW9uQ29udGV4dCIsImNvbnRpbnVlR3VhcmQiLCJzc2VQYXJhbXMiLCJfY2FsbGJhY2tzJG9uRXJyb3IzIiwiX3Q1IiwiX2NvbnRleHQzIiwiZ2V0IiwidW5kZWZpbmVkIiwiY29udGludWVUaHJlYWQiLCJvayIsImNvbmNhdCIsInN0YXJ0UmV0cnlTdHJlYW0iLCJfY2FsbGVlNCIsInJldHJ5UmVxdWVzdCIsInJldHJ5R3VhcmQiLCJkZXRhaWwiLCJfY2FsbGJhY2tzJG9uRXJyb3I0IiwiX3Q2IiwiX3Q3IiwiX2NvbnRleHQ0IiwicmV0cnlDb21wbGV0aW9uIiwianNvbiIsInN0b3BTdHJlYW0iLCJfY2FsbGJhY2tzJG9uU3RvcCIsImFib3J0IiwicGFydGlhbFRleHQiLCJnZXRTbmFwc2hvdCIsInRleHQiLCJvblN0b3AiLCJhYm9ydFNpbGVudGx5IiwiX3N0b3JlJGdldE1ldGEzIiwiYWJvcnRBbGwiLCJfdGhpcyIsImZvckVhY2giXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3RvcmUvc2Vzc2lvbnMvc2Vzc2lvblN0cmVhbU1hbmFnZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tY29udGludWUgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLWF3YWl0LWluLWxvb3AgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXJlc3RyaWN0ZWQtc3ludGF4ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zdGFudC1jb25kaXRpb24gKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCBtYWlhIGZyb20gJy4uLy4uL3NlcnZpY2VzL21haWEnXG5pbXBvcnQgdHlwZSB7IEFwcHJvdmFsUmVxdWVzdCB9IGZyb20gJy4uLy4uL3R5cGVzL0NoYXQnXG5pbXBvcnQge1xuICBnZXRJbml0aWFsU3RyZWFtQWN0aXZpdHksXG4gIGdldFRoaW5raW5nU3RyZWFtQWN0aXZpdHksXG4gIGdldFVzaW5nU2tpbGxBY3Rpdml0eSxcbiAgZ2V0V3JpdGluZ1N0cmVhbUFjdGl2aXR5LFxuICByZXNvbHZlSW5pdGlhbEhpdGxTdHJlYW1BY3Rpdml0eSxcbn0gZnJvbSAnLi4vLi4vdXRpbHMvc3RyZWFtQWN0aXZpdHlNZXNzYWdlcydcbmltcG9ydCB0eXBlIHsgSGl0bEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tICcuLi8uLi91dGlscy9zdHJlYW1BY3Rpdml0eU1lc3NhZ2VzJ1xuaW1wb3J0IHsgaXNDb21wbGV0ZUxpa2VTc2VQYXlsb2FkLCBtZXJnZVN0cmVhbUNodW5rIH0gZnJvbSAnLi4vLi4vdXRpbHMvc3NlU3RyZWFtQ29udGVudCdcbmltcG9ydCB7IHJlYXNvbmluZ1N0b3JlIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlUmVhc29uaW5nVHJhY2UnXG5pbXBvcnQgdHlwZSB7IFJlYXNvbmluZ1N0ZXBQYXlsb2FkLCBSZWFzb25pbmdUcmFjZVBheWxvYWQgfSBmcm9tICcuLi8uLi90eXBlcy9yZWFzb25pbmcnXG5pbXBvcnQgeyBzZXNzaW9uU3RyZWFtaW5nVGV4dCB9IGZyb20gJy4vc2Vzc2lvblN0cmVhbWluZ1RleHQnXG5pbXBvcnQgeyB1c2VTZXNzaW9uc1N0b3JlIH0gZnJvbSAnLi91c2VTZXNzaW9uc1N0b3JlJ1xuaW1wb3J0IHsgZW5zdXJlU2Vzc2lvbk5vdGlmaWNhdGlvbnNJbml0aWFsaXplZCB9IGZyb20gJy4vc2Vzc2lvbk5vdGlmaWNhdGlvbnMnXG5pbXBvcnQgeyBzZXNzaW9uSGl0bENvbnRleHQgfSBmcm9tICcuL3Nlc3Npb25IaXRsQ29udGV4dCdcbmltcG9ydCB0eXBlIHsgU2Vzc2lvblN0cmVhbUNhbGxiYWNrcywgU3RhcnRTdHJlYW1SZXN1bHQgfSBmcm9tICcuL3Nlc3Npb25zLnR5cGVzJ1xuaW1wb3J0IHtcbiAgYnVpbGRTZXNzaW9uRmluaXNoUGF5bG9hZCxcbiAgaXNBZ2VudFRyYW5zZmVyTm9kZSxcbiAgaXNBcHByb3ZhbFByZUFwcHJvdmVkLFxuICBpc1JldHJ5VHVybk5vdEZvdW5kUmVzcG9uc2UsXG4gIHBhcnNlU3NlQmxvY2ssXG4gIHBhdGNoTWV0YUFnZW50RmllbGRzLFxuICByZXNvbHZlTm9kZVN0cmVhbU1lc3NhZ2UsXG4gIHJlc29sdmVSZWFzb25pbmdTdGVwVG9vbCxcbiAgcmVzb2x2ZVJlYXNvbmluZ1N0ZXBUeXBlLFxuICByZXNvbHZlU3RhcnRTdHJlYW1HdWFyZCxcbiAgcmVzb2x2ZVN0cmVhbVRleHRDaHVuayxcbiAgcmVzb2x2ZVRoaW5raW5nRGVsdGEsXG4gIHNob3VsZEFib3J0U2Vzc2lvblN0cmVhbU9uU3RvcCxcbiAgc2hvdWxkQXBwbHlSZWFzb25pbmdTdGVwSW5kZXgsXG4gIHNob3VsZEFwcGVuZFRoaW5raW5nU3RlcCxcbiAgc2hvdWxkUmVzdW1lSGl0bEFmdGVyUHJlQXBwcm92YWwsXG4gIHNob3VsZFNldElkbGVPblNpbGVudEFib3J0LFxuICBzaG91bGRTaG93UmVhc29uaW5nVG9vbEFjdGl2aXR5LFxuICBzcGxpdFNzZUJ1ZmZlcixcbn0gZnJvbSAnLi9zZXNzaW9uU3RyZWFtTWFuYWdlci5oZWxwZXJzJ1xuXG50eXBlIE9yY2hlc3RyYXRvclJlcXVlc3QgPSBQYXJhbWV0ZXJzPHR5cGVvZiBtYWlhLk9yY2hlc3RyYXRvci5vcmNoZXN0cmF0b3I+WzBdXG50eXBlIENvbnRpbnVlVGhyZWFkUmVxdWVzdCA9IFBhcmFtZXRlcnM8dHlwZW9mIG1haWEuT3JjaGVzdHJhdG9yLmNvbnRpbnVlVGhyZWFkPlswXVxudHlwZSBSZXRyeUNvbXBsZXRpb25SZXF1ZXN0ID0gUGFyYW1ldGVyczx0eXBlb2YgbWFpYS5PcmNoZXN0cmF0b3IucmV0cnlDb21wbGV0aW9uPlswXVxuXG4vKiogQ29tcGF0aWJsZSBjb24gZWwgYHRgIGRlIGkxOG5leHQgKHVzbyBkZSB1bmEgc29sYSBrZXkpLiAqL1xudHlwZSBUcmFuc2xhdGVGbiA9IChrZXk6IHN0cmluZykgPT4gc3RyaW5nXG5cbnR5cGUgU3RhcnRTdHJlYW1QYXJhbXMgPSB7XG4gIHNlc3Npb25JZDogc3RyaW5nXG4gIHBsYWNlaG9sZGVySWQ6IHN0cmluZ1xuICByZXF1ZXN0OiBPcmNoZXN0cmF0b3JSZXF1ZXN0XG4gIGNhbGxiYWNrczogU2Vzc2lvblN0cmVhbUNhbGxiYWNrc1xuICB0OiBUcmFuc2xhdGVGblxuICBhY3Rpdml0eU9wdGlvbnM/OiB7XG4gICAgaXNXZWJTZWFyY2hBY3RpdmU/OiBib29sZWFuXG4gICAgaXNEZWVwU2VhcmNoQWN0aXZlPzogYm9vbGVhblxuICAgIGhhc0F0dGFjaG1lbnRzPzogYm9vbGVhblxuICAgIGF0dGFjaG1lbnRzQ291bnQ/OiBudW1iZXJcbiAgfVxuICBoaXRsRXhlY3V0aW9uQ29udGV4dD86IEhpdGxFeGVjdXRpb25Db250ZXh0IHwgbnVsbFxuICBhZ2VudElkPzogc3RyaW5nIHwgbnVtYmVyXG4gIGFnZW50TmFtZT86IHN0cmluZ1xufVxuXG50eXBlIFN0YXJ0Q29udGludWVTdHJlYW1QYXJhbXMgPSB7XG4gIHNlc3Npb25JZDogc3RyaW5nXG4gIHBsYWNlaG9sZGVySWQ6IHN0cmluZ1xuICBjb250aW51ZVJlcXVlc3Q6IENvbnRpbnVlVGhyZWFkUmVxdWVzdFxuICBjYWxsYmFja3M6IFNlc3Npb25TdHJlYW1DYWxsYmFja3NcbiAgdDogVHJhbnNsYXRlRm5cbiAgaGl0bEV4ZWN1dGlvbkNvbnRleHQ/OiBIaXRsRXhlY3V0aW9uQ29udGV4dCB8IG51bGxcbiAgYWdlbnRJZD86IHN0cmluZyB8IG51bWJlclxuICBhZ2VudE5hbWU/OiBzdHJpbmdcbn1cblxudHlwZSBTdGFydFJldHJ5U3RyZWFtUGFyYW1zID0ge1xuICBzZXNzaW9uSWQ6IHN0cmluZ1xuICBwbGFjZWhvbGRlcklkOiBzdHJpbmdcbiAgcmV0cnlSZXF1ZXN0OiBSZXRyeUNvbXBsZXRpb25SZXF1ZXN0XG4gIGNhbGxiYWNrczogU2Vzc2lvblN0cmVhbUNhbGxiYWNrc1xuICB0OiBUcmFuc2xhdGVGblxuICBhY3Rpdml0eU9wdGlvbnM/OiB7XG4gICAgaXNXZWJTZWFyY2hBY3RpdmU/OiBib29sZWFuXG4gICAgaXNEZWVwU2VhcmNoQWN0aXZlPzogYm9vbGVhblxuICAgIGhhc0F0dGFjaG1lbnRzPzogYm9vbGVhblxuICAgIGF0dGFjaG1lbnRzQ291bnQ/OiBudW1iZXJcbiAgfVxuICBhZ2VudElkPzogc3RyaW5nIHwgbnVtYmVyXG4gIGFnZW50TmFtZT86IHN0cmluZ1xufVxuXG50eXBlIEFjdGl2ZVN0cmVhbSA9IHtcbiAgc2Vzc2lvbklkOiBzdHJpbmdcbiAgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyXG4gIGlzU3RvcHBlZDogYm9vbGVhblxufVxuXG4vKipcbiAqIE3DoXhpbW8gZGUgc2VzaW9uZXMgZ2VuZXJhbmRvIGVuIHBhcmFsZWxvLiBQcm90ZWdlIHJlZC9yZWN1cnNvcyBkZWwgY2xpZW50ZS5cbiAqIEFqdXN0YWJsZSBhIGZ1dHVybyB2w61hIGZsYWcgZGVsIGhvc3QuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfQ09OQ1VSUkVOVF9TVFJFQU1TID0gNFxuXG5jb25zdCBTVFJFQU1fVEhST1RUTEVfTVMgPSAxNlxuXG5jb25zdCBhY3RpdmVTdHJlYW1zID0gbmV3IE1hcDxzdHJpbmcsIEFjdGl2ZVN0cmVhbT4oKVxuXG5jb25zdCBzdG9yZSA9ICgpID0+IHVzZVNlc3Npb25zU3RvcmUuZ2V0U3RhdGUoKVxuXG5jb25zdCBpc1N0cmVhbUFjdGl2ZSA9IChzZXNzaW9uSWQ6IHN0cmluZyk6IGJvb2xlYW4gPT4gYWN0aXZlU3RyZWFtcy5oYXMoc2Vzc2lvbklkKVxuXG5jb25zdCBnZXRBY3RpdmVTdHJlYW1Db3VudCA9ICgpOiBudW1iZXIgPT4gYWN0aXZlU3RyZWFtcy5zaXplXG5cbmNvbnN0IHBhcnNlU2Vzc2lvblNTRSA9IGFzeW5jIChyZXNwb25zZTogUmVzcG9uc2UsIGFjdGl2ZTogQWN0aXZlU3RyZWFtLCBwYXJhbXM6IFN0YXJ0U3RyZWFtUGFyYW1zKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHsgc2Vzc2lvbklkLCBwbGFjZWhvbGRlcklkLCBjYWxsYmFja3MsIHQgfSA9IHBhcmFtc1xuXG4gIGxldCBwZW5kaW5nQ29udGVudDogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgbGV0IHRocm90dGxlVGltZXI6IG51bWJlciB8IG51bGwgPSBudWxsXG5cbiAgY29uc3QgZmx1c2hUb1N0b3JlcyA9IChjb250ZW50OiBzdHJpbmcpID0+IHtcbiAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5zZXRUZXh0KHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZCwgY29udGVudClcbiAgICBjYWxsYmFja3Mub25TdHJlYW1VcGRhdGU/Lihjb250ZW50KVxuICB9XG5cbiAgY29uc3QgZW1pdFRocm90dGxlZCA9IChjb250ZW50OiBzdHJpbmcpID0+IHtcbiAgICBwZW5kaW5nQ29udGVudCA9IGNvbnRlbnRcbiAgICBpZiAodGhyb3R0bGVUaW1lciAhPSBudWxsKSByZXR1cm5cbiAgICB0aHJvdHRsZVRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhyb3R0bGVUaW1lciA9IG51bGxcbiAgICAgIGlmIChwZW5kaW5nQ29udGVudCAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHRvRW1pdCA9IHBlbmRpbmdDb250ZW50XG4gICAgICAgIHBlbmRpbmdDb250ZW50ID0gbnVsbFxuICAgICAgICBmbHVzaFRvU3RvcmVzKHRvRW1pdClcbiAgICAgIH1cbiAgICB9LCBTVFJFQU1fVEhST1RUTEVfTVMpXG4gIH1cblxuICBjb25zdCBmbHVzaFBlbmRpbmcgPSAoKSA9PiB7XG4gICAgaWYgKHRocm90dGxlVGltZXIgIT0gbnVsbCkge1xuICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aHJvdHRsZVRpbWVyKVxuICAgICAgdGhyb3R0bGVUaW1lciA9IG51bGxcbiAgICB9XG4gICAgaWYgKHBlbmRpbmdDb250ZW50ICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHRvRW1pdCA9IHBlbmRpbmdDb250ZW50XG4gICAgICBwZW5kaW5nQ29udGVudCA9IG51bGxcbiAgICAgIGZsdXNoVG9TdG9yZXModG9FbWl0KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlYWRlciA9IHJlc3BvbnNlLmJvZHk/LmdldFJlYWRlcigpXG4gIGlmICghcmVhZGVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyByZWFkZXIgYXZhaWxhYmxlJylcbiAgfVxuXG4gIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKVxuICBsZXQgYnVmZmVyID0gJydcbiAgbGV0IGFjY3VtdWxhdGVkQ29udGVudCA9ICcnXG4gIGxldCBoYXNTdGFydGVkV3JpdGluZyA9IGZhbHNlXG4gIC8vIFwiVXNhbmRvIFNraWxsXCIgcXVlZGEgdmlzaWJsZSBtaWVudHJhcyBlbCBtb2RlbG8gcGllbnNhIGNvbiBsYSBza2lsbCBjYXJnYWRhO1xuICAvLyBsb3MgZGVsdGFzIGRlIGB0aGlua2luZ2Agbm8gbG8gcGlzYW4gaGFzdGEgbGEgcHLDs3hpbWEgYWNjacOzbiBvIGVsIHByaW1lciB0b2tlbi5cbiAgbGV0IGlzVXNpbmdTa2lsbCA9IGZhbHNlXG5cbiAgY29uc3Qgc2V0VGhpbmtpbmdBY3Rpdml0eSA9ICgpID0+IHtcbiAgICBjb25zdCB0aGlua2luZ0FjdGl2aXR5ID0gZ2V0VGhpbmtpbmdTdHJlYW1BY3Rpdml0eSh0KVxuICAgIGNvbnN0IGN1cnJlbnQgPSBzdG9yZSgpLmdldE1ldGEoc2Vzc2lvbklkKT8uc3RyZWFtQWN0aXZpdHlcbiAgICBpZiAoY3VycmVudD8ucGhhc2UgPT09ICd0aGlua2luZycgJiYgY3VycmVudC5tZXNzYWdlID09PSB0aGlua2luZ0FjdGl2aXR5Lm1lc3NhZ2UpIHJldHVyblxuICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IHRydWUgfSlcbiAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICd0aGlua2luZycpXG4gICAgc3RvcmUoKS5zZXRBY3Rpdml0eShzZXNzaW9uSWQsIHRoaW5raW5nQWN0aXZpdHkpXG4gIH1cblxuICBjb25zdCBlbnN1cmVXcml0aW5nU3RhcnRlZCA9ICgpID0+IHtcbiAgICAvLyBDdWFscXVpZXIgdG9rZW4gY29ydGEgXCJVc2FuZG8gU2tpbGxcIjogZWwgaW5kaWNhZG9yIHZ1ZWx2ZSBhIGFsdGVybmFyIHBlbnNhbmRvIC8gZXNjcmliaWVuZG8uXG4gICAgaXNVc2luZ1NraWxsID0gZmFsc2VcbiAgICBpZiAoIWhhc1N0YXJ0ZWRXcml0aW5nKSB7XG4gICAgICBoYXNTdGFydGVkV3JpdGluZyA9IHRydWVcbiAgICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IHRydWUsIGlzV3JpdGluZzogdHJ1ZSB9KVxuICAgICAgY2FsbGJhY2tzLm9uU3RhcnRXcml0aW5nPy4oKVxuICAgIH1cbiAgICBjb25zdCBjdXJyZW50ID0gc3RvcmUoKS5nZXRNZXRhKHNlc3Npb25JZCk/LnN0cmVhbUFjdGl2aXR5XG4gICAgaWYgKGN1cnJlbnQ/LnBoYXNlICE9PSAnd3JpdGluZycpIHtcbiAgICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IHRydWUsIGlzV3JpdGluZzogdHJ1ZSB9KVxuICAgICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAnd3JpdGluZycpXG4gICAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgZ2V0V3JpdGluZ1N0cmVhbUFjdGl2aXR5KHQpKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGFwcGx5U3RyZWFtQ2h1bmsgPSAoY2h1bms6IHN0cmluZykgPT4ge1xuICAgIGlmICghY2h1bmspIHJldHVyblxuICAgIGFjY3VtdWxhdGVkQ29udGVudCA9IG1lcmdlU3RyZWFtQ2h1bmsoYWNjdW11bGF0ZWRDb250ZW50LCBjaHVuaylcbiAgICByZWFzb25pbmdTdG9yZS5zeW5jTGl2ZU5hcnJhdGlvbihwbGFjZWhvbGRlcklkLCBhY2N1bXVsYXRlZENvbnRlbnQpXG4gICAgZW1pdFRocm90dGxlZChhY2N1bXVsYXRlZENvbnRlbnQpXG4gIH1cblxuICBjb25zdCBjbGVhclN0cmVhbUxpa2VBbnN3ZXJSZXNldCA9ICgpID0+IHtcbiAgICBpZiAodGhyb3R0bGVUaW1lciAhPSBudWxsKSB7XG4gICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRocm90dGxlVGltZXIpXG4gICAgICB0aHJvdHRsZVRpbWVyID0gbnVsbFxuICAgIH1cbiAgICBwZW5kaW5nQ29udGVudCA9IG51bGxcbiAgICBhY2N1bXVsYXRlZENvbnRlbnQgPSAnJ1xuICAgIGZsdXNoVG9TdG9yZXMoJycpXG4gICAgcmVhc29uaW5nU3RvcmUubWFya0Fuc3dlclJlc2V0KHBsYWNlaG9sZGVySWQpXG4gIH1cblxuICBjb25zdCBhcHBseVN0cmVhbUNvbXBsZXRlID0gKHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgY29uc3QgZmluaXNoUGF5bG9hZCA9IGJ1aWxkU2Vzc2lvbkZpbmlzaFBheWxvYWQocGF5bG9hZCwgYWNjdW11bGF0ZWRDb250ZW50KVxuXG4gICAgcmVhc29uaW5nU3RvcmUuZmluaXNoKHBsYWNlaG9sZGVySWQsIGZpbmlzaFBheWxvYWQucmVhc29uaW5nKVxuICAgIGZsdXNoUGVuZGluZygpXG4gICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7IGlzTG9hZGluZzogZmFsc2UsIGlzV3JpdGluZzogZmFsc2UgfSlcbiAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgbnVsbClcbiAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICdjb21wbGV0ZScpXG5cbiAgICBjYWxsYmFja3Mub25GaW5pc2hTdHJlYW0/LihmaW5pc2hQYXlsb2FkKVxuXG4gICAgLy8gRWwgdGV4dG8gZW4gdml2byBOTyBzZSBsaW1waWEgYWPDoSBhIHByb3DDs3NpdG8uIEVsIHBsYWNlaG9sZGVyIHNlIHZhIGNvbiBlbFxuICAgIC8vIGBkcm9wYCBxdWUgaGFjZSBlbCBjb25zdW1pZG9yLCB5IGNvbiDDqWwgc3Ugc3VzY3JpcGNpw7NuOyB2YWNpYXJsbyBhbnRlcyBsb1xuICAgIC8vIGRlamFiYSBtb250YWRvIHkgc2luIHRleHRvIChhbHR1cmEgMCkgZHVyYW50ZSB+MjVtczogZWwgZmxpY2tlciBkZSBmaW4gZGVcbiAgICAvLyBzdHJlYW0uIE5vIGFsY2FuemEgY29uIGRpZmVyaXJsbywgcG9ycXVlIGVzdGUgY2xlYXIgdmlhamEgZW4gU3luY0xhbmVcbiAgICAvLyAoc3RvcmUgZXh0ZXJubykgeSBlbCBzd2FwIGRlIG1lbnNhamVzIGVuIERlZmF1bHRMYW5lLCBhc8OtIHF1ZSBzaWVtcHJlIHNlXG4gICAgLy8gY3VlbGEgZW4gZWwgbWVkaW8uIEVsIHNsb3Qgc2UgbGliZXJhIGVuIGVsIHByw7N4aW1vIGBzdGFydCgpYCBkZSBsYSBzZXNpw7NuLFxuICAgIC8vIHkgZW4gc3RvcC9lcnJvci9hcHByb3ZhbC9jYW1iaW8gZGUgc2VzacOzbiwgcXVlIHPDrSBsbGFtYW4gYGNsZWFyYC5cbiAgfVxuXG4gIHRyeSB7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChzaG91bGRBYm9ydFNlc3Npb25TdHJlYW1PblN0b3AoYWN0aXZlLmlzU3RvcHBlZCkpIHtcbiAgICAgICAgcmVhZGVyLmNhbmNlbCgpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKClcbiAgICAgIGlmIChkb25lKSBicmVha1xuXG4gICAgICBpZiAoc2hvdWxkQWJvcnRTZXNzaW9uU3RyZWFtT25TdG9wKGFjdGl2ZS5pc1N0b3BwZWQpKSB7XG4gICAgICAgIHJlYWRlci5jYW5jZWwoKVxuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBidWZmZXIgKz0gZGVjb2Rlci5kZWNvZGUodmFsdWUsIHsgc3RyZWFtOiB0cnVlIH0pXG4gICAgICBjb25zdCB7IGJsb2NrcywgcmVtYWluZGVyIH0gPSBzcGxpdFNzZUJ1ZmZlcihidWZmZXIpXG4gICAgICBidWZmZXIgPSByZW1haW5kZXJcblxuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGJsb2Nrcykge1xuICAgICAgICBjb25zdCBwYXJzZWRCbG9jayA9IHBhcnNlU3NlQmxvY2sobGluZSlcbiAgICAgICAgaWYgKCFwYXJzZWRCbG9jaykgY29udGludWVcblxuICAgICAgICBjb25zdCB7IGV2ZW50VHlwZSwgZGF0YVN0ciB9ID0gcGFyc2VkQmxvY2tcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGRhdGFTdHIpXG5cbiAgICAgICAgICBzd2l0Y2ggKGV2ZW50VHlwZSkge1xuICAgICAgICAgICAgY2FzZSAndGhpbmtpbmcnOiB7XG4gICAgICAgICAgICAgIGNvbnN0IHsgaW5kZXgsIGRlbHRhOiB0aGlua2luZ0RlbHRhIH0gPSByZXNvbHZlVGhpbmtpbmdEZWx0YShkYXRhKVxuICAgICAgICAgICAgICBpZiAoc2hvdWxkQXBwZW5kVGhpbmtpbmdTdGVwKGluZGV4LCB0aGlua2luZ0RlbHRhKSkge1xuICAgICAgICAgICAgICAgIHJlYXNvbmluZ1N0b3JlLmFwcGVuZFRoaW5raW5nKHBsYWNlaG9sZGVySWQsIGluZGV4LCB0aGlua2luZ0RlbHRhKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIE1pZW50cmFzIGR1cmEgXCJVc2FuZG8gU2tpbGxcIiBsb3MgZGVsdGFzIGRlIHRoaW5raW5nIG5vIHBpc2FuIGxhIGFjdGl2aWRhZC5cbiAgICAgICAgICAgICAgaWYgKCFpc1VzaW5nU2tpbGwpIHtcbiAgICAgICAgICAgICAgICBzZXRUaGlua2luZ0FjdGl2aXR5KClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTa2lsbCBALW1lbmNpb25hZGEgKGFsIGFicmlyIGVsIHN0cmVhbSkgbyBsbGFtYWRhIGEgYGdldF9za2lsbGAuXG4gICAgICAgICAgICBjYXNlICd1c2luZ19za2lsbCc6XG4gICAgICAgICAgICAgIGlmICghaGFzU3RhcnRlZFdyaXRpbmcpIHtcbiAgICAgICAgICAgICAgICBpc1VzaW5nU2tpbGwgPSB0cnVlXG4gICAgICAgICAgICAgICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7IGlzTG9hZGluZzogdHJ1ZSB9KVxuICAgICAgICAgICAgICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ3RoaW5raW5nJylcbiAgICAgICAgICAgICAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgZ2V0VXNpbmdTa2lsbEFjdGl2aXR5KHQsIGRhdGEuc2tpbGwpKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICAgIC8vIEVsIGJhY2tlbmQgZGVzY2FydGEgbG8gZW1pdGlkbyB5IHJlaW5pY2lhIGxhIHJlc3B1ZXN0YSBkZXNkZSBjZXJvLlxuICAgICAgICAgICAgY2FzZSAnYW5zd2VyX3Jlc2V0JzpcbiAgICAgICAgICAgICAgY2xlYXJTdHJlYW1MaWtlQW5zd2VyUmVzZXQoKVxuICAgICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgICBjYXNlICdyZWFzb25pbmdfc3RlcCc6IHtcbiAgICAgICAgICAgICAgY29uc3Qgc3RlcFRvb2wgPSByZXNvbHZlUmVhc29uaW5nU3RlcFRvb2woZGF0YSlcbiAgICAgICAgICAgICAgY29uc3Qgc3RlcFR5cGUgPSByZXNvbHZlUmVhc29uaW5nU3RlcFR5cGUoZGF0YSlcbiAgICAgICAgICAgICAgaWYgKHNob3VsZFNob3dSZWFzb25pbmdUb29sQWN0aXZpdHkoc3RlcFRvb2wsIHN0ZXBUeXBlLCBkYXRhLnN0YXR1cykpIHtcbiAgICAgICAgICAgICAgICBpc1VzaW5nU2tpbGwgPSBzdGVwVG9vbCA9PT0gJ2dldF9za2lsbCdcbiAgICAgICAgICAgICAgICBpZiAoaXNVc2luZ1NraWxsKSB7XG4gICAgICAgICAgICAgICAgICAvLyBFbCBzdGVwIGRlIGBnZXRfc2tpbGxgIGxsZWdhIGp1c3RvIGRlc3B1w6lzIGRlIGB1c2luZ19za2lsbGA6IG1hbnRpZW5lIGVsIG5vbWJyZS5cbiAgICAgICAgICAgICAgICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IHRydWUgfSlcbiAgICAgICAgICAgICAgICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ3RoaW5raW5nJylcbiAgICAgICAgICAgICAgICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBnZXRVc2luZ1NraWxsQWN0aXZpdHkodCwgZGF0YS5hcmdzPy5uYW1lKSlcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgc2V0VGhpbmtpbmdBY3Rpdml0eSgpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChzaG91bGRBcHBseVJlYXNvbmluZ1N0ZXBJbmRleChkYXRhLmkpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RlcEluZGV4ID0gZGF0YS5pXG4gICAgICAgICAgICAgICAgcmVhc29uaW5nU3RvcmUuY2FwdHVyZUxlYWRpbmdGcm9tQm9keShwbGFjZWhvbGRlcklkLCBhY2N1bXVsYXRlZENvbnRlbnQpXG4gICAgICAgICAgICAgICAgcmVhc29uaW5nU3RvcmUuYXBwbHlTdGVwKHBsYWNlaG9sZGVySWQsIHsgLi4uZGF0YSwgaTogc3RlcEluZGV4IH0gYXMgUmVhc29uaW5nU3RlcFBheWxvYWQpXG4gICAgICAgICAgICAgICAgaWYgKHJlYXNvbmluZ1N0b3JlLnNob3VsZENsZWFyU3RyZWFtRm9yTGVhZGluZyhwbGFjZWhvbGRlcklkLCBhY2N1bXVsYXRlZENvbnRlbnQpKSB7XG4gICAgICAgICAgICAgICAgICBjbGVhclN0cmVhbUxpa2VBbnN3ZXJSZXNldCgpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgJ3Rva2VuJzoge1xuICAgICAgICAgICAgICBjb25zdCBjaHVuayA9IHJlc29sdmVTdHJlYW1UZXh0Q2h1bmsoZGF0YSlcbiAgICAgICAgICAgICAgZW5zdXJlV3JpdGluZ1N0YXJ0ZWQoKVxuICAgICAgICAgICAgICBhcHBseVN0cmVhbUNodW5rKGNodW5rKVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlICdjb250ZW50Jzoge1xuICAgICAgICAgICAgICBjb25zdCBjaHVuayA9IHJlc29sdmVTdHJlYW1UZXh0Q2h1bmsoZGF0YSlcbiAgICAgICAgICAgICAgZW5zdXJlV3JpdGluZ1N0YXJ0ZWQoKVxuICAgICAgICAgICAgICBhcHBseVN0cmVhbUNodW5rKGNodW5rKVxuICAgICAgICAgICAgICBpZiAoaXNDb21wbGV0ZUxpa2VTc2VQYXlsb2FkKGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgYXBwbHlTdHJlYW1Db21wbGV0ZShkYXRhKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgJ25vZGUnOlxuICAgICAgICAgICAgICBpc1VzaW5nU2tpbGwgPSBmYWxzZVxuICAgICAgICAgICAgICBpZiAoaXNBZ2VudFRyYW5zZmVyTm9kZShkYXRhKSB8fCByZXNvbHZlTm9kZVN0cmVhbU1lc3NhZ2UoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICBzZXRUaGlua2luZ0FjdGl2aXR5KClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgICBjYXNlICdjb21wbGV0ZSc6XG4gICAgICAgICAgICAgIGFwcGx5U3RyZWFtQ29tcGxldGUoZGF0YSlcbiAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgY2FzZSAnYXBwcm92YWxfcmVxdWlyZWQnOiB7XG4gICAgICAgICAgICAgIGZsdXNoUGVuZGluZygpXG4gICAgICAgICAgICAgIC8vIFByZWFwcm9iYWRvIChhdXRvLWFwcHJvdmUgbyBkZXRlY2Npw7NuIG1hbnVhbCk6IGVsIHN0cmVhbSBubyBzZSBjb3J0YSxcbiAgICAgICAgICAgICAgLy8gc2lndWUgZWplY3V0YW5kbyBsYXMgYWNjaW9uZXMgc2luIGVzcGVyYXIgZGVjaXNpw7NuIGRlbCB1c3VhcmlvLlxuICAgICAgICAgICAgICBjb25zdCBpc1ByZUFwcHJvdmVkID0gaXNBcHByb3ZhbFByZUFwcHJvdmVkKGRhdGEpXG4gICAgICAgICAgICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc1dyaXRpbmc6IGZhbHNlIH0pXG4gICAgICAgICAgICAgIGlmICghaXNQcmVBcHByb3ZlZCkge1xuICAgICAgICAgICAgICAgIHJlYXNvbmluZ1N0b3JlLmZpbmlzaChwbGFjZWhvbGRlcklkLCAoZGF0YS5yZWFzb25pbmcgYXMgUmVhc29uaW5nVHJhY2VQYXlsb2FkIHwgbnVsbCkgPz8gbnVsbClcbiAgICAgICAgICAgICAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSB9KVxuICAgICAgICAgICAgICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LmNsZWFyKHNlc3Npb25JZClcbiAgICAgICAgICAgICAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgbnVsbClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICdhd2FpdGluZ19hcHByb3ZhbCcpXG4gICAgICAgICAgICAgIGNhbGxiYWNrcy5vbkFwcHJvdmFsUmVxdWlyZWQ/LihkYXRhIGFzIEFwcHJvdmFsUmVxdWVzdCwgYWNjdW11bGF0ZWRDb250ZW50KVxuICAgICAgICAgICAgICBpZiAoc2hvdWxkUmVzdW1lSGl0bEFmdGVyUHJlQXBwcm92YWwoaXNQcmVBcHByb3ZlZCwgZGF0YS5wZW5kaW5nX2FjdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgc2V0VGhpbmtpbmdBY3Rpdml0eSgpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdTU0UgRXJyb3I6JywgZGF0YS5lcnJvcilcbiAgICAgICAgICAgICAgZmx1c2hQZW5kaW5nKClcbiAgICAgICAgICAgICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgICAgICAgICAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSwgaXNXcml0aW5nOiBmYWxzZSB9KVxuICAgICAgICAgICAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgbnVsbClcbiAgICAgICAgICAgICAgc3RvcmUoKS5zZXRFcnJvcihzZXNzaW9uSWQsIHsgdHlwZTogZGF0YS5lcnJvcj8udHlwZSwgbWVzc2FnZTogZGF0YS5lcnJvcj8ubWVzc2FnZSB9KVxuICAgICAgICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICdlcnJvcicpXG4gICAgICAgICAgICAgIGNhbGxiYWNrcy5vbkVycm9yPy4oZGF0YS5lcnJvcj8udHlwZSwgZGF0YS5lcnJvcj8ubWVzc2FnZSlcbiAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdVbmtub3duIFNTRSBldmVudCB0eXBlOicsIGV2ZW50VHlwZSlcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKHBhcnNlRXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIFNTRSBkYXRhOicsIHBhcnNlRXJyb3IsIGRhdGFTdHIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgZmx1c2hQZW5kaW5nKClcbiAgfVxufVxuXG4vKipcbiAqIE1hbmFnZXIgc2luZ2xldG9uIChtb2R1bGUtbGV2ZWwpIHF1ZSBjb3JyZSBOIHN0cmVhbXMgZGVsIG9yY2hlc3RyYXRvciBlblxuICogcGFyYWxlbG8sIHVubyBwb3IgYHNlc3Npb25JZGAuIFNvYnJldml2ZSBhIGNhbWJpb3MgZGUgdmlzdGEgeSBhbCBjaWVycmUgZGVsXG4gKiBtb2RhbDogbG9zIHN0cmVhbXMgc29sbyBzZSBjYW5jZWxhbiBjb24gc3RvcCBleHBsw61jaXRvIGRlbCB1c3VhcmlvIG8gYWxcbiAqIGNvbXBsZXRhci9lcnJvcmFyLlxuICovXG5leHBvcnQgY29uc3Qgc2Vzc2lvblN0cmVhbU1hbmFnZXIgPSB7XG4gIGlzQWN0aXZlOiBpc1N0cmVhbUFjdGl2ZSxcbiAgZ2V0QWN0aXZlQ291bnQ6IGdldEFjdGl2ZVN0cmVhbUNvdW50LFxuICBnZXRBY3RpdmVTZXNzaW9uSWRzOiAoKTogc3RyaW5nW10gPT4gQXJyYXkuZnJvbShhY3RpdmVTdHJlYW1zLmtleXMoKSksXG5cbiAgYXN5bmMgc3RhcnRTdHJlYW0ocGFyYW1zOiBTdGFydFN0cmVhbVBhcmFtcyk6IFByb21pc2U8U3RhcnRTdHJlYW1SZXN1bHQ+IHtcbiAgICBlbnN1cmVTZXNzaW9uTm90aWZpY2F0aW9uc0luaXRpYWxpemVkKClcblxuICAgIGNvbnN0IHsgc2Vzc2lvbklkLCBwbGFjZWhvbGRlcklkLCByZXF1ZXN0LCBjYWxsYmFja3MsIHQsIGFjdGl2aXR5T3B0aW9ucywgYWdlbnRJZCwgYWdlbnROYW1lIH0gPSBwYXJhbXNcblxuICAgIGNvbnN0IHN0YXJ0R3VhcmQgPSByZXNvbHZlU3RhcnRTdHJlYW1HdWFyZChcbiAgICAgIGlzU3RyZWFtQWN0aXZlKHNlc3Npb25JZCksXG4gICAgICBnZXRBY3RpdmVTdHJlYW1Db3VudCgpLFxuICAgICAgTUFYX0NPTkNVUlJFTlRfU1RSRUFNU1xuICAgIClcbiAgICBpZiAoIXN0YXJ0R3VhcmQuYWxsb3dlZCkge1xuICAgICAgcmV0dXJuIHsgc3RhcnRlZDogZmFsc2UsIHJlYXNvbjogc3RhcnRHdWFyZC5yZWFzb24gfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKClcbiAgICBjb25zdCBhY3RpdmU6IEFjdGl2ZVN0cmVhbSA9IHsgc2Vzc2lvbklkLCBjb250cm9sbGVyLCBpc1N0b3BwZWQ6IGZhbHNlIH1cbiAgICBhY3RpdmVTdHJlYW1zLnNldChzZXNzaW9uSWQsIGFjdGl2ZSlcblxuICAgIHN0b3JlKCkuZW5zdXJlU2Vzc2lvbihzZXNzaW9uSWQpXG4gICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7XG4gICAgICBwbGFjZWhvbGRlcklkLFxuICAgICAgZXJyb3I6IG51bGwsXG4gICAgICBpc0xvYWRpbmc6IHRydWUsXG4gICAgICBpc1dyaXRpbmc6IGZhbHNlLFxuICAgICAgLi4ucGF0Y2hNZXRhQWdlbnRGaWVsZHMoYWdlbnRJZCwgYWdlbnROYW1lKSxcbiAgICB9KVxuICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ3RoaW5raW5nJylcbiAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5zdGFydChzZXNzaW9uSWQsIHBsYWNlaG9sZGVySWQpXG4gICAgcmVhc29uaW5nU3RvcmUuc3RhcnQocGxhY2Vob2xkZXJJZClcbiAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgZ2V0SW5pdGlhbFN0cmVhbUFjdGl2aXR5KHQsIGFjdGl2aXR5T3B0aW9ucyA/PyB7fSkpXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBtYWlhLk9yY2hlc3RyYXRvci5vcmNoZXN0cmF0b3IocmVxdWVzdCwgY29udHJvbGxlci5zaWduYWwpXG4gICAgICBhd2FpdCBwYXJzZVNlc3Npb25TU0UocmVzcG9uc2UsIGFjdGl2ZSwgcGFyYW1zKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWFjdGl2ZS5pc1N0b3BwZWQpIHtcbiAgICAgICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgICAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSwgaXNXcml0aW5nOiBmYWxzZSB9KVxuICAgICAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgbnVsbClcbiAgICAgICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAnZXJyb3InKVxuICAgICAgICBjYWxsYmFja3Mub25FcnJvcj8uKClcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgYWN0aXZlU3RyZWFtcy5kZWxldGUoc2Vzc2lvbklkKVxuICAgIH1cblxuICAgIHJldHVybiB7IHN0YXJ0ZWQ6IHRydWUgfVxuICB9LFxuXG4gIC8qKiBSZXN1bWUgSElUTCAoYGNvbnRpbnVlLXRocmVhZGApIGtleWVkIHBvciBzZXNzaW9uSWQg4oCUIG1pc21vIG1vdG9yIHF1ZSBvcmNoZXN0cmF0b3IuICovXG4gIGFzeW5jIHN0YXJ0Q29udGludWVTdHJlYW0ocGFyYW1zOiBTdGFydENvbnRpbnVlU3RyZWFtUGFyYW1zKTogUHJvbWlzZTxTdGFydFN0cmVhbVJlc3VsdD4ge1xuICAgIGVuc3VyZVNlc3Npb25Ob3RpZmljYXRpb25zSW5pdGlhbGl6ZWQoKVxuXG4gICAgY29uc3QgeyBzZXNzaW9uSWQsIHBsYWNlaG9sZGVySWQsIGNvbnRpbnVlUmVxdWVzdCwgY2FsbGJhY2tzLCB0LCBoaXRsRXhlY3V0aW9uQ29udGV4dCwgYWdlbnRJZCwgYWdlbnROYW1lIH0gPSBwYXJhbXNcblxuICAgIGNvbnN0IGNvbnRpbnVlR3VhcmQgPSByZXNvbHZlU3RhcnRTdHJlYW1HdWFyZChcbiAgICAgIGlzU3RyZWFtQWN0aXZlKHNlc3Npb25JZCksXG4gICAgICBnZXRBY3RpdmVTdHJlYW1Db3VudCgpLFxuICAgICAgTUFYX0NPTkNVUlJFTlRfU1RSRUFNU1xuICAgIClcbiAgICBpZiAoIWNvbnRpbnVlR3VhcmQuYWxsb3dlZCkge1xuICAgICAgcmV0dXJuIHsgc3RhcnRlZDogZmFsc2UsIHJlYXNvbjogY29udGludWVHdWFyZC5yZWFzb24gfVxuICAgIH1cblxuICAgIGlmIChoaXRsRXhlY3V0aW9uQ29udGV4dCkge1xuICAgICAgc2Vzc2lvbkhpdGxDb250ZXh0LnNldChzZXNzaW9uSWQsIGhpdGxFeGVjdXRpb25Db250ZXh0KVxuICAgIH1cblxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKClcbiAgICBjb25zdCBhY3RpdmU6IEFjdGl2ZVN0cmVhbSA9IHsgc2Vzc2lvbklkLCBjb250cm9sbGVyLCBpc1N0b3BwZWQ6IGZhbHNlIH1cbiAgICBhY3RpdmVTdHJlYW1zLnNldChzZXNzaW9uSWQsIGFjdGl2ZSlcblxuICAgIHN0b3JlKCkuZW5zdXJlU2Vzc2lvbihzZXNzaW9uSWQpXG4gICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7XG4gICAgICBwbGFjZWhvbGRlcklkLFxuICAgICAgZXJyb3I6IG51bGwsXG4gICAgICBpc0xvYWRpbmc6IHRydWUsXG4gICAgICBpc1dyaXRpbmc6IGZhbHNlLFxuICAgICAgLi4ucGF0Y2hNZXRhQWdlbnRGaWVsZHMoYWdlbnRJZCwgYWdlbnROYW1lKSxcbiAgICB9KVxuICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ3RoaW5raW5nJylcbiAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5zdGFydChzZXNzaW9uSWQsIHBsYWNlaG9sZGVySWQpXG4gICAgc3RvcmUoKS5zZXRBY3Rpdml0eShcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIHJlc29sdmVJbml0aWFsSGl0bFN0cmVhbUFjdGl2aXR5KHQsIGhpdGxFeGVjdXRpb25Db250ZXh0ID8/IHNlc3Npb25IaXRsQ29udGV4dC5nZXQoc2Vzc2lvbklkKSA/PyB1bmRlZmluZWQpXG4gICAgKVxuXG4gICAgY29uc3Qgc3NlUGFyYW1zOiBTdGFydFN0cmVhbVBhcmFtcyA9IHtcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIHBsYWNlaG9sZGVySWQsXG4gICAgICByZXF1ZXN0OiB7fSBhcyBPcmNoZXN0cmF0b3JSZXF1ZXN0LFxuICAgICAgY2FsbGJhY2tzLFxuICAgICAgdCxcbiAgICAgIGhpdGxFeGVjdXRpb25Db250ZXh0OiBoaXRsRXhlY3V0aW9uQ29udGV4dCA/PyBzZXNzaW9uSGl0bENvbnRleHQuZ2V0KHNlc3Npb25JZCksXG4gICAgICBhZ2VudElkLFxuICAgICAgYWdlbnROYW1lLFxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1haWEuT3JjaGVzdHJhdG9yLmNvbnRpbnVlVGhyZWFkKGNvbnRpbnVlUmVxdWVzdCwgY29udHJvbGxlci5zaWduYWwpXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgY29udGludWUtdGhyZWFkIGZhaWxlZDogJHtyZXNwb25zZS5zdGF0dXN9YClcbiAgICAgIH1cbiAgICAgIGF3YWl0IHBhcnNlU2Vzc2lvblNTRShyZXNwb25zZSwgYWN0aXZlLCBzc2VQYXJhbXMpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghYWN0aXZlLmlzU3RvcHBlZCkge1xuICAgICAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5jbGVhcihzZXNzaW9uSWQpXG4gICAgICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IGZhbHNlLCBpc1dyaXRpbmc6IGZhbHNlIH0pXG4gICAgICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBudWxsKVxuICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICdlcnJvcicpXG4gICAgICAgIGNhbGxiYWNrcy5vbkVycm9yPy4oKVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhY3RpdmVTdHJlYW1zLmRlbGV0ZShzZXNzaW9uSWQpXG4gICAgICBzZXNzaW9uSGl0bENvbnRleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgIH1cblxuICAgIHJldHVybiB7IHN0YXJ0ZWQ6IHRydWUgfVxuICB9LFxuXG4gIC8qKiBSZWdlbmVyYSBsYSByZXNwdWVzdGEgZGUgdW4gdHVybm8gKGByZXRyeV9jb21wbGV0aW9uYCkg4oCUIG1pc21vIG1vdG9yIFNTRSBxdWUgb3JjaGVzdHJhdG9yLiAqL1xuICBhc3luYyBzdGFydFJldHJ5U3RyZWFtKHBhcmFtczogU3RhcnRSZXRyeVN0cmVhbVBhcmFtcyk6IFByb21pc2U8U3RhcnRTdHJlYW1SZXN1bHQ+IHtcbiAgICBlbnN1cmVTZXNzaW9uTm90aWZpY2F0aW9uc0luaXRpYWxpemVkKClcblxuICAgIGNvbnN0IHsgc2Vzc2lvbklkLCBwbGFjZWhvbGRlcklkLCByZXRyeVJlcXVlc3QsIGNhbGxiYWNrcywgdCwgYWN0aXZpdHlPcHRpb25zLCBhZ2VudElkLCBhZ2VudE5hbWUgfSA9IHBhcmFtc1xuXG4gICAgY29uc3QgcmV0cnlHdWFyZCA9IHJlc29sdmVTdGFydFN0cmVhbUd1YXJkKFxuICAgICAgaXNTdHJlYW1BY3RpdmUoc2Vzc2lvbklkKSxcbiAgICAgIGdldEFjdGl2ZVN0cmVhbUNvdW50KCksXG4gICAgICBNQVhfQ09OQ1VSUkVOVF9TVFJFQU1TXG4gICAgKVxuICAgIGlmICghcmV0cnlHdWFyZC5hbGxvd2VkKSB7XG4gICAgICByZXR1cm4geyBzdGFydGVkOiBmYWxzZSwgcmVhc29uOiByZXRyeUd1YXJkLnJlYXNvbiB9XG4gICAgfVxuXG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgIGNvbnN0IGFjdGl2ZTogQWN0aXZlU3RyZWFtID0geyBzZXNzaW9uSWQsIGNvbnRyb2xsZXIsIGlzU3RvcHBlZDogZmFsc2UgfVxuICAgIGFjdGl2ZVN0cmVhbXMuc2V0KHNlc3Npb25JZCwgYWN0aXZlKVxuXG4gICAgc3RvcmUoKS5lbnN1cmVTZXNzaW9uKHNlc3Npb25JZClcbiAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHtcbiAgICAgIHBsYWNlaG9sZGVySWQsXG4gICAgICBlcnJvcjogbnVsbCxcbiAgICAgIGlzTG9hZGluZzogdHJ1ZSxcbiAgICAgIGlzV3JpdGluZzogZmFsc2UsXG4gICAgICAuLi5wYXRjaE1ldGFBZ2VudEZpZWxkcyhhZ2VudElkLCBhZ2VudE5hbWUpLFxuICAgIH0pXG4gICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAndGhpbmtpbmcnKVxuICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LnN0YXJ0KHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZClcbiAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgZ2V0SW5pdGlhbFN0cmVhbUFjdGl2aXR5KHQsIGFjdGl2aXR5T3B0aW9ucyA/PyB7fSkpXG5cbiAgICBjb25zdCBzc2VQYXJhbXM6IFN0YXJ0U3RyZWFtUGFyYW1zID0ge1xuICAgICAgc2Vzc2lvbklkLFxuICAgICAgcGxhY2Vob2xkZXJJZCxcbiAgICAgIHJlcXVlc3Q6IHt9IGFzIE9yY2hlc3RyYXRvclJlcXVlc3QsXG4gICAgICBjYWxsYmFja3MsXG4gICAgICB0LFxuICAgICAgYWN0aXZpdHlPcHRpb25zLFxuICAgICAgYWdlbnRJZCxcbiAgICAgIGFnZW50TmFtZSxcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBtYWlhLk9yY2hlc3RyYXRvci5yZXRyeUNvbXBsZXRpb24ocmV0cnlSZXF1ZXN0LCBjb250cm9sbGVyLnNpZ25hbClcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgbGV0IGRldGFpbDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7IGRldGFpbD86IHN0cmluZyB9XG4gICAgICAgICAgICBkZXRhaWwgPSB0eXBlb2YgZGF0YS5kZXRhaWwgPT09ICdzdHJpbmcnID8gZGF0YS5kZXRhaWwgOiB1bmRlZmluZWRcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIGRldGFpbCA9IHVuZGVmaW5lZFxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNSZXRyeVR1cm5Ob3RGb3VuZFJlc3BvbnNlKHJlc3BvbnNlLnN0YXR1cywgZGV0YWlsKSkge1xuICAgICAgICAgICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgICAgICAgICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7IGlzTG9hZGluZzogZmFsc2UsIGlzV3JpdGluZzogZmFsc2UsIHBsYWNlaG9sZGVySWQ6IG51bGwgfSlcbiAgICAgICAgICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBudWxsKVxuICAgICAgICAgICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAnaWRsZScpXG4gICAgICAgICAgICBhY3RpdmVTdHJlYW1zLmRlbGV0ZShzZXNzaW9uSWQpXG4gICAgICAgICAgICByZXR1cm4geyBzdGFydGVkOiBmYWxzZSwgcmVhc29uOiAndHVybl9ub3RfZm91bmQnIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGByZXRyeV9jb21wbGV0aW9uIGZhaWxlZDogJHtyZXNwb25zZS5zdGF0dXN9YClcbiAgICAgIH1cbiAgICAgIGF3YWl0IHBhcnNlU2Vzc2lvblNTRShyZXNwb25zZSwgYWN0aXZlLCBzc2VQYXJhbXMpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghYWN0aXZlLmlzU3RvcHBlZCkge1xuICAgICAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5jbGVhcihzZXNzaW9uSWQpXG4gICAgICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IGZhbHNlLCBpc1dyaXRpbmc6IGZhbHNlIH0pXG4gICAgICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBudWxsKVxuICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICdlcnJvcicpXG4gICAgICAgIGNhbGxiYWNrcy5vbkVycm9yPy4oKVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhY3RpdmVTdHJlYW1zLmRlbGV0ZShzZXNzaW9uSWQpXG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc3RhcnRlZDogdHJ1ZSB9XG4gIH0sXG5cbiAgLyoqIENhbmNlbGFjacOzbiBleHBsw61jaXRhIGRlbCB1c3VhcmlvIChtZW5zYWplIFwiY2FuY2VsYWRvXCIpLiAqL1xuICBzdG9wU3RyZWFtKHNlc3Npb25JZDogc3RyaW5nLCBjYWxsYmFja3M/OiBTZXNzaW9uU3RyZWFtQ2FsbGJhY2tzKSB7XG4gICAgY29uc3QgYWN0aXZlID0gYWN0aXZlU3RyZWFtcy5nZXQoc2Vzc2lvbklkKVxuICAgIGlmICghYWN0aXZlKSByZXR1cm5cbiAgICBhY3RpdmUuaXNTdG9wcGVkID0gdHJ1ZVxuICAgIGFjdGl2ZS5jb250cm9sbGVyLmFib3J0KClcbiAgICBhY3RpdmVTdHJlYW1zLmRlbGV0ZShzZXNzaW9uSWQpXG4gICAgLy8gRWwgcGFyY2lhbCBzZSByZXNjYXRhIGFudGVzIGRlIGxpbXBpYXI6IGVsIGJhY2tlbmQgbG8gcGVyc2lzdGUsIHBlcm8gc2kgbm8gbG9cbiAgICAvLyBwYXNhbW9zIGFsIGNhbGxiYWNrIGRlc2FwYXJlY2UgZGUgcGFudGFsbGEgaGFzdGEgZWwgcHLDs3hpbW8gZmV0Y2ggZGUgbGEgc2VzacOzbi5cbiAgICBjb25zdCBwYXJ0aWFsVGV4dCA9IHNlc3Npb25TdHJlYW1pbmdUZXh0LmdldFNuYXBzaG90KHNlc3Npb25JZCkudGV4dFxuICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LmNsZWFyKHNlc3Npb25JZClcbiAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSwgaXNXcml0aW5nOiBmYWxzZSB9KVxuICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBudWxsKVxuICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ2NhbmNlbGxlZCcpXG4gICAgY2FsbGJhY2tzPy5vblN0b3A/LihwYXJ0aWFsVGV4dClcbiAgfSxcblxuICAvKiogQWJvcnRhIHNpbiBtYXJjYXIgXCJjYW5jZWxhZG9cIiAodXNvIGludGVybm8gLyBsaW1waWV6YSkuICovXG4gIGFib3J0U2lsZW50bHkoc2Vzc2lvbklkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBhY3RpdmUgPSBhY3RpdmVTdHJlYW1zLmdldChzZXNzaW9uSWQpXG4gICAgaWYgKCFhY3RpdmUpIHJldHVyblxuICAgIGFjdGl2ZS5pc1N0b3BwZWQgPSB0cnVlXG4gICAgYWN0aXZlLmNvbnRyb2xsZXIuYWJvcnQoKVxuICAgIGFjdGl2ZVN0cmVhbXMuZGVsZXRlKHNlc3Npb25JZClcbiAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5jbGVhcihzZXNzaW9uSWQpXG4gICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7IGlzTG9hZGluZzogZmFsc2UsIGlzV3JpdGluZzogZmFsc2UgfSlcbiAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgbnVsbClcbiAgICBpZiAoc2hvdWxkU2V0SWRsZU9uU2lsZW50QWJvcnQoc3RvcmUoKS5nZXRNZXRhKHNlc3Npb25JZCk/LnN0YXR1cykpIHtcbiAgICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ2lkbGUnKVxuICAgIH1cbiAgfSxcblxuICBhYm9ydEFsbCgpIHtcbiAgICBBcnJheS5mcm9tKGFjdGl2ZVN0cmVhbXMua2V5cygpKS5mb3JFYWNoKHNlc3Npb25JZCA9PiB0aGlzLmFib3J0U2lsZW50bHkoc2Vzc2lvbklkKSlcbiAgfSxcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPQSxJQUFJLE1BQU0scUJBQXFCO0FBRXRDLFNBQ0VDLHdCQUF3QixFQUN4QkMseUJBQXlCLEVBQ3pCQyxxQkFBcUIsRUFDckJDLHdCQUF3QixFQUN4QkMsZ0NBQWdDLFFBQzNCLG9DQUFvQztBQUUzQyxTQUFTQyx3QkFBd0IsRUFBRUMsZ0JBQWdCLFFBQVEsOEJBQThCO0FBQ3pGLFNBQVNDLGNBQWMsUUFBUSwrQkFBK0I7QUFFOUQsU0FBU0Msb0JBQW9CLFFBQVEsd0JBQXdCO0FBQzdELFNBQVNDLGdCQUFnQixRQUFRLG9CQUFvQjtBQUNyRCxTQUFTQyxxQ0FBcUMsUUFBUSx3QkFBd0I7QUFDOUUsU0FBU0Msa0JBQWtCLFFBQVEsc0JBQXNCO0FBRXpELFNBQ0VDLHlCQUF5QixFQUN6QkMs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
|