source dump of claude code
at main 185 lines 25 kB view raw
1import { c as _c } from "react/compiler-runtime"; 2import type { ToolResultBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'; 3import * as React from 'react'; 4import { KeyboardShortcutHint } from '../../components/design-system/KeyboardShortcutHint.js'; 5import { FallbackToolUseErrorMessage } from '../../components/FallbackToolUseErrorMessage.js'; 6import { MessageResponse } from '../../components/MessageResponse.js'; 7import { ShellProgressMessage } from '../../components/shell/ShellProgressMessage.js'; 8import { Box, Text } from '../../ink.js'; 9import { useKeybinding } from '../../keybindings/useKeybinding.js'; 10import { useShortcutDisplay } from '../../keybindings/useShortcutDisplay.js'; 11import { useAppStateStore, useSetAppState } from '../../state/AppState.js'; 12import type { Tool } from '../../Tool.js'; 13import { backgroundAll } from '../../tasks/LocalShellTask/LocalShellTask.js'; 14import type { ProgressMessage } from '../../types/message.js'; 15import { env } from '../../utils/env.js'; 16import { isEnvTruthy } from '../../utils/envUtils.js'; 17import { getDisplayPath } from '../../utils/file.js'; 18import { isFullscreenEnvEnabled } from '../../utils/fullscreen.js'; 19import type { ThemeName } from '../../utils/theme.js'; 20import type { BashProgress, BashToolInput, Out } from './BashTool.js'; 21import BashToolResultMessage from './BashToolResultMessage.js'; 22import { extractBashCommentLabel } from './commentLabel.js'; 23import { parseSedEditCommand } from './sedEditParser.js'; 24 25// Constants for command display 26const MAX_COMMAND_DISPLAY_LINES = 2; 27const MAX_COMMAND_DISPLAY_CHARS = 160; 28 29// Simple component to show background hint and handle ctrl+b 30// When ctrl+b is pressed, backgrounds ALL running foreground commands 31export function BackgroundHint(t0) { 32 const $ = _c(9); 33 let t1; 34 if ($[0] !== t0) { 35 t1 = t0 === undefined ? {} : t0; 36 $[0] = t0; 37 $[1] = t1; 38 } else { 39 t1 = $[1]; 40 } 41 const { 42 onBackground 43 } = t1; 44 const store = useAppStateStore(); 45 const setAppState = useSetAppState(); 46 let t2; 47 if ($[2] !== onBackground || $[3] !== setAppState || $[4] !== store) { 48 t2 = () => { 49 backgroundAll(() => store.getState(), setAppState); 50 onBackground?.(); 51 }; 52 $[2] = onBackground; 53 $[3] = setAppState; 54 $[4] = store; 55 $[5] = t2; 56 } else { 57 t2 = $[5]; 58 } 59 const handleBackground = t2; 60 let t3; 61 if ($[6] === Symbol.for("react.memo_cache_sentinel")) { 62 t3 = { 63 context: "Task" 64 }; 65 $[6] = t3; 66 } else { 67 t3 = $[6]; 68 } 69 useKeybinding("task:background", handleBackground, t3); 70 const baseShortcut = useShortcutDisplay("task:background", "Task", "ctrl+b"); 71 const shortcut = env.terminal === "tmux" && baseShortcut === "ctrl+b" ? "ctrl+b ctrl+b (twice)" : baseShortcut; 72 if (isEnvTruthy(process.env.CLAUDE_CODE_DISABLE_BACKGROUND_TASKS)) { 73 return null; 74 } 75 let t4; 76 if ($[7] !== shortcut) { 77 t4 = <Box paddingLeft={5}><Text dimColor={true}><KeyboardShortcutHint shortcut={shortcut} action="run in background" parens={true} /></Text></Box>; 78 $[7] = shortcut; 79 $[8] = t4; 80 } else { 81 t4 = $[8]; 82 } 83 return t4; 84} 85export function renderToolUseMessage(input: Partial<BashToolInput>, { 86 verbose, 87 theme: _theme 88}: { 89 verbose: boolean; 90 theme: ThemeName; 91}): React.ReactNode { 92 const { 93 command 94 } = input; 95 if (!command) { 96 return null; 97 } 98 99 // Render sed in-place edits like file edits (show file path only) 100 const sedInfo = parseSedEditCommand(command); 101 if (sedInfo) { 102 return verbose ? sedInfo.filePath : getDisplayPath(sedInfo.filePath); 103 } 104 if (!verbose) { 105 const lines = command.split('\n'); 106 if (isFullscreenEnvEnabled()) { 107 const label = extractBashCommentLabel(command); 108 if (label) { 109 return label.length > MAX_COMMAND_DISPLAY_CHARS ? label.slice(0, MAX_COMMAND_DISPLAY_CHARS) + '…' : label; 110 } 111 } 112 const needsLineTruncation = lines.length > MAX_COMMAND_DISPLAY_LINES; 113 const needsCharTruncation = command.length > MAX_COMMAND_DISPLAY_CHARS; 114 if (needsLineTruncation || needsCharTruncation) { 115 let truncated = command; 116 117 // First truncate by lines if needed 118 if (needsLineTruncation) { 119 truncated = lines.slice(0, MAX_COMMAND_DISPLAY_LINES).join('\n'); 120 } 121 122 // Then truncate by chars if still too long 123 if (truncated.length > MAX_COMMAND_DISPLAY_CHARS) { 124 truncated = truncated.slice(0, MAX_COMMAND_DISPLAY_CHARS); 125 } 126 return <Text>{truncated.trim()}</Text>; 127 } 128 } 129 return command; 130} 131export function renderToolUseProgressMessage(progressMessagesForMessage: ProgressMessage<BashProgress>[], { 132 verbose, 133 tools: _tools, 134 terminalSize: _terminalSize, 135 inProgressToolCallCount: _inProgressToolCallCount 136}: { 137 tools: Tool[]; 138 verbose: boolean; 139 terminalSize?: { 140 columns: number; 141 rows: number; 142 }; 143 inProgressToolCallCount?: number; 144}): React.ReactNode { 145 const lastProgress = progressMessagesForMessage.at(-1); 146 if (!lastProgress || !lastProgress.data) { 147 return <MessageResponse height={1}> 148 <Text dimColor>Running</Text> 149 </MessageResponse>; 150 } 151 const data = lastProgress.data; 152 return <ShellProgressMessage fullOutput={data.fullOutput} output={data.output} elapsedTimeSeconds={data.elapsedTimeSeconds} totalLines={data.totalLines} totalBytes={data.totalBytes} timeoutMs={data.timeoutMs} taskId={data.taskId} verbose={verbose} />; 153} 154export function renderToolUseQueuedMessage(): React.ReactNode { 155 return <MessageResponse height={1}> 156 <Text dimColor>Waiting</Text> 157 </MessageResponse>; 158} 159export function renderToolResultMessage(content: Out, progressMessagesForMessage: ProgressMessage<BashProgress>[], { 160 verbose, 161 theme: _theme, 162 tools: _tools, 163 style: _style 164}: { 165 verbose: boolean; 166 theme: ThemeName; 167 tools: Tool[]; 168 style?: 'condensed'; 169}): React.ReactNode { 170 const lastProgress = progressMessagesForMessage.at(-1); 171 const timeoutMs = lastProgress?.data?.timeoutMs; 172 return <BashToolResultMessage content={content} verbose={verbose} timeoutMs={timeoutMs} />; 173} 174export function renderToolUseErrorMessage(result: ToolResultBlockParam['content'], { 175 verbose, 176 progressMessagesForMessage: _progressMessagesForMessage, 177 tools: _tools 178}: { 179 verbose: boolean; 180 progressMessagesForMessage: ProgressMessage<BashProgress>[]; 181 tools: Tool[]; 182}): React.ReactNode { 183 return <FallbackToolUseErrorMessage result={result} verbose={verbose} />; 184} 185//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJUb29sUmVzdWx0QmxvY2tQYXJhbSIsIlJlYWN0IiwiS2V5Ym9hcmRTaG9ydGN1dEhpbnQiLCJGYWxsYmFja1Rvb2xVc2VFcnJvck1lc3NhZ2UiLCJNZXNzYWdlUmVzcG9uc2UiLCJTaGVsbFByb2dyZXNzTWVzc2FnZSIsIkJveCIsIlRleHQiLCJ1c2VLZXliaW5kaW5nIiwidXNlU2hvcnRjdXREaXNwbGF5IiwidXNlQXBwU3RhdGVTdG9yZSIsInVzZVNldEFwcFN0YXRlIiwiVG9vbCIsImJhY2tncm91bmRBbGwiLCJQcm9ncmVzc01lc3NhZ2UiLCJlbnYiLCJpc0VudlRydXRoeSIsImdldERpc3BsYXlQYXRoIiwiaXNGdWxsc2NyZWVuRW52RW5hYmxlZCIsIlRoZW1lTmFtZSIsIkJhc2hQcm9ncmVzcyIsIkJhc2hUb29sSW5wdXQiLCJPdXQiLCJCYXNoVG9vbFJlc3VsdE1lc3NhZ2UiLCJleHRyYWN0QmFzaENvbW1lbnRMYWJlbCIsInBhcnNlU2VkRWRpdENvbW1hbmQiLCJNQVhfQ09NTUFORF9ESVNQTEFZX0xJTkVTIiwiTUFYX0NPTU1BTkRfRElTUExBWV9DSEFSUyIsIkJhY2tncm91bmRIaW50IiwidDAiLCIkIiwiX2MiLCJ0MSIsInVuZGVmaW5lZCIsIm9uQmFja2dyb3VuZCIsInN0b3JlIiwic2V0QXBwU3RhdGUiLCJ0MiIsImdldFN0YXRlIiwiaGFuZGxlQmFja2dyb3VuZCIsInQzIiwiU3ltYm9sIiwiZm9yIiwiY29udGV4dCIsImJhc2VTaG9ydGN1dCIsInNob3J0Y3V0IiwidGVybWluYWwiLCJwcm9jZXNzIiwiQ0xBVURFX0NPREVfRElTQUJMRV9CQUNLR1JPVU5EX1RBU0tTIiwidDQiLCJyZW5kZXJUb29sVXNlTWVzc2FnZSIsImlucHV0IiwiUGFydGlhbCIsInZlcmJvc2UiLCJ0aGVtZSIsIl90aGVtZSIsIlJlYWN0Tm9kZSIsImNvbW1hbmQiLCJzZWRJbmZvIiwiZmlsZVBhdGgiLCJsaW5lcyIsInNwbGl0IiwibGFiZWwiLCJsZW5ndGgiLCJzbGljZSIsIm5lZWRzTGluZVRydW5jYXRpb24iLCJuZWVkc0NoYXJUcnVuY2F0aW9uIiwidHJ1bmNhdGVkIiwiam9pbiIsInRyaW0iLCJyZW5kZXJUb29sVXNlUHJvZ3Jlc3NNZXNzYWdlIiwicHJvZ3Jlc3NNZXNzYWdlc0Zvck1lc3NhZ2UiLCJ0b29scyIsIl90b29scyIsInRlcm1pbmFsU2l6ZSIsIl90ZXJtaW5hbFNpemUiLCJpblByb2dyZXNzVG9vbENhbGxDb3VudCIsIl9pblByb2dyZXNzVG9vbENhbGxDb3VudCIsImNvbHVtbnMiLCJyb3dzIiwibGFzdFByb2dyZXNzIiwiYXQiLCJkYXRhIiwiZnVsbE91dHB1dCIsIm91dHB1dCIsImVsYXBzZWRUaW1lU2Vjb25kcyIsInRvdGFsTGluZXMiLCJ0b3RhbEJ5dGVzIiwidGltZW91dE1zIiwidGFza0lkIiwicmVuZGVyVG9vbFVzZVF1ZXVlZE1lc3NhZ2UiLCJyZW5kZXJUb29sUmVzdWx0TWVzc2FnZSIsImNvbnRlbnQiLCJzdHlsZSIsIl9zdHlsZSIsInJlbmRlclRvb2xVc2VFcnJvck1lc3NhZ2UiLCJyZXN1bHQiLCJfcHJvZ3Jlc3NNZXNzYWdlc0Zvck1lc3NhZ2UiXSwic291cmNlcyI6WyJVSS50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBUb29sUmVzdWx0QmxvY2tQYXJhbSB9IGZyb20gJ0BhbnRocm9waWMtYWkvc2RrL3Jlc291cmNlcy9pbmRleC5tanMnXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IEtleWJvYXJkU2hvcnRjdXRIaW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9kZXNpZ24tc3lzdGVtL0tleWJvYXJkU2hvcnRjdXRIaW50LmpzJ1xuaW1wb3J0IHsgRmFsbGJhY2tUb29sVXNlRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9GYWxsYmFja1Rvb2xVc2VFcnJvck1lc3NhZ2UuanMnXG5pbXBvcnQgeyBNZXNzYWdlUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL01lc3NhZ2VSZXNwb25zZS5qcydcbmltcG9ydCB7IFNoZWxsUHJvZ3Jlc3NNZXNzYWdlIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9zaGVsbC9TaGVsbFByb2dyZXNzTWVzc2FnZS5qcydcbmltcG9ydCB7IEJveCwgVGV4dCB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB7IHVzZUtleWJpbmRpbmcgfSBmcm9tICcuLi8uLi9rZXliaW5kaW5ncy91c2VLZXliaW5kaW5nLmpzJ1xuaW1wb3J0IHsgdXNlU2hvcnRjdXREaXNwbGF5IH0gZnJvbSAnLi4vLi4va2V5YmluZGluZ3MvdXNlU2hvcnRjdXREaXNwbGF5LmpzJ1xuaW1wb3J0IHsgdXNlQXBwU3RhdGVTdG9yZSwgdXNlU2V0QXBwU3RhdGUgfSBmcm9tICcuLi8uLi9zdGF0ZS9BcHBTdGF0ZS5qcydcbmltcG9ydCB0eXBlIHsgVG9vbCB9IGZyb20gJy4uLy4uL1Rvb2wuanMnXG5pbXBvcnQgeyBiYWNrZ3JvdW5kQWxsIH0gZnJvbSAnLi4vLi4vdGFza3MvTG9jYWxTaGVsbFRhc2svTG9jYWxTaGVsbFRhc2suanMnXG5pbXBvcnQgdHlwZSB7IFByb2dyZXNzTWVzc2FnZSB9IGZyb20gJy4uLy4uL3R5cGVzL21lc3NhZ2UuanMnXG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuLi8uLi91dGlscy9lbnYuanMnXG5pbXBvcnQgeyBpc0VudlRydXRoeSB9IGZyb20gJy4uLy4uL3V0aWxzL2VudlV0aWxzLmpzJ1xuaW1wb3J0IHsgZ2V0RGlzcGxheVBhdGggfSBmcm9tICcuLi8uLi91dGlscy9maWxlLmpzJ1xuaW1wb3J0IHsgaXNGdWxsc2NyZWVuRW52RW5hYmxlZCB9IGZyb20gJy4uLy4uL3V0aWxzL2Z1bGxzY3JlZW4uanMnXG5pbXBvcnQgdHlwZSB7IFRoZW1lTmFtZSB9IGZyb20gJy4uLy4uL3V0aWxzL3RoZW1lLmpzJ1xuaW1wb3J0IHR5cGUgeyBCYXNoUHJvZ3Jlc3MsIEJhc2hUb29sSW5wdXQsIE91dCB9IGZyb20gJy4vQmFzaFRvb2wuanMnXG5pbXBvcnQgQmFzaFRvb2xSZXN1bHRNZXNzYWdlIGZyb20gJy4vQmFzaFRvb2xSZXN1bHRNZXNzYWdlLmpzJ1xuaW1wb3J0IHsgZXh0cmFjdEJhc2hDb21tZW50TGFiZWwgfSBmcm9tICcuL2NvbW1lbnRMYWJlbC5qcydcbmltcG9ydCB7IHBhcnNlU2VkRWRpdENvbW1hbmQgfSBmcm9tICcuL3NlZEVkaXRQYXJzZXIuanMnXG5cbi8vIENvbnN0YW50cyBmb3IgY29tbWFuZCBkaXNwbGF5XG5jb25zdCBNQVhfQ09NTUFORF9ESVNQTEFZX0xJTkVTID0gMlxuY29uc3QgTUFYX0NPTU1BTkRfRElTUExBWV9DSEFSUyA9IDE2MFxuXG4vLyBTaW1wbGUgY29tcG9uZW50IHRvIHNob3cgYmFja2dyb3VuZCBoaW50IGFuZCBoYW5kbGUgY3RybCtiXG4vLyBXaGVuIGN0cmwrYiBpcyBwcmVzc2VkLCBiYWNrZ3JvdW5kcyBBTEwgcnVubmluZyBmb3JlZ3JvdW5kIGNvbW1hbmRzXG5leHBvcnQgZnVuY3Rpb24gQmFja2dyb3VuZEhpbnQoe1xuICBvbkJhY2tncm91bmQsXG59OiB7XG4gIG9uQmFja2dyb3VuZD86ICgpID0+IHZvaWRcbn0gPSB7fSk6IFJlYWN0LlJlYWN0RWxlbWVudCB8IG51bGwge1xuICBjb25zdCBzdG9yZSA9IHVzZUFwcFN0YXRlU3RvcmUoKVxuICBjb25zdCBzZXRBcHBTdGF0ZSA9IHVzZVNldEFwcFN0YXRlKClcblxuICAvLyBIYW5kbGVyIGZvciB0YXNrOmJhY2tncm91bmQgLSBiYWNrZ3JvdW5kIGFsbCBmb3JlZ3JvdW5kIHRhc2tzXG4gIGNvbnN0IGhhbmRsZUJhY2tncm91bmQgPSBSZWFjdC51c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgLy8gQmFja2dyb3VuZCBBTEwgZm9yZWdyb3VuZCBiYXNoIHRhc2tzXG4gICAgYmFja2dyb3VuZEFsbCgoKSA9PiBzdG9yZS5nZXRTdGF0ZSgpLCBzZXRBcHBTdGF0ZSlcbiAgICAvLyBBbHNvIGNhbGwgdGhlIG9wdGlvbmFsIGNhbGxiYWNrICh1c2VkIGZvciBub24tYmFzaCB0YXNrcyBsaWtlIGFnZW50cylcbiAgICBvbkJhY2tncm91bmQ/LigpXG4gIH0sIFtzdG9yZSwgc2V0QXBwU3RhdGUsIG9uQmFja2dyb3VuZF0pXG5cbiAgdXNlS2V5YmluZGluZygndGFzazpiYWNrZ3JvdW5kJywgaGFuZGxlQmFja2dyb3VuZCwge1xuICAgIGNvbnRleHQ6ICdUYXNrJyxcbiAgfSlcblxuICAvLyBHZXQgdGhlIGNvbmZpZ3VyZWQgc2hvcnRjdXQgZm9yIHRhc2s6YmFja2dyb3VuZFxuICBjb25zdCBiYXNlU2hvcnRjdXQgPSB1c2VTaG9ydGN1dERpc3BsYXkoJ3Rhc2s6YmFja2dyb3VuZCcsICdUYXNrJywgJ2N0cmwrYicpXG4gIC8vIEluIHRtdXgsIGN0cmwrYiBpcyB0aGUgcHJlZml4IGtleSwgc28gdXNlcnMgbmVlZCB0byBwcmVzcyBpdCB0d2ljZSB0byBzZW5kIGN0cmwrYlxuICBjb25zdCBzaG9ydGN1dCA9XG4gICAgZW52LnRlcm1pbmFsID09PSAndG11eCcgJiYgYmFzZVNob3J0Y3V0ID09PSAnY3RybCtiJ1xuICAgICAgPyAnY3RybCtiIGN0cmwrYiAodHdpY2UpJ1xuICAgICAgOiBiYXNlU2hvcnRjdXRcblxuICAvLyBEb24ndCBzaG93IGJhY2tncm91bmQgaGludCBpZiBiYWNrZ3JvdW5kIHRhc2tzIGFyZSBkaXNhYmxlZFxuICBpZiAoaXNFbnZUcnV0aHkocHJvY2Vzcy5lbnYuQ0xBVURFX0NPREVfRElTQUJMRV9CQUNLR1JPVU5EX1RBU0tTKSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxCb3ggcGFkZGluZ0xlZnQ9ezV9PlxuICAgICAgPFRleHQgZGltQ29sb3I+XG4gICAgICAgIDxLZXlib2FyZFNob3J0Y3V0SGludFxuICAgICAgICAgIHNob3J0Y3V0PXtzaG9ydGN1dH1cbiAgICAgICAgICBhY3Rpb249XCJydW4gaW4gYmFja2dyb3VuZFwiXG4gICAgICAgICAgcGFyZW5zXG4gICAgICAgIC8+XG4gICAgICA8L1RleHQ+XG4gICAgPC9Cb3g+XG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclRvb2xVc2VNZXNzYWdlKFxuICBpbnB1dDogUGFydGlhbDxCYXNoVG9vbElucHV0PixcbiAgeyB2ZXJib3NlLCB0aGVtZTogX3RoZW1lIH06IHsgdmVyYm9zZTogYm9vbGVhbjsgdGhlbWU6IFRoZW1lTmFtZSB9LFxuKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgY29uc3QgeyBjb21tYW5kIH0gPSBpbnB1dFxuICBpZiAoIWNvbW1hbmQpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLy8gUmVuZGVyIHNlZCBpbi1wbGFjZSBlZGl0cyBsaWtlIGZpbGUgZWRpdHMgKHNob3cgZmlsZSBwYXRoIG9ubHkpXG4gIGNvbnN0IHNlZEluZm8gPSBwYXJzZVNlZEVkaXRDb21tYW5kKGNvbW1hbmQpXG4gIGlmIChzZWRJbmZvKSB7XG4gICAgcmV0dXJuIHZlcmJvc2UgPyBzZWRJbmZvLmZpbGVQYXRoIDogZ2V0RGlzcGxheVBhdGgoc2VkSW5mby5maWxlUGF0aClcbiAgfVxuXG4gIGlmICghdmVyYm9zZSkge1xuICAgIGNvbnN0IGxpbmVzID0gY29tbWFuZC5zcGxpdCgnXFxuJylcblxuICAgIGlmIChpc0Z1bGxzY3JlZW5FbnZFbmFibGVkKCkpIHtcbiAgICAgIGNvbnN0IGxhYmVsID0gZXh0cmFjdEJhc2hDb21tZW50TGFiZWwoY29tbWFuZClcbiAgICAgIGlmIChsYWJlbCkge1xuICAgICAgICByZXR1cm4gbGFiZWwubGVuZ3RoID4gTUFYX0NPTU1BTkRfRElTUExBWV9DSEFSU1xuICAgICAgICAgID8gbGFiZWwuc2xpY2UoMCwgTUFYX0NPTU1BTkRfRElTUExBWV9DSEFSUykgKyAn4oCmJ1xuICAgICAgICAgIDogbGFiZWxcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBuZWVkc0xpbmVUcnVuY2F0aW9uID0gbGluZXMubGVuZ3RoID4gTUFYX0NPTU1BTkRfRElTUExBWV9MSU5FU1xuICAgIGNvbnN0IG5lZWRzQ2hhclRydW5jYXRpb24gPSBjb21tYW5kLmxlbmd0aCA+IE1BWF9DT01NQU5EX0RJU1BMQVlfQ0hBUlNcblxuICAgIGlmIChuZWVkc0xpbmVUcnVuY2F0aW9uIHx8IG5lZWRzQ2hhclRydW5jYXRpb24pIHtcbiAgICAgIGxldCB0cnVuY2F0ZWQgPSBjb21tYW5kXG5cbiAgICAgIC8vIEZpcnN0IHRydW5jYXRlIGJ5IGxpbmVzIGlmIG5lZWRlZFxuICAgICAgaWYgKG5lZWRzTGluZVRydW5jYXRpb24pIHtcbiAgICAgICAgdHJ1bmNhdGVkID0gbGluZXMuc2xpY2UoMCwgTUFYX0NPTU1BTkRfRElTUExBWV9MSU5FUykuam9pbignXFxuJylcbiAgICAgIH1cblxuICAgICAgLy8gVGhlbiB0cnVuY2F0ZSBieSBjaGFycyBpZiBzdGlsbCB0b28gbG9uZ1xuICAgICAgaWYgKHRydW5jYXRlZC5sZW5ndGggPiBNQVhfQ09NTUFORF9ESVNQTEFZX0NIQVJTKSB7XG4gICAgICAgIHRydW5jYXRlZCA9IHRydW5jYXRlZC5zbGljZSgwLCBNQVhfQ09NTUFORF9ESVNQTEFZX0NIQVJTKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gPFRleHQ+e3RydW5jYXRlZC50cmltKCl94oCmPC9UZXh0PlxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb21tYW5kXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJUb29sVXNlUHJvZ3Jlc3NNZXNzYWdlKFxuICBwcm9ncmVzc01lc3NhZ2VzRm9yTWVzc2FnZTogUHJvZ3Jlc3NNZXNzYWdlPEJhc2hQcm9ncmVzcz5bXSxcbiAge1xuICAgIHZlcmJvc2UsXG4gICAgdG9vbHM6IF90b29scyxcbiAgICB0ZXJtaW5hbFNpemU6IF90ZXJtaW5hbFNpemUsXG4gICAgaW5Qcm9ncmVzc1Rvb2xDYWxsQ291bnQ6IF9pblByb2dyZXNzVG9vbENhbGxDb3VudCxcbiAgfToge1xuICAgIHRvb2xzOiBUb29sW11cbiAgICB2ZXJib3NlOiBib29sZWFuXG4gICAgdGVybWluYWxTaXplPzogeyBjb2x1bW5zOiBudW1iZXI7IHJvd3M6IG51bWJlciB9XG4gICAgaW5Qcm9ncmVzc1Rvb2xDYWxsQ291bnQ/OiBudW1iZXJcbiAgfSxcbik6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IGxhc3RQcm9ncmVzcyA9IHByb2dyZXNzTWVzc2FnZXNGb3JNZXNzYWdlLmF0KC0xKVxuXG4gIGlmICghbGFzdFByb2dyZXNzIHx8ICFsYXN0UHJvZ3Jlc3MuZGF0YSkge1xuICAgIHJldHVybiAoXG4gICAgICA8TWVzc2FnZVJlc3BvbnNlIGhlaWdodD17MX0+XG4gICAgICAgIDxUZXh0IGRpbUNvbG9yPlJ1bm5pbmfigKY8L1RleHQ+XG4gICAgICA8L01lc3NhZ2VSZXNwb25zZT5cbiAgICApXG4gIH1cblxuICBjb25zdCBkYXRhID0gbGFzdFByb2dyZXNzLmRhdGFcblxuICByZXR1cm4gKFxuICAgIDxTaGVsbFByb2dyZXNzTWVzc2FnZVxuICAgICAgZnVsbE91dHB1dD17ZGF0YS5mdWxsT3V0cHV0fVxuICAgICAgb3V0cHV0PXtkYXRhLm91dHB1dH1cbiAgICAgIGVsYXBzZWRUaW1lU2Vjb25kcz17ZGF0YS5lbGFwc2VkVGltZVNlY29uZHN9XG4gICAgICB0b3RhbExpbmVzPXtkYXRhLnRvdGFsTGluZXN9XG4gICAgICB0b3RhbEJ5dGVzPXtkYXRhLnRvdGFsQnl0ZXN9XG4gICAgICB0aW1lb3V0TXM9e2RhdGEudGltZW91dE1zfVxuICAgICAgdGFza0lkPXtkYXRhLnRhc2tJZH1cbiAgICAgIHZlcmJvc2U9e3ZlcmJvc2V9XG4gICAgLz5cbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyVG9vbFVzZVF1ZXVlZE1lc3NhZ2UoKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgcmV0dXJuIChcbiAgICA8TWVzc2FnZVJlc3BvbnNlIGhlaWdodD17MX0+XG4gICAgICA8VGV4dCBkaW1Db2xvcj5XYWl0aW5n4oCmPC9UZXh0PlxuICAgIDwvTWVzc2FnZVJlc3BvbnNlPlxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJUb29sUmVzdWx0TWVzc2FnZShcbiAgY29udGVudDogT3V0LFxuICBwcm9ncmVzc01lc3NhZ2VzRm9yTWVzc2FnZTogUHJvZ3Jlc3NNZXNzYWdlPEJhc2hQcm9ncmVzcz5bXSxcbiAge1xuICAgIHZlcmJvc2UsXG4gICAgdGhlbWU6IF90aGVtZSxcbiAgICB0b29sczogX3Rvb2xzLFxuICAgIHN0eWxlOiBfc3R5bGUsXG4gIH06IHtcbiAgICB2ZXJib3NlOiBib29sZWFuXG4gICAgdGhlbWU6IFRoZW1lTmFtZVxuICAgIHRvb2xzOiBUb29sW11cbiAgICBzdHlsZT86ICdjb25kZW5zZWQnXG4gIH0sXG4pOiBSZWFjdC5SZWFjdE5vZGUge1xuICBjb25zdCBsYXN0UHJvZ3Jlc3MgPSBwcm9ncmVzc01lc3NhZ2VzRm9yTWVzc2FnZS5hdCgtMSlcbiAgY29uc3QgdGltZW91dE1zID0gbGFzdFByb2dyZXNzPy5kYXRhPy50aW1lb3V0TXNcbiAgcmV0dXJuIChcbiAgICA8QmFzaFRvb2xSZXN1bHRNZXNzYWdlXG4gICAgICBjb250ZW50PXtjb250ZW50fVxuICAgICAgdmVyYm9zZT17dmVyYm9zZX1cbiAgICAgIHRpbWVvdXRNcz17dGltZW91dE1zfVxuICAgIC8+XG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclRvb2xVc2VFcnJvck1lc3NhZ2UoXG4gIHJlc3VsdDogVG9vbFJlc3VsdEJsb2NrUGFyYW1bJ2NvbnRlbnQnXSxcbiAge1xuICAgIHZlcmJvc2UsXG4gICAgcHJvZ3Jlc3NNZXNzYWdlc0Zvck1lc3NhZ2U6IF9wcm9ncmVzc01lc3NhZ2VzRm9yTWVzc2FnZSxcbiAgICB0b29sczogX3Rvb2xzLFxuICB9OiB7XG4gICAgdmVyYm9zZTogYm9vbGVhblxuICAgIHByb2dyZXNzTWVzc2FnZXNGb3JNZXNzYWdlOiBQcm9ncmVzc01lc3NhZ2U8QmFzaFByb2dyZXNzPltdXG4gICAgdG9vbHM6IFRvb2xbXVxuICB9LFxuKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgcmV0dXJuIDxGYWxsYmFja1Rvb2xVc2VFcnJvck1lc3NhZ2UgcmVzdWx0PXtyZXN1bHR9IHZlcmJvc2U9e3ZlcmJvc2V9IC8+XG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxjQUFjQSxvQkFBb0IsUUFBUSx1Q0FBdUM7QUFDakYsT0FBTyxLQUFLQyxLQUFLLE1BQU0sT0FBTztBQUM5QixTQUFTQyxvQkFBb0IsUUFBUSx3REFBd0Q7QUFDN0YsU0FBU0MsMkJBQTJCLFFBQVEsaURBQWlEO0FBQzdGLFNBQVNDLGVBQWUsUUFBUSxxQ0FBcUM7QUFDckUsU0FBU0Msb0JBQW9CLFFBQVEsZ0RBQWdEO0FBQ3JGLFNBQVNDLEdBQUcsRUFBRUMsSUFBSSxRQUFRLGNBQWM7QUFDeEMsU0FBU0MsYUFBYSxRQUFRLG9DQUFvQztBQUNsRSxTQUFTQyxrQkFBa0IsUUFBUSx5Q0FBeUM7QUFDNUUsU0FBU0MsZ0JBQWdCLEVBQUVDLGNBQWMsUUFBUSx5QkFBeUI7QUFDMUUsY0FBY0MsSUFBSSxRQUFRLGVBQWU7QUFDekMsU0FBU0MsYUFBYSxRQUFRLDhDQUE4QztBQUM1RSxjQUFjQyxlQUFlLFFBQVEsd0JBQXdCO0FBQzdELFNBQVNDLEdBQUcsUUFBUSxvQkFBb0I7QUFDeEMsU0FBU0MsV0FBVyxRQUFRLHlCQUF5QjtBQUNyRCxTQUFTQyxjQUFjLFFBQVEscUJBQXFCO0FBQ3BELFNBQVNDLHNCQUFzQixRQUFRLDJCQUEyQjtBQUNsRSxjQUFjQyxTQUFTLFFBQVEsc0JBQXNCO0FBQ3JELGNBQWNDLFlBQVksRUFBRUMsYUFBYSxFQUFFQyxHQUFHLFFBQVEsZUFBZTtBQUNyRSxPQUFPQyxxQkFBcUIsTUFBTSw0QkFBNEI7QUFDOUQsU0FBU0MsdUJBQXVCLFFBQVEsbUJBQW1CO0FBQzNELFNBQVNDLG1CQUFtQixRQUFRLG9CQUFvQjs7QUFFeEQ7QUFDQSxNQUFNQyx5QkFBeUIsR0FBRyxDQUFDO0FBQ25DLE1BQU1DLHlCQUF5QixHQUFHLEdBQUc7O0FBRXJDO0FBQ0E7QUFDQSxPQUFPLFNB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