feat: build
This commit is contained in:
commit
f90eee85d8
1906 files changed
+514339
No files matched your search
@@ -0,0 +1,383 @@
|
||||
import { c as _c } from "react/compiler-runtime";
|
||||
import * as React from 'react';
|
||||
import type { Command } from '../commands.js';
|
||||
import { Box } from '../ink.js';
|
||||
import type { Screen } from '../screens/REPL.js';
|
||||
import type { Tools } from '../Tool.js';
|
||||
import type { RenderableMessage } from '../types/message.js';
|
||||
import { getDisplayMessageFromCollapsed, getToolSearchOrReadInfo, getToolUseIdsFromCollapsedGroup, hasAnyToolInProgress } from '../utils/collapseReadSearch.js';
|
||||
import { type buildMessageLookups, EMPTY_STRING_SET, getProgressMessagesFromLookup, getSiblingToolUseIDsFromLookup, getToolUseID } from '../utils/messages.js';
|
||||
import { hasThinkingContent, Message } from './Message.js';
|
||||
import { MessageModel } from './MessageModel.js';
|
||||
import { shouldRenderStatically } from './Messages.js';
|
||||
import { MessageTimestamp } from './MessageTimestamp.js';
|
||||
import { OffscreenFreeze } from './OffscreenFreeze.js';
|
||||
export type Props = {
|
||||
message: RenderableMessage;
|
||||
/** Whether the previous message in renderableMessages is also a user message. */
|
||||
isUserContinuation: boolean;
|
||||
/**
|
||||
* Whether there is non-skippable content after this message in renderableMessages.
|
||||
* Only needs to be accurate for `collapsed_read_search` messages — used to decide
|
||||
* if the collapsed group spinner should stay active. Pass `false` otherwise.
|
||||
*/
|
||||
hasContentAfter: boolean;
|
||||
tools: Tools;
|
||||
commands: Command[];
|
||||
verbose: boolean;
|
||||
inProgressToolUseIDs: Set<string>;
|
||||
streamingToolUseIDs: Set<string>;
|
||||
screen: Screen;
|
||||
canAnimate: boolean;
|
||||
onOpenRateLimitOptions?: () => void;
|
||||
lastThinkingBlockId: string | null;
|
||||
latestBashOutputUUID: string | null;
|
||||
columns: number;
|
||||
isLoading: boolean;
|
||||
lookups: ReturnType<typeof buildMessageLookups>;
|
||||
};
|
||||
|
||||
/**
|
||||
* Scans forward from `index+1` to check if any "real" content follows. Used to
|
||||
* decide whether a collapsed read/search group should stay in its active
|
||||
* (grey dot, present-tense "Reading…") state while the query is still loading.
|
||||
*
|
||||
* Exported so Messages.tsx can compute this once per message and pass the
|
||||
* result as a boolean prop — avoids passing the full `renderableMessages` array
|
||||
* to each MessageRow (which React Compiler would pin in the fiber's memoCache,
|
||||
* accumulating every historical version of the array ≈ 1-2MB over a 7-turn session).
|
||||
*/
|
||||
export function hasContentAfterIndex(messages: RenderableMessage[], index: number, tools: Tools, streamingToolUseIDs: Set<string>): boolean {
|
||||
for (let i = index + 1; i < messages.length; i++) {
|
||||
const msg = messages[i];
|
||||
if (msg?.type === 'assistant') {
|
||||
const content = msg.message.content[0];
|
||||
if (content?.type === 'thinking' || content?.type === 'redacted_thinking') {
|
||||
continue;
|
||||
}
|
||||
if (content?.type === 'tool_use') {
|
||||
if (getToolSearchOrReadInfo(content.name, content.input, tools).isCollapsible) {
|
||||
continue;
|
||||
}
|
||||
// Non-collapsible tool uses appear in syntheticStreamingToolUseMessages
|
||||
// before their ID is added to inProgressToolUseIDs. Skip while streaming
|
||||
// to avoid briefly finalizing the read group.
|
||||
if (streamingToolUseIDs.has(content.id)) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if (msg?.type === 'system' || msg?.type === 'attachment') {
|
||||
continue;
|
||||
}
|
||||
// Tool results arrive while the collapsed group is still being built
|
||||
if (msg?.type === 'user') {
|
||||
const content = msg.message.content[0];
|
||||
if (content?.type === 'tool_result') {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
// Collapsible grouped_tool_use messages arrive transiently before being
|
||||
// merged into the current collapsed group on the next render cycle
|
||||
if (msg?.type === 'grouped_tool_use') {
|
||||
const firstInput = msg.messages[0]?.message.content[0]?.input;
|
||||
if (getToolSearchOrReadInfo(msg.toolName, firstInput, tools).isCollapsible) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
function MessageRowImpl(t0) {
|
||||
const $ = _c(64);
|
||||
const {
|
||||
message: msg,
|
||||
isUserContinuation,
|
||||
hasContentAfter,
|
||||
tools,
|
||||
commands,
|
||||
verbose,
|
||||
inProgressToolUseIDs,
|
||||
streamingToolUseIDs,
|
||||
screen,
|
||||
canAnimate,
|
||||
onOpenRateLimitOptions,
|
||||
lastThinkingBlockId,
|
||||
latestBashOutputUUID,
|
||||
columns,
|
||||
isLoading,
|
||||
lookups
|
||||
} = t0;
|
||||
const isTranscriptMode = screen === "transcript";
|
||||
const isGrouped = msg.type === "grouped_tool_use";
|
||||
const isCollapsed = msg.type === "collapsed_read_search";
|
||||
let t1;
|
||||
if ($[0] !== hasContentAfter || $[1] !== inProgressToolUseIDs || $[2] !== isCollapsed || $[3] !== isLoading || $[4] !== msg) {
|
||||
t1 = isCollapsed && (hasAnyToolInProgress(msg, inProgressToolUseIDs) || isLoading && !hasContentAfter);
|
||||
$[0] = hasContentAfter;
|
||||
$[1] = inProgressToolUseIDs;
|
||||
$[2] = isCollapsed;
|
||||
$[3] = isLoading;
|
||||
$[4] = msg;
|
||||
$[5] = t1;
|
||||
} else {
|
||||
t1 = $[5];
|
||||
}
|
||||
const isActiveCollapsedGroup = t1;
|
||||
let t2;
|
||||
if ($[6] !== isCollapsed || $[7] !== isGrouped || $[8] !== msg) {
|
||||
t2 = isGrouped ? msg.displayMessage : isCollapsed ? getDisplayMessageFromCollapsed(msg) : msg;
|
||||
$[6] = isCollapsed;
|
||||
$[7] = isGrouped;
|
||||
$[8] = msg;
|
||||
$[9] = t2;
|
||||
} else {
|
||||
t2 = $[9];
|
||||
}
|
||||
const displayMsg = t2;
|
||||
let t3;
|
||||
if ($[10] !== isCollapsed || $[11] !== isGrouped || $[12] !== lookups || $[13] !== msg) {
|
||||
t3 = isGrouped || isCollapsed ? [] : getProgressMessagesFromLookup(msg, lookups);
|
||||
$[10] = isCollapsed;
|
||||
$[11] = isGrouped;
|
||||
$[12] = lookups;
|
||||
$[13] = msg;
|
||||
$[14] = t3;
|
||||
} else {
|
||||
t3 = $[14];
|
||||
}
|
||||
const progressMessagesForMessage = t3;
|
||||
let t4;
|
||||
if ($[15] !== inProgressToolUseIDs || $[16] !== isCollapsed || $[17] !== isGrouped || $[18] !== lookups || $[19] !== msg || $[20] !== screen || $[21] !== streamingToolUseIDs) {
|
||||
const siblingToolUseIDs = isGrouped || isCollapsed ? EMPTY_STRING_SET : getSiblingToolUseIDsFromLookup(msg, lookups);
|
||||
t4 = shouldRenderStatically(msg, streamingToolUseIDs, inProgressToolUseIDs, siblingToolUseIDs, screen, lookups);
|
||||
$[15] = inProgressToolUseIDs;
|
||||
$[16] = isCollapsed;
|
||||
$[17] = isGrouped;
|
||||
$[18] = lookups;
|
||||
$[19] = msg;
|
||||
$[20] = screen;
|
||||
$[21] = streamingToolUseIDs;
|
||||
$[22] = t4;
|
||||
} else {
|
||||
t4 = $[22];
|
||||
}
|
||||
const isStatic = t4;
|
||||
let shouldAnimate = false;
|
||||
if (canAnimate) {
|
||||
if (isGrouped) {
|
||||
let t5;
|
||||
if ($[23] !== inProgressToolUseIDs || $[24] !== msg.messages) {
|
||||
let t6;
|
||||
if ($[26] !== inProgressToolUseIDs) {
|
||||
t6 = m => {
|
||||
const content = m.message.content[0];
|
||||
return content?.type === "tool_use" && inProgressToolUseIDs.has(content.id);
|
||||
};
|
||||
$[26] = inProgressToolUseIDs;
|
||||
$[27] = t6;
|
||||
} else {
|
||||
t6 = $[27];
|
||||
}
|
||||
t5 = msg.messages.some(t6);
|
||||
$[23] = inProgressToolUseIDs;
|
||||
$[24] = msg.messages;
|
||||
$[25] = t5;
|
||||
} else {
|
||||
t5 = $[25];
|
||||
}
|
||||
shouldAnimate = t5;
|
||||
} else {
|
||||
if (isCollapsed) {
|
||||
let t5;
|
||||
if ($[28] !== inProgressToolUseIDs || $[29] !== msg) {
|
||||
t5 = hasAnyToolInProgress(msg, inProgressToolUseIDs);
|
||||
$[28] = inProgressToolUseIDs;
|
||||
$[29] = msg;
|
||||
$[30] = t5;
|
||||
} else {
|
||||
t5 = $[30];
|
||||
}
|
||||
shouldAnimate = t5;
|
||||
} else {
|
||||
let t5;
|
||||
if ($[31] !== inProgressToolUseIDs || $[32] !== msg) {
|
||||
const toolUseID = getToolUseID(msg);
|
||||
t5 = !toolUseID || inProgressToolUseIDs.has(toolUseID);
|
||||
$[31] = inProgressToolUseIDs;
|
||||
$[32] = msg;
|
||||
$[33] = t5;
|
||||
} else {
|
||||
t5 = $[33];
|
||||
}
|
||||
shouldAnimate = t5;
|
||||
}
|
||||
}
|
||||
}
|
||||
let t5;
|
||||
if ($[34] !== displayMsg || $[35] !== isTranscriptMode) {
|
||||
t5 = isTranscriptMode && displayMsg.type === "assistant" && displayMsg.message.content.some(_temp) && (displayMsg.timestamp || displayMsg.message.model);
|
||||
$[34] = displayMsg;
|
||||
$[35] = isTranscriptMode;
|
||||
$[36] = t5;
|
||||
} else {
|
||||
t5 = $[36];
|
||||
}
|
||||
const hasMetadata = t5;
|
||||
const t6 = !hasMetadata;
|
||||
const t7 = hasMetadata ? undefined : columns;
|
||||
let t8;
|
||||
if ($[37] !== commands || $[38] !== inProgressToolUseIDs || $[39] !== isActiveCollapsedGroup || $[40] !== isStatic || $[41] !== isTranscriptMode || $[42] !== isUserContinuation || $[43] !== lastThinkingBlockId || $[44] !== latestBashOutputUUID || $[45] !== lookups || $[46] !== msg || $[47] !== onOpenRateLimitOptions || $[48] !== progressMessagesForMessage || $[49] !== shouldAnimate || $[50] !== t6 || $[51] !== t7 || $[52] !== tools || $[53] !== verbose) {
|
||||
t8 = <Message message={msg} lookups={lookups} addMargin={t6} containerWidth={t7} tools={tools} commands={commands} verbose={verbose} inProgressToolUseIDs={inProgressToolUseIDs} progressMessagesForMessage={progressMessagesForMessage} shouldAnimate={shouldAnimate} shouldShowDot={true} isTranscriptMode={isTranscriptMode} isStatic={isStatic} onOpenRateLimitOptions={onOpenRateLimitOptions} isActiveCollapsedGroup={isActiveCollapsedGroup} isUserContinuation={isUserContinuation} lastThinkingBlockId={lastThinkingBlockId} latestBashOutputUUID={latestBashOutputUUID} />;
|
||||
$[37] = commands;
|
||||
$[38] = inProgressToolUseIDs;
|
||||
$[39] = isActiveCollapsedGroup;
|
||||
$[40] = isStatic;
|
||||
$[41] = isTranscriptMode;
|
||||
$[42] = isUserContinuation;
|
||||
$[43] = lastThinkingBlockId;
|
||||
$[44] = latestBashOutputUUID;
|
||||
$[45] = lookups;
|
||||
$[46] = msg;
|
||||
$[47] = onOpenRateLimitOptions;
|
||||
$[48] = progressMessagesForMessage;
|
||||
$[49] = shouldAnimate;
|
||||
$[50] = t6;
|
||||
$[51] = t7;
|
||||
$[52] = tools;
|
||||
$[53] = verbose;
|
||||
$[54] = t8;
|
||||
} else {
|
||||
t8 = $[54];
|
||||
}
|
||||
const messageEl = t8;
|
||||
if (!hasMetadata) {
|
||||
let t9;
|
||||
if ($[55] !== messageEl) {
|
||||
t9 = <OffscreenFreeze>{messageEl}</OffscreenFreeze>;
|
||||
$[55] = messageEl;
|
||||
$[56] = t9;
|
||||
} else {
|
||||
t9 = $[56];
|
||||
}
|
||||
return t9;
|
||||
}
|
||||
let t9;
|
||||
if ($[57] !== displayMsg || $[58] !== isTranscriptMode) {
|
||||
t9 = <Box flexDirection="row" justifyContent="flex-end" gap={1} marginTop={1}><MessageTimestamp message={displayMsg} isTranscriptMode={isTranscriptMode} /><MessageModel message={displayMsg} isTranscriptMode={isTranscriptMode} /></Box>;
|
||||
$[57] = displayMsg;
|
||||
$[58] = isTranscriptMode;
|
||||
$[59] = t9;
|
||||
} else {
|
||||
t9 = $[59];
|
||||
}
|
||||
let t10;
|
||||
if ($[60] !== columns || $[61] !== messageEl || $[62] !== t9) {
|
||||
t10 = <OffscreenFreeze><Box width={columns} flexDirection="column">{t9}{messageEl}</Box></OffscreenFreeze>;
|
||||
$[60] = columns;
|
||||
$[61] = messageEl;
|
||||
$[62] = t9;
|
||||
$[63] = t10;
|
||||
} else {
|
||||
t10 = $[63];
|
||||
}
|
||||
return t10;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a message is "streaming" - i.e., its content may still be changing.
|
||||
* Exported for testing.
|
||||
*/
|
||||
function _temp(c) {
|
||||
return c.type === "text";
|
||||
}
|
||||
export function isMessageStreaming(msg: RenderableMessage, streamingToolUseIDs: Set<string>): boolean {
|
||||
if (msg.type === 'grouped_tool_use') {
|
||||
return msg.messages.some(m => {
|
||||
const content = m.message.content[0];
|
||||
return content?.type === 'tool_use' && streamingToolUseIDs.has(content.id);
|
||||
});
|
||||
}
|
||||
if (msg.type === 'collapsed_read_search') {
|
||||
const toolIds = getToolUseIdsFromCollapsedGroup(msg);
|
||||
return toolIds.some(id => streamingToolUseIDs.has(id));
|
||||
}
|
||||
const toolUseID = getToolUseID(msg);
|
||||
return !!toolUseID && streamingToolUseIDs.has(toolUseID);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if all tools in a message are resolved.
|
||||
* Exported for testing.
|
||||
*/
|
||||
export function allToolsResolved(msg: RenderableMessage, resolvedToolUseIDs: Set<string>): boolean {
|
||||
if (msg.type === 'grouped_tool_use') {
|
||||
return msg.messages.every(m => {
|
||||
const content = m.message.content[0];
|
||||
return content?.type === 'tool_use' && resolvedToolUseIDs.has(content.id);
|
||||
});
|
||||
}
|
||||
if (msg.type === 'collapsed_read_search') {
|
||||
const toolIds = getToolUseIdsFromCollapsedGroup(msg);
|
||||
return toolIds.every(id => resolvedToolUseIDs.has(id));
|
||||
}
|
||||
if (msg.type === 'assistant') {
|
||||
const block = msg.message.content[0];
|
||||
if (block?.type === 'server_tool_use') {
|
||||
return resolvedToolUseIDs.has(block.id);
|
||||
}
|
||||
}
|
||||
const toolUseID = getToolUseID(msg);
|
||||
return !toolUseID || resolvedToolUseIDs.has(toolUseID);
|
||||
}
|
||||
|
||||
/**
|
||||
* Conservative memo comparator that only bails out when we're CERTAIN
|
||||
* the message won't change. Fails safe by re-rendering when uncertain.
|
||||
*
|
||||
* Exported for testing.
|
||||
*/
|
||||
export function areMessageRowPropsEqual(prev: Props, next: Props): boolean {
|
||||
// Different message reference = content may have changed, must re-render
|
||||
if (prev.message !== next.message) return false;
|
||||
|
||||
// Screen mode change = re-render
|
||||
if (prev.screen !== next.screen) return false;
|
||||
|
||||
// Verbose toggle changes thinking block visibility
|
||||
if (prev.verbose !== next.verbose) return false;
|
||||
|
||||
// collapsed_read_search is never static in prompt mode (matches shouldRenderStatically)
|
||||
if (prev.message.type === 'collapsed_read_search' && next.screen !== 'transcript') {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Width change affects Box layout
|
||||
if (prev.columns !== next.columns) return false;
|
||||
|
||||
// latestBashOutputUUID affects rendering (full vs truncated output)
|
||||
const prevIsLatestBash = prev.latestBashOutputUUID === prev.message.uuid;
|
||||
const nextIsLatestBash = next.latestBashOutputUUID === next.message.uuid;
|
||||
if (prevIsLatestBash !== nextIsLatestBash) return false;
|
||||
|
||||
// lastThinkingBlockId affects thinking block visibility — but only for
|
||||
// messages that HAVE thinking content. Checking unconditionally busts the
|
||||
// memo for every scrollback message whenever thinking starts/stops (CC-941).
|
||||
if (prev.lastThinkingBlockId !== next.lastThinkingBlockId && hasThinkingContent(next.message)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check if this message is still "in flight"
|
||||
const isStreaming = isMessageStreaming(prev.message, prev.streamingToolUseIDs);
|
||||
const isResolved = allToolsResolved(prev.message, prev.lookups.resolvedToolUseIDs);
|
||||
|
||||
// Only bail out for truly static messages
|
||||
if (isStreaming || !isResolved) return false;
|
||||
|
||||
// Static message - safe to skip re-render
|
||||
return true;
|
||||
}
|
||||
export const MessageRow = React.memo(MessageRowImpl, areMessageRowPropsEqual);
|
||||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIkNvbW1hbmQiLCJCb3giLCJTY3JlZW4iLCJUb29scyIsIlJlbmRlcmFibGVNZXNzYWdlIiwiZ2V0RGlzcGxheU1lc3NhZ2VGcm9tQ29sbGFwc2VkIiwiZ2V0VG9vbFNlYXJjaE9yUmVhZEluZm8iLCJnZXRUb29sVXNlSWRzRnJvbUNvbGxhcHNlZEdyb3VwIiwiaGFzQW55VG9vbEluUHJvZ3Jlc3MiLCJidWlsZE1lc3NhZ2VMb29rdXBzIiwiRU1QVFlfU1RSSU5HX1NFVCIsImdldFByb2dyZXNzTWVzc2FnZXNGcm9tTG9va3VwIiwiZ2V0U2libGluZ1Rvb2xVc2VJRHNGcm9tTG9va3VwIiwiZ2V0VG9vbFVzZUlEIiwiaGFzVGhpbmtpbmdDb250ZW50IiwiTWVzc2FnZSIsIk1lc3NhZ2VNb2RlbCIsInNob3VsZFJlbmRlclN0YXRpY2FsbHkiLCJNZXNzYWdlVGltZXN0YW1wIiwiT2Zmc2NyZWVuRnJlZXplIiwiUHJvcHMiLCJtZXNzYWdlIiwiaXNVc2VyQ29udGludWF0aW9uIiwiaGFzQ29udGVudEFmdGVyIiwidG9vbHMiLCJjb21tYW5kcyIsInZlcmJvc2UiLCJpblByb2dyZXNzVG9vbFVzZUlEcyIsIlNldCIsInN0cmVhbWluZ1Rvb2xVc2VJRHMiLCJzY3JlZW4iLCJjYW5BbmltYXRlIiwib25PcGVuUmF0ZUxpbWl0T3B0aW9ucyIsImxhc3RUaGlua2luZ0Jsb2NrSWQiLCJsYXRlc3RCYXNoT3V0cHV0VVVJRCIsImNvbHVtbnMiLCJpc0xvYWRpbmciLCJsb29rdXBzIiwiUmV0dXJuVHlwZSIsImhhc0NvbnRlbnRBZnRlckluZGV4IiwibWVzc2FnZXMiLCJpbmRleCIsImkiLCJsZW5ndGgiLCJtc2ciLCJ0eXBlIiwiY29udGVudCIsIm5hbWUiLCJpbnB1dCIsImlzQ29sbGFwc2libGUiLCJoYXMiLCJpZCIsImZpcnN0SW5wdXQiLCJ0b29sTmFtZSIsIk1lc3NhZ2VSb3dJbXBsIiwidDAiLCIkIiwiX2MiLCJpc1RyYW5zY3JpcHRNb2RlIiwiaXNHcm91cGVkIiwiaXNDb2xsYXBzZWQiLCJ0MSIsImlzQWN0aXZlQ29sbGFwc2VkR3JvdXAiLCJ0MiIsImRpc3BsYXlNZXNzYWdlIiwiZGlzcGxheU1zZyIsInQzIiwicHJvZ3Jlc3NNZXNzYWdlc0Zvck1lc3NhZ2UiLCJ0NCIsInNpYmxpbmdUb29sVXNlSURzIiwiaXNTdGF0aWMiLCJzaG91bGRBbmltYXRlIiwidDUiLCJ0NiIsIm0iLCJzb21lIiwidG9vbFVzZUlEIiwiX3RlbXAiLCJ0aW1lc3RhbXAiLCJtb2RlbCIsImhhc01ldGFkYXRhIiwidDciLCJ1bmRlZmluZWQiLCJ0OCIsIm1lc3NhZ2VFbCIsInQ5IiwidDEwIiwiYyIsImlzTWVzc2FnZVN0cmVhbWluZyIsInRvb2xJZHMiLCJhbGxUb29sc1Jlc29sdmVkIiwicmVzb2x2ZWRUb29sVXNlSURzIiwiZXZlcnkiLCJibG9jayIsImFyZU1lc3NhZ2VSb3dQcm9wc0VxdWFsIiwicHJldiIsIm5leHQiLCJwcmV2SXNMYXRlc3RCYXNoIiwidXVpZCIsIm5leHRJc0xhdGVzdEJhc2giLCJpc1N0cmVhbWluZyIsImlzUmVzb2x2ZWQiLCJNZXNzYWdlUm93IiwibWVtbyJdLCJzb3VyY2VzIjpbIk1lc3NhZ2VSb3cudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSAnLi4vY29tbWFuZHMuanMnXG5pbXBvcnQgeyBCb3ggfSBmcm9tICcuLi9pbmsuanMnXG5pbXBvcnQgdHlwZSB7IFNjcmVlbiB9IGZyb20gJy4uL3NjcmVlbnMvUkVQTC5qcydcbmltcG9ydCB0eXBlIHsgVG9vbHMgfSBmcm9tICcuLi9Ub29sLmpzJ1xuaW1wb3J0IHR5cGUgeyBSZW5kZXJhYmxlTWVzc2FnZSB9IGZyb20gJy4uL3R5cGVzL21lc3NhZ2UuanMnXG5pbXBvcnQge1xuICBnZXREaXNwbGF5TWVzc2FnZUZyb21Db2xsYXBzZWQsXG4gIGdldFRvb2xTZWFyY2hPclJlYWRJbmZvLFxuICBnZXRUb29sVXNlSWRzRnJvbUNvbGxhcHNlZEdyb3VwLFxuICBoYXNBbnlUb29sSW5Qcm9ncmVzcyxcbn0gZnJvbSAnLi4vdXRpbHMvY29sbGFwc2VSZWFkU2VhcmNoLmpzJ1xuaW1wb3J0IHtcbiAgdHlwZSBidWlsZE1lc3NhZ2VMb29rdXBzLFxuICBFTVBUWV9TVFJJTkdfU0VULFxuICBnZXRQcm9ncmVzc01lc3NhZ2VzRnJvbUxvb2t1cCxcbiAgZ2V0U2libGluZ1Rvb2xVc2VJRHNGcm9tTG9va3VwLFxuICBnZXRUb29sVXNlSUQsXG59IGZyb20gJy4uL3V0aWxzL21lc3NhZ2VzLmpzJ1xuaW1wb3J0IHsgaGFzVGhpbmtpbmdDb250ZW50LCBNZXNzYWdlIH0gZnJvbSAnLi9NZXNzYWdlLmpzJ1xuaW1wb3J0IHsgTWVzc2FnZU1vZGVsIH0gZnJvbSAnLi9NZXNzYWdlTW9kZWwuanMnXG5pbXBvcnQgeyBzaG91bGRSZW5kZXJTdGF0aWNhbGx5IH0gZnJvbSAnLi9NZXNzYWdlcy5qcydcbmltcG9ydCB7IE1lc3NhZ2VUaW1lc3RhbXAgfSBmcm9tICcuL01lc3NhZ2VUaW1lc3RhbXAuanMnXG5pbXBvcnQgeyBPZmZzY3JlZW5GcmVlemUgfSBmcm9tICcuL09mZnNjcmVlbkZyZWV6ZS5qcydcblxuZXhwb3J0IHR5cGUgUHJvcHMgPSB7XG4gIG1lc3NhZ2U6IFJlbmRlcmFibGVNZXNzYWdlXG4gIC8qKiBXaGV0aGVyIHRoZSBwcmV2aW91cyBtZXNzYWdlIGluIHJlbmRlcmFibGVNZXNzYWdlcyBpcyBhbHNvIGEgdXNlciBtZXNzYWdlLiAqL1xuICBpc1VzZXJDb250aW51YXRpb246IGJvb2xlYW5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlcmUgaXMgbm9uLXNraXBwYWJsZSBjb250ZW50IGFmdGVyIHRoaXMgbWVzc2FnZSBpbiByZW5kZXJhYmxlTWVzc2FnZXMuXG4gICAqIE9ubHkgbmVlZHMgdG8gYmUgYWNjdXJhdGUgZm9yIGBjb2xsYXBzZWRfcmVhZF9zZWFyY2hgIG1lc3NhZ2VzIOKAlCB1c2VkIHRvIGRlY2lkZVxuICAgKiBpZiB0aGUgY29sbGFwc2VkIGdyb3VwIHNwaW5uZXIgc2hvdWxkIHN0YXkgYWN0aXZlLiBQYXNzIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgaGFzQ29udGVudEFmdGVyOiBib29sZWFuXG4gIHRvb2xzOiBUb29sc1xuICBjb21tYW5kczogQ29tbWFuZFtdXG4gIHZlcmJvc2U6IGJvb2xlYW5cbiAgaW5Qcm9ncmVzc1Rvb2xVc2VJRHM6IFNldDxzdHJpbmc+XG4gIHN0cmVhbWluZ1Rvb2xVc2VJRHM6IFNldDxzdHJpbmc+XG4gIHNjcmVlbjogU2NyZWVuXG4gIGNhbkFuaW1hdGU6IGJvb2xlYW5cbiAgb25PcGVuUmF0ZUxpbWl0T3B0aW9ucz86ICgpID0+IHZvaWRcbiAgbGFzdFRoaW5raW5nQmxvY2tJZDogc3RyaW5nIHwgbnVsbFxuICBsYXRlc3RCYXNoT3V0cHV0VVVJRDogc3RyaW5nIHwgbnVsbFxuICBjb2x1bW5zOiBudW1iZXJcbiAgaXNMb2FkaW5nOiBib29sZWFuXG4gIGxvb2t1cHM6IFJldHVyblR5cGU8dHlwZW9mIGJ1aWxkTWVzc2FnZUxvb2t1cHM+XG59XG5cbi8qKlxuICogU2NhbnMgZm9yd2FyZCBmcm9tIGBpbmRleCsxYCB0byBjaGVjayBpZiBhbnkgXCJyZWFsXCIgY29udGVudCBmb2xsb3dzLiBVc2VkIHRvXG4gKiBkZWNpZGUgd2hldGhlciBhIGNvbGxhcHNlZCByZWFkL3NlYXJjaCBncm91cCBzaG91bGQgc3RheSBpbiBpdHMgYWN0aXZlXG4gKiAoZ3JleSBkb3QsIHByZXNlbnQtdGVuc2UgXCJSZWFkaW5n4oCmXCIpIHN0YXRlIHdoaWxlIHRoZSBxdWVyeSBpcyBzdGlsbCBsb2FkaW5nLlxuICpcbiAqIEV4cG9ydGVkIHNvIE1lc3NhZ2VzLnRzeCBjYW4gY29tcHV0ZSB0aGlzIG9uY2UgcGVyIG1lc3NhZ2UgYW5kIHBhc3MgdGhlXG4gKiByZXN1bHQgYXMgYSBib29sZWFuIHByb3Ag4oCUIGF2b2lkcyBwYXNzaW5nIHRoZSBmdWxsIGByZW5kZXJhYmxlTWVzc2FnZXNgIGFycmF5XG4gKiB0byBlYWNoIE1lc3NhZ2VSb3cgKHdoaWNoIFJlYWN0IENvbXBpbGVyIHdvdWxkIHBpbiBpbiB0aGUgZmliZXIncyBtZW1
Line truncated
|
||||
Reference in new issue
Block a user