subagent-cli 0.3.0 → 0.3.1
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/dist/sa +0 -0
- package/package.json +2 -8
- package/_entry.ts +0 -2
- package/bunfig.toml +0 -2
- package/src/QueryEngine.ts +0 -1295
- package/src/Task.ts +0 -125
- package/src/Tool.ts +0 -792
- package/src/_stubs/bun-bundle.ts +0 -6
- package/src/assistant/AssistantSessionChooser.ts +0 -2
- package/src/assistant/gate.ts +0 -2
- package/src/assistant/index.ts +0 -2
- package/src/assistant/sessionDiscovery.ts +0 -1
- package/src/assistant/sessionHistory.ts +0 -87
- package/src/bootstrap/state.ts +0 -1762
- package/src/bridge/bridgeApi.ts +0 -539
- package/src/bridge/bridgeConfig.ts +0 -48
- package/src/bridge/bridgeDebug.ts +0 -135
- package/src/bridge/bridgeEnabled.ts +0 -202
- package/src/bridge/bridgeMain.ts +0 -2999
- package/src/bridge/bridgeMessaging.ts +0 -461
- package/src/bridge/bridgePermissionCallbacks.ts +0 -43
- package/src/bridge/bridgePointer.ts +0 -210
- package/src/bridge/bridgeStatusUtil.ts +0 -163
- package/src/bridge/bridgeUI.ts +0 -530
- package/src/bridge/capacityWake.ts +0 -56
- package/src/bridge/codeSessionApi.ts +0 -168
- package/src/bridge/createSession.ts +0 -384
- package/src/bridge/debugUtils.ts +0 -141
- package/src/bridge/envLessBridgeConfig.ts +0 -165
- package/src/bridge/flushGate.ts +0 -71
- package/src/bridge/inboundAttachments.ts +0 -175
- package/src/bridge/inboundMessages.ts +0 -80
- package/src/bridge/initReplBridge.ts +0 -569
- package/src/bridge/jwtUtils.ts +0 -256
- package/src/bridge/peerSessions.ts +0 -2
- package/src/bridge/pollConfig.ts +0 -110
- package/src/bridge/pollConfigDefaults.ts +0 -82
- package/src/bridge/remoteBridgeCore.ts +0 -1008
- package/src/bridge/replBridge.ts +0 -2406
- package/src/bridge/replBridgeHandle.ts +0 -36
- package/src/bridge/replBridgeTransport.ts +0 -370
- package/src/bridge/sessionIdCompat.ts +0 -57
- package/src/bridge/sessionRunner.ts +0 -550
- package/src/bridge/trustedDevice.ts +0 -210
- package/src/bridge/types.ts +0 -262
- package/src/bridge/webhookSanitizer.ts +0 -2
- package/src/bridge/workSecret.ts +0 -127
- package/src/buddy/CompanionSprite.tsx +0 -371
- package/src/buddy/companion.ts +0 -133
- package/src/buddy/prompt.ts +0 -36
- package/src/buddy/sprites.ts +0 -514
- package/src/buddy/types.ts +0 -148
- package/src/buddy/useBuddyNotification.tsx +0 -98
- package/src/cli/bg.ts +0 -2
- package/src/cli/exit.ts +0 -31
- package/src/cli/handlers/agents.ts +0 -70
- package/src/cli/handlers/ant.ts +0 -2
- package/src/cli/handlers/auth.ts +0 -330
- package/src/cli/handlers/autoMode.ts +0 -170
- package/src/cli/handlers/mcp.tsx +0 -362
- package/src/cli/handlers/plugins.ts +0 -878
- package/src/cli/handlers/templateJobs.ts +0 -2
- package/src/cli/handlers/util.tsx +0 -110
- package/src/cli/ndjsonSafeStringify.ts +0 -32
- package/src/cli/print.ts +0 -5594
- package/src/cli/remoteIO.ts +0 -255
- package/src/cli/rollback.ts +0 -3
- package/src/cli/structuredIO.ts +0 -859
- package/src/cli/transports/HybridTransport.ts +0 -282
- package/src/cli/transports/SSETransport.ts +0 -711
- package/src/cli/transports/SerialBatchEventUploader.ts +0 -275
- package/src/cli/transports/Transport.ts +0 -1
- package/src/cli/transports/WebSocketTransport.ts +0 -800
- package/src/cli/transports/WorkerStateUploader.ts +0 -131
- package/src/cli/transports/ccrClient.ts +0 -998
- package/src/cli/transports/transportUtils.ts +0 -45
- package/src/cli/up.ts +0 -3
- package/src/cli/update.ts +0 -422
- package/src/commands/add-dir/add-dir.tsx +0 -126
- package/src/commands/add-dir/index.ts +0 -11
- package/src/commands/add-dir/validation.ts +0 -110
- package/src/commands/advisor.ts +0 -109
- package/src/commands/agents/agents.tsx +0 -12
- package/src/commands/agents/index.ts +0 -10
- package/src/commands/agents-platform/index.ts +0 -1
- package/src/commands/ant-trace/index.js +0 -1
- package/src/commands/assistant/assistant.ts +0 -2
- package/src/commands/assistant/index.ts +0 -1
- package/src/commands/autofix-pr/index.js +0 -1
- package/src/commands/backfill-sessions/index.js +0 -1
- package/src/commands/branch/branch.ts +0 -296
- package/src/commands/branch/index.ts +0 -14
- package/src/commands/break-cache/index.js +0 -1
- package/src/commands/bridge/bridge.tsx +0 -509
- package/src/commands/bridge/index.ts +0 -26
- package/src/commands/bridge-kick.ts +0 -200
- package/src/commands/brief.ts +0 -130
- package/src/commands/btw/btw.tsx +0 -243
- package/src/commands/btw/index.ts +0 -13
- package/src/commands/buddy/index.ts +0 -2
- package/src/commands/bughunter/index.js +0 -1
- package/src/commands/chrome/chrome.tsx +0 -285
- package/src/commands/chrome/index.ts +0 -13
- package/src/commands/clear/caches.ts +0 -144
- package/src/commands/clear/clear.ts +0 -7
- package/src/commands/clear/conversation.ts +0 -251
- package/src/commands/clear/index.ts +0 -19
- package/src/commands/color/color.ts +0 -93
- package/src/commands/color/index.ts +0 -16
- package/src/commands/commit-push-pr.ts +0 -158
- package/src/commands/commit.ts +0 -92
- package/src/commands/compact/compact.ts +0 -287
- package/src/commands/compact/index.ts +0 -15
- package/src/commands/config/config.tsx +0 -7
- package/src/commands/config/index.ts +0 -11
- package/src/commands/context/context-noninteractive.ts +0 -325
- package/src/commands/context/context.tsx +0 -64
- package/src/commands/context/index.ts +0 -24
- package/src/commands/copy/copy.tsx +0 -371
- package/src/commands/copy/index.ts +0 -15
- package/src/commands/cost/cost.ts +0 -24
- package/src/commands/cost/index.ts +0 -23
- package/src/commands/createMovedToPluginCommand.ts +0 -65
- package/src/commands/ctx_viz/index.js +0 -1
- package/src/commands/debug-tool-call/index.js +0 -1
- package/src/commands/desktop/desktop.tsx +0 -9
- package/src/commands/desktop/index.ts +0 -26
- package/src/commands/diff/diff.tsx +0 -9
- package/src/commands/diff/index.ts +0 -8
- package/src/commands/doctor/doctor.tsx +0 -7
- package/src/commands/doctor/index.ts +0 -12
- package/src/commands/effort/effort.tsx +0 -183
- package/src/commands/effort/index.ts +0 -13
- package/src/commands/env/index.js +0 -1
- package/src/commands/exit/exit.tsx +0 -33
- package/src/commands/exit/index.ts +0 -12
- package/src/commands/export/export.tsx +0 -91
- package/src/commands/export/index.ts +0 -11
- package/src/commands/extra-usage/extra-usage-core.ts +0 -118
- package/src/commands/extra-usage/extra-usage-noninteractive.ts +0 -16
- package/src/commands/extra-usage/extra-usage.tsx +0 -17
- package/src/commands/extra-usage/index.ts +0 -31
- package/src/commands/fast/fast.tsx +0 -269
- package/src/commands/fast/index.ts +0 -26
- package/src/commands/feedback/feedback.tsx +0 -25
- package/src/commands/feedback/index.ts +0 -26
- package/src/commands/files/files.ts +0 -19
- package/src/commands/files/index.ts +0 -12
- package/src/commands/force-snip.ts +0 -1
- package/src/commands/fork/index.ts +0 -2
- package/src/commands/good-claude/index.js +0 -1
- package/src/commands/heapdump/heapdump.ts +0 -17
- package/src/commands/heapdump/index.ts +0 -12
- package/src/commands/help/help.tsx +0 -11
- package/src/commands/help/index.ts +0 -10
- package/src/commands/hooks/hooks.tsx +0 -13
- package/src/commands/hooks/index.ts +0 -11
- package/src/commands/ide/ide.tsx +0 -646
- package/src/commands/ide/index.ts +0 -11
- package/src/commands/init-verifiers.ts +0 -262
- package/src/commands/init.ts +0 -256
- package/src/commands/insights.ts +0 -3200
- package/src/commands/install-github-app/ApiKeyStep.tsx +0 -231
- package/src/commands/install-github-app/CheckExistingSecretStep.tsx +0 -190
- package/src/commands/install-github-app/CheckGitHubStep.tsx +0 -15
- package/src/commands/install-github-app/ChooseRepoStep.tsx +0 -211
- package/src/commands/install-github-app/CreatingStep.tsx +0 -65
- package/src/commands/install-github-app/ErrorStep.tsx +0 -85
- package/src/commands/install-github-app/ExistingWorkflowStep.tsx +0 -103
- package/src/commands/install-github-app/InstallAppStep.tsx +0 -94
- package/src/commands/install-github-app/OAuthFlowStep.tsx +0 -276
- package/src/commands/install-github-app/SuccessStep.tsx +0 -96
- package/src/commands/install-github-app/WarningsStep.tsx +0 -73
- package/src/commands/install-github-app/index.ts +0 -13
- package/src/commands/install-github-app/install-github-app.tsx +0 -587
- package/src/commands/install-github-app/setupGitHubActions.ts +0 -325
- package/src/commands/install-github-app/types.ts +0 -3
- package/src/commands/install-slack-app/index.ts +0 -12
- package/src/commands/install-slack-app/install-slack-app.ts +0 -30
- package/src/commands/install.tsx +0 -300
- package/src/commands/issue/index.js +0 -1
- package/src/commands/keybindings/index.ts +0 -13
- package/src/commands/keybindings/keybindings.ts +0 -53
- package/src/commands/login/index.ts +0 -14
- package/src/commands/login/login.tsx +0 -104
- package/src/commands/logout/index.ts +0 -10
- package/src/commands/logout/logout.tsx +0 -82
- package/src/commands/mcp/addCommand.ts +0 -280
- package/src/commands/mcp/index.ts +0 -12
- package/src/commands/mcp/mcp.tsx +0 -85
- package/src/commands/mcp/xaaIdpCommand.ts +0 -266
- package/src/commands/memory/index.ts +0 -10
- package/src/commands/memory/memory.tsx +0 -90
- package/src/commands/mobile/index.ts +0 -11
- package/src/commands/mobile/mobile.tsx +0 -274
- package/src/commands/mock-limits/index.js +0 -1
- package/src/commands/model/index.ts +0 -16
- package/src/commands/model/model.tsx +0 -297
- package/src/commands/oauth-refresh/index.js +0 -1
- package/src/commands/onboarding/index.js +0 -1
- package/src/commands/output-style/index.ts +0 -11
- package/src/commands/output-style/output-style.tsx +0 -7
- package/src/commands/passes/index.ts +0 -22
- package/src/commands/passes/passes.tsx +0 -24
- package/src/commands/peers/index.ts +0 -2
- package/src/commands/perf-issue/index.js +0 -1
- package/src/commands/permissions/index.ts +0 -11
- package/src/commands/permissions/permissions.tsx +0 -10
- package/src/commands/plan/index.ts +0 -11
- package/src/commands/plan/plan.tsx +0 -122
- package/src/commands/plugin/AddMarketplace.tsx +0 -162
- package/src/commands/plugin/BrowseMarketplace.tsx +0 -802
- package/src/commands/plugin/DiscoverPlugins.tsx +0 -781
- package/src/commands/plugin/ManageMarketplaces.tsx +0 -838
- package/src/commands/plugin/ManagePlugins.tsx +0 -2215
- package/src/commands/plugin/PluginErrors.tsx +0 -124
- package/src/commands/plugin/PluginOptionsDialog.tsx +0 -357
- package/src/commands/plugin/PluginOptionsFlow.tsx +0 -135
- package/src/commands/plugin/PluginSettings.tsx +0 -1072
- package/src/commands/plugin/PluginTrustWarning.tsx +0 -32
- package/src/commands/plugin/UnifiedInstalledCell.tsx +0 -565
- package/src/commands/plugin/ValidatePlugin.tsx +0 -98
- package/src/commands/plugin/index.tsx +0 -11
- package/src/commands/plugin/parseArgs.ts +0 -103
- package/src/commands/plugin/plugin.tsx +0 -7
- package/src/commands/plugin/pluginDetailsHelpers.tsx +0 -117
- package/src/commands/plugin/types.ts +0 -2
- package/src/commands/plugin/unifiedTypes.ts +0 -4
- package/src/commands/plugin/usePagination.ts +0 -171
- package/src/commands/pr_comments/index.ts +0 -50
- package/src/commands/privacy-settings/index.ts +0 -14
- package/src/commands/privacy-settings/privacy-settings.tsx +0 -58
- package/src/commands/proactive.ts +0 -1
- package/src/commands/rate-limit-options/index.ts +0 -19
- package/src/commands/rate-limit-options/rate-limit-options.tsx +0 -210
- package/src/commands/release-notes/index.ts +0 -11
- package/src/commands/release-notes/release-notes.ts +0 -50
- package/src/commands/reload-plugins/index.ts +0 -18
- package/src/commands/reload-plugins/reload-plugins.ts +0 -61
- package/src/commands/remote-env/index.ts +0 -15
- package/src/commands/remote-env/remote-env.tsx +0 -7
- package/src/commands/remote-setup/api.ts +0 -182
- package/src/commands/remote-setup/index.ts +0 -20
- package/src/commands/remote-setup/remote-setup.tsx +0 -187
- package/src/commands/remoteControlServer/index.ts +0 -1
- package/src/commands/rename/generateSessionName.ts +0 -67
- package/src/commands/rename/index.ts +0 -12
- package/src/commands/rename/rename.ts +0 -87
- package/src/commands/reset-limits/index.js +0 -4
- package/src/commands/resume/index.ts +0 -12
- package/src/commands/resume/resume.tsx +0 -275
- package/src/commands/review/UltrareviewOverageDialog.tsx +0 -96
- package/src/commands/review/reviewRemote.ts +0 -316
- package/src/commands/review/ultrareviewCommand.tsx +0 -58
- package/src/commands/review/ultrareviewEnabled.ts +0 -14
- package/src/commands/review.ts +0 -57
- package/src/commands/rewind/index.ts +0 -13
- package/src/commands/rewind/rewind.ts +0 -13
- package/src/commands/sandbox-toggle/index.ts +0 -50
- package/src/commands/sandbox-toggle/sandbox-toggle.tsx +0 -83
- package/src/commands/security-review.ts +0 -243
- package/src/commands/session/index.ts +0 -16
- package/src/commands/session/session.tsx +0 -140
- package/src/commands/share/index.js +0 -1
- package/src/commands/skills/index.ts +0 -10
- package/src/commands/skills/skills.tsx +0 -8
- package/src/commands/stats/index.ts +0 -10
- package/src/commands/stats/stats.tsx +0 -7
- package/src/commands/status/index.ts +0 -12
- package/src/commands/status/status.tsx +0 -8
- package/src/commands/statusline.tsx +0 -24
- package/src/commands/stickers/index.ts +0 -11
- package/src/commands/stickers/stickers.ts +0 -16
- package/src/commands/subscribe-pr.ts +0 -1
- package/src/commands/summary/index.js +0 -1
- package/src/commands/tag/index.ts +0 -12
- package/src/commands/tag/tag.tsx +0 -215
- package/src/commands/tasks/index.ts +0 -11
- package/src/commands/tasks/tasks.tsx +0 -8
- package/src/commands/teleport/index.js +0 -1
- package/src/commands/terminalSetup/index.ts +0 -23
- package/src/commands/terminalSetup/terminalSetup.tsx +0 -531
- package/src/commands/theme/index.ts +0 -10
- package/src/commands/theme/theme.tsx +0 -57
- package/src/commands/thinkback/index.ts +0 -13
- package/src/commands/thinkback/thinkback.tsx +0 -554
- package/src/commands/thinkback-play/index.ts +0 -17
- package/src/commands/thinkback-play/thinkback-play.ts +0 -43
- package/src/commands/torch.ts +0 -1
- package/src/commands/ultraplan.tsx +0 -471
- package/src/commands/upgrade/index.ts +0 -16
- package/src/commands/upgrade/upgrade.tsx +0 -38
- package/src/commands/usage/index.ts +0 -9
- package/src/commands/usage/usage.tsx +0 -7
- package/src/commands/version.ts +0 -22
- package/src/commands/vim/index.ts +0 -11
- package/src/commands/vim/vim.ts +0 -38
- package/src/commands/voice/index.ts +0 -20
- package/src/commands/voice/voice.ts +0 -150
- package/src/commands/workflows/index.ts +0 -2
- package/src/commands.ts +0 -754
- package/src/components/AgentProgressLine.tsx +0 -136
- package/src/components/App.tsx +0 -56
- package/src/components/ApproveApiKey.tsx +0 -123
- package/src/components/AutoModeOptInDialog.tsx +0 -142
- package/src/components/AutoUpdater.tsx +0 -198
- package/src/components/AutoUpdaterWrapper.tsx +0 -91
- package/src/components/AwsAuthStatusBox.tsx +0 -82
- package/src/components/BaseTextInput.tsx +0 -136
- package/src/components/BashModeProgress.tsx +0 -56
- package/src/components/BridgeDialog.tsx +0 -401
- package/src/components/BypassPermissionsModeDialog.tsx +0 -87
- package/src/components/ChannelDowngradeDialog.tsx +0 -102
- package/src/components/ClaudeCodeHint/PluginHintMenu.tsx +0 -78
- package/src/components/ClaudeInChromeOnboarding.tsx +0 -121
- package/src/components/ClaudeMdExternalIncludesDialog.tsx +0 -137
- package/src/components/ClickableImageRef.tsx +0 -73
- package/src/components/CompactSummary.tsx +0 -118
- package/src/components/ConfigurableShortcutHint.tsx +0 -57
- package/src/components/ConsoleOAuthFlow.tsx +0 -631
- package/src/components/ContextSuggestions.tsx +0 -47
- package/src/components/ContextVisualization.tsx +0 -489
- package/src/components/CoordinatorAgentStatus.tsx +0 -273
- package/src/components/CostThresholdDialog.tsx +0 -50
- package/src/components/CtrlOToExpand.tsx +0 -51
- package/src/components/CustomSelect/SelectMulti.tsx +0 -213
- package/src/components/CustomSelect/index.ts +0 -3
- package/src/components/CustomSelect/option-map.ts +0 -50
- package/src/components/CustomSelect/select-input-option.tsx +0 -488
- package/src/components/CustomSelect/select-option.tsx +0 -68
- package/src/components/CustomSelect/select.tsx +0 -690
- package/src/components/CustomSelect/use-multi-select-state.ts +0 -414
- package/src/components/CustomSelect/use-select-input.ts +0 -287
- package/src/components/CustomSelect/use-select-navigation.ts +0 -653
- package/src/components/CustomSelect/use-select-state.ts +0 -157
- package/src/components/DesktopHandoff.tsx +0 -193
- package/src/components/DesktopUpsell/DesktopUpsellStartup.tsx +0 -171
- package/src/components/DevBar.tsx +0 -49
- package/src/components/DevChannelsDialog.tsx +0 -105
- package/src/components/DiagnosticsDisplay.tsx +0 -95
- package/src/components/EffortCallout.tsx +0 -265
- package/src/components/EffortIndicator.ts +0 -42
- package/src/components/ExitFlow.tsx +0 -48
- package/src/components/ExportDialog.tsx +0 -128
- package/src/components/FallbackToolUseErrorMessage.tsx +0 -116
- package/src/components/FallbackToolUseRejectedMessage.tsx +0 -16
- package/src/components/FastIcon.tsx +0 -46
- package/src/components/Feedback.tsx +0 -592
- package/src/components/FeedbackSurvey/FeedbackSurvey.tsx +0 -174
- package/src/components/FeedbackSurvey/FeedbackSurveyView.tsx +0 -108
- package/src/components/FeedbackSurvey/TranscriptSharePrompt.tsx +0 -88
- package/src/components/FeedbackSurvey/submitTranscriptShare.ts +0 -112
- package/src/components/FeedbackSurvey/useDebouncedDigitInput.ts +0 -82
- package/src/components/FeedbackSurvey/useFeedbackSurvey.tsx +0 -296
- package/src/components/FeedbackSurvey/useFrustrationDetection.ts +0 -2
- package/src/components/FeedbackSurvey/useMemorySurvey.tsx +0 -213
- package/src/components/FeedbackSurvey/usePostCompactSurvey.tsx +0 -206
- package/src/components/FeedbackSurvey/useSurveyState.tsx +0 -100
- package/src/components/FeedbackSurvey/utils.ts +0 -2
- package/src/components/FileEditToolDiff.tsx +0 -181
- package/src/components/FileEditToolUpdatedMessage.tsx +0 -124
- package/src/components/FileEditToolUseRejectedMessage.tsx +0 -170
- package/src/components/FilePathLink.tsx +0 -43
- package/src/components/FullscreenLayout.tsx +0 -637
- package/src/components/GlobalSearchDialog.tsx +0 -343
- package/src/components/HelpV2/Commands.tsx +0 -82
- package/src/components/HelpV2/General.tsx +0 -23
- package/src/components/HelpV2/HelpV2.tsx +0 -184
- package/src/components/HighlightedCode/Fallback.tsx +0 -193
- package/src/components/HighlightedCode.tsx +0 -190
- package/src/components/HistorySearchDialog.tsx +0 -118
- package/src/components/IdeAutoConnectDialog.tsx +0 -154
- package/src/components/IdeOnboardingDialog.tsx +0 -167
- package/src/components/IdeStatusIndicator.tsx +0 -58
- package/src/components/IdleReturnDialog.tsx +0 -118
- package/src/components/InterruptedByUser.tsx +0 -15
- package/src/components/InvalidConfigDialog.tsx +0 -156
- package/src/components/InvalidSettingsDialog.tsx +0 -89
- package/src/components/KeybindingWarnings.tsx +0 -55
- package/src/components/LanguagePicker.tsx +0 -86
- package/src/components/LogSelector.tsx +0 -1575
- package/src/components/LogoV2/AnimatedAsterisk.tsx +0 -50
- package/src/components/LogoV2/AnimatedClawd.tsx +0 -124
- package/src/components/LogoV2/ChannelsNotice.tsx +0 -266
- package/src/components/LogoV2/Clawd.tsx +0 -25
- package/src/components/LogoV2/CondensedLogo.tsx +0 -161
- package/src/components/LogoV2/EmergencyTip.tsx +0 -58
- package/src/components/LogoV2/Feed.tsx +0 -112
- package/src/components/LogoV2/FeedColumn.tsx +0 -59
- package/src/components/LogoV2/GuestPassesUpsell.tsx +0 -70
- package/src/components/LogoV2/LogoV2.tsx +0 -543
- package/src/components/LogoV2/Opus1mMergeNotice.tsx +0 -55
- package/src/components/LogoV2/OverageCreditUpsell.tsx +0 -166
- package/src/components/LogoV2/VoiceModeNotice.tsx +0 -68
- package/src/components/LogoV2/WelcomeV2.tsx +0 -433
- package/src/components/LogoV2/feedConfigs.tsx +0 -92
- package/src/components/LspRecommendation/LspRecommendationMenu.tsx +0 -88
- package/src/components/MCPServerApprovalDialog.tsx +0 -115
- package/src/components/MCPServerDesktopImportDialog.tsx +0 -203
- package/src/components/MCPServerDialogCopy.tsx +0 -15
- package/src/components/MCPServerMultiselectDialog.tsx +0 -133
- package/src/components/ManagedSettingsSecurityDialog/ManagedSettingsSecurityDialog.tsx +0 -149
- package/src/components/ManagedSettingsSecurityDialog/utils.ts +0 -144
- package/src/components/Markdown.tsx +0 -236
- package/src/components/MarkdownTable.tsx +0 -322
- package/src/components/MemoryUsageIndicator.tsx +0 -37
- package/src/components/Message.tsx +0 -627
- package/src/components/MessageModel.tsx +0 -43
- package/src/components/MessageResponse.tsx +0 -78
- package/src/components/MessageRow.tsx +0 -383
- package/src/components/MessageSelector.tsx +0 -831
- package/src/components/MessageTimestamp.tsx +0 -63
- package/src/components/Messages.tsx +0 -834
- package/src/components/ModelPicker.tsx +0 -448
- package/src/components/NativeAutoUpdater.tsx +0 -193
- package/src/components/NotebookEditToolUseRejectedMessage.tsx +0 -92
- package/src/components/OffscreenFreeze.tsx +0 -44
- package/src/components/Onboarding.tsx +0 -244
- package/src/components/OutputStylePicker.tsx +0 -112
- package/src/components/PackageManagerAutoUpdater.tsx +0 -104
- package/src/components/Passes/Passes.tsx +0 -184
- package/src/components/PrBadge.tsx +0 -97
- package/src/components/PressEnterToContinue.tsx +0 -15
- package/src/components/PromptInput/HistorySearchInput.tsx +0 -51
- package/src/components/PromptInput/IssueFlagBanner.tsx +0 -12
- package/src/components/PromptInput/Notifications.tsx +0 -332
- package/src/components/PromptInput/PromptInput.tsx +0 -2339
- package/src/components/PromptInput/PromptInputFooter.tsx +0 -191
- package/src/components/PromptInput/PromptInputFooterLeftSide.tsx +0 -517
- package/src/components/PromptInput/PromptInputFooterSuggestions.tsx +0 -293
- package/src/components/PromptInput/PromptInputHelpMenu.tsx +0 -358
- package/src/components/PromptInput/PromptInputModeIndicator.tsx +0 -93
- package/src/components/PromptInput/PromptInputQueuedCommands.tsx +0 -117
- package/src/components/PromptInput/PromptInputStashNotice.tsx +0 -25
- package/src/components/PromptInput/SandboxPromptFooterHint.tsx +0 -64
- package/src/components/PromptInput/ShimmeredInput.tsx +0 -143
- package/src/components/PromptInput/VoiceIndicator.tsx +0 -137
- package/src/components/PromptInput/inputModes.ts +0 -33
- package/src/components/PromptInput/inputPaste.ts +0 -90
- package/src/components/PromptInput/useMaybeTruncateInput.ts +0 -58
- package/src/components/PromptInput/usePromptInputPlaceholder.ts +0 -76
- package/src/components/PromptInput/useShowFastIconHint.ts +0 -31
- package/src/components/PromptInput/useSwarmBanner.ts +0 -155
- package/src/components/PromptInput/utils.ts +0 -60
- package/src/components/QuickOpenDialog.tsx +0 -244
- package/src/components/RemoteCallout.tsx +0 -76
- package/src/components/RemoteEnvironmentDialog.tsx +0 -340
- package/src/components/ResumeTask.tsx +0 -268
- package/src/components/SandboxViolationExpandedView.tsx +0 -99
- package/src/components/ScrollKeybindingHandler.tsx +0 -1012
- package/src/components/SearchBox.tsx +0 -72
- package/src/components/SentryErrorBoundary.ts +0 -28
- package/src/components/SessionBackgroundHint.tsx +0 -108
- package/src/components/SessionPreview.tsx +0 -194
- package/src/components/Settings/Config.tsx +0 -1822
- package/src/components/Settings/Settings.tsx +0 -137
- package/src/components/Settings/Status.tsx +0 -241
- package/src/components/Settings/Usage.tsx +0 -377
- package/src/components/ShowInIDEPrompt.tsx +0 -170
- package/src/components/SkillImprovementSurvey.tsx +0 -152
- package/src/components/Spinner/FlashingChar.tsx +0 -61
- package/src/components/Spinner/GlimmerMessage.tsx +0 -328
- package/src/components/Spinner/ShimmerChar.tsx +0 -36
- package/src/components/Spinner/SpinnerAnimationRow.tsx +0 -265
- package/src/components/Spinner/SpinnerGlyph.tsx +0 -80
- package/src/components/Spinner/TeammateSpinnerLine.tsx +0 -233
- package/src/components/Spinner/TeammateSpinnerTree.tsx +0 -272
- package/src/components/Spinner/index.ts +0 -10
- package/src/components/Spinner/teammateSelectHint.ts +0 -1
- package/src/components/Spinner/types.ts +0 -2
- package/src/components/Spinner/useShimmerAnimation.ts +0 -31
- package/src/components/Spinner/useStalledAnimation.ts +0 -75
- package/src/components/Spinner/utils.ts +0 -84
- package/src/components/Spinner.tsx +0 -562
- package/src/components/Stats.tsx +0 -1228
- package/src/components/StatusLine.tsx +0 -324
- package/src/components/StatusNotices.tsx +0 -55
- package/src/components/StructuredDiff/Fallback.tsx +0 -487
- package/src/components/StructuredDiff/colorDiff.ts +0 -37
- package/src/components/StructuredDiff.tsx +0 -190
- package/src/components/StructuredDiffList.tsx +0 -30
- package/src/components/TagTabs.tsx +0 -139
- package/src/components/TaskListV2.tsx +0 -378
- package/src/components/TeammateViewHeader.tsx +0 -82
- package/src/components/TeleportError.tsx +0 -189
- package/src/components/TeleportProgress.tsx +0 -140
- package/src/components/TeleportRepoMismatchDialog.tsx +0 -104
- package/src/components/TeleportResumeWrapper.tsx +0 -167
- package/src/components/TeleportStash.tsx +0 -116
- package/src/components/TextInput.tsx +0 -124
- package/src/components/ThemePicker.tsx +0 -333
- package/src/components/ThinkingToggle.tsx +0 -153
- package/src/components/TokenWarning.tsx +0 -179
- package/src/components/ToolUseLoader.tsx +0 -42
- package/src/components/TrustDialog/TrustDialog.tsx +0 -290
- package/src/components/TrustDialog/utils.ts +0 -245
- package/src/components/ValidationErrorsList.tsx +0 -148
- package/src/components/VimTextInput.tsx +0 -140
- package/src/components/VirtualMessageList.tsx +0 -1082
- package/src/components/WorkflowMultiselectDialog.tsx +0 -128
- package/src/components/WorktreeExitDialog.tsx +0 -231
- package/src/components/agents/AgentDetail.tsx +0 -220
- package/src/components/agents/AgentEditor.tsx +0 -178
- package/src/components/agents/AgentNavigationFooter.tsx +0 -26
- package/src/components/agents/AgentsList.tsx +0 -440
- package/src/components/agents/AgentsMenu.tsx +0 -800
- package/src/components/agents/ColorPicker.tsx +0 -112
- package/src/components/agents/ModelSelector.tsx +0 -68
- package/src/components/agents/SnapshotUpdateDialog.ts +0 -2
- package/src/components/agents/ToolSelector.tsx +0 -562
- package/src/components/agents/agentFileUtils.ts +0 -272
- package/src/components/agents/generateAgent.ts +0 -197
- package/src/components/agents/new-agent-creation/CreateAgentWizard.tsx +0 -97
- package/src/components/agents/new-agent-creation/types.ts +0 -1
- package/src/components/agents/new-agent-creation/wizard-steps/ColorStep.tsx +0 -84
- package/src/components/agents/new-agent-creation/wizard-steps/ConfirmStep.tsx +0 -378
- package/src/components/agents/new-agent-creation/wizard-steps/ConfirmStepWrapper.tsx +0 -74
- package/src/components/agents/new-agent-creation/wizard-steps/DescriptionStep.tsx +0 -123
- package/src/components/agents/new-agent-creation/wizard-steps/GenerateStep.tsx +0 -143
- package/src/components/agents/new-agent-creation/wizard-steps/LocationStep.tsx +0 -80
- package/src/components/agents/new-agent-creation/wizard-steps/MemoryStep.tsx +0 -113
- package/src/components/agents/new-agent-creation/wizard-steps/MethodStep.tsx +0 -80
- package/src/components/agents/new-agent-creation/wizard-steps/ModelStep.tsx +0 -52
- package/src/components/agents/new-agent-creation/wizard-steps/PromptStep.tsx +0 -128
- package/src/components/agents/new-agent-creation/wizard-steps/ToolsStep.tsx +0 -61
- package/src/components/agents/new-agent-creation/wizard-steps/TypeStep.tsx +0 -103
- package/src/components/agents/types.ts +0 -27
- package/src/components/agents/utils.ts +0 -18
- package/src/components/agents/validateAgent.ts +0 -109
- package/src/components/design-system/Byline.tsx +0 -77
- package/src/components/design-system/Dialog.tsx +0 -138
- package/src/components/design-system/Divider.tsx +0 -149
- package/src/components/design-system/FuzzyPicker.tsx +0 -312
- package/src/components/design-system/KeyboardShortcutHint.tsx +0 -81
- package/src/components/design-system/ListItem.tsx +0 -244
- package/src/components/design-system/LoadingState.tsx +0 -94
- package/src/components/design-system/Pane.tsx +0 -77
- package/src/components/design-system/ProgressBar.tsx +0 -86
- package/src/components/design-system/Ratchet.tsx +0 -80
- package/src/components/design-system/StatusIcon.tsx +0 -95
- package/src/components/design-system/Tabs.tsx +0 -340
- package/src/components/design-system/ThemeProvider.tsx +0 -170
- package/src/components/design-system/ThemedBox.tsx +0 -156
- package/src/components/design-system/ThemedText.tsx +0 -124
- package/src/components/design-system/color.ts +0 -30
- package/src/components/diff/DiffDetailView.tsx +0 -281
- package/src/components/diff/DiffDialog.tsx +0 -383
- package/src/components/diff/DiffFileList.tsx +0 -292
- package/src/components/grove/Grove.tsx +0 -463
- package/src/components/hooks/HooksConfigMenu.tsx +0 -578
- package/src/components/hooks/PromptDialog.tsx +0 -90
- package/src/components/hooks/SelectEventMode.tsx +0 -127
- package/src/components/hooks/SelectHookMode.tsx +0 -112
- package/src/components/hooks/SelectMatcherMode.tsx +0 -144
- package/src/components/hooks/ViewHookMode.tsx +0 -199
- package/src/components/mcp/CapabilitiesSection.tsx +0 -61
- package/src/components/mcp/ElicitationDialog.tsx +0 -1169
- package/src/components/mcp/MCPAgentServerMenu.tsx +0 -183
- package/src/components/mcp/MCPListPanel.tsx +0 -504
- package/src/components/mcp/MCPReconnect.tsx +0 -167
- package/src/components/mcp/MCPRemoteServerMenu.tsx +0 -649
- package/src/components/mcp/MCPSettings.tsx +0 -398
- package/src/components/mcp/MCPStdioServerMenu.tsx +0 -177
- package/src/components/mcp/MCPToolDetailView.tsx +0 -212
- package/src/components/mcp/MCPToolListView.tsx +0 -141
- package/src/components/mcp/McpParsingWarnings.tsx +0 -213
- package/src/components/mcp/index.ts +0 -9
- package/src/components/mcp/types.ts +0 -7
- package/src/components/mcp/utils/reconnectHelpers.tsx +0 -49
- package/src/components/memory/MemoryFileSelector.tsx +0 -438
- package/src/components/memory/MemoryUpdateNotification.tsx +0 -45
- package/src/components/messageActions.tsx +0 -450
- package/src/components/messages/AdvisorMessage.tsx +0 -158
- package/src/components/messages/AssistantRedactedThinkingMessage.tsx +0 -31
- package/src/components/messages/AssistantTextMessage.tsx +0 -270
- package/src/components/messages/AssistantThinkingMessage.tsx +0 -86
- package/src/components/messages/AssistantToolUseMessage.tsx +0 -368
- package/src/components/messages/AttachmentMessage.tsx +0 -536
- package/src/components/messages/CollapsedReadSearchContent.tsx +0 -484
- package/src/components/messages/CompactBoundaryMessage.tsx +0 -18
- package/src/components/messages/GroupedToolUseContent.tsx +0 -58
- package/src/components/messages/HighlightedThinkingText.tsx +0 -162
- package/src/components/messages/HookProgressMessage.tsx +0 -116
- package/src/components/messages/PlanApprovalMessage.tsx +0 -222
- package/src/components/messages/RateLimitMessage.tsx +0 -161
- package/src/components/messages/ShutdownMessage.tsx +0 -132
- package/src/components/messages/SnipBoundaryMessage.ts +0 -2
- package/src/components/messages/SystemAPIErrorMessage.tsx +0 -141
- package/src/components/messages/SystemTextMessage.tsx +0 -827
- package/src/components/messages/TaskAssignmentMessage.tsx +0 -76
- package/src/components/messages/UserAgentNotificationMessage.tsx +0 -83
- package/src/components/messages/UserBashInputMessage.tsx +0 -58
- package/src/components/messages/UserBashOutputMessage.tsx +0 -54
- package/src/components/messages/UserChannelMessage.tsx +0 -137
- package/src/components/messages/UserCommandMessage.tsx +0 -108
- package/src/components/messages/UserCrossSessionMessage.ts +0 -2
- package/src/components/messages/UserForkBoilerplateMessage.ts +0 -2
- package/src/components/messages/UserGitHubWebhookMessage.ts +0 -2
- package/src/components/messages/UserImageMessage.tsx +0 -59
- package/src/components/messages/UserLocalCommandOutputMessage.tsx +0 -167
- package/src/components/messages/UserMemoryInputMessage.tsx +0 -75
- package/src/components/messages/UserPlanMessage.tsx +0 -42
- package/src/components/messages/UserPromptMessage.tsx +0 -80
- package/src/components/messages/UserResourceUpdateMessage.tsx +0 -121
- package/src/components/messages/UserTeammateMessage.tsx +0 -206
- package/src/components/messages/UserTextMessage.tsx +0 -275
- package/src/components/messages/UserToolResultMessage/RejectedPlanMessage.tsx +0 -31
- package/src/components/messages/UserToolResultMessage/RejectedToolUseMessage.tsx +0 -16
- package/src/components/messages/UserToolResultMessage/UserToolCanceledMessage.tsx +0 -16
- package/src/components/messages/UserToolResultMessage/UserToolErrorMessage.tsx +0 -103
- package/src/components/messages/UserToolResultMessage/UserToolRejectMessage.tsx +0 -95
- package/src/components/messages/UserToolResultMessage/UserToolResultMessage.tsx +0 -106
- package/src/components/messages/UserToolResultMessage/UserToolSuccessMessage.tsx +0 -104
- package/src/components/messages/UserToolResultMessage/utils.tsx +0 -44
- package/src/components/messages/nullRenderingAttachments.ts +0 -70
- package/src/components/messages/teamMemCollapsed.tsx +0 -140
- package/src/components/messages/teamMemSaved.ts +0 -19
- package/src/components/permissions/AskUserQuestionPermissionRequest/AskUserQuestionPermissionRequest.tsx +0 -645
- package/src/components/permissions/AskUserQuestionPermissionRequest/PreviewBox.tsx +0 -229
- package/src/components/permissions/AskUserQuestionPermissionRequest/PreviewQuestionView.tsx +0 -328
- package/src/components/permissions/AskUserQuestionPermissionRequest/QuestionNavigationBar.tsx +0 -178
- package/src/components/permissions/AskUserQuestionPermissionRequest/QuestionView.tsx +0 -465
- package/src/components/permissions/AskUserQuestionPermissionRequest/SubmitQuestionsView.tsx +0 -144
- package/src/components/permissions/AskUserQuestionPermissionRequest/use-multiple-choice-state.ts +0 -179
- package/src/components/permissions/BashPermissionRequest/BashPermissionRequest.tsx +0 -482
- package/src/components/permissions/BashPermissionRequest/bashToolUseOptions.tsx +0 -147
- package/src/components/permissions/ComputerUseApproval/ComputerUseApproval.tsx +0 -441
- package/src/components/permissions/EnterPlanModePermissionRequest/EnterPlanModePermissionRequest.tsx +0 -122
- package/src/components/permissions/ExitPlanModePermissionRequest/ExitPlanModePermissionRequest.tsx +0 -768
- package/src/components/permissions/FallbackPermissionRequest.tsx +0 -333
- package/src/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.tsx +0 -182
- package/src/components/permissions/FilePermissionDialog/FilePermissionDialog.tsx +0 -204
- package/src/components/permissions/FilePermissionDialog/ideDiffConfig.ts +0 -42
- package/src/components/permissions/FilePermissionDialog/permissionOptions.tsx +0 -177
- package/src/components/permissions/FilePermissionDialog/useFilePermissionDialog.ts +0 -212
- package/src/components/permissions/FilePermissionDialog/usePermissionHandler.ts +0 -185
- package/src/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.tsx +0 -161
- package/src/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.tsx +0 -89
- package/src/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.tsx +0 -115
- package/src/components/permissions/MonitorPermissionRequest/MonitorPermissionRequest.ts +0 -2
- package/src/components/permissions/NotebookEditPermissionRequest/NotebookEditPermissionRequest.tsx +0 -166
- package/src/components/permissions/NotebookEditPermissionRequest/NotebookEditToolDiff.tsx +0 -235
- package/src/components/permissions/PermissionDecisionDebugInfo.tsx +0 -460
- package/src/components/permissions/PermissionDialog.tsx +0 -72
- package/src/components/permissions/PermissionExplanation.tsx +0 -272
- package/src/components/permissions/PermissionPrompt.tsx +0 -336
- package/src/components/permissions/PermissionRequest.tsx +0 -217
- package/src/components/permissions/PermissionRequestTitle.tsx +0 -66
- package/src/components/permissions/PermissionRuleExplanation.tsx +0 -121
- package/src/components/permissions/PowerShellPermissionRequest/PowerShellPermissionRequest.tsx +0 -235
- package/src/components/permissions/PowerShellPermissionRequest/powershellToolUseOptions.tsx +0 -91
- package/src/components/permissions/ReviewArtifactPermissionRequest/ReviewArtifactPermissionRequest.ts +0 -2
- package/src/components/permissions/SandboxPermissionRequest.tsx +0 -163
- package/src/components/permissions/SedEditPermissionRequest/SedEditPermissionRequest.tsx +0 -230
- package/src/components/permissions/SkillPermissionRequest/SkillPermissionRequest.tsx +0 -369
- package/src/components/permissions/WebFetchPermissionRequest/WebFetchPermissionRequest.tsx +0 -258
- package/src/components/permissions/WorkerBadge.tsx +0 -49
- package/src/components/permissions/WorkerPendingPermission.tsx +0 -105
- package/src/components/permissions/hooks.ts +0 -209
- package/src/components/permissions/rules/AddPermissionRules.tsx +0 -180
- package/src/components/permissions/rules/AddWorkspaceDirectory.tsx +0 -340
- package/src/components/permissions/rules/PermissionRuleDescription.tsx +0 -76
- package/src/components/permissions/rules/PermissionRuleInput.tsx +0 -138
- package/src/components/permissions/rules/PermissionRuleList.tsx +0 -1179
- package/src/components/permissions/rules/RecentDenialsTab.tsx +0 -207
- package/src/components/permissions/rules/RemoveWorkspaceDirectory.tsx +0 -110
- package/src/components/permissions/rules/WorkspaceTab.tsx +0 -150
- package/src/components/permissions/shellPermissionHelpers.tsx +0 -164
- package/src/components/permissions/useShellPermissionFeedback.ts +0 -148
- package/src/components/permissions/utils.ts +0 -25
- package/src/components/sandbox/SandboxConfigTab.tsx +0 -45
- package/src/components/sandbox/SandboxDependenciesTab.tsx +0 -120
- package/src/components/sandbox/SandboxDoctorSection.tsx +0 -46
- package/src/components/sandbox/SandboxOverridesTab.tsx +0 -193
- package/src/components/sandbox/SandboxSettings.tsx +0 -296
- package/src/components/shell/ExpandShellOutputContext.tsx +0 -36
- package/src/components/shell/OutputLine.tsx +0 -118
- package/src/components/shell/ShellProgressMessage.tsx +0 -150
- package/src/components/shell/ShellTimeDisplay.tsx +0 -74
- package/src/components/skills/SkillsMenu.tsx +0 -237
- package/src/components/tasks/AsyncAgentDetailDialog.tsx +0 -229
- package/src/components/tasks/BackgroundTask.tsx +0 -345
- package/src/components/tasks/BackgroundTaskStatus.tsx +0 -429
- package/src/components/tasks/BackgroundTasksDialog.tsx +0 -652
- package/src/components/tasks/DreamDetailDialog.tsx +0 -251
- package/src/components/tasks/InProcessTeammateDetailDialog.tsx +0 -266
- package/src/components/tasks/MonitorMcpDetailDialog.ts +0 -2
- package/src/components/tasks/RemoteSessionDetailDialog.tsx +0 -904
- package/src/components/tasks/RemoteSessionProgress.tsx +0 -243
- package/src/components/tasks/ShellDetailDialog.tsx +0 -404
- package/src/components/tasks/ShellProgress.tsx +0 -87
- package/src/components/tasks/WorkflowDetailDialog.ts +0 -2
- package/src/components/tasks/renderToolActivity.tsx +0 -33
- package/src/components/tasks/taskStatusUtils.tsx +0 -107
- package/src/components/teams/TeamStatus.tsx +0 -80
- package/src/components/teams/TeamsDialog.tsx +0 -715
- package/src/components/ui/OrderedList.tsx +0 -71
- package/src/components/ui/OrderedListItem.tsx +0 -45
- package/src/components/ui/TreeSelect.tsx +0 -397
- package/src/components/ui/option.ts +0 -4
- package/src/components/wizard/WizardDialogLayout.tsx +0 -65
- package/src/components/wizard/WizardNavigationFooter.tsx +0 -24
- package/src/components/wizard/WizardProvider.tsx +0 -213
- package/src/components/wizard/index.ts +0 -9
- package/src/components/wizard/types.ts +0 -3
- package/src/components/wizard/useWizard.ts +0 -13
- package/src/constants/apiLimits.ts +0 -94
- package/src/constants/betas.ts +0 -52
- package/src/constants/common.ts +0 -33
- package/src/constants/cyberRiskInstruction.ts +0 -24
- package/src/constants/errorIds.ts +0 -15
- package/src/constants/figures.ts +0 -45
- package/src/constants/files.ts +0 -156
- package/src/constants/github-app.ts +0 -144
- package/src/constants/keys.ts +0 -11
- package/src/constants/messages.ts +0 -1
- package/src/constants/oauth.ts +0 -234
- package/src/constants/outputStyles.ts +0 -216
- package/src/constants/product.ts +0 -76
- package/src/constants/prompts.ts +0 -915
- package/src/constants/querySource.ts +0 -1
- package/src/constants/spinnerVerbs.ts +0 -204
- package/src/constants/system.ts +0 -95
- package/src/constants/systemPromptSections.ts +0 -68
- package/src/constants/toolLimits.ts +0 -56
- package/src/constants/tools.ts +0 -112
- package/src/constants/turnCompletionVerbs.ts +0 -12
- package/src/constants/xml.ts +0 -86
- package/src/context/QueuedMessageContext.tsx +0 -63
- package/src/context/fpsMetrics.tsx +0 -30
- package/src/context/mailbox.tsx +0 -38
- package/src/context/modalContext.tsx +0 -58
- package/src/context/notifications.tsx +0 -240
- package/src/context/overlayContext.tsx +0 -151
- package/src/context/promptOverlayContext.tsx +0 -125
- package/src/context/stats.tsx +0 -220
- package/src/context/voice.tsx +0 -88
- package/src/context.ts +0 -189
- package/src/coordinator/coordinatorMode.ts +0 -369
- package/src/coordinator/workerAgent.ts +0 -2
- package/src/cost-tracker.ts +0 -323
- package/src/costHook.ts +0 -22
- package/src/daemon/main.ts +0 -2
- package/src/daemon/workerRegistry.ts +0 -2
- package/src/dialogLaunchers.tsx +0 -133
- package/src/engine/CostMapper.ts +0 -57
- package/src/engine/MessageMapper.ts +0 -276
- package/src/engine/ModelResolver.ts +0 -153
- package/src/engine/PermissionBridge.ts +0 -114
- package/src/engine/PiAgentAdapter.ts +0 -299
- package/src/engine/SubagentTools.ts +0 -92
- package/src/engine/ToolAdapter.ts +0 -122
- package/src/engine/engine-backup/CostMapper.ts +0 -57
- package/src/engine/engine-backup/MessageMapper.ts +0 -276
- package/src/engine/engine-backup/ModelResolver.ts +0 -153
- package/src/engine/engine-backup/PermissionBridge.ts +0 -114
- package/src/engine/engine-backup/PiAgentAdapter.ts +0 -299
- package/src/engine/engine-backup/SubagentTools.ts +0 -92
- package/src/engine/engine-backup/ToolAdapter.ts +0 -122
- package/src/engine/engine-backup/index.ts +0 -14
- package/src/engine/engine-backup/piQueryBridge.ts +0 -396
- package/src/engine/index.ts +0 -14
- package/src/engine/piQueryBridge.ts +0 -396
- package/src/entrypoints/agentSdkTypes.ts +0 -443
- package/src/entrypoints/cli.tsx +0 -303
- package/src/entrypoints/init.ts +0 -340
- package/src/entrypoints/mcp.ts +0 -196
- package/src/entrypoints/sandboxTypes.ts +0 -156
- package/src/entrypoints/sdk/controlSchemas.ts +0 -663
- package/src/entrypoints/sdk/controlTypes.ts +0 -12
- package/src/entrypoints/sdk/coreSchemas.ts +0 -1889
- package/src/entrypoints/sdk/coreTypes.generated.ts +0 -1
- package/src/entrypoints/sdk/coreTypes.ts +0 -62
- package/src/entrypoints/sdk/runtimeTypes.ts +0 -18
- package/src/entrypoints/sdk/sdkUtilityTypes.ts +0 -1
- package/src/entrypoints/sdk/settingsTypes.generated.ts +0 -1
- package/src/entrypoints/sdk/toolTypes.ts +0 -2
- package/src/environment-runner/main.ts +0 -2
- package/src/history.ts +0 -464
- package/src/hooks/fileSuggestions.ts +0 -811
- package/src/hooks/notifs/useAntOrgWarningNotification.ts +0 -2
- package/src/hooks/notifs/useAutoModeUnavailableNotification.ts +0 -56
- package/src/hooks/notifs/useCanSwitchToExistingSubscription.tsx +0 -60
- package/src/hooks/notifs/useDeprecationWarningNotification.tsx +0 -44
- package/src/hooks/notifs/useFastModeNotification.tsx +0 -162
- package/src/hooks/notifs/useIDEStatusIndicator.tsx +0 -186
- package/src/hooks/notifs/useInstallMessages.tsx +0 -26
- package/src/hooks/notifs/useLspInitializationNotification.tsx +0 -143
- package/src/hooks/notifs/useMcpConnectivityStatus.tsx +0 -88
- package/src/hooks/notifs/useModelMigrationNotifications.tsx +0 -52
- package/src/hooks/notifs/useNpmDeprecationNotification.tsx +0 -25
- package/src/hooks/notifs/usePluginAutoupdateNotification.tsx +0 -83
- package/src/hooks/notifs/usePluginInstallationStatus.tsx +0 -128
- package/src/hooks/notifs/useRateLimitWarningNotification.tsx +0 -114
- package/src/hooks/notifs/useSettingsErrors.tsx +0 -69
- package/src/hooks/notifs/useStartupNotification.ts +0 -41
- package/src/hooks/notifs/useTeammateShutdownNotification.ts +0 -78
- package/src/hooks/renderPlaceholder.ts +0 -51
- package/src/hooks/toolPermission/PermissionContext.ts +0 -388
- package/src/hooks/toolPermission/handlers/coordinatorHandler.ts +0 -65
- package/src/hooks/toolPermission/handlers/interactiveHandler.ts +0 -536
- package/src/hooks/toolPermission/handlers/swarmWorkerHandler.ts +0 -159
- package/src/hooks/toolPermission/permissionLogging.ts +0 -238
- package/src/hooks/unifiedSuggestions.ts +0 -202
- package/src/hooks/useAfterFirstRender.ts +0 -17
- package/src/hooks/useApiKeyVerification.ts +0 -84
- package/src/hooks/useArrowKeyHistory.tsx +0 -229
- package/src/hooks/useAssistantHistory.ts +0 -250
- package/src/hooks/useAwaySummary.ts +0 -125
- package/src/hooks/useBackgroundTaskNavigation.ts +0 -251
- package/src/hooks/useBlink.ts +0 -34
- package/src/hooks/useCanUseTool.tsx +0 -204
- package/src/hooks/useCancelRequest.ts +0 -276
- package/src/hooks/useChromeExtensionNotification.tsx +0 -50
- package/src/hooks/useClaudeCodeHintRecommendation.tsx +0 -129
- package/src/hooks/useClipboardImageHint.ts +0 -77
- package/src/hooks/useCommandKeybindings.tsx +0 -108
- package/src/hooks/useCommandQueue.ts +0 -15
- package/src/hooks/useCopyOnSelect.ts +0 -98
- package/src/hooks/useDeferredHookMessages.ts +0 -46
- package/src/hooks/useDiffData.ts +0 -110
- package/src/hooks/useDiffInIDE.ts +0 -379
- package/src/hooks/useDirectConnect.ts +0 -229
- package/src/hooks/useDoublePress.ts +0 -62
- package/src/hooks/useDynamicConfig.ts +0 -22
- package/src/hooks/useElapsedTime.ts +0 -37
- package/src/hooks/useExitOnCtrlCD.ts +0 -95
- package/src/hooks/useExitOnCtrlCDWithKeybindings.ts +0 -24
- package/src/hooks/useFileHistorySnapshotInit.ts +0 -25
- package/src/hooks/useGlobalKeybindings.tsx +0 -249
- package/src/hooks/useHistorySearch.ts +0 -303
- package/src/hooks/useIDEIntegration.tsx +0 -70
- package/src/hooks/useIdeAtMentioned.ts +0 -76
- package/src/hooks/useIdeConnectionStatus.ts +0 -33
- package/src/hooks/useIdeLogging.ts +0 -41
- package/src/hooks/useIdeSelection.ts +0 -150
- package/src/hooks/useInboxPoller.ts +0 -969
- package/src/hooks/useInputBuffer.ts +0 -132
- package/src/hooks/useIssueFlagBanner.ts +0 -133
- package/src/hooks/useLogMessages.ts +0 -119
- package/src/hooks/useLspPluginRecommendation.tsx +0 -194
- package/src/hooks/useMailboxBridge.ts +0 -21
- package/src/hooks/useMainLoopModel.ts +0 -34
- package/src/hooks/useManagePlugins.ts +0 -304
- package/src/hooks/useMemoryUsage.ts +0 -39
- package/src/hooks/useMergedClients.ts +0 -23
- package/src/hooks/useMergedCommands.ts +0 -15
- package/src/hooks/useMergedTools.ts +0 -44
- package/src/hooks/useMinDisplayTime.ts +0 -35
- package/src/hooks/useNotifyAfterTimeout.ts +0 -65
- package/src/hooks/useOfficialMarketplaceNotification.tsx +0 -48
- package/src/hooks/usePasteHandler.ts +0 -285
- package/src/hooks/usePluginRecommendationBase.tsx +0 -105
- package/src/hooks/usePrStatus.ts +0 -106
- package/src/hooks/usePromptSuggestion.ts +0 -177
- package/src/hooks/usePromptsFromClaudeInChrome.tsx +0 -71
- package/src/hooks/useQueueProcessor.ts +0 -68
- package/src/hooks/useRemoteSession.ts +0 -605
- package/src/hooks/useReplBridge.tsx +0 -723
- package/src/hooks/useSSHSession.ts +0 -241
- package/src/hooks/useScheduledTasks.ts +0 -139
- package/src/hooks/useSearchInput.ts +0 -364
- package/src/hooks/useSessionBackgrounding.ts +0 -158
- package/src/hooks/useSettings.ts +0 -17
- package/src/hooks/useSettingsChange.ts +0 -25
- package/src/hooks/useSkillImprovementSurvey.ts +0 -105
- package/src/hooks/useSkillsChange.ts +0 -62
- package/src/hooks/useSwarmInitialization.ts +0 -81
- package/src/hooks/useSwarmPermissionPoller.ts +0 -330
- package/src/hooks/useTaskListWatcher.ts +0 -221
- package/src/hooks/useTasksV2.ts +0 -250
- package/src/hooks/useTeammateViewAutoExit.ts +0 -63
- package/src/hooks/useTeleportResume.tsx +0 -85
- package/src/hooks/useTerminalSize.ts +0 -15
- package/src/hooks/useTextInput.ts +0 -529
- package/src/hooks/useTimeout.ts +0 -14
- package/src/hooks/useTurnDiffs.ts +0 -213
- package/src/hooks/useTypeahead.tsx +0 -1385
- package/src/hooks/useUpdateNotification.ts +0 -34
- package/src/hooks/useVimInput.ts +0 -316
- package/src/hooks/useVirtualScroll.ts +0 -721
- package/src/hooks/useVoice.ts +0 -1144
- package/src/hooks/useVoiceEnabled.ts +0 -25
- package/src/hooks/useVoiceIntegration.tsx +0 -677
- package/src/hunter.ts +0 -1
- package/src/ink/Ansi.tsx +0 -292
- package/src/ink/bidi.ts +0 -139
- package/src/ink/clearTerminal.ts +0 -74
- package/src/ink/colorize.ts +0 -231
- package/src/ink/components/AlternateScreen.tsx +0 -80
- package/src/ink/components/App.tsx +0 -658
- package/src/ink/components/AppContext.ts +0 -21
- package/src/ink/components/Box.tsx +0 -214
- package/src/ink/components/Button.tsx +0 -192
- package/src/ink/components/ClockContext.tsx +0 -112
- package/src/ink/components/CursorDeclarationContext.ts +0 -32
- package/src/ink/components/ErrorOverview.tsx +0 -109
- package/src/ink/components/Link.tsx +0 -42
- package/src/ink/components/Newline.tsx +0 -39
- package/src/ink/components/NoSelect.tsx +0 -68
- package/src/ink/components/RawAnsi.tsx +0 -57
- package/src/ink/components/ScrollBox.tsx +0 -237
- package/src/ink/components/Spacer.tsx +0 -20
- package/src/ink/components/StdinContext.ts +0 -49
- package/src/ink/components/TerminalFocusContext.tsx +0 -52
- package/src/ink/components/TerminalSizeContext.tsx +0 -7
- package/src/ink/components/Text.tsx +0 -254
- package/src/ink/constants.ts +0 -2
- package/src/ink/cursor.ts +0 -1
- package/src/ink/devtools.ts +0 -2
- package/src/ink/dom.ts +0 -484
- package/src/ink/events/click-event.ts +0 -38
- package/src/ink/events/dispatcher.ts +0 -233
- package/src/ink/events/emitter.ts +0 -39
- package/src/ink/events/event-handlers.ts +0 -73
- package/src/ink/events/event.ts +0 -11
- package/src/ink/events/focus-event.ts +0 -21
- package/src/ink/events/input-event.ts +0 -205
- package/src/ink/events/keyboard-event.ts +0 -51
- package/src/ink/events/paste-event.ts +0 -1
- package/src/ink/events/resize-event.ts +0 -1
- package/src/ink/events/terminal-event.ts +0 -107
- package/src/ink/events/terminal-focus-event.ts +0 -19
- package/src/ink/focus.ts +0 -181
- package/src/ink/frame.ts +0 -124
- package/src/ink/get-max-width.ts +0 -27
- package/src/ink/global.d.ts +0 -1
- package/src/ink/hit-test.ts +0 -130
- package/src/ink/hooks/use-animation-frame.ts +0 -57
- package/src/ink/hooks/use-app.ts +0 -8
- package/src/ink/hooks/use-declared-cursor.ts +0 -73
- package/src/ink/hooks/use-input.ts +0 -92
- package/src/ink/hooks/use-interval.ts +0 -67
- package/src/ink/hooks/use-search-highlight.ts +0 -53
- package/src/ink/hooks/use-selection.ts +0 -104
- package/src/ink/hooks/use-stdin.ts +0 -8
- package/src/ink/hooks/use-tab-status.ts +0 -72
- package/src/ink/hooks/use-terminal-focus.ts +0 -16
- package/src/ink/hooks/use-terminal-title.ts +0 -31
- package/src/ink/hooks/use-terminal-viewport.ts +0 -96
- package/src/ink/ink.tsx +0 -1723
- package/src/ink/instances.ts +0 -10
- package/src/ink/layout/engine.ts +0 -6
- package/src/ink/layout/geometry.ts +0 -97
- package/src/ink/layout/node.ts +0 -152
- package/src/ink/layout/yoga.ts +0 -308
- package/src/ink/line-width-cache.ts +0 -24
- package/src/ink/log-update.ts +0 -773
- package/src/ink/measure-element.ts +0 -23
- package/src/ink/measure-text.ts +0 -47
- package/src/ink/node-cache.ts +0 -54
- package/src/ink/optimizer.ts +0 -93
- package/src/ink/output.ts +0 -797
- package/src/ink/parse-keypress.ts +0 -801
- package/src/ink/reconciler.ts +0 -512
- package/src/ink/render-border.ts +0 -231
- package/src/ink/render-node-to-output.ts +0 -1462
- package/src/ink/render-to-screen.ts +0 -231
- package/src/ink/renderer.ts +0 -178
- package/src/ink/root.ts +0 -184
- package/src/ink/screen.ts +0 -1486
- package/src/ink/searchHighlight.ts +0 -93
- package/src/ink/selection.ts +0 -917
- package/src/ink/squash-text-nodes.ts +0 -92
- package/src/ink/stringWidth.ts +0 -222
- package/src/ink/styles.ts +0 -771
- package/src/ink/supports-hyperlinks.ts +0 -57
- package/src/ink/tabstops.ts +0 -46
- package/src/ink/terminal-focus-state.ts +0 -47
- package/src/ink/terminal-querier.ts +0 -212
- package/src/ink/terminal.ts +0 -248
- package/src/ink/termio/ansi.ts +0 -75
- package/src/ink/termio/csi.ts +0 -319
- package/src/ink/termio/dec.ts +0 -60
- package/src/ink/termio/esc.ts +0 -67
- package/src/ink/termio/osc.ts +0 -493
- package/src/ink/termio/parser.ts +0 -394
- package/src/ink/termio/sgr.ts +0 -308
- package/src/ink/termio/tokenize.ts +0 -319
- package/src/ink/termio/types.ts +0 -236
- package/src/ink/termio.ts +0 -42
- package/src/ink/useTerminalNotification.ts +0 -126
- package/src/ink/warn.ts +0 -9
- package/src/ink/widest-line.ts +0 -19
- package/src/ink/wrap-text.ts +0 -74
- package/src/ink/wrapAnsi.ts +0 -20
- package/src/ink.ts +0 -85
- package/src/interactiveHelpers.tsx +0 -366
- package/src/jobs/classifier.ts +0 -2
- package/src/keybindings/KeybindingContext.tsx +0 -243
- package/src/keybindings/KeybindingProviderSetup.tsx +0 -308
- package/src/keybindings/defaultBindings.ts +0 -340
- package/src/keybindings/loadUserBindings.ts +0 -472
- package/src/keybindings/match.ts +0 -120
- package/src/keybindings/parser.ts +0 -203
- package/src/keybindings/reservedShortcuts.ts +0 -127
- package/src/keybindings/resolver.ts +0 -244
- package/src/keybindings/schema.ts +0 -236
- package/src/keybindings/shortcutFormat.ts +0 -63
- package/src/keybindings/template.ts +0 -52
- package/src/keybindings/types.ts +0 -3
- package/src/keybindings/useKeybinding.ts +0 -196
- package/src/keybindings/useShortcutDisplay.ts +0 -59
- package/src/keybindings/validate.ts +0 -498
- package/src/main.tsx +0 -4684
- package/src/memdir/findRelevantMemories.ts +0 -141
- package/src/memdir/memdir.ts +0 -507
- package/src/memdir/memoryAge.ts +0 -53
- package/src/memdir/memoryScan.ts +0 -94
- package/src/memdir/memoryShapeTelemetry.ts +0 -2
- package/src/memdir/memoryTypes.ts +0 -271
- package/src/memdir/paths.ts +0 -278
- package/src/memdir/teamMemPaths.ts +0 -292
- package/src/memdir/teamMemPrompts.ts +0 -100
- package/src/migrations/migrateAutoUpdatesToSettings.ts +0 -61
- package/src/migrations/migrateBypassPermissionsAcceptedToSettings.ts +0 -40
- package/src/migrations/migrateEnableAllProjectMcpServersToSettings.ts +0 -118
- package/src/migrations/migrateFennecToOpus.ts +0 -45
- package/src/migrations/migrateLegacyOpusToCurrent.ts +0 -57
- package/src/migrations/migrateOpusToOpus1m.ts +0 -43
- package/src/migrations/migrateReplBridgeEnabledToRemoteControlAtStartup.ts +0 -22
- package/src/migrations/migrateSonnet1mToSonnet45.ts +0 -48
- package/src/migrations/migrateSonnet45ToSonnet46.ts +0 -67
- package/src/migrations/resetAutoModeOptInForDefaultOffer.ts +0 -51
- package/src/migrations/resetProToOpusDefault.ts +0 -51
- package/src/moreright/useMoreRight.tsx +0 -26
- package/src/native-ts/color-diff/index.ts +0 -1001
- package/src/native-ts/file-index/index.ts +0 -370
- package/src/native-ts/yoga-layout/enums.ts +0 -134
- package/src/native-ts/yoga-layout/index.ts +0 -2578
- package/src/outputStyles/loadOutputStylesDir.ts +0 -98
- package/src/plugins/builtinPlugins.ts +0 -159
- package/src/plugins/bundled/index.ts +0 -23
- package/src/proactive/index.ts +0 -1
- package/src/proactive/useProactive.ts +0 -1
- package/src/projectOnboardingState.ts +0 -83
- package/src/query/config.ts +0 -46
- package/src/query/deps.ts +0 -33
- package/src/query/stopHooks.ts +0 -473
- package/src/query/tokenBudget.ts +0 -93
- package/src/query/transitions.ts +0 -2
- package/src/query.ts +0 -1729
- package/src/remote/RemoteSessionManager.ts +0 -343
- package/src/remote/SessionsWebSocket.ts +0 -404
- package/src/remote/remotePermissionBridge.ts +0 -78
- package/src/remote/sdkMessageAdapter.ts +0 -302
- package/src/replLauncher.tsx +0 -23
- package/src/schemas/hooks.ts +0 -222
- package/src/screens/Doctor.tsx +0 -575
- package/src/screens/REPL.tsx +0 -5006
- package/src/screens/ResumeConversation.tsx +0 -399
- package/src/self-hosted-runner/main.ts +0 -2
- package/src/server/backends/dangerousBackend.ts +0 -2
- package/src/server/connectHeadless.ts +0 -2
- package/src/server/createDirectConnectSession.ts +0 -88
- package/src/server/directConnectManager.ts +0 -213
- package/src/server/lockfile.ts +0 -2
- package/src/server/parseConnectUrl.ts +0 -2
- package/src/server/server.ts +0 -2
- package/src/server/serverBanner.ts +0 -2
- package/src/server/serverLog.ts +0 -2
- package/src/server/sessionManager.ts +0 -2
- package/src/server/types.ts +0 -57
- package/src/services/AgentSummary/agentSummary.ts +0 -179
- package/src/services/MagicDocs/magicDocs.ts +0 -254
- package/src/services/MagicDocs/prompts.ts +0 -127
- package/src/services/PromptSuggestion/promptSuggestion.ts +0 -523
- package/src/services/PromptSuggestion/speculation.ts +0 -991
- package/src/services/SessionMemory/prompts.ts +0 -324
- package/src/services/SessionMemory/sessionMemory.ts +0 -495
- package/src/services/SessionMemory/sessionMemoryUtils.ts +0 -207
- package/src/services/analytics/config.ts +0 -38
- package/src/services/analytics/datadog.ts +0 -307
- package/src/services/analytics/firstPartyEventLogger.ts +0 -449
- package/src/services/analytics/firstPartyEventLoggingExporter.ts +0 -806
- package/src/services/analytics/growthbook.ts +0 -1155
- package/src/services/analytics/index.ts +0 -173
- package/src/services/analytics/metadata.ts +0 -973
- package/src/services/analytics/sink.ts +0 -114
- package/src/services/analytics/sinkKillswitch.ts +0 -25
- package/src/services/api/adminRequests.ts +0 -119
- package/src/services/api/bootstrap.ts +0 -141
- package/src/services/api/claude.ts +0 -3419
- package/src/services/api/client.ts +0 -389
- package/src/services/api/dumpPrompts.ts +0 -226
- package/src/services/api/emptyUsage.ts +0 -22
- package/src/services/api/errorUtils.ts +0 -260
- package/src/services/api/errors.ts +0 -1205
- package/src/services/api/filesApi.ts +0 -748
- package/src/services/api/firstTokenDate.ts +0 -60
- package/src/services/api/grove.ts +0 -357
- package/src/services/api/logging.ts +0 -788
- package/src/services/api/metricsOptOut.ts +0 -159
- package/src/services/api/overageCreditGrant.ts +0 -137
- package/src/services/api/promptCacheBreakDetection.ts +0 -727
- package/src/services/api/referral.ts +0 -281
- package/src/services/api/sessionIngress.ts +0 -514
- package/src/services/api/ultrareviewQuota.ts +0 -38
- package/src/services/api/usage.ts +0 -63
- package/src/services/api/withRetry.ts +0 -818
- package/src/services/autoDream/autoDream.ts +0 -324
- package/src/services/autoDream/config.ts +0 -21
- package/src/services/autoDream/consolidationLock.ts +0 -140
- package/src/services/autoDream/consolidationPrompt.ts +0 -65
- package/src/services/autoDream/dream.ts +0 -1
- package/src/services/awaySummary.ts +0 -74
- package/src/services/claudeAiLimits.ts +0 -515
- package/src/services/claudeAiLimitsHook.ts +0 -23
- package/src/services/compact/apiMicrocompact.ts +0 -153
- package/src/services/compact/autoCompact.ts +0 -351
- package/src/services/compact/cachedMCConfig.ts +0 -2
- package/src/services/compact/cachedMicrocompact.ts +0 -2
- package/src/services/compact/compact.ts +0 -1705
- package/src/services/compact/compactWarningHook.ts +0 -16
- package/src/services/compact/compactWarningState.ts +0 -18
- package/src/services/compact/grouping.ts +0 -63
- package/src/services/compact/microCompact.ts +0 -530
- package/src/services/compact/postCompactCleanup.ts +0 -77
- package/src/services/compact/prompt.ts +0 -374
- package/src/services/compact/reactiveCompact.ts +0 -2
- package/src/services/compact/sessionMemoryCompact.ts +0 -630
- package/src/services/compact/snipCompact.ts +0 -1
- package/src/services/compact/snipProjection.ts +0 -2
- package/src/services/compact/timeBasedMCConfig.ts +0 -43
- package/src/services/contextCollapse/index.ts +0 -2
- package/src/services/contextCollapse/operations.ts +0 -2
- package/src/services/contextCollapse/persist.ts +0 -2
- package/src/services/diagnosticTracking.ts +0 -397
- package/src/services/extractMemories/extractMemories.ts +0 -615
- package/src/services/extractMemories/prompts.ts +0 -154
- package/src/services/internalLogging.ts +0 -90
- package/src/services/lsp/LSPClient.ts +0 -447
- package/src/services/lsp/LSPDiagnosticRegistry.ts +0 -386
- package/src/services/lsp/LSPServerInstance.ts +0 -511
- package/src/services/lsp/LSPServerManager.ts +0 -420
- package/src/services/lsp/config.ts +0 -79
- package/src/services/lsp/manager.ts +0 -289
- package/src/services/lsp/passiveFeedback.ts +0 -328
- package/src/services/lsp/types.ts +0 -3
- package/src/services/mcp/InProcessTransport.ts +0 -63
- package/src/services/mcp/MCPConnectionManager.tsx +0 -73
- package/src/services/mcp/SdkControlTransport.ts +0 -136
- package/src/services/mcp/auth.ts +0 -2465
- package/src/services/mcp/channelAllowlist.ts +0 -76
- package/src/services/mcp/channelNotification.ts +0 -316
- package/src/services/mcp/channelPermissions.ts +0 -240
- package/src/services/mcp/claudeai.ts +0 -164
- package/src/services/mcp/client.ts +0 -3348
- package/src/services/mcp/config.ts +0 -1578
- package/src/services/mcp/elicitationHandler.ts +0 -313
- package/src/services/mcp/envExpansion.ts +0 -38
- package/src/services/mcp/headersHelper.ts +0 -138
- package/src/services/mcp/mcpStringUtils.ts +0 -106
- package/src/services/mcp/normalization.ts +0 -23
- package/src/services/mcp/oauthPort.ts +0 -78
- package/src/services/mcp/officialRegistry.ts +0 -72
- package/src/services/mcp/types.ts +0 -258
- package/src/services/mcp/useManageMCPConnections.ts +0 -1141
- package/src/services/mcp/utils.ts +0 -575
- package/src/services/mcp/vscodeSdkMcp.ts +0 -112
- package/src/services/mcp/xaa.ts +0 -511
- package/src/services/mcp/xaaIdpLogin.ts +0 -487
- package/src/services/mcpServerApproval.tsx +0 -41
- package/src/services/mockRateLimits.ts +0 -882
- package/src/services/notifier.ts +0 -156
- package/src/services/oauth/auth-code-listener.ts +0 -211
- package/src/services/oauth/client.ts +0 -566
- package/src/services/oauth/crypto.ts +0 -23
- package/src/services/oauth/getOauthProfile.ts +0 -53
- package/src/services/oauth/index.ts +0 -198
- package/src/services/oauth/types.ts +0 -7
- package/src/services/plugins/PluginInstallationManager.ts +0 -184
- package/src/services/plugins/pluginCliCommands.ts +0 -344
- package/src/services/plugins/pluginOperations.ts +0 -1088
- package/src/services/policyLimits/index.ts +0 -663
- package/src/services/policyLimits/types.ts +0 -27
- package/src/services/preventSleep.ts +0 -165
- package/src/services/rateLimitMessages.ts +0 -344
- package/src/services/rateLimitMocking.ts +0 -144
- package/src/services/remoteManagedSettings/index.ts +0 -638
- package/src/services/remoteManagedSettings/securityCheck.tsx +0 -74
- package/src/services/remoteManagedSettings/syncCache.ts +0 -112
- package/src/services/remoteManagedSettings/syncCacheState.ts +0 -96
- package/src/services/remoteManagedSettings/types.ts +0 -31
- package/src/services/sessionTranscript/sessionTranscript.ts +0 -2
- package/src/services/settingsSync/index.ts +0 -581
- package/src/services/settingsSync/types.ts +0 -67
- package/src/services/skillSearch/featureCheck.ts +0 -2
- package/src/services/skillSearch/localSearch.ts +0 -2
- package/src/services/skillSearch/prefetch.ts +0 -2
- package/src/services/skillSearch/remoteSkillLoader.ts +0 -2
- package/src/services/skillSearch/remoteSkillState.ts +0 -2
- package/src/services/skillSearch/signals.ts +0 -1
- package/src/services/skillSearch/telemetry.ts +0 -2
- package/src/services/teamMemorySync/index.ts +0 -1256
- package/src/services/teamMemorySync/secretScanner.ts +0 -324
- package/src/services/teamMemorySync/teamMemSecretGuard.ts +0 -44
- package/src/services/teamMemorySync/types.ts +0 -156
- package/src/services/teamMemorySync/watcher.ts +0 -387
- package/src/services/tips/tipHistory.ts +0 -17
- package/src/services/tips/tipRegistry.ts +0 -686
- package/src/services/tips/tipScheduler.ts +0 -58
- package/src/services/tips/types.ts +0 -5
- package/src/services/tokenEstimation.ts +0 -495
- package/src/services/toolUseSummary/toolUseSummaryGenerator.ts +0 -112
- package/src/services/tools/StreamingToolExecutor.ts +0 -530
- package/src/services/tools/toolExecution.ts +0 -1745
- package/src/services/tools/toolHooks.ts +0 -650
- package/src/services/tools/toolOrchestration.ts +0 -188
- package/src/services/vcr.ts +0 -406
- package/src/services/voice.ts +0 -525
- package/src/services/voiceKeyterms.ts +0 -106
- package/src/services/voiceStreamSTT.ts +0 -544
- package/src/setup.ts +0 -477
- package/src/shims/bun-bundle.ts +0 -18
- package/src/shims/macro.ts +0 -12
- package/src/skills/bundled/batch.ts +0 -124
- package/src/skills/bundled/claude-api/SKILL.md +0 -1
- package/src/skills/bundled/claude-api/SKILL.md.ts +0 -1
- package/src/skills/bundled/claude-api/csharp/claude-api.md +0 -1
- package/src/skills/bundled/claude-api/csharp/claude-api.md.ts +0 -1
- package/src/skills/bundled/claude-api/curl/examples.md +0 -1
- package/src/skills/bundled/claude-api/curl/examples.md.ts +0 -1
- package/src/skills/bundled/claude-api/go/claude-api.md +0 -1
- package/src/skills/bundled/claude-api/go/claude-api.md.ts +0 -1
- package/src/skills/bundled/claude-api/java/claude-api.md +0 -1
- package/src/skills/bundled/claude-api/java/claude-api.md.ts +0 -1
- package/src/skills/bundled/claude-api/php/claude-api.md +0 -1
- package/src/skills/bundled/claude-api/php/claude-api.md.ts +0 -1
- package/src/skills/bundled/claude-api/python/agent-sdk/README.md +0 -1
- package/src/skills/bundled/claude-api/python/agent-sdk/README.md.ts +0 -1
- package/src/skills/bundled/claude-api/python/agent-sdk/patterns.md +0 -1
- package/src/skills/bundled/claude-api/python/agent-sdk/patterns.md.ts +0 -1
- package/src/skills/bundled/claude-api/python/claude-api/README.md +0 -1
- package/src/skills/bundled/claude-api/python/claude-api/README.md.ts +0 -1
- package/src/skills/bundled/claude-api/python/claude-api/batches.md +0 -1
- package/src/skills/bundled/claude-api/python/claude-api/batches.md.ts +0 -1
- package/src/skills/bundled/claude-api/python/claude-api/files-api.md +0 -1
- package/src/skills/bundled/claude-api/python/claude-api/files-api.md.ts +0 -1
- package/src/skills/bundled/claude-api/python/claude-api/streaming.md +0 -1
- package/src/skills/bundled/claude-api/python/claude-api/streaming.md.ts +0 -1
- package/src/skills/bundled/claude-api/python/claude-api/tool-use.md +0 -1
- package/src/skills/bundled/claude-api/python/claude-api/tool-use.md.ts +0 -1
- package/src/skills/bundled/claude-api/ruby/claude-api.md +0 -1
- package/src/skills/bundled/claude-api/ruby/claude-api.md.ts +0 -1
- package/src/skills/bundled/claude-api/shared/error-codes.md +0 -1
- package/src/skills/bundled/claude-api/shared/error-codes.md.ts +0 -1
- package/src/skills/bundled/claude-api/shared/live-sources.md +0 -1
- package/src/skills/bundled/claude-api/shared/live-sources.md.ts +0 -1
- package/src/skills/bundled/claude-api/shared/models.md +0 -1
- package/src/skills/bundled/claude-api/shared/models.md.ts +0 -1
- package/src/skills/bundled/claude-api/shared/prompt-caching.md +0 -1
- package/src/skills/bundled/claude-api/shared/prompt-caching.md.ts +0 -1
- package/src/skills/bundled/claude-api/shared/tool-use-concepts.md +0 -1
- package/src/skills/bundled/claude-api/shared/tool-use-concepts.md.ts +0 -1
- package/src/skills/bundled/claude-api/typescript/agent-sdk/README.md +0 -1
- package/src/skills/bundled/claude-api/typescript/agent-sdk/README.md.ts +0 -1
- package/src/skills/bundled/claude-api/typescript/agent-sdk/patterns.md +0 -1
- package/src/skills/bundled/claude-api/typescript/agent-sdk/patterns.md.ts +0 -1
- package/src/skills/bundled/claude-api/typescript/claude-api/README.md +0 -1
- package/src/skills/bundled/claude-api/typescript/claude-api/README.md.ts +0 -1
- package/src/skills/bundled/claude-api/typescript/claude-api/batches.md +0 -1
- package/src/skills/bundled/claude-api/typescript/claude-api/batches.md.ts +0 -1
- package/src/skills/bundled/claude-api/typescript/claude-api/files-api.md +0 -1
- package/src/skills/bundled/claude-api/typescript/claude-api/files-api.md.ts +0 -1
- package/src/skills/bundled/claude-api/typescript/claude-api/streaming.md +0 -1
- package/src/skills/bundled/claude-api/typescript/claude-api/streaming.md.ts +0 -1
- package/src/skills/bundled/claude-api/typescript/claude-api/tool-use.md +0 -1
- package/src/skills/bundled/claude-api/typescript/claude-api/tool-use.md.ts +0 -1
- package/src/skills/bundled/claudeApi.ts +0 -196
- package/src/skills/bundled/claudeApiContent.ts +0 -75
- package/src/skills/bundled/claudeInChrome.ts +0 -34
- package/src/skills/bundled/debug.ts +0 -103
- package/src/skills/bundled/dream.ts +0 -1
- package/src/skills/bundled/hunter.ts +0 -1
- package/src/skills/bundled/index.ts +0 -79
- package/src/skills/bundled/keybindings.ts +0 -339
- package/src/skills/bundled/loop.ts +0 -92
- package/src/skills/bundled/loremIpsum.ts +0 -282
- package/src/skills/bundled/remember.ts +0 -82
- package/src/skills/bundled/runSkillGenerator.ts +0 -1
- package/src/skills/bundled/scheduleRemoteAgents.ts +0 -447
- package/src/skills/bundled/simplify.ts +0 -69
- package/src/skills/bundled/skillify.ts +0 -197
- package/src/skills/bundled/stuck.ts +0 -79
- package/src/skills/bundled/updateConfig.ts +0 -475
- package/src/skills/bundled/verify/SKILL.md +0 -1
- package/src/skills/bundled/verify/SKILL.md.ts +0 -1
- package/src/skills/bundled/verify/examples/cli.md +0 -1
- package/src/skills/bundled/verify/examples/cli.md.ts +0 -1
- package/src/skills/bundled/verify/examples/server.md +0 -1
- package/src/skills/bundled/verify/examples/server.md.ts +0 -1
- package/src/skills/bundled/verify.ts +0 -30
- package/src/skills/bundled/verifyContent.ts +0 -13
- package/src/skills/bundledSkills.ts +0 -220
- package/src/skills/loadSkillsDir.ts +0 -1086
- package/src/skills/mcpSkillBuilders.ts +0 -44
- package/src/skills/mcpSkills.ts +0 -2
- package/src/ssh/SSHSessionManager.ts +0 -1
- package/src/ssh/createSSHSession.ts +0 -1
- package/src/state/AppState.tsx +0 -200
- package/src/state/AppStateStore.ts +0 -569
- package/src/state/onChangeAppState.ts +0 -171
- package/src/state/selectors.ts +0 -76
- package/src/state/store.ts +0 -34
- package/src/state/teammateViewHelpers.ts +0 -141
- package/src/tasks/DreamTask/DreamTask.ts +0 -157
- package/src/tasks/InProcessTeammateTask/InProcessTeammateTask.tsx +0 -126
- package/src/tasks/InProcessTeammateTask/types.ts +0 -121
- package/src/tasks/LocalAgentTask/LocalAgentTask.tsx +0 -683
- package/src/tasks/LocalMainSessionTask.ts +0 -479
- package/src/tasks/LocalShellTask/LocalShellTask.tsx +0 -523
- package/src/tasks/LocalShellTask/guards.ts +0 -41
- package/src/tasks/LocalShellTask/killShellTasks.ts +0 -76
- package/src/tasks/LocalWorkflowTask/LocalWorkflowTask.ts +0 -1
- package/src/tasks/MonitorMcpTask/MonitorMcpTask.ts +0 -1
- package/src/tasks/RemoteAgentTask/RemoteAgentTask.tsx +0 -856
- package/src/tasks/pillLabel.ts +0 -82
- package/src/tasks/stopTask.ts +0 -100
- package/src/tasks/types.ts +0 -46
- package/src/tasks.ts +0 -39
- package/src/tools/AgentTool/AgentTool.tsx +0 -1398
- package/src/tools/AgentTool/UI.tsx +0 -872
- package/src/tools/AgentTool/agentColorManager.ts +0 -66
- package/src/tools/AgentTool/agentDisplay.ts +0 -104
- package/src/tools/AgentTool/agentMemory.ts +0 -177
- package/src/tools/AgentTool/agentMemorySnapshot.ts +0 -197
- package/src/tools/AgentTool/agentToolUtils.ts +0 -686
- package/src/tools/AgentTool/built-in/claudeCodeGuideAgent.ts +0 -205
- package/src/tools/AgentTool/built-in/exploreAgent.ts +0 -87
- package/src/tools/AgentTool/built-in/generalPurposeAgent.ts +0 -34
- package/src/tools/AgentTool/built-in/planAgent.ts +0 -92
- package/src/tools/AgentTool/built-in/statuslineSetup.ts +0 -144
- package/src/tools/AgentTool/built-in/verificationAgent.ts +0 -152
- package/src/tools/AgentTool/built-in/warpGrepAgent.ts +0 -67
- package/src/tools/AgentTool/builtInAgents.ts +0 -73
- package/src/tools/AgentTool/constants.ts +0 -12
- package/src/tools/AgentTool/forkSubagent.ts +0 -210
- package/src/tools/AgentTool/loadAgentsDir.ts +0 -755
- package/src/tools/AgentTool/prompt.ts +0 -288
- package/src/tools/AgentTool/resumeAgent.ts +0 -265
- package/src/tools/AgentTool/runAgent.ts +0 -973
- package/src/tools/AskUserQuestionTool/AskUserQuestionTool.tsx +0 -266
- package/src/tools/AskUserQuestionTool/prompt.ts +0 -44
- package/src/tools/BashTool/BashTool.tsx +0 -1144
- package/src/tools/BashTool/BashToolResultMessage.tsx +0 -191
- package/src/tools/BashTool/UI.tsx +0 -185
- package/src/tools/BashTool/bashCommandHelpers.ts +0 -265
- package/src/tools/BashTool/bashPermissions.ts +0 -2621
- package/src/tools/BashTool/bashSecurity.ts +0 -2592
- package/src/tools/BashTool/commandSemantics.ts +0 -140
- package/src/tools/BashTool/commentLabel.ts +0 -13
- package/src/tools/BashTool/destructiveCommandWarning.ts +0 -102
- package/src/tools/BashTool/modeValidation.ts +0 -115
- package/src/tools/BashTool/pathValidation.ts +0 -1303
- package/src/tools/BashTool/prompt.ts +0 -369
- package/src/tools/BashTool/readOnlyValidation.ts +0 -1990
- package/src/tools/BashTool/sedEditParser.ts +0 -322
- package/src/tools/BashTool/sedValidation.ts +0 -684
- package/src/tools/BashTool/shouldUseSandbox.ts +0 -153
- package/src/tools/BashTool/toolName.ts +0 -2
- package/src/tools/BashTool/utils.ts +0 -223
- package/src/tools/BriefTool/BriefTool.ts +0 -204
- package/src/tools/BriefTool/UI.tsx +0 -101
- package/src/tools/BriefTool/attachments.ts +0 -110
- package/src/tools/BriefTool/prompt.ts +0 -22
- package/src/tools/BriefTool/upload.ts +0 -174
- package/src/tools/ConfigTool/ConfigTool.ts +0 -467
- package/src/tools/ConfigTool/UI.tsx +0 -38
- package/src/tools/ConfigTool/constants.ts +0 -1
- package/src/tools/ConfigTool/prompt.ts +0 -93
- package/src/tools/ConfigTool/supportedSettings.ts +0 -211
- package/src/tools/CtxInspectTool/CtxInspectTool.ts +0 -1
- package/src/tools/DiscoverSkillsTool/prompt.ts +0 -2
- package/src/tools/EnterPlanModeTool/EnterPlanModeTool.ts +0 -126
- package/src/tools/EnterPlanModeTool/UI.tsx +0 -33
- package/src/tools/EnterPlanModeTool/constants.ts +0 -1
- package/src/tools/EnterPlanModeTool/prompt.ts +0 -170
- package/src/tools/EnterWorktreeTool/EnterWorktreeTool.ts +0 -127
- package/src/tools/EnterWorktreeTool/UI.tsx +0 -20
- package/src/tools/EnterWorktreeTool/constants.ts +0 -1
- package/src/tools/EnterWorktreeTool/prompt.ts +0 -30
- package/src/tools/ExitPlanModeTool/ExitPlanModeV2Tool.ts +0 -493
- package/src/tools/ExitPlanModeTool/UI.tsx +0 -82
- package/src/tools/ExitPlanModeTool/constants.ts +0 -2
- package/src/tools/ExitPlanModeTool/prompt.ts +0 -29
- package/src/tools/ExitWorktreeTool/ExitWorktreeTool.ts +0 -329
- package/src/tools/ExitWorktreeTool/UI.tsx +0 -25
- package/src/tools/ExitWorktreeTool/constants.ts +0 -1
- package/src/tools/ExitWorktreeTool/prompt.ts +0 -32
- package/src/tools/FileEditTool/FileEditTool.ts +0 -625
- package/src/tools/FileEditTool/UI.tsx +0 -289
- package/src/tools/FileEditTool/constants.ts +0 -11
- package/src/tools/FileEditTool/prompt.ts +0 -28
- package/src/tools/FileEditTool/types.ts +0 -85
- package/src/tools/FileEditTool/utils.ts +0 -775
- package/src/tools/FileReadTool/FileReadTool.ts +0 -1183
- package/src/tools/FileReadTool/UI.tsx +0 -185
- package/src/tools/FileReadTool/imageProcessor.ts +0 -94
- package/src/tools/FileReadTool/limits.ts +0 -92
- package/src/tools/FileReadTool/prompt.ts +0 -49
- package/src/tools/FileWriteTool/FileWriteTool.ts +0 -434
- package/src/tools/FileWriteTool/UI.tsx +0 -405
- package/src/tools/FileWriteTool/prompt.ts +0 -18
- package/src/tools/GlobTool/GlobTool.ts +0 -198
- package/src/tools/GlobTool/UI.tsx +0 -63
- package/src/tools/GlobTool/prompt.ts +0 -7
- package/src/tools/GrepTool/GrepTool.ts +0 -577
- package/src/tools/GrepTool/UI.tsx +0 -201
- package/src/tools/GrepTool/prompt.ts +0 -18
- package/src/tools/LSPTool/LSPTool.ts +0 -860
- package/src/tools/LSPTool/UI.tsx +0 -228
- package/src/tools/LSPTool/formatters.ts +0 -592
- package/src/tools/LSPTool/prompt.ts +0 -21
- package/src/tools/LSPTool/schemas.ts +0 -215
- package/src/tools/LSPTool/symbolContext.ts +0 -90
- package/src/tools/ListMcpResourcesTool/ListMcpResourcesTool.ts +0 -123
- package/src/tools/ListMcpResourcesTool/UI.tsx +0 -29
- package/src/tools/ListMcpResourcesTool/prompt.ts +0 -20
- package/src/tools/ListPeersTool/ListPeersTool.ts +0 -1
- package/src/tools/MCPTool/MCPTool.ts +0 -77
- package/src/tools/MCPTool/UI.tsx +0 -403
- package/src/tools/MCPTool/classifyForCollapse.ts +0 -604
- package/src/tools/MCPTool/prompt.ts +0 -3
- package/src/tools/McpAuthTool/McpAuthTool.ts +0 -215
- package/src/tools/MonitorTool/MonitorTool.ts +0 -2
- package/src/tools/NotebookEditTool/NotebookEditTool.ts +0 -490
- package/src/tools/NotebookEditTool/UI.tsx +0 -93
- package/src/tools/NotebookEditTool/constants.ts +0 -2
- package/src/tools/NotebookEditTool/prompt.ts +0 -3
- package/src/tools/OverflowTestTool/OverflowTestTool.ts +0 -2
- package/src/tools/PowerShellTool/PowerShellTool.tsx +0 -1001
- package/src/tools/PowerShellTool/UI.tsx +0 -131
- package/src/tools/PowerShellTool/clmTypes.ts +0 -211
- package/src/tools/PowerShellTool/commandSemantics.ts +0 -142
- package/src/tools/PowerShellTool/commonParameters.ts +0 -30
- package/src/tools/PowerShellTool/destructiveCommandWarning.ts +0 -109
- package/src/tools/PowerShellTool/gitSafety.ts +0 -176
- package/src/tools/PowerShellTool/modeValidation.ts +0 -404
- package/src/tools/PowerShellTool/pathValidation.ts +0 -2049
- package/src/tools/PowerShellTool/powershellPermissions.ts +0 -1648
- package/src/tools/PowerShellTool/powershellSecurity.ts +0 -1090
- package/src/tools/PowerShellTool/prompt.ts +0 -145
- package/src/tools/PowerShellTool/readOnlyValidation.ts +0 -1823
- package/src/tools/PowerShellTool/toolName.ts +0 -2
- package/src/tools/PushNotificationTool/PushNotificationTool.ts +0 -1
- package/src/tools/REPLTool/REPLTool.ts +0 -1
- package/src/tools/REPLTool/constants.ts +0 -46
- package/src/tools/REPLTool/primitiveTools.ts +0 -39
- package/src/tools/ReadMcpResourceTool/ReadMcpResourceTool.ts +0 -158
- package/src/tools/ReadMcpResourceTool/UI.tsx +0 -37
- package/src/tools/ReadMcpResourceTool/prompt.ts +0 -16
- package/src/tools/RemoteTriggerTool/RemoteTriggerTool.ts +0 -161
- package/src/tools/RemoteTriggerTool/UI.tsx +0 -17
- package/src/tools/RemoteTriggerTool/prompt.ts +0 -15
- package/src/tools/ReviewArtifactTool/ReviewArtifactTool.ts +0 -2
- package/src/tools/ScheduleCronTool/CronCreateTool.ts +0 -157
- package/src/tools/ScheduleCronTool/CronDeleteTool.ts +0 -95
- package/src/tools/ScheduleCronTool/CronListTool.ts +0 -97
- package/src/tools/ScheduleCronTool/UI.tsx +0 -60
- package/src/tools/ScheduleCronTool/prompt.ts +0 -135
- package/src/tools/SendMessageTool/SendMessageTool.ts +0 -917
- package/src/tools/SendMessageTool/UI.tsx +0 -31
- package/src/tools/SendMessageTool/constants.ts +0 -1
- package/src/tools/SendMessageTool/prompt.ts +0 -49
- package/src/tools/SendUserFileTool/SendUserFileTool.ts +0 -1
- package/src/tools/SendUserFileTool/prompt.ts +0 -2
- package/src/tools/SkillTool/SkillTool.ts +0 -1108
- package/src/tools/SkillTool/UI.tsx +0 -128
- package/src/tools/SkillTool/constants.ts +0 -1
- package/src/tools/SkillTool/prompt.ts +0 -241
- package/src/tools/SleepTool/SleepTool.ts +0 -1
- package/src/tools/SleepTool/prompt.ts +0 -17
- package/src/tools/SnipTool/SnipTool.ts +0 -1
- package/src/tools/SnipTool/prompt.ts +0 -2
- package/src/tools/SubscribePRTool/SubscribePRTool.ts +0 -1
- package/src/tools/SuggestBackgroundPRTool/SuggestBackgroundPRTool.ts +0 -1
- package/src/tools/SyntheticOutputTool/SyntheticOutputTool.ts +0 -163
- package/src/tools/TaskCreateTool/TaskCreateTool.ts +0 -138
- package/src/tools/TaskCreateTool/constants.ts +0 -1
- package/src/tools/TaskCreateTool/prompt.ts +0 -56
- package/src/tools/TaskGetTool/TaskGetTool.ts +0 -128
- package/src/tools/TaskGetTool/constants.ts +0 -1
- package/src/tools/TaskGetTool/prompt.ts +0 -24
- package/src/tools/TaskListTool/TaskListTool.ts +0 -116
- package/src/tools/TaskListTool/constants.ts +0 -1
- package/src/tools/TaskListTool/prompt.ts +0 -49
- package/src/tools/TaskOutputTool/TaskOutputTool.tsx +0 -584
- package/src/tools/TaskOutputTool/constants.ts +0 -1
- package/src/tools/TaskStopTool/TaskStopTool.ts +0 -131
- package/src/tools/TaskStopTool/UI.tsx +0 -41
- package/src/tools/TaskStopTool/prompt.ts +0 -8
- package/src/tools/TaskUpdateTool/TaskUpdateTool.ts +0 -406
- package/src/tools/TaskUpdateTool/constants.ts +0 -1
- package/src/tools/TaskUpdateTool/prompt.ts +0 -77
- package/src/tools/TeamCreateTool/TeamCreateTool.ts +0 -240
- package/src/tools/TeamCreateTool/UI.tsx +0 -6
- package/src/tools/TeamCreateTool/constants.ts +0 -1
- package/src/tools/TeamCreateTool/prompt.ts +0 -113
- package/src/tools/TeamDeleteTool/TeamDeleteTool.ts +0 -139
- package/src/tools/TeamDeleteTool/UI.tsx +0 -20
- package/src/tools/TeamDeleteTool/constants.ts +0 -1
- package/src/tools/TeamDeleteTool/prompt.ts +0 -16
- package/src/tools/TerminalCaptureTool/TerminalCaptureTool.ts +0 -1
- package/src/tools/TerminalCaptureTool/prompt.ts +0 -2
- package/src/tools/TodoWriteTool/TodoWriteTool.ts +0 -115
- package/src/tools/TodoWriteTool/constants.ts +0 -1
- package/src/tools/TodoWriteTool/prompt.ts +0 -184
- package/src/tools/ToolSearchTool/ToolSearchTool.ts +0 -471
- package/src/tools/ToolSearchTool/constants.ts +0 -1
- package/src/tools/ToolSearchTool/prompt.ts +0 -121
- package/src/tools/TungstenTool/TungstenLiveMonitor.ts +0 -3
- package/src/tools/TungstenTool/TungstenLiveMonitor.tsx +0 -6
- package/src/tools/TungstenTool/TungstenTool.ts +0 -26
- package/src/tools/VerifyPlanExecutionTool/VerifyPlanExecutionTool.ts +0 -1
- package/src/tools/VerifyPlanExecutionTool/constants.ts +0 -2
- package/src/tools/WarpGrepTool/WarpGrepTool.ts +0 -106
- package/src/tools/WebBrowserTool/WebBrowserPanel.ts +0 -2
- package/src/tools/WebBrowserTool/WebBrowserTool.ts +0 -1
- package/src/tools/WebFetchTool/UI.tsx +0 -72
- package/src/tools/WebFetchTool/WebFetchTool.ts +0 -318
- package/src/tools/WebFetchTool/preapproved.ts +0 -166
- package/src/tools/WebFetchTool/prompt.ts +0 -46
- package/src/tools/WebFetchTool/utils.ts +0 -530
- package/src/tools/WebSearchTool/UI.tsx +0 -101
- package/src/tools/WebSearchTool/WebSearchTool.ts +0 -435
- package/src/tools/WebSearchTool/prompt.ts +0 -34
- package/src/tools/WorkflowTool/WorkflowPermissionRequest.ts +0 -2
- package/src/tools/WorkflowTool/WorkflowTool.ts +0 -2
- package/src/tools/WorkflowTool/bundled/index.ts +0 -1
- package/src/tools/WorkflowTool/constants.ts +0 -1
- package/src/tools/WorkflowTool/createWorkflowCommand.ts +0 -2
- package/src/tools/shared/gitOperationTracking.ts +0 -277
- package/src/tools/shared/spawnMultiAgent.ts +0 -1093
- package/src/tools/testing/TestingPermissionTool.tsx +0 -74
- package/src/tools/utils.ts +0 -40
- package/src/tools.ts +0 -394
- package/src/types/command.ts +0 -216
- package/src/types/connectorText.ts +0 -3
- package/src/types/declarations/bun-globals.d.ts +0 -19
- package/src/types/declarations/external-modules.d.ts +0 -120
- package/src/types/declarations/react-compiler.d.ts +0 -3
- package/src/types/fileSuggestion.ts +0 -1
- package/src/types/generated/events_mono/claude_code/v1/claude_code_internal_event.ts +0 -865
- package/src/types/generated/events_mono/common/v1/auth.ts +0 -100
- package/src/types/generated/events_mono/growthbook/v1/growthbook_experiment_event.ts +0 -223
- package/src/types/generated/google/protobuf/timestamp.ts +0 -187
- package/src/types/hooks.ts +0 -290
- package/src/types/ids.ts +0 -44
- package/src/types/logs.ts +0 -330
- package/src/types/message.ts +0 -40
- package/src/types/messageQueueTypes.ts +0 -2
- package/src/types/notebook.ts +0 -7
- package/src/types/permissions.ts +0 -441
- package/src/types/plugin.ts +0 -363
- package/src/types/statusLine.ts +0 -1
- package/src/types/textInputTypes.ts +0 -387
- package/src/types/tools.ts +0 -11
- package/src/types/utils.ts +0 -2
- package/src/upstreamproxy/relay.ts +0 -455
- package/src/upstreamproxy/upstreamproxy.ts +0 -285
- package/src/utils/CircularBuffer.ts +0 -84
- package/src/utils/Cursor.ts +0 -1530
- package/src/utils/QueryGuard.ts +0 -121
- package/src/utils/Shell.ts +0 -474
- package/src/utils/ShellCommand.ts +0 -465
- package/src/utils/abortController.ts +0 -99
- package/src/utils/activityManager.ts +0 -164
- package/src/utils/advisor.ts +0 -145
- package/src/utils/agentContext.ts +0 -178
- package/src/utils/agentId.ts +0 -99
- package/src/utils/agentSwarmsEnabled.ts +0 -44
- package/src/utils/agenticSessionSearch.ts +0 -307
- package/src/utils/analyzeContext.ts +0 -1382
- package/src/utils/ansiToPng.ts +0 -334
- package/src/utils/ansiToSvg.ts +0 -272
- package/src/utils/api.ts +0 -718
- package/src/utils/apiPreconnect.ts +0 -71
- package/src/utils/appleTerminalBackup.ts +0 -124
- package/src/utils/argumentSubstitution.ts +0 -145
- package/src/utils/array.ts +0 -13
- package/src/utils/asciicast.ts +0 -239
- package/src/utils/attachments.ts +0 -3997
- package/src/utils/attribution.ts +0 -393
- package/src/utils/attributionHooks.ts +0 -2
- package/src/utils/attributionTrailer.ts +0 -2
- package/src/utils/auth.ts +0 -2002
- package/src/utils/authFileDescriptor.ts +0 -196
- package/src/utils/authPortable.ts +0 -19
- package/src/utils/autoModeDenials.ts +0 -26
- package/src/utils/autoRunIssue.tsx +0 -122
- package/src/utils/autoUpdater.ts +0 -561
- package/src/utils/aws.ts +0 -74
- package/src/utils/awsAuthStatusManager.ts +0 -81
- package/src/utils/background/remote/preconditions.ts +0 -235
- package/src/utils/background/remote/remoteSession.ts +0 -98
- package/src/utils/backgroundHousekeeping.ts +0 -94
- package/src/utils/bash/ParsedCommand.ts +0 -318
- package/src/utils/bash/ShellSnapshot.ts +0 -582
- package/src/utils/bash/ast.ts +0 -2679
- package/src/utils/bash/bashParser.ts +0 -4436
- package/src/utils/bash/bashPipeCommand.ts +0 -294
- package/src/utils/bash/commands.ts +0 -1339
- package/src/utils/bash/heredoc.ts +0 -733
- package/src/utils/bash/parser.ts +0 -230
- package/src/utils/bash/prefix.ts +0 -204
- package/src/utils/bash/registry.ts +0 -53
- package/src/utils/bash/shellCompletion.ts +0 -259
- package/src/utils/bash/shellPrefix.ts +0 -28
- package/src/utils/bash/shellQuote.ts +0 -304
- package/src/utils/bash/shellQuoting.ts +0 -128
- package/src/utils/bash/specs/alias.ts +0 -14
- package/src/utils/bash/specs/index.ts +0 -18
- package/src/utils/bash/specs/nohup.ts +0 -13
- package/src/utils/bash/specs/pyright.ts +0 -91
- package/src/utils/bash/specs/sleep.ts +0 -13
- package/src/utils/bash/specs/srun.ts +0 -31
- package/src/utils/bash/specs/time.ts +0 -13
- package/src/utils/bash/specs/timeout.ts +0 -20
- package/src/utils/bash/treeSitterAnalysis.ts +0 -506
- package/src/utils/betas.ts +0 -434
- package/src/utils/billing.ts +0 -78
- package/src/utils/binaryCheck.ts +0 -53
- package/src/utils/browser.ts +0 -68
- package/src/utils/bufferedWriter.ts +0 -100
- package/src/utils/bundledMode.ts +0 -22
- package/src/utils/caCerts.ts +0 -115
- package/src/utils/caCertsConfig.ts +0 -88
- package/src/utils/cachePaths.ts +0 -38
- package/src/utils/ccshareResume.ts +0 -2
- package/src/utils/classifierApprovals.ts +0 -88
- package/src/utils/classifierApprovalsHook.ts +0 -17
- package/src/utils/claudeCodeHints.ts +0 -193
- package/src/utils/claudeDesktop.ts +0 -152
- package/src/utils/claudeInChrome/chromeNativeHost.ts +0 -527
- package/src/utils/claudeInChrome/common.ts +0 -540
- package/src/utils/claudeInChrome/mcpServer.ts +0 -293
- package/src/utils/claudeInChrome/prompt.ts +0 -83
- package/src/utils/claudeInChrome/setup.ts +0 -400
- package/src/utils/claudeInChrome/setupPortable.ts +0 -233
- package/src/utils/claudeInChrome/toolRendering.tsx +0 -262
- package/src/utils/claudemd.ts +0 -1479
- package/src/utils/cleanup.ts +0 -602
- package/src/utils/cleanupRegistry.ts +0 -25
- package/src/utils/cliArgs.ts +0 -60
- package/src/utils/cliHighlight.ts +0 -54
- package/src/utils/codeIndexing.ts +0 -206
- package/src/utils/collapseBackgroundBashNotifications.ts +0 -84
- package/src/utils/collapseHookSummaries.ts +0 -59
- package/src/utils/collapseReadSearch.ts +0 -1109
- package/src/utils/collapseTeammateShutdowns.ts +0 -55
- package/src/utils/combinedAbortSignal.ts +0 -47
- package/src/utils/commandLifecycle.ts +0 -21
- package/src/utils/commitAttribution.ts +0 -961
- package/src/utils/completionCache.ts +0 -166
- package/src/utils/computerUse/appNames.ts +0 -196
- package/src/utils/computerUse/cleanup.ts +0 -86
- package/src/utils/computerUse/common.ts +0 -61
- package/src/utils/computerUse/computerUseLock.ts +0 -215
- package/src/utils/computerUse/drainRunLoop.ts +0 -79
- package/src/utils/computerUse/escHotkey.ts +0 -54
- package/src/utils/computerUse/executor.ts +0 -658
- package/src/utils/computerUse/gates.ts +0 -72
- package/src/utils/computerUse/hostAdapter.ts +0 -69
- package/src/utils/computerUse/inputLoader.ts +0 -30
- package/src/utils/computerUse/mcpServer.ts +0 -106
- package/src/utils/computerUse/setup.ts +0 -53
- package/src/utils/computerUse/swiftLoader.ts +0 -23
- package/src/utils/computerUse/toolRendering.tsx +0 -125
- package/src/utils/computerUse/wrapper.tsx +0 -336
- package/src/utils/concurrentSessions.ts +0 -204
- package/src/utils/config.ts +0 -1817
- package/src/utils/configConstants.ts +0 -21
- package/src/utils/contentArray.ts +0 -51
- package/src/utils/context.ts +0 -221
- package/src/utils/contextAnalysis.ts +0 -272
- package/src/utils/contextSuggestions.ts +0 -235
- package/src/utils/controlMessageCompat.ts +0 -32
- package/src/utils/conversationRecovery.ts +0 -597
- package/src/utils/cron.ts +0 -308
- package/src/utils/cronJitterConfig.ts +0 -75
- package/src/utils/cronScheduler.ts +0 -565
- package/src/utils/cronTasks.ts +0 -458
- package/src/utils/cronTasksLock.ts +0 -195
- package/src/utils/crossProjectResume.ts +0 -75
- package/src/utils/crypto.ts +0 -13
- package/src/utils/cwd.ts +0 -32
- package/src/utils/debug.ts +0 -268
- package/src/utils/debugFilter.ts +0 -157
- package/src/utils/deepLink/banner.ts +0 -123
- package/src/utils/deepLink/parseDeepLink.ts +0 -170
- package/src/utils/deepLink/protocolHandler.ts +0 -136
- package/src/utils/deepLink/registerProtocol.ts +0 -348
- package/src/utils/deepLink/terminalLauncher.ts +0 -557
- package/src/utils/deepLink/terminalPreference.ts +0 -54
- package/src/utils/desktopDeepLink.ts +0 -236
- package/src/utils/detectRepository.ts +0 -178
- package/src/utils/diagLogs.ts +0 -94
- package/src/utils/diff.ts +0 -177
- package/src/utils/directMemberMessage.ts +0 -69
- package/src/utils/displayTags.ts +0 -51
- package/src/utils/doctorContextWarnings.ts +0 -265
- package/src/utils/doctorDiagnostic.ts +0 -625
- package/src/utils/dxt/helpers.ts +0 -88
- package/src/utils/dxt/zip.ts +0 -226
- package/src/utils/earlyInput.ts +0 -191
- package/src/utils/editor.ts +0 -183
- package/src/utils/effort.ts +0 -329
- package/src/utils/embeddedTools.ts +0 -29
- package/src/utils/env.ts +0 -347
- package/src/utils/envDynamic.ts +0 -151
- package/src/utils/envUtils.ts +0 -183
- package/src/utils/envValidation.ts +0 -38
- package/src/utils/errorLogSink.ts +0 -235
- package/src/utils/errors.ts +0 -238
- package/src/utils/eventLoopStallDetector.ts +0 -2
- package/src/utils/exampleCommands.ts +0 -184
- package/src/utils/execFileNoThrow.ts +0 -150
- package/src/utils/execFileNoThrowPortable.ts +0 -89
- package/src/utils/execSyncWrapper.ts +0 -38
- package/src/utils/exportRenderer.tsx +0 -98
- package/src/utils/extraUsage.ts +0 -23
- package/src/utils/fastMode.ts +0 -532
- package/src/utils/file.ts +0 -584
- package/src/utils/fileHistory.ts +0 -1115
- package/src/utils/fileOperationAnalytics.ts +0 -71
- package/src/utils/filePersistence/filePersistence.ts +0 -287
- package/src/utils/filePersistence/outputsScanner.ts +0 -126
- package/src/utils/filePersistence/types.ts +0 -33
- package/src/utils/fileRead.ts +0 -102
- package/src/utils/fileReadCache.ts +0 -96
- package/src/utils/fileStateCache.ts +0 -142
- package/src/utils/findExecutable.ts +0 -17
- package/src/utils/fingerprint.ts +0 -76
- package/src/utils/forkedAgent.ts +0 -689
- package/src/utils/format.ts +0 -308
- package/src/utils/formatBriefTimestamp.ts +0 -81
- package/src/utils/fpsTracker.ts +0 -47
- package/src/utils/frontmatterParser.ts +0 -370
- package/src/utils/fsOperations.ts +0 -770
- package/src/utils/fullscreen.ts +0 -202
- package/src/utils/generatedFiles.ts +0 -136
- package/src/utils/generators.ts +0 -88
- package/src/utils/genericProcessUtils.ts +0 -184
- package/src/utils/getWorktreePaths.ts +0 -70
- package/src/utils/getWorktreePathsPortable.ts +0 -27
- package/src/utils/ghPrStatus.ts +0 -106
- package/src/utils/git/gitConfigParser.ts +0 -277
- package/src/utils/git/gitFilesystem.ts +0 -699
- package/src/utils/git/gitignore.ts +0 -99
- package/src/utils/git.ts +0 -926
- package/src/utils/gitDiff.ts +0 -532
- package/src/utils/gitSettings.ts +0 -18
- package/src/utils/github/ghAuthStatus.ts +0 -29
- package/src/utils/githubRepoPathMapping.ts +0 -162
- package/src/utils/glob.ts +0 -130
- package/src/utils/gracefulShutdown.ts +0 -529
- package/src/utils/groupToolUses.ts +0 -182
- package/src/utils/handlePromptSubmit.ts +0 -610
- package/src/utils/hash.ts +0 -46
- package/src/utils/headlessProfiler.ts +0 -178
- package/src/utils/heapDumpService.ts +0 -303
- package/src/utils/heatmap.ts +0 -198
- package/src/utils/highlightMatch.tsx +0 -28
- package/src/utils/hooks/AsyncHookRegistry.ts +0 -309
- package/src/utils/hooks/apiQueryHookHelper.ts +0 -141
- package/src/utils/hooks/execAgentHook.ts +0 -339
- package/src/utils/hooks/execHttpHook.ts +0 -242
- package/src/utils/hooks/execPromptHook.ts +0 -211
- package/src/utils/hooks/fileChangedWatcher.ts +0 -191
- package/src/utils/hooks/hookEvents.ts +0 -192
- package/src/utils/hooks/hookHelpers.ts +0 -83
- package/src/utils/hooks/hooksConfigManager.ts +0 -400
- package/src/utils/hooks/hooksConfigSnapshot.ts +0 -133
- package/src/utils/hooks/hooksSettings.ts +0 -271
- package/src/utils/hooks/postSamplingHooks.ts +0 -70
- package/src/utils/hooks/registerFrontmatterHooks.ts +0 -67
- package/src/utils/hooks/registerSkillHooks.ts +0 -64
- package/src/utils/hooks/sessionHooks.ts +0 -447
- package/src/utils/hooks/skillImprovement.ts +0 -267
- package/src/utils/hooks/ssrfGuard.ts +0 -294
- package/src/utils/hooks.ts +0 -5022
- package/src/utils/horizontalScroll.ts +0 -137
- package/src/utils/http.ts +0 -136
- package/src/utils/hyperlink.ts +0 -39
- package/src/utils/iTermBackup.ts +0 -73
- package/src/utils/ide.ts +0 -1494
- package/src/utils/idePathConversion.ts +0 -90
- package/src/utils/idleTimeout.ts +0 -53
- package/src/utils/imagePaste.ts +0 -416
- package/src/utils/imageResizer.ts +0 -880
- package/src/utils/imageStore.ts +0 -167
- package/src/utils/imageValidation.ts +0 -104
- package/src/utils/immediateCommand.ts +0 -15
- package/src/utils/inProcessTeammateHelpers.ts +0 -102
- package/src/utils/ink.ts +0 -26
- package/src/utils/intl.ts +0 -94
- package/src/utils/jetbrains.ts +0 -191
- package/src/utils/json.ts +0 -277
- package/src/utils/jsonRead.ts +0 -16
- package/src/utils/keyboardShortcuts.ts +0 -14
- package/src/utils/lazySchema.ts +0 -8
- package/src/utils/listSessionsImpl.ts +0 -454
- package/src/utils/localInstaller.ts +0 -162
- package/src/utils/lockfile.ts +0 -43
- package/src/utils/log.ts +0 -362
- package/src/utils/logoV2Utils.ts +0 -350
- package/src/utils/mailbox.ts +0 -73
- package/src/utils/managedEnv.ts +0 -199
- package/src/utils/managedEnvConstants.ts +0 -191
- package/src/utils/markdown.ts +0 -381
- package/src/utils/markdownConfigLoader.ts +0 -600
- package/src/utils/mcp/dateTimeParser.ts +0 -121
- package/src/utils/mcp/elicitationValidation.ts +0 -336
- package/src/utils/mcpInstructionsDelta.ts +0 -130
- package/src/utils/mcpOutputStorage.ts +0 -189
- package/src/utils/mcpValidation.ts +0 -208
- package/src/utils/mcpWebSocketTransport.ts +0 -200
- package/src/utils/memoize.ts +0 -269
- package/src/utils/memory/types.ts +0 -12
- package/src/utils/memory/versions.ts +0 -8
- package/src/utils/memoryFileDetection.ts +0 -289
- package/src/utils/messagePredicates.ts +0 -8
- package/src/utils/messageQueueManager.ts +0 -547
- package/src/utils/messages/mappers.ts +0 -290
- package/src/utils/messages/systemInit.ts +0 -96
- package/src/utils/messages.ts +0 -5512
- package/src/utils/model/agent.ts +0 -157
- package/src/utils/model/aliases.ts +0 -25
- package/src/utils/model/antModels.ts +0 -64
- package/src/utils/model/bedrock.ts +0 -265
- package/src/utils/model/check1mAccess.ts +0 -72
- package/src/utils/model/configs.ts +0 -118
- package/src/utils/model/contextWindowUpgradeCheck.ts +0 -47
- package/src/utils/model/deprecation.ts +0 -101
- package/src/utils/model/model.ts +0 -618
- package/src/utils/model/modelAllowlist.ts +0 -170
- package/src/utils/model/modelCapabilities.ts +0 -118
- package/src/utils/model/modelOptions.ts +0 -540
- package/src/utils/model/modelStrings.ts +0 -166
- package/src/utils/model/modelSupportOverrides.ts +0 -50
- package/src/utils/model/providers.ts +0 -40
- package/src/utils/model/validateModel.ts +0 -159
- package/src/utils/modelCost.ts +0 -231
- package/src/utils/modifiers.ts +0 -41
- package/src/utils/mtls.ts +0 -179
- package/src/utils/nativeInstaller/download.ts +0 -523
- package/src/utils/nativeInstaller/index.ts +0 -18
- package/src/utils/nativeInstaller/installer.ts +0 -1708
- package/src/utils/nativeInstaller/packageManagers.ts +0 -336
- package/src/utils/nativeInstaller/pidLock.ts +0 -433
- package/src/utils/notebook.ts +0 -224
- package/src/utils/objectGroupBy.ts +0 -18
- package/src/utils/pasteStore.ts +0 -104
- package/src/utils/path.ts +0 -155
- package/src/utils/pdf.ts +0 -300
- package/src/utils/pdfUtils.ts +0 -70
- package/src/utils/peerAddress.ts +0 -21
- package/src/utils/permissions/PermissionMode.ts +0 -141
- package/src/utils/permissions/PermissionPromptToolResultSchema.ts +0 -127
- package/src/utils/permissions/PermissionResult.ts +0 -35
- package/src/utils/permissions/PermissionRule.ts +0 -40
- package/src/utils/permissions/PermissionUpdate.ts +0 -389
- package/src/utils/permissions/PermissionUpdateSchema.ts +0 -78
- package/src/utils/permissions/autoModeState.ts +0 -39
- package/src/utils/permissions/bashClassifier.ts +0 -61
- package/src/utils/permissions/bypassPermissionsKillswitch.ts +0 -155
- package/src/utils/permissions/classifierDecision.ts +0 -98
- package/src/utils/permissions/classifierShared.ts +0 -39
- package/src/utils/permissions/dangerousPatterns.ts +0 -80
- package/src/utils/permissions/denialTracking.ts +0 -45
- package/src/utils/permissions/filesystem.ts +0 -1777
- package/src/utils/permissions/getNextPermissionMode.ts +0 -101
- package/src/utils/permissions/pathValidation.ts +0 -485
- package/src/utils/permissions/permissionExplainer.ts +0 -250
- package/src/utils/permissions/permissionRuleParser.ts +0 -198
- package/src/utils/permissions/permissionSetup.ts +0 -1532
- package/src/utils/permissions/permissions.ts +0 -1486
- package/src/utils/permissions/permissionsLoader.ts +0 -296
- package/src/utils/permissions/shadowedRuleDetection.ts +0 -234
- package/src/utils/permissions/shellRuleMatching.ts +0 -228
- package/src/utils/permissions/yolo-classifier-prompts/auto_mode_system_prompt.txt +0 -1
- package/src/utils/permissions/yolo-classifier-prompts/permissions_anthropic.txt +0 -1
- package/src/utils/permissions/yolo-classifier-prompts/permissions_external.txt +0 -1
- package/src/utils/permissions/yoloClassifier.ts +0 -1495
- package/src/utils/planModeV2.ts +0 -95
- package/src/utils/plans.ts +0 -397
- package/src/utils/platform.ts +0 -150
- package/src/utils/plugins/addDirPluginSettings.ts +0 -71
- package/src/utils/plugins/cacheUtils.ts +0 -196
- package/src/utils/plugins/dependencyResolver.ts +0 -305
- package/src/utils/plugins/fetchTelemetry.ts +0 -135
- package/src/utils/plugins/gitAvailability.ts +0 -69
- package/src/utils/plugins/headlessPluginInstall.ts +0 -174
- package/src/utils/plugins/hintRecommendation.ts +0 -164
- package/src/utils/plugins/installCounts.ts +0 -292
- package/src/utils/plugins/installedPluginsManager.ts +0 -1268
- package/src/utils/plugins/loadPluginAgents.ts +0 -348
- package/src/utils/plugins/loadPluginCommands.ts +0 -946
- package/src/utils/plugins/loadPluginHooks.ts +0 -287
- package/src/utils/plugins/loadPluginOutputStyles.ts +0 -178
- package/src/utils/plugins/lspPluginIntegration.ts +0 -387
- package/src/utils/plugins/lspRecommendation.ts +0 -374
- package/src/utils/plugins/managedPlugins.ts +0 -27
- package/src/utils/plugins/marketplaceHelpers.ts +0 -592
- package/src/utils/plugins/marketplaceManager.ts +0 -2643
- package/src/utils/plugins/mcpPluginIntegration.ts +0 -634
- package/src/utils/plugins/mcpbHandler.ts +0 -968
- package/src/utils/plugins/officialMarketplace.ts +0 -25
- package/src/utils/plugins/officialMarketplaceGcs.ts +0 -216
- package/src/utils/plugins/officialMarketplaceStartupCheck.ts +0 -439
- package/src/utils/plugins/orphanedPluginFilter.ts +0 -114
- package/src/utils/plugins/parseMarketplaceInput.ts +0 -162
- package/src/utils/plugins/performStartupChecks.tsx +0 -70
- package/src/utils/plugins/pluginAutoupdate.ts +0 -284
- package/src/utils/plugins/pluginBlocklist.ts +0 -127
- package/src/utils/plugins/pluginDirectories.ts +0 -178
- package/src/utils/plugins/pluginFlagging.ts +0 -208
- package/src/utils/plugins/pluginIdentifier.ts +0 -123
- package/src/utils/plugins/pluginInstallationHelpers.ts +0 -595
- package/src/utils/plugins/pluginLoader.ts +0 -3302
- package/src/utils/plugins/pluginOptionsStorage.ts +0 -400
- package/src/utils/plugins/pluginPolicy.ts +0 -20
- package/src/utils/plugins/pluginStartupCheck.ts +0 -341
- package/src/utils/plugins/pluginVersioning.ts +0 -157
- package/src/utils/plugins/reconciler.ts +0 -265
- package/src/utils/plugins/refresh.ts +0 -215
- package/src/utils/plugins/schemas.ts +0 -1681
- package/src/utils/plugins/validatePlugin.ts +0 -903
- package/src/utils/plugins/walkPluginMarkdown.ts +0 -69
- package/src/utils/plugins/zipCache.ts +0 -406
- package/src/utils/plugins/zipCacheAdapters.ts +0 -164
- package/src/utils/postCommitAttribution.ts +0 -2
- package/src/utils/powershell/dangerousCmdlets.ts +0 -185
- package/src/utils/powershell/parser.ts +0 -1804
- package/src/utils/powershell/staticPrefix.ts +0 -316
- package/src/utils/preflightChecks.tsx +0 -151
- package/src/utils/privacyLevel.ts +0 -55
- package/src/utils/process.ts +0 -68
- package/src/utils/processUserInput/processBashCommand.tsx +0 -140
- package/src/utils/processUserInput/processSlashCommand.tsx +0 -922
- package/src/utils/processUserInput/processTextPrompt.ts +0 -100
- package/src/utils/processUserInput/processUserInput.ts +0 -605
- package/src/utils/profilerBase.ts +0 -46
- package/src/utils/promptCategory.ts +0 -49
- package/src/utils/promptEditor.ts +0 -188
- package/src/utils/promptShellExecution.ts +0 -183
- package/src/utils/protectedNamespace.ts +0 -2
- package/src/utils/proxy.ts +0 -426
- package/src/utils/queryContext.ts +0 -179
- package/src/utils/queryHelpers.ts +0 -552
- package/src/utils/queryProfiler.ts +0 -301
- package/src/utils/queueProcessor.ts +0 -95
- package/src/utils/readEditContext.ts +0 -227
- package/src/utils/readFileInRange.ts +0 -383
- package/src/utils/releaseNotes.ts +0 -360
- package/src/utils/renderOptions.ts +0 -77
- package/src/utils/ripgrep.ts +0 -679
- package/src/utils/sandbox/sandbox-adapter.ts +0 -985
- package/src/utils/sandbox/sandbox-ui-utils.ts +0 -12
- package/src/utils/sanitization.ts +0 -91
- package/src/utils/screenshotClipboard.ts +0 -121
- package/src/utils/sdkEventQueue.ts +0 -134
- package/src/utils/sdkHeapDumpMonitor.ts +0 -2
- package/src/utils/secureStorage/fallbackStorage.ts +0 -70
- package/src/utils/secureStorage/index.ts +0 -17
- package/src/utils/secureStorage/keychainPrefetch.ts +0 -116
- package/src/utils/secureStorage/macOsKeychainHelpers.ts +0 -111
- package/src/utils/secureStorage/macOsKeychainStorage.ts +0 -231
- package/src/utils/secureStorage/plainTextStorage.ts +0 -84
- package/src/utils/secureStorage/types.ts +0 -2
- package/src/utils/semanticBoolean.ts +0 -29
- package/src/utils/semanticNumber.ts +0 -36
- package/src/utils/semver.ts +0 -59
- package/src/utils/sequential.ts +0 -56
- package/src/utils/sessionActivity.ts +0 -133
- package/src/utils/sessionDataUploader.ts +0 -2
- package/src/utils/sessionEnvVars.ts +0 -22
- package/src/utils/sessionEnvironment.ts +0 -166
- package/src/utils/sessionFileAccessHooks.ts +0 -250
- package/src/utils/sessionIngressAuth.ts +0 -140
- package/src/utils/sessionRestore.ts +0 -551
- package/src/utils/sessionStart.ts +0 -232
- package/src/utils/sessionState.ts +0 -150
- package/src/utils/sessionStorage.ts +0 -5105
- package/src/utils/sessionStoragePortable.ts +0 -793
- package/src/utils/sessionTitle.ts +0 -129
- package/src/utils/sessionUrl.ts +0 -64
- package/src/utils/set.ts +0 -53
- package/src/utils/settings/allErrors.ts +0 -32
- package/src/utils/settings/applySettingsChange.ts +0 -92
- package/src/utils/settings/changeDetector.ts +0 -488
- package/src/utils/settings/constants.ts +0 -202
- package/src/utils/settings/internalWrites.ts +0 -37
- package/src/utils/settings/managedPath.ts +0 -34
- package/src/utils/settings/mdm/constants.ts +0 -81
- package/src/utils/settings/mdm/rawRead.ts +0 -130
- package/src/utils/settings/mdm/settings.ts +0 -316
- package/src/utils/settings/permissionValidation.ts +0 -262
- package/src/utils/settings/pluginOnlyPolicy.ts +0 -60
- package/src/utils/settings/schemaOutput.ts +0 -8
- package/src/utils/settings/settings.ts +0 -1015
- package/src/utils/settings/settingsCache.ts +0 -80
- package/src/utils/settings/toolValidationConfig.ts +0 -103
- package/src/utils/settings/types.ts +0 -1148
- package/src/utils/settings/validateEditTool.ts +0 -45
- package/src/utils/settings/validation.ts +0 -265
- package/src/utils/settings/validationTips.ts +0 -164
- package/src/utils/shell/bashProvider.ts +0 -255
- package/src/utils/shell/outputLimits.ts +0 -14
- package/src/utils/shell/powershellDetection.ts +0 -107
- package/src/utils/shell/powershellProvider.ts +0 -123
- package/src/utils/shell/prefix.ts +0 -367
- package/src/utils/shell/readOnlyCommandValidation.ts +0 -1893
- package/src/utils/shell/resolveDefaultShell.ts +0 -14
- package/src/utils/shell/shellProvider.ts +0 -33
- package/src/utils/shell/shellToolUtils.ts +0 -22
- package/src/utils/shell/specPrefix.ts +0 -241
- package/src/utils/shellConfig.ts +0 -167
- package/src/utils/sideQuery.ts +0 -222
- package/src/utils/sideQuestion.ts +0 -155
- package/src/utils/signal.ts +0 -43
- package/src/utils/sinks.ts +0 -16
- package/src/utils/skills/skillChangeDetector.ts +0 -311
- package/src/utils/slashCommandParsing.ts +0 -60
- package/src/utils/sleep.ts +0 -84
- package/src/utils/sliceAnsi.ts +0 -91
- package/src/utils/slowOperations.ts +0 -286
- package/src/utils/standaloneAgent.ts +0 -23
- package/src/utils/startupProfiler.ts +0 -194
- package/src/utils/staticRender.tsx +0 -116
- package/src/utils/stats.ts +0 -1061
- package/src/utils/statsCache.ts +0 -434
- package/src/utils/status.tsx +0 -362
- package/src/utils/statusNoticeDefinitions.tsx +0 -198
- package/src/utils/statusNoticeHelpers.ts +0 -20
- package/src/utils/stream.ts +0 -76
- package/src/utils/streamJsonStdoutGuard.ts +0 -123
- package/src/utils/streamlinedTransform.ts +0 -201
- package/src/utils/stringUtils.ts +0 -235
- package/src/utils/subprocessEnv.ts +0 -99
- package/src/utils/suggestions/commandSuggestions.ts +0 -567
- package/src/utils/suggestions/directoryCompletion.ts +0 -263
- package/src/utils/suggestions/shellHistoryCompletion.ts +0 -119
- package/src/utils/suggestions/skillUsageTracking.ts +0 -55
- package/src/utils/suggestions/slackChannelSuggestions.ts +0 -209
- package/src/utils/swarm/It2SetupPrompt.tsx +0 -380
- package/src/utils/swarm/backends/ITermBackend.ts +0 -370
- package/src/utils/swarm/backends/InProcessBackend.ts +0 -339
- package/src/utils/swarm/backends/PaneBackendExecutor.ts +0 -354
- package/src/utils/swarm/backends/TmuxBackend.ts +0 -764
- package/src/utils/swarm/backends/detection.ts +0 -128
- package/src/utils/swarm/backends/it2Setup.ts +0 -245
- package/src/utils/swarm/backends/registry.ts +0 -464
- package/src/utils/swarm/backends/teammateModeSnapshot.ts +0 -87
- package/src/utils/swarm/backends/types.ts +0 -311
- package/src/utils/swarm/constants.ts +0 -33
- package/src/utils/swarm/inProcessRunner.ts +0 -1552
- package/src/utils/swarm/leaderPermissionBridge.ts +0 -54
- package/src/utils/swarm/permissionSync.ts +0 -928
- package/src/utils/swarm/reconnection.ts +0 -119
- package/src/utils/swarm/spawnInProcess.ts +0 -328
- package/src/utils/swarm/spawnUtils.ts +0 -146
- package/src/utils/swarm/teamHelpers.ts +0 -683
- package/src/utils/swarm/teammateInit.ts +0 -129
- package/src/utils/swarm/teammateLayoutManager.ts +0 -107
- package/src/utils/swarm/teammateModel.ts +0 -10
- package/src/utils/swarm/teammatePromptAddendum.ts +0 -18
- package/src/utils/systemDirectories.ts +0 -74
- package/src/utils/systemPrompt.ts +0 -123
- package/src/utils/systemPromptType.ts +0 -14
- package/src/utils/systemTheme.ts +0 -119
- package/src/utils/systemThemeWatcher.ts +0 -2
- package/src/utils/taggedId.ts +0 -54
- package/src/utils/task/TaskOutput.ts +0 -390
- package/src/utils/task/diskOutput.ts +0 -451
- package/src/utils/task/framework.ts +0 -308
- package/src/utils/task/outputFormatting.ts +0 -38
- package/src/utils/task/sdkProgress.ts +0 -36
- package/src/utils/taskSummary.ts +0 -2
- package/src/utils/tasks.ts +0 -862
- package/src/utils/teamDiscovery.ts +0 -81
- package/src/utils/teamMemoryOps.ts +0 -88
- package/src/utils/teammate.ts +0 -292
- package/src/utils/teammateContext.ts +0 -96
- package/src/utils/teammateMailbox.ts +0 -1183
- package/src/utils/telemetry/betaSessionTracing.ts +0 -491
- package/src/utils/telemetry/bigqueryExporter.ts +0 -252
- package/src/utils/telemetry/events.ts +0 -75
- package/src/utils/telemetry/instrumentation.ts +0 -825
- package/src/utils/telemetry/logger.ts +0 -26
- package/src/utils/telemetry/perfettoTracing.ts +0 -1120
- package/src/utils/telemetry/pluginTelemetry.ts +0 -289
- package/src/utils/telemetry/sessionTracing.ts +0 -927
- package/src/utils/telemetry/skillLoadedEvent.ts +0 -39
- package/src/utils/telemetryAttributes.ts +0 -71
- package/src/utils/teleport/api.ts +0 -466
- package/src/utils/teleport/environmentSelection.ts +0 -77
- package/src/utils/teleport/environments.ts +0 -120
- package/src/utils/teleport/gitBundle.ts +0 -292
- package/src/utils/teleport.tsx +0 -1226
- package/src/utils/tempfile.ts +0 -31
- package/src/utils/terminal.ts +0 -131
- package/src/utils/terminalPanel.ts +0 -191
- package/src/utils/textHighlighting.ts +0 -166
- package/src/utils/theme.ts +0 -639
- package/src/utils/thinking.ts +0 -162
- package/src/utils/timeouts.ts +0 -39
- package/src/utils/tmuxSocket.ts +0 -427
- package/src/utils/todo/types.ts +0 -18
- package/src/utils/tokenBudget.ts +0 -73
- package/src/utils/tokens.ts +0 -261
- package/src/utils/toolErrors.ts +0 -132
- package/src/utils/toolPool.ts +0 -79
- package/src/utils/toolResultStorage.ts +0 -1040
- package/src/utils/toolSchemaCache.ts +0 -26
- package/src/utils/toolSearch.ts +0 -756
- package/src/utils/transcriptSearch.ts +0 -202
- package/src/utils/treeify.ts +0 -170
- package/src/utils/truncate.ts +0 -179
- package/src/utils/udsClient.ts +0 -2
- package/src/utils/udsMessaging.ts +0 -2
- package/src/utils/ultraplan/ccrSession.ts +0 -349
- package/src/utils/ultraplan/keyword.ts +0 -127
- package/src/utils/ultraplan/prompt.txt +0 -1
- package/src/utils/unaryLogging.ts +0 -39
- package/src/utils/undercover.ts +0 -89
- package/src/utils/user.ts +0 -194
- package/src/utils/userAgent.ts +0 -10
- package/src/utils/userPromptKeywords.ts +0 -27
- package/src/utils/uuid.ts +0 -27
- package/src/utils/warningHandler.ts +0 -121
- package/src/utils/which.ts +0 -82
- package/src/utils/windowsPaths.ts +0 -173
- package/src/utils/withResolvers.ts +0 -13
- package/src/utils/words.ts +0 -800
- package/src/utils/workloadContext.ts +0 -57
- package/src/utils/worktree.ts +0 -1519
- package/src/utils/worktreeModeEnabled.ts +0 -11
- package/src/utils/xdg.ts +0 -65
- package/src/utils/xml.ts +0 -16
- package/src/utils/yaml.ts +0 -15
- package/src/utils/zodToJsonSchema.ts +0 -23
- package/src/vim/motions.ts +0 -82
- package/src/vim/operators.ts +0 -556
- package/src/vim/textObjects.ts +0 -186
- package/src/vim/transitions.ts +0 -490
- package/src/vim/types.ts +0 -199
- package/src/voice/voiceModeEnabled.ts +0 -54
- package/stubs/@ant/claude-for-chrome-mcp/index.js +0 -1
- package/stubs/@ant/claude-for-chrome-mcp/index.ts +0 -4
- package/stubs/@ant/claude-for-chrome-mcp/package.json +0 -6
- package/stubs/@ant/computer-use-input/index.js +0 -2
- package/stubs/@ant/computer-use-input/index.ts +0 -3
- package/stubs/@ant/computer-use-input/package.json +0 -6
- package/stubs/@ant/computer-use-mcp/index.js +0 -1
- package/stubs/@ant/computer-use-mcp/index.ts +0 -1
- package/stubs/@ant/computer-use-mcp/package.json +0 -11
- package/stubs/@ant/computer-use-mcp/sentinelApps.js +0 -3
- package/stubs/@ant/computer-use-mcp/sentinelApps.ts +0 -3
- package/stubs/@ant/computer-use-mcp/types.js +0 -2
- package/stubs/@ant/computer-use-mcp/types.ts +0 -6
- package/stubs/@ant/computer-use-swift/index.js +0 -2
- package/stubs/@ant/computer-use-swift/index.ts +0 -2
- package/stubs/@ant/computer-use-swift/package.json +0 -6
- package/stubs/@anthropic-ai/claude-agent-sdk/index.js +0 -2
- package/stubs/@anthropic-ai/claude-agent-sdk/index.ts +0 -2
- package/stubs/@anthropic-ai/claude-agent-sdk/package.json +0 -6
- package/stubs/@anthropic-ai/mcpb/index.js +0 -2
- package/stubs/@anthropic-ai/mcpb/index.ts +0 -3
- package/stubs/@anthropic-ai/mcpb/package.json +0 -6
- package/stubs/@anthropic-ai/sandbox-runtime/index.js +0 -4
- package/stubs/@anthropic-ai/sandbox-runtime/index.ts +0 -49
- package/stubs/@anthropic-ai/sandbox-runtime/package.json +0 -6
- package/stubs/globals.ts +0 -11
- package/stubs/macro.d.ts +0 -9
- package/tsconfig.json +0 -28
|
@@ -1,1012 +0,0 @@
|
|
|
1
|
-
import React, { type RefObject, useEffect, useRef } from 'react';
|
|
2
|
-
import { useNotifications } from '../context/notifications.js';
|
|
3
|
-
import { useCopyOnSelect, useSelectionBgColor } from '../hooks/useCopyOnSelect.js';
|
|
4
|
-
import type { ScrollBoxHandle } from '../ink/components/ScrollBox.js';
|
|
5
|
-
import { useSelection } from '../ink/hooks/use-selection.js';
|
|
6
|
-
import type { FocusMove, SelectionState } from '../ink/selection.js';
|
|
7
|
-
import { isXtermJs } from '../ink/terminal.js';
|
|
8
|
-
import { getClipboardPath } from '../ink/termio/osc.js';
|
|
9
|
-
// eslint-disable-next-line custom-rules/prefer-use-keybindings -- Esc needs conditional propagation based on selection state
|
|
10
|
-
import { type Key, useInput } from '../ink.js';
|
|
11
|
-
import { useKeybindings } from '../keybindings/useKeybinding.js';
|
|
12
|
-
import { logForDebugging } from '../utils/debug.js';
|
|
13
|
-
type Props = {
|
|
14
|
-
scrollRef: RefObject<ScrollBoxHandle | null>;
|
|
15
|
-
isActive: boolean;
|
|
16
|
-
/** Called after every scroll action with the resulting sticky state and
|
|
17
|
-
* the handle (for reading scrollTop/scrollHeight post-scroll). */
|
|
18
|
-
onScroll?: (sticky: boolean, handle: ScrollBoxHandle) => void;
|
|
19
|
-
/** Enables modal pager keys (g/G, ctrl+u/d/b/f). Only safe when there
|
|
20
|
-
* is no text input competing for those characters — i.e. transcript
|
|
21
|
-
* mode. Defaults to false. When true, G works regardless of editorMode
|
|
22
|
-
* and sticky state; ctrl+u/d/b/f don't conflict with kill-line/exit/
|
|
23
|
-
* task:background/kill-agents (none are mounted, or they mount after
|
|
24
|
-
* this component so stopImmediatePropagation wins). */
|
|
25
|
-
isModal?: boolean;
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
// Terminals send one SGR wheel event per intended row (verified in Ghostty
|
|
29
|
-
// src/Surface.zig: `for (0..@abs(y.delta)) |_| { mouseReport(.four, ...) }`).
|
|
30
|
-
// Ghostty already 3×'s discrete wheel ticks before that loop; trackpad
|
|
31
|
-
// precision scroll is pixels/cell_size. 1 event = 1 row intended — use it
|
|
32
|
-
// as the base, and ramp a multiplier when events arrive rapidly. The
|
|
33
|
-
// pendingScrollDelta accumulator + proportional drain in
|
|
34
|
-
// render-node-to-output handles smooth catch-up on big bursts.
|
|
35
|
-
//
|
|
36
|
-
// xterm.js (VS Code/Cursor/Windsurf integrated terminals) sends exactly 1
|
|
37
|
-
// event per wheel notch — no pre-amplification. A separate exponential
|
|
38
|
-
// decay curve (below) compensates for the lower event rate, with burst
|
|
39
|
-
// detection and gap-dependent caps tuned to VS Code's event patterns.
|
|
40
|
-
|
|
41
|
-
// Native terminals: hard-window linear ramp. Events closer than the window
|
|
42
|
-
// ramp the multiplier; idle gaps reset to `base` (default 1). Some emulators
|
|
43
|
-
// pre-multiply at their layer (ghostty discrete=3 sends 3 SGR events/notch;
|
|
44
|
-
// iTerm2 "faster scroll" similar) — base=1 is correct there. Others send 1
|
|
45
|
-
// event/notch — users on those can set CLAUDE_CODE_SCROLL_SPEED=3 to match
|
|
46
|
-
// vim/nvim/opencode app-side defaults. We can't detect which, so knob it.
|
|
47
|
-
const WHEEL_ACCEL_WINDOW_MS = 40;
|
|
48
|
-
const WHEEL_ACCEL_STEP = 0.3;
|
|
49
|
-
const WHEEL_ACCEL_MAX = 6;
|
|
50
|
-
|
|
51
|
-
// Encoder bounce debounce + wheel-mode decay curve. Worn/cheap optical
|
|
52
|
-
// encoders emit spurious reverse-direction ticks during fast spins — measured
|
|
53
|
-
// 28% of events on Boris's mouse (2026-03-17, iTerm2). Pattern is always
|
|
54
|
-
// flip-then-flip-back; trackpads produce ZERO flips (0/458 in same recording).
|
|
55
|
-
// A confirmed bounce proves a physical wheel is attached — engage the same
|
|
56
|
-
// exponential-decay curve the xterm.js path uses (it's already tuned), with
|
|
57
|
-
// a higher cap to compensate for the lower event rate (~9/sec vs VS Code's
|
|
58
|
-
// ~30/sec). Trackpad can't reach this path.
|
|
59
|
-
//
|
|
60
|
-
// The decay curve gives: 1st click after idle = 1 row (precision), 2nd = 10,
|
|
61
|
-
// 3rd = cap. Slowing down decays smoothly toward 1 — no separate idle
|
|
62
|
-
// threshold needed, large gaps just have m≈0 → mult→1. Wheel mode is STICKY:
|
|
63
|
-
// once a bounce confirms it's a mouse, the decay curve applies until an idle
|
|
64
|
-
// gap or trackpad-flick-burst signals a possible device switch.
|
|
65
|
-
const WHEEL_BOUNCE_GAP_MAX_MS = 200; // flip-back must arrive within this
|
|
66
|
-
// Mouse is ~9 events/sec vs VS Code's ~30 — STEP is 3× xterm.js's 5 to
|
|
67
|
-
// compensate. At gap=100ms (m≈0.63): one click gives 1+15*0.63≈10.5.
|
|
68
|
-
const WHEEL_MODE_STEP = 15;
|
|
69
|
-
const WHEEL_MODE_CAP = 15;
|
|
70
|
-
// Max mult growth per event. Without this, the +STEP*m term jumps mult
|
|
71
|
-
// from 1→10 in one event when wheelMode engages mid-scroll (bounce
|
|
72
|
-
// detected after N events in trackpad mode at mult=1). User sees scroll
|
|
73
|
-
// suddenly go 10× faster. Cap=3 gives 1→4→7→10→13→15 over ~0.5s at
|
|
74
|
-
// 9 events/sec — smooth ramp instead of a jump. Decay is unaffected
|
|
75
|
-
// (target<mult wins the min).
|
|
76
|
-
const WHEEL_MODE_RAMP = 3;
|
|
77
|
-
// Device-switch disengage: mouse finger-repositions max at ~830ms (measured);
|
|
78
|
-
// trackpad between-gesture pauses are 2000ms+. An idle gap above this means
|
|
79
|
-
// the user stopped — might have switched devices. Disengage; the next mouse
|
|
80
|
-
// bounce re-engages. Trackpad slow swipe (no <5ms bursts, so the burst-count
|
|
81
|
-
// guard doesn't catch it) is what this protects against.
|
|
82
|
-
const WHEEL_MODE_IDLE_DISENGAGE_MS = 1500;
|
|
83
|
-
|
|
84
|
-
// xterm.js: exponential decay. momentum=0.5^(gap/hl) — slow click → m≈0
|
|
85
|
-
// → mult→1 (precision); fast → m≈1 → carries momentum. Steady-state
|
|
86
|
-
// = 1 + step×m/(1-m), capped. Measured event rates in VS Code (wheel.log):
|
|
87
|
-
// sustained scroll sends events at 20-50ms gaps (20-40 Hz), plus 0-2ms
|
|
88
|
-
// same-batch bursts on flicks. Cap is low (3–6, gap-dependent) because event
|
|
89
|
-
// frequency is high — at 40 Hz × 6 = 240 rows/sec max demand, which the
|
|
90
|
-
// adaptive drain at ~200fps (measured) handles. Higher cap → pending explosion.
|
|
91
|
-
// Tuned empirically (boris 2026-03). See docs/research/terminal-scroll-*.
|
|
92
|
-
const WHEEL_DECAY_HALFLIFE_MS = 150;
|
|
93
|
-
const WHEEL_DECAY_STEP = 5;
|
|
94
|
-
// Same-batch events (<BURST_MS) arrive in one stdin batch — the terminal
|
|
95
|
-
// is doing proportional reporting. Treat as 1 row/event like native.
|
|
96
|
-
const WHEEL_BURST_MS = 5;
|
|
97
|
-
// Cap boundary: slow events (≥GAP_MS) cap low for short smooth drains;
|
|
98
|
-
// fast events cap higher for throughput (adaptive drain handles backlog).
|
|
99
|
-
const WHEEL_DECAY_GAP_MS = 80;
|
|
100
|
-
const WHEEL_DECAY_CAP_SLOW = 3; // gap ≥ GAP_MS: precision
|
|
101
|
-
const WHEEL_DECAY_CAP_FAST = 6; // gap < GAP_MS: throughput
|
|
102
|
-
// Idle threshold: gaps beyond this reset to the kick value (2) so the
|
|
103
|
-
// first click after a pause feels responsive regardless of direction.
|
|
104
|
-
const WHEEL_DECAY_IDLE_MS = 500;
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* Whether a keypress should clear the virtual text selection. Mimics
|
|
108
|
-
* native terminal selection: any keystroke clears, EXCEPT modified nav
|
|
109
|
-
* keys (shift/opt/cmd + arrow/home/end/page*). In native macOS contexts,
|
|
110
|
-
* shift+nav extends selection, and cmd/opt+nav are often intercepted by
|
|
111
|
-
* the terminal emulator for scrollback nav — neither disturbs selection.
|
|
112
|
-
* Bare arrows DO clear (user's cursor moves, native deselects). Wheel is
|
|
113
|
-
* excluded — scroll:lineUp/Down already clears via the keybinding path.
|
|
114
|
-
*/
|
|
115
|
-
export function shouldClearSelectionOnKey(key: Key): boolean {
|
|
116
|
-
if (key.wheelUp || key.wheelDown) return false;
|
|
117
|
-
const isNav = key.leftArrow || key.rightArrow || key.upArrow || key.downArrow || key.home || key.end || key.pageUp || key.pageDown;
|
|
118
|
-
if (isNav && (key.shift || key.meta || key.super)) return false;
|
|
119
|
-
return true;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
/**
|
|
123
|
-
* Map a keypress to a selection focus move (keyboard extension). Only
|
|
124
|
-
* shift extends — that's the universal text-selection modifier. cmd
|
|
125
|
-
* (super) only arrives via kitty keyboard protocol — in most terminals
|
|
126
|
-
* cmd+arrow is intercepted by the emulator and never reaches the pty, so
|
|
127
|
-
* no super branch. shift+home/end covers line-edge jumps (and fn+shift+
|
|
128
|
-
* left/right on mac laptops = shift+home/end). shift+opt (word-jump) not
|
|
129
|
-
* yet implemented — falls through to shouldClearSelectionOnKey which
|
|
130
|
-
* preserves (modified nav). Returns null for non-extend keys.
|
|
131
|
-
*/
|
|
132
|
-
export function selectionFocusMoveForKey(key: Key): FocusMove | null {
|
|
133
|
-
if (!key.shift || key.meta) return null;
|
|
134
|
-
if (key.leftArrow) return 'left';
|
|
135
|
-
if (key.rightArrow) return 'right';
|
|
136
|
-
if (key.upArrow) return 'up';
|
|
137
|
-
if (key.downArrow) return 'down';
|
|
138
|
-
if (key.home) return 'lineStart';
|
|
139
|
-
if (key.end) return 'lineEnd';
|
|
140
|
-
return null;
|
|
141
|
-
}
|
|
142
|
-
export type WheelAccelState = {
|
|
143
|
-
time: number;
|
|
144
|
-
mult: number;
|
|
145
|
-
dir: 0 | 1 | -1;
|
|
146
|
-
xtermJs: boolean;
|
|
147
|
-
/** Carried fractional scroll (xterm.js only). scrollBy floors, so without
|
|
148
|
-
* this a mult of 1.5 gives 1 row every time. Carrying the remainder gives
|
|
149
|
-
* 1,2,1,2 on average for mult=1.5 — correct throughput over time. */
|
|
150
|
-
frac: number;
|
|
151
|
-
/** Native-path baseline rows/event. Reset value on idle/reversal; ramp
|
|
152
|
-
* builds on top. xterm.js path ignores this (own kick=2 tuning). */
|
|
153
|
-
base: number;
|
|
154
|
-
/** Deferred direction flip (native only). Might be encoder bounce or a
|
|
155
|
-
* real reversal — resolved by the NEXT event. Real reversal loses 1 row
|
|
156
|
-
* of latency; bounce is swallowed and triggers wheel mode. The flip's
|
|
157
|
-
* direction and timestamp are derivable (it's always -state.dir at
|
|
158
|
-
* state.time) so this is just a marker. */
|
|
159
|
-
pendingFlip: boolean;
|
|
160
|
-
/** Set true once a bounce is confirmed (flip-then-flip-back within
|
|
161
|
-
* BOUNCE_GAP_MAX). Sticky — but disengaged on idle gap >1500ms OR a
|
|
162
|
-
* trackpad-signature burst (see burstCount). State lives in a useRef so
|
|
163
|
-
* it persists across device switches; the disengages handle mouse→trackpad. */
|
|
164
|
-
wheelMode: boolean;
|
|
165
|
-
/** Consecutive <5ms events. Trackpad flick produces 100+ at <5ms; mouse
|
|
166
|
-
* produces ≤3 (verified in /tmp/wheel-tune.txt). 5+ in a row → trackpad
|
|
167
|
-
* signature → disengage wheel mode so device-switch doesn't leak mouse
|
|
168
|
-
* accel to trackpad. */
|
|
169
|
-
burstCount: number;
|
|
170
|
-
};
|
|
171
|
-
|
|
172
|
-
/** Compute rows for one wheel event, mutating accel state. Returns 0 when
|
|
173
|
-
* a direction flip is deferred for bounce detection — call sites no-op on
|
|
174
|
-
* step=0 (scrollBy(0) is a no-op, onScroll(false) is idempotent). Exported
|
|
175
|
-
* for tests. */
|
|
176
|
-
export function computeWheelStep(state: WheelAccelState, dir: 1 | -1, now: number): number {
|
|
177
|
-
if (!state.xtermJs) {
|
|
178
|
-
// Device-switch guard ①: idle disengage. Runs BEFORE pendingFlip resolve
|
|
179
|
-
// so a pending bounce (28% of last-mouse-events) doesn't bypass it via
|
|
180
|
-
// the real-reversal early return. state.time is either the last committed
|
|
181
|
-
// event OR the deferred flip — both count as "last activity".
|
|
182
|
-
if (state.wheelMode && now - state.time > WHEEL_MODE_IDLE_DISENGAGE_MS) {
|
|
183
|
-
state.wheelMode = false;
|
|
184
|
-
state.burstCount = 0;
|
|
185
|
-
state.mult = state.base;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
// Resolve any deferred flip BEFORE touching state.time/dir — we need the
|
|
189
|
-
// pre-flip state.dir to distinguish bounce (flip-back) from real reversal
|
|
190
|
-
// (flip persisted), and state.time (= bounce timestamp) for the gap check.
|
|
191
|
-
if (state.pendingFlip) {
|
|
192
|
-
state.pendingFlip = false;
|
|
193
|
-
if (dir !== state.dir || now - state.time > WHEEL_BOUNCE_GAP_MAX_MS) {
|
|
194
|
-
// Real reversal: new dir persisted, OR flip-back arrived too late.
|
|
195
|
-
// Commit. The deferred event's 1 row is lost (acceptable latency).
|
|
196
|
-
state.dir = dir;
|
|
197
|
-
state.time = now;
|
|
198
|
-
state.mult = state.base;
|
|
199
|
-
return Math.floor(state.mult);
|
|
200
|
-
}
|
|
201
|
-
// Bounce confirmed: flipped back to original dir within the window.
|
|
202
|
-
// state.dir/mult unchanged from pre-bounce. state.time was advanced to
|
|
203
|
-
// the bounce below, so gap here = flip-back interval — reflects the
|
|
204
|
-
// user's actual click cadence (bounce IS a physical click, just noisy).
|
|
205
|
-
state.wheelMode = true;
|
|
206
|
-
}
|
|
207
|
-
const gap = now - state.time;
|
|
208
|
-
if (dir !== state.dir && state.dir !== 0) {
|
|
209
|
-
// Flip. Defer — next event decides bounce vs. real reversal. Advance
|
|
210
|
-
// time (but NOT dir/mult): if this turns out to be a bounce, the
|
|
211
|
-
// confirm event's gap will be the flip-back interval, which reflects
|
|
212
|
-
// the user's actual click rate. The bounce IS a physical wheel click,
|
|
213
|
-
// just misread by the encoder — it should count toward cadence.
|
|
214
|
-
state.pendingFlip = true;
|
|
215
|
-
state.time = now;
|
|
216
|
-
return 0;
|
|
217
|
-
}
|
|
218
|
-
state.dir = dir;
|
|
219
|
-
state.time = now;
|
|
220
|
-
|
|
221
|
-
// ─── MOUSE (wheel mode, sticky until device-switch signal) ───
|
|
222
|
-
if (state.wheelMode) {
|
|
223
|
-
if (gap < WHEEL_BURST_MS) {
|
|
224
|
-
// Same-batch burst check (ported from xterm.js): iTerm2 proportional
|
|
225
|
-
// reporting sends 2+ SGR events for one detent when macOS gives
|
|
226
|
-
// delta>1. Without this, the 2nd event at gap<1ms has m≈1 → STEP*m=15
|
|
227
|
-
// → one gentle click gives 1+15=16 rows.
|
|
228
|
-
//
|
|
229
|
-
// Device-switch guard ②: trackpad flick produces 100+ events at <5ms
|
|
230
|
-
// (measured); mouse produces ≤3. 5+ consecutive → trackpad flick.
|
|
231
|
-
if (++state.burstCount >= 5) {
|
|
232
|
-
state.wheelMode = false;
|
|
233
|
-
state.burstCount = 0;
|
|
234
|
-
state.mult = state.base;
|
|
235
|
-
} else {
|
|
236
|
-
return 1;
|
|
237
|
-
}
|
|
238
|
-
} else {
|
|
239
|
-
state.burstCount = 0;
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
// Re-check: may have disengaged above.
|
|
243
|
-
if (state.wheelMode) {
|
|
244
|
-
// xterm.js decay curve with STEP×3, higher cap. No idle threshold —
|
|
245
|
-
// the curve handles it (gap=1000ms → m≈0.01 → mult≈1). No frac —
|
|
246
|
-
// rounding loss is minor at high mult, and frac persisting across idle
|
|
247
|
-
// was causing off-by-one on the first click back.
|
|
248
|
-
const m = Math.pow(0.5, gap / WHEEL_DECAY_HALFLIFE_MS);
|
|
249
|
-
const cap = Math.max(WHEEL_MODE_CAP, state.base * 2);
|
|
250
|
-
const next = 1 + (state.mult - 1) * m + WHEEL_MODE_STEP * m;
|
|
251
|
-
state.mult = Math.min(cap, next, state.mult + WHEEL_MODE_RAMP);
|
|
252
|
-
return Math.floor(state.mult);
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
// ─── TRACKPAD / HI-RES (native, non-wheel-mode) ───
|
|
256
|
-
// Tight 40ms burst window: sub-40ms events ramp, anything slower resets.
|
|
257
|
-
// Trackpad flick delivers 200+ events at <20ms gaps → rails to cap 6.
|
|
258
|
-
// Trackpad slow swipe at 40-400ms gaps → resets every event → 1 row each.
|
|
259
|
-
if (gap > WHEEL_ACCEL_WINDOW_MS) {
|
|
260
|
-
state.mult = state.base;
|
|
261
|
-
} else {
|
|
262
|
-
const cap = Math.max(WHEEL_ACCEL_MAX, state.base * 2);
|
|
263
|
-
state.mult = Math.min(cap, state.mult + WHEEL_ACCEL_STEP);
|
|
264
|
-
}
|
|
265
|
-
return Math.floor(state.mult);
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
// ─── VSCODE (xterm.js, browser wheel events) ───
|
|
269
|
-
// Browser wheel events — no encoder bounce, no SGR bursts. Decay curve
|
|
270
|
-
// unchanged from the original tuning. Same formula shape as wheel mode
|
|
271
|
-
// above (keep in sync) but STEP=5 not 15 — higher event rate here.
|
|
272
|
-
const gap = now - state.time;
|
|
273
|
-
const sameDir = dir === state.dir;
|
|
274
|
-
state.time = now;
|
|
275
|
-
state.dir = dir;
|
|
276
|
-
// xterm.js path. Debug log shows two patterns: (a) 20-50ms gaps during
|
|
277
|
-
// sustained scroll (~30 Hz), (b) <5ms same-batch bursts on flicks. For
|
|
278
|
-
// (b) give 1 row/event — the burst count IS the acceleration, same as
|
|
279
|
-
// native. For (a) the decay curve gives 3-5 rows. For sparse events
|
|
280
|
-
// (100ms+, slow deliberate scroll) the curve gives 1-3.
|
|
281
|
-
if (sameDir && gap < WHEEL_BURST_MS) return 1;
|
|
282
|
-
if (!sameDir || gap > WHEEL_DECAY_IDLE_MS) {
|
|
283
|
-
// Direction reversal or long idle: start at 2 (not 1) so the first
|
|
284
|
-
// click after a pause moves a visible amount. Without this, idle-
|
|
285
|
-
// then-resume in the same direction decays to mult≈1 (1 row).
|
|
286
|
-
state.mult = 2;
|
|
287
|
-
state.frac = 0;
|
|
288
|
-
} else {
|
|
289
|
-
const m = Math.pow(0.5, gap / WHEEL_DECAY_HALFLIFE_MS);
|
|
290
|
-
const cap = gap >= WHEEL_DECAY_GAP_MS ? WHEEL_DECAY_CAP_SLOW : WHEEL_DECAY_CAP_FAST;
|
|
291
|
-
state.mult = Math.min(cap, 1 + (state.mult - 1) * m + WHEEL_DECAY_STEP * m);
|
|
292
|
-
}
|
|
293
|
-
const total = state.mult + state.frac;
|
|
294
|
-
const rows = Math.floor(total);
|
|
295
|
-
state.frac = total - rows;
|
|
296
|
-
return rows;
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
/** Read CLAUDE_CODE_SCROLL_SPEED, default 1, clamp (0, 20].
|
|
300
|
-
* Some terminals pre-multiply wheel events (ghostty discrete=3, iTerm2
|
|
301
|
-
* "faster scroll") — base=1 is correct there. Others send 1 event/notch —
|
|
302
|
-
* set CLAUDE_CODE_SCROLL_SPEED=3 to match vim/nvim/opencode. We can't
|
|
303
|
-
* detect which kind of terminal we're in, hence the knob. Called lazily
|
|
304
|
-
* from initAndLogWheelAccel so globalSettings.env has loaded. */
|
|
305
|
-
export function readScrollSpeedBase(): number {
|
|
306
|
-
const raw = process.env.CLAUDE_CODE_SCROLL_SPEED;
|
|
307
|
-
if (!raw) return 1;
|
|
308
|
-
const n = parseFloat(raw);
|
|
309
|
-
return Number.isNaN(n) || n <= 0 ? 1 : Math.min(n, 20);
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
/** Initial wheel accel state. xtermJs=true selects the decay curve.
|
|
313
|
-
* base is the native-path baseline rows/event (default 1). */
|
|
314
|
-
export function initWheelAccel(xtermJs = false, base = 1): WheelAccelState {
|
|
315
|
-
return {
|
|
316
|
-
time: 0,
|
|
317
|
-
mult: base,
|
|
318
|
-
dir: 0,
|
|
319
|
-
xtermJs,
|
|
320
|
-
frac: 0,
|
|
321
|
-
base,
|
|
322
|
-
pendingFlip: false,
|
|
323
|
-
wheelMode: false,
|
|
324
|
-
burstCount: 0
|
|
325
|
-
};
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
// Lazy-init helper. isXtermJs() combines the TERM_PROGRAM env check + async
|
|
329
|
-
// XTVERSION probe — the probe may not have resolved at render time, so this
|
|
330
|
-
// is called on the first wheel event (>>50ms after startup) when it's settled.
|
|
331
|
-
// Logs detected mode once so --debug users can verify SSH detection worked.
|
|
332
|
-
// The renderer also calls isXtermJsHost() (in render-node-to-output) to
|
|
333
|
-
// select the drain algorithm — no state to pass through.
|
|
334
|
-
function initAndLogWheelAccel(): WheelAccelState {
|
|
335
|
-
const xtermJs = isXtermJs();
|
|
336
|
-
const base = readScrollSpeedBase();
|
|
337
|
-
logForDebugging(`wheel accel: ${xtermJs ? 'decay (xterm.js)' : 'window (native)'} · base=${base} · TERM_PROGRAM=${process.env.TERM_PROGRAM ?? 'unset'}`);
|
|
338
|
-
return initWheelAccel(xtermJs, base);
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
// Drag-to-scroll: when dragging past the viewport edge, scroll by this many
|
|
342
|
-
// rows every AUTOSCROLL_INTERVAL_MS. Mode 1002 mouse tracking only fires on
|
|
343
|
-
// cell change, so a timer is needed to continue scrolling while stationary.
|
|
344
|
-
const AUTOSCROLL_LINES = 2;
|
|
345
|
-
const AUTOSCROLL_INTERVAL_MS = 50;
|
|
346
|
-
// Hard cap on consecutive auto-scroll ticks. If the release event is lost
|
|
347
|
-
// (mouse released outside terminal window — some emulators don't capture the
|
|
348
|
-
// pointer and drop the release), isDragging stays true and the timer would
|
|
349
|
-
// run until a scroll boundary. Cap bounds the damage; any new drag motion
|
|
350
|
-
// event restarts the count via check()→start().
|
|
351
|
-
const AUTOSCROLL_MAX_TICKS = 200; // 10s @ 50ms
|
|
352
|
-
|
|
353
|
-
/**
|
|
354
|
-
* Keyboard scroll navigation for the fullscreen layout's message scroll box.
|
|
355
|
-
* PgUp/PgDn scroll by half-viewport. Mouse wheel scrolls by a few lines.
|
|
356
|
-
* Scrolling breaks sticky mode; Ctrl+End re-enables it. Wheeling down at
|
|
357
|
-
* the bottom also re-enables sticky so new content follows naturally.
|
|
358
|
-
*/
|
|
359
|
-
export function ScrollKeybindingHandler({
|
|
360
|
-
scrollRef,
|
|
361
|
-
isActive,
|
|
362
|
-
onScroll,
|
|
363
|
-
isModal = false
|
|
364
|
-
}: Props): React.ReactNode {
|
|
365
|
-
const selection = useSelection();
|
|
366
|
-
const {
|
|
367
|
-
addNotification
|
|
368
|
-
} = useNotifications();
|
|
369
|
-
// Lazy-inited on first wheel event so the XTVERSION probe (fired at
|
|
370
|
-
// raw-mode-enable time) has resolved by then — initializing in useRef()
|
|
371
|
-
// would read getWheelBase() before the probe reply arrives over SSH.
|
|
372
|
-
const wheelAccel = useRef<WheelAccelState | null>(null);
|
|
373
|
-
function showCopiedToast(text: string): void {
|
|
374
|
-
// getClipboardPath reads env synchronously — predicts what setClipboard
|
|
375
|
-
// did (native pbcopy / tmux load-buffer / raw OSC 52) so we can tell
|
|
376
|
-
// the user whether paste will Just Work or needs prefix+].
|
|
377
|
-
const path = getClipboardPath();
|
|
378
|
-
const n = text.length;
|
|
379
|
-
let msg: string;
|
|
380
|
-
switch (path) {
|
|
381
|
-
case 'native':
|
|
382
|
-
msg = `copied ${n} chars to clipboard`;
|
|
383
|
-
break;
|
|
384
|
-
case 'tmux-buffer':
|
|
385
|
-
msg = `copied ${n} chars to tmux buffer · paste with prefix + ]`;
|
|
386
|
-
break;
|
|
387
|
-
case 'osc52':
|
|
388
|
-
msg = `sent ${n} chars via OSC 52 · check terminal clipboard settings if paste fails`;
|
|
389
|
-
break;
|
|
390
|
-
}
|
|
391
|
-
addNotification({
|
|
392
|
-
key: 'selection-copied',
|
|
393
|
-
text: msg,
|
|
394
|
-
color: 'suggestion',
|
|
395
|
-
priority: 'immediate',
|
|
396
|
-
timeoutMs: path === 'native' ? 2000 : 4000
|
|
397
|
-
});
|
|
398
|
-
}
|
|
399
|
-
function copyAndToast(): void {
|
|
400
|
-
const text_0 = selection.copySelection();
|
|
401
|
-
if (text_0) showCopiedToast(text_0);
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
// Translate selection to track a keyboard page jump. Selection coords are
|
|
405
|
-
// screen-buffer-local; a scrollTo that moves content by N rows must also
|
|
406
|
-
// shift anchor+focus by N so the highlight stays on the same text (native
|
|
407
|
-
// terminal behavior: selection moves with content, clips at viewport
|
|
408
|
-
// edges). Rows that scroll out of the viewport are captured into
|
|
409
|
-
// scrolledOffAbove/Below before the scroll so getSelectedText still
|
|
410
|
-
// returns the full text. Wheel scroll (scroll:lineUp/Down via scrollBy)
|
|
411
|
-
// still clears — its async pendingScrollDelta drain means the actual
|
|
412
|
-
// delta isn't known synchronously (follow-up).
|
|
413
|
-
function translateSelectionForJump(s: ScrollBoxHandle, delta: number): void {
|
|
414
|
-
const sel = selection.getState();
|
|
415
|
-
if (!sel?.anchor || !sel.focus) return;
|
|
416
|
-
const top = s.getViewportTop();
|
|
417
|
-
const bottom = top + s.getViewportHeight() - 1;
|
|
418
|
-
// Only translate if the selection is ON scrollbox content. Selections
|
|
419
|
-
// in the footer/prompt/StickyPromptHeader are on static text — the
|
|
420
|
-
// scroll doesn't move what's under them. Same guard as ink.tsx's
|
|
421
|
-
// auto-follow translate (commit 36a8d154).
|
|
422
|
-
if (sel.anchor.row < top || sel.anchor.row > bottom) return;
|
|
423
|
-
// Cross-boundary: anchor in scrollbox, focus in footer/header. Mirror
|
|
424
|
-
// ink.tsx's Flag-3 guard — fall through without shifting OR capturing.
|
|
425
|
-
// The static endpoint pins the selection; shifting would teleport it
|
|
426
|
-
// into scrollbox content.
|
|
427
|
-
if (sel.focus.row < top || sel.focus.row > bottom) return;
|
|
428
|
-
const max = Math.max(0, s.getScrollHeight() - s.getViewportHeight());
|
|
429
|
-
const cur = s.getScrollTop() + s.getPendingDelta();
|
|
430
|
-
// Actual scroll distance after boundary clamp. jumpBy may call
|
|
431
|
-
// scrollToBottom when target >= max but the view can't move past max,
|
|
432
|
-
// so the selection shift is bounded here.
|
|
433
|
-
const actual = Math.max(0, Math.min(max, cur + delta)) - cur;
|
|
434
|
-
if (actual === 0) return;
|
|
435
|
-
if (actual > 0) {
|
|
436
|
-
// Scrolling down: content moves up. Rows at the TOP leave viewport.
|
|
437
|
-
// Anchor+focus shift -actual so they track the content that moved up.
|
|
438
|
-
selection.captureScrolledRows(top, top + actual - 1, 'above');
|
|
439
|
-
selection.shiftSelection(-actual, top, bottom);
|
|
440
|
-
} else {
|
|
441
|
-
// Scrolling up: content moves down. Rows at the BOTTOM leave viewport.
|
|
442
|
-
const a = -actual;
|
|
443
|
-
selection.captureScrolledRows(bottom - a + 1, bottom, 'below');
|
|
444
|
-
selection.shiftSelection(a, top, bottom);
|
|
445
|
-
}
|
|
446
|
-
}
|
|
447
|
-
useKeybindings({
|
|
448
|
-
'scroll:pageUp': () => {
|
|
449
|
-
const s_0 = scrollRef.current;
|
|
450
|
-
if (!s_0) return;
|
|
451
|
-
const d = -Math.max(1, Math.floor(s_0.getViewportHeight() / 2));
|
|
452
|
-
translateSelectionForJump(s_0, d);
|
|
453
|
-
const sticky = jumpBy(s_0, d);
|
|
454
|
-
onScroll?.(sticky, s_0);
|
|
455
|
-
},
|
|
456
|
-
'scroll:pageDown': () => {
|
|
457
|
-
const s_1 = scrollRef.current;
|
|
458
|
-
if (!s_1) return;
|
|
459
|
-
const d_0 = Math.max(1, Math.floor(s_1.getViewportHeight() / 2));
|
|
460
|
-
translateSelectionForJump(s_1, d_0);
|
|
461
|
-
const sticky_0 = jumpBy(s_1, d_0);
|
|
462
|
-
onScroll?.(sticky_0, s_1);
|
|
463
|
-
},
|
|
464
|
-
'scroll:lineUp': () => {
|
|
465
|
-
// Wheel: scrollBy accumulates into pendingScrollDelta, drained async
|
|
466
|
-
// by the renderer. captureScrolledRows can't read the outgoing rows
|
|
467
|
-
// before they leave (drain is non-deterministic). Clear for now.
|
|
468
|
-
selection.clearSelection();
|
|
469
|
-
const s_2 = scrollRef.current;
|
|
470
|
-
// Return false (not consumed) when the ScrollBox content fits —
|
|
471
|
-
// scroll would be a no-op. Lets a child component's handler take
|
|
472
|
-
// the wheel event instead (e.g. Settings Config's list navigation
|
|
473
|
-
// inside the centered Modal, where the paginated slice always fits).
|
|
474
|
-
if (!s_2 || s_2.getScrollHeight() <= s_2.getViewportHeight()) return false;
|
|
475
|
-
wheelAccel.current ??= initAndLogWheelAccel();
|
|
476
|
-
scrollUp(s_2, computeWheelStep(wheelAccel.current, -1, performance.now()));
|
|
477
|
-
onScroll?.(false, s_2);
|
|
478
|
-
},
|
|
479
|
-
'scroll:lineDown': () => {
|
|
480
|
-
selection.clearSelection();
|
|
481
|
-
const s_3 = scrollRef.current;
|
|
482
|
-
if (!s_3 || s_3.getScrollHeight() <= s_3.getViewportHeight()) return false;
|
|
483
|
-
wheelAccel.current ??= initAndLogWheelAccel();
|
|
484
|
-
const step = computeWheelStep(wheelAccel.current, 1, performance.now());
|
|
485
|
-
const reachedBottom = scrollDown(s_3, step);
|
|
486
|
-
onScroll?.(reachedBottom, s_3);
|
|
487
|
-
},
|
|
488
|
-
'scroll:top': () => {
|
|
489
|
-
const s_4 = scrollRef.current;
|
|
490
|
-
if (!s_4) return;
|
|
491
|
-
translateSelectionForJump(s_4, -(s_4.getScrollTop() + s_4.getPendingDelta()));
|
|
492
|
-
s_4.scrollTo(0);
|
|
493
|
-
onScroll?.(false, s_4);
|
|
494
|
-
},
|
|
495
|
-
'scroll:bottom': () => {
|
|
496
|
-
const s_5 = scrollRef.current;
|
|
497
|
-
if (!s_5) return;
|
|
498
|
-
const max_0 = Math.max(0, s_5.getScrollHeight() - s_5.getViewportHeight());
|
|
499
|
-
translateSelectionForJump(s_5, max_0 - (s_5.getScrollTop() + s_5.getPendingDelta()));
|
|
500
|
-
// scrollTo(max) eager-writes scrollTop so the render-phase sticky
|
|
501
|
-
// follow computes followDelta=0. Without this, scrollToBottom()
|
|
502
|
-
// alone leaves scrollTop stale → followDelta=max-stale →
|
|
503
|
-
// shiftSelectionForFollow applies the SAME shift we already did
|
|
504
|
-
// above, 2× offset. scrollToBottom() then re-enables sticky.
|
|
505
|
-
s_5.scrollTo(max_0);
|
|
506
|
-
s_5.scrollToBottom();
|
|
507
|
-
onScroll?.(true, s_5);
|
|
508
|
-
},
|
|
509
|
-
'selection:copy': copyAndToast
|
|
510
|
-
}, {
|
|
511
|
-
context: 'Scroll',
|
|
512
|
-
isActive
|
|
513
|
-
});
|
|
514
|
-
|
|
515
|
-
// scroll:halfPage*/fullPage* have no default key bindings — ctrl+u/d/b/f
|
|
516
|
-
// all have real owners in normal mode (kill-line/exit/task:background/
|
|
517
|
-
// kill-agents). Transcript mode gets them via the isModal raw useInput
|
|
518
|
-
// below. These handlers stay for custom rebinds only.
|
|
519
|
-
useKeybindings({
|
|
520
|
-
'scroll:halfPageUp': () => {
|
|
521
|
-
const s_6 = scrollRef.current;
|
|
522
|
-
if (!s_6) return;
|
|
523
|
-
const d_1 = -Math.max(1, Math.floor(s_6.getViewportHeight() / 2));
|
|
524
|
-
translateSelectionForJump(s_6, d_1);
|
|
525
|
-
const sticky_1 = jumpBy(s_6, d_1);
|
|
526
|
-
onScroll?.(sticky_1, s_6);
|
|
527
|
-
},
|
|
528
|
-
'scroll:halfPageDown': () => {
|
|
529
|
-
const s_7 = scrollRef.current;
|
|
530
|
-
if (!s_7) return;
|
|
531
|
-
const d_2 = Math.max(1, Math.floor(s_7.getViewportHeight() / 2));
|
|
532
|
-
translateSelectionForJump(s_7, d_2);
|
|
533
|
-
const sticky_2 = jumpBy(s_7, d_2);
|
|
534
|
-
onScroll?.(sticky_2, s_7);
|
|
535
|
-
},
|
|
536
|
-
'scroll:fullPageUp': () => {
|
|
537
|
-
const s_8 = scrollRef.current;
|
|
538
|
-
if (!s_8) return;
|
|
539
|
-
const d_3 = -Math.max(1, s_8.getViewportHeight());
|
|
540
|
-
translateSelectionForJump(s_8, d_3);
|
|
541
|
-
const sticky_3 = jumpBy(s_8, d_3);
|
|
542
|
-
onScroll?.(sticky_3, s_8);
|
|
543
|
-
},
|
|
544
|
-
'scroll:fullPageDown': () => {
|
|
545
|
-
const s_9 = scrollRef.current;
|
|
546
|
-
if (!s_9) return;
|
|
547
|
-
const d_4 = Math.max(1, s_9.getViewportHeight());
|
|
548
|
-
translateSelectionForJump(s_9, d_4);
|
|
549
|
-
const sticky_4 = jumpBy(s_9, d_4);
|
|
550
|
-
onScroll?.(sticky_4, s_9);
|
|
551
|
-
}
|
|
552
|
-
}, {
|
|
553
|
-
context: 'Scroll',
|
|
554
|
-
isActive
|
|
555
|
-
});
|
|
556
|
-
|
|
557
|
-
// Modal pager keys — transcript mode only. less/tmux copy-mode lineage:
|
|
558
|
-
// ctrl+u/d (half-page), ctrl+b/f (full-page), g/G (top/bottom). Tom's
|
|
559
|
-
// resolution (2026-03-15): "In ctrl-o mode, ctrl-u, ctrl-d, etc. should
|
|
560
|
-
// roughly just work!" — transcript is the copy-mode container.
|
|
561
|
-
//
|
|
562
|
-
// Safe because the conflicting handlers aren't reachable here:
|
|
563
|
-
// ctrl+u → kill-line, ctrl+d → exit: PromptInput not mounted
|
|
564
|
-
// ctrl+b → task:background: SessionBackgroundHint not mounted
|
|
565
|
-
// ctrl+f → chat:killAgents moved to ctrl+x ctrl+k; no conflict
|
|
566
|
-
// g/G → printable chars: no prompt to eat them, no vim/sticky gate needed
|
|
567
|
-
//
|
|
568
|
-
// TODO(search): `/`, n/N — build on Richard Kim's d94b07add4 (branch
|
|
569
|
-
// claude/jump-recent-message-CEPcq). getItemY Yoga-walk + computeOrigin +
|
|
570
|
-
// anchorY already solve scroll-to-index. jumpToPrevTurn is the n/N
|
|
571
|
-
// template. Single-shot via OVERSCAN_ROWS=80; two-phase was tried and
|
|
572
|
-
// abandoned (❯ oscillation). See team memory scroll-copy-mode-design.md.
|
|
573
|
-
useInput((input, key, event) => {
|
|
574
|
-
const s_10 = scrollRef.current;
|
|
575
|
-
if (!s_10) return;
|
|
576
|
-
const sticky_5 = applyModalPagerAction(s_10, modalPagerAction(input, key), d_5 => translateSelectionForJump(s_10, d_5));
|
|
577
|
-
if (sticky_5 === null) return;
|
|
578
|
-
onScroll?.(sticky_5, s_10);
|
|
579
|
-
event.stopImmediatePropagation();
|
|
580
|
-
}, {
|
|
581
|
-
isActive: isActive && isModal
|
|
582
|
-
});
|
|
583
|
-
|
|
584
|
-
// Esc clears selection; any other keystroke also clears it (matches
|
|
585
|
-
// native terminal behavior where selection disappears on input).
|
|
586
|
-
// Ctrl+C copies when a selection exists — needed on legacy terminals
|
|
587
|
-
// where ctrl+shift+c sends the same byte (\x03, shift is lost) and
|
|
588
|
-
// cmd+c never reaches the pty (terminal intercepts it for Edit > Copy).
|
|
589
|
-
// Handled via raw useInput so we can conditionally consume: Esc/Ctrl+C
|
|
590
|
-
// only stop propagation when a selection exists, letting them still work
|
|
591
|
-
// for cancel-request / interrupt otherwise. Other keys never stop
|
|
592
|
-
// propagation — they're observed to clear selection as a side-effect.
|
|
593
|
-
// The selection:copy keybinding (ctrl+shift+c / cmd+c) registers above
|
|
594
|
-
// via useKeybindings and consumes its event before reaching here.
|
|
595
|
-
useInput((input_0, key_0, event_0) => {
|
|
596
|
-
if (!selection.hasSelection()) return;
|
|
597
|
-
if (key_0.escape) {
|
|
598
|
-
selection.clearSelection();
|
|
599
|
-
event_0.stopImmediatePropagation();
|
|
600
|
-
return;
|
|
601
|
-
}
|
|
602
|
-
if (key_0.ctrl && !key_0.shift && !key_0.meta && input_0 === 'c') {
|
|
603
|
-
copyAndToast();
|
|
604
|
-
event_0.stopImmediatePropagation();
|
|
605
|
-
return;
|
|
606
|
-
}
|
|
607
|
-
const move = selectionFocusMoveForKey(key_0);
|
|
608
|
-
if (move) {
|
|
609
|
-
selection.moveFocus(move);
|
|
610
|
-
event_0.stopImmediatePropagation();
|
|
611
|
-
return;
|
|
612
|
-
}
|
|
613
|
-
if (shouldClearSelectionOnKey(key_0)) {
|
|
614
|
-
selection.clearSelection();
|
|
615
|
-
}
|
|
616
|
-
}, {
|
|
617
|
-
isActive
|
|
618
|
-
});
|
|
619
|
-
useDragToScroll(scrollRef, selection, isActive, onScroll);
|
|
620
|
-
useCopyOnSelect(selection, isActive, showCopiedToast);
|
|
621
|
-
useSelectionBgColor(selection);
|
|
622
|
-
return null;
|
|
623
|
-
}
|
|
624
|
-
|
|
625
|
-
/**
|
|
626
|
-
* Auto-scroll the ScrollBox when the user drags a selection past its top or
|
|
627
|
-
* bottom edge. The anchor is shifted in the opposite direction so it stays
|
|
628
|
-
* on the same content (content that was at viewport row N is now at row N±d
|
|
629
|
-
* after scrolling by d). Focus stays at the mouse position (edge row).
|
|
630
|
-
*
|
|
631
|
-
* Selection coords are screen-buffer-local, so the anchor is clamped to the
|
|
632
|
-
* viewport bounds once the original content scrolls out. To preserve the full
|
|
633
|
-
* selection, rows about to scroll out are captured into scrolledOffAbove/
|
|
634
|
-
* scrolledOffBelow before each scroll step and joined back in by
|
|
635
|
-
* getSelectedText.
|
|
636
|
-
*/
|
|
637
|
-
function useDragToScroll(scrollRef: RefObject<ScrollBoxHandle | null>, selection: ReturnType<typeof useSelection>, isActive: boolean, onScroll: Props['onScroll']): void {
|
|
638
|
-
const timerRef = useRef<NodeJS.Timeout | null>(null);
|
|
639
|
-
const dirRef = useRef<-1 | 0 | 1>(0); // -1 scrolling up, +1 down, 0 idle
|
|
640
|
-
// Survives stop() — reset only on drag-finish. See check() for semantics.
|
|
641
|
-
const lastScrolledDirRef = useRef<-1 | 0 | 1>(0);
|
|
642
|
-
const ticksRef = useRef(0);
|
|
643
|
-
// onScroll may change identity every render (if not memoized by caller).
|
|
644
|
-
// Read through a ref so the effect doesn't re-subscribe and kill the timer
|
|
645
|
-
// on each scroll-induced re-render.
|
|
646
|
-
const onScrollRef = useRef(onScroll);
|
|
647
|
-
onScrollRef.current = onScroll;
|
|
648
|
-
useEffect(() => {
|
|
649
|
-
if (!isActive) return;
|
|
650
|
-
function stop(): void {
|
|
651
|
-
dirRef.current = 0;
|
|
652
|
-
if (timerRef.current) {
|
|
653
|
-
clearInterval(timerRef.current);
|
|
654
|
-
timerRef.current = null;
|
|
655
|
-
}
|
|
656
|
-
}
|
|
657
|
-
function tick(): void {
|
|
658
|
-
const sel = selection.getState();
|
|
659
|
-
const s = scrollRef.current;
|
|
660
|
-
const dir = dirRef.current;
|
|
661
|
-
// dir === 0 defends against a stale interval (start() may have set one
|
|
662
|
-
// after the immediate tick already called stop() at a scroll boundary).
|
|
663
|
-
// ticks cap defends against a lost release event (mouse released
|
|
664
|
-
// outside terminal window) leaving isDragging stuck true.
|
|
665
|
-
if (!sel?.isDragging || !sel.focus || !s || dir === 0 || ++ticksRef.current > AUTOSCROLL_MAX_TICKS) {
|
|
666
|
-
stop();
|
|
667
|
-
return;
|
|
668
|
-
}
|
|
669
|
-
// scrollBy accumulates into pendingScrollDelta; the screen buffer
|
|
670
|
-
// doesn't update until the next render drains it. If a previous
|
|
671
|
-
// tick's scroll hasn't drained yet, captureScrolledRows would read
|
|
672
|
-
// stale content (same rows as last tick → duplicated in the
|
|
673
|
-
// accumulator AND missing the rows that actually scrolled out).
|
|
674
|
-
// Skip this tick; the 50ms interval will retry after Ink's 16ms
|
|
675
|
-
// render catches up. Also prevents shiftAnchor from desyncing.
|
|
676
|
-
if (s.getPendingDelta() !== 0) return;
|
|
677
|
-
const top = s.getViewportTop();
|
|
678
|
-
const bottom = top + s.getViewportHeight() - 1;
|
|
679
|
-
// Clamp anchor within [top, bottom]. Not [0, bottom]: the ScrollBox
|
|
680
|
-
// padding row at 0 would produce a blank line between scrolledOffAbove
|
|
681
|
-
// and the on-screen content in getSelectedText. The padding-row
|
|
682
|
-
// highlight was a minor visual nicety; text correctness wins.
|
|
683
|
-
if (dir < 0) {
|
|
684
|
-
if (s.getScrollTop() <= 0) {
|
|
685
|
-
stop();
|
|
686
|
-
return;
|
|
687
|
-
}
|
|
688
|
-
// Scrolling up: content moves down in viewport, so anchor row +N.
|
|
689
|
-
// Clamp to actual scroll distance so anchor stays in sync when near
|
|
690
|
-
// the top boundary (renderer clamps scrollTop to 0 on drain).
|
|
691
|
-
const actual = Math.min(AUTOSCROLL_LINES, s.getScrollTop());
|
|
692
|
-
// Capture rows about to scroll out the BOTTOM before scrollBy
|
|
693
|
-
// overwrites them. Only rows inside the selection are captured
|
|
694
|
-
// (captureScrolledRows intersects with selection bounds).
|
|
695
|
-
selection.captureScrolledRows(bottom - actual + 1, bottom, 'below');
|
|
696
|
-
selection.shiftAnchor(actual, 0, bottom);
|
|
697
|
-
s.scrollBy(-AUTOSCROLL_LINES);
|
|
698
|
-
} else {
|
|
699
|
-
const max = Math.max(0, s.getScrollHeight() - s.getViewportHeight());
|
|
700
|
-
if (s.getScrollTop() >= max) {
|
|
701
|
-
stop();
|
|
702
|
-
return;
|
|
703
|
-
}
|
|
704
|
-
// Scrolling down: content moves up in viewport, so anchor row -N.
|
|
705
|
-
// Clamp to actual scroll distance so anchor stays in sync when near
|
|
706
|
-
// the bottom boundary (renderer clamps scrollTop to max on drain).
|
|
707
|
-
const actual_0 = Math.min(AUTOSCROLL_LINES, max - s.getScrollTop());
|
|
708
|
-
// Capture rows about to scroll out the TOP.
|
|
709
|
-
selection.captureScrolledRows(top, top + actual_0 - 1, 'above');
|
|
710
|
-
selection.shiftAnchor(-actual_0, top, bottom);
|
|
711
|
-
s.scrollBy(AUTOSCROLL_LINES);
|
|
712
|
-
}
|
|
713
|
-
onScrollRef.current?.(false, s);
|
|
714
|
-
}
|
|
715
|
-
function start(dir_0: -1 | 1): void {
|
|
716
|
-
// Record BEFORE early-return: the empty-accumulator reset in check()
|
|
717
|
-
// may have zeroed this during the pre-crossing phase (accumulators
|
|
718
|
-
// empty until the anchor row enters the capture range). Re-record
|
|
719
|
-
// on every call so the corruption is instantly healed.
|
|
720
|
-
lastScrolledDirRef.current = dir_0;
|
|
721
|
-
if (dirRef.current === dir_0) return; // already going this way
|
|
722
|
-
stop();
|
|
723
|
-
dirRef.current = dir_0;
|
|
724
|
-
ticksRef.current = 0;
|
|
725
|
-
tick();
|
|
726
|
-
// tick() may have hit a scroll boundary and called stop() (dir reset to
|
|
727
|
-
// 0). Only start the interval if we're still going — otherwise the
|
|
728
|
-
// interval would run forever with dir === 0 doing nothing useful.
|
|
729
|
-
if (dirRef.current === dir_0) {
|
|
730
|
-
timerRef.current = setInterval(tick, AUTOSCROLL_INTERVAL_MS);
|
|
731
|
-
}
|
|
732
|
-
}
|
|
733
|
-
|
|
734
|
-
// Re-evaluated on every selection change (start/drag/finish/clear).
|
|
735
|
-
// Drives drag-to-scroll autoscroll when the drag leaves the viewport.
|
|
736
|
-
// Prior versions broke sticky here on drag-start to prevent selection
|
|
737
|
-
// drift during streaming — ink.tsx now translates selection coords by
|
|
738
|
-
// the follow delta instead (native terminal behavior: view keeps
|
|
739
|
-
// scrolling, highlight walks up with the text). Keeping sticky also
|
|
740
|
-
// avoids useVirtualScroll's tail-walk → forward-walk phantom growth.
|
|
741
|
-
function check(): void {
|
|
742
|
-
const s_0 = scrollRef.current;
|
|
743
|
-
if (!s_0) {
|
|
744
|
-
stop();
|
|
745
|
-
return;
|
|
746
|
-
}
|
|
747
|
-
const top_0 = s_0.getViewportTop();
|
|
748
|
-
const bottom_0 = top_0 + s_0.getViewportHeight() - 1;
|
|
749
|
-
const sel_0 = selection.getState();
|
|
750
|
-
// Pass the LAST-scrolled direction (not dirRef) so the anchor guard is
|
|
751
|
-
// bypassed after shiftAnchor has clamped anchor toward row 0. Using
|
|
752
|
-
// lastScrolledDirRef (survives stop()) lets autoscroll resume after a
|
|
753
|
-
// brief mouse dip into the viewport. Same-direction only — a mouse
|
|
754
|
-
// jump from below-bottom to above-top must stop, since reversing while
|
|
755
|
-
// the scrolledOffAbove/Below accumulators hold the prior direction's
|
|
756
|
-
// rows would duplicate text in getSelectedText. Reset on drag-finish
|
|
757
|
-
// OR when both accumulators are empty: startSelection clears them
|
|
758
|
-
// (selection.ts), so a new drag after a lost-release (isDragging
|
|
759
|
-
// stuck true, the reason AUTOSCROLL_MAX_TICKS exists) still resets.
|
|
760
|
-
// Safe: start() below re-records lastScrolledDirRef before its
|
|
761
|
-
// early-return, so a mid-scroll reset here is instantly undone.
|
|
762
|
-
if (!sel_0?.isDragging || sel_0.scrolledOffAbove.length === 0 && sel_0.scrolledOffBelow.length === 0) {
|
|
763
|
-
lastScrolledDirRef.current = 0;
|
|
764
|
-
}
|
|
765
|
-
const dir_1 = dragScrollDirection(sel_0, top_0, bottom_0, lastScrolledDirRef.current);
|
|
766
|
-
if (dir_1 === 0) {
|
|
767
|
-
// Blocked reversal: focus jumped to the opposite edge (off-window
|
|
768
|
-
// drag return, fast flick). handleSelectionDrag already moved focus
|
|
769
|
-
// past the anchor, flipping selectionBounds — the accumulator is
|
|
770
|
-
// now orphaned (holds rows on the wrong side). Clear it so
|
|
771
|
-
// getSelectedText matches the visible highlight.
|
|
772
|
-
if (lastScrolledDirRef.current !== 0 && sel_0?.focus) {
|
|
773
|
-
const want = sel_0.focus.row < top_0 ? -1 : sel_0.focus.row > bottom_0 ? 1 : 0;
|
|
774
|
-
if (want !== 0 && want !== lastScrolledDirRef.current) {
|
|
775
|
-
sel_0.scrolledOffAbove = [];
|
|
776
|
-
sel_0.scrolledOffBelow = [];
|
|
777
|
-
sel_0.scrolledOffAboveSW = [];
|
|
778
|
-
sel_0.scrolledOffBelowSW = [];
|
|
779
|
-
lastScrolledDirRef.current = 0;
|
|
780
|
-
}
|
|
781
|
-
}
|
|
782
|
-
stop();
|
|
783
|
-
} else start(dir_1);
|
|
784
|
-
}
|
|
785
|
-
const unsubscribe = selection.subscribe(check);
|
|
786
|
-
return () => {
|
|
787
|
-
unsubscribe();
|
|
788
|
-
stop();
|
|
789
|
-
lastScrolledDirRef.current = 0;
|
|
790
|
-
};
|
|
791
|
-
}, [isActive, scrollRef, selection]);
|
|
792
|
-
}
|
|
793
|
-
|
|
794
|
-
/**
|
|
795
|
-
* Compute autoscroll direction for a drag selection relative to the ScrollBox
|
|
796
|
-
* viewport. Returns 0 when not dragging, anchor/focus missing, or the anchor
|
|
797
|
-
* is outside the viewport — a multi-click or drag that started in the input
|
|
798
|
-
* area must not commandeer the message scroll (double-click in the input area
|
|
799
|
-
* while scrolled up previously corrupted the anchor via shiftAnchor and
|
|
800
|
-
* spuriously scrolled the message history every 50ms until release).
|
|
801
|
-
*
|
|
802
|
-
* alreadyScrollingDir bypasses the anchor-in-viewport guard once autoscroll
|
|
803
|
-
* is active (shiftAnchor legitimately clamps the anchor toward row 0, below
|
|
804
|
-
* `top`) but only allows SAME-direction continuation. If the focus jumps to
|
|
805
|
-
* the opposite edge (below→above or above→below — possible with a fast flick
|
|
806
|
-
* or off-window drag since mode 1002 reports on cell change, not per cell),
|
|
807
|
-
* returns 0 to stop — reversing without clearing scrolledOffAbove/Below
|
|
808
|
-
* would duplicate captured rows when they scroll back on-screen.
|
|
809
|
-
*/
|
|
810
|
-
export function dragScrollDirection(sel: SelectionState | null, top: number, bottom: number, alreadyScrollingDir: -1 | 0 | 1 = 0): -1 | 0 | 1 {
|
|
811
|
-
if (!sel?.isDragging || !sel.anchor || !sel.focus) return 0;
|
|
812
|
-
const row = sel.focus.row;
|
|
813
|
-
const want: -1 | 0 | 1 = row < top ? -1 : row > bottom ? 1 : 0;
|
|
814
|
-
if (alreadyScrollingDir !== 0) {
|
|
815
|
-
// Same-direction only. Focus on the opposite side, or back inside the
|
|
816
|
-
// viewport, stops the scroll — captured rows stay in scrolledOffAbove/
|
|
817
|
-
// Below but never scroll back on-screen, so getSelectedText is correct.
|
|
818
|
-
return want === alreadyScrollingDir ? want : 0;
|
|
819
|
-
}
|
|
820
|
-
// Anchor must be inside the viewport for us to own this drag. If the
|
|
821
|
-
// user started selecting in the input box or header, autoscrolling the
|
|
822
|
-
// message history is surprising and corrupts the anchor via shiftAnchor.
|
|
823
|
-
if (sel.anchor.row < top || sel.anchor.row > bottom) return 0;
|
|
824
|
-
return want;
|
|
825
|
-
}
|
|
826
|
-
|
|
827
|
-
// Keyboard page jumps: scrollTo() writes scrollTop directly and clears
|
|
828
|
-
// pendingScrollDelta — one frame, no drain. scrollBy() accumulates into
|
|
829
|
-
// pendingScrollDelta which the renderer drains over several frames
|
|
830
|
-
// (render-node-to-output.ts drainProportional/drainAdaptive) — correct for
|
|
831
|
-
// wheel smoothness, wrong for PgUp/ctrl+u where the user expects a snap.
|
|
832
|
-
// Target is relative to scrollTop+pendingDelta so a jump mid-wheel-burst
|
|
833
|
-
// lands where the wheel was heading.
|
|
834
|
-
export function jumpBy(s: ScrollBoxHandle, delta: number): boolean {
|
|
835
|
-
const max = Math.max(0, s.getScrollHeight() - s.getViewportHeight());
|
|
836
|
-
const target = s.getScrollTop() + s.getPendingDelta() + delta;
|
|
837
|
-
if (target >= max) {
|
|
838
|
-
// Eager-write scrollTop so follow-scroll sees followDelta=0. Callers
|
|
839
|
-
// that ran translateSelectionForJump already shifted; scrollToBottom()
|
|
840
|
-
// alone would double-shift via the render-phase sticky follow.
|
|
841
|
-
s.scrollTo(max);
|
|
842
|
-
s.scrollToBottom();
|
|
843
|
-
return true;
|
|
844
|
-
}
|
|
845
|
-
s.scrollTo(Math.max(0, target));
|
|
846
|
-
return false;
|
|
847
|
-
}
|
|
848
|
-
|
|
849
|
-
// Wheel-down past maxScroll re-enables sticky so wheeling at the bottom
|
|
850
|
-
// naturally re-pins (matches typical chat-app behavior). Returns the
|
|
851
|
-
// resulting sticky state so callers can propagate it.
|
|
852
|
-
function scrollDown(s: ScrollBoxHandle, amount: number): boolean {
|
|
853
|
-
const max = Math.max(0, s.getScrollHeight() - s.getViewportHeight());
|
|
854
|
-
// Include pendingDelta: scrollBy accumulates into pendingScrollDelta
|
|
855
|
-
// without updating scrollTop, so getScrollTop() alone is stale within
|
|
856
|
-
// a batch of wheel events. Without this, wheeling to the bottom never
|
|
857
|
-
// re-enables sticky scroll.
|
|
858
|
-
const effectiveTop = s.getScrollTop() + s.getPendingDelta();
|
|
859
|
-
if (effectiveTop + amount >= max) {
|
|
860
|
-
s.scrollToBottom();
|
|
861
|
-
return true;
|
|
862
|
-
}
|
|
863
|
-
s.scrollBy(amount);
|
|
864
|
-
return false;
|
|
865
|
-
}
|
|
866
|
-
|
|
867
|
-
// Wheel-up past scrollTop=0 clamps via scrollTo(0), clearing
|
|
868
|
-
// pendingScrollDelta so aggressive wheel bursts (e.g. MX Master free-spin)
|
|
869
|
-
// don't accumulate an unbounded negative delta. Without this clamp,
|
|
870
|
-
// useVirtualScroll's [effLo, effHi] span grows past what MAX_MOUNTED_ITEMS
|
|
871
|
-
// can cover and intermediate drain frames render at scrollTops with no
|
|
872
|
-
// mounted children — blank viewport.
|
|
873
|
-
export function scrollUp(s: ScrollBoxHandle, amount: number): void {
|
|
874
|
-
// Include pendingDelta: scrollBy accumulates without updating scrollTop,
|
|
875
|
-
// so getScrollTop() alone is stale within a batch of wheel events.
|
|
876
|
-
const effectiveTop = s.getScrollTop() + s.getPendingDelta();
|
|
877
|
-
if (effectiveTop - amount <= 0) {
|
|
878
|
-
s.scrollTo(0);
|
|
879
|
-
return;
|
|
880
|
-
}
|
|
881
|
-
s.scrollBy(-amount);
|
|
882
|
-
}
|
|
883
|
-
export type ModalPagerAction = 'lineUp' | 'lineDown' | 'halfPageUp' | 'halfPageDown' | 'fullPageUp' | 'fullPageDown' | 'top' | 'bottom';
|
|
884
|
-
|
|
885
|
-
/**
|
|
886
|
-
* Maps a keystroke to a modal pager action. Exported for testing.
|
|
887
|
-
* Returns null for keys the modal pager doesn't handle (they fall through).
|
|
888
|
-
*
|
|
889
|
-
* ctrl+u/d/b/f are the less-lineage bindings. g/G are bare letters (only
|
|
890
|
-
* safe when no prompt is mounted). G arrives as input='G' shift=false on
|
|
891
|
-
* legacy terminals, or input='g' shift=true on kitty-protocol terminals.
|
|
892
|
-
* Lowercase g needs the !shift guard so it doesn't also match kitty-G.
|
|
893
|
-
*
|
|
894
|
-
* Key-repeat: stdin coalesces held-down printables into one multi-char
|
|
895
|
-
* string (e.g. 'ggg'). Only uniform-char batches are handled — mixed input
|
|
896
|
-
* like 'gG' isn't key-repeat. g/G are idempotent absolute jumps, so the
|
|
897
|
-
* count is irrelevant (consuming the batch just prevents it from leaking
|
|
898
|
-
* to the selection-clear-on-printable handler).
|
|
899
|
-
*/
|
|
900
|
-
export function modalPagerAction(input: string, key: Pick<Key, 'ctrl' | 'meta' | 'shift' | 'upArrow' | 'downArrow' | 'home' | 'end'>): ModalPagerAction | null {
|
|
901
|
-
if (key.meta) return null;
|
|
902
|
-
// Special keys first — arrows/home/end arrive with empty or junk input,
|
|
903
|
-
// so these must be checked before any input-string logic. shift is
|
|
904
|
-
// reserved for selection-extend (selectionFocusMoveForKey); ctrl+home/end
|
|
905
|
-
// already has a useKeybindings route to scroll:top/bottom.
|
|
906
|
-
if (!key.ctrl && !key.shift) {
|
|
907
|
-
if (key.upArrow) return 'lineUp';
|
|
908
|
-
if (key.downArrow) return 'lineDown';
|
|
909
|
-
if (key.home) return 'top';
|
|
910
|
-
if (key.end) return 'bottom';
|
|
911
|
-
}
|
|
912
|
-
if (key.ctrl) {
|
|
913
|
-
if (key.shift) return null;
|
|
914
|
-
switch (input) {
|
|
915
|
-
case 'u':
|
|
916
|
-
return 'halfPageUp';
|
|
917
|
-
case 'd':
|
|
918
|
-
return 'halfPageDown';
|
|
919
|
-
case 'b':
|
|
920
|
-
return 'fullPageUp';
|
|
921
|
-
case 'f':
|
|
922
|
-
return 'fullPageDown';
|
|
923
|
-
// emacs-style line scroll (less accepts both ctrl+n/p and ctrl+e/y).
|
|
924
|
-
// Works during search nav — fine-adjust after a jump without
|
|
925
|
-
// leaving modal. No !searchOpen gate on this useInput's isActive.
|
|
926
|
-
case 'n':
|
|
927
|
-
return 'lineDown';
|
|
928
|
-
case 'p':
|
|
929
|
-
return 'lineUp';
|
|
930
|
-
default:
|
|
931
|
-
return null;
|
|
932
|
-
}
|
|
933
|
-
}
|
|
934
|
-
// Bare letters. Key-repeat batches: only act on uniform runs.
|
|
935
|
-
const c = input[0];
|
|
936
|
-
if (!c || input !== c.repeat(input.length)) return null;
|
|
937
|
-
// kitty sends G as input='g' shift=true; legacy as 'G' shift=false.
|
|
938
|
-
// Check BEFORE the shift-gate so both hit 'bottom'.
|
|
939
|
-
if (c === 'G' || c === 'g' && key.shift) return 'bottom';
|
|
940
|
-
if (key.shift) return null;
|
|
941
|
-
switch (c) {
|
|
942
|
-
case 'g':
|
|
943
|
-
return 'top';
|
|
944
|
-
// j/k re-added per Tom Mar 18 — reversal of Mar 16 removal. Works
|
|
945
|
-
// during search nav (fine-adjust after n/N lands) since isModal is
|
|
946
|
-
// independent of searchOpen.
|
|
947
|
-
case 'j':
|
|
948
|
-
return 'lineDown';
|
|
949
|
-
case 'k':
|
|
950
|
-
return 'lineUp';
|
|
951
|
-
// less: space = page down, b = page up. ctrl+b already maps above;
|
|
952
|
-
// bare b is the less-native version.
|
|
953
|
-
case ' ':
|
|
954
|
-
return 'fullPageDown';
|
|
955
|
-
case 'b':
|
|
956
|
-
return 'fullPageUp';
|
|
957
|
-
default:
|
|
958
|
-
return null;
|
|
959
|
-
}
|
|
960
|
-
}
|
|
961
|
-
|
|
962
|
-
/**
|
|
963
|
-
* Applies a modal pager action to a ScrollBox. Returns the resulting sticky
|
|
964
|
-
* state, or null if the action was null (nothing to do — caller should fall
|
|
965
|
-
* through). Calls onBeforeJump(delta) before scrolling so the caller can
|
|
966
|
-
* translate the text selection by the scroll delta (capture outgoing rows,
|
|
967
|
-
* shift anchor+focus) instead of clearing it. Exported for testing.
|
|
968
|
-
*/
|
|
969
|
-
export function applyModalPagerAction(s: ScrollBoxHandle, act: ModalPagerAction | null, onBeforeJump: (delta: number) => void): boolean | null {
|
|
970
|
-
switch (act) {
|
|
971
|
-
case null:
|
|
972
|
-
return null;
|
|
973
|
-
case 'lineUp':
|
|
974
|
-
case 'lineDown':
|
|
975
|
-
{
|
|
976
|
-
const d = act === 'lineDown' ? 1 : -1;
|
|
977
|
-
onBeforeJump(d);
|
|
978
|
-
return jumpBy(s, d);
|
|
979
|
-
}
|
|
980
|
-
case 'halfPageUp':
|
|
981
|
-
case 'halfPageDown':
|
|
982
|
-
{
|
|
983
|
-
const half = Math.max(1, Math.floor(s.getViewportHeight() / 2));
|
|
984
|
-
const d = act === 'halfPageDown' ? half : -half;
|
|
985
|
-
onBeforeJump(d);
|
|
986
|
-
return jumpBy(s, d);
|
|
987
|
-
}
|
|
988
|
-
case 'fullPageUp':
|
|
989
|
-
case 'fullPageDown':
|
|
990
|
-
{
|
|
991
|
-
const page = Math.max(1, s.getViewportHeight());
|
|
992
|
-
const d = act === 'fullPageDown' ? page : -page;
|
|
993
|
-
onBeforeJump(d);
|
|
994
|
-
return jumpBy(s, d);
|
|
995
|
-
}
|
|
996
|
-
case 'top':
|
|
997
|
-
onBeforeJump(-(s.getScrollTop() + s.getPendingDelta()));
|
|
998
|
-
s.scrollTo(0);
|
|
999
|
-
return false;
|
|
1000
|
-
case 'bottom':
|
|
1001
|
-
{
|
|
1002
|
-
const max = Math.max(0, s.getScrollHeight() - s.getViewportHeight());
|
|
1003
|
-
onBeforeJump(max - (s.getScrollTop() + s.getPendingDelta()));
|
|
1004
|
-
// Eager-write scrollTop before scrollToBottom — same double-shift
|
|
1005
|
-
// fix as scroll:bottom and jumpBy's max branch.
|
|
1006
|
-
s.scrollTo(max);
|
|
1007
|
-
s.scrollToBottom();
|
|
1008
|
-
return true;
|
|
1009
|
-
}
|
|
1010
|
-
}
|
|
1011
|
-
}
|
|
1012
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIlJlZk9iamVjdCIsInVzZUVmZmVjdCIsInVzZVJlZiIsInVzZU5vdGlmaWNhdGlvbnMiLCJ1c2VDb3B5T25TZWxlY3QiLCJ1c2VTZWxlY3Rpb25CZ0NvbG9yIiwiU2Nyb2xsQm94SGFuZGxlIiwidXNlU2VsZWN0aW9uIiwiRm9jdXNNb3ZlIiwiU2VsZWN0aW9uU3RhdGUiLCJpc1h0ZXJtSnMiLCJnZXRDbGlwYm9hcmRQYXRoIiwiS2V5IiwidXNlSW5wdXQiLCJ1c2VLZXliaW5kaW5ncyIsImxvZ0ZvckRlYnVnZ2luZyIsIlByb3BzIiwic2Nyb2xsUmVmIiwiaXNBY3RpdmUiLCJvblNjcm9sbCIsInN0aWNreSIsImhhbmRsZSIsImlzTW9kYWwiLCJXSEVFTF9BQ0NFTF9XSU5ET1dfTVMiLCJXSEVFTF9BQ0NFTF9TVEVQIiwiV0hFRUxfQUNDRUxfTUFYIiwiV0hFRUxfQk9VTkNFX0dBUF9NQVhfTVMiLCJXSEVFTF9NT0RFX1NURVAiLCJXSEVFTF9NT0RFX0NBUCIsIldIRUVMX01PREVfUkFNUCIsIldIRUVMX01PREVfSURMRV9ESVNFTkdBR0VfTVMiLCJXSEVFTF9ERUNBWV9IQUxGTElGRV9NUyIsIldIRUVMX0RFQ0FZX1NURVAiLCJXSEVFTF9CVVJTVF9NUyIsIldIRUVMX0RFQ0FZX0dBUF9NUyIsIldIRUVMX0RFQ0FZX0NBUF9TTE9XIiwiV0hFRUxfREVDQVlfQ0FQX0ZBU1QiLCJXSEVFTF9ERUNBWV9JRExFX01TIiwic2hvdWxkQ2xlYXJTZWxlY3Rpb25PbktleSIsImtleSIsIndoZWVsVXAiLCJ3aGVlbERvd24iLCJpc05hdiIsImxlZnRBcnJvdyIsInJpZ2h0QXJyb3ciLCJ1cEFycm93IiwiZG93bkFycm93IiwiaG9tZSIsImVuZCIsInBhZ2VVcCIsInBhZ2VEb3duIiwic2hpZnQiLCJtZXRhIiwic3VwZXIiLCJzZWxlY3Rpb25Gb2N1c01vdmVGb3JLZXkiLCJXaGVlbEFjY2VsU3RhdGUiLCJ0aW1lIiwibXVsdCIsImRpciIsInh0ZXJtSnMiLCJmcmFjIiwiYmFzZSIsInBlbmRpbmdGbGlwIiwid2hlZWxNb2RlIiwiYnVyc3RDb3VudCIsImNvbXB1dGVXaGVlbFN0ZXAiLCJzdGF0ZSIsIm5vdyIsIk1hdGgiLCJmbG9vciIsImdhcCIsIm0iLCJwb3ciLCJjYXAiLCJtYXgiLCJuZXh0IiwibWluIiwic2FtZURpciIsInRvdGFsIiwicm93cyIsInJlYWRTY3JvbGxTcGVlZEJhc2UiLCJyYXciLCJwcm9jZXNzIiwiZW52IiwiQ0xBVURFX0NPREVfU0NST0xMX1NQRUVEIiwibiIsInBhcnNlRmxvYXQiLCJOdW1iZXIiLCJpc05hTiIsImluaXRXaGVlbEFjY2VsIiwiaW5pdEFuZExvZ1doZWVsQWNjZWwiLCJURVJNX1BST0dSQU0iLCJBVVRPU0NST0xMX0xJTkVTIiwiQVVUT1NDUk9MTF9JTlRFUlZBTF9NUyIsIkFVVE9TQ1JPTExfTUFYX1RJQ0tTIiwiU2Nyb2xsS2V5YmluZGluZ0hhbmRsZXIiLCJSZWFjdE5vZGUiLCJzZWxlY3Rpb24iLCJhZGROb3RpZmljYXRpb24iLCJ3aGVlbEFjY2VsIiwic2hvd0NvcGllZFRvYXN0IiwidGV4dCIsInBhdGgiLCJsZW5ndGgiLCJtc2ciLCJjb2xvciIsInByaW9yaXR5IiwidGltZW91dE1zIiwiY29weUFuZFRvYXN0IiwiY29weVNlbGVjdGlvbiIsInRyYW5zbGF0ZVNlbGVjdGlvbkZvckp1bXAiLCJzIiwiZGVsdGEiLCJzZWwiLCJnZXRTdGF0ZSIsImFuY2hvciIsImZvY3VzIiwidG9wIiwiZ2V0Vmlld3BvcnRUb3AiLCJib3R0b20iLCJnZXRWaWV3cG9ydEhlaWdodCIsInJvdyIsImdldFNjcm9sbEhlaWdodCIsImN1ciIsImdldFNjcm9sbFRvcCIsImdldFBlbmRpbmdEZWx0YSIsImFjdHVhbCIsImNhcHR1cmVTY3JvbGxlZFJvd3MiLCJzaGlmdFNlbGVjdGlvbiIsImEiLCJzY3JvbGw6cGFnZVVwIiwiY3VycmVudCIsImQiLCJqdW1wQnkiLCJzY3JvbGw6cGFnZURvd24iLCJzY3JvbGw6bGluZVVwIiwiY2xlYXJTZWxlY3Rpb24iLCJzY3JvbGxVcCIsInBlcmZvcm1hbmNlIiwic2Nyb2xsOmxpbmVEb3duIiwic3RlcCIsInJlYWNoZWRCb3R0b20iLCJzY3JvbGxEb3duIiwic2Nyb2xsOnRvcCIsInNjcm9sbFRvIiwic2Nyb2xsOmJvdHRvbSIsInNjcm9sbFRvQm90dG9tIiwiY29udGV4dCIsInNjcm9sbDpoYWxmUGFnZVVwIiwic2Nyb2xsOmhhbGZQYWdlRG93biIsInNjcm9sbDpmdWxsUGFnZVVwIiwic2Nyb2xsOmZ1bGxQYWdlRG93biIsImlucHV0IiwiZXZlbnQiLCJhcHBseU1vZGFsUGFnZXJBY3Rpb24iLCJtb2RhbFBhZ2VyQWN0aW9uIiwic3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIiwiaGFzU2VsZWN0aW9uIiwiZXNjYXBlIiwiY3RybCIsIm1vdmUiLCJtb3ZlRm9jdXMiLCJ1c2VEcmFnVG9TY3JvbGwiLCJSZXR1cm5UeXBlIiwidGltZXJSZWYiLCJOb2RlSlMiLCJUaW1lb3V0IiwiZGlyUmVmIiwibGFzdFNjcm9sbGVkRGlyUmVmIiwidGlja3NSZWYiLCJvblNjcm9sbFJlZiIsInN0b3AiLCJjbGVhckludGVydmFsIiwidGljayIsImlzRHJhZ2dpbmciLCJzaGlmdEFuY2hvciIsInNjcm9sbEJ5Iiwic3RhcnQiLCJzZXRJbnRlcnZhbCIsImNoZWNrIiwic2Nyb2xsZWRPZmZBYm92ZSIsInNjcm9sbGVkT2ZmQmVsb3ciLCJkcmFnU2Nyb2xsRGlyZWN0aW9uIiwid2FudCIsInNjcm9sbGVkT2ZmQWJvdmVTVyIsInNjcm9sbGVkT2ZmQmVsb3dTVyIsInVuc3Vic2NyaWJlIiwic3Vic2NyaWJlIiwiYWxyZWFkeVNjcm9sbGluZ0RpciIsInRhcmdldCIsImFtb3VudCIsImVmZmVjdGl2ZVRvcCIsIk1vZGFsUGFnZXJBY3Rpb24iLCJQaWNrIiwiYyIsInJlcGVhdCIsImFjdCIsIm9uQmVmb3JlSnVtcCIsImhhbGYiLCJwYWdlIl0sInNvdXJjZXMiOlsiU2Nyb2xsS2V5YmluZGluZ0hhbmRsZXIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyB0eXBlIFJlZk9iamVjdCwgdXNlRWZmZWN0LCB1c2VSZWYgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZU5vdGlmaWNhdGlvbnMgfSBmcm9tICcuLi9jb250ZXh0L25vdGlmaWNhdGlvbnMuanMnXG5pbXBvcnQge1xuICB1c2VDb3B5T25TZWxlY3QsXG4gIHVzZVNlbGVjdGlvbkJnQ29sb3IsXG59IGZyb20gJy4uL2hvb2tzL3VzZUNvcHlPblNlbGVjdC5qcydcbmltcG9ydCB0eXBlIHsgU2Nyb2xsQm94SGFuZGxlIH0gZnJvbSAnLi4vaW5rL2NvbXBvbmVudHMvU2Nyb2xsQm94LmpzJ1xuaW1wb3J0IHsgdXNlU2VsZWN0aW9uIH0gZnJvbSAnLi4vaW5rL2hvb2tzL3VzZS1zZWxlY3Rpb24uanMnXG5pbXBvcnQgdHlwZSB7IEZvY3VzTW92ZSwgU2VsZWN0aW9uU3RhdGUgfSBmcm9tICcuLi9pbmsvc2VsZWN0aW9uLmpzJ1xuaW1wb3J0IHsgaXNYdGVybUpzIH0gZnJvbSAnLi4vaW5rL3Rlcm1pbmFsLmpzJ1xuaW1wb3J0IHsgZ2V0Q2xpcGJvYXJkUGF0aCB9IGZyb20gJy4uL2luay90ZXJtaW8vb3NjLmpzJ1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGN1c3RvbS1ydWxlcy9wcmVmZXItdXNlLWtleWJpbmRpbmdzIC0tIEVzYyBuZWVkcyBjb25kaXRpb25hbCBwcm9wYWdhdGlvbiBiYXNlZCBvbiBzZWxlY3Rpb24gc3RhdGVcbmltcG9ydCB7IHR5cGUgS2V5LCB1c2VJbnB1dCB9IGZyb20gJy4uL2luay5qcydcbmltcG9ydCB7IHVzZUtleWJpbmRpbmdzIH0gZnJvbSAnLi4va2V5YmluZGluZ3MvdXNlS2V5YmluZGluZy5qcydcbmltcG9ydCB7IGxvZ0ZvckRlYnVnZ2luZyB9IGZyb20gJy4uL3V0aWxzL2RlYnVnLmpzJ1xuXG50eXBlIFByb3BzID0ge1xuICBzY3JvbGxSZWY6IFJlZk9iamVjdDxTY3JvbGxCb3hIYW5kbGUgfCBudWxsPlxuICBpc0FjdGl2ZTogYm9vbGVhblxuICAvKiogQ2FsbGVkIGFmdGVyIGV2ZXJ5IHNjcm9sbCBhY3Rpb24gd2l0aCB0aGUgcmVzdWx0aW5nIHN0aWNreSBzdGF0ZSBhbmRcbiAgICogIHRoZSBoYW5kbGUgKGZvciByZWFkaW5nIHNjcm9sbFRvcC9zY3JvbGxIZWlnaHQgcG9zdC1zY3JvbGwpLiAqL1xuICBvblNjcm9sbD86IChzdGlja3k6IGJvb2xlYW4sIGhhbmRsZTogU2Nyb2xsQm94SGFuZGxlKSA9PiB2b2lkXG4gIC8qKiBFbmFibGVzIG1vZGFsIHBhZ2VyIGtleXMgKGcvRywgY3RybCt1L2QvYi9mKS4gT25seSBzYWZlIHdoZW4gdGhlcmVcbiAgICogIGlzIG5vIHRleHQgaW5wdXQgY29tcGV0aW5nIGZvciB0aG9zZSBjaGFyYWN0ZXJzIOKAlCBpLmUuIHRyYW5zY3JpcHRcbiAgICogIG1vZGUuIERlZmF1bHRzIHRvIGZhbHNlLiBXaGVuIHRydWUsIEcgd29ya3MgcmVnYXJkbGVzcyBvZiBlZGl0b3JNb2RlXG4gICAqICBhbmQgc3RpY2t5IHN0YXRlOyBjdHJsK3UvZC9iL2YgZG9uJ3QgY29uZmxpY3Qgd2l0aCBraWxsLWxpbmUvZXhpdC9cbiAgICogIHRhc2s6YmFja2dyb3VuZC9raWxsLWFnZW50cyAobm9uZSBhcmUgbW91bnRlZCwgb3IgdGhleSBtb3VudCBhZnRlclxuICAgKiAgdGhpcyBjb21wb25lbnQgc28gc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIHdpbnMpLiAqL1xuICBpc01vZGFsPzogYm9vbGVhblxufVxuXG4vLyBUZXJtaW5hbHMgc2VuZCBvbmUgU0dSIHdoZWVsIGV2ZW50IHBlciBpbnRlbmRlZCByb3cgKHZlcmlmaWVkIGluIEdob3N0dHlcbi8vIHNyYy9TdXJmYWNlLnppZzogYGZvciAoMC4uQGFicyh5LmRlbHRhKSkgfF98IHsgbW91c2VSZXBvcnQoLmZvdXIsIC4uLikgfWApLlxuLy8gR2hvc3R0eSBhbHJlYWR5IDPDlydzIGRpc2NyZXRlIHdoZWVsIHRpY2tzIGJlZm9yZSB0aGF0IGxvb3A7IHRyYWNrcGFkXG4vLyBwcmVjaXNpb24gc2Nyb2xsIGlzIHBpeGVscy9jZWxsX3NpemUuIDEgZXZlbnQgPSAxIHJvdyBpbnRlbmRlZCDigJQgdXNlIGl0XG4vLyBhcyB0aGUgYmFzZSwgYW5kIHJhbXAgYSBtdWx0aXBsaWVyIHdoZW4gZXZlbnRzIGFycml2ZSByYXBpZGx5LiBUaGVcbi8vIHBlbmRpbmdTY3JvbGxEZWx0YSBhY2N1bXVsYXRvciArIHByb3BvcnRpb25hbCBkcmFpbiBpblxuLy8gcmVuZGVyLW5vZGUtdG8tb3V0cHV0IGhhbmRsZXMgc21vb3RoIGNhdGNoLXVwIG9uIGJpZyBidXJzdHMuXG4vL1xuLy8geHRlcm0uanMgKFZTIENvZGUvQ3Vyc29yL1dpbmRzdXJmIGludGVncmF0ZWQgdGVybWluYWxzKSBzZW5kcyBleGFjdGx5IDFcbi8vIGV2ZW50IHBlciB3aGVlbCBub3RjaCDigJQgbm8gcHJlLWFtcGxpZmljYXRpb24uIEEgc2VwYXJhdGUgZXhwb25lbnRpYWxcbi8vIGRlY2F5IGN1cnZlIChiZWxvdykgY29tcGVuc2F0ZXMgZm9yIHRoZSBsb3dlciBldmVudCByYXRlLCB3aXRoIGJ1cnN0XG4vLyBkZXRlY3Rpb24gYW5kIGdhcC1kZXBlbmRlbnQgY2FwcyB0dW5lZCB0byBWUyBDb2RlJ3MgZXZlbnQgcGF0dGVybnMuXG5cbi8vIE5hdGl2ZSB0ZXJtaW5hbHM6IGhhcmQtd2luZG93IGxpbmVhciByYW1wLiBFdmVudHMgY2xvc2VyIHRoYW4gdGhlIHdpbmRvd1xuLy8gcmFtcCB0aGUgbXVsdGlwbGllcjsgaWRsZSBnYXBzIHJlc2V0IHRvIGBiYXNlYCAoZGVmYXVsdCAxKS4gU29tZSBlbXVsYXRvcnNcbi8vIHByZS1tdWx0aXBseSBhdCB0aGVpciBsYXllciAoZ2hvc3R0eSBkaXNjcmV0ZT0zIHNlbmRzIDMgU0dSIGV2ZW50cy9ub3RjaDtcbi8vIGlUZXJtMiBcImZhc3RlciBzY3JvbGxcIiBzaW1pbGFyKSDigJQgYmFzZT0xIGlzIGNvcnJlY3QgdGhlcmUuIE90aGVycyBzZW5kIDFcbi8vIGV2ZW50L25vdGNoIOKAlCB1c2VycyBvbiB0aG9zZSBjYW4gc2V0IENMQVVERV9DT0RFX1NDUk9MTF9TUEVFRD0zIHRvIG1hdGNoXG4vLyB2aW0vbnZpbS9vcGVuY29kZSBhcHAtc2lkZSBkZWZhdWx0cy4gV2UgY2FuJ3QgZGV0ZWN0IHdoaWNoLCBzbyBrbm9iIGl0LlxuY29uc3QgV0hFRUxfQUNDRUxfV0lORE9XX01TID0gNDBcbmNvbnN0IFdIRUVMX0FDQ0VMX1NURVAgPSAwLjNcbmNvbnN0IFdIRUVMX0FDQ0VMX01BWCA9IDZcblxuLy8gRW5jb2RlciBib3VuY2UgZGVib3VuY2UgKyB3aGVlbC1tb2RlIGRlY2F5IGN1cnZlLiBXb3JuL2NoZWFwIG9wdGljYWxcbi8vIGVuY29kZXJzIGVtaXQgc3B1cmlvdXMgcmV2ZXJzZS1kaXJlY3Rpb24gdGlja3MgZHVyaW5nIGZhc3Qgc3BpbnMg4oCUIG1lYXN1cmVkXG4vLyAyOCUgb2YgZXZlbnRzIG9uIEJvcmlzJ3MgbW91c2UgKDIwMjYtMDMtMTcsIGlUZXJtMikuIFBhdHRlcm4gaXMgYWx3YXlzXG4vLyBmbGlwLXRoZW4tZmxpcC1iYWNrOyB0cmFja3BhZHMgcHJvZHVjZSBaRVJPIGZsaXBzICgwLzQ1OCBpbiBzYW1lIHJlY29yZGluZykuXG4vLyBBIGNvbmZpcm1lZCBib3VuY2UgcHJvdmVzIGEgcGh5c2ljYWwgd2hlZWwgaXMgYXR0YWNoZWQg4oCUIGVuZ2FnZSB0aGUgc2FtZVxuLy8gZXhwb25lbnRpYWwtZGVjYXkgY3VydmUgdGhlIHh0ZXJtLmpzIHBhdGggdXNlcyAoaXQncyBhbHJlYWR5IHR1bmVkKSwgd2l0aFxuLy8gYSBoaWdoZXIgY2FwIHRvIGNvbXBlbnNhdGUgZm9yIHRoZSBsb3dlciBldmVudCByYXRlICh+OS9zZWMgdnMgVlMgQ29kZSdzXG4vLyB+MzAvc2VjKS4gVHJhY2twYWQgY2FuJ3QgcmVhY2ggdGhpcyBwYXRoLlxuLy9cbi8vIFRoZSBkZWNheSBjdXJ2ZSBnaXZlczogMXN0IGNsaWNrIGFmdGVyIGlkbGUgPSAxIHJvdyAocHJlY2lzaW9uKSwgMm5kID0gMTAsXG4vLyAzcmQgPSBjYXAuIFNsb3dpbmcgZG93biBkZWNheXMgc21vb3RobHkgdG93YXJkIDEg4oCUIG5vIHNlcGFyYXRlIGlkbGVcbi8vIHRocmVzaG9sZCBuZWVkZWQsIGxhcmdlIGdhcHMganVzdCBoYXZlIG3iiYgwIOKGkiBtdWx04oaSMS4gV2hlZWwgbW9kZSBpcyBTVElDS1k6XG4vLyBvbmNlIGEgYm91bmNlIGNvbmZpcm1zIGl0J3MgYSBtb3VzZSwgdGhlIGRlY2F5IGN1cnZlIGFwcGxpZXMgdW50aWwgYW4gaWRsZVxuLy8gZ2FwIG9yIHRyYWNrcGFkLWZsaWNrLWJ1cnN0IHNpZ25hbHMgYSBwb3NzaWJsZSBkZXZpY2Ugc3dpdGNoLlxuY29uc3QgV0hFRUxfQk9VTkNFX0dBUF9NQVhfTVMgPSAyMDAgLy8gZmxpcC1iYWNrIG11c3QgYXJyaXZlIHdpdGhpbiB0aGlzXG4vLyBNb3VzZSBpcyB+OSBldmVudHMvc2VjIHZzIFZTIENvZGUncyB+MzAg4oCUIFNURVAgaXMgM8OXIHh0ZXJtLmpzJ3MgNSB0b1xuLy8gY29tcGVuc2F0ZS4gQXQgZ2FwPTEwMG1zICht4omIMC42Myk6IG9uZSBjbGljayBnaXZlcyAxKzE1KjAuNjPiiYgxMC41LlxuY29uc3QgV0hFRUxfTU9ERV9TVEVQID0gMTVcbmNvbnN0IFdIRUVMX01PREVfQ0FQID0gMTVcbi8vIE1heCBtdWx0IGdyb3d0aCBwZXIgZXZlbnQuIFdpdGhvdXQgdGhpcywgdGhlICtTVEVQKm0gdGVybSBqdW1wcyBtdWx0XG4vLyBmcm9tIDHihpIxMCBpbiBvbmUgZXZlbnQgd2hlbiB3aGVlbE1vZGUgZW5nYWdlcyBtaWQtc2Nyb2xsIChib3VuY2Vcbi8vIGRldGVjdGVkIGFmdGVyIE4gZXZlbnRzIGluIHRyYWNrcGFkIG1vZGUgYXQgbXVsdD0xKS4gVXNlciBzZWVzIHNjcm9sbFxuLy8gc3VkZGVubHkgZ28gMTDDlyBmYXN0ZXIuIENhcD0zIGdpdmVzIDHihpI04oaSN+KGkjEw4oaSMTPihpIxNSBvdmVyIH4wLjVzIGF0XG4vLyA5IGV2ZW50cy9zZWMg4oCUIHNtb290aCByYW1wIGluc3RlYWQgb2YgYSBqdW1wLiBEZWNheSBpcyB1bmFmZmVjdGVkXG4vLyAodGFyZ2V0PG11bHQgd2lucyB0aGUgbWluKS5cbmNvbnN0IFdIRUVMX01PREVfUkFNUCA9IDNcbi8vIERldmljZS1zd2l0Y2ggZGlzZW5nYWdlOiBtb3VzZSBmaW5nZXItcmVwb3NpdGlvbnMgbWF4IGF0IH44MzBtcyAobWVhc3VyZWQpO1xuLy8gdHJhY2twYWQgYmV0d2Vlbi1nZXN0dXJlIHBhdXNlcyBhcmUgMjAwMG1zKy4gQW4gaWRsZSBnYXAgYWJvdmUgdGhpcyBtZWFuc1xuLy8gdGhlIHVzZXIgc3RvcHBlZCDigJQgbWlnaHQgaGF2ZSBzd2l0Y2hlZCBkZXZpY2VzLiBEaXNlbmdhZ2U7IHRoZSBuZXh0IG1vdXNlXG4vLyBib3VuY2UgcmUtZW5nYWdlcy4gVHJhY2twYWQgc2xvdyBzd2lwZSAobm8gPDVtcyBidXJzdHMsIHNvIHRoZSBidXJzdC1jb3VudFxuLy8gZ3VhcmQgZG9lc24ndCBjYXRjaCBpdCkgaXMgd2hhdCB0aGlzIHByb3RlY3RzIGFnYWluc3QuXG5jb25zdCBXSEVFTF9NT0RFX0lETEVfRElTRU5HQUdFX01TID0gMTUwMFxuXG4vLyB4dGVybS5qczogZXhwb25lbnRpYWwgZGVjYXkuIG1vbWVudHVtPTAuNV4oZ2FwL2hsKSDigJQgc2xvdyBjbGljayDihpIgbeKJiDBcbi8vIOKGkiBtdWx04oaSMSAocHJlY2lzaW9uKTsgZmFzdCDihpIgbeKJiDEg4oaSIGNhcnJpZXMgbW9tZW50dW0uIFN0ZWFkeS1zdGF0ZVxuLy8gPSAxICsgc3RlcMOXbS8oMS1tKSwgY2FwcGVkLiBNZWFzdXJlZCBldmVudCByYXRlcyBpbiBWUyBDb2RlICh3aGVlbC5sb2cpOlxuLy8gc3VzdGFpbmVkIHNjcm9sbCBzZW5kcyBldmVudHMgYXQgMjAtNTBtcyBnYXBzICgyMC00MCBIeiksIHBsdXMgMC0ybXNcbi8vIHNhbWUtYmF0Y2ggYnVyc3RzIG9uIGZsaWNrcy4gQ2FwIGlzIGxvdyAoM+KAkzYsIGdhcC1kZXBlbmRlbnQpIGJlY2F1c2UgZXZlbnRcbi8vIGZyZXF1ZW5jeSBpcyBoaWdoIOKAlCBhdCA0MCBIeiDDlyA2ID0gMjQwIHJvd3Mvc2VjIG1heCBkZW1hbmQsIHdoaWNoIHRoZVxuLy8gYWRhcHRpdmUgZHJhaW4gYXQgfjIwMGZwcyAobWVhc3VyZWQpIGhhbmRsZXMuIEhpZ2hlciBjYXAg4oaSIHBlbmRpbmcgZXhwbG9zaW9uLlxuLy8gVHVuZWQgZW1waXJpY2FsbHkgKGJvcmlzIDIwMjYtMDMpLiBTZWUgZG9jcy9yZXNlYXJjaC90ZXJtaW5hbC1zY3JvbGwtKi5cbmNvbnN0IFdIRUVMX0RFQ0FZX0hBTEZMSUZFX01TID0gMTUwXG5jb25zdCBXSEVFTF9ERUNBWV9TVEVQID0gNVxuLy8gU2FtZS1iYXRjaCBldmVudHMgKDxCVVJTVF9NUykgYXJyaXZlIGluIG9uZSBzdGRpbiBiYXRjaCDigJQgdGhlIHRlcm1pbmFsXG4vLyBpcyBkb2luZyBwcm9wb3J0aW9uYWwgcmVwb3J0aW5nLiBUcmVhdCBhcyAxIHJvdy9ldmVudCBsaWtlIG5hdGl2ZS5cbmNvbnN0IFdIRUVMX0JVUlNUX01TID0gNVxuLy8gQ2FwIGJvdW5kYXJ5OiBzbG93IGV2ZW50cyAo4omlR0FQX01TKSBjYXAgbG93IGZvciBzaG9ydCBzbW9vdGggZHJhaW5zO1xuLy8gZmFzdCBldmVudHMgY2FwIGhpZ2hlciBmb3IgdGhyb3VnaHB1dCAoYWRhcHRpdmUgZHJhaW4gaGFuZGxlcyBiYWNrbG9nKS5cbmNvbnN0IFdIRUVMX0RFQ0FZX0dBUF9NUyA9IDgwXG5jb25zdCBXSEVFTF9ERUNBWV9DQVBfU0xPVyA9IDMgLy8gZ2FwIOKJpSBHQVBfTVM6IHByZWNpc2lvblxuY29uc3QgV0hFRUxfREVDQVlfQ0FQX0ZBU1QgPSA2IC8vIGdhcCA8IEdBUF9NUzogdGhyb3VnaHB1dFxuLy8gSWRsZSB0aHJlc2hvbGQ6IGdhcHMgYmV5b25kIHRoaXMgcmVzZXQgdG8gdGhlIGtpY2sgdmFsdWUgKDIpIHNvIHRoZVxuLy8gZmlyc3QgY2xpY2sgYWZ0ZXIgYSBwYXVzZSBmZWVscyByZXNwb25zaXZlIHJlZ2FyZGxlc3Mgb2YgZGlyZWN0aW9uLlxuY29uc3QgV0hFRUxfREVDQVlfSURMRV9NUyA9IDUwMFxuXG4vKipcbiAqIFdoZXRoZXIgYSBrZXlwcmVzcyBzaG91bGQgY2xlYXIgdGhlIHZpcnR1YWwgdGV4dCBzZWxlY3Rpb24uIE1pbWljc1xuICogbmF0aXZlIHRlcm1pbmFsIHNlbGVjdGlvbjogYW55IGtleXN0cm9rZSBjbGVhcnMsIEVYQ0VQVCBtb2RpZmllZCBuYXZcbiAqIGtleXMgKHNoaWZ0L29wdC9jbWQgKyBhcnJvdy9ob21lL2VuZC9wYWdlKikuIEluIG5hdGl2ZSBtYWNPUyBjb250ZXh0cyxcbiAqIHNoaWZ0K25hdiBleHRlbmRzIHNlbGVjdGlvbiwgYW5kIGNtZC9vcHQrbmF2IGFyZSBvZnRlbiBpbnRlcmNlcHRlZCBieVxuICogdGhlIHRlcm1pbmFsIGVtdWxhdG9yIGZvciBzY3JvbGxiYWNrIG5hdiDigJQgbmVpdGhlciBkaXN0dXJicyBzZWxlY3Rpb24uXG4gKiBCYXJlIGFycm93cyBETyBjbGVhciAodXNlcidzIGN1cnNvciBtb3ZlcywgbmF0aXZlIGRlc2VsZWN0cykuIFdoZWVsIGlzXG4gKiBleGNsdWRlZCDigJQgc2Nyb2xsOmxpbmVVcC9Eb3duIGFscmVhZHkgY2xlYXJzIHZpYSB0aGUga2V5YmluZGluZyBwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkQ2xlYXJTZWxlY3Rpb25PbktleShrZXk6IEtleSk6IGJvb2xlYW4ge1xuICBpZiAoa2V5LndoZWVsVXAgfHwga2V5LndoZWVsRG93bikgcmV0dXJuIGZhbHNlXG4gIGNvbnN0IGlzTmF2ID1cbiAgICBrZXkubGVmdEFycm93IHx8XG4gICAga2V5LnJpZ2h0QXJyb3cgfHxcbiAgICBrZXkudXBBcnJvdyB8fFxuICAgIGtleS5kb3duQXJyb3cgfHxcbiAgICBrZXkuaG9tZSB8fFxuICAgIGtleS5lbmQgfHxcbiAgICBrZXkucGFnZVVwIHx8XG4gICAga2V5LnBhZ2VEb3duXG4gIGlmIChpc05hdiAmJiAoa2V5LnNoaWZ0IHx8IGtleS5tZXRhIHx8IGtleS5zdXBlcikpIHJldHVybiBmYWxzZVxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIE1hcCBhIGtleXByZXNzIHRvIGEgc2VsZWN0aW9uIGZvY3VzIG1vdmUgKGtleWJvYXJkIGV4dGVuc2lvbikuIE9ubHlcbiAqIHNoaWZ0IGV4dGVuZHMg4oCUIHRoYXQncyB0aGUgdW5pdmVyc2FsIHRleHQtc2VsZWN0aW9uIG1vZGlmaWVyLiBjbWRcbiAqIChzdXBlcikgb25seSBhcnJpdmVzIHZpYSBraXR0eSBrZXlib2FyZCBwcm90b2NvbCDigJQgaW4gbW9zdCB0ZXJtaW5hbHNcbiAqIGNtZCthcnJvdyBpcyBpbnRlcmNlcHRlZCBieSB0aGUgZW11bGF0b3IgYW5kIG5ldmVyIHJlYWNoZXMgdGhlIHB0eSwgc29cbiAqIG5vIHN1cGVyIGJyYW5jaC4gc2hpZnQraG9tZS9lbmQgY292ZXJzIGxpbmUtZWRnZSBqdW1wcyAoYW5kIGZuK3NoaWZ0K1xuICogbGVmdC9yaWdodCBvbiBtYWMgbGFwdG9wcyA9IHNoaWZ0K2hvbWUvZW5kKS4gc2hpZnQrb3B0ICh3b3JkLWp1bXApIG5vdFxuICogeWV0IGltcGxlbWVudGVkIOKAlCBmYWxscyB0aHJvdWdoIHRvIHNob3VsZENsZWFyU2VsZWN0aW9uT25LZXkgd2hpY2hcbiAqIHByZXNlcnZlcyAobW9kaWZpZWQgbmF2KS4gUmV0dXJucyBudWxsIGZvciBub24tZXh0ZW5kIGtleXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3Rpb25Gb2N1c01vdmVGb3JLZXkoa2V5OiBLZXkpOiBGb2N1c01vdmUgfCBudWxsIHtcbiAgaWYgKCFrZXkuc2hpZnQgfHwga2V5Lm1ldGEpIHJldHVybiBudWxsXG4gIGlmIChrZXkubGVmdEFycm93KSByZXR1cm4gJ2xlZnQnXG4gIGlmIChrZXkucmlnaHRBcnJvdykgcmV0dXJuICdyaWdodCdcbiAgaWYgKGtleS51cEFycm93KSByZXR1cm4gJ3VwJ1xuICBpZiAoa2V5LmRvd25BcnJvdykgcmV0dXJuICdkb3duJ1xuICBpZiAoa2V5LmhvbWUpIHJldHVybiAnbGluZVN0YXJ0J1xuICBpZiAoa2V5LmVuZCkgcmV0dXJuICdsaW5lRW5kJ1xuICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgdHlwZSBXaGVlbEFjY2VsU3RhdGUgPSB7XG4gIHRpbWU6IG51bWJlclxuICBtdWx0OiBudW1iZXJcbiAgZGlyOiAwIHwgMSB8IC0xXG4gIHh0ZXJtSnM6IGJvb2xlYW5cbiAgLyoqIENhcnJpZWQgZnJhY3Rpb25hbCBzY3JvbGwgKHh0ZXJtLmpzIG9ubHkpLiBzY3JvbGxCeSBmbG9vcnMsIHNvIHdpdGhvdXRcbiAgICogIHRoaXMgYSBtdWx0IG9mIDEuNSBnaXZlcyAxIHJvdyBldmVyeSB0aW1lLiBDYXJyeWluZyB0aGUgcmVtYWluZGVyIGdpdmVzXG4gICAqICAxLDIsMSwyIG9uIGF2ZXJhZ2UgZm9yIG11bHQ9MS41IOKAlCBjb3JyZWN0IHRocm91Z2hwdXQgb3ZlciB0aW1lLiAqL1xuICBmcmFjOiBudW1iZXJcbiAgLyoqIE5hdGl2ZS1wYXRoIGJhc2VsaW5lIHJvd3MvZXZlbnQuIFJlc2V0IHZhbHVlIG9uIGlkbGUvcmV2ZXJzYWw7IHJhbXBcbiAgICogIGJ1aWxkcyBvbiB0b3AuIHh0ZXJtLmpzIHBhdGggaWdub3JlcyB0aGlzIChvd24ga2ljaz0yIHR1bmluZykuICovXG4gIGJhc2U6IG51bWJlclxuICAvKiogRGVmZXJyZWQgZGlyZWN0aW9uIGZsaXAgKG5hdGl2ZSBvbmx5KS4gTWlnaHQgYmUgZW5jb2RlciBib3VuY2Ugb3IgYVxuICAgKiAgcmVhbCByZXZlcnNhbCDigJQgcmVzb2x2ZWQgYnkgdGhlIE5FWFQgZXZlbnQuIFJlYWwgcmV2ZXJzYWwgbG9zZXMgMSByb3dcbiAgICogIG9mIGxhdGVuY3k7IGJvdW5jZSBpcyBzd2FsbG93ZWQgYW5kIHRyaWdnZXJzIHdoZWVsIG1vZGUuIFRoZSBmbGlwJ3NcbiAgICogIGRpcmVjdGlvbiBhbmQgdGltZXN0YW1wIGFyZSBkZXJpdmFibGUgKGl0J3MgYWx3YXlzIC1zdGF0ZS5kaXIgYXRcbiAgICogIHN0YXRlLnRpbWUpIHNvIHRoaXMgaXMganVzdCBhIG1hcmtlci4gKi9cbiAgcGVuZGluZ0ZsaXA6IGJvb2xlYW5cbiAgLyoqIFNldCB0cnVlIG9uY2UgYSBib3VuY2UgaXMgY29uZmlybWVkIChmbGlwLXRoZW4tZmxpcC1iYWNrIHdpdGhpblxuICAgKiAgQk9VTkNFX0dBUF9NQVgpLiBTdGlja3kg4oCUIGJ1dCBkaXNlbmdhZ2VkIG9uIGlkbGUgZ2FwID4xNTAwbXMgT1IgYVxuICAgKiAgdHJhY2twYWQtc2lnbmF0dXJlIGJ1cnN0IChzZWUgYnVyc3RDb3VudCkuIFN0YXRlIGxpdmVzIGluIGEgdXNlUmVmIHNvXG4gICAqICBpdCBwZXJzaXN0cyBhY3Jvc3MgZGV2aWNlIHN3aXRjaGVzOyB0aGUgZGlzZW5nYWdlcyBoYW5kbGUgbW91c2XihpJ0cmFja3BhZC4gKi9cbiAgd2hlZWxNb2RlOiBib29sZWFuXG4gIC8qKiBDb25zZWN1dGl2ZSA8NW1zIGV2ZW50cy4gVHJhY2twYWQgZmxpY2sgcHJvZHVjZXMgMTAwKyBhdCA8NW1zOyBtb3VzZVxuICAgKiAgcHJvZHVjZXMg4omkMyAodmVyaWZpZWQgaW4gL3RtcC93aGVlbC10dW5lLnR4dCkuIDUrIGluIGEgcm93IOKGkiB0cmFja3BhZFxuICAgKiAgc2lnbmF0dXJlIOKGkiBkaXNlbmdhZ2Ugd2hlZWwgbW9kZSBzbyBkZXZpY2Utc3dpdGNoIGRvZXNuJ3QgbGVhayBtb3VzZVxuICAgKiAgYWNjZWwgdG8gdHJhY2twYWQuICovXG4gIGJ1cnN0Q291bnQ6IG51bWJlclxufVxuXG4vKiogQ29tcHV0ZSByb3dzIGZvciBvbmUgd2hlZWwgZXZlbnQsIG11dGF0aW5nIGFjY2VsIHN0YXRlLiBSZXR1cm5zIDAgd2hlblxuICogIGEgZGlyZWN0aW9uIGZsaXAgaXMgZGVmZXJyZWQgZm9yIGJvdW5jZSBkZXRlY3Rpb24g4oCUIGNhbGwgc2l0ZXMgbm8tb3Agb25cbiAqICBzdGVwPTAgKHNjcm9sbEJ5KDApIGlzIGEgbm8tb3AsIG9uU2Nyb2xsKGZhbHNlKSBpcyBpZGVtcG90ZW50KS4gRXhwb3J0ZWRcbiAqICBmb3IgdGVzdHMuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVdoZWVsU3RlcChcbiAgc3RhdGU6IFdoZWVsQWNjZWxTdGF0ZSxcbiAgZGlyOiAxIHwgLTEsXG4gIG5vdzogbnVtYmVyLFxuKTogbnVtYmVyIHtcbiAgaWYgKCFzdGF0ZS54dGVybUpzKSB7XG4gICAgLy8gRGV2aWNlLXN3aXRjaCBndWFyZCDikaA6IGlkbGUgZGlzZW5nYWdlLiBSdW5zIEJFRk9SRSBwZW5kaW5nRmxpcCByZXNvbHZlXG4gICAgLy8gc28gYSBwZW5kaW5nIGJvdW5jZSAoMjglIG9mIGxhc3QtbW91c2UtZXZlbnRzKSBkb2Vzbid0IGJ5cGFzcyBpdCB2aWFcbiAgICAvLyB0aGUgcmVhbC1yZXZlcnNhbCBlYXJseSByZXR1cm4uIHN0YXRlLnRpbWUgaXMgZWl0aGVyIHRoZSBsYXN0IGNvbW1pdHRlZFxuICAgIC8vIGV2ZW50IE9SIHRoZSBkZWZlcnJlZCBmbGlwIOKAlCBib3RoIGNvdW50IGFzIFwibGFzdCBhY3Rpdml0eVwiLlxuICAgIGlmIChzdGF0ZS53aGVlbE1vZGUgJiYgbm93IC0gc3RhdGUudGltZSA+IFdIRUVMX01PREVfSURMRV9ESVNFTkdBR0VfTVMpIHtcbiAgICAgIHN0YXRlLndoZWVsTW9kZSA9IGZhbHNlXG4gICAgICBzdGF0ZS5idXJzdENvdW50ID0gMFxuICAgICAgc3RhdGUubXVsdCA9IHN0YXRlLmJhc2VcbiAgICB9XG5cbiAgICAvLyBSZXNvbHZlIGFueSBkZWZlcnJlZCBmbGlwIEJFRk9SRSB0b3VjaGluZyBzdGF0ZS50aW1lL2RpciDigJQgd2UgbmVlZCB0aGVcbiAgICAvLyBwcmUtZmxpcCBzdGF0ZS5kaXIgdG8gZGlzdGluZ3Vpc2ggYm91bmNlIChmbGlwLWJhY2spIGZyb20gcmVhbCByZXZlcnNhbFxuICAgIC8vIChmbGlwIHBlcnNpc3RlZCksIGFuZCBzdGF0ZS50aW1lICg9IGJvdW5jZSB0aW1lc3RhbXApIGZvciB0aGUgZ2FwIGNoZWNrLlxuICAgIGlmIChzdGF0ZS5wZW5kaW5nRmxpcCkge1xuICAgICAgc3RhdGUucGVuZGluZ0ZsaXAgPSBmYWxzZVxuICAgICAgaWYgKGRpciAhPT0gc3RhdGUuZGlyIHx8IG5vdyAtIHN0YXRlLnRpbWUgPiBXSEVFTF9CT1VOQ0VfR0FQX01BWF9NUykge1xuICAgICAgICAvLyBSZWFsIHJldmVyc2FsOiBuZXcgZGlyIHBlcnNpc3RlZCwgT1IgZmxpcC1iYWNrIGFycml2ZWQgdG9vIGxhdGUuXG4gICAgICAgIC8vIENvbW1pdC4gVGhlIGRlZmVycmVkIGV2ZW50J3MgMSByb3cgaXMgbG9zdCAoYWNjZXB0YWJsZSBsYXRlbmN5KS5cbiAgICAgICAgc3RhdGUuZGlyID0gZGlyXG4gICAgICAgIHN0YXRlLnRpbWUgPSBub3dcbiAgICAgICAgc3RhdGUubXVsdCA9IHN0YXRlLmJhc2VcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3Ioc3RhdGUubXVsdClcbiAgICAgIH1cbiAgICAgIC8vIEJvdW5jZSBjb25maXJtZWQ6IGZsaXBwZWQgYmFjayB0byBvcmlnaW5hbCBkaXIgd2l0aGluIHRoZSB3aW5kb3cuXG4gICAgICAvLyBzdGF0ZS5kaXIvbXVsdCB1bmNoYW5nZWQgZnJvbSBwcmUtYm91bmNlLiBzdGF0ZS50aW1lIHdhcyBhZHZhbmNlZCB0b1xuICAgICAgLy8gdGhlIGJvdW5jZSBiZWxvdywgc28gZ2FwIGhlcmUgPSBmbGlwLWJhY2sgaW50ZXJ2YWwg4oCUIHJlZmxlY3RzIHRoZVxuICAgICAgLy8gdXNlcidzIGFjdHVhbCBjbGljayBjYWRlbmNlIChib3VuY2UgSVMgYSBwaHlzaWNhbCBjbGljaywganVzdCBub2lzeSkuXG4gICAgICBzdGF0ZS53aGVlbE1vZGUgPSB0cnVlXG4gICAgfVxuXG4gICAgY29uc3QgZ2FwID0gbm93IC0gc3RhdGUudGltZVxuICAgIGlmIChkaXIgIT09IHN0YXRlLmRpciAmJiBzdGF0ZS5kaXIgIT09IDApIHtcbiAgICAgIC8vIEZsaXAuIERlZmVyIOKAlCBuZXh0IGV2ZW50IGRlY2lkZXMgYm91bmNlIHZzLiByZWFsIHJldmVyc2FsLiBBZHZhbmNlXG4gICAgICAvLyB0aW1lIChidXQgTk9UIGRpci9tdWx0KTogaWYgdGhpcyB0dXJucyBvdXQgdG8gYmUgYSBib3VuY2UsIHRoZVxuICAgICAgLy8gY29uZmlybSBldmVudCdzIGdhcCB3aWxsIGJlIHRoZSBmbGlwLWJhY2sgaW50ZXJ2YWwsIHdoaWNoIHJlZmxlY3RzXG4gICAgICAvLyB0aGUgdXNlcidzIGFjdHVhbCBjbGljayByYXRlLiBUaGUgYm91bmNlIElTIGEgcGh5c2ljYWwgd2hlZWwgY2xpY2ssXG4gICAgICAvLyBqdXN0IG1pc3JlYWQgYnkgdGhlIGVuY29kZXIg4oCUIGl0IHNob3VsZCBjb3VudCB0b3dhcmQgY2FkZW5jZS5cbiAgICAgIHN0YXRlLnBlbmRpbmdGbGlwID0gdHJ1ZVxuICAgICAgc3RhdGUudGltZSA9IG5vd1xuICAgICAgcmV0dXJuIDBcbiAgICB9XG4gICAgc3RhdGUuZGlyID0gZGlyXG4gICAgc3RhdGUudGltZSA9IG5vd1xuXG4gICAgLy8g4pSA4pSA4pSAIE1PVVNFICh3aGVlbCBtb2RlLCBzdGlja3kgdW50aWwgZGV2aWNlLXN3aXRjaCBzaWduYWwpIOKUgOKUgOKUgFxuICAgIGlmIChzdGF0ZS53aGVlbE1vZGUpIHtcbiAgICAgIGlmIChnYXAgPCBXSEVFTF9CVVJTVF9NUykge1xuICAgICAgICAvLyBTYW1lLWJhdGNoIGJ1cnN0IGNoZWNrIChwb3J0ZWQgZnJvbSB4dGVybS5qcyk6IGlUZXJtMiBwcm9wb3J0aW9uYWxcbiAgICAgICAgLy8gcmVwb3J0aW5nIHNlbmRzIDIrIFNHUiBldmVudHMgZm9yIG9uZSBkZXRlbnQgd2hlbiBtYWNPUyBnaXZlc1xuICAgICAgICAvLyBkZWx0YT4xLiBXaXRob3V0IHRoaXMsIHRoZSAybmQgZXZlbnQgYXQgZ2FwPDFtcyBoYXMgbeKJiDEg4oaSIFNURVAqbT0xNVxuICAgICAgICAvLyDihpIgb25lIGdlbnRsZSBjbGljayBnaXZlcyAxKzE1PTE2IHJvd3MuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIERldmljZS1zd2l0Y2ggZ3VhcmQg4pGhOiB0cmFja3BhZCBmbGljayBwcm9kdWNlcyAxMDArIGV2ZW50cyBhdCA8NW1zXG4gICAgICAgIC8vIChtZWFzdXJlZCk7IG1vdXNlIHByb2R1Y2VzIOKJpDMuIDUrIGNvbnNlY3V0aXZlIOKGkiB0cmFja3BhZCBmbGljay5cbiAgICAgICAgaWYgKCsrc3RhdGUuYnVyc3RDb3VudCA+PSA1KSB7XG4gICAgICAgICAgc3RhdGUud2hlZWxNb2RlID0gZmFsc2VcbiAgICAgICAgICBzdGF0ZS5idXJzdENvdW50ID0gMFxuICAgICAgICAgIHN0YXRlLm11bHQgPSBzdGF0ZS5iYXNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIDFcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUuYnVyc3RDb3VudCA9IDBcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gUmUtY2hlY2s6IG1heSBoYXZlIGRpc2VuZ2FnZWQgYWJvdmUuXG4gICAgaWYgKHN0YXRlLndoZWVsTW9kZSkge1xuICAgICAgLy8geHRlcm0uanMgZGVjYXkgY3VydmUgd2l0aCBTVEVQw5czLCBoaWdoZXIgY2FwLiBObyBpZGxlIHRocmVzaG9sZCDigJRcbiAgICAgIC8vIHRoZSBjdXJ2ZSBoYW5kbGVzIGl0IChnYXA9MTAwMG1zIOKGkiBt4omIMC4wMSDihpIgbXVsdOKJiDEpLiBObyBmcmFjIOKAlFxuICAgICAgLy8gcm91bmRpbmcgbG9zcyBpcyBtaW5vciBhdCBoaWdoIG11bHQsIGFuZCBmcmFjIHBlcnNpc3RpbmcgYWNyb3NzIGlkbGVcbiAgICAgIC8vIHdhcyBjYXVzaW5nIG9mZi1ieS1vbmUgb24gdGhlIGZpcnN0IGNsaWNrIGJhY2suXG4gICAgICBjb25zdCBtID0gTWF0aC5wb3coMC41LCBnYXAgLyBXSEVFTF9ERUNBWV9IQUxGTElGRV9NUylcbiAgICAgIGNvbnN0IGNhcCA9IE1hdGgubWF4KFdIRUVMX01PREVfQ0FQLCBzdGF0ZS5iYXNlICogMilcbiAgICAgIGNvbnN0IG5leHQgPSAxICsgKHN0YXRlLm11bHQgLSAxKSAqIG0gKyBXSEVFTF9NT0RFX1NURVAgKiBtXG4gICAgICBzdGF0ZS5tdWx0ID0gTWF0aC5taW4oY2FwLCBuZXh0LCBzdGF0ZS5tdWx0ICsgV0hFRUxfTU9ERV9SQU1QKVxuICAgICAgcmV0dXJuIE1hdGguZmxvb3Ioc3RhdGUubXVsdClcbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgVFJBQ0tQQUQgLyBISS1SRVMgKG5hdGl2ZSwgbm9uLXdoZWVsLW1vZGUpIOKUgOKUgOKUgFxuICAgIC8vIFRpZ2h0IDQwbXMgYnVyc3Qgd2luZG93OiBzdWItNDBtcyBldmVudHMgcmFtcCwgYW55dGhpbmcgc2xvd2VyIHJlc2V0cy5cbiAgICAvLyBUcmFja3BhZCBmbGljayBkZWxpdmVycyAyMDArIGV2ZW50cyBhdCA8MjBtcyBnYXBzIOKGkiByYWlscyB0byBjYXAgNi5cbiAgICAvLyBUcmFja3BhZCBzbG93IHN3aXBlIGF0IDQwLTQwMG1zIGdhcHMg4oaSIHJlc2V0cyBldmVyeSBldmVudCDihpIgMSByb3cgZWFjaC5cbiAgICBpZiAoZ2FwID4gV0hFRUxfQUNDRUxfV0lORE9XX01TKSB7XG4gICAgICBzdGF0ZS5tdWx0ID0gc3RhdGUuYmFzZVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjYXAgPSBNYXRoLm1heChXSEVFTF9BQ0NFTF9NQVgsIHN0YXRlLmJhc2UgKiAyKVxuICAgICAgc3RhdGUubXVsdCA9IE1hdGgubWluKGNhcCwgc3RhdGUubXVsdCArIFdIRUVMX0FDQ0VMX1NURVApXG4gICAgfVxuICAgIHJldHVybiBNYXRoLmZsb29yKHN0YXRlLm11bHQpXG4gIH1cblxuICAvLyDilIDilIDilIAgVlNDT0RFICh4dGVybS5qcywgYnJvd3NlciB3aGVlbCBldmVudHMpIOKUgOKUgOKUgFxuICAvLyBCcm93c2VyIHdoZWVsIGV2ZW50cyDigJQgbm8gZW5jb2RlciBib3VuY2UsIG5vIFNHUiBidXJzdHMuIERlY2F5IGN1cnZlXG4gIC8vIHVuY2hhbmdlZCBmcm9tIHRoZSBvcmlnaW5hbCB0dW5pbmcuIFNhbWUgZm9ybXVsYSBzaGFwZSBhcyB3aGVlbCBtb2RlXG4gIC8vIGFib3ZlIChrZWVwIGluIHN5bmMpIGJ1dCBTVEVQPTUgbm90IDE1IOKAlCBoaWdoZXIgZXZlbnQgcmF0ZSBoZXJlLlxuICBjb25zdCBnYXAgPSBub3cgLSBzdGF0ZS50aW1lXG4gIGNvbnN0IHNhbWVEaXIgPSBkaXIgPT09IHN0YXRlLmRpclxuICBzdGF0ZS50aW1lID0gbm93XG4gIHN0YXRlLmRpciA9IGRpclxuICAvLyB4dGVybS5qcyBwYXRoLiBEZWJ1ZyBsb2cgc2hvd3MgdHdvIHBhdHRlcm5zOiAoYSkgMjAtNTBtcyBnYXBzIGR1cmluZ1xuICAvLyBzdXN0YWluZWQgc2Nyb2xsICh+MzAgSHopLCAoYikgPDVtcyBzYW1lLWJhdGNoIGJ1cnN0cyBvbiBmbGlja3MuIEZvclxuICAvLyAoYikgZ2l2ZSAxIHJvdy9ldmVudCDigJQgdGhlIGJ1cnN0IGNvdW50IElTIHRoZSBhY2NlbGVyYXRpb24sIHNhbWUgYXNcbiAgLy8gbmF0aXZlLiBGb3IgKGEpIHRoZSBkZWNheSBjdXJ2ZSBnaXZlcyAzLTUgcm93cy4gRm9yIHNwYXJzZSBldmVudHNcbiAgLy8gKDEwMG1zKywgc2xvdyBkZWxpYmVyYXRlIHNjcm9sbCkgdGhlIGN1cnZlIGdpdmVzIDEtMy5cbiAgaWYgKHNhbWVEaXIgJiYgZ2FwIDwgV0hFRUxfQlVSU1RfTVMpIHJldHVybiAxXG4gIGlmICghc2FtZURpciB8fCBnYXAgPiBXSEVFTF9ERUNBWV9JRExFX01TKSB7XG4gICAgLy8gRGlyZWN0aW9uIHJldmVyc2FsIG9yIGxvbmcgaWRsZTogc3RhcnQgYXQgMiAobm90IDEpIHNvIHRoZSBmaXJzdFxuICAgIC8vIGNsaWNrIGFmdGVyIGEgcGF1c2UgbW92ZXMgYSB2aXNpYmxlIGFtb3VudC4gV2l0aG91dCB0aGlzLCBpZGxlLVxuICAgIC8vIHRoZW4tcmVzdW1lIGluIHRoZSBzYW1lIGRpcmVjdGlvbiBkZWNheXMgdG8gbXVsdOKJiDEgKDEgcm93KS5cbiAgICBzdGF0ZS5tdWx0ID0gMlxuICAgIHN0YXRlLmZyYWMgPSAwXG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbSA9IE1hdGgucG93KDAuNSwgZ2FwIC8gV0hFRUxfREVDQVlfSEFMRkxJRkVfTVMpXG4gICAgY29uc3QgY2FwID1cbiAgICAgIGdhcCA+PSBXSEVFTF9ERUNBWV9HQVBfTVMgPyBXSEVFTF9ERUNBWV9DQVBfU0xPVyA6IFdIRUVMX0RFQ0FZX0NBUF9GQVNUXG4gICAgc3RhdGUubXVsdCA9IE1hdGgubWluKGNhcCwgMSArIChzdGF0ZS5tdWx0IC0gMSkgKiBtICsgV0hFRUxfREVDQVlfU1RFUCAqIG0pXG4gIH1cbiAgY29uc3QgdG90YWwgPSBzdGF0ZS5tdWx0ICsgc3RhdGUuZnJhY1xuICBjb25zdCByb3dzID0gTWF0aC5mbG9vcih0b3RhbClcbiAgc3RhdGUuZnJhYyA9IHRvdGFsIC0gcm93c1xuICByZXR1cm4gcm93c1xufVxuXG4vKiogUmVhZCBDTEFVREVfQ09ERV9TQ1JPTExfU1BFRUQsIGRlZmF1bHQgMSwgY2xhbXAgKDAsIDIwXS5cbiAqICBTb21lIHRlcm1pbmFscyBwcmUtbXVsdGlwbHkgd2hlZWwgZXZlbnRzIChnaG9zdHR5IGRpc2NyZXRlPTMsIGlUZXJtMlxuICogIFwiZmFzdGVyIHNjcm9sbFwiKSDigJQgYmFzZT0xIGlzIGNvcnJlY3QgdGhlcmUuIE90aGVycyBzZW5kIDEgZXZlbnQvbm90Y2gg4oCUXG4gKiAgc2V0IENMQVVERV9DT0RFX1NDUk9MTF9TUEVFRD0zIHRvIG1hdGNoIHZpbS9udmltL29wZW5jb2RlLiBXZSBjYW4ndFxuICogIGRldGVjdCB3aGljaCBraW5kIG9mIHRlcm1pbmFsIHdlJ3JlIGluLCBoZW5jZSB0aGUga25vYi4gQ2FsbGVkIGxhemlseVxuICogIGZyb20gaW5pdEFuZExvZ1doZWVsQWNjZWwgc28gZ2xvYmFsU2V0dGluZ3MuZW52IGhhcyBsb2FkZWQuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZFNjcm9sbFNwZWVkQmFzZSgpOiBudW1iZXIge1xuICBjb25zdCByYXcgPSBwcm9jZXNzLmVudi5DTEFVREVfQ09ERV9TQ1JPTExfU1BFRURcbiAgaWYgKCFyYXcpIHJldHVybiAxXG4gIGNvbnN0IG4gPSBwYXJzZUZsb2F0KHJhdylcbiAgcmV0dXJuIE51bWJlci5pc05hTihuKSB8fCBuIDw9IDAgPyAxIDogTWF0aC5taW4obiwgMjApXG59XG5cbi8qKiBJbml0aWFsIHdoZWVsIGFjY2VsIHN0YXRlLiB4dGVybUpzPXRydWUgc2VsZWN0cyB0aGUgZGVjYXkgY3VydmUuXG4gKiAgYmFzZSBpcyB0aGUgbmF0aXZlLXBhdGggYmFzZWxpbmUgcm93cy9ldmVudCAoZGVmYXVsdCAxKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0V2hlZWxBY2NlbCh4dGVybUpzID0gZmFsc2UsIGJhc2UgPSAxKTogV2hlZWxBY2NlbFN0YXRlIHtcbiAgcmV0dXJuIHtcbiAgICB0aW1lOiAwLFxuICAgIG11bHQ6IGJhc2UsXG4gICAgZGlyOiAwLFxuICAgIHh0ZXJtSnMsXG4gICAgZnJhYzogMCxcbiAgICBiYXNlLFxuICAgIHBlbmRpbmdGbGlwOiBmYWxzZSxcbiAgICB3aGVlbE1vZGU6IGZhbHNlLFxuICAgIGJ1cnN0Q291bnQ6IDAsXG4gIH1cbn1cblxuLy8gTGF6eS1pbml0IGhlbHBlci4gaXNYdGVybUpzKCkgY29tYmluZXMgdGhlIFRFUk1fUFJPR1JBTSBlbnYgY2hlY2sgKyBhc3luY1xuLy8gWFRWRVJTSU9OIHByb2JlIOKAlCB0aGUgcHJvYmUgbWF5IG5vdCBoYXZlIHJlc29sdmVkIGF0IHJlbmRlciB0aW1lLCBzbyB0aGlzXG4vLyBpcyBjYWxsZWQgb24gdGhlIGZpcnN0IHdoZWVsIGV2ZW50ICg+PjUwbXMgYWZ0ZXIgc3RhcnR1cCkgd2hlbiBpdCdzIHNldHRsZWQuXG4vLyBMb2dzIGRldGVjdGVkIG1vZGUgb25jZSBzbyAtLWRlYnVnIHVzZXJzIGNhbiB2ZXJpZnkgU1NIIGRldGVjdGlvbiB3b3JrZWQuXG4vLyBUaGUgcmVuZGVyZXIgYWxzbyBjYWxscyBpc1h0ZXJtSnNIb3N0KCkgKGluIHJlbmRlci1ub2RlLXRvLW91dHB1dCkgdG9cbi8vIHNlbGVjdCB0aGUgZHJhaW4gYWxnb3JpdGhtIOKAlCBubyBzdGF0ZSB0byBwYXNzIHRocm91Z2guXG5mdW5jdGlvbiBpbml0QW5kTG9nV2hlZWxBY2NlbCgpOiBXaGVlbEFjY2VsU3RhdGUge1xuICBjb25zdCB4dGVybUpzID0gaXNYdGVybUpzKClcbiAgY29uc3QgYmFzZSA9IHJlYWRTY3JvbGxTcGVlZEJhc2UoKVxuICBsb2dGb3JEZWJ1Z2dpbmcoXG4gICAgYHdoZWVsIGFjY2VsOiAke3h0ZXJtSnMgPyAnZGVjYXkgKHh0ZXJtLmpzKScgOiAnd2luZG93IChuYXRpdmUpJ30gwrcgYmFzZT0ke2Jhc2V9IMK3IFRFUk1fUFJPR1JBTT0ke3Byb2Nlc3MuZW52LlRFUk1fUFJPR1JBTSA/PyAndW5zZXQnfWAsXG4gIClcbiAgcmV0dXJuIGluaXRXaGVlbEFjY2VsKHh0ZXJtSnMsIGJhc2UpXG59XG5cbi8vIERyYWctdG8tc2Nyb2xsOiB3aGVuIGRyYWdnaW5nIHBhc3QgdGhlIHZpZXdwb3J0IGVkZ2UsIHNjcm9sbCBieSB0aGlzIG1hbnlcbi8vIHJvd3MgZXZlcnkgQVVUT1NDUk9MTF9JTlRFUlZBTF9NUy4gTW9kZSAxMDAyIG1vdXNlIHRyYWNraW5nIG9ubHkgZmlyZXMgb25cbi8vIGNlbGwgY2hhbmdlLCBzbyBhIHRpbWVyIGlzIG5lZWRlZCB0byBjb250aW51ZSBzY3JvbGxpbmcgd2hpbGUgc3RhdGlvbmFyeS5cbmNvbnN0IEFVVE9TQ1JPTExfTElORVMgPSAyXG5jb25zdCBBVVRPU0NST0xMX0lOVEVSVkFMX01TID0gNTBcbi8vIEhhcmQgY2FwIG9uIGNvbnNlY3V0aXZlIGF1dG8tc2Nyb2xsIHRpY2tzLiBJZiB0aGUgcmVsZWFzZSBldmVudCBpcyBsb3N0XG4vLyAobW91c2UgcmVsZWFzZWQgb3V0c2lkZSB0ZXJtaW5hbCB3aW5kb3cg4oCUIHNvbWUgZW11bGF0b3JzIGRvbid0IGNhcHR1cmUgdGhlXG4vLyBwb2ludGVyIGFuZCBkcm9wIHRoZSByZWxlYXNlKSwgaXNEcmFnZ2luZyBzdGF5cyB0cnVlIGFuZCB0aGUgdGltZXIgd291bGRcbi8vIHJ1biB1bnRpbCBhIHNjcm9sbCBib3VuZGFyeS4gQ2FwIGJvdW5kcyB0aGUgZGFtYWdlOyBhbnkgbmV3IGRyYWcgbW90aW9uXG4vLyBldmVudCByZXN0YXJ0cyB0aGUgY291bnQgdmlhIGNoZWNrKCnihpJzdGFydCgpLlxuY29uc3QgQVVUT1NDUk9MTF9NQVhfVElDS1MgPSAyMDAgLy8gMTBzIEAgNTBtc1xuXG4vKipcbiAqIEtleWJvYXJkIHNjcm9sbCBuYXZpZ2F0aW9uIGZvciB0aGUgZnVsbHNjcmVlbiBsYXlvdXQncyBtZXNzYWdlIHNjcm9sbCBib3guXG4gKiBQZ1VwL1BnRG4gc2Nyb2xsIGJ5IGhhbGYtdmlld3BvcnQuIE1vdXNlIHdoZWVsIHNjcm9sbHMgYnkgYSBmZXcgbGluZXMuXG4gKiBTY3JvbGxpbmcgYnJlYWtzIHN0aWNreSBtb2RlOyBDdHJsK0VuZCByZS1lbmFibGVzIGl0LiBXaGVlbGluZyBkb3duIGF0XG4gKiB0aGUgYm90dG9tIGFsc28gcmUtZW5hYmxlcyBzdGlja3kgc28gbmV3IGNvbnRlbnQgZm9sbG93cyBuYXR1cmFsbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTY3JvbGxLZXliaW5kaW5nSGFuZGxlcih7XG4gIHNjcm9sbFJlZixcbiAgaXNBY3RpdmUsXG4gIG9uU2Nyb2xsLFxuICBpc01vZGFsID0gZmFsc2UsXG59OiBQcm9wcyk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IHNlbGVjdGlvbiA9IHVzZVNlbGVjdGlvbigpXG4gIGNvbnN0IHsgYWRkTm90aWZpY2F0aW9uIH0gPSB1c2VOb3RpZmljYXRpb25zKClcbiAgLy8gTGF6eS1pbml0ZWQgb24gZmlyc3Qgd2hlZWwgZXZlbnQgc28gdGhlIFhUVkVSU0lPTiBwcm9iZSAoZmlyZWQgYXRcbiAgLy8gcmF3LW1vZGUtZW5hYmxlIHRpbWUpIGhhcyByZXNvbHZlZCBieSB0aGVuIOKAlCBpbml0aWFsaXppbmcgaW4gdXNlUmVmKClcbiAgLy8gd291bGQgcmVhZCBnZXRXaGVlbEJhc2UoKSBiZWZvcmUgdGhlIHByb2JlIHJlcGx5IGFycml2ZXMgb3ZlciBTU0guXG4gIGNvbnN0IHdoZWVsQWNjZWwgPSB1c2VSZWY8V2hlZWxBY2NlbFN0YXRlIHwgbnVsbD4obnVsbClcblxuICBmdW5jdGlvbiBzaG93Q29waWVkVG9hc3QodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gZ2V0Q2xpcGJvYXJkUGF0aCByZWFkcyBlbnYgc3luY2hyb25vdXNseSDigJQgcHJlZGljdHMgd2hhdCBzZXRDbGlwYm9hcmRcbiAgICAvLyBkaWQgKG5hdGl2ZSBwYmNvcHkgLyB0bXV4IGxvYWQtYnVmZmVyIC8gcmF3IE9TQyA1Mikgc28gd2UgY2FuIHRlbGxcbiAgICAvLyB0aGUgdXNlciB3aGV0aGVyIHBhc3RlIHdpbGwgSnVzdCBXb3JrIG9yIG5lZWRzIHByZWZpeCtdLlxuICAgIGNvbnN0IHBhdGggPSBnZXRDbGlwYm9hcmRQYXRoKClcbiAgICBjb25zdCBuID0gdGV4dC5sZW5ndGhcbiAgICBsZXQgbXNnOiBzdHJpbmdcbiAgICBzd2l0Y2ggKHBhdGgpIHtcbiAgICAgIGNhc2UgJ25hdGl2ZSc6XG4gICAgICAgIG1zZyA9IGBjb3BpZWQgJHtufSBjaGFycyB0byBjbGlwYm9hcmRgXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICd0bXV4LWJ1ZmZlcic6XG4gICAgICAgIG1zZyA9IGBjb3BpZWQgJHtufSBjaGFycyB0byB0bXV4IGJ1ZmZlciDCtyBwYXN0ZSB3aXRoIHByZWZpeCArIF1gXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdvc2M1Mic6XG4gICAgICAgIG1zZyA9IGBzZW50ICR7bn0gY2hhcnMgdmlhIE9TQyA1MiDCtyBjaGVjayB0ZXJtaW5hbCBjbGlwYm9hcmQgc2V0dGluZ3MgaWYgcGFzdGUgZmFpbHNgXG4gICAgICAgIGJyZWFrXG4gICAgfVxuICAgIGFkZE5vdGlmaWNhdGlvbih7XG4gICAgICBrZXk6ICdzZWxlY3Rpb24tY29waWVkJyxcbiAgICAgIHRleHQ6IG1zZyxcbiAgICAgIGNvbG9yOiAnc3VnZ2VzdGlvbicsXG4gICAgICBwcmlvcml0eTogJ2ltbWVkaWF0ZScsXG4gICAgICB0aW1lb3V0TXM6IHBhdGggPT09ICduYXRpdmUnID8gMjAwMCA6IDQwMDAsXG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvcHlBbmRUb2FzdCgpOiB2b2lkIHtcbiAgICBjb25zdCB0ZXh0ID0gc2VsZWN0aW9uLmNvcHlTZWxlY3Rpb24oKVxuICAgIGlmICh0ZXh0KSBzaG93Q29waWVkVG9hc3QodGV4dClcbiAgfVxuXG4gIC8vIFRyYW5zbGF0ZSBzZWxlY3Rpb24gdG8gdHJhY2sgYSBrZXlib2FyZCBwYWdlIGp1bXAuIFNlbGVjdGlvbiBjb29yZHMgYXJlXG4gIC8vIHNjcmVlbi1idWZmZXItbG9jYWw7IGEgc2Nyb2xsVG8gdGhhdCBtb3ZlcyBjb250ZW50IGJ5IE4gcm93cyBtdXN0IGFsc29cbiAgLy8gc2hpZnQgYW5jaG9yK2ZvY3VzIGJ5IE4gc28gdGhlIGhpZ2hsaWdodCBzdGF5cyBvbiB0aGUgc2FtZSB0ZXh0IChuYXRpdmVcbiAgLy8gdGVybWluYWwgYmVoYXZpb3I6IHNlbGVjdGlvbiBtb3ZlcyB3aXRoIGNvbnRlbnQsIGNsaXBzIGF0IHZpZXdwb3J0XG4gIC8vIGVkZ2VzKS4gUm93cyB0aGF0IHNjcm9sbCBvdXQgb2YgdGhlIHZpZXdwb3J0IGFyZSBjYXB0dXJlZCBpbnRvXG4gIC8vIHNjcm9sbGVkT2ZmQWJvdmUvQmVsb3cgYmVmb3JlIHRoZSBzY3JvbGwgc28gZ2V0U2VsZWN0ZWRUZXh0IHN0aWxsXG4gIC8vIHJldHVybnMgdGhlIGZ1bGwgdGV4dC4gV2hlZWwgc2Nyb2xsIChzY3JvbGw6bGluZVVwL0Rvd24gdmlhIHNjcm9sbEJ5KVxuICAvLyBzdGlsbCBjbGVhcnMg4oCUIGl0cyBhc3luYyBwZW5kaW5nU2Nyb2xsRGVsdGEgZHJhaW4gbWVhbnMgdGhlIGFjdHVhbFxuICAvLyBkZWx0YSBpc24ndCBrbm93biBzeW5jaHJvbm91c2x5IChmb2xsb3ctdXApLlxuICBmdW5jdGlvbiB0cmFuc2xhdGVTZWxlY3Rpb25Gb3JKdW1wKHM6IFNjcm9sbEJveEhhbmRsZSwgZGVsdGE6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHNlbCA9IHNlbGVjdGlvbi5nZXRTdGF0ZSgpXG4gICAgaWYgKCFzZWw/LmFuY2hvciB8fCAhc2VsLmZvY3VzKSByZXR1cm5cbiAgICBjb25zdCB0b3AgPSBzLmdldFZpZXdwb3J0VG9wKClcbiAgICBjb25zdCBib3R0b20gPSB0b3AgKyBzLmdldFZpZXdwb3J0SGVpZ2h0KCkgLSAxXG4gICAgLy8gT25seSB0cmFuc2xhdGUgaWYgdGhlIHNlbGVjdGlvbiBpcyBPTiBzY3JvbGxib3ggY29udGVudC4gU2VsZWN0aW9uc1xuICAgIC8vIGluIHRoZSBmb290ZXIvcHJvbXB0L1N0aWNreVByb21wdEhlYWRlciBhcmUgb24gc3RhdGljIHRleHQg4oCUIHRoZVxuICAgIC8vIHNjcm9sbCBkb2Vzbid0IG1vdmUgd2hhdCdzIHVuZGVyIHRoZW0uIFNhbWUgZ3VhcmQgYXMgaW5rLnRzeCdzXG4gICAgLy8gYXV0by1mb2xsb3cgdHJhbnNsYXRlIChjb21taXQgMzZhOGQxNTQpLlxuICAgIGlmIChzZWwuYW5jaG9yLnJvdyA8IHRvcCB8fCBzZWwuYW5jaG9yLnJvdyA+IGJvdHRvbSkgcmV0dXJuXG4gICAgLy8gQ3Jvc3MtYm91bmRhcnk6IGFuY2hvciBpbiBzY3JvbGxib3gsIGZvY3VzIGluIGZvb3Rlci9oZWFkZXIuIE1pcnJvclxuICAgIC8vIGluay50c3gncyBGbGFnLTMgZ3VhcmQg4oCUIGZhbGwgdGhyb3VnaCB3aXRob3V0IHNoaWZ0aW5nIE9SIGNhcHR1cmluZy5cbiAgICAvLyBUaGUgc3RhdGljIGVuZHBvaW50IHBpbnMgdGhlIHNlbGVjdGlvbjsgc2hpZnRpbmcgd291bGQgdGVsZXBvcnQgaXRcbiAgICAvLyBpbnRvIHNjcm9sbGJveCBjb250ZW50LlxuICAgIGlmIChzZWwuZm9jdXMucm93IDwgdG9wIHx8IHNlbC5mb2N1cy5yb3cgPiBib3R0b20pIHJldHVyblxuICAgIGNvbnN0IG1heCA9IE1hdGgubWF4KDAsIHMuZ2V0U2Nyb2xsSGVpZ2h0KCkgLSBzLmdldFZpZXdwb3J0SGVpZ2h0KCkpXG4gICAgY29uc3QgY3VyID0gcy5nZXRTY3JvbGxUb3AoKSArIHMuZ2V0UGVuZGluZ0RlbHRhKClcbiAgICAvLyBBY3R1YWwgc2Nyb2xsIGRpc3RhbmNlIGFmdGVyIGJvdW5kYXJ5IGNsYW1wLiBqdW1wQnkgbWF5IGNhbGxcbiAgICAvLyBzY3JvbGxUb0JvdHRvbSB3aGVuIHRhcmdldCA+PSBtYXggYnV0IHRoZSB2aWV3IGNhbid0IG1vdmUgcGFzdCBtYXgsXG4gICAgLy8gc28gdGhlIHNlbGVjdGlvbiBzaGlmdCBpcyBib3VuZGVkIGhlcmUuXG4gICAgY29uc3QgYWN0dWFsID0gTWF0aC5tYXgoMCwgTWF0aC5taW4obWF4LCBjdXIgKyBkZWx0YSkpIC0gY3VyXG4gICAgaWYgKGFjdHVhbCA9PT0gMCkgcmV0dXJuXG4gICAgaWYgKGFjdHVhbCA+IDApIHtcbiAgICAgIC8vIFNjcm9sbGluZyBkb3duOiBjb250ZW50IG1vdmVzIHVwLiBSb3dzIGF0IHRoZSBUT1AgbGVhdmUgdmlld3BvcnQuXG4gICAgICAvLyBBbmNob3IrZm9jdXMgc2hpZnQgLWFjdHVhbCBzbyB0aGV5IHRyYWNrIHRoZSBjb250ZW50IHRoYXQgbW92ZWQgdXAuXG4gICAgICBzZWxlY3Rpb24uY2FwdHVyZVNjcm9sbGVkUm93cyh0b3AsIHRvcCArIGFjdHVhbCAtIDEsICdhYm92ZScpXG4gICAgICBzZWxlY3Rpb24uc2hpZnRTZWxlY3Rpb24oLWFjdHVhbCwgdG9wLCBib3R0b20pXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNjcm9sbGluZyB1cDogY29udGVudCBtb3ZlcyBkb3duLiBSb3dzIGF0IHRoZSBCT1RUT00gbGVhdmUgdmlld3BvcnQuXG4gICAgICBjb25zdCBhID0gLWFjdHVhbFxuICAgICAgc2VsZWN0aW9uLmNhcHR1cmVTY3JvbGxlZFJvd3MoYm90dG9tIC0gYSArIDEsIGJvdHRvbSwgJ2JlbG93JylcbiAgICAgIHNlbGVjdGlvbi5zaGlmdFNlbGVjdGlvbihhLCB0b3AsIGJvdHRvbSlcbiAgICB9XG4gIH1cblxuICB1c2VLZXliaW5kaW5ncyhcbiAgICB7XG4gICAgICAnc2Nyb2xsOnBhZ2VVcCc6ICgpID0+IHtcbiAgICAgICAgY29uc3QgcyA9IHNjcm9sbFJlZi5jdXJyZW50XG4gICAgICAgIGlmICghcykgcmV0dXJuXG4gICAgICAgIGNvbnN0IGQgPSAtTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihzLmdldFZpZXdwb3J0SGVpZ2h0KCkgLyAyKSlcbiAgICAgICAgdHJhbnNsYXRlU2VsZWN0aW9uRm9ySnVtcChzLCBkKVxuICAgICAgICBjb25zdCBzdGlja3kgPSBqdW1wQnkocywgZClcbiAgICAgICAgb25TY3JvbGw/LihzdGlja3ksIHMpXG4gICAgICB9LFxuICAgICAgJ3Njcm9sbDpwYWdlRG93bic6ICgpID0+IHtcbiAgICAgICAgY29uc3QgcyA9IHNjcm9sbFJlZi5jdXJyZW50XG4gICAgICAgIGlmICghcykgcmV0dXJuXG4gICAgICAgIGNvbnN0IGQgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHMuZ2V0Vmlld3BvcnRIZWlnaHQoKSAvIDIpKVxuICAgICAgICB0cmFuc2xhdGVTZWxlY3Rpb25Gb3JKdW1wKHMsIGQpXG4gICAgICAgIGNvbnN0IHN0aWNreSA9IGp1bXBCeShzLCBkKVxuICAgICAgICBvblNjcm9sbD8uKHN0aWNreSwgcylcbiAgICAgIH0sXG4gICAgICAnc2Nyb2xsOmxpbmVVcCc6ICgpID0+IHtcbiAgICAgICAgLy8gV2hlZWw6IHNjcm9sbEJ5IGFjY3VtdWxhdGVzIGludG8gcGVuZGluZ1Njcm9sbERlbHRhLCBkcmFpbmVkIGFzeW5jXG4gICAgICAgIC8vIGJ5IHRoZSByZW5kZXJlci4gY2FwdHVyZVNjcm9sbGVkUm93cyBjYW4ndCByZWFkIHRoZSBvdXRnb2luZyByb3dzXG4gICAgICAgIC8vIGJlZm9yZSB0aGV5IGxlYXZlIChkcmFpbiBpcyBub24tZGV0ZXJtaW5pc3RpYykuIENsZWFyIGZvciBub3cuXG4gICAgICAgIHNlbGVjdGlvbi5jbGVhclNlbGVjdGlvbigpXG4gICAgICAgIGNvbnN0IHMgPSBzY3JvbGxSZWYuY3VycmVudFxuICAgICAgICAvLyBSZXR1cm4gZmFsc2UgKG5vdCBjb25zdW1lZCkgd2hlbiB0aGUgU2Nyb2xsQm94IGNvbnRlbnQgZml0cyDigJRcbiAgICAgICAgLy8gc2Nyb2xsIHdvdWxkIGJlIGEgbm8tb3AuIExldHMgYSBjaGlsZCBjb21wb25lbnQncyBoYW5kbGVyIHRha2VcbiAgICAgICAgLy8gdGhlIHdoZWVsIGV2ZW50IGluc3RlYWQgKGUuZy4gU2V0dGluZ3MgQ29uZmlnJ3MgbGlzdCBuYXZpZ2F0aW9uXG4gICAgICAgIC8vIGluc2lkZSB0aGUgY2VudGVyZWQgTW9kYWwsIHdoZXJlIHRoZSBwYWdpbmF0ZWQgc2xpY2UgYWx3YXlzIGZpdHMpLlxuICAgICAgICBpZiAoIXMgfHwgcy5nZXRTY3JvbGxIZWlnaHQoKSA8PSBzLmdldFZpZXdwb3J0SGVpZ2h0KCkpIHJldHVybiBmYWxzZVxuICAgICAgICB3aGVlbEFjY2VsLmN1cnJlbnQgPz89IGluaXRBbmRMb2dXaGVlbEFjY2VsKClcbiAgICAgICAgc2Nyb2xsVXAocywgY29tcHV0ZVdoZWVsU3RlcCh3aGVlbEFjY2VsLmN1cnJlbnQsIC0xLCBwZXJmb3JtYW5jZS5ub3coKSkpXG4gICAgICAgIG9uU2Nyb2xsPy4oZmFsc2UsIHMpXG4gICAgICB9LFxuICAgICAgJ3Njcm9sbDpsaW5lRG93bic6ICgpID0+IHtcbiAgICAgICAgc2VsZWN0aW9uLmNsZWFyU2VsZWN0aW9uKClcbiAgICAgICAgY29uc3QgcyA9IHNjcm9sbFJlZi5jdXJyZW50XG4gICAgICAgIGlmICghcyB8fCBzLmdldFNjcm9sbEhlaWdodCgpIDw9IHMuZ2V0Vmlld3BvcnRIZWlnaHQoKSkgcmV0dXJuIGZhbHNlXG4gICAgICAgIHdoZWVsQWNjZWwuY3VycmVudCA/Pz0gaW5pdEFuZExvZ1doZWVsQWNjZWwoKVxuICAgICAgICBjb25zdCBzdGVwID0gY29tcHV0ZVdoZWVsU3RlcCh3aGVlbEFjY2VsLmN1cnJlbnQsIDEsIHBlcmZvcm1hbmNlLm5vdygpKVxuICAgICAgICBjb25zdCByZWFjaGVkQm90dG9tID0gc2Nyb2xsRG93bihzLCBzdGVwKVxuICAgICAgICBvblNjcm9sbD8uKHJlYWNoZWRCb3R0b20sIHMpXG4gICAgICB9LFxuICAgICAgJ3Njcm9sbDp0b3AnOiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHMgPSBzY3JvbGxSZWYuY3VycmVudFxuICAgICAgICBpZiAoIXMpIHJldHVyblxuICAgICAgICB0cmFuc2xhdGVTZWxlY3Rpb25Gb3JKdW1wKHMsIC0ocy5nZXRTY3JvbGxUb3AoKSArIHMuZ2V0UGVuZGluZ0RlbHRhKCkpKVxuICAgICAgICBzLnNjcm9sbFRvKDApXG4gICAgICAgIG9uU2Nyb2xsPy4oZmFsc2UsIHMpXG4gICAgICB9LFxuICAgICAgJ3Njcm9sbDpib3R0b20nOiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHMgPSBzY3JvbGxSZWYuY3VycmVudFxuICAgICAgICBpZiAoIXMpIHJldHVyblxuICAgICAgICBjb25zdCBtYXggPSBNYXRoLm1heCgwLCBzLmdldFNjcm9sbEhlaWdodCgpIC0gcy5nZXRWaWV3cG9ydEhlaWdodCgpKVxuICAgICAgICB0cmFuc2xhdGVTZWxlY3Rpb25Gb3JKdW1wKFxuICAgICAgICAgIHMsXG4gICAgICAgICAgbWF4IC0gKHMuZ2V0U2Nyb2xsVG9wKCkgKyBzLmdldFBlbmRpbmdEZWx0YSgpKSxcbiAgICAgICAgKVxuICAgICAgICAvLyBzY3JvbGxUbyhtYXgpIGVhZ2VyLXdyaXRlcyBzY3JvbGxUb3Agc28gdGhlIHJlbmRlci1waGFzZSBzdGlja3lcbiAgICAgICAgLy8gZm9sbG93IGNvbXB1dGVzIGZvbGxvd0RlbHRhPTAuIFdpdGhvdXQgdGhpcywgc2Nyb2xsVG9Cb3R0b20oKVxuICAgICAgICAvLyBhbG9uZSBsZWF2ZXMgc2Nyb2xsVG9wIHN0YWxlIOKGkiBmb2xsb3dEZWx0YT1tYXgtc3RhbGUg4oaSXG4gICAgICAgIC8vIHNoaWZ0U2VsZWN0aW9uRm9yRm9sbG93IGFwcGxpZXMgdGhlIFNBTUUgc2hpZnQgd2UgYWxyZWFkeSBkaWRcbiAgICAgICAgLy8gYWJvdmUsIDLDlyBvZmZzZXQuIHNjcm9sbFRvQm90dG9tKCkgdGhlbiByZS1lbmFibGVzIHN0aWNreS5cbiAgICAgICAgcy5zY3JvbGxUbyhtYXgpXG4gICAgICAgIHMuc2Nyb2xsVG9Cb3R0b20oKVxuICAgICAgICBvblNjcm9sbD8uKHRydWUsIHMpXG4gICAgICB9LFxuICAgICAgJ3NlbGVjdGlvbjpjb3B5JzogY29weUFuZFRvYXN0LFxuICAgIH0sXG4gICAgeyBjb250ZXh0OiAnU2Nyb2xsJywgaXNBY3RpdmUgfSxcbiAgKVxuXG4gIC8vIHNjcm9sbDpoYWxmUGFnZSovZnVsbFBhZ2UqIGhhdmUgbm8gZGVmYXVsdCBrZXkgYmluZGluZ3Mg4oCUIGN0cmwrdS9kL2IvZlxuICAvLyBhbGwgaGF2ZSByZWFsIG93bmVycyBpbiBub3JtYWwgbW9kZSAoa2lsbC1saW5lL2V4aXQvdGFzazpiYWNrZ3JvdW5kL1xuICAvLyBraWxsLWFnZW50cykuIFRyYW5zY3JpcHQgbW9kZSBnZXRzIHRoZW0gdmlhIHRoZSBpc01vZGFsIHJhdyB1c2VJbnB1dFxuICAvLyBiZWxvdy4gVGhlc2UgaGFuZGxlcnMgc3RheSBmb3IgY3VzdG9tIHJlYmluZHMgb25seS5cbiAgdXNlS2V5YmluZGluZ3MoXG4gICAge1xuICAgICAgJ3Njcm9sbDpoYWxmUGFnZVVwJzogKCkgPT4ge1xuICAgICAgICBjb25zdCBzID0gc2Nyb2xsUmVmLmN1cnJlbnRcbiAgICAgICAgaWYgKCFzKSByZXR1cm5cbiAgICAgICAgY29uc3QgZCA9IC1NYXRoLm1heCgxLCBNYXRoLmZsb29yKHMuZ2V0Vmlld3BvcnRIZWlnaHQoKSAvIDIpKVxuICAgICAgICB0cmFuc2xhdGVTZWxlY3Rpb25Gb3JKdW1wKHMsIGQpXG4gICAgICAgIGNvbnN0IHN0aWNreSA9IGp1bXBCeShzLCBkKVxuICAgICAgICBvblNjcm9sbD8uKHN0aWNreSwgcylcbiAgICAgIH0sXG4gICAgICAnc2Nyb2xsOmhhbGZQYWdlRG93bic6ICgpID0+IHtcbiAgICAgICAgY29uc3QgcyA9IHNjcm9sbFJlZi5jdXJyZW50XG4gICAgICAgIGlmICghcykgcmV0dXJuXG4gICAgICAgIGNvbnN0IGQgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHMuZ2V0Vmlld3BvcnRIZWlnaHQoKSAvIDIpKVxuICAgICAgICB0cmFuc2xhdGVTZWxlY3Rpb25Gb3JKdW1wKHMsIGQpXG4gICAgICAgIGNvbnN0IHN0aWNreSA9IGp1bXBCeShzLCBkKVxuICAgICAgICBvblNjcm9sbD8uKHN0aWNreSwgcylcbiAgICAgIH0sXG4gICAgICAnc2Nyb2xsOmZ1bGxQYWdlVXAnOiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHMgPSBzY3JvbGxSZWYuY3VycmVudFxuICAgICAgICBpZiAoIXMpIHJldHVyblxuICAgICAgICBjb25zdCBkID0gLU1hdGgubWF4KDEsIHMuZ2V0Vmlld3BvcnRIZWlnaHQoKSlcbiAgICAgICAgdHJhbnNsYXRlU2VsZWN0aW9uRm9ySnVtcChzLCBkKVxuICAgICAgICBjb25zdCBzdGlja3kgPSBqdW1wQnkocywgZClcbiAgICAgICAgb25TY3JvbGw/LihzdGlja3ksIHMpXG4gICAgICB9LFxuICAgICAgJ3Njcm9sbDpmdWxsUGFnZURvd24nOiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHMgPSBzY3JvbGxSZWYuY3VycmVudFxuICAgICAgICBpZiAoIXMpIHJldHVyblxuICAgICAgICBjb25zdCBkID0gTWF0aC5tYXgoMSwgcy5nZXRWaWV3cG9ydEhlaWdodCgpKVxuICAgICAgICB0cmFuc2xhdGVTZWxlY3Rpb25Gb3JKdW1wKHMsIGQpXG4gICAgICAgIGNvbnN0IHN0aWNreSA9IGp1bXBCeShzLCBkKVxuICAgICAgICBvblNjcm9sbD8uKHN0aWNreSwgcylcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7IGNvbnRleHQ6ICdTY3JvbGwnLCBpc0FjdGl2ZSB9LFxuICApXG5cbiAgLy8gTW9kYWwgcGFnZXIga2V5cyDigJQgdHJhbnNjcmlwdCBtb2RlIG9ubHkuIGxlc3MvdG11eCBjb3B5LW1vZGUgbGluZWFnZTpcbiAgLy8gY3RybCt1L2QgKGhhbGYtcGFnZSksIGN0cmwrYi9mIChmdWxsLXBhZ2UpLCBnL0cgKHRvcC9ib3R0b20pLiBUb20nc1xuICAvLyByZXNvbHV0aW9uICgyMDI2LTAzLTE1KTogXCJJbiBjdHJsLW8gbW9kZSwgY3RybC11LCBjdHJsLWQsIGV0Yy4gc2hvdWxkXG4gIC8vIHJvdWdobHkganVzdCB3b3JrIVwiIOKAlCB0cmFuc2NyaXB0IGlzIHRoZSBjb3B5LW1vZGUgY29udGFpbmVyLlxuICAvL1xuICAvLyBTYWZlIGJlY2F1c2UgdGhlIGNvbmZsaWN0aW5nIGhhbmRsZXJzIGFyZW4ndCByZWFjaGFibGUgaGVyZTpcbiAgLy8gICBjdHJsK3Ug4oaSIGtpbGwtbGluZSwgY3RybCtkIOKGkiBleGl0OiBQcm9tcHRJbnB1dCBub3QgbW91bnRlZFxuICAvLyAgIGN0cmwrYiDihpIgdGFzazpiYWNrZ3JvdW5kOiBTZXNzaW9uQmFja2dyb3VuZEhpbnQgbm90IG1vdW50ZWRcbiAgLy8gICBjdHJsK2Yg4oaSIGNoYXQ6a2lsbEFnZW50cyBtb3ZlZCB0byBjdHJsK3ggY3RybCtrOyBubyBjb25mbGljdFxuICAvLyAgIGcvRyDihpIgcHJpbnRhYmxlIGNoYXJzOiBubyBwcm9tcHQgdG8gZWF0IHRoZW0sIG5vIHZpbS9zdGlja3kgZ2F0ZSBuZWVkZWRcbiAgLy9cbiAgLy8gVE9ETyhzZWFyY2gpOiBgL2AsIG4vTiDigJQgYnVpbGQgb24gUmljaGFyZCBLaW0ncyBkOTRiMDdhZGQ0IChicmFuY2hcbiAgLy8gY2xhdWRlL2p1bXAtcmVjZW50LW1lc3NhZ2UtQ0VQY3EpLiBnZXRJdGVtWSBZb2dhLXdhbGsgKyBjb21wdXRlT3JpZ2luICtcbiAgLy8gYW5jaG9yWSBhbHJlYWR5IHNvbHZlIHNjcm9sbC10by1pbmRleC4ganVtcFRvUHJldlR1cm4gaXMgdGhlIG4vTlxuICAvLyB0ZW1wbGF0ZS4gU2luZ2xlLXNob3QgdmlhIE9WRVJTQ0FOX1JPV1M9ODA7IHR3by1waGFzZSB3YXMgdHJpZWQgYW5kXG4gIC8vIGFiYW5kb25lZCAo4p2vIG9zY2lsbGF0aW9uKS4gU2VlIHRlYW0gbWVtb3J5IHNjcm9sbC1jb3B5LW1vZGUtZGVzaWduLm1kLlxuICB1c2VJbnB1dChcbiAgICAoaW5wdXQsIGtleSwgZXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHMgPSBzY3JvbGxSZWYuY3VycmVudFxuICAgICAgaWYgKCFzKSByZXR1cm5cbiAgICAgIGNvbnN0IHN0aWNreSA9IGFwcGx5TW9kYWxQYWdlckFjdGlvbihzLCBtb2RhbFBhZ2VyQWN0aW9uKGlucHV0LCBrZXkpLCBkID0+XG4gICAgICAgIHRyYW5zbGF0ZVNlbGVjdGlvbkZvckp1bXAocywgZCksXG4gICAgICApXG4gICAgICBpZiAoc3RpY2t5ID09PSBudWxsKSByZXR1cm5cbiAgICAgIG9uU2Nyb2xsPy4oc3RpY2t5LCBzKVxuICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClcbiAgICB9LFxuICAgIHsgaXNBY3RpdmU6IGlzQWN0aXZlICYmIGlzTW9kYWwgfSxcbiAgKVxuXG4gIC8vIEVzYyBjbGVhcnMgc2VsZWN0aW9uOyBhbnkgb3RoZXIga2V5c3Ryb2tlIGFsc28gY2xlYXJzIGl0IChtYXRjaGVzXG4gIC8vIG5hdGl2ZSB0ZXJtaW5hbCBiZWhhdmlvciB3aGVyZSBzZWxlY3Rpb24gZGlzYXBwZWFycyBvbiBpbnB1dCkuXG4gIC8vIEN0cmwrQyBjb3BpZXMgd2hlbiBhIHNlbGVjdGlvbiBleGlzdHMg4oCUIG5lZWRlZCBvbiBsZWdhY3kgdGVybWluYWxzXG4gIC8vIHdoZXJlIGN0cmwrc2hpZnQrYyBzZW5kcyB0aGUgc2FtZSBieXRlIChcXHgwMywgc2hpZnQgaXMgbG9zdCkgYW5kXG4gIC8vIGNtZCtjIG5ldmVyIHJlYWNoZXMgdGhlIHB0eSAodGVybWluYWwgaW50ZXJjZXB0cyBpdCBmb3IgRWRpdCA+IENvcHkpLlxuICAvLyBIYW5kbGVkIHZpYSByYXcgdXNlSW5wdXQgc28gd2UgY2FuIGNvbmRpdGlvbmFsbHkgY29uc3VtZTogRXNjL0N0cmwrQ1xuICAvLyBvbmx5IHN0b3AgcHJvcGFnYXRpb24gd2hlbiBhIHNlbGVjdGlvbiBleGlzdHMsIGxldHRpbmcgdGhlbSBzdGlsbCB3b3JrXG4gIC8vIGZvciBjYW5jZWwtcmVxdWVzdCAvIGludGVycnVwdCBvdGhlcndpc2UuIE90aGVyIGtleXMgbmV2ZXIgc3RvcFxuICAvLyBwcm9wYWdhdGlvbiDigJQgdGhleSdyZSBvYnNlcnZlZCB0byBjbGVhciBzZWxlY3Rpb24gYXMgYSBzaWRlLWVmZmVjdC5cbiAgLy8gVGhlIHNlbGVjdGlvbjpjb3B5IGtleWJpbmRpbmcgKGN0cmwrc2hpZnQrYyAvIGNtZCtjKSByZWdpc3RlcnMgYWJvdmVcbiAgLy8gdmlhIHVzZUtleWJpbmRpbmdzIGFuZCBjb25zdW1lcyBpdHMgZXZlbnQgYmVmb3JlIHJlYWNoaW5nIGhlcmUuXG4gIHVzZUlucHV0KFxuICAgIChpbnB1dCwga2V5LCBldmVudCkgPT4ge1xuICAgICAgaWYgKCFzZWxlY3Rpb24uaGFzU2VsZWN0aW9uKCkpIHJldHVyblxuICAgICAgaWYgKGtleS5lc2NhcGUpIHtcbiAgICAgICAgc2VsZWN0aW9uLmNsZWFyU2VsZWN0aW9uKClcbiAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAoa2V5LmN0cmwgJiYgIWtleS5zaGlmdCAmJiAha2V5Lm1ldGEgJiYgaW5wdXQgPT09ICdjJykge1xuICAgICAgICBjb3B5QW5kVG9hc3QoKVxuICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IG1vdmUgPSBzZWxlY3Rpb25Gb2N1c01vdmVGb3JLZXkoa2V5KVxuICAgICAgaWYgKG1vdmUpIHtcbiAgICAgICAgc2VsZWN0aW9uLm1vdmVGb2N1cyhtb3ZlKVxuICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRDbGVhclNlbGVjdGlvbk9uS2V5KGtleSkpIHtcbiAgICAgICAgc2VsZWN0aW9uLmNsZWFyU2VsZWN0aW9uKClcbiAgICAgIH1cbiAgICB9LFxuICAgIHsgaXNBY3RpdmUgfSxcbiAgKVxuXG4gIHVzZURyYWdUb1Njcm9sbChzY3JvbGxSZWYsIHNlbGVjdGlvbiwgaXNBY3RpdmUsIG9uU2Nyb2xsKVxuICB1c2VDb3B5T25TZWxlY3Qoc2VsZWN0aW9uLCBpc0FjdGl2ZSwgc2hvd0NvcGllZFRvYXN0KVxuICB1c2VTZWxlY3Rpb25CZ0NvbG9yKHNlbGVjdGlvbilcblxuICByZXR1cm4gbnVsbFxufVxuXG4vKipcbiAqIEF1dG8tc2Nyb2xsIHRoZSBTY3JvbGxCb3ggd2hlbiB0aGUgdXNlciBkcmFncyBhIHNlbGVjdGlvbiBwYXN0IGl0cyB0b3Agb3JcbiAqIGJvdHRvbSBlZGdlLiBUaGUgYW5jaG9yIGlzIHNoaWZ0ZWQgaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvbiBzbyBpdCBzdGF5c1xuICogb24gdGhlIHNhbWUgY29udGVudCAoY29udGVudCB0aGF0IHdhcyBhdCB2aWV3cG9ydCByb3cgTiBpcyBub3cgYXQgcm93IE7CsWRcbiAqIGFmdGVyIHNjcm9sbGluZyBieSBkKS4gRm9jdXMgc3RheXMgYXQgdGhlIG1vdXNlIHBvc2l0aW9uIChlZGdlIHJvdykuXG4gKlxuICogU2VsZWN0aW9uIGNvb3JkcyBhcmUgc2NyZWVuLWJ1ZmZlci1sb2NhbCwgc28gdGhlIGFuY2hvciBpcyBjbGFtcGVkIHRvIHRoZVxuICogdmlld3BvcnQgYm91bmRzIG9uY2UgdGhlIG9yaWdpbmFsIGNvbnRlbnQgc2Nyb2xscyBvdXQuIFRvIHByZXNlcnZlIHRoZSBmdWxsXG4gKiBzZWxlY3Rpb24sIHJvd3MgYWJvdXQgdG8gc2Nyb2xsIG91dCBhcmUgY2FwdHVyZWQgaW50byBzY3JvbGxlZE9mZkFib3ZlL1xuICogc2Nyb2xsZWRPZmZCZWxvdyBiZWZvcmUgZWFjaCBzY3JvbGwgc3RlcCBhbmQgam9pbmVkIGJhY2sgaW4gYnlcbiAqIGdldFNlbGVjdGVkVGV4dC5cbiAqL1xuZnVuY3Rpb24gdXNlRHJhZ1RvU2Nyb2xsKFxuICBzY3JvbGxSZWY6IFJlZk9iamVjdDxTY3JvbGxCb3hIYW5kbGUgfCBudWxsPixcbiAgc2VsZWN0aW9uOiBSZXR1cm5UeXBlPHR5cGVvZiB1c2VTZWxlY3Rpb24+LFxuICBpc0FjdGl2ZTogYm9vbGVhbixcbiAgb25TY3JvbGw6IFByb3BzWydvblNjcm9sbCddLFxuKTogdm9pZCB7XG4gIGNvbnN0IHRpbWVyUmVmID0gdXNlUmVmPE5vZGVKUy5UaW1lb3V0IHwgbnVsbD4obnVsbClcbiAgY29uc3QgZGlyUmVmID0gdXNlUmVmPC0xIHwgMCB8IDE+KDApIC8vIC0xIHNjcm9sbGluZyB1cCwgKzEgZG93biwgMCBpZGxlXG4gIC8vIFN1cnZpdmVzIHN0b3AoKSDigJQgcmVzZXQgb25seSBvbiBkcmFnLWZpbmlzaC4gU2VlIGNoZWNrKCkgZm9yIHNlbWFudGljcy5cbiAgY29uc3QgbGFzdFNjcm9sbGVkRGlyUmVmID0gdXNlUmVmPC0xIHwgMCB8IDE+KDApXG4gIGNvbnN0IHRpY2tzUmVmID0gdXNlUmVmKDApXG4gIC8vIG9uU2Nyb2xsIG1heSBjaGFuZ2UgaWRlbnRpdHkgZXZlcnkgcmVuZGVyIChpZiBub3QgbWVtb2l6ZWQgYnkgY2FsbGVyKS5cbiAgLy8gUmVhZCB0aHJvdWdoIGEgcmVmIHNvIHRoZSBlZmZlY3QgZG9lc24ndCByZS1zdWJzY3JpYmUgYW5kIGtpbGwgdGhlIHRpbWVyXG4gIC8vIG9uIGVhY2ggc2Nyb2xsLWluZHVjZWQgcmUtcmVuZGVyLlxuICBjb25zdCBvblNjcm9sbFJlZiA9IHVzZVJlZihvblNjcm9sbClcbiAgb25TY3JvbGxSZWYuY3VycmVudCA9IG9uU2Nyb2xsXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWlzQWN0aXZlKSByZXR1cm5cblxuICAgIGZ1bmN0aW9uIHN0b3AoKTogdm9pZCB7XG4gICAgICBkaXJSZWYuY3VycmVudCA9IDBcbiAgICAgIGlmICh0aW1lclJlZi5jdXJyZW50KSB7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXJSZWYuY3VycmVudClcbiAgICAgICAgdGltZXJSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0aWNrKCk6IHZvaWQge1xuICAgICAgY29uc3Qgc2VsID0gc2VsZWN0aW9uLmdldFN0YXRlKClcbiAgICAgIGNvbnN0IHMgPSBzY3JvbGxSZWYuY3VycmVudFxuICAgICAgY29uc3QgZGlyID0gZGlyUmVmLmN1cnJlbnRcbiAgICAgIC8vIGRpciA9PT0gMCBkZWZlbmRzIGFnYWluc3QgYSBzdGFsZSBpbnRlcnZhbCAoc3RhcnQoKSBtYXkgaGF2ZSBzZXQgb25lXG4gICAgICAvLyBhZnRlciB0aGUgaW1tZWRpYXRlIHRpY2sgYWxyZWFkeSBjYWxsZWQgc3RvcCgpIGF0IGEgc2Nyb2xsIGJvdW5kYXJ5KS5cbiAgICAgIC8vIHRpY2tzIGNhcCBkZWZlbmRzIGFnYWluc3QgYSBsb3N0IHJlbGVhc2UgZXZlbnQgKG1vdXNlIHJlbGVhc2VkXG4gICAgICAvLyBvdXRzaWRlIHRlcm1pbmFsIHdpbmRvdykgbGVhdmluZyBpc0RyYWdnaW5nIHN0dWNrIHRydWUuXG4gICAgICBpZiAoXG4gICAgICAgICFzZWw/LmlzRHJhZ2dpbmcgfHxcbiAgICAgICAgIXNlbC5mb2N1cyB8fFxuICAgICAgICAhcyB8fFxuICAgICAgICBkaXIgPT09IDAgfHxcbiAgICAgICAgKyt0aWNrc1JlZi5jdXJyZW50ID4gQVVUT1NDUk9MTF9NQVhfVElDS1NcbiAgICAgICkge1xuICAgICAgICBzdG9wKClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICAvLyBzY3JvbGxCeSBhY2N1bXVsYXRlcyBpbnRvIHBlbmRpbmdTY3JvbGxEZWx0YTsgdGhlIHNjcmVlbiBidWZmZXJcbiAgICAgIC8vIGRvZXNuJ3QgdXBkYXRlIHVudGlsIHRoZSBuZXh0IHJlbmRlciBkcmFpbnMgaXQuIElmIGEgcHJldmlvdXNcbiAgICAgIC8vIHRpY2sncyBzY3JvbGwgaGFzbid0IGRyYWluZWQgeWV0LCBjYXB0dXJlU2Nyb2xsZWRSb3dzIHdvdWxkIHJlYWRcbiAgICAgIC8vIHN0YWxlIGNvbnRlbnQgKHNhbWUgcm93cyBhcyBsYXN0IHRpY2sg4oaSIGR1cGxpY2F0ZWQgaW4gdGhlXG4gICAgICAvLyBhY2N1bXVsYXRvciBBTkQgbWlzc2luZyB0aGUgcm93cyB0aGF0IGFjdHVhbGx5IHNjcm9sbGVkIG91dCkuXG4gICAgICAvLyBTa2lwIHRoaXMgdGljazsgdGhlIDUwbXMgaW50ZXJ2YWwgd2lsbCByZXRyeSBhZnRlciBJbmsncyAxNm1zXG4gICAgICAvLyByZW5kZXIgY2F0Y2hlcyB1cC4gQWxzbyBwcmV2ZW50cyBzaGlmdEFuY2hvciBmcm9tIGRlc3luY2luZy5cbiAgICAgIGlmIChzLmdldFBlbmRpbmdEZWx0YSgpICE9PSAwKSByZXR1cm5cbiAgICAgIGNvbnN0IHRvcCA9IHMuZ2V0Vmlld3BvcnRUb3AoKVxuICAgICAgY29uc3QgYm90dG9tID0gdG9wICsgcy5nZXRWaWV3cG9ydEhlaWdodCgpIC0gMVxuICAgICAgLy8gQ2xhbXAgYW5jaG9yIHdpdGhpbiBbdG9wLCBib3R0b21dLiBOb3QgWzAsIGJvdHRvbV06IHRoZSBTY3JvbGxCb3hcbiAgICAgIC8vIHBhZGRpbmcgcm93IGF0IDAgd291bGQgcHJvZHVjZSBhIGJsYW5rIGxpbmUgYmV0d2VlbiBzY3JvbGxlZE9mZkFib3ZlXG4gICAgICAvLyBhbmQgdGhlIG9uLXNjcmVlbiBjb250ZW50IGluIGdldFNlbGVjdGVkVGV4dC4gVGhlIHBhZGRpbmctcm93XG4gICAgICAvLyBoaWdobGlnaHQgd2FzIGEgbWlub3IgdmlzdWFsIG5pY2V0eTsgdGV4dCBjb3JyZWN0bmVzcyB3aW5zLlxuICAgICAgaWYgKGRpciA8IDApIHtcbiAgICAgICAgaWYgKHMuZ2V0U2Nyb2xsVG9wKCkgPD0gMCkge1xuICAgICAgICAgIHN0b3AoKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIC8vIFNjcm9sbGluZyB1cDogY29udGVudCBtb3ZlcyBkb3duIGluIHZpZXdwb3J0LCBzbyBhbmNob3Igcm93ICtOLlxuICAgICAgICAvLyBDbGFtcCB0byBhY3R1YWwgc2Nyb2xsIGRpc3RhbmNlIHNvIGFuY2hvciBzdGF5cyBpbiBzeW5jIHdoZW4gbmVhclxuICAgICAgICAvLyB0aGUgdG9wIGJvdW5kYXJ5IChyZW5kZXJlciBjbGFtcHMgc2Nyb2xsVG9wIHRvIDAgb24gZHJhaW4pLlxuICAgICAgICBjb25zdCBhY3R1YWwgPSBNYXRoLm1pbihBVVRPU0NST0xMX0xJTkVTLCBzLmdldFNjcm9sbFRvcCgpKVxuICAgICAgICAvLyBDYXB0dXJlIHJvd3MgYWJvdXQgdG8gc2Nyb2xsIG91dCB0aGUgQk9UVE9NIGJlZm9yZSBzY3JvbGxCeVxuICAgICAgICAvLyBvdmVyd3JpdGVzIHRoZW0uIE9ubHkgcm93cyBpbnNpZGUgdGhlIHNlbGVjdGlvbiBhcmUgY2FwdHVyZWRcbiAgICAgICAgLy8gKGNhcHR1cmVTY3JvbGxlZFJvd3MgaW50ZXJzZWN0cyB3aXRoIHNlbGVjdGlvbiBib3VuZHMpLlxuICAgICAgICBzZWxlY3Rpb24uY2FwdHVyZVNjcm9sbGVkUm93cyhib3R0b20gLSBhY3R1YWwgKyAxLCBib3R0b20sICdiZWxvdycpXG4gICAgICAgIHNlbGVjdGlvbi5zaGlmdEFuY2hvcihhY3R1YWwsIDAsIGJvdHRvbSlcbiAgICAgICAgcy5zY3JvbGxCeSgtQVVUT1NDUk9MTF9MSU5FUylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG1heCA9IE1hdGgubWF4KDAsIHMuZ2V0U2Nyb2xsSGVpZ2h0KCkgLSBzLmdldFZpZXdwb3J0SGVpZ2h0KCkpXG4gICAgICAgIGlmIChzLmdldFNjcm9sbFRvcCgpID49IG1heCkge1xuICAgICAgICAgIHN0b3AoKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIC8vIFNjcm9sbGluZyBkb3duOiBjb250ZW50IG1vdmVzIHVwIGluIHZpZXdwb3J0LCBzbyBhbmNob3Igcm93IC1OLlxuICAgICAgICAvLyBDbGFtcCB0byBhY3R1YWwgc2Nyb2xsIGRpc3RhbmNlIHNvIGFuY2hvciBzdGF5cyBpbiBzeW5jIHdoZW4gbmVhclxuICAgICAgICAvLyB0aGUgYm90dG9tIGJvdW5kYXJ5IChyZW5kZXJlciBjbGFtcHMgc2Nyb2xsVG9wIHRvIG1heCBvbiBkcmFpbikuXG4gICAgICAgIGNvbnN0IGFjdHVhbCA9IE1hdGgubWluKEFVVE9TQ1JPTExfTElORVMsIG1heCAtIHMuZ2V0U2Nyb2xsVG9wKCkpXG4gICAgICAgIC8vIENhcHR1cmUgcm93cyBhYm91dCB0byBzY3JvbGwgb3V0IHRoZSBUT1AuXG4gICAgICAgIHNlbGVjdGlvbi5jYXB0dXJlU2Nyb2xsZWRSb3dzKHRvcCwgdG9wICsgYWN0dWFsIC0gMSwgJ2Fib3ZlJylcbiAgICAgICAgc2VsZWN0aW9uLnNoaWZ0QW5jaG9yKC1hY3R1YWwsIHRvcCwgYm90dG9tKVxuICAgICAgICBzLnNjcm9sbEJ5KEFVVE9TQ1JPTExfTElORVMpXG4gICAgICB9XG4gICAgICBvblNjcm9sbFJlZi5jdXJyZW50Py4oZmFsc2UsIHMpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3RhcnQoZGlyOiAtMSB8IDEpOiB2b2lkIHtcbiAgICAgIC8vIFJlY29yZCBCRUZPUkUgZWFybHktcmV0dXJuOiB0aGUgZW1wdHktYWNjdW11bGF0b3IgcmVzZXQgaW4gY2hlY2soKVxuICAgICAgLy8gbWF5IGhhdmUgemVyb2VkIHRoaXMgZHVyaW5nIHRoZSBwcmUtY3Jvc3NpbmcgcGhhc2UgKGFjY3VtdWxhdG9yc1xuICAgICAgLy8gZW1wdHkgdW50aWwgdGhlIGFuY2hvciByb3cgZW50ZXJzIHRoZSBjYXB0dXJlIHJhbmdlKS4gUmUtcmVjb3JkXG4gICAgICAvLyBvbiBldmVyeSBjYWxsIHNvIHRoZSBjb3JydXB0aW9uIGlzIGluc3RhbnRseSBoZWFsZWQuXG4gICAgICBsYXN0U2Nyb2xsZWREaXJSZWYuY3VycmVudCA9IGRpclxuICAgICAgaWYgKGRpclJlZi5jdXJyZW50ID09PSBkaXIpIHJldHVybiAvLyBhbHJlYWR5IGdvaW5nIHRoaXMgd2F5XG4gICAgICBzdG9wKClcbiAgICAgIGRpclJlZi5jdXJyZW50ID0gZGlyXG4gICAgICB0aWNrc1JlZi5jdXJyZW50ID0gMFxuICAgICAgdGljaygpXG4gICAgICAvLyB0aWNrKCkgbWF5IGhhdmUgaGl0IGEgc2Nyb2xsIGJvdW5kYXJ5IGFuZCBjYWxsZWQgc3RvcCgpIChkaXIgcmVzZXQgdG9cbiAgICAgIC8vIDApLiBPbmx5IHN0YXJ0IHRoZSBpbnRlcnZhbCBpZiB3ZSdyZSBzdGlsbCBnb2luZyDigJQgb3RoZXJ3aXNlIHRoZVxuICAgICAgLy8gaW50ZXJ2YWwgd291bGQgcnVuIGZvcmV2ZXIgd2l0aCBkaXIgPT09IDAgZG9pbmcgbm90aGluZyB1c2VmdWwuXG4gICAgICBpZiAoZGlyUmVmLmN1cnJlbnQgPT09IGRpcikge1xuICAgICAgICB0aW1lclJlZi5jdXJyZW50ID0gc2V0SW50ZXJ2YWwodGljaywgQVVUT1NDUk9MTF9JTlRFUlZBTF9NUylcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZS1ldmFsdWF0ZWQgb24gZXZlcnkgc2VsZWN0aW9uIGNoYW5nZSAoc3RhcnQvZHJhZy9maW5pc2gvY2xlYXIpLlxuICAgIC8vIERyaXZlcyBkcmFnLXRvLXNjcm9sbCBhdXRvc2Nyb2xsIHdoZW4gdGhlIGRyYWcgbGVhdmVzIHRoZSB2aWV3cG9ydC5cbiAgICAvLyBQcmlvciB2ZXJzaW9ucyBicm9rZSBzdGlja3kgaGVyZSBvbiBkcmFnLXN0YXJ0IHRvIHByZXZlbnQgc2VsZWN0aW9uXG4gICAgLy8gZHJpZnQgZHVyaW5nIHN0cmVhbWluZyDigJQgaW5rLnRzeCBub3cgdHJhbnNsYXRlcyBzZWxlY3Rpb24gY29vcmRzIGJ5XG4gICAgLy8gdGhlIGZvbGxvdyBkZWx0YSBpbnN0ZWFkIChuYXRpdmUgdGVybWluYWwgYmVoYXZpb3I6IHZpZXcga2VlcHNcbiAgICAvLyBzY3JvbGxpbmcsIGhpZ2hsaWdodCB3YWxrcyB1cCB3aXRoIHRoZSB0ZXh0KS4gS2VlcGluZyBzdGlja3kgYWxzb1xuICAgIC8vIGF2b2lkcyB1c2VWaXJ0dWFsU2Nyb2xsJ3MgdGFpbC13YWxrIOKGkiBmb3J3YXJkLXdhbGsgcGhhbnRvbSBncm93dGguXG4gICAgZnVuY3Rpb24gY2hlY2soKTogdm9pZCB7XG4gICAgICBjb25zdCBzID0gc2Nyb2xsUmVmLmN1cnJlbnRcbiAgICAgIGlmICghcykge1xuICAgICAgICBzdG9wKClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBjb25zdCB0b3AgPSBzLmdldFZpZXdwb3J0VG9wKClcbiAgICAgIGNvbnN0IGJvdHRvbSA9IHRvcCArIHMuZ2V0Vmlld3BvcnRIZWlnaHQoKSAtIDFcbiAgICAgIGNvbnN0IHNlbCA9IHNlbGVjdGlvbi5nZXRTdGF0ZSgpXG4gICAgICAvLyBQYXNzIHRoZSBMQVNULXNjcm9sbGVkIGRpcmVjdGlvbiAobm90IGRpclJlZikgc28gdGhlIGFuY2hvciBndWFyZCBpc1xuICAgICAgLy8gYnlwYXNzZWQgYWZ0ZXIgc2hpZnRBbmNob3IgaGFzIGNsYW1wZWQgYW5jaG9yIHRvd2FyZCByb3cgMC4gVXNpbmdcbiAgICAgIC8vIGxhc3RTY3JvbGxlZERpclJlZiAoc3Vydml2ZXMgc3RvcCgpKSBsZXRzIGF1dG9zY3JvbGwgcmVzdW1lIGFmdGVyIGFcbiAgICAgIC8vIGJyaWVmIG1vdXNlIGRpcCBpbnRvIHRoZSB2aWV3cG9ydC4gU2FtZS1kaXJlY3Rpb24gb25seSDigJQgYSBtb3VzZVxuICAgICAgLy8ganVtcCBmcm9tIGJlbG93LWJvdHRvbSB0byBhYm92ZS10b3AgbXVzdCBzdG9wLCBzaW5jZSByZXZlcnNpbmcgd2hpbGVcbiAgICAgIC8vIHRoZSBzY3JvbGxlZE9mZkFib3ZlL0JlbG93IGFjY3VtdWxhdG9ycyBob2xkIHRoZSBwcmlvciBkaXJlY3Rpb24nc1xuICAgICAgLy8gcm93cyB3b3VsZCBkdXBsaWNhdGUgdGV4dCBpbiBnZXRTZWxlY3RlZFRleHQuIFJlc2V0IG9uIGRyYWctZmluaXNoXG4gICAgICAvLyBPUiB3aGVuIGJvdGggYWNjdW11bGF0b3JzIGFyZSBlbXB0eTogc3RhcnRTZWxlY3Rpb24gY2xlYXJzIHRoZW1cbiAgICAgIC8vIChzZWxlY3Rpb24udHMpLCBzbyBhIG5ldyBkcmFnIGFmdGVyIGEgbG9zdC1yZWxlYXNlIChpc0RyYWdnaW5nXG4gICAgICAvLyBzdHVjayB0cnVlLCB0aGUgcmVhc29uIEFVVE9TQ1JPTExfTUFYX1RJQ0tTIGV4aXN0cykgc3RpbGwgcmVzZXRzLlxuICAgICAgLy8gU2FmZTogc3RhcnQoKSBiZWxvdyByZS1yZWNvcmRzIGxhc3RTY3JvbGxlZERpclJlZiBiZWZvcmUgaXRzXG4gICAgICAvLyBlYXJseS1yZXR1cm4sIHNvIGEgbWlkLXNjcm9sbCByZXNldCBoZXJlIGlzIGluc3RhbnRseSB1bmRvbmUuXG4gICAgICBpZiAoXG4gICAgICAgICFzZWw/LmlzRHJhZ2dpbmcgfHxcbiAgICAgICAgKHNlbC5zY3JvbGxlZE9mZkFib3ZlLmxlbmd0aCA9PT0gMCAmJiBzZWwuc2Nyb2xsZWRPZmZCZWxvdy5sZW5ndGggPT09IDApXG4gICAgICApIHtcbiAgICAgICAgbGFzdFNjcm9sbGVkRGlyUmVmLmN1cnJlbnQgPSAwXG4gICAgICB9XG4gICAgICBjb25zdCBkaXIgPSBkcmFnU2Nyb2xsRGlyZWN0aW9uKFxuICAgICAgICBzZWwsXG4gICAgICAgIHRvcCxcbiAgICAgICAgYm90dG9tLFxuICAgICAgICBsYXN0U2Nyb2xsZWREaXJSZWYuY3VycmVudCxcbiAgICAgIClcbiAgICAgIGlmIChkaXIgPT09IDApIHtcbiAgICAgICAgLy8gQmxvY2tlZCByZXZlcnNhbDogZm9jdXMganVtcGVkIHRvIHRoZSBvcHBvc2l0ZSBlZGdlIChvZmYtd2luZG93XG4gICAgICAgIC8vIGRyYWcgcmV0dXJuLCBmYXN0IGZsaWNrKS4gaGFuZGxlU2VsZWN0aW9uRHJhZyBhbHJlYWR5IG1vdmVkIGZvY3VzXG4gICAgICAgIC8vIHBhc3QgdGhlIGFuY2hvciwgZmxpcHBpbmcgc2VsZWN0aW9uQm91bmRzIOKAlCB0aGUgYWNjdW11bGF0b3IgaXNcbiAgICAgICAgLy8gbm93IG9ycGhhbmVkIChob2xkcyByb3dzIG9uIHRoZSB3cm9uZyBzaWRlKS4gQ2xlYXIgaXQgc29cbiAgICAgICAgLy8gZ2V0U2VsZWN0ZWRUZXh0IG1hdGNoZXMgdGhlIHZpc2libGUgaGlnaGxpZ2h0LlxuICAgICAgICBpZiAobGFzdFNjcm9sbGVkRGlyUmVmLmN1cnJlbnQgIT09IDAgJiYgc2VsPy5mb2N1cykge1xuICAgICAgICAgIGNvbnN0IHdhbnQgPSBzZWwuZm9jdXMucm93IDwgdG9wID8gLTEgOiBzZWwuZm9jdXMucm93ID4gYm90dG9tID8gMSA6IDBcbiAgICAgICAgICBpZiAod2FudCAhPT0gMCAmJiB3YW50ICE9PSBsYXN0U2Nyb2xsZWREaXJSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgc2VsLnNjcm9sbGVkT2ZmQWJvdmUgPSBbXVxuICAgICAgICAgICAgc2VsLnNjcm9sbGVkT2ZmQmVsb3cgPSBbXVxuICAgICAgICAgICAgc2VsLnNjcm9sbGVkT2ZmQWJvdmVTVyA9IFtdXG4gICAgICAgICAgICBzZWwuc2Nyb2xsZWRPZmZCZWxvd1NXID0gW11cbiAgICAgICAgICAgIGxhc3RTY3JvbGxlZERpclJlZi5jdXJyZW50ID0gMFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdG9wKClcbiAgICAgIH0gZWxzZSBzdGFydChkaXIpXG4gICAgfVxuXG4gICAgY29uc3QgdW5zdWJzY3JpYmUgPSBzZWxlY3Rpb24uc3Vic2NyaWJlKGNoZWNrKVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB1bnN1YnNjcmliZSgpXG4gICAgICBzdG9wKClcbiAgICAgIGxhc3RTY3JvbGxlZERpclJlZi5jdXJyZW50ID0gMFxuICAgIH1cbiAgfSwgW2lzQWN0aXZlLCBzY3JvbGxSZWYsIHNlbGVjdGlvbl0pXG59XG5cbi8qKlxuICogQ29tcHV0ZSBhdXRvc2Nyb2xsIGRpcmVjdGlvbiBmb3IgYSBkcmFnIHNlbGVjdGlvbiByZWxhdGl2ZSB0byB0aGUgU2Nyb2xsQm94XG4gKiB2aWV3cG9ydC4gUmV0dXJucyAwIHdoZW4gbm90IGRyYWdnaW5nLCBhbmNob3IvZm9jdXMgbWlzc2luZywgb3IgdGhlIGFuY2hvclxuICogaXMgb3V0c2lkZSB0aGUgdmlld3BvcnQg4oCUIGEgbXVsdGktY2xpY2sgb3IgZHJhZyB0aGF0IHN0YXJ0ZWQgaW4gdGhlIGlucHV0XG4gKiBhcmVhIG11c3Qgbm90IGNvbW1hbmRlZXIgdGhlIG1lc3NhZ2Ugc2Nyb2xsIChkb3VibGUtY2xpY2sgaW4gdGhlIGlucHV0IGFyZWFcbiAqIHdoaWxlIHNjcm9sbGVkIHVwIHByZXZpb3VzbHkgY29ycnVwdGVkIHRoZSBhbmNob3IgdmlhIHNoaWZ0QW5jaG9yIGFuZFxuICogc3B1cmlvdXNseSBzY3JvbGxlZCB0aGUgbWVzc2FnZSBoaXN0b3J5IGV2ZXJ5IDUwbXMgdW50aWwgcmVsZWFzZSkuXG4gKlxuICogYWxyZWFkeVNjcm9sbGluZ0RpciBieXBhc3NlcyB0aGUgYW5jaG9yLWluLXZpZXdwb3J0IGd1YXJkIG9uY2UgYXV0b3Njcm9sbFxuICogaXMgYWN0aXZlIChzaGlmdEFuY2hvciBsZWdpdGltYXRlbHkgY2xhbXBzIHRoZSBhbmNob3IgdG93YXJkIHJvdyAwLCBiZWxvd1xuICogYHRvcGApIGJ1dCBvbmx5IGFsbG93cyBTQU1FLWRpcmVjdGlvbiBjb250aW51YXRpb24uIElmIHRoZSBmb2N1cyBqdW1wcyB0b1xuICogdGhlIG9wcG9zaXRlIGVkZ2UgKGJlbG934oaSYWJvdmUgb3IgYWJvdmXihpJiZWxvdyDigJQgcG9zc2libGUgd2l0aCBhIGZhc3QgZmxpY2tcbiAqIG9yIG9mZi13aW5kb3cgZHJhZyBzaW5jZSBtb2RlIDEwMDIgcmVwb3J0cyBvbiBjZWxsIGNoYW5nZSwgbm90IHBlciBjZWxsKSxcbiAqIHJldHVybnMgMCB0byBzdG9wIOKAlCByZXZlcnNpbmcgd2l0aG91dCBjbGVhcmluZyBzY3JvbGxlZE9mZkFib3ZlL0JlbG93XG4gKiB3b3VsZCBkdXBsaWNhdGUgY2FwdHVyZWQgcm93cyB3aGVuIHRoZXkgc2Nyb2xsIGJhY2sgb24tc2NyZWVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZHJhZ1Njcm9sbERpcmVjdGlvbihcbiAgc2VsOiBTZWxlY3Rpb25TdGF0ZSB8IG51bGwsXG4gIHRvcDogbnVtYmVyLFxuICBib3R0b206IG51bWJlcixcbiAgYWxyZWFkeVNjcm9sbGluZ0RpcjogLTEgfCAwIHwgMSA9IDAsXG4pOiAtMSB8IDAgfCAxIHtcbiAgaWYgKCFzZWw/LmlzRHJhZ2dpbmcgfHwgIXNlbC5hbmNob3IgfHwgIXNlbC5mb2N1cykgcmV0dXJuIDBcbiAgY29uc3Qgcm93ID0gc2VsLmZvY3VzLnJvd1xuICBjb25zdCB3YW50OiAtMSB8IDAgfCAxID0gcm93IDwgdG9wID8gLTEgOiByb3cgPiBib3R0b20gPyAxIDogMFxuICBpZiAoYWxyZWFkeVNjcm9sbGluZ0RpciAhPT0gMCkge1xuICAgIC8vIFNhbWUtZGlyZWN0aW9uIG9ubHkuIEZvY3VzIG9uIHRoZSBvcHBvc2l0ZSBzaWRlLCBvciBiYWNrIGluc2lkZSB0aGVcbiAgICAvLyB2aWV3cG9ydCwgc3RvcHMgdGhlIHNjcm9sbCDigJQgY2FwdHVyZWQgcm93cyBzdGF5IGluIHNjcm9sbGVkT2ZmQWJvdmUvXG4gICAgLy8gQmVsb3cgYnV0IG5ldmVyIHNjcm9sbCBiYWNrIG9uLXNjcmVlbiwgc28gZ2V0U2VsZWN0ZWRUZXh0IGlzIGNvcnJlY3QuXG4gICAgcmV0dXJuIHdhbnQgPT09IGFscmVhZHlTY3JvbGxpbmdEaXIgPyB3YW50IDogMFxuICB9XG4gIC8vIEFuY2hvciBtdXN0IGJlIGluc2lkZSB0aGUgdmlld3BvcnQgZm9yIHVzIHRvIG93biB0aGlzIGRyYWcuIElmIHRoZVxuICAvLyB1c2VyIHN0YXJ0ZWQgc2VsZWN0aW5nIGluIHRoZSBpbnB1dCBib3ggb3IgaGVhZGVyLCBhdXRvc2Nyb2xsaW5nIHRoZVxuICAvLyBtZXNzYWdlIGhpc3RvcnkgaXMgc3VycHJpc2luZyBhbmQgY29ycnVwdHMgdGhlIGFuY2hvciB2aWEgc2hpZnRBbmNob3IuXG4gIGlmIChzZWwuYW5jaG9yLnJvdyA8IHRvcCB8fCBzZWwuYW5jaG9yLnJvdyA+IGJvdHRvbSkgcmV0dXJuIDBcbiAgcmV0dXJuIHdhbnRcbn1cblxuLy8gS2V5Ym9hcmQgcGFnZSBqdW1wczogc2Nyb2xsVG8oKSB3cml0ZXMgc2Nyb2xsVG9wIGRpcmVjdGx5IGFuZCBjbGVhcnNcbi8vIHBlbmRpbmdTY3JvbGxEZWx0YSDigJQgb25lIGZyYW1lLCBubyBkcmFpbi4gc2Nyb2xsQnkoKSBhY2N1bXVsYXRlcyBpbnRvXG4vLyBwZW5kaW5nU2Nyb2xsRGVsdGEgd2hpY2ggdGhlIHJlbmRlcmVyIGRyYWlucyBvdmVyIHNldmVyYWwgZnJhbWVzXG4vLyAocmVuZGVyLW5vZGUtdG8tb3V0cHV0LnRzIGRyYWluUHJvcG9ydGlvbmFsL2RyYWluQWRhcHRpdmUpIOKAlCBjb3JyZWN0IGZvclxuLy8gd2hlZWwgc21vb3RobmVzcywgd3JvbmcgZm9yIFBnVXAvY3RybCt1IHdoZXJlIHRoZSB1c2VyIGV4cGVjdHMgYSBzbmFwLlxuLy8gVGFyZ2V0IGlzIHJlbGF0aXZlIHRvIHNjcm9sbFRvcCtwZW5kaW5nRGVsdGEgc28gYSBqdW1wIG1pZC13aGVlbC1idXJzdFxuLy8gbGFuZHMgd2hlcmUgdGhlIHdoZWVsIHdhcyBoZWFkaW5nLlxuZXhwb3J0IGZ1bmN0aW9uIGp1bXBCeShzOiBTY3JvbGxCb3hIYW5kbGUsIGRlbHRhOiBudW1iZXIpOiBib29sZWFuIHtcbiAgY29uc3QgbWF4ID0gTWF0aC5tYXgoMCwgcy5nZXRTY3JvbGxIZWlnaHQoKSAtIHMuZ2V0Vmlld3BvcnRIZWlnaHQoKSlcbiAgY29uc3QgdGFyZ2V0ID0gcy5nZXRTY3JvbGxUb3AoKSArIHMuZ2V0UGVuZGluZ0RlbHRhKCkgKyBkZWx0YVxuICBpZiAodGFyZ2V0ID49IG1heCkge1xuICAgIC8vIEVhZ2VyLXdyaXRlIHNjcm9sbFRvcCBzbyBmb2xsb3ctc2Nyb2xsIHNlZXMgZm9sbG93RGVsdGE9MC4gQ2FsbGVyc1xuICAgIC8vIHRoYXQgcmFuIHRyYW5zbGF0ZVNlbGVjdGlvbkZvckp1bXAgYWxyZWFkeSBzaGlmdGVkOyBzY3JvbGxUb0JvdHRvbSgpXG4gICAgLy8gYWxvbmUgd291bGQgZG91YmxlLXNoaWZ0IHZpYSB0aGUgcmVuZGVyLXBoYXNlIHN0aWNreSBmb2xsb3cuXG4gICAgcy5zY3JvbGxUbyhtYXgpXG4gICAgcy5zY3JvbGxUb0JvdHRvbSgpXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICBzLnNjcm9sbFRvKE1hdGgubWF4KDAsIHRhcmdldCkpXG4gIHJldHVybiBmYWxzZVxufVxuXG4vLyBXaGVlbC1kb3duIHBhc3QgbWF4U2Nyb2xsIHJlLWVuYWJsZXMgc3RpY2t5IHNvIHdoZWVsaW5nIGF0IHRoZSBib3R0b21cbi8vIG5hdHVyYWxseSByZS1waW5zIChtYXRjaGVzIHR5cGljYWwgY2hhdC1hcHAgYmVoYXZpb3IpLiBSZXR1cm5zIHRoZVxuLy8gcmVzdWx0aW5nIHN0aWNreSBzdGF0ZSBzbyBjYWxsZXJzIGNhbiBwcm9wYWdhdGUgaXQuXG5mdW5jdGlvbiBzY3JvbGxEb3duKHM6IFNjcm9sbEJveEhhbmRsZSwgYW1vdW50OiBudW1iZXIpOiBib29sZWFuIHtcbiAgY29uc3QgbWF4ID0gTWF0aC5tYXgoMCwgcy5nZXRTY3JvbGxIZWlnaHQoKSAtIHMuZ2V0Vmlld3BvcnRIZWlnaHQoKSlcbiAgLy8gSW5jbHVkZSBwZW5kaW5nRGVsdGE6IHNjcm9sbEJ5IGFjY3VtdWxhdGVzIGludG8gcGVuZGluZ1Njcm9sbERlbHRhXG4gIC8vIHdpdGhvdXQgdXBkYXRpbmcgc2Nyb2xsVG9wLCBzbyBnZXRTY3JvbGxUb3AoKSBhbG9uZSBpcyBzdGFsZSB3aXRoaW5cbiAgLy8gYSBiYXRjaCBvZiB3aGVlbCBldmVudHMuIFdpdGhvdXQgdGhpcywgd2hlZWxpbmcgdG8gdGhlIGJvdHRvbSBuZXZlclxuICAvLyByZS1lbmFibGVzIHN0aWNreSBzY3JvbGwuXG4gIGNvbnN0IGVmZmVjdGl2ZVRvcCA9IHMuZ2V0U2Nyb2xsVG9wKCkgKyBzLmdldFBlbmRpbmdEZWx0YSgpXG4gIGlmIChlZmZlY3RpdmVUb3AgKyBhbW91bnQgPj0gbWF4KSB7XG4gICAgcy5zY3JvbGxUb0JvdHRvbSgpXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICBzLnNjcm9sbEJ5KGFtb3VudClcbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8vIFdoZWVsLXVwIHBhc3Qgc2Nyb2xsVG9wPTAgY2xhbXBzIHZpYSBzY3JvbGxUbygwKSwgY2xlYXJpbmdcbi8vIHBlbmRpbmdTY3JvbGxEZWx0YSBzbyBhZ2dyZXNzaXZlIHdoZWVsIGJ1cnN0cyAoZS5nLiBNWCBNYXN0ZXIgZnJlZS1zcGluKVxuLy8gZG9uJ3QgYWNjdW11bGF0ZSBhbiB1bmJvdW5kZWQgbmVnYXRpdmUgZGVsdGEuIFdpdGhvdXQgdGhpcyBjbGFtcCxcbi8vIHVzZVZpcnR1YWxTY3JvbGwncyBbZWZmTG8sIGVmZkhpXSBzcGFuIGdyb3dzIHBhc3Qgd2hhdCBNQVhfTU9VTlRFRF9JVEVNU1xuLy8gY2FuIGNvdmVyIGFuZCBpbnRlcm1lZGlhdGUgZHJhaW4gZnJhbWVzIHJlbmRlciBhdCBzY3JvbGxUb3BzIHdpdGggbm9cbi8vIG1vdW50ZWQgY2hpbGRyZW4g4oCUIGJsYW5rIHZpZXdwb3J0LlxuZXhwb3J0IGZ1bmN0aW9uIHNjcm9sbFVwKHM6IFNjcm9sbEJveEhhbmRsZSwgYW1vdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgLy8gSW5jbHVkZSBwZW5kaW5nRGVsdGE6IHNjcm9sbEJ5IGFjY3VtdWxhdGVzIHdpdGhvdXQgdXBkYXRpbmcgc2Nyb2xsVG9wLFxuICAvLyBzbyBnZXRTY3JvbGxUb3AoKSBhbG9uZSBpcyBzdGFsZSB3aXRoaW4gYSBiYXRjaCBvZiB3aGVlbCBldmVudHMuXG4gIGNvbnN0IGVmZmVjdGl2ZVRvcCA9IHMuZ2V0U2Nyb2xsVG9wKCkgKyBzLmdldFBlbmRpbmdEZWx0YSgpXG4gIGlmIChlZmZlY3RpdmVUb3AgLSBhbW91bnQgPD0gMCkge1xuICAgIHMuc2Nyb2xsVG8oMClcbiAgICByZXR1cm5cbiAgfVxuICBzLnNjcm9sbEJ5KC1hbW91bnQpXG59XG5cbmV4cG9ydCB0eXBlIE1vZGFsUGFnZXJBY3Rpb24gPVxuICB8ICdsaW5lVXAnXG4gIHwgJ2xpbmVEb3duJ1xuICB8ICdoYWxmUGFnZVVwJ1xuICB8ICdoYWxmUGFnZURvd24nXG4gIHwgJ2Z1bGxQYWdlVXAnXG4gIHwgJ2Z1bGxQYWdlRG93bidcbiAgfCAndG9wJ1xuICB8ICdib3R0b20nXG5cbi8qKlxuICogTWFwcyBhIGtleXN0cm9rZSB0byBhIG1vZGFsIHBhZ2VyIGFjdGlvbi4gRXhwb3J0ZWQgZm9yIHRlc3RpbmcuXG4gKiBSZXR1cm5zIG51bGwgZm9yIGtleXMgdGhlIG1vZGFsIHBhZ2VyIGRvZXNuJ3QgaGFuZGxlICh0aGV5IGZhbGwgdGhyb3VnaCkuXG4gKlxuICogY3RybCt1L2QvYi9mIGFyZSB0aGUgbGVzcy1saW5lYWdlIGJpbmRpbmdzLiBnL0cgYXJlIGJhcmUgbGV0dGVycyAob25seVxuICogc2FmZSB3aGVuIG5vIHByb21wdCBpcyBtb3VudGVkKS4gRyBhcnJpdmVzIGFzIGlucHV0PSdHJyBzaGlmdD1mYWxzZSBvblxuICogbGVnYWN5IHRlcm1pbmFscywgb3IgaW5wdXQ9J2cnIHNoaWZ0PXRydWUgb24ga2l0dHktcHJvdG9jb2wgdGVybWluYWxzLlxuICogTG93ZXJjYXNlIGcgbmVlZHMgdGhlICFzaGlmdCBndWFyZCBzbyBpdCBkb2Vzbid0IGFsc28gbWF0Y2gga2l0dHktRy5cbiAqXG4gKiBLZXktcmVwZWF0OiBzdGRpbiBjb2FsZXNjZXMgaGVsZC1kb3duIHByaW50YWJsZXMgaW50byBvbmUgbXVsdGktY2hhclxuICogc3RyaW5nIChlLmcuICdnZ2cnKS4gT25seSB1bmlmb3JtLWNoYXIgYmF0Y2hlcyBhcmUgaGFuZGxlZCDigJQgbWl4ZWQgaW5wdXRcbiAqIGxpa2UgJ2dHJyBpc24ndCBrZXktcmVwZWF0LiBnL0cgYXJlIGlkZW1wb3RlbnQgYWJzb2x1dGUganVtcHMsIHNvIHRoZVxuICogY291bnQgaXMgaXJyZWxldmFudCAoY29uc3VtaW5nIHRoZSBiYXRjaCBqdXN0IHByZXZlbnRzIGl0IGZyb20gbGVha2luZ1xuICogdG8gdGhlIHNlbGVjdGlvbi1jbGVhci1vbi1wcmludGFibGUgaGFuZGxlcikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RhbFBhZ2VyQWN0aW9uKFxuICBpbnB1dDogc3RyaW5nLFxuICBrZXk6IFBpY2s8XG4gICAgS2V5LFxuICAgICdjdHJsJyB8ICdtZXRhJyB8ICdzaGlmdCcgfCAndXBBcnJvdycgfCAnZG93bkFycm93JyB8ICdob21lJyB8ICdlbmQnXG4gID4sXG4pOiBNb2RhbFBhZ2VyQWN0aW9uIHwgbnVsbCB7XG4gIGlmIChrZXkubWV0YSkgcmV0dXJuIG51bGxcbiAgLy8gU3BlY2lhbCBrZXlzIGZpcnN0IOKAlCBhcnJvd3MvaG9tZS9lbmQgYXJyaXZlIHdpdGggZW1wdHkgb3IganVuayBpbnB1dCxcbiAgLy8gc28gdGhlc2UgbXVzdCBiZSBjaGVja2VkIGJlZm9yZSBhbnkgaW5wdXQtc3RyaW5nIGxvZ2ljLiBzaGlmdCBpc1xuICAvLyByZXNlcnZlZCBmb3Igc2VsZWN0aW9uLWV4dGVuZCAoc2VsZWN0aW9uRm9jdXNNb3ZlRm9yS2V5KTsgY3RybCtob21lL2VuZFxuICAvLyBhbHJlYWR5IGhhcyBhIHVzZUtleWJpbmRpbmdzIHJvdXRlIHRvIHNjcm9sbDp0b3AvYm90dG9tLlxuICBpZiAoIWtleS5jdHJsICYmICFrZXkuc2hpZnQpIHtcbiAgICBpZiAoa2V5LnVwQXJyb3cpIHJldHVybiAnbGluZVVwJ1xuICAgIGlmIChrZXkuZG93bkFycm93KSByZXR1cm4gJ2xpbmVEb3duJ1xuICAgIGlmIChrZXkuaG9tZSkgcmV0dXJuICd0b3AnXG4gICAgaWYgKGtleS5lbmQpIHJldHVybiAnYm90dG9tJ1xuICB9XG4gIGlmIChrZXkuY3RybCkge1xuICAgIGlmIChrZXkuc2hpZnQpIHJldHVybiBudWxsXG4gICAgc3dpdGNoIChpbnB1dCkge1xuICAgICAgY2FzZSAndSc6XG4gICAgICAgIHJldHVybiAnaGFsZlBhZ2VVcCdcbiAgICAgIGNhc2UgJ2QnOlxuICAgICAgICByZXR1cm4gJ2hhbGZQYWdlRG93bidcbiAgICAgIGNhc2UgJ2InOlxuICAgICAgICByZXR1cm4gJ2Z1bGxQYWdlVXAnXG4gICAgICBjYXNlICdmJzpcbiAgICAgICAgcmV0dXJuICdmdWxsUGFnZURvd24nXG4gICAgICAvLyBlbWFjcy1zdHlsZSBsaW5lIHNjcm9sbCAobGVzcyBhY2NlcHRzIGJvdGggY3RybCtuL3AgYW5kIGN0cmwrZS95KS5cbiAgICAgIC8vIFdvcmtzIGR1cmluZyBzZWFyY2ggbmF2IOKAlCBmaW5lLWFkanVzdCBhZnRlciBhIGp1bXAgd2l0aG91dFxuICAgICAgLy8gbGVhdmluZyBtb2RhbC4gTm8gIXNlYXJjaE9wZW4gZ2F0ZSBvbiB0aGlzIHVzZUlucHV0J3MgaXNBY3RpdmUuXG4gICAgICBjYXNlICduJzpcbiAgICAgICAgcmV0dXJuICdsaW5lRG93bidcbiAgICAgIGNhc2UgJ3AnOlxuICAgICAgICByZXR1cm4gJ2xpbmVVcCdcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG4gIC8vIEJhcmUgbGV0dGVycy4gS2V5LXJlcGVhdCBiYXRjaGVzOiBvbmx5IGFjdCBvbiB1bmlmb3JtIHJ1bnMuXG4gIGNvbnN0IGMgPSBpbnB1dFswXVxuICBpZiAoIWMgfHwgaW5wdXQgIT09IGMucmVwZWF0KGlucHV0Lmxlbmd0aCkpIHJldHVybiBudWxsXG4gIC8vIGtpdHR5IHNlbmRzIEcgYXMgaW5wdXQ9J2cnIHNoaWZ0PXRydWU7IGxlZ2FjeSBhcyAnRycgc2hpZnQ9ZmFsc2UuXG4gIC8vIENoZWNrIEJFRk9SRSB0aGUgc2hpZnQtZ2F0ZSBzbyBib3RoIGhpdCAnYm90dG9tJy5cbiAgaWYgKGMgPT09ICdHJyB8fCAoYyA9PT0gJ2cnICYmIGtleS5zaGlmdCkpIHJldHVybiAnYm90dG9tJ1xuICBpZiAoa2V5LnNoaWZ0KSByZXR1cm4gbnVsbFxuICBzd2l0Y2ggKGMpIHtcbiAgICBjYXNlICdnJzpcbiAgICAgIHJldHVybiAndG9wJ1xuICAgIC8vIGovayByZS1hZGRlZCBwZXIgVG9tIE1hciAxOCDigJQgcmV2ZXJzYWwgb2YgTWFyIDE2IHJlbW92YWwuIFdvcmtzXG4gICAgLy8gZHVyaW5nIHNlYXJjaCBuYXYgKGZpbmUtYWRqdXN0IGFmdGVyIG4vTiBsYW5kcykgc2luY2UgaXNNb2RhbCBpc1xuICAgIC8vIGluZGVwZW5kZW50IG9mIHNlYXJjaE9wZW4uXG4gICAgY2FzZSAnaic6XG4gICAgICByZXR1cm4gJ2xpbmVEb3duJ1xuICAgIGNhc2UgJ2snOlxuICAgICAgcmV0dXJuICdsaW5lVXAnXG4gICAgLy8gbGVzczogc3BhY2UgPSBwYWdlIGRvd24sIGIgPSBwYWdlIHVwLiBjdHJsK2IgYWxyZWFkeSBtYXBzIGFib3ZlO1xuICAgIC8vIGJhcmUgYiBpcyB0aGUgbGVzcy1uYXRpdmUgdmVyc2lvbi5cbiAgICBjYXNlICcgJzpcbiAgICAgIHJldHVybiAnZnVsbFBhZ2VEb3duJ1xuICAgIGNhc2UgJ2InOlxuICAgICAgcmV0dXJuICdmdWxsUGFnZVVwJ1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbFxuICB9XG59XG5cbi8qKlxuICogQXBwbGllcyBhIG1vZGFsIHBhZ2VyIGFjdGlvbiB0byBhIFNjcm9sbEJveC4gUmV0dXJucyB0aGUgcmVzdWx0aW5nIHN0aWNreVxuICogc3RhdGUsIG9yIG51bGwgaWYgdGhlIGFjdGlvbiB3YXMgbnVsbCAobm90aGluZyB0byBkbyDigJQgY2FsbGVyIHNob3VsZCBmYWxsXG4gKiB0aHJvdWdoKS4gQ2FsbHMgb25CZWZvcmVKdW1wKGRlbHRhKSBiZWZvcmUgc2Nyb2xsaW5nIHNvIHRoZSBjYWxsZXIgY2FuXG4gKiB0cmFuc2xhdGUgdGhlIHRleHQgc2VsZWN0aW9uIGJ5IHRoZSBzY3JvbGwgZGVsdGEgKGNhcHR1cmUgb3V0Z29pbmcgcm93cyxcbiAqIHNoaWZ0IGFuY2hvcitmb2N1cykgaW5zdGVhZCBvZiBjbGVhcmluZyBpdC4gRXhwb3J0ZWQgZm9yIHRlc3RpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseU1vZGFsUGFnZXJBY3Rpb24oXG4gIHM6IFNjcm9sbEJveEhhbmRsZSxcbiAgYWN0OiBNb2RhbFBhZ2VyQWN0aW9uIHwgbnVsbCxcbiAgb25CZWZvcmVKdW1wOiAoZGVsdGE6IG51bWJlcikgPT4gdm9pZCxcbik6IGJvb2xlYW4gfCBudWxsIHtcbiAgc3dpdGNoIChhY3QpIHtcbiAgICBjYXNlIG51bGw6XG4gICAgICByZXR1cm4gbnVsbFxuICAgIGNhc2UgJ2xpbmVVcCc6XG4gICAgY2FzZSAnbGluZURvd24nOiB7XG4gICAgICBjb25zdCBkID0gYWN0ID09PSAnbGluZURvd24nID8gMSA6IC0xXG4gICAgICBvbkJlZm9yZUp1bXAoZClcbiAgICAgIHJldHVybiBqdW1wQnkocywgZClcbiAgICB9XG4gICAgY2FzZSAnaGFsZlBhZ2VVcCc6XG4gICAgY2FzZSAnaGFsZlBhZ2VEb3duJzoge1xuICAgICAgY29uc3QgaGFsZiA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3Iocy5nZXRWaWV3cG9ydEhlaWdodCgpIC8gMikpXG4gICAgICBjb25zdCBkID0gYWN0ID09PSAnaGFsZlBhZ2VEb3duJyA/IGhhbGYgOiAtaGFsZlxuICAgICAgb25CZWZvcmVKdW1wKGQpXG4gICAgICByZXR1cm4ganVtcEJ5KHMsIGQpXG4gICAgfVxuICAgIGNhc2UgJ2Z1bGxQYWdlVXAnOlxuICAgIGNhc2UgJ2Z1bGxQYWdlRG93bic6IHtcbiAgICAgIGNvbnN0IHBhZ2UgPSBNYXRoLm1heCgxLCBzLmdldFZpZXdwb3J0SGVpZ2h0KCkpXG4gICAgICBjb25zdCBkID0gYWN0ID09PSAnZnVsbFBhZ2VEb3duJyA/IHBhZ2UgOiAtcGFnZVxuICAgICAgb25CZWZvcmVKdW1wKGQpXG4gICAgICByZXR1cm4ganVtcEJ5KHMsIGQpXG4gICAgfVxuICAgIGNhc2UgJ3RvcCc6XG4gICAgICBvbkJlZm9yZUp1bXAoLShzLmdldFNjcm9sbFRvcCgpICsgcy5nZXRQZW5kaW5nRGVsdGEoKSkpXG4gICAgICBzLnNjcm9sbFRvKDApXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICBjYXNlICdib3R0b20nOiB7XG4gICAgICBjb25zdCBtYXggPSBNYXRoLm1heCgwLCBzLmdldFNjcm9sbEhlaWdodCgpIC0gcy5nZXRWaWV3cG9ydEhlaWdodCgpKVxuICAgICAgb25CZWZvcmVKdW1wKG1heCAtIChzLmdldFNjcm9sbFRvcCgpICsgcy5nZXRQZW5kaW5nRGVsdGEoKSkpXG4gICAgICAvLyBFYWdlci13cml0ZSBzY3JvbGxUb3AgYmVmb3JlIHNjcm9sbFRvQm90dG9tIOKAlCBzYW1lIGRvdWJsZS1zaGlmdFxuICAgICAgLy8gZml4IGFzIHNjcm9sbDpib3R0b20gYW5kIGp1bXBCeSdzIG1heCBicmFuY2guXG4gICAgICBzLnNjcm9sbFRvKG1heClcbiAgICAgIHMuc2Nyb2xsVG9Cb3R0b20oKVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsS0FBSyxJQUFJLEtBQUtDLFNBQVMs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
|