import React, { useCallback, useState } from 'react';
import { useTerminalSize } from 'src/hooks/useTerminalSize.js';
import { type CodeSession, fetchCodeSessionsFromSessionsAPI } from 'src/utils/teleport/api.js';
// eslint-disable-next-line custom-rules/prefer-use-keybindings -- raw j/k/arrow list navigation
import { Box, Text, useInput } from '../ink.js';
import { useKeybinding } from '../keybindings/useKeybinding.js';
import { useShortcutDisplay } from '../keybindings/useShortcutDisplay.js';
import { logForDebugging } from '../utils/debug.js';
import { detectCurrentRepository } from '../utils/detectRepository.js';
import { formatRelativeTime } from '../utils/format.js';
import { ConfigurableShortcutHint } from './ConfigurableShortcutHint.js';
import { Select } from './CustomSelect/index.js';
import { Byline } from './design-system/Byline.js';
import { KeyboardShortcutHint } from './design-system/KeyboardShortcutHint.js';
import { Spinner } from './Spinner.js';
import { TeleportError } from './TeleportError.js';
type Props = {
  onSelect: (session: CodeSession) => void;
  onCancel: () => void;
  isEmbedded?: boolean;
};
type LoadErrorType = 'network' | 'auth' | 'api' | 'other';
const UPDATED_STRING = 'Updated';
const SPACE_BETWEEN_TABLE_COLUMNS = '  ';
export function ResumeTask({
  onSelect,
  onCancel,
  isEmbedded = false
}: Props): React.ReactNode {
  const {
    rows
  } = useTerminalSize();
  const [sessions, setSessions] = useState<CodeSession[]>([]);
  const [currentRepo, setCurrentRepo] = useState<string | null>(null);
  const [loading, setLoading] = useState(true);
  const [loadErrorType, setLoadErrorType] = useState<LoadErrorType | null>(null);
  const [retrying, setRetrying] = useState(false);
  const [hasCompletedTeleportErrorFlow, setHasCompletedTeleportErrorFlow] = useState(false);

  // Track focused index for scroll position display in title
  const [focusedIndex, setFocusedIndex] = useState(1);
  const escKey = useShortcutDisplay('confirm:no', 'Confirmation', 'Esc');
  const loadSessions = useCallback(async () => {
    try {
      setLoading(true);
      setLoadErrorType(null);

      // Detect current repository
      const detectedRepo = await detectCurrentRepository();
      setCurrentRepo(detectedRepo);
      logForDebugging(`Current repository: ${detectedRepo || 'not detected'}`);
      const codeSessions = await fetchCodeSessionsFromSessionsAPI();

      // Filter sessions by current repository if detected
      let filteredSessions = codeSessions;
      if (detectedRepo) {
        filteredSessions = codeSessions.filter(session => {
          if (!session.repo) return false;
          const sessionRepo = `${session.repo.owner.login}/${session.repo.name}`;
          return sessionRepo === detectedRepo;
        });
        logForDebugging(`Filtered ${filteredSessions.length} sessions for repo ${detectedRepo} from ${codeSessions.length} total`);
      }

      // Sort by updated_at (newest first)
      const sortedSessions = [...filteredSessions].sort((a, b) => {
        const dateA = new Date(a.updated_at);
        const dateB = new Date(b.updated_at);
        return dateB.getTime() - dateA.getTime();
      });
      setSessions(sortedSessions);
    } catch (err) {
      const errorMessage = err instanceof Error ? err.message : String(err);
      logForDebugging(`Error loading code sessions: ${errorMessage}`);
      setLoadErrorType(determineErrorType(errorMessage));
    } finally {
      setLoading(false);
      setRetrying(false);
    }
  }, []);
  const handleRetry = () => {
    setRetrying(true);
    void loadSessions();
  };

  // Handle escape via keybinding
  useKeybinding('confirm:no', onCancel, {
    context: 'Confirmation'
  });
  useInput((input, key) => {
    // We need to handle ctrl+c in case we don't render a <Select>
    if (key.ctrl && input === 'c') {
      onCancel();
      return;
    }

    // Handle retry in error state with 'ctrl+r'
    if (key.ctrl && input === 'r' && loadErrorType) {
      handleRetry();
      return;
    }

    // Handle enter key for error states to allow continuation with regular teleport
    if (loadErrorType !== null && key.return) {
      onCancel(); // This will continue with regular teleport flow
      return;
    }
  });
  const handleErrorComplete = useCallback(() => {
    setHasCompletedTeleportErrorFlow(true);
    void loadSessions();
  }, [setHasCompletedTeleportErrorFlow, loadSessions]);

  // Show error dialog if needed
  if (!hasCompletedTeleportErrorFlow) {
    return <TeleportError onComplete={handleErrorComplete} />;
  }
  if (loading) {
    return <Box flexDirection="column" padding={1}>
        <Box flexDirection="row">
          <Spinner />
          <Text bold>Loading Claude Code sessions…</Text>
        </Box>
        <Text dimColor>
          {retrying ? 'Retrying…' : 'Fetching your Claude Code sessions…'}
        </Text>
      </Box>;
  }
  if (loadErrorType) {
    return <Box flexDirection="column" padding={1}>
        <Text bold color="error">
          Error loading Claude Code sessions
        </Text>

        {renderErrorSpecificGuidance(loadErrorType)}

        <Text dimColor>
          Press <Text bold>Ctrl+R</Text> to retry · Press{' '}
          <Text bold>{escKey}</Text> to cancel
        </Text>
      </Box>;
  }
  if (sessions.length === 0) {
    return <Box flexDirection="column" padding={1}>
        <Text bold>
          No Claude Code sessions found
          {currentRepo && <Text> for {currentRepo}</Text>}
        </Text>
        <Box marginTop={1}>
          <Text dimColor>
            Press <Text bold>{escKey}</Text> to cancel
          </Text>
        </Box>
      </Box>;
  }
  const sessionMetadata = sessions.map(session_0 => ({
    ...session_0,
    timeString: formatRelativeTime(new Date(session_0.updated_at))
  }));
  const maxTimeStringLength = Math.max(UPDATED_STRING.length, ...sessionMetadata.map(meta => meta.timeString.length));
  const options = sessionMetadata.map(({
    timeString,
    title,
    id
  }) => {
    const paddedTime = timeString.padEnd(maxTimeStringLength, ' ');

    // TODO: include branch name when API returns it
    return {
      label: `${paddedTime}  ${title}`,
      value: id
    };
  });

  // Adjust layout for embedded vs full-screen rendering
  // Overhead: padding (2) + title (1) + marginY (2) + header (1) + footer (1) = 7
  const layoutOverhead = 7;
  const maxVisibleOptions = Math.max(1, isEmbedded ? Math.min(sessions.length, 5, rows - 6 - layoutOverhead) : Math.min(sessions.length, rows - 1 - layoutOverhead));
  const maxHeight = maxVisibleOptions + layoutOverhead;

  // Show scroll position in title when list needs scrolling
  const showScrollPosition = sessions.length > maxVisibleOptions;
  return <Box flexDirection="column" padding={1} height={maxHeight}>
      <Text bold>
        Select a session to resume
        {showScrollPosition && <Text dimColor>
            {' '}
            ({focusedIndex} of {sessions.length})
          </Text>}
        {currentRepo && <Text dimColor> ({currentRepo})</Text>}:
      </Text>
      <Box flexDirection="column" marginTop={1} flexGrow={1}>
        <Box marginLeft={2}>
          <Text bold>
            {UPDATED_STRING.padEnd(maxTimeStringLength, ' ')}
            {SPACE_BETWEEN_TABLE_COLUMNS}
            {'Session Title'}
          </Text>
        </Box>
        <Select visibleOptionCount={maxVisibleOptions} options={options} onChange={value => {
        const session_1 = sessions.find(s => s.id === value);
        if (session_1) {
          onSelect(session_1);
        }
      }} onFocus={value_0 => {
        const index = options.findIndex(o => o.value === value_0);
        if (index >= 0) {
          setFocusedIndex(index + 1);
        }
      }} />
      </Box>
      <Box flexDirection="row">
        <Text dimColor>
          <Byline>
            <KeyboardShortcutHint shortcut="↑/↓" action="select" />
            <KeyboardShortcutHint shortcut="Enter" action="confirm" />
            <ConfigurableShortcutHint action="confirm:no" context="Confirmation" fallback="Esc" description="cancel" />
          </Byline>
        </Text>
      </Box>
    </Box>;
}

/**
 * Determines the type of error based on the error message
 */
function determineErrorType(errorMessage: string): LoadErrorType {
  const message = errorMessage.toLowerCase();
  if (message.includes('fetch') || message.includes('network') || message.includes('timeout')) {
    return 'network';
  }
  if (message.includes('auth') || message.includes('token') || message.includes('permission') || message.includes('oauth') || message.includes('not authenticated') || message.includes('/login') || message.includes('console account') || message.includes('403')) {
    return 'auth';
  }
  if (message.includes('api') || message.includes('rate limit') || message.includes('500') || message.includes('529')) {
    return 'api';
  }
  return 'other';
}

/**
 * Renders error-specific troubleshooting guidance
 */
function renderErrorSpecificGuidance(errorType: LoadErrorType): React.ReactNode {
  switch (errorType) {
    case 'network':
      return <Box marginY={1} flexDirection="column">
          <Text dimColor>Check your internet connection</Text>
        </Box>;
    case 'auth':
      return <Box marginY={1} flexDirection="column">
          <Text dimColor>Teleport requires a Claude account</Text>
          <Text dimColor>
            Run <Text bold>/login</Text> and select &quot;Claude account with
            subscription&quot;
          </Text>
        </Box>;
    case 'api':
      return <Box marginY={1} flexDirection="column">
          <Text dimColor>Sorry, Claude encountered an error</Text>
        </Box>;
    case 'other':
      return <Box marginY={1} flexDirection="row">
          <Text dimColor>Sorry, Claude Code encountered an error</Text>
        </Box>;
  }
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZUNhbGxiYWNrIiwidXNlU3RhdGUiLCJ1c2VUZXJtaW5hbFNpemUiLCJDb2RlU2Vzc2lvbiIsImZldGNoQ29kZVNlc3Npb25zRnJvbVNlc3Npb25zQVBJIiwiQm94IiwiVGV4dCIsInVzZUlucHV0IiwidXNlS2V5YmluZGluZyIsInVzZVNob3J0Y3V0RGlzcGxheSIsImxvZ0ZvckRlYnVnZ2luZyIsImRldGVjdEN1cnJlbnRSZXBvc2l0b3J5IiwiZm9ybWF0UmVsYXRpdmVUaW1lIiwiQ29uZmlndXJhYmxlU2hvcnRjdXRIaW50IiwiU2VsZWN0IiwiQnlsaW5lIiwiS2V5Ym9hcmRTaG9ydGN1dEhpbnQiLCJTcGlubmVyIiwiVGVsZXBvcnRFcnJvciIsIlByb3BzIiwib25TZWxlY3QiLCJzZXNzaW9uIiwib25DYW5jZWwiLCJpc0VtYmVkZGVkIiwiTG9hZEVycm9yVHlwZSIsIlVQREFURURfU1RSSU5HIiwiU1BBQ0VfQkVUV0VFTl9UQUJMRV9DT0xVTU5TIiwiUmVzdW1lVGFzayIsIlJlYWN0Tm9kZSIsInJvd3MiLCJzZXNzaW9ucyIsInNldFNlc3Npb25zIiwiY3VycmVudFJlcG8iLCJzZXRDdXJyZW50UmVwbyIsImxvYWRpbmciLCJzZXRMb2FkaW5nIiwibG9hZEVycm9yVHlwZSIsInNldExvYWRFcnJvclR5cGUiLCJyZXRyeWluZyIsInNldFJldHJ5aW5nIiwiaGFzQ29tcGxldGVkVGVsZXBvcnRFcnJvckZsb3ciLCJzZXRIYXNDb21wbGV0ZWRUZWxlcG9ydEVycm9yRmxvdyIsImZvY3VzZWRJbmRleCIsInNldEZvY3VzZWRJbmRleCIsImVzY0tleSIsImxvYWRTZXNzaW9ucyIsImRldGVjdGVkUmVwbyIsImNvZGVTZXNzaW9ucyIsImZpbHRlcmVkU2Vzc2lvbnMiLCJmaWx0ZXIiLCJyZXBvIiwic2Vzc2lvblJlcG8iLCJvd25lciIsImxvZ2luIiwibmFtZSIsImxlbmd0aCIsInNvcnRlZFNlc3Npb25zIiwic29ydCIsImEiLCJiIiwiZGF0ZUEiLCJEYXRlIiwidXBkYXRlZF9hdCIsImRhdGVCIiwiZ2V0VGltZSIsImVyciIsImVycm9yTWVzc2FnZSIsIkVycm9yIiwibWVzc2FnZSIsIlN0cmluZyIsImRldGVybWluZUVycm9yVHlwZSIsImhhbmRsZVJldHJ5IiwiY29udGV4dCIsImlucHV0Iiwia2V5IiwiY3RybCIsInJldHVybiIsImhhbmRsZUVycm9yQ29tcGxldGUiLCJyZW5kZXJFcnJvclNwZWNpZmljR3VpZGFuY2UiLCJzZXNzaW9uTWV0YWRhdGEiLCJtYXAiLCJ0aW1lU3RyaW5nIiwibWF4VGltZVN0cmluZ0xlbmd0aCIsIk1hdGgiLCJtYXgiLCJtZXRhIiwib3B0aW9ucyIsInRpdGxlIiwiaWQiLCJwYWRkZWRUaW1lIiwicGFkRW5kIiwibGFiZWwiLCJ2YWx1ZSIsImxheW91dE92ZXJoZWFkIiwibWF4VmlzaWJsZU9wdGlvbnMiLCJtaW4iLCJtYXhIZWlnaHQiLCJzaG93U2Nyb2xsUG9zaXRpb24iLCJmaW5kIiwicyIsImluZGV4IiwiZmluZEluZGV4IiwibyIsInRvTG93ZXJDYXNlIiwiaW5jbHVkZXMiLCJlcnJvclR5cGUiXSwic291cmNlcyI6WyJSZXN1bWVUYXNrLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHsgdXNlQ2FsbGJhY2ssIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VUZXJtaW5hbFNpemUgfSBmcm9tICdzcmMvaG9va3MvdXNlVGVybWluYWxTaXplLmpzJ1xuaW1wb3J0IHtcbiAgdHlwZSBDb2RlU2Vzc2lvbixcbiAgZmV0Y2hDb2RlU2Vzc2lvbnNGcm9tU2Vzc2lvbnNBUEksXG59IGZyb20gJ3NyYy91dGlscy90ZWxlcG9ydC9hcGkuanMnXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY3VzdG9tLXJ1bGVzL3ByZWZlci11c2Uta2V5YmluZGluZ3MgLS0gcmF3IGovay9hcnJvdyBsaXN0IG5hdmlnYXRpb25cbmltcG9ydCB7IEJveCwgVGV4dCwgdXNlSW5wdXQgfSBmcm9tICcuLi9pbmsuanMnXG5pbXBvcnQgeyB1c2VLZXliaW5kaW5nIH0gZnJvbSAnLi4va2V5YmluZGluZ3MvdXNlS2V5YmluZGluZy5qcydcbmltcG9ydCB7IHVzZVNob3J0Y3V0RGlzcGxheSB9IGZyb20gJy4uL2tleWJpbmRpbmdzL3VzZVNob3J0Y3V0RGlzcGxheS5qcydcbmltcG9ydCB7IGxvZ0ZvckRlYnVnZ2luZyB9IGZyb20gJy4uL3V0aWxzL2RlYnVnLmpzJ1xuaW1wb3J0IHsgZGV0ZWN0Q3VycmVudFJlcG9zaXRvcnkgfSBmcm9tICcuLi91dGlscy9kZXRlY3RSZXBvc2l0b3J5LmpzJ1xuaW1wb3J0IHsgZm9ybWF0UmVsYXRpdmVUaW1lIH0gZnJvbSAnLi4vdXRpbHMvZm9ybWF0LmpzJ1xuaW1wb3J0IHsgQ29uZmlndXJhYmxlU2hvcnRjdXRIaW50IH0gZnJvbSAnLi9Db25maWd1cmFibGVTaG9ydGN1dEhpbnQuanMnXG5pbXBvcnQgeyBTZWxlY3QgfSBmcm9tICcuL0N1c3RvbVNlbGVjdC9pbmRleC5qcydcbmltcG9ydCB7IEJ5bGluZSB9IGZyb20gJy4vZGVzaWduLXN5c3RlbS9CeWxpbmUuanMnXG5pbXBvcnQgeyBLZXlib2FyZFNob3J0Y3V0SGludCB9IGZyb20gJy4vZGVzaWduLXN5c3RlbS9LZXlib2FyZFNob3J0Y3V0SGludC5qcydcbmltcG9ydCB7IFNwaW5uZXIgfSBmcm9tICcuL1NwaW5uZXIuanMnXG5pbXBvcnQgeyBUZWxlcG9ydEVycm9yIH0gZnJvbSAnLi9UZWxlcG9ydEVycm9yLmpzJ1xuXG50eXBlIFByb3BzID0ge1xuICBvblNlbGVjdDogKHNlc3Npb246IENvZGVTZXNzaW9uKSA9PiB2b2lkXG4gIG9uQ2FuY2VsOiAoKSA9PiB2b2lkXG4gIGlzRW1iZWRkZWQ/OiBib29sZWFuXG59XG5cbnR5cGUgTG9hZEVycm9yVHlwZSA9ICduZXR3b3JrJyB8ICdhdXRoJyB8ICdhcGknIHwgJ290aGVyJ1xuXG5jb25zdCBVUERBVEVEX1NUUklORyA9ICdVcGRhdGVkJ1xuY29uc3QgU1BBQ0VfQkVUV0VFTl9UQUJMRV9DT0xVTU5TID0gJyAgJ1xuXG5leHBvcnQgZnVuY3Rpb24gUmVzdW1lVGFzayh7XG4gIG9uU2VsZWN0LFxuICBvbkNhbmNlbCxcbiAgaXNFbWJlZGRlZCA9IGZhbHNlLFxufTogUHJvcHMpOiBSZWFjdC5SZWFjdE5vZGUge1xuICBjb25zdCB7IHJvd3MgfSA9IHVzZVRlcm1pbmFsU2l6ZSgpXG4gIGNvbnN0IFtzZXNzaW9ucywgc2V0U2Vzc2lvbnNdID0gdXNlU3RhdGU8Q29kZVNlc3Npb25bXT4oW10pXG4gIGNvbnN0IFtjdXJyZW50UmVwbywgc2V0Q3VycmVudFJlcG9dID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbClcblxuICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZSh0cnVlKVxuICBjb25zdCBbbG9hZEVycm9yVHlwZSwgc2V0TG9hZEVycm9yVHlwZV0gPSB1c2VTdGF0ZTxMb2FkRXJyb3JUeXBlIHwgbnVsbD4obnVsbClcbiAgY29uc3QgW3JldHJ5aW5nLCBzZXRSZXRyeWluZ10gPSB1c2VTdGF0ZShmYWxzZSlcblxuICBjb25zdCBbaGFzQ29tcGxldGVkVGVsZXBvcnRFcnJvckZsb3csIHNldEhhc0NvbXBsZXRlZFRlbGVwb3J0RXJyb3JGbG93XSA9XG4gICAgdXNlU3RhdGUoZmFsc2UpXG5cbiAgLy8gVHJhY2sgZm9jdXNlZCBpbmRleCBmb3Igc2Nyb2xsIHBvc2l0aW9uIGRpc3BsYXkgaW4gdGl0bGVcbiAgY29uc3QgW2ZvY3VzZWRJbmRleCwgc2V0Rm9jdXNlZEluZGV4XSA9IHVzZVN0YXRlKDEpXG5cbiAgY29uc3QgZXNjS2V5ID0gdXNlU2hvcnRjdXREaXNwbGF5KCdjb25maXJtOm5vJywgJ0NvbmZpcm1hdGlvbicsICdFc2MnKVxuXG4gIGNvbnN0IGxvYWRTZXNzaW9ucyA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgc2V0TG9hZGluZyh0cnVlKVxuICAgICAgc2V0TG9hZEVycm9yVHlwZShudWxsKVxuXG4gICAgICAvLyBEZXRlY3QgY3VycmVudCByZXBvc2l0b3J5XG4gICAgICBjb25zdCBkZXRlY3RlZFJlcG8gPSBhd2FpdCBkZXRlY3RDdXJyZW50UmVwb3NpdG9yeSgpXG4gICAgICBzZXRDdXJyZW50UmVwbyhkZXRlY3RlZFJlcG8pXG4gICAgICBsb2dGb3JEZWJ1Z2dpbmcoYEN1cnJlbnQgcmVwb3NpdG9yeTogJHtkZXRlY3RlZFJlcG8gfHwgJ25vdCBkZXRlY3RlZCd9YClcblxuICAgICAgY29uc3QgY29kZVNlc3Npb25zID0gYXdhaXQgZmV0Y2hDb2RlU2Vzc2lvbnNGcm9tU2Vzc2lvbnNBUEkoKVxuXG4gICAgICAvLyBGaWx0ZXIgc2Vzc2lvbnMgYnkgY3VycmVudCByZXBvc2l0b3J5IGlmIGRldGVjdGVkXG4gICAgICBsZXQgZmlsdGVyZWRTZXNzaW9ucyA9IGNvZGVTZXNzaW9uc1xuICAgICAgaWYgKGRldGVjdGVkUmVwbykge1xuICAgICAgICBmaWx0ZXJlZFNlc3Npb25zID0gY29kZVNlc3Npb25zLmZpbHRlcihzZXNzaW9uID0+IHtcbiAgICAgICAgICBpZiAoIXNlc3Npb24ucmVwbykgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgY29uc3Qgc2Vzc2lvblJlcG8gPSBgJHtzZXNzaW9uLnJlcG8ub3duZXIubG9naW59LyR7c2Vzc2lvbi5yZXBvLm5hbWV9YFxuICAgICAgICAgIHJldHVybiBzZXNzaW9uUmVwbyA9PT0gZGV0ZWN0ZWRSZXBvXG4gICAgICAgIH0pXG4gICAgICAgIGxvZ0ZvckRlYnVnZ2luZyhcbiAgICAgICAgICBgRmlsdGVyZWQgJHtmaWx0ZXJlZFNlc3Npb25zLmxlbmd0aH0gc2Vzc2lvbnMgZm9yIHJlcG8gJHtkZXRlY3RlZFJlcG99IGZyb20gJHtjb2RlU2Vzc2lvbnMubGVuZ3RofSB0b3RhbGAsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgLy8gU29ydCBieSB1cGRhdGVkX2F0IChuZXdlc3QgZmlyc3QpXG4gICAgICBjb25zdCBzb3J0ZWRTZXNzaW9ucyA9IFsuLi5maWx0ZXJlZFNlc3Npb25zXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGVBID0gbmV3IERhdGUoYS51cGRhdGVkX2F0KVxuICAgICAgICBjb25zdCBkYXRlQiA9IG5ldyBEYXRlKGIudXBkYXRlZF9hdClcbiAgICAgICAgcmV0dXJuIGRhdGVCLmdldFRpbWUoKSAtIGRhdGVBLmdldFRpbWUoKVxuICAgICAgfSlcblxuICAgICAgc2V0U2Vzc2lvbnMoc29ydGVkU2Vzc2lvbnMpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycilcbiAgICAgIGxvZ0ZvckRlYnVnZ2luZyhgRXJyb3IgbG9hZGluZyBjb2RlIHNlc3Npb25zOiAke2Vycm9yTWVzc2FnZX1gKVxuICAgICAgc2V0TG9hZEVycm9yVHlwZShkZXRlcm1pbmVFcnJvclR5cGUoZXJyb3JNZXNzYWdlKSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0TG9hZGluZyhmYWxzZSlcbiAgICAgIHNldFJldHJ5aW5nKGZhbHNlKVxuICAgIH1cbiAgfSwgW10pXG5cbiAgY29uc3QgaGFuZGxlUmV0cnkgPSAoKSA9PiB7XG4gICAgc2V0UmV0cnlpbmcodHJ1ZSlcbiAgICB2b2lkIGxvYWRTZXNzaW9ucygpXG4gIH1cblxuICAvLyBIYW5kbGUgZXNjYXBlIHZpYSBrZXliaW5kaW5nXG4gIHVzZUtleWJpbmRpbmcoJ2NvbmZpcm06bm8nLCBvbkNhbmNlbCwgeyBjb250ZXh0OiAnQ29uZmlybWF0aW9uJyB9KVxuXG4gIHVzZUlucHV0KChpbnB1dCwga2V5KSA9PiB7XG4gICAgLy8gV2UgbmVlZCB0byBoYW5kbGUgY3RybCtjIGluIGNhc2Ugd2UgZG9uJ3QgcmVuZGVyIGEgPFNlbGVjdD5cbiAgICBpZiAoa2V5LmN0cmwgJiYgaW5wdXQgPT09ICdjJykge1xuICAgICAgb25DYW5jZWwoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHJldHJ5IGluIGVycm9yIHN0YXRlIHdpdGggJ2N0cmwrcidcbiAgICBpZiAoa2V5LmN0cmwgJiYgaW5wdXQgPT09ICdyJyAmJiBsb2FkRXJyb3JUeXBlKSB7XG4gICAgICBoYW5kbGVSZXRyeSgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZW50ZXIga2V5IGZvciBlcnJvciBzdGF0ZXMgdG8gYWxsb3cgY29udGludWF0aW9uIHdpdGggcmVndWxhciB0ZWxlcG9ydFxuICAgIGlmIChsb2FkRXJyb3JUeXBlICE9PSBudWxsICYmIGtleS5yZXR1cm4pIHtcbiAgICAgIG9uQ2FuY2VsKCkgLy8gVGhpcyB3aWxsIGNvbnRpbnVlIHdpdGggcmVndWxhciB0ZWxlcG9ydCBmbG93XG4gICAgICByZXR1cm5cbiAgICB9XG4gIH0pXG5cbiAgY29uc3QgaGFuZGxlRXJyb3JDb21wbGV0ZSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRIYXNDb21wbGV0ZWRUZWxlcG9ydEVycm9yRmxvdyh0cnVlKVxuICAgIHZvaWQgbG9hZFNlc3Npb25zKClcbiAgfSwgW3NldEhhc0NvbXBsZXRlZFRlbGVwb3J0RXJyb3JGbG93LCBsb2FkU2Vzc2lvbnNdKVxuXG4gIC8vIFNob3cgZXJyb3IgZGlhbG9nIGlmIG5lZWRlZFxuICBpZiAoIWhhc0NvbXBsZXRlZFRlbGVwb3J0RXJyb3JGbG93KSB7XG4gICAgcmV0dXJuIDxUZWxlcG9ydEVycm9yIG9uQ29tcGxldGU9e2hhbmRsZUVycm9yQ29tcGxldGV9IC8+XG4gIH1cblxuICBpZiAobG9hZGluZykge1xuICAgIHJldHVybiAoXG4gICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIiBwYWRkaW5nPXsxfT5cbiAgICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwicm93XCI+XG4gICAgICAgICAgPFNwaW5uZXIgLz5cbiAgICAgICAgICA8VGV4dCBib2xkPkxvYWRpbmcgQ2xhdWRlIENvZGUgc2Vzc2lvbnPigKY8L1RleHQ+XG4gICAgICAgIDwvQm94PlxuICAgICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgICB7cmV0cnlpbmcgPyAnUmV0cnlpbmfigKYnIDogJ0ZldGNoaW5nIHlvdXIgQ2xhdWRlIENvZGUgc2Vzc2lvbnPigKYnfVxuICAgICAgICA8L1RleHQ+XG4gICAgICA8L0JveD5cbiAgICApXG4gIH1cblxuICBpZiAobG9hZEVycm9yVHlwZSkge1xuICAgIHJldHVybiAoXG4gICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIiBwYWRkaW5nPXsxfT5cbiAgICAgICAgPFRleHQgYm9sZCBjb2xvcj1cImVycm9yXCI+XG4gICAgICAgICAgRXJyb3IgbG9hZGluZyBDbGF1ZGUgQ29kZSBzZXNzaW9uc1xuICAgICAgICA8L1RleHQ+XG5cbiAgICAgICAge3JlbmRlckVycm9yU3BlY2lmaWNHdWlkYW5jZShsb2FkRXJyb3JUeXBlKX1cblxuICAgICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgICBQcmVzcyA8VGV4dCBib2xkPkN0cmwrUjwvVGV4dD4gdG8gcmV0cnkgwrcgUHJlc3N7JyAnfVxuICAgICAgICAgIDxUZXh0IGJvbGQ+e2VzY0tleX08L1RleHQ+IHRvIGNhbmNlbFxuICAgICAgICA8L1RleHQ+XG4gICAgICA8L0JveD5cbiAgICApXG4gIH1cblxuICBpZiAoc2Vzc2lvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiIHBhZGRpbmc9ezF9PlxuICAgICAgICA8VGV4dCBib2xkPlxuICAgICAgICAgIE5vIENsYXVkZSBDb2RlIHNlc3Npb25zIGZvdW5kXG4gICAgICAgICAge2N1cnJlbnRSZXBvICYmIDxUZXh0PiBmb3Ige2N1cnJlbnRSZXBvfTwvVGV4dD59XG4gICAgICAgIDwvVGV4dD5cbiAgICAgICAgPEJveCBtYXJnaW5Ub3A9ezF9PlxuICAgICAgICAgIDxUZXh0IGRpbUNvbG9yPlxuICAgICAgICAgICAgUHJlc3MgPFRleHQgYm9sZD57ZXNjS2V5fTwvVGV4dD4gdG8gY2FuY2VsXG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICA8L0JveD5cbiAgICAgIDwvQm94PlxuICAgIClcbiAgfVxuXG4gIGNvbnN0IHNlc3Npb25NZXRhZGF0YSA9IHNlc3Npb25zLm1hcChzZXNzaW9uID0+ICh7XG4gICAgLi4uc2Vzc2lvbixcbiAgICB0aW1lU3RyaW5nOiBmb3JtYXRSZWxhdGl2ZVRpbWUobmV3IERhdGUoc2Vzc2lvbi51cGRhdGVkX2F0KSksXG4gIH0pKVxuICBjb25zdCBtYXhUaW1lU3RyaW5nTGVuZ3RoID0gTWF0aC5tYXgoXG4gICAgVVBEQVRFRF9TVFJJTkcubGVuZ3RoLFxuICAgIC4uLnNlc3Npb25NZXRhZGF0YS5tYXAobWV0YSA9PiBtZXRhLnRpbWVTdHJpbmcubGVuZ3RoKSxcbiAgKVxuXG4gIGNvbnN0IG9wdGlvbnMgPSBzZXNzaW9uTWV0YWRhdGEubWFwKCh7IHRpbWVTdHJpbmcsIHRpdGxlLCBpZCB9KSA9PiB7XG4gICAgY29uc3QgcGFkZGVkVGltZSA9IHRpbWVTdHJpbmcucGFkRW5kKG1heFRpbWVTdHJpbmdMZW5ndGgsICcgJylcblxuICAgIC8vIFRPRE86IGluY2x1ZGUgYnJhbmNoIG5hbWUgd2hlbiBBUEkgcmV0dXJucyBpdFxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogYCR7cGFkZGVkVGltZX0gICR7dGl0bGV9YCxcbiAgICAgIHZhbHVlOiBpZCxcbiAgICB9XG4gIH0pXG5cbiAgLy8gQWRqdXN0IGxheW91dCBmb3IgZW1iZWRkZWQgdnMgZnVsbC1zY3JlZW4gcmVuZGVyaW5nXG4gIC8vIE92ZXJoZWFkOiBwYWRkaW5nICgyKSArIHRpdGxlICgxKSArIG1hcmdpblkgKDIpICsgaGVhZGVyICgxKSArIGZvb3RlciAoMSkgPSA3XG4gIGNvbnN0IGxheW91dE92ZXJoZWFkID0gN1xuICBjb25zdCBtYXhWaXNpYmxlT3B0aW9ucyA9IE1hdGgubWF4KFxuICAgIDEsXG4gICAgaXNFbWJlZGRlZFxuICAgICAgPyBNYXRoLm1pbihzZXNzaW9ucy5sZW5ndGgsIDUsIHJvd3MgLSA2IC0gbGF5b3V0T3ZlcmhlYWQpXG4gICAgICA6IE1hdGgubWluKHNlc3Npb25zLmxlbmd0aCwgcm93cyAtIDEgLSBsYXlvdXRPdmVyaGVhZCksXG4gIClcbiAgY29uc3QgbWF4SGVpZ2h0ID0gbWF4VmlzaWJsZU9wdGlvbnMgKyBsYXlvdXRPdmVyaGVhZFxuXG4gIC8vIFNob3cgc2Nyb2xsIHBvc2l0aW9uIGluIHRpdGxlIHdoZW4gbGlzdCBuZWVkcyBzY3JvbGxpbmdcbiAgY29uc3Qgc2hvd1Njcm9sbFBvc2l0aW9uID0gc2Vzc2lvbnMubGVuZ3RoID4gbWF4VmlzaWJsZU9wdGlvbnNcblxuICByZXR1cm4gKFxuICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiIHBhZGRpbmc9ezF9IGhlaWdodD17bWF4SGVpZ2h0fT5cbiAgICAgIDxUZXh0IGJvbGQ+XG4gICAgICAgIFNlbGVjdCBhIHNlc3Npb24gdG8gcmVzdW1lXG4gICAgICAgIHtzaG93U2Nyb2xsUG9zaXRpb24gJiYgKFxuICAgICAgICAgIDxUZXh0IGRpbUNvbG9yPlxuICAgICAgICAgICAgeycgJ31cbiAgICAgICAgICAgICh7Zm9jdXNlZEluZGV4fSBvZiB7c2Vzc2lvbnMubGVuZ3RofSlcbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICl9XG4gICAgICAgIHtjdXJyZW50UmVwbyAmJiA8VGV4dCBkaW1Db2xvcj4gKHtjdXJyZW50UmVwb30pPC9UZXh0Pn06XG4gICAgICA8L1RleHQ+XG4gICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIiBtYXJnaW5Ub3A9ezF9IGZsZXhHcm93PXsxfT5cbiAgICAgICAgPEJveCBtYXJnaW5MZWZ0PXsyfT5cbiAgICAgICAgICA8VGV4dCBib2xkPlxuICAgICAgICAgICAge1VQREFURURfU1RSSU5HLnBhZEVuZChtYXhUaW1lU3RyaW5nTGVuZ3RoLCAnICcpfVxuICAgICAgICAgICAge1NQQUNFX0JFVFdFRU5fVEFCTEVfQ09MVU1OU31cbiAgICAgICAgICAgIHsnU2Vzc2lvbiBUaXRsZSd9XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICA8L0JveD5cbiAgICAgICAgPFNlbGVjdFxuICAgICAgICAgIHZpc2libGVPcHRpb25Db3VudD17bWF4VmlzaWJsZU9wdGlvbnN9XG4gICAgICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgICAgICBvbkNoYW5nZT17dmFsdWUgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IHNlc3Npb25zLmZpbmQocyA9PiBzLmlkID09PSB2YWx1ZSlcbiAgICAgICAgICAgIGlmIChzZXNzaW9uKSB7XG4gICAgICAgICAgICAgIG9uU2VsZWN0KHNlc3Npb24pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfX1cbiAgICAgICAgICBvbkZvY3VzPXt2YWx1ZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IG9wdGlvbnMuZmluZEluZGV4KG8gPT4gby52YWx1ZSA9PT0gdmFsdWUpXG4gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICBzZXRGb2N1c2VkSW5kZXgoaW5kZXggKyAxKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH19XG4gICAgICAgIC8+XG4gICAgICA8L0JveD5cbiAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cInJvd1wiPlxuICAgICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgICA8QnlsaW5lPlxuICAgICAgICAgICAgPEtleWJvYXJkU2hvcnRjdXRIaW50IHNob3J0Y3V0PVwi4oaRL+KGk1wiIGFjdGlvbj1cInNlbGVjdFwiIC8+XG4gICAgICAgICAgICA8S2V5Ym9hcmRTaG9ydGN1dEhpbnQgc2hvcnRjdXQ9XCJFbnRlclwiIGFjdGlvbj1cImNvbmZpcm1cIiAvPlxuICAgICAgICAgICAgPENvbmZpZ3VyYWJsZVNob3J0Y3V0SGludFxuICAgICAgICAgICAgICBhY3Rpb249XCJjb25maXJtOm5vXCJcbiAgICAgICAgICAgICAgY29udGV4dD1cIkNvbmZpcm1hdGlvblwiXG4gICAgICAgICAgICAgIGZhbGxiYWNrPVwiRXNjXCJcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb249XCJjYW5jZWxcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L0J5bGluZT5cbiAgICAgICAgPC9UZXh0PlxuICAgICAgPC9Cb3g+XG4gICAgPC9Cb3g+XG4gIClcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSB0eXBlIG9mIGVycm9yIGJhc2VkIG9uIHRoZSBlcnJvciBtZXNzYWdlXG4gKi9cbmZ1bmN0aW9uIGRldGVybWluZUVycm9yVHlwZShlcnJvck1lc3NhZ2U6IHN0cmluZyk6IExvYWRFcnJvclR5cGUge1xuICBjb25zdCBtZXNzYWdlID0gZXJyb3JNZXNzYWdlLnRvTG93ZXJDYXNlKClcblxuICBpZiAoXG4gICAgbWVzc2FnZS5pbmNsdWRlcygnZmV0Y2gnKSB8fFxuICAgIG1lc3NhZ2UuaW5jbHVkZXMoJ25ldHdvcmsnKSB8fFxuICAgIG1lc3NhZ2UuaW5jbHVkZXMoJ3RpbWVvdXQnKVxuICApIHtcbiAgICByZXR1cm4gJ25ldHdvcmsnXG4gIH1cblxuICBpZiAoXG4gICAgbWVzc2FnZS5pbmNsdWRlcygnYXV0aCcpIHx8XG4gICAgbWVzc2FnZS5pbmNsdWRlcygndG9rZW4nKSB8fFxuICAgIG1lc3NhZ2UuaW5jbHVkZXMoJ3Blcm1pc3Npb24nKSB8fFxuICAgIG1lc3NhZ2UuaW5jbHVkZXMoJ29hdXRoJykgfHxcbiAgICBtZXNzYWdlLmluY2x1ZGVzKCdub3QgYXV0aGVudGljYXRlZCcpIHx8XG4gICAgbWVzc2FnZS5pbmNsdWRlcygnL2xvZ2luJykgfHxcbiAgICBtZXNzYWdlLmluY2x1ZGVzKCdjb25zb2xlIGFjY291bnQnKSB8fFxuICAgIG1lc3NhZ2UuaW5jbHVkZXMoJzQwMycpXG4gICkge1xuICAgIHJldHVybiAnYXV0aCdcbiAgfVxuXG4gIGlmIChcbiAgICBtZXNzYWdlLmluY2x1ZGVzKCdhcGknKSB8fFxuICAgIG1lc3NhZ2UuaW5jbHVkZXMoJ3JhdGUgbGltaXQnKSB8fFxuICAgIG1lc3NhZ2UuaW5jbHVkZXMoJzUwMCcpIHx8XG4gICAgbWVzc2FnZS5pbmNsdWRlcygnNTI5JylcbiAgKSB7XG4gICAgcmV0dXJuICdhcGknXG4gIH1cblxuICByZXR1cm4gJ290aGVyJ1xufVxuXG4vKipcbiAqIFJlbmRlcnMgZXJyb3Itc3BlY2lmaWMgdHJvdWJsZXNob290aW5nIGd1aWRhbmNlXG4gKi9cbmZ1bmN0aW9uIHJlbmRlckVycm9yU3BlY2lmaWNHdWlkYW5jZShcbiAgZXJyb3JUeXBlOiBMb2FkRXJyb3JUeXBlLFxuKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgc3dpdGNoIChlcnJvclR5cGUpIHtcbiAgICBjYXNlICduZXR3b3JrJzpcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxCb3ggbWFyZ2luWT17MX0gZmxleERpcmVjdGlvbj1cImNvbHVtblwiPlxuICAgICAgICAgIDxUZXh0IGRpbUNvbG9yPkNoZWNrIHlvdXIgaW50ZXJuZXQgY29ubmVjdGlvbjwvVGV4dD5cbiAgICAgICAgPC9Cb3g+XG4gICAgICApXG5cbiAgICBjYXNlICdhdXRoJzpcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxCb3ggbWFyZ2luWT17MX0gZmxleERpcmVjdGlvbj1cImNvbHVtblwiPlxuICAgICAgICAgIDxUZXh0IGRpbUNvbG9yPlRlbGVwb3J0IHJlcXVpcmVzIGEgQ2xhdWRlIGFjY291bnQ8L1RleHQ+XG4gICAgICAgICAgPFRleHQgZGltQ29sb3I+XG4gICAgICAgICAgICBSdW4gPFRleHQgYm9sZD4vbG9naW48L1RleHQ+IGFuZCBzZWxlY3QgJnF1b3Q7Q2xhdWRlIGFjY291bnQgd2l0aFxuICAgICAgICAgICAgc3Vic2NyaXB0aW9uJnF1b3Q7XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICA8L0JveD5cbiAgICAgIClcblxuICAgIGNhc2UgJ2FwaSc6XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8Qm94IG1hcmdpblk9ezF9IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIj5cbiAgICAgICAgICA8VGV4dCBkaW1Db2xvcj5Tb3JyeSwgQ2xhdWRlIGVuY291bnRlcmVkIGFuIGVycm9yPC9UZXh0PlxuICAgICAgICA8L0JveD5cbiAgICAgIClcblxuICAgIGNhc2UgJ290aGVyJzpcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxCb3ggbWFyZ2luWT17MX0gZmxleERpcmVjdGlvbj1cInJvd1wiPlxuICAgICAgICAgIDxUZXh0IGRpbUNvbG9yPlNvcnJ5LCBDbGF1ZGUgQ29kZSBlbmNvdW50ZXJlZCBhbiBlcnJvcjwvVGV4dD5cbiAgICAgICAgPC9Cb3g+XG4gICAgICApXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsS0FBSyxJQUFJQyxXQUFXLEVBQUVDLFFBQVEsUUFBUSxPQUFPO0FBQ3BELFNBQVNDLGVBQWUsUUFBUSw4QkFBOEI7QUFDOUQsU0FDRSxLQUFLQyxXQUFXLEVBQ2hCQyxnQ0FBZ0MsUUFDM0IsMkJBQTJCO0FBQ2xDO0FBQ0EsU0FBU0MsR0FBRyxFQUFFQyxJQUFJLEVBQUVDLFFBQVEsUUFBUSxXQUFXO0FBQy9DLFNBQVNDLGFBQWEsUUFBUSxpQ0FBaUM7QUFDL0QsU0FBU0Msa0JBQWtCLFFBQVEsc0NBQXNDO0FBQ3pFLFNBQVNDLGVBQWUsUUFBUSxtQkFBbUI7QUFDbkQsU0FBU0MsdUJBQXVCLFFBQVEsOEJBQThCO0FBQ3RFLFNBQVNDLGtCQUFrQixRQUFRLG9CQUFvQjtBQUN2RCxTQUFTQyx3QkFBd0IsUUFBUSwrQkFBK0I7QUFDeEUsU0FBU0MsTUFBTSxRQUFRLHlCQUF5QjtBQUNoRCxTQUFTQyxNQUFNLFFBQVEsMkJBQTJCO0FBQ2xELFNBQVNDLG9CQUFvQixRQUFRLHlDQUF5QztBQUM5RSxTQUFTQyxPQUFPLFFBQVEsY0FBYztBQUN0QyxTQUFTQyxhQUFhLFFBQVEsb0JB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