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