#! /bin/sh
## --------------------- ##
## M4sh Initialization.  ##
## --------------------- ##

# Be Bourne compatible
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
  emulate sh
  NULLCMD=:
  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
  # is contrary to our usage.  Disable this feature.
  alias -g '${1+"$@"}'='"$@"'
elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
  set -o posix
fi
DUALCASE=1; export DUALCASE # for MKS sh

# Support unset when possible.
if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
  as_unset=unset
else
  as_unset=false
fi


# Work around bugs in pre-3.0 UWIN ksh.
$as_unset ENV MAIL MAILPATH
PS1='$ '
PS2='> '
PS4='+ '

# NLS nuisances.
for as_var in \
  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
  LC_TELEPHONE LC_TIME
do
  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
    eval $as_var=C; export $as_var
  else
    $as_unset $as_var
  fi
done

# Required to use basename.
if expr a : '\(a\)' >/dev/null 2>&1; then
  as_expr=expr
else
  as_expr=false
fi

if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
  as_basename=basename
else
  as_basename=false
fi


# Name of the executable.
as_me=`$as_basename "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
	 X"$0" : 'X\(//\)$' \| \
	 X"$0" : 'X\(/\)$' \| \
	 .     : '\(.\)' 2>/dev/null ||
echo X/"$0" |
    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
  	  /^X\/\(\/\).*/{ s//\1/; q; }
  	  s/.*/./; q'`


# PATH needs CR, and LINENO needs CR and PATH.
# Avoid depending upon Character Ranges.
as_cr_letters='abcdefghijklmnopqrstuvwxyz'
as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
as_cr_Letters=$as_cr_letters$as_cr_LETTERS
as_cr_digits='0123456789'
as_cr_alnum=$as_cr_Letters$as_cr_digits

# The user is always right.
if test "${PATH_SEPARATOR+set}" != set; then
  echo "#! /bin/sh" >conf$$.sh
  echo  "exit 0"   >>conf$$.sh
  chmod +x conf$$.sh
  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
    PATH_SEPARATOR=';'
  else
    PATH_SEPARATOR=:
  fi
  rm -f conf$$.sh
fi


  as_lineno_1=$LINENO
  as_lineno_2=$LINENO
  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
  test "x$as_lineno_1" != "x$as_lineno_2" &&
  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
  # Find who we are.  Look in the path if we contain no path at all
  # relative or not.
  case $0 in
    *[\\/]* ) as_myself=$0 ;;
    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
done

       ;;
  esac
  # We did not find ourselves, most probably we were run as `sh COMMAND'
  # in which case we are not to be found in the path.
  if test "x$as_myself" = x; then
    as_myself=$0
  fi
  if test ! -f "$as_myself"; then
    { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
   { (exit 1); exit 1; }; }
  fi
  case $CONFIG_SHELL in
  '')
    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
  for as_base in sh bash ksh sh5; do
	 case $as_dir in
	 /*)
	   if ("$as_dir/$as_base" -c '
  as_lineno_1=$LINENO
  as_lineno_2=$LINENO
  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
  test "x$as_lineno_1" != "x$as_lineno_2" &&
  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
	     CONFIG_SHELL=$as_dir/$as_base
	     export CONFIG_SHELL
	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
	   fi;;
	 esac
       done
done
;;
  esac

  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
  # uniformly replaced by the line number.  The first 'sed' inserts a
  # line-number line before each line; the second 'sed' does the real
  # work.  The second script uses 'N' to pair each line-number line
  # with the numbered line, and appends trailing '-' during
  # substitution so that $LINENO is not a special case at line end.
  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
  sed '=' <$as_myself |
    sed '
      N
      s,$,-,
      : loop
      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
      t loop
      s,-$,,
      s,^['$as_cr_digits']*\n,,
    ' >$as_me.lineno &&
  chmod +x $as_me.lineno ||
    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
   { (exit 1); exit 1; }; }

  # Don't try to exec as it changes $[0], causing all sort of problems
  # (the dirname of $[0] is not the place where we might find the
  # original and so on.  Autoconf is especially sensible to this).
  . ./$as_me.lineno
  # Exit status is that of the last command.
  exit
}


case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
  *c*,-n*) ECHO_N= ECHO_C='
' ECHO_T='	' ;;
  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
esac

if expr a : '\(a\)' >/dev/null 2>&1; then
  as_expr=expr
else
  as_expr=false
fi

rm -f conf$$ conf$$.exe conf$$.file
echo >conf$$.file
if ln -s conf$$.file conf$$ 2>/dev/null; then
  # We could just check for DJGPP; but this test a) works b) is more generic
  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
  if test -f conf$$.exe; then
    # Don't use ln at all; we don't have any links
    as_ln_s='cp -p'
  else
    as_ln_s='ln -s'
  fi
elif ln conf$$.file conf$$ 2>/dev/null; then
  as_ln_s=ln
else
  as_ln_s='cp -p'
fi
rm -f conf$$ conf$$.exe conf$$.file

if mkdir -p . 2>/dev/null; then
  as_mkdir_p=:
else
  test -d ./-p && rmdir ./-p
  as_mkdir_p=false
fi

as_executable_p="test -f"

# Sed expression to map a string onto a valid CPP name.
as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"

# Sed expression to map a string onto a valid variable name.
as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"


# IFS
# We need space, tab and new line, in precisely that order.
as_nl='
'
IFS=" 	$as_nl"

# CDPATH.
$as_unset CDPATH


SHELL=${CONFIG_SHELL-/bin/sh}

# How were we run?
at_cli_args="$@"

# Load the config file.
for at_file in atconfig atlocal
do
  test -r $at_file || continue
  . ./$at_file || { echo "$as_me: error: invalid content: $at_file" >&2
   { (exit 1); exit 1; }; }
done

# atconfig delivers paths relative to the directory the test suite is
# in, but the groups themselves are run in testsuite-dir/group-dir.
if test -n "$at_top_srcdir"; then
  builddir=../..
  for at_dir in srcdir top_srcdir top_builddir
  do
    at_val=`eval echo '${'at_$at_dir'}'`
    eval "$at_dir=\$at_val/../.."
  done
fi

# Not all shells have the 'times' builtin; the subshell is needed to make
# sure we discard the 'times: not found' message from the shell.
at_times_p=false
(times) >/dev/null 2>&1 && at_times_p=:

# CLI Arguments to pass to the debugging scripts.
at_debug_args=
# -e sets to true
at_errexit_p=false
# Shall we be verbose?
at_verbose=:
at_quiet=echo

# Shall we keep the debug scripts?  Must be `:' when the suite is
# run by a debug script, so that the script doesn't remove itself.
at_debug_p=false
# Display help message?
at_help_p=false
# List test groups?
at_list_p=false
# Test groups to run
at_groups=

# The directory we are in.
at_dir=`pwd`
# The directory the whole suite works in.
# Should be absolutely to let the user `cd' at will.
at_suite_dir=$at_dir/$as_me.dir
# The file containing the suite.
at_suite_log=$at_dir/$as_me.log
# The file containing the location of the last AT_CHECK.
at_check_line_file=$at_suite_dir/at-check-line
# The file containing the exit status of the last command.
at_status_file=$at_suite_dir/at-status
# The files containing the output of the tested commands.
at_stdout=$at_suite_dir/at-stdout
at_stder1=$at_suite_dir/at-stder1
at_stderr=$at_suite_dir/at-stderr
# The file containing dates.
at_times_file=$at_suite_dir/at-times

# List of the tested programs.
at_tested='monotone'
# List of the all the test groups.
at_groups_all=' 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29'
# As many dots as there are digits in the last test group number.
# Used to normalize the test group numbers so that `ls' lists them in
# numerical order.
at_format='..'
# Description of all the test groups.
at_help_all='1;t_null.at:3;basic invocations and options;;
2;t_scan.at:3;scanning trees;;
3;t_import.at:3;importing a file;;
4;t_genkey.at:3;generating and extracting keys and certs;;
5;t_unidiff.at:3;calculation of unidiffs;;
6;t_persist_phrase.at:3;persistence of passphrase;;
7;t_versions.at:3;multiple version committing;;
8;t_fork.at:3;creating a fork;;
9;t_update.at:3;creating a fork and updating;;
10;t_merge.at:3;creating a fork and merging;;
11;t_unidiff2.at:3;calculation of incorrect unidiffs;;
12;t_cwork.at:3;delete work file on checkout;;
13;t_revert.at:3;revert file to base version;;
14;t_drop.at:3;drop and re-add file does nothing;;
15;t_cross.at:3;creating a bad criss-cross merge;;
16;t_rename.at:3;renaming a file;;
17;t_renamed.at:3;renaming a directory;;
18;t_erename.at:3;renaming and editing a file;;
19;t_cvsimport.at:3;importing CVS files;;
20;t_i18n_file.at:3;importing files with non-english names;;
21;t_fmerge.at:3;external unit test of the line merger;;
22;t_netsync.at:3;exchanging work via netsync;;
23;t_disapprove.at:3;creating a trusted and untrusted update;;
24;t_testresult.at:3;creating a good and bad test result;;
25;t_singlecvs.at:3;importing a CVS file with one version;;
26;t_singlenetsync.at:3;single manifest netsync;;
27;t_ls_missing.at:3;list missing files;;
28;t_attributes.at:3;attribute support;;
29;t_single_char_filenames.at:6;single character filename support;;
'

at_keywords=
at_prev=
for at_option
do
  # If the previous option needs an argument, assign it.
  if test -n "$at_prev"; then
    at_option=$at_prev=$at_option
    at_prev=
  fi

  at_optarg=`expr "x$at_option" : 'x[^=]*=\(.*\)'`

  # Accept the important Cygnus configure options, so we can diagnose typos.

  case $at_option in
    --help | -h )
	at_help_p=:
	;;

    --list | -l )
	at_list_p=:
	;;

    --version | -V )
	echo "$as_me (monotone 0.13)"
	exit 0
	;;

    --clean | -c )
	rm -rf $at_suite_dir $at_suite_log
	exit 0
	;;

    --debug | -d )
	at_debug_p=:
	;;

    --errexit | -e )
	at_debug_p=:
	at_errexit_p=:
	;;

    --verbose | -v )
	at_verbose=echo; at_quiet=:
	;;

    --trace | -x )
	at_traceon='set -vx'; at_traceoff='set +vx'
	;;

    [0-9] | [0-9][0-9] | [0-9][0-9][0-9] | [0-9][0-9][0-9][0-9])
	at_groups="$at_groups$at_option "
	;;

    # Ranges
    [0-9]- | [0-9][0-9]- | [0-9][0-9][0-9]- | [0-9][0-9][0-9][0-9]-)
	at_range_start=`echo $at_option |tr -d '-'`
	at_range=`echo " $at_groups_all " | \
	  sed -e 's,^.* '$at_range_start' ,'$at_range_start' ,'`
	at_groups="$at_groups$at_range "
	;;

    -[0-9] | -[0-9][0-9] | -[0-9][0-9][0-9] | -[0-9][0-9][0-9][0-9])
	at_range_end=`echo $at_option |tr -d '-'`
	at_range=`echo " $at_groups_all " | \
	  sed -e 's, '$at_range_end' .*$, '$at_range_end','`
	at_groups="$at_groups$at_range "
	;;

    [0-9]-[0-9] | [0-9]-[0-9][0-9] | [0-9]-[0-9][0-9][0-9] | \
    [0-9]-[0-9][0-9][0-9][0-9] | [0-9][0-9]-[0-9][0-9] | \
    [0-9][0-9]-[0-9][0-9][0-9] | [0-9][0-9]-[0-9][0-9][0-9][0-9] | \
    [0-9][0-9][0-9]-[0-9][0-9][0-9] | \
    [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9] | \
    [0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9] )
	at_range_start=`echo $at_option |sed 's,-.*,,'`
	at_range_end=`echo $at_option |sed 's,.*-,,'`
	# FIXME: Maybe test to make sure start <= end?
	at_range=`echo " $at_groups_all " | \
	  sed -e 's,^.* '$at_range_start' ,'$at_range_start' ,' \
	      -e 's, '$at_range_end' .*$, '$at_range_end','`
	at_groups="$at_groups$at_range "
	;;

    # Keywords.
    --keywords | -k )
	at_prev=--keywords
	;;
    --keywords=* )
	at_keywords="$at_keywords,$at_optarg"
	;;

    *=*)
  	at_envvar=`expr "x$at_option" : 'x\([^=]*\)='`
  	# Reject names that are not valid shell variable names.
  	expr "x$at_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
  	  { echo "$as_me: error: invalid variable name: $at_envvar" >&2
   { (exit 1); exit 1; }; }
  	at_value=`echo "$at_optarg" | sed "s/'/'\\\\\\\\''/g"`
  	eval "$at_envvar='$at_value'"
  	export $at_envvar
	# Propagate to debug scripts.
  	at_debug_args="$at_debug_args $at_option"
  	;;

     *) echo "$as_me: invalid option: $at_option" >&2
	echo "Try \`$0 --help' for more information." >&2
	exit 1
	;;
  esac
done

# Process the --keywords
if test -n "$at_keywords"; then
  at_groups_selected=$at_help_all
  for at_keyword in `IFS=,; set X $at_keywords; shift; echo ${1+$@}`
  do
    # It is on purpose that we match the test group titles too.
    at_groups_selected=`echo "$at_groups_selected" |
			grep -i "^[^;]*;[^;]*.*[; ]$at_keyword[ ;]"`
  done
  at_groups_selected=`echo "$at_groups_selected" | sed 's/;.*//'`
  # Smash the end of lines.
  at_groups_selected=`echo $at_groups_selected`
  at_groups="$at_groups$at_groups_selected "
fi

# Selected test groups.
test -z "$at_groups" && at_groups=$at_groups_all

# Help message.
if $at_help_p; then
  cat <<_ATEOF
Usage: $0 [OPTION]... [VARIABLE=VALUE]... [TESTS]

Run all the tests, or the selected TESTS, and save a detailed log file.
Upon failure, create debugging scripts.

You should not change environment variables unless explicitly passed
as command line arguments.  Set \`AUTOTEST_PATH' to select the executables
to exercise.  Each relative directory is expanded as build and source
directories relatively to the top level of this distribution.  E.g.,

  $ $0 AUTOTEST_PATH=bin

possibly amounts into

  PATH=/tmp/foo-1.0/bin:/src/foo-1.0/bin:\$PATH
_ATEOF
cat <<_ATEOF

Operation modes:
  -h, --help     print the help message, then exit
  -V, --version  print version number, then exit
  -c, --clean    remove all the files this test suite might create and exit
  -l, --list     describes all the tests, or the selected TESTS
_ATEOF
cat <<_ATEOF

Execution tuning:
  -k, --keywords=KEYWORDS
	         select the tests matching all the comma separated KEYWORDS
	         accumulates
  -e, --errexit  abort as soon as a test fails; implies --debug
  -v, --verbose  force more detailed output
	         default for debugging scripts
  -d, --debug    inhibit clean up and debug script creation
	         default for debugging scripts
  -x, --trace    enable tests shell tracing
_ATEOF
cat <<_ATEOF

Report bugs to <graydon@pobox.com>.
_ATEOF
  exit 0
fi

# List of tests.
if $at_list_p; then
  cat <<_ATEOF
monotone 0.13 test suite: integration tests test groups:

 NUM: FILENAME:LINE      TEST-GROUP-NAME
      KEYWORDS

_ATEOF
  # "  1 42  45 " => "^(1|42|45);".
  at_groups_pattern=`echo "$at_groups" | sed 's/^  *//;s/  *$//;s/  */|/g'`
  echo "$at_help_all" |
    awk 'BEGIN { FS = ";" }
	 { if ($1 !~ /^('"$at_groups_pattern"')$/) next }
	 { if ($1) printf " %3d: %-18s %s\n", $1, $2, $3
	   if ($4) printf "      %s\n", $4 } '
  exit 0
fi

# Don't take risks: use only absolute directories in PATH.
#
# For stand-alone test suites, AUTOTEST_PATH is relative to `.'.
#
# For embedded test suites, AUTOTEST_PATH is relative to the top level
# of the package.  Then expand it into build/src parts, since users
# may create executables in both places.
#
# There might be directories that don't exist, but don't redirect
# builtins' (eg., cd) stderr directly: Ultrix's sh hates that.
AUTOTEST_PATH=`echo $AUTOTEST_PATH | tr ':' $PATH_SEPARATOR`
at_path=
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $AUTOTEST_PATH $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
  case $as_dir in
  [\\/]* | ?:[\\/]* )
    at_path=$at_path$PATH_SEPARATOR$as_dir
    ;;
  * )
    if test -z "$at_top_builddir"; then
      # Stand-alone test suite.
      at_path=$at_path$PATH_SEPARATOR$as_dir
    else
      # Embedded test suite.
      at_path=$at_path$PATH_SEPARATOR$at_top_builddir/$as_dir
      at_path=$at_path$PATH_SEPARATOR$at_top_srcdir/$as_dir
    fi
    ;;
esac
done


# Now build and simplify PATH.
PATH=
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $at_path
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
  as_dir=`(cd "$as_dir" && pwd) 2>/dev/null`
test -d "$as_dir" || continue
case $PATH in
	          $as_dir                 | \
	          $as_dir$PATH_SEPARATOR* | \
  *$PATH_SEPARATOR$as_dir                 | \
  *$PATH_SEPARATOR$as_dir$PATH_SEPARATOR* ) ;;

  '') PATH=$as_dir ;;
   *) PATH=$PATH$PATH_SEPARATOR$as_dir ;;
esac
done

export PATH

# Setting up the FDs.
# 5 is the log file.  Not to be overwritten if `-d'.

$at_debug_p && at_suite_log=/dev/null
exec 5>$at_suite_log

# Banners and logs.
cat <<\_ASBOX
## -------------------------------------------- ##
## monotone 0.13 test suite: integration tests. ##
## -------------------------------------------- ##
_ASBOX
{
  cat <<\_ASBOX
## -------------------------------------------- ##
## monotone 0.13 test suite: integration tests. ##
## -------------------------------------------- ##
_ASBOX
  echo

  echo "$as_me: command line was:"
  echo "  $ $0 $at_cli_args"
  echo

  # Try to find a few ChangeLogs in case it might help determining the
  # exact version.  Use the relative dir: if the top dir is a symlink,
  # find will not follow it (and options to follow the links are not
  # portable), which would result in no output here.
  if test -n "$at_top_srcdir"; then
    cat <<\_ASBOX
## ----------- ##
## ChangeLogs. ##
## ----------- ##
_ASBOX
    echo
    for at_file in `find "$at_top_srcdir" -name ChangeLog -print`
    do
      echo "$as_me: $at_file:"
      sed 's/^/| /;10q' $at_file
      echo
    done

    {
cat <<_ASUNAME
## --------- ##
## Platform. ##
## --------- ##

hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
uname -m = `(uname -m) 2>/dev/null || echo unknown`
uname -r = `(uname -r) 2>/dev/null || echo unknown`
uname -s = `(uname -s) 2>/dev/null || echo unknown`
uname -v = `(uname -v) 2>/dev/null || echo unknown`

/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`

/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
hostinfo               = `(hostinfo) 2>/dev/null               || echo unknown`
/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`

_ASUNAME

as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
  echo "PATH: $as_dir"
done

}
    echo
  fi

  # Contents of the config files.
  for at_file in atconfig atlocal
  do
    test -r $at_file || continue
    echo "$as_me: $at_file:"
    sed 's/^/| /' $at_file
    echo
  done

  cat <<\_ASBOX
## ---------------- ##
## Tested programs. ##
## ---------------- ##
_ASBOX
  echo
} >&5

# Report what programs are being tested.
for at_program in : $at_tested
do
  test "$at_program" = : && continue
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
  test -f $as_dir/$at_program && break
done

  if test -f $as_dir/$at_program; then
    {
      echo "testsuite.at:12: $as_dir/$at_program --version"
      $as_dir/$at_program --version
      echo
    } >&5 2>&1
  else
    { { echo "$as_me:$LINENO: error: cannot find $at_program" >&5
echo "$as_me: error: cannot find $at_program" >&2;}
   { (exit 1); exit 1; }; }
  fi
done

{
  cat <<\_ASBOX
## ------------------ ##
## Running the tests. ##
## ------------------ ##
_ASBOX
} >&5

at_start_date=`date`
at_start_time=`(date +%s) 2>/dev/null`
echo "$as_me: starting at: $at_start_date" >&5
at_xpass_list=
at_xfail_list=
at_pass_list=
at_fail_list=
at_skip_list=
at_group_count=0

# Create the master directory if it doesn't already exist.
test -d $at_suite_dir ||
  mkdir $at_suite_dir ||
  { { echo "$as_me:$LINENO: error: cannot create $at_suite_dir" >&5
echo "$as_me: error: cannot create $at_suite_dir" >&2;}
   { (exit 1); exit 1; }; }

# Can we diff with `/dev/null'?  DU 5.0 refuses.
if diff /dev/null /dev/null >/dev/null 2>&1; then
  at_devnull=/dev/null
else
  at_devnull=$at_suite_dir/devnull
  cp /dev/null $at_devnull
fi

# Use `diff -u' when possible.
if diff -u $at_devnull $at_devnull >/dev/null 2>&1; then
  at_diff='diff -u'
else
  at_diff=diff
fi


for at_group in $at_groups
do
  # Be sure to come back to the top test directory.
  cd $at_suite_dir

  case $at_group in
    banner-*)
      at_group_log=$at_suite_log
      ;;

    *)
      # Skip tests we already run (using --keywords makes it easy to get
      # duplication).
      case " $at_pass_test $at_skip_test $at_fail_test " in
	*" $at_group "* ) continue;;
      esac

      # Normalize the test group number.
      at_group_normalized=`expr "00000$at_group" : ".*\($at_format\)"`

      # Create a fresh directory for the next test group, and enter.
      at_group_dir=$at_suite_dir/$at_group_normalized
      at_group_log=$at_group_dir/$as_me.log
      rm -rf $at_group_dir
      mkdir $at_group_dir ||
	{ { echo "$as_me:$LINENO: error: cannot create $at_group_dir" >&5
echo "$as_me: error: cannot create $at_group_dir" >&2;}
   { (exit 1); exit 1; }; }
      cd $at_group_dir
      ;;
  esac

  echo 0 > $at_status_file

  # Clearly separate the test groups when verbose.
  test $at_group_count != 0 && $at_verbose

  # In verbose mode, append to the log file *and* show on
  # the standard output; in quiet mode only write to the log
  if test $at_verbose = echo; then
    at_tee_pipe="tee -a $at_group_log"
  else
    at_tee_pipe="cat >> $at_group_log"
  fi

  case $at_group in
  1 ) # 1. t_null.at:3: basic invocations and options
    at_setup_line='t_null.at:3'
    at_desc='basic invocations and options'
    $at_quiet $ECHO_N "  1: basic invocations and options                $ECHO_C"
    at_xfail=no
    (
      echo "1. t_null.at:3: testing ..."
      $at_traceon


$at_traceoff
echo "t_null.at:5: monotone --norc"
echo t_null.at:5 >$at_check_line_file
( $at_traceon; monotone --norc ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_null.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_null.at:6: monotone --help"
echo t_null.at:6 >$at_check_line_file
( $at_traceon; monotone --help ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_null.at:6: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_null.at:7: monotone --version"
echo t_null.at:7 >$at_check_line_file
( $at_traceon; monotone --version ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_null.at:7: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_null.at:8: monotone --nostd   --help"
echo t_null.at:8 >$at_check_line_file
( $at_traceon; monotone --nostd   --help ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_null.at:8: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_null.at:9: monotone --norc    --help"
echo t_null.at:9 >$at_check_line_file
( $at_traceon; monotone --norc    --help ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_null.at:9: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_null.at:10: monotone --verbose --help"
echo t_null.at:10 >$at_check_line_file
( $at_traceon; monotone --verbose --help ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_null.at:10: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_null.at:11: monotone --quiet   --help"
echo t_null.at:11 >$at_check_line_file
( $at_traceon; monotone --quiet   --help ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_null.at:11: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_null.at:12: monotone --db=foo.db   --help"
echo t_null.at:12 >$at_check_line_file
( $at_traceon; monotone --db=foo.db   --help ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_null.at:12: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_null.at:13: monotone --db foo.db   --help"
echo t_null.at:13 >$at_check_line_file
( $at_traceon; monotone --db foo.db   --help ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_null.at:13: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_null.at:14: monotone --key=someone@foo.com   --help"
echo t_null.at:14 >$at_check_line_file
( $at_traceon; monotone --key=someone@foo.com   --help ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_null.at:14: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_null.at:15: monotone --key someone@foo.com   --help"
echo t_null.at:15 >$at_check_line_file
( $at_traceon; monotone --key someone@foo.com   --help ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_null.at:15: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


      $at_traceoff
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  2 ) # 2. t_scan.at:3: scanning trees
    at_setup_line='t_scan.at:3'
    at_desc='scanning trees'
    $at_quiet $ECHO_N "  2: scanning trees                               $ECHO_C"
    at_xfail=no
    (
      echo "2. t_scan.at:3: testing ..."
      $at_traceon




cat >test_keys <<'_ATEOF'
[pubkey tester@test.net]
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCfN/cAMabgb6T7m8ksGnpQ7LO6hOdnc/7V
yivrRGtmpwSItljht1bmgLQF37KiSPoMEDUb1stfKxaMsYiy8iTyoQ+M2EVFP37n2rtnNZ0H
oVcQd2sRsCerQFh9nslRPymlkQXUlOiNFN6RlFNcdjkucqNe+YorFX21EYw7XuT5XwIBEQ==
[end]
[privkey tester@test.net]
npy0jyqbZdylFkMjdR9OvlqmDHuBGXpGFPt94h96aG+Lp+OdBCmWx8GueHk8FKkexwPqhRBM
PPopUeuwqxuSX+yEodMl5IHBmin0nLnbOeBjtasjemBFEmdNl/jPDF/AeQ2WHhanB731dSQc
vzLOQfKAYmfk56PPULi9oJJNUxaCkvsWtvaI+HUHZrjyyV7dA4Vsc6Jvx2Yf1+MdDAEGk/Rw
ZtP0LmuoiyvRDFqBF8aTmnotyb4kRKohnJ7VF+y6hYvmtMpM3TKnpR7EbojBzNPqKuO7nPUz
jGxA7F84O24Vbf128PNSI5vj4istow26aPjn28qPjfRrkV30WLL/dXfYJkfkTqglYnoEXvF/
xZoVxxNeAX58mgy0A1ErVxv8U7TwuP983GHEpLwy3gbiP+9akAJCr8r823DHmQqq5QDELibP
cuXZfOttpfVRkcbMhjeF0M6czc4HoKgHTAnf/18hzdZwGX/WWvRIBHImbUJ+mDbp2ByDTfKf
ErGXSvZ3HxCqBD8yx1SnXhV8IDHaBmV9wwYcN+H2cxOWGZk7g7xJS19+a3UQB3c3sSXQVJBp
6QpCZgysxkZwzuXDzzLZPT9SLZz4K2p7+7BwMbpy9ZxcyAzmiEtpA24UP06jtjFN7WcXAdx/
E5Gmoe9b1EiXWdReHjUGpc6k0LQ0PPXAwqrcGdwYbOLDZ5xsQ5AsEYSFtyTS60D1nHBcdNmW
M0eOUJFdJf/uNe/2EApc3a8TyEkZtVqiYtOVV3qDB9NmU4bVOkDqzl1F7zJwATWbmasSdkM3
6lxDkczBfCrEjH5p5Y8DU+ge4e4LRtknY9oBOJ7EQO0twYJg3k0=
[end]
_ATEOF


cat >test_hooks.lua <<'_ATEOF'

-- this is the "testing" set of lua hooks for monotone
-- it's intended to support self-tests, not for use in
-- production. just defines some of the std hooks.

function get_passphrase(keyid)
	return keyid
end

function non_blocking_rng_ok()
	return true
end

function get_manifest_cert_trust(signers, id, name, val)
   return true
end

function get_file_cert_trust(signers, id, name, val)
   return true
end

function accept_testresult_change(old_results, new_results)
   for test,res in pairs(old_results)
   do
      if res == true and new_results[test] ~= true
      then
	 return false
      end
   end
   return true
end

function get_author(branchname)
	return "tester@test.net"
end

function ignore_file(name)
	if (strfind(name, "test_hooks.lua")) then return true end
	if (strfind(name, "test.db")) then return true end
	return false
end

if (attr_functions == nil) then
  attr_functions = {}
end
attr_functions["test_attr"] =
  function(filename, value)
    io.write(string.format("test_attr:%s:%s\n", filename, value))
  end

_ATEOF


$at_traceoff
echo "t_scan.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init"
echo t_scan.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_scan.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_scan.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys"
echo t_scan.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_scan.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_scan.at:5: rm test_keys"
echo t_scan.at:5 >$at_check_line_file
( $at_traceon; rm test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_scan.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_scan.at:7: mkdir foo"
echo t_scan.at:7 >$at_check_line_file
( $at_traceon; mkdir foo ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_scan.at:7: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_scan.at:8: mkdir foo/bar"
echo t_scan.at:8 >$at_check_line_file
( $at_traceon; mkdir foo/bar ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_scan.at:8: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

cat >testfile0 <<'_ATEOF'
version 0 of first test file
_ATEOF


cat >foo/testfile1 <<'_ATEOF'
version 0 of second test file
_ATEOF


cat >foo/bar/testfile2 <<'_ATEOF'
version 0 of third test file
_ATEOF


$at_traceoff
echo "t_scan.at:18: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add testfile0 foo"
echo t_scan.at:18 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add testfile0 foo ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_scan.at:18: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_scan.at:19: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit 'blah blah'"
echo t_scan.at:19 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit 'blah blah' ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_scan.at:19: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_scan.at:20: sha1sum foo/bar/testfile2 foo/testfile1 testfile0"
echo t_scan.at:20 >$at_check_line_file
( $at_traceon; sha1sum foo/bar/testfile2 foo/testfile1 testfile0 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_scan.at:20: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_scan.at:21: cmp stdout MT/manifest"
echo t_scan.at:21 >$at_check_line_file
( $at_traceon; cmp stdout MT/manifest ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_scan.at:21: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


      $at_traceoff
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  3 ) # 3. t_import.at:3: importing a file
    at_setup_line='t_import.at:3'
    at_desc='importing a file'
    $at_quiet $ECHO_N "  3: importing a file                             $ECHO_C"
    at_xfail=no
    (
      echo "3. t_import.at:3: testing ..."
      $at_traceon




cat >test_keys <<'_ATEOF'
[pubkey tester@test.net]
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCfN/cAMabgb6T7m8ksGnpQ7LO6hOdnc/7V
yivrRGtmpwSItljht1bmgLQF37KiSPoMEDUb1stfKxaMsYiy8iTyoQ+M2EVFP37n2rtnNZ0H
oVcQd2sRsCerQFh9nslRPymlkQXUlOiNFN6RlFNcdjkucqNe+YorFX21EYw7XuT5XwIBEQ==
[end]
[privkey tester@test.net]
npy0jyqbZdylFkMjdR9OvlqmDHuBGXpGFPt94h96aG+Lp+OdBCmWx8GueHk8FKkexwPqhRBM
PPopUeuwqxuSX+yEodMl5IHBmin0nLnbOeBjtasjemBFEmdNl/jPDF/AeQ2WHhanB731dSQc
vzLOQfKAYmfk56PPULi9oJJNUxaCkvsWtvaI+HUHZrjyyV7dA4Vsc6Jvx2Yf1+MdDAEGk/Rw
ZtP0LmuoiyvRDFqBF8aTmnotyb4kRKohnJ7VF+y6hYvmtMpM3TKnpR7EbojBzNPqKuO7nPUz
jGxA7F84O24Vbf128PNSI5vj4istow26aPjn28qPjfRrkV30WLL/dXfYJkfkTqglYnoEXvF/
xZoVxxNeAX58mgy0A1ErVxv8U7TwuP983GHEpLwy3gbiP+9akAJCr8r823DHmQqq5QDELibP
cuXZfOttpfVRkcbMhjeF0M6czc4HoKgHTAnf/18hzdZwGX/WWvRIBHImbUJ+mDbp2ByDTfKf
ErGXSvZ3HxCqBD8yx1SnXhV8IDHaBmV9wwYcN+H2cxOWGZk7g7xJS19+a3UQB3c3sSXQVJBp
6QpCZgysxkZwzuXDzzLZPT9SLZz4K2p7+7BwMbpy9ZxcyAzmiEtpA24UP06jtjFN7WcXAdx/
E5Gmoe9b1EiXWdReHjUGpc6k0LQ0PPXAwqrcGdwYbOLDZ5xsQ5AsEYSFtyTS60D1nHBcdNmW
M0eOUJFdJf/uNe/2EApc3a8TyEkZtVqiYtOVV3qDB9NmU4bVOkDqzl1F7zJwATWbmasSdkM3
6lxDkczBfCrEjH5p5Y8DU+ge4e4LRtknY9oBOJ7EQO0twYJg3k0=
[end]
_ATEOF


cat >test_hooks.lua <<'_ATEOF'

-- this is the "testing" set of lua hooks for monotone
-- it's intended to support self-tests, not for use in
-- production. just defines some of the std hooks.

function get_passphrase(keyid)
	return keyid
end

function non_blocking_rng_ok()
	return true
end

function get_manifest_cert_trust(signers, id, name, val)
   return true
end

function get_file_cert_trust(signers, id, name, val)
   return true
end

function accept_testresult_change(old_results, new_results)
   for test,res in pairs(old_results)
   do
      if res == true and new_results[test] ~= true
      then
	 return false
      end
   end
   return true
end

function get_author(branchname)
	return "tester@test.net"
end

function ignore_file(name)
	if (strfind(name, "test_hooks.lua")) then return true end
	if (strfind(name, "test.db")) then return true end
	return false
end

if (attr_functions == nil) then
  attr_functions = {}
end
attr_functions["test_attr"] =
  function(filename, value)
    io.write(string.format("test_attr:%s:%s\n", filename, value))
  end

_ATEOF


$at_traceoff
echo "t_import.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init"
echo t_import.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_import.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_import.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys"
echo t_import.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_import.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_import.at:5: rm test_keys"
echo t_import.at:5 >$at_check_line_file
( $at_traceon; rm test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_import.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



cat >importme <<'_ATEOF'
version 0 of test file
_ATEOF


TSHA=`sha1sum importme | cut -d ' ' -f 1`

$at_traceoff
echo "t_import.at:12: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add importme"
echo t_import.at:12 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add importme ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_import.at:12: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_import.at:13: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit 'blah blah'"
echo t_import.at:13 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit 'blah blah' ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_import.at:13: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_import.at:14: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net cat file \$TSHA"
echo t_import.at:14 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net cat file $TSHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_import.at:14: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_import.at:15: cmp importme stdout"
echo t_import.at:15 >$at_check_line_file
( $at_traceon; cmp importme stdout ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_import.at:15: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


      $at_traceoff
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  4 ) # 4. t_genkey.at:3: generating and extracting keys and certs
    at_setup_line='t_genkey.at:3'
    at_desc='generating and extracting keys and certs'
    $at_quiet $ECHO_N "  4: generating and extracting keys and certs     $ECHO_C"
    at_xfail=no
    (
      echo "4. t_genkey.at:3: testing ..."
      $at_traceon




cat >test_keys <<'_ATEOF'
[pubkey tester@test.net]
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCfN/cAMabgb6T7m8ksGnpQ7LO6hOdnc/7V
yivrRGtmpwSItljht1bmgLQF37KiSPoMEDUb1stfKxaMsYiy8iTyoQ+M2EVFP37n2rtnNZ0H
oVcQd2sRsCerQFh9nslRPymlkQXUlOiNFN6RlFNcdjkucqNe+YorFX21EYw7XuT5XwIBEQ==
[end]
[privkey tester@test.net]
npy0jyqbZdylFkMjdR9OvlqmDHuBGXpGFPt94h96aG+Lp+OdBCmWx8GueHk8FKkexwPqhRBM
PPopUeuwqxuSX+yEodMl5IHBmin0nLnbOeBjtasjemBFEmdNl/jPDF/AeQ2WHhanB731dSQc
vzLOQfKAYmfk56PPULi9oJJNUxaCkvsWtvaI+HUHZrjyyV7dA4Vsc6Jvx2Yf1+MdDAEGk/Rw
ZtP0LmuoiyvRDFqBF8aTmnotyb4kRKohnJ7VF+y6hYvmtMpM3TKnpR7EbojBzNPqKuO7nPUz
jGxA7F84O24Vbf128PNSI5vj4istow26aPjn28qPjfRrkV30WLL/dXfYJkfkTqglYnoEXvF/
xZoVxxNeAX58mgy0A1ErVxv8U7TwuP983GHEpLwy3gbiP+9akAJCr8r823DHmQqq5QDELibP
cuXZfOttpfVRkcbMhjeF0M6czc4HoKgHTAnf/18hzdZwGX/WWvRIBHImbUJ+mDbp2ByDTfKf
ErGXSvZ3HxCqBD8yx1SnXhV8IDHaBmV9wwYcN+H2cxOWGZk7g7xJS19+a3UQB3c3sSXQVJBp
6QpCZgysxkZwzuXDzzLZPT9SLZz4K2p7+7BwMbpy9ZxcyAzmiEtpA24UP06jtjFN7WcXAdx/
E5Gmoe9b1EiXWdReHjUGpc6k0LQ0PPXAwqrcGdwYbOLDZ5xsQ5AsEYSFtyTS60D1nHBcdNmW
M0eOUJFdJf/uNe/2EApc3a8TyEkZtVqiYtOVV3qDB9NmU4bVOkDqzl1F7zJwATWbmasSdkM3
6lxDkczBfCrEjH5p5Y8DU+ge4e4LRtknY9oBOJ7EQO0twYJg3k0=
[end]
_ATEOF


cat >test_hooks.lua <<'_ATEOF'

-- this is the "testing" set of lua hooks for monotone
-- it's intended to support self-tests, not for use in
-- production. just defines some of the std hooks.

function get_passphrase(keyid)
	return keyid
end

function non_blocking_rng_ok()
	return true
end

function get_manifest_cert_trust(signers, id, name, val)
   return true
end

function get_file_cert_trust(signers, id, name, val)
   return true
end

function accept_testresult_change(old_results, new_results)
   for test,res in pairs(old_results)
   do
      if res == true and new_results[test] ~= true
      then
	 return false
      end
   end
   return true
end

function get_author(branchname)
	return "tester@test.net"
end

function ignore_file(name)
	if (strfind(name, "test_hooks.lua")) then return true end
	if (strfind(name, "test.db")) then return true end
	return false
end

if (attr_functions == nil) then
  attr_functions = {}
end
attr_functions["test_attr"] =
  function(filename, value)
    io.write(string.format("test_attr:%s:%s\n", filename, value))
  end

_ATEOF


$at_traceoff
echo "t_genkey.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init"
echo t_genkey.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_genkey.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_genkey.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys"
echo t_genkey.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_genkey.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_genkey.at:5: rm test_keys"
echo t_genkey.at:5 >$at_check_line_file
( $at_traceon; rm test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_genkey.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



TKEY=happy@bogus.com

# generate a new key
$at_traceoff
echo "t_genkey.at:10: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net genkey \$TKEY"
echo t_genkey.at:10 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net genkey $TKEY ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_genkey.at:10: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# check key exists
$at_traceoff
echo "t_genkey.at:13: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net ls keys"
echo t_genkey.at:13 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net ls keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_genkey.at:13: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_genkey.at:14: grep \$TKEY stdout"
echo t_genkey.at:14 >$at_check_line_file
( $at_traceon; grep $TKEY stdout ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_genkey.at:14: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# check globbing on name works
$at_traceoff
echo "t_genkey.at:17: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net ls keys happy\\*"
echo t_genkey.at:17 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net ls keys happy\* ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_genkey.at:17: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_genkey.at:18: grep \$TKEY stdout"
echo t_genkey.at:18 >$at_check_line_file
( $at_traceon; grep $TKEY stdout ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_genkey.at:18: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# check globbing on bogus name misses key
$at_traceoff
echo "t_genkey.at:21: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net ls keys burp\\*"
echo t_genkey.at:21 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net ls keys burp\* ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_genkey.at:21: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_genkey.at:22: grep \$TKEY stdout"
echo t_genkey.at:22 >$at_check_line_file
( $at_traceon; grep $TKEY stdout ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   1) ;;
   *) echo "t_genkey.at:22: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



# second section, check making certs with this key

cat >input.txt <<'_ATEOF'
blah blah blah
_ATEOF


$at_traceoff
echo "t_genkey.at:30: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add input.txt"
echo t_genkey.at:30 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add input.txt ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_genkey.at:30: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_genkey.at:31: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit 'blah blah'"
echo t_genkey.at:31 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit 'blah blah' ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_genkey.at:31: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

TSHA=`sha1sum MT/manifest | cut -d ' ' -f 1`
$at_traceoff
echo "t_genkey.at:33: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --key=\$TKEY cert \$TSHA color pink"
echo t_genkey.at:33 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --key=$TKEY cert $TSHA color pink ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_genkey.at:33: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_genkey.at:34: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net ls certs \$TSHA"
echo t_genkey.at:34 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net ls certs $TSHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_genkey.at:34: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_genkey.at:35: grep pink stdout"
echo t_genkey.at:35 >$at_check_line_file
( $at_traceon; grep pink stdout ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_genkey.at:35: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


cat >cert-data <<'_ATEOF'
yellow
_ATEOF

$at_traceoff
echo "t_genkey.at:39: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --key=\$TKEY cert \$TSHA color < cert-data"
echo t_genkey.at:39 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --key=$TKEY cert $TSHA color < cert-data ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_genkey.at:39: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_genkey.at:40: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net ls certs \$TSHA"
echo t_genkey.at:40 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net ls certs $TSHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_genkey.at:40: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_genkey.at:41: grep pink stdout"
echo t_genkey.at:41 >$at_check_line_file
( $at_traceon; grep pink stdout ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_genkey.at:41: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_genkey.at:42: grep yellow stdout"
echo t_genkey.at:42 >$at_check_line_file
( $at_traceon; grep yellow stdout ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_genkey.at:42: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


      $at_traceoff
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  5 ) # 5. t_unidiff.at:3: calculation of unidiffs
    at_setup_line='t_unidiff.at:3'
    at_desc='calculation of unidiffs'
    $at_quiet $ECHO_N "  5: calculation of unidiffs                      $ECHO_C"
    at_xfail=no
    (
      echo "5. t_unidiff.at:3: testing ..."
      $at_traceon


MIMENCODE=`which mimencode 2>/dev/null`
if test -z "$MIMENCODE" ; then
  exit 77
fi



cat >test_keys <<'_ATEOF'
[pubkey tester@test.net]
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCfN/cAMabgb6T7m8ksGnpQ7LO6hOdnc/7V
yivrRGtmpwSItljht1bmgLQF37KiSPoMEDUb1stfKxaMsYiy8iTyoQ+M2EVFP37n2rtnNZ0H
oVcQd2sRsCerQFh9nslRPymlkQXUlOiNFN6RlFNcdjkucqNe+YorFX21EYw7XuT5XwIBEQ==
[end]
[privkey tester@test.net]
npy0jyqbZdylFkMjdR9OvlqmDHuBGXpGFPt94h96aG+Lp+OdBCmWx8GueHk8FKkexwPqhRBM
PPopUeuwqxuSX+yEodMl5IHBmin0nLnbOeBjtasjemBFEmdNl/jPDF/AeQ2WHhanB731dSQc
vzLOQfKAYmfk56PPULi9oJJNUxaCkvsWtvaI+HUHZrjyyV7dA4Vsc6Jvx2Yf1+MdDAEGk/Rw
ZtP0LmuoiyvRDFqBF8aTmnotyb4kRKohnJ7VF+y6hYvmtMpM3TKnpR7EbojBzNPqKuO7nPUz
jGxA7F84O24Vbf128PNSI5vj4istow26aPjn28qPjfRrkV30WLL/dXfYJkfkTqglYnoEXvF/
xZoVxxNeAX58mgy0A1ErVxv8U7TwuP983GHEpLwy3gbiP+9akAJCr8r823DHmQqq5QDELibP
cuXZfOttpfVRkcbMhjeF0M6czc4HoKgHTAnf/18hzdZwGX/WWvRIBHImbUJ+mDbp2ByDTfKf
ErGXSvZ3HxCqBD8yx1SnXhV8IDHaBmV9wwYcN+H2cxOWGZk7g7xJS19+a3UQB3c3sSXQVJBp
6QpCZgysxkZwzuXDzzLZPT9SLZz4K2p7+7BwMbpy9ZxcyAzmiEtpA24UP06jtjFN7WcXAdx/
E5Gmoe9b1EiXWdReHjUGpc6k0LQ0PPXAwqrcGdwYbOLDZ5xsQ5AsEYSFtyTS60D1nHBcdNmW
M0eOUJFdJf/uNe/2EApc3a8TyEkZtVqiYtOVV3qDB9NmU4bVOkDqzl1F7zJwATWbmasSdkM3
6lxDkczBfCrEjH5p5Y8DU+ge4e4LRtknY9oBOJ7EQO0twYJg3k0=
[end]
_ATEOF


cat >test_hooks.lua <<'_ATEOF'

-- this is the "testing" set of lua hooks for monotone
-- it's intended to support self-tests, not for use in
-- production. just defines some of the std hooks.

function get_passphrase(keyid)
	return keyid
end

function non_blocking_rng_ok()
	return true
end

function get_manifest_cert_trust(signers, id, name, val)
   return true
end

function get_file_cert_trust(signers, id, name, val)
   return true
end

function accept_testresult_change(old_results, new_results)
   for test,res in pairs(old_results)
   do
      if res == true and new_results[test] ~= true
      then
	 return false
      end
   end
   return true
end

function get_author(branchname)
	return "tester@test.net"
end

function ignore_file(name)
	if (strfind(name, "test_hooks.lua")) then return true end
	if (strfind(name, "test.db")) then return true end
	return false
end

if (attr_functions == nil) then
  attr_functions = {}
end
attr_functions["test_attr"] =
  function(filename, value)
    io.write(string.format("test_attr:%s:%s\n", filename, value))
  end

_ATEOF


$at_traceoff
echo "t_unidiff.at:10: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init"
echo t_unidiff.at:10 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_unidiff.at:10: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_unidiff.at:10: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys"
echo t_unidiff.at:10 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_unidiff.at:10: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_unidiff.at:10: rm test_keys"
echo t_unidiff.at:10 >$at_check_line_file
( $at_traceon; rm test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_unidiff.at:10: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



cat >firstfile.b64 <<'_ATEOF'
LyogU3Vicm91dGluZXMgc2hhcmVkIGJ5IGFsbCBsYW5ndWFnZXMgdGhhdCBhcmUgdmFyaWFu
dHMgb2YgQy4KICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NyBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KClRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdO
VSBDQy4KCkdOVSBDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp
dCBhbmQvb3IgbW9kaWZ5Cml0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwg
UHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CnRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k
YXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKYW55IGxhdGVy
IHZlcnNpb24uCgpHTlUgQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3
aWxsIGJlIHVzZWZ1bCwKYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g
dGhlIGltcGxpZWQgd2FycmFudHkgb2YKTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQpHTlUgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29w
eSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKYWxvbmcgd2l0aCBHTlUgQ0M7
IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwp0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCkJvc3Rvbiwg
TUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KCiNpbmNsdWRlICJjb25maWcuaCIKI2luY2x1ZGUg
InRyZWUuaCIKI2luY2x1ZGUgImMtbGV4LmgiCiNpbmNsdWRlICJjLXRyZWUuaCIKI2luY2x1
ZGUgImZsYWdzLmgiCiNpbmNsdWRlICJvYnN0YWNrLmgiCiNpbmNsdWRlIDxzdGRpby5oPgoj
aW5jbHVkZSA8Y3R5cGUuaD4KCiNpZm5kZWYgV0NIQVJfVFlQRV9TSVpFCiNpZmRlZiBJTlRf
VFlQRV9TSVpFCiNkZWZpbmUgV0NIQVJfVFlQRV9TSVpFIElOVF9UWVBFX1NJWkUKI2Vsc2UK
I2RlZmluZSBXQ0hBUl9UWVBFX1NJWkUJQklUU19QRVJfV09SRAojZW5kaWYKI2VuZGlmCgpl
eHRlcm4gc3RydWN0IG9ic3RhY2sgcGVybWFuZW50X29ic3RhY2s7CgovKiBOb256ZXJvIG1l
YW5zIHRoZSBleHByZXNzaW9uIGJlaW5nIHBhcnNlZCB3aWxsIG5ldmVyIGJlIGV2YWx1YXRl
ZC4KICAgVGhpcyBpcyBhIGNvdW50LCBzaW5jZSB1bmV2YWx1YXRlZCBleHByZXNzaW9ucyBj
YW4gbmVzdC4gICovCmludCBza2lwX2V2YWx1YXRpb247CgplbnVtIGF0dHJzIHtBX1BBQ0tF
RCwgQV9OT0NPTU1PTiwgQV9DT01NT04sIEFfTk9SRVRVUk4sIEFfQ09OU1QsIEFfVF9VTklP
TiwKCSAgICBBX0NPTlNUUlVDVE9SLCBBX0RFU1RSVUNUT1IsIEFfTU9ERSwgQV9TRUNUSU9O
LCBBX0FMSUdORUQsCgkgICAgQV9VTlVTRUQsIEFfRk9STUFULCBBX0ZPUk1BVF9BUkcsIEFf
V0VBSywgQV9BTElBU307CgpzdGF0aWMgdm9pZCBkZWNsYXJlX2hpZGRlbl9jaGFyX2FycmF5
CVBST1RPKChjaGFyICosIGNoYXIgKikpOwpzdGF0aWMgdm9pZCBhZGRfYXR0cmlidXRlCQlQ
Uk9UTygoZW51bSBhdHRycywgY2hhciAqLAoJCQkJCSAgICAgICBpbnQsIGludCwgaW50KSk7
CnN0YXRpYyB2b2lkIGluaXRfYXR0cmlidXRlcwkJUFJPVE8oKHZvaWQpKTsKc3RhdGljIHZv
aWQgcmVjb3JkX2ludGVybmF0aW9uYWxfZm9ybWF0CVBST1RPKCh0cmVlLCB0cmVlLCBpbnQp
KTsKCi8qIE1ha2UgYmluZGluZ3MgZm9yIF9fRlVOQ1RJT05fXyBhbmQgX19QUkVUVFlfRlVO
Q1RJT05fXy4gICovCgp2b2lkCmRlY2xhcmVfZnVuY3Rpb25fbmFtZSAoKQp7CiAgY2hhciAq
bmFtZSwgKnByaW50YWJsZV9uYW1lOwoKICBpZiAoY3VycmVudF9mdW5jdGlvbl9kZWNsID09
IE5VTEwpCiAgICB7CiAgICAgIG5hbWUgPSAiIjsKICAgICAgcHJpbnRhYmxlX25hbWUgPSAi
dG9wIGxldmVsIjsKICAgIH0KICBlbHNlCiAgICB7CiAgICAgIC8qIEFsbG93IGZ1bmN0aW9u
cyB0byBiZSBuYW1lbGVzcyAoc3VjaCBhcyBhcnRpZmljaWFsIG9uZXMpLiAgKi8KICAgICAg
aWYgKERFQ0xfTkFNRSAoY3VycmVudF9mdW5jdGlvbl9kZWNsKSkKICAgICAgICBuYW1lID0g
SURFTlRJRklFUl9QT0lOVEVSIChERUNMX05BTUUgKGN1cnJlbnRfZnVuY3Rpb25fZGVjbCkp
OwogICAgICBlbHNlCgluYW1lID0gIiI7CiAgICAgIHByaW50YWJsZV9uYW1lID0gKCpkZWNs
X3ByaW50YWJsZV9uYW1lKSAoY3VycmVudF9mdW5jdGlvbl9kZWNsLCAyKTsKICAgIH0KCiAg
ZGVjbGFyZV9oaWRkZW5fY2hhcl9hcnJheSAoIl9fRlVOQ1RJT05fXyIsIG5hbWUpOwogIGRl
Y2xhcmVfaGlkZGVuX2NoYXJfYXJyYXkgKCJfX1BSRVRUWV9GVU5DVElPTl9fIiwgcHJpbnRh
YmxlX25hbWUpOwp9CgpzdGF0aWMgdm9pZApkZWNsYXJlX2hpZGRlbl9jaGFyX2FycmF5IChu
YW1lLCB2YWx1ZSkKICAgICBjaGFyICpuYW1lLCAqdmFsdWU7CnsKICB0cmVlIGRlY2wsIHR5
cGUsIGluaXQ7CiAgaW50IHZsZW47CgogIC8qIElmIHRoZSBkZWZhdWx0IHNpemUgb2YgY2hh
ciBhcnJheXMgaXNuJ3QgYmlnIGVub3VnaCBmb3IgdGhlIG5hbWUsCiAgICAgb3IgaWYgd2Ug
d2FudCB0byBnaXZlIHdhcm5pbmdzIGZvciBsYXJnZSBvYmplY3RzLCBtYWtlIGEgYmlnZ2Vy
IG9uZS4gICovCiAgdmxlbiA9IHN0cmxlbiAodmFsdWUpICsgMTsKICB0eXBlID0gY2hhcl9h
cnJheV90eXBlX25vZGU7CiAgaWYgKFRSRUVfSU5UX0NTVF9MT1cgKFRZUEVfTUFYX1ZBTFVF
IChUUkVFX1RZUEUgKHR5cGUpKSkgPCB2bGVuCiAgICAgIHx8IHdhcm5fbGFyZ2VyX3RoYW4p
CiAgICB0eXBlID0gYnVpbGRfYXJyYXlfdHlwZSAoY2hhcl90eXBlX25vZGUsCgkJCSAgICAg
YnVpbGRfaW5kZXhfdHlwZSAoYnVpbGRfaW50XzIgKHZsZW4sIDApKSk7CiAgcHVzaF9vYnN0
YWNrc19ub2NoYW5nZSAoKTsKICBkZWNsID0gYnVpbGRfZGVjbCAoVkFSX0RFQ0wsIGdldF9p
ZGVudGlmaWVyIChuYW1lKSwgdHlwZSk7CiAgVFJFRV9TVEFUSUMgKGRlY2wpID0gMTsKICBU
UkVFX1JFQURPTkxZIChkZWNsKSA9IDE7CiAgVFJFRV9BU01fV1JJVFRFTiAoZGVjbCkgPSAx
OwogIERFQ0xfU09VUkNFX0xJTkUgKGRlY2wpID0gMDsKICBERUNMX0FSVElGSUNJQUwgKGRl
Y2wpID0gMTsKICBERUNMX0lOX1NZU1RFTV9IRUFERVIgKGRlY2wpID0gMTsKICBERUNMX0lH
Tk9SRURfUCAoZGVjbCkgPSAxOwogIGluaXQgPSBidWlsZF9zdHJpbmcgKHZsZW4sIHZhbHVl
KTsKICBUUkVFX1RZUEUgKGluaXQpID0gdHlwZTsKICBERUNMX0lOSVRJQUwgKGRlY2wpID0g
aW5pdDsKICBmaW5pc2hfZGVjbCAocHVzaGRlY2wgKGRlY2wpLCBpbml0LCBOVUxMX1RSRUUp
Owp9CgovKiBHaXZlbiBhIGNoYWluIG9mIFNUUklOR19DU1Qgbm9kZXMsCiAgIGNvbmNhdGVu
YXRlIHRoZW0gaW50byBvbmUgU1RSSU5HX0NTVAogICBhbmQgZ2l2ZSBpdCBhIHN1aXRhYmxl
IGFycmF5LW9mLWNoYXJzIGRhdGEgdHlwZS4gICovCgp0cmVlCmNvbWJpbmVfc3RyaW5ncyAo
c3RyaW5ncykKICAgICB0cmVlIHN0cmluZ3M7CnsKICByZWdpc3RlciB0cmVlIHZhbHVlLCB0
OwogIHJlZ2lzdGVyIGludCBsZW5ndGggPSAxOwogIGludCB3aWRlX2xlbmd0aCA9IDA7CiAg
aW50IHdpZGVfZmxhZyA9IDA7CiAgaW50IHdjaGFyX2J5dGVzID0gVFlQRV9QUkVDSVNJT04g
KHdjaGFyX3R5cGVfbm9kZSkgLyBCSVRTX1BFUl9VTklUOwogIGludCBuY2hhcnM7CgogIGlm
IChUUkVFX0NIQUlOIChzdHJpbmdzKSkKICAgIHsKICAgICAgLyogTW9yZSB0aGFuIG9uZSBp
biB0aGUgY2hhaW4sIHNvIGNvbmNhdGVuYXRlLiAgKi8KICAgICAgcmVnaXN0ZXIgY2hhciAq
cCwgKnE7CgogICAgICAvKiBEb24ndCBpbmNsdWRlIHRoZSBcMCBhdCB0aGUgZW5kIG9mIGVh
Y2ggc3Vic3RyaW5nLAoJIGV4Y2VwdCBmb3IgdGhlIGxhc3Qgb25lLgoJIENvdW50IHdpZGUg
c3RyaW5ncyBhbmQgb3JkaW5hcnkgc3RyaW5ncyBzZXBhcmF0ZWx5LiAgKi8KICAgICAgZm9y
ICh0ID0gc3RyaW5nczsgdDsgdCA9IFRSRUVfQ0hBSU4gKHQpKQoJewoJICBpZiAoVFJFRV9U
WVBFICh0KSA9PSB3Y2hhcl9hcnJheV90eXBlX25vZGUpCgkgICAgewoJICAgICAgd2lkZV9s
ZW5ndGggKz0gKFRSRUVfU1RSSU5HX0xFTkdUSCAodCkgLSB3Y2hhcl9ieXRlcyk7CgkgICAg
ICB3aWRlX2ZsYWcgPSAxOwoJICAgIH0KCSAgZWxzZQoJICAgIGxlbmd0aCArPSAoVFJFRV9T
VFJJTkdfTEVOR1RIICh0KSAtIDEpOwoJfQoKICAgICAgLyogSWYgYW55dGhpbmcgaXMgd2lk
ZSwgdGhlIG5vbi13aWRlcyB3aWxsIGJlIGNvbnZlcnRlZCwKCSB3aGljaCBtYWtlcyB0aGVt
IHRha2UgbW9yZSBzcGFjZS4gICovCiAgICAgIGlmICh3aWRlX2ZsYWcpCglsZW5ndGggPSBs
ZW5ndGggKiB3Y2hhcl9ieXRlcyArIHdpZGVfbGVuZ3RoOwoKICAgICAgcCA9IHNhdmVhbGxv
YyAobGVuZ3RoKTsKCiAgICAgIC8qIENvcHkgdGhlIGluZGl2aWR1YWwgc3RyaW5ncyBpbnRv
IHRoZSBuZXcgY29tYmluZWQgc3RyaW5nLgoJIElmIHRoZSBjb21iaW5lZCBzdHJpbmcgaXMg
d2lkZSwgY29udmVydCB0aGUgY2hhcnMgdG8gaW50cwoJIGZvciBhbnkgaW5kaXZpZHVhbCBz
dHJpbmdzIHRoYXQgYXJlIG5vdCB3aWRlLiAgKi8KCiAgICAgIHEgPSBwOwogICAgICBmb3Ig
KHQgPSBzdHJpbmdzOyB0OyB0ID0gVFJFRV9DSEFJTiAodCkpCgl7CgkgIGludCBsZW4gPSAo
VFJFRV9TVFJJTkdfTEVOR1RIICh0KQoJCSAgICAgLSAoKFRSRUVfVFlQRSAodCkgPT0gd2No
YXJfYXJyYXlfdHlwZV9ub2RlKQoJCQk/IHdjaGFyX2J5dGVzIDogMSkpOwoJICBpZiAoKFRS
RUVfVFlQRSAodCkgPT0gd2NoYXJfYXJyYXlfdHlwZV9ub2RlKSA9PSB3aWRlX2ZsYWcpCgkg
ICAgewoJICAgICAgYmNvcHkgKFRSRUVfU1RSSU5HX1BPSU5URVIgKHQpLCBxLCBsZW4pOwoJ
ICAgICAgcSArPSBsZW47CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgaW50IGk7Cgkg
ICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCgkJewoJCSAgaWYgKFdDSEFSX1RZUEVf
U0laRSA9PSBIT1NUX0JJVFNfUEVSX1NIT1JUKQoJCSAgICAoKHNob3J0ICopIHEpW2ldID0g
VFJFRV9TVFJJTkdfUE9JTlRFUiAodClbaV07CgkJICBlbHNlCgkJICAgICgoaW50ICopIHEp
W2ldID0gVFJFRV9TVFJJTkdfUE9JTlRFUiAodClbaV07CgkJfQoJICAgICAgcSArPSBsZW4g
KiB3Y2hhcl9ieXRlczsKCSAgICB9Cgl9CiAgICAgIGlmICh3aWRlX2ZsYWcpCgl7CgkgIGlu
dCBpOwoJICBmb3IgKGkgPSAwOyBpIDwgd2NoYXJfYnl0ZXM7IGkrKykKCSAgICAqcSsrID0g
MDsKCX0KICAgICAgZWxzZQoJKnEgPSAwOwoKICAgICAgdmFsdWUgPSBtYWtlX25vZGUgKFNU
UklOR19DU1QpOwogICAgICBUUkVFX1NUUklOR19QT0lOVEVSICh2YWx1ZSkgPSBwOwogICAg
ICBUUkVFX1NUUklOR19MRU5HVEggKHZhbHVlKSA9IGxlbmd0aDsKICAgICAgVFJFRV9DT05T
VEFOVCAodmFsdWUpID0gMTsKICAgIH0KICBlbHNlCiAgICB7CiAgICAgIHZhbHVlID0gc3Ry
aW5nczsKICAgICAgbGVuZ3RoID0gVFJFRV9TVFJJTkdfTEVOR1RIICh2YWx1ZSk7CiAgICAg
IGlmIChUUkVFX1RZUEUgKHZhbHVlKSA9PSB3Y2hhcl9hcnJheV90eXBlX25vZGUpCgl3aWRl
X2ZsYWcgPSAxOwogICAgfQoKICAvKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgZWxlbWVudHMs
IGZvciB0aGUgYXJyYXkgdHlwZS4gICovIAogIG5jaGFycyA9IHdpZGVfZmxhZyA/IGxlbmd0
aCAvIHdjaGFyX2J5dGVzIDogbGVuZ3RoOwoKICAvKiBDcmVhdGUgdGhlIGFycmF5IHR5cGUg
Zm9yIHRoZSBzdHJpbmcgY29uc3RhbnQuCiAgICAgLVd3cml0ZS1zdHJpbmdzIHNheXMgbWFr
ZSB0aGUgc3RyaW5nIGNvbnN0YW50IGFuIGFycmF5IG9mIGNvbnN0IGNoYXIKICAgICBzbyB0
aGF0IGNvcHlpbmcgaXQgdG8gYSBub24tY29uc3QgcG9pbnRlciB3aWxsIGdldCBhIHdhcm5p
bmcuICAqLwogIGlmICh3YXJuX3dyaXRlX3N0cmluZ3MKICAgICAgJiYgKCEgZmxhZ190cmFk
aXRpb25hbCAgJiYgISBmbGFnX3dyaXRhYmxlX3N0cmluZ3MpKQogICAgewogICAgICB0cmVl
IGVsZW1lbnRzCgk9IGJ1aWxkX3R5cGVfdmFyaWFudCAod2lkZV9mbGFnID8gd2NoYXJfdHlw
ZV9ub2RlIDogY2hhcl90eXBlX25vZGUsCgkJCSAgICAgIDEsIDApOwogICAgICBUUkVFX1RZ
UEUgKHZhbHVlKQoJPSBidWlsZF9hcnJheV90eXBlIChlbGVtZW50cywKCQkJICAgIGJ1aWxk
X2luZGV4X3R5cGUgKGJ1aWxkX2ludF8yIChuY2hhcnMgLSAxLCAwKSkpOwogICAgfQogIGVs
c2UKICAgIFRSRUVfVFlQRSAodmFsdWUpCiAgICAgID0gYnVpbGRfYXJyYXlfdHlwZSAod2lk
ZV9mbGFnID8gd2NoYXJfdHlwZV9ub2RlIDogY2hhcl90eXBlX25vZGUsCgkJCSAgYnVpbGRf
aW5kZXhfdHlwZSAoYnVpbGRfaW50XzIgKG5jaGFycyAtIDEsIDApKSk7CiAgVFJFRV9DT05T
VEFOVCAodmFsdWUpID0gMTsKICBUUkVFX1NUQVRJQyAodmFsdWUpID0gMTsKICByZXR1cm4g
dmFsdWU7Cn0KDAovKiBUbyBzcGVlZCB1cCBwcm9jZXNzaW5nIG9mIGF0dHJpYnV0ZXMsIHdl
IG1haW50YWluIGFuIGFycmF5IG9mCiAgIElERU5USUZJRVJfTk9ERVMgYW5kIHRoZSBjb3Jy
ZXNwb25kaW5nIGF0dHJpYnV0ZSB0eXBlcy4gICovCgovKiBBcnJheSB0byBob2xkIGF0dHJp
YnV0ZSBpbmZvcm1hdGlvbi4gICovCgpzdGF0aWMgc3RydWN0IHtlbnVtIGF0dHJzIGlkOyB0
cmVlIG5hbWU7IGludCBtaW4sIG1heCwgZGVjbF9yZXE7fSBhdHRydGFiWzUwXTsKCnN0YXRp
YyBpbnQgYXR0cnRhYl9pZHggPSAwOwoKLyogQWRkIGFuIGVudHJ5IHRvIHRoZSBhdHRyaWJ1
dGUgdGFibGUgYWJvdmUuICAqLwoKc3RhdGljIHZvaWQKYWRkX2F0dHJpYnV0ZSAoaWQsIHN0
cmluZywgbWluX2xlbiwgbWF4X2xlbiwgZGVjbF9yZXEpCiAgICAgZW51bSBhdHRycyBpZDsK
ICAgICBjaGFyICpzdHJpbmc7CiAgICAgaW50IG1pbl9sZW4sIG1heF9sZW47CiAgICAgaW50
IGRlY2xfcmVxOwp7CiAgY2hhciBidWZbMTAwXTsKCiAgYXR0cnRhYlthdHRydGFiX2lkeF0u
aWQgPSBpZDsKICBhdHRydGFiW2F0dHJ0YWJfaWR4XS5uYW1lID0gZ2V0X2lkZW50aWZpZXIg
KHN0cmluZyk7CiAgYXR0cnRhYlthdHRydGFiX2lkeF0ubWluID0gbWluX2xlbjsKICBhdHRy
dGFiW2F0dHJ0YWJfaWR4XS5tYXggPSBtYXhfbGVuOwogIGF0dHJ0YWJbYXR0cnRhYl9pZHgr
K10uZGVjbF9yZXEgPSBkZWNsX3JlcTsKCiAgc3ByaW50ZiAoYnVmLCAiX18lc19fIiwgc3Ry
aW5nKTsKCiAgYXR0cnRhYlthdHRydGFiX2lkeF0uaWQgPSBpZDsKICBhdHRydGFiW2F0dHJ0
YWJfaWR4XS5uYW1lID0gZ2V0X2lkZW50aWZpZXIgKGJ1Zik7CiAgYXR0cnRhYlthdHRydGFi
X2lkeF0ubWluID0gbWluX2xlbjsKICBhdHRydGFiW2F0dHJ0YWJfaWR4XS5tYXggPSBtYXhf
bGVuOwogIGF0dHJ0YWJbYXR0cnRhYl9pZHgrK10uZGVjbF9yZXEgPSBkZWNsX3JlcTsKfQoK
LyogSW5pdGlhbGl6ZSBhdHRyaWJ1dGUgdGFibGUuICAqLwoKc3RhdGljIHZvaWQKaW5pdF9h
dHRyaWJ1dGVzICgpCnsKICBhZGRfYXR0cmlidXRlIChBX1BBQ0tFRCwgInBhY2tlZCIsIDAs
IDAsIDApOwogIGFkZF9hdHRyaWJ1dGUgKEFfTk9DT01NT04sICJub2NvbW1vbiIsIDAsIDAs
IDEpOwogIGFkZF9hdHRyaWJ1dGUgKEFfQ09NTU9OLCAiY29tbW9uIiwgMCwgMCwgMSk7CiAg
YWRkX2F0dHJpYnV0ZSAoQV9OT1JFVFVSTiwgIm5vcmV0dXJuIiwgMCwgMCwgMSk7CiAgYWRk
X2F0dHJpYnV0ZSAoQV9OT1JFVFVSTiwgInZvbGF0aWxlIiwgMCwgMCwgMSk7CiAgYWRkX2F0
dHJpYnV0ZSAoQV9VTlVTRUQsICJ1bnVzZWQiLCAwLCAwLCAxKTsKICBhZGRfYXR0cmlidXRl
IChBX0NPTlNULCAiY29uc3QiLCAwLCAwLCAxKTsKICBhZGRfYXR0cmlidXRlIChBX1RfVU5J
T04sICJ0cmFuc3BhcmVudF91bmlvbiIsIDAsIDAsIDApOwogIGFkZF9hdHRyaWJ1dGUgKEFf
Q09OU1RSVUNUT1IsICJjb25zdHJ1Y3RvciIsIDAsIDAsIDEpOwogIGFkZF9hdHRyaWJ1dGUg
KEFfREVTVFJVQ1RPUiwgImRlc3RydWN0b3IiLCAwLCAwLCAxKTsKICBhZGRfYXR0cmlidXRl
IChBX01PREUsICJtb2RlIiwgMSwgMSwgMSk7CiAgYWRkX2F0dHJpYnV0ZSAoQV9TRUNUSU9O
LCAic2VjdGlvbiIsIDEsIDEsIDEpOwogIGFkZF9hdHRyaWJ1dGUgKEFfQUxJR05FRCwgImFs
aWduZWQiLCAwLCAxLCAwKTsKICBhZGRfYXR0cmlidXRlIChBX0ZPUk1BVCwgImZvcm1hdCIs
IDMsIDMsIDEpOwogIGFkZF9hdHRyaWJ1dGUgKEFfRk9STUFUX0FSRywgImZvcm1hdF9hcmci
LCAxLCAxLCAxKTsKICBhZGRfYXR0cmlidXRlIChBX1dFQUssICJ3ZWFrIiwgMCwgMCwgMSk7
CiAgYWRkX2F0dHJpYnV0ZSAoQV9BTElBUywgImFsaWFzIiwgMSwgMSwgMSk7Cn0KDAovKiBQ
cm9jZXNzIHRoZSBhdHRyaWJ1dGVzIGxpc3RlZCBpbiBBVFRSSUJVVEVTIGFuZCBQUkVGSVhf
QVRUUklCVVRFUwogICBhbmQgaW5zdGFsbCB0aGVtIGluIE5PREUsIHdoaWNoIGlzIGVpdGhl
ciBhIERFQ0wgKGluY2x1ZGluZyBhIFRZUEVfREVDTCkKICAgb3IgYSBUWVBFLiAgUFJFRklY
X0FUVFJJQlVURVMgY2FuIGFwcGVhciBhZnRlciB0aGUgZGVjbGFyYXRpb24gc3BlY2lmaWVy
cwogICBhbmQgZGVjbGFyYXRpb24gbW9kaWZpZXJzIGJ1dCBiZWZvcmUgdGhlIGRlY2xhcmF0
aW9uIHByb3Blci4gICovCgp2b2lkCmRlY2xfYXR0cmlidXRlcyAobm9kZSwgYXR0cmlidXRl
cywgcHJlZml4X2F0dHJpYnV0ZXMpCiAgICAgdHJlZSBub2RlLCBhdHRyaWJ1dGVzLCBwcmVm
aXhfYXR0cmlidXRlczsKewogIHRyZWUgZGVjbCA9IDAsIHR5cGU7CiAgaW50IGlzX3R5cGU7
CiAgdHJlZSBhOwoKICBpZiAoYXR0cnRhYl9pZHggPT0gMCkKICAgIGluaXRfYXR0cmlidXRl
cyAoKTsKCiAgaWYgKFRSRUVfQ09ERV9DTEFTUyAoVFJFRV9DT0RFIChub2RlKSkgPT0gJ2Qn
KQogICAgewogICAgICBkZWNsID0gbm9kZTsKICAgICAgdHlwZSA9IFRSRUVfVFlQRSAoZGVj
bCk7CiAgICAgIGlzX3R5cGUgPSBUUkVFX0NPREUgKG5vZGUpID09IFRZUEVfREVDTDsKICAg
IH0KICBlbHNlIGlmIChUUkVFX0NPREVfQ0xBU1MgKFRSRUVfQ09ERSAobm9kZSkpID09ICd0
JykKICAgIHR5cGUgPSBub2RlLCBpc190eXBlID0gMTsKCiAgYXR0cmlidXRlcyA9IGNoYWlu
b24gKHByZWZpeF9hdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzKTsKCiAgZm9yIChhID0gYXR0cmli
dXRlczsgYTsgYSA9IFRSRUVfQ0hBSU4gKGEpKQogICAgewogICAgICB0cmVlIG5hbWUgPSBU
UkVFX1BVUlBPU0UgKGEpOwogICAgICB0cmVlIGFyZ3MgPSBUUkVFX1ZBTFVFIChhKTsKICAg
ICAgaW50IGk7CiAgICAgIGVudW0gYXR0cnMgaWQ7CiAgICAgIAogICAgICBmb3IgKGkgPSAw
OyBpIDwgYXR0cnRhYl9pZHg7IGkrKykKCWlmIChhdHRydGFiW2ldLm5hbWUgPT0gbmFtZSkK
CSAgYnJlYWs7CgogICAgICBpZiAoaSA9PSBhdHRydGFiX2lkeCkKCXsKCSAgaWYgKCEgdmFs
aWRfbWFjaGluZV9hdHRyaWJ1dGUgKG5hbWUsIGFyZ3MsIGRlY2wsIHR5cGUpKQoJICAgIHdh
cm5pbmcgKCJgJXMnIGF0dHJpYnV0ZSBkaXJlY3RpdmUgaWdub3JlZCIsCgkJICAgICBJREVO
VElGSUVSX1BPSU5URVIgKG5hbWUpKTsKCSAgZWxzZSBpZiAoZGVjbCAhPSAwKQoJICAgIHR5
cGUgPSBUUkVFX1RZUEUgKGRlY2wpOwoJICBjb250aW51ZTsKCX0KICAgICAgZWxzZSBpZiAo
YXR0cnRhYltpXS5kZWNsX3JlcSAmJiBkZWNsID09IDApCgl7CgkgIHdhcm5pbmcgKCJgJXMn
IGF0dHJpYnV0ZSBkb2VzIG5vdCBhcHBseSB0byB0eXBlcyIsCgkJICAgSURFTlRJRklFUl9Q
T0lOVEVSIChuYW1lKSk7CgkgIGNvbnRpbnVlOwoJfQogICAgICBlbHNlIGlmIChsaXN0X2xl
bmd0aCAoYXJncykgPCBhdHRydGFiW2ldLm1pbgoJICAgICAgIHx8IGxpc3RfbGVuZ3RoIChh
cmdzKSA+IGF0dHJ0YWJbaV0ubWF4KQoJewoJICBlcnJvciAoIndyb25nIG51bWJlciBvZiBh
cmd1bWVudHMgc3BlY2lmaWVkIGZvciBgJXMnIGF0dHJpYnV0ZSIsCgkJIElERU5USUZJRVJf
UE9JTlRFUiAobmFtZSkpOwoJICBjb250aW51ZTsKCX0KCiAgICAgIGlkID0gYXR0cnRhYltp
XS5pZDsKICAgICAgc3dpdGNoIChpZCkKCXsKCWNhc2UgQV9QQUNLRUQ6CgkgIGlmIChpc190
eXBlKQoJICAgIFRZUEVfUEFDS0VEICh0eXBlKSA9IDE7CgkgIGVsc2UgaWYgKFRSRUVfQ09E
RSAoZGVjbCkgPT0gRklFTERfREVDTCkKCSAgICBERUNMX1BBQ0tFRCAoZGVjbCkgPSAxOwoJ
ICAvKiBXZSBjYW4ndCBzZXQgREVDTF9QQUNLRUQgZm9yIGEgVkFSX0RFQ0wsIGJlY2F1c2Ug
dGhlIGJpdCBpcwoJICAgICB1c2VkIGZvciBERUNMX1JFR0lTVEVSLiAgSXQgd291bGRuJ3Qg
bWVhbiBhbnl0aGluZyBhbnl3YXkuICAqLwoJICBlbHNlCgkgICAgd2FybmluZyAoImAlcycg
YXR0cmlidXRlIGlnbm9yZWQiLCBJREVOVElGSUVSX1BPSU5URVIgKG5hbWUpKTsKCSAgYnJl
YWs7CgoJY2FzZSBBX05PQ09NTU9OOgoJICBpZiAoVFJFRV9DT0RFIChkZWNsKSA9PSBWQVJf
REVDTCkKCSAgICBERUNMX0NPTU1PTiAoZGVjbCkgPSAwOwoJICBlbHNlCgkgICAgd2Fybmlu
ZyAoImAlcycgYXR0cmlidXRlIGlnbm9yZWQiLCBJREVOVElGSUVSX1BPSU5URVIgKG5hbWUp
KTsKCSAgYnJlYWs7CgoJY2FzZSBBX0NPTU1PTjoKCSAgaWYgKFRSRUVfQ09ERSAoZGVjbCkg
PT0gVkFSX0RFQ0wpCgkgICAgREVDTF9DT01NT04gKGRlY2wpID0gMTsKCSAgZWxzZQoJICAg
IHdhcm5pbmcgKCJgJXMnIGF0dHJpYnV0ZSBpZ25vcmVkIiwgSURFTlRJRklFUl9QT0lOVEVS
IChuYW1lKSk7CgkgIGJyZWFrOwoKCWNhc2UgQV9OT1JFVFVSTjoKCSAgaWYgKFRSRUVfQ09E
RSAoZGVjbCkgPT0gRlVOQ1RJT05fREVDTCkKCSAgICBUUkVFX1RISVNfVk9MQVRJTEUgKGRl
Y2wpID0gMTsKCSAgZWxzZSBpZiAoVFJFRV9DT0RFICh0eXBlKSA9PSBQT0lOVEVSX1RZUEUK
CQkgICAmJiBUUkVFX0NPREUgKFRSRUVfVFlQRSAodHlwZSkpID09IEZVTkNUSU9OX1RZUEUp
CgkgICAgVFJFRV9UWVBFIChkZWNsKSA9IHR5cGUgCgkgICAgICA9IGJ1aWxkX3BvaW50ZXJf
dHlwZQoJCShidWlsZF90eXBlX3ZhcmlhbnQgKFRSRUVfVFlQRSAodHlwZSksCgkJCQkgICAg
IFRSRUVfUkVBRE9OTFkgKFRSRUVfVFlQRSAodHlwZSkpLCAxKSk7CgkgIGVsc2UKCSAgICB3
YXJuaW5nICgiYCVzJyBhdHRyaWJ1dGUgaWdub3JlZCIsIElERU5USUZJRVJfUE9JTlRFUiAo
bmFtZSkpOwoJICBicmVhazsKCgljYXNlIEFfVU5VU0VEOgoJICBpZiAoVFJFRV9DT0RFIChk
ZWNsKSA9PSBQQVJNX0RFQ0wgfHwgVFJFRV9DT0RFIChkZWNsKSA9PSBWQVJfREVDTAoJICAg
ICAgfHwgVFJFRV9DT0RFIChkZWNsKSA9PSBGVU5DVElPTl9ERUNMKQoJICAgIFRSRUVfVVNF
RCAoZGVjbCkgPSAxOwoJICBlbHNlCgkgICAgd2FybmluZyAoImAlcycgYXR0cmlidXRlIGln
bm9yZWQiLCBJREVOVElGSUVSX1BPSU5URVIgKG5hbWUpKTsKCSAgYnJlYWs7CgoJY2FzZSBB
X0NPTlNUOgoJICBpZiAoVFJFRV9DT0RFIChkZWNsKSA9PSBGVU5DVElPTl9ERUNMKQoJICAg
IFRSRUVfUkVBRE9OTFkgKGRlY2wpID0gMTsKCSAgZWxzZSBpZiAoVFJFRV9DT0RFICh0eXBl
KSA9PSBQT0lOVEVSX1RZUEUKCQkgICAmJiBUUkVFX0NPREUgKFRSRUVfVFlQRSAodHlwZSkp
ID09IEZVTkNUSU9OX1RZUEUpCgkgICAgVFJFRV9UWVBFIChkZWNsKSA9IHR5cGUKCSAgICAg
ID0gYnVpbGRfcG9pbnRlcl90eXBlCgkJKGJ1aWxkX3R5cGVfdmFyaWFudCAoVFJFRV9UWVBF
ICh0eXBlKSwgMSwKCQkJCSAgICAgVFJFRV9USElTX1ZPTEFUSUxFIChUUkVFX1RZUEUgKHR5
cGUpKSkpOwoJICBlbHNlCgkgICAgd2FybmluZyAoICJgJXMnIGF0dHJpYnV0ZSBpZ25vcmVk
IiwgSURFTlRJRklFUl9QT0lOVEVSIChuYW1lKSk7CgkgIGJyZWFrOwoKCWNhc2UgQV9UX1VO
SU9OOgoJICBpZiAoaXNfdHlwZQoJICAgICAgJiYgVFJFRV9DT0RFICh0eXBlKSA9PSBVTklP
Tl9UWVBFCgkgICAgICAmJiAoZGVjbCA9PSAwCgkJICB8fCAoVFlQRV9GSUVMRFMgKHR5cGUp
ICE9IDAKCQkgICAgICAmJiBUWVBFX01PREUgKHR5cGUpID09IERFQ0xfTU9ERSAoVFlQRV9G
SUVMRFMgKHR5cGUpKSkpKQoJICAgIFRZUEVfVFJBTlNQQVJFTlRfVU5JT04gKHR5cGUpID0g
MTsKCSAgZWxzZSBpZiAoZGVjbCAhPSAwICYmIFRSRUVfQ09ERSAoZGVjbCkgPT0gUEFSTV9E
RUNMCgkJICAgJiYgVFJFRV9DT0RFICh0eXBlKSA9PSBVTklPTl9UWVBFCgkJICAgJiYgVFlQ
RV9NT0RFICh0eXBlKSA9PSBERUNMX01PREUgKFRZUEVfRklFTERTICh0eXBlKSkpCgkgICAg
REVDTF9UUkFOU1BBUkVOVF9VTklPTiAoZGVjbCkgPSAxOwoJICBlbHNlCgkgICAgd2Fybmlu
ZyAoImAlcycgYXR0cmlidXRlIGlnbm9yZWQiLCBJREVOVElGSUVSX1BPSU5URVIgKG5hbWUp
KTsKCSAgYnJlYWs7CgoJY2FzZSBBX0NPTlNUUlVDVE9SOgoJICBpZiAoVFJFRV9DT0RFIChk
ZWNsKSA9PSBGVU5DVElPTl9ERUNMCgkgICAgICAmJiBUUkVFX0NPREUgKHR5cGUpID09IEZV
TkNUSU9OX1RZUEUKCSAgICAgICYmIGRlY2xfZnVuY3Rpb25fY29udGV4dCAoZGVjbCkgPT0g
MCkKCSAgICB7CgkgICAgICBERUNMX1NUQVRJQ19DT05TVFJVQ1RPUiAoZGVjbCkgPSAxOwoJ
ICAgICAgVFJFRV9VU0VEIChkZWNsKSA9IDE7CgkgICAgfQoJICBlbHNlCgkgICAgd2Fybmlu
ZyAoImAlcycgYXR0cmlidXRlIGlnbm9yZWQiLCBJREVOVElGSUVSX1BPSU5URVIgKG5hbWUp
KTsKCSAgYnJlYWs7CgoJY2FzZSBBX0RFU1RSVUNUT1I6CgkgIGlmIChUUkVFX0NPREUgKGRl
Y2wpID09IEZVTkNUSU9OX0RFQ0wKCSAgICAgICYmIFRSRUVfQ09ERSAodHlwZSkgPT0gRlVO
Q1RJT05fVFlQRQoJICAgICAgJiYgZGVjbF9mdW5jdGlvbl9jb250ZXh0IChkZWNsKSA9PSAw
KQoJICAgIHsKCSAgICAgIERFQ0xfU1RBVElDX0RFU1RSVUNUT1IgKGRlY2wpID0gMTsKCSAg
ICAgIFRSRUVfVVNFRCAoZGVjbCkgPSAxOwoJICAgIH0KCSAgZWxzZQoJICAgIHdhcm5pbmcg
KCJgJXMnIGF0dHJpYnV0ZSBpZ25vcmVkIiwgSURFTlRJRklFUl9QT0lOVEVSIChuYW1lKSk7
CgkgIGJyZWFrOwoKCWNhc2UgQV9NT0RFOgoJICBpZiAoVFJFRV9DT0RFIChUUkVFX1ZBTFVF
IChhcmdzKSkgIT0gSURFTlRJRklFUl9OT0RFKQoJICAgIHdhcm5pbmcgKCJgJXMnIGF0dHJp
YnV0ZSBpZ25vcmVkIiwgSURFTlRJRklFUl9QT0lOVEVSIChuYW1lKSk7CgkgIGVsc2UKCSAg
ICB7CgkgICAgICBpbnQgajsKCSAgICAgIGNoYXIgKnAgPSBJREVOVElGSUVSX1BPSU5URVIg
KFRSRUVfVkFMVUUgKGFyZ3MpKTsKCSAgICAgIGludCBsZW4gPSBzdHJsZW4gKHApOwoJICAg
ICAgZW51bSBtYWNoaW5lX21vZGUgbW9kZSA9IFZPSURtb2RlOwoJICAgICAgdHJlZSB0eXBl
Zm07CgoJICAgICAgaWYgKGxlbiA+IDQgJiYgcFswXSA9PSAnXycgJiYgcFsxXSA9PSAnXycK
CQkgICYmIHBbbGVuIC0gMV0gPT0gJ18nICYmIHBbbGVuIC0gMl0gPT0gJ18nKQoJCXsKCQkg
IGNoYXIgKm5ld3AgPSAoY2hhciAqKSBhbGxvY2EgKGxlbiAtIDEpOwoKCQkgIHN0cmNweSAo
bmV3cCwgJnBbMl0pOwoJCSAgbmV3cFtsZW4gLSA0XSA9ICdcMCc7CgkJICBwID0gbmV3cDsK
CQl9CgoJICAgICAgLyogR2l2ZSB0aGlzIGRlY2wgYSB0eXBlIHdpdGggdGhlIHNwZWNpZmll
ZCBtb2RlLgoJCSBGaXJzdCBjaGVjayBmb3IgdGhlIHNwZWNpYWwgbW9kZXMuICAqLwoJICAg
ICAgaWYgKCEgc3RyY21wIChwLCAiYnl0ZSIpKQoJCW1vZGUgPSBieXRlX21vZGU7CgkgICAg
ICBlbHNlIGlmICghc3RyY21wIChwLCAid29yZCIpKQoJCW1vZGUgPSB3b3JkX21vZGU7Cgkg
ICAgICBlbHNlIGlmICghIHN0cmNtcCAocCwgInBvaW50ZXIiKSkKCQltb2RlID0gcHRyX21v
ZGU7CgkgICAgICBlbHNlCgkJZm9yIChqID0gMDsgaiA8IE5VTV9NQUNISU5FX01PREVTOyBq
KyspCgkJICBpZiAoIXN0cmNtcCAocCwgR0VUX01PREVfTkFNRSAoaikpKQoJCSAgICBtb2Rl
ID0gKGVudW0gbWFjaGluZV9tb2RlKSBqOwoKCSAgICAgIGlmIChtb2RlID09IFZPSURtb2Rl
KQoJCWVycm9yICgidW5rbm93biBtYWNoaW5lIG1vZGUgYCVzJyIsIHApOwoJICAgICAgZWxz
ZSBpZiAoMCA9PSAodHlwZWZtID0gdHlwZV9mb3JfbW9kZSAobW9kZSwKCQkJCQkJICAgICBU
UkVFX1VOU0lHTkVEICh0eXBlKSkpKQoJCWVycm9yICgibm8gZGF0YSB0eXBlIGZvciBtb2Rl
IGAlcyciLCBwKTsKCSAgICAgIGVsc2UKCQl7CgkJICBUUkVFX1RZUEUgKGRlY2wpID0gdHlw
ZSA9IHR5cGVmbTsKCQkgIERFQ0xfU0laRSAoZGVjbCkgPSAwOwoJCSAgbGF5b3V0X2RlY2wg
KGRlY2wsIDApOwoJCX0KCSAgICB9CgkgIGJyZWFrOwoKCWNhc2UgQV9TRUNUSU9OOgojaWZk
ZWYgQVNNX09VVFBVVF9TRUNUSU9OX05BTUUKCSAgaWYgKChUUkVFX0NPREUgKGRlY2wpID09
IEZVTkNUSU9OX0RFQ0wKCSAgICAgICB8fCBUUkVFX0NPREUgKGRlY2wpID09IFZBUl9ERUNM
KQoJICAgICAgJiYgVFJFRV9DT0RFIChUUkVFX1ZBTFVFIChhcmdzKSkgPT0gU1RSSU5HX0NT
VCkKCSAgICB7CgkgICAgICBpZiAoVFJFRV9DT0RFIChkZWNsKSA9PSBWQVJfREVDTCAKCQkg
ICYmIGN1cnJlbnRfZnVuY3Rpb25fZGVjbCAhPSBOVUxMX1RSRUUKCQkgICYmICEgVFJFRV9T
VEFUSUMgKGRlY2wpKQoJCWVycm9yX3dpdGhfZGVjbCAoZGVjbCwKCQkgICJzZWN0aW9uIGF0
dHJpYnV0ZSBjYW5ub3QgYmUgc3BlY2lmaWVkIGZvciBsb2NhbCB2YXJpYWJsZXMiKTsKCSAg
ICAgIC8qIFRoZSBkZWNsIG1heSBoYXZlIGFscmVhZHkgYmVlbiBnaXZlbiBhIHNlY3Rpb24g
YXR0cmlidXRlIGZyb20KCQkgYSBwcmV2aW91cyBkZWNsYXJhdGlvbi4gIEVuc3VyZSB0aGV5
IG1hdGNoLiAgKi8KCSAgICAgIGVsc2UgaWYgKERFQ0xfU0VDVElPTl9OQU1FIChkZWNsKSAh
PSBOVUxMX1RSRUUKCQkgICAgICAgJiYgc3RyY21wIChUUkVFX1NUUklOR19QT0lOVEVSIChE
RUNMX1NFQ1RJT05fTkFNRSAoZGVjbCkpLAoJCQkJICBUUkVFX1NUUklOR19QT0lOVEVSIChU
UkVFX1ZBTFVFIChhcmdzKSkpICE9IDApCgkJZXJyb3Jfd2l0aF9kZWNsIChub2RlLAoJCQkJ
ICJzZWN0aW9uIG9mIGAlcycgY29uZmxpY3RzIHdpdGggcHJldmlvdXMgZGVjbGFyYXRpb24i
KTsKCSAgICAgIGVsc2UKCQlERUNMX1NFQ1RJT05fTkFNRSAoZGVjbCkgPSBUUkVFX1ZBTFVF
IChhcmdzKTsKCSAgICB9CgkgIGVsc2UKCSAgICBlcnJvcl93aXRoX2RlY2wgKG5vZGUsCgkJ
CSAgICJzZWN0aW9uIGF0dHJpYnV0ZSBub3QgYWxsb3dlZCBmb3IgYCVzJyIpOwojZWxzZQoJ
ICBlcnJvcl93aXRoX2RlY2wgKG5vZGUsCgkJICAic2VjdGlvbiBhdHRyaWJ1dGVzIGFyZSBu
b3Qgc3VwcG9ydGVkIGZvciB0aGlzIHRhcmdldCIpOwojZW5kaWYKCSAgYnJlYWs7CgoJY2Fz
ZSBBX0FMSUdORUQ6CgkgIHsKCSAgICB0cmVlIGFsaWduX2V4cHIKCSAgICAgID0gKGFyZ3Mg
PyBUUkVFX1ZBTFVFIChhcmdzKQoJCSA6IHNpemVfaW50IChCSUdHRVNUX0FMSUdOTUVOVCAv
IEJJVFNfUEVSX1VOSVQpKTsKCSAgICBpbnQgYWxpZ247CgoJICAgIC8qIFN0cmlwIGFueSBO
T1BzIG9mIGFueSBraW5kLiAgKi8KCSAgICB3aGlsZSAoVFJFRV9DT0RFIChhbGlnbl9leHBy
KSA9PSBOT1BfRVhQUgoJCSAgIHx8IFRSRUVfQ09ERSAoYWxpZ25fZXhwcikgPT0gQ09OVkVS
VF9FWFBSCgkJICAgfHwgVFJFRV9DT0RFIChhbGlnbl9leHByKSA9PSBOT05fTFZBTFVFX0VY
UFIpCgkgICAgICBhbGlnbl9leHByID0gVFJFRV9PUEVSQU5EIChhbGlnbl9leHByLCAwKTsK
CSAgCgkgICAgaWYgKFRSRUVfQ09ERSAoYWxpZ25fZXhwcikgIT0gSU5URUdFUl9DU1QpCgkg
ICAgICB7CgkJZXJyb3IgKCJyZXF1ZXN0ZWQgYWxpZ25tZW50IGlzIG5vdCBhIGNvbnN0YW50
Iik7CgkJY29udGludWU7CgkgICAgICB9CgoJICAgIGFsaWduID0gVFJFRV9JTlRfQ1NUX0xP
VyAoYWxpZ25fZXhwcikgKiBCSVRTX1BFUl9VTklUOwoKCSAgICBpZiAoZXhhY3RfbG9nMiAo
YWxpZ24pID09IC0xKQoJICAgICAgZXJyb3IgKCJyZXF1ZXN0ZWQgYWxpZ25tZW50IGlzIG5v
dCBhIHBvd2VyIG9mIDIiKTsKCSAgICBlbHNlIGlmIChpc190eXBlKQoJICAgICAgVFlQRV9B
TElHTiAodHlwZSkgPSBhbGlnbjsKCSAgICBlbHNlIGlmIChUUkVFX0NPREUgKGRlY2wpICE9
IFZBUl9ERUNMCgkJICAgICAmJiBUUkVFX0NPREUgKGRlY2wpICE9IEZJRUxEX0RFQ0wpCgkg
ICAgICBlcnJvcl93aXRoX2RlY2wgKGRlY2wsCgkJCSAgICAgICAiYWxpZ25tZW50IG1heSBu
b3QgYmUgc3BlY2lmaWVkIGZvciBgJXMnIik7CgkgICAgZWxzZQoJICAgICAgREVDTF9BTElH
TiAoZGVjbCkgPSBhbGlnbjsKCSAgfQoJICBicmVhazsKCgljYXNlIEFfRk9STUFUOgoJICB7
CgkgICAgdHJlZSBmb3JtYXRfdHlwZSA9IFRSRUVfVkFMVUUgKGFyZ3MpOwoJICAgIHRyZWUg
Zm9ybWF0X251bV9leHByID0gVFJFRV9WQUxVRSAoVFJFRV9DSEFJTiAoYXJncykpOwoJICAg
IHRyZWUgZmlyc3RfYXJnX251bV9leHByCgkgICAgICA9IFRSRUVfVkFMVUUgKFRSRUVfQ0hB
SU4gKFRSRUVfQ0hBSU4gKGFyZ3MpKSk7CgkgICAgaW50IGZvcm1hdF9udW07CgkgICAgaW50
IGZpcnN0X2FyZ19udW07CgkgICAgaW50IGlzX3NjYW47CgkgICAgdHJlZSBhcmd1bWVudDsK
CSAgICBpbnQgYXJnX251bTsKCQoJICAgIGlmIChUUkVFX0NPREUgKGRlY2wpICE9IEZVTkNU
SU9OX0RFQ0wpCgkgICAgICB7CgkJZXJyb3Jfd2l0aF9kZWNsIChkZWNsLAoJCQkgImFyZ3Vt
ZW50IGZvcm1hdCBzcGVjaWZpZWQgZm9yIG5vbi1mdW5jdGlvbiBgJXMnIik7CgkJY29udGlu
dWU7CgkgICAgICB9CgkKCSAgICBpZiAoVFJFRV9DT0RFIChmb3JtYXRfdHlwZSkgPT0gSURF
TlRJRklFUl9OT0RFCgkJJiYgKCFzdHJjbXAgKElERU5USUZJRVJfUE9JTlRFUiAoZm9ybWF0
X3R5cGUpLCAicHJpbnRmIikKCQkgICAgfHwgIXN0cmNtcCAoSURFTlRJRklFUl9QT0lOVEVS
IChmb3JtYXRfdHlwZSksCgkJCQkiX19wcmludGZfXyIpKSkKCSAgICAgIGlzX3NjYW4gPSAw
OwoJICAgIGVsc2UgaWYgKFRSRUVfQ09ERSAoZm9ybWF0X3R5cGUpID09IElERU5USUZJRVJf
Tk9ERQoJCSAgICAgJiYgKCFzdHJjbXAgKElERU5USUZJRVJfUE9JTlRFUiAoZm9ybWF0X3R5
cGUpLCAic2NhbmYiKQoJCQkgfHwgIXN0cmNtcCAoSURFTlRJRklFUl9QT0lOVEVSIChmb3Jt
YXRfdHlwZSksCgkJCQkgICAgICJfX3NjYW5mX18iKSkpCgkgICAgICBpc19zY2FuID0gMTsK
CSAgICBlbHNlIGlmIChUUkVFX0NPREUgKGZvcm1hdF90eXBlKSA9PSBJREVOVElGSUVSX05P
REUpCgkgICAgICB7CgkJZXJyb3IgKCJgJXMnIGlzIGFuIHVucmVjb2duaXplZCBmb3JtYXQg
ZnVuY3Rpb24gdHlwZSIsCgkJICAgICAgIElERU5USUZJRVJfUE9JTlRFUiAoZm9ybWF0X3R5
cGUpKTsKCQljb250aW51ZTsKCSAgICAgIH0KCSAgICBlbHNlCgkgICAgICB7CgkJZXJyb3Ig
KCJ1bnJlY29nbml6ZWQgZm9ybWF0IHNwZWNpZmllciIpOwoJCWNvbnRpbnVlOwoJICAgICAg
fQoKCSAgICAvKiBTdHJpcCBhbnkgY29udmVyc2lvbnMgZnJvbSB0aGUgc3RyaW5nIGluZGV4
IGFuZCBmaXJzdCBhcmcgbnVtYmVyCgkgICAgICAgYW5kIHZlcmlmeSB0aGV5IGFyZSBjb25z
dGFudHMuICAqLwoJICAgIHdoaWxlIChUUkVFX0NPREUgKGZvcm1hdF9udW1fZXhwcikgPT0g
Tk9QX0VYUFIKCQkgICB8fCBUUkVFX0NPREUgKGZvcm1hdF9udW1fZXhwcikgPT0gQ09OVkVS
VF9FWFBSCgkJICAgfHwgVFJFRV9DT0RFIChmb3JtYXRfbnVtX2V4cHIpID09IE5PTl9MVkFM
VUVfRVhQUikKCSAgICAgIGZvcm1hdF9udW1fZXhwciA9IFRSRUVfT1BFUkFORCAoZm9ybWF0
X251bV9leHByLCAwKTsKCgkgICAgd2hpbGUgKFRSRUVfQ09ERSAoZmlyc3RfYXJnX251bV9l
eHByKSA9PSBOT1BfRVhQUgoJCSAgIHx8IFRSRUVfQ09ERSAoZmlyc3RfYXJnX251bV9leHBy
KSA9PSBDT05WRVJUX0VYUFIKCQkgICB8fCBUUkVFX0NPREUgKGZpcnN0X2FyZ19udW1fZXhw
cikgPT0gTk9OX0xWQUxVRV9FWFBSKQoJICAgICAgZmlyc3RfYXJnX251bV9leHByID0gVFJF
RV9PUEVSQU5EIChmaXJzdF9hcmdfbnVtX2V4cHIsIDApOwoKCSAgICBpZiAoVFJFRV9DT0RF
IChmb3JtYXRfbnVtX2V4cHIpICE9IElOVEVHRVJfQ1NUCgkJfHwgVFJFRV9DT0RFIChmaXJz
dF9hcmdfbnVtX2V4cHIpICE9IElOVEVHRVJfQ1NUKQoJICAgICAgewoJCWVycm9yICgiZm9y
bWF0IHN0cmluZyBoYXMgbm9uLWNvbnN0YW50IG9wZXJhbmQgbnVtYmVyIik7CgkJY29udGlu
dWU7CgkgICAgICB9CgoJICAgIGZvcm1hdF9udW0gPSBUUkVFX0lOVF9DU1RfTE9XIChmb3Jt
YXRfbnVtX2V4cHIpOwoJICAgIGZpcnN0X2FyZ19udW0gPSBUUkVFX0lOVF9DU1RfTE9XIChm
aXJzdF9hcmdfbnVtX2V4cHIpOwoJICAgIGlmIChmaXJzdF9hcmdfbnVtICE9IDAgJiYgZmly
c3RfYXJnX251bSA8PSBmb3JtYXRfbnVtKQoJICAgICAgewoJCWVycm9yICgiZm9ybWF0IHN0
cmluZyBhcmcgZm9sbG93cyB0aGUgYXJncyB0byBiZSBmb3JtYXR0ZWQiKTsKCQljb250aW51
ZTsKCSAgICAgIH0KCgkgICAgLyogSWYgYSBwYXJhbWV0ZXIgbGlzdCBpcyBzcGVjaWZpZWQs
IHZlcmlmeSB0aGF0IHRoZSBmb3JtYXRfbnVtCgkgICAgICAgYXJndW1lbnQgaXMgYWN0dWFs
bHkgYSBzdHJpbmcsIGluIGNhc2UgdGhlIGZvcm1hdCBhdHRyaWJ1dGUKCSAgICAgICBpcyBp
biBlcnJvci4gICovCgkgICAgYXJndW1lbnQgPSBUWVBFX0FSR19UWVBFUyAodHlwZSk7Cgkg
ICAgaWYgKGFyZ3VtZW50KQoJICAgICAgewoJCWZvciAoYXJnX251bSA9IDE7IDsgKythcmdf
bnVtKQoJCSAgewoJCSAgICBpZiAoYXJndW1lbnQgPT0gMCB8fCBhcmdfbnVtID09IGZvcm1h
dF9udW0pCgkJICAgICAgYnJlYWs7CgkJICAgIGFyZ3VtZW50ID0gVFJFRV9DSEFJTiAoYXJn
dW1lbnQpOwoJCSAgfQoJCWlmICghIGFyZ3VtZW50CgkJICAgIHx8IFRSRUVfQ09ERSAoVFJF
RV9WQUxVRSAoYXJndW1lbnQpKSAhPSBQT0lOVEVSX1RZUEUKCQkgIHx8IChUWVBFX01BSU5f
VkFSSUFOVCAoVFJFRV9UWVBFIChUUkVFX1ZBTFVFIChhcmd1bWVudCkpKQoJCSAgICAgICE9
IGNoYXJfdHlwZV9ub2RlKSkKCQkgIHsKCQkgICAgZXJyb3IgKCJmb3JtYXQgc3RyaW5nIGFy
ZyBub3QgYSBzdHJpbmcgdHlwZSIpOwoJCSAgICBjb250aW51ZTsKCQkgIH0KCQlpZiAoZmly
c3RfYXJnX251bSAhPSAwKQoJCSAgewoJCSAgICAvKiBWZXJpZnkgdGhhdCBmaXJzdF9hcmdf
bnVtIHBvaW50cyB0byB0aGUgbGFzdCBhcmcsCgkJICAgICAgIHRoZSAuLi4gICovCgkJICAg
IHdoaWxlIChhcmd1bWVudCkKCQkgICAgICBhcmdfbnVtKyssIGFyZ3VtZW50ID0gVFJFRV9D
SEFJTiAoYXJndW1lbnQpOwoJCSAgaWYgKGFyZ19udW0gIT0gZmlyc3RfYXJnX251bSkKCQkg
ICAgewoJCSAgICAgIGVycm9yICgiYXJncyB0byBiZSBmb3JtYXR0ZWQgaXMgbm90IC4uLiIp
OwoJCSAgICAgIGNvbnRpbnVlOwoJCSAgICB9CgkJICB9CgkgICAgICB9CgoJICAgIHJlY29y
ZF9mdW5jdGlvbl9mb3JtYXQgKERFQ0xfTkFNRSAoZGVjbCksCgkJCQkgICAgREVDTF9BU1NF
TUJMRVJfTkFNRSAoZGVjbCksCgkJCQkgICAgaXNfc2NhbiwgZm9ybWF0X251bSwgZmlyc3Rf
YXJnX251bSk7CgkgICAgYnJlYWs7CgkgIH0KCgljYXNlIEFfRk9STUFUX0FSRzoKCSAgewoJ
ICAgIHRyZWUgZm9ybWF0X251bV9leHByID0gVFJFRV9WQUxVRSAoYXJncyk7CgkgICAgaW50
IGZvcm1hdF9udW0sIGFyZ19udW07CgkgICAgdHJlZSBhcmd1bWVudDsKCQoJICAgIGlmIChU
UkVFX0NPREUgKGRlY2wpICE9IEZVTkNUSU9OX0RFQ0wpCgkgICAgICB7CgkJZXJyb3Jfd2l0
aF9kZWNsIChkZWNsLAoJCQkgImFyZ3VtZW50IGZvcm1hdCBzcGVjaWZpZWQgZm9yIG5vbi1m
dW5jdGlvbiBgJXMnIik7CgkJY29udGludWU7CgkgICAgICB9CgkKCSAgICAvKiBTdHJpcCBh
bnkgY29udmVyc2lvbnMgZnJvbSB0aGUgZmlyc3QgYXJnIG51bWJlciBhbmQgdmVyaWZ5IGl0
CgkgICAgICAgaXMgYSBjb25zdGFudC4gICovCgkgICAgd2hpbGUgKFRSRUVfQ09ERSAoZm9y
bWF0X251bV9leHByKSA9PSBOT1BfRVhQUgoJCSAgIHx8IFRSRUVfQ09ERSAoZm9ybWF0X251
bV9leHByKSA9PSBDT05WRVJUX0VYUFIKCQkgICB8fCBUUkVFX0NPREUgKGZvcm1hdF9udW1f
ZXhwcikgPT0gTk9OX0xWQUxVRV9FWFBSKQoJICAgICAgZm9ybWF0X251bV9leHByID0gVFJF
RV9PUEVSQU5EIChmb3JtYXRfbnVtX2V4cHIsIDApOwoKCSAgICBpZiAoVFJFRV9DT0RFIChm
b3JtYXRfbnVtX2V4cHIpICE9IElOVEVHRVJfQ1NUKQoJICAgICAgewoJCWVycm9yICgiZm9y
bWF0IHN0cmluZyBoYXMgbm9uLWNvbnN0YW50IG9wZXJhbmQgbnVtYmVyIik7CgkJY29udGlu
dWU7CgkgICAgICB9CgoJICAgIGZvcm1hdF9udW0gPSBUUkVFX0lOVF9DU1RfTE9XIChmb3Jt
YXRfbnVtX2V4cHIpOwoKCSAgICAvKiBJZiBhIHBhcmFtZXRlciBsaXN0IGlzIHNwZWNpZmll
ZCwgdmVyaWZ5IHRoYXQgdGhlIGZvcm1hdF9udW0KCSAgICAgICBhcmd1bWVudCBpcyBhY3R1
YWxseSBhIHN0cmluZywgaW4gY2FzZSB0aGUgZm9ybWF0IGF0dHJpYnV0ZQoJICAgICAgIGlz
IGluIGVycm9yLiAgKi8KCSAgICBhcmd1bWVudCA9IFRZUEVfQVJHX1RZUEVTICh0eXBlKTsK
CSAgICBpZiAoYXJndW1lbnQpCgkgICAgICB7CgkJZm9yIChhcmdfbnVtID0gMTsgOyArK2Fy
Z19udW0pCgkJICB7CgkJICAgIGlmIChhcmd1bWVudCA9PSAwIHx8IGFyZ19udW0gPT0gZm9y
bWF0X251bSkKCQkgICAgICBicmVhazsKCQkgICAgYXJndW1lbnQgPSBUUkVFX0NIQUlOIChh
cmd1bWVudCk7CgkJICB9CgkJaWYgKCEgYXJndW1lbnQKCQkgICAgfHwgVFJFRV9DT0RFIChU
UkVFX1ZBTFVFIChhcmd1bWVudCkpICE9IFBPSU5URVJfVFlQRQoJCSAgfHwgKFRZUEVfTUFJ
Tl9WQVJJQU5UIChUUkVFX1RZUEUgKFRSRUVfVkFMVUUgKGFyZ3VtZW50KSkpCgkJICAgICAg
IT0gY2hhcl90eXBlX25vZGUpKQoJCSAgewoJCSAgICBlcnJvciAoImZvcm1hdCBzdHJpbmcg
YXJnIG5vdCBhIHN0cmluZyB0eXBlIik7CgkJICAgIGNvbnRpbnVlOwoJCSAgfQoJICAgICAg
fQoKCSAgICBpZiAoVFJFRV9DT0RFIChUUkVFX1RZUEUgKFRSRUVfVFlQRSAoZGVjbCkpKSAh
PSBQT0lOVEVSX1RZUEUKCQl8fCAoVFlQRV9NQUlOX1ZBUklBTlQgKFRSRUVfVFlQRSAoVFJF
RV9UWVBFIChUUkVFX1RZUEUgKGRlY2wpKSkpCgkJICAgICE9IGNoYXJfdHlwZV9ub2RlKSkK
CSAgICAgIHsKCQllcnJvciAoImZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBzdHJpbmcgdHlw
ZSIpOwoJCWNvbnRpbnVlOwoJICAgICAgfQoKCSAgICByZWNvcmRfaW50ZXJuYXRpb25hbF9m
b3JtYXQgKERFQ0xfTkFNRSAoZGVjbCksCgkJCQkJIERFQ0xfQVNTRU1CTEVSX05BTUUgKGRl
Y2wpLAoJCQkJCSBmb3JtYXRfbnVtKTsKCSAgICBicmVhazsKCSAgfQoKCWNhc2UgQV9XRUFL
OgoJICBkZWNsYXJlX3dlYWsgKGRlY2wpOwoJICBicmVhazsKCgljYXNlIEFfQUxJQVM6Cgkg
IGlmICgoVFJFRV9DT0RFIChkZWNsKSA9PSBGVU5DVElPTl9ERUNMICYmIERFQ0xfSU5JVElB
TCAoZGVjbCkpCgkgICAgICB8fCAoVFJFRV9DT0RFIChkZWNsKSAhPSBGVU5DVElPTl9ERUNM
ICYmICEgREVDTF9FWFRFUk5BTCAoZGVjbCkpKQoJICAgIGVycm9yX3dpdGhfZGVjbCAoZGVj
bCwKCQkJICAgICAiYCVzJyBkZWZpbmVkIGJvdGggbm9ybWFsbHkgYW5kIGFzIGFuIGFsaWFz
Iik7CgkgIGVsc2UgaWYgKGRlY2xfZnVuY3Rpb25fY29udGV4dCAoZGVjbCkgPT0gMCkKCSAg
ICB7CgkgICAgICB0cmVlIGlkID0gZ2V0X2lkZW50aWZpZXIgKFRSRUVfU1RSSU5HX1BPSU5U
RVIKCQkJCQkoVFJFRV9WQUxVRSAoYXJncykpKTsKCSAgICAgIGlmIChUUkVFX0NPREUgKGRl
Y2wpID09IEZVTkNUSU9OX0RFQ0wpCgkJREVDTF9JTklUSUFMIChkZWNsKSA9IGVycm9yX21h
cmtfbm9kZTsKCSAgICAgIGVsc2UKCQlERUNMX0VYVEVSTkFMIChkZWNsKSA9IDA7CgkgICAg
ICBhc3NlbWJsZV9hbGlhcyAoZGVjbCwgaWQpOwoJICAgIH0KCSAgZWxzZQoJICAgIHdhcm5p
bmcgKCJgJXMnIGF0dHJpYnV0ZSBpZ25vcmVkIiwgSURFTlRJRklFUl9QT0lOVEVSIChuYW1l
KSk7CgkgIGJyZWFrOwoJfQogICAgfQp9CgovKiBTcGxpdCBTUEVDU19BVFRSUywgYSBsaXN0
IG9mIGRlY2xzcGVjcyBhbmQgcHJlZml4IGF0dHJpYnV0ZXMsIGludG8gdHdvCiAgIGxpc3Rz
LiAgU1BFQ1NfQVRUUlMgbWF5IGFsc28gYmUganVzdCBhIHR5cGVzcGVjIChlZzogUkVDT1JE
X1RZUEUpLgoKICAgVGhlIGhlYWQgb2YgdGhlIGRlY2xzcGVjIGxpc3QgaXMgc3RvcmVkIGlu
IERFQ0xTUEVDUy4KICAgVGhlIGhlYWQgb2YgdGhlIGF0dHJpYnV0ZSBsaXN0IGlzIHN0b3Jl
ZCBpbiBQUkVGSVhfQVRUUklCVVRFUy4KCiAgIE5vdGUgdGhhdCBhdHRyaWJ1dGVzIGluIFNQ
RUNTX0FUVFJTIGFyZSBzdG9yZWQgaW4gdGhlIFRSRUVfUFVSUE9TRSBvZgogICB0aGUgbGlz
dCBlbGVtZW50cy4gIFdlIGRyb3AgdGhlIGNvbnRhaW5pbmcgVFJFRV9MSVNUIG5vZGVzIGFu
ZCBsaW5rIHRoZQogICByZXN1bHRpbmcgYXR0cmlidXRlcyB0b2dldGhlciB0aGUgd2F5IGRl
Y2xfYXR0cmlidXRlcyBleHBlY3RzIHRoZW0uICAqLwoKdm9pZApzcGxpdF9zcGVjc19hdHRy
cyAoc3BlY3NfYXR0cnMsIGRlY2xzcGVjcywgcHJlZml4X2F0dHJpYnV0ZXMpCiAgICAgdHJl
ZSBzcGVjc19hdHRyczsKICAgICB0cmVlICpkZWNsc3BlY3MsICpwcmVmaXhfYXR0cmlidXRl
czsKewogIHRyZWUgdCwgcywgYSwgbmV4dCwgc3BlY3MsIGF0dHJzOwoKICAvKiBUaGlzIGNh
biBoYXBwZW4gaW4gYysrIChlZzogZGVjbDogdHlwZXNwZWMgaW5pdGRlY2xzICc7JykuICAq
LwogIGlmIChzcGVjc19hdHRycyAhPSBOVUxMX1RSRUUKICAgICAgJiYgVFJFRV9DT0RFIChz
cGVjc19hdHRycykgIT0gVFJFRV9MSVNUKQogICAgewogICAgICAqZGVjbHNwZWNzID0gc3Bl
Y3NfYXR0cnM7CiAgICAgICpwcmVmaXhfYXR0cmlidXRlcyA9IE5VTExfVFJFRTsKICAgICAg
cmV0dXJuOwogICAgfQoKICAvKiBSZW1lbWJlciB0byBrZWVwIHRoZSBsaXN0cyBpbiB0aGUg
c2FtZSBvcmRlciwgZWxlbWVudC13aXNlLiAgKi8KCiAgc3BlY3MgPSBzID0gTlVMTF9UUkVF
OwogIGF0dHJzID0gYSA9IE5VTExfVFJFRTsKICBmb3IgKHQgPSBzcGVjc19hdHRyczsgdDsg
dCA9IG5leHQpCiAgICB7CiAgICAgIG5leHQgPSBUUkVFX0NIQUlOICh0KTsKICAgICAgLyog
RGVjbHNwZWNzIGhhdmUgYSBub24tTlVMTCBUUkVFX1ZBTFVFLiAgKi8KICAgICAgaWYgKFRS
RUVfVkFMVUUgKHQpICE9IE5VTExfVFJFRSkKCXsKCSAgaWYgKHNwZWNzID09IE5VTExfVFJF
RSkKCSAgICBzcGVjcyA9IHMgPSB0OwoJICBlbHNlCgkgICAgewoJICAgICAgVFJFRV9DSEFJ
TiAocykgPSB0OwoJICAgICAgcyA9IHQ7CgkgICAgfQoJfQogICAgICBlbHNlCgl7CgkgIGlm
IChhdHRycyA9PSBOVUxMX1RSRUUpCgkgICAgYXR0cnMgPSBhID0gVFJFRV9QVVJQT1NFICh0
KTsKCSAgZWxzZQoJICAgIHsKCSAgICAgIFRSRUVfQ0hBSU4gKGEpID0gVFJFRV9QVVJQT1NF
ICh0KTsKCSAgICAgIGEgPSBUUkVFX1BVUlBPU0UgKHQpOwoJICAgIH0KCSAgLyogTW9yZSBh
dHRycyBjYW4gYmUgbGlua2VkIGhlcmUsIG1vdmUgQSB0byB0aGUgZW5kLiAgKi8KCSAgd2hp
bGUgKFRSRUVfQ0hBSU4gKGEpICE9IE5VTExfVFJFRSkKCSAgICBhID0gVFJFRV9DSEFJTiAo
YSk7Cgl9CiAgICB9CgogIC8qIFRlcm1pbmF0ZSB0aGUgbGlzdHMuICAqLwogIGlmIChzICE9
IE5VTExfVFJFRSkKICAgIFRSRUVfQ0hBSU4gKHMpID0gTlVMTF9UUkVFOwogIGlmIChhICE9
IE5VTExfVFJFRSkKICAgIFRSRUVfQ0hBSU4gKGEpID0gTlVMTF9UUkVFOwoKICAvKiBBbGwg
ZG9uZS4gICovCiAgKmRlY2xzcGVjcyA9IHNwZWNzOwogICpwcmVmaXhfYXR0cmlidXRlcyA9
IGF0dHJzOwp9CgwKLyogQ2hlY2sgYSBwcmludGYvZnByaW50Zi9zcHJpbnRmL3NjYW5mL2Zz
Y2FuZi9zc2NhbmYgZm9ybWF0IGFnYWluc3QKICAgYSBwYXJhbWV0ZXIgbGlzdC4gICovCgoj
ZGVmaW5lIFRfSQkmaW50ZWdlcl90eXBlX25vZGUKI2RlZmluZSBUX0wJJmxvbmdfaW50ZWdl
cl90eXBlX25vZGUKI2RlZmluZSBUX0xMCSZsb25nX2xvbmdfaW50ZWdlcl90eXBlX25vZGUK
I2RlZmluZSBUX1MJJnNob3J0X2ludGVnZXJfdHlwZV9ub2RlCiNkZWZpbmUgVF9VSQkmdW5z
aWduZWRfdHlwZV9ub2RlCiNkZWZpbmUgVF9VTAkmbG9uZ191bnNpZ25lZF90eXBlX25vZGUK
I2RlZmluZSBUX1VMTAkmbG9uZ19sb25nX3Vuc2lnbmVkX3R5cGVfbm9kZQojZGVmaW5lIFRf
VVMJJnNob3J0X3Vuc2lnbmVkX3R5cGVfbm9kZQojZGVmaW5lIFRfRgkmZmxvYXRfdHlwZV9u
b2RlCiNkZWZpbmUgVF9ECSZkb3VibGVfdHlwZV9ub2RlCiNkZWZpbmUgVF9MRAkmbG9uZ19k
b3VibGVfdHlwZV9ub2RlCiNkZWZpbmUgVF9DCSZjaGFyX3R5cGVfbm9kZQojZGVmaW5lIFRf
Vgkmdm9pZF90eXBlX25vZGUKI2RlZmluZSBUX1cJJndjaGFyX3R5cGVfbm9kZQojZGVmaW5l
IFRfU1QgICAgJnNpemV0eXBlCgp0eXBlZGVmIHN0cnVjdCB7CiAgY2hhciAqZm9ybWF0X2No
YXJzOwogIGludCBwb2ludGVyX2NvdW50OwogIC8qIFR5cGUgb2YgYXJndW1lbnQgaWYgbm8g
bGVuZ3RoIG1vZGlmaWVyIGlzIHVzZWQuICAqLwogIHRyZWUgKm5vbGVuOwogIC8qIFR5cGUg
b2YgYXJndW1lbnQgaWYgbGVuZ3RoIG1vZGlmaWVyIGZvciBzaG9ydGVuaW5nIGlzIHVzZWQu
CiAgICAgSWYgTlVMTCwgdGhlbiB0aGlzIG1vZGlmaWVyIGlzIG5vdCBhbGxvd2VkLiAgKi8K
ICB0cmVlICpobGVuOwogIC8qIFR5cGUgb2YgYXJndW1lbnQgaWYgbGVuZ3RoIG1vZGlmaWVy
IGBsJyBpcyB1c2VkLgogICAgIElmIE5VTEwsIHRoZW4gdGhpcyBtb2RpZmllciBpcyBub3Qg
YWxsb3dlZC4gICovCiAgdHJlZSAqbGxlbjsKICAvKiBUeXBlIG9mIGFyZ3VtZW50IGlmIGxl
bmd0aCBtb2RpZmllciBgcScgb3IgYGxsJyBpcyB1c2VkLgogICAgIElmIE5VTEwsIHRoZW4g
dGhpcyBtb2RpZmllciBpcyBub3QgYWxsb3dlZC4gICovCiAgdHJlZSAqcWxlbjsKICAvKiBU
eXBlIG9mIGFyZ3VtZW50IGlmIGxlbmd0aCBtb2RpZmllciBgTCcgaXMgdXNlZC4KICAgICBJ
ZiBOVUxMLCB0aGVuIHRoaXMgbW9kaWZpZXIgaXMgbm90IGFsbG93ZWQuICAqLwogIHRyZWUg
KmJpZ2xsZW47CiAgLyogTGlzdCBvZiBvdGhlciBtb2RpZmllciBjaGFyYWN0ZXJzIGFsbG93
ZWQgd2l0aCB0aGVzZSBvcHRpb25zLiAgKi8KICBjaGFyICpmbGFnX2NoYXJzOwp9IGZvcm1h
dF9jaGFyX2luZm87CgpzdGF0aWMgZm9ybWF0X2NoYXJfaW5mbyBwcmludF9jaGFyX3RhYmxl
W10gPSB7CiAgeyAiZGkiLAkwLAlUX0ksCVRfSSwJVF9MLAlUX0xMLAlUX0xMLAkiLXdwMCAr
Igl9LAogIHsgIm94WCIsCTAsCVRfVUksCVRfVUksCVRfVUwsCVRfVUxMLAlUX1VMTCwJIi13
cDAjIgkJfSwKICB7ICJ1IiwJMCwJVF9VSSwJVF9VSSwJVF9VTCwJVF9VTEwsCVRfVUxMLAki
LXdwMCIJCX0sCi8qIFR3byBHTlUgZXh0ZW5zaW9ucy4gICovCiAgeyAiWiIsCTAsCVRfU1Qs
CU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCSItd3AwIgkJfSwKICB7ICJtIiwJMCwJVF9WLAlO
VUxMLAlOVUxMLAlOVUxMLAlOVUxMLAkiLXdwIgkJfSwKICB7ICJmZUVnRyIsCTAsCVRfRCwJ
TlVMTCwJTlVMTCwJTlVMTCwJVF9MRCwJIi13cDAgKyMiCX0sCiAgeyAiYyIsCTAsCVRfSSwJ
TlVMTCwJVF9XLAlOVUxMLAlOVUxMLAkiLXciCQl9LAogIHsgIkMiLAkwLAlUX1csCU5VTEws
CU5VTEwsCU5VTEwsCU5VTEwsCSItdyIJCX0sCiAgeyAicyIsCTEsCVRfQywJTlVMTCwJVF9X
LAlOVUxMLAlOVUxMLAkiLXdwIgkJfSwKICB7ICJTIiwJMSwJVF9XLAlOVUxMLAlOVUxMLAlO
VUxMLAlOVUxMLAkiLXdwIgkJfSwKICB7ICJwIiwJMSwJVF9WLAlOVUxMLAlOVUxMLAlOVUxM
LAlOVUxMLAkiLXciCQl9LAogIHsgIm4iLAkxLAlUX0ksCVRfUywJVF9MLAlUX0xMLAlOVUxM
LAkiIgkJfSwKICB7IE5VTEwgfQp9OwoKc3RhdGljIGZvcm1hdF9jaGFyX2luZm8gc2Nhbl9j
aGFyX3RhYmxlW10gPSB7CiAgeyAiZGkiLAkxLAlUX0ksCVRfUywJVF9MLAlUX0xMLAlUX0xM
LAkiKiIJfSwKICB7ICJvdXhYIiwJMSwJVF9VSSwJVF9VUywJVF9VTCwJVF9VTEwsCVRfVUxM
LAkiKiIJfSwJCiAgeyAiZWZnRUciLAkxLAlUX0YsCU5VTEwsCVRfRCwJTlVMTCwJVF9MRCwJ
IioiCX0sCiAgeyAic2MiLAkxLAlUX0MsCU5VTEwsCVRfVywJTlVMTCwJTlVMTCwJIiphIgl9
LAogIHsgIlsiLAkxLAlUX0MsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCSIqYSIJfSwKICB7
ICJDIiwJMSwJVF9XLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAkiKiIJfSwKICB7ICJTIiwJ
MSwJVF9XLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAkiKiIJfSwKICB7ICJwIiwJMiwJVF9W
LAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAkiKiIJfSwKICB7ICJuIiwJMSwJVF9JLAlUX1Ms
CVRfTCwJVF9MTCwJTlVMTCwJIiIJfSwKICB7IE5VTEwgfQp9OwoKdHlwZWRlZiBzdHJ1Y3Qg
ZnVuY3Rpb25fZm9ybWF0X2luZm8KewogIHN0cnVjdCBmdW5jdGlvbl9mb3JtYXRfaW5mbyAq
bmV4dDsgIC8qIG5leHQgc3RydWN0dXJlIG9uIHRoZSBsaXN0ICovCiAgdHJlZSBuYW1lOwkJ
CS8qIGlkZW50aWZpZXIgc3VjaCBhcyAicHJpbnRmIiAqLwogIHRyZWUgYXNzZW1ibGVyX25h
bWU7CQkvKiBvcHRpb25hbCBtYW5nbGVkIGlkZW50aWZpZXIgKGZvciBDKyspICovCiAgaW50
IGlzX3NjYW47CQkJLyogVFJVRSBpZiAqc2NhbmYgKi8KICBpbnQgZm9ybWF0X251bTsJCS8q
IG51bWJlciBvZiBmb3JtYXQgYXJndW1lbnQgKi8KICBpbnQgZmlyc3RfYXJnX251bTsJCS8q
IG51bWJlciBvZiBmaXJzdCBhcmcgKHplcm8gZm9yIHZhcmFyZ3MpICovCn0gZnVuY3Rpb25f
Zm9ybWF0X2luZm87CgpzdGF0aWMgZnVuY3Rpb25fZm9ybWF0X2luZm8gKmZ1bmN0aW9uX2Zv
cm1hdF9saXN0ID0gTlVMTDsKCnR5cGVkZWYgc3RydWN0IGludGVybmF0aW9uYWxfZm9ybWF0
X2luZm8KewogIHN0cnVjdCBpbnRlcm5hdGlvbmFsX2Zvcm1hdF9pbmZvICpuZXh0OyAgLyog
bmV4dCBzdHJ1Y3R1cmUgb24gdGhlIGxpc3QgKi8KICB0cmVlIG5hbWU7CQkJLyogaWRlbnRp
ZmllciBzdWNoIGFzICJnZXR0ZXh0IiAqLwogIHRyZWUgYXNzZW1ibGVyX25hbWU7CQkvKiBv
cHRpb25hbCBtYW5nbGVkIGlkZW50aWZpZXIgKGZvciBDKyspICovCiAgaW50IGZvcm1hdF9u
dW07CQkvKiBudW1iZXIgb2YgZm9ybWF0IGFyZ3VtZW50ICovCn0gaW50ZXJuYXRpb25hbF9m
b3JtYXRfaW5mbzsKCnN0YXRpYyBpbnRlcm5hdGlvbmFsX2Zvcm1hdF9pbmZvICppbnRlcm5h
dGlvbmFsX2Zvcm1hdF9saXN0ID0gTlVMTDsKCnN0YXRpYyB2b2lkIGNoZWNrX2Zvcm1hdF9p
bmZvCQlQUk9UTygoZnVuY3Rpb25fZm9ybWF0X2luZm8gKiwgdHJlZSkpOwoKLyogSW5pdGlh
bGl6ZSB0aGUgdGFibGUgb2YgZnVuY3Rpb25zIHRvIHBlcmZvcm0gZm9ybWF0IGNoZWNraW5n
IG9uLgogICBUaGUgQU5TSSBmdW5jdGlvbnMgYXJlIGFsd2F5cyBjaGVja2VkICh3aGV0aGVy
IDxzdGRpby5oPiBpcwogICBpbmNsdWRlZCBvciBub3QpLCBzaW5jZSBpdCBpcyBjb21tb24g
dG8gY2FsbCBwcmludGYgd2l0aG91dAogICBpbmNsdWRpbmcgPHN0ZGlvLmg+LiAgVGhlcmUg
c2hvdWxkbid0IGJlIGEgcHJvYmxlbSB3aXRoIHRoaXMsCiAgIHNpbmNlIEFOU0kgcmVzZXJ2
ZXMgdGhlc2UgZnVuY3Rpb24gbmFtZXMgd2hldGhlciB5b3UgaW5jbHVkZSB0aGUKICAgaGVh
ZGVyIGZpbGUgb3Igbm90LiAgSW4gYW55IGNhc2UsIHRoZSBjaGVja2luZyBpcyBoYXJtbGVz
cy4gCgogICBBbHNvIGluaXRpYWxpemUgdGhlIG5hbWUgb2YgZnVuY3Rpb24gdGhhdCBtb2Rp
ZnkgdGhlIGZvcm1hdCBzdHJpbmcgZm9yCiAgIGludGVybmF0aW9uYWxpemF0aW9uIHB1cnBv
c2VzLiAgKi8KCnZvaWQKaW5pdF9mdW5jdGlvbl9mb3JtYXRfaW5mbyAoKQp7CiAgcmVjb3Jk
X2Z1bmN0aW9uX2Zvcm1hdCAoZ2V0X2lkZW50aWZpZXIgKCJwcmludGYiKSwgTlVMTF9UUkVF
LCAwLCAxLCAyKTsKICByZWNvcmRfZnVuY3Rpb25fZm9ybWF0IChnZXRfaWRlbnRpZmllciAo
ImZwcmludGYiKSwgTlVMTF9UUkVFLCAwLCAyLCAzKTsKICByZWNvcmRfZnVuY3Rpb25fZm9y
bWF0IChnZXRfaWRlbnRpZmllciAoInNwcmludGYiKSwgTlVMTF9UUkVFLCAwLCAyLCAzKTsK
ICByZWNvcmRfZnVuY3Rpb25fZm9ybWF0IChnZXRfaWRlbnRpZmllciAoInNjYW5mIiksIE5V
TExfVFJFRSwgMSwgMSwgMik7CiAgcmVjb3JkX2Z1bmN0aW9uX2Zvcm1hdCAoZ2V0X2lkZW50
aWZpZXIgKCJmc2NhbmYiKSwgTlVMTF9UUkVFLCAxLCAyLCAzKTsKICByZWNvcmRfZnVuY3Rp
b25fZm9ybWF0IChnZXRfaWRlbnRpZmllciAoInNzY2FuZiIpLCBOVUxMX1RSRUUsIDEsIDIs
IDMpOwogIHJlY29yZF9mdW5jdGlvbl9mb3JtYXQgKGdldF9pZGVudGlmaWVyICgidnByaW50
ZiIpLCBOVUxMX1RSRUUsIDAsIDEsIDApOwogIHJlY29yZF9mdW5jdGlvbl9mb3JtYXQgKGdl
dF9pZGVudGlmaWVyICgidmZwcmludGYiKSwgTlVMTF9UUkVFLCAwLCAyLCAwKTsKICByZWNv
cmRfZnVuY3Rpb25fZm9ybWF0IChnZXRfaWRlbnRpZmllciAoInZzcHJpbnRmIiksIE5VTExf
VFJFRSwgMCwgMiwgMCk7CgogIHJlY29yZF9pbnRlcm5hdGlvbmFsX2Zvcm1hdCAoZ2V0X2lk
ZW50aWZpZXIgKCJnZXR0ZXh0IiksIE5VTExfVFJFRSwgMSk7CiAgcmVjb3JkX2ludGVybmF0
aW9uYWxfZm9ybWF0IChnZXRfaWRlbnRpZmllciAoImRnZXR0ZXh0IiksIE5VTExfVFJFRSwg
Mik7CiAgcmVjb3JkX2ludGVybmF0aW9uYWxfZm9ybWF0IChnZXRfaWRlbnRpZmllciAoImRj
Z2V0dGV4dCIpLCBOVUxMX1RSRUUsIDIpOwp9CgovKiBSZWNvcmQgaW5mb3JtYXRpb24gZm9y
IGFyZ3VtZW50IGZvcm1hdCBjaGVja2luZy4gIEZVTkNUSU9OX0lERU5UIGlzCiAgIHRoZSBp
ZGVudGlmaWVyIG5vZGUgZm9yIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBjaGVjayAo
aXRzIGRlY2wKICAgbmVlZCBub3QgZXhpc3QgeWV0KS4gIElTX1NDQU4gaXMgdHJ1ZSBmb3Ig
c2NhbmYtdHlwZSBmb3JtYXQgY2hlY2tpbmc7CiAgIGZhbHNlIGluZGljYXRlcyBwcmludGYt
c3R5bGUgZm9ybWF0IGNoZWNraW5nLiAgRk9STUFUX05VTSBpcyB0aGUgbnVtYmVyCiAgIG9m
IHRoZSBhcmd1bWVudCB3aGljaCBpcyB0aGUgZm9ybWF0IGNvbnRyb2wgc3RyaW5nIChzdGFy
dGluZyBmcm9tIDEpLgogICBGSVJTVF9BUkdfTlVNIGlzIHRoZSBudW1iZXIgb2YgdGhlIGZp
cnN0IGFjdHVhbCBhcmd1bWVudCB0byBjaGVjawogICBhZ2FpbnN0IHRoZSBmb3JtYXQgc3Ry
aW5nLCBvciB6ZXJvIGlmIG5vIGNoZWNraW5nIGlzIG5vdCBiZSBkb25lCiAgIChlLmcuIGZv
ciB2YXJhcmdzIHN1Y2ggYXMgdmZwcmludGYpLiAgKi8KCnZvaWQKcmVjb3JkX2Z1bmN0aW9u
X2Zvcm1hdCAobmFtZSwgYXNzZW1ibGVyX25hbWUsIGlzX3NjYW4sCgkJCWZvcm1hdF9udW0s
IGZpcnN0X2FyZ19udW0pCiAgICAgIHRyZWUgbmFtZTsKICAgICAgdHJlZSBhc3NlbWJsZXJf
bmFtZTsKICAgICAgaW50IGlzX3NjYW47CiAgICAgIGludCBmb3JtYXRfbnVtOwogICAgICBp
bnQgZmlyc3RfYXJnX251bTsKewogIGZ1bmN0aW9uX2Zvcm1hdF9pbmZvICppbmZvOwoKICAv
KiBSZS11c2UgZXhpc3Rpbmcgc3RydWN0dXJlIGlmIGl0J3MgdGhlcmUuICAqLwoKICBmb3Ig
KGluZm8gPSBmdW5jdGlvbl9mb3JtYXRfbGlzdDsgaW5mbzsgaW5mbyA9IGluZm8tPm5leHQp
CiAgICB7CiAgICAgIGlmIChpbmZvLT5uYW1lID09IG5hbWUgJiYgaW5mby0+YXNzZW1ibGVy
X25hbWUgPT0gYXNzZW1ibGVyX25hbWUpCglicmVhazsKICAgIH0KICBpZiAoISBpbmZvKQog
ICAgewogICAgICBpbmZvID0gKGZ1bmN0aW9uX2Zvcm1hdF9pbmZvICopIHhtYWxsb2MgKHNp
emVvZiAoZnVuY3Rpb25fZm9ybWF0X2luZm8pKTsKICAgICAgaW5mby0+bmV4dCA9IGZ1bmN0
aW9uX2Zvcm1hdF9saXN0OwogICAgICBmdW5jdGlvbl9mb3JtYXRfbGlzdCA9IGluZm87Cgog
ICAgICBpbmZvLT5uYW1lID0gbmFtZTsKICAgICAgaW5mby0+YXNzZW1ibGVyX25hbWUgPSBh
c3NlbWJsZXJfbmFtZTsKICAgIH0KCiAgaW5mby0+aXNfc2NhbiA9IGlzX3NjYW47CiAgaW5m
by0+Zm9ybWF0X251bSA9IGZvcm1hdF9udW07CiAgaW5mby0+Zmlyc3RfYXJnX251bSA9IGZp
cnN0X2FyZ19udW07Cn0KCi8qIFJlY29yZCBpbmZvcm1hdGlvbiBmb3IgdGhlIG5hbWVzIG9m
IGZ1bmN0aW9uIHRoYXQgbW9kaWZ5IHRoZSBmb3JtYXQKICAgYXJndW1lbnQgdG8gZm9ybWF0
IGZ1bmN0aW9ucy4gIEZVTkNUSU9OX0lERU5UIGlzIHRoZSBpZGVudGlmaWVyIG5vZGUgZm9y
CiAgIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiAoaXRzIGRlY2wgbmVlZCBub3QgZXhpc3Qg
eWV0KSBhbmQgRk9STUFUX05VTSBpcwogICB0aGUgbnVtYmVyIG9mIHRoZSBhcmd1bWVudCB3
aGljaCBpcyB0aGUgZm9ybWF0IGNvbnRyb2wgc3RyaW5nIChzdGFydGluZwogICBmcm9tIDEp
LiAgKi8KCnN0YXRpYyB2b2lkCnJlY29yZF9pbnRlcm5hdGlvbmFsX2Zvcm1hdCAobmFtZSwg
YXNzZW1ibGVyX25hbWUsIGZvcm1hdF9udW0pCiAgICAgIHRyZWUgbmFtZTsKICAgICAgdHJl
ZSBhc3NlbWJsZXJfbmFtZTsKICAgICAgaW50IGZvcm1hdF9udW07CnsKICBpbnRlcm5hdGlv
bmFsX2Zvcm1hdF9pbmZvICppbmZvOwoKICAvKiBSZS11c2UgZXhpc3Rpbmcgc3RydWN0dXJl
IGlmIGl0J3MgdGhlcmUuICAqLwoKICBmb3IgKGluZm8gPSBpbnRlcm5hdGlvbmFsX2Zvcm1h
dF9saXN0OyBpbmZvOyBpbmZvID0gaW5mby0+bmV4dCkKICAgIHsKICAgICAgaWYgKGluZm8t
Pm5hbWUgPT0gbmFtZSAmJiBpbmZvLT5hc3NlbWJsZXJfbmFtZSA9PSBhc3NlbWJsZXJfbmFt
ZSkKCWJyZWFrOwogICAgfQoKICBpZiAoISBpbmZvKQogICAgewogICAgICBpbmZvCgk9IChp
bnRlcm5hdGlvbmFsX2Zvcm1hdF9pbmZvICopCgkgIHhtYWxsb2MgKHNpemVvZiAoaW50ZXJu
YXRpb25hbF9mb3JtYXRfaW5mbykpOwogICAgICBpbmZvLT5uZXh0ID0gaW50ZXJuYXRpb25h
bF9mb3JtYXRfbGlzdDsKICAgICAgaW50ZXJuYXRpb25hbF9mb3JtYXRfbGlzdCA9IGluZm87
CgogICAgICBpbmZvLT5uYW1lID0gbmFtZTsKICAgICAgaW5mby0+YXNzZW1ibGVyX25hbWUg
PSBhc3NlbWJsZXJfbmFtZTsKICAgIH0KCiAgaW5mby0+Zm9ybWF0X251bSA9IGZvcm1hdF9u
dW07Cn0KCnN0YXRpYyBjaGFyCXRmYWZmW10gPSAidG9vIGZldyBhcmd1bWVudHMgZm9yIGZv
cm1hdCI7CgwKLyogQ2hlY2sgdGhlIGFyZ3VtZW50IGxpc3Qgb2YgYSBjYWxsIHRvIHByaW50
Ziwgc2NhbmYsIGV0Yy4KICAgTkFNRSBpcyB0aGUgZnVuY3Rpb24gaWRlbnRpZmllci4KICAg
QVNTRU1CTEVSX05BTUUgaXMgdGhlIGZ1bmN0aW9uJ3MgYXNzZW1ibGVyIGlkZW50aWZpZXIu
CiAgIChFaXRoZXIgTkFNRSBvciBBU1NFTUJMRVJfTkFNRSwgYnV0IG5vdCBib3RoLCBtYXkg
YmUgTlVMTF9UUkVFLikKICAgUEFSQU1TIGlzIHRoZSBsaXN0IG9mIGFyZ3VtZW50IHZhbHVl
cy4gICovCgp2b2lkCmNoZWNrX2Z1bmN0aW9uX2Zvcm1hdCAobmFtZSwgYXNzZW1ibGVyX25h
bWUsIHBhcmFtcykKICAgICB0cmVlIG5hbWU7CiAgICAgdHJlZSBhc3NlbWJsZXJfbmFtZTsK
ICAgICB0cmVlIHBhcmFtczsKewogIGZ1bmN0aW9uX2Zvcm1hdF9pbmZvICppbmZvOwoKICAv
KiBTZWUgaWYgdGhpcyBmdW5jdGlvbiBpcyBhIGZvcm1hdCBmdW5jdGlvbi4gICovCiAgZm9y
IChpbmZvID0gZnVuY3Rpb25fZm9ybWF0X2xpc3Q7IGluZm87IGluZm8gPSBpbmZvLT5uZXh0
KQogICAgewogICAgICBpZiAoaW5mby0+YXNzZW1ibGVyX25hbWUKCSAgPyAoaW5mby0+YXNz
ZW1ibGVyX25hbWUgPT0gYXNzZW1ibGVyX25hbWUpCgkgIDogKGluZm8tPm5hbWUgPT0gbmFt
ZSkpCgl7CgkgIC8qIFl1cDsgY2hlY2sgaXQuICAqLwoJICBjaGVja19mb3JtYXRfaW5mbyAo
aW5mbywgcGFyYW1zKTsKCSAgYnJlYWs7Cgl9CiAgICB9Cn0KCi8qIENoZWNrIHRoZSBhcmd1
bWVudCBsaXN0IG9mIGEgY2FsbCB0byBwcmludGYsIHNjYW5mLCBldGMuCiAgIElORk8gcG9p
bnRzIHRvIHRoZSBmdW5jdGlvbl9mb3JtYXRfaW5mbyBzdHJ1Y3R1cmUuCiAgIFBBUkFNUyBp
cyB0aGUgbGlzdCBvZiBhcmd1bWVudCB2YWx1ZXMuICAqLwoKc3RhdGljIHZvaWQKY2hlY2tf
Zm9ybWF0X2luZm8gKGluZm8sIHBhcmFtcykKICAgICBmdW5jdGlvbl9mb3JtYXRfaW5mbyAq
aW5mbzsKICAgICB0cmVlIHBhcmFtczsKewogIGludCBpOwogIGludCBhcmdfbnVtOwogIGlu
dCBzdXBwcmVzc2VkLCB3aWRlLCBwcmVjaXNlOwogIGludCBsZW5ndGhfY2hhcjsKICBpbnQg
Zm9ybWF0X2NoYXI7CiAgaW50IGZvcm1hdF9sZW5ndGg7CiAgdHJlZSBmb3JtYXRfdHJlZTsK
ICB0cmVlIGN1cl9wYXJhbTsKICB0cmVlIGN1cl90eXBlOwogIHRyZWUgd2FudGVkX3R5cGU7
CiAgdHJlZSBmaXJzdF9maWxsaW5fcGFyYW07CiAgY2hhciAqZm9ybWF0X2NoYXJzOwogIGZv
cm1hdF9jaGFyX2luZm8gKmZjaTsKICBzdGF0aWMgY2hhciBtZXNzYWdlWzEzMl07CiAgY2hh
ciBmbGFnX2NoYXJzWzhdOwogIGludCBoYXNfb3BlcmFuZF9udW1iZXIgPSAwOwoKICAvKiBT
a2lwIHRvIGZvcm1hdCBhcmd1bWVudC4gIElmIHRoZSBhcmd1bWVudCBpc24ndCBhdmFpbGFi
bGUsIHRoZXJlJ3MKICAgICBubyB3b3JrIGZvciB1cyB0byBkbzsgcHJvdG90eXBlIGNoZWNr
aW5nIHdpbGwgY2F0Y2ggdGhlIHByb2JsZW0uICAqLwogIGZvciAoYXJnX251bSA9IDE7IDsg
KythcmdfbnVtKQogICAgewogICAgICBpZiAocGFyYW1zID09IDApCglyZXR1cm47CiAgICAg
IGlmIChhcmdfbnVtID09IGluZm8tPmZvcm1hdF9udW0pCglicmVhazsKICAgICAgcGFyYW1z
ID0gVFJFRV9DSEFJTiAocGFyYW1zKTsKICAgIH0KICBmb3JtYXRfdHJlZSA9IFRSRUVfVkFM
VUUgKHBhcmFtcyk7CiAgcGFyYW1zID0gVFJFRV9DSEFJTiAocGFyYW1zKTsKICBpZiAoZm9y
bWF0X3RyZWUgPT0gMCkKICAgIHJldHVybjsKCiAgLyogV2UgY2FuIG9ubHkgY2hlY2sgdGhl
IGZvcm1hdCBpZiBpdCdzIGEgc3RyaW5nIGNvbnN0YW50LiAgKi8KICB3aGlsZSAoVFJFRV9D
T0RFIChmb3JtYXRfdHJlZSkgPT0gTk9QX0VYUFIpCiAgICBmb3JtYXRfdHJlZSA9IFRSRUVf
T1BFUkFORCAoZm9ybWF0X3RyZWUsIDApOyAvKiBzdHJpcCBjb2VyY2lvbiAqLwoKICBpZiAo
VFJFRV9DT0RFIChmb3JtYXRfdHJlZSkgPT0gQ0FMTF9FWFBSCiAgICAgICYmIFRSRUVfQ09E
RSAoVFJFRV9PUEVSQU5EIChmb3JtYXRfdHJlZSwgMCkpID09IEFERFJfRVhQUgogICAgICAm
JiAoVFJFRV9DT0RFIChUUkVFX09QRVJBTkQgKFRSRUVfT1BFUkFORCAoZm9ybWF0X3RyZWUs
IDApLCAwKSkKCSAgPT0gRlVOQ1RJT05fREVDTCkpCiAgICB7CiAgICAgIHRyZWUgZnVuY3Rp
b24gPSBUUkVFX09QRVJBTkQgKFRSRUVfT1BFUkFORCAoZm9ybWF0X3RyZWUsIDApLCAwKTsK
CiAgICAgIC8qIFNlZSBpZiB0aGlzIGlzIGEgY2FsbCB0byBhIGtub3duIGludGVybmF0aW9u
YWxpemF0aW9uIGZ1bmN0aW9uCgkgdGhhdCBtb2RpZmllcyB0aGUgZm9ybWF0IGFyZy4gICov
CiAgICAgIGludGVybmF0aW9uYWxfZm9ybWF0X2luZm8gKmluZm87CgogICAgICBmb3IgKGlu
Zm8gPSBpbnRlcm5hdGlvbmFsX2Zvcm1hdF9saXN0OyBpbmZvOyBpbmZvID0gaW5mby0+bmV4
dCkKCWlmIChpbmZvLT5hc3NlbWJsZXJfbmFtZQoJICAgID8gKGluZm8tPmFzc2VtYmxlcl9u
YW1lID09IERFQ0xfQVNTRU1CTEVSX05BTUUgKGZ1bmN0aW9uKSkKCSAgICA6IChpbmZvLT5u
YW1lID09IERFQ0xfTkFNRSAoZnVuY3Rpb24pKSkKCSAgewoJICAgIHRyZWUgaW5uZXJfYXJn
czsKCSAgICBpbnQgaTsKCgkgICAgZm9yIChpbm5lcl9hcmdzID0gVFJFRV9PUEVSQU5EIChm
b3JtYXRfdHJlZSwgMSksIGkgPSAxOwoJCSBpbm5lcl9hcmdzICE9IDA7CgkJIGlubmVyX2Fy
Z3MgPSBUUkVFX0NIQUlOIChpbm5lcl9hcmdzKSwgaSsrKQoJICAgICAgaWYgKGkgPT0gaW5m
by0+Zm9ybWF0X251bSkKCQl7CgkJICBmb3JtYXRfdHJlZSA9IFRSRUVfVkFMVUUgKGlubmVy
X2FyZ3MpOwoKCQkgIHdoaWxlIChUUkVFX0NPREUgKGZvcm1hdF90cmVlKSA9PSBOT1BfRVhQ
UikKCQkgICAgZm9ybWF0X3RyZWUgPSBUUkVFX09QRVJBTkQgKGZvcm1hdF90cmVlLCAwKTsK
CQl9CgkgIH0KICAgIH0KCiAgaWYgKGludGVnZXJfemVyb3AgKGZvcm1hdF90cmVlKSkKICAg
IHsKICAgICAgd2FybmluZyAoIm51bGwgZm9ybWF0IHN0cmluZyIpOwogICAgICByZXR1cm47
CiAgICB9CiAgaWYgKFRSRUVfQ09ERSAoZm9ybWF0X3RyZWUpICE9IEFERFJfRVhQUikKICAg
IHJldHVybjsKICBmb3JtYXRfdHJlZSA9IFRSRUVfT1BFUkFORCAoZm9ybWF0X3RyZWUsIDAp
OwogIGlmIChUUkVFX0NPREUgKGZvcm1hdF90cmVlKSAhPSBTVFJJTkdfQ1NUKQogICAgcmV0
dXJuOwogIGZvcm1hdF9jaGFycyA9IFRSRUVfU1RSSU5HX1BPSU5URVIgKGZvcm1hdF90cmVl
KTsKICBmb3JtYXRfbGVuZ3RoID0gVFJFRV9TVFJJTkdfTEVOR1RIIChmb3JtYXRfdHJlZSk7
CiAgaWYgKGZvcm1hdF9sZW5ndGggPD0gMSkKICAgIHdhcm5pbmcgKCJ6ZXJvLWxlbmd0aCBm
b3JtYXQgc3RyaW5nIik7CiAgaWYgKGZvcm1hdF9jaGFyc1stLWZvcm1hdF9sZW5ndGhdICE9
IDApCiAgICB7CiAgICAgIHdhcm5pbmcgKCJ1bnRlcm1pbmF0ZWQgZm9ybWF0IHN0cmluZyIp
OwogICAgICByZXR1cm47CiAgICB9CiAgLyogU2tpcCB0byBmaXJzdCBhcmd1bWVudCB0byBj
aGVjay4gICovCiAgd2hpbGUgKGFyZ19udW0gKyAxIDwgaW5mby0+Zmlyc3RfYXJnX251bSkK
ICAgIHsKICAgICAgaWYgKHBhcmFtcyA9PSAwKQoJcmV0dXJuOwogICAgICBwYXJhbXMgPSBU
UkVFX0NIQUlOIChwYXJhbXMpOwogICAgICArK2FyZ19udW07CiAgICB9CgogIGZpcnN0X2Zp
bGxpbl9wYXJhbSA9IHBhcmFtczsKICB3aGlsZSAoMSkKICAgIHsKICAgICAgaW50IGFmbGFn
OwogICAgICBpZiAoKmZvcm1hdF9jaGFycyA9PSAwKQoJewoJICBpZiAoZm9ybWF0X2NoYXJz
IC0gVFJFRV9TVFJJTkdfUE9JTlRFUiAoZm9ybWF0X3RyZWUpICE9IGZvcm1hdF9sZW5ndGgp
CgkgICAgd2FybmluZyAoImVtYmVkZGVkIGBcXDAnIGluIGZvcm1hdCIpOwoJICBpZiAoaW5m
by0+Zmlyc3RfYXJnX251bSAhPSAwICYmIHBhcmFtcyAhPSAwICYmICEgaGFzX29wZXJhbmRf
bnVtYmVyKQoJICAgIHdhcm5pbmcgKCJ0b28gbWFueSBhcmd1bWVudHMgZm9yIGZvcm1hdCIp
OwoJICByZXR1cm47Cgl9CiAgICAgIGlmICgqZm9ybWF0X2NoYXJzKysgIT0gJyUnKQoJY29u
dGludWU7CiAgICAgIGlmICgqZm9ybWF0X2NoYXJzID09IDApCgl7CgkgIHdhcm5pbmcgKCJz
cHVyaW91cyB0cmFpbGluZyBgJSUnIGluIGZvcm1hdCIpOwoJICBjb250aW51ZTsKCX0KICAg
ICAgaWYgKCpmb3JtYXRfY2hhcnMgPT0gJyUnKQoJewoJICArK2Zvcm1hdF9jaGFyczsKCSAg
Y29udGludWU7Cgl9CiAgICAgIGZsYWdfY2hhcnNbMF0gPSAwOwogICAgICBzdXBwcmVzc2Vk
ID0gd2lkZSA9IHByZWNpc2UgPSBGQUxTRTsKICAgICAgaWYgKGluZm8tPmlzX3NjYW4pCgl7
CgkgIHN1cHByZXNzZWQgPSAqZm9ybWF0X2NoYXJzID09ICcqJzsKCSAgaWYgKHN1cHByZXNz
ZWQpCgkgICAgKytmb3JtYXRfY2hhcnM7CgkgIHdoaWxlIChpc2RpZ2l0ICgqZm9ybWF0X2No
YXJzKSkKCSAgICArK2Zvcm1hdF9jaGFyczsKCX0KICAgICAgZWxzZQoJewoJICAvKiBTZWUg
aWYgd2UgaGF2ZSBhIG51bWJlciBmb2xsb3dlZCBieSBhIGRvbGxhciBzaWduLiAgSWYgd2Ug
ZG8sCgkgICAgIGl0IGlzIGFuIG9wZXJhbmQgbnVtYmVyLCBzbyBzZXQgUEFSQU1TIHRvIHRo
YXQgb3BlcmFuZC4gICovCgkgIGlmICgqZm9ybWF0X2NoYXJzID49ICcwJyAmJiAqZm9ybWF0
X2NoYXJzIDw9ICc5JykKCSAgICB7CgkgICAgICBjaGFyICpwID0gZm9ybWF0X2NoYXJzOwoK
CSAgICAgIHdoaWxlICgqcCA+PSAnMCcgJiYgKnArKyA8PSAnOScpCgkJOwoKCSAgICAgIGlm
ICgqcCA9PSAnJCcpCgkJewoJCSAgaW50IG9wbnVtID0gYXRvaSAoZm9ybWF0X2NoYXJzKTsK
CgkJICBwYXJhbXMgPSBmaXJzdF9maWxsaW5fcGFyYW07CgkJICBmb3JtYXRfY2hhcnMgPSBw
ICsgMTsKCQkgIGhhc19vcGVyYW5kX251bWJlciA9IDE7CgoJCSAgZm9yIChpID0gMTsgaSA8
IG9wbnVtICYmIHBhcmFtcyAhPSAwOyBpKyspCgkJICAgIHBhcmFtcyA9IFRSRUVfQ0hBSU4g
KHBhcmFtcyk7CgoJCSAgaWYgKG9wbnVtID09IDAgfHwgcGFyYW1zID09IDApCgkJICAgIHsK
CQkgICAgICB3YXJuaW5nICgib3BlcmFuZCBudW1iZXIgb3V0IG9mIHJhbmdlIGluIGZvcm1h
dCIpOwoJCSAgICAgIHJldHVybjsKCQkgICAgfQoJCX0KCSAgICB9CgoJICB3aGlsZSAoKmZv
cm1hdF9jaGFycyAhPSAwICYmIGluZGV4ICgiICsjMC0iLCAqZm9ybWF0X2NoYXJzKSAhPSAw
KQoJICAgIHsKCSAgICAgIGlmIChpbmRleCAoZmxhZ19jaGFycywgKmZvcm1hdF9jaGFycykg
IT0gMCkKCQl7CgkJICBzcHJpbnRmIChtZXNzYWdlLCAicmVwZWF0ZWQgYCVjJyBmbGFnIGlu
IGZvcm1hdCIsCgkJCSAgICpmb3JtYXRfY2hhcnMpOwoJCSAgd2FybmluZyAobWVzc2FnZSk7
CgkJfQoJICAgICAgaSA9IHN0cmxlbiAoZmxhZ19jaGFycyk7CgkgICAgICBmbGFnX2NoYXJz
W2krK10gPSAqZm9ybWF0X2NoYXJzKys7CgkgICAgICBmbGFnX2NoYXJzW2ldID0gMDsKCSAg
ICB9CgkgIC8qICJJZiB0aGUgc3BhY2UgYW5kICsgZmxhZ3MgYm90aCBhcHBlYXIsIAoJICAg
ICB0aGUgc3BhY2UgZmxhZyB3aWxsIGJlIGlnbm9yZWQuIiAgKi8KCSAgaWYgKGluZGV4IChm
bGFnX2NoYXJzLCAnICcpICE9IDAKCSAgICAgICYmIGluZGV4IChmbGFnX2NoYXJzLCAnKycp
ICE9IDApCgkgICAgd2FybmluZyAoInVzZSBvZiBib3RoIGAgJyBhbmQgYCsnIGZsYWdzIGlu
IGZvcm1hdCIpOwoJICAvKiAiSWYgdGhlIDAgYW5kIC0gZmxhZ3MgYm90aCBhcHBlYXIsCgkg
ICAgIHRoZSAwIGZsYWcgd2lsbCBiZSBpZ25vcmVkLiIgICovCgkgIGlmIChpbmRleCAoZmxh
Z19jaGFycywgJzAnKSAhPSAwCgkgICAgICAmJiBpbmRleCAoZmxhZ19jaGFycywgJy0nKSAh
PSAwKQoJICAgIHdhcm5pbmcgKCJ1c2Ugb2YgYm90aCBgMCcgYW5kIGAtJyBmbGFncyBpbiBm
b3JtYXQiKTsKCSAgaWYgKCpmb3JtYXRfY2hhcnMgPT0gJyonKQoJICAgIHsKCSAgICAgIHdp
ZGUgPSBUUlVFOwoJICAgICAgLyogIi4uLmEgZmllbGQgd2lkdGguLi5tYXkgYmUgaW5kaWNh
dGVkIGJ5IGFuIGFzdGVyaXNrLgoJCSBJbiB0aGlzIGNhc2UsIGFuIGludCBhcmd1bWVudCBz
dXBwbGllcyB0aGUgZmllbGQgd2lkdGguLi4iICAqLwoJICAgICAgKytmb3JtYXRfY2hhcnM7
CgkgICAgICBpZiAocGFyYW1zID09IDApCgkJewoJCSAgd2FybmluZyAodGZhZmYpOwoJCSAg
cmV0dXJuOwoJCX0KCSAgICAgIGlmIChpbmZvLT5maXJzdF9hcmdfbnVtICE9IDApCgkJewoJ
CSAgY3VyX3BhcmFtID0gVFJFRV9WQUxVRSAocGFyYW1zKTsKCQkgIHBhcmFtcyA9IFRSRUVf
Q0hBSU4gKHBhcmFtcyk7CgkJICArK2FyZ19udW07CgkJICAvKiBzaXplX3QgaXMgZ2VuZXJh
bGx5IG5vdCB2YWxpZCBoZXJlLgoJCSAgICAgSXQgd2lsbCB3b3JrIG9uIG1vc3QgbWFjaGlu
ZXMsIGJlY2F1c2Ugc2l6ZV90IGFuZCBpbnQKCQkgICAgIGhhdmUgdGhlIHNhbWUgbW9kZS4g
IEJ1dCBtaWdodCBhcyB3ZWxsIHdhcm4gYW55d2F5LAoJCSAgICAgc2luY2UgaXQgd2lsbCBm
YWlsIG9uIG90aGVyIG1hY2hpbmVzLiAgKi8KCQkgIGlmICgoVFlQRV9NQUlOX1ZBUklBTlQg
KFRSRUVfVFlQRSAoY3VyX3BhcmFtKSkKCQkgICAgICAgIT0gaW50ZWdlcl90eXBlX25vZGUp
CgkJICAgICAgJiYKCQkgICAgICAoVFlQRV9NQUlOX1ZBUklBTlQgKFRSRUVfVFlQRSAoY3Vy
X3BhcmFtKSkKCQkgICAgICAgIT0gdW5zaWduZWRfdHlwZV9ub2RlKSkKCQkgICAgewoJCSAg
ICAgIHNwcmludGYgKG1lc3NhZ2UsCgkJCSAgICAgICAiZmllbGQgd2lkdGggaXMgbm90IHR5
cGUgaW50IChhcmcgJWQpIiwKCQkJICAgICAgIGFyZ19udW0pOwoJCSAgICAgIHdhcm5pbmcg
KG1lc3NhZ2UpOwoJCSAgICB9CgkJfQoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgIHdo
aWxlIChpc2RpZ2l0ICgqZm9ybWF0X2NoYXJzKSkKCQl7CgkJICB3aWRlID0gVFJVRTsKCQkg
ICsrZm9ybWF0X2NoYXJzOwoJCX0KCSAgICB9CgkgIGlmICgqZm9ybWF0X2NoYXJzID09ICcu
JykKCSAgICB7CgkgICAgICBwcmVjaXNlID0gVFJVRTsKCSAgICAgICsrZm9ybWF0X2NoYXJz
OwoJICAgICAgaWYgKCpmb3JtYXRfY2hhcnMgIT0gJyonICYmICFpc2RpZ2l0ICgqZm9ybWF0
X2NoYXJzKSkKCQl3YXJuaW5nICgiYC4nIG5vdCBmb2xsb3dlZCBieSBgKicgb3IgZGlnaXQg
aW4gZm9ybWF0Iik7CgkgICAgICAvKiAiLi4uYS4uLnByZWNpc2lvbi4uLm1heSBiZSBpbmRp
Y2F0ZWQgYnkgYW4gYXN0ZXJpc2suCgkJIEluIHRoaXMgY2FzZSwgYW4gaW50IGFyZ3VtZW50
IHN1cHBsaWVzIHRoZS4uLnByZWNpc2lvbi4iICAqLwoJICAgICAgaWYgKCpmb3JtYXRfY2hh
cnMgPT0gJyonKQoJCXsKCQkgIGlmIChpbmZvLT5maXJzdF9hcmdfbnVtICE9IDApCgkJICAg
IHsKCQkgICAgICArK2Zvcm1hdF9jaGFyczsKCQkgICAgICBpZiAocGFyYW1zID09IDApCgkJ
ICAgICAgICB7CgkJCSAgd2FybmluZyAodGZhZmYpOwoJCQkgIHJldHVybjsKCQkJfQoJCSAg
ICAgIGN1cl9wYXJhbSA9IFRSRUVfVkFMVUUgKHBhcmFtcyk7CgkJICAgICAgcGFyYW1zID0g
VFJFRV9DSEFJTiAocGFyYW1zKTsKCQkgICAgICArK2FyZ19udW07CgkJICAgICAgaWYgKFRZ
UEVfTUFJTl9WQVJJQU5UIChUUkVFX1RZUEUgKGN1cl9wYXJhbSkpCgkJCSAgIT0gaW50ZWdl
cl90eXBlX25vZGUpCgkJICAgICAgICB7CgkJICAgICAgICAgIHNwcmludGYgKG1lc3NhZ2Us
CgkJCQkgICAiZmllbGQgd2lkdGggaXMgbm90IHR5cGUgaW50IChhcmcgJWQpIiwKCQkJCSAg
IGFyZ19udW0pOwoJCSAgICAgICAgICB3YXJuaW5nIChtZXNzYWdlKTsKCQkgICAgICAgIH0K
CQkgICAgfQoJCX0KCSAgICAgIGVsc2UKCQl7CgkJICB3aGlsZSAoaXNkaWdpdCAoKmZvcm1h
dF9jaGFycykpCgkJICAgICsrZm9ybWF0X2NoYXJzOwoJCX0KCSAgICB9Cgl9CiAgICAgIGlm
ICgqZm9ybWF0X2NoYXJzID09ICdoJyB8fCAqZm9ybWF0X2NoYXJzID09ICdsJykKCWxlbmd0
aF9jaGFyID0gKmZvcm1hdF9jaGFycysrOwogICAgICBlbHNlIGlmICgqZm9ybWF0X2NoYXJz
ID09ICdxJyB8fCAqZm9ybWF0X2NoYXJzID09ICdMJykKCXsKCSAgbGVuZ3RoX2NoYXIgPSAq
Zm9ybWF0X2NoYXJzKys7CgkgIGlmIChwZWRhbnRpYykKCSAgICBwZWR3YXJuICgiQU5TSSBD
IGRvZXMgbm90IHN1cHBvcnQgdGhlIGAlYycgbGVuZ3RoIG1vZGlmaWVyIiwKCQkgICAgIGxl
bmd0aF9jaGFyKTsKCX0KICAgICAgZWxzZQoJbGVuZ3RoX2NoYXIgPSAwOwogICAgICBpZiAo
bGVuZ3RoX2NoYXIgPT0gJ2wnICYmICpmb3JtYXRfY2hhcnMgPT0gJ2wnKQoJewoJICBsZW5n
dGhfY2hhciA9ICdxJywgZm9ybWF0X2NoYXJzKys7CgkgIGlmIChwZWRhbnRpYykKCSAgICBw
ZWR3YXJuICgiQU5TSSBDIGRvZXMgbm90IHN1cHBvcnQgdGhlIGBsbCcgbGVuZ3RoIG1vZGlm
aWVyIik7Cgl9CiAgICAgIGFmbGFnID0gMDsKICAgICAgaWYgKCpmb3JtYXRfY2hhcnMgPT0g
J2EnKQoJewoJICBhZmxhZyA9IDE7CgkgIGZvcm1hdF9jaGFycysrOwoJfQogICAgICBpZiAo
c3VwcHJlc3NlZCAmJiBsZW5ndGhfY2hhciAhPSAwKQoJewoJICBzcHJpbnRmIChtZXNzYWdl
LAoJCSAgICJ1c2Ugb2YgYConIGFuZCBgJWMnIHRvZ2V0aGVyIGluIGZvcm1hdCIsCgkJICAg
bGVuZ3RoX2NoYXIpOwoJICB3YXJuaW5nIChtZXNzYWdlKTsKCX0KICAgICAgZm9ybWF0X2No
YXIgPSAqZm9ybWF0X2NoYXJzOwogICAgICBpZiAoZm9ybWF0X2NoYXIgPT0gMCB8fCBmb3Jt
YXRfY2hhciA9PSAnJScpCgl7CgkgIHdhcm5pbmcgKCJjb252ZXJzaW9uIGxhY2tzIHR5cGUg
YXQgZW5kIG9mIGZvcm1hdCIpOwoJICBjb250aW51ZTsKCX0KICAgICAgZm9ybWF0X2NoYXJz
Kys7CiAgICAgIGZjaSA9IGluZm8tPmlzX3NjYW4gPyBzY2FuX2NoYXJfdGFibGUgOiBwcmlu
dF9jaGFyX3RhYmxlOwogICAgICB3aGlsZSAoZmNpLT5mb3JtYXRfY2hhcnMgIT0gMAoJICAg
ICAmJiBpbmRleCAoZmNpLT5mb3JtYXRfY2hhcnMsIGZvcm1hdF9jaGFyKSA9PSAwKQoJICAr
K2ZjaTsKICAgICAgaWYgKGZjaS0+Zm9ybWF0X2NoYXJzID09IDApCgl7CgkgIGlmIChmb3Jt
YXRfY2hhciA+PSAwNDAgJiYgZm9ybWF0X2NoYXIgPCAwMTc3KQoJICAgIHNwcmludGYgKG1l
c3NhZ2UsCgkJICAgICAidW5rbm93biBjb252ZXJzaW9uIHR5cGUgY2hhcmFjdGVyIGAlYycg
aW4gZm9ybWF0IiwKCQkgICAgIGZvcm1hdF9jaGFyKTsKCSAgZWxzZQoJICAgIHNwcmludGYg
KG1lc3NhZ2UsCgkJICAgICAidW5rbm93biBjb252ZXJzaW9uIHR5cGUgY2hhcmFjdGVyIDB4
JXggaW4gZm9ybWF0IiwKCQkgICAgIGZvcm1hdF9jaGFyKTsKCSAgd2FybmluZyAobWVzc2Fn
ZSk7CgkgIGNvbnRpbnVlOwoJfQogICAgICBpZiAod2lkZSAmJiBpbmRleCAoZmNpLT5mbGFn
X2NoYXJzLCAndycpID09IDApCgl7CgkgIHNwcmludGYgKG1lc3NhZ2UsICJ3aWR0aCB1c2Vk
IHdpdGggYCVjJyBmb3JtYXQiLAoJCSAgIGZvcm1hdF9jaGFyKTsKCSAgd2FybmluZyAobWVz
c2FnZSk7Cgl9CiAgICAgIGlmIChwcmVjaXNlICYmIGluZGV4IChmY2ktPmZsYWdfY2hhcnMs
ICdwJykgPT0gMCkKCXsKCSAgc3ByaW50ZiAobWVzc2FnZSwgInByZWNpc2lvbiB1c2VkIHdp
dGggYCVjJyBmb3JtYXQiLAoJCSAgIGZvcm1hdF9jaGFyKTsKCSAgd2FybmluZyAobWVzc2Fn
ZSk7Cgl9CiAgICAgIGlmIChhZmxhZyAmJiBpbmRleCAoZmNpLT5mbGFnX2NoYXJzLCAnYScp
ID09IDApCgl7CgkgIHNwcmludGYgKG1lc3NhZ2UsICJgYScgZmxhZyB1c2VkIHdpdGggYCVj
JyBmb3JtYXQiLAoJCSAgIGZvcm1hdF9jaGFyKTsKCSAgd2FybmluZyAobWVzc2FnZSk7Cgkg
IC8qIFRvIHNpbXBsaWZ5IHRoZSBmb2xsb3dpbmcgY29kZS4gICovCgkgIGFmbGFnID0gMDsK
CX0KICAgICAgaWYgKGluZm8tPmlzX3NjYW4gJiYgZm9ybWF0X2NoYXIgPT0gJ1snKQoJewoJ
ICAvKiBTa2lwIG92ZXIgc2NhbiBzZXQsIGluIGNhc2UgaXQgaGFwcGVucyB0byBoYXZlICcl
JyBpbiBpdC4gICovCgkgIGlmICgqZm9ybWF0X2NoYXJzID09ICdeJykKCSAgICArK2Zvcm1h
dF9jaGFyczsKCSAgLyogRmluZCBjbG9zaW5nIGJyYWNrZXQ7IGlmIG9uZSBpcyBoaXQgaW1t
ZWRpYXRlbHksIHRoZW4KCSAgICAgaXQncyBwYXJ0IG9mIHRoZSBzY2FuIHNldCByYXRoZXIg
dGhhbiBhIHRlcm1pbmF0b3IuICAqLwoJICBpZiAoKmZvcm1hdF9jaGFycyA9PSAnXScpCgkg
ICAgKytmb3JtYXRfY2hhcnM7CgkgIHdoaWxlICgqZm9ybWF0X2NoYXJzICYmICpmb3JtYXRf
Y2hhcnMgIT0gJ10nKQoJICAgICsrZm9ybWF0X2NoYXJzOwoJICBpZiAoKmZvcm1hdF9jaGFy
cyAhPSAnXScpCgkgICAgICAvKiBUaGUgZW5kIG9mIHRoZSBmb3JtYXQgc3RyaW5nIHdhcyBy
ZWFjaGVkLiAgKi8KCSAgICAgIHdhcm5pbmcgKCJubyBjbG9zaW5nIGBdJyBmb3IgYCUlWycg
Zm9ybWF0Iik7Cgl9CiAgICAgIGlmIChzdXBwcmVzc2VkKQoJewoJICBpZiAoaW5kZXggKGZj
aS0+ZmxhZ19jaGFycywgJyonKSA9PSAwKQoJICAgIHsKCSAgICAgIHNwcmludGYgKG1lc3Nh
Z2UsCgkJICAgICAgICJzdXBwcmVzc2lvbiBvZiBgJWMnIGNvbnZlcnNpb24gaW4gZm9ybWF0
IiwKCQkgICAgICAgZm9ybWF0X2NoYXIpOwoJICAgICAgd2FybmluZyAobWVzc2FnZSk7Cgkg
ICAgfQoJICBjb250aW51ZTsKCX0KICAgICAgZm9yIChpID0gMDsgZmxhZ19jaGFyc1tpXSAh
PSAwOyArK2kpCgl7CgkgIGlmIChpbmRleCAoZmNpLT5mbGFnX2NoYXJzLCBmbGFnX2NoYXJz
W2ldKSA9PSAwKQoJICAgIHsKCSAgICAgIHNwcmludGYgKG1lc3NhZ2UsICJmbGFnIGAlYycg
dXNlZCB3aXRoIHR5cGUgYCVjJyIsCgkJICAgICAgIGZsYWdfY2hhcnNbaV0sIGZvcm1hdF9j
aGFyKTsKCSAgICAgIHdhcm5pbmcgKG1lc3NhZ2UpOwoJICAgIH0KCX0KICAgICAgaWYgKHBy
ZWNpc2UgJiYgaW5kZXggKGZsYWdfY2hhcnMsICcwJykgIT0gMAoJICAmJiAoZm9ybWF0X2No
YXIgPT0gJ2QnIHx8IGZvcm1hdF9jaGFyID09ICdpJwoJICAgICAgfHwgZm9ybWF0X2NoYXIg
PT0gJ28nIHx8IGZvcm1hdF9jaGFyID09ICd1JwoJICAgICAgfHwgZm9ybWF0X2NoYXIgPT0g
J3gnIHx8IGZvcm1hdF9jaGFyID09ICd4JykpCgl7CgkgIHNwcmludGYgKG1lc3NhZ2UsCgkJ
ICAgImAwJyBmbGFnIGlnbm9yZWQgd2l0aCBwcmVjaXNpb24gc3BlY2lmaWVyIGFuZCBgJWMn
IGZvcm1hdCIsCgkJICAgZm9ybWF0X2NoYXIpOwoJICB3YXJuaW5nIChtZXNzYWdlKTsKCX0K
ICAgICAgc3dpdGNoIChsZW5ndGhfY2hhcikKCXsKCWRlZmF1bHQ6IHdhbnRlZF90eXBlID0g
ZmNpLT5ub2xlbiA/ICooZmNpLT5ub2xlbikgOiAwOyBicmVhazsKCWNhc2UgJ2gnOiB3YW50
ZWRfdHlwZSA9IGZjaS0+aGxlbiA/ICooZmNpLT5obGVuKSA6IDA7IGJyZWFrOwoJY2FzZSAn
bCc6IHdhbnRlZF90eXBlID0gZmNpLT5sbGVuID8gKihmY2ktPmxsZW4pIDogMDsgYnJlYWs7
CgljYXNlICdxJzogd2FudGVkX3R5cGUgPSBmY2ktPnFsZW4gPyAqKGZjaS0+cWxlbikgOiAw
OyBicmVhazsKCWNhc2UgJ0wnOiB3YW50ZWRfdHlwZSA9IGZjaS0+YmlnbGxlbiA/ICooZmNp
LT5iaWdsbGVuKSA6IDA7IGJyZWFrOwoJfQogICAgICBpZiAod2FudGVkX3R5cGUgPT0gMCkK
CXsKCSAgc3ByaW50ZiAobWVzc2FnZSwKCQkgICAidXNlIG9mIGAlYycgbGVuZ3RoIGNoYXJh
Y3RlciB3aXRoIGAlYycgdHlwZSBjaGFyYWN0ZXIiLAoJCSAgIGxlbmd0aF9jaGFyLCBmb3Jt
YXRfY2hhcik7CgkgIHdhcm5pbmcgKG1lc3NhZ2UpOwoJfQoKICAgICAgLyoKICAgICAgICoq
IFhYWCAtLSBzaG91bGQga3ZldGNoIGFib3V0IHN0dWZmIHN1Y2ggYXMKICAgICAgICoqCXsK
ICAgICAgICoqCQljb25zdCBpbnQJaTsKICAgICAgICoqCiAgICAgICAqKgkJc2NhbmYgKCIl
ZCIsICZpKTsKICAgICAgICoqCX0KICAgICAgICovCgogICAgICAvKiBGaW5hbGx5LiAuIC5j
aGVjayB0eXBlIG9mIGFyZ3VtZW50IGFnYWluc3QgZGVzaXJlZCB0eXBlISAgKi8KICAgICAg
aWYgKGluZm8tPmZpcnN0X2FyZ19udW0gPT0gMCkKCWNvbnRpbnVlOwogICAgICBpZiAoZmNp
LT5wb2ludGVyX2NvdW50ID09IDAgJiYgd2FudGVkX3R5cGUgPT0gdm9pZF90eXBlX25vZGUp
CgkvKiBUaGlzIHNwZWNpZmllciB0YWtlcyBubyBhcmd1bWVudC4gICovCgljb250aW51ZTsK
ICAgICAgaWYgKHBhcmFtcyA9PSAwKQoJewoJICB3YXJuaW5nICh0ZmFmZik7CgkgIHJldHVy
bjsKCX0KICAgICAgY3VyX3BhcmFtID0gVFJFRV9WQUxVRSAocGFyYW1zKTsKICAgICAgcGFy
YW1zID0gVFJFRV9DSEFJTiAocGFyYW1zKTsKICAgICAgKythcmdfbnVtOwogICAgICBjdXJf
dHlwZSA9IFRSRUVfVFlQRSAoY3VyX3BhcmFtKTsKCiAgICAgIC8qIENoZWNrIHRoZSB0eXBl
cyBvZiBhbnkgYWRkaXRpb25hbCBwb2ludGVyIGFyZ3VtZW50cwoJIHRoYXQgcHJlY2VkZSB0
aGUgInJlYWwiIGFyZ3VtZW50LiAgKi8KICAgICAgZm9yIChpID0gMDsgaSA8IGZjaS0+cG9p
bnRlcl9jb3VudCArIGFmbGFnOyArK2kpCgl7CgkgIGlmIChUUkVFX0NPREUgKGN1cl90eXBl
KSA9PSBQT0lOVEVSX1RZUEUpCgkgICAgewoJICAgICAgY3VyX3R5cGUgPSBUUkVFX1RZUEUg
KGN1cl90eXBlKTsKCSAgICAgIGNvbnRpbnVlOwoJICAgIH0KCSAgaWYgKFRSRUVfQ09ERSAo
Y3VyX3R5cGUpICE9IEVSUk9SX01BUkspCgkgICAgewoJICAgICAgc3ByaW50ZiAobWVzc2Fn
ZSwKCQkgICAgICAgImZvcm1hdCBhcmd1bWVudCBpcyBub3QgYSAlcyAoYXJnICVkKSIsCgkJ
ICAgICAgICgoZmNpLT5wb2ludGVyX2NvdW50ICsgYWZsYWcgPT0gMSkKCQkJPyAicG9pbnRl
ciIgOiAicG9pbnRlciB0byBhIHBvaW50ZXIiKSwKCQkgICAgICAgYXJnX251bSk7CgkgICAg
ICB3YXJuaW5nIChtZXNzYWdlKTsKCSAgICB9CgkgIGJyZWFrOwoJfQoKICAgICAgLyogQ2hl
Y2sgdGhlIHR5cGUgb2YgdGhlICJyZWFsIiBhcmd1bWVudCwgaWYgdGhlcmUncyBhIHR5cGUg
d2Ugd2FudC4gICovCiAgICAgIGlmIChpID09IGZjaS0+cG9pbnRlcl9jb3VudCArIGFmbGFn
ICYmIHdhbnRlZF90eXBlICE9IDAKCSAgJiYgVFJFRV9DT0RFIChjdXJfdHlwZSkgIT0gRVJS
T1JfTUFSSwoJICAmJiB3YW50ZWRfdHlwZSAhPSBUWVBFX01BSU5fVkFSSUFOVCAoY3VyX3R5
cGUpCgkgIC8qIElmIHdlIHdhbnQgYHZvaWQgKicsIGFsbG93IGFueSBwb2ludGVyIHR5cGUu
CgkgICAgIChBbnl0aGluZyBlbHNlIHdvdWxkIGFscmVhZHkgaGF2ZSBnb3QgYSB3YXJuaW5n
LikgICovCgkgICYmICEgKHdhbnRlZF90eXBlID09IHZvaWRfdHlwZV9ub2RlCgkJJiYgZmNp
LT5wb2ludGVyX2NvdW50ID4gMCkKCSAgLyogRG9uJ3Qgd2FybiBhYm91dCBkaWZmZXJlbmNl
cyBtZXJlbHkgaW4gc2lnbmVkbmVzcy4gICovCgkgICYmICEoVFJFRV9DT0RFICh3YW50ZWRf
dHlwZSkgPT0gSU5URUdFUl9UWVBFCgkgICAgICAgJiYgVFJFRV9DT0RFIChUWVBFX01BSU5f
VkFSSUFOVCAoY3VyX3R5cGUpKSA9PSBJTlRFR0VSX1RZUEUKCSAgICAgICAmJiAoVFJFRV9V
TlNJR05FRCAod2FudGVkX3R5cGUpCgkJICAgPyB3YW50ZWRfdHlwZSA9PSAoY3VyX3R5cGUg
PSB1bnNpZ25lZF90eXBlIChjdXJfdHlwZSkpCgkJICAgOiB3YW50ZWRfdHlwZSA9PSAoY3Vy
X3R5cGUgPSBzaWduZWRfdHlwZSAoY3VyX3R5cGUpKSkpCgkgIC8qIExpa2V3aXNlLCAic2ln
bmVkIGNoYXIiLCAidW5zaWduZWQgY2hhciIgYW5kICJjaGFyIiBhcmUKCSAgICAgZXF1aXZh
bGVudCBidXQgdGhlIGFib3ZlIHRlc3Qgd29uJ3QgY29uc2lkZXIgdGhlbSBlcXVpdmFsZW50
LiAgKi8KCSAgJiYgISAod2FudGVkX3R5cGUgPT0gY2hhcl90eXBlX25vZGUKCQkmJiAoVFlQ
RV9NQUlOX1ZBUklBTlQgKGN1cl90eXBlKSA9PSBzaWduZWRfY2hhcl90eXBlX25vZGUKCQkg
ICAgfHwgVFlQRV9NQUlOX1ZBUklBTlQgKGN1cl90eXBlKSA9PSB1bnNpZ25lZF9jaGFyX3R5
cGVfbm9kZSkpKQoJewoJICByZWdpc3RlciBjaGFyICp0aGlzOwoJICByZWdpc3RlciBjaGFy
ICp0aGF0OwogIAoJICB0aGlzID0gSURFTlRJRklFUl9QT0lOVEVSIChERUNMX05BTUUgKFRZ
UEVfTkFNRSAod2FudGVkX3R5cGUpKSk7CgkgIHRoYXQgPSAwOwoJICBpZiAoVFJFRV9DT0RF
IChjdXJfdHlwZSkgIT0gRVJST1JfTUFSSwoJICAgICAgJiYgVFlQRV9OQU1FIChjdXJfdHlw
ZSkgIT0gMAoJICAgICAgJiYgVFJFRV9DT0RFIChjdXJfdHlwZSkgIT0gSU5URUdFUl9UWVBF
CgkgICAgICAmJiAhKFRSRUVfQ09ERSAoY3VyX3R5cGUpID09IFBPSU5URVJfVFlQRQoJCSAg
ICYmIFRSRUVfQ09ERSAoVFJFRV9UWVBFIChjdXJfdHlwZSkpID09IElOVEVHRVJfVFlQRSkp
CgkgICAgewoJICAgICAgaWYgKFRSRUVfQ09ERSAoVFlQRV9OQU1FIChjdXJfdHlwZSkpID09
IFRZUEVfREVDTAoJCSAgJiYgREVDTF9OQU1FIChUWVBFX05BTUUgKGN1cl90eXBlKSkgIT0g
MCkKCQl0aGF0ID0gSURFTlRJRklFUl9QT0lOVEVSIChERUNMX05BTUUgKFRZUEVfTkFNRSAo
Y3VyX3R5cGUpKSk7CgkgICAgICBlbHNlCgkJdGhhdCA9IElERU5USUZJRVJfUE9JTlRFUiAo
VFlQRV9OQU1FIChjdXJfdHlwZSkpOwoJICAgIH0KCgkgIC8qIEEgbmFtZWxlc3MgdHlwZSBj
YW4ndCBwb3NzaWJseSBtYXRjaCB3aGF0IHRoZSBmb3JtYXQgd2FudHMuCgkgICAgIFNvIHRo
ZXJlIHdpbGwgYmUgYSB3YXJuaW5nIGZvciBpdC4KCSAgICAgTWFrZSB1cCBhIHN0cmluZyB0
byBkZXNjcmliZSB2YWd1ZWx5IHdoYXQgaXQgaXMuICAqLwoJICBpZiAodGhhdCA9PSAwKQoJ
ICAgIHsKCSAgICAgIGlmIChUUkVFX0NPREUgKGN1cl90eXBlKSA9PSBQT0lOVEVSX1RZUEUp
CgkJdGhhdCA9ICJwb2ludGVyIjsKCSAgICAgIGVsc2UKCQl0aGF0ID0gImRpZmZlcmVudCB0
eXBlIjsKCSAgICB9CgoJICAvKiBNYWtlIHRoZSB3YXJuaW5nIGJldHRlciBpbiBjYXNlIG9m
IG1pc21hdGNoIG9mIGludCB2cyBsb25nLiAgKi8KCSAgaWYgKFRSRUVfQ09ERSAoY3VyX3R5
cGUpID09IElOVEVHRVJfVFlQRQoJICAgICAgJiYgVFJFRV9DT0RFICh3YW50ZWRfdHlwZSkg
PT0gSU5URUdFUl9UWVBFCgkgICAgICAmJiBUWVBFX1BSRUNJU0lPTiAoY3VyX3R5cGUpID09
IFRZUEVfUFJFQ0lTSU9OICh3YW50ZWRfdHlwZSkKCSAgICAgICYmIFRZUEVfTkFNRSAoY3Vy
X3R5cGUpICE9IDAKCSAgICAgICYmIFRSRUVfQ09ERSAoVFlQRV9OQU1FIChjdXJfdHlwZSkp
ID09IFRZUEVfREVDTCkKCSAgICB0aGF0ID0gSURFTlRJRklFUl9QT0lOVEVSIChERUNMX05B
TUUgKFRZUEVfTkFNRSAoY3VyX3R5cGUpKSk7CgoJICBpZiAoc3RyY21wICh0aGlzLCB0aGF0
KSAhPSAwKQoJICAgIHsKCSAgICAgIHNwcmludGYgKG1lc3NhZ2UsICIlcyBmb3JtYXQsICVz
IGFyZyAoYXJnICVkKSIsCgkJCXRoaXMsIHRoYXQsIGFyZ19udW0pOwoJICAgICAgd2Fybmlu
ZyAobWVzc2FnZSk7CgkgICAgfQoJfQogICAgfQp9CgwKLyogUHJpbnQgYSB3YXJuaW5nIGlm
IGEgY29uc3RhbnQgZXhwcmVzc2lvbiBoYWQgb3ZlcmZsb3cgaW4gZm9sZGluZy4KICAgSW52
b2tlIHRoaXMgZnVuY3Rpb24gb24gZXZlcnkgZXhwcmVzc2lvbiB0aGF0IHRoZSBsYW5ndWFn
ZQogICByZXF1aXJlcyB0byBiZSBhIGNvbnN0YW50IGV4cHJlc3Npb24uCiAgIE5vdGUgdGhl
IEFOU0kgQyBzdGFuZGFyZCBzYXlzIGl0IGlzIGVycm9uZW91cyBmb3IgYQogICBjb25zdGFu
dCBleHByZXNzaW9uIHRvIG92ZXJmbG93LiAgKi8KCnZvaWQKY29uc3RhbnRfZXhwcmVzc2lv
bl93YXJuaW5nICh2YWx1ZSkKICAgICB0cmVlIHZhbHVlOwp7CiAgaWYgKChUUkVFX0NPREUg
KHZhbHVlKSA9PSBJTlRFR0VSX0NTVCB8fCBUUkVFX0NPREUgKHZhbHVlKSA9PSBSRUFMX0NT
VAogICAgICAgfHwgVFJFRV9DT0RFICh2YWx1ZSkgPT0gQ09NUExFWF9DU1QpCiAgICAgICYm
IFRSRUVfQ09OU1RBTlRfT1ZFUkZMT1cgKHZhbHVlKSAmJiBwZWRhbnRpYykKICAgIHBlZHdh
cm4gKCJvdmVyZmxvdyBpbiBjb25zdGFudCBleHByZXNzaW9uIik7Cn0KCi8qIFByaW50IGEg
d2FybmluZyBpZiBhbiBleHByZXNzaW9uIGhhZCBvdmVyZmxvdyBpbiBmb2xkaW5nLgogICBJ
bnZva2UgdGhpcyBmdW5jdGlvbiBvbiBldmVyeSBleHByZXNzaW9uIHRoYXQKICAgKDEpIGFw
cGVhcnMgaW4gdGhlIHNvdXJjZSBjb2RlLCBhbmQKICAgKDIpIG1pZ2h0IGJlIGEgY29uc3Rh
bnQgZXhwcmVzc2lvbiB0aGF0IG92ZXJmbG93ZWQsIGFuZAogICAoMykgaXMgbm90IGFscmVh
ZHkgY2hlY2tlZCBieSBjb252ZXJ0X2FuZF9jaGVjazsKICAgaG93ZXZlciwgZG8gbm90IGlu
dm9rZSB0aGlzIGZ1bmN0aW9uIG9uIG9wZXJhbmRzIG9mIGV4cGxpY2l0IGNhc3RzLiAgKi8K
CnZvaWQKb3ZlcmZsb3dfd2FybmluZyAodmFsdWUpCiAgICAgdHJlZSB2YWx1ZTsKewogIGlm
ICgoVFJFRV9DT0RFICh2YWx1ZSkgPT0gSU5URUdFUl9DU1QKICAgICAgIHx8IChUUkVFX0NP
REUgKHZhbHVlKSA9PSBDT01QTEVYX0NTVAoJICAgJiYgVFJFRV9DT0RFIChUUkVFX1JFQUxQ
QVJUICh2YWx1ZSkpID09IElOVEVHRVJfQ1NUKSkKICAgICAgJiYgVFJFRV9PVkVSRkxPVyAo
dmFsdWUpKQogICAgewogICAgICBUUkVFX09WRVJGTE9XICh2YWx1ZSkgPSAwOwogICAgICBp
ZiAoc2tpcF9ldmFsdWF0aW9uID09IDApCgl3YXJuaW5nICgiaW50ZWdlciBvdmVyZmxvdyBp
biBleHByZXNzaW9uIik7CiAgICB9CiAgZWxzZSBpZiAoKFRSRUVfQ09ERSAodmFsdWUpID09
IFJFQUxfQ1NUCgkgICAgfHwgKFRSRUVfQ09ERSAodmFsdWUpID09IENPTVBMRVhfQ1NUCgkJ
JiYgVFJFRV9DT0RFIChUUkVFX1JFQUxQQVJUICh2YWx1ZSkpID09IFJFQUxfQ1NUKSkKCSAg
ICYmIFRSRUVfT1ZFUkZMT1cgKHZhbHVlKSkKICAgIHsKICAgICAgVFJFRV9PVkVSRkxPVyAo
dmFsdWUpID0gMDsKICAgICAgaWYgKHNraXBfZXZhbHVhdGlvbiA9PSAwKQoJd2FybmluZyAo
ImZsb2F0aW5nIHBvaW50IG92ZXJmbG93IGluIGV4cHJlc3Npb24iKTsKICAgIH0KfQoKLyog
UHJpbnQgYSB3YXJuaW5nIGlmIGEgbGFyZ2UgY29uc3RhbnQgaXMgdHJ1bmNhdGVkIHRvIHVu
c2lnbmVkLAogICBvciBpZiAtV2NvbnZlcnNpb24gaXMgdXNlZCBhbmQgYSBjb25zdGFudCA8
IDAgaXMgY29udmVydGVkIHRvIHVuc2lnbmVkLgogICBJbnZva2UgdGhpcyBmdW5jdGlvbiBv
biBldmVyeSBleHByZXNzaW9uIHRoYXQgbWlnaHQgYmUgaW1wbGljaXRseQogICBjb252ZXJ0
ZWQgdG8gYW4gdW5zaWduZWQgdHlwZS4gICovCgp2b2lkCnVuc2lnbmVkX2NvbnZlcnNpb25f
d2FybmluZyAocmVzdWx0LCBvcGVyYW5kKQogICAgIHRyZWUgcmVzdWx0LCBvcGVyYW5kOwp7
CiAgaWYgKFRSRUVfQ09ERSAob3BlcmFuZCkgPT0gSU5URUdFUl9DU1QKICAgICAgJiYgVFJF
RV9DT0RFIChUUkVFX1RZUEUgKHJlc3VsdCkpID09IElOVEVHRVJfVFlQRQogICAgICAmJiBU
UkVFX1VOU0lHTkVEIChUUkVFX1RZUEUgKHJlc3VsdCkpCiAgICAgICYmIHNraXBfZXZhbHVh
dGlvbiA9PSAwCiAgICAgICYmICFpbnRfZml0c190eXBlX3AgKG9wZXJhbmQsIFRSRUVfVFlQ
RSAocmVzdWx0KSkpCiAgICB7CiAgICAgIGlmICghaW50X2ZpdHNfdHlwZV9wIChvcGVyYW5k
LCBzaWduZWRfdHlwZSAoVFJFRV9UWVBFIChyZXN1bHQpKSkpCgkvKiBUaGlzIGRldGVjdHMg
Y2FzZXMgbGlrZSBjb252ZXJ0aW5nIC0xMjkgb3IgMjU2IHRvIHVuc2lnbmVkIGNoYXIuICAq
LwoJd2FybmluZyAoImxhcmdlIGludGVnZXIgaW1wbGljaXRseSB0cnVuY2F0ZWQgdG8gdW5z
aWduZWQgdHlwZSIpOwogICAgICBlbHNlIGlmICh3YXJuX2NvbnZlcnNpb24pCgl3YXJuaW5n
ICgibmVnYXRpdmUgaW50ZWdlciBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byB1bnNpZ25lZCB0
eXBlIik7CiAgICB9Cn0KCi8qIENvbnZlcnQgRVhQUiB0byBUWVBFLCB3YXJuaW5nIGFib3V0
IGNvbnZlcnNpb24gcHJvYmxlbXMgd2l0aCBjb25zdGFudHMuCiAgIEludm9rZSB0aGlzIGZ1
bmN0aW9uIG9uIGV2ZXJ5IGV4cHJlc3Npb24gdGhhdCBpcyBjb252ZXJ0ZWQgaW1wbGljaXRs
eSwKICAgaS5lLiBiZWNhdXNlIG9mIGxhbmd1YWdlIHJ1bGVzIGFuZCBub3QgYmVjYXVzZSBv
ZiBhbiBleHBsaWNpdCBjYXN0LiAgKi8KCnRyZWUKY29udmVydF9hbmRfY2hlY2sgKHR5cGUs
IGV4cHIpCiAgICAgdHJlZSB0eXBlLCBleHByOwp7CiAgdHJlZSB0ID0gY29udmVydCAodHlw
ZSwgZXhwcik7CiAgaWYgKFRSRUVfQ09ERSAodCkgPT0gSU5URUdFUl9DU1QpCiAgICB7CiAg
ICAgIGlmIChUUkVFX09WRVJGTE9XICh0KSkKCXsKCSAgVFJFRV9PVkVSRkxPVyAodCkgPSAw
OwoKCSAgLyogRG8gbm90IGRpYWdub3NlIG92ZXJmbG93IGluIGEgY29uc3RhbnQgZXhwcmVz
c2lvbiBtZXJlbHkKCSAgICAgYmVjYXVzZSBhIGNvbnZlcnNpb24gb3ZlcmZsb3dlZC4gICov
CgkgIFRSRUVfQ09OU1RBTlRfT1ZFUkZMT1cgKHQpID0gVFJFRV9DT05TVEFOVF9PVkVSRkxP
VyAoZXhwcik7CgoJICAvKiBObyB3YXJuaW5nIGZvciBjb252ZXJ0aW5nIDB4ODAwMDAwMDAg
dG8gaW50LiAgKi8KCSAgaWYgKCEoVFJFRV9VTlNJR05FRCAodHlwZSkgPCBUUkVFX1VOU0lH
TkVEIChUUkVFX1RZUEUgKGV4cHIpKQoJCSYmIFRSRUVfQ09ERSAoVFJFRV9UWVBFIChleHBy
KSkgPT0gSU5URUdFUl9UWVBFCgkJJiYgVFlQRV9QUkVDSVNJT04gKHR5cGUpID09IFRZUEVf
UFJFQ0lTSU9OIChUUkVFX1RZUEUgKGV4cHIpKSkpCgkgICAgLyogSWYgRVhQUiBmaXRzIGlu
IHRoZSB1bnNpZ25lZCB2ZXJzaW9uIG9mIFRZUEUsCgkgICAgICAgZG9uJ3Qgd2FybiB1bmxl
c3MgcGVkYW50aWMuICAqLwoJICAgIGlmICgocGVkYW50aWMKCQkgfHwgVFJFRV9VTlNJR05F
RCAodHlwZSkKCQkgfHwgISBpbnRfZml0c190eXBlX3AgKGV4cHIsIHVuc2lnbmVkX3R5cGUg
KHR5cGUpKSkKCSAgICAgICAgJiYgc2tpcF9ldmFsdWF0aW9uID09IDApCgkJd2FybmluZyAo
Im92ZXJmbG93IGluIGltcGxpY2l0IGNvbnN0YW50IGNvbnZlcnNpb24iKTsKCX0KICAgICAg
ZWxzZQoJdW5zaWduZWRfY29udmVyc2lvbl93YXJuaW5nICh0LCBleHByKTsKICAgIH0KICBy
ZXR1cm4gdDsKfQoMCnZvaWQKY19leHBhbmRfZXhwcl9zdG10IChleHByKQogICAgIHRyZWUg
ZXhwcjsKewogIC8qIERvIGRlZmF1bHQgY29udmVyc2lvbiBpZiBzYWZlIGFuZCBwb3NzaWJs
eSBpbXBvcnRhbnQsCiAgICAgaW4gY2FzZSB3aXRoaW4gKHsuLi59KS4gICovCiAgaWYgKChU
UkVFX0NPREUgKFRSRUVfVFlQRSAoZXhwcikpID09IEFSUkFZX1RZUEUgJiYgbHZhbHVlX3Ag
KGV4cHIpKQogICAgICB8fCBUUkVFX0NPREUgKFRSRUVfVFlQRSAoZXhwcikpID09IEZVTkNU
SU9OX1RZUEUpCiAgICBleHByID0gZGVmYXVsdF9jb252ZXJzaW9uIChleHByKTsKCiAgaWYg
KFRSRUVfVFlQRSAoZXhwcikgIT0gZXJyb3JfbWFya19ub2RlCiAgICAgICYmIFRZUEVfU0la
RSAoVFJFRV9UWVBFIChleHByKSkgPT0gMAogICAgICAmJiBUUkVFX0NPREUgKFRSRUVfVFlQ
RSAoZXhwcikpICE9IEFSUkFZX1RZUEUpCiAgICBlcnJvciAoImV4cHJlc3Npb24gc3RhdGVt
ZW50IGhhcyBpbmNvbXBsZXRlIHR5cGUiKTsKCiAgZXhwYW5kX2V4cHJfc3RtdCAoZXhwcik7
Cn0KDAovKiBWYWxpZGF0ZSB0aGUgZXhwcmVzc2lvbiBhZnRlciBgY2FzZScgYW5kIGFwcGx5
IGRlZmF1bHQgcHJvbW90aW9ucy4gICovCgp0cmVlCmNoZWNrX2Nhc2VfdmFsdWUgKHZhbHVl
KQogICAgIHRyZWUgdmFsdWU7CnsKICBpZiAodmFsdWUgPT0gTlVMTF9UUkVFKQogICAgcmV0
dXJuIHZhbHVlOwoKICAvKiBTdHJpcCBOT05fTFZBTFVFX0VYUFJzIHNpbmNlIHdlIGFyZW4n
dCB1c2luZyBhcyBhbiBsdmFsdWUuICAqLwogIFNUUklQX1RZUEVfTk9QUyAodmFsdWUpOwoK
ICBpZiAoVFJFRV9DT0RFICh2YWx1ZSkgIT0gSU5URUdFUl9DU1QKICAgICAgJiYgdmFsdWUg
IT0gZXJyb3JfbWFya19ub2RlKQogICAgewogICAgICBlcnJvciAoImNhc2UgbGFiZWwgZG9l
cyBub3QgcmVkdWNlIHRvIGFuIGludGVnZXIgY29uc3RhbnQiKTsKICAgICAgdmFsdWUgPSBl
cnJvcl9tYXJrX25vZGU7CiAgICB9CiAgZWxzZQogICAgLyogUHJvbW90ZSBjaGFyIG9yIHNo
b3J0IHRvIGludC4gICovCiAgICB2YWx1ZSA9IGRlZmF1bHRfY29udmVyc2lvbiAodmFsdWUp
OwoKICBjb25zdGFudF9leHByZXNzaW9uX3dhcm5pbmcgKHZhbHVlKTsKCiAgcmV0dXJuIHZh
bHVlOwp9CgwKLyogUmV0dXJuIGFuIGludGVnZXIgdHlwZSB3aXRoIEJJVFMgYml0cyBvZiBw
cmVjaXNpb24sCiAgIHRoYXQgaXMgdW5zaWduZWQgaWYgVU5TSUdORURQIGlzIG5vbnplcm8s
IG90aGVyd2lzZSBzaWduZWQuICAqLwoKdHJlZQp0eXBlX2Zvcl9zaXplIChiaXRzLCB1bnNp
Z25lZHApCiAgICAgdW5zaWduZWQgYml0czsKICAgICBpbnQgdW5zaWduZWRwOwp7CiAgaWYg
KGJpdHMgPT0gVFlQRV9QUkVDSVNJT04gKGludGVnZXJfdHlwZV9ub2RlKSkKICAgIHJldHVy
biB1bnNpZ25lZHAgPyB1bnNpZ25lZF90eXBlX25vZGUgOiBpbnRlZ2VyX3R5cGVfbm9kZTsK
CiAgaWYgKGJpdHMgPT0gVFlQRV9QUkVDSVNJT04gKHNpZ25lZF9jaGFyX3R5cGVfbm9kZSkp
CiAgICByZXR1cm4gdW5zaWduZWRwID8gdW5zaWduZWRfY2hhcl90eXBlX25vZGUgOiBzaWdu
ZWRfY2hhcl90eXBlX25vZGU7CgogIGlmIChiaXRzID09IFRZUEVfUFJFQ0lTSU9OIChzaG9y
dF9pbnRlZ2VyX3R5cGVfbm9kZSkpCiAgICByZXR1cm4gdW5zaWduZWRwID8gc2hvcnRfdW5z
aWduZWRfdHlwZV9ub2RlIDogc2hvcnRfaW50ZWdlcl90eXBlX25vZGU7CgogIGlmIChiaXRz
ID09IFRZUEVfUFJFQ0lTSU9OIChsb25nX2ludGVnZXJfdHlwZV9ub2RlKSkKICAgIHJldHVy
biB1bnNpZ25lZHAgPyBsb25nX3Vuc2lnbmVkX3R5cGVfbm9kZSA6IGxvbmdfaW50ZWdlcl90
eXBlX25vZGU7CgogIGlmIChiaXRzID09IFRZUEVfUFJFQ0lTSU9OIChsb25nX2xvbmdfaW50
ZWdlcl90eXBlX25vZGUpKQogICAgcmV0dXJuICh1bnNpZ25lZHAgPyBsb25nX2xvbmdfdW5z
aWduZWRfdHlwZV9ub2RlCgkgICAgOiBsb25nX2xvbmdfaW50ZWdlcl90eXBlX25vZGUpOwoK
ICBpZiAoYml0cyA8PSBUWVBFX1BSRUNJU0lPTiAoaW50UUlfdHlwZV9ub2RlKSkKICAgIHJl
dHVybiB1bnNpZ25lZHAgPyB1bnNpZ25lZF9pbnRRSV90eXBlX25vZGUgOiBpbnRRSV90eXBl
X25vZGU7CgogIGlmIChiaXRzIDw9IFRZUEVfUFJFQ0lTSU9OIChpbnRISV90eXBlX25vZGUp
KQogICAgcmV0dXJuIHVuc2lnbmVkcCA/IHVuc2lnbmVkX2ludEhJX3R5cGVfbm9kZSA6IGlu
dEhJX3R5cGVfbm9kZTsKCiAgaWYgKGJpdHMgPD0gVFlQRV9QUkVDSVNJT04gKGludFNJX3R5
cGVfbm9kZSkpCiAgICByZXR1cm4gdW5zaWduZWRwID8gdW5zaWduZWRfaW50U0lfdHlwZV9u
b2RlIDogaW50U0lfdHlwZV9ub2RlOwoKICBpZiAoYml0cyA8PSBUWVBFX1BSRUNJU0lPTiAo
aW50RElfdHlwZV9ub2RlKSkKICAgIHJldHVybiB1bnNpZ25lZHAgPyB1bnNpZ25lZF9pbnRE
SV90eXBlX25vZGUgOiBpbnRESV90eXBlX25vZGU7CgogIHJldHVybiAwOwp9CgovKiBSZXR1
cm4gYSBkYXRhIHR5cGUgdGhhdCBoYXMgbWFjaGluZSBtb2RlIE1PREUuCiAgIElmIHRoZSBt
b2RlIGlzIGFuIGludGVnZXIsCiAgIHRoZW4gVU5TSUdORURQIHNlbGVjdHMgYmV0d2VlbiBz
aWduZWQgYW5kIHVuc2lnbmVkIHR5cGVzLiAgKi8KCnRyZWUKdHlwZV9mb3JfbW9kZSAobW9k
ZSwgdW5zaWduZWRwKQogICAgIGVudW0gbWFjaGluZV9tb2RlIG1vZGU7CiAgICAgaW50IHVu
c2lnbmVkcDsKewogIGlmIChtb2RlID09IFRZUEVfTU9ERSAoaW50ZWdlcl90eXBlX25vZGUp
KQogICAgcmV0dXJuIHVuc2lnbmVkcCA/IHVuc2lnbmVkX3R5cGVfbm9kZSA6IGludGVnZXJf
dHlwZV9ub2RlOwoKICBpZiAobW9kZSA9PSBUWVBFX01PREUgKHNpZ25lZF9jaGFyX3R5cGVf
bm9kZSkpCiAgICByZXR1cm4gdW5zaWduZWRwID8gdW5zaWduZWRfY2hhcl90eXBlX25vZGUg
OiBzaWduZWRfY2hhcl90eXBlX25vZGU7CgogIGlmIChtb2RlID09IFRZUEVfTU9ERSAoc2hv
cnRfaW50ZWdlcl90eXBlX25vZGUpKQogICAgcmV0dXJuIHVuc2lnbmVkcCA/IHNob3J0X3Vu
c2lnbmVkX3R5cGVfbm9kZSA6IHNob3J0X2ludGVnZXJfdHlwZV9ub2RlOwoKICBpZiAobW9k
ZSA9PSBUWVBFX01PREUgKGxvbmdfaW50ZWdlcl90eXBlX25vZGUpKQogICAgcmV0dXJuIHVu
c2lnbmVkcCA/IGxvbmdfdW5zaWduZWRfdHlwZV9ub2RlIDogbG9uZ19pbnRlZ2VyX3R5cGVf
bm9kZTsKCiAgaWYgKG1vZGUgPT0gVFlQRV9NT0RFIChsb25nX2xvbmdfaW50ZWdlcl90eXBl
X25vZGUpKQogICAgcmV0dXJuIHVuc2lnbmVkcCA/IGxvbmdfbG9uZ191bnNpZ25lZF90eXBl
X25vZGUgOiBsb25nX2xvbmdfaW50ZWdlcl90eXBlX25vZGU7CgogIGlmIChtb2RlID09IFRZ
UEVfTU9ERSAoaW50UUlfdHlwZV9ub2RlKSkKICAgIHJldHVybiB1bnNpZ25lZHAgPyB1bnNp
Z25lZF9pbnRRSV90eXBlX25vZGUgOiBpbnRRSV90eXBlX25vZGU7CgogIGlmIChtb2RlID09
IFRZUEVfTU9ERSAoaW50SElfdHlwZV9ub2RlKSkKICAgIHJldHVybiB1bnNpZ25lZHAgPyB1
bnNpZ25lZF9pbnRISV90eXBlX25vZGUgOiBpbnRISV90eXBlX25vZGU7CgogIGlmIChtb2Rl
ID09IFRZUEVfTU9ERSAoaW50U0lfdHlwZV9ub2RlKSkKICAgIHJldHVybiB1bnNpZ25lZHAg
PyB1bnNpZ25lZF9pbnRTSV90eXBlX25vZGUgOiBpbnRTSV90eXBlX25vZGU7CgogIGlmICht
b2RlID09IFRZUEVfTU9ERSAoaW50RElfdHlwZV9ub2RlKSkKICAgIHJldHVybiB1bnNpZ25l
ZHAgPyB1bnNpZ25lZF9pbnRESV90eXBlX25vZGUgOiBpbnRESV90eXBlX25vZGU7CgogIGlm
IChtb2RlID09IFRZUEVfTU9ERSAoZmxvYXRfdHlwZV9ub2RlKSkKICAgIHJldHVybiBmbG9h
dF90eXBlX25vZGU7CgogIGlmIChtb2RlID09IFRZUEVfTU9ERSAoZG91YmxlX3R5cGVfbm9k
ZSkpCiAgICByZXR1cm4gZG91YmxlX3R5cGVfbm9kZTsKCiAgaWYgKG1vZGUgPT0gVFlQRV9N
T0RFIChsb25nX2RvdWJsZV90eXBlX25vZGUpKQogICAgcmV0dXJuIGxvbmdfZG91YmxlX3R5
cGVfbm9kZTsKCiAgaWYgKG1vZGUgPT0gVFlQRV9NT0RFIChidWlsZF9wb2ludGVyX3R5cGUg
KGNoYXJfdHlwZV9ub2RlKSkpCiAgICByZXR1cm4gYnVpbGRfcG9pbnRlcl90eXBlIChjaGFy
X3R5cGVfbm9kZSk7CgogIGlmIChtb2RlID09IFRZUEVfTU9ERSAoYnVpbGRfcG9pbnRlcl90
eXBlIChpbnRlZ2VyX3R5cGVfbm9kZSkpKQogICAgcmV0dXJuIGJ1aWxkX3BvaW50ZXJfdHlw
ZSAoaW50ZWdlcl90eXBlX25vZGUpOwoKICByZXR1cm4gMDsKfQoMCi8qIFJldHVybiB0aGUg
bWluaW11bSBudW1iZXIgb2YgYml0cyBuZWVkZWQgdG8gcmVwcmVzZW50IFZBTFVFIGluIGEK
ICAgc2lnbmVkIG9yIHVuc2lnbmVkIHR5cGUsIFVOU0lHTkVEUCBzYXlzIHdoaWNoLiAgKi8K
CmludAptaW5fcHJlY2lzaW9uICh2YWx1ZSwgdW5zaWduZWRwKQogICAgIHRyZWUgdmFsdWU7
CiAgICAgaW50IHVuc2lnbmVkcDsKewogIGludCBsb2c7CgogIC8qIElmIHRoZSB2YWx1ZSBp
cyBuZWdhdGl2ZSwgY29tcHV0ZSBpdHMgbmVnYXRpdmUgbWludXMgMS4gIFRoZSBsYXR0ZXIK
ICAgICBhZGp1c3RtZW50IGlzIGJlY2F1c2UgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBs
YXJnZXN0IG5lZ2F0aXZlIHZhbHVlCiAgICAgaXMgb25lIGxhcmdlciB0aGFuIHRoZSBsYXJn
ZXN0IHBvc2l0aXZlIHZhbHVlLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvCiAgICAgYSBiaXQt
d2lzZSBuZWdhdGlvbiwgc28gdXNlIHRoYXQgb3BlcmF0aW9uIGluc3RlYWQuICAqLwoKICBp
ZiAodHJlZV9pbnRfY3N0X3NnbiAodmFsdWUpIDwgMCkKICAgIHZhbHVlID0gZm9sZCAoYnVp
bGQxIChCSVRfTk9UX0VYUFIsIFRSRUVfVFlQRSAodmFsdWUpLCB2YWx1ZSkpOwoKICAvKiBS
ZXR1cm4gdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCwgdGFraW5nIGludG8gYWNjb3VudCB0
aGUgZmFjdAogICAgIHRoYXQgd2UgbmVlZCBvbmUgbW9yZSBiaXQgZm9yIGEgc2lnbmVkIHRo
YW4gdW5zaWduZWQgdHlwZS4gICovCgogIGlmIChpbnRlZ2VyX3plcm9wICh2YWx1ZSkpCiAg
ICBsb2cgPSAwOwogIGVsc2UgaWYgKFRSRUVfSU5UX0NTVF9ISUdIICh2YWx1ZSkgIT0gMCkK
ICAgIGxvZyA9IEhPU1RfQklUU19QRVJfV0lERV9JTlQgKyBmbG9vcl9sb2cyIChUUkVFX0lO
VF9DU1RfSElHSCAodmFsdWUpKTsKICBlbHNlCiAgICBsb2cgPSBmbG9vcl9sb2cyIChUUkVF
X0lOVF9DU1RfTE9XICh2YWx1ZSkpOwoKICByZXR1cm4gbG9nICsgMSArICEgdW5zaWduZWRw
Owp9CgwKLyogUHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBmb3IgaW52YWxpZCBvcGVyYW5kcyB0
byBhcml0aCBvcGVyYXRpb24gQ09ERS4KICAgTk9QX0VYUFIgaXMgdXNlZCBhcyBhIHNwZWNp
YWwgY2FzZSAoc2VlIHRydXRodmFsdWVfY29udmVyc2lvbikuICAqLwoKdm9pZApiaW5hcnlf
b3BfZXJyb3IgKGNvZGUpCiAgICAgZW51bSB0cmVlX2NvZGUgY29kZTsKewogIHJlZ2lzdGVy
IGNoYXIgKm9wbmFtZSA9ICJ1bmtub3duIjsKCiAgc3dpdGNoIChjb2RlKQogICAgewogICAg
Y2FzZSBOT1BfRVhQUjoKICAgICAgZXJyb3IgKCJpbnZhbGlkIHRydXRoLXZhbHVlIGV4cHJl
c3Npb24iKTsKICAgICAgcmV0dXJuOwoKICAgIGNhc2UgUExVU19FWFBSOgogICAgICBvcG5h
bWUgPSAiKyI7IGJyZWFrOwogICAgY2FzZSBNSU5VU19FWFBSOgogICAgICBvcG5hbWUgPSAi
LSI7IGJyZWFrOwogICAgY2FzZSBNVUxUX0VYUFI6CiAgICAgIG9wbmFtZSA9ICIqIjsgYnJl
YWs7CiAgICBjYXNlIE1BWF9FWFBSOgogICAgICBvcG5hbWUgPSAibWF4IjsgYnJlYWs7CiAg
ICBjYXNlIE1JTl9FWFBSOgogICAgICBvcG5hbWUgPSAibWluIjsgYnJlYWs7CiAgICBjYXNl
IEVRX0VYUFI6CiAgICAgIG9wbmFtZSA9ICI9PSI7IGJyZWFrOwogICAgY2FzZSBORV9FWFBS
OgogICAgICBvcG5hbWUgPSAiIT0iOyBicmVhazsKICAgIGNhc2UgTEVfRVhQUjoKICAgICAg
b3BuYW1lID0gIjw9IjsgYnJlYWs7CiAgICBjYXNlIEdFX0VYUFI6CiAgICAgIG9wbmFtZSA9
ICI+PSI7IGJyZWFrOwogICAgY2FzZSBMVF9FWFBSOgogICAgICBvcG5hbWUgPSAiPCI7IGJy
ZWFrOwogICAgY2FzZSBHVF9FWFBSOgogICAgICBvcG5hbWUgPSAiPiI7IGJyZWFrOwogICAg
Y2FzZSBMU0hJRlRfRVhQUjoKICAgICAgb3BuYW1lID0gIjw8IjsgYnJlYWs7CiAgICBjYXNl
IFJTSElGVF9FWFBSOgogICAgICBvcG5hbWUgPSAiPj4iOyBicmVhazsKICAgIGNhc2UgVFJV
TkNfTU9EX0VYUFI6CiAgICBjYXNlIEZMT09SX01PRF9FWFBSOgogICAgICBvcG5hbWUgPSAi
JSI7IGJyZWFrOwogICAgY2FzZSBUUlVOQ19ESVZfRVhQUjoKICAgIGNhc2UgRkxPT1JfRElW
X0VYUFI6CiAgICAgIG9wbmFtZSA9ICIvIjsgYnJlYWs7CiAgICBjYXNlIEJJVF9BTkRfRVhQ
UjoKICAgICAgb3BuYW1lID0gIiYiOyBicmVhazsKICAgIGNhc2UgQklUX0lPUl9FWFBSOgog
ICAgICBvcG5hbWUgPSAifCI7IGJyZWFrOwogICAgY2FzZSBUUlVUSF9BTkRJRl9FWFBSOgog
ICAgICBvcG5hbWUgPSAiJiYiOyBicmVhazsKICAgIGNhc2UgVFJVVEhfT1JJRl9FWFBSOgog
ICAgICBvcG5hbWUgPSAifHwiOyBicmVhazsKICAgIGNhc2UgQklUX1hPUl9FWFBSOgogICAg
ICBvcG5hbWUgPSAiXiI7IGJyZWFrOwogICAgY2FzZSBMUk9UQVRFX0VYUFI6CiAgICBjYXNl
IFJST1RBVEVfRVhQUjoKICAgICAgb3BuYW1lID0gInJvdGF0ZSI7IGJyZWFrOwogICAgfQog
IGVycm9yICgiaW52YWxpZCBvcGVyYW5kcyB0byBiaW5hcnkgJXMiLCBvcG5hbWUpOwp9CgwK
LyogU3Vicm91dGluZSBvZiBidWlsZF9iaW5hcnlfb3AsIHVzZWQgZm9yIGNvbXBhcmlzb24g
b3BlcmF0aW9ucy4KICAgU2VlIGlmIHRoZSBvcGVyYW5kcyBoYXZlIGJvdGggYmVlbiBjb252
ZXJ0ZWQgZnJvbSBzdWJ3b3JkIGludGVnZXIgdHlwZXMKICAgYW5kLCBpZiBzbywgcGVyaGFw
cyBjaGFuZ2UgdGhlbSBib3RoIGJhY2sgdG8gdGhlaXIgb3JpZ2luYWwgdHlwZS4KICAgVGhp
cyBmdW5jdGlvbiBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciBjb252ZXJ0aW5nIHRoZSB0d28g
b3BlcmFuZHMKICAgdG8gdGhlIHByb3BlciBjb21tb24gdHlwZSBmb3IgY29tcGFyaXNvbi4K
CiAgIFRoZSBhcmd1bWVudHMgb2YgdGhpcyBmdW5jdGlvbiBhcmUgYWxsIHBvaW50ZXJzIHRv
IGxvY2FsIHZhcmlhYmxlcwogICBvZiBidWlsZF9iaW5hcnlfb3A6IE9QMF9QVFIgaXMgJk9Q
MCwgT1AxX1BUUiBpcyAmT1AxLAogICBSRVNUWVBFX1BUUiBpcyAmUkVTVUxUX1RZUEUgYW5k
IFJFU0NPREVfUFRSIGlzICZSRVNVTFRDT0RFLgoKICAgSWYgdGhpcyBmdW5jdGlvbiByZXR1
cm5zIG5vbnplcm8sIGl0IG1lYW5zIHRoYXQgdGhlIGNvbXBhcmlzb24gaGFzCiAgIGEgY29u
c3RhbnQgdmFsdWUuICBXaGF0IHRoaXMgZnVuY3Rpb24gcmV0dXJucyBpcyBhbiBleHByZXNz
aW9uIGZvcgogICB0aGF0IHZhbHVlLiAgKi8KCnRyZWUKc2hvcnRlbl9jb21wYXJlIChvcDBf
cHRyLCBvcDFfcHRyLCByZXN0eXBlX3B0ciwgcmVzY29kZV9wdHIpCiAgICAgdHJlZSAqb3Aw
X3B0ciwgKm9wMV9wdHI7CiAgICAgdHJlZSAqcmVzdHlwZV9wdHI7CiAgICAgZW51bSB0cmVl
X2NvZGUgKnJlc2NvZGVfcHRyOwp7CiAgcmVnaXN0ZXIgdHJlZSB0eXBlOwogIHRyZWUgb3Aw
ID0gKm9wMF9wdHI7CiAgdHJlZSBvcDEgPSAqb3AxX3B0cjsKICBpbnQgdW5zaWduZWRwMCwg
dW5zaWduZWRwMTsKICBpbnQgcmVhbDEsIHJlYWwyOwogIHRyZWUgcHJpbW9wMCwgcHJpbW9w
MTsKICBlbnVtIHRyZWVfY29kZSBjb2RlID0gKnJlc2NvZGVfcHRyOwoKICAvKiBUaHJvdyBh
d2F5IGFueSBjb252ZXJzaW9ucyB0byB3aWRlciB0eXBlcwogICAgIGFscmVhZHkgcHJlc2Vu
dCBpbiB0aGUgb3BlcmFuZHMuICAqLwoKICBwcmltb3AwID0gZ2V0X25hcnJvd2VyIChvcDAs
ICZ1bnNpZ25lZHAwKTsKICBwcmltb3AxID0gZ2V0X25hcnJvd2VyIChvcDEsICZ1bnNpZ25l
ZHAxKTsKCiAgLyogSGFuZGxlIHRoZSBjYXNlIHRoYXQgT1AwIGRvZXMgbm90ICpjb250YWlu
KiBhIGNvbnZlcnNpb24KICAgICBidXQgaXQgKnJlcXVpcmVzKiBjb252ZXJzaW9uIHRvIEZJ
TkFMX1RZUEUuICAqLwoKICBpZiAob3AwID09IHByaW1vcDAgJiYgVFJFRV9UWVBFIChvcDAp
ICE9ICpyZXN0eXBlX3B0cikKICAgIHVuc2lnbmVkcDAgPSBUUkVFX1VOU0lHTkVEIChUUkVF
X1RZUEUgKG9wMCkpOwogIGlmIChvcDEgPT0gcHJpbW9wMSAmJiBUUkVFX1RZUEUgKG9wMSkg
IT0gKnJlc3R5cGVfcHRyKQogICAgdW5zaWduZWRwMSA9IFRSRUVfVU5TSUdORUQgKFRSRUVf
VFlQRSAob3AxKSk7CgogIC8qIElmIG9uZSBvZiB0aGUgb3BlcmFuZHMgbXVzdCBiZSBmbG9h
dGVkLCB3ZSBjYW5ub3Qgb3B0aW1pemUuICAqLwogIHJlYWwxID0gVFJFRV9DT0RFIChUUkVF
X1RZUEUgKHByaW1vcDApKSA9PSBSRUFMX1RZUEU7CiAgcmVhbDIgPSBUUkVFX0NPREUgKFRS
RUVfVFlQRSAocHJpbW9wMSkpID09IFJFQUxfVFlQRTsKCiAgLyogSWYgZmlyc3QgYXJnIGlz
IGNvbnN0YW50LCBzd2FwIHRoZSBhcmdzIChjaGFuZ2luZyBvcGVyYXRpb24KICAgICBzbyB2
YWx1ZSBpcyBwcmVzZXJ2ZWQpLCBmb3IgY2Fub25pY2FsaXphdGlvbi4gIERvbid0IGRvIHRo
aXMgaWYKICAgICB0aGUgc2Vjb25kIGFyZyBpcyAwLiAgKi8KCiAgaWYgKFRSRUVfQ09OU1RB
TlQgKHByaW1vcDApCiAgICAgICYmICEgaW50ZWdlcl96ZXJvcCAocHJpbW9wMSkgJiYgISBy
ZWFsX3plcm9wIChwcmltb3AxKSkKICAgIHsKICAgICAgcmVnaXN0ZXIgdHJlZSB0ZW0gPSBw
cmltb3AwOwogICAgICByZWdpc3RlciBpbnQgdGVtaSA9IHVuc2lnbmVkcDA7CiAgICAgIHBy
aW1vcDAgPSBwcmltb3AxOwogICAgICBwcmltb3AxID0gdGVtOwogICAgICB0ZW0gPSBvcDA7
CiAgICAgIG9wMCA9IG9wMTsKICAgICAgb3AxID0gdGVtOwogICAgICAqb3AwX3B0ciA9IG9w
MDsKICAgICAgKm9wMV9wdHIgPSBvcDE7CiAgICAgIHVuc2lnbmVkcDAgPSB1bnNpZ25lZHAx
OwogICAgICB1bnNpZ25lZHAxID0gdGVtaTsKICAgICAgdGVtaSA9IHJlYWwxOwogICAgICBy
ZWFsMSA9IHJlYWwyOwogICAgICByZWFsMiA9IHRlbWk7CgogICAgICBzd2l0Y2ggKGNvZGUp
Cgl7CgljYXNlIExUX0VYUFI6CgkgIGNvZGUgPSBHVF9FWFBSOwoJICBicmVhazsKCWNhc2Ug
R1RfRVhQUjoKCSAgY29kZSA9IExUX0VYUFI7CgkgIGJyZWFrOwoJY2FzZSBMRV9FWFBSOgoJ
ICBjb2RlID0gR0VfRVhQUjsKCSAgYnJlYWs7CgljYXNlIEdFX0VYUFI6CgkgIGNvZGUgPSBM
RV9FWFBSOwoJICBicmVhazsKCX0KICAgICAgKnJlc2NvZGVfcHRyID0gY29kZTsKICAgIH0K
CiAgLyogSWYgY29tcGFyaW5nIGFuIGludGVnZXIgYWdhaW5zdCBhIGNvbnN0YW50IG1vcmUg
Yml0cyB3aWRlLAogICAgIG1heWJlIHdlIGNhbiBkZWR1Y2UgYSB2YWx1ZSBvZiAxIG9yIDAg
aW5kZXBlbmRlbnQgb2YgdGhlIGRhdGEuCiAgICAgT3IgZWxzZSB0cnVuY2F0ZSB0aGUgY29u
c3RhbnQgbm93CiAgICAgcmF0aGVyIHRoYW4gZXh0ZW5kIHRoZSB2YXJpYWJsZSBhdCBydW4g
dGltZS4KCiAgICAgVGhpcyBpcyBvbmx5IGludGVyZXN0aW5nIGlmIHRoZSBjb25zdGFudCBp
cyB0aGUgd2lkZXIgYXJnLgogICAgIEFsc28sIGl0IGlzIG5vdCBzYWZlIGlmIHRoZSBjb25z
dGFudCBpcyB1bnNpZ25lZCBhbmQgdGhlCiAgICAgdmFyaWFibGUgYXJnIGlzIHNpZ25lZCwg
c2luY2UgaW4gdGhpcyBjYXNlIHRoZSB2YXJpYWJsZQogICAgIHdvdWxkIGJlIHNpZ24tZXh0
ZW5kZWQgYW5kIHRoZW4gcmVnYXJkZWQgYXMgdW5zaWduZWQuCiAgICAgT3VyIHRlY2huaXF1
ZSBmYWlscyBpbiB0aGlzIGNhc2UgYmVjYXVzZSB0aGUgbG93ZXN0L2hpZ2hlc3QKICAgICBw
b3NzaWJsZSB1bnNpZ25lZCByZXN1bHRzIGRvbid0IGZvbGxvdyBuYXR1cmFsbHkgZnJvbSB0
aGUKICAgICBsb3dlc3QvaGlnaGVzdCBwb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIHZhcmlhYmxl
IG9wZXJhbmQuCiAgICAgRm9yIGp1c3QgRVFfRVhQUiBhbmQgTkVfRVhQUiB0aGVyZSBpcyBh
bm90aGVyIHRlY2huaXF1ZSB0aGF0CiAgICAgY291bGQgYmUgdXNlZDogc2VlIGlmIHRoZSBj
b25zdGFudCBjYW4gYmUgZmFpdGhmdWxseSByZXByZXNlbnRlZAogICAgIGluIHRoZSBvdGhl
ciBvcGVyYW5kJ3MgdHlwZSwgYnkgdHJ1bmNhdGluZyBpdCBhbmQgcmVleHRlbmRpbmcgaXQK
ICAgICBhbmQgc2VlIGlmIHRoYXQgcHJlc2VydmVzIHRoZSBjb25zdGFudCdzIHZhbHVlLiAg
Ki8KCiAgaWYgKCFyZWFsMSAmJiAhcmVhbDIKICAgICAgJiYgVFJFRV9DT0RFIChwcmltb3Ax
KSA9PSBJTlRFR0VSX0NTVAogICAgICAmJiBUWVBFX1BSRUNJU0lPTiAoVFJFRV9UWVBFIChw
cmltb3AwKSkgPCBUWVBFX1BSRUNJU0lPTiAoKnJlc3R5cGVfcHRyKSkKICAgIHsKICAgICAg
aW50IG1pbl9ndCwgbWF4X2d0LCBtaW5fbHQsIG1heF9sdDsKICAgICAgdHJlZSBtYXh2YWws
IG1pbnZhbDsKICAgICAgLyogMSBpZiBjb21wYXJpc29uIGlzIG5vbWluYWxseSB1bnNpZ25l
ZC4gICovCiAgICAgIGludCB1bnNpZ25lZHAgPSBUUkVFX1VOU0lHTkVEICgqcmVzdHlwZV9w
dHIpOwogICAgICB0cmVlIHZhbDsKCiAgICAgIHR5cGUgPSBzaWduZWRfb3JfdW5zaWduZWRf
dHlwZSAodW5zaWduZWRwMCwgVFJFRV9UWVBFIChwcmltb3AwKSk7CgogICAgICBtYXh2YWwg
PSBUWVBFX01BWF9WQUxVRSAodHlwZSk7CiAgICAgIG1pbnZhbCA9IFRZUEVfTUlOX1ZBTFVF
ICh0eXBlKTsKCiAgICAgIGlmICh1bnNpZ25lZHAgJiYgIXVuc2lnbmVkcDApCgkqcmVzdHlw
ZV9wdHIgPSBzaWduZWRfdHlwZSAoKnJlc3R5cGVfcHRyKTsKCiAgICAgIGlmIChUUkVFX1RZ
UEUgKHByaW1vcDEpICE9ICpyZXN0eXBlX3B0cikKCXByaW1vcDEgPSBjb252ZXJ0ICgqcmVz
dHlwZV9wdHIsIHByaW1vcDEpOwogICAgICBpZiAodHlwZSAhPSAqcmVzdHlwZV9wdHIpCgl7
CgkgIG1pbnZhbCA9IGNvbnZlcnQgKCpyZXN0eXBlX3B0ciwgbWludmFsKTsKCSAgbWF4dmFs
ID0gY29udmVydCAoKnJlc3R5cGVfcHRyLCBtYXh2YWwpOwoJfQoKICAgICAgaWYgKHVuc2ln
bmVkcCAmJiB1bnNpZ25lZHAwKQoJewoJICBtaW5fZ3QgPSBJTlRfQ1NUX0xUX1VOU0lHTkVE
IChwcmltb3AxLCBtaW52YWwpOwoJICBtYXhfZ3QgPSBJTlRfQ1NUX0xUX1VOU0lHTkVEIChw
cmltb3AxLCBtYXh2YWwpOwoJICBtaW5fbHQgPSBJTlRfQ1NUX0xUX1VOU0lHTkVEIChtaW52
YWwsIHByaW1vcDEpOwoJICBtYXhfbHQgPSBJTlRfQ1NUX0xUX1VOU0lHTkVEIChtYXh2YWws
IHByaW1vcDEpOwoJfQogICAgICBlbHNlCgl7CgkgIG1pbl9ndCA9IElOVF9DU1RfTFQgKHBy
aW1vcDEsIG1pbnZhbCk7CgkgIG1heF9ndCA9IElOVF9DU1RfTFQgKHByaW1vcDEsIG1heHZh
bCk7CgkgIG1pbl9sdCA9IElOVF9DU1RfTFQgKG1pbnZhbCwgcHJpbW9wMSk7CgkgIG1heF9s
dCA9IElOVF9DU1RfTFQgKG1heHZhbCwgcHJpbW9wMSk7Cgl9CgogICAgICB2YWwgPSAwOwog
ICAgICAvKiBUaGlzIHVzZWQgdG8gYmUgYSBzd2l0Y2gsIGJ1dCBHZW5peCBjb21waWxlciBj
YW4ndCBoYW5kbGUgdGhhdC4gICovCiAgICAgIGlmIChjb2RlID09IE5FX0VYUFIpCgl7Cgkg
IGlmIChtYXhfbHQgfHwgbWluX2d0KQoJICAgIHZhbCA9IGJvb2xlYW5fdHJ1ZV9ub2RlOwoJ
fQogICAgICBlbHNlIGlmIChjb2RlID09IEVRX0VYUFIpCgl7CgkgIGlmIChtYXhfbHQgfHwg
bWluX2d0KQoJICAgIHZhbCA9IGJvb2xlYW5fZmFsc2Vfbm9kZTsKCX0KICAgICAgZWxzZSBp
ZiAoY29kZSA9PSBMVF9FWFBSKQoJewoJICBpZiAobWF4X2x0KQoJICAgIHZhbCA9IGJvb2xl
YW5fdHJ1ZV9ub2RlOwoJICBpZiAoIW1pbl9sdCkKCSAgICB2YWwgPSBib29sZWFuX2ZhbHNl
X25vZGU7Cgl9CiAgICAgIGVsc2UgaWYgKGNvZGUgPT0gR1RfRVhQUikKCXsKCSAgaWYgKG1p
bl9ndCkKCSAgICB2YWwgPSBib29sZWFuX3RydWVfbm9kZTsKCSAgaWYgKCFtYXhfZ3QpCgkg
ICAgdmFsID0gYm9vbGVhbl9mYWxzZV9ub2RlOwoJfQogICAgICBlbHNlIGlmIChjb2RlID09
IExFX0VYUFIpCgl7CgkgIGlmICghbWF4X2d0KQoJICAgIHZhbCA9IGJvb2xlYW5fdHJ1ZV9u
b2RlOwoJICBpZiAobWluX2d0KQoJICAgIHZhbCA9IGJvb2xlYW5fZmFsc2Vfbm9kZTsKCX0K
ICAgICAgZWxzZSBpZiAoY29kZSA9PSBHRV9FWFBSKQoJewoJICBpZiAoIW1pbl9sdCkKCSAg
ICB2YWwgPSBib29sZWFuX3RydWVfbm9kZTsKCSAgaWYgKG1heF9sdCkKCSAgICB2YWwgPSBi
b29sZWFuX2ZhbHNlX25vZGU7Cgl9CgogICAgICAvKiBJZiBwcmltb3AwIHdhcyBzaWduLWV4
dGVuZGVkIGFuZCB1bnNpZ25lZCBjb21wYXJpc29uIHNwZWNkLAoJIHdlIGRpZCBhIHNpZ25l
ZCBjb21wYXJpc29uIGFib3ZlIHVzaW5nIHRoZSBzaWduZWQgdHlwZSBib3VuZHMuCgkgQnV0
IHRoZSBjb21wYXJpc29uIHdlIG91dHB1dCBtdXN0IGJlIHVuc2lnbmVkLgoKCSBBbHNvLCBm
b3IgaW5lcXVhbGl0aWVzLCBWQUwgaXMgbm8gZ29vZDsgYnV0IGlmIHRoZSBzaWduZWQKCSBj
b21wYXJpc29uIGhhZCAqYW55KiBmaXhlZCByZXN1bHQsIGl0IGZvbGxvd3MgdGhhdCB0aGUK
CSB1bnNpZ25lZCBjb21wYXJpc29uIGp1c3QgdGVzdHMgdGhlIHNpZ24gaW4gcmV2ZXJzZQoJ
IChwb3NpdGl2ZSB2YWx1ZXMgYXJlIExFLCBuZWdhdGl2ZSBvbmVzIEdFKS4KCSBTbyB3ZSBj
YW4gZ2VuZXJhdGUgYW4gdW5zaWduZWQgY29tcGFyaXNvbgoJIGFnYWluc3QgYW4gZXh0cmVt
ZSB2YWx1ZSBvZiB0aGUgc2lnbmVkIHR5cGUuICAqLwoKICAgICAgaWYgKHVuc2lnbmVkcCAm
JiAhdW5zaWduZWRwMCkKCXsKCSAgaWYgKHZhbCAhPSAwKQoJICAgIHN3aXRjaCAoY29kZSkK
CSAgICAgIHsKCSAgICAgIGNhc2UgTFRfRVhQUjoKCSAgICAgIGNhc2UgR0VfRVhQUjoKCQlw
cmltb3AxID0gVFlQRV9NSU5fVkFMVUUgKHR5cGUpOwoJCXZhbCA9IDA7CgkJYnJlYWs7CgoJ
ICAgICAgY2FzZSBMRV9FWFBSOgoJICAgICAgY2FzZSBHVF9FWFBSOgoJCXByaW1vcDEgPSBU
WVBFX01BWF9WQUxVRSAodHlwZSk7CgkJdmFsID0gMDsKCQlicmVhazsKCSAgICAgIH0KCSAg
dHlwZSA9IHVuc2lnbmVkX3R5cGUgKHR5cGUpOwoJfQoKICAgICAgaWYgKCFtYXhfZ3QgJiYg
IXVuc2lnbmVkcDAgJiYgVFJFRV9DT0RFIChwcmltb3AwKSAhPSBJTlRFR0VSX0NTVCkKCXsK
CSAgLyogVGhpcyBpcyB0aGUgY2FzZSBvZiAoY2hhcil4ID4/PCAweDgwLCB3aGljaCBwZW9w
bGUgdXNlZCB0byB1c2UKCSAgICAgZXhwZWN0aW5nIG9sZCBDIGNvbXBpbGVycyB0byBjaGFu
Z2UgdGhlIDB4ODAgaW50byAtMHg4MC4gICovCgkgIGlmICh2YWwgPT0gYm9vbGVhbl9mYWxz
ZV9ub2RlKQoJICAgIHdhcm5pbmcgKCJjb21wYXJpc29uIGlzIGFsd2F5cyAwIGR1ZSB0byBs
aW1pdGVkIHJhbmdlIG9mIGRhdGEgdHlwZSIpOwoJICBpZiAodmFsID09IGJvb2xlYW5fdHJ1
ZV9ub2RlKQoJICAgIHdhcm5pbmcgKCJjb21wYXJpc29uIGlzIGFsd2F5cyAxIGR1ZSB0byBs
aW1pdGVkIHJhbmdlIG9mIGRhdGEgdHlwZSIpOwoJfQoKICAgICAgaWYgKCFtaW5fbHQgJiYg
dW5zaWduZWRwMCAmJiBUUkVFX0NPREUgKHByaW1vcDApICE9IElOVEVHRVJfQ1NUKQoJewoJ
ICAvKiBUaGlzIGlzIHRoZSBjYXNlIG9mICh1bnNpZ25lZCBjaGFyKXggPj88IC0xIG9yIDwg
MC4gICovCgkgIGlmICh2YWwgPT0gYm9vbGVhbl9mYWxzZV9ub2RlKQoJICAgIHdhcm5pbmcg
KCJjb21wYXJpc29uIGlzIGFsd2F5cyAwIGR1ZSB0byBsaW1pdGVkIHJhbmdlIG9mIGRhdGEg
dHlwZSIpOwoJICBpZiAodmFsID09IGJvb2xlYW5fdHJ1ZV9ub2RlKQoJICAgIHdhcm5pbmcg
KCJjb21wYXJpc29uIGlzIGFsd2F5cyAxIGR1ZSB0byBsaW1pdGVkIHJhbmdlIG9mIGRhdGEg
dHlwZSIpOwoJfQoKICAgICAgaWYgKHZhbCAhPSAwKQoJewoJICAvKiBEb24ndCBmb3JnZXQg
dG8gZXZhbHVhdGUgUFJJTU9QMCBpZiBpdCBoYXMgc2lkZSBlZmZlY3RzLiAgKi8KCSAgaWYg
KFRSRUVfU0lERV9FRkZFQ1RTIChwcmltb3AwKSkKCSAgICByZXR1cm4gYnVpbGQgKENPTVBP
VU5EX0VYUFIsIFRSRUVfVFlQRSAodmFsKSwgcHJpbW9wMCwgdmFsKTsKCSAgcmV0dXJuIHZh
bDsKCX0KCiAgICAgIC8qIFZhbHVlIGlzIG5vdCBwcmVkZXRlcm1pbmVkLCBidXQgZG8gdGhl
IGNvbXBhcmlzb24KCSBpbiB0aGUgdHlwZSBvZiB0aGUgb3BlcmFuZCB0aGF0IGlzIG5vdCBj
b25zdGFudC4KCSBUWVBFIGlzIGFscmVhZHkgcHJvcGVybHkgc2V0LiAgKi8KICAgIH0KICBl
bHNlIGlmIChyZWFsMSAmJiByZWFsMgoJICAgJiYgKFRZUEVfUFJFQ0lTSU9OIChUUkVFX1RZ
UEUgKHByaW1vcDApKQoJICAgICAgID09IFRZUEVfUFJFQ0lTSU9OIChUUkVFX1RZUEUgKHBy
aW1vcDEpKSkpCiAgICB0eXBlID0gVFJFRV9UWVBFIChwcmltb3AwKTsKCiAgLyogSWYgYXJn
cycgbmF0dXJhbCB0eXBlcyBhcmUgYm90aCBuYXJyb3dlciB0aGFuIG5vbWluYWwgdHlwZQog
ICAgIGFuZCBib3RoIGV4dGVuZCBpbiB0aGUgc2FtZSBtYW5uZXIsIGNvbXBhcmUgdGhlbQog
ICAgIGluIHRoZSB0eXBlIG9mIHRoZSB3aWRlciBhcmcuCiAgICAgT3RoZXJ3aXNlIG11c3Qg
YWN0dWFsbHkgZXh0ZW5kIGJvdGggdG8gdGhlIG5vbWluYWwKICAgICBjb21tb24gdHlwZSBs
ZXN0IGRpZmZlcmVudCB3YXlzIG9mIGV4dGVuZGluZwogICAgIGFsdGVyIHRoZSByZXN1bHQu
CiAgICAgKGVnLCAoc2hvcnQpLTEgPT0gKHVuc2lnbmVkIHNob3J0KS0xICBzaG91bGQgYmUg
MC4pICAqLwoKICBlbHNlIGlmICh1bnNpZ25lZHAwID09IHVuc2lnbmVkcDEgJiYgcmVhbDEg
PT0gcmVhbDIKCSAgICYmIFRZUEVfUFJFQ0lTSU9OIChUUkVFX1RZUEUgKHByaW1vcDApKSA8
IFRZUEVfUFJFQ0lTSU9OICgqcmVzdHlwZV9wdHIpCgkgICAmJiBUWVBFX1BSRUNJU0lPTiAo
VFJFRV9UWVBFIChwcmltb3AxKSkgPCBUWVBFX1BSRUNJU0lPTiAoKnJlc3R5cGVfcHRyKSkK
ICAgIHsKICAgICAgdHlwZSA9IGNvbW1vbl90eXBlIChUUkVFX1RZUEUgKHByaW1vcDApLCBU
UkVFX1RZUEUgKHByaW1vcDEpKTsKICAgICAgdHlwZSA9IHNpZ25lZF9vcl91bnNpZ25lZF90
eXBlICh1bnNpZ25lZHAwCgkJCQkgICAgICB8fCBUUkVFX1VOU0lHTkVEICgqcmVzdHlwZV9w
dHIpLAoJCQkJICAgICAgdHlwZSk7CiAgICAgIC8qIE1ha2Ugc3VyZSBzaG9ydGVyIG9wZXJh
bmQgaXMgZXh0ZW5kZWQgdGhlIHJpZ2h0IHdheQoJIHRvIG1hdGNoIHRoZSBsb25nZXIgb3Bl
cmFuZC4gICovCiAgICAgIHByaW1vcDAgPSBjb252ZXJ0IChzaWduZWRfb3JfdW5zaWduZWRf
dHlwZSAodW5zaWduZWRwMCwgVFJFRV9UWVBFIChwcmltb3AwKSksCgkJCSBwcmltb3AwKTsK
ICAgICAgcHJpbW9wMSA9IGNvbnZlcnQgKHNpZ25lZF9vcl91bnNpZ25lZF90eXBlICh1bnNp
Z25lZHAxLCBUUkVFX1RZUEUgKHByaW1vcDEpKSwKCQkJIHByaW1vcDEpOwogICAgfQogIGVs
c2UKICAgIHsKICAgICAgLyogSGVyZSB3ZSBtdXN0IGRvIHRoZSBjb21wYXJpc29uIG9uIHRo
ZSBub21pbmFsIHR5cGUKCSB1c2luZyB0aGUgYXJncyBleGFjdGx5IGFzIHdlIHJlY2VpdmVk
IHRoZW0uICAqLwogICAgICB0eXBlID0gKnJlc3R5cGVfcHRyOwogICAgICBwcmltb3AwID0g
b3AwOwogICAgICBwcmltb3AxID0gb3AxOwoKICAgICAgaWYgKCFyZWFsMSAmJiAhcmVhbDIg
JiYgaW50ZWdlcl96ZXJvcCAocHJpbW9wMSkKCSAgJiYgVFJFRV9VTlNJR05FRCAoKnJlc3R5
cGVfcHRyKSkKCXsKCSAgdHJlZSB2YWx1ZSA9IDA7CgkgIHN3aXRjaCAoY29kZSkKCSAgICB7
CgkgICAgY2FzZSBHRV9FWFBSOgoJICAgICAgLyogQWxsIHVuc2lnbmVkIHZhbHVlcyBhcmUg
Pj0gMCwgc28gd2Ugd2FybiBpZiBleHRyYSB3YXJuaW5ncwoJCSBhcmUgcmVxdWVzdGVkLiAg
SG93ZXZlciwgaWYgT1AwIGlzIGEgY29uc3RhbnQgdGhhdCBpcwoJCSA+PSAwLCB0aGUgc2ln
bmVkbmVzcyBvZiB0aGUgY29tcGFyaXNvbiBpc24ndCBhbiBpc3N1ZSwKCQkgc28gc3VwcHJl
c3MgdGhlIHdhcm5pbmcuICAqLwoJICAgICAgaWYgKGV4dHJhX3dhcm5pbmdzCgkJICAmJiAh
IChUUkVFX0NPREUgKHByaW1vcDApID09IElOVEVHRVJfQ1NUCgkJCSYmICEgVFJFRV9PVkVS
RkxPVyAoY29udmVydCAoc2lnbmVkX3R5cGUgKHR5cGUpLAoJCQkJCQkgICAgIHByaW1vcDAp
KSkpCgkJd2FybmluZyAoInVuc2lnbmVkIHZhbHVlID49IDAgaXMgYWx3YXlzIDEiKTsKCSAg
ICAgIHZhbHVlID0gYm9vbGVhbl90cnVlX25vZGU7CgkgICAgICBicmVhazsKCgkgICAgY2Fz
ZSBMVF9FWFBSOgoJICAgICAgaWYgKGV4dHJhX3dhcm5pbmdzCgkJICAmJiAhIChUUkVFX0NP
REUgKHByaW1vcDApID09IElOVEVHRVJfQ1NUCgkJCSYmICEgVFJFRV9PVkVSRkxPVyAoY29u
dmVydCAoc2lnbmVkX3R5cGUgKHR5cGUpLAoJCQkJCQkgICAgIHByaW1vcDApKSkpCgkJd2Fy
bmluZyAoInVuc2lnbmVkIHZhbHVlIDwgMCBpcyBhbHdheXMgMCIpOwoJICAgICAgdmFsdWUg
PSBib29sZWFuX2ZhbHNlX25vZGU7CgkgICAgfQoKCSAgaWYgKHZhbHVlICE9IDApCgkgICAg
ewoJICAgICAgLyogRG9uJ3QgZm9yZ2V0IHRvIGV2YWx1YXRlIFBSSU1PUDAgaWYgaXQgaGFz
IHNpZGUgZWZmZWN0cy4gICovCgkgICAgICBpZiAoVFJFRV9TSURFX0VGRkVDVFMgKHByaW1v
cDApKQoJCXJldHVybiBidWlsZCAoQ09NUE9VTkRfRVhQUiwgVFJFRV9UWVBFICh2YWx1ZSks
CgkJCSAgICAgIHByaW1vcDAsIHZhbHVlKTsKCSAgICAgIHJldHVybiB2YWx1ZTsKCSAgICB9
Cgl9CiAgICB9CgogICpvcDBfcHRyID0gY29udmVydCAodHlwZSwgcHJpbW9wMCk7CiAgKm9w
MV9wdHIgPSBjb252ZXJ0ICh0eXBlLCBwcmltb3AxKTsKCiAgKnJlc3R5cGVfcHRyID0gYm9v
bGVhbl90eXBlX25vZGU7CgogIHJldHVybiAwOwp9CgwKLyogUHJlcGFyZSBleHByIHRvIGJl
IGFuIGFyZ3VtZW50IG9mIGEgVFJVVEhfTk9UX0VYUFIsCiAgIG9yIHZhbGlkYXRlIGl0cyBk
YXRhIHR5cGUgZm9yIGFuIGBpZicgb3IgYHdoaWxlJyBzdGF0ZW1lbnQgb3IgPy4uOiBleHAu
CgogICBUaGlzIHByZXBhcmF0aW9uIGNvbnNpc3RzIG9mIHRha2luZyB0aGUgb3JkaW5hcnkK
ICAgcmVwcmVzZW50YXRpb24gb2YgYW4gZXhwcmVzc2lvbiBleHByIGFuZCBwcm9kdWNpbmcg
YSB2YWxpZCB0cmVlCiAgIGJvb2xlYW4gZXhwcmVzc2lvbiBkZXNjcmliaW5nIHdoZXRoZXIg
ZXhwciBpcyBub256ZXJvLiAgV2UgY291bGQKICAgc2ltcGx5IGFsd2F5cyBkbyBidWlsZF9i
aW5hcnlfb3AgKE5FX0VYUFIsIGV4cHIsIGJvb2xlYW5fZmFsc2Vfbm9kZSwgMSksCiAgIGJ1
dCB3ZSBvcHRpbWl6ZSBjb21wYXJpc29ucywgJiYsIHx8LCBhbmQgIS4KCiAgIFRoZSByZXN1
bHRpbmcgdHlwZSBzaG91bGQgYWx3YXlzIGJlIGBib29sZWFuX3R5cGVfbm9kZScuICAqLwoK
dHJlZQp0cnV0aHZhbHVlX2NvbnZlcnNpb24gKGV4cHIpCiAgICAgdHJlZSBleHByOwp7CiAg
aWYgKFRSRUVfQ09ERSAoZXhwcikgPT0gRVJST1JfTUFSSykKICAgIHJldHVybiBleHByOwoK
I2lmIDAgLyogVGhpcyBhcHBlYXJzIHRvIGJlIHdyb25nIGZvciBDKysuICAqLwogIC8qIFRo
ZXNlIHJlYWxseSBzaG91bGQgcmV0dXJuIGVycm9yX21hcmtfbm9kZSBhZnRlciAyLjQgaXMg
c3RhYmxlLgogICAgIEJ1dCBub3QgYWxsIGNhbGxlcnMgaGFuZGxlIEVSUk9SX01BUksgcHJv
cGVybHkuICAqLwogIHN3aXRjaCAoVFJFRV9DT0RFIChUUkVFX1RZUEUgKGV4cHIpKSkKICAg
IHsKICAgIGNhc2UgUkVDT1JEX1RZUEU6CiAgICAgIGVycm9yICgic3RydWN0IHR5cGUgdmFs
dWUgdXNlZCB3aGVyZSBzY2FsYXIgaXMgcmVxdWlyZWQiKTsKICAgICAgcmV0dXJuIGJvb2xl
YW5fZmFsc2Vfbm9kZTsKCiAgICBjYXNlIFVOSU9OX1RZUEU6CiAgICAgIGVycm9yICgidW5p
b24gdHlwZSB2YWx1ZSB1c2VkIHdoZXJlIHNjYWxhciBpcyByZXF1aXJlZCIpOwogICAgICBy
ZXR1cm4gYm9vbGVhbl9mYWxzZV9ub2RlOwoKICAgIGNhc2UgQVJSQVlfVFlQRToKICAgICAg
ZXJyb3IgKCJhcnJheSB0eXBlIHZhbHVlIHVzZWQgd2hlcmUgc2NhbGFyIGlzIHJlcXVpcmVk
Iik7CiAgICAgIHJldHVybiBib29sZWFuX2ZhbHNlX25vZGU7CgogICAgZGVmYXVsdDoKICAg
ICAgYnJlYWs7CiAgICB9CiNlbmRpZiAvKiAwICovCgogIHN3aXRjaCAoVFJFRV9DT0RFIChl
eHByKSkKICAgIHsKICAgICAgLyogSXQgaXMgc2ltcGxlciBhbmQgZ2VuZXJhdGVzIGJldHRl
ciBjb2RlIHRvIGhhdmUgb25seSBUUlVUSF8qX0VYUFIKCSBvciBjb21wYXJpc29uIGV4cHJl
c3Npb25zIGFzIHRydXRoIHZhbHVlcyBhdCB0aGlzIGxldmVsLiAgKi8KI2lmIDAKICAgIGNh
c2UgQ09NUE9ORU5UX1JFRjoKICAgICAgLyogQSBvbmUtYml0IHVuc2lnbmVkIGJpdC1maWVs
ZCBpcyBhbHJlYWR5IGFjY2VwdGFibGUuICAqLwogICAgICBpZiAoMSA9PSBUUkVFX0lOVF9D
U1RfTE9XIChERUNMX1NJWkUgKFRSRUVfT1BFUkFORCAoZXhwciwgMSkpKQoJICAmJiBUUkVF
X1VOU0lHTkVEIChUUkVFX09QRVJBTkQgKGV4cHIsIDEpKSkKCXJldHVybiBleHByOwogICAg
ICBicmVhazsKI2VuZGlmCgogICAgY2FzZSBFUV9FWFBSOgogICAgICAvKiBJdCBpcyBzaW1w
bGVyIGFuZCBnZW5lcmF0ZXMgYmV0dGVyIGNvZGUgdG8gaGF2ZSBvbmx5IFRSVVRIXypfRVhQ
UgoJIG9yIGNvbXBhcmlzb24gZXhwcmVzc2lvbnMgYXMgdHJ1dGggdmFsdWVzIGF0IHRoaXMg
bGV2ZWwuICAqLwojaWYgMAogICAgICBpZiAoaW50ZWdlcl96ZXJvcCAoVFJFRV9PUEVSQU5E
IChleHByLCAxKSkpCglyZXR1cm4gYnVpbGRfdW5hcnlfb3AgKFRSVVRIX05PVF9FWFBSLCBU
UkVFX09QRVJBTkQgKGV4cHIsIDApLCAwKTsKI2VuZGlmCiAgICBjYXNlIE5FX0VYUFI6IGNh
c2UgTEVfRVhQUjogY2FzZSBHRV9FWFBSOiBjYXNlIExUX0VYUFI6IGNhc2UgR1RfRVhQUjoK
ICAgIGNhc2UgVFJVVEhfQU5ESUZfRVhQUjoKICAgIGNhc2UgVFJVVEhfT1JJRl9FWFBSOgog
ICAgY2FzZSBUUlVUSF9BTkRfRVhQUjoKICAgIGNhc2UgVFJVVEhfT1JfRVhQUjoKICAgIGNh
c2UgVFJVVEhfWE9SX0VYUFI6CiAgICBjYXNlIFRSVVRIX05PVF9FWFBSOgogICAgICBUUkVF
X1RZUEUgKGV4cHIpID0gYm9vbGVhbl90eXBlX25vZGU7CiAgICAgIHJldHVybiBleHByOwoK
ICAgIGNhc2UgRVJST1JfTUFSSzoKICAgICAgcmV0dXJuIGV4cHI7CgogICAgY2FzZSBJTlRF
R0VSX0NTVDoKICAgICAgcmV0dXJuIGludGVnZXJfemVyb3AgKGV4cHIpID8gYm9vbGVhbl9m
YWxzZV9ub2RlIDogYm9vbGVhbl90cnVlX25vZGU7CgogICAgY2FzZSBSRUFMX0NTVDoKICAg
ICAgcmV0dXJuIHJlYWxfemVyb3AgKGV4cHIpID8gYm9vbGVhbl9mYWxzZV9ub2RlIDogYm9v
bGVhbl90cnVlX25vZGU7CgogICAgY2FzZSBBRERSX0VYUFI6CiAgICAgIC8qIElmIHdlIGFy
ZSB0YWtpbmcgdGhlIGFkZHJlc3Mgb2YgYSBleHRlcm5hbCBkZWNsLCBpdCBtaWdodCBiZSB6
ZXJvCgkgaWYgaXQgaXMgd2Vhaywgc28gd2UgY2Fubm90IG9wdGltaXplLiAgKi8KICAgICAg
aWYgKFRSRUVfQ09ERV9DTEFTUyAoVFJFRV9DT0RFIChUUkVFX09QRVJBTkQgKGV4cHIsIDAp
KSkgPT0gJ2QnCgkgICYmIERFQ0xfRVhURVJOQUwgKFRSRUVfT1BFUkFORCAoZXhwciwgMCkp
KQoJYnJlYWs7CgogICAgICBpZiAoVFJFRV9TSURFX0VGRkVDVFMgKFRSRUVfT1BFUkFORCAo
ZXhwciwgMCkpKQoJcmV0dXJuIGJ1aWxkIChDT01QT1VORF9FWFBSLCBib29sZWFuX3R5cGVf
bm9kZSwKCQkgICAgICBUUkVFX09QRVJBTkQgKGV4cHIsIDApLCBib29sZWFuX3RydWVfbm9k
ZSk7CiAgICAgIGVsc2UKCXJldHVybiBib29sZWFuX3RydWVfbm9kZTsKCiAgICBjYXNlIENP
TVBMRVhfRVhQUjoKICAgICAgcmV0dXJuIGJ1aWxkX2JpbmFyeV9vcCAoKFRSRUVfU0lERV9F
RkZFQ1RTIChUUkVFX09QRVJBTkQgKGV4cHIsIDEpKQoJCQkgICAgICAgPyBUUlVUSF9PUl9F
WFBSIDogVFJVVEhfT1JJRl9FWFBSKSwKCQkJICAgICAgdHJ1dGh2YWx1ZV9jb252ZXJzaW9u
IChUUkVFX09QRVJBTkQgKGV4cHIsIDApKSwKCQkJICAgICAgdHJ1dGh2YWx1ZV9jb252ZXJz
aW9uIChUUkVFX09QRVJBTkQgKGV4cHIsIDEpKSwKCQkJICAgICAgMCk7CgogICAgY2FzZSBO
RUdBVEVfRVhQUjoKICAgIGNhc2UgQUJTX0VYUFI6CiAgICBjYXNlIEZMT0FUX0VYUFI6CiAg
ICBjYXNlIEZGU19FWFBSOgogICAgICAvKiBUaGVzZSBkb24ndCBjaGFuZ2Ugd2hldGhlciBh
biBvYmplY3QgaXMgbm9uLXplcm8gb3IgemVyby4gICovCiAgICAgIHJldHVybiB0cnV0aHZh
bHVlX2NvbnZlcnNpb24gKFRSRUVfT1BFUkFORCAoZXhwciwgMCkpOwoKICAgIGNhc2UgTFJP
VEFURV9FWFBSOgogICAgY2FzZSBSUk9UQVRFX0VYUFI6CiAgICAgIC8qIFRoZXNlIGRvbid0
IGNoYW5nZSB3aGV0aGVyIGFuIG9iamVjdCBpcyB6ZXJvIG9yIG5vbi16ZXJvLCBidXQKCSB3
ZSBjYW4ndCBpZ25vcmUgdGhlbSBpZiB0aGVpciBzZWNvbmQgYXJnIGhhcyBzaWRlLWVmZmVj
dHMuICAqLwogICAgICBpZiAoVFJFRV9TSURFX0VGRkVDVFMgKFRSRUVfT1BFUkFORCAoZXhw
ciwgMSkpKQoJcmV0dXJuIGJ1aWxkIChDT01QT1VORF9FWFBSLCBib29sZWFuX3R5cGVfbm9k
ZSwgVFJFRV9PUEVSQU5EIChleHByLCAxKSwKCQkgICAgICB0cnV0aHZhbHVlX2NvbnZlcnNp
b24gKFRSRUVfT1BFUkFORCAoZXhwciwgMCkpKTsKICAgICAgZWxzZQoJcmV0dXJuIHRydXRo
dmFsdWVfY29udmVyc2lvbiAoVFJFRV9PUEVSQU5EIChleHByLCAwKSk7CiAgICAgIAogICAg
Y2FzZSBDT05EX0VYUFI6CiAgICAgIC8qIERpc3RyaWJ1dGUgdGhlIGNvbnZlcnNpb24gaW50
byB0aGUgYXJtcyBvZiBhIENPTkRfRVhQUi4gICovCiAgICAgIHJldHVybiBmb2xkIChidWls
ZCAoQ09ORF9FWFBSLCBib29sZWFuX3R5cGVfbm9kZSwgVFJFRV9PUEVSQU5EIChleHByLCAw
KSwKCQkJICB0cnV0aHZhbHVlX2NvbnZlcnNpb24gKFRSRUVfT1BFUkFORCAoZXhwciwgMSkp
LAoJCQkgIHRydXRodmFsdWVfY29udmVyc2lvbiAoVFJFRV9PUEVSQU5EIChleHByLCAyKSkp
KTsKCiAgICBjYXNlIENPTlZFUlRfRVhQUjoKICAgICAgLyogRG9uJ3QgY2FuY2VsIHRoZSBl
ZmZlY3Qgb2YgYSBDT05WRVJUX0VYUFIgZnJvbSBhIFJFRkVSRU5DRV9UWVBFLAoJIHNpbmNl
IHRoYXQgYWZmZWN0cyBob3cgYGRlZmF1bHRfY29udmVyc2lvbicgd2lsbCBiZWhhdmUuICAq
LwogICAgICBpZiAoVFJFRV9DT0RFIChUUkVFX1RZUEUgKGV4cHIpKSA9PSBSRUZFUkVOQ0Vf
VFlQRQoJICB8fCBUUkVFX0NPREUgKFRSRUVfVFlQRSAoVFJFRV9PUEVSQU5EIChleHByLCAw
KSkpID09IFJFRkVSRU5DRV9UWVBFKQoJYnJlYWs7CiAgICAgIC8qIGZhbGwgdGhyb3VnaC4u
LiAgKi8KICAgIGNhc2UgTk9QX0VYUFI6CiAgICAgIC8qIElmIHRoaXMgaXMgd2lkZW5pbmcg
dGhlIGFyZ3VtZW50LCB3ZSBjYW4gaWdub3JlIGl0LiAgKi8KICAgICAgaWYgKFRZUEVfUFJF
Q0lTSU9OIChUUkVFX1RZUEUgKGV4cHIpKQoJICA+PSBUWVBFX1BSRUNJU0lPTiAoVFJFRV9U
WVBFIChUUkVFX09QRVJBTkQgKGV4cHIsIDApKSkpCglyZXR1cm4gdHJ1dGh2YWx1ZV9jb252
ZXJzaW9uIChUUkVFX09QRVJBTkQgKGV4cHIsIDApKTsKICAgICAgYnJlYWs7CgogICAgY2Fz
ZSBNSU5VU19FWFBSOgogICAgICAvKiBXaXRoIElFRUUgYXJpdGhtZXRpYywgeCAtIHggbWF5
IG5vdCBlcXVhbCAwLCBzbyB3ZSBjYW4ndCBvcHRpbWl6ZQoJIHRoaXMgY2FzZS4gICovCiAg
ICAgIGlmIChUQVJHRVRfRkxPQVRfRk9STUFUID09IElFRUVfRkxPQVRfRk9STUFUCgkgICYm
IFRSRUVfQ09ERSAoVFJFRV9UWVBFIChleHByKSkgPT0gUkVBTF9UWVBFKQoJYnJlYWs7CiAg
ICAgIC8qIGZhbGwgdGhyb3VnaC4uLiAgKi8KICAgIGNhc2UgQklUX1hPUl9FWFBSOgogICAg
ICAvKiBUaGlzIGFuZCBNSU5VU19FWFBSIGNhbiBiZSBjaGFuZ2VkIGludG8gYSBjb21wYXJp
c29uIG9mIHRoZQoJIHR3byBvYmplY3RzLiAgKi8KICAgICAgaWYgKFRSRUVfVFlQRSAoVFJF
RV9PUEVSQU5EIChleHByLCAwKSkKCSAgPT0gVFJFRV9UWVBFIChUUkVFX09QRVJBTkQgKGV4
cHIsIDEpKSkKCXJldHVybiBidWlsZF9iaW5hcnlfb3AgKE5FX0VYUFIsIFRSRUVfT1BFUkFO
RCAoZXhwciwgMCksCgkJCQlUUkVFX09QRVJBTkQgKGV4cHIsIDEpLCAxKTsKICAgICAgcmV0
dXJuIGJ1aWxkX2JpbmFyeV9vcCAoTkVfRVhQUiwgVFJFRV9PUEVSQU5EIChleHByLCAwKSwK
CQkJICAgICAgZm9sZCAoYnVpbGQxIChOT1BfRVhQUiwKCQkJCQkgICAgVFJFRV9UWVBFIChU
UkVFX09QRVJBTkQgKGV4cHIsIDApKSwKCQkJCQkgICAgVFJFRV9PUEVSQU5EIChleHByLCAx
KSkpLCAxKTsKCiAgICBjYXNlIEJJVF9BTkRfRVhQUjoKICAgICAgaWYgKGludGVnZXJfb25l
cCAoVFJFRV9PUEVSQU5EIChleHByLCAxKSkKCSAgJiYgVFJFRV9UWVBFIChleHByKSAhPSBi
b29sZWFuX3R5cGVfbm9kZSkKCS8qIFVzaW5nIGNvbnZlcnQgaGVyZSB3b3VsZCBjYXVzZSBp
bmZpbml0ZSByZWN1cnNpb24uICAqLwoJcmV0dXJuIGJ1aWxkMSAoTk9QX0VYUFIsIGJvb2xl
YW5fdHlwZV9ub2RlLCBleHByKTsKICAgICAgYnJlYWs7CgogICAgY2FzZSBNT0RJRllfRVhQ
UjoKICAgICAgaWYgKHdhcm5fcGFyZW50aGVzZXMgJiYgQ19FWFBfT1JJR0lOQUxfQ09ERSAo
ZXhwcikgPT0gTU9ESUZZX0VYUFIpCgl3YXJuaW5nICgic3VnZ2VzdCBwYXJlbnRoZXNlcyBh
cm91bmQgYXNzaWdubWVudCB1c2VkIGFzIHRydXRoIHZhbHVlIik7CiAgICAgIGJyZWFrOwog
ICAgfQoKICBpZiAoVFJFRV9DT0RFIChUUkVFX1RZUEUgKGV4cHIpKSA9PSBDT01QTEVYX1RZ
UEUpCiAgICByZXR1cm4gKGJ1aWxkX2JpbmFyeV9vcAoJICAgICgoVFJFRV9TSURFX0VGRkVD
VFMgKGV4cHIpCgkgICAgICA/IFRSVVRIX09SX0VYUFIgOiBUUlVUSF9PUklGX0VYUFIpLAoJ
ICAgICB0cnV0aHZhbHVlX2NvbnZlcnNpb24gKGJ1aWxkX3VuYXJ5X29wIChSRUFMUEFSVF9F
WFBSLCBleHByLCAwKSksCgkgICAgIHRydXRodmFsdWVfY29udmVyc2lvbiAoYnVpbGRfdW5h
cnlfb3AgKElNQUdQQVJUX0VYUFIsIGV4cHIsIDApKSwKCSAgICAgMCkpOwoKICByZXR1cm4g
YnVpbGRfYmluYXJ5X29wIChORV9FWFBSLCBleHByLCBpbnRlZ2VyX3plcm9fbm9kZSwgMSk7
Cn0KDAovKiBSZWFkIHRoZSByZXN0IG9mIGEgIy1kaXJlY3RpdmUgZnJvbSBpbnB1dCBzdHJl
YW0gRklOUFVULgogICBJbiBub3JtYWwgdXNlLCB0aGUgZGlyZWN0aXZlIG5hbWUgYW5kIHRo
ZSB3aGl0ZSBzcGFjZSBhZnRlciBpdAogICBoYXZlIGFscmVhZHkgYmVlbiByZWFkLCBzbyB0
aGV5IHdvbid0IGJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHQuCiAgIFdlIGFsbG93IGZvciB0
aGUgZmFjdCB0aGF0IHRoZSBkaXJlY3RpdmUgbGluZSBtYXkgY29udGFpbgogICBhIG5ld2xp
bmUgZW1iZWRkZWQgd2l0aGluIGEgY2hhcmFjdGVyIG9yIHN0cmluZyBsaXRlcmFsIHdoaWNo
IGZvcm1zCiAgIGEgcGFydCBvZiB0aGUgZGlyZWN0aXZlLgoKICAgVGhlIHZhbHVlIGlzIGEg
c3RyaW5nIGluIGEgcmV1c2FibGUgYnVmZmVyLiAgSXQgcmVtYWlucyB2YWxpZAogICBvbmx5
IHVudGlsIHRoZSBuZXh0IHRpbWUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuCgogICBUaGUg
dGVybWluYXRpbmcgY2hhcmFjdGVyICgnXG4nIG9yIEVPRikgaXMgbGVmdCBpbiBGSU5QVVQg
Zm9yIHRoZQogICBjYWxsZXIgdG8gcmUtcmVhZC4gICovCgpjaGFyICoKZ2V0X2RpcmVjdGl2
ZV9saW5lIChmaW5wdXQpCiAgICAgcmVnaXN0ZXIgRklMRSAqZmlucHV0Owp7CiAgc3RhdGlj
IGNoYXIgKmRpcmVjdGl2ZV9idWZmZXIgPSBOVUxMOwogIHN0YXRpYyB1bnNpZ25lZCBidWZm
ZXJfbGVuZ3RoID0gMDsKICByZWdpc3RlciBjaGFyICpwOwogIHJlZ2lzdGVyIGNoYXIgKmJ1
ZmZlcl9saW1pdDsKICByZWdpc3RlciBpbnQgbG9va2luZ19mb3IgPSAwOwogIHJlZ2lzdGVy
IGludCBjaGFyX2VzY2FwZWQgPSAwOwoKICBpZiAoYnVmZmVyX2xlbmd0aCA9PSAwKQogICAg
ewogICAgICBkaXJlY3RpdmVfYnVmZmVyID0gKGNoYXIgKil4bWFsbG9jICgxMjgpOwogICAg
ICBidWZmZXJfbGVuZ3RoID0gMTI4OwogICAgfQoKICBidWZmZXJfbGltaXQgPSAmZGlyZWN0
aXZlX2J1ZmZlcltidWZmZXJfbGVuZ3RoXTsKCiAgZm9yIChwID0gZGlyZWN0aXZlX2J1ZmZl
cjsgOyApCiAgICB7CiAgICAgIGludCBjOwoKICAgICAgLyogTWFrZSBidWZmZXIgYmlnZ2Vy
IGlmIGl0IGlzIGZ1bGwuICAqLwogICAgICBpZiAocCA+PSBidWZmZXJfbGltaXQpCiAgICAg
ICAgewoJICByZWdpc3RlciB1bnNpZ25lZCBieXRlc191c2VkID0gKHAgLSBkaXJlY3RpdmVf
YnVmZmVyKTsKCgkgIGJ1ZmZlcl9sZW5ndGggKj0gMjsKCSAgZGlyZWN0aXZlX2J1ZmZlcgoJ
ICAgID0gKGNoYXIgKil4cmVhbGxvYyAoZGlyZWN0aXZlX2J1ZmZlciwgYnVmZmVyX2xlbmd0
aCk7CgkgIHAgPSAmZGlyZWN0aXZlX2J1ZmZlcltieXRlc191c2VkXTsKCSAgYnVmZmVyX2xp
bWl0ID0gJmRpcmVjdGl2ZV9idWZmZXJbYnVmZmVyX2xlbmd0aF07CiAgICAgICAgfQoKICAg
ICAgYyA9IGdldGMgKGZpbnB1dCk7CgogICAgICAvKiBEaXNjYXJkIGluaXRpYWwgd2hpdGVz
cGFjZS4gICovCiAgICAgIGlmICgoYyA9PSAnICcgfHwgYyA9PSAnXHQnKSAmJiBwID09IGRp
cmVjdGl2ZV9idWZmZXIpCgljb250aW51ZTsKCiAgICAgIC8qIERldGVjdCB0aGUgZW5kIG9m
IHRoZSBkaXJlY3RpdmUuICAqLwogICAgICBpZiAobG9va2luZ19mb3IgPT0gMAoJICAmJiAo
YyA9PSAnXG4nIHx8IGMgPT0gRU9GKSkKCXsKICAgICAgICAgIHVuZ2V0YyAoYywgZmlucHV0
KTsKCSAgYyA9ICdcMCc7Cgl9CgogICAgICAqcCsrID0gYzsKCiAgICAgIGlmIChjID09IDAp
CglyZXR1cm4gZGlyZWN0aXZlX2J1ZmZlcjsKCiAgICAgIC8qIEhhbmRsZSBzdHJpbmcgYW5k
IGNoYXJhY3RlciBjb25zdGFudCBzeW50YXguICAqLwogICAgICBpZiAobG9va2luZ19mb3Ip
Cgl7CgkgIGlmIChsb29raW5nX2ZvciA9PSBjICYmICFjaGFyX2VzY2FwZWQpCgkgICAgbG9v
a2luZ19mb3IgPSAwOwkvKiBGb3VuZCB0ZXJtaW5hdG9yLi4uIHN0b3AgbG9va2luZy4gICov
Cgl9CiAgICAgIGVsc2UKICAgICAgICBpZiAoYyA9PSAnXCcnIHx8IGMgPT0gJyInKQoJICBs
b29raW5nX2ZvciA9IGM7CS8qIERvbid0IHN0b3AgYnVmZmVyaW5nIHVudGlsIHdlIHNlZSBh
bm90aGVyCgkJCQkgICBhbm90aGVyIG9uZSBvZiB0aGVzZSAob3IgYW4gRU9GKS4gICovCgog
ICAgICAvKiBIYW5kbGUgYmFja3NsYXNoLiAgKi8KICAgICAgY2hhcl9lc2NhcGVkID0gKGMg
PT0gJ1xcJyAmJiAhIGNoYXJfZXNjYXBlZCk7CiAgICB9Cn0KDAovKiBNYWtlIGEgdmFyaWFu
dCB0eXBlIGluIHRoZSBwcm9wZXIgd2F5IGZvciBDL0MrKywgcHJvcGFnYXRpbmcgcXVhbGlm
aWVycwogICBkb3duIHRvIHRoZSBlbGVtZW50IHR5cGUgb2YgYW4gYXJyYXkuICAqLwoKdHJl
ZQpjX2J1aWxkX3R5cGVfdmFyaWFudCAodHlwZSwgY29uc3RwLCB2b2xhdGlsZXApCiAgICAg
dHJlZSB0eXBlOwogICAgIGludCBjb25zdHAsIHZvbGF0aWxlcDsKewogIGlmIChUUkVFX0NP
REUgKHR5cGUpID09IEFSUkFZX1RZUEUpCiAgICByZXR1cm4gYnVpbGRfYXJyYXlfdHlwZSAo
Y19idWlsZF90eXBlX3ZhcmlhbnQgKFRSRUVfVFlQRSAodHlwZSksCgkJCQkJCSAgIGNvbnN0
cCwgdm9sYXRpbGVwKSwKCQkJICAgICBUWVBFX0RPTUFJTiAodHlwZSkpOwogIHJldHVybiBi
dWlsZF90eXBlX3ZhcmlhbnQgKHR5cGUsIGNvbnN0cCwgdm9sYXRpbGVwKTsKfQo=
_ATEOF


cat >secondfile.b64 <<'_ATEOF'
LyogU3Vicm91dGluZXMgc2hhcmVkIGJ5IGFsbCBsYW5ndWFnZXMgdGhhdCBhcmUgdmFyaWFu
dHMgb2YgQy4KICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2
LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLAogICAyMDAxLCAyMDAyLCAyMDAzIEZyZWUgU29m
dHdhcmUgRm91bmRhdGlvbiwgSW5jLgoKVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgoKR0ND
IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2Rp
ZnkgaXQgdW5kZXIKdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVy
IHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKdmVyc2lvbi4KCkdD
QyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBi
dXQgV0lUSE9VVCBBTlkKV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJy
YW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCmZvciBtb3JlIGRl
dGFpbHMuCgpZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2Vu
ZXJhbCBQdWJsaWMgTGljZW5zZQphbG9uZyB3aXRoIEdDQzsgc2VlIHRoZSBmaWxlIENPUFlJ
TkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlClNvZnR3YXJlIEZvdW5kYXRpb24sIDU5
IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQowMjExMS0xMzA3LCBVU0Eu
ICAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgojaW5jbHVkZSAic3lzdGVtLmgiCiNpbmNsdWRl
ICJjb3JldHlwZXMuaCIKI2luY2x1ZGUgInRtLmgiCiNpbmNsdWRlICJpbnRsLmgiCiNpbmNs
dWRlICJ0cmVlLmgiCiNpbmNsdWRlICJmbGFncy5oIgojaW5jbHVkZSAib3V0cHV0LmgiCiNp
bmNsdWRlICJjLXByYWdtYS5oIgojaW5jbHVkZSAicnRsLmgiCiNpbmNsdWRlICJnZ2MuaCIK
I2luY2x1ZGUgInZhcnJheS5oIgojaW5jbHVkZSAiZXhwci5oIgojaW5jbHVkZSAiYy1jb21t
b24uaCIKI2luY2x1ZGUgImRpYWdub3N0aWMuaCIKI2luY2x1ZGUgInRtX3AuaCIKI2luY2x1
ZGUgIm9ic3RhY2suaCIKI2luY2x1ZGUgImNwcGxpYi5oIgojaW5jbHVkZSAidGFyZ2V0Lmgi
CiNpbmNsdWRlICJsYW5naG9va3MuaCIKI2luY2x1ZGUgInRyZWUtaW5saW5lLmgiCiNpbmNs
dWRlICJjLXRyZWUuaCIKLyogSW4gb3JkZXIgdG8gZW5zdXJlIHdlIHVzZSBhIGNvbW1vbiBz
dWJzZXQgb2YgdmFsaWQgc3BlY2lmaWVycwogICAoYmV0d2VlbiB0aGUgdmFyaW91cyBDIGZh
bWlseSBmcm9udGVuZHMpIGluIHRoaXMgZmlsZSwgd2UgcmVzdHJpY3QKICAgb3Vyc2VsdmVz
IHRvIHRoZSBnZW5lcmljIHNwZWNpZmllciBzZXQuICAqLwojdW5kZWYgR0NDX0RJQUdfU1RZ
TEUKI2luY2x1ZGUgInRvcGxldi5oIgoKY3BwX3JlYWRlciAqcGFyc2VfaW47CQkvKiBEZWNs
YXJlZCBpbiBjLXByYWdtYS5oLiAgKi8KCi8qIFdlIGxldCB0bS5oIG92ZXJyaWRlIHRoZSB0
eXBlcyB1c2VkIGhlcmUsIHRvIGhhbmRsZSB0cml2aWFsIGRpZmZlcmVuY2VzCiAgIHN1Y2gg
YXMgdGhlIGNob2ljZSBvZiB1bnNpZ25lZCBpbnQgb3IgbG9uZyB1bnNpZ25lZCBpbnQgZm9y
IHNpemVfdC4KICAgV2hlbiBtYWNoaW5lcyBzdGFydCBuZWVkaW5nIG5vbnRyaXZpYWwgZGlm
ZmVyZW5jZXMgaW4gdGhlIHNpemUgdHlwZSwKICAgaXQgd291bGQgYmUgYmVzdCB0byBkbyBz
b21ldGhpbmcgaGVyZSB0byBmaWd1cmUgb3V0IGF1dG9tYXRpY2FsbHkKICAgZnJvbSBvdGhl
ciBpbmZvcm1hdGlvbiB3aGF0IHR5cGUgdG8gdXNlLiAgKi8KCiNpZm5kZWYgU0laRV9UWVBF
CiNkZWZpbmUgU0laRV9UWVBFICJsb25nIHVuc2lnbmVkIGludCIKI2VuZGlmCgojaWZuZGVm
IFdDSEFSX1RZUEUKI2RlZmluZSBXQ0hBUl9UWVBFICJpbnQiCiNlbmRpZgoKLyogV0NIQVJf
VFlQRSBnZXRzIG92ZXJyaWRkZW4gYnkgLWZzaG9ydC13Y2hhci4gICovCiNkZWZpbmUgTU9E
SUZJRURfV0NIQVJfVFlQRSBcCgkoZmxhZ19zaG9ydF93Y2hhciA/ICJzaG9ydCB1bnNpZ25l
ZCBpbnQiIDogV0NIQVJfVFlQRSkKCiNpZm5kZWYgUFRSRElGRl9UWVBFCiNkZWZpbmUgUFRS
RElGRl9UWVBFICJsb25nIGludCIKI2VuZGlmCgojaWZuZGVmIFdJTlRfVFlQRQojZGVmaW5l
IFdJTlRfVFlQRSAidW5zaWduZWQgaW50IgojZW5kaWYKCiNpZm5kZWYgSU5UTUFYX1RZUEUK
I2RlZmluZSBJTlRNQVhfVFlQRSAoKElOVF9UWVBFX1NJWkUgPT0gTE9OR19MT05HX1RZUEVf
U0laRSkJXAoJCSAgICAgPyAiaW50IgkJCQkJXAoJCSAgICAgOiAoKExPTkdfVFlQRV9TSVpF
ID09IExPTkdfTE9OR19UWVBFX1NJWkUpCVwKCQkJPyAibG9uZyBpbnQiCQkJCVwKCQkJOiAi
bG9uZyBsb25nIGludCIpKQojZW5kaWYKCiNpZm5kZWYgVUlOVE1BWF9UWVBFCiNkZWZpbmUg
VUlOVE1BWF9UWVBFICgoSU5UX1RZUEVfU0laRSA9PSBMT05HX0xPTkdfVFlQRV9TSVpFKQlc
CgkJICAgICA/ICJ1bnNpZ25lZCBpbnQiCQkJCVwKCQkgICAgIDogKChMT05HX1RZUEVfU0la
RSA9PSBMT05HX0xPTkdfVFlQRV9TSVpFKQlcCgkJCT8gImxvbmcgdW5zaWduZWQgaW50IgkJ
CVwKCQkJOiAibG9uZyBsb25nIHVuc2lnbmVkIGludCIpKQojZW5kaWYKCi8qIFRoZSBmb2xs
b3dpbmcgc3ltYm9scyBhcmUgc3Vic3VtZWQgaW4gdGhlIGNfZ2xvYmFsX3RyZWVzIGFycmF5
LCBhbmQKICAgbGlzdGVkIGhlcmUgaW5kaXZpZHVhbGx5IGZvciBkb2N1bWVudGF0aW9uIHB1
cnBvc2VzLgoKICAgSU5URUdFUl9UWVBFIGFuZCBSRUFMX1RZUEUgbm9kZXMgZm9yIHRoZSBz
dGFuZGFyZCBkYXRhIHR5cGVzLgoKCXRyZWUgc2hvcnRfaW50ZWdlcl90eXBlX25vZGU7Cgl0
cmVlIGxvbmdfaW50ZWdlcl90eXBlX25vZGU7Cgl0cmVlIGxvbmdfbG9uZ19pbnRlZ2VyX3R5
cGVfbm9kZTsKCgl0cmVlIHNob3J0X3Vuc2lnbmVkX3R5cGVfbm9kZTsKCXRyZWUgbG9uZ191
bnNpZ25lZF90eXBlX25vZGU7Cgl0cmVlIGxvbmdfbG9uZ191bnNpZ25lZF90eXBlX25vZGU7
CgoJdHJlZSBib29sZWFuX3R5cGVfbm9kZTsKCXRyZWUgYm9vbGVhbl9mYWxzZV9ub2RlOwoJ
dHJlZSBib29sZWFuX3RydWVfbm9kZTsKCgl0cmVlIHB0cmRpZmZfdHlwZV9ub2RlOwoKCXRy
ZWUgdW5zaWduZWRfY2hhcl90eXBlX25vZGU7Cgl0cmVlIHNpZ25lZF9jaGFyX3R5cGVfbm9k
ZTsKCXRyZWUgd2NoYXJfdHlwZV9ub2RlOwoJdHJlZSBzaWduZWRfd2NoYXJfdHlwZV9ub2Rl
OwoJdHJlZSB1bnNpZ25lZF93Y2hhcl90eXBlX25vZGU7CgoJdHJlZSBmbG9hdF90eXBlX25v
ZGU7Cgl0cmVlIGRvdWJsZV90eXBlX25vZGU7Cgl0cmVlIGxvbmdfZG91YmxlX3R5cGVfbm9k
ZTsKCgl0cmVlIGNvbXBsZXhfaW50ZWdlcl90eXBlX25vZGU7Cgl0cmVlIGNvbXBsZXhfZmxv
YXRfdHlwZV9ub2RlOwoJdHJlZSBjb21wbGV4X2RvdWJsZV90eXBlX25vZGU7Cgl0cmVlIGNv
bXBsZXhfbG9uZ19kb3VibGVfdHlwZV9ub2RlOwoKCXRyZWUgaW50UUlfdHlwZV9ub2RlOwoJ
dHJlZSBpbnRISV90eXBlX25vZGU7Cgl0cmVlIGludFNJX3R5cGVfbm9kZTsKCXRyZWUgaW50
RElfdHlwZV9ub2RlOwoJdHJlZSBpbnRUSV90eXBlX25vZGU7CgoJdHJlZSB1bnNpZ25lZF9p
bnRRSV90eXBlX25vZGU7Cgl0cmVlIHVuc2lnbmVkX2ludEhJX3R5cGVfbm9kZTsKCXRyZWUg
dW5zaWduZWRfaW50U0lfdHlwZV9ub2RlOwoJdHJlZSB1bnNpZ25lZF9pbnRESV90eXBlX25v
ZGU7Cgl0cmVlIHVuc2lnbmVkX2ludFRJX3R5cGVfbm9kZTsKCgl0cmVlIHdpZGVzdF9pbnRl
Z2VyX2xpdGVyYWxfdHlwZV9ub2RlOwoJdHJlZSB3aWRlc3RfdW5zaWduZWRfbGl0ZXJhbF90
eXBlX25vZGU7CgogICBOb2RlcyBmb3IgdHlwZXMgYHZvaWQgKicgYW5kIGBjb25zdCB2b2lk
IConLgoKCXRyZWUgcHRyX3R5cGVfbm9kZSwgY29uc3RfcHRyX3R5cGVfbm9kZTsKCiAgIE5v
ZGVzIGZvciB0eXBlcyBgY2hhciAqJyBhbmQgYGNvbnN0IGNoYXIgKicuCgoJdHJlZSBzdHJp
bmdfdHlwZV9ub2RlLCBjb25zdF9zdHJpbmdfdHlwZV9ub2RlOwoKICAgVHlwZSBgY2hhcltT
T01FTlVNQkVSXScuCiAgIFVzZWQgd2hlbiBhbiBhcnJheSBvZiBjaGFyIGlzIG5lZWRlZCBh
bmQgdGhlIHNpemUgaXMgaXJyZWxldmFudC4KCgl0cmVlIGNoYXJfYXJyYXlfdHlwZV9ub2Rl
OwoKICAgVHlwZSBgaW50W1NPTUVOVU1CRVJdJyBvciBzb21ldGhpbmcgbGlrZSBpdC4KICAg
VXNlZCB3aGVuIGFuIGFycmF5IG9mIGludCBuZWVkZWQgYW5kIHRoZSBzaXplIGlzIGlycmVs
ZXZhbnQuCgoJdHJlZSBpbnRfYXJyYXlfdHlwZV9ub2RlOwoKICAgVHlwZSBgd2NoYXJfdFtT
T01FTlVNQkVSXScgb3Igc29tZXRoaW5nIGxpa2UgaXQuCiAgIFVzZWQgd2hlbiBhIHdpZGUg
c3RyaW5nIGxpdGVyYWwgaXMgY3JlYXRlZC4KCgl0cmVlIHdjaGFyX2FycmF5X3R5cGVfbm9k
ZTsKCiAgIFR5cGUgYGludCAoKScgLS0gdXNlZCBmb3IgaW1wbGljaXQgZGVjbGFyYXRpb24g
b2YgZnVuY3Rpb25zLgoKCXRyZWUgZGVmYXVsdF9mdW5jdGlvbl90eXBlOwoKICAgQSBWT0lE
X1RZUEUgbm9kZSwgcGFja2FnZWQgaW4gYSBUUkVFX0xJU1QuCgoJdHJlZSB2b2lkX2xpc3Rf
bm9kZTsKCiAgVGhlIGxhemlseSBjcmVhdGVkIFZBUl9ERUNMcyBmb3IgX19GVU5DVElPTl9f
LCBfX1BSRVRUWV9GVU5DVElPTl9fLAogIGFuZCBfX2Z1bmNfXy4gKEMgZG9lc24ndCBnZW5l
cmF0ZSBfX0ZVTkNUSU9OX18gYW5kX19QUkVUVFlfRlVOQ1RJT05fXwogIFZBUl9ERUNMUywg
YnV0IEMrKyBkb2VzLikKCgl0cmVlIGZ1bmN0aW9uX25hbWVfZGVjbF9ub2RlOwoJdHJlZSBw
cmV0dHlfZnVuY3Rpb25fbmFtZV9kZWNsX25vZGU7Cgl0cmVlIGM5OV9mdW5jdGlvbl9uYW1l
X2RlY2xfbm9kZTsKCiAgU3RhY2sgb2YgbmVzdGVkIGZ1bmN0aW9uIG5hbWUgVkFSX0RFQ0xz
LgoKCXRyZWUgc2F2ZWRfZnVuY3Rpb25fbmFtZV9kZWNsczsKCiovCgp0cmVlIGNfZ2xvYmFs
X3RyZWVzW0NUSV9NQVhdOwoKLyogVFJVRSBpZiBhIGNvZGUgcmVwcmVzZW50cyBhIHN0YXRl
bWVudC4gIFRoZSBmcm9udCBlbmQgaW5pdAogICBsYW5naG9vayBzaG91bGQgdGFrZSBjYXJl
IG9mIGluaXRpYWxpemF0aW9uIG9mIHRoaXMgYXJyYXkuICAqLwoKYm9vbCBzdGF0ZW1lbnRf
Y29kZV9wW01BWF9UUkVFX0NPREVTXTsKCi8qIE5vbnplcm8gaWYgd2UgY2FuIHJlYWQgYSBQ
Q0ggZmlsZSBub3cuICAqLwoKaW50IGFsbG93X3BjaCA9IDE7CgwKLyogU3dpdGNoZXMgY29t
bW9uIHRvIHRoZSBDIGZyb250IGVuZHMuICAqLwoKLyogTm9uemVybyBpZiBwcmVwcmVwcm9j
ZXNzaW5nIG9ubHkuICAqLwoKaW50IGZsYWdfcHJlcHJvY2Vzc19vbmx5OwoKLyogTm9uemVy
byBtZWFucyBkb24ndCBvdXRwdXQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24uICAqLwoKY2hh
ciBmbGFnX25vX2xpbmVfY29tbWFuZHM7CgovKiBOb256ZXJvIGNhdXNlcyAtRSBvdXRwdXQg
bm90IHRvIGJlIGRvbmUsIGJ1dCBkaXJlY3RpdmVzIHN1Y2ggYXMKICAgI2RlZmluZSB0aGF0
IGhhdmUgc2lkZSBlZmZlY3RzIGFyZSBzdGlsbCBvYmV5ZWQuICAqLwoKY2hhciBmbGFnX25v
X291dHB1dDsKCi8qIE5vbnplcm8gbWVhbnMgZHVtcCBtYWNyb3MgaW4gc29tZSBmYXNoaW9u
LiAgKi8KCmNoYXIgZmxhZ19kdW1wX21hY3JvczsKCi8qIE5vbnplcm8gbWVhbnMgcGFzcyAj
aW5jbHVkZSBsaW5lcyB0aHJvdWdoIHRvIHRoZSBvdXRwdXQuICAqLwoKY2hhciBmbGFnX2R1
bXBfaW5jbHVkZXM7CgovKiBUaGUgZmlsZSBuYW1lIHRvIHdoaWNoIHdlIHNob3VsZCB3cml0
ZSBhIHByZWNvbXBpbGVkIGhlYWRlciwgb3IKICAgTlVMTCBpZiBubyBoZWFkZXIgd2lsbCBi
ZSB3cml0dGVuIGluIHRoaXMgY29tcGlsZS4gICovCgpjb25zdCBjaGFyICpwY2hfZmlsZTsK
Ci8qIE5vbnplcm8gaWYgYW4gSVNPIHN0YW5kYXJkIHdhcyBzZWxlY3RlZC4gIEl0IHJlamVj
dHMgbWFjcm9zIGluIHRoZQogICB1c2VyJ3MgbmFtZXNwYWNlLiAgKi8KaW50IGZsYWdfaXNv
OwoKLyogTm9uemVybyBpZiAtdW5kZWYgd2FzIGdpdmVuLiAgSXQgc3VwcHJlc3NlcyB0YXJn
ZXQgYnVpbHQtaW4gbWFjcm9zCiAgIGFuZCBhc3NlcnRpb25zLiAgKi8KaW50IGZsYWdfdW5k
ZWY7CgovKiBOb256ZXJvIG1lYW5zIGRvbid0IHJlY29nbml6ZSB0aGUgbm9uLUFOU0kgYnVp
bHRpbiBmdW5jdGlvbnMuICAqLwoKaW50IGZsYWdfbm9fYnVpbHRpbjsKCi8qIE5vbnplcm8g
bWVhbnMgZG9uJ3QgcmVjb2duaXplIHRoZSBub24tQU5TSSBidWlsdGluIGZ1bmN0aW9ucy4K
ICAgLWFuc2kgc2V0cyB0aGlzLiAgKi8KCmludCBmbGFnX25vX25vbmFuc2lfYnVpbHRpbjsK
Ci8qIE5vbnplcm8gbWVhbnMgZ2l2ZSBgZG91YmxlJyB0aGUgc2FtZSBzaXplIGFzIGBmbG9h
dCcuICAqLwoKaW50IGZsYWdfc2hvcnRfZG91YmxlOwoKLyogTm9uemVybyBtZWFucyBnaXZl
IGB3Y2hhcl90JyB0aGUgc2FtZSBzaXplIGFzIGBzaG9ydCcuICAqLwoKaW50IGZsYWdfc2hv
cnRfd2NoYXI7CgovKiBOb256ZXJvIG1lYW5zIGFsbG93IE1pY3Jvc29mdCBleHRlbnNpb25z
IHdpdGhvdXQgd2FybmluZ3Mgb3IgZXJyb3JzLiAgKi8KaW50IGZsYWdfbXNfZXh0ZW5zaW9u
czsKCi8qIE5vbnplcm8gbWVhbnMgZG9uJ3QgcmVjb2duaXplIHRoZSBrZXl3b3JkIGBhc20n
LiAgKi8KCmludCBmbGFnX25vX2FzbTsKCi8qIE5vbnplcm8gbWVhbnMgZ2l2ZSBzdHJpbmcg
Y29uc3RhbnRzIHRoZSB0eXBlIGBjb25zdCBjaGFyIConLCBhcyBtYW5kYXRlZAogICBieSB0
aGUgc3RhbmRhcmQuICAqLwoKaW50IGZsYWdfY29uc3Rfc3RyaW5nczsKCi8qIE5vbnplcm8g
bWVhbnMgdG8gdHJlYXQgYml0ZmllbGRzIGFzIHNpZ25lZCB1bmxlc3MgdGhleSBzYXkgYHVu
c2lnbmVkJy4gICovCgppbnQgZmxhZ19zaWduZWRfYml0ZmllbGRzID0gMTsKaW50IGV4cGxp
Y2l0X2ZsYWdfc2lnbmVkX2JpdGZpZWxkczsKCi8qIE5vbnplcm8gbWVhbnMgd2FybiBhYm91
dCBwb2ludGVyIGNhc3RzIHRoYXQgY2FuIGRyb3AgYSB0eXBlIHF1YWxpZmllcgogICBmcm9t
IHRoZSBwb2ludGVyIHRhcmdldCB0eXBlLiAgKi8KCmludCB3YXJuX2Nhc3RfcXVhbDsKCi8q
IFdhcm4gYWJvdXQgZnVuY3Rpb25zIHdoaWNoIG1pZ2h0IGJlIGNhbmRpZGF0ZXMgZm9yIGZv
cm1hdCBhdHRyaWJ1dGVzLiAgKi8KCmludCB3YXJuX21pc3NpbmdfZm9ybWF0X2F0dHJpYnV0
ZTsKCi8qIE5vbnplcm8gbWVhbnMgd2FybiBhYm91dCBzaXplb2YoZnVuY3Rpb24pIG9yIGFk
ZGl0aW9uL3N1YnRyYWN0aW9uCiAgIG9mIGZ1bmN0aW9uIHBvaW50ZXJzLiAgKi8KCmludCB3
YXJuX3BvaW50ZXJfYXJpdGg7CgovKiBOb256ZXJvIG1lYW5zIHdhcm4gZm9yIGFueSBnbG9i
YWwgZnVuY3Rpb24gZGVmCiAgIHdpdGhvdXQgc2VwYXJhdGUgcHJldmlvdXMgcHJvdG90eXBl
IGRlY2wuICAqLwoKaW50IHdhcm5fbWlzc2luZ19wcm90b3R5cGVzOwoKLyogV2FybiBpZiBh
ZGRpbmcgKCkgaXMgc3VnZ2VzdGVkLiAgKi8KCmludCB3YXJuX3BhcmVudGhlc2VzOwoKLyog
V2FybiBpZiBpbml0aWFsaXplciBpcyBub3QgY29tcGxldGVseSBicmFja2V0ZWQuICAqLwoK
aW50IHdhcm5fbWlzc2luZ19icmFjZXM7CgovKiBXYXJuIGFib3V0IGNvbXBhcmlzb24gb2Yg
c2lnbmVkIGFuZCB1bnNpZ25lZCB2YWx1ZXMuCiAgIElmIC0xLCBuZWl0aGVyIC1Xc2lnbi1j
b21wYXJlIG5vciAtV25vLXNpZ24tY29tcGFyZSBoYXMgYmVlbiBzcGVjaWZpZWQKICAgKGlu
IHdoaWNoIGNhc2UgLVdleHRyYSBnZXRzIHRvIGRlY2lkZSkuICAqLwoKaW50IHdhcm5fc2ln
bl9jb21wYXJlID0gLTE7CgovKiBOb256ZXJvIG1lYW5zIHdhcm4gYWJvdXQgdXNhZ2Ugb2Yg
bG9uZyBsb25nIHdoZW4gYC1wZWRhbnRpYycuICAqLwoKaW50IHdhcm5fbG9uZ19sb25nID0g
MTsKCi8qIE5vbnplcm8gbWVhbnMgd2FybiBhYm91dCBkZXByZWNhdGVkIGNvbnZlcnNpb24g
ZnJvbSBzdHJpbmcgY29uc3RhbnQgdG8KICAgYGNoYXIgKicuICAqLwoKaW50IHdhcm5fd3Jp
dGVfc3RyaW5nczsKCi8qIE5vbnplcm8gbWVhbnMgd2FybiBhYm91dCBtdWx0aXBsZSAocmVk
dW5kYW50KSBkZWNscyBmb3IgdGhlIHNhbWUgc2luZ2xlCiAgIHZhcmlhYmxlIG9yIGZ1bmN0
aW9uLiAgKi8KCmludCB3YXJuX3JlZHVuZGFudF9kZWNsczsKCi8qIFdhcm4gYWJvdXQgdGVz
dGluZyBlcXVhbGl0eSBvZiBmbG9hdGluZyBwb2ludCBudW1iZXJzLiAgKi8KCmludCB3YXJu
X2Zsb2F0X2VxdWFsOwoKLyogV2FybiBhYm91dCBhIHN1YnNjcmlwdCB0aGF0IGhhcyB0eXBl
IGNoYXIuICAqLwoKaW50IHdhcm5fY2hhcl9zdWJzY3JpcHRzOwoKLyogV2FybiBpZiBhIHR5
cGUgY29udmVyc2lvbiBpcyBkb25lIHRoYXQgbWlnaHQgaGF2ZSBjb25mdXNpbmcgcmVzdWx0
cy4gICovCgppbnQgd2Fybl9jb252ZXJzaW9uOwoKLyogV2FybiBhYm91dCAjcHJhZ21hIGRp
cmVjdGl2ZXMgdGhhdCBhcmUgbm90IHJlY29nbml6ZWQuICAqLwoKaW50IHdhcm5fdW5rbm93
bl9wcmFnbWFzOyAvKiBUcmkgc3RhdGUgdmFyaWFibGUuICAqLwoKLyogV2FybiBhYm91dCBm
b3JtYXQvYXJndW1lbnQgYW5vbWFsaWVzIGluIGNhbGxzIHRvIGZvcm1hdHRlZCBJL08gZnVu
Y3Rpb25zCiAgICgqcHJpbnRmLCAqc2NhbmYsIHN0cmZ0aW1lLCBzdHJmbW9uLCBldGMuKS4g
ICovCgppbnQgd2Fybl9mb3JtYXQ7CgovKiBXYXJuIGFib3V0IFkySyBwcm9ibGVtcyB3aXRo
IHN0cmZ0aW1lIGZvcm1hdHMuICAqLwoKaW50IHdhcm5fZm9ybWF0X3kyazsKCi8qIFdhcm4g
YWJvdXQgZXhjZXNzIGFyZ3VtZW50cyB0byBmb3JtYXRzLiAgKi8KCmludCB3YXJuX2Zvcm1h
dF9leHRyYV9hcmdzOwoKLyogV2FybiBhYm91dCB6ZXJvLWxlbmd0aCBmb3JtYXRzLiAgKi8K
CmludCB3YXJuX2Zvcm1hdF96ZXJvX2xlbmd0aDsKCi8qIFdhcm4gYWJvdXQgbm9uLWxpdGVy
YWwgZm9ybWF0IGFyZ3VtZW50cy4gICovCgppbnQgd2Fybl9mb3JtYXRfbm9ubGl0ZXJhbDsK
Ci8qIFdhcm4gYWJvdXQgcG9zc2libGUgc2VjdXJpdHkgcHJvYmxlbXMgd2l0aCBjYWxscyB0
byBmb3JtYXQgZnVuY3Rpb25zLiAgKi8KCmludCB3YXJuX2Zvcm1hdF9zZWN1cml0eTsKCgov
KiBDL09iakMgbGFuZ3VhZ2Ugb3B0aW9uIHZhcmlhYmxlcy4gICovCgoKLyogTm9uemVybyBt
ZWFucyBtZXNzYWdlIGFib3V0IHVzZSBvZiBpbXBsaWNpdCBmdW5jdGlvbiBkZWNsYXJhdGlv
bnM7CiAxIG1lYW5zIHdhcm5pbmc7IDIgbWVhbnMgZXJyb3IuICAqLwoKaW50IG1lc2dfaW1w
bGljaXRfZnVuY3Rpb25fZGVjbGFyYXRpb24gPSAtMTsKCi8qIE5vbnplcm8gbWVhbnMgYWxs
b3cgdHlwZSBtaXNtYXRjaGVzIGluIGNvbmRpdGlvbmFsIGV4cHJlc3Npb25zOwogICBqdXN0
IG1ha2UgdGhlaXIgdmFsdWVzIGB2b2lkJy4gICovCgppbnQgZmxhZ19jb25kX21pc21hdGNo
OwoKLyogTm9uemVybyBtZWFucyBlbmFibGUgQzg5IEFtZW5kbWVudCAxIGZlYXR1cmVzLiAg
Ki8KCmludCBmbGFnX2lzb2M5NDsKCi8qIE5vbnplcm8gbWVhbnMgdXNlIHRoZSBJU08gQzk5
IGRpYWxlY3Qgb2YgQy4gICovCgppbnQgZmxhZ19pc29jOTk7CgovKiBOb256ZXJvIG1lYW5z
IHRoYXQgd2UgaGF2ZSBidWlsdGluIGZ1bmN0aW9ucywgYW5kIG1haW4gaXMgYW4gaW50ICov
CgppbnQgZmxhZ19ob3N0ZWQgPSAxOwoKLyogTm9uemVybyBtZWFucyBhZGQgZGVmYXVsdCBm
b3JtYXRfYXJnIGF0dHJpYnV0ZXMgZm9yIGZ1bmN0aW9ucyBub3QKICAgaW4gSVNPIEMuICAq
LwoKaW50IGZsYWdfbm9uaXNvX2RlZmF1bHRfZm9ybWF0X2F0dHJpYnV0ZXMgPSAxOwoKLyog
Tm9uemVybyBtZWFucyB3YXJuIHdoZW4gY2FzdGluZyBhIGZ1bmN0aW9uIGNhbGwgdG8gYSB0
eXBlIHRoYXQgZG9lcwogICBub3QgbWF0Y2ggdGhlIHJldHVybiB0eXBlIChlLmcuIChmbG9h
dClzcXJ0KCkgb3IgKGFueXRoaW5nKiltYWxsb2MoKQogICB3aGVuIHRoZXJlIGlzIG5vIHBy
ZXZpb3VzIGRlY2xhcmF0aW9uIG9mIHNxcnQgb3IgbWFsbG9jLiAgKi8KCmludCB3YXJuX2Jh
ZF9mdW5jdGlvbl9jYXN0OwoKLyogV2FybiBhYm91dCB0cmFkaXRpb25hbCBjb25zdHJ1Y3Rz
IHdob3NlIG1lYW5pbmdzIGNoYW5nZWQgaW4gQU5TSSBDLiAgKi8KCmludCB3YXJuX3RyYWRp
dGlvbmFsOwoKLyogTm9uemVybyBtZWFucyB3YXJuIGZvciBub24tcHJvdG90eXBlIGZ1bmN0
aW9uIGRlY2xzCiAgIG9yIG5vbi1wcm90b3R5cGVkIGRlZnMgd2l0aG91dCBwcmV2aW91cyBw
cm90b3R5cGUuICAqLwoKaW50IHdhcm5fc3RyaWN0X3Byb3RvdHlwZXM7CgovKiBOb256ZXJv
IG1lYW5zIHdhcm4gZm9yIGFueSBnbG9iYWwgZnVuY3Rpb24gZGVmCiAgIHdpdGhvdXQgc2Vw
YXJhdGUgcHJldmlvdXMgZGVjbC4gICovCgppbnQgd2Fybl9taXNzaW5nX2RlY2xhcmF0aW9u
czsKCi8qIE5vbnplcm8gbWVhbnMgd2FybiBhYm91dCBkZWNsYXJhdGlvbnMgb2Ygb2JqZWN0
cyBub3QgYXQKICAgZmlsZS1zY29wZSBsZXZlbCBhbmQgYWJvdXQgKmFsbCogZGVjbGFyYXRp
b25zIG9mIGZ1bmN0aW9ucyAod2hldGhlcgogICBvciBzdGF0aWMpIG5vdCBhdCBmaWxlLXNj
b3BlIGxldmVsLiAgTm90ZSB0aGF0IHdlIGV4Y2x1ZGUKICAgaW1wbGljaXQgZnVuY3Rpb24g
ZGVjbGFyYXRpb25zLiAgVG8gZ2V0IHdhcm5pbmdzIGFib3V0IHRob3NlLCB1c2UKICAgLVdp
bXBsaWNpdC4gICovCgppbnQgd2Fybl9uZXN0ZWRfZXh0ZXJuczsKCi8qIFdhcm4gaWYgbWFp
biBpcyBzdXNwaWNpb3VzLiAgKi8KCmludCB3YXJuX21haW47CgovKiBOb256ZXJvIG1lYW5z
IHdhcm4gYWJvdXQgcG9zc2libGUgdmlvbGF0aW9ucyBvZiBzZXF1ZW5jZSBwb2ludCBydWxl
cy4gICovCgppbnQgd2Fybl9zZXF1ZW5jZV9wb2ludDsKCi8qIE5vbnplcm8gbWVhbnMgdG8g
d2FybiBhYm91dCBjb21waWxlLXRpbWUgZGl2aXNpb24gYnkgemVyby4gICovCmludCB3YXJu
X2Rpdl9ieV96ZXJvID0gMTsKCi8qIE5vbnplcm8gbWVhbnMgd2FybiBhYm91dCB1c2Ugb2Yg
aW1wbGljaXQgaW50LiAgKi8KCmludCB3YXJuX2ltcGxpY2l0X2ludDsKCi8qIFdhcm4gYWJv
dXQgTlVMTCBiZWluZyBwYXNzZWQgdG8gYXJndW1lbnQgc2xvdHMgbWFya2VkIGFzIHJlcXVp
cmluZwogICBub24tTlVMTC4gICovCgppbnQgd2Fybl9ub25udWxsOwoKCi8qIE9iakMgbGFu
Z3VhZ2Ugb3B0aW9uIHZhcmlhYmxlcy4gICovCgoKLyogT3BlbiBhbmQgY2xvc2UgdGhlIGZp
bGUgZm9yIG91dHB1dHRpbmcgY2xhc3MgZGVjbGFyYXRpb25zLCBpZgogICByZXF1ZXN0ZWQg
KE9iakMpLiAgKi8KCmludCBmbGFnX2dlbl9kZWNsYXJhdGlvbjsKCi8qIEdlbmVyYXRlIGNv
ZGUgZm9yIEdOVSBvciBOZVhUIHJ1bnRpbWUgZW52aXJvbm1lbnQuICAqLwoKI2lmZGVmIE5F
WFRfT0JKQ19SVU5USU1FCmludCBmbGFnX25leHRfcnVudGltZSA9IDE7CiNlbHNlCmludCBm
bGFnX25leHRfcnVudGltZSA9IDA7CiNlbmRpZgoKLyogVGVsbHMgdGhlIGNvbXBpbGVyIHRo
YXQgdGhpcyBpcyBhIHNwZWNpYWwgcnVuLiAgRG8gbm90IHBlcmZvcm0gYW55CiAgIGNvbXBp
bGluZywgaW5zdGVhZCB3ZSBhcmUgdG8gdGVzdCBzb21lIHBsYXRmb3JtIGRlcGVuZGVudCBm
ZWF0dXJlcwogICBhbmQgb3V0cHV0IGEgQyBoZWFkZXIgZmlsZSB3aXRoIGFwcHJvcHJpYXRl
IGRlZmluaXRpb25zLiAgKi8KCmludCBwcmludF9zdHJ1Y3RfdmFsdWVzOwoKLyogPz8/LiAg
VW5kb2N1bWVudGVkLiAgKi8KCmNvbnN0IGNoYXIgKmNvbnN0YW50X3N0cmluZ19jbGFzc19u
YW1lOwoKLyogV2FybiBpZiBtdWx0aXBsZSBtZXRob2RzIGFyZSBzZWVuIGZvciB0aGUgc2Ft
ZSBzZWxlY3RvciwgYnV0IHdpdGgKICAgZGlmZmVyZW50IGFyZ3VtZW50IHR5cGVzLiAgUGVy
Zm9ybXMgdGhlIGNoZWNrIG9uIHRoZSB3aG9sZSBzZWxlY3RvcgogICB0YWJsZSBhdCB0aGUg
ZW5kIG9mIGNvbXBpbGF0aW9uLiAgKi8KCmludCB3YXJuX3NlbGVjdG9yOwoKLyogV2FybiBp
ZiBhIEBzZWxlY3RvcigpIGlzIGZvdW5kLCBhbmQgbm8gbWV0aG9kIHdpdGggdGhhdCBzZWxl
Y3RvcgogICBoYXMgYmVlbiBwcmV2aW91c2x5IGRlY2xhcmVkLiAgVGhlIGNoZWNrIGlzIGRv
bmUgb24gZWFjaAogICBAc2VsZWN0b3IoKSBhcyBzb29uIGFzIGl0IGlzIGZvdW5kIC0gc28g
aXQgd2FybnMgYWJvdXQgZm9yd2FyZAogICBkZWNsYXJhdGlvbnMuICAqLwoKaW50IHdhcm5f
dW5kZWNsYXJlZF9zZWxlY3RvcjsKCi8qIFdhcm4gaWYgbWV0aG9kcyByZXF1aXJlZCBieSBh
IHByb3RvY29sIGFyZSBub3QgaW1wbGVtZW50ZWQgaW4gdGhlCiAgIGNsYXNzIGFkb3B0aW5n
IGl0LiAgV2hlbiB0dXJuZWQgb2ZmLCBtZXRob2RzIGluaGVyaXRlZCB0byB0aGF0CiAgIGNs
YXNzIGFyZSBhbHNvIGNvbnNpZGVyZWQgaW1wbGVtZW50ZWQuICAqLwoKaW50IHdhcm5fcHJv
dG9jb2wgPSAxOwoKCi8qIEMrKyBsYW5ndWFnZSBvcHRpb24gdmFyaWFibGVzLiAgKi8KCgov
KiBOb256ZXJvIG1lYW5zIGRvbid0IHJlY29nbml6ZSBhbnkgZXh0ZW5zaW9uIGtleXdvcmRz
LiAgKi8KCmludCBmbGFnX25vX2dudV9rZXl3b3JkczsKCi8qIE5vbnplcm8gbWVhbnMgZG8g
ZW1pdCBleHBvcnRlZCBpbXBsZW1lbnRhdGlvbnMgb2YgZnVuY3Rpb25zIGV2ZW4gaWYKICAg
dGhleSBjYW4gYmUgaW5saW5lZC4gICovCgppbnQgZmxhZ19pbXBsZW1lbnRfaW5saW5lcyA9
IDE7CgovKiBOb256ZXJvIG1lYW5zIGRvIGVtaXQgZXhwb3J0ZWQgaW1wbGVtZW50YXRpb25z
IG9mIHRlbXBsYXRlcywgaW5zdGVhZCBvZgogICBtdWx0aXBsZSBzdGF0aWMgY29waWVzIGlu
IGVhY2ggZmlsZSB0aGF0IG5lZWRzIGEgZGVmaW5pdGlvbi4gICovCgppbnQgZmxhZ19leHRl
cm5hbF90ZW1wbGF0ZXM7CgovKiBOb256ZXJvIG1lYW5zIHRoYXQgdGhlIGRlY2lzaW9uIHRv
IGVtaXQgb3Igbm90IGVtaXQgdGhlIGltcGxlbWVudGF0aW9uIG9mIGEKICAgdGVtcGxhdGUg
ZGVwZW5kcyBvbiB3aGVyZSB0aGUgdGVtcGxhdGUgaXMgaW5zdGFudGlhdGVkLCByYXRoZXIg
dGhhbiB3aGVyZQogICBpdCBpcyBkZWZpbmVkLiAgKi8KCmludCBmbGFnX2FsdF9leHRlcm5h
bF90ZW1wbGF0ZXM7CgovKiBOb256ZXJvIG1lYW5zIHRoYXQgaW1wbGljaXQgaW5zdGFudGlh
dGlvbnMgd2lsbCBiZSBlbWl0dGVkIGlmIG5lZWRlZC4gICovCgppbnQgZmxhZ19pbXBsaWNp
dF90ZW1wbGF0ZXMgPSAxOwoKLyogTm9uemVybyBtZWFucyB0aGF0IGltcGxpY2l0IGluc3Rh
bnRpYXRpb25zIG9mIGlubGluZSB0ZW1wbGF0ZXMgd2lsbCBiZQogICBlbWl0dGVkIGlmIG5l
ZWRlZCwgZXZlbiBpZiBpbnN0YW50aWF0aW9ucyBvZiBub24taW5saW5lIHRlbXBsYXRlcwog
ICBhcmVuJ3QuICAqLwoKaW50IGZsYWdfaW1wbGljaXRfaW5saW5lX3RlbXBsYXRlcyA9IDE7
CgovKiBOb256ZXJvIG1lYW5zIGdlbmVyYXRlIHNlcGFyYXRlIGluc3RhbnRpYXRpb24gY29u
dHJvbCBmaWxlcyBhbmQKICAganVnZ2xlIHRoZW0gYXQgbGluayB0aW1lLiAgKi8KCmludCBm
bGFnX3VzZV9yZXBvc2l0b3J5OwoKLyogTm9uemVybyBpZiB3ZSB3YW50IHRvIGlzc3VlIGRp
YWdub3N0aWNzIHRoYXQgdGhlIHN0YW5kYXJkIHNheXMgYXJlIG5vdAogICByZXF1aXJlZC4g
ICovCgppbnQgZmxhZ19vcHRpb25hbF9kaWFncyA9IDE7CgovKiBOb256ZXJvIG1lYW5zIHdl
IHNob3VsZCBhdHRlbXB0IHRvIGVsaWRlIGNvbnN0cnVjdG9ycyB3aGVuIHBvc3NpYmxlLiAg
Ki8KCmludCBmbGFnX2VsaWRlX2NvbnN0cnVjdG9ycyA9IDE7CgovKiBOb256ZXJvIG1lYW5z
IHRoYXQgbWVtYmVyIGZ1bmN0aW9ucyBkZWZpbmVkIGluIGNsYXNzIHNjb3BlIGFyZQogICBp
bmxpbmUgYnkgZGVmYXVsdC4gICovCgppbnQgZmxhZ19kZWZhdWx0X2lubGluZSA9IDE7Cgov
KiBDb250cm9scyB3aGV0aGVyIGNvbXBpbGVyIGdlbmVyYXRlcyAndHlwZSBkZXNjcmlwdG9y
JyB0aGF0IGdpdmUKICAgcnVuLXRpbWUgdHlwZSBpbmZvcm1hdGlvbi4gICovCgppbnQgZmxh
Z19ydHRpID0gMTsKCi8qIE5vbnplcm8gaWYgd2Ugd2FudCB0byBjb25zZXJ2ZSBzcGFjZSBp
biB0aGUgLm8gZmlsZXMuICBXZSBkbyB0aGlzCiAgIGJ5IHB1dHRpbmcgdW5pbml0aWFsaXpl
ZCBkYXRhIGFuZCBydW50aW1lIGluaXRpYWxpemVkIGRhdGEgaW50bwogICAuY29tbW9uIGlu
c3RlYWQgb2YgLmRhdGEgYXQgdGhlIGV4cGVuc2Ugb2Ygbm90IGZsYWdnaW5nIG11bHRpcGxl
CiAgIGRlZmluaXRpb25zLiAgKi8KCmludCBmbGFnX2NvbnNlcnZlX3NwYWNlOwoKLyogTm9u
emVybyBpZiB3ZSB3YW50IHRvIG9iZXkgYWNjZXNzIGNvbnRyb2wgc2VtYW50aWNzLiAgKi8K
CmludCBmbGFnX2FjY2Vzc19jb250cm9sID0gMTsKCi8qIE5vbnplcm8gaWYgd2Ugd2FudCB0
byBjaGVjayB0aGUgcmV0dXJuIHZhbHVlIG9mIG5ldyBhbmQgYXZvaWQgY2FsbGluZwogICBj
b25zdHJ1Y3RvcnMgaWYgaXQgaXMgYSBudWxsIHBvaW50ZXIuICAqLwoKaW50IGZsYWdfY2hl
Y2tfbmV3OwoKLyogTm9uemVybyBpZiB3ZSB3YW50IHRoZSBuZXcgSVNPIHJ1bGVzIGZvciBw
dXNoaW5nIGEgbmV3IHNjb3BlIGZvciBgZm9yJwogICBpbml0aWFsaXphdGlvbiB2YXJpYWJs
ZXMuCiAgIDA6IE9sZCBydWxlcywgc2V0IGJ5IC1mbm8tZm9yLXNjb3BlLgogICAyOiBOZXcg
SVNPIHJ1bGVzLCBzZXQgYnkgLWZmb3Itc2NvcGUuCiAgIDE6IFRyeSB0byBpbXBsZW1lbnQg
bmV3IElTTyBydWxlcywgYnV0IHdpdGggYmFja3VwIGNvbXBhdGliaWxpdHkKICAgKGFuZCB3
YXJuaW5ncykuICBUaGlzIGlzIHRoZSBkZWZhdWx0LCBmb3Igbm93LiAgKi8KCmludCBmbGFn
X25ld19mb3Jfc2NvcGUgPSAxOwoKLyogTm9uemVybyBpZiB3ZSB3YW50IHRvIGVtaXQgZGVm
aW5lZCBzeW1ib2xzIHdpdGggY29tbW9uLWxpa2UgbGlua2FnZSBhcwogICB3ZWFrIHN5bWJv
bHMgd2hlcmUgcG9zc2libGUsIGluIG9yZGVyIHRvIGNvbmZvcm0gdG8gQysrIHNlbWFudGlj
cy4KICAgT3RoZXJ3aXNlLCBlbWl0IHRoZW0gYXMgbG9jYWwgc3ltYm9scy4gICovCgppbnQg
ZmxhZ193ZWFrID0gMTsKCi8qIE5vbnplcm8gdG8gdXNlIF9fY3hhX2F0ZXhpdCwgcmF0aGVy
IHRoYW4gYXRleGl0LCB0byByZWdpc3RlcgogICBkZXN0cnVjdG9ycyBmb3IgbG9jYWwgc3Rh
dGljcyBhbmQgZ2xvYmFsIG9iamVjdHMuICAqLwoKaW50IGZsYWdfdXNlX2N4YV9hdGV4aXQg
PSBERUZBVUxUX1VTRV9DWEFfQVRFWElUOwoKLyogTm9uemVybyBtZWFucyBvdXRwdXQgLnZ0
YWJsZV97ZW50cnksaW5oZXJpdH0gZm9yIHVzZSBpbiBkb2luZyB2dGFibGUgZ2MuICAqLwoK
aW50IGZsYWdfdnRhYmxlX2djOwoKLyogTm9uemVybyBtZWFucyBtYWtlIHRoZSBkZWZhdWx0
IHBlZHdhcm5zIHdhcm5pbmdzIGluc3RlYWQgb2YgZXJyb3JzLgogICBUaGUgdmFsdWUgb2Yg
dGhpcyBmbGFnIGlzIGlnbm9yZWQgaWYgLXBlZGFudGljIGlzIHNwZWNpZmllZC4gICovCgpp
bnQgZmxhZ19wZXJtaXNzaXZlOwoKLyogTm9uemVybyBtZWFucyB0byBpbXBsZW1lbnQgc3Rh
bmRhcmQgc2VtYW50aWNzIGZvciBleGNlcHRpb24KICAgc3BlY2lmaWNhdGlvbnMsIGNhbGxp
bmcgdW5leHBlY3RlZCBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIHRoYXQKICAgZG9lc24n
dCBtYXRjaCB0aGUgc3BlY2lmaWNhdGlvbi4gIFplcm8gbWVhbnMgdG8gdHJlYXQgdGhlbSBh
cwogICBhc3NlcnRpb25zIGFuZCBvcHRpbWl6ZSBhY2NvcmRpbmdseSwgYnV0IG5vdCBjaGVj
ayB0aGVtLiAgKi8KCmludCBmbGFnX2VuZm9yY2VfZWhfc3BlY3MgPSAxOwoKLyogIFRoZSB2
ZXJzaW9uIG9mIHRoZSBDKysgQUJJIGluIHVzZS4gIFRoZSBmb2xsb3dpbmcgdmFsdWVzIGFy
ZQogICAgYWxsb3dlZDoKCiAgICAwOiBUaGUgdmVyc2lvbiBvZiB0aGUgQUJJIGJlbGlldmVk
IG1vc3QgY29uZm9ybWFudCB3aXRoIHRoZQogICAgICAgQysrIEFCSSBzcGVjaWZpY2F0aW9u
LiAgVGhpcyBBQkkgbWF5IGNoYW5nZSBhcyBidWdzIGFyZQogICAgICAgZGlzY292ZXJlZCBh
bmQgZml4ZWQuICBUaGVyZWZvcmUsIDAgd2lsbCBub3QgbmVjZXNzYXJpbHkKICAgICAgIGlu
ZGljYXRlIHRoZSBzYW1lIEFCSSBpbiBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgRysrLgoKICAg
IDE6IFRoZSB2ZXJzaW9uIG9mIHRoZSBBQkkgZmlyc3QgdXNlZCBpbiBHKysgMy4yLgoKICAg
IEFkZGl0aW9uYWwgcG9zaXRpdmUgaW50ZWdlcnMgd2lsbCBiZSBhc3NpZ25lZCBhcyBuZXcg
dmVyc2lvbnMgb2YKICAgIHRoZSBBQkkgYmVjb21lIHRoZSBkZWZhdWx0IHZlcnNpb24gb2Yg
dGhlIEFCSS4gICovCgppbnQgZmxhZ19hYmlfdmVyc2lvbiA9IDE7CgovKiBOb256ZXJvIG1l
YW5zIHdhcm4gYWJvdXQgdGhpbmdzIHRoYXQgd2lsbCBjaGFuZ2Ugd2hlbiBjb21waWxpbmcK
ICAgd2l0aCBhbiBBQkktY29tcGxpYW50IGNvbXBpbGVyLiAgKi8KCmludCB3YXJuX2FiaSA9
IDA7CgovKiBOb256ZXJvIG1lYW5zIHdhcm4gYWJvdXQgaW52YWxpZCB1c2VzIG9mIG9mZnNl
dG9mLiAgKi8KCmludCB3YXJuX2ludmFsaWRfb2Zmc2V0b2YgPSAxOwoKLyogTm9uemVybyBt
ZWFucyB3YXJuIGFib3V0IGltcGxpY2l0IGRlY2xhcmF0aW9ucy4gICovCgppbnQgd2Fybl9p
bXBsaWNpdCA9IDE7CgovKiBOb256ZXJvIG1lYW5zIHdhcm4gd2hlbiBhbGwgY3RvcnMgb3Ig
ZHRvcnMgYXJlIHByaXZhdGUsIGFuZCB0aGUgY2xhc3MKICAgaGFzIG5vIGZyaWVuZHMuICAq
LwoKaW50IHdhcm5fY3Rvcl9kdG9yX3ByaXZhY3kgPSAwOwoKLyogTm9uemVybyBtZWFucyB3
YXJuIGluIGZ1bmN0aW9uIGRlY2xhcmVkIGluIGRlcml2ZWQgY2xhc3MgaGFzIHRoZQogICBz
YW1lIG5hbWUgYXMgYSB2aXJ0dWFsIGluIHRoZSBiYXNlIGNsYXNzLCBidXQgZmFpbHMgdG8g
bWF0Y2ggdGhlCiAgIHR5cGUgc2lnbmF0dXJlIG9mIGFueSB2aXJ0dWFsIGZ1bmN0aW9uIGlu
IHRoZSBiYXNlIGNsYXNzLiAgKi8KCmludCB3YXJuX292ZXJsb2FkZWRfdmlydHVhbDsKCi8q
IE5vbnplcm8gbWVhbnMgd2FybiB3aGVuIGRlY2xhcmluZyBhIGNsYXNzIHRoYXQgaGFzIGEg
bm9uIHZpcnR1YWwKICAgZGVzdHJ1Y3Rvciwgd2hlbiBpdCByZWFsbHkgb3VnaHQgdG8gaGF2
ZSBhIHZpcnR1YWwgb25lLiAgKi8KCmludCB3YXJuX25vbnZkdG9yOwoKLyogTm9uemVybyBt
ZWFucyB3YXJuIHdoZW4gdGhlIGNvbXBpbGVyIHdpbGwgcmVvcmRlciBjb2RlLiAgKi8KCmlu
dCB3YXJuX3Jlb3JkZXI7CgovKiBOb256ZXJvIG1lYW5zIHdhcm4gd2hlbiBzeW50aGVzaXMg
YmVoYXZpb3IgZGlmZmVycyBmcm9tIENmcm9udCdzLiAgKi8KCmludCB3YXJuX3N5bnRoOwoK
LyogTm9uemVybyBtZWFucyB3YXJuIHdoZW4gd2UgY29udmVydCBhIHBvaW50ZXIgdG8gbWVt
YmVyIGZ1bmN0aW9uCiAgIGludG8gYSBwb2ludGVyIHRvICh2b2lkIG9yIGZ1bmN0aW9uKS4g
ICovCgppbnQgd2Fybl9wbWYycHRyID0gMTsKCi8qIE5vbnplcm8gbWVhbnMgd2FybiBhYm91
dCB2aW9sYXRpb24gb2Ygc29tZSBFZmZlY3RpdmUgQysrIHN0eWxlIHJ1bGVzLiAgKi8KCmlu
dCB3YXJuX2VjcHA7CgovKiBOb256ZXJvIG1lYW5zIHdhcm4gd2hlcmUgb3ZlcmxvYWQgcmVz
b2x1dGlvbiBjaG9vc2VzIGEgcHJvbW90aW9uIGZyb20KICAgdW5zaWduZWQgdG8gc2lnbmVk
IG92ZXIgYSBjb252ZXJzaW9uIHRvIGFuIHVuc2lnbmVkIG9mIHRoZSBzYW1lIHNpemUuICAq
LwoKaW50IHdhcm5fc2lnbl9wcm9tbzsKCi8qIE5vbnplcm8gbWVhbnMgd2FybiB3aGVuIGFu
IG9sZC1zdHlsZSBjYXN0IGlzIHVzZWQuICAqLwoKaW50IHdhcm5fb2xkX3N0eWxlX2Nhc3Q7
CgovKiBOb256ZXJvIG1lYW5zIHdhcm4gd2hlbiBub24tdGVtcGxhdGl6ZWQgZnJpZW5kIGZ1
bmN0aW9ucyBhcmUKICAgZGVjbGFyZWQgd2l0aGluIGEgdGVtcGxhdGUgKi8KCmludCB3YXJu
X25vbnRlbXBsYXRlX2ZyaWVuZCA9IDE7CgovKiBOb256ZXJvIG1lYW5zIGNvbXBsYWluIGFi
b3V0IGRlcHJlY2F0ZWQgZmVhdHVyZXMuICAqLwoKaW50IHdhcm5fZGVwcmVjYXRlZCA9IDE7
CgovKiBNYXhpbXVtIHRlbXBsYXRlIGluc3RhbnRpYXRpb24gZGVwdGguICBUaGlzIGxpbWl0
IGlzIHJhdGhlcgogICBhcmJpdHJhcnksIGJ1dCBpdCBleGlzdHMgdG8gbGltaXQgdGhlIHRp
bWUgaXQgdGFrZXMgdG8gbm90aWNlCiAgIGluZmluaXRlIHRlbXBsYXRlIGluc3RhbnRpYXRp
b25zLiAgKi8KCmludCBtYXhfdGluc3RfZGVwdGggPSA1MDA7CgoKCi8qIFRoZSBlbGVtZW50
cyBvZiBgcmlkcG9pbnRlcnMnIGFyZSBpZGVudGlmaWVyIG5vZGVzIGZvciB0aGUgcmVzZXJ2
ZWQKICAgdHlwZSBuYW1lcyBhbmQgc3RvcmFnZSBjbGFzc2VzLiAgSXQgaXMgaW5kZXhlZCBi
eSBhIFJJRF8uLi4gdmFsdWUuICAqLwp0cmVlICpyaWRwb2ludGVyczsKCnRyZWUgKCptYWtl
X2ZuYW1lX2RlY2wpICh0cmVlLCBpbnQpOwoKLyogSWYgbm9uLU5VTEwsIHRoZSBhZGRyZXNz
IG9mIGEgbGFuZ3VhZ2Utc3BlY2lmaWMgZnVuY3Rpb24gdGhhdCB0YWtlcwogICBhbnkgYWN0
aW9uIHJlcXVpcmVkIHJpZ2h0IGJlZm9yZSBleHBhbmRfZnVuY3Rpb25fZW5kIGlzIGNhbGxl
ZC4gICovCnZvaWQgKCpsYW5nX2V4cGFuZF9mdW5jdGlvbl9lbmQpICh2b2lkKTsKCi8qIE5v
bnplcm8gbWVhbnMgdGhlIGV4cHJlc3Npb24gYmVpbmcgcGFyc2VkIHdpbGwgbmV2ZXIgYmUg
ZXZhbHVhdGVkLgogICBUaGlzIGlzIGEgY291bnQsIHNpbmNlIHVuZXZhbHVhdGVkIGV4cHJl
c3Npb25zIGNhbiBuZXN0LiAgKi8KaW50IHNraXBfZXZhbHVhdGlvbjsKCi8qIEluZm9ybWF0
aW9uIGFib3V0IGhvdyBhIGZ1bmN0aW9uIG5hbWUgaXMgZ2VuZXJhdGVkLiAgKi8Kc3RydWN0
IGZuYW1lX3Zhcl90CnsKICB0cmVlICpjb25zdCBkZWNsOwkvKiBwb2ludGVyIHRvIHRoZSBW
QVJfREVDTC4gICovCiAgY29uc3QgdW5zaWduZWQgcmlkOwkvKiBSSUQgbnVtYmVyIGZvciB0
aGUgaWRlbnRpZmllci4gICovCiAgY29uc3QgaW50IHByZXR0eTsJLyogSG93IHByZXR0eSBp
cyBpdD8gKi8KfTsKCi8qIFRoZSB0aHJlZSB3YXlzIG9mIGdldHRpbmcgdGhlbiBuYW1lIG9m
IHRoZSBjdXJyZW50IGZ1bmN0aW9uLiAgKi8KCmNvbnN0IHN0cnVjdCBmbmFtZV92YXJfdCBm
bmFtZV92YXJzW10gPQp7CiAgLyogQzk5IGNvbXBsaWFudCBfX2Z1bmNfXywgbXVzdCBiZSBm
aXJzdC4gICovCiAgeyZjOTlfZnVuY3Rpb25fbmFtZV9kZWNsX25vZGUsIFJJRF9DOTlfRlVO
Q1RJT05fTkFNRSwgMH0sCiAgLyogR0NDIF9fRlVOQ1RJT05fXyBjb21wbGlhbnQuICAqLwog
IHsmZnVuY3Rpb25fbmFtZV9kZWNsX25vZGUsIFJJRF9GVU5DVElPTl9OQU1FLCAwfSwKICAv
KiBHQ0MgX19QUkVUVFlfRlVOQ1RJT05fXyBjb21wbGlhbnQuICAqLwogIHsmcHJldHR5X2Z1
bmN0aW9uX25hbWVfZGVjbF9ub2RlLCBSSURfUFJFVFRZX0ZVTkNUSU9OX05BTUUsIDF9LAog
IHtOVUxMLCAwLCAwfSwKfTsKCnN0YXRpYyBpbnQgY29uc3RhbnRfZml0c190eXBlX3AgKHRy
ZWUsIHRyZWUpOwoKLyogS2VlcCBhIHN0YWNrIG9mIGlmIHN0YXRlbWVudHMuICBXZSByZWNv
cmQgdGhlIG51bWJlciBvZiBjb21wb3VuZAogICBzdGF0ZW1lbnRzIHNlZW4gdXAgdG8gdGhl
IGlmIGtleXdvcmQsIGFzIHdlbGwgYXMgdGhlIGxpbmUgbnVtYmVyCiAgIGFuZCBmaWxlIG9m
IHRoZSBpZi4gIElmIGEgcG90ZW50aWFsbHkgYW1iaWd1b3VzIGVsc2UgaXMgc2VlbiwgdGhh
dAogICBmYWN0IGlzIHJlY29yZGVkOyB0aGUgd2FybmluZyBpcyBpc3N1ZWQgd2hlbiB3ZSBj
YW4gYmUgc3VyZSB0aGF0CiAgIHRoZSBlbmNsb3NpbmcgaWYgc3RhdGVtZW50IGRvZXMgbm90
IGhhdmUgYW4gZWxzZSBicmFuY2guICAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgaW50IGNvbXBz
dG10X2NvdW50OwogIGxvY2F0aW9uX3QgbG9jdXM7CiAgaW50IG5lZWRzX3dhcm5pbmc7CiAg
dHJlZSBpZl9zdG10Owp9IGlmX2VsdDsKCnN0YXRpYyBpZl9lbHQgKmlmX3N0YWNrOwoKLyog
QW1vdW50IG9mIHNwYWNlIGluIHRoZSBpZiBzdGF0ZW1lbnQgc3RhY2suICAqLwpzdGF0aWMg
aW50IGlmX3N0YWNrX3NwYWNlID0gMDsKCi8qIFN0YWNrIHBvaW50ZXIuICAqLwpzdGF0aWMg
aW50IGlmX3N0YWNrX3BvaW50ZXIgPSAwOwoKc3RhdGljIHRyZWUgaGFuZGxlX3BhY2tlZF9h
dHRyaWJ1dGUgKHRyZWUgKiwgdHJlZSwgdHJlZSwgaW50LCBib29sICopOwpzdGF0aWMgdHJl
ZSBoYW5kbGVfbm9jb21tb25fYXR0cmlidXRlICh0cmVlICosIHRyZWUsIHRyZWUsIGludCwg
Ym9vbCAqKTsKc3RhdGljIHRyZWUgaGFuZGxlX2NvbW1vbl9hdHRyaWJ1dGUgKHRyZWUgKiwg
dHJlZSwgdHJlZSwgaW50LCBib29sICopOwpzdGF0aWMgdHJlZSBoYW5kbGVfbm9yZXR1cm5f
YXR0cmlidXRlICh0cmVlICosIHRyZWUsIHRyZWUsIGludCwgYm9vbCAqKTsKc3RhdGljIHRy
ZWUgaGFuZGxlX25vaW5saW5lX2F0dHJpYnV0ZSAodHJlZSAqLCB0cmVlLCB0cmVlLCBpbnQs
IGJvb2wgKik7CnN0YXRpYyB0cmVlIGhhbmRsZV9hbHdheXNfaW5saW5lX2F0dHJpYnV0ZSAo
dHJlZSAqLCB0cmVlLCB0cmVlLCBpbnQsCgkJCQkJICAgIGJvb2wgKik7CnN0YXRpYyB0cmVl
IGhhbmRsZV91c2VkX2F0dHJpYnV0ZSAodHJlZSAqLCB0cmVlLCB0cmVlLCBpbnQsIGJvb2wg
Kik7CnN0YXRpYyB0cmVlIGhhbmRsZV91bnVzZWRfYXR0cmlidXRlICh0cmVlICosIHRyZWUs
IHRyZWUsIGludCwgYm9vbCAqKTsKc3RhdGljIHRyZWUgaGFuZGxlX2NvbnN0X2F0dHJpYnV0
ZSAodHJlZSAqLCB0cmVlLCB0cmVlLCBpbnQsIGJvb2wgKik7CnN0YXRpYyB0cmVlIGhhbmRs
ZV90cmFuc3BhcmVudF91bmlvbl9hdHRyaWJ1dGUgKHRyZWUgKiwgdHJlZSwgdHJlZSwKCQkJ
CQkJaW50LCBib29sICopOwpzdGF0aWMgdHJlZSBoYW5kbGVfY29uc3RydWN0b3JfYXR0cmli
dXRlICh0cmVlICosIHRyZWUsIHRyZWUsIGludCwgYm9vbCAqKTsKc3RhdGljIHRyZWUgaGFu
ZGxlX2Rlc3RydWN0b3JfYXR0cmlidXRlICh0cmVlICosIHRyZWUsIHRyZWUsIGludCwgYm9v
bCAqKTsKc3RhdGljIHRyZWUgaGFuZGxlX21vZGVfYXR0cmlidXRlICh0cmVlICosIHRyZWUs
IHRyZWUsIGludCwgYm9vbCAqKTsKc3RhdGljIHRyZWUgaGFuZGxlX3NlY3Rpb25fYXR0cmli
dXRlICh0cmVlICosIHRyZWUsIHRyZWUsIGludCwgYm9vbCAqKTsKc3RhdGljIHRyZWUgaGFu
ZGxlX2FsaWduZWRfYXR0cmlidXRlICh0cmVlICosIHRyZWUsIHRyZWUsIGludCwgYm9vbCAq
KTsKc3RhdGljIHRyZWUgaGFuZGxlX3dlYWtfYXR0cmlidXRlICh0cmVlICosIHRyZWUsIHRy
ZWUsIGludCwgYm9vbCAqKSA7CnN0YXRpYyB0cmVlIGhhbmRsZV9hbGlhc19hdHRyaWJ1dGUg
KHRyZWUgKiwgdHJlZSwgdHJlZSwgaW50LCBib29sICopOwpzdGF0aWMgdHJlZSBoYW5kbGVf
dmlzaWJpbGl0eV9hdHRyaWJ1dGUgKHRyZWUgKiwgdHJlZSwgdHJlZSwgaW50LAoJCQkJCSBi
b29sICopOwpzdGF0aWMgdHJlZSBoYW5kbGVfdGxzX21vZGVsX2F0dHJpYnV0ZSAodHJlZSAq
LCB0cmVlLCB0cmVlLCBpbnQsCgkJCQkJYm9vbCAqKTsKc3RhdGljIHRyZWUgaGFuZGxlX25v
X2luc3RydW1lbnRfZnVuY3Rpb25fYXR0cmlidXRlICh0cmVlICosIHRyZWUsCgkJCQkJCSAg
ICAgdHJlZSwgaW50LCBib29sICopOwpzdGF0aWMgdHJlZSBoYW5kbGVfbWFsbG9jX2F0dHJp
YnV0ZSAodHJlZSAqLCB0cmVlLCB0cmVlLCBpbnQsIGJvb2wgKik7CnN0YXRpYyB0cmVlIGhh
bmRsZV9ub19saW1pdF9zdGFja19hdHRyaWJ1dGUgKHRyZWUgKiwgdHJlZSwgdHJlZSwgaW50
LAoJCQkJCSAgICAgYm9vbCAqKTsKc3RhdGljIHRyZWUgaGFuZGxlX3B1cmVfYXR0cmlidXRl
ICh0cmVlICosIHRyZWUsIHRyZWUsIGludCwgYm9vbCAqKTsKc3RhdGljIHRyZWUgaGFuZGxl
X2RlcHJlY2F0ZWRfYXR0cmlidXRlICh0cmVlICosIHRyZWUsIHRyZWUsIGludCwKCQkJCQkg
Ym9vbCAqKTsKc3RhdGljIHRyZWUgaGFuZGxlX3ZlY3Rvcl9zaXplX2F0dHJpYnV0ZSAodHJl
ZSAqLCB0cmVlLCB0cmVlLCBpbnQsCgkJCQkJICBib29sICopOwpzdGF0aWMgdHJlZSBoYW5k
bGVfbm9ubnVsbF9hdHRyaWJ1dGUgKHRyZWUgKiwgdHJlZSwgdHJlZSwgaW50LCBib29sICop
OwpzdGF0aWMgdHJlZSBoYW5kbGVfbm90aHJvd19hdHRyaWJ1dGUgKHRyZWUgKiwgdHJlZSwg
dHJlZSwgaW50LCBib29sICopOwpzdGF0aWMgdHJlZSBoYW5kbGVfY2xlYW51cF9hdHRyaWJ1
dGUgKHRyZWUgKiwgdHJlZSwgdHJlZSwgaW50LCBib29sICopOwpzdGF0aWMgdHJlZSB2ZWN0
b3Jfc2l6ZV9oZWxwZXIgKHRyZWUsIHRyZWUpOwoKc3RhdGljIHZvaWQgY2hlY2tfZnVuY3Rp
b25fbm9ubnVsbCAodHJlZSwgdHJlZSk7CnN0YXRpYyB2b2lkIGNoZWNrX25vbm51bGxfYXJn
ICh2b2lkICosIHRyZWUsIHVuc2lnbmVkIEhPU1RfV0lERV9JTlQpOwpzdGF0aWMgYm9vbCBu
b25udWxsX2NoZWNrX3AgKHRyZWUsIHVuc2lnbmVkIEhPU1RfV0lERV9JTlQpOwpzdGF0aWMg
Ym9vbCBnZXRfbm9ubnVsbF9vcGVyYW5kICh0cmVlLCB1bnNpZ25lZCBIT1NUX1dJREVfSU5U
ICopOwoKLyogVGFibGUgb2YgbWFjaGluZS1pbmRlcGVuZGVudCBhdHRyaWJ1dGVzIGNvbW1v
biB0byBhbGwgQy1saWtlIGxhbmd1YWdlcy4gICovCmNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVf
c3BlYyBjX2NvbW1vbl9hdHRyaWJ1dGVfdGFibGVbXSA9CnsKICAvKiB7IG5hbWUsIG1pbl9s
ZW4sIG1heF9sZW4sIGRlY2xfcmVxLCB0eXBlX3JlcSwgZm5fdHlwZV9yZXEsIGhhbmRsZXIg
fSAqLwogIHsgInBhY2tlZCIsICAgICAgICAgICAgICAgICAwLCAwLCBmYWxzZSwgZmFsc2Us
IGZhbHNlLAoJCQkgICAgICBoYW5kbGVfcGFja2VkX2F0dHJpYnV0ZSB9LAogIHsgIm5vY29t
bW9uIiwgICAgICAgICAgICAgICAwLCAwLCB0cnVlLCAgZmFsc2UsIGZhbHNlLAoJCQkgICAg
ICBoYW5kbGVfbm9jb21tb25fYXR0cmlidXRlIH0sCiAgeyAiY29tbW9uIiwgICAgICAgICAg
ICAgICAgIDAsIDAsIHRydWUsICBmYWxzZSwgZmFsc2UsCgkJCSAgICAgIGhhbmRsZV9jb21t
b25fYXR0cmlidXRlIH0sCiAgLyogRklYTUU6IGxvZ2ljYWxseSwgbm9yZXR1cm4gYXR0cmli
dXRlcyBzaG91bGQgYmUgbGlzdGVkIGFzCiAgICAgImZhbHNlLCB0cnVlLCB0cnVlIiBhbmQg
YXBwbHkgdG8gZnVuY3Rpb24gdHlwZXMuICBCdXQgaW1wbGVtZW50aW5nIHRoaXMKICAgICB3
b3VsZCByZXF1aXJlIGFsbCB0aGUgcGxhY2VzIGluIHRoZSBjb21waWxlciB0aGF0IHVzZSBU
UkVFX1RISVNfVk9MQVRJTEUKICAgICBvbiBhIGRlY2wgdG8gaWRlbnRpZnkgbm9uLXJldHVy
bmluZyBmdW5jdGlvbnMgdG8gYmUgbG9jYXRlZCBhbmQgZml4ZWQKICAgICB0byBjaGVjayB0
aGUgZnVuY3Rpb24gdHlwZSBpbnN0ZWFkLiAgKi8KICB7ICJub3JldHVybiIsICAgICAgICAg
ICAgICAgMCwgMCwgdHJ1ZSwgIGZhbHNlLCBmYWxzZSwKCQkJICAgICAgaGFuZGxlX25vcmV0
dXJuX2F0dHJpYnV0ZSB9LAogIHsgInZvbGF0aWxlIiwgICAgICAgICAgICAgICAwLCAwLCB0
cnVlLCAgZmFsc2UsIGZhbHNlLAoJCQkgICAgICBoYW5kbGVfbm9yZXR1cm5fYXR0cmlidXRl
IH0sCiAgeyAibm9pbmxpbmUiLCAgICAgICAgICAgICAgIDAsIDAsIHRydWUsICBmYWxzZSwg
ZmFsc2UsCgkJCSAgICAgIGhhbmRsZV9ub2lubGluZV9hdHRyaWJ1dGUgfSwKICB7ICJhbHdh
eXNfaW5saW5lIiwgICAgICAgICAgMCwgMCwgdHJ1ZSwgIGZhbHNlLCBmYWxzZSwKCQkJICAg
ICAgaGFuZGxlX2Fsd2F5c19pbmxpbmVfYXR0cmlidXRlIH0sCiAgeyAidXNlZCIsICAgICAg
ICAgICAgICAgICAgIDAsIDAsIHRydWUsICBmYWxzZSwgZmFsc2UsCgkJCSAgICAgIGhhbmRs
ZV91c2VkX2F0dHJpYnV0ZSB9LAogIHsgInVudXNlZCIsICAgICAgICAgICAgICAgICAwLCAw
LCBmYWxzZSwgZmFsc2UsIGZhbHNlLAoJCQkgICAgICBoYW5kbGVfdW51c2VkX2F0dHJpYnV0
ZSB9LAogIC8qIFRoZSBzYW1lIGNvbW1lbnRzIGFzIGZvciBub3JldHVybiBhdHRyaWJ1dGVz
IGFwcGx5IHRvIGNvbnN0IG9uZXMuICAqLwogIHsgImNvbnN0IiwgICAgICAgICAgICAgICAg
ICAwLCAwLCB0cnVlLCAgZmFsc2UsIGZhbHNlLAoJCQkgICAgICBoYW5kbGVfY29uc3RfYXR0
cmlidXRlIH0sCiAgeyAidHJhbnNwYXJlbnRfdW5pb24iLCAgICAgIDAsIDAsIGZhbHNlLCBm
YWxzZSwgZmFsc2UsCgkJCSAgICAgIGhhbmRsZV90cmFuc3BhcmVudF91bmlvbl9hdHRyaWJ1
dGUgfSwKICB7ICJjb25zdHJ1Y3RvciIsICAgICAgICAgICAgMCwgMCwgdHJ1ZSwgIGZhbHNl
LCBmYWxzZSwKCQkJICAgICAgaGFuZGxlX2NvbnN0cnVjdG9yX2F0dHJpYnV0ZSB9LAogIHsg
ImRlc3RydWN0b3IiLCAgICAgICAgICAgICAwLCAwLCB0cnVlLCAgZmFsc2UsIGZhbHNlLAoJ
CQkgICAgICBoYW5kbGVfZGVzdHJ1Y3Rvcl9hdHRyaWJ1dGUgfSwKICB7ICJtb2RlIiwgICAg
ICAgICAgICAgICAgICAgMSwgMSwgZmFsc2UsICB0cnVlLCBmYWxzZSwKCQkJICAgICAgaGFu
ZGxlX21vZGVfYXR0cmlidXRlIH0sCiAgeyAic2VjdGlvbiIsICAgICAgICAgICAgICAgIDEs
IDEsIHRydWUsICBmYWxzZSwgZmFsc2UsCgkJCSAgICAgIGhhbmRsZV9zZWN0aW9uX2F0dHJp
YnV0ZSB9LAogIHsgImFsaWduZWQiLCAgICAgICAgICAgICAgICAwLCAxLCBmYWxzZSwgZmFs
c2UsIGZhbHNlLAoJCQkgICAgICBoYW5kbGVfYWxpZ25lZF9hdHRyaWJ1dGUgfSwKICB7ICJ3
ZWFrIiwgICAgICAgICAgICAgICAgICAgMCwgMCwgdHJ1ZSwgIGZhbHNlLCBmYWxzZSwKCQkJ
ICAgICAgaGFuZGxlX3dlYWtfYXR0cmlidXRlIH0sCiAgeyAiYWxpYXMiLCAgICAgICAgICAg
ICAgICAgIDEsIDEsIHRydWUsICBmYWxzZSwgZmFsc2UsCgkJCSAgICAgIGhhbmRsZV9hbGlh
c19hdHRyaWJ1dGUgfSwKICB7ICJub19pbnN0cnVtZW50X2Z1bmN0aW9uIiwgMCwgMCwgdHJ1
ZSwgIGZhbHNlLCBmYWxzZSwKCQkJICAgICAgaGFuZGxlX25vX2luc3RydW1lbnRfZnVuY3Rp
b25fYXR0cmlidXRlIH0sCiAgeyAibWFsbG9jIiwgICAgICAgICAgICAgICAgIDAsIDAsIHRy
dWUsICBmYWxzZSwgZmFsc2UsCgkJCSAgICAgIGhhbmRsZV9tYWxsb2NfYXR0cmlidXRlIH0s
CiAgeyAibm9fc3RhY2tfbGltaXQiLCAgICAgICAgIDAsIDAsIHRydWUsICBmYWxzZSwgZmFs
c2UsCgkJCSAgICAgIGhhbmRsZV9ub19saW1pdF9zdGFja19hdHRyaWJ1dGUgfSwKICB7ICJw
dXJlIiwgICAgICAgICAgICAgICAgICAgMCwgMCwgdHJ1ZSwgIGZhbHNlLCBmYWxzZSwKCQkJ
ICAgICAgaGFuZGxlX3B1cmVfYXR0cmlidXRlIH0sCiAgeyAiZGVwcmVjYXRlZCIsICAgICAg
ICAgICAgIDAsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsCgkJCSAgICAgIGhhbmRsZV9kZXBy
ZWNhdGVkX2F0dHJpYnV0ZSB9LAogIHsgInZlY3Rvcl9zaXplIiwJICAgICAgMSwgMSwgZmFs
c2UsIHRydWUsIGZhbHNlLAoJCQkgICAgICBoYW5kbGVfdmVjdG9yX3NpemVfYXR0cmlidXRl
IH0sCiAgeyAidmlzaWJpbGl0eSIsCSAgICAgIDEsIDEsIHRydWUsICBmYWxzZSwgZmFsc2Us
CgkJCSAgICAgIGhhbmRsZV92aXNpYmlsaXR5X2F0dHJpYnV0ZSB9LAogIHsgInRsc19tb2Rl
bCIsCSAgICAgIDEsIDEsIHRydWUsICBmYWxzZSwgZmFsc2UsCgkJCSAgICAgIGhhbmRsZV90
bHNfbW9kZWxfYXR0cmlidXRlIH0sCiAgeyAibm9ubnVsbCIsICAgICAgICAgICAgICAgIDAs
IC0xLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwKCQkJICAgICAgaGFuZGxlX25vbm51bGxfYXR0cmli
dXRlIH0sCiAgeyAibm90aHJvdyIsICAgICAgICAgICAgICAgIDAsIDAsIHRydWUsICBmYWxz
ZSwgZmFsc2UsCgkJCSAgICAgIGhhbmRsZV9ub3Rocm93X2F0dHJpYnV0ZSB9LAogIHsgIm1h
eV9hbGlhcyIsCSAgICAgIDAsIDAsIGZhbHNlLCB0cnVlLCBmYWxzZSwgTlVMTCB9LAogIHsg
ImNsZWFudXAiLAkJICAgICAgMSwgMSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLAoJCQkgICAgICBo
YW5kbGVfY2xlYW51cF9hdHRyaWJ1dGUgfSwKICB7IE5VTEwsICAgICAgICAgICAgICAgICAg
ICAgMCwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgTlVMTCB9Cn07CgovKiBHaXZlIHRoZSBz
cGVjaWZpY2F0aW9ucyBmb3IgdGhlIGZvcm1hdCBhdHRyaWJ1dGVzLCB1c2VkIGJ5IEMgYW5k
IGFsbAogICBkZXNjZW5kYW50cy4gICovCgpjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX3NwZWMg
Y19jb21tb25fZm9ybWF0X2F0dHJpYnV0ZV90YWJsZVtdID0KewogIC8qIHsgbmFtZSwgbWlu
X2xlbiwgbWF4X2xlbiwgZGVjbF9yZXEsIHR5cGVfcmVxLCBmbl90eXBlX3JlcSwgaGFuZGxl
ciB9ICovCiAgeyAiZm9ybWF0IiwgICAgICAgICAgICAgICAgIDMsIDMsIGZhbHNlLCB0cnVl
LCAgdHJ1ZSwKCQkJICAgICAgaGFuZGxlX2Zvcm1hdF9hdHRyaWJ1dGUgfSwKICB7ICJmb3Jt
YXRfYXJnIiwgICAgICAgICAgICAgMSwgMSwgZmFsc2UsIHRydWUsICB0cnVlLAoJCQkgICAg
ICBoYW5kbGVfZm9ybWF0X2FyZ19hdHRyaWJ1dGUgfSwKICB7IE5VTEwsICAgICAgICAgICAg
ICAgICAgICAgMCwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgTlVMTCB9Cn07CgovKiBSZWNv
cmQgdGhlIHN0YXJ0IG9mIGFuIGlmLXRoZW4sIGFuZCByZWNvcmQgdGhlIHN0YXJ0IG9mIGl0
CiAgIGZvciBhbWJpZ3VvdXMgZWxzZSBkZXRlY3Rpb24uCgogICBDT05EIGlzIHRoZSBjb25k
aXRpb24gZm9yIHRoZSBpZi10aGVuIHN0YXRlbWVudC4KCiAgIElGX1NUTVQgaXMgdGhlIHN0
YXRlbWVudCBub2RlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkIGZvcgogICB0aGlz
IGlmLXRoZW4gc3RhdGVtZW50LiAgSXQgaXMgY3JlYXRlZCBiZWZvcmUgcGFyc2luZyB0aGUK
ICAgY29uZGl0aW9uIHRvIGtlZXAgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gYWNjdXJhdGUu
ICAqLwoKdm9pZApjX2V4cGFuZF9zdGFydF9jb25kICh0cmVlIGNvbmQsIGludCBjb21wc3Rt
dF9jb3VudCwgdHJlZSBpZl9zdG10KQp7CiAgLyogTWFrZSBzdXJlIHRoZXJlIGlzIGVub3Vn
aCBzcGFjZSBvbiB0aGUgc3RhY2suICAqLwogIGlmIChpZl9zdGFja19zcGFjZSA9PSAwKQog
ICAgewogICAgICBpZl9zdGFja19zcGFjZSA9IDEwOwogICAgICBpZl9zdGFjayA9IChpZl9l
bHQgKikgeG1hbGxvYyAoMTAgKiBzaXplb2YgKGlmX2VsdCkpOwogICAgfQogIGVsc2UgaWYg
KGlmX3N0YWNrX3NwYWNlID09IGlmX3N0YWNrX3BvaW50ZXIpCiAgICB7CiAgICAgIGlmX3N0
YWNrX3NwYWNlICs9IDEwOwogICAgICBpZl9zdGFjayA9IChpZl9lbHQgKikgeHJlYWxsb2Mg
KGlmX3N0YWNrLCBpZl9zdGFja19zcGFjZSAqIHNpemVvZiAoaWZfZWx0KSk7CiAgICB9Cgog
IElGX0NPTkQgKGlmX3N0bXQpID0gY29uZDsKICBhZGRfc3RtdCAoaWZfc3RtdCk7CgogIC8q
IFJlY29yZCB0aGlzIGlmIHN0YXRlbWVudC4gICovCiAgaWZfc3RhY2tbaWZfc3RhY2tfcG9p
bnRlcl0uY29tcHN0bXRfY291bnQgPSBjb21wc3RtdF9jb3VudDsKICBpZl9zdGFja1tpZl9z
dGFja19wb2ludGVyXS5sb2N1cyA9IGlucHV0X2xvY2F0aW9uOwogIGlmX3N0YWNrW2lmX3N0
YWNrX3BvaW50ZXJdLm5lZWRzX3dhcm5pbmcgPSAwOwogIGlmX3N0YWNrW2lmX3N0YWNrX3Bv
aW50ZXJdLmlmX3N0bXQgPSBpZl9zdG10OwogIGlmX3N0YWNrX3BvaW50ZXIrKzsKfQoKLyog
Q2FsbGVkIGFmdGVyIHRoZSB0aGVuLWNsYXVzZSBmb3IgYW4gaWYtc3RhdGVtZW50IGlzIHBy
b2Nlc3NlZC4gICovCgp2b2lkCmNfZmluaXNoX3RoZW4gKHZvaWQpCnsKICB0cmVlIGlmX3N0
bXQgPSBpZl9zdGFja1tpZl9zdGFja19wb2ludGVyIC0gMV0uaWZfc3RtdDsKICBSRUNIQUlO
X1NUTVRTIChpZl9zdG10LCBUSEVOX0NMQVVTRSAoaWZfc3RtdCkpOwp9CgovKiBSZWNvcmQg
dGhlIGVuZCBvZiBhbiBpZi10aGVuLiAgT3B0aW9uYWxseSB3YXJuIGlmIGEgbmVzdGVkCiAg
IGlmIHN0YXRlbWVudCBoYWQgYW4gYW1iaWd1b3VzIGVsc2UgY2xhdXNlLiAgKi8KCnZvaWQK
Y19leHBhbmRfZW5kX2NvbmQgKHZvaWQpCnsKICBpZl9zdGFja19wb2ludGVyLS07CiAgaWYg
KGlmX3N0YWNrW2lmX3N0YWNrX3BvaW50ZXJdLm5lZWRzX3dhcm5pbmcpCiAgICB3YXJuaW5n
ICgiJUhzdWdnZXN0IGV4cGxpY2l0IGJyYWNlcyB0byBhdm9pZCBhbWJpZ3VvdXMgYGVsc2Un
IiwKICAgICAgICAgICAgICZpZl9zdGFja1tpZl9zdGFja19wb2ludGVyXS5sb2N1cyk7CiAg
bGFzdF9leHByX3R5cGUgPSBOVUxMX1RSRUU7Cn0KCi8qIENhbGxlZCBiZXR3ZWVuIHRoZSB0
aGVuLWNsYXVzZSBhbmQgdGhlIGVsc2UtY2xhdXNlCiAgIG9mIGFuIGlmLXRoZW4tZWxzZS4g
ICovCgp2b2lkCmNfZXhwYW5kX3N0YXJ0X2Vsc2UgKHZvaWQpCnsKICAvKiBBbiBhbWJpZ3Vv
dXMgZWxzZSB3YXJuaW5nIG11c3QgYmUgZ2VuZXJhdGVkIGZvciB0aGUgZW5jbG9zaW5nIGlm
CiAgICAgc3RhdGVtZW50LCB1bmxlc3Mgd2Ugc2VlIGFuIGVsc2UgYnJhbmNoIGZvciB0aGF0
IG9uZSwgdG9vLiAgKi8KICBpZiAod2Fybl9wYXJlbnRoZXNlcwogICAgICAmJiBpZl9zdGFj
a19wb2ludGVyID4gMQogICAgICAmJiAoaWZfc3RhY2tbaWZfc3RhY2tfcG9pbnRlciAtIDFd
LmNvbXBzdG10X2NvdW50CgkgID09IGlmX3N0YWNrW2lmX3N0YWNrX3BvaW50ZXIgLSAyXS5j
b21wc3RtdF9jb3VudCkpCiAgICBpZl9zdGFja1tpZl9zdGFja19wb2ludGVyIC0gMl0ubmVl
ZHNfd2FybmluZyA9IDE7CgogIC8qIEV2ZW4gaWYgYSBuZXN0ZWQgaWYgc3RhdGVtZW50IGhh
ZCBhbiBlbHNlIGJyYW5jaCwgaXQgY2FuJ3QgYmUKICAgICBhbWJpZ3VvdXMgaWYgdGhpcyBv
bmUgYWxzbyBoYXMgYW4gZWxzZS4gIFNvIGRvbid0IHdhcm4gaW4gdGhhdAogICAgIGNhc2Uu
ICBBbHNvIGRvbid0IHdhcm4gZm9yIGFueSBpZiBzdGF0ZW1lbnRzIG5lc3RlZCBpbiB0aGlz
IGVsc2UuICAqLwogIGlmX3N0YWNrW2lmX3N0YWNrX3BvaW50ZXIgLSAxXS5uZWVkc193YXJu
aW5nID0gMDsKICBpZl9zdGFja1tpZl9zdGFja19wb2ludGVyIC0gMV0uY29tcHN0bXRfY291
bnQtLTsKfQoKLyogQ2FsbGVkIGFmdGVyIHRoZSBlbHNlLWNsYXVzZSBmb3IgYW4gaWYtc3Rh
dGVtZW50IGlzIHByb2Nlc3NlZC4gICovCgp2b2lkCmNfZmluaXNoX2Vsc2UgKHZvaWQpCnsK
ICB0cmVlIGlmX3N0bXQgPSBpZl9zdGFja1tpZl9zdGFja19wb2ludGVyIC0gMV0uaWZfc3Rt
dDsKICBSRUNIQUlOX1NUTVRTIChpZl9zdG10LCBFTFNFX0NMQVVTRSAoaWZfc3RtdCkpOwp9
CgovKiBCZWdpbiBhbiBpZi1zdGF0ZW1lbnQuICBSZXR1cm5zIGEgbmV3bHkgY3JlYXRlZCBJ
Rl9TVE1UIGlmCiAgIGFwcHJvcHJpYXRlLgoKICAgVW5saWtlIHRoZSBDKysgZnJvbnQtZW5k
LCB3ZSBkbyBub3QgY2FsbCBhZGRfc3RtdCBoZXJlOyBpdCBpcwogICBwcm9iYWJseSBzYWZl
IHRvIGRvIHNvLCBidXQgSSBhbSBub3QgdmVyeSBmYW1pbGlhciB3aXRoIHRoaXMKICAgY29k
ZSBzbyBJIGFtIGJlaW5nIGV4dHJhIGNhcmVmdWwgbm90IHRvIGNoYW5nZSBpdHMgYmVoYXZp
b3IKICAgYmV5b25kIHdoYXQgaXMgc3RyaWN0bHkgbmVjZXNzYXJ5IGZvciBjb3JyZWN0bmVz
cy4gICovCgp0cmVlCmNfYmVnaW5faWZfc3RtdCAodm9pZCkKewogIHRyZWUgcjsKICByID0g
YnVpbGRfc3RtdCAoSUZfU1RNVCwgTlVMTF9UUkVFLCBOVUxMX1RSRUUsIE5VTExfVFJFRSk7
CiAgcmV0dXJuIHI7Cn0KCi8qIEJlZ2luIGEgd2hpbGUgc3RhdGVtZW50LiAgUmV0dXJucyBh
IG5ld2x5IGNyZWF0ZWQgV0hJTEVfU1RNVCBpZgogICBhcHByb3ByaWF0ZS4KCiAgIFVubGlr
ZSB0aGUgQysrIGZyb250LWVuZCwgd2UgZG8gbm90IGNhbGwgYWRkX3N0bXQgaGVyZTsgaXQg
aXMKICAgcHJvYmFibHkgc2FmZSB0byBkbyBzbywgYnV0IEkgYW0gbm90IHZlcnkgZmFtaWxp
YXIgd2l0aCB0aGlzCiAgIGNvZGUgc28gSSBhbSBiZWluZyBleHRyYSBjYXJlZnVsIG5vdCB0
byBjaGFuZ2UgaXRzIGJlaGF2aW9yCiAgIGJleW9uZCB3aGF0IGlzIHN0cmljdGx5IG5lY2Vz
c2FyeSBmb3IgY29ycmVjdG5lc3MuICAqLwoKdHJlZQpjX2JlZ2luX3doaWxlX3N0bXQgKHZv
aWQpCnsKICB0cmVlIHI7CiAgciA9IGJ1aWxkX3N0bXQgKFdISUxFX1NUTVQsIE5VTExfVFJF
RSwgTlVMTF9UUkVFKTsKICByZXR1cm4gcjsKfQoKdm9pZApjX2ZpbmlzaF93aGlsZV9zdG10
X2NvbmQgKHRyZWUgY29uZCwgdHJlZSB3aGlsZV9zdG10KQp7CiAgV0hJTEVfQ09ORCAod2hp
bGVfc3RtdCkgPSBjb25kOwp9CgovKiBQdXNoIGN1cnJlbnQgYmluZGluZ3MgZm9yIHRoZSBm
dW5jdGlvbiBuYW1lIFZBUl9ERUNMUy4gICovCgp2b2lkCnN0YXJ0X2ZuYW1lX2RlY2xzICh2
b2lkKQp7CiAgdW5zaWduZWQgaXg7CiAgdHJlZSBzYXZlZCA9IE5VTExfVFJFRTsKCiAgZm9y
IChpeCA9IDA7IGZuYW1lX3ZhcnNbaXhdLmRlY2w7IGl4KyspCiAgICB7CiAgICAgIHRyZWUg
ZGVjbCA9ICpmbmFtZV92YXJzW2l4XS5kZWNsOwoKICAgICAgaWYgKGRlY2wpCgl7CgkgIHNh
dmVkID0gdHJlZV9jb25zIChkZWNsLCBidWlsZF9pbnRfMiAoaXgsIDApLCBzYXZlZCk7Cgkg
ICpmbmFtZV92YXJzW2l4XS5kZWNsID0gTlVMTF9UUkVFOwoJfQogICAgfQogIGlmIChzYXZl
ZCB8fCBzYXZlZF9mdW5jdGlvbl9uYW1lX2RlY2xzKQogICAgLyogTm9ybWFsbHkgdGhleSds
bCBoYXZlIGJlZW4gTlVMTCwgc28gb25seSBwdXNoIGlmIHdlJ3ZlIGdvdCBhCiAgICAgICBz
dGFjaywgb3IgdGhleSBhcmUgbm9uLU5VTEwuICAqLwogICAgc2F2ZWRfZnVuY3Rpb25fbmFt
ZV9kZWNscyA9IHRyZWVfY29ucyAoc2F2ZWQsIE5VTExfVFJFRSwKCQkJCQkgICBzYXZlZF9m
dW5jdGlvbl9uYW1lX2RlY2xzKTsKfQoKLyogRmluaXNoIHVwIHRoZSBjdXJyZW50IGJpbmRp
bmdzLCBhZGRpbmcgdGhlbSBpbnRvIHRoZQogICBjdXJyZW50IGZ1bmN0aW9uJ3Mgc3RhdGVt
ZW50IHRyZWUuIFRoaXMgaXMgZG9uZSBieSB3cmFwcGluZyB0aGUKICAgZnVuY3Rpb24ncyBi
b2R5IGluIGEgQ09NUE9VTkRfU1RNVCBjb250YWluaW5nIHRoZXNlIGRlY2xzIHRvby4gVGhp
cwogICBtdXN0IGJlIGRvbmUgX2JlZm9yZV8gZmluaXNoX3N0bXRfdHJlZSBpcyBjYWxsZWQu
IElmIHRoZXJlIGlzIG5vCiAgIGN1cnJlbnQgZnVuY3Rpb24sIHdlIG11c3QgYmUgYXQgZmls
ZSBzY29wZSBhbmQgbm8gc3RhdGVtZW50cyBhcmUKICAgaW52b2x2ZWQuIFBvcCB0aGUgcHJl
dmlvdXMgYmluZGluZ3MuICAqLwoKdm9pZApmaW5pc2hfZm5hbWVfZGVjbHMgKHZvaWQpCnsK
ICB1bnNpZ25lZCBpeDsKICB0cmVlIGJvZHkgPSBOVUxMX1RSRUU7CiAgdHJlZSBzdGFjayA9
IHNhdmVkX2Z1bmN0aW9uX25hbWVfZGVjbHM7CgogIGZvciAoOyBzdGFjayAmJiBUUkVFX1ZB
TFVFIChzdGFjayk7IHN0YWNrID0gVFJFRV9DSEFJTiAoc3RhY2spKQogICAgYm9keSA9IGNo
YWlub24gKFRSRUVfVkFMVUUgKHN0YWNrKSwgYm9keSk7CgogIGlmIChib2R5KQogICAgewog
ICAgICAvKiBUaGV5IHdlcmUgY2FsbGVkIGludG8gZXhpc3RlbmNlLCBzbyBhZGQgdG8gc3Rh
dGVtZW50IHRyZWUuICBBZGQKCSB0aGUgREVDTF9TVE1UcyBpbnNpZGUgdGhlIG91dGVybW9z
dCBzY29wZS4gICovCiAgICAgIHRyZWUgKnAgPSAmREVDTF9TQVZFRF9UUkVFIChjdXJyZW50
X2Z1bmN0aW9uX2RlY2wpOwogICAgICAvKiBTa2lwIHRoZSBkdW1teSBFWFBSX1NUTVQgYW5k
IGFueSBFSF9TUEVDX0JMT0NLLiAgKi8KICAgICAgd2hpbGUgKFRSRUVfQ09ERSAoKnApICE9
IENPTVBPVU5EX1NUTVQpCglwID0gJlRSRUVfQ0hBSU4gKCpwKTsKICAgICAgcCA9ICZDT01Q
T1VORF9CT0RZICgqcCk7CiAgICAgIGlmIChUUkVFX0NPREUgKCpwKSA9PSBTQ09QRV9TVE1U
KQoJcCA9ICZUUkVFX0NIQUlOICgqcCk7CgogICAgICBib2R5ID0gY2hhaW5vbiAoYm9keSwg
KnApOwogICAgICAqcCA9IGJvZHk7CiAgICB9CgogIGZvciAoaXggPSAwOyBmbmFtZV92YXJz
W2l4XS5kZWNsOyBpeCsrKQogICAgKmZuYW1lX3ZhcnNbaXhdLmRlY2wgPSBOVUxMX1RSRUU7
CgogIGlmIChzdGFjaykKICAgIHsKICAgICAgLyogV2UgaGFkIHNhdmVkIHZhbHVlcywgcmVz
dG9yZSB0aGVtLiAgKi8KICAgICAgdHJlZSBzYXZlZDsKCiAgICAgIGZvciAoc2F2ZWQgPSBU
UkVFX1BVUlBPU0UgKHN0YWNrKTsgc2F2ZWQ7IHNhdmVkID0gVFJFRV9DSEFJTiAoc2F2ZWQp
KQoJewoJICB0cmVlIGRlY2wgPSBUUkVFX1BVUlBPU0UgKHNhdmVkKTsKCSAgdW5zaWduZWQg
aXggPSBUUkVFX0lOVF9DU1RfTE9XIChUUkVFX1ZBTFVFIChzYXZlZCkpOwoKCSAgKmZuYW1l
X3ZhcnNbaXhdLmRlY2wgPSBkZWNsOwoJfQogICAgICBzdGFjayA9IFRSRUVfQ0hBSU4gKHN0
YWNrKTsKICAgIH0KICBzYXZlZF9mdW5jdGlvbl9uYW1lX2RlY2xzID0gc3RhY2s7Cn0KCi8q
IFJldHVybiB0aGUgdGV4dCBuYW1lIG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uLCBzdWl0YWJs
eSBwcmV0dGlmaWVkCiAgIGJ5IFBSRVRUWV9QLiAgKi8KCmNvbnN0IGNoYXIgKgpmbmFtZV9h
c19zdHJpbmcgKGludCBwcmV0dHlfcCkKewogIGNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOwoK
ICBpZiAocHJldHR5X3ApCiAgICBuYW1lID0gKGN1cnJlbnRfZnVuY3Rpb25fZGVjbAoJICAg
ID8gKCpsYW5nX2hvb2tzLmRlY2xfcHJpbnRhYmxlX25hbWUpIChjdXJyZW50X2Z1bmN0aW9u
X2RlY2wsIDIpCgkgICAgOiAidG9wIGxldmVsIik7CiAgZWxzZSBpZiAoY3VycmVudF9mdW5j
dGlvbl9kZWNsICYmIERFQ0xfTkFNRSAoY3VycmVudF9mdW5jdGlvbl9kZWNsKSkKICAgIG5h
bWUgPSBJREVOVElGSUVSX1BPSU5URVIgKERFQ0xfTkFNRSAoY3VycmVudF9mdW5jdGlvbl9k
ZWNsKSk7CiAgZWxzZQogICAgbmFtZSA9ICIiOwogIHJldHVybiBuYW1lOwp9CgovKiBSZXR1
cm4gdGhlIFZBUl9ERUNMIGZvciBhIGNvbnN0IGNoYXIgYXJyYXkgbmFtaW5nIHRoZSBjdXJy
ZW50CiAgIGZ1bmN0aW9uLiBJZiB0aGUgVkFSX0RFQ0wgaGFzIG5vdCB5ZXQgYmVlbiBjcmVh
dGVkLCBjcmVhdGUgaXQKICAgbm93LiBSSUQgaW5kaWNhdGVzIGhvdyBpdCBzaG91bGQgYmUg
Zm9ybWF0dGVkIGFuZCBJREVOVElGSUVSX05PREUKICAgSUQgaXMgaXRzIG5hbWUgKHVuZm9y
dHVuYXRlbHkgQyBhbmQgQysrIGhvbGQgdGhlIFJJRCB2YWx1ZXMgb2YKICAga2V5d29yZHMg
aW4gZGlmZmVyZW50IHBsYWNlcywgc28gd2UgY2FuJ3QgZGVyaXZlIFJJRCBmcm9tIElEIGlu
CiAgIHRoaXMgbGFuZ3VhZ2UgaW5kZXBlbmRlbnQgY29kZS4gICovCgp0cmVlCmZuYW1lX2Rl
Y2wgKHVuc2lnbmVkIGludCByaWQsIHRyZWUgaWQpCnsKICB1bnNpZ25lZCBpeDsKICB0cmVl
IGRlY2wgPSBOVUxMX1RSRUU7CgogIGZvciAoaXggPSAwOyBmbmFtZV92YXJzW2l4XS5kZWNs
OyBpeCsrKQogICAgaWYgKGZuYW1lX3ZhcnNbaXhdLnJpZCA9PSByaWQpCiAgICAgIGJyZWFr
OwoKICBkZWNsID0gKmZuYW1lX3ZhcnNbaXhdLmRlY2w7CiAgaWYgKCFkZWNsKQogICAgewog
ICAgICB0cmVlIHNhdmVkX2xhc3RfdHJlZSA9IGxhc3RfdHJlZTsKICAgICAgLyogSWYgYSB0
cmVlIGlzIGJ1aWx0IGhlcmUsIGl0IHdvdWxkIG5vcm1hbGx5IGhhdmUgdGhlIGxpbmVubyBv
ZgoJIHRoZSBjdXJyZW50IHN0YXRlbWVudC4gIExhdGVyIHRoaXMgdHJlZSB3aWxsIGJlIG1v
dmVkIHRvIHRoZQoJIGJlZ2lubmluZyBvZiB0aGUgZnVuY3Rpb24gYW5kIHRoaXMgbGluZSBu
dW1iZXIgd2lsbCBiZSB3cm9uZy4KCSBUbyBhdm9pZCB0aGlzIHByb2JsZW0gc2V0IHRoZSBs
aW5lbm8gdG8gMCBoZXJlOyB0aGF0IHByZXZlbnRzCgkgaXQgZnJvbSBhcHBlYXJpbmcgaW4g
dGhlIFJUTC4gICovCiAgICAgIGludCBzYXZlZF9saW5lbm8gPSBpbnB1dF9saW5lOwogICAg
ICBpbnB1dF9saW5lID0gMDsKCiAgICAgIGRlY2wgPSAoKm1ha2VfZm5hbWVfZGVjbCkgKGlk
LCBmbmFtZV92YXJzW2l4XS5wcmV0dHkpOwogICAgICBpZiAobGFzdF90cmVlICE9IHNhdmVk
X2xhc3RfdHJlZSkKCXsKCSAgLyogV2UgY3JlYXRlZCBzb21lIHN0YXRlbWVudCB0cmVlIGZv
ciB0aGUgZGVjbC4gVGhpcyBiZWxvbmdzCgkgICAgIGF0IHRoZSBzdGFydCBvZiB0aGUgZnVu
Y3Rpb24sIHNvIHJlbW92ZSBpdCBub3cgYW5kIHJlaW5zZXJ0CgkgICAgIGl0IGFmdGVyIHRo
ZSBmdW5jdGlvbiBpcyBjb21wbGV0ZS4gICovCgkgIHRyZWUgc3RtdHMgPSBUUkVFX0NIQUlO
IChzYXZlZF9sYXN0X3RyZWUpOwoKCSAgVFJFRV9DSEFJTiAoc2F2ZWRfbGFzdF90cmVlKSA9
IE5VTExfVFJFRTsKCSAgbGFzdF90cmVlID0gc2F2ZWRfbGFzdF90cmVlOwoJICBzYXZlZF9m
dW5jdGlvbl9uYW1lX2RlY2xzID0gdHJlZV9jb25zIChkZWNsLCBzdG10cywKCQkJCQkJIHNh
dmVkX2Z1bmN0aW9uX25hbWVfZGVjbHMpOwoJfQogICAgICAqZm5hbWVfdmFyc1tpeF0uZGVj
bCA9IGRlY2w7CiAgICAgIGlucHV0X2xpbmUgPSBzYXZlZF9saW5lbm87CiAgICB9CiAgaWYg
KCFpeCAmJiAhY3VycmVudF9mdW5jdGlvbl9kZWNsKQogICAgcGVkd2Fybl93aXRoX2RlY2wg
KGRlY2wsICJgJXMnIGlzIG5vdCBkZWZpbmVkIG91dHNpZGUgb2YgZnVuY3Rpb24gc2NvcGUi
KTsKCiAgcmV0dXJuIGRlY2w7Cn0KCi8qIEdpdmVuIGEgU1RSSU5HX0NTVCwgZ2l2ZSBpdCBh
IHN1aXRhYmxlIGFycmF5LW9mLWNoYXJzIGRhdGEgdHlwZS4gICovCgp0cmVlCmZpeF9zdHJp
bmdfdHlwZSAodHJlZSB2YWx1ZSkKewogIGNvbnN0IGludCB3Y2hhcl9ieXRlcyA9IFRZUEVf
UFJFQ0lTSU9OICh3Y2hhcl90eXBlX25vZGUpIC8gQklUU19QRVJfVU5JVDsKICBjb25zdCBp
bnQgd2lkZV9mbGFnID0gVFJFRV9UWVBFICh2YWx1ZSkgPT0gd2NoYXJfYXJyYXlfdHlwZV9u
b2RlOwogIGNvbnN0IGludCBuY2hhcnNfbWF4ID0gZmxhZ19pc29jOTkgPyA0MDk1IDogNTA5
OwogIGludCBsZW5ndGggPSBUUkVFX1NUUklOR19MRU5HVEggKHZhbHVlKTsKICBpbnQgbmNo
YXJzOwoKICAvKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgZWxlbWVudHMsIGZvciB0aGUgYXJy
YXkgdHlwZS4gICovCiAgbmNoYXJzID0gd2lkZV9mbGFnID8gbGVuZ3RoIC8gd2NoYXJfYnl0
ZXMgOiBsZW5ndGg7CgogIGlmIChwZWRhbnRpYyAmJiBuY2hhcnMgLSAxID4gbmNoYXJzX21h
eCAmJiAhY19kaWFsZWN0X2N4eCAoKSkKICAgIHBlZHdhcm4gKCJzdHJpbmcgbGVuZ3RoIGAl
ZCcgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggYCVkJyBJU08gQyVkIGNvbXBpbGVycyBh
cmUgcmVxdWlyZWQgdG8gc3VwcG9ydCIsCgkgICAgIG5jaGFycyAtIDEsIG5jaGFyc19tYXgs
IGZsYWdfaXNvYzk5ID8gOTkgOiA4OSk7CgogIC8qIENyZWF0ZSB0aGUgYXJyYXkgdHlwZSBm
b3IgdGhlIHN0cmluZyBjb25zdGFudC4KICAgICAtV3dyaXRlLXN0cmluZ3Mgc2F5cyBtYWtl
IHRoZSBzdHJpbmcgY29uc3RhbnQgYW4gYXJyYXkgb2YgY29uc3QgY2hhcgogICAgIHNvIHRo
YXQgY29weWluZyBpdCB0byBhIG5vbi1jb25zdCBwb2ludGVyIHdpbGwgZ2V0IGEgd2Fybmlu
Zy4KICAgICBGb3IgQysrLCB0aGlzIGlzIHRoZSBzdGFuZGFyZCBiZWhhdmlvci4gICovCiAg
aWYgKGZsYWdfY29uc3Rfc3RyaW5ncyAmJiAhIGZsYWdfd3JpdGFibGVfc3RyaW5ncykKICAg
IHsKICAgICAgdHJlZSBlbGVtZW50cwoJPSBidWlsZF90eXBlX3ZhcmlhbnQgKHdpZGVfZmxh
ZyA/IHdjaGFyX3R5cGVfbm9kZSA6IGNoYXJfdHlwZV9ub2RlLAoJCQkgICAgICAxLCAwKTsK
ICAgICAgVFJFRV9UWVBFICh2YWx1ZSkKCT0gYnVpbGRfYXJyYXlfdHlwZSAoZWxlbWVudHMs
CgkJCSAgICBidWlsZF9pbmRleF90eXBlIChidWlsZF9pbnRfMiAobmNoYXJzIC0gMSwgMCkp
KTsKICAgIH0KICBlbHNlCiAgICBUUkVFX1RZUEUgKHZhbHVlKQogICAgICA9IGJ1aWxkX2Fy
cmF5X3R5cGUgKHdpZGVfZmxhZyA/IHdjaGFyX3R5cGVfbm9kZSA6IGNoYXJfdHlwZV9ub2Rl
LAoJCQkgIGJ1aWxkX2luZGV4X3R5cGUgKGJ1aWxkX2ludF8yIChuY2hhcnMgLSAxLCAwKSkp
OwoKICBUUkVFX0NPTlNUQU5UICh2YWx1ZSkgPSAxOwogIFRSRUVfUkVBRE9OTFkgKHZhbHVl
KSA9ICEgZmxhZ193cml0YWJsZV9zdHJpbmdzOwogIFRSRUVfU1RBVElDICh2YWx1ZSkgPSAx
OwogIHJldHVybiB2YWx1ZTsKfQoMCnN0YXRpYyBpbnQgaXNfdmFsaWRfcHJpbnRmX2FyZ2xp
c3QgKHRyZWUpOwpzdGF0aWMgcnR4IGNfZXhwYW5kX2J1aWx0aW4gKHRyZWUsIHJ0eCwgZW51
bSBtYWNoaW5lX21vZGUsCgkJCSAgICAgZW51bSBleHBhbmRfbW9kaWZpZXIpOwpzdGF0aWMg
cnR4IGNfZXhwYW5kX2J1aWx0aW5fcHJpbnRmICh0cmVlLCBydHgsIGVudW0gbWFjaGluZV9t
b2RlLAoJCQkJICAgIGVudW0gZXhwYW5kX21vZGlmaWVyLCBpbnQsIGludCk7CnN0YXRpYyBy
dHggY19leHBhbmRfYnVpbHRpbl9mcHJpbnRmICh0cmVlLCBydHgsIGVudW0gbWFjaGluZV9t
b2RlLAoJCQkJICAgICBlbnVtIGV4cGFuZF9tb2RpZmllciwgaW50LCBpbnQpOwoMCi8qIFBy
aW50IGEgd2FybmluZyBpZiBhIGNvbnN0YW50IGV4cHJlc3Npb24gaGFkIG92ZXJmbG93IGlu
IGZvbGRpbmcuCiAgIEludm9rZSB0aGlzIGZ1bmN0aW9uIG9uIGV2ZXJ5IGV4cHJlc3Npb24g
dGhhdCB0aGUgbGFuZ3VhZ2UKICAgcmVxdWlyZXMgdG8gYmUgYSBjb25zdGFudCBleHByZXNz
aW9uLgogICBOb3RlIHRoZSBBTlNJIEMgc3RhbmRhcmQgc2F5cyBpdCBpcyBlcnJvbmVvdXMg
Zm9yIGEKICAgY29uc3RhbnQgZXhwcmVzc2lvbiB0byBvdmVyZmxvdy4gICovCgp2b2lkCmNv
bnN0YW50X2V4cHJlc3Npb25fd2FybmluZyAodHJlZSB2YWx1ZSkKewogIGlmICgoVFJFRV9D
T0RFICh2YWx1ZSkgPT0gSU5URUdFUl9DU1QgfHwgVFJFRV9DT0RFICh2YWx1ZSkgPT0gUkVB
TF9DU1QKICAgICAgIHx8IFRSRUVfQ09ERSAodmFsdWUpID09IFZFQ1RPUl9DU1QKICAgICAg
IHx8IFRSRUVfQ09ERSAodmFsdWUpID09IENPTVBMRVhfQ1NUKQogICAgICAmJiBUUkVFX0NP
TlNUQU5UX09WRVJGTE9XICh2YWx1ZSkgJiYgcGVkYW50aWMpCiAgICBwZWR3YXJuICgib3Zl
cmZsb3cgaW4gY29uc3RhbnQgZXhwcmVzc2lvbiIpOwp9CgovKiBQcmludCBhIHdhcm5pbmcg
aWYgYW4gZXhwcmVzc2lvbiBoYWQgb3ZlcmZsb3cgaW4gZm9sZGluZy4KICAgSW52b2tlIHRo
aXMgZnVuY3Rpb24gb24gZXZlcnkgZXhwcmVzc2lvbiB0aGF0CiAgICgxKSBhcHBlYXJzIGlu
IHRoZSBzb3VyY2UgY29kZSwgYW5kCiAgICgyKSBtaWdodCBiZSBhIGNvbnN0YW50IGV4cHJl
c3Npb24gdGhhdCBvdmVyZmxvd2VkLCBhbmQKICAgKDMpIGlzIG5vdCBhbHJlYWR5IGNoZWNr
ZWQgYnkgY29udmVydF9hbmRfY2hlY2s7CiAgIGhvd2V2ZXIsIGRvIG5vdCBpbnZva2UgdGhp
cyBmdW5jdGlvbiBvbiBvcGVyYW5kcyBvZiBleHBsaWNpdCBjYXN0cy4gICovCgp2b2lkCm92
ZXJmbG93X3dhcm5pbmcgKHRyZWUgdmFsdWUpCnsKICBpZiAoKFRSRUVfQ09ERSAodmFsdWUp
ID09IElOVEVHRVJfQ1NUCiAgICAgICB8fCAoVFJFRV9DT0RFICh2YWx1ZSkgPT0gQ09NUExF
WF9DU1QKCSAgICYmIFRSRUVfQ09ERSAoVFJFRV9SRUFMUEFSVCAodmFsdWUpKSA9PSBJTlRF
R0VSX0NTVCkpCiAgICAgICYmIFRSRUVfT1ZFUkZMT1cgKHZhbHVlKSkKICAgIHsKICAgICAg
VFJFRV9PVkVSRkxPVyAodmFsdWUpID0gMDsKICAgICAgaWYgKHNraXBfZXZhbHVhdGlvbiA9
PSAwKQoJd2FybmluZyAoImludGVnZXIgb3ZlcmZsb3cgaW4gZXhwcmVzc2lvbiIpOwogICAg
fQogIGVsc2UgaWYgKChUUkVFX0NPREUgKHZhbHVlKSA9PSBSRUFMX0NTVAoJICAgIHx8IChU
UkVFX0NPREUgKHZhbHVlKSA9PSBDT01QTEVYX0NTVAoJCSYmIFRSRUVfQ09ERSAoVFJFRV9S
RUFMUEFSVCAodmFsdWUpKSA9PSBSRUFMX0NTVCkpCgkgICAmJiBUUkVFX09WRVJGTE9XICh2
YWx1ZSkpCiAgICB7CiAgICAgIFRSRUVfT1ZFUkZMT1cgKHZhbHVlKSA9IDA7CiAgICAgIGlm
IChza2lwX2V2YWx1YXRpb24gPT0gMCkKCXdhcm5pbmcgKCJmbG9hdGluZyBwb2ludCBvdmVy
ZmxvdyBpbiBleHByZXNzaW9uIik7CiAgICB9CiAgZWxzZSBpZiAoVFJFRV9DT0RFICh2YWx1
ZSkgPT0gVkVDVE9SX0NTVCAmJiBUUkVFX09WRVJGTE9XICh2YWx1ZSkpCiAgICB7CiAgICAg
IFRSRUVfT1ZFUkZMT1cgKHZhbHVlKSA9IDA7CiAgICAgIGlmIChza2lwX2V2YWx1YXRpb24g
PT0gMCkKCXdhcm5pbmcgKCJ2ZWN0b3Igb3ZlcmZsb3cgaW4gZXhwcmVzc2lvbiIpOwogICAg
fQp9CgovKiBQcmludCBhIHdhcm5pbmcgaWYgYSBsYXJnZSBjb25zdGFudCBpcyB0cnVuY2F0
ZWQgdG8gdW5zaWduZWQsCiAgIG9yIGlmIC1XY29udmVyc2lvbiBpcyB1c2VkIGFuZCBhIGNv
bnN0YW50IDwgMCBpcyBjb252ZXJ0ZWQgdG8gdW5zaWduZWQuCiAgIEludm9rZSB0aGlzIGZ1
bmN0aW9uIG9uIGV2ZXJ5IGV4cHJlc3Npb24gdGhhdCBtaWdodCBiZSBpbXBsaWNpdGx5CiAg
IGNvbnZlcnRlZCB0byBhbiB1bnNpZ25lZCB0eXBlLiAgKi8KCnZvaWQKdW5zaWduZWRfY29u
dmVyc2lvbl93YXJuaW5nICh0cmVlIHJlc3VsdCwgdHJlZSBvcGVyYW5kKQp7CiAgdHJlZSB0
eXBlID0gVFJFRV9UWVBFIChyZXN1bHQpOwoKICBpZiAoVFJFRV9DT0RFIChvcGVyYW5kKSA9
PSBJTlRFR0VSX0NTVAogICAgICAmJiBUUkVFX0NPREUgKHR5cGUpID09IElOVEVHRVJfVFlQ
RQogICAgICAmJiBUUkVFX1VOU0lHTkVEICh0eXBlKQogICAgICAmJiBza2lwX2V2YWx1YXRp
b24gPT0gMAogICAgICAmJiAhaW50X2ZpdHNfdHlwZV9wIChvcGVyYW5kLCB0eXBlKSkKICAg
IHsKICAgICAgaWYgKCFpbnRfZml0c190eXBlX3AgKG9wZXJhbmQsIGNfY29tbW9uX3NpZ25l
ZF90eXBlICh0eXBlKSkpCgkvKiBUaGlzIGRldGVjdHMgY2FzZXMgbGlrZSBjb252ZXJ0aW5n
IC0xMjkgb3IgMjU2IHRvIHVuc2lnbmVkIGNoYXIuICAqLwoJd2FybmluZyAoImxhcmdlIGlu
dGVnZXIgaW1wbGljaXRseSB0cnVuY2F0ZWQgdG8gdW5zaWduZWQgdHlwZSIpOwogICAgICBl
bHNlIGlmICh3YXJuX2NvbnZlcnNpb24pCgl3YXJuaW5nICgibmVnYXRpdmUgaW50ZWdlciBp
bXBsaWNpdGx5IGNvbnZlcnRlZCB0byB1bnNpZ25lZCB0eXBlIik7CiAgICB9Cn0KCi8qIE5v
bnplcm8gaWYgY29uc3RhbnQgQyBoYXMgYSB2YWx1ZSB0aGF0IGlzIHBlcm1pc3NpYmxlCiAg
IGZvciB0eXBlIFRZUEUgKGFuIElOVEVHRVJfVFlQRSkuICAqLwoKc3RhdGljIGludApjb25z
dGFudF9maXRzX3R5cGVfcCAodHJlZSBjLCB0cmVlIHR5cGUpCnsKICBpZiAoVFJFRV9DT0RF
IChjKSA9PSBJTlRFR0VSX0NTVCkKICAgIHJldHVybiBpbnRfZml0c190eXBlX3AgKGMsIHR5
cGUpOwoKICBjID0gY29udmVydCAodHlwZSwgYyk7CiAgcmV0dXJuICFUUkVFX09WRVJGTE9X
IChjKTsKfQoKLyogQ29udmVydCBFWFBSIHRvIFRZUEUsIHdhcm5pbmcgYWJvdXQgY29udmVy
c2lvbiBwcm9ibGVtcyB3aXRoIGNvbnN0YW50cy4KICAgSW52b2tlIHRoaXMgZnVuY3Rpb24g
b24gZXZlcnkgZXhwcmVzc2lvbiB0aGF0IGlzIGNvbnZlcnRlZCBpbXBsaWNpdGx5LAogICBp
LmUuIGJlY2F1c2Ugb2YgbGFuZ3VhZ2UgcnVsZXMgYW5kIG5vdCBiZWNhdXNlIG9mIGFuIGV4
cGxpY2l0IGNhc3QuICAqLwoKdHJlZQpjb252ZXJ0X2FuZF9jaGVjayAodHJlZSB0eXBlLCB0
cmVlIGV4cHIpCnsKICB0cmVlIHQgPSBjb252ZXJ0ICh0eXBlLCBleHByKTsKICBpZiAoVFJF
RV9DT0RFICh0KSA9PSBJTlRFR0VSX0NTVCkKICAgIHsKICAgICAgaWYgKFRSRUVfT1ZFUkZM
T1cgKHQpKQoJewoJICBUUkVFX09WRVJGTE9XICh0KSA9IDA7CgoJICAvKiBEbyBub3QgZGlh
Z25vc2Ugb3ZlcmZsb3cgaW4gYSBjb25zdGFudCBleHByZXNzaW9uIG1lcmVseQoJICAgICBi
ZWNhdXNlIGEgY29udmVyc2lvbiBvdmVyZmxvd2VkLiAgKi8KCSAgVFJFRV9DT05TVEFOVF9P
VkVSRkxPVyAodCkgPSBUUkVFX0NPTlNUQU5UX09WRVJGTE9XIChleHByKTsKCgkgIC8qIE5v
IHdhcm5pbmcgZm9yIGNvbnZlcnRpbmcgMHg4MDAwMDAwMCB0byBpbnQuICAqLwoJICBpZiAo
IShUUkVFX1VOU0lHTkVEICh0eXBlKSA8IFRSRUVfVU5TSUdORUQgKFRSRUVfVFlQRSAoZXhw
cikpCgkJJiYgVFJFRV9DT0RFIChUUkVFX1RZUEUgKGV4cHIpKSA9PSBJTlRFR0VSX1RZUEUK
CQkmJiBUWVBFX1BSRUNJU0lPTiAodHlwZSkgPT0gVFlQRV9QUkVDSVNJT04gKFRSRUVfVFlQ
RSAoZXhwcikpKSkKCSAgICAvKiBJZiBFWFBSIGZpdHMgaW4gdGhlIHVuc2lnbmVkIHZlcnNp
b24gb2YgVFlQRSwKCSAgICAgICBkb24ndCB3YXJuIHVubGVzcyBwZWRhbnRpYy4gICovCgkg
ICAgaWYgKChwZWRhbnRpYwoJCSB8fCBUUkVFX1VOU0lHTkVEICh0eXBlKQoJCSB8fCAhIGNv
bnN0YW50X2ZpdHNfdHlwZV9wIChleHByLAoJCQkJCSAgICBjX2NvbW1vbl91bnNpZ25lZF90
eXBlICh0eXBlKSkpCgkgICAgICAgICYmIHNraXBfZXZhbHVhdGlvbiA9PSAwKQoJICAgICAg
d2FybmluZyAoIm92ZXJmbG93IGluIGltcGxpY2l0IGNvbnN0YW50IGNvbnZlcnNpb24iKTsK
CX0KICAgICAgZWxzZQoJdW5zaWduZWRfY29udmVyc2lvbl93YXJuaW5nICh0LCBleHByKTsK
ICAgIH0KICByZXR1cm4gdDsKfQoMCi8qIEEgbm9kZSBpbiBhIGxpc3QgdGhhdCBkZXNjcmli
ZXMgcmVmZXJlbmNlcyB0byB2YXJpYWJsZXMgKEVYUFIpLCB3aGljaCBhcmUKICAgZWl0aGVy
IHJlYWQgYWNjZXNzZXMgaWYgV1JJVEVSIGlzIHplcm8sIG9yIHdyaXRlIGFjY2Vzc2VzLCBp
biB3aGljaCBjYXNlCiAgIFdSSVRFUiBpcyB0aGUgcGFyZW50IG9mIEVYUFIuICAqLwpzdHJ1
Y3QgdGxpc3QKewogIHN0cnVjdCB0bGlzdCAqbmV4dDsKICB0cmVlIGV4cHIsIHdyaXRlcjsK
fTsKCi8qIFVzZWQgdG8gaW1wbGVtZW50IGEgY2FjaGUgdGhlIHJlc3VsdHMgb2YgYSBjYWxs
IHRvIHZlcmlmeV90cmVlLiAgV2Ugb25seQogICB1c2UgdGhpcyBmb3IgU0FWRV9FWFBScy4g
ICovCnN0cnVjdCB0bGlzdF9jYWNoZQp7CiAgc3RydWN0IHRsaXN0X2NhY2hlICpuZXh0Owog
IHN0cnVjdCB0bGlzdCAqY2FjaGVfYmVmb3JlX3NwOwogIHN0cnVjdCB0bGlzdCAqY2FjaGVf
YWZ0ZXJfc3A7CiAgdHJlZSBleHByOwp9OwoKLyogT2JzdGFjayB0byB1c2Ugd2hlbiBhbGxv
Y2F0aW5nIHRsaXN0IHN0cnVjdHVyZXMsIGFuZCBjb3JyZXNwb25kaW5nCiAgIGZpcnN0b2Jq
LiAgKi8Kc3RhdGljIHN0cnVjdCBvYnN0YWNrIHRsaXN0X29ic3RhY2s7CnN0YXRpYyBjaGFy
ICp0bGlzdF9maXJzdG9iaiA9IDA7CgovKiBLZWVwIHRyYWNrIG9mIHRoZSBpZGVudGlmaWVy
cyB3ZSd2ZSB3YXJuZWQgYWJvdXQsIHNvIHdlIGNhbiBhdm9pZCBkdXBsaWNhdGUKICAgd2Fy
bmluZ3MuICAqLwpzdGF0aWMgc3RydWN0IHRsaXN0ICp3YXJuZWRfaWRzOwovKiBTQVZFX0VY
UFJzIG5lZWQgc3BlY2lhbCB0cmVhdG1lbnQuICBXZSBwcm9jZXNzIHRoZW0gb25seSBvbmNl
IGFuZCB0aGVuCiAgIGNhY2hlIHRoZSByZXN1bHRzLiAgKi8Kc3RhdGljIHN0cnVjdCB0bGlz
dF9jYWNoZSAqc2F2ZV9leHByX2NhY2hlOwoKc3RhdGljIHZvaWQgYWRkX3RsaXN0IChzdHJ1
Y3QgdGxpc3QgKiosIHN0cnVjdCB0bGlzdCAqLCB0cmVlLCBpbnQpOwpzdGF0aWMgdm9pZCBt
ZXJnZV90bGlzdCAoc3RydWN0IHRsaXN0ICoqLCBzdHJ1Y3QgdGxpc3QgKiwgaW50KTsKc3Rh
dGljIHZvaWQgdmVyaWZ5X3RyZWUgKHRyZWUsIHN0cnVjdCB0bGlzdCAqKiwgc3RydWN0IHRs
aXN0ICoqLCB0cmVlKTsKc3RhdGljIGludCB3YXJuaW5nX2NhbmRpZGF0ZV9wICh0cmVlKTsK
c3RhdGljIHZvaWQgd2Fybl9mb3JfY29sbGlzaW9ucyAoc3RydWN0IHRsaXN0ICopOwpzdGF0
aWMgdm9pZCB3YXJuX2Zvcl9jb2xsaXNpb25zXzEgKHRyZWUsIHRyZWUsIHN0cnVjdCB0bGlz
dCAqLCBpbnQpOwpzdGF0aWMgc3RydWN0IHRsaXN0ICpuZXdfdGxpc3QgKHN0cnVjdCB0bGlz
dCAqLCB0cmVlLCB0cmVlKTsKc3RhdGljIHZvaWQgdmVyaWZ5X3NlcXVlbmNlX3BvaW50cyAo
dHJlZSk7CgovKiBDcmVhdGUgYSBuZXcgc3RydWN0IHRsaXN0IGFuZCBmaWxsIGluIGl0cyBm
aWVsZHMuICAqLwpzdGF0aWMgc3RydWN0IHRsaXN0ICoKbmV3X3RsaXN0IChzdHJ1Y3QgdGxp
c3QgKm5leHQsIHRyZWUgdCwgdHJlZSB3cml0ZXIpCnsKICBzdHJ1Y3QgdGxpc3QgKmw7CiAg
bCA9IChzdHJ1Y3QgdGxpc3QgKikgb2JzdGFja19hbGxvYyAoJnRsaXN0X29ic3RhY2ssIHNp
emVvZiAqbCk7CiAgbC0+bmV4dCA9IG5leHQ7CiAgbC0+ZXhwciA9IHQ7CiAgbC0+d3JpdGVy
ID0gd3JpdGVyOwogIHJldHVybiBsOwp9CgovKiBBZGQgZHVwbGljYXRlcyBvZiB0aGUgbm9k
ZXMgZm91bmQgaW4gQUREIHRvIHRoZSBsaXN0ICpUTy4gIElmIEVYQ0xVREVfV1JJVEVSCiAg
IGlzIG5vbm51bGwsIHdlIGlnbm9yZSBhbnkgbm9kZSB3ZSBmaW5kIHdoaWNoIGhhcyBhIHdy
aXRlciBlcXVhbCB0byBpdC4gICovCgpzdGF0aWMgdm9pZAphZGRfdGxpc3QgKHN0cnVjdCB0
bGlzdCAqKnRvLCBzdHJ1Y3QgdGxpc3QgKmFkZCwgdHJlZSBleGNsdWRlX3dyaXRlciwgaW50
IGNvcHkpCnsKICB3aGlsZSAoYWRkKQogICAgewogICAgICBzdHJ1Y3QgdGxpc3QgKm5leHQg
PSBhZGQtPm5leHQ7CiAgICAgIGlmICghIGNvcHkpCglhZGQtPm5leHQgPSAqdG87CiAgICAg
IGlmICghIGV4Y2x1ZGVfd3JpdGVyIHx8IGFkZC0+d3JpdGVyICE9IGV4Y2x1ZGVfd3JpdGVy
KQoJKnRvID0gY29weSA/IG5ld190bGlzdCAoKnRvLCBhZGQtPmV4cHIsIGFkZC0+d3JpdGVy
KSA6IGFkZDsKICAgICAgYWRkID0gbmV4dDsKICAgIH0KfQoKLyogTWVyZ2UgdGhlIG5vZGVz
IG9mIEFERCBpbnRvIFRPLiAgVGhpcyBtZXJnaW5nIHByb2Nlc3MgaXMgZG9uZSBzbyB0aGF0
IGZvcgogICBlYWNoIHZhcmlhYmxlIHRoYXQgYWxyZWFkeSBleGlzdHMgaW4gVE8sIG5vIG5l
dyBub2RlIGlzIGFkZGVkOyBob3dldmVyIGlmCiAgIHRoZXJlIGlzIGEgd3JpdGUgYWNjZXNz
IHJlY29yZGVkIGluIEFERCwgYW5kIGFuIG9jY3VycmVuY2Ugb24gVE8gaXMgb25seQogICBh
IHJlYWQgYWNjZXNzLCB0aGVuIHRoZSBvY2N1cnJlbmNlIGluIFRPIHdpbGwgYmUgbW9kaWZp
ZWQgdG8gcmVjb3JkIHRoZQogICB3cml0ZS4gICovCgpzdGF0aWMgdm9pZAptZXJnZV90bGlz
dCAoc3RydWN0IHRsaXN0ICoqdG8sIHN0cnVjdCB0bGlzdCAqYWRkLCBpbnQgY29weSkKewog
IHN0cnVjdCB0bGlzdCAqKmVuZCA9IHRvOwoKICB3aGlsZSAoKmVuZCkKICAgIGVuZCA9ICYo
KmVuZCktPm5leHQ7CgogIHdoaWxlIChhZGQpCiAgICB7CiAgICAgIGludCBmb3VuZCA9IDA7
CiAgICAgIHN0cnVjdCB0bGlzdCAqdG1wMjsKICAgICAgc3RydWN0IHRsaXN0ICpuZXh0ID0g
YWRkLT5uZXh0OwoKICAgICAgZm9yICh0bXAyID0gKnRvOyB0bXAyOyB0bXAyID0gdG1wMi0+
bmV4dCkKCWlmICh0bXAyLT5leHByID09IGFkZC0+ZXhwcikKCSAgewoJICAgIGZvdW5kID0g
MTsKCSAgICBpZiAoISB0bXAyLT53cml0ZXIpCgkgICAgICB0bXAyLT53cml0ZXIgPSBhZGQt
PndyaXRlcjsKCSAgfQogICAgICBpZiAoISBmb3VuZCkKCXsKCSAgKmVuZCA9IGNvcHkgPyBh
ZGQgOiBuZXdfdGxpc3QgKE5VTEwsIGFkZC0+ZXhwciwgYWRkLT53cml0ZXIpOwoJICBlbmQg
PSAmKCplbmQpLT5uZXh0OwoJICAqZW5kID0gMDsKCX0KICAgICAgYWRkID0gbmV4dDsKICAg
IH0KfQoKLyogV1JJVFRFTiBpcyBhIHZhcmlhYmxlLCBXUklURVIgaXMgaXRzIHBhcmVudC4g
IFdhcm4gaWYgYW55IG9mIHRoZSB2YXJpYWJsZQogICByZWZlcmVuY2VzIGluIGxpc3QgTElT
VCBjb25mbGljdCB3aXRoIGl0LCBleGNsdWRpbmcgcmVhZHMgaWYgT05MWSB3cml0ZXJzCiAg
IGlzIG5vbnplcm8uICAqLwoKc3RhdGljIHZvaWQKd2Fybl9mb3JfY29sbGlzaW9uc18xICh0
cmVlIHdyaXR0ZW4sIHRyZWUgd3JpdGVyLCBzdHJ1Y3QgdGxpc3QgKmxpc3QsCgkJICAgICAg
IGludCBvbmx5X3dyaXRlcykKewogIHN0cnVjdCB0bGlzdCAqdG1wOwoKICAvKiBBdm9pZCBk
dXBsaWNhdGUgd2FybmluZ3MuICAqLwogIGZvciAodG1wID0gd2FybmVkX2lkczsgdG1wOyB0
bXAgPSB0bXAtPm5leHQpCiAgICBpZiAodG1wLT5leHByID09IHdyaXR0ZW4pCiAgICAgIHJl
dHVybjsKCiAgd2hpbGUgKGxpc3QpCiAgICB7CiAgICAgIGlmIChsaXN0LT5leHByID09IHdy
aXR0ZW4KCSAgJiYgbGlzdC0+d3JpdGVyICE9IHdyaXRlcgoJICAmJiAoISBvbmx5X3dyaXRl
cyB8fCBsaXN0LT53cml0ZXIpKQoJewoJICB3YXJuZWRfaWRzID0gbmV3X3RsaXN0ICh3YXJu
ZWRfaWRzLCB3cml0dGVuLCBOVUxMX1RSRUUpOwoJICB3YXJuaW5nICgib3BlcmF0aW9uIG9u
IGAlcycgbWF5IGJlIHVuZGVmaW5lZCIsCgkJICAgSURFTlRJRklFUl9QT0lOVEVSIChERUNM
X05BTUUgKGxpc3QtPmV4cHIpKSk7Cgl9CiAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwogICAg
fQp9CgovKiBHaXZlbiBhIGxpc3QgTElTVCBvZiByZWZlcmVuY2VzIHRvIHZhcmlhYmxlcywg
ZmluZCB3aGV0aGVyIGFueSBvZiB0aGVzZQogICBjYW4gY2F1c2UgY29uZmxpY3RzIGR1ZSB0
byBtaXNzaW5nIHNlcXVlbmNlIHBvaW50cy4gICovCgpzdGF0aWMgdm9pZAp3YXJuX2Zvcl9j
b2xsaXNpb25zIChzdHJ1Y3QgdGxpc3QgKmxpc3QpCnsKICBzdHJ1Y3QgdGxpc3QgKnRtcDsK
CiAgZm9yICh0bXAgPSBsaXN0OyB0bXA7IHRtcCA9IHRtcC0+bmV4dCkKICAgIHsKICAgICAg
aWYgKHRtcC0+d3JpdGVyKQoJd2Fybl9mb3JfY29sbGlzaW9uc18xICh0bXAtPmV4cHIsIHRt
cC0+d3JpdGVyLCBsaXN0LCAwKTsKICAgIH0KfQoKLyogUmV0dXJuIG5vbnplcm8gaWYgWCBp
cyBhIHRyZWUgdGhhdCBjYW4gYmUgdmVyaWZpZWQgYnkgdGhlIHNlcXVlbmNlIHBvaW50CiAg
IHdhcm5pbmdzLiAgKi8Kc3RhdGljIGludAp3YXJuaW5nX2NhbmRpZGF0ZV9wICh0cmVlIHgp
CnsKICByZXR1cm4gVFJFRV9DT0RFICh4KSA9PSBWQVJfREVDTCB8fCBUUkVFX0NPREUgKHgp
ID09IFBBUk1fREVDTDsKfQoKLyogV2FsayB0aGUgdHJlZSBYLCBhbmQgcmVjb3JkIGFjY2Vz
c2VzIHRvIHZhcmlhYmxlcy4gIElmIFggaXMgd3JpdHRlbiBieSB0aGUKICAgcGFyZW50IHRy
ZWUsIFdSSVRFUiBpcyB0aGUgcGFyZW50LgogICBXZSBzdG9yZSBhY2Nlc3NlcyBpbiBvbmUg
b2YgdGhlIHR3byBsaXN0czogUEJFRk9SRV9TUCwgYW5kIFBOT19TUC4gIElmIHRoaXMKICAg
ZXhwcmVzc2lvbiBvciBpdHMgb25seSBvcGVyYW5kIGZvcmNlcyBhIHNlcXVlbmNlIHBvaW50
LCB0aGVuIGV2ZXJ5dGhpbmcgdXAKICAgdG8gdGhlIHNlcXVlbmNlIHBvaW50IGlzIHN0b3Jl
ZCBpbiBQQkVGT1JFX1NQLiAgRXZlcnl0aGluZyBlbHNlIGdldHMgc3RvcmVkCiAgIGluIFBO
T19TUC4KICAgT25jZSB3ZSByZXR1cm4sIHdlIHdpbGwgaGF2ZSBlbWl0dGVkIHdhcm5pbmdz
IGlmIGFueSBzdWJleHByZXNzaW9uIGJlZm9yZQogICBzdWNoIGEgc2VxdWVuY2UgcG9pbnQg
Y291bGQgYmUgdW5kZWZpbmVkLiAgT24gYSBoaWdoZXIgbGV2ZWwsIGhvd2V2ZXIsIHRoZQog
ICBzZXF1ZW5jZSBwb2ludCBtYXkgbm90IGJlIHJlbGV2YW50LCBhbmQgd2UnbGwgbWVyZ2Ug
dGhlIHR3byBsaXN0cy4KCiAgIEV4YW1wbGU6IChiKyssIGEpICsgYjsKICAgVGhlIGNhbGwg
dGhhdCBwcm9jZXNzZXMgdGhlIENPTVBPVU5EX0VYUFIgd2lsbCBzdG9yZSB0aGUgaW5jcmVt
ZW50IG9mIEIKICAgaW4gUEJFRk9SRV9TUCwgYW5kIHRoZSB1c2Ugb2YgQSBpbiBQTk9fU1Au
ICBUaGUgaGlnaGVyLWxldmVsIGNhbGwgdGhhdAogICBwcm9jZXNzZXMgdGhlIFBMVVNfRVhQ
UiB3aWxsIG5lZWQgdG8gbWVyZ2UgdGhlIHR3byBsaXN0cyBzbyB0aGF0CiAgIGV2ZW50dWFs
bHksIGFsbCBhY2Nlc3NlcyBlbmQgdXAgb24gdGhlIHNhbWUgbGlzdCAoYW5kIHdlJ2xsIHdh
cm4gYWJvdXQgdGhlCiAgIHVub3JkZXJlZCBzdWJleHByZXNzaW9ucyBiKysgYW5kIGIuCgog
ICBBIG5vdGUgb24gbWVyZ2luZy4gIElmIHdlIG1vZGlmeSB0aGUgZm9ybWVyIGV4YW1wbGUg
c28gdGhhdCBvdXIgZXhwcmVzc2lvbgogICBiZWNvbWVzCiAgICAgKGIrKywgYikgKyBhCiAg
IGNhcmUgbXVzdCBiZSB0YWtlbiBub3Qgc2ltcGx5IHRvIGFkZCBhbGwgdGhyZWUgZXhwcmVz
c2lvbnMgaW50byB0aGUgZmluYWwKICAgUE5PX1NQIGxpc3QuICBUaGUgZnVuY3Rpb24gbWVy
Z2VfdGxpc3QgdGFrZXMgY2FyZSBvZiB0aGF0IGJ5IG1lcmdpbmcgdGhlCiAgIGJlZm9yZS1T
UCBsaXN0IG9mIHRoZSBDT01QT1VORF9FWFBSIGludG8gaXRzIGFmdGVyLVNQIGxpc3QgaW4g
YSBzcGVjaWFsCiAgIHdheSwgc28gdGhhdCBubyBtb3JlIHRoYW4gb25lIGFjY2VzcyB0byBC
IGlzIHJlY29yZGVkLiAgKi8KCnN0YXRpYyB2b2lkCnZlcmlmeV90cmVlICh0cmVlIHgsIHN0
cnVjdCB0bGlzdCAqKnBiZWZvcmVfc3AsIHN0cnVjdCB0bGlzdCAqKnBub19zcCwKCSAgICAg
dHJlZSB3cml0ZXIpCnsKICBzdHJ1Y3QgdGxpc3QgKnRtcF9iZWZvcmUsICp0bXBfbm9zcCwg
KnRtcF9saXN0MiwgKnRtcF9saXN0MzsKICBlbnVtIHRyZWVfY29kZSBjb2RlOwogIGNoYXIg
Y2xhc3M7CgogIC8qIFggbWF5IGJlIE5VTEwgaWYgaXQgaXMgdGhlIG9wZXJhbmQgb2YgYW4g
ZW1wdHkgc3RhdGVtZW50IGV4cHJlc3Npb24KICAgICAoeyB9KS4gICovCiAgaWYgKHggPT0g
TlVMTCkKICAgIHJldHVybjsKCiByZXN0YXJ0OgogIGNvZGUgPSBUUkVFX0NPREUgKHgpOwog
IGNsYXNzID0gVFJFRV9DT0RFX0NMQVNTIChjb2RlKTsKCiAgaWYgKHdhcm5pbmdfY2FuZGlk
YXRlX3AgKHgpKQogICAgewogICAgICAqcG5vX3NwID0gbmV3X3RsaXN0ICgqcG5vX3NwLCB4
LCB3cml0ZXIpOwogICAgICByZXR1cm47CiAgICB9CgogIHN3aXRjaCAoY29kZSkKICAgIHsK
ICAgIGNhc2UgQ09OU1RSVUNUT1I6CiAgICAgIHJldHVybjsKCiAgICBjYXNlIENPTVBPVU5E
X0VYUFI6CiAgICBjYXNlIFRSVVRIX0FORElGX0VYUFI6CiAgICBjYXNlIFRSVVRIX09SSUZf
RVhQUjoKICAgICAgdG1wX2JlZm9yZSA9IHRtcF9ub3NwID0gdG1wX2xpc3QzID0gMDsKICAg
ICAgdmVyaWZ5X3RyZWUgKFRSRUVfT1BFUkFORCAoeCwgMCksICZ0bXBfYmVmb3JlLCAmdG1w
X25vc3AsIE5VTExfVFJFRSk7CiAgICAgIHdhcm5fZm9yX2NvbGxpc2lvbnMgKHRtcF9ub3Nw
KTsKICAgICAgbWVyZ2VfdGxpc3QgKHBiZWZvcmVfc3AsIHRtcF9iZWZvcmUsIDApOwogICAg
ICBtZXJnZV90bGlzdCAocGJlZm9yZV9zcCwgdG1wX25vc3AsIDApOwogICAgICB2ZXJpZnlf
dHJlZSAoVFJFRV9PUEVSQU5EICh4LCAxKSwgJnRtcF9saXN0MywgcG5vX3NwLCBOVUxMX1RS
RUUpOwogICAgICBtZXJnZV90bGlzdCAocGJlZm9yZV9zcCwgdG1wX2xpc3QzLCAwKTsKICAg
ICAgcmV0dXJuOwoKICAgIGNhc2UgQ09ORF9FWFBSOgogICAgICB0bXBfYmVmb3JlID0gdG1w
X2xpc3QyID0gMDsKICAgICAgdmVyaWZ5X3RyZWUgKFRSRUVfT1BFUkFORCAoeCwgMCksICZ0
bXBfYmVmb3JlLCAmdG1wX2xpc3QyLCBOVUxMX1RSRUUpOwogICAgICB3YXJuX2Zvcl9jb2xs
aXNpb25zICh0bXBfbGlzdDIpOwogICAgICBtZXJnZV90bGlzdCAocGJlZm9yZV9zcCwgdG1w
X2JlZm9yZSwgMCk7CiAgICAgIG1lcmdlX3RsaXN0IChwYmVmb3JlX3NwLCB0bXBfbGlzdDIs
IDEpOwoKICAgICAgdG1wX2xpc3QzID0gdG1wX25vc3AgPSAwOwogICAgICB2ZXJpZnlfdHJl
ZSAoVFJFRV9PUEVSQU5EICh4LCAxKSwgJnRtcF9saXN0MywgJnRtcF9ub3NwLCBOVUxMX1RS
RUUpOwogICAgICB3YXJuX2Zvcl9jb2xsaXNpb25zICh0bXBfbm9zcCk7CiAgICAgIG1lcmdl
X3RsaXN0IChwYmVmb3JlX3NwLCB0bXBfbGlzdDMsIDApOwoKICAgICAgdG1wX2xpc3QzID0g
dG1wX2xpc3QyID0gMDsKICAgICAgdmVyaWZ5X3RyZWUgKFRSRUVfT1BFUkFORCAoeCwgMiks
ICZ0bXBfbGlzdDMsICZ0bXBfbGlzdDIsIE5VTExfVFJFRSk7CiAgICAgIHdhcm5fZm9yX2Nv
bGxpc2lvbnMgKHRtcF9saXN0Mik7CiAgICAgIG1lcmdlX3RsaXN0IChwYmVmb3JlX3NwLCB0
bXBfbGlzdDMsIDApOwogICAgICAvKiBSYXRoZXIgdGhhbiBhZGQgYm90aCB0bXBfbm9zcCBh
bmQgdG1wX2xpc3QyLCB3ZSBoYXZlIHRvIG1lcmdlIHRoZQoJIHR3byBmaXJzdCwgdG8gYXZv
aWQgd2FybmluZyBmb3IgKGEgPyBiKysgOiBiKyspLiAgKi8KICAgICAgbWVyZ2VfdGxpc3Qg
KCZ0bXBfbm9zcCwgdG1wX2xpc3QyLCAwKTsKICAgICAgYWRkX3RsaXN0IChwbm9fc3AsIHRt
cF9ub3NwLCBOVUxMX1RSRUUsIDApOwogICAgICByZXR1cm47CgogICAgY2FzZSBQUkVERUNS
RU1FTlRfRVhQUjoKICAgIGNhc2UgUFJFSU5DUkVNRU5UX0VYUFI6CiAgICBjYXNlIFBPU1RE
RUNSRU1FTlRfRVhQUjoKICAgIGNhc2UgUE9TVElOQ1JFTUVOVF9FWFBSOgogICAgICB2ZXJp
ZnlfdHJlZSAoVFJFRV9PUEVSQU5EICh4LCAwKSwgcG5vX3NwLCBwbm9fc3AsIHgpOwogICAg
ICByZXR1cm47CgogICAgY2FzZSBNT0RJRllfRVhQUjoKICAgICAgdG1wX2JlZm9yZSA9IHRt
cF9ub3NwID0gdG1wX2xpc3QzID0gMDsKICAgICAgdmVyaWZ5X3RyZWUgKFRSRUVfT1BFUkFO
RCAoeCwgMSksICZ0bXBfYmVmb3JlLCAmdG1wX25vc3AsIE5VTExfVFJFRSk7CiAgICAgIHZl
cmlmeV90cmVlIChUUkVFX09QRVJBTkQgKHgsIDApLCAmdG1wX2xpc3QzLCAmdG1wX2xpc3Qz
LCB4KTsKICAgICAgLyogRXhwcmVzc2lvbnMgaW5zaWRlIHRoZSBMSFMgYXJlIG5vdCBvcmRl
cmVkIHdydC4gdGhlIHNlcXVlbmNlIHBvaW50cwoJIGluIHRoZSBSSFMuICBFeGFtcGxlOgoJ
ICAgKmEgPSAoYSsrLCAyKQoJIERlc3BpdGUgdGhlIGZhY3QgdGhhdCB0aGUgbW9kaWZpY2F0
aW9uIG9mICJhIiBpcyBpbiB0aGUgYmVmb3JlX3NwCgkgbGlzdCAodG1wX2JlZm9yZSksIGl0
IGNvbmZsaWN0cyB3aXRoIHRoZSB1c2Ugb2YgImEiIGluIHRoZSBMSFMuCgkgV2UgY2FuIGhh
bmRsZSB0aGlzIGJ5IGFkZGluZyB0aGUgY29udGVudHMgb2YgdG1wX2xpc3QzCgkgdG8gdGhv
c2Ugb2YgdG1wX2JlZm9yZSwgYW5kIHJlZG9pbmcgdGhlIGNvbGxpc2lvbiB3YXJuaW5ncyBm
b3IgdGhhdAoJIGxpc3QuICAqLwogICAgICBhZGRfdGxpc3QgKCZ0bXBfYmVmb3JlLCB0bXBf
bGlzdDMsIHgsIDEpOwogICAgICB3YXJuX2Zvcl9jb2xsaXNpb25zICh0bXBfYmVmb3JlKTsK
ICAgICAgLyogRXhjbHVkZSB0aGUgTEhTIGl0c2VsZiBoZXJlOyB3ZSBmaXJzdCBoYXZlIHRv
IG1lcmdlIGl0IGludG8gdGhlCgkgdG1wX25vc3AgbGlzdC4gIFRoaXMgaXMgZG9uZSB0byBh
dm9pZCB3YXJuaW5nIGZvciAiYSA9IGEiOyBpZiB3ZQoJIGRpZG4ndCBleGNsdWRlIHRoZSBM
SFMsIHdlJ2QgZ2V0IGl0IHR3aWNlLCBvbmNlIGFzIGEgcmVhZCBhbmQgb25jZQoJIGFzIGEg
d3JpdGUuICAqLwogICAgICBhZGRfdGxpc3QgKHBub19zcCwgdG1wX2xpc3QzLCB4LCAwKTsK
ICAgICAgd2Fybl9mb3JfY29sbGlzaW9uc18xIChUUkVFX09QRVJBTkQgKHgsIDApLCB4LCB0
bXBfbm9zcCwgMSk7CgogICAgICBtZXJnZV90bGlzdCAocGJlZm9yZV9zcCwgdG1wX2JlZm9y
ZSwgMCk7CiAgICAgIGlmICh3YXJuaW5nX2NhbmRpZGF0ZV9wIChUUkVFX09QRVJBTkQgKHgs
IDApKSkKCW1lcmdlX3RsaXN0ICgmdG1wX25vc3AsIG5ld190bGlzdCAoTlVMTCwgVFJFRV9P
UEVSQU5EICh4LCAwKSwgeCksIDApOwogICAgICBhZGRfdGxpc3QgKHBub19zcCwgdG1wX25v
c3AsIE5VTExfVFJFRSwgMSk7CiAgICAgIHJldHVybjsKCiAgICBjYXNlIENBTExfRVhQUjoK
ICAgICAgLyogV2UgbmVlZCB0byB3YXJuIGFib3V0IGNvbmZsaWN0cyBhbW9uZyBhcmd1bWVu
dHMgYW5kIGNvbmZsaWN0cyBiZXR3ZWVuCgkgYXJncyBhbmQgdGhlIGZ1bmN0aW9uIGFkZHJl
c3MuICBTaWRlIGVmZmVjdHMgb2YgdGhlIGZ1bmN0aW9uIGFkZHJlc3MsCgkgaG93ZXZlciwg
YXJlIG5vdCBvcmRlcmVkIGJ5IHRoZSBzZXF1ZW5jZSBwb2ludCBvZiB0aGUgY2FsbC4gICov
CiAgICAgIHRtcF9iZWZvcmUgPSB0bXBfbm9zcCA9IHRtcF9saXN0MiA9IHRtcF9saXN0MyA9
IDA7CiAgICAgIHZlcmlmeV90cmVlIChUUkVFX09QRVJBTkQgKHgsIDApLCAmdG1wX2JlZm9y
ZSwgJnRtcF9ub3NwLCBOVUxMX1RSRUUpOwogICAgICBpZiAoVFJFRV9PUEVSQU5EICh4LCAx
KSkKCXZlcmlmeV90cmVlIChUUkVFX09QRVJBTkQgKHgsIDEpLCAmdG1wX2xpc3QyLCAmdG1w
X2xpc3QzLCBOVUxMX1RSRUUpOwogICAgICBtZXJnZV90bGlzdCAoJnRtcF9saXN0MywgdG1w
X2xpc3QyLCAwKTsKICAgICAgYWRkX3RsaXN0ICgmdG1wX2JlZm9yZSwgdG1wX2xpc3QzLCBO
VUxMX1RSRUUsIDApOwogICAgICBhZGRfdGxpc3QgKCZ0bXBfYmVmb3JlLCB0bXBfbm9zcCwg
TlVMTF9UUkVFLCAwKTsKICAgICAgd2Fybl9mb3JfY29sbGlzaW9ucyAodG1wX2JlZm9yZSk7
CiAgICAgIGFkZF90bGlzdCAocGJlZm9yZV9zcCwgdG1wX2JlZm9yZSwgTlVMTF9UUkVFLCAw
KTsKICAgICAgcmV0dXJuOwoKICAgIGNhc2UgVFJFRV9MSVNUOgogICAgICAvKiBTY2FuIGFs
bCB0aGUgbGlzdCwgZS5nLiBpbmRpY2VzIG9mIG11bHRpIGRpbWVuc2lvbmFsIGFycmF5LiAg
Ki8KICAgICAgd2hpbGUgKHgpCgl7CgkgIHRtcF9iZWZvcmUgPSB0bXBfbm9zcCA9IDA7Cgkg
IHZlcmlmeV90cmVlIChUUkVFX1ZBTFVFICh4KSwgJnRtcF9iZWZvcmUsICZ0bXBfbm9zcCwg
TlVMTF9UUkVFKTsKCSAgbWVyZ2VfdGxpc3QgKCZ0bXBfbm9zcCwgdG1wX2JlZm9yZSwgMCk7
CgkgIGFkZF90bGlzdCAocG5vX3NwLCB0bXBfbm9zcCwgTlVMTF9UUkVFLCAwKTsKCSAgeCA9
IFRSRUVfQ0hBSU4gKHgpOwoJfQogICAgICByZXR1cm47CgogICAgY2FzZSBTQVZFX0VYUFI6
CiAgICAgIHsKCXN0cnVjdCB0bGlzdF9jYWNoZSAqdDsKCWZvciAodCA9IHNhdmVfZXhwcl9j
YWNoZTsgdDsgdCA9IHQtPm5leHQpCgkgIGlmICh0LT5leHByID09IHgpCgkgICAgYnJlYWs7
CgoJaWYgKCEgdCkKCSAgewoJICAgIHQgPSAoc3RydWN0IHRsaXN0X2NhY2hlICopIG9ic3Rh
Y2tfYWxsb2MgKCZ0bGlzdF9vYnN0YWNrLAoJCQkJCQkgICAgICBzaXplb2YgKnQpOwoJICAg
IHQtPm5leHQgPSBzYXZlX2V4cHJfY2FjaGU7CgkgICAgdC0+ZXhwciA9IHg7CgkgICAgc2F2
ZV9leHByX2NhY2hlID0gdDsKCgkgICAgdG1wX2JlZm9yZSA9IHRtcF9ub3NwID0gMDsKCSAg
ICB2ZXJpZnlfdHJlZSAoVFJFRV9PUEVSQU5EICh4LCAwKSwgJnRtcF9iZWZvcmUsICZ0bXBf
bm9zcCwgTlVMTF9UUkVFKTsKCSAgICB3YXJuX2Zvcl9jb2xsaXNpb25zICh0bXBfbm9zcCk7
CgoJICAgIHRtcF9saXN0MyA9IDA7CgkgICAgd2hpbGUgKHRtcF9ub3NwKQoJICAgICAgewoJ
CXN0cnVjdCB0bGlzdCAqdCA9IHRtcF9ub3NwOwoJCXRtcF9ub3NwID0gdC0+bmV4dDsKCQlt
ZXJnZV90bGlzdCAoJnRtcF9saXN0MywgdCwgMCk7CgkgICAgICB9CgkgICAgdC0+Y2FjaGVf
YmVmb3JlX3NwID0gdG1wX2JlZm9yZTsKCSAgICB0LT5jYWNoZV9hZnRlcl9zcCA9IHRtcF9s
aXN0MzsKCSAgfQoJbWVyZ2VfdGxpc3QgKHBiZWZvcmVfc3AsIHQtPmNhY2hlX2JlZm9yZV9z
cCwgMSk7CglhZGRfdGxpc3QgKHBub19zcCwgdC0+Y2FjaGVfYWZ0ZXJfc3AsIE5VTExfVFJF
RSwgMSk7CglyZXR1cm47CiAgICAgIH0KICAgIGRlZmF1bHQ6CiAgICAgIGJyZWFrOwogICAg
fQoKICBpZiAoY2xhc3MgPT0gJzEnKQogICAgewogICAgICBpZiAoZmlyc3RfcnRsX29wIChj
b2RlKSA9PSAwKQoJcmV0dXJuOwogICAgICB4ID0gVFJFRV9PUEVSQU5EICh4LCAwKTsKICAg
ICAgd3JpdGVyID0gMDsKICAgICAgZ290byByZXN0YXJ0OwogICAgfQoKICBzd2l0Y2ggKGNs
YXNzKQogICAgewogICAgY2FzZSAncic6CiAgICBjYXNlICc8JzoKICAgIGNhc2UgJzInOgog
ICAgY2FzZSAnYic6CiAgICBjYXNlICdlJzoKICAgIGNhc2UgJ3MnOgogICAgY2FzZSAneCc6
CiAgICAgIHsKCWludCBscDsKCWludCBtYXggPSBmaXJzdF9ydGxfb3AgKFRSRUVfQ09ERSAo
eCkpOwoJZm9yIChscCA9IDA7IGxwIDwgbWF4OyBscCsrKQoJICB7CgkgICAgdG1wX2JlZm9y
ZSA9IHRtcF9ub3NwID0gMDsKCSAgICB2ZXJpZnlfdHJlZSAoVFJFRV9PUEVSQU5EICh4LCBs
cCksICZ0bXBfYmVmb3JlLCAmdG1wX25vc3AsIE5VTExfVFJFRSk7CgkgICAgbWVyZ2VfdGxp
c3QgKCZ0bXBfbm9zcCwgdG1wX2JlZm9yZSwgMCk7CgkgICAgYWRkX3RsaXN0IChwbm9fc3As
IHRtcF9ub3NwLCBOVUxMX1RSRUUsIDApOwoJICB9CglicmVhazsKICAgICAgfQogICAgfQp9
CgovKiBUcnkgdG8gd2FybiBmb3IgdW5kZWZpbmVkIGJlaGF2aW9yIGluIEVYUFIgZHVlIHRv
IG1pc3Npbmcgc2VxdWVuY2UKICAgcG9pbnRzLiAgKi8KCnN0YXRpYyB2b2lkCnZlcmlmeV9z
ZXF1ZW5jZV9wb2ludHMgKHRyZWUgZXhwcikKewogIHN0cnVjdCB0bGlzdCAqYmVmb3JlX3Nw
ID0gMCwgKmFmdGVyX3NwID0gMDsKCiAgd2FybmVkX2lkcyA9IDA7CiAgc2F2ZV9leHByX2Nh
Y2hlID0gMDsKICBpZiAodGxpc3RfZmlyc3RvYmogPT0gMCkKICAgIHsKICAgICAgZ2NjX29i
c3RhY2tfaW5pdCAoJnRsaXN0X29ic3RhY2spOwogICAgICB0bGlzdF9maXJzdG9iaiA9IG9i
c3RhY2tfYWxsb2MgKCZ0bGlzdF9vYnN0YWNrLCAwKTsKICAgIH0KCiAgdmVyaWZ5X3RyZWUg
KGV4cHIsICZiZWZvcmVfc3AsICZhZnRlcl9zcCwgMCk7CiAgd2Fybl9mb3JfY29sbGlzaW9u
cyAoYWZ0ZXJfc3ApOwogIG9ic3RhY2tfZnJlZSAoJnRsaXN0X29ic3RhY2ssIHRsaXN0X2Zp
cnN0b2JqKTsKfQoKdHJlZQpjX2V4cGFuZF9leHByX3N0bXQgKHRyZWUgZXhwcikKewogIC8q
IERvIGRlZmF1bHQgY29udmVyc2lvbiBpZiBzYWZlIGFuZCBwb3NzaWJseSBpbXBvcnRhbnQs
CiAgICAgaW4gY2FzZSB3aXRoaW4gKHsuLi59KS4gICovCiAgaWYgKChUUkVFX0NPREUgKFRS
RUVfVFlQRSAoZXhwcikpID09IEFSUkFZX1RZUEUKICAgICAgICYmIChmbGFnX2lzb2M5OSB8
fCBsdmFsdWVfcCAoZXhwcikpKQogICAgICB8fCBUUkVFX0NPREUgKFRSRUVfVFlQRSAoZXhw
cikpID09IEZVTkNUSU9OX1RZUEUpCiAgICBleHByID0gZGVmYXVsdF9jb252ZXJzaW9uIChl
eHByKTsKCiAgaWYgKHdhcm5fc2VxdWVuY2VfcG9pbnQpCiAgICB2ZXJpZnlfc2VxdWVuY2Vf
cG9pbnRzIChleHByKTsKCiAgaWYgKFRSRUVfVFlQRSAoZXhwcikgIT0gZXJyb3JfbWFya19u
b2RlCiAgICAgICYmICFDT01QTEVURV9PUl9WT0lEX1RZUEVfUCAoVFJFRV9UWVBFIChleHBy
KSkKICAgICAgJiYgVFJFRV9DT0RFIChUUkVFX1RZUEUgKGV4cHIpKSAhPSBBUlJBWV9UWVBF
KQogICAgZXJyb3IgKCJleHByZXNzaW9uIHN0YXRlbWVudCBoYXMgaW5jb21wbGV0ZSB0eXBl
Iik7CgogIGxhc3RfZXhwcl90eXBlID0gVFJFRV9UWVBFIChleHByKTsKICByZXR1cm4gYWRk
X3N0bXQgKGJ1aWxkX3N0bXQgKEVYUFJfU1RNVCwgZXhwcikpOwp9CgwKLyogVmFsaWRhdGUg
dGhlIGV4cHJlc3Npb24gYWZ0ZXIgYGNhc2UnIGFuZCBhcHBseSBkZWZhdWx0IHByb21vdGlv
bnMuICAqLwoKdHJlZQpjaGVja19jYXNlX3ZhbHVlICh0cmVlIHZhbHVlKQp7CiAgaWYgKHZh
bHVlID09IE5VTExfVFJFRSkKICAgIHJldHVybiB2YWx1ZTsKCiAgLyogU3RyaXAgTk9OX0xW
QUxVRV9FWFBScyBzaW5jZSB3ZSBhcmVuJ3QgdXNpbmcgYXMgYW4gbHZhbHVlLiAgKi8KICBT
VFJJUF9UWVBFX05PUFMgKHZhbHVlKTsKICAvKiBJbiBDKyssIHRoZSBmb2xsb3dpbmcgaXMg
YWxsb3dlZDoKCiAgICAgICBjb25zdCBpbnQgaSA9IDM7CiAgICAgICBzd2l0Y2ggKC4uLikg
eyBjYXNlIGk6IC4uLiB9CgogICAgIFNvLCB3ZSB0cnkgdG8gcmVkdWNlIHRoZSBWQUxVRSB0
byBhIGNvbnN0YW50IHRoYXQgd2F5LiAgKi8KICBpZiAoY19kaWFsZWN0X2N4eCAoKSkKICAg
IHsKICAgICAgdmFsdWUgPSBkZWNsX2NvbnN0YW50X3ZhbHVlICh2YWx1ZSk7CiAgICAgIFNU
UklQX1RZUEVfTk9QUyAodmFsdWUpOwogICAgICB2YWx1ZSA9IGZvbGQgKHZhbHVlKTsKICAg
IH0KCiAgaWYgKFRSRUVfQ09ERSAodmFsdWUpICE9IElOVEVHRVJfQ1NUCiAgICAgICYmIHZh
bHVlICE9IGVycm9yX21hcmtfbm9kZSkKICAgIHsKICAgICAgZXJyb3IgKCJjYXNlIGxhYmVs
IGRvZXMgbm90IHJlZHVjZSB0byBhbiBpbnRlZ2VyIGNvbnN0YW50Iik7CiAgICAgIHZhbHVl
ID0gZXJyb3JfbWFya19ub2RlOwogICAgfQogIGVsc2UKICAgIC8qIFByb21vdGUgY2hhciBv
ciBzaG9ydCB0byBpbnQuICAqLwogICAgdmFsdWUgPSBkZWZhdWx0X2NvbnZlcnNpb24gKHZh
bHVlKTsKCiAgY29uc3RhbnRfZXhwcmVzc2lvbl93YXJuaW5nICh2YWx1ZSk7CgogIHJldHVy
biB2YWx1ZTsKfQoMCi8qIFJldHVybiBhbiBpbnRlZ2VyIHR5cGUgd2l0aCBCSVRTIGJpdHMg
b2YgcHJlY2lzaW9uLAogICB0aGF0IGlzIHVuc2lnbmVkIGlmIFVOU0lHTkVEUCBpcyBub256
ZXJvLCBvdGhlcndpc2Ugc2lnbmVkLiAgKi8KCnRyZWUKY19jb21tb25fdHlwZV9mb3Jfc2l6
ZSAodW5zaWduZWQgaW50IGJpdHMsIGludCB1bnNpZ25lZHApCnsKICBpZiAoYml0cyA9PSBU
WVBFX1BSRUNJU0lPTiAoaW50ZWdlcl90eXBlX25vZGUpKQogICAgcmV0dXJuIHVuc2lnbmVk
cCA/IHVuc2lnbmVkX3R5cGVfbm9kZSA6IGludGVnZXJfdHlwZV9ub2RlOwoKICBpZiAoYml0
cyA9PSBUWVBFX1BSRUNJU0lPTiAoc2lnbmVkX2NoYXJfdHlwZV9ub2RlKSkKICAgIHJldHVy
biB1bnNpZ25lZHAgPyB1bnNpZ25lZF9jaGFyX3R5cGVfbm9kZSA6IHNpZ25lZF9jaGFyX3R5
cGVfbm9kZTsKCiAgaWYgKGJpdHMgPT0gVFlQRV9QUkVDSVNJT04gKHNob3J0X2ludGVnZXJf
dHlwZV9ub2RlKSkKICAgIHJldHVybiB1bnNpZ25lZHAgPyBzaG9ydF91bnNpZ25lZF90eXBl
X25vZGUgOiBzaG9ydF9pbnRlZ2VyX3R5cGVfbm9kZTsKCiAgaWYgKGJpdHMgPT0gVFlQRV9Q
UkVDSVNJT04gKGxvbmdfaW50ZWdlcl90eXBlX25vZGUpKQogICAgcmV0dXJuIHVuc2lnbmVk
cCA/IGxvbmdfdW5zaWduZWRfdHlwZV9ub2RlIDogbG9uZ19pbnRlZ2VyX3R5cGVfbm9kZTsK
CiAgaWYgKGJpdHMgPT0gVFlQRV9QUkVDSVNJT04gKGxvbmdfbG9uZ19pbnRlZ2VyX3R5cGVf
bm9kZSkpCiAgICByZXR1cm4gKHVuc2lnbmVkcCA/IGxvbmdfbG9uZ191bnNpZ25lZF90eXBl
X25vZGUKCSAgICA6IGxvbmdfbG9uZ19pbnRlZ2VyX3R5cGVfbm9kZSk7CgogIGlmIChiaXRz
ID09IFRZUEVfUFJFQ0lTSU9OICh3aWRlc3RfaW50ZWdlcl9saXRlcmFsX3R5cGVfbm9kZSkp
CiAgICByZXR1cm4gKHVuc2lnbmVkcCA/IHdpZGVzdF91bnNpZ25lZF9saXRlcmFsX3R5cGVf
bm9kZQoJICAgIDogd2lkZXN0X2ludGVnZXJfbGl0ZXJhbF90eXBlX25vZGUpOwoKICBpZiAo
Yml0cyA8PSBUWVBFX1BSRUNJU0lPTiAoaW50UUlfdHlwZV9ub2RlKSkKICAgIHJldHVybiB1
bnNpZ25lZHAgPyB1bnNpZ25lZF9pbnRRSV90eXBlX25vZGUgOiBpbnRRSV90eXBlX25vZGU7
CgogIGlmIChiaXRzIDw9IFRZUEVfUFJFQ0lTSU9OIChpbnRISV90eXBlX25vZGUpKQogICAg
cmV0dXJuIHVuc2lnbmVkcCA/IHVuc2lnbmVkX2ludEhJX3R5cGVfbm9kZSA6IGludEhJX3R5
cGVfbm9kZTsKCiAgaWYgKGJpdHMgPD0gVFlQRV9QUkVDSVNJT04gKGludFNJX3R5cGVfbm9k
ZSkpCiAgICByZXR1cm4gdW5zaWduZWRwID8gdW5zaWduZWRfaW50U0lfdHlwZV9ub2RlIDog
aW50U0lfdHlwZV9ub2RlOwoKICBpZiAoYml0cyA8PSBUWVBFX1BSRUNJU0lPTiAoaW50RElf
dHlwZV9ub2RlKSkKICAgIHJldHVybiB1bnNpZ25lZHAgPyB1bnNpZ25lZF9pbnRESV90eXBl
X25vZGUgOiBpbnRESV90eXBlX25vZGU7CgogIHJldHVybiAwOwp9CgovKiBSZXR1cm4gYSBk
YXRhIHR5cGUgdGhhdCBoYXMgbWFjaGluZSBtb2RlIE1PREUuCiAgIElmIHRoZSBtb2RlIGlz
IGFuIGludGVnZXIsCiAgIHRoZW4gVU5TSUdORURQIHNlbGVjdHMgYmV0d2VlbiBzaWduZWQg
YW5kIHVuc2lnbmVkIHR5cGVzLiAgKi8KCnRyZWUKY19jb21tb25fdHlwZV9mb3JfbW9kZSAo
ZW51bSBtYWNoaW5lX21vZGUgbW9kZSwgaW50IHVuc2lnbmVkcCkKewogIGlmIChtb2RlID09
IFRZUEVfTU9ERSAoaW50ZWdlcl90eXBlX25vZGUpKQogICAgcmV0dXJuIHVuc2lnbmVkcCA/
IHVuc2lnbmVkX3R5cGVfbm9kZSA6IGludGVnZXJfdHlwZV9ub2RlOwoKICBpZiAobW9kZSA9
PSBUWVBFX01PREUgKHNpZ25lZF9jaGFyX3R5cGVfbm9kZSkpCiAgICByZXR1cm4gdW5zaWdu
ZWRwID8gdW5zaWduZWRfY2hhcl90eXBlX25vZGUgOiBzaWduZWRfY2hhcl90eXBlX25vZGU7
CgogIGlmIChtb2RlID09IFRZUEVfTU9ERSAoc2hvcnRfaW50ZWdlcl90eXBlX25vZGUpKQog
ICAgcmV0dXJuIHVuc2lnbmVkcCA/IHNob3J0X3Vuc2lnbmVkX3R5cGVfbm9kZSA6IHNob3J0
X2ludGVnZXJfdHlwZV9ub2RlOwoKICBpZiAobW9kZSA9PSBUWVBFX01PREUgKGxvbmdfaW50
ZWdlcl90eXBlX25vZGUpKQogICAgcmV0dXJuIHVuc2lnbmVkcCA/IGxvbmdfdW5zaWduZWRf
dHlwZV9ub2RlIDogbG9uZ19pbnRlZ2VyX3R5cGVfbm9kZTsKCiAgaWYgKG1vZGUgPT0gVFlQ
RV9NT0RFIChsb25nX2xvbmdfaW50ZWdlcl90eXBlX25vZGUpKQogICAgcmV0dXJuIHVuc2ln
bmVkcCA/IGxvbmdfbG9uZ191bnNpZ25lZF90eXBlX25vZGUgOiBsb25nX2xvbmdfaW50ZWdl
cl90eXBlX25vZGU7CgogIGlmIChtb2RlID09IFRZUEVfTU9ERSAod2lkZXN0X2ludGVnZXJf
bGl0ZXJhbF90eXBlX25vZGUpKQogICAgcmV0dXJuIHVuc2lnbmVkcCA/IHdpZGVzdF91bnNp
Z25lZF9saXRlcmFsX3R5cGVfbm9kZQogICAgICAgICAgICAgICAgICAgICA6IHdpZGVzdF9p
bnRlZ2VyX2xpdGVyYWxfdHlwZV9ub2RlOwoKICBpZiAobW9kZSA9PSBRSW1vZGUpCiAgICBy
ZXR1cm4gdW5zaWduZWRwID8gdW5zaWduZWRfaW50UUlfdHlwZV9ub2RlIDogaW50UUlfdHlw
ZV9ub2RlOwoKICBpZiAobW9kZSA9PSBISW1vZGUpCiAgICByZXR1cm4gdW5zaWduZWRwID8g
dW5zaWduZWRfaW50SElfdHlwZV9ub2RlIDogaW50SElfdHlwZV9ub2RlOwoKICBpZiAobW9k
ZSA9PSBTSW1vZGUpCiAgICByZXR1cm4gdW5zaWduZWRwID8gdW5zaWduZWRfaW50U0lfdHlw
ZV9ub2RlIDogaW50U0lfdHlwZV9ub2RlOwoKICBpZiAobW9kZSA9PSBESW1vZGUpCiAgICBy
ZXR1cm4gdW5zaWduZWRwID8gdW5zaWduZWRfaW50RElfdHlwZV9ub2RlIDogaW50RElfdHlw
ZV9ub2RlOwoKI2lmIEhPU1RfQklUU19QRVJfV0lERV9JTlQgPj0gNjQKICBpZiAobW9kZSA9
PSBUWVBFX01PREUgKGludFRJX3R5cGVfbm9kZSkpCiAgICByZXR1cm4gdW5zaWduZWRwID8g
dW5zaWduZWRfaW50VElfdHlwZV9ub2RlIDogaW50VElfdHlwZV9ub2RlOwojZW5kaWYKCiAg
aWYgKG1vZGUgPT0gVFlQRV9NT0RFIChmbG9hdF90eXBlX25vZGUpKQogICAgcmV0dXJuIGZs
b2F0X3R5cGVfbm9kZTsKCiAgaWYgKG1vZGUgPT0gVFlQRV9NT0RFIChkb3VibGVfdHlwZV9u
b2RlKSkKICAgIHJldHVybiBkb3VibGVfdHlwZV9ub2RlOwoKICBpZiAobW9kZSA9PSBUWVBF
X01PREUgKGxvbmdfZG91YmxlX3R5cGVfbm9kZSkpCiAgICByZXR1cm4gbG9uZ19kb3VibGVf
dHlwZV9ub2RlOwoKICBpZiAobW9kZSA9PSBUWVBFX01PREUgKGJ1aWxkX3BvaW50ZXJfdHlw
ZSAoY2hhcl90eXBlX25vZGUpKSkKICAgIHJldHVybiBidWlsZF9wb2ludGVyX3R5cGUgKGNo
YXJfdHlwZV9ub2RlKTsKCiAgaWYgKG1vZGUgPT0gVFlQRV9NT0RFIChidWlsZF9wb2ludGVy
X3R5cGUgKGludGVnZXJfdHlwZV9ub2RlKSkpCiAgICByZXR1cm4gYnVpbGRfcG9pbnRlcl90
eXBlIChpbnRlZ2VyX3R5cGVfbm9kZSk7CgogIHN3aXRjaCAobW9kZSkKICAgIHsKICAgIGNh
c2UgVjE2UUltb2RlOgogICAgICByZXR1cm4gdW5zaWduZWRwID8gdW5zaWduZWRfVjE2UUlf
dHlwZV9ub2RlIDogVjE2UUlfdHlwZV9ub2RlOwogICAgY2FzZSBWOEhJbW9kZToKICAgICAg
cmV0dXJuIHVuc2lnbmVkcCA/IHVuc2lnbmVkX1Y4SElfdHlwZV9ub2RlIDogVjhISV90eXBl
X25vZGU7CiAgICBjYXNlIFY0U0ltb2RlOgogICAgICByZXR1cm4gdW5zaWduZWRwID8gdW5z
aWduZWRfVjRTSV90eXBlX25vZGUgOiBWNFNJX3R5cGVfbm9kZTsKICAgIGNhc2UgVjJESW1v
ZGU6CiAgICAgIHJldHVybiB1bnNpZ25lZHAgPyB1bnNpZ25lZF9WMkRJX3R5cGVfbm9kZSA6
IFYyRElfdHlwZV9ub2RlOwogICAgY2FzZSBWMlNJbW9kZToKICAgICAgcmV0dXJuIHVuc2ln
bmVkcCA/IHVuc2lnbmVkX1YyU0lfdHlwZV9ub2RlIDogVjJTSV90eXBlX25vZGU7CiAgICBj
YXNlIFYySEltb2RlOgogICAgICByZXR1cm4gdW5zaWduZWRwID8gdW5zaWduZWRfVjJISV90
eXBlX25vZGUgOiBWMkhJX3R5cGVfbm9kZTsKICAgIGNhc2UgVjRISW1vZGU6CiAgICAgIHJl
dHVybiB1bnNpZ25lZHAgPyB1bnNpZ25lZF9WNEhJX3R5cGVfbm9kZSA6IFY0SElfdHlwZV9u
b2RlOwogICAgY2FzZSBWOFFJbW9kZToKICAgICAgcmV0dXJuIHVuc2lnbmVkcCA/IHVuc2ln
bmVkX1Y4UUlfdHlwZV9ub2RlIDogVjhRSV90eXBlX25vZGU7CiAgICBjYXNlIFYxREltb2Rl
OgogICAgICByZXR1cm4gdW5zaWduZWRwID8gdW5zaWduZWRfVjFESV90eXBlX25vZGUgOiBW
MURJX3R5cGVfbm9kZTsKICAgIGNhc2UgVjE2U0Ztb2RlOgogICAgICByZXR1cm4gVjE2U0Zf
dHlwZV9ub2RlOwogICAgY2FzZSBWNFNGbW9kZToKICAgICAgcmV0dXJuIFY0U0ZfdHlwZV9u
b2RlOwogICAgY2FzZSBWMlNGbW9kZToKICAgICAgcmV0dXJuIFYyU0ZfdHlwZV9ub2RlOwog
ICAgY2FzZSBWMkRGbW9kZToKICAgICAgcmV0dXJuIFYyREZfdHlwZV9ub2RlOwogICAgZGVm
YXVsdDoKICAgICAgYnJlYWs7CiAgICB9CgogIHJldHVybiAwOwp9CgovKiBSZXR1cm4gYW4g
dW5zaWduZWQgdHlwZSB0aGUgc2FtZSBhcyBUWVBFIGluIG90aGVyIHJlc3BlY3RzLiAgKi8K
dHJlZQpjX2NvbW1vbl91bnNpZ25lZF90eXBlICh0cmVlIHR5cGUpCnsKICB0cmVlIHR5cGUx
ID0gVFlQRV9NQUlOX1ZBUklBTlQgKHR5cGUpOwogIGlmICh0eXBlMSA9PSBzaWduZWRfY2hh
cl90eXBlX25vZGUgfHwgdHlwZTEgPT0gY2hhcl90eXBlX25vZGUpCiAgICByZXR1cm4gdW5z
aWduZWRfY2hhcl90eXBlX25vZGU7CiAgaWYgKHR5cGUxID09IGludGVnZXJfdHlwZV9ub2Rl
KQogICAgcmV0dXJuIHVuc2lnbmVkX3R5cGVfbm9kZTsKICBpZiAodHlwZTEgPT0gc2hvcnRf
aW50ZWdlcl90eXBlX25vZGUpCiAgICByZXR1cm4gc2hvcnRfdW5zaWduZWRfdHlwZV9ub2Rl
OwogIGlmICh0eXBlMSA9PSBsb25nX2ludGVnZXJfdHlwZV9ub2RlKQogICAgcmV0dXJuIGxv
bmdfdW5zaWduZWRfdHlwZV9ub2RlOwogIGlmICh0eXBlMSA9PSBsb25nX2xvbmdfaW50ZWdl
cl90eXBlX25vZGUpCiAgICByZXR1cm4gbG9uZ19sb25nX3Vuc2lnbmVkX3R5cGVfbm9kZTsK
ICBpZiAodHlwZTEgPT0gd2lkZXN0X2ludGVnZXJfbGl0ZXJhbF90eXBlX25vZGUpCiAgICBy
ZXR1cm4gd2lkZXN0X3Vuc2lnbmVkX2xpdGVyYWxfdHlwZV9ub2RlOwojaWYgSE9TVF9CSVRT
X1BFUl9XSURFX0lOVCA+PSA2NAogIGlmICh0eXBlMSA9PSBpbnRUSV90eXBlX25vZGUpCiAg
ICByZXR1cm4gdW5zaWduZWRfaW50VElfdHlwZV9ub2RlOwojZW5kaWYKICBpZiAodHlwZTEg
PT0gaW50RElfdHlwZV9ub2RlKQogICAgcmV0dXJuIHVuc2lnbmVkX2ludERJX3R5cGVfbm9k
ZTsKICBpZiAodHlwZTEgPT0gaW50U0lfdHlwZV9ub2RlKQogICAgcmV0dXJuIHVuc2lnbmVk
X2ludFNJX3R5cGVfbm9kZTsKICBpZiAodHlwZTEgPT0gaW50SElfdHlwZV9ub2RlKQogICAg
cmV0dXJuIHVuc2lnbmVkX2ludEhJX3R5cGVfbm9kZTsKICBpZiAodHlwZTEgPT0gaW50UUlf
dHlwZV9ub2RlKQogICAgcmV0dXJuIHVuc2lnbmVkX2ludFFJX3R5cGVfbm9kZTsKCiAgcmV0
dXJuIGNfY29tbW9uX3NpZ25lZF9vcl91bnNpZ25lZF90eXBlICgxLCB0eXBlKTsKfQoKLyog
UmV0dXJuIGEgc2lnbmVkIHR5cGUgdGhlIHNhbWUgYXMgVFlQRSBpbiBvdGhlciByZXNwZWN0
cy4gICovCgp0cmVlCmNfY29tbW9uX3NpZ25lZF90eXBlICh0cmVlIHR5cGUpCnsKICB0cmVl
IHR5cGUxID0gVFlQRV9NQUlOX1ZBUklBTlQgKHR5cGUpOwogIGlmICh0eXBlMSA9PSB1bnNp
Z25lZF9jaGFyX3R5cGVfbm9kZSB8fCB0eXBlMSA9PSBjaGFyX3R5cGVfbm9kZSkKICAgIHJl
dHVybiBzaWduZWRfY2hhcl90eXBlX25vZGU7CiAgaWYgKHR5cGUxID09IHVuc2lnbmVkX3R5
cGVfbm9kZSkKICAgIHJldHVybiBpbnRlZ2VyX3R5cGVfbm9kZTsKICBpZiAodHlwZTEgPT0g
c2hvcnRfdW5zaWduZWRfdHlwZV9ub2RlKQogICAgcmV0dXJuIHNob3J0X2ludGVnZXJfdHlw
ZV9ub2RlOwogIGlmICh0eXBlMSA9PSBsb25nX3Vuc2lnbmVkX3R5cGVfbm9kZSkKICAgIHJl
dHVybiBsb25nX2ludGVnZXJfdHlwZV9ub2RlOwogIGlmICh0eXBlMSA9PSBsb25nX2xvbmdf
dW5zaWduZWRfdHlwZV9ub2RlKQogICAgcmV0dXJuIGxvbmdfbG9uZ19pbnRlZ2VyX3R5cGVf
bm9kZTsKICBpZiAodHlwZTEgPT0gd2lkZXN0X3Vuc2lnbmVkX2xpdGVyYWxfdHlwZV9ub2Rl
KQogICAgcmV0dXJuIHdpZGVzdF9pbnRlZ2VyX2xpdGVyYWxfdHlwZV9ub2RlOwojaWYgSE9T
VF9CSVRTX1BFUl9XSURFX0lOVCA+PSA2NAogIGlmICh0eXBlMSA9PSB1bnNpZ25lZF9pbnRU
SV90eXBlX25vZGUpCiAgICByZXR1cm4gaW50VElfdHlwZV9ub2RlOwojZW5kaWYKICBpZiAo
dHlwZTEgPT0gdW5zaWduZWRfaW50RElfdHlwZV9ub2RlKQogICAgcmV0dXJuIGludERJX3R5
cGVfbm9kZTsKICBpZiAodHlwZTEgPT0gdW5zaWduZWRfaW50U0lfdHlwZV9ub2RlKQogICAg
cmV0dXJuIGludFNJX3R5cGVfbm9kZTsKICBpZiAodHlwZTEgPT0gdW5zaWduZWRfaW50SElf
dHlwZV9ub2RlKQogICAgcmV0dXJuIGludEhJX3R5cGVfbm9kZTsKICBpZiAodHlwZTEgPT0g
dW5zaWduZWRfaW50UUlfdHlwZV9ub2RlKQogICAgcmV0dXJuIGludFFJX3R5cGVfbm9kZTsK
CiAgcmV0dXJuIGNfY29tbW9uX3NpZ25lZF9vcl91bnNpZ25lZF90eXBlICgwLCB0eXBlKTsK
fQoKLyogUmV0dXJuIGEgdHlwZSB0aGUgc2FtZSBhcyBUWVBFIGV4Y2VwdCB1bnNpZ25lZCBv
cgogICBzaWduZWQgYWNjb3JkaW5nIHRvIFVOU0lHTkVEUC4gICovCgp0cmVlCmNfY29tbW9u
X3NpZ25lZF9vcl91bnNpZ25lZF90eXBlIChpbnQgdW5zaWduZWRwLCB0cmVlIHR5cGUpCnsK
ICBpZiAoISBJTlRFR1JBTF9UWVBFX1AgKHR5cGUpCiAgICAgIHx8IFRSRUVfVU5TSUdORUQg
KHR5cGUpID09IHVuc2lnbmVkcCkKICAgIHJldHVybiB0eXBlOwoKICBpZiAoVFlQRV9QUkVD
SVNJT04gKHR5cGUpID09IFRZUEVfUFJFQ0lTSU9OIChzaWduZWRfY2hhcl90eXBlX25vZGUp
KQogICAgcmV0dXJuIHVuc2lnbmVkcCA/IHVuc2lnbmVkX2NoYXJfdHlwZV9ub2RlIDogc2ln
bmVkX2NoYXJfdHlwZV9ub2RlOwogIGlmIChUWVBFX1BSRUNJU0lPTiAodHlwZSkgPT0gVFlQ
RV9QUkVDSVNJT04gKGludGVnZXJfdHlwZV9ub2RlKSkKICAgIHJldHVybiB1bnNpZ25lZHAg
PyB1bnNpZ25lZF90eXBlX25vZGUgOiBpbnRlZ2VyX3R5cGVfbm9kZTsKICBpZiAoVFlQRV9Q
UkVDSVNJT04gKHR5cGUpID09IFRZUEVfUFJFQ0lTSU9OIChzaG9ydF9pbnRlZ2VyX3R5cGVf
bm9kZSkpCiAgICByZXR1cm4gdW5zaWduZWRwID8gc2hvcnRfdW5zaWduZWRfdHlwZV9ub2Rl
IDogc2hvcnRfaW50ZWdlcl90eXBlX25vZGU7CiAgaWYgKFRZUEVfUFJFQ0lTSU9OICh0eXBl
KSA9PSBUWVBFX1BSRUNJU0lPTiAobG9uZ19pbnRlZ2VyX3R5cGVfbm9kZSkpCiAgICByZXR1
cm4gdW5zaWduZWRwID8gbG9uZ191bnNpZ25lZF90eXBlX25vZGUgOiBsb25nX2ludGVnZXJf
dHlwZV9ub2RlOwogIGlmIChUWVBFX1BSRUNJU0lPTiAodHlwZSkgPT0gVFlQRV9QUkVDSVNJ
T04gKGxvbmdfbG9uZ19pbnRlZ2VyX3R5cGVfbm9kZSkpCiAgICByZXR1cm4gKHVuc2lnbmVk
cCA/IGxvbmdfbG9uZ191bnNpZ25lZF90eXBlX25vZGUKCSAgICA6IGxvbmdfbG9uZ19pbnRl
Z2VyX3R5cGVfbm9kZSk7CiAgaWYgKFRZUEVfUFJFQ0lTSU9OICh0eXBlKSA9PSBUWVBFX1BS
RUNJU0lPTiAod2lkZXN0X2ludGVnZXJfbGl0ZXJhbF90eXBlX25vZGUpKQogICAgcmV0dXJu
ICh1bnNpZ25lZHAgPyB3aWRlc3RfdW5zaWduZWRfbGl0ZXJhbF90eXBlX25vZGUKCSAgICA6
IHdpZGVzdF9pbnRlZ2VyX2xpdGVyYWxfdHlwZV9ub2RlKTsKCiNpZiBIT1NUX0JJVFNfUEVS
X1dJREVfSU5UID49IDY0CiAgaWYgKFRZUEVfUFJFQ0lTSU9OICh0eXBlKSA9PSBUWVBFX1BS
RUNJU0lPTiAoaW50VElfdHlwZV9ub2RlKSkKICAgIHJldHVybiB1bnNpZ25lZHAgPyB1bnNp
Z25lZF9pbnRUSV90eXBlX25vZGUgOiBpbnRUSV90eXBlX25vZGU7CiNlbmRpZgogIGlmIChU
WVBFX1BSRUNJU0lPTiAodHlwZSkgPT0gVFlQRV9QUkVDSVNJT04gKGludERJX3R5cGVfbm9k
ZSkpCiAgICByZXR1cm4gdW5zaWduZWRwID8gdW5zaWduZWRfaW50RElfdHlwZV9ub2RlIDog
aW50RElfdHlwZV9ub2RlOwogIGlmIChUWVBFX1BSRUNJU0lPTiAodHlwZSkgPT0gVFlQRV9Q
UkVDSVNJT04gKGludFNJX3R5cGVfbm9kZSkpCiAgICByZXR1cm4gdW5zaWduZWRwID8gdW5z
aWduZWRfaW50U0lfdHlwZV9ub2RlIDogaW50U0lfdHlwZV9ub2RlOwogIGlmIChUWVBFX1BS
RUNJU0lPTiAodHlwZSkgPT0gVFlQRV9QUkVDSVNJT04gKGludEhJX3R5cGVfbm9kZSkpCiAg
ICByZXR1cm4gdW5zaWduZWRwID8gdW5zaWduZWRfaW50SElfdHlwZV9ub2RlIDogaW50SElf
dHlwZV9ub2RlOwogIGlmIChUWVBFX1BSRUNJU0lPTiAodHlwZSkgPT0gVFlQRV9QUkVDSVNJ
T04gKGludFFJX3R5cGVfbm9kZSkpCiAgICByZXR1cm4gdW5zaWduZWRwID8gdW5zaWduZWRf
aW50UUlfdHlwZV9ub2RlIDogaW50UUlfdHlwZV9ub2RlOwoKICByZXR1cm4gdHlwZTsKfQoM
Ci8qIFJldHVybiB0aGUgbWluaW11bSBudW1iZXIgb2YgYml0cyBuZWVkZWQgdG8gcmVwcmVz
ZW50IFZBTFVFIGluIGEKICAgc2lnbmVkIG9yIHVuc2lnbmVkIHR5cGUsIFVOU0lHTkVEUCBz
YXlzIHdoaWNoLiAgKi8KCnVuc2lnbmVkIGludAptaW5fcHJlY2lzaW9uICh0cmVlIHZhbHVl
LCBpbnQgdW5zaWduZWRwKQp7CiAgaW50IGxvZzsKCiAgLyogSWYgdGhlIHZhbHVlIGlzIG5l
Z2F0aXZlLCBjb21wdXRlIGl0cyBuZWdhdGl2ZSBtaW51cyAxLiAgVGhlIGxhdHRlcgogICAg
IGFkanVzdG1lbnQgaXMgYmVjYXVzZSB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIGxhcmdl
c3QgbmVnYXRpdmUgdmFsdWUKICAgICBpcyBvbmUgbGFyZ2VyIHRoYW4gdGhlIGxhcmdlc3Qg
cG9zaXRpdmUgdmFsdWUuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KICAgICBhIGJpdC13aXNl
IG5lZ2F0aW9uLCBzbyB1c2UgdGhhdCBvcGVyYXRpb24gaW5zdGVhZC4gICovCgogIGlmICh0
cmVlX2ludF9jc3Rfc2duICh2YWx1ZSkgPCAwKQogICAgdmFsdWUgPSBmb2xkIChidWlsZDEg
KEJJVF9OT1RfRVhQUiwgVFJFRV9UWVBFICh2YWx1ZSksIHZhbHVlKSk7CgogIC8qIFJldHVy
biB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkLCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBm
YWN0CiAgICAgdGhhdCB3ZSBuZWVkIG9uZSBtb3JlIGJpdCBmb3IgYSBzaWduZWQgdGhhbiB1
bnNpZ25lZCB0eXBlLiAgKi8KCiAgaWYgKGludGVnZXJfemVyb3AgKHZhbHVlKSkKICAgIGxv
ZyA9IDA7CiAgZWxzZQogICAgbG9nID0gdHJlZV9mbG9vcl9sb2cyICh2YWx1ZSk7CgogIHJl
dHVybiBsb2cgKyAxICsgISB1bnNpZ25lZHA7Cn0KDAovKiBQcmludCBhbiBlcnJvciBtZXNz
YWdlIGZvciBpbnZhbGlkIG9wZXJhbmRzIHRvIGFyaXRoIG9wZXJhdGlvbgogICBDT0RFLiAg
Tk9QX0VYUFIgaXMgdXNlZCBhcyBhIHNwZWNpYWwgY2FzZSAoc2VlCiAgIGNfY29tbW9uX3Ry
dXRodmFsdWVfY29udmVyc2lvbikuICAqLwoKdm9pZApiaW5hcnlfb3BfZXJyb3IgKGVudW0g
dHJlZV9jb2RlIGNvZGUpCnsKICBjb25zdCBjaGFyICpvcG5hbWU7CgogIHN3aXRjaCAoY29k
ZSkKICAgIHsKICAgIGNhc2UgTk9QX0VYUFI6CiAgICAgIGVycm9yICgiaW52YWxpZCB0cnV0
aC12YWx1ZSBleHByZXNzaW9uIik7CiAgICAgIHJldHVybjsKCiAgICBjYXNlIFBMVVNfRVhQ
UjoKICAgICAgb3BuYW1lID0gIisiOyBicmVhazsKICAgIGNhc2UgTUlOVVNfRVhQUjoKICAg
ICAgb3BuYW1lID0gIi0iOyBicmVhazsKICAgIGNhc2UgTVVMVF9FWFBSOgogICAgICBvcG5h
bWUgPSAiKiI7IGJyZWFrOwogICAgY2FzZSBNQVhfRVhQUjoKICAgICAgb3BuYW1lID0gIm1h
eCI7IGJyZWFrOwogICAgY2FzZSBNSU5fRVhQUjoKICAgICAgb3BuYW1lID0gIm1pbiI7IGJy
ZWFrOwogICAgY2FzZSBFUV9FWFBSOgogICAgICBvcG5hbWUgPSAiPT0iOyBicmVhazsKICAg
IGNhc2UgTkVfRVhQUjoKICAgICAgb3BuYW1lID0gIiE9IjsgYnJlYWs7CiAgICBjYXNlIExF
X0VYUFI6CiAgICAgIG9wbmFtZSA9ICI8PSI7IGJyZWFrOwogICAgY2FzZSBHRV9FWFBSOgog
ICAgICBvcG5hbWUgPSAiPj0iOyBicmVhazsKICAgIGNhc2UgTFRfRVhQUjoKICAgICAgb3Bu
YW1lID0gIjwiOyBicmVhazsKICAgIGNhc2UgR1RfRVhQUjoKICAgICAgb3BuYW1lID0gIj4i
OyBicmVhazsKICAgIGNhc2UgTFNISUZUX0VYUFI6CiAgICAgIG9wbmFtZSA9ICI8PCI7IGJy
ZWFrOwogICAgY2FzZSBSU0hJRlRfRVhQUjoKICAgICAgb3BuYW1lID0gIj4+IjsgYnJlYWs7
CiAgICBjYXNlIFRSVU5DX01PRF9FWFBSOgogICAgY2FzZSBGTE9PUl9NT0RfRVhQUjoKICAg
ICAgb3BuYW1lID0gIiUiOyBicmVhazsKICAgIGNhc2UgVFJVTkNfRElWX0VYUFI6CiAgICBj
YXNlIEZMT09SX0RJVl9FWFBSOgogICAgICBvcG5hbWUgPSAiLyI7IGJyZWFrOwogICAgY2Fz
ZSBCSVRfQU5EX0VYUFI6CiAgICAgIG9wbmFtZSA9ICImIjsgYnJlYWs7CiAgICBjYXNlIEJJ
VF9JT1JfRVhQUjoKICAgICAgb3BuYW1lID0gInwiOyBicmVhazsKICAgIGNhc2UgVFJVVEhf
QU5ESUZfRVhQUjoKICAgICAgb3BuYW1lID0gIiYmIjsgYnJlYWs7CiAgICBjYXNlIFRSVVRI
X09SSUZfRVhQUjoKICAgICAgb3BuYW1lID0gInx8IjsgYnJlYWs7CiAgICBjYXNlIEJJVF9Y
T1JfRVhQUjoKICAgICAgb3BuYW1lID0gIl4iOyBicmVhazsKICAgIGNhc2UgTFJPVEFURV9F
WFBSOgogICAgY2FzZSBSUk9UQVRFX0VYUFI6CiAgICAgIG9wbmFtZSA9ICJyb3RhdGUiOyBi
cmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIG9wbmFtZSA9ICJ1bmtub3duIjsgYnJlYWs7CiAg
ICB9CiAgZXJyb3IgKCJpbnZhbGlkIG9wZXJhbmRzIHRvIGJpbmFyeSAlcyIsIG9wbmFtZSk7
Cn0KDAovKiBTdWJyb3V0aW5lIG9mIGJ1aWxkX2JpbmFyeV9vcCwgdXNlZCBmb3IgY29tcGFy
aXNvbiBvcGVyYXRpb25zLgogICBTZWUgaWYgdGhlIG9wZXJhbmRzIGhhdmUgYm90aCBiZWVu
IGNvbnZlcnRlZCBmcm9tIHN1YndvcmQgaW50ZWdlciB0eXBlcwogICBhbmQsIGlmIHNvLCBw
ZXJoYXBzIGNoYW5nZSB0aGVtIGJvdGggYmFjayB0byB0aGVpciBvcmlnaW5hbCB0eXBlLgog
ICBUaGlzIGZ1bmN0aW9uIGlzIGFsc28gcmVzcG9uc2libGUgZm9yIGNvbnZlcnRpbmcgdGhl
IHR3byBvcGVyYW5kcwogICB0byB0aGUgcHJvcGVyIGNvbW1vbiB0eXBlIGZvciBjb21wYXJp
c29uLgoKICAgVGhlIGFyZ3VtZW50cyBvZiB0aGlzIGZ1bmN0aW9uIGFyZSBhbGwgcG9pbnRl
cnMgdG8gbG9jYWwgdmFyaWFibGVzCiAgIG9mIGJ1aWxkX2JpbmFyeV9vcDogT1AwX1BUUiBp
cyAmT1AwLCBPUDFfUFRSIGlzICZPUDEsCiAgIFJFU1RZUEVfUFRSIGlzICZSRVNVTFRfVFlQ
RSBhbmQgUkVTQ09ERV9QVFIgaXMgJlJFU1VMVENPREUuCgogICBJZiB0aGlzIGZ1bmN0aW9u
IHJldHVybnMgbm9uemVybywgaXQgbWVhbnMgdGhhdCB0aGUgY29tcGFyaXNvbiBoYXMKICAg
YSBjb25zdGFudCB2YWx1ZS4gIFdoYXQgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGlzIGFuIGV4
cHJlc3Npb24gZm9yCiAgIHRoYXQgdmFsdWUuICAqLwoKdHJlZQpzaG9ydGVuX2NvbXBhcmUg
KHRyZWUgKm9wMF9wdHIsIHRyZWUgKm9wMV9wdHIsIHRyZWUgKnJlc3R5cGVfcHRyLAoJCSBl
bnVtIHRyZWVfY29kZSAqcmVzY29kZV9wdHIpCnsKICB0cmVlIHR5cGU7CiAgdHJlZSBvcDAg
PSAqb3AwX3B0cjsKICB0cmVlIG9wMSA9ICpvcDFfcHRyOwogIGludCB1bnNpZ25lZHAwLCB1
bnNpZ25lZHAxOwogIGludCByZWFsMSwgcmVhbDI7CiAgdHJlZSBwcmltb3AwLCBwcmltb3Ax
OwogIGVudW0gdHJlZV9jb2RlIGNvZGUgPSAqcmVzY29kZV9wdHI7CgogIC8qIFRocm93IGF3
YXkgYW55IGNvbnZlcnNpb25zIHRvIHdpZGVyIHR5cGVzCiAgICAgYWxyZWFkeSBwcmVzZW50
IGluIHRoZSBvcGVyYW5kcy4gICovCgogIHByaW1vcDAgPSBnZXRfbmFycm93ZXIgKG9wMCwg
JnVuc2lnbmVkcDApOwogIHByaW1vcDEgPSBnZXRfbmFycm93ZXIgKG9wMSwgJnVuc2lnbmVk
cDEpOwoKICAvKiBIYW5kbGUgdGhlIGNhc2UgdGhhdCBPUDAgZG9lcyBub3QgKmNvbnRhaW4q
IGEgY29udmVyc2lvbgogICAgIGJ1dCBpdCAqcmVxdWlyZXMqIGNvbnZlcnNpb24gdG8gRklO
QUxfVFlQRS4gICovCgogIGlmIChvcDAgPT0gcHJpbW9wMCAmJiBUUkVFX1RZUEUgKG9wMCkg
IT0gKnJlc3R5cGVfcHRyKQogICAgdW5zaWduZWRwMCA9IFRSRUVfVU5TSUdORUQgKFRSRUVf
VFlQRSAob3AwKSk7CiAgaWYgKG9wMSA9PSBwcmltb3AxICYmIFRSRUVfVFlQRSAob3AxKSAh
PSAqcmVzdHlwZV9wdHIpCiAgICB1bnNpZ25lZHAxID0gVFJFRV9VTlNJR05FRCAoVFJFRV9U
WVBFIChvcDEpKTsKCiAgLyogSWYgb25lIG9mIHRoZSBvcGVyYW5kcyBtdXN0IGJlIGZsb2F0
ZWQsIHdlIGNhbm5vdCBvcHRpbWl6ZS4gICovCiAgcmVhbDEgPSBUUkVFX0NPREUgKFRSRUVf
VFlQRSAocHJpbW9wMCkpID09IFJFQUxfVFlQRTsKICByZWFsMiA9IFRSRUVfQ09ERSAoVFJF
RV9UWVBFIChwcmltb3AxKSkgPT0gUkVBTF9UWVBFOwoKICAvKiBJZiBmaXJzdCBhcmcgaXMg
Y29uc3RhbnQsIHN3YXAgdGhlIGFyZ3MgKGNoYW5naW5nIG9wZXJhdGlvbgogICAgIHNvIHZh
bHVlIGlzIHByZXNlcnZlZCksIGZvciBjYW5vbmljYWxpemF0aW9uLiAgRG9uJ3QgZG8gdGhp
cyBpZgogICAgIHRoZSBzZWNvbmQgYXJnIGlzIDAuICAqLwoKICBpZiAoVFJFRV9DT05TVEFO
VCAocHJpbW9wMCkKICAgICAgJiYgISBpbnRlZ2VyX3plcm9wIChwcmltb3AxKSAmJiAhIHJl
YWxfemVyb3AgKHByaW1vcDEpKQogICAgewogICAgICB0cmVlIHRlbSA9IHByaW1vcDA7CiAg
ICAgIGludCB0ZW1pID0gdW5zaWduZWRwMDsKICAgICAgcHJpbW9wMCA9IHByaW1vcDE7CiAg
ICAgIHByaW1vcDEgPSB0ZW07CiAgICAgIHRlbSA9IG9wMDsKICAgICAgb3AwID0gb3AxOwog
ICAgICBvcDEgPSB0ZW07CiAgICAgICpvcDBfcHRyID0gb3AwOwogICAgICAqb3AxX3B0ciA9
IG9wMTsKICAgICAgdW5zaWduZWRwMCA9IHVuc2lnbmVkcDE7CiAgICAgIHVuc2lnbmVkcDEg
PSB0ZW1pOwogICAgICB0ZW1pID0gcmVhbDE7CiAgICAgIHJlYWwxID0gcmVhbDI7CiAgICAg
IHJlYWwyID0gdGVtaTsKCiAgICAgIHN3aXRjaCAoY29kZSkKCXsKCWNhc2UgTFRfRVhQUjoK
CSAgY29kZSA9IEdUX0VYUFI7CgkgIGJyZWFrOwoJY2FzZSBHVF9FWFBSOgoJICBjb2RlID0g
TFRfRVhQUjsKCSAgYnJlYWs7CgljYXNlIExFX0VYUFI6CgkgIGNvZGUgPSBHRV9FWFBSOwoJ
ICBicmVhazsKCWNhc2UgR0VfRVhQUjoKCSAgY29kZSA9IExFX0VYUFI7CgkgIGJyZWFrOwoJ
ZGVmYXVsdDoKCSAgYnJlYWs7Cgl9CiAgICAgICpyZXNjb2RlX3B0ciA9IGNvZGU7CiAgICB9
CgogIC8qIElmIGNvbXBhcmluZyBhbiBpbnRlZ2VyIGFnYWluc3QgYSBjb25zdGFudCBtb3Jl
IGJpdHMgd2lkZSwKICAgICBtYXliZSB3ZSBjYW4gZGVkdWNlIGEgdmFsdWUgb2YgMSBvciAw
IGluZGVwZW5kZW50IG9mIHRoZSBkYXRhLgogICAgIE9yIGVsc2UgdHJ1bmNhdGUgdGhlIGNv
bnN0YW50IG5vdwogICAgIHJhdGhlciB0aGFuIGV4dGVuZCB0aGUgdmFyaWFibGUgYXQgcnVu
IHRpbWUuCgogICAgIFRoaXMgaXMgb25seSBpbnRlcmVzdGluZyBpZiB0aGUgY29uc3RhbnQg
aXMgdGhlIHdpZGVyIGFyZy4KICAgICBBbHNvLCBpdCBpcyBub3Qgc2FmZSBpZiB0aGUgY29u
c3RhbnQgaXMgdW5zaWduZWQgYW5kIHRoZQogICAgIHZhcmlhYmxlIGFyZyBpcyBzaWduZWQs
IHNpbmNlIGluIHRoaXMgY2FzZSB0aGUgdmFyaWFibGUKICAgICB3b3VsZCBiZSBzaWduLWV4
dGVuZGVkIGFuZCB0aGVuIHJlZ2FyZGVkIGFzIHVuc2lnbmVkLgogICAgIE91ciB0ZWNobmlx
dWUgZmFpbHMgaW4gdGhpcyBjYXNlIGJlY2F1c2UgdGhlIGxvd2VzdC9oaWdoZXN0CiAgICAg
cG9zc2libGUgdW5zaWduZWQgcmVzdWx0cyBkb24ndCBmb2xsb3cgbmF0dXJhbGx5IGZyb20g
dGhlCiAgICAgbG93ZXN0L2hpZ2hlc3QgcG9zc2libGUgdmFsdWVzIG9mIHRoZSB2YXJpYWJs
ZSBvcGVyYW5kLgogICAgIEZvciBqdXN0IEVRX0VYUFIgYW5kIE5FX0VYUFIgdGhlcmUgaXMg
YW5vdGhlciB0ZWNobmlxdWUgdGhhdAogICAgIGNvdWxkIGJlIHVzZWQ6IHNlZSBpZiB0aGUg
Y29uc3RhbnQgY2FuIGJlIGZhaXRoZnVsbHkgcmVwcmVzZW50ZWQKICAgICBpbiB0aGUgb3Ro
ZXIgb3BlcmFuZCdzIHR5cGUsIGJ5IHRydW5jYXRpbmcgaXQgYW5kIHJlZXh0ZW5kaW5nIGl0
CiAgICAgYW5kIHNlZSBpZiB0aGF0IHByZXNlcnZlcyB0aGUgY29uc3RhbnQncyB2YWx1ZS4g
ICovCgogIGlmICghcmVhbDEgJiYgIXJlYWwyCiAgICAgICYmIFRSRUVfQ09ERSAocHJpbW9w
MSkgPT0gSU5URUdFUl9DU1QKICAgICAgJiYgVFlQRV9QUkVDSVNJT04gKFRSRUVfVFlQRSAo
cHJpbW9wMCkpIDwgVFlQRV9QUkVDSVNJT04gKCpyZXN0eXBlX3B0cikpCiAgICB7CiAgICAg
IGludCBtaW5fZ3QsIG1heF9ndCwgbWluX2x0LCBtYXhfbHQ7CiAgICAgIHRyZWUgbWF4dmFs
LCBtaW52YWw7CiAgICAgIC8qIDEgaWYgY29tcGFyaXNvbiBpcyBub21pbmFsbHkgdW5zaWdu
ZWQuICAqLwogICAgICBpbnQgdW5zaWduZWRwID0gVFJFRV9VTlNJR05FRCAoKnJlc3R5cGVf
cHRyKTsKICAgICAgdHJlZSB2YWw7CgogICAgICB0eXBlID0gY19jb21tb25fc2lnbmVkX29y
X3Vuc2lnbmVkX3R5cGUgKHVuc2lnbmVkcDAsCgkJCQkJICAgICAgIFRSRUVfVFlQRSAocHJp
bW9wMCkpOwoKICAgICAgLyogSWYgVFlQRSBpcyBhbiBlbnVtZXJhdGlvbiwgdGhlbiB3ZSBu
ZWVkIHRvIGdldCBpdHMgbWluL21heAoJIHZhbHVlcyBmcm9tIGl0J3MgdW5kZXJseWluZyBp
bnRlZ3JhbCB0eXBlLCBub3QgdGhlIGVudW1lcmF0ZWQKCSB0eXBlIGl0c2VsZi4gICovCiAg
ICAgIGlmIChUUkVFX0NPREUgKHR5cGUpID09IEVOVU1FUkFMX1RZUEUpCgl0eXBlID0gY19j
b21tb25fdHlwZV9mb3Jfc2l6ZSAoVFlQRV9QUkVDSVNJT04gKHR5cGUpLCB1bnNpZ25lZHAw
KTsKCiAgICAgIG1heHZhbCA9IFRZUEVfTUFYX1ZBTFVFICh0eXBlKTsKICAgICAgbWludmFs
ID0gVFlQRV9NSU5fVkFMVUUgKHR5cGUpOwoKICAgICAgaWYgKHVuc2lnbmVkcCAmJiAhdW5z
aWduZWRwMCkKCSpyZXN0eXBlX3B0ciA9IGNfY29tbW9uX3NpZ25lZF90eXBlICgqcmVzdHlw
ZV9wdHIpOwoKICAgICAgaWYgKFRSRUVfVFlQRSAocHJpbW9wMSkgIT0gKnJlc3R5cGVfcHRy
KQoJcHJpbW9wMSA9IGNvbnZlcnQgKCpyZXN0eXBlX3B0ciwgcHJpbW9wMSk7CiAgICAgIGlm
ICh0eXBlICE9ICpyZXN0eXBlX3B0cikKCXsKCSAgbWludmFsID0gY29udmVydCAoKnJlc3R5
cGVfcHRyLCBtaW52YWwpOwoJICBtYXh2YWwgPSBjb252ZXJ0ICgqcmVzdHlwZV9wdHIsIG1h
eHZhbCk7Cgl9CgogICAgICBpZiAodW5zaWduZWRwICYmIHVuc2lnbmVkcDApCgl7CgkgIG1p
bl9ndCA9IElOVF9DU1RfTFRfVU5TSUdORUQgKHByaW1vcDEsIG1pbnZhbCk7CgkgIG1heF9n
dCA9IElOVF9DU1RfTFRfVU5TSUdORUQgKHByaW1vcDEsIG1heHZhbCk7CgkgIG1pbl9sdCA9
IElOVF9DU1RfTFRfVU5TSUdORUQgKG1pbnZhbCwgcHJpbW9wMSk7CgkgIG1heF9sdCA9IElO
VF9DU1RfTFRfVU5TSUdORUQgKG1heHZhbCwgcHJpbW9wMSk7Cgl9CiAgICAgIGVsc2UKCXsK
CSAgbWluX2d0ID0gSU5UX0NTVF9MVCAocHJpbW9wMSwgbWludmFsKTsKCSAgbWF4X2d0ID0g
SU5UX0NTVF9MVCAocHJpbW9wMSwgbWF4dmFsKTsKCSAgbWluX2x0ID0gSU5UX0NTVF9MVCAo
bWludmFsLCBwcmltb3AxKTsKCSAgbWF4X2x0ID0gSU5UX0NTVF9MVCAobWF4dmFsLCBwcmlt
b3AxKTsKCX0KCiAgICAgIHZhbCA9IDA7CiAgICAgIC8qIFRoaXMgdXNlZCB0byBiZSBhIHN3
aXRjaCwgYnV0IEdlbml4IGNvbXBpbGVyIGNhbid0IGhhbmRsZSB0aGF0LiAgKi8KICAgICAg
aWYgKGNvZGUgPT0gTkVfRVhQUikKCXsKCSAgaWYgKG1heF9sdCB8fCBtaW5fZ3QpCgkgICAg
dmFsID0gYm9vbGVhbl90cnVlX25vZGU7Cgl9CiAgICAgIGVsc2UgaWYgKGNvZGUgPT0gRVFf
RVhQUikKCXsKCSAgaWYgKG1heF9sdCB8fCBtaW5fZ3QpCgkgICAgdmFsID0gYm9vbGVhbl9m
YWxzZV9ub2RlOwoJfQogICAgICBlbHNlIGlmIChjb2RlID09IExUX0VYUFIpCgl7CgkgIGlm
IChtYXhfbHQpCgkgICAgdmFsID0gYm9vbGVhbl90cnVlX25vZGU7CgkgIGlmICghbWluX2x0
KQoJICAgIHZhbCA9IGJvb2xlYW5fZmFsc2Vfbm9kZTsKCX0KICAgICAgZWxzZSBpZiAoY29k
ZSA9PSBHVF9FWFBSKQoJewoJICBpZiAobWluX2d0KQoJICAgIHZhbCA9IGJvb2xlYW5fdHJ1
ZV9ub2RlOwoJICBpZiAoIW1heF9ndCkKCSAgICB2YWwgPSBib29sZWFuX2ZhbHNlX25vZGU7
Cgl9CiAgICAgIGVsc2UgaWYgKGNvZGUgPT0gTEVfRVhQUikKCXsKCSAgaWYgKCFtYXhfZ3Qp
CgkgICAgdmFsID0gYm9vbGVhbl90cnVlX25vZGU7CgkgIGlmIChtaW5fZ3QpCgkgICAgdmFs
ID0gYm9vbGVhbl9mYWxzZV9ub2RlOwoJfQogICAgICBlbHNlIGlmIChjb2RlID09IEdFX0VY
UFIpCgl7CgkgIGlmICghbWluX2x0KQoJICAgIHZhbCA9IGJvb2xlYW5fdHJ1ZV9ub2RlOwoJ
ICBpZiAobWF4X2x0KQoJICAgIHZhbCA9IGJvb2xlYW5fZmFsc2Vfbm9kZTsKCX0KCiAgICAg
IC8qIElmIHByaW1vcDAgd2FzIHNpZ24tZXh0ZW5kZWQgYW5kIHVuc2lnbmVkIGNvbXBhcmlz
b24gc3BlY2QsCgkgd2UgZGlkIGEgc2lnbmVkIGNvbXBhcmlzb24gYWJvdmUgdXNpbmcgdGhl
IHNpZ25lZCB0eXBlIGJvdW5kcy4KCSBCdXQgdGhlIGNvbXBhcmlzb24gd2Ugb3V0cHV0IG11
c3QgYmUgdW5zaWduZWQuCgoJIEFsc28sIGZvciBpbmVxdWFsaXRpZXMsIFZBTCBpcyBubyBn
b29kOyBidXQgaWYgdGhlIHNpZ25lZAoJIGNvbXBhcmlzb24gaGFkICphbnkqIGZpeGVkIHJl
c3VsdCwgaXQgZm9sbG93cyB0aGF0IHRoZQoJIHVuc2lnbmVkIGNvbXBhcmlzb24ganVzdCB0
ZXN0cyB0aGUgc2lnbiBpbiByZXZlcnNlCgkgKHBvc2l0aXZlIHZhbHVlcyBhcmUgTEUsIG5l
Z2F0aXZlIG9uZXMgR0UpLgoJIFNvIHdlIGNhbiBnZW5lcmF0ZSBhbiB1bnNpZ25lZCBjb21w
YXJpc29uCgkgYWdhaW5zdCBhbiBleHRyZW1lIHZhbHVlIG9mIHRoZSBzaWduZWQgdHlwZS4g
ICovCgogICAgICBpZiAodW5zaWduZWRwICYmICF1bnNpZ25lZHAwKQoJewoJICBpZiAodmFs
ICE9IDApCgkgICAgc3dpdGNoIChjb2RlKQoJICAgICAgewoJICAgICAgY2FzZSBMVF9FWFBS
OgoJICAgICAgY2FzZSBHRV9FWFBSOgoJCXByaW1vcDEgPSBUWVBFX01JTl9WQUxVRSAodHlw
ZSk7CgkJdmFsID0gMDsKCQlicmVhazsKCgkgICAgICBjYXNlIExFX0VYUFI6CgkgICAgICBj
YXNlIEdUX0VYUFI6CgkJcHJpbW9wMSA9IFRZUEVfTUFYX1ZBTFVFICh0eXBlKTsKCQl2YWwg
PSAwOwoJCWJyZWFrOwoKCSAgICAgIGRlZmF1bHQ6CgkJYnJlYWs7CgkgICAgICB9CgkgIHR5
cGUgPSBjX2NvbW1vbl91bnNpZ25lZF90eXBlICh0eXBlKTsKCX0KCiAgICAgIGlmIChUUkVF
X0NPREUgKHByaW1vcDApICE9IElOVEVHRVJfQ1NUKQoJewoJICBpZiAodmFsID09IGJvb2xl
YW5fZmFsc2Vfbm9kZSkKCSAgICB3YXJuaW5nICgiY29tcGFyaXNvbiBpcyBhbHdheXMgZmFs
c2UgZHVlIHRvIGxpbWl0ZWQgcmFuZ2Ugb2YgZGF0YSB0eXBlIik7CgkgIGlmICh2YWwgPT0g
Ym9vbGVhbl90cnVlX25vZGUpCgkgICAgd2FybmluZyAoImNvbXBhcmlzb24gaXMgYWx3YXlz
IHRydWUgZHVlIHRvIGxpbWl0ZWQgcmFuZ2Ugb2YgZGF0YSB0eXBlIik7Cgl9CgogICAgICBp
ZiAodmFsICE9IDApCgl7CgkgIC8qIERvbid0IGZvcmdldCB0byBldmFsdWF0ZSBQUklNT1Aw
IGlmIGl0IGhhcyBzaWRlIGVmZmVjdHMuICAqLwoJICBpZiAoVFJFRV9TSURFX0VGRkVDVFMg
KHByaW1vcDApKQoJICAgIHJldHVybiBidWlsZCAoQ09NUE9VTkRfRVhQUiwgVFJFRV9UWVBF
ICh2YWwpLCBwcmltb3AwLCB2YWwpOwoJICByZXR1cm4gdmFsOwoJfQoKICAgICAgLyogVmFs
dWUgaXMgbm90IHByZWRldGVybWluZWQsIGJ1dCBkbyB0aGUgY29tcGFyaXNvbgoJIGluIHRo
ZSB0eXBlIG9mIHRoZSBvcGVyYW5kIHRoYXQgaXMgbm90IGNvbnN0YW50LgoJIFRZUEUgaXMg
YWxyZWFkeSBwcm9wZXJseSBzZXQuICAqLwogICAgfQogIGVsc2UgaWYgKHJlYWwxICYmIHJl
YWwyCgkgICAmJiAoVFlQRV9QUkVDSVNJT04gKFRSRUVfVFlQRSAocHJpbW9wMCkpCgkgICAg
ICAgPT0gVFlQRV9QUkVDSVNJT04gKFRSRUVfVFlQRSAocHJpbW9wMSkpKSkKICAgIHR5cGUg
PSBUUkVFX1RZUEUgKHByaW1vcDApOwoKICAvKiBJZiBhcmdzJyBuYXR1cmFsIHR5cGVzIGFy
ZSBib3RoIG5hcnJvd2VyIHRoYW4gbm9taW5hbCB0eXBlCiAgICAgYW5kIGJvdGggZXh0ZW5k
IGluIHRoZSBzYW1lIG1hbm5lciwgY29tcGFyZSB0aGVtCiAgICAgaW4gdGhlIHR5cGUgb2Yg
dGhlIHdpZGVyIGFyZy4KICAgICBPdGhlcndpc2UgbXVzdCBhY3R1YWxseSBleHRlbmQgYm90
aCB0byB0aGUgbm9taW5hbAogICAgIGNvbW1vbiB0eXBlIGxlc3QgZGlmZmVyZW50IHdheXMg
b2YgZXh0ZW5kaW5nCiAgICAgYWx0ZXIgdGhlIHJlc3VsdC4KICAgICAoZWcsIChzaG9ydCkt
MSA9PSAodW5zaWduZWQgc2hvcnQpLTEgIHNob3VsZCBiZSAwLikgICovCgogIGVsc2UgaWYg
KHVuc2lnbmVkcDAgPT0gdW5zaWduZWRwMSAmJiByZWFsMSA9PSByZWFsMgoJICAgJiYgVFlQ
RV9QUkVDSVNJT04gKFRSRUVfVFlQRSAocHJpbW9wMCkpIDwgVFlQRV9QUkVDSVNJT04gKCpy
ZXN0eXBlX3B0cikKCSAgICYmIFRZUEVfUFJFQ0lTSU9OIChUUkVFX1RZUEUgKHByaW1vcDEp
KSA8IFRZUEVfUFJFQ0lTSU9OICgqcmVzdHlwZV9wdHIpKQogICAgewogICAgICB0eXBlID0g
Y29tbW9uX3R5cGUgKFRSRUVfVFlQRSAocHJpbW9wMCksIFRSRUVfVFlQRSAocHJpbW9wMSkp
OwogICAgICB0eXBlID0gY19jb21tb25fc2lnbmVkX29yX3Vuc2lnbmVkX3R5cGUgKHVuc2ln
bmVkcDAKCQkJCQkgICAgICAgfHwgVFJFRV9VTlNJR05FRCAoKnJlc3R5cGVfcHRyKSwKCQkJ
CQkgICAgICAgdHlwZSk7CiAgICAgIC8qIE1ha2Ugc3VyZSBzaG9ydGVyIG9wZXJhbmQgaXMg
ZXh0ZW5kZWQgdGhlIHJpZ2h0IHdheQoJIHRvIG1hdGNoIHRoZSBsb25nZXIgb3BlcmFuZC4g
ICovCiAgICAgIHByaW1vcDAKCT0gY29udmVydCAoY19jb21tb25fc2lnbmVkX29yX3Vuc2ln
bmVkX3R5cGUgKHVuc2lnbmVkcDAsCgkJCQkJCSAgICAgVFJFRV9UWVBFIChwcmltb3AwKSks
CgkJICAgcHJpbW9wMCk7CiAgICAgIHByaW1vcDEKCT0gY29udmVydCAoY19jb21tb25fc2ln
bmVkX29yX3Vuc2lnbmVkX3R5cGUgKHVuc2lnbmVkcDEsCgkJCQkJCSAgICAgVFJFRV9UWVBF
IChwcmltb3AxKSksCgkJICAgcHJpbW9wMSk7CiAgICB9CiAgZWxzZQogICAgewogICAgICAv
KiBIZXJlIHdlIG11c3QgZG8gdGhlIGNvbXBhcmlzb24gb24gdGhlIG5vbWluYWwgdHlwZQoJ
IHVzaW5nIHRoZSBhcmdzIGV4YWN0bHkgYXMgd2UgcmVjZWl2ZWQgdGhlbS4gICovCiAgICAg
IHR5cGUgPSAqcmVzdHlwZV9wdHI7CiAgICAgIHByaW1vcDAgPSBvcDA7CiAgICAgIHByaW1v
cDEgPSBvcDE7CgogICAgICBpZiAoIXJlYWwxICYmICFyZWFsMiAmJiBpbnRlZ2VyX3plcm9w
IChwcmltb3AxKQoJICAmJiBUUkVFX1VOU0lHTkVEICgqcmVzdHlwZV9wdHIpKQoJewoJICB0
cmVlIHZhbHVlID0gMDsKCSAgc3dpdGNoIChjb2RlKQoJICAgIHsKCSAgICBjYXNlIEdFX0VY
UFI6CgkgICAgICAvKiBBbGwgdW5zaWduZWQgdmFsdWVzIGFyZSA+PSAwLCBzbyB3ZSB3YXJu
IGlmIGV4dHJhIHdhcm5pbmdzCgkJIGFyZSByZXF1ZXN0ZWQuICBIb3dldmVyLCBpZiBPUDAg
aXMgYSBjb25zdGFudCB0aGF0IGlzCgkJID49IDAsIHRoZSBzaWduZWRuZXNzIG9mIHRoZSBj
b21wYXJpc29uIGlzbid0IGFuIGlzc3VlLAoJCSBzbyBzdXBwcmVzcyB0aGUgd2FybmluZy4g
ICovCgkgICAgICBpZiAoZXh0cmFfd2FybmluZ3MgJiYgIWluX3N5c3RlbV9oZWFkZXIKCQkg
ICYmICEgKFRSRUVfQ09ERSAocHJpbW9wMCkgPT0gSU5URUdFUl9DU1QKCQkJJiYgISBUUkVF
X09WRVJGTE9XIChjb252ZXJ0IChjX2NvbW1vbl9zaWduZWRfdHlwZSAodHlwZSksCgkJCQkJ
CSAgICAgcHJpbW9wMCkpKSkKCQl3YXJuaW5nICgiY29tcGFyaXNvbiBvZiB1bnNpZ25lZCBl
eHByZXNzaW9uID49IDAgaXMgYWx3YXlzIHRydWUiKTsKCSAgICAgIHZhbHVlID0gYm9vbGVh
bl90cnVlX25vZGU7CgkgICAgICBicmVhazsKCgkgICAgY2FzZSBMVF9FWFBSOgoJICAgICAg
aWYgKGV4dHJhX3dhcm5pbmdzICYmICFpbl9zeXN0ZW1faGVhZGVyCgkJICAmJiAhIChUUkVF
X0NPREUgKHByaW1vcDApID09IElOVEVHRVJfQ1NUCgkJCSYmICEgVFJFRV9PVkVSRkxPVyAo
Y29udmVydCAoY19jb21tb25fc2lnbmVkX3R5cGUgKHR5cGUpLAoJCQkJCQkgICAgIHByaW1v
cDApKSkpCgkJd2FybmluZyAoImNvbXBhcmlzb24gb2YgdW5zaWduZWQgZXhwcmVzc2lvbiA8
IDAgaXMgYWx3YXlzIGZhbHNlIik7CgkgICAgICB2YWx1ZSA9IGJvb2xlYW5fZmFsc2Vfbm9k
ZTsKCSAgICAgIGJyZWFrOwoKCSAgICBkZWZhdWx0OgoJICAgICAgYnJlYWs7CgkgICAgfQoK
CSAgaWYgKHZhbHVlICE9IDApCgkgICAgewoJICAgICAgLyogRG9uJ3QgZm9yZ2V0IHRvIGV2
YWx1YXRlIFBSSU1PUDAgaWYgaXQgaGFzIHNpZGUgZWZmZWN0cy4gICovCgkgICAgICBpZiAo
VFJFRV9TSURFX0VGRkVDVFMgKHByaW1vcDApKQoJCXJldHVybiBidWlsZCAoQ09NUE9VTkRf
RVhQUiwgVFJFRV9UWVBFICh2YWx1ZSksCgkJCSAgICAgIHByaW1vcDAsIHZhbHVlKTsKCSAg
ICAgIHJldHVybiB2YWx1ZTsKCSAgICB9Cgl9CiAgICB9CgogICpvcDBfcHRyID0gY29udmVy
dCAodHlwZSwgcHJpbW9wMCk7CiAgKm9wMV9wdHIgPSBjb252ZXJ0ICh0eXBlLCBwcmltb3Ax
KTsKCiAgKnJlc3R5cGVfcHRyID0gYm9vbGVhbl90eXBlX25vZGU7CgogIHJldHVybiAwOwp9
CgwKLyogUmV0dXJuIGEgdHJlZSBmb3IgdGhlIHN1bSBvciBkaWZmZXJlbmNlIChSRVNVTFRD
T0RFIHNheXMgd2hpY2gpCiAgIG9mIHBvaW50ZXIgUFRST1AgYW5kIGludGVnZXIgSU5UT1Au
ICAqLwoKdHJlZQpwb2ludGVyX2ludF9zdW0gKGVudW0gdHJlZV9jb2RlIHJlc3VsdGNvZGUs
IHRyZWUgcHRyb3AsIHRyZWUgaW50b3ApCnsKICB0cmVlIHNpemVfZXhwOwoKICB0cmVlIHJl
c3VsdDsKICB0cmVlIGZvbGRlZDsKCiAgLyogVGhlIHJlc3VsdCBpcyBhIHBvaW50ZXIgb2Yg
dGhlIHNhbWUgdHlwZSB0aGF0IGlzIGJlaW5nIGFkZGVkLiAgKi8KCiAgdHJlZSByZXN1bHRf
dHlwZSA9IFRSRUVfVFlQRSAocHRyb3ApOwoKICBpZiAoVFJFRV9DT0RFIChUUkVFX1RZUEUg
KHJlc3VsdF90eXBlKSkgPT0gVk9JRF9UWVBFKQogICAgewogICAgICBpZiAocGVkYW50aWMg
fHwgd2Fybl9wb2ludGVyX2FyaXRoKQoJcGVkd2FybiAoInBvaW50ZXIgb2YgdHlwZSBgdm9p
ZCAqJyB1c2VkIGluIGFyaXRobWV0aWMiKTsKICAgICAgc2l6ZV9leHAgPSBpbnRlZ2VyX29u
ZV9ub2RlOwogICAgfQogIGVsc2UgaWYgKFRSRUVfQ09ERSAoVFJFRV9UWVBFIChyZXN1bHRf
dHlwZSkpID09IEZVTkNUSU9OX1RZUEUpCiAgICB7CiAgICAgIGlmIChwZWRhbnRpYyB8fCB3
YXJuX3BvaW50ZXJfYXJpdGgpCglwZWR3YXJuICgicG9pbnRlciB0byBhIGZ1bmN0aW9uIHVz
ZWQgaW4gYXJpdGhtZXRpYyIpOwogICAgICBzaXplX2V4cCA9IGludGVnZXJfb25lX25vZGU7
CiAgICB9CiAgZWxzZSBpZiAoVFJFRV9DT0RFIChUUkVFX1RZUEUgKHJlc3VsdF90eXBlKSkg
PT0gTUVUSE9EX1RZUEUpCiAgICB7CiAgICAgIGlmIChwZWRhbnRpYyB8fCB3YXJuX3BvaW50
ZXJfYXJpdGgpCglwZWR3YXJuICgicG9pbnRlciB0byBtZW1iZXIgZnVuY3Rpb24gdXNlZCBp
biBhcml0aG1ldGljIik7CiAgICAgIHNpemVfZXhwID0gaW50ZWdlcl9vbmVfbm9kZTsKICAg
IH0KICBlbHNlIGlmIChUUkVFX0NPREUgKFRSRUVfVFlQRSAocmVzdWx0X3R5cGUpKSA9PSBP
RkZTRVRfVFlQRSkKICAgIHsKICAgICAgaWYgKHBlZGFudGljIHx8IHdhcm5fcG9pbnRlcl9h
cml0aCkKCXBlZHdhcm4gKCJwb2ludGVyIHRvIGEgbWVtYmVyIHVzZWQgaW4gYXJpdGhtZXRp
YyIpOwogICAgICBzaXplX2V4cCA9IGludGVnZXJfb25lX25vZGU7CiAgICB9CiAgZWxzZQog
ICAgc2l6ZV9leHAgPSBzaXplX2luX2J5dGVzIChUUkVFX1RZUEUgKHJlc3VsdF90eXBlKSk7
CgogIC8qIElmIHdoYXQgd2UgYXJlIGFib3V0IHRvIG11bHRpcGx5IGJ5IHRoZSBzaXplIG9m
IHRoZSBlbGVtZW50cwogICAgIGNvbnRhaW5zIGEgY29uc3RhbnQgdGVybSwgYXBwbHkgZGlz
dHJpYnV0aXZlIGxhdwogICAgIGFuZCBtdWx0aXBseSB0aGF0IGNvbnN0YW50IHRlcm0gc2Vw
YXJhdGVseS4KICAgICBUaGlzIGhlbHBzIHByb2R1Y2UgY29tbW9uIHN1YmV4cHJlc3Npb25z
LiAgKi8KCiAgaWYgKChUUkVFX0NPREUgKGludG9wKSA9PSBQTFVTX0VYUFIgfHwgVFJFRV9D
T0RFIChpbnRvcCkgPT0gTUlOVVNfRVhQUikKICAgICAgJiYgISBUUkVFX0NPTlNUQU5UIChp
bnRvcCkKICAgICAgJiYgVFJFRV9DT05TVEFOVCAoVFJFRV9PUEVSQU5EIChpbnRvcCwgMSkp
CiAgICAgICYmIFRSRUVfQ09OU1RBTlQgKHNpemVfZXhwKQogICAgICAvKiBJZiB0aGUgY29u
c3RhbnQgY29tZXMgZnJvbSBwb2ludGVyIHN1YnRyYWN0aW9uLAoJIHNraXAgdGhpcyBvcHRp
bWl6YXRpb24tLWl0IHdvdWxkIGNhdXNlIGFuIGVycm9yLiAgKi8KICAgICAgJiYgVFJFRV9D
T0RFIChUUkVFX1RZUEUgKFRSRUVfT1BFUkFORCAoaW50b3AsIDApKSkgPT0gSU5URUdFUl9U
WVBFCiAgICAgIC8qIElmIHRoZSBjb25zdGFudCBpcyB1bnNpZ25lZCwgYW5kIHNtYWxsZXIg
dGhhbiB0aGUgcG9pbnRlciBzaXplLAoJIHRoZW4gd2UgbXVzdCBza2lwIHRoaXMgb3B0aW1p
emF0aW9uLiAgVGhpcyBpcyBiZWNhdXNlIGl0IGNvdWxkIGNhdXNlCgkgYW4gb3ZlcmZsb3cg
ZXJyb3IgaWYgdGhlIGNvbnN0YW50IGlzIG5lZ2F0aXZlIGJ1dCBJTlRPUCBpcyBub3QuICAq
LwogICAgICAmJiAoISBUUkVFX1VOU0lHTkVEIChUUkVFX1RZUEUgKGludG9wKSkKCSAgfHwg
KFRZUEVfUFJFQ0lTSU9OIChUUkVFX1RZUEUgKGludG9wKSkKCSAgICAgID09IFRZUEVfUFJF
Q0lTSU9OIChUUkVFX1RZUEUgKHB0cm9wKSkpKSkKICAgIHsKICAgICAgZW51bSB0cmVlX2Nv
ZGUgc3ViY29kZSA9IHJlc3VsdGNvZGU7CiAgICAgIHRyZWUgaW50X3R5cGUgPSBUUkVFX1RZ
UEUgKGludG9wKTsKICAgICAgaWYgKFRSRUVfQ09ERSAoaW50b3ApID09IE1JTlVTX0VYUFIp
CglzdWJjb2RlID0gKHN1YmNvZGUgPT0gUExVU19FWFBSID8gTUlOVVNfRVhQUiA6IFBMVVNf
RVhQUik7CiAgICAgIC8qIENvbnZlcnQgYm90aCBzdWJleHByZXNzaW9uIHR5cGVzIHRvIHRo
ZSB0eXBlIG9mIGludG9wLAoJIGJlY2F1c2Ugd2VpcmQgY2FzZXMgaW52b2x2aW5nIHBvaW50
ZXIgYXJpdGhtZXRpYwoJIGNhbiByZXN1bHQgaW4gYSBzdW0gb3IgZGlmZmVyZW5jZSB3aXRo
IGRpZmZlcmVudCB0eXBlIGFyZ3MuICAqLwogICAgICBwdHJvcCA9IGJ1aWxkX2JpbmFyeV9v
cCAoc3ViY29kZSwgcHRyb3AsCgkJCSAgICAgICBjb252ZXJ0IChpbnRfdHlwZSwgVFJFRV9P
UEVSQU5EIChpbnRvcCwgMSkpLCAxKTsKICAgICAgaW50b3AgPSBjb252ZXJ0IChpbnRfdHlw
ZSwgVFJFRV9PUEVSQU5EIChpbnRvcCwgMCkpOwogICAgfQoKICAvKiBDb252ZXJ0IHRoZSBp
bnRlZ2VyIGFyZ3VtZW50IHRvIGEgdHlwZSB0aGUgc2FtZSBzaXplIGFzIHNpemV0eXBlCiAg
ICAgc28gdGhlIG11bHRpcGx5IHdvbid0IG92ZXJmbG93IHNwdXJpb3VzbHkuICAqLwoKICBp
ZiAoVFlQRV9QUkVDSVNJT04gKFRSRUVfVFlQRSAoaW50b3ApKSAhPSBUWVBFX1BSRUNJU0lP
TiAoc2l6ZXR5cGUpCiAgICAgIHx8IFRSRUVfVU5TSUdORUQgKFRSRUVfVFlQRSAoaW50b3Ap
KSAhPSBUUkVFX1VOU0lHTkVEIChzaXpldHlwZSkpCiAgICBpbnRvcCA9IGNvbnZlcnQgKGNf
Y29tbW9uX3R5cGVfZm9yX3NpemUgKFRZUEVfUFJFQ0lTSU9OIChzaXpldHlwZSksCgkJCQkJ
ICAgICBUUkVFX1VOU0lHTkVEIChzaXpldHlwZSkpLCBpbnRvcCk7CgogIC8qIFJlcGxhY2Ug
dGhlIGludGVnZXIgYXJndW1lbnQgd2l0aCBhIHN1aXRhYmxlIHByb2R1Y3QgYnkgdGhlIG9i
amVjdCBzaXplLgogICAgIERvIHRoaXMgbXVsdGlwbGljYXRpb24gYXMgc2lnbmVkLCB0aGVu
IGNvbnZlcnQgdG8gdGhlIGFwcHJvcHJpYXRlCiAgICAgcG9pbnRlciB0eXBlIChhY3R1YWxs
eSB1bnNpZ25lZCBpbnRlZ3JhbCkuICAqLwoKICBpbnRvcCA9IGNvbnZlcnQgKHJlc3VsdF90
eXBlLAoJCSAgIGJ1aWxkX2JpbmFyeV9vcCAoTVVMVF9FWFBSLCBpbnRvcCwKCQkJCSAgICBj
b252ZXJ0IChUUkVFX1RZUEUgKGludG9wKSwgc2l6ZV9leHApLCAxKSk7CgogIC8qIENyZWF0
ZSB0aGUgc3VtIG9yIGRpZmZlcmVuY2UuICAqLwoKICByZXN1bHQgPSBidWlsZCAocmVzdWx0
Y29kZSwgcmVzdWx0X3R5cGUsIHB0cm9wLCBpbnRvcCk7CgogIGZvbGRlZCA9IGZvbGQgKHJl
c3VsdCk7CiAgaWYgKGZvbGRlZCA9PSByZXN1bHQpCiAgICBUUkVFX0NPTlNUQU5UIChmb2xk
ZWQpID0gVFJFRV9DT05TVEFOVCAocHRyb3ApICYgVFJFRV9DT05TVEFOVCAoaW50b3ApOwog
IHJldHVybiBmb2xkZWQ7Cn0KDAovKiBQcmVwYXJlIGV4cHIgdG8gYmUgYW4gYXJndW1lbnQg
b2YgYSBUUlVUSF9OT1RfRVhQUiwKICAgb3IgdmFsaWRhdGUgaXRzIGRhdGEgdHlwZSBmb3Ig
YW4gYGlmJyBvciBgd2hpbGUnIHN0YXRlbWVudCBvciA/Li46IGV4cC4KCiAgIFRoaXMgcHJl
cGFyYXRpb24gY29uc2lzdHMgb2YgdGFraW5nIHRoZSBvcmRpbmFyeQogICByZXByZXNlbnRh
dGlvbiBvZiBhbiBleHByZXNzaW9uIGV4cHIgYW5kIHByb2R1Y2luZyBhIHZhbGlkIHRyZWUK
ICAgYm9vbGVhbiBleHByZXNzaW9uIGRlc2NyaWJpbmcgd2hldGhlciBleHByIGlzIG5vbnpl
cm8uICBXZSBjb3VsZAogICBzaW1wbHkgYWx3YXlzIGRvIGJ1aWxkX2JpbmFyeV9vcCAoTkVf
RVhQUiwgZXhwciwgYm9vbGVhbl9mYWxzZV9ub2RlLCAxKSwKICAgYnV0IHdlIG9wdGltaXpl
IGNvbXBhcmlzb25zLCAmJiwgfHwsIGFuZCAhLgoKICAgVGhlIHJlc3VsdGluZyB0eXBlIHNo
b3VsZCBhbHdheXMgYmUgYGJvb2xlYW5fdHlwZV9ub2RlJy4gICovCgp0cmVlCmNfY29tbW9u
X3RydXRodmFsdWVfY29udmVyc2lvbiAodHJlZSBleHByKQp7CiAgaWYgKFRSRUVfQ09ERSAo
ZXhwcikgPT0gRVJST1JfTUFSSykKICAgIHJldHVybiBleHByOwoKI2lmIDAgLyogVGhpcyBh
cHBlYXJzIHRvIGJlIHdyb25nIGZvciBDKysuICAqLwogIC8qIFRoZXNlIHJlYWxseSBzaG91
bGQgcmV0dXJuIGVycm9yX21hcmtfbm9kZSBhZnRlciAyLjQgaXMgc3RhYmxlLgogICAgIEJ1
dCBub3QgYWxsIGNhbGxlcnMgaGFuZGxlIEVSUk9SX01BUksgcHJvcGVybHkuICAqLwogIHN3
aXRjaCAoVFJFRV9DT0RFIChUUkVFX1RZUEUgKGV4cHIpKSkKICAgIHsKICAgIGNhc2UgUkVD
T1JEX1RZUEU6CiAgICAgIGVycm9yICgic3RydWN0IHR5cGUgdmFsdWUgdXNlZCB3aGVyZSBz
Y2FsYXIgaXMgcmVxdWlyZWQiKTsKICAgICAgcmV0dXJuIGJvb2xlYW5fZmFsc2Vfbm9kZTsK
CiAgICBjYXNlIFVOSU9OX1RZUEU6CiAgICAgIGVycm9yICgidW5pb24gdHlwZSB2YWx1ZSB1
c2VkIHdoZXJlIHNjYWxhciBpcyByZXF1aXJlZCIpOwogICAgICByZXR1cm4gYm9vbGVhbl9m
YWxzZV9ub2RlOwoKICAgIGNhc2UgQVJSQVlfVFlQRToKICAgICAgZXJyb3IgKCJhcnJheSB0
eXBlIHZhbHVlIHVzZWQgd2hlcmUgc2NhbGFyIGlzIHJlcXVpcmVkIik7CiAgICAgIHJldHVy
biBib29sZWFuX2ZhbHNlX25vZGU7CgogICAgZGVmYXVsdDoKICAgICAgYnJlYWs7CiAgICB9
CiNlbmRpZiAvKiAwICovCgogIHN3aXRjaCAoVFJFRV9DT0RFIChleHByKSkKICAgIHsKICAg
IGNhc2UgRVFfRVhQUjoKICAgIGNhc2UgTkVfRVhQUjogY2FzZSBMRV9FWFBSOiBjYXNlIEdF
X0VYUFI6IGNhc2UgTFRfRVhQUjogY2FzZSBHVF9FWFBSOgogICAgY2FzZSBUUlVUSF9BTkRJ
Rl9FWFBSOgogICAgY2FzZSBUUlVUSF9PUklGX0VYUFI6CiAgICBjYXNlIFRSVVRIX0FORF9F
WFBSOgogICAgY2FzZSBUUlVUSF9PUl9FWFBSOgogICAgY2FzZSBUUlVUSF9YT1JfRVhQUjoK
ICAgIGNhc2UgVFJVVEhfTk9UX0VYUFI6CiAgICAgIFRSRUVfVFlQRSAoZXhwcikgPSBib29s
ZWFuX3R5cGVfbm9kZTsKICAgICAgcmV0dXJuIGV4cHI7CgogICAgY2FzZSBFUlJPUl9NQVJL
OgogICAgICByZXR1cm4gZXhwcjsKCiAgICBjYXNlIElOVEVHRVJfQ1NUOgogICAgICByZXR1
cm4gaW50ZWdlcl96ZXJvcCAoZXhwcikgPyBib29sZWFuX2ZhbHNlX25vZGUgOiBib29sZWFu
X3RydWVfbm9kZTsKCiAgICBjYXNlIFJFQUxfQ1NUOgogICAgICByZXR1cm4gcmVhbF96ZXJv
cCAoZXhwcikgPyBib29sZWFuX2ZhbHNlX25vZGUgOiBib29sZWFuX3RydWVfbm9kZTsKCiAg
ICBjYXNlIEFERFJfRVhQUjoKICAgICAgLyogSWYgd2UgYXJlIHRha2luZyB0aGUgYWRkcmVz
cyBvZiBhbiBleHRlcm5hbCBkZWNsLCBpdCBtaWdodCBiZSB6ZXJvCgkgaWYgaXQgaXMgd2Vh
aywgc28gd2UgY2Fubm90IG9wdGltaXplLiAgKi8KICAgICAgaWYgKERFQ0xfUCAoVFJFRV9P
UEVSQU5EIChleHByLCAwKSkKCSAgJiYgREVDTF9FWFRFUk5BTCAoVFJFRV9PUEVSQU5EIChl
eHByLCAwKSkpCglicmVhazsKCiAgICAgIGlmIChUUkVFX1NJREVfRUZGRUNUUyAoVFJFRV9P
UEVSQU5EIChleHByLCAwKSkpCglyZXR1cm4gYnVpbGQgKENPTVBPVU5EX0VYUFIsIGJvb2xl
YW5fdHlwZV9ub2RlLAoJCSAgICAgIFRSRUVfT1BFUkFORCAoZXhwciwgMCksIGJvb2xlYW5f
dHJ1ZV9ub2RlKTsKICAgICAgZWxzZQoJcmV0dXJuIGJvb2xlYW5fdHJ1ZV9ub2RlOwoKICAg
IGNhc2UgQ09NUExFWF9FWFBSOgogICAgICByZXR1cm4gYnVpbGRfYmluYXJ5X29wICgoVFJF
RV9TSURFX0VGRkVDVFMgKFRSRUVfT1BFUkFORCAoZXhwciwgMSkpCgkJCSAgICAgICA/IFRS
VVRIX09SX0VYUFIgOiBUUlVUSF9PUklGX0VYUFIpLAoJCWNfY29tbW9uX3RydXRodmFsdWVf
Y29udmVyc2lvbiAoVFJFRV9PUEVSQU5EIChleHByLCAwKSksCgkJY19jb21tb25fdHJ1dGh2
YWx1ZV9jb252ZXJzaW9uIChUUkVFX09QRVJBTkQgKGV4cHIsIDEpKSwKCQkJICAgICAgMCk7
CgogICAgY2FzZSBORUdBVEVfRVhQUjoKICAgIGNhc2UgQUJTX0VYUFI6CiAgICBjYXNlIEZM
T0FUX0VYUFI6CiAgICBjYXNlIEZGU19FWFBSOgogICAgY2FzZSBQT1BDT1VOVF9FWFBSOgog
ICAgICAvKiBUaGVzZSBkb24ndCBjaGFuZ2Ugd2hldGhlciBhbiBvYmplY3QgaXMgbm9uemVy
byBvciB6ZXJvLiAgKi8KICAgICAgcmV0dXJuIGNfY29tbW9uX3RydXRodmFsdWVfY29udmVy
c2lvbiAoVFJFRV9PUEVSQU5EIChleHByLCAwKSk7CgogICAgY2FzZSBMUk9UQVRFX0VYUFI6
CiAgICBjYXNlIFJST1RBVEVfRVhQUjoKICAgICAgLyogVGhlc2UgZG9uJ3QgY2hhbmdlIHdo
ZXRoZXIgYW4gb2JqZWN0IGlzIHplcm8gb3Igbm9uemVybywgYnV0Cgkgd2UgY2FuJ3QgaWdu
b3JlIHRoZW0gaWYgdGhlaXIgc2Vjb25kIGFyZyBoYXMgc2lkZS1lZmZlY3RzLiAgKi8KICAg
ICAgaWYgKFRSRUVfU0lERV9FRkZFQ1RTIChUUkVFX09QRVJBTkQgKGV4cHIsIDEpKSkKCXJl
dHVybiBidWlsZCAoQ09NUE9VTkRfRVhQUiwgYm9vbGVhbl90eXBlX25vZGUsIFRSRUVfT1BF
UkFORCAoZXhwciwgMSksCgkJICAgICAgY19jb21tb25fdHJ1dGh2YWx1ZV9jb252ZXJzaW9u
IChUUkVFX09QRVJBTkQgKGV4cHIsIDApKSk7CiAgICAgIGVsc2UKCXJldHVybiBjX2NvbW1v
bl90cnV0aHZhbHVlX2NvbnZlcnNpb24gKFRSRUVfT1BFUkFORCAoZXhwciwgMCkpOwoKICAg
IGNhc2UgQ09ORF9FWFBSOgogICAgICAvKiBEaXN0cmlidXRlIHRoZSBjb252ZXJzaW9uIGlu
dG8gdGhlIGFybXMgb2YgYSBDT05EX0VYUFIuICAqLwogICAgICByZXR1cm4gZm9sZCAoYnVp
bGQgKENPTkRfRVhQUiwgYm9vbGVhbl90eXBlX25vZGUsIFRSRUVfT1BFUkFORCAoZXhwciwg
MCksCgkJY19jb21tb25fdHJ1dGh2YWx1ZV9jb252ZXJzaW9uIChUUkVFX09QRVJBTkQgKGV4
cHIsIDEpKSwKCQljX2NvbW1vbl90cnV0aHZhbHVlX2NvbnZlcnNpb24gKFRSRUVfT1BFUkFO
RCAoZXhwciwgMikpKSk7CgogICAgY2FzZSBDT05WRVJUX0VYUFI6CiAgICAgIC8qIERvbid0
IGNhbmNlbCB0aGUgZWZmZWN0IG9mIGEgQ09OVkVSVF9FWFBSIGZyb20gYSBSRUZFUkVOQ0Vf
VFlQRSwKCSBzaW5jZSB0aGF0IGFmZmVjdHMgaG93IGBkZWZhdWx0X2NvbnZlcnNpb24nIHdp
bGwgYmVoYXZlLiAgKi8KICAgICAgaWYgKFRSRUVfQ09ERSAoVFJFRV9UWVBFIChleHByKSkg
PT0gUkVGRVJFTkNFX1RZUEUKCSAgfHwgVFJFRV9DT0RFIChUUkVFX1RZUEUgKFRSRUVfT1BF
UkFORCAoZXhwciwgMCkpKSA9PSBSRUZFUkVOQ0VfVFlQRSkKCWJyZWFrOwogICAgICAvKiBm
YWxsIHRocm91Z2guLi4gICovCiAgICBjYXNlIE5PUF9FWFBSOgogICAgICAvKiBJZiB0aGlz
IGlzIHdpZGVuaW5nIHRoZSBhcmd1bWVudCwgd2UgY2FuIGlnbm9yZSBpdC4gICovCiAgICAg
IGlmIChUWVBFX1BSRUNJU0lPTiAoVFJFRV9UWVBFIChleHByKSkKCSAgPj0gVFlQRV9QUkVD
SVNJT04gKFRSRUVfVFlQRSAoVFJFRV9PUEVSQU5EIChleHByLCAwKSkpKQoJcmV0dXJuIGNf
Y29tbW9uX3RydXRodmFsdWVfY29udmVyc2lvbiAoVFJFRV9PUEVSQU5EIChleHByLCAwKSk7
CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgTUlOVVNfRVhQUjoKICAgICAgLyogUGVyaGFwcyBy
ZWR1Y2UgKHggLSB5KSAhPSAwIHRvICh4ICE9IHkpLiAgVGhlIGV4cHJlc3Npb25zCgkgYXJl
bid0IGd1YXJhbnRlZWQgdG8gdGhlIGJlIHNhbWUgZm9yIG1vZGVzIHRoYXQgY2FuIHJlcHJl
c2VudAoJIGluZmluaXR5LCBzaW5jZSBpZiB4IGFuZCB5IGFyZSBib3RoICtpbmZpbml0eSwg
b3IgYm90aAoJIC1pbmZpbml0eSwgdGhlbiB4IC0geSBpcyBub3QgYSBudW1iZXIuCgoJIE5v
dGUgdGhhdCB0aGlzIHRyYW5zZm9ybWF0aW9uIGlzIHNhZmUgd2hlbiB4IG9yIHkgaXMgTmFO
LgoJICh4IC0geSkgaXMgdGhlbiBOYU4sIGFuZCBib3RoICh4IC0geSkgIT0gMCBhbmQgeCAh
PSB5IHdpbGwKCSBiZSBmYWxzZS4gICovCiAgICAgIGlmIChIT05PUl9JTkZJTklUSUVTIChU
WVBFX01PREUgKFRSRUVfVFlQRSAoVFJFRV9PUEVSQU5EIChleHByLCAwKSkpKSkKCWJyZWFr
OwogICAgICAvKiBmYWxsIHRocm91Z2guLi4gICovCiAgICBjYXNlIEJJVF9YT1JfRVhQUjoK
ICAgICAgLyogVGhpcyBhbmQgTUlOVVNfRVhQUiBjYW4gYmUgY2hhbmdlZCBpbnRvIGEgY29t
cGFyaXNvbiBvZiB0aGUKCSB0d28gb2JqZWN0cy4gICovCiAgICAgIGlmIChUUkVFX1RZUEUg
KFRSRUVfT1BFUkFORCAoZXhwciwgMCkpCgkgID09IFRSRUVfVFlQRSAoVFJFRV9PUEVSQU5E
IChleHByLCAxKSkpCglyZXR1cm4gYnVpbGRfYmluYXJ5X29wIChORV9FWFBSLCBUUkVFX09Q
RVJBTkQgKGV4cHIsIDApLAoJCQkJVFJFRV9PUEVSQU5EIChleHByLCAxKSwgMSk7CiAgICAg
IHJldHVybiBidWlsZF9iaW5hcnlfb3AgKE5FX0VYUFIsIFRSRUVfT1BFUkFORCAoZXhwciwg
MCksCgkJCSAgICAgIGZvbGQgKGJ1aWxkMSAoTk9QX0VYUFIsCgkJCQkJICAgIFRSRUVfVFlQ
RSAoVFJFRV9PUEVSQU5EIChleHByLCAwKSksCgkJCQkJICAgIFRSRUVfT1BFUkFORCAoZXhw
ciwgMSkpKSwgMSk7CgogICAgY2FzZSBCSVRfQU5EX0VYUFI6CiAgICAgIGlmIChpbnRlZ2Vy
X29uZXAgKFRSRUVfT1BFUkFORCAoZXhwciwgMSkpCgkgICYmIFRSRUVfVFlQRSAoZXhwcikg
IT0gYm9vbGVhbl90eXBlX25vZGUpCgkvKiBVc2luZyBjb252ZXJ0IGhlcmUgd291bGQgY2F1
c2UgaW5maW5pdGUgcmVjdXJzaW9uLiAgKi8KCXJldHVybiBidWlsZDEgKE5PUF9FWFBSLCBi
b29sZWFuX3R5cGVfbm9kZSwgZXhwcik7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgTU9ESUZZ
X0VYUFI6CiAgICAgIGlmICh3YXJuX3BhcmVudGhlc2VzICYmIENfRVhQX09SSUdJTkFMX0NP
REUgKGV4cHIpID09IE1PRElGWV9FWFBSKQoJd2FybmluZyAoInN1Z2dlc3QgcGFyZW50aGVz
ZXMgYXJvdW5kIGFzc2lnbm1lbnQgdXNlZCBhcyB0cnV0aCB2YWx1ZSIpOwogICAgICBicmVh
azsKCiAgICBkZWZhdWx0OgogICAgICBicmVhazsKICAgIH0KCiAgaWYgKFRSRUVfQ09ERSAo
VFJFRV9UWVBFIChleHByKSkgPT0gQ09NUExFWF9UWVBFKQogICAgewogICAgICB0cmVlIHQg
PSBzYXZlX2V4cHIgKGV4cHIpOwogICAgICByZXR1cm4gKGJ1aWxkX2JpbmFyeV9vcAoJICAg
ICAgKChUUkVFX1NJREVfRUZGRUNUUyAoZXhwcikKCQk/IFRSVVRIX09SX0VYUFIgOiBUUlVU
SF9PUklGX0VYUFIpLAoJY19jb21tb25fdHJ1dGh2YWx1ZV9jb252ZXJzaW9uIChidWlsZF91
bmFyeV9vcCAoUkVBTFBBUlRfRVhQUiwgdCwgMCkpLAoJY19jb21tb25fdHJ1dGh2YWx1ZV9j
b252ZXJzaW9uIChidWlsZF91bmFyeV9vcCAoSU1BR1BBUlRfRVhQUiwgdCwgMCkpLAoJICAg
ICAgIDApKTsKICAgIH0KCiAgcmV0dXJuIGJ1aWxkX2JpbmFyeV9vcCAoTkVfRVhQUiwgZXhw
ciwgaW50ZWdlcl96ZXJvX25vZGUsIDEpOwp9CgwKc3RhdGljIHRyZWUgYnVpbHRpbl9mdW5j
dGlvbl8yIChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgdHJlZSwgdHJlZSwKCQkJCWlu
dCwgZW51bSBidWlsdF9pbl9jbGFzcywgaW50LCBpbnQsCgkJCQl0cmVlKTsKCi8qIE1ha2Ug
YSB2YXJpYW50IHR5cGUgaW4gdGhlIHByb3BlciB3YXkgZm9yIEMvQysrLCBwcm9wYWdhdGlu
ZyBxdWFsaWZpZXJzCiAgIGRvd24gdG8gdGhlIGVsZW1lbnQgdHlwZSBvZiBhbiBhcnJheS4g
ICovCgp0cmVlCmNfYnVpbGRfcXVhbGlmaWVkX3R5cGUgKHRyZWUgdHlwZSwgaW50IHR5cGVf
cXVhbHMpCnsKICAvKiBBIHJlc3RyaWN0LXF1YWxpZmllZCBwb2ludGVyIHR5cGUgbXVzdCBi
ZSBhIHBvaW50ZXIgdG8gb2JqZWN0IG9yCiAgICAgaW5jb21wbGV0ZSB0eXBlLiAgTm90ZSB0
aGF0IHRoZSB1c2Ugb2YgUE9JTlRFUl9UWVBFX1AgYWxzbyBhbGxvd3MKICAgICBSRUZFUkVO
Q0VfVFlQRXMsIHdoaWNoIGlzIGFwcHJvcHJpYXRlIGZvciBDKysuICBVbmZvcnR1bmF0ZWx5
LAogICAgIHRoZSBDKysgZnJvbnQtZW5kIGFsc28gdXNlIFBPSU5URVJfVFlQRSBmb3IgcG9p
bnRlci10by1tZW1iZXIKICAgICB2YWx1ZXMsIHNvIGV2ZW4gdGhvdWdoIGl0IHNob3VsZCBi
ZSBpbGxlZ2FsIHRvIHVzZSBgcmVzdHJpY3QnCiAgICAgd2l0aCBzdWNoIGFuIGVudGl0eSB3
ZSBkb24ndCBmbGFnIHRoYXQgaGVyZS4gIFRodXMsIHNwZWNpYWwgY2FzZQogICAgIGNvZGUg
Zm9yIHRoYXQgY2FzZSBpcyByZXF1aXJlZCBpbiB0aGUgQysrIGZyb250LWVuZC4gICovCiAg
aWYgKCh0eXBlX3F1YWxzICYgVFlQRV9RVUFMX1JFU1RSSUNUKQogICAgICAmJiAoIVBPSU5U
RVJfVFlQRV9QICh0eXBlKQoJICB8fCAhQ19UWVBFX09CSkVDVF9PUl9JTkNPTVBMRVRFX1Ag
KFRSRUVfVFlQRSAodHlwZSkpKSkKICAgIHsKICAgICAgZXJyb3IgKCJpbnZhbGlkIHVzZSBv
ZiBgcmVzdHJpY3QnIik7CiAgICAgIHR5cGVfcXVhbHMgJj0gflRZUEVfUVVBTF9SRVNUUklD
VDsKICAgIH0KCiAgaWYgKFRSRUVfQ09ERSAodHlwZSkgPT0gQVJSQVlfVFlQRSkKICAgIHJl
dHVybiBidWlsZF9hcnJheV90eXBlIChjX2J1aWxkX3F1YWxpZmllZF90eXBlIChUUkVFX1RZ
UEUgKHR5cGUpLAoJCQkJCQkgICAgIHR5cGVfcXVhbHMpLAoJCQkgICAgIFRZUEVfRE9NQUlO
ICh0eXBlKSk7CiAgcmV0dXJuIGJ1aWxkX3F1YWxpZmllZF90eXBlICh0eXBlLCB0eXBlX3F1
YWxzKTsKfQoKLyogQXBwbHkgdGhlIFRZUEVfUVVBTFMgdG8gdGhlIG5ldyBERUNMLiAgKi8K
CnZvaWQKY19hcHBseV90eXBlX3F1YWxzX3RvX2RlY2wgKGludCB0eXBlX3F1YWxzLCB0cmVl
IGRlY2wpCnsKICBpZiAoKHR5cGVfcXVhbHMgJiBUWVBFX1FVQUxfQ09OU1QpCiAgICAgIHx8
IChUUkVFX1RZUEUgKGRlY2wpCgkgICYmIFRSRUVfQ09ERSAoVFJFRV9UWVBFIChkZWNsKSkg
PT0gUkVGRVJFTkNFX1RZUEUpKQogICAgVFJFRV9SRUFET05MWSAoZGVjbCkgPSAxOwogIGlm
ICh0eXBlX3F1YWxzICYgVFlQRV9RVUFMX1ZPTEFUSUxFKQogICAgewogICAgICBUUkVFX1NJ
REVfRUZGRUNUUyAoZGVjbCkgPSAxOwogICAgICBUUkVFX1RISVNfVk9MQVRJTEUgKGRlY2wp
ID0gMTsKICAgIH0KICBpZiAodHlwZV9xdWFscyAmIFRZUEVfUVVBTF9SRVNUUklDVCkKICAg
IHsKICAgICAgaWYgKCFUUkVFX1RZUEUgKGRlY2wpCgkgIHx8ICFQT0lOVEVSX1RZUEVfUCAo
VFJFRV9UWVBFIChkZWNsKSkKCSAgfHwgIUNfVFlQRV9PQkpFQ1RfT1JfSU5DT01QTEVURV9Q
IChUUkVFX1RZUEUgKFRSRUVfVFlQRSAoZGVjbCkpKSkKCWVycm9yICgiaW52YWxpZCB1c2Ug
b2YgYHJlc3RyaWN0JyIpOwogICAgICBlbHNlIGlmIChmbGFnX3N0cmljdF9hbGlhc2luZykK
CS8qIEluZGljYXRlIHdlIG5lZWQgdG8gbWFrZSBhIHVuaXF1ZSBhbGlhcyBzZXQgZm9yIHRo
aXMgcG9pbnRlci4KCSAgIFdlIGNhbid0IGRvIGl0IGhlcmUgYmVjYXVzZSBpdCBtaWdodCBi
ZSBwb2ludGluZyB0byBhbgoJICAgaW5jb21wbGV0ZSB0eXBlLiAgKi8KCURFQ0xfUE9JTlRF
Ul9BTElBU19TRVQgKGRlY2wpID0gLTI7CiAgICB9Cn0KCi8qIFJldHVybiB0aGUgdHlwZWQt
YmFzZWQgYWxpYXMgc2V0IGZvciBULCB3aGljaCBtYXkgYmUgYW4gZXhwcmVzc2lvbgogICBv
ciBhIHR5cGUuICBSZXR1cm4gLTEgaWYgd2UgZG9uJ3QgZG8gYW55dGhpbmcgc3BlY2lhbC4g
ICovCgpIT1NUX1dJREVfSU5UCmNfY29tbW9uX2dldF9hbGlhc19zZXQgKHRyZWUgdCkKewog
IHRyZWUgdTsKCiAgLyogUGVybWl0IHR5cGUtcHVubmluZyB3aGVuIGFjY2Vzc2luZyBhIHVu
aW9uLCBwcm92aWRlZCB0aGUgYWNjZXNzCiAgICAgaXMgZGlyZWN0bHkgdGhyb3VnaCB0aGUg
dW5pb24uICBGb3IgZXhhbXBsZSwgdGhpcyBjb2RlIGRvZXMgbm90CiAgICAgcGVybWl0IHRh
a2luZyB0aGUgYWRkcmVzcyBvZiBhIHVuaW9uIG1lbWJlciBhbmQgdGhlbiBzdG9yaW5nCiAg
ICAgdGhyb3VnaCBpdC4gIEV2ZW4gdGhlIHR5cGUtcHVubmluZyBhbGxvd2VkIGhlcmUgaXMg
YSBHQ0MKICAgICBleHRlbnNpb24sIGFsYmVpdCBhIGNvbW1vbiBhbmQgdXNlZnVsIG9uZTsg
dGhlIEMgc3RhbmRhcmQgc2F5cwogICAgIHRoYXQgc3VjaCBhY2Nlc3NlcyBoYXZlIGltcGxl
bWVudGF0aW9uLWRlZmluZWQgYmVoYXZpb3IuICAqLwogIGZvciAodSA9IHQ7CiAgICAgICBU
UkVFX0NPREUgKHUpID09IENPTVBPTkVOVF9SRUYgfHwgVFJFRV9DT0RFICh1KSA9PSBBUlJB
WV9SRUY7CiAgICAgICB1ID0gVFJFRV9PUEVSQU5EICh1LCAwKSkKICAgIGlmIChUUkVFX0NP
REUgKHUpID09IENPTVBPTkVOVF9SRUYKCSYmIFRSRUVfQ09ERSAoVFJFRV9UWVBFIChUUkVF
X09QRVJBTkQgKHUsIDApKSkgPT0gVU5JT05fVFlQRSkKICAgICAgcmV0dXJuIDA7CgogIC8q
IFRoYXQncyBhbGwgdGhlIGV4cHJlc3Npb25zIHdlIGhhbmRsZSBzcGVjaWFsbHkuICAqLwog
IGlmICghIFRZUEVfUCAodCkpCiAgICByZXR1cm4gLTE7CgogIC8qIFRoZSBDIHN0YW5kYXJk
IGd1YXJhbnRlZXMgdGhhdCBhbnkgb2JqZWN0IG1heSBiZSBhY2Nlc3NlZCB2aWEgYW4KICAg
ICBsdmFsdWUgdGhhdCBoYXMgY2hhcmFjdGVyIHR5cGUuICAqLwogIGlmICh0ID09IGNoYXJf
dHlwZV9ub2RlCiAgICAgIHx8IHQgPT0gc2lnbmVkX2NoYXJfdHlwZV9ub2RlCiAgICAgIHx8
IHQgPT0gdW5zaWduZWRfY2hhcl90eXBlX25vZGUpCiAgICByZXR1cm4gMDsKCiAgLyogSWYg
aXQgaGFzIHRoZSBtYXlfYWxpYXMgYXR0cmlidXRlLCBpdCBjYW4gYWxpYXMgYW55dGhpbmcu
ICAqLwogIGlmIChsb29rdXBfYXR0cmlidXRlICgibWF5X2FsaWFzIiwgVFlQRV9BVFRSSUJV
VEVTICh0KSkpCiAgICByZXR1cm4gMDsKCiAgLyogVGhlIEMgc3RhbmRhcmQgc3BlY2lmaWNh
bGx5IGFsbG93cyBhbGlhc2luZyBiZXR3ZWVuIHNpZ25lZCBhbmQKICAgICB1bnNpZ25lZCB2
YXJpYW50cyBvZiB0aGUgc2FtZSB0eXBlLiAgV2UgdHJlYXQgdGhlIHNpZ25lZAogICAgIHZh
cmlhbnQgYXMgY2Fub25pY2FsLiAgKi8KICBpZiAoVFJFRV9DT0RFICh0KSA9PSBJTlRFR0VS
X1RZUEUgJiYgVFJFRV9VTlNJR05FRCAodCkpCiAgICB7CiAgICAgIHRyZWUgdDEgPSBjX2Nv
bW1vbl9zaWduZWRfdHlwZSAodCk7CgogICAgICAvKiB0MSA9PSB0IGNhbiBoYXBwZW4gZm9y
IGJvb2xlYW4gbm9kZXMgd2hpY2ggYXJlIGFsd2F5cyB1bnNpZ25lZC4gICovCiAgICAgIGlm
ICh0MSAhPSB0KQoJcmV0dXJuIGdldF9hbGlhc19zZXQgKHQxKTsKICAgIH0KICBlbHNlIGlm
IChQT0lOVEVSX1RZUEVfUCAodCkpCiAgICB7CiAgICAgIHRyZWUgdDE7CgogICAgICAvKiBV
bmZvcnR1bmF0ZWx5LCB0aGVyZSBpcyBubyBjYW5vbmljYWwgZm9ybSBvZiBhIHBvaW50ZXIg
dHlwZS4KCSBJbiBwYXJ0aWN1bGFyLCBpZiB3ZSBoYXZlIGB0eXBlZGVmIGludCBJJywgdGhl
biBgaW50IConLCBhbmQKCSBgSSAqJyBhcmUgZGlmZmVyZW50IHR5cGVzLiAgU28sIHdlIGhh
dmUgdG8gcGljayBhIGNhbm9uaWNhbAoJIHJlcHJlc2VudGF0aXZlLiAgV2UgZG8gdGhpcyBi
ZWxvdy4KCgkgVGVjaG5pY2FsbHksIHRoaXMgYXBwcm9hY2ggaXMgYWN0dWFsbHkgbW9yZSBj
b25zZXJ2YXRpdmUgdGhhdAoJIGl0IG5lZWRzIHRvIGJlLiAgSW4gcGFydGljdWxhciwgYGNv
bnN0IGludCAqJyBhbmQgYGludCAqJwoJIHNob3VsZCBiZSBpbiBkaWZmZXJlbnQgYWxpYXMg
c2V0cywgYWNjb3JkaW5nIHRvIHRoZSBDIGFuZCBDKysKCSBzdGFuZGFyZCwgc2luY2UgdGhl
aXIgdHlwZXMgYXJlIG5vdCB0aGUgc2FtZSwgYW5kIHNvLAoJIHRlY2huaWNhbGx5LCBhbiBg
aW50ICoqJyBhbmQgYGNvbnN0IGludCAqKicgY2Fubm90IHBvaW50IGF0CgkgdGhlIHNhbWUg
dGhpbmcuCgogICAgICAgICBCdXQsIHRoZSBzdGFuZGFyZCBpcyB3cm9uZy4gIEluIHBhcnRp
Y3VsYXIsIHRoaXMgY29kZSBpcwoJIGxlZ2FsIEMrKzoKCiAgICAgICAgICAgIGludCAqaXA7
CiAgICAgICAgICAgIGludCAqKmlwcCA9ICZpcDsKICAgICAgICAgICAgY29uc3QgaW50KiBj
b25zdCogY2lwcCA9ICZpcHA7CgogICAgICAgICBBbmQsIGl0IGRvZXNuJ3QgbWFrZSBzZW5z
ZSBmb3IgdGhhdCB0byBiZSBsZWdhbCB1bmxlc3MgeW91CgkgY2FuIGRlcmVmZXJlbmNlIElQ
UCBhbmQgQ0lQUC4gIFNvLCB3ZSBpZ25vcmUgY3YtcXVhbGlmaWVycyBvbgoJIHRoZSBwb2lu
dGVkLXRvIHR5cGVzLiAgVGhpcyBpc3N1ZSBoYXMgYmVlbiByZXBvcnRlZCB0byB0aGUKCSBD
KysgY29tbWl0dGVlLiAgKi8KICAgICAgdDEgPSBidWlsZF90eXBlX25vX3F1YWxzICh0KTsK
ICAgICAgaWYgKHQxICE9IHQpCglyZXR1cm4gZ2V0X2FsaWFzX3NldCAodDEpOwogICAgfQoK
ICByZXR1cm4gLTE7Cn0KDAovKiBDb21wdXRlIHRoZSB2YWx1ZSBvZiAnc2l6ZW9mIChUWVBF
KScgb3IgJ19fYWxpZ25vZl9fIChUWVBFKScsIHdoZXJlIHRoZQogICBzZWNvbmQgcGFyYW1l
dGVyIGluZGljYXRlcyB3aGljaCBPUEVSQVRPUiBpcyBiZWluZyBhcHBsaWVkLiAgVGhlIENP
TVBMQUlOCiAgIGZsYWcgY29udHJvbHMgd2hldGhlciB3ZSBzaG91bGQgZGlhZ25vc2UgcG9z
c2libHkgaWxsLWZvcm1lZAogICBjb25zdHJ1Y3RzIG9yIG5vdC4gICovCnRyZWUKY19zaXpl
b2Zfb3JfYWxpZ25vZl90eXBlICh0cmVlIHR5cGUsIGVudW0gdHJlZV9jb2RlIG9wLCBpbnQg
Y29tcGxhaW4pCnsKICBjb25zdCBjaGFyICpvcF9uYW1lOwogIHRyZWUgdmFsdWUgPSBOVUxM
OwogIGVudW0gdHJlZV9jb2RlIHR5cGVfY29kZSA9IFRSRUVfQ09ERSAodHlwZSk7CgogIG15
X2ZyaWVuZGx5X2Fzc2VydCAob3AgPT0gU0laRU9GX0VYUFIgfHwgb3AgPT0gQUxJR05PRl9F
WFBSLCAyMDAyMDcyMCk7CiAgb3BfbmFtZSA9IG9wID09IFNJWkVPRl9FWFBSID8gInNpemVv
ZiIgOiAiX19hbGlnbm9mX18iOwoKICBpZiAodHlwZV9jb2RlID09IEZVTkNUSU9OX1RZUEUp
CiAgICB7CiAgICAgIGlmIChvcCA9PSBTSVpFT0ZfRVhQUikKCXsKCSAgaWYgKGNvbXBsYWlu
ICYmIChwZWRhbnRpYyB8fCB3YXJuX3BvaW50ZXJfYXJpdGgpKQoJICAgIHBlZHdhcm4gKCJp
bnZhbGlkIGFwcGxpY2F0aW9uIG9mIGBzaXplb2YnIHRvIGEgZnVuY3Rpb24gdHlwZSIpOwoJ
ICB2YWx1ZSA9IHNpemVfb25lX25vZGU7Cgl9CiAgICAgIGVsc2UKCXZhbHVlID0gc2l6ZV9p
bnQgKEZVTkNUSU9OX0JPVU5EQVJZIC8gQklUU19QRVJfVU5JVCk7CiAgICB9CiAgZWxzZSBp
ZiAodHlwZV9jb2RlID09IFZPSURfVFlQRSB8fCB0eXBlX2NvZGUgPT0gRVJST1JfTUFSSykK
ICAgIHsKICAgICAgaWYgKHR5cGVfY29kZSA9PSBWT0lEX1RZUEUKCSAgJiYgY29tcGxhaW4g
JiYgKHBlZGFudGljIHx8IHdhcm5fcG9pbnRlcl9hcml0aCkpCglwZWR3YXJuICgiaW52YWxp
ZCBhcHBsaWNhdGlvbiBvZiBgJXMnIHRvIGEgdm9pZCB0eXBlIiwgb3BfbmFtZSk7CiAgICAg
IHZhbHVlID0gc2l6ZV9vbmVfbm9kZTsKICAgIH0KICBlbHNlIGlmICghQ09NUExFVEVfVFlQ
RV9QICh0eXBlKSkKICAgIHsKICAgICAgaWYgKGNvbXBsYWluKQoJZXJyb3IgKCJpbnZhbGlk
IGFwcGxpY2F0aW9uIG9mIGAlcycgdG8gYW4gaW5jb21wbGV0ZSB0eXBlIiwgb3BfbmFtZSk7
CiAgICAgIHZhbHVlID0gc2l6ZV96ZXJvX25vZGU7CiAgICB9CiAgZWxzZQogICAgewogICAg
ICBpZiAob3AgPT0gU0laRU9GX0VYUFIpCgkvKiBDb252ZXJ0IGluIGNhc2UgYSBjaGFyIGlz
IG1vcmUgdGhhbiBvbmUgdW5pdC4gICovCgl2YWx1ZSA9IHNpemVfYmlub3AgKENFSUxfRElW
X0VYUFIsIFRZUEVfU0laRV9VTklUICh0eXBlKSwKCQkJICAgIHNpemVfaW50IChUWVBFX1BS
RUNJU0lPTiAoY2hhcl90eXBlX25vZGUpCgkJCQkgICAgICAvIEJJVFNfUEVSX1VOSVQpKTsK
ICAgICAgZWxzZQoJdmFsdWUgPSBzaXplX2ludCAoVFlQRV9BTElHTiAodHlwZSkgLyBCSVRT
X1BFUl9VTklUKTsKICAgIH0KCiAgLyogVkFMVUUgd2lsbCBoYXZlIGFuIGludGVnZXIgdHlw
ZSB3aXRoIFRZUEVfSVNfU0laRVRZUEUgc2V0LgogICAgIFRZUEVfSVNfU0laRVRZUEUgbWVh
bnMgdGhhdCBjZXJ0YWluIHRoaW5ncyAobGlrZSBvdmVyZmxvdykgd2lsbAogICAgIG5ldmVy
IGhhcHBlbi4gIEhvd2V2ZXIsIHRoaXMgbm9kZSBzaG91bGQgcmVhbGx5IGhhdmUgdHlwZQog
ICAgIGBzaXplX3QnLCB3aGljaCBpcyBqdXN0IGEgdHlwZWRlZiBmb3IgYW4gb3JkaW5hcnkg
aW50ZWdlciB0eXBlLiAgKi8KICB2YWx1ZSA9IGZvbGQgKGJ1aWxkMSAoTk9QX0VYUFIsIHNp
emVfdHlwZV9ub2RlLCB2YWx1ZSkpOwogIG15X2ZyaWVuZGx5X2Fzc2VydCAoIVRZUEVfSVNf
U0laRVRZUEUgKFRSRUVfVFlQRSAodmFsdWUpKSwgMjAwMDEwMjEpOwoKICByZXR1cm4gdmFs
dWU7Cn0KCi8qIEltcGxlbWVudCB0aGUgX19hbGlnbm9mIGtleXdvcmQ6IFJldHVybiB0aGUg
bWluaW11bSByZXF1aXJlZAogICBhbGlnbm1lbnQgb2YgRVhQUiwgbWVhc3VyZWQgaW4gYnl0
ZXMuICBGb3IgVkFSX0RFQ0wncyBhbmQKICAgRklFTERfREVDTCdzIHJldHVybiBERUNMX0FM
SUdOICh3aGljaCBjYW4gYmUgc2V0IGZyb20gYW4KICAgImFsaWduZWQiIF9fYXR0cmlidXRl
X18gc3BlY2lmaWNhdGlvbikuICAqLwoKdHJlZQpjX2FsaWdub2ZfZXhwciAodHJlZSBleHBy
KQp7CiAgdHJlZSB0OwoKICBpZiAoVFJFRV9DT0RFIChleHByKSA9PSBWQVJfREVDTCkKICAg
IHQgPSBzaXplX2ludCAoREVDTF9BTElHTiAoZXhwcikgLyBCSVRTX1BFUl9VTklUKTsKCiAg
ZWxzZSBpZiAoVFJFRV9DT0RFIChleHByKSA9PSBDT01QT05FTlRfUkVGCgkgICAmJiBERUNM
X0NfQklUX0ZJRUxEIChUUkVFX09QRVJBTkQgKGV4cHIsIDEpKSkKICAgIHsKICAgICAgZXJy
b3IgKCJgX19hbGlnbm9mJyBhcHBsaWVkIHRvIGEgYml0LWZpZWxkIik7CiAgICAgIHQgPSBz
aXplX29uZV9ub2RlOwogICAgfQogIGVsc2UgaWYgKFRSRUVfQ09ERSAoZXhwcikgPT0gQ09N
UE9ORU5UX1JFRgoJICAgJiYgVFJFRV9DT0RFIChUUkVFX09QRVJBTkQgKGV4cHIsIDEpKSA9
PSBGSUVMRF9ERUNMKQogICAgdCA9IHNpemVfaW50IChERUNMX0FMSUdOIChUUkVFX09QRVJB
TkQgKGV4cHIsIDEpKSAvIEJJVFNfUEVSX1VOSVQpOwoKICBlbHNlIGlmIChUUkVFX0NPREUg
KGV4cHIpID09IElORElSRUNUX1JFRikKICAgIHsKICAgICAgdHJlZSB0ID0gVFJFRV9PUEVS
QU5EIChleHByLCAwKTsKICAgICAgdHJlZSBiZXN0ID0gdDsKICAgICAgaW50IGJlc3RhbGln
biA9IFRZUEVfQUxJR04gKFRSRUVfVFlQRSAoVFJFRV9UWVBFICh0KSkpOwoKICAgICAgd2hp
bGUgKFRSRUVfQ09ERSAodCkgPT0gTk9QX0VYUFIKCSAgICAgJiYgVFJFRV9DT0RFIChUUkVF
X1RZUEUgKFRSRUVfT1BFUkFORCAodCwgMCkpKSA9PSBQT0lOVEVSX1RZUEUpCgl7CgkgIGlu
dCB0aGlzYWxpZ247CgoJICB0ID0gVFJFRV9PUEVSQU5EICh0LCAwKTsKCSAgdGhpc2FsaWdu
ID0gVFlQRV9BTElHTiAoVFJFRV9UWVBFIChUUkVFX1RZUEUgKHQpKSk7CgkgIGlmICh0aGlz
YWxpZ24gPiBiZXN0YWxpZ24pCgkgICAgYmVzdCA9IHQsIGJlc3RhbGlnbiA9IHRoaXNhbGln
bjsKCX0KICAgICAgcmV0dXJuIGNfYWxpZ25vZiAoVFJFRV9UWVBFIChUUkVFX1RZUEUgKGJl
c3QpKSk7CiAgICB9CiAgZWxzZQogICAgcmV0dXJuIGNfYWxpZ25vZiAoVFJFRV9UWVBFIChl
eHByKSk7CgogIHJldHVybiBmb2xkIChidWlsZDEgKE5PUF9FWFBSLCBzaXplX3R5cGVfbm9k
ZSwgdCkpOwp9CgwKLyogSGFuZGxlIEMgYW5kIEMrKyBkZWZhdWx0IGF0dHJpYnV0ZXMuICAq
LwoKZW51bSBidWlsdF9pbl9hdHRyaWJ1dGUKewojZGVmaW5lIERFRl9BVFRSX05VTExfVFJF
RShFTlVNKSBFTlVNLAojZGVmaW5lIERFRl9BVFRSX0lOVChFTlVNLCBWQUxVRSkgRU5VTSwK
I2RlZmluZSBERUZfQVRUUl9JREVOVChFTlVNLCBTVFJJTkcpIEVOVU0sCiNkZWZpbmUgREVG
X0FUVFJfVFJFRV9MSVNUKEVOVU0sIFBVUlBPU0UsIFZBTFVFLCBDSEFJTikgRU5VTSwKI2Rl
ZmluZSBERUZfRk5fQVRUUihOQU1FLCBBVFRSUywgUFJFRElDQVRFKSAvKiBObyBlbnRyeSBu
ZWVkZWQgaW4gZW51bS4gICovCiNpbmNsdWRlICJidWlsdGluLWF0dHJzLmRlZiIKI3VuZGVm
IERFRl9BVFRSX05VTExfVFJFRQojdW5kZWYgREVGX0FUVFJfSU5UCiN1bmRlZiBERUZfQVRU
Ul9JREVOVAojdW5kZWYgREVGX0FUVFJfVFJFRV9MSVNUCiN1bmRlZiBERUZfRk5fQVRUUgog
IEFUVFJfTEFTVAp9OwoKc3RhdGljIEdUWSgoKSkgdHJlZSBidWlsdF9pbl9hdHRyaWJ1dGVz
WyhpbnQpIEFUVFJfTEFTVF07CgpzdGF0aWMgYm9vbCBjX2F0dHJzX2luaXRpYWxpemVkID0g
ZmFsc2U7CgpzdGF0aWMgdm9pZCBjX2luaXRfYXR0cmlidXRlcyAodm9pZCk7CgovKiBCdWls
ZCB0cmVlIG5vZGVzIGFuZCBidWlsdGluIGZ1bmN0aW9ucyBjb21tb24gdG8gYm90aCBDIGFu
ZCBDKysgbGFuZ3VhZ2UKICAgZnJvbnRlbmRzLiAgKi8KCnZvaWQKY19jb21tb25fbm9kZXNf
YW5kX2J1aWx0aW5zICh2b2lkKQp7CiAgZW51bSBidWlsdGluX3R5cGUKICB7CiNkZWZpbmUg
REVGX1BSSU1JVElWRV9UWVBFKE5BTUUsIFZBTFVFKSBOQU1FLAojZGVmaW5lIERFRl9GVU5D
VElPTl9UWVBFXzAoTkFNRSwgUkVUVVJOKSBOQU1FLAojZGVmaW5lIERFRl9GVU5DVElPTl9U
WVBFXzEoTkFNRSwgUkVUVVJOLCBBUkcxKSBOQU1FLAojZGVmaW5lIERFRl9GVU5DVElPTl9U
WVBFXzIoTkFNRSwgUkVUVVJOLCBBUkcxLCBBUkcyKSBOQU1FLAojZGVmaW5lIERFRl9GVU5D
VElPTl9UWVBFXzMoTkFNRSwgUkVUVVJOLCBBUkcxLCBBUkcyLCBBUkczKSBOQU1FLAojZGVm
aW5lIERFRl9GVU5DVElPTl9UWVBFXzQoTkFNRSwgUkVUVVJOLCBBUkcxLCBBUkcyLCBBUkcz
LCBBUkc0KSBOQU1FLAojZGVmaW5lIERFRl9GVU5DVElPTl9UWVBFX1ZBUl8wKE5BTUUsIFJF
VFVSTikgTkFNRSwKI2RlZmluZSBERUZfRlVOQ1RJT05fVFlQRV9WQVJfMShOQU1FLCBSRVRV
Uk4sIEFSRzEpIE5BTUUsCiNkZWZpbmUgREVGX0ZVTkNUSU9OX1RZUEVfVkFSXzIoTkFNRSwg
UkVUVVJOLCBBUkcxLCBBUkcyKSBOQU1FLAojZGVmaW5lIERFRl9GVU5DVElPTl9UWVBFX1ZB
Ul8zKE5BTUUsIFJFVFVSTiwgQVJHMSwgQVJHMiwgQVJHMykgTkFNRSwKI2RlZmluZSBERUZf
UE9JTlRFUl9UWVBFKE5BTUUsIFRZUEUpIE5BTUUsCiNpbmNsdWRlICJidWlsdGluLXR5cGVz
LmRlZiIKI3VuZGVmIERFRl9QUklNSVRJVkVfVFlQRQojdW5kZWYgREVGX0ZVTkNUSU9OX1RZ
UEVfMAojdW5kZWYgREVGX0ZVTkNUSU9OX1RZUEVfMQojdW5kZWYgREVGX0ZVTkNUSU9OX1RZ
UEVfMgojdW5kZWYgREVGX0ZVTkNUSU9OX1RZUEVfMwojdW5kZWYgREVGX0ZVTkNUSU9OX1RZ
UEVfNAojdW5kZWYgREVGX0ZVTkNUSU9OX1RZUEVfVkFSXzAKI3VuZGVmIERFRl9GVU5DVElP
Tl9UWVBFX1ZBUl8xCiN1bmRlZiBERUZfRlVOQ1RJT05fVFlQRV9WQVJfMgojdW5kZWYgREVG
X0ZVTkNUSU9OX1RZUEVfVkFSXzMKI3VuZGVmIERFRl9QT0lOVEVSX1RZUEUKICAgIEJUX0xB
U1QKICB9OwoKICB0eXBlZGVmIGVudW0gYnVpbHRpbl90eXBlIGJ1aWx0aW5fdHlwZTsKCiAg
dHJlZSBidWlsdGluX3R5cGVzWyhpbnQpIEJUX0xBU1RdOwogIGludCB3Y2hhcl90eXBlX3Np
emU7CiAgdHJlZSBhcnJheV9kb21haW5fdHlwZTsKICB0cmVlIHZhX2xpc3RfcmVmX3R5cGVf
bm9kZTsKICB0cmVlIHZhX2xpc3RfYXJnX3R5cGVfbm9kZTsKCiAgLyogRGVmaW5lIGBpbnQn
IGFuZCBgY2hhcicgZmlyc3Qgc28gdGhhdCBkYnggd2lsbCBvdXRwdXQgdGhlbSBmaXJzdC4g
ICovCiAgcmVjb3JkX2J1aWx0aW5fdHlwZSAoUklEX0lOVCwgTlVMTCwgaW50ZWdlcl90eXBl
X25vZGUpOwogIHJlY29yZF9idWlsdGluX3R5cGUgKFJJRF9DSEFSLCAiY2hhciIsIGNoYXJf
dHlwZV9ub2RlKTsKCiAgLyogYHNpZ25lZCcgaXMgdGhlIHNhbWUgYXMgYGludCcuICBGSVhN
RTogdGhlIGRlY2xhcmF0aW9ucyBvZiAic2lnbmVkIiwKICAgICAidW5zaWduZWQgbG9uZyIs
ICJsb25nIGxvbmcgdW5zaWduZWQiIGFuZCAidW5zaWduZWQgc2hvcnQiIHdlcmUgaW4gQysr
CiAgICAgYnV0IG5vdCBDLiAgQXJlIHRoZSBjb25kaXRpb25hbHMgaGVyZSBuZWVkZWQ/ICAq
LwogIGlmIChjX2RpYWxlY3RfY3h4ICgpKQogICAgcmVjb3JkX2J1aWx0aW5fdHlwZSAoUklE
X1NJR05FRCwgTlVMTCwgaW50ZWdlcl90eXBlX25vZGUpOwogIHJlY29yZF9idWlsdGluX3R5
cGUgKFJJRF9MT05HLCAibG9uZyBpbnQiLCBsb25nX2ludGVnZXJfdHlwZV9ub2RlKTsKICBy
ZWNvcmRfYnVpbHRpbl90eXBlIChSSURfVU5TSUdORUQsICJ1bnNpZ25lZCBpbnQiLCB1bnNp
Z25lZF90eXBlX25vZGUpOwogIHJlY29yZF9idWlsdGluX3R5cGUgKFJJRF9NQVgsICJsb25n
IHVuc2lnbmVkIGludCIsCgkJICAgICAgIGxvbmdfdW5zaWduZWRfdHlwZV9ub2RlKTsKICBp
ZiAoY19kaWFsZWN0X2N4eCAoKSkKICAgIHJlY29yZF9idWlsdGluX3R5cGUgKFJJRF9NQVgs
ICJ1bnNpZ25lZCBsb25nIiwgbG9uZ191bnNpZ25lZF90eXBlX25vZGUpOwogIHJlY29yZF9i
dWlsdGluX3R5cGUgKFJJRF9NQVgsICJsb25nIGxvbmcgaW50IiwKCQkgICAgICAgbG9uZ19s
b25nX2ludGVnZXJfdHlwZV9ub2RlKTsKICByZWNvcmRfYnVpbHRpbl90eXBlIChSSURfTUFY
LCAibG9uZyBsb25nIHVuc2lnbmVkIGludCIsCgkJICAgICAgIGxvbmdfbG9uZ191bnNpZ25l
ZF90eXBlX25vZGUpOwogIGlmIChjX2RpYWxlY3RfY3h4ICgpKQogICAgcmVjb3JkX2J1aWx0
aW5fdHlwZSAoUklEX01BWCwgImxvbmcgbG9uZyB1bnNpZ25lZCIsCgkJCSBsb25nX2xvbmdf
dW5zaWduZWRfdHlwZV9ub2RlKTsKICByZWNvcmRfYnVpbHRpbl90eXBlIChSSURfU0hPUlQs
ICJzaG9ydCBpbnQiLCBzaG9ydF9pbnRlZ2VyX3R5cGVfbm9kZSk7CiAgcmVjb3JkX2J1aWx0
aW5fdHlwZSAoUklEX01BWCwgInNob3J0IHVuc2lnbmVkIGludCIsCgkJICAgICAgIHNob3J0
X3Vuc2lnbmVkX3R5cGVfbm9kZSk7CiAgaWYgKGNfZGlhbGVjdF9jeHggKCkpCiAgICByZWNv
cmRfYnVpbHRpbl90eXBlIChSSURfTUFYLCAidW5zaWduZWQgc2hvcnQiLAoJCQkgc2hvcnRf
dW5zaWduZWRfdHlwZV9ub2RlKTsKCiAgLyogRGVmaW5lIGJvdGggYHNpZ25lZCBjaGFyJyBh
bmQgYHVuc2lnbmVkIGNoYXInLiAgKi8KICByZWNvcmRfYnVpbHRpbl90eXBlIChSSURfTUFY
LCAic2lnbmVkIGNoYXIiLCBzaWduZWRfY2hhcl90eXBlX25vZGUpOwogIHJlY29yZF9idWls
dGluX3R5cGUgKFJJRF9NQVgsICJ1bnNpZ25lZCBjaGFyIiwgdW5zaWduZWRfY2hhcl90eXBl
X25vZGUpOwoKICAvKiBUaGVzZSBhcmUgdHlwZXMgdGhhdCBjX2NvbW1vbl90eXBlX2Zvcl9z
aXplIGFuZAogICAgIGNfY29tbW9uX3R5cGVfZm9yX21vZGUgdXNlLiAgKi8KICAoKmxhbmdf
aG9va3MuZGVjbHMucHVzaGRlY2wpIChidWlsZF9kZWNsIChUWVBFX0RFQ0wsIE5VTExfVFJF
RSwKCQkJCQkgICAgaW50UUlfdHlwZV9ub2RlKSk7CiAgKCpsYW5nX2hvb2tzLmRlY2xzLnB1
c2hkZWNsKSAoYnVpbGRfZGVjbCAoVFlQRV9ERUNMLCBOVUxMX1RSRUUsCgkJCQkJICAgIGlu
dEhJX3R5cGVfbm9kZSkpOwogICgqbGFuZ19ob29rcy5kZWNscy5wdXNoZGVjbCkgKGJ1aWxk
X2RlY2wgKFRZUEVfREVDTCwgTlVMTF9UUkVFLAoJCQkJCSAgICBpbnRTSV90eXBlX25vZGUp
KTsKICAoKmxhbmdfaG9va3MuZGVjbHMucHVzaGRlY2wpIChidWlsZF9kZWNsIChUWVBFX0RF
Q0wsIE5VTExfVFJFRSwKCQkJCQkgICAgaW50RElfdHlwZV9ub2RlKSk7CiNpZiBIT1NUX0JJ
VFNfUEVSX1dJREVfSU5UID49IDY0CiAgKCpsYW5nX2hvb2tzLmRlY2xzLnB1c2hkZWNsKSAo
YnVpbGRfZGVjbCAoVFlQRV9ERUNMLAoJCQkJCSAgICBnZXRfaWRlbnRpZmllciAoIl9faW50
MTI4X3QiKSwKCQkJCQkgICAgaW50VElfdHlwZV9ub2RlKSk7CiNlbmRpZgogICgqbGFuZ19o
b29rcy5kZWNscy5wdXNoZGVjbCkgKGJ1aWxkX2RlY2wgKFRZUEVfREVDTCwgTlVMTF9UUkVF
LAoJCQkJCSAgICB1bnNpZ25lZF9pbnRRSV90eXBlX25vZGUpKTsKICAoKmxhbmdfaG9va3Mu
ZGVjbHMucHVzaGRlY2wpIChidWlsZF9kZWNsIChUWVBFX0RFQ0wsIE5VTExfVFJFRSwKCQkJ
CQkgICAgdW5zaWduZWRfaW50SElfdHlwZV9ub2RlKSk7CiAgKCpsYW5nX2hvb2tzLmRlY2xz
LnB1c2hkZWNsKSAoYnVpbGRfZGVjbCAoVFlQRV9ERUNMLCBOVUxMX1RSRUUsCgkJCQkJICAg
IHVuc2lnbmVkX2ludFNJX3R5cGVfbm9kZSkpOwogICgqbGFuZ19ob29rcy5kZWNscy5wdXNo
ZGVjbCkgKGJ1aWxkX2RlY2wgKFRZUEVfREVDTCwgTlVMTF9UUkVFLAoJCQkJCSAgICB1bnNp
Z25lZF9pbnRESV90eXBlX25vZGUpKTsKI2lmIEhPU1RfQklUU19QRVJfV0lERV9JTlQgPj0g
NjQKICAoKmxhbmdfaG9va3MuZGVjbHMucHVzaGRlY2wpIChidWlsZF9kZWNsIChUWVBFX0RF
Q0wsCgkJCQkJICAgIGdldF9pZGVudGlmaWVyICgiX191aW50MTI4X3QiKSwKCQkJCQkgICAg
dW5zaWduZWRfaW50VElfdHlwZV9ub2RlKSk7CiNlbmRpZgoKICAvKiBDcmVhdGUgdGhlIHdp
ZGVzdCBsaXRlcmFsIHR5cGVzLiAgKi8KICB3aWRlc3RfaW50ZWdlcl9saXRlcmFsX3R5cGVf
bm9kZQogICAgPSBtYWtlX3NpZ25lZF90eXBlIChIT1NUX0JJVFNfUEVSX1dJREVfSU5UICog
Mik7CiAgKCpsYW5nX2hvb2tzLmRlY2xzLnB1c2hkZWNsKSAoYnVpbGRfZGVjbCAoVFlQRV9E
RUNMLCBOVUxMX1RSRUUsCgkJCQkJICAgIHdpZGVzdF9pbnRlZ2VyX2xpdGVyYWxfdHlwZV9u
b2RlKSk7CgogIHdpZGVzdF91bnNpZ25lZF9saXRlcmFsX3R5cGVfbm9kZQogICAgPSBtYWtl
X3Vuc2lnbmVkX3R5cGUgKEhPU1RfQklUU19QRVJfV0lERV9JTlQgKiAyKTsKICAoKmxhbmdf
aG9va3MuZGVjbHMucHVzaGRlY2wpIChidWlsZF9kZWNsIChUWVBFX0RFQ0wsIE5VTExfVFJF
RSwKCQkJCQkgICAgd2lkZXN0X3Vuc2lnbmVkX2xpdGVyYWxfdHlwZV9ub2RlKSk7CgogIC8q
IGB1bnNpZ25lZCBsb25nJyBpcyB0aGUgc3RhbmRhcmQgdHlwZSBmb3Igc2l6ZW9mLgogICAg
IE5vdGUgdGhhdCBzdGRkZWYuaCB1c2VzIGB1bnNpZ25lZCBsb25nJywKICAgICBhbmQgdGhp
cyBtdXN0IGFncmVlLCBldmVuIGlmIGxvbmcgYW5kIGludCBhcmUgdGhlIHNhbWUgc2l6ZS4g
ICovCiAgc2l6ZV90eXBlX25vZGUgPQogICAgVFJFRV9UWVBFIChpZGVudGlmaWVyX2dsb2Jh
bF92YWx1ZSAoZ2V0X2lkZW50aWZpZXIgKFNJWkVfVFlQRSkpKTsKICBzaWduZWRfc2l6ZV90
eXBlX25vZGUgPSBjX2NvbW1vbl9zaWduZWRfdHlwZSAoc2l6ZV90eXBlX25vZGUpOwogIHNl
dF9zaXpldHlwZSAoc2l6ZV90eXBlX25vZGUpOwoKICBidWlsZF9jb21tb25fdHJlZV9ub2Rl
c18yIChmbGFnX3Nob3J0X2RvdWJsZSk7CgogIHJlY29yZF9idWlsdGluX3R5cGUgKFJJRF9G
TE9BVCwgTlVMTCwgZmxvYXRfdHlwZV9ub2RlKTsKICByZWNvcmRfYnVpbHRpbl90eXBlIChS
SURfRE9VQkxFLCBOVUxMLCBkb3VibGVfdHlwZV9ub2RlKTsKICByZWNvcmRfYnVpbHRpbl90
eXBlIChSSURfTUFYLCAibG9uZyBkb3VibGUiLCBsb25nX2RvdWJsZV90eXBlX25vZGUpOwoK
ICAoKmxhbmdfaG9va3MuZGVjbHMucHVzaGRlY2wpIChidWlsZF9kZWNsIChUWVBFX0RFQ0ws
CgkJCQkJICAgIGdldF9pZGVudGlmaWVyICgiY29tcGxleCBpbnQiKSwKCQkJCQkgICAgY29t
cGxleF9pbnRlZ2VyX3R5cGVfbm9kZSkpOwogICgqbGFuZ19ob29rcy5kZWNscy5wdXNoZGVj
bCkgKGJ1aWxkX2RlY2wgKFRZUEVfREVDTCwKCQkJCQkgICAgZ2V0X2lkZW50aWZpZXIgKCJj
b21wbGV4IGZsb2F0IiksCgkJCQkJICAgIGNvbXBsZXhfZmxvYXRfdHlwZV9ub2RlKSk7CiAg
KCpsYW5nX2hvb2tzLmRlY2xzLnB1c2hkZWNsKSAoYnVpbGRfZGVjbCAoVFlQRV9ERUNMLAoJ
CQkJCSAgICBnZXRfaWRlbnRpZmllciAoImNvbXBsZXggZG91YmxlIiksCgkJCQkJICAgIGNv
bXBsZXhfZG91YmxlX3R5cGVfbm9kZSkpOwogICgqbGFuZ19ob29rcy5kZWNscy5wdXNoZGVj
bCkKICAgIChidWlsZF9kZWNsIChUWVBFX0RFQ0wsIGdldF9pZGVudGlmaWVyICgiY29tcGxl
eCBsb25nIGRvdWJsZSIpLAoJCSBjb21wbGV4X2xvbmdfZG91YmxlX3R5cGVfbm9kZSkpOwoK
ICAvKiBUeXBlcyB3aGljaCBhcmUgY29tbW9uIHRvIHRoZSBmb3J0cmFuIGNvbXBpbGVyIGFu
ZCBsaWJmMmMuICBXaGVuCiAgICAgY2hhbmdpbmcgdGhlc2UsIHlvdSBhbHNvIG5lZWQgdG8g
YmUgY29uY2VybmVkIHdpdGggZi9jb20uaC4gICovCgogIGlmIChUWVBFX1BSRUNJU0lPTiAo
ZmxvYXRfdHlwZV9ub2RlKQogICAgICA9PSBUWVBFX1BSRUNJU0lPTiAobG9uZ19pbnRlZ2Vy
X3R5cGVfbm9kZSkpCiAgICB7CiAgICAgIGc3N19pbnRlZ2VyX3R5cGVfbm9kZSA9IGxvbmdf
aW50ZWdlcl90eXBlX25vZGU7CiAgICAgIGc3N191aW50ZWdlcl90eXBlX25vZGUgPSBsb25n
X3Vuc2lnbmVkX3R5cGVfbm9kZTsKICAgIH0KICBlbHNlIGlmIChUWVBFX1BSRUNJU0lPTiAo
ZmxvYXRfdHlwZV9ub2RlKQoJICAgPT0gVFlQRV9QUkVDSVNJT04gKGludGVnZXJfdHlwZV9u
b2RlKSkKICAgIHsKICAgICAgZzc3X2ludGVnZXJfdHlwZV9ub2RlID0gaW50ZWdlcl90eXBl
X25vZGU7CiAgICAgIGc3N191aW50ZWdlcl90eXBlX25vZGUgPSB1bnNpZ25lZF90eXBlX25v
ZGU7CiAgICB9CiAgZWxzZQogICAgZzc3X2ludGVnZXJfdHlwZV9ub2RlID0gZzc3X3VpbnRl
Z2VyX3R5cGVfbm9kZSA9IE5VTExfVFJFRTsKCiAgaWYgKGc3N19pbnRlZ2VyX3R5cGVfbm9k
ZSAhPSBOVUxMX1RSRUUpCiAgICB7CiAgICAgICgqbGFuZ19ob29rcy5kZWNscy5wdXNoZGVj
bCkgKGJ1aWxkX2RlY2wgKFRZUEVfREVDTCwKCQkJCQkJZ2V0X2lkZW50aWZpZXIgKCJfX2c3
N19pbnRlZ2VyIiksCgkJCQkJCWc3N19pbnRlZ2VyX3R5cGVfbm9kZSkpOwogICAgICAoKmxh
bmdfaG9va3MuZGVjbHMucHVzaGRlY2wpIChidWlsZF9kZWNsIChUWVBFX0RFQ0wsCgkJCQkJ
CWdldF9pZGVudGlmaWVyICgiX19nNzdfdWludGVnZXIiKSwKCQkJCQkJZzc3X3VpbnRlZ2Vy
X3R5cGVfbm9kZSkpOwogICAgfQoKICBpZiAoVFlQRV9QUkVDSVNJT04gKGZsb2F0X3R5cGVf
bm9kZSkgKiAyCiAgICAgID09IFRZUEVfUFJFQ0lTSU9OIChsb25nX2ludGVnZXJfdHlwZV9u
b2RlKSkKICAgIHsKICAgICAgZzc3X2xvbmdpbnRfdHlwZV9ub2RlID0gbG9uZ19pbnRlZ2Vy
X3R5cGVfbm9kZTsKICAgICAgZzc3X3Vsb25naW50X3R5cGVfbm9kZSA9IGxvbmdfdW5zaWdu
ZWRfdHlwZV9ub2RlOwogICAgfQogIGVsc2UgaWYgKFRZUEVfUFJFQ0lTSU9OIChmbG9hdF90
eXBlX25vZGUpICogMgoJICAgPT0gVFlQRV9QUkVDSVNJT04gKGxvbmdfbG9uZ19pbnRlZ2Vy
X3R5cGVfbm9kZSkpCiAgICB7CiAgICAgIGc3N19sb25naW50X3R5cGVfbm9kZSA9IGxvbmdf
bG9uZ19pbnRlZ2VyX3R5cGVfbm9kZTsKICAgICAgZzc3X3Vsb25naW50X3R5cGVfbm9kZSA9
IGxvbmdfbG9uZ191bnNpZ25lZF90eXBlX25vZGU7CiAgICB9CiAgZWxzZQogICAgZzc3X2xv
bmdpbnRfdHlwZV9ub2RlID0gZzc3X3Vsb25naW50X3R5cGVfbm9kZSA9IE5VTExfVFJFRTsK
CiAgaWYgKGc3N19sb25naW50X3R5cGVfbm9kZSAhPSBOVUxMX1RSRUUpCiAgICB7CiAgICAg
ICgqbGFuZ19ob29rcy5kZWNscy5wdXNoZGVjbCkgKGJ1aWxkX2RlY2wgKFRZUEVfREVDTCwK
CQkJCQkJZ2V0X2lkZW50aWZpZXIgKCJfX2c3N19sb25naW50IiksCgkJCQkJCWc3N19sb25n
aW50X3R5cGVfbm9kZSkpOwogICAgICAoKmxhbmdfaG9va3MuZGVjbHMucHVzaGRlY2wpIChi
dWlsZF9kZWNsIChUWVBFX0RFQ0wsCgkJCQkJCWdldF9pZGVudGlmaWVyICgiX19nNzdfdWxv
bmdpbnQiKSwKCQkJCQkJZzc3X3Vsb25naW50X3R5cGVfbm9kZSkpOwogICAgfQoKICByZWNv
cmRfYnVpbHRpbl90eXBlIChSSURfVk9JRCwgTlVMTCwgdm9pZF90eXBlX25vZGUpOwoKICB2
b2lkX3plcm9fbm9kZSA9IGJ1aWxkX2ludF8yICgwLCAwKTsKICBUUkVFX1RZUEUgKHZvaWRf
emVyb19ub2RlKSA9IHZvaWRfdHlwZV9ub2RlOwoKICB2b2lkX2xpc3Rfbm9kZSA9IGJ1aWxk
X3ZvaWRfbGlzdF9ub2RlICgpOwoKICAvKiBNYWtlIGEgdHlwZSB0byBiZSB0aGUgZG9tYWlu
IG9mIGEgZmV3IGFycmF5IHR5cGVzCiAgICAgd2hvc2UgZG9tYWlucyBkb24ndCByZWFsbHkg
bWF0dGVyLgogICAgIDIwMCBpcyBzbWFsbCBlbm91Z2ggdGhhdCBpdCBhbHdheXMgZml0cyBp
biBzaXplX3QKICAgICBhbmQgbGFyZ2UgZW5vdWdoIHRoYXQgaXQgY2FuIGhvbGQgbW9zdCBm
dW5jdGlvbiBuYW1lcyBmb3IgdGhlCiAgICAgaW5pdGlhbGl6YXRpb25zIG9mIF9fRlVOQ1RJ
T05fXyBhbmQgX19QUkVUVFlfRlVOQ1RJT05fXy4gICovCiAgYXJyYXlfZG9tYWluX3R5cGUg
PSBidWlsZF9pbmRleF90eXBlIChzaXplX2ludCAoMjAwKSk7CgogIC8qIE1ha2UgYSB0eXBl
IGZvciBhcnJheXMgb2YgY2hhcmFjdGVycy4KICAgICBXaXRoIGx1Y2sgbm90aGluZyB3aWxs
IGV2ZXIgcmVhbGx5IGRlcGVuZCBvbiB0aGUgbGVuZ3RoIG9mIHRoaXMKICAgICBhcnJheSB0
eXBlLiAgKi8KICBjaGFyX2FycmF5X3R5cGVfbm9kZQogICAgPSBidWlsZF9hcnJheV90eXBl
IChjaGFyX3R5cGVfbm9kZSwgYXJyYXlfZG9tYWluX3R5cGUpOwoKICAvKiBMaWtld2lzZSBm
b3IgYXJyYXlzIG9mIGludHMuICAqLwogIGludF9hcnJheV90eXBlX25vZGUKICAgID0gYnVp
bGRfYXJyYXlfdHlwZSAoaW50ZWdlcl90eXBlX25vZGUsIGFycmF5X2RvbWFpbl90eXBlKTsK
CiAgc3RyaW5nX3R5cGVfbm9kZSA9IGJ1aWxkX3BvaW50ZXJfdHlwZSAoY2hhcl90eXBlX25v
ZGUpOwogIGNvbnN0X3N0cmluZ190eXBlX25vZGUKICAgID0gYnVpbGRfcG9pbnRlcl90eXBl
IChidWlsZF9xdWFsaWZpZWRfdHlwZQoJCQkgIChjaGFyX3R5cGVfbm9kZSwgVFlQRV9RVUFM
X0NPTlNUKSk7CgogIC8qIFRoaXMgaXMgc3BlY2lhbCBmb3IgQysrIHNvIGZ1bmN0aW9ucyBj
YW4gYmUgb3ZlcmxvYWRlZC4gICovCiAgd2NoYXJfdHlwZV9ub2RlID0gZ2V0X2lkZW50aWZp
ZXIgKE1PRElGSUVEX1dDSEFSX1RZUEUpOwogIHdjaGFyX3R5cGVfbm9kZSA9IFRSRUVfVFlQ
RSAoaWRlbnRpZmllcl9nbG9iYWxfdmFsdWUgKHdjaGFyX3R5cGVfbm9kZSkpOwogIHdjaGFy
X3R5cGVfc2l6ZSA9IFRZUEVfUFJFQ0lTSU9OICh3Y2hhcl90eXBlX25vZGUpOwogIGlmIChj
X2RpYWxlY3RfY3h4ICgpKQogICAgewogICAgICBpZiAoVFJFRV9VTlNJR05FRCAod2NoYXJf
dHlwZV9ub2RlKSkKCXdjaGFyX3R5cGVfbm9kZSA9IG1ha2VfdW5zaWduZWRfdHlwZSAod2No
YXJfdHlwZV9zaXplKTsKICAgICAgZWxzZQoJd2NoYXJfdHlwZV9ub2RlID0gbWFrZV9zaWdu
ZWRfdHlwZSAod2NoYXJfdHlwZV9zaXplKTsKICAgICAgcmVjb3JkX2J1aWx0aW5fdHlwZSAo
UklEX1dDSEFSLCAid2NoYXJfdCIsIHdjaGFyX3R5cGVfbm9kZSk7CiAgICB9CiAgZWxzZQog
ICAgewogICAgICBzaWduZWRfd2NoYXJfdHlwZV9ub2RlID0gY19jb21tb25fc2lnbmVkX3R5
cGUgKHdjaGFyX3R5cGVfbm9kZSk7CiAgICAgIHVuc2lnbmVkX3djaGFyX3R5cGVfbm9kZSA9
IGNfY29tbW9uX3Vuc2lnbmVkX3R5cGUgKHdjaGFyX3R5cGVfbm9kZSk7CiAgICB9CgogIC8q
IFRoaXMgaXMgZm9yIHdpZGUgc3RyaW5nIGNvbnN0YW50cy4gICovCiAgd2NoYXJfYXJyYXlf
dHlwZV9ub2RlCiAgICA9IGJ1aWxkX2FycmF5X3R5cGUgKHdjaGFyX3R5cGVfbm9kZSwgYXJy
YXlfZG9tYWluX3R5cGUpOwoKICB3aW50X3R5cGVfbm9kZSA9CiAgICBUUkVFX1RZUEUgKGlk
ZW50aWZpZXJfZ2xvYmFsX3ZhbHVlIChnZXRfaWRlbnRpZmllciAoV0lOVF9UWVBFKSkpOwoK
ICBpbnRtYXhfdHlwZV9ub2RlID0KICAgIFRSRUVfVFlQRSAoaWRlbnRpZmllcl9nbG9iYWxf
dmFsdWUgKGdldF9pZGVudGlmaWVyIChJTlRNQVhfVFlQRSkpKTsKICB1aW50bWF4X3R5cGVf
bm9kZSA9CiAgICBUUkVFX1RZUEUgKGlkZW50aWZpZXJfZ2xvYmFsX3ZhbHVlIChnZXRfaWRl
bnRpZmllciAoVUlOVE1BWF9UWVBFKSkpOwoKICBkZWZhdWx0X2Z1bmN0aW9uX3R5cGUgPSBi
dWlsZF9mdW5jdGlvbl90eXBlIChpbnRlZ2VyX3R5cGVfbm9kZSwgTlVMTF9UUkVFKTsKICBw
dHJkaWZmX3R5cGVfbm9kZQogICAgPSBUUkVFX1RZUEUgKGlkZW50aWZpZXJfZ2xvYmFsX3Zh
bHVlIChnZXRfaWRlbnRpZmllciAoUFRSRElGRl9UWVBFKSkpOwogIHVuc2lnbmVkX3B0cmRp
ZmZfdHlwZV9ub2RlID0gY19jb21tb25fdW5zaWduZWRfdHlwZSAocHRyZGlmZl90eXBlX25v
ZGUpOwoKICAoKmxhbmdfaG9va3MuZGVjbHMucHVzaGRlY2wpCiAgICAoYnVpbGRfZGVjbCAo
VFlQRV9ERUNMLCBnZXRfaWRlbnRpZmllciAoIl9fYnVpbHRpbl92YV9saXN0IiksCgkJIHZh
X2xpc3RfdHlwZV9ub2RlKSk7CgogICgqbGFuZ19ob29rcy5kZWNscy5wdXNoZGVjbCkKICAg
IChidWlsZF9kZWNsIChUWVBFX0RFQ0wsIGdldF9pZGVudGlmaWVyICgiX19idWlsdGluX3B0
cmRpZmZfdCIpLAoJCSBwdHJkaWZmX3R5cGVfbm9kZSkpOwoKICAoKmxhbmdfaG9va3MuZGVj
bHMucHVzaGRlY2wpCiAgICAoYnVpbGRfZGVjbCAoVFlQRV9ERUNMLCBnZXRfaWRlbnRpZmll
ciAoIl9fYnVpbHRpbl9zaXplX3QiKSwKCQkgc2l6ZXR5cGUpKTsKCiAgaWYgKFRSRUVfQ09E
RSAodmFfbGlzdF90eXBlX25vZGUpID09IEFSUkFZX1RZUEUpCiAgICB7CiAgICAgIHZhX2xp
c3RfYXJnX3R5cGVfbm9kZSA9IHZhX2xpc3RfcmVmX3R5cGVfbm9kZSA9CglidWlsZF9wb2lu
dGVyX3R5cGUgKFRSRUVfVFlQRSAodmFfbGlzdF90eXBlX25vZGUpKTsKICAgIH0KICBlbHNl
CiAgICB7CiAgICAgIHZhX2xpc3RfYXJnX3R5cGVfbm9kZSA9IHZhX2xpc3RfdHlwZV9ub2Rl
OwogICAgICB2YV9saXN0X3JlZl90eXBlX25vZGUgPSBidWlsZF9yZWZlcmVuY2VfdHlwZSAo
dmFfbGlzdF90eXBlX25vZGUpOwogICAgfQoKI2RlZmluZSBERUZfUFJJTUlUSVZFX1RZUEUo
RU5VTSwgVkFMVUUpIFwKICBidWlsdGluX3R5cGVzWyhpbnQpIEVOVU1dID0gVkFMVUU7CiNk
ZWZpbmUgREVGX0ZVTkNUSU9OX1RZUEVfMChFTlVNLCBSRVRVUk4pCQlcCiAgYnVpbHRpbl90
eXBlc1soaW50KSBFTlVNXQkJCQlcCiAgICA9IGJ1aWxkX2Z1bmN0aW9uX3R5cGUgKGJ1aWx0
aW5fdHlwZXNbKGludCkgUkVUVVJOXSwJXAoJCQkgICB2b2lkX2xpc3Rfbm9kZSk7CiNkZWZp
bmUgREVGX0ZVTkNUSU9OX1RZUEVfMShFTlVNLCBSRVRVUk4sIEFSRzEpCQkJCVwKICBidWls
dGluX3R5cGVzWyhpbnQpIEVOVU1dCQkJCQkJXAogICAgPSBidWlsZF9mdW5jdGlvbl90eXBl
IChidWlsdGluX3R5cGVzWyhpbnQpIFJFVFVSTl0sCQkJXAoJCQkgICB0cmVlX2NvbnMgKE5V
TExfVFJFRSwJCQlcCgkJCQkgICAgICBidWlsdGluX3R5cGVzWyhpbnQpIEFSRzFdLAlcCgkJ
CQkgICAgICB2b2lkX2xpc3Rfbm9kZSkpOwojZGVmaW5lIERFRl9GVU5DVElPTl9UWVBFXzIo
RU5VTSwgUkVUVVJOLCBBUkcxLCBBUkcyKQlcCiAgYnVpbHRpbl90eXBlc1soaW50KSBFTlVN
XQkJCQlcCiAgICA9IGJ1aWxkX2Z1bmN0aW9uX3R5cGUJCQkJXAogICAgICAoYnVpbHRpbl90
eXBlc1soaW50KSBSRVRVUk5dLAkJCVwKICAgICAgIHRyZWVfY29ucyAoTlVMTF9UUkVFLAkJ
CQlcCgkJICBidWlsdGluX3R5cGVzWyhpbnQpIEFSRzFdLAkJXAoJCSAgdHJlZV9jb25zIChO
VUxMX1RSRUUsCQkJXAoJCQkgICAgIGJ1aWx0aW5fdHlwZXNbKGludCkgQVJHMl0sCVwKCQkJ
ICAgICB2b2lkX2xpc3Rfbm9kZSkpKTsKI2RlZmluZSBERUZfRlVOQ1RJT05fVFlQRV8zKEVO
VU0sIFJFVFVSTiwgQVJHMSwgQVJHMiwgQVJHMykJCSBcCiAgYnVpbHRpbl90eXBlc1soaW50
KSBFTlVNXQkJCQkJCSBcCiAgICA9IGJ1aWxkX2Z1bmN0aW9uX3R5cGUJCQkJCQkgXAogICAg
ICAoYnVpbHRpbl90eXBlc1soaW50KSBSRVRVUk5dLAkJCQkJIFwKICAgICAgIHRyZWVfY29u
cyAoTlVMTF9UUkVFLAkJCQkJCSBcCgkJICBidWlsdGluX3R5cGVzWyhpbnQpIEFSRzFdLAkJ
CQkgXAoJCSAgdHJlZV9jb25zIChOVUxMX1RSRUUsCQkJCQkgXAoJCQkgICAgIGJ1aWx0aW5f
dHlwZXNbKGludCkgQVJHMl0sCQkJIFwKCQkJICAgICB0cmVlX2NvbnMgKE5VTExfVFJFRSwJ
CQkgXAoJCQkJCWJ1aWx0aW5fdHlwZXNbKGludCkgQVJHM10sCSBcCgkJCQkJdm9pZF9saXN0
X25vZGUpKSkpOwojZGVmaW5lIERFRl9GVU5DVElPTl9UWVBFXzQoRU5VTSwgUkVUVVJOLCBB
UkcxLCBBUkcyLCBBUkczLCBBUkc0KQlcCiAgYnVpbHRpbl90eXBlc1soaW50KSBFTlVNXQkJ
CQkJCVwKICAgID0gYnVpbGRfZnVuY3Rpb25fdHlwZQkJCQkJCVwKICAgICAgKGJ1aWx0aW5f
dHlwZXNbKGludCkgUkVUVVJOXSwJCQkJCVwKICAgICAgIHRyZWVfY29ucyAoTlVMTF9UUkVF
LAkJCQkJCVwKCQkgIGJ1aWx0aW5fdHlwZXNbKGludCkgQVJHMV0sCQkJCVwKCQkgIHRyZWVf
Y29ucyAoTlVMTF9UUkVFLAkJCQkJXAoJCQkgICAgIGJ1aWx0aW5fdHlwZXNbKGludCkgQVJH
Ml0sCQkJXAoJCQkgICAgIHRyZWVfY29ucwkJCQkJXAoJCQkgICAgIChOVUxMX1RSRUUsCQkJ
CVwKCQkJICAgICAgYnVpbHRpbl90eXBlc1soaW50KSBBUkczXSwJCVwKCQkJICAgICAgdHJl
ZV9jb25zIChOVUxMX1RSRUUsCQkJXAoJCQkJCSBidWlsdGluX3R5cGVzWyhpbnQpIEFSRzRd
LAlcCgkJCQkJIHZvaWRfbGlzdF9ub2RlKSkpKSk7CiNkZWZpbmUgREVGX0ZVTkNUSU9OX1RZ
UEVfVkFSXzAoRU5VTSwgUkVUVVJOKQkJCQlcCiAgYnVpbHRpbl90eXBlc1soaW50KSBFTlVN
XQkJCQkJCVwKICAgID0gYnVpbGRfZnVuY3Rpb25fdHlwZSAoYnVpbHRpbl90eXBlc1soaW50
KSBSRVRVUk5dLCBOVUxMX1RSRUUpOwojZGVmaW5lIERFRl9GVU5DVElPTl9UWVBFX1ZBUl8x
KEVOVU0sIFJFVFVSTiwgQVJHMSkJCQkgXAogICBidWlsdGluX3R5cGVzWyhpbnQpIEVOVU1d
CQkJCQkJIFwKICAgID0gYnVpbGRfZnVuY3Rpb25fdHlwZSAoYnVpbHRpbl90eXBlc1soaW50
KSBSRVRVUk5dLAkJIFwKCQkJICAgdHJlZV9jb25zIChOVUxMX1RSRUUsCQkJIFwKCQkJCSAg
ICAgIGJ1aWx0aW5fdHlwZXNbKGludCkgQVJHMV0sCSBcCgkJCQkgICAgICBOVUxMX1RSRUUp
KTsKCiNkZWZpbmUgREVGX0ZVTkNUSU9OX1RZUEVfVkFSXzIoRU5VTSwgUkVUVVJOLCBBUkcx
LCBBUkcyKQlcCiAgIGJ1aWx0aW5fdHlwZXNbKGludCkgRU5VTV0JCQkJCVwKICAgID0gYnVp
bGRfZnVuY3Rpb25fdHlwZQkJCQkJXAogICAgICAoYnVpbHRpbl90eXBlc1soaW50KSBSRVRV
Uk5dLAkJCQlcCiAgICAgICB0cmVlX2NvbnMgKE5VTExfVFJFRSwJCQkJCVwKCQkgIGJ1aWx0
aW5fdHlwZXNbKGludCkgQVJHMV0sCQkJXAoJCSAgdHJlZV9jb25zIChOVUxMX1RSRUUsCQkJ
CVwKCQkJICAgICBidWlsdGluX3R5cGVzWyhpbnQpIEFSRzJdLAkJXAoJCQkgICAgIE5VTExf
VFJFRSkpKTsKCiNkZWZpbmUgREVGX0ZVTkNUSU9OX1RZUEVfVkFSXzMoRU5VTSwgUkVUVVJO
LCBBUkcxLCBBUkcyLCBBUkczKQkJXAogICBidWlsdGluX3R5cGVzWyhpbnQpIEVOVU1dCQkJ
CQkJXAogICAgPSBidWlsZF9mdW5jdGlvbl90eXBlCQkJCQkJXAogICAgICAoYnVpbHRpbl90
eXBlc1soaW50KSBSRVRVUk5dLAkJCQkJXAogICAgICAgdHJlZV9jb25zIChOVUxMX1RSRUUs
CQkJCQkJXAoJCSAgYnVpbHRpbl90eXBlc1soaW50KSBBUkcxXSwJCQkJXAoJCSAgdHJlZV9j
b25zIChOVUxMX1RSRUUsCQkJCQlcCgkJCSAgICAgYnVpbHRpbl90eXBlc1soaW50KSBBUkcy
XSwJCQlcCgkJCSAgICAgdHJlZV9jb25zIChOVUxMX1RSRUUsCQkJXAoJCQkJCWJ1aWx0aW5f
dHlwZXNbKGludCkgQVJHM10sCVwKCQkJCQlOVUxMX1RSRUUpKSkpOwoKI2RlZmluZSBERUZf
UE9JTlRFUl9UWVBFKEVOVU0sIFRZUEUpCQkJXAogIGJ1aWx0aW5fdHlwZXNbKGludCkgRU5V
TV0JCQkJXAogICAgPSBidWlsZF9wb2ludGVyX3R5cGUgKGJ1aWx0aW5fdHlwZXNbKGludCkg
VFlQRV0pOwojaW5jbHVkZSAiYnVpbHRpbi10eXBlcy5kZWYiCiN1bmRlZiBERUZfUFJJTUlU
SVZFX1RZUEUKI3VuZGVmIERFRl9GVU5DVElPTl9UWVBFXzEKI3VuZGVmIERFRl9GVU5DVElP
Tl9UWVBFXzIKI3VuZGVmIERFRl9GVU5DVElPTl9UWVBFXzMKI3VuZGVmIERFRl9GVU5DVElP
Tl9UWVBFXzQKI3VuZGVmIERFRl9GVU5DVElPTl9UWVBFX1ZBUl8wCiN1bmRlZiBERUZfRlVO
Q1RJT05fVFlQRV9WQVJfMQojdW5kZWYgREVGX0ZVTkNUSU9OX1RZUEVfVkFSXzIKI3VuZGVm
IERFRl9GVU5DVElPTl9UWVBFX1ZBUl8zCiN1bmRlZiBERUZfUE9JTlRFUl9UWVBFCgogIGlm
ICghY19hdHRyc19pbml0aWFsaXplZCkKICAgIGNfaW5pdF9hdHRyaWJ1dGVzICgpOwoKI2Rl
ZmluZSBERUZfQlVJTFRJTihFTlVNLCBOQU1FLCBDTEFTUywgVFlQRSwgTElCVFlQRSwJCQlc
CgkJICAgIEJPVEhfUCwgRkFMTEJBQ0tfUCwgTk9OQU5TSV9QLCBBVFRSUywgSU1QTElDSVQp
CVwKICBpZiAoTkFNRSkJCQkJCQkJCVwKICAgIHsJCQkJCQkJCQlcCiAgICAgIHRyZWUgZGVj
bDsJCQkJCQkJXAoJCQkJCQkJCQlcCiAgICAgIGlmIChzdHJuY21wIChOQU1FLCAiX19idWls
dGluXyIsIHN0cmxlbiAoIl9fYnVpbHRpbl8iKSkgIT0gMCkJXAoJYWJvcnQgKCk7CQkJCQkJ
CVwKCQkJCQkJCQkJXAogICAgICBpZiAoIUJPVEhfUCkJCQkJCQkJXAoJZGVjbCA9IGJ1aWx0
aW5fZnVuY3Rpb24gKE5BTUUsIGJ1aWx0aW5fdHlwZXNbVFlQRV0sIEVOVU0sCVwKCQkJCSBD
TEFTUywJCQkJCVwKCQkJCSAoRkFMTEJBQ0tfUAkJCQlcCgkJCQkgID8gKE5BTUUgKyBzdHJs
ZW4gKCJfX2J1aWx0aW5fIikpCVwKCQkJCSAgOiBOVUxMKSwJCQkJXAoJCQkJIGJ1aWx0X2lu
X2F0dHJpYnV0ZXNbKGludCkgQVRUUlNdKTsJXAogICAgICBlbHNlCQkJCQkJCQlcCglkZWNs
ID0gYnVpbHRpbl9mdW5jdGlvbl8yIChOQU1FLAkJCQlcCgkJCQkgICBOQU1FICsgc3RybGVu
ICgiX19idWlsdGluXyIpLAlcCgkJCQkgICBidWlsdGluX3R5cGVzW1RZUEVdLAkJCVwKCQkJ
CSAgIGJ1aWx0aW5fdHlwZXNbTElCVFlQRV0sCQlcCgkJCQkgICBFTlVNLAkJCQlcCgkJCQkg
ICBDTEFTUywJCQkJXAoJCQkJICAgRkFMTEJBQ0tfUCwJCQkJXAoJCQkJICAgTk9OQU5TSV9Q
LAkJCQlcCgkJCQkgICBidWlsdF9pbl9hdHRyaWJ1dGVzWyhpbnQpIEFUVFJTXSk7CVwKCQkJ
CQkJCQkJXAogICAgICBidWlsdF9pbl9kZWNsc1soaW50KSBFTlVNXSA9IGRlY2w7CQkJCVwK
ICAgICAgaWYgKElNUExJQ0lUKQkJCQkJCQlcCiAgICAgICAgaW1wbGljaXRfYnVpbHRfaW5f
ZGVjbHNbKGludCkgRU5VTV0gPSBkZWNsOwkJCVwKICAgIH0KI2luY2x1ZGUgImJ1aWx0aW5z
LmRlZiIKI3VuZGVmIERFRl9CVUlMVElOCgogICgqdGFyZ2V0bS5pbml0X2J1aWx0aW5zKSAo
KTsKCiAgbWFpbl9pZGVudGlmaWVyX25vZGUgPSBnZXRfaWRlbnRpZmllciAoIm1haW4iKTsK
fQoKdHJlZQpidWlsZF92YV9hcmcgKHRyZWUgZXhwciwgdHJlZSB0eXBlKQp7CiAgcmV0dXJu
IGJ1aWxkMSAoVkFfQVJHX0VYUFIsIHR5cGUsIGV4cHIpOwp9CgoKLyogTGlua2VkIGxpc3Qg
b2YgZGlzYWJsZWQgYnVpbHQtaW4gZnVuY3Rpb25zLiAgKi8KCnR5cGVkZWYgc3RydWN0IGRp
c2FibGVkX2J1aWx0aW4KewogIGNvbnN0IGNoYXIgKm5hbWU7CiAgc3RydWN0IGRpc2FibGVk
X2J1aWx0aW4gKm5leHQ7Cn0gZGlzYWJsZWRfYnVpbHRpbjsKc3RhdGljIGRpc2FibGVkX2J1
aWx0aW4gKmRpc2FibGVkX2J1aWx0aW5zID0gTlVMTDsKCnN0YXRpYyBib29sIGJ1aWx0aW5f
ZnVuY3Rpb25fZGlzYWJsZWRfcCAoY29uc3QgY2hhciAqKTsKCi8qIERpc2FibGUgYSBidWls
dC1pbiBmdW5jdGlvbiBzcGVjaWZpZWQgYnkgLWZuby1idWlsdGluLU5BTUUuICBJZiBOQU1F
CiAgIGJlZ2lucyB3aXRoICJfX2J1aWx0aW5fIiwgZ2l2ZSBhbiBlcnJvci4gICovCgp2b2lk
CmRpc2FibGVfYnVpbHRpbl9mdW5jdGlvbiAoY29uc3QgY2hhciAqbmFtZSkKewogIGlmIChz
dHJuY21wIChuYW1lLCAiX19idWlsdGluXyIsIHN0cmxlbiAoIl9fYnVpbHRpbl8iKSkgPT0g
MCkKICAgIGVycm9yICgiY2Fubm90IGRpc2FibGUgYnVpbHQtaW4gZnVuY3Rpb24gYCVzJyIs
IG5hbWUpOwogIGVsc2UKICAgIHsKICAgICAgZGlzYWJsZWRfYnVpbHRpbiAqbmV3ID0geG1h
bGxvYyAoc2l6ZW9mIChkaXNhYmxlZF9idWlsdGluKSk7CiAgICAgIG5ldy0+bmFtZSA9IG5h
bWU7CiAgICAgIG5ldy0+bmV4dCA9IGRpc2FibGVkX2J1aWx0aW5zOwogICAgICBkaXNhYmxl
ZF9idWlsdGlucyA9IG5ldzsKICAgIH0KfQoKCi8qIFJldHVybiB0cnVlIGlmIHRoZSBidWls
dC1pbiBmdW5jdGlvbiBOQU1FIGhhcyBiZWVuIGRpc2FibGVkLCBmYWxzZQogICBvdGhlcndp
c2UuICAqLwoKc3RhdGljIGJvb2wKYnVpbHRpbl9mdW5jdGlvbl9kaXNhYmxlZF9wIChjb25z
dCBjaGFyICpuYW1lKQp7CiAgZGlzYWJsZWRfYnVpbHRpbiAqcDsKICBmb3IgKHAgPSBkaXNh
YmxlZF9idWlsdGluczsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKICAgIHsKICAgICAgaWYg
KHN0cmNtcCAobmFtZSwgcC0+bmFtZSkgPT0gMCkKCXJldHVybiB0cnVlOwogICAgfQogIHJl
dHVybiBmYWxzZTsKfQoKCi8qIFBvc3NpYmx5IGRlZmluZSBhIGJ1aWx0aW4gZnVuY3Rpb24g
d2l0aCBvbmUgb3IgdHdvIG5hbWVzLiAgQlVJTFRJTl9OQU1FCiAgIGlzIGFuIF9fYnVpbHRp
bl8tcHJlZml4ZWQgbmFtZTsgTkFNRSBpcyB0aGUgb3JkaW5hcnkgbmFtZTsgb25lIG9yIGJv
dGgKICAgb2YgdGhlc2UgbWF5IGJlIE5VTEwgKHRob3VnaCBib3RoIGJlaW5nIE5VTEwgaXMg
dXNlbGVzcykuCiAgIEJVSUxUSU5fVFlQRSBpcyB0aGUgdHlwZSBvZiB0aGUgX19idWlsdGlu
Xy1wcmVmaXhlZCBmdW5jdGlvbjsKICAgVFlQRSBpcyB0aGUgdHlwZSBvZiB0aGUgZnVuY3Rp
b24gd2l0aCB0aGUgb3JkaW5hcnkgbmFtZS4gIFRoZXNlCiAgIG1heSBkaWZmZXIgaWYgdGhl
IG9yZGluYXJ5IG5hbWUgaXMgZGVjbGFyZWQgd2l0aCBhIGxvb3NlciB0eXBlIHRvIGF2b2lk
CiAgIGNvbmZsaWN0cyB3aXRoIGhlYWRlcnMuICBGVU5DVElPTl9DT0RFIGFuZCBDTEFTUyBh
cmUgYXMgZm9yCiAgIGJ1aWx0aW5fZnVuY3Rpb24uICBJZiBMSUJSQVJZX05BTUVfUCBpcyBu
b256ZXJvLCBOQU1FIGlzIHBhc3NlZCBhcwogICB0aGUgTElCUkFSWV9OQU1FIHBhcmFtZXRl
ciB0byBidWlsdGluX2Z1bmN0aW9uIHdoZW4gZGVjbGFyaW5nIEJVSUxUSU5fTkFNRS4KICAg
SWYgTk9OQU5TSV9QIGlzIG5vbnplcm8sIHRoZSBuYW1lIE5BTUUgaXMgdHJlYXRlZCBhcyBh
IG5vbi1BTlNJIG5hbWU7CiAgIEFUVFJTIGlzIHRoZSB0cmVlIGxpc3QgcmVwcmVzZW50aW5n
IHRoZSBidWlsdGluJ3MgZnVuY3Rpb24gYXR0cmlidXRlcy4KICAgUmV0dXJucyB0aGUgZGVj
bGFyYXRpb24gb2YgQlVJTFRJTl9OQU1FLCBpZiBhbnksIG90aGVyd2lzZQogICB0aGUgZGVj
bGFyYXRpb24gb2YgTkFNRS4gIERvZXMgbm90IGRlY2xhcmUgTkFNRSBpZiBmbGFnX25vX2J1
aWx0aW4sCiAgIG9yIGlmIE5PTkFOU0lfUCBhbmQgZmxhZ19ub19ub25hbnNpX2J1aWx0aW4u
ICAqLwoKc3RhdGljIHRyZWUKYnVpbHRpbl9mdW5jdGlvbl8yIChjb25zdCBjaGFyICpidWls
dGluX25hbWUsIGNvbnN0IGNoYXIgKm5hbWUsCgkJICAgIHRyZWUgYnVpbHRpbl90eXBlLCB0
cmVlIHR5cGUsIGludCBmdW5jdGlvbl9jb2RlLAoJCSAgICBlbnVtIGJ1aWx0X2luX2NsYXNz
IGNsYXNzLCBpbnQgbGlicmFyeV9uYW1lX3AsCgkJICAgIGludCBub25hbnNpX3AsIHRyZWUg
YXR0cnMpCnsKICB0cmVlIGJkZWNsID0gTlVMTF9UUkVFOwogIHRyZWUgZGVjbCA9IE5VTExf
VFJFRTsKCiAgaWYgKGJ1aWx0aW5fbmFtZSAhPSAwKQogICAgYmRlY2wgPSBidWlsdGluX2Z1
bmN0aW9uIChidWlsdGluX25hbWUsIGJ1aWx0aW5fdHlwZSwgZnVuY3Rpb25fY29kZSwKCQkJ
ICAgICAgY2xhc3MsIGxpYnJhcnlfbmFtZV9wID8gbmFtZSA6IE5VTEwsIGF0dHJzKTsKCiAg
aWYgKG5hbWUgIT0gMCAmJiAhZmxhZ19ub19idWlsdGluICYmICFidWlsdGluX2Z1bmN0aW9u
X2Rpc2FibGVkX3AgKG5hbWUpCiAgICAgICYmICEobm9uYW5zaV9wICYmIGZsYWdfbm9fbm9u
YW5zaV9idWlsdGluKSkKICAgIGRlY2wgPSBidWlsdGluX2Z1bmN0aW9uIChuYW1lLCB0eXBl
LCBmdW5jdGlvbl9jb2RlLCBjbGFzcywgTlVMTCwgYXR0cnMpOwoKICByZXR1cm4gKGJkZWNs
ICE9IDAgPyBiZGVjbCA6IGRlY2wpOwp9CgwKLyogTm9uemVybyBpZiB0aGUgdHlwZSBUIHBy
b21vdGVzIHRvIGludC4gIFRoaXMgaXMgKG5lYXJseSkgdGhlCiAgIGludGVncmFsIHByb21v
dGlvbnMgZGVmaW5lZCBpbiBJU08gQzk5IDYuMy4xLjEvMi4gICovCgpib29sCmNfcHJvbW90
aW5nX2ludGVnZXJfdHlwZV9wICh0cmVlIHQpCnsKICBzd2l0Y2ggKFRSRUVfQ09ERSAodCkp
CiAgICB7CiAgICBjYXNlIElOVEVHRVJfVFlQRToKICAgICAgcmV0dXJuIChUWVBFX01BSU5f
VkFSSUFOVCAodCkgPT0gY2hhcl90eXBlX25vZGUKCSAgICAgIHx8IFRZUEVfTUFJTl9WQVJJ
QU5UICh0KSA9PSBzaWduZWRfY2hhcl90eXBlX25vZGUKCSAgICAgIHx8IFRZUEVfTUFJTl9W
QVJJQU5UICh0KSA9PSB1bnNpZ25lZF9jaGFyX3R5cGVfbm9kZQoJICAgICAgfHwgVFlQRV9N
QUlOX1ZBUklBTlQgKHQpID09IHNob3J0X2ludGVnZXJfdHlwZV9ub2RlCgkgICAgICB8fCBU
WVBFX01BSU5fVkFSSUFOVCAodCkgPT0gc2hvcnRfdW5zaWduZWRfdHlwZV9ub2RlCgkgICAg
ICB8fCBUWVBFX1BSRUNJU0lPTiAodCkgPCBUWVBFX1BSRUNJU0lPTiAoaW50ZWdlcl90eXBl
X25vZGUpKTsKCiAgICBjYXNlIEVOVU1FUkFMX1RZUEU6CiAgICAgIC8qID8/PyBUZWNobmlj
YWxseSBhbGwgZW51bWVyYXRpb25zIG5vdCBsYXJnZXIgdGhhbiBhbiBpbnQKCSBwcm9tb3Rl
IHRvIGFuIGludC4gIEJ1dCB0aGlzIGlzIHVzZWQgYWxvbmcgY29kZSBwYXRocwoJIHRoYXQg
b25seSB3YW50IHRvIG5vdGljZSBhIHNpemUgY2hhbmdlLiAgKi8KICAgICAgcmV0dXJuIFRZ
UEVfUFJFQ0lTSU9OICh0KSA8IFRZUEVfUFJFQ0lTSU9OIChpbnRlZ2VyX3R5cGVfbm9kZSk7
CgogICAgY2FzZSBCT09MRUFOX1RZUEU6CiAgICAgIHJldHVybiAxOwoKICAgIGRlZmF1bHQ6
CiAgICAgIHJldHVybiAwOwogICAgfQp9CgovKiBSZXR1cm4gMSBpZiBQQVJNUyBzcGVjaWZp
ZXMgYSBmaXhlZCBudW1iZXIgb2YgcGFyYW1ldGVycwogICBhbmQgbm9uZSBvZiB0aGVpciB0
eXBlcyBpcyBhZmZlY3RlZCBieSBkZWZhdWx0IHByb21vdGlvbnMuICAqLwoKaW50CnNlbGZf
cHJvbW90aW5nX2FyZ3NfcCAodHJlZSBwYXJtcykKewogIHRyZWUgdDsKICBmb3IgKHQgPSBw
YXJtczsgdDsgdCA9IFRSRUVfQ0hBSU4gKHQpKQogICAgewogICAgICB0cmVlIHR5cGUgPSBU
UkVFX1ZBTFVFICh0KTsKCiAgICAgIGlmIChUUkVFX0NIQUlOICh0KSA9PSAwICYmIHR5cGUg
IT0gdm9pZF90eXBlX25vZGUpCglyZXR1cm4gMDsKCiAgICAgIGlmICh0eXBlID09IDApCgly
ZXR1cm4gMDsKCiAgICAgIGlmIChUWVBFX01BSU5fVkFSSUFOVCAodHlwZSkgPT0gZmxvYXRf
dHlwZV9ub2RlKQoJcmV0dXJuIDA7CgogICAgICBpZiAoY19wcm9tb3RpbmdfaW50ZWdlcl90
eXBlX3AgKHR5cGUpKQoJcmV0dXJuIDA7CiAgICB9CiAgcmV0dXJuIDE7Cn0KCi8qIFJlY3Vy
c2l2ZWx5IGV4YW1pbmVzIHRoZSBhcnJheSBlbGVtZW50cyBvZiBUWVBFLCB1bnRpbCBhIG5v
bi1hcnJheQogICBlbGVtZW50IHR5cGUgaXMgZm91bmQuICAqLwoKdHJlZQpzdHJpcF9hcnJh
eV90eXBlcyAodHJlZSB0eXBlKQp7CiAgd2hpbGUgKFRSRUVfQ09ERSAodHlwZSkgPT0gQVJS
QVlfVFlQRSkKICAgIHR5cGUgPSBUUkVFX1RZUEUgKHR5cGUpOwoKICByZXR1cm4gdHlwZTsK
fQoKc3RhdGljIHRyZWUgZXhwYW5kX3Vub3JkZXJlZF9jbXAgKHRyZWUsIHRyZWUsIGVudW0g
dHJlZV9jb2RlLCBlbnVtIHRyZWVfY29kZSk7CgovKiBFeHBhbmQgYSBjYWxsIHRvIGFuIHVu
b3JkZXJlZCBjb21wYXJpc29uIGZ1bmN0aW9uIHN1Y2ggYXMKICAgX19idWlsdGluX2lzZ3Jl
YXRlcigpLiAgRlVOQ1RJT04gaXMgdGhlIGZ1bmN0aW9uJ3MgZGVjbGFyYXRpb24gYW5kCiAg
IFBBUkFNUyBhIGxpc3Qgb2YgdGhlIHZhbHVlcyBwYXNzZWQuICBGb3IgX19idWlsdGluX2lz
dW5vcmRlcmVkKCksCiAgIFVOT1JERVJFRF9DT0RFIGlzIFVOT1JERVJFRF9FWFBSIGFuZCBP
UkRFUkVEX0NPREUgaXMgTk9QX0VYUFIuICBJbgogICBvdGhlciBjYXNlcywgVU5PUkRFUkVE
X0NPREUgYW5kIE9SREVSRURfQ09ERSBhcmUgY29tcGFyaXNvbiBjb2RlcwogICB0aGF0IGdp
dmUgdGhlIG9wcG9zaXRlIG9mIHRoZSBkZXNpcmVkIHJlc3VsdC4gIFVOT1JERVJFRF9DT0RF
IGlzCiAgIHVzZWQgZm9yIG1vZGVzIHRoYXQgY2FuIGhvbGQgTmFOcyBhbmQgT1JERVJFRF9D
T0RFIGlzIHVzZWQgZm9yIHRoZQogICByZXN0LiAgKi8KCnN0YXRpYyB0cmVlCmV4cGFuZF91
bm9yZGVyZWRfY21wICh0cmVlIGZ1bmN0aW9uLCB0cmVlIHBhcmFtcywKCQkgICAgICBlbnVt
IHRyZWVfY29kZSB1bm9yZGVyZWRfY29kZSwKCQkgICAgICBlbnVtIHRyZWVfY29kZSBvcmRl
cmVkX2NvZGUpCnsKICB0cmVlIGFyZzAsIGFyZzEsIHR5cGU7CiAgZW51bSB0cmVlX2NvZGUg
Y29kZTAsIGNvZGUxOwoKICAvKiBDaGVjayB0aGF0IHdlIGhhdmUgZXhhY3RseSB0d28gYXJn
dW1lbnRzLiAgKi8KICBpZiAocGFyYW1zID09IDAgfHwgVFJFRV9DSEFJTiAocGFyYW1zKSA9
PSAwKQogICAgewogICAgICBlcnJvciAoInRvbyBmZXcgYXJndW1lbnRzIHRvIGZ1bmN0aW9u
IGAlcyciLAoJICAgICBJREVOVElGSUVSX1BPSU5URVIgKERFQ0xfTkFNRSAoZnVuY3Rpb24p
KSk7CiAgICAgIHJldHVybiBlcnJvcl9tYXJrX25vZGU7CiAgICB9CiAgZWxzZSBpZiAoVFJF
RV9DSEFJTiAoVFJFRV9DSEFJTiAocGFyYW1zKSkgIT0gMCkKICAgIHsKICAgICAgZXJyb3Ig
KCJ0b28gbWFueSBhcmd1bWVudHMgdG8gZnVuY3Rpb24gYCVzJyIsCgkgICAgIElERU5USUZJ
RVJfUE9JTlRFUiAoREVDTF9OQU1FIChmdW5jdGlvbikpKTsKICAgICAgcmV0dXJuIGVycm9y
X21hcmtfbm9kZTsKICAgIH0KCiAgYXJnMCA9IFRSRUVfVkFMVUUgKHBhcmFtcyk7CiAgYXJn
MSA9IFRSRUVfVkFMVUUgKFRSRUVfQ0hBSU4gKHBhcmFtcykpOwoKICBjb2RlMCA9IFRSRUVf
Q09ERSAoVFJFRV9UWVBFIChhcmcwKSk7CiAgY29kZTEgPSBUUkVFX0NPREUgKFRSRUVfVFlQ
RSAoYXJnMSkpOwoKICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgYXJndW1lbnRzIGhhdmUgYSBj
b21tb24gdHlwZSBvZiBSRUFMLiAgKi8KICB0eXBlID0gMDsKICBpZiAoKGNvZGUwID09IElO
VEVHRVJfVFlQRSB8fCBjb2RlMCA9PSBSRUFMX1RZUEUpCiAgICAgICYmIChjb2RlMSA9PSBJ
TlRFR0VSX1RZUEUgfHwgY29kZTEgPT0gUkVBTF9UWVBFKSkKICAgIHR5cGUgPSBjb21tb25f
dHlwZSAoVFJFRV9UWVBFIChhcmcwKSwgVFJFRV9UWVBFIChhcmcxKSk7CgogIGlmICh0eXBl
ID09IDAgfHwgVFJFRV9DT0RFICh0eXBlKSAhPSBSRUFMX1RZUEUpCiAgICB7CiAgICAgIGVy
cm9yICgibm9uLWZsb2F0aW5nLXBvaW50IGFyZ3VtZW50IHRvIGZ1bmN0aW9uIGAlcyciLAoJ
ICAgICBJREVOVElGSUVSX1BPSU5URVIgKERFQ0xfTkFNRSAoZnVuY3Rpb24pKSk7CiAgICAg
IHJldHVybiBlcnJvcl9tYXJrX25vZGU7CiAgICB9CgogIGlmICh1bm9yZGVyZWRfY29kZSA9
PSBVTk9SREVSRURfRVhQUikKICAgIHsKICAgICAgaWYgKE1PREVfSEFTX05BTlMgKFRZUEVf
TU9ERSAodHlwZSkpKQoJcmV0dXJuIGJ1aWxkX2JpbmFyeV9vcCAodW5vcmRlcmVkX2NvZGUs
CgkJCQljb252ZXJ0ICh0eXBlLCBhcmcwKSwKCQkJCWNvbnZlcnQgKHR5cGUsIGFyZzEpLAoJ
CQkJMCk7CiAgICAgIGVsc2UKCXJldHVybiBpbnRlZ2VyX3plcm9fbm9kZTsKICAgIH0KCiAg
cmV0dXJuIGJ1aWxkX3VuYXJ5X29wIChUUlVUSF9OT1RfRVhQUiwKCQkJIGJ1aWxkX2JpbmFy
eV9vcCAoTU9ERV9IQVNfTkFOUyAoVFlQRV9NT0RFICh0eXBlKSkKCQkJCQkgID8gdW5vcmRl
cmVkX2NvZGUKCQkJCQkgIDogb3JkZXJlZF9jb2RlLAoJCQkJCSAgY29udmVydCAodHlwZSwg
YXJnMCksCgkJCQkJICBjb252ZXJ0ICh0eXBlLCBhcmcxKSwKCQkJCQkgIDApLAoJCQkgMCk7
Cn0KCgovKiBSZWNvZ25pemUgY2VydGFpbiBidWlsdC1pbiBmdW5jdGlvbnMgc28gd2UgY2Fu
IG1ha2UgdHJlZS1jb2RlcwogICBvdGhlciB0aGFuIENBTExfRVhQUi4gIFdlIGRvIHRoaXMg
d2hlbiBpdCBlbmFibGVzIGZvbGQtY29uc3QuYwogICB0byBkbyBzb21ldGhpbmcgdXNlZnVs
LiAgKi8KLyogPz8/IEJ5IHJpZ2h0cyB0aGlzIHNob3VsZCBnbyBpbiBidWlsdGlucy5jLCBi
dXQgb25seSBDIGFuZCBDKysKICAgaW1wbGVtZW50IGJ1aWxkX3tiaW5hcnksdW5hcnl9X29w
LiAgTm90IGV4YWN0bHkgc3VyZSB3aGF0IGJpdHMKICAgb2YgZnVuY3Rpb25hbGl0eSBhcmUg
YWN0dWFsbHkgbmVlZGVkIGZyb20gdGhvc2UgZnVuY3Rpb25zLCBvcgogICB3aGVyZSB0aGUg
c2ltaWxhciBmdW5jdGlvbmFsaXR5IGV4aXN0cyBpbiB0aGUgb3RoZXIgZnJvbnQgZW5kcy4g
ICovCgp0cmVlCmV4cGFuZF90cmVlX2J1aWx0aW4gKHRyZWUgZnVuY3Rpb24sIHRyZWUgcGFy
YW1zLCB0cmVlIGNvZXJjZWRfcGFyYW1zKQp7CiAgaWYgKERFQ0xfQlVJTFRfSU5fQ0xBU1Mg
KGZ1bmN0aW9uKSAhPSBCVUlMVF9JTl9OT1JNQUwpCiAgICByZXR1cm4gTlVMTF9UUkVFOwoK
ICBzd2l0Y2ggKERFQ0xfRlVOQ1RJT05fQ09ERSAoZnVuY3Rpb24pKQogICAgewogICAgY2Fz
ZSBCVUlMVF9JTl9BQlM6CiAgICBjYXNlIEJVSUxUX0lOX0xBQlM6CiAgICBjYXNlIEJVSUxU
X0lOX0xMQUJTOgogICAgY2FzZSBCVUlMVF9JTl9JTUFYQUJTOgogICAgY2FzZSBCVUlMVF9J
Tl9GQUJTOgogICAgY2FzZSBCVUlMVF9JTl9GQUJTTDoKICAgIGNhc2UgQlVJTFRfSU5fRkFC
U0Y6CiAgICAgIGlmIChjb2VyY2VkX3BhcmFtcyA9PSAwKQoJcmV0dXJuIGludGVnZXJfemVy
b19ub2RlOwogICAgICByZXR1cm4gYnVpbGRfdW5hcnlfb3AgKEFCU19FWFBSLCBUUkVFX1ZB
TFVFIChjb2VyY2VkX3BhcmFtcyksIDApOwoKICAgIGNhc2UgQlVJTFRfSU5fQ09OSjoKICAg
IGNhc2UgQlVJTFRfSU5fQ09OSkY6CiAgICBjYXNlIEJVSUxUX0lOX0NPTkpMOgogICAgICBp
ZiAoY29lcmNlZF9wYXJhbXMgPT0gMCkKCXJldHVybiBpbnRlZ2VyX3plcm9fbm9kZTsKICAg
ICAgcmV0dXJuIGJ1aWxkX3VuYXJ5X29wIChDT05KX0VYUFIsIFRSRUVfVkFMVUUgKGNvZXJj
ZWRfcGFyYW1zKSwgMCk7CgogICAgY2FzZSBCVUlMVF9JTl9DUkVBTDoKICAgIGNhc2UgQlVJ
TFRfSU5fQ1JFQUxGOgogICAgY2FzZSBCVUlMVF9JTl9DUkVBTEw6CiAgICAgIGlmIChjb2Vy
Y2VkX3BhcmFtcyA9PSAwKQoJcmV0dXJuIGludGVnZXJfemVyb19ub2RlOwogICAgICByZXR1
cm4gYnVpbGRfdW5hcnlfb3AgKFJFQUxQQVJUX0VYUFIsIFRSRUVfVkFMVUUgKGNvZXJjZWRf
cGFyYW1zKSwgMCk7CgogICAgY2FzZSBCVUlMVF9JTl9DSU1BRzoKICAgIGNhc2UgQlVJTFRf
SU5fQ0lNQUdGOgogICAgY2FzZSBCVUlMVF9JTl9DSU1BR0w6CiAgICAgIGlmIChjb2VyY2Vk
X3BhcmFtcyA9PSAwKQoJcmV0dXJuIGludGVnZXJfemVyb19ub2RlOwogICAgICByZXR1cm4g
YnVpbGRfdW5hcnlfb3AgKElNQUdQQVJUX0VYUFIsIFRSRUVfVkFMVUUgKGNvZXJjZWRfcGFy
YW1zKSwgMCk7CgogICAgY2FzZSBCVUlMVF9JTl9JU0dSRUFURVI6CiAgICAgIHJldHVybiBl
eHBhbmRfdW5vcmRlcmVkX2NtcCAoZnVuY3Rpb24sIHBhcmFtcywgVU5MRV9FWFBSLCBMRV9F
WFBSKTsKCiAgICBjYXNlIEJVSUxUX0lOX0lTR1JFQVRFUkVRVUFMOgogICAgICByZXR1cm4g
ZXhwYW5kX3Vub3JkZXJlZF9jbXAgKGZ1bmN0aW9uLCBwYXJhbXMsIFVOTFRfRVhQUiwgTFRf
RVhQUik7CgogICAgY2FzZSBCVUlMVF9JTl9JU0xFU1M6CiAgICAgIHJldHVybiBleHBhbmRf
dW5vcmRlcmVkX2NtcCAoZnVuY3Rpb24sIHBhcmFtcywgVU5HRV9FWFBSLCBHRV9FWFBSKTsK
CiAgICBjYXNlIEJVSUxUX0lOX0lTTEVTU0VRVUFMOgogICAgICByZXR1cm4gZXhwYW5kX3Vu
b3JkZXJlZF9jbXAgKGZ1bmN0aW9uLCBwYXJhbXMsIFVOR1RfRVhQUiwgR1RfRVhQUik7Cgog
ICAgY2FzZSBCVUlMVF9JTl9JU0xFU1NHUkVBVEVSOgogICAgICByZXR1cm4gZXhwYW5kX3Vu
b3JkZXJlZF9jbXAgKGZ1bmN0aW9uLCBwYXJhbXMsIFVORVFfRVhQUiwgRVFfRVhQUik7Cgog
ICAgY2FzZSBCVUlMVF9JTl9JU1VOT1JERVJFRDoKICAgICAgcmV0dXJuIGV4cGFuZF91bm9y
ZGVyZWRfY21wIChmdW5jdGlvbiwgcGFyYW1zLCBVTk9SREVSRURfRVhQUiwgTk9QX0VYUFIp
OwoKICAgIGRlZmF1bHQ6CiAgICAgIGJyZWFrOwogICAgfQoKICByZXR1cm4gTlVMTF9UUkVF
Owp9CgovKiBXYWxrIHRoZSBzdGF0ZW1lbnQgdHJlZSwgcm9vdGVkIGF0ICp0cC4gIEFwcGx5
IEZVTkMgdG8gYWxsIHRoZQogICBzdWItdHJlZXMgb2YgKlRQIGluIGEgcHJlLW9yZGVyIHRy
YXZlcnNhbC4gIEZVTkMgaXMgY2FsbGVkIHdpdGggdGhlCiAgIERBVEEgYW5kIHRoZSBhZGRy
ZXNzIG9mIGVhY2ggc3ViLXRyZWUuICBJZiBGVU5DIHJldHVybnMgYSBub24tTlVMTAogICB2
YWx1ZSwgdGhlIHRyYXZlcnNhbCBpcyBhYm9ydGVkLCBhbmQgdGhlIHZhbHVlIHJldHVybmVk
IGJ5IEZVTkMgaXMKICAgcmV0dXJuZWQuICBJZiBGVU5DIHNldHMgV0FMS19TVUJUUkVFUyB0
byB6ZXJvLCB0aGVuIHRoZSBzdWJ0cmVlcyBvZgogICB0aGUgbm9kZSBiZWluZyB2aXNpdGVk
IGFyZSBub3Qgd2Fsa2VkLgoKICAgV2UgZG9uJ3QgbmVlZCBhIHdpdGhvdXRfZHVwbGljYXRl
cyB2YXJpYW50IG9mIHRoaXMgb25lIGJlY2F1c2UgdGhlCiAgIHN0YXRlbWVudCB0cmVlIGlz
IGEgdHJlZSwgbm90IGEgZ3JhcGguICAqLwoKdHJlZQp3YWxrX3N0bXRfdHJlZSAodHJlZSAq
dHAsIHdhbGtfdHJlZV9mbiBmdW5jLCB2b2lkICpkYXRhKQp7CiAgZW51bSB0cmVlX2NvZGUg
Y29kZTsKICBpbnQgd2Fsa19zdWJ0cmVlczsKICB0cmVlIHJlc3VsdDsKICBpbnQgaSwgbGVu
OwoKI2RlZmluZSBXQUxLX1NVQlRSRUUoTk9ERSkJCQkJXAogIGRvCQkJCQkJCVwKICAgIHsJ
CQkJCQkJXAogICAgICByZXN1bHQgPSB3YWxrX3N0bXRfdHJlZSAoJihOT0RFKSwgZnVuYywg
ZGF0YSk7CVwKICAgICAgaWYgKHJlc3VsdCkJCQkJCVwKCXJldHVybiByZXN1bHQ7CQkJCQlc
CiAgICB9CQkJCQkJCVwKICB3aGlsZSAoMCkKCiAgLyogU2tpcCBlbXB0eSBzdWJ0cmVlcy4g
ICovCiAgaWYgKCEqdHApCiAgICByZXR1cm4gTlVMTF9UUkVFOwoKICAvKiBTa2lwIHN1YnRy
ZWVzIGJlbG93IG5vbi1zdGF0ZW1lbnQgbm9kZXMuICAqLwogIGlmICghU1RBVEVNRU5UX0NP
REVfUCAoVFJFRV9DT0RFICgqdHApKSkKICAgIHJldHVybiBOVUxMX1RSRUU7CgogIC8qIENh
bGwgdGhlIGZ1bmN0aW9uLiAgKi8KICB3YWxrX3N1YnRyZWVzID0gMTsKICByZXN1bHQgPSAo
KmZ1bmMpICh0cCwgJndhbGtfc3VidHJlZXMsIGRhdGEpOwoKICAvKiBJZiB3ZSBmb3VuZCBz
b21ldGhpbmcsIHJldHVybiBpdC4gICovCiAgaWYgKHJlc3VsdCkKICAgIHJldHVybiByZXN1
bHQ7CgogIC8qIEZVTkMgbWF5IGhhdmUgbW9kaWZpZWQgdGhlIHRyZWUsIHJlY2hlY2sgdGhh
dCB3ZSdyZSBsb29raW5nIGF0IGEKICAgICBzdGF0ZW1lbnQgbm9kZS4gICovCiAgY29kZSA9
IFRSRUVfQ09ERSAoKnRwKTsKICBpZiAoIVNUQVRFTUVOVF9DT0RFX1AgKGNvZGUpKQogICAg
cmV0dXJuIE5VTExfVFJFRTsKCiAgLyogVmlzaXQgdGhlIHN1YnRyZWVzIHVubGVzcyBGVU5D
IGRlY2lkZWQgdGhhdCB0aGVyZSB3YXMgbm90aGluZwogICAgIGludGVyZXN0aW5nIGJlbG93
IHRoaXMgcG9pbnQgaW4gdGhlIHRyZWUuICAqLwogIGlmICh3YWxrX3N1YnRyZWVzKQogICAg
ewogICAgICAvKiBXYWxrIG92ZXIgYWxsIHRoZSBzdWItdHJlZXMgb2YgdGhpcyBvcGVyYW5k
LiAgU3RhdGVtZW50IG5vZGVzCgkgbmV2ZXIgY29udGFpbiBSVEwsIGFuZCB3ZSBuZWVkbid0
IHdvcnJ5IGFib3V0IFRBUkdFVF9FWFBScy4gICovCiAgICAgIGxlbiA9IFRSRUVfQ09ERV9M
RU5HVEggKGNvZGUpOwoKICAgICAgLyogR28gdGhyb3VnaCB0aGUgc3VidHJlZXMuICBXZSBu
ZWVkIHRvIGRvIHRoaXMgaW4gZm9yd2FyZCBvcmRlciBzbwoJIHRoYXQgdGhlIHNjb3BlIG9m
IGEgRk9SX0VYUFIgaXMgaGFuZGxlZCBwcm9wZXJseS4gICovCiAgICAgIGZvciAoaSA9IDA7
IGkgPCBsZW47ICsraSkKCVdBTEtfU1VCVFJFRSAoVFJFRV9PUEVSQU5EICgqdHAsIGkpKTsK
ICAgIH0KCiAgLyogRmluYWxseSB2aXNpdCB0aGUgY2hhaW4uICBUaGlzIGNhbiBiZSB0YWls
LXJlY3Vyc2lvbiBvcHRpbWl6ZWQgaWYKICAgICB3ZSB3cml0ZSBpdCB0aGlzIHdheS4gICov
CiAgcmV0dXJuIHdhbGtfc3RtdF90cmVlICgmVFJFRV9DSEFJTiAoKnRwKSwgZnVuYywgZGF0
YSk7CgojdW5kZWYgV0FMS19TVUJUUkVFCn0KCi8qIFVzZWQgdG8gY29tcGFyZSBjYXNlIGxh
YmVscy4gIEsxIGFuZCBLMiBhcmUgYWN0dWFsbHkgdHJlZSBub2RlcwogICByZXByZXNlbnRp
bmcgY2FzZSBsYWJlbHMsIG9yIE5VTExfVFJFRSBmb3IgYSBgZGVmYXVsdCcgbGFiZWwuCiAg
IFJldHVybnMgLTEgaWYgSzEgaXMgb3JkZXJlZCBiZWZvcmUgSzIsIC0xIGlmIEsxIGlzIG9y
ZGVyZWQgYWZ0ZXIKICAgSzIsIGFuZCAwIGlmIEsxIGFuZCBLMiBhcmUgZXF1YWwuICAqLwoK
aW50CmNhc2VfY29tcGFyZSAoc3BsYXlfdHJlZV9rZXkgazEsIHNwbGF5X3RyZWVfa2V5IGsy
KQp7CiAgLyogQ29uc2lkZXIgYSBOVUxMIGtleSAoc3VjaCBhcyBhcmlzZXMgd2l0aCBhIGBk
ZWZhdWx0JyBsYWJlbCkgdG8gYmUKICAgICBzbWFsbGVyIHRoYW4gYW55dGhpbmcgZWxzZS4g
ICovCiAgaWYgKCFrMSkKICAgIHJldHVybiBrMiA/IC0xIDogMDsKICBlbHNlIGlmICghazIp
CiAgICByZXR1cm4gazEgPyAxIDogMDsKCiAgcmV0dXJuIHRyZWVfaW50X2NzdF9jb21wYXJl
ICgodHJlZSkgazEsICh0cmVlKSBrMik7Cn0KCi8qIFByb2Nlc3MgYSBjYXNlIGxhYmVsIGZv
ciB0aGUgcmFuZ2UgTE9XX1ZBTFVFIC4uLiBISUdIX1ZBTFVFLiAgSWYKICAgTE9XX1ZBTFVF
IGFuZCBISUdIX1ZBTFVFIGFyZSBib3RoIE5VTExfVFJFRSB0aGVuIHRoaXMgY2FzZSBsYWJl
bCBpcwogICBhY3R1YWxseSBhIGBkZWZhdWx0JyBsYWJlbC4gIElmIG9ubHkgSElHSF9WQUxV
RSBpcyBOVUxMX1RSRUUsIHRoZW4KICAgY2FzZSBsYWJlbCB3YXMgZGVjbGFyZWQgdXNpbmcg
dGhlIHVzdWFsIEMvQysrIHN5bnRheCwgcmF0aGVyIHRoYW4KICAgdGhlIEdOVSBjYXNlIHJh
bmdlIGV4dGVuc2lvbi4gIENBU0VTIGlzIGEgdHJlZSBjb250YWluaW5nIGFsbCB0aGUKICAg
Y2FzZSByYW5nZXMgcHJvY2Vzc2VkIHNvIGZhcjsgQ09ORCBpcyB0aGUgY29uZGl0aW9uIGZv
ciB0aGUKICAgc3dpdGNoLXN0YXRlbWVudCBpdHNlbGYuICBSZXR1cm5zIHRoZSBDQVNFX0xB
QkVMIGNyZWF0ZWQsIG9yCiAgIEVSUk9SX01BUktfTk9ERSBpZiBubyBDQVNFX0xBQkVMIGlz
IGNyZWF0ZWQuICAqLwoKdHJlZQpjX2FkZF9jYXNlX2xhYmVsIChzcGxheV90cmVlIGNhc2Vz
LCB0cmVlIGNvbmQsIHRyZWUgbG93X3ZhbHVlLAoJCSAgdHJlZSBoaWdoX3ZhbHVlKQp7CiAg
dHJlZSB0eXBlOwogIHRyZWUgbGFiZWw7CiAgdHJlZSBjYXNlX2xhYmVsOwogIHNwbGF5X3Ry
ZWVfbm9kZSBub2RlOwoKICAvKiBDcmVhdGUgdGhlIExBQkVMX0RFQ0wgaXRzZWxmLiAgKi8K
ICBsYWJlbCA9IGJ1aWxkX2RlY2wgKExBQkVMX0RFQ0wsIE5VTExfVFJFRSwgTlVMTF9UUkVF
KTsKICBERUNMX0NPTlRFWFQgKGxhYmVsKSA9IGN1cnJlbnRfZnVuY3Rpb25fZGVjbDsKCiAg
LyogSWYgdGhlcmUgd2FzIGFuIGVycm9yIHByb2Nlc3NpbmcgdGhlIHN3aXRjaCBjb25kaXRp
b24sIGJhaWwgbm93CiAgICAgYmVmb3JlIHdlIGdldCBtb3JlIGNvbmZ1c2VkLiAgKi8KICBp
ZiAoIWNvbmQgfHwgY29uZCA9PSBlcnJvcl9tYXJrX25vZGUpCiAgICB7CiAgICAgIC8qIEFk
ZCBhIGxhYmVsIGFueWhvdyBzbyB0aGF0IHRoZSBiYWNrLWVuZCBkb2Vzbid0IHRoaW5rIHRo
YXQKCSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzd2l0Y2ggaXMgdW5yZWFjaGFibGUuICAqLwog
ICAgICBpZiAoIWNhc2VzLT5yb290KQoJYWRkX3N0bXQgKGJ1aWxkX2Nhc2VfbGFiZWwgKE5V
TExfVFJFRSwgTlVMTF9UUkVFLCBsYWJlbCkpOwogICAgICByZXR1cm4gZXJyb3JfbWFya19u
b2RlOwogICAgfQoKICBpZiAoKGxvd192YWx1ZSAmJiBUUkVFX1RZUEUgKGxvd192YWx1ZSkK
ICAgICAgICYmIFBPSU5URVJfVFlQRV9QIChUUkVFX1RZUEUgKGxvd192YWx1ZSkpKQogICAg
ICB8fCAoaGlnaF92YWx1ZSAmJiBUUkVFX1RZUEUgKGhpZ2hfdmFsdWUpCgkgICYmIFBPSU5U
RVJfVFlQRV9QIChUUkVFX1RZUEUgKGhpZ2hfdmFsdWUpKSkpCiAgICBlcnJvciAoInBvaW50
ZXJzIGFyZSBub3QgcGVybWl0dGVkIGFzIGNhc2UgdmFsdWVzIik7CgogIC8qIENhc2UgcmFu
Z2VzIGFyZSBhIEdOVSBleHRlbnNpb24uICAqLwogIGlmIChoaWdoX3ZhbHVlICYmIHBlZGFu
dGljKQogICAgcGVkd2FybiAoInJhbmdlIGV4cHJlc3Npb25zIGluIHN3aXRjaCBzdGF0ZW1l
bnRzIGFyZSBub24tc3RhbmRhcmQiKTsKCiAgdHlwZSA9IFRSRUVfVFlQRSAoY29uZCk7CiAg
aWYgKGxvd192YWx1ZSkKICAgIHsKICAgICAgbG93X3ZhbHVlID0gY2hlY2tfY2FzZV92YWx1
ZSAobG93X3ZhbHVlKTsKICAgICAgbG93X3ZhbHVlID0gY29udmVydF9hbmRfY2hlY2sgKHR5
cGUsIGxvd192YWx1ZSk7CiAgICB9CiAgaWYgKGhpZ2hfdmFsdWUpCiAgICB7CiAgICAgIGhp
Z2hfdmFsdWUgPSBjaGVja19jYXNlX3ZhbHVlIChoaWdoX3ZhbHVlKTsKICAgICAgaGlnaF92
YWx1ZSA9IGNvbnZlcnRfYW5kX2NoZWNrICh0eXBlLCBoaWdoX3ZhbHVlKTsKICAgIH0KCiAg
LyogSWYgYW4gZXJyb3IgaGFzIG9jY3VycmVkLCBiYWlsIG91dCBub3cuICAqLwogIGlmIChs
b3dfdmFsdWUgPT0gZXJyb3JfbWFya19ub2RlIHx8IGhpZ2hfdmFsdWUgPT0gZXJyb3JfbWFy
a19ub2RlKQogICAgewogICAgICBpZiAoIWNhc2VzLT5yb290KQoJYWRkX3N0bXQgKGJ1aWxk
X2Nhc2VfbGFiZWwgKE5VTExfVFJFRSwgTlVMTF9UUkVFLCBsYWJlbCkpOwogICAgICByZXR1
cm4gZXJyb3JfbWFya19ub2RlOwogICAgfQoKICAvKiBJZiB0aGUgTE9XX1ZBTFVFIGFuZCBI
SUdIX1ZBTFVFIGFyZSB0aGUgc2FtZSwgdGhlbiB0aGlzIGlzbid0CiAgICAgcmVhbGx5IGEg
Y2FzZSByYW5nZSwgZXZlbiB0aG91Z2ggaXQgd2FzIHdyaXR0ZW4gdGhhdCB3YXkuICBSZW1v
dmUKICAgICB0aGUgSElHSF9WQUxVRSB0byBzaW1wbGlmeSBsYXRlciBwcm9jZXNzaW5nLiAg
Ki8KICBpZiAodHJlZV9pbnRfY3N0X2VxdWFsIChsb3dfdmFsdWUsIGhpZ2hfdmFsdWUpKQog
ICAgaGlnaF92YWx1ZSA9IE5VTExfVFJFRTsKICBpZiAobG93X3ZhbHVlICYmIGhpZ2hfdmFs
dWUKICAgICAgJiYgIXRyZWVfaW50X2NzdF9sdCAobG93X3ZhbHVlLCBoaWdoX3ZhbHVlKSkK
ICAgIHdhcm5pbmcgKCJlbXB0eSByYW5nZSBzcGVjaWZpZWQiKTsKCiAgLyogTG9vayB1cCB0
aGUgTE9XX1ZBTFVFIGluIHRoZSB0YWJsZSBvZiBjYXNlIGxhYmVscyB3ZSBhbHJlYWR5CiAg
ICAgaGF2ZS4gICovCiAgbm9kZSA9IHNwbGF5X3RyZWVfbG9va3VwIChjYXNlcywgKHNwbGF5
X3RyZWVfa2V5KSBsb3dfdmFsdWUpOwogIC8qIElmIHRoZXJlIHdhcyBub3QgYW4gZXhhY3Qg
bWF0Y2gsIGNoZWNrIGZvciBvdmVybGFwcGluZyByYW5nZXMuCiAgICAgVGhlcmUncyBubyBu
ZWVkIHRvIGRvIHRoaXMgaWYgdGhlcmUncyBubyBMT1dfVkFMVUUgb3IgSElHSF9WQUxVRTsK
ICAgICB0aGF0J3MgYSBgZGVmYXVsdCcgbGFiZWwgYW5kIHRoZSBvbmx5IG92ZXJsYXAgaXMg
YW4gZXhhY3QgbWF0Y2guICAqLwogIGlmICghbm9kZSAmJiAobG93X3ZhbHVlIHx8IGhpZ2hf
dmFsdWUpKQogICAgewogICAgICBzcGxheV90cmVlX25vZGUgbG93X2JvdW5kOwogICAgICBz
cGxheV90cmVlX25vZGUgaGlnaF9ib3VuZDsKCiAgICAgIC8qIEV2ZW4gdGhvdWdoIHRoZXJl
IHdhc24ndCBhbiBleGFjdCBtYXRjaCwgdGhlcmUgbWlnaHQgYmUgYW4KCSBvdmVybGFwIGJl
dHdlZW4gdGhpcyBjYXNlIHJhbmdlIGFuZCBhbm90aGVyIGNhc2UgcmFuZ2UuCgkgU2luY2Ug
d2UndmUgKGluZHVjdGl2ZWx5KSBub3QgYWxsb3dlZCBhbnkgb3ZlcmxhcHBpbmcgY2FzZQoJ
IHJhbmdlcywgd2Ugc2ltcGx5IG5lZWQgdG8gZmluZCB0aGUgZ3JlYXRlc3QgbG93IGNhc2Ug
bGFiZWwKCSB0aGF0IGlzIHNtYWxsZXIgdGhhdCBMT1dfVkFMVUUsIGFuZCB0aGUgc21hbGxl
c3QgbG93IGNhc2UKCSBsYWJlbCB0aGF0IGlzIGdyZWF0ZXIgdGhhbiBMT1dfVkFMVUUuICBJ
ZiB0aGVyZSBpcyBhbiBvdmVybGFwCgkgaXQgd2lsbCBvY2N1ciBpbiBvbmUgb2YgdGhlc2Ug
dHdvIHJhbmdlcy4gICovCiAgICAgIGxvd19ib3VuZCA9IHNwbGF5X3RyZWVfcHJlZGVjZXNz
b3IgKGNhc2VzLAoJCQkJCSAgKHNwbGF5X3RyZWVfa2V5KSBsb3dfdmFsdWUpOwogICAgICBo
aWdoX2JvdW5kID0gc3BsYXlfdHJlZV9zdWNjZXNzb3IgKGNhc2VzLAoJCQkJCSAoc3BsYXlf
dHJlZV9rZXkpIGxvd192YWx1ZSk7CgogICAgICAvKiBDaGVjayB0byBzZWUgaWYgdGhlIExP
V19CT1VORCBvdmVybGFwcy4gIEl0IGlzIHNtYWxsZXIgdGhhbgoJIHRoZSBMT1dfVkFMVUUs
IHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgdW5sZXNzIHRoZQoJIExPV19CT1VORCBp
cyBpbiBmYWN0IGl0c2VsZiBhIGNhc2UgcmFuZ2UuICAqLwogICAgICBpZiAobG93X2JvdW5k
CgkgICYmIENBU0VfSElHSCAoKHRyZWUpIGxvd19ib3VuZC0+dmFsdWUpCgkgICYmIHRyZWVf
aW50X2NzdF9jb21wYXJlIChDQVNFX0hJR0ggKCh0cmVlKSBsb3dfYm91bmQtPnZhbHVlKSwK
CQkJCSAgICBsb3dfdmFsdWUpID49IDApCglub2RlID0gbG93X2JvdW5kOwogICAgICAvKiBD
aGVjayB0byBzZWUgaWYgdGhlIEhJR0hfQk9VTkQgb3ZlcmxhcHMuICBUaGUgbG93IGVuZCBv
ZiB0aGF0CgkgcmFuZ2UgaXMgYmlnZ2VyIHRoYW4gdGhlIGxvdyBlbmQgb2YgdGhlIGN1cnJl
bnQgcmFuZ2UsIHNvIHdlCgkgYXJlIG9ubHkgaW50ZXJlc3RlZCBpZiB0aGUgY3VycmVudCBy
YW5nZSBpcyBhIHJlYWwgcmFuZ2UsIGFuZAoJIG5vdCBhbiBvcmRpbmFyeSBjYXNlIGxhYmVs
LiAgKi8KICAgICAgZWxzZSBpZiAoaGlnaF9ib3VuZAoJICAgICAgICYmIGhpZ2hfdmFsdWUK
CSAgICAgICAmJiAodHJlZV9pbnRfY3N0X2NvbXBhcmUgKCh0cmVlKSBoaWdoX2JvdW5kLT5r
ZXksCgkJCQkJIGhpZ2hfdmFsdWUpCgkJICAgPD0gMCkpCglub2RlID0gaGlnaF9ib3VuZDsK
ICAgIH0KICAvKiBJZiB0aGVyZSB3YXMgYW4gb3ZlcmxhcCwgaXNzdWUgYW4gZXJyb3IuICAq
LwogIGlmIChub2RlKQogICAgewogICAgICB0cmVlIGR1cGxpY2F0ZSA9IENBU0VfTEFCRUxf
REVDTCAoKHRyZWUpIG5vZGUtPnZhbHVlKTsKCiAgICAgIGlmIChoaWdoX3ZhbHVlKQoJewoJ
ICBlcnJvciAoImR1cGxpY2F0ZSAob3Igb3ZlcmxhcHBpbmcpIGNhc2UgdmFsdWUiKTsKCSAg
ZXJyb3Jfd2l0aF9kZWNsIChkdXBsaWNhdGUsCgkJCSAgICJ0aGlzIGlzIHRoZSBmaXJzdCBl
bnRyeSBvdmVybGFwcGluZyB0aGF0IHZhbHVlIik7Cgl9CiAgICAgIGVsc2UgaWYgKGxvd192
YWx1ZSkKCXsKCSAgZXJyb3IgKCJkdXBsaWNhdGUgY2FzZSB2YWx1ZSIpIDsKCSAgZXJyb3Jf
d2l0aF9kZWNsIChkdXBsaWNhdGUsICJwcmV2aW91c2x5IHVzZWQgaGVyZSIpOwoJfQogICAg
ICBlbHNlCgl7CgkgIGVycm9yICgibXVsdGlwbGUgZGVmYXVsdCBsYWJlbHMgaW4gb25lIHN3
aXRjaCIpOwoJICBlcnJvcl93aXRoX2RlY2wgKGR1cGxpY2F0ZSwgInRoaXMgaXMgdGhlIGZp
cnN0IGRlZmF1bHQgbGFiZWwiKTsKCX0KICAgICAgaWYgKCFjYXNlcy0+cm9vdCkKCWFkZF9z
dG10IChidWlsZF9jYXNlX2xhYmVsIChOVUxMX1RSRUUsIE5VTExfVFJFRSwgbGFiZWwpKTsK
ICAgIH0KCiAgLyogQWRkIGEgQ0FTRV9MQUJFTCB0byB0aGUgc3RhdGVtZW50LXRyZWUuICAq
LwogIGNhc2VfbGFiZWwgPSBhZGRfc3RtdCAoYnVpbGRfY2FzZV9sYWJlbCAobG93X3ZhbHVl
LCBoaWdoX3ZhbHVlLCBsYWJlbCkpOwogIC8qIFJlZ2lzdGVyIHRoaXMgY2FzZSBsYWJlbCBp
biB0aGUgc3BsYXkgdHJlZS4gICovCiAgc3BsYXlfdHJlZV9pbnNlcnQgKGNhc2VzLAoJCSAg
ICAgKHNwbGF5X3RyZWVfa2V5KSBsb3dfdmFsdWUsCgkJICAgICAoc3BsYXlfdHJlZV92YWx1
ZSkgY2FzZV9sYWJlbCk7CgogIHJldHVybiBjYXNlX2xhYmVsOwp9CgovKiBGaW5pc2ggYW4g
ZXhwcmVzc2lvbiB0YWtpbmcgdGhlIGFkZHJlc3Mgb2YgTEFCRUwgKGFuCiAgIElERU5USUZJ
RVJfTk9ERSkuICBSZXR1cm5zIGFuIGV4cHJlc3Npb24gZm9yIHRoZSBhZGRyZXNzLiAgKi8K
CnRyZWUKZmluaXNoX2xhYmVsX2FkZHJlc3NfZXhwciAodHJlZSBsYWJlbCkKewogIHRyZWUg
cmVzdWx0OwoKICBpZiAocGVkYW50aWMpCiAgICBwZWR3YXJuICgidGFraW5nIHRoZSBhZGRy
ZXNzIG9mIGEgbGFiZWwgaXMgbm9uLXN0YW5kYXJkIik7CgogIGlmIChsYWJlbCA9PSBlcnJv
cl9tYXJrX25vZGUpCiAgICByZXR1cm4gZXJyb3JfbWFya19ub2RlOwoKICBsYWJlbCA9IGxv
b2t1cF9sYWJlbCAobGFiZWwpOwogIGlmIChsYWJlbCA9PSBOVUxMX1RSRUUpCiAgICByZXN1
bHQgPSBudWxsX3BvaW50ZXJfbm9kZTsKICBlbHNlCiAgICB7CiAgICAgIFRSRUVfVVNFRCAo
bGFiZWwpID0gMTsKICAgICAgcmVzdWx0ID0gYnVpbGQxIChBRERSX0VYUFIsIHB0cl90eXBl
X25vZGUsIGxhYmVsKTsKICAgICAgVFJFRV9DT05TVEFOVCAocmVzdWx0KSA9IDE7CiAgICAg
IC8qIFRoZSBjdXJyZW50IGZ1bmN0aW9uIGluIG5vdCBuZWNlc3NhcmlseSB1bmlubGluYWJs
ZS4KCSBDb21wdXRlZCBnb3RvcyBhcmUgaW5jb21wYXRpYmxlIHdpdGggaW5saW5pbmcsIGJ1
dCB0aGUgdmFsdWUKCSBoZXJlIGNvdWxkIGJlIHVzZWQgb25seSBpbiBhIGRpYWdub3N0aWMs
IGZvciBleGFtcGxlLiAgKi8KICAgIH0KCiAgcmV0dXJuIHJlc3VsdDsKfQoKLyogSG9vayB1
c2VkIGJ5IGV4cGFuZF9leHByIHRvIGV4cGFuZCBsYW5ndWFnZS1zcGVjaWZpYyB0cmVlIGNv
ZGVzLiAgKi8KCnJ0eApjX2V4cGFuZF9leHByICh0cmVlIGV4cCwgcnR4IHRhcmdldCwgZW51
bSBtYWNoaW5lX21vZGUgdG1vZGUsIGludCBtb2RpZmllcikKICAgICAvKiBBY3R1YWxseSBl
bnVtX21vZGlmaWVyLiAgKi8KewogIHN3aXRjaCAoVFJFRV9DT0RFIChleHApKQogICAgewog
ICAgY2FzZSBTVE1UX0VYUFI6CiAgICAgIHsKCXRyZWUgcnRsX2V4cHI7CglydHggcmVzdWx0
OwoJYm9vbCBwcmVzZXJ2ZV9yZXN1bHQgPSBmYWxzZTsKCWJvb2wgcmV0dXJuX3RhcmdldCA9
IGZhbHNlOwoKCS8qIFNpbmNlIGV4cGFuZF9leHByX3N0bXQgY2FsbHMgZnJlZV90ZW1wX3Ns
b3RzIGFmdGVyIGV2ZXJ5CgkgICBleHByZXNzaW9uIHN0YXRlbWVudCwgd2UgbXVzdCBjYWxs
IHB1c2hfdGVtcF9zbG90cyBoZXJlLgoJICAgT3RoZXJ3aXNlLCBhbnkgdGVtcG9yYXJpZXMg
aW4gdXNlIG5vdyB3b3VsZCBiZSBjb25zaWRlcmVkCgkgICBvdXQtb2Ytc2NvcGUgYWZ0ZXIg
dGhlIGZpcnN0IEVYUFJfU1RNVCBmcm9tIHdpdGhpbiB0aGUKCSAgIFNUTVRfRVhQUi4gICov
CglwdXNoX3RlbXBfc2xvdHMgKCk7CglydGxfZXhwciA9IGV4cGFuZF9zdGFydF9zdG10X2V4
cHIgKCFTVE1UX0VYUFJfTk9fU0NPUEUgKGV4cCkpOwoKCS8qIElmIHdlIHdhbnQgdGhlIHJl
c3VsdCBvZiB0aGlzIGV4cHJlc3Npb24sIGZpbmQgdGhlIGxhc3QKICAgICAgICAgICBFWFBS
X1NUTVQgaW4gdGhlIENPTVBPVU5EX1NUTVQgYW5kIG1hcmsgaXQgYXMgYWRkcmVzc2FibGUu
ICAqLwoJaWYgKHRhcmdldCAhPSBjb25zdDBfcnR4CgkgICAgJiYgVFJFRV9DT0RFIChTVE1U
X0VYUFJfU1RNVCAoZXhwKSkgPT0gQ09NUE9VTkRfU1RNVAoJICAgICYmIFRSRUVfQ09ERSAo
Q09NUE9VTkRfQk9EWSAoU1RNVF9FWFBSX1NUTVQgKGV4cCkpKSA9PSBTQ09QRV9TVE1UKQoJ
ICB7CgkgICAgdHJlZSBleHByID0gQ09NUE9VTkRfQk9EWSAoU1RNVF9FWFBSX1NUTVQgKGV4
cCkpOwoJICAgIHRyZWUgbGFzdCA9IFRSRUVfQ0hBSU4gKGV4cHIpOwoKCSAgICB3aGlsZSAo
VFJFRV9DSEFJTiAobGFzdCkpCgkgICAgICB7CgkJZXhwciA9IGxhc3Q7CgkJbGFzdCA9IFRS
RUVfQ0hBSU4gKGxhc3QpOwoJICAgICAgfQoKCSAgICBpZiAoVFJFRV9DT0RFIChsYXN0KSA9
PSBTQ09QRV9TVE1UCgkJJiYgVFJFRV9DT0RFIChleHByKSA9PSBFWFBSX1NUTVQpCgkgICAg
ICB7CgkJaWYgKHRhcmdldCAmJiBUUkVFX0NPREUgKEVYUFJfU1RNVF9FWFBSIChleHByKSkg
PT0gVkFSX0RFQ0wKCQkgICAgJiYgREVDTF9SVExfSUZfU0VUIChFWFBSX1NUTVRfRVhQUiAo
ZXhwcikpID09IHRhcmdldCkKCQkgIC8qIElmIHRoZSBsYXN0IGV4cHJlc3Npb24gaXMgYSB2
YXJpYWJsZSB3aG9zZSBSVEwgaXMgdGhlCgkJICAgICBzYW1lIGFzIG91ciB0YXJnZXQsIGp1
c3QgcmV0dXJuIHRoZSB0YXJnZXQ7IGlmIGl0CgkJICAgICBpc24ndCB2YWxpZCBleHBhbmRp
bmcgdGhlIGRlY2wgd291bGQgcHJvZHVjZSBkaWZmZXJlbnQKCQkgICAgIFJUTCwgYW5kIHN0
b3JlX2V4cHIgd291bGQgdHJ5IHRvIGRvIGEgY29weS4gICovCgkJICByZXR1cm5fdGFyZ2V0
ID0gdHJ1ZTsKCQllbHNlCgkJICB7CgkJICAgIC8qIE90aGVyd2lzZSwgbm90ZSB0aGF0IHdl
IHdhbnQgdGhlIHZhbHVlIGZyb20gdGhlIGxhc3QKCQkgICAgICAgZXhwcmVzc2lvbi4gICov
CgkJICAgIFRSRUVfQUREUkVTU0FCTEUgKGV4cHIpID0gMTsKCQkgICAgcHJlc2VydmVfcmVz
dWx0ID0gdHJ1ZTsKCQkgIH0KCSAgICAgIH0KCSAgfQoKCWV4cGFuZF9zdG10IChTVE1UX0VY
UFJfU1RNVCAoZXhwKSk7CglleHBhbmRfZW5kX3N0bXRfZXhwciAocnRsX2V4cHIpOwoKCXJl
c3VsdCA9IGV4cGFuZF9leHByIChydGxfZXhwciwgdGFyZ2V0LCB0bW9kZSwgbW9kaWZpZXIp
OwoJaWYgKHJldHVybl90YXJnZXQpCgkgIHJlc3VsdCA9IHRhcmdldDsKCWVsc2UgaWYgKHBy
ZXNlcnZlX3Jlc3VsdCAmJiBHRVRfQ09ERSAocmVzdWx0KSA9PSBNRU0pCgkgIHsKCSAgICBp
ZiAoR0VUX01PREUgKHJlc3VsdCkgIT0gQkxLbW9kZSkKCSAgICAgIHJlc3VsdCA9IGNvcHlf
dG9fcmVnIChyZXN1bHQpOwoJICAgIGVsc2UKCSAgICAgIHByZXNlcnZlX3RlbXBfc2xvdHMg
KHJlc3VsdCk7CgkgIH0KCgkvKiBJZiB0aGUgc3RhdG1lbnQtZXhwcmVzc2lvbiBkb2VzIG5v
dCBoYXZlIGEgc2NvcGUsIHRoZW4gdGhlCgkgICBuZXcgdGVtcG9yYXJpZXMgd2UgY3JlYXRl
ZCB3aXRoaW4gaXQgbXVzdCBsaXZlIGJleW9uZCB0aGUKCSAgIHN0YXRlbWVudC1leHByZXNz
aW9uLiAgKi8KCWlmIChTVE1UX0VYUFJfTk9fU0NPUEUgKGV4cCkpCgkgIHByZXNlcnZlX3Rl
bXBfc2xvdHMgKE5VTExfUlRYKTsKCglwb3BfdGVtcF9zbG90cyAoKTsKCXJldHVybiByZXN1
bHQ7CiAgICAgIH0KICAgICAgYnJlYWs7CgogICAgY2FzZSBDQUxMX0VYUFI6CiAgICAgIHsK
CWlmIChUUkVFX0NPREUgKFRSRUVfT1BFUkFORCAoZXhwLCAwKSkgPT0gQUREUl9FWFBSCgkg
ICAgJiYgKFRSRUVfQ09ERSAoVFJFRV9PUEVSQU5EIChUUkVFX09QRVJBTkQgKGV4cCwgMCks
IDApKQoJCT09IEZVTkNUSU9OX0RFQ0wpCgkgICAgJiYgREVDTF9CVUlMVF9JTiAoVFJFRV9P
UEVSQU5EIChUUkVFX09QRVJBTkQgKGV4cCwgMCksIDApKQoJICAgICYmIChERUNMX0JVSUxU
X0lOX0NMQVNTIChUUkVFX09QRVJBTkQgKFRSRUVfT1BFUkFORCAoZXhwLCAwKSwgMCkpCgkJ
PT0gQlVJTFRfSU5fRlJPTlRFTkQpKQoJICByZXR1cm4gY19leHBhbmRfYnVpbHRpbiAoZXhw
LCB0YXJnZXQsIHRtb2RlLCBtb2RpZmllcik7CgllbHNlCgkgIGFib3J0ICgpOwogICAgICB9
CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgQ09NUE9VTkRfTElURVJBTF9FWFBSOgogICAgICB7
CgkvKiBJbml0aWFsaXplIHRoZSBhbm9ueW1vdXMgdmFyaWFibGUgZGVjbGFyZWQgaW4gdGhl
IGNvbXBvdW5kCgkgICBsaXRlcmFsLCB0aGVuIHJldHVybiB0aGUgdmFyaWFibGUuICAqLwoJ
dHJlZSBkZWNsID0gQ09NUE9VTkRfTElURVJBTF9FWFBSX0RFQ0wgKGV4cCk7CgllbWl0X2xv
Y2FsX3ZhciAoZGVjbCk7CglyZXR1cm4gZXhwYW5kX2V4cHIgKGRlY2wsIHRhcmdldCwgdG1v
ZGUsIG1vZGlmaWVyKTsKICAgICAgfQoKICAgIGRlZmF1bHQ6CiAgICAgIGFib3J0ICgpOwog
ICAgfQoKICBhYm9ydCAoKTsKICByZXR1cm4gTlVMTDsKfQoKLyogSG9vayB1c2VkIGJ5IHNh
ZmVfZnJvbV9wIHRvIGhhbmRsZSBsYW5ndWFnZS1zcGVjaWZpYyB0cmVlIGNvZGVzLiAgKi8K
CmludApjX3NhZmVfZnJvbV9wIChydHggdGFyZ2V0LCB0cmVlIGV4cCkKewogIC8qIFdlIGNh
biBzZWUgc3RhdGVtZW50cyBoZXJlIHdoZW4gcHJvY2Vzc2luZyB0aGUgYm9keSBvZiBhCiAg
ICAgc3RhdGVtZW50LWV4cHJlc3Npb24uICBGb3IgYSBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQg
ZGVjbGFyaW5nIGEKICAgICB2YXJpYWJsZSwgbG9vayBhdCB0aGUgdmFyaWFibGUncyBpbml0
aWFsaXplci4gICovCiAgaWYgKFRSRUVfQ09ERSAoZXhwKSA9PSBERUNMX1NUTVQpCiAgICB7
CiAgICAgIHRyZWUgZGVjbCA9IERFQ0xfU1RNVF9ERUNMIChleHApOwoKICAgICAgaWYgKFRS
RUVfQ09ERSAoZGVjbCkgPT0gVkFSX0RFQ0wKCSAgJiYgREVDTF9JTklUSUFMIChkZWNsKQoJ
ICAmJiAhc2FmZV9mcm9tX3AgKHRhcmdldCwgREVDTF9JTklUSUFMIChkZWNsKSwgLyp0b3Bf
cD0qLzApKQoJcmV0dXJuIDA7CiAgICB9CgogIC8qIEZvciBhbnkgc3RhdGVtZW50LCB3ZSBt
dXN0IGZvbGxvdyB0aGUgc3RhdGVtZW50LWNoYWluLiAgKi8KICBpZiAoU1RBVEVNRU5UX0NP
REVfUCAoVFJFRV9DT0RFIChleHApKSAmJiBUUkVFX0NIQUlOIChleHApKQogICAgcmV0dXJu
IHNhZmVfZnJvbV9wICh0YXJnZXQsIFRSRUVfQ0hBSU4gKGV4cCksIC8qdG9wX3A9Ki8wKTsK
CiAgLyogQXNzdW1lIGV2ZXJ5dGhpbmcgZWxzZSBpcyBzYWZlLiAgKi8KICByZXR1cm4gMTsK
fQoKLyogSG9vayB1c2VkIGJ5IHVuc2FmZV9mb3JfcmVldmFsIHRvIGhhbmRsZSBsYW5ndWFn
ZS1zcGVjaWZpYyB0cmVlIGNvZGVzLiAgKi8KCmludApjX2NvbW1vbl91bnNhZmVfZm9yX3Jl
ZXZhbCAodHJlZSBleHApCnsKICAvKiBTdGF0ZW1lbnQgZXhwcmVzc2lvbnMgbWF5IG5vdCBi
ZSByZWV2YWx1YXRlZCwgbGlrZXdpc2UgY29tcG91bmQKICAgICBsaXRlcmFscy4gICovCiAg
aWYgKFRSRUVfQ09ERSAoZXhwKSA9PSBTVE1UX0VYUFIKICAgICAgfHwgVFJFRV9DT0RFIChl
eHApID09IENPTVBPVU5EX0xJVEVSQUxfRVhQUikKICAgIHJldHVybiAyOwoKICAvKiBXYWxr
IGFsbCBvdGhlciBleHByZXNzaW9ucy4gICovCiAgcmV0dXJuIC0xOwp9CgovKiBIb29rIHVz
ZWQgYnkgc3RhdGljcCB0byBoYW5kbGUgbGFuZ3VhZ2Utc3BlY2lmaWMgdHJlZSBjb2Rlcy4g
ICovCgppbnQKY19zdGF0aWNwICh0cmVlIGV4cCkKewogIGlmIChUUkVFX0NPREUgKGV4cCkg
PT0gQ09NUE9VTkRfTElURVJBTF9FWFBSCiAgICAgICYmIFRSRUVfU1RBVElDIChDT01QT1VO
RF9MSVRFUkFMX0VYUFJfREVDTCAoZXhwKSkpCiAgICByZXR1cm4gMTsKICByZXR1cm4gMDsK
fQoKI2RlZmluZSBDQUxMRURfQVNfQlVJTFRfSU4oTk9ERSkgXAogICAoIXN0cm5jbXAgKElE
RU5USUZJRVJfUE9JTlRFUiAoREVDTF9OQU1FIChOT0RFKSksICJfX2J1aWx0aW5fIiwgMTAp
KQoKc3RhdGljIHJ0eApjX2V4cGFuZF9idWlsdGluICh0cmVlIGV4cCwgcnR4IHRhcmdldCwg
ZW51bSBtYWNoaW5lX21vZGUgdG1vZGUsCgkJICBlbnVtIGV4cGFuZF9tb2RpZmllciBtb2Rp
ZmllcikKewogIHRyZWUgdHlwZSA9IFRSRUVfVFlQRSAoZXhwKTsKICB0cmVlIGZuZGVjbCA9
IFRSRUVfT1BFUkFORCAoVFJFRV9PUEVSQU5EIChleHAsIDApLCAwKTsKICB0cmVlIGFyZ2xp
c3QgPSBUUkVFX09QRVJBTkQgKGV4cCwgMSk7CiAgZW51bSBidWlsdF9pbl9mdW5jdGlvbiBm
Y29kZSA9IERFQ0xfRlVOQ1RJT05fQ09ERSAoZm5kZWNsKTsKICBlbnVtIHRyZWVfY29kZSBj
b2RlID0gVFJFRV9DT0RFIChleHApOwogIGNvbnN0IGludCBpZ25vcmUgPSAodGFyZ2V0ID09
IGNvbnN0MF9ydHgKCQkgICAgICB8fCAoKGNvZGUgPT0gTk9OX0xWQUxVRV9FWFBSIHx8IGNv
ZGUgPT0gTk9QX0VYUFIKCQkJICAgfHwgY29kZSA9PSBDT05WRVJUX0VYUFIgfHwgY29kZSA9
PSBSRUZFUkVOQ0VfRVhQUgoJCQkgICB8fCBjb2RlID09IENPTkRfRVhQUikKCQkJICAmJiBU
UkVFX0NPREUgKHR5cGUpID09IFZPSURfVFlQRSkpOwoKICBpZiAoISBvcHRpbWl6ZSAmJiAh
IENBTExFRF9BU19CVUlMVF9JTiAoZm5kZWNsKSkKICAgIHJldHVybiBleHBhbmRfY2FsbCAo
ZXhwLCB0YXJnZXQsIGlnbm9yZSk7CgogIHN3aXRjaCAoZmNvZGUpCiAgICB7CiAgICBjYXNl
IEJVSUxUX0lOX1BSSU5URjoKICAgICAgdGFyZ2V0ID0gY19leHBhbmRfYnVpbHRpbl9wcmlu
dGYgKGFyZ2xpc3QsIHRhcmdldCwgdG1vZGUsCgkJCQkJbW9kaWZpZXIsIGlnbm9yZSwgLyp1
bmxvY2tlZD0qLyAwKTsKICAgICAgaWYgKHRhcmdldCkKCXJldHVybiB0YXJnZXQ7CiAgICAg
IGJyZWFrOwoKICAgIGNhc2UgQlVJTFRfSU5fUFJJTlRGX1VOTE9DS0VEOgogICAgICB0YXJn
ZXQgPSBjX2V4cGFuZF9idWlsdGluX3ByaW50ZiAoYXJnbGlzdCwgdGFyZ2V0LCB0bW9kZSwK
CQkJCQltb2RpZmllciwgaWdub3JlLCAvKnVubG9ja2VkPSovIDEpOwogICAgICBpZiAodGFy
Z2V0KQoJcmV0dXJuIHRhcmdldDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBCVUlMVF9JTl9G
UFJJTlRGOgogICAgICB0YXJnZXQgPSBjX2V4cGFuZF9idWlsdGluX2ZwcmludGYgKGFyZ2xp
c3QsIHRhcmdldCwgdG1vZGUsCgkJCQkJIG1vZGlmaWVyLCBpZ25vcmUsIC8qdW5sb2NrZWQ9
Ki8gMCk7CiAgICAgIGlmICh0YXJnZXQpCglyZXR1cm4gdGFyZ2V0OwogICAgICBicmVhazsK
CiAgICBjYXNlIEJVSUxUX0lOX0ZQUklOVEZfVU5MT0NLRUQ6CiAgICAgIHRhcmdldCA9IGNf
ZXhwYW5kX2J1aWx0aW5fZnByaW50ZiAoYXJnbGlzdCwgdGFyZ2V0LCB0bW9kZSwKCQkJCQkg
bW9kaWZpZXIsIGlnbm9yZSwgLyp1bmxvY2tlZD0qLyAxKTsKICAgICAgaWYgKHRhcmdldCkK
CXJldHVybiB0YXJnZXQ7CiAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CQkJLyoganVzdCBk
byBsaWJyYXJ5IGNhbGwsIGlmIHVua25vd24gYnVpbHRpbiAqLwogICAgICBlcnJvciAoImJ1
aWx0LWluIGZ1bmN0aW9uIGAlcycgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQiLAoJICAgICBJ
REVOVElGSUVSX1BPSU5URVIgKERFQ0xfTkFNRSAoZm5kZWNsKSkpOwogICAgfQoKICAvKiBU
aGUgc3dpdGNoIHN0YXRlbWVudCBhYm92ZSBjYW4gZHJvcCB0aHJvdWdoIHRvIGNhdXNlIHRo
ZSBmdW5jdGlvbgogICAgIHRvIGJlIGNhbGxlZCBub3JtYWxseS4gICovCiAgcmV0dXJuIGV4
cGFuZF9jYWxsIChleHAsIHRhcmdldCwgaWdub3JlKTsKfQoKLyogQ2hlY2sgYW4gYXJnbGlz
dCB0byAqcHJpbnRmIGZvciBwcm9ibGVtcy4gIFRoZSBhcmdsaXN0IHNob3VsZCBzdGFydAog
ICBhdCB0aGUgZm9ybWF0IHNwZWNpZmllciwgd2l0aCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50
cyBpbW1lZGlhdGVseQogICBmb2xsb3dpbmcgaXQuICAqLwpzdGF0aWMgaW50CmlzX3ZhbGlk
X3ByaW50Zl9hcmdsaXN0ICh0cmVlIGFyZ2xpc3QpCnsKICAvKiBTYXZlIHRoaXMgdmFsdWUg
c28gd2UgY2FuIHJlc3RvcmUgaXQgbGF0ZXIuICAqLwogIGNvbnN0IGludCBTQVZFX3BlZGFu
dGljID0gcGVkYW50aWM7CiAgaW50IGRpYWdub3N0aWNfb2NjdXJyZWQgPSAwOwogIHRyZWUg
YXR0cnM7CgogIC8qIFNldCB0aGlzIHRvIGEga25vd24gdmFsdWUgc28gdGhlIHVzZXIgc2V0
dGluZyB3b24ndCBhZmZlY3QgY29kZQogICAgIGdlbmVyYXRpb24uICAqLwogIHBlZGFudGlj
ID0gMTsKICAvKiBDaGVjayB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIGZvcm1hdCBzcGVj
aWZpZXIgZXJyb3JzLiAgKi8KICBhdHRycyA9IHRyZWVfY29ucyAoZ2V0X2lkZW50aWZpZXIg
KCJmb3JtYXQiKSwKCQkgICAgIHRyZWVfY29ucyAoTlVMTF9UUkVFLAoJCQkJZ2V0X2lkZW50
aWZpZXIgKCJwcmludGYiKSwKCQkJCXRyZWVfY29ucyAoTlVMTF9UUkVFLAoJCQkJCSAgIGlu
dGVnZXJfb25lX25vZGUsCgkJCQkJICAgdHJlZV9jb25zIChOVUxMX1RSRUUsCgkJCQkJCSAg
ICAgIGJ1aWxkX2ludF8yICgyLCAwKSwKCQkJCQkJICAgICAgTlVMTF9UUkVFKSkpLAoJCSAg
ICAgTlVMTF9UUkVFKTsKICBjaGVja19mdW5jdGlvbl9mb3JtYXQgKCZkaWFnbm9zdGljX29j
Y3VycmVkLCBhdHRycywgYXJnbGlzdCk7CgogIC8qIFJlc3RvcmUgdGhlIHZhbHVlIG9mIGBw
ZWRhbnRpYycuICAqLwogIHBlZGFudGljID0gU0FWRV9wZWRhbnRpYzsKCiAgLyogSWYgY2Fs
bGluZyBgY2hlY2tfZnVuY3Rpb25fZm9ybWF0X3B0cicgcHJvZHVjZXMgYSB3YXJuaW5nLCB3
ZQogICAgIHJldHVybiBmYWxzZSwgb3RoZXJ3aXNlIHdlIHJldHVybiB0cnVlLiAgKi8KICBy
ZXR1cm4gISBkaWFnbm9zdGljX29jY3VycmVkOwp9CgovKiBJZiB0aGUgYXJndW1lbnRzIHBh
c3NlZCB0byBwcmludGYgYXJlIHN1aXRhYmxlIGZvciBvcHRpbWl6YXRpb25zLAogICB3ZSBh
dHRlbXB0IHRvIHRyYW5zZm9ybSB0aGUgY2FsbC4gICovCnN0YXRpYyBydHgKY19leHBhbmRf
YnVpbHRpbl9wcmludGYgKHRyZWUgYXJnbGlzdCwgcnR4IHRhcmdldCwgZW51bSBtYWNoaW5l
X21vZGUgdG1vZGUsCgkJCSBlbnVtIGV4cGFuZF9tb2RpZmllciBtb2RpZmllciwgaW50IGln
bm9yZSwKCQkJIGludCB1bmxvY2tlZCkKewogIHRyZWUgZm5fcHV0Y2hhciA9IHVubG9ja2Vk
ID8KICAgIGltcGxpY2l0X2J1aWx0X2luX2RlY2xzW0JVSUxUX0lOX1BVVENIQVJfVU5MT0NL
RURdIDogaW1wbGljaXRfYnVpbHRfaW5fZGVjbHNbQlVJTFRfSU5fUFVUQ0hBUl07CiAgdHJl
ZSBmbl9wdXRzID0gdW5sb2NrZWQgPwogICAgaW1wbGljaXRfYnVpbHRfaW5fZGVjbHNbQlVJ
TFRfSU5fUFVUU19VTkxPQ0tFRF0gOiBpbXBsaWNpdF9idWlsdF9pbl9kZWNsc1tCVUlMVF9J
Tl9QVVRTXTsKICB0cmVlIGZuLCBmb3JtYXRfYXJnLCBzdHJpcHBlZF9zdHJpbmc7CgogIC8q
IElmIHRoZSByZXR1cm4gdmFsdWUgaXMgdXNlZCwgb3IgdGhlIHJlcGxhY2VtZW50IF9ERUNM
IGlzbid0CiAgICAgaW5pdGlhbGl6ZWQsIGRvbid0IGRvIHRoZSB0cmFuc2Zvcm1hdGlvbi4g
ICovCiAgaWYgKCFpZ25vcmUgfHwgIWZuX3B1dGNoYXIgfHwgIWZuX3B1dHMpCiAgICByZXR1
cm4gMDsKCiAgLyogVmVyaWZ5IHRoZSByZXF1aXJlZCBhcmd1bWVudHMgaW4gdGhlIG9yaWdp
bmFsIGNhbGwuICAqLwogIGlmIChhcmdsaXN0ID09IDAKICAgICAgfHwgKFRSRUVfQ09ERSAo
VFJFRV9UWVBFIChUUkVFX1ZBTFVFIChhcmdsaXN0KSkpICE9IFBPSU5URVJfVFlQRSkpCiAg
ICByZXR1cm4gMDsKCiAgLyogQ2hlY2sgdGhlIHNwZWNpZmllciB2cy4gdGhlIHBhcmFtZXRl
cnMuICAqLwogIGlmICghaXNfdmFsaWRfcHJpbnRmX2FyZ2xpc3QgKGFyZ2xpc3QpKQogICAg
cmV0dXJuIDA7CgogIGZvcm1hdF9hcmcgPSBUUkVFX1ZBTFVFIChhcmdsaXN0KTsKICBzdHJp
cHBlZF9zdHJpbmcgPSBmb3JtYXRfYXJnOwogIFNUUklQX05PUFMgKHN0cmlwcGVkX3N0cmlu
Zyk7CiAgaWYgKHN0cmlwcGVkX3N0cmluZyAmJiBUUkVFX0NPREUgKHN0cmlwcGVkX3N0cmlu
ZykgPT0gQUREUl9FWFBSKQogICAgc3RyaXBwZWRfc3RyaW5nID0gVFJFRV9PUEVSQU5EIChz
dHJpcHBlZF9zdHJpbmcsIDApOwoKICAvKiBJZiB0aGUgZm9ybWF0IHNwZWNpZmllciBpc24n
dCBhIFNUUklOR19DU1QsIHB1bnQuICAqLwogIGlmIChUUkVFX0NPREUgKHN0cmlwcGVkX3N0
cmluZykgIT0gU1RSSU5HX0NTVCkKICAgIHJldHVybiAwOwoKICAvKiBPSyEgIFdlIGNhbiBh
dHRlbXB0IG9wdGltaXphdGlvbi4gICovCgogIC8qIElmIHRoZSBmb3JtYXQgc3BlY2lmaWVy
IHdhcyAiJXNcbiIsIGNhbGwgX19idWlsdGluX3B1dHMoYXJnMikuICAqLwogIGlmIChzdHJj
bXAgKFRSRUVfU1RSSU5HX1BPSU5URVIgKHN0cmlwcGVkX3N0cmluZyksICIlc1xuIikgPT0g
MCkKICAgIHsKICAgICAgYXJnbGlzdCA9IFRSRUVfQ0hBSU4gKGFyZ2xpc3QpOwogICAgICBm
biA9IGZuX3B1dHM7CiAgICB9CiAgLyogSWYgdGhlIGZvcm1hdCBzcGVjaWZpZXIgd2FzICIl
YyIsIGNhbGwgX19idWlsdGluX3B1dGNoYXIgKGFyZzIpLiAgKi8KICBlbHNlIGlmIChzdHJj
bXAgKFRSRUVfU1RSSU5HX1BPSU5URVIgKHN0cmlwcGVkX3N0cmluZyksICIlYyIpID09IDAp
CiAgICB7CiAgICAgIGFyZ2xpc3QgPSBUUkVFX0NIQUlOIChhcmdsaXN0KTsKICAgICAgZm4g
PSBmbl9wdXRjaGFyOwogICAgfQogIGVsc2UKICAgIHsKICAgICAgLyogV2UgY2FuJ3QgaGFu
ZGxlIGFueXRoaW5nIGVsc2Ugd2l0aCAlIGFyZ3Mgb3IgJSUgLi4uIHlldC4gICovCiAgICAg
IGlmIChzdHJjaHIgKFRSRUVfU1RSSU5HX1BPSU5URVIgKHN0cmlwcGVkX3N0cmluZyksICcl
JykpCglyZXR1cm4gMDsKCiAgICAgIC8qIElmIHRoZSByZXN1bHRpbmcgY29uc3RhbnQgc3Ry
aW5nIGhhcyBhIGxlbmd0aCBvZiAxLCBjYWxsCiAgICAgICAgIHB1dGNoYXIuICBOb3RlLCBU
UkVFX1NUUklOR19MRU5HVEggaW5jbHVkZXMgdGhlIHRlcm1pbmF0aW5nCiAgICAgICAgIE5V
TEwgaW4gaXRzIGNvdW50LiAgKi8KICAgICAgaWYgKFRSRUVfU1RSSU5HX0xFTkdUSCAoc3Ry
aXBwZWRfc3RyaW5nKSA9PSAyKQogICAgICAgIHsKCSAgLyogR2l2ZW4gcHJpbnRmKCJjIiks
ICh3aGVyZSBjIGlzIGFueSBvbmUgY2hhcmFjdGVyLCkKICAgICAgICAgICAgIGNvbnZlcnQg
ImMiWzBdIHRvIGFuIGludCBhbmQgcGFzcyB0aGF0IHRvIHRoZSByZXBsYWNlbWVudAogICAg
ICAgICAgICAgZnVuY3Rpb24uICAqLwoJICBhcmdsaXN0ID0gYnVpbGRfaW50XzIgKFRSRUVf
U1RSSU5HX1BPSU5URVIgKHN0cmlwcGVkX3N0cmluZylbMF0sIDApOwoJICBhcmdsaXN0ID0g
YnVpbGRfdHJlZV9saXN0IChOVUxMX1RSRUUsIGFyZ2xpc3QpOwoKCSAgZm4gPSBmbl9wdXRj
aGFyOwogICAgICAgIH0KICAgICAgLyogSWYgdGhlIHJlc3VsdGluZyBjb25zdGFudCB3YXMg
InN0cmluZ1xuIiwgY2FsbAogICAgICAgICBfX2J1aWx0aW5fcHV0cygic3RyaW5nIikuICBF
bnN1cmUgInN0cmluZyIgaGFzIGF0IGxlYXN0IG9uZQogICAgICAgICBjaGFyYWN0ZXIgYmVz
aWRlcyB0aGUgdHJhaWxpbmcgXG4uICBOb3RlLCBUUkVFX1NUUklOR19MRU5HVEgKICAgICAg
ICAgaW5jbHVkZXMgdGhlIHRlcm1pbmF0aW5nIE5VTEwgaW4gaXRzIGNvdW50LiAgKi8KICAg
ICAgZWxzZSBpZiAoVFJFRV9TVFJJTkdfTEVOR1RIIChzdHJpcHBlZF9zdHJpbmcpID4gMgoJ
ICAgICAgICYmIFRSRUVfU1RSSU5HX1BPSU5URVIgKHN0cmlwcGVkX3N0cmluZykKCSAgICAg
ICBbVFJFRV9TVFJJTkdfTEVOR1RIIChzdHJpcHBlZF9zdHJpbmcpIC0gMl0gPT0gJ1xuJykK
ICAgICAgICB7CgkgIC8qIENyZWF0ZSBhIE5VTEwtdGVybWluYXRlZCBzdHJpbmcgdGhhdCdz
IG9uZSBjaGFyIHNob3J0ZXIKCSAgICAgdGhhbiB0aGUgb3JpZ2luYWwsIHN0cmlwcGluZyBv
ZmYgdGhlIHRyYWlsaW5nICdcbicuICAqLwoJICBjb25zdCBpbnQgbmV3bGVuID0gVFJFRV9T
VFJJTkdfTEVOR1RIIChzdHJpcHBlZF9zdHJpbmcpIC0gMTsKCSAgY2hhciAqbmV3c3RyID0g
KGNoYXIgKikgYWxsb2NhIChuZXdsZW4pOwoJICBtZW1jcHkgKG5ld3N0ciwgVFJFRV9TVFJJ
TkdfUE9JTlRFUiAoc3RyaXBwZWRfc3RyaW5nKSwgbmV3bGVuIC0gMSk7CgkgIG5ld3N0cltu
ZXdsZW4gLSAxXSA9IDA7CgoJICBhcmdsaXN0ID0gZml4X3N0cmluZ190eXBlIChidWlsZF9z
dHJpbmcgKG5ld2xlbiwgbmV3c3RyKSk7CgkgIGFyZ2xpc3QgPSBidWlsZF90cmVlX2xpc3Qg
KE5VTExfVFJFRSwgYXJnbGlzdCk7CgkgIGZuID0gZm5fcHV0czsKCX0KICAgICAgZWxzZQoJ
LyogV2UnZCBsaWtlIHRvIGFycmFuZ2UgdG8gY2FsbCBmcHV0cyhzdHJpbmcpIGhlcmUsIGJ1
dCB3ZQogICAgICAgICAgIG5lZWQgc3Rkb3V0IGFuZCBkb24ndCBoYXZlIGEgd2F5IHRvIGdl
dCBpdCAuLi4geWV0LiAgKi8KCXJldHVybiAwOwogICAgfQoKICByZXR1cm4gZXhwYW5kX2V4
cHIgKGJ1aWxkX2Z1bmN0aW9uX2NhbGwgKGZuLCBhcmdsaXN0KSwKCQkgICAgICAoaWdub3Jl
ID8gY29uc3QwX3J0eCA6IHRhcmdldCksCgkJICAgICAgdG1vZGUsIG1vZGlmaWVyKTsKfQoK
LyogSWYgdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gZnByaW50ZiBhcmUgc3VpdGFibGUgZm9y
IG9wdGltaXphdGlvbnMsCiAgIHdlIGF0dGVtcHQgdG8gdHJhbnNmb3JtIHRoZSBjYWxsLiAg
Ki8Kc3RhdGljIHJ0eApjX2V4cGFuZF9idWlsdGluX2ZwcmludGYgKHRyZWUgYXJnbGlzdCwg
cnR4IHRhcmdldCwgZW51bSBtYWNoaW5lX21vZGUgdG1vZGUsCgkJCSAgZW51bSBleHBhbmRf
bW9kaWZpZXIgbW9kaWZpZXIsIGludCBpZ25vcmUsCgkJCSAgaW50IHVubG9ja2VkKQp7CiAg
dHJlZSBmbl9mcHV0YyA9IHVubG9ja2VkID8KICAgIGltcGxpY2l0X2J1aWx0X2luX2RlY2xz
W0JVSUxUX0lOX0ZQVVRDX1VOTE9DS0VEXSA6IGltcGxpY2l0X2J1aWx0X2luX2RlY2xzW0JV
SUxUX0lOX0ZQVVRDXTsKICB0cmVlIGZuX2ZwdXRzID0gdW5sb2NrZWQgPwogICAgaW1wbGlj
aXRfYnVpbHRfaW5fZGVjbHNbQlVJTFRfSU5fRlBVVFNfVU5MT0NLRURdIDogaW1wbGljaXRf
YnVpbHRfaW5fZGVjbHNbQlVJTFRfSU5fRlBVVFNdOwogIHRyZWUgZm4sIGZvcm1hdF9hcmcs
IHN0cmlwcGVkX3N0cmluZzsKCiAgLyogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyB1c2VkLCBv
ciB0aGUgcmVwbGFjZW1lbnQgX0RFQ0wgaXNuJ3QKICAgICBpbml0aWFsaXplZCwgZG9uJ3Qg
ZG8gdGhlIHRyYW5zZm9ybWF0aW9uLiAgKi8KICBpZiAoIWlnbm9yZSB8fCAhZm5fZnB1dGMg
fHwgIWZuX2ZwdXRzKQogICAgcmV0dXJuIDA7CgogIC8qIFZlcmlmeSB0aGUgcmVxdWlyZWQg
YXJndW1lbnRzIGluIHRoZSBvcmlnaW5hbCBjYWxsLiAgKi8KICBpZiAoYXJnbGlzdCA9PSAw
CiAgICAgIHx8IChUUkVFX0NPREUgKFRSRUVfVFlQRSAoVFJFRV9WQUxVRSAoYXJnbGlzdCkp
KSAhPSBQT0lOVEVSX1RZUEUpCiAgICAgIHx8IChUUkVFX0NIQUlOIChhcmdsaXN0KSA9PSAw
KQogICAgICB8fCAoVFJFRV9DT0RFIChUUkVFX1RZUEUgKFRSRUVfVkFMVUUgKFRSRUVfQ0hB
SU4gKGFyZ2xpc3QpKSkpICE9CgkgIFBPSU5URVJfVFlQRSkpCiAgICByZXR1cm4gMDsKCiAg
LyogQ2hlY2sgdGhlIHNwZWNpZmllciB2cy4gdGhlIHBhcmFtZXRlcnMuICAqLwogIGlmICgh
aXNfdmFsaWRfcHJpbnRmX2FyZ2xpc3QgKFRSRUVfQ0hBSU4gKGFyZ2xpc3QpKSkKICAgIHJl
dHVybiAwOwoKICBmb3JtYXRfYXJnID0gVFJFRV9WQUxVRSAoVFJFRV9DSEFJTiAoYXJnbGlz
dCkpOwogIHN0cmlwcGVkX3N0cmluZyA9IGZvcm1hdF9hcmc7CiAgU1RSSVBfTk9QUyAoc3Ry
aXBwZWRfc3RyaW5nKTsKICBpZiAoc3RyaXBwZWRfc3RyaW5nICYmIFRSRUVfQ09ERSAoc3Ry
aXBwZWRfc3RyaW5nKSA9PSBBRERSX0VYUFIpCiAgICBzdHJpcHBlZF9zdHJpbmcgPSBUUkVF
X09QRVJBTkQgKHN0cmlwcGVkX3N0cmluZywgMCk7CgogIC8qIElmIHRoZSBmb3JtYXQgc3Bl
Y2lmaWVyIGlzbid0IGEgU1RSSU5HX0NTVCwgcHVudC4gICovCiAgaWYgKFRSRUVfQ09ERSAo
c3RyaXBwZWRfc3RyaW5nKSAhPSBTVFJJTkdfQ1NUKQogICAgcmV0dXJuIDA7CgogIC8qIE9L
ISAgV2UgY2FuIGF0dGVtcHQgb3B0aW1pemF0aW9uLiAgKi8KCiAgLyogSWYgdGhlIGZvcm1h
dCBzcGVjaWZpZXIgd2FzICIlcyIsIGNhbGwgX19idWlsdGluX2ZwdXRzKGFyZzMsIGFyZzEp
LiAgKi8KICBpZiAoc3RyY21wIChUUkVFX1NUUklOR19QT0lOVEVSIChzdHJpcHBlZF9zdHJp
bmcpLCAiJXMiKSA9PSAwKQogICAgewogICAgICB0cmVlIG5ld2FyZ2xpc3QgPSBidWlsZF90
cmVlX2xpc3QgKE5VTExfVFJFRSwgVFJFRV9WQUxVRSAoYXJnbGlzdCkpOwogICAgICBhcmds
aXN0ID0gdHJlZV9jb25zIChOVUxMX1RSRUUsCgkJCSAgIFRSRUVfVkFMVUUgKFRSRUVfQ0hB
SU4gKFRSRUVfQ0hBSU4gKGFyZ2xpc3QpKSksCgkJCSAgIG5ld2FyZ2xpc3QpOwogICAgICBm
biA9IGZuX2ZwdXRzOwogICAgfQogIC8qIElmIHRoZSBmb3JtYXQgc3BlY2lmaWVyIHdhcyAi
JWMiLCBjYWxsIF9fYnVpbHRpbl9mcHV0YyAoYXJnMywgYXJnMSkuICAqLwogIGVsc2UgaWYg
KHN0cmNtcCAoVFJFRV9TVFJJTkdfUE9JTlRFUiAoc3RyaXBwZWRfc3RyaW5nKSwgIiVjIikg
PT0gMCkKICAgIHsKICAgICAgdHJlZSBuZXdhcmdsaXN0ID0gYnVpbGRfdHJlZV9saXN0IChO
VUxMX1RSRUUsIFRSRUVfVkFMVUUgKGFyZ2xpc3QpKTsKICAgICAgYXJnbGlzdCA9IHRyZWVf
Y29ucyAoTlVMTF9UUkVFLAoJCQkgICBUUkVFX1ZBTFVFIChUUkVFX0NIQUlOIChUUkVFX0NI
QUlOIChhcmdsaXN0KSkpLAoJCQkgICBuZXdhcmdsaXN0KTsKICAgICAgZm4gPSBmbl9mcHV0
YzsKICAgIH0KICBlbHNlCiAgICB7CiAgICAgIC8qIFdlIGNhbid0IGhhbmRsZSBhbnl0aGlu
ZyBlbHNlIHdpdGggJSBhcmdzIG9yICUlIC4uLiB5ZXQuICAqLwogICAgICBpZiAoc3RyY2hy
IChUUkVFX1NUUklOR19QT0lOVEVSIChzdHJpcHBlZF9zdHJpbmcpLCAnJScpKQoJcmV0dXJu
IDA7CgogICAgICAvKiBXaGVuICJzdHJpbmciIGRvZXNuJ3QgY29udGFpbiAlLCByZXBsYWNl
IGFsbCBjYXNlcyBvZgogICAgICAgICBmcHJpbnRmKHN0cmVhbSxzdHJpbmcpIHdpdGggZnB1
dHMoc3RyaW5nLHN0cmVhbSkuICBUaGUgZnB1dHMKICAgICAgICAgYnVpbHRpbiB3aWxsIHRh
a2UgdGFrZSBvZiBzcGVjaWFsIGNhc2VzIGxpa2UgbGVuZ3RoPT0xLiAgKi8KICAgICAgYXJn
bGlzdCA9IHRyZWVfY29ucyAoTlVMTF9UUkVFLCBUUkVFX1ZBTFVFIChUUkVFX0NIQUlOIChh
cmdsaXN0KSksCgkJCSAgIGJ1aWxkX3RyZWVfbGlzdCAoTlVMTF9UUkVFLCBUUkVFX1ZBTFVF
IChhcmdsaXN0KSkpOwogICAgICBmbiA9IGZuX2ZwdXRzOwogICAgfQoKICByZXR1cm4gZXhw
YW5kX2V4cHIgKGJ1aWxkX2Z1bmN0aW9uX2NhbGwgKGZuLCBhcmdsaXN0KSwKCQkgICAgICAo
aWdub3JlID8gY29uc3QwX3J0eCA6IHRhcmdldCksCgkJICAgICAgdG1vZGUsIG1vZGlmaWVy
KTsKfQoMCgovKiBHaXZlbiBhIGJvb2xlYW4gZXhwcmVzc2lvbiBBUkcsIHJldHVybiBhIHRy
ZWUgcmVwcmVzZW50aW5nIGFuIGluY3JlbWVudAogICBvciBkZWNyZW1lbnQgKGFzIGluZGlj
YXRlZCBieSBDT0RFKSBvZiBBUkcuICBUaGUgZnJvbnQgZW5kIG11c3QgY2hlY2sgZm9yCiAg
IGludmFsaWQgY2FzZXMgKGUuZy4sIGRlY3JlbWVudCBpbiBDKyspLiAgKi8KdHJlZQpib29s
ZWFuX2luY3JlbWVudCAoZW51bSB0cmVlX2NvZGUgY29kZSwgdHJlZSBhcmcpCnsKICB0cmVl
IHZhbDsKICB0cmVlIHRydWVfcmVzID0gKGNfZGlhbGVjdF9jeHggKCkgPyBib29sZWFuX3Ry
dWVfbm9kZSA6IGNfYm9vbF90cnVlX25vZGUpOwoKICBhcmcgPSBzdGFiaWxpemVfcmVmZXJl
bmNlIChhcmcpOwogIHN3aXRjaCAoY29kZSkKICAgIHsKICAgIGNhc2UgUFJFSU5DUkVNRU5U
X0VYUFI6CiAgICAgIHZhbCA9IGJ1aWxkIChNT0RJRllfRVhQUiwgVFJFRV9UWVBFIChhcmcp
LCBhcmcsIHRydWVfcmVzKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIFBPU1RJTkNSRU1FTlRf
RVhQUjoKICAgICAgdmFsID0gYnVpbGQgKE1PRElGWV9FWFBSLCBUUkVFX1RZUEUgKGFyZyks
IGFyZywgdHJ1ZV9yZXMpOwogICAgICBhcmcgPSBzYXZlX2V4cHIgKGFyZyk7CiAgICAgIHZh
bCA9IGJ1aWxkIChDT01QT1VORF9FWFBSLCBUUkVFX1RZUEUgKGFyZyksIHZhbCwgYXJnKTsK
ICAgICAgdmFsID0gYnVpbGQgKENPTVBPVU5EX0VYUFIsIFRSRUVfVFlQRSAoYXJnKSwgYXJn
LCB2YWwpOwogICAgICBicmVhazsKICAgIGNhc2UgUFJFREVDUkVNRU5UX0VYUFI6CiAgICAg
IHZhbCA9IGJ1aWxkIChNT0RJRllfRVhQUiwgVFJFRV9UWVBFIChhcmcpLCBhcmcsIGludmVy
dF90cnV0aHZhbHVlIChhcmcpKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIFBPU1RERUNSRU1F
TlRfRVhQUjoKICAgICAgdmFsID0gYnVpbGQgKE1PRElGWV9FWFBSLCBUUkVFX1RZUEUgKGFy
ZyksIGFyZywgaW52ZXJ0X3RydXRodmFsdWUgKGFyZykpOwogICAgICBhcmcgPSBzYXZlX2V4
cHIgKGFyZyk7CiAgICAgIHZhbCA9IGJ1aWxkIChDT01QT1VORF9FWFBSLCBUUkVFX1RZUEUg
KGFyZyksIHZhbCwgYXJnKTsKICAgICAgdmFsID0gYnVpbGQgKENPTVBPVU5EX0VYUFIsIFRS
RUVfVFlQRSAoYXJnKSwgYXJnLCB2YWwpOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAg
ICAgIGFib3J0ICgpOwogICAgfQogIFRSRUVfU0lERV9FRkZFQ1RTICh2YWwpID0gMTsKICBy
ZXR1cm4gdmFsOwp9CgwKLyogQnVpbHQtaW4gbWFjcm9zIGZvciBzdGRkZWYuaCwgdGhhdCBy
ZXF1aXJlIG1hY3JvcyBkZWZpbmVkIGluIHRoaXMKICAgZmlsZS4gICovCnZvaWQKY19zdGRk
ZWZfY3BwX2J1aWx0aW5zKHZvaWQpCnsKICBidWlsdGluX2RlZmluZV93aXRoX3ZhbHVlICgi
X19TSVpFX1RZUEVfXyIsIFNJWkVfVFlQRSwgMCk7CiAgYnVpbHRpbl9kZWZpbmVfd2l0aF92
YWx1ZSAoIl9fUFRSRElGRl9UWVBFX18iLCBQVFJESUZGX1RZUEUsIDApOwogIGJ1aWx0aW5f
ZGVmaW5lX3dpdGhfdmFsdWUgKCJfX1dDSEFSX1RZUEVfXyIsIE1PRElGSUVEX1dDSEFSX1RZ
UEUsIDApOwogIGJ1aWx0aW5fZGVmaW5lX3dpdGhfdmFsdWUgKCJfX1dJTlRfVFlQRV9fIiwg
V0lOVF9UWVBFLCAwKTsKfQoKc3RhdGljIHZvaWQKY19pbml0X2F0dHJpYnV0ZXMgKHZvaWQp
CnsKICAvKiBGaWxsIGluIHRoZSBidWlsdF9pbl9hdHRyaWJ1dGVzIGFycmF5LiAgKi8KI2Rl
ZmluZSBERUZfQVRUUl9OVUxMX1RSRUUoRU5VTSkJCVwKICBidWlsdF9pbl9hdHRyaWJ1dGVz
WyhpbnQpIEVOVU1dID0gTlVMTF9UUkVFOwojZGVmaW5lIERFRl9BVFRSX0lOVChFTlVNLCBW
QUxVRSkJCQkJCSAgICAgXAogIGJ1aWx0X2luX2F0dHJpYnV0ZXNbKGludCkgRU5VTV0gPSBi
dWlsZF9pbnRfMiAoVkFMVUUsIFZBTFVFIDwgMCA/IC0xIDogMCk7CiNkZWZpbmUgREVGX0FU
VFJfSURFTlQoRU5VTSwgU1RSSU5HKQkJCQlcCiAgYnVpbHRfaW5fYXR0cmlidXRlc1soaW50
KSBFTlVNXSA9IGdldF9pZGVudGlmaWVyIChTVFJJTkcpOwojZGVmaW5lIERFRl9BVFRSX1RS
RUVfTElTVChFTlVNLCBQVVJQT1NFLCBWQUxVRSwgQ0hBSU4pCVwKICBidWlsdF9pbl9hdHRy
aWJ1dGVzWyhpbnQpIEVOVU1dCQkJXAogICAgPSB0cmVlX2NvbnMgKGJ1aWx0X2luX2F0dHJp
YnV0ZXNbKGludCkgUFVSUE9TRV0sCVwKCQkgYnVpbHRfaW5fYXR0cmlidXRlc1soaW50KSBW
QUxVRV0sCVwKCQkgYnVpbHRfaW5fYXR0cmlidXRlc1soaW50KSBDSEFJTl0pOwojZGVmaW5l
IERFRl9GTl9BVFRSKE5BTUUsIEFUVFJTLCBQUkVESUNBVEUpIC8qIE5vIGluaXRpYWxpemF0
aW9uIG5lZWRlZC4gICovCiNpbmNsdWRlICJidWlsdGluLWF0dHJzLmRlZiIKI3VuZGVmIERF
Rl9BVFRSX05VTExfVFJFRQojdW5kZWYgREVGX0FUVFJfSU5UCiN1bmRlZiBERUZfQVRUUl9J
REVOVAojdW5kZWYgREVGX0FUVFJfVFJFRV9MSVNUCiN1bmRlZiBERUZfRk5fQVRUUgogIGNf
YXR0cnNfaW5pdGlhbGl6ZWQgPSB0cnVlOwp9CgovKiBEZXBlbmRpbmcgb24gdGhlIG5hbWUg
b2YgREVDTCwgYXBwbHkgZGVmYXVsdCBhdHRyaWJ1dGVzIHRvIGl0LiAgKi8KCnZvaWQKY19j
b21tb25faW5zZXJ0X2RlZmF1bHRfYXR0cmlidXRlcyAodHJlZSBkZWNsKQp7CiAgdHJlZSBu
YW1lID0gREVDTF9OQU1FIChkZWNsKTsKCiAgaWYgKCFjX2F0dHJzX2luaXRpYWxpemVkKQog
ICAgY19pbml0X2F0dHJpYnV0ZXMgKCk7CgojZGVmaW5lIERFRl9BVFRSX05VTExfVFJFRShF
TlVNKSAvKiBOb3RoaW5nIG5lZWRlZCBhZnRlciBpbml0aWFsaXphdGlvbi4gICovCiNkZWZp
bmUgREVGX0FUVFJfSU5UKEVOVU0sIFZBTFVFKQojZGVmaW5lIERFRl9BVFRSX0lERU5UKEVO
VU0sIFNUUklORykKI2RlZmluZSBERUZfQVRUUl9UUkVFX0xJU1QoRU5VTSwgUFVSUE9TRSwg
VkFMVUUsIENIQUlOKQojZGVmaW5lIERFRl9GTl9BVFRSKE5BTUUsIEFUVFJTLCBQUkVESUNB
VEUpCQkJXAogIGlmICgoUFJFRElDQVRFKSAmJiBuYW1lID09IGJ1aWx0X2luX2F0dHJpYnV0
ZXNbKGludCkgTkFNRV0pCVwKICAgIGRlY2xfYXR0cmlidXRlcyAoJmRlY2wsIGJ1aWx0X2lu
X2F0dHJpYnV0ZXNbKGludCkgQVRUUlNdLAlcCgkJICAgICBBVFRSX0ZMQUdfQlVJTFRfSU4p
OwojaW5jbHVkZSAiYnVpbHRpbi1hdHRycy5kZWYiCiN1bmRlZiBERUZfQVRUUl9OVUxMX1RS
RUUKI3VuZGVmIERFRl9BVFRSX0lOVAojdW5kZWYgREVGX0FUVFJfSURFTlQKI3VuZGVmIERF
Rl9BVFRSX1RSRUVfTElTVAojdW5kZWYgREVGX0ZOX0FUVFIKfQoKLyogT3V0cHV0IGEgLVdz
aGFkb3cgd2FybmluZyBNU0dDT0RFIGFib3V0IE5BTUUsIGFuZCBnaXZlIHRoZSBsb2NhdGlv
bgogICBvZiB0aGUgcHJldmlvdXMgZGVjbGFyYXRpb24gREVDTC4gICovCnZvaWQKc2hhZG93
X3dhcm5pbmcgKGVudW0gc3dfa2luZCBtc2djb2RlLCBjb25zdCBjaGFyICpuYW1lLCB0cmVl
IGRlY2wpCnsKICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbXNnc1tdID0gewogICAgLyog
U1dfUEFSQU0gICovIE5fKCJkZWNsYXJhdGlvbiBvZiBcIiVzXCIgc2hhZG93cyBhIHBhcmFt
ZXRlciIpLAogICAgLyogU1dfTE9DQUwgICovIE5fKCJkZWNsYXJhdGlvbiBvZiBcIiVzXCIg
c2hhZG93cyBhIHByZXZpb3VzIGxvY2FsIiksCiAgICAvKiBTV19HTE9CQUwgKi8gTl8oImRl
Y2xhcmF0aW9uIG9mIFwiJXNcIiBzaGFkb3dzIGEgZ2xvYmFsIGRlY2xhcmF0aW9uIikKICB9
OwoKICB3YXJuaW5nIChtc2dzW21zZ2NvZGVdLCBuYW1lKTsKICB3YXJuaW5nICgiJUhzaGFk
b3dlZCBkZWNsYXJhdGlvbiBpcyBoZXJlIiwgJkRFQ0xfU09VUkNFX0xPQ0FUSU9OIChkZWNs
KSk7Cn0KCi8qIEF0dHJpYnV0ZSBoYW5kbGVycyBjb21tb24gdG8gQyBmcm9udCBlbmRzLiAg
Ki8KCi8qIEhhbmRsZSBhICJwYWNrZWQiIGF0dHJpYnV0ZTsgYXJndW1lbnRzIGFzIGluCiAg
IHN0cnVjdCBhdHRyaWJ1dGVfc3BlYy5oYW5kbGVyLiAgKi8KCnN0YXRpYyB0cmVlCmhhbmRs
ZV9wYWNrZWRfYXR0cmlidXRlICh0cmVlICpub2RlLCB0cmVlIG5hbWUsIHRyZWUgYXJncyAg
QVRUUklCVVRFX1VOVVNFRCwKCQkJIGludCBmbGFncywgYm9vbCAqbm9fYWRkX2F0dHJzKQp7
CiAgdHJlZSAqdHlwZSA9IE5VTEw7CiAgaWYgKERFQ0xfUCAoKm5vZGUpKQogICAgewogICAg
ICBpZiAoVFJFRV9DT0RFICgqbm9kZSkgPT0gVFlQRV9ERUNMKQoJdHlwZSA9ICZUUkVFX1RZ
UEUgKCpub2RlKTsKICAgIH0KICBlbHNlCiAgICB0eXBlID0gbm9kZTsKCiAgaWYgKHR5cGUp
CiAgICB7CiAgICAgIGlmICghKGZsYWdzICYgKGludCkgQVRUUl9GTEFHX1RZUEVfSU5fUExB
Q0UpKQoJKnR5cGUgPSBidWlsZF90eXBlX2NvcHkgKCp0eXBlKTsKICAgICAgVFlQRV9QQUNL
RUQgKCp0eXBlKSA9IDE7CiAgICB9CiAgZWxzZSBpZiAoVFJFRV9DT0RFICgqbm9kZSkgPT0g
RklFTERfREVDTCkKICAgIERFQ0xfUEFDS0VEICgqbm9kZSkgPSAxOwogIC8qIFdlIGNhbid0
IHNldCBERUNMX1BBQ0tFRCBmb3IgYSBWQVJfREVDTCwgYmVjYXVzZSB0aGUgYml0IGlzCiAg
ICAgdXNlZCBmb3IgREVDTF9SRUdJU1RFUi4gIEl0IHdvdWxkbid0IG1lYW4gYW55dGhpbmcg
YW55d2F5LiAgKi8KICBlbHNlCiAgICB7CiAgICAgIHdhcm5pbmcgKCJgJXMnIGF0dHJpYnV0
ZSBpZ25vcmVkIiwgSURFTlRJRklFUl9QT0lOVEVSIChuYW1lKSk7CiAgICAgICpub19hZGRf
YXR0cnMgPSB0cnVlOwogICAgfQoKICByZXR1cm4gTlVMTF9UUkVFOwp9CgovKiBIYW5kbGUg
YSAibm9jb21tb24iIGF0dHJpYnV0ZTsgYXJndW1lbnRzIGFzIGluCiAgIHN0cnVjdCBhdHRy
aWJ1dGVfc3BlYy5oYW5kbGVyLiAgKi8KCnN0YXRpYyB0cmVlCmhhbmRsZV9ub2NvbW1vbl9h
dHRyaWJ1dGUgKHRyZWUgKm5vZGUsIHRyZWUgbmFtZSwKCQkJICAgdHJlZSBhcmdzIEFUVFJJ
QlVURV9VTlVTRUQsCgkJCSAgIGludCBmbGFncyBBVFRSSUJVVEVfVU5VU0VELCBib29sICpu
b19hZGRfYXR0cnMpCnsKICBpZiAoVFJFRV9DT0RFICgqbm9kZSkgPT0gVkFSX0RFQ0wpCiAg
ICBERUNMX0NPTU1PTiAoKm5vZGUpID0gMDsKICBlbHNlCiAgICB7CiAgICAgIHdhcm5pbmcg
KCJgJXMnIGF0dHJpYnV0ZSBpZ25vcmVkIiwgSURFTlRJRklFUl9QT0lOVEVSIChuYW1lKSk7
CiAgICAgICpub19hZGRfYXR0cnMgPSB0cnVlOwogICAgfQoKICByZXR1cm4gTlVMTF9UUkVF
Owp9CgovKiBIYW5kbGUgYSAiY29tbW9uIiBhdHRyaWJ1dGU7IGFyZ3VtZW50cyBhcyBpbgog
ICBzdHJ1Y3QgYXR0cmlidXRlX3NwZWMuaGFuZGxlci4gICovCgpzdGF0aWMgdHJlZQpoYW5k
bGVfY29tbW9uX2F0dHJpYnV0ZSAodHJlZSAqbm9kZSwgdHJlZSBuYW1lLCB0cmVlIGFyZ3Mg
QVRUUklCVVRFX1VOVVNFRCwKCQkJIGludCBmbGFncyBBVFRSSUJVVEVfVU5VU0VELCBib29s
ICpub19hZGRfYXR0cnMpCnsKICBpZiAoVFJFRV9DT0RFICgqbm9kZSkgPT0gVkFSX0RFQ0wp
CiAgICBERUNMX0NPTU1PTiAoKm5vZGUpID0gMTsKICBlbHNlCiAgICB7CiAgICAgIHdhcm5p
bmcgKCJgJXMnIGF0dHJpYnV0ZSBpZ25vcmVkIiwgSURFTlRJRklFUl9QT0lOVEVSIChuYW1l
KSk7CiAgICAgICpub19hZGRfYXR0cnMgPSB0cnVlOwogICAgfQoKICByZXR1cm4gTlVMTF9U
UkVFOwp9CgovKiBIYW5kbGUgYSAibm9yZXR1cm4iIGF0dHJpYnV0ZTsgYXJndW1lbnRzIGFz
IGluCiAgIHN0cnVjdCBhdHRyaWJ1dGVfc3BlYy5oYW5kbGVyLiAgKi8KCnN0YXRpYyB0cmVl
CmhhbmRsZV9ub3JldHVybl9hdHRyaWJ1dGUgKHRyZWUgKm5vZGUsIHRyZWUgbmFtZSwgdHJl
ZSBhcmdzIEFUVFJJQlVURV9VTlVTRUQsCgkJCSAgIGludCBmbGFncyBBVFRSSUJVVEVfVU5V
U0VELCBib29sICpub19hZGRfYXR0cnMpCnsKICB0cmVlIHR5cGUgPSBUUkVFX1RZUEUgKCpu
b2RlKTsKCiAgLyogU2VlIEZJWE1FIGNvbW1lbnQgaW4gY19jb21tb25fYXR0cmlidXRlX3Rh
YmxlLiAgKi8KICBpZiAoVFJFRV9DT0RFICgqbm9kZSkgPT0gRlVOQ1RJT05fREVDTCkKICAg
IFRSRUVfVEhJU19WT0xBVElMRSAoKm5vZGUpID0gMTsKICBlbHNlIGlmIChUUkVFX0NPREUg
KHR5cGUpID09IFBPSU5URVJfVFlQRQoJICAgJiYgVFJFRV9DT0RFIChUUkVFX1RZUEUgKHR5
cGUpKSA9PSBGVU5DVElPTl9UWVBFKQogICAgVFJFRV9UWVBFICgqbm9kZSkKICAgICAgPSBi
dWlsZF9wb2ludGVyX3R5cGUKCShidWlsZF90eXBlX3ZhcmlhbnQgKFRSRUVfVFlQRSAodHlw
ZSksCgkJCSAgICAgVFJFRV9SRUFET05MWSAoVFJFRV9UWVBFICh0eXBlKSksIDEpKTsKICBl
bHNlCiAgICB7CiAgICAgIHdhcm5pbmcgKCJgJXMnIGF0dHJpYnV0ZSBpZ25vcmVkIiwgSURF
TlRJRklFUl9QT0lOVEVSIChuYW1lKSk7CiAgICAgICpub19hZGRfYXR0cnMgPSB0cnVlOwog
ICAgfQoKICByZXR1cm4gTlVMTF9UUkVFOwp9CgovKiBIYW5kbGUgYSAibm9pbmxpbmUiIGF0
dHJpYnV0ZTsgYXJndW1lbnRzIGFzIGluCiAgIHN0cnVjdCBhdHRyaWJ1dGVfc3BlYy5oYW5k
bGVyLiAgKi8KCnN0YXRpYyB0cmVlCmhhbmRsZV9ub2lubGluZV9hdHRyaWJ1dGUgKHRyZWUg
Km5vZGUsIHRyZWUgbmFtZSwKCQkJICAgdHJlZSBhcmdzIEFUVFJJQlVURV9VTlVTRUQsCgkJ
CSAgIGludCBmbGFncyBBVFRSSUJVVEVfVU5VU0VELCBib29sICpub19hZGRfYXR0cnMpCnsK
ICBpZiAoVFJFRV9DT0RFICgqbm9kZSkgPT0gRlVOQ1RJT05fREVDTCkKICAgIERFQ0xfVU5J
TkxJTkFCTEUgKCpub2RlKSA9IDE7CiAgZWxzZQogICAgewogICAgICB3YXJuaW5nICgiYCVz
JyBhdHRyaWJ1dGUgaWdub3JlZCIsIElERU5USUZJRVJfUE9JTlRFUiAobmFtZSkpOwogICAg
ICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKICAgIH0KCiAgcmV0dXJuIE5VTExfVFJFRTsKfQoK
LyogSGFuZGxlIGEgImFsd2F5c19pbmxpbmUiIGF0dHJpYnV0ZTsgYXJndW1lbnRzIGFzIGlu
CiAgIHN0cnVjdCBhdHRyaWJ1dGVfc3BlYy5oYW5kbGVyLiAgKi8KCnN0YXRpYyB0cmVlCmhh
bmRsZV9hbHdheXNfaW5saW5lX2F0dHJpYnV0ZSAodHJlZSAqbm9kZSwgdHJlZSBuYW1lLAoJ
CQkJdHJlZSBhcmdzIEFUVFJJQlVURV9VTlVTRUQsCgkJCQlpbnQgZmxhZ3MgQVRUUklCVVRF
X1VOVVNFRCwKCQkJCWJvb2wgKm5vX2FkZF9hdHRycykKewogIGlmIChUUkVFX0NPREUgKCpu
b2RlKSA9PSBGVU5DVElPTl9ERUNMKQogICAgewogICAgICAvKiBEbyBub3RoaW5nIGVsc2Us
IGp1c3Qgc2V0IHRoZSBhdHRyaWJ1dGUuICBXZSdsbCBnZXQgYXQKCSBpdCBsYXRlciB3aXRo
IGxvb2t1cF9hdHRyaWJ1dGUuICAqLwogICAgfQogIGVsc2UKICAgIHsKICAgICAgd2Fybmlu
ZyAoImAlcycgYXR0cmlidXRlIGlnbm9yZWQiLCBJREVOVElGSUVSX1BPSU5URVIgKG5hbWUp
KTsKICAgICAgKm5vX2FkZF9hdHRycyA9IHRydWU7CiAgICB9CgogIHJldHVybiBOVUxMX1RS
RUU7Cn0KCi8qIEhhbmRsZSBhICJ1c2VkIiBhdHRyaWJ1dGU7IGFyZ3VtZW50cyBhcyBpbgog
ICBzdHJ1Y3QgYXR0cmlidXRlX3NwZWMuaGFuZGxlci4gICovCgpzdGF0aWMgdHJlZQpoYW5k
bGVfdXNlZF9hdHRyaWJ1dGUgKHRyZWUgKnBub2RlLCB0cmVlIG5hbWUsIHRyZWUgYXJncyBB
VFRSSUJVVEVfVU5VU0VELAoJCSAgICAgICBpbnQgZmxhZ3MgQVRUUklCVVRFX1VOVVNFRCwg
Ym9vbCAqbm9fYWRkX2F0dHJzKQp7CiAgdHJlZSBub2RlID0gKnBub2RlOwoKICBpZiAoVFJF
RV9DT0RFIChub2RlKSA9PSBGVU5DVElPTl9ERUNMCiAgICAgIHx8IChUUkVFX0NPREUgKG5v
ZGUpID09IFZBUl9ERUNMICYmIFRSRUVfU1RBVElDIChub2RlKSkpCiAgICB7CiAgICAgIG1h
cmtfcmVmZXJlbmNlZCAoREVDTF9BU1NFTUJMRVJfTkFNRSAobm9kZSkpOwogICAgICBUUkVF
X1VTRUQgKG5vZGUpID0gMTsKICAgIH0KICBlbHNlCiAgICB7CiAgICAgIHdhcm5pbmcgKCJg
JXMnIGF0dHJpYnV0ZSBpZ25vcmVkIiwgSURFTlRJRklFUl9QT0lOVEVSIChuYW1lKSk7CiAg
ICAgICpub19hZGRfYXR0cnMgPSB0cnVlOwogICAgfQoKICByZXR1cm4gTlVMTF9UUkVFOwp9
CgovKiBIYW5kbGUgYSAidW51c2VkIiBhdHRyaWJ1dGU7IGFyZ3VtZW50cyBhcyBpbgogICBz
dHJ1Y3QgYXR0cmlidXRlX3NwZWMuaGFuZGxlci4gICovCgpzdGF0aWMgdHJlZQpoYW5kbGVf
dW51c2VkX2F0dHJpYnV0ZSAodHJlZSAqbm9kZSwgdHJlZSBuYW1lLCB0cmVlIGFyZ3MgQVRU
UklCVVRFX1VOVVNFRCwKCQkJIGludCBmbGFncyBBVFRSSUJVVEVfVU5VU0VELCBib29sICpu
b19hZGRfYXR0cnMpCnsKICBpZiAoREVDTF9QICgqbm9kZSkpCiAgICB7CiAgICAgIHRyZWUg
ZGVjbCA9ICpub2RlOwoKICAgICAgaWYgKFRSRUVfQ09ERSAoZGVjbCkgPT0gUEFSTV9ERUNM
CgkgIHx8IFRSRUVfQ09ERSAoZGVjbCkgPT0gVkFSX0RFQ0wKCSAgfHwgVFJFRV9DT0RFIChk
ZWNsKSA9PSBGVU5DVElPTl9ERUNMCgkgIHx8IFRSRUVfQ09ERSAoZGVjbCkgPT0gTEFCRUxf
REVDTAoJICB8fCBUUkVFX0NPREUgKGRlY2wpID09IFRZUEVfREVDTCkKCVRSRUVfVVNFRCAo
ZGVjbCkgPSAxOwogICAgICBlbHNlCgl7CgkgIHdhcm5pbmcgKCJgJXMnIGF0dHJpYnV0ZSBp
Z25vcmVkIiwgSURFTlRJRklFUl9QT0lOVEVSIChuYW1lKSk7CgkgICpub19hZGRfYXR0cnMg
PSB0cnVlOwoJfQogICAgfQogIGVsc2UKICAgIHsKICAgICAgaWYgKCEoZmxhZ3MgJiAoaW50
KSBBVFRSX0ZMQUdfVFlQRV9JTl9QTEFDRSkpCgkqbm9kZSA9IGJ1aWxkX3R5cGVfY29weSAo
Km5vZGUpOwogICAgICBUUkVFX1VTRUQgKCpub2RlKSA9IDE7CiAgICB9CgogIHJldHVybiBO
VUxMX1RSRUU7Cn0KCi8qIEhhbmRsZSBhICJjb25zdCIgYXR0cmlidXRlOyBhcmd1bWVudHMg
YXMgaW4KICAgc3RydWN0IGF0dHJpYnV0ZV9zcGVjLmhhbmRsZXIuICAqLwoKc3RhdGljIHRy
ZWUKaGFuZGxlX2NvbnN0X2F0dHJpYnV0ZSAodHJlZSAqbm9kZSwgdHJlZSBuYW1lLCB0cmVl
IGFyZ3MgQVRUUklCVVRFX1VOVVNFRCwKCQkJaW50IGZsYWdzIEFUVFJJQlVURV9VTlVTRUQs
IGJvb2wgKm5vX2FkZF9hdHRycykKewogIHRyZWUgdHlwZSA9IFRSRUVfVFlQRSAoKm5vZGUp
OwoKICAvKiBTZWUgRklYTUUgY29tbWVudCBvbiBub3JldHVybiBpbiBjX2NvbW1vbl9hdHRy
aWJ1dGVfdGFibGUuICAqLwogIGlmIChUUkVFX0NPREUgKCpub2RlKSA9PSBGVU5DVElPTl9E
RUNMKQogICAgVFJFRV9SRUFET05MWSAoKm5vZGUpID0gMTsKICBlbHNlIGlmIChUUkVFX0NP
REUgKHR5cGUpID09IFBPSU5URVJfVFlQRQoJICAgJiYgVFJFRV9DT0RFIChUUkVFX1RZUEUg
KHR5cGUpKSA9PSBGVU5DVElPTl9UWVBFKQogICAgVFJFRV9UWVBFICgqbm9kZSkKICAgICAg
PSBidWlsZF9wb2ludGVyX3R5cGUKCShidWlsZF90eXBlX3ZhcmlhbnQgKFRSRUVfVFlQRSAo
dHlwZSksIDEsCgkJCSAgICAgVFJFRV9USElTX1ZPTEFUSUxFIChUUkVFX1RZUEUgKHR5cGUp
KSkpOwogIGVsc2UKICAgIHsKICAgICAgd2FybmluZyAoImAlcycgYXR0cmlidXRlIGlnbm9y
ZWQiLCBJREVOVElGSUVSX1BPSU5URVIgKG5hbWUpKTsKICAgICAgKm5vX2FkZF9hdHRycyA9
IHRydWU7CiAgICB9CgogIHJldHVybiBOVUxMX1RSRUU7Cn0KCi8qIEhhbmRsZSBhICJ0cmFu
c3BhcmVudF91bmlvbiIgYXR0cmlidXRlOyBhcmd1bWVudHMgYXMgaW4KICAgc3RydWN0IGF0
dHJpYnV0ZV9zcGVjLmhhbmRsZXIuICAqLwoKc3RhdGljIHRyZWUKaGFuZGxlX3RyYW5zcGFy
ZW50X3VuaW9uX2F0dHJpYnV0ZSAodHJlZSAqbm9kZSwgdHJlZSBuYW1lLAoJCQkJICAgIHRy
ZWUgYXJncyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgZmxhZ3MsCgkJCQkgICAgYm9vbCAqbm9f
YWRkX2F0dHJzKQp7CiAgdHJlZSBkZWNsID0gTlVMTF9UUkVFOwogIHRyZWUgKnR5cGUgPSBO
VUxMOwogIGludCBpc190eXBlID0gMDsKCiAgaWYgKERFQ0xfUCAoKm5vZGUpKQogICAgewog
ICAgICBkZWNsID0gKm5vZGU7CiAgICAgIHR5cGUgPSAmVFJFRV9UWVBFIChkZWNsKTsKICAg
ICAgaXNfdHlwZSA9IFRSRUVfQ09ERSAoKm5vZGUpID09IFRZUEVfREVDTDsKICAgIH0KICBl
bHNlIGlmIChUWVBFX1AgKCpub2RlKSkKICAgIHR5cGUgPSBub2RlLCBpc190eXBlID0gMTsK
CiAgaWYgKGlzX3R5cGUKICAgICAgJiYgVFJFRV9DT0RFICgqdHlwZSkgPT0gVU5JT05fVFlQ
RQogICAgICAmJiAoZGVjbCA9PSAwCgkgIHx8IChUWVBFX0ZJRUxEUyAoKnR5cGUpICE9IDAK
CSAgICAgICYmIFRZUEVfTU9ERSAoKnR5cGUpID09IERFQ0xfTU9ERSAoVFlQRV9GSUVMRFMg
KCp0eXBlKSkpKSkKICAgIHsKICAgICAgaWYgKCEoZmxhZ3MgJiAoaW50KSBBVFRSX0ZMQUdf
VFlQRV9JTl9QTEFDRSkpCgkqdHlwZSA9IGJ1aWxkX3R5cGVfY29weSAoKnR5cGUpOwogICAg
ICBUWVBFX1RSQU5TUEFSRU5UX1VOSU9OICgqdHlwZSkgPSAxOwogICAgfQogIGVsc2UgaWYg
KGRlY2wgIT0gMCAmJiBUUkVFX0NPREUgKGRlY2wpID09IFBBUk1fREVDTAoJICAgJiYgVFJF
RV9DT0RFICgqdHlwZSkgPT0gVU5JT05fVFlQRQoJICAgJiYgVFlQRV9NT0RFICgqdHlwZSkg
PT0gREVDTF9NT0RFIChUWVBFX0ZJRUxEUyAoKnR5cGUpKSkKICAgIERFQ0xfVFJBTlNQQVJF
TlRfVU5JT04gKGRlY2wpID0gMTsKICBlbHNlCiAgICB7CiAgICAgIHdhcm5pbmcgKCJgJXMn
IGF0dHJpYnV0ZSBpZ25vcmVkIiwgSURFTlRJRklFUl9QT0lOVEVSIChuYW1lKSk7CiAgICAg
ICpub19hZGRfYXR0cnMgPSB0cnVlOwogICAgfQoKICByZXR1cm4gTlVMTF9UUkVFOwp9Cgov
KiBIYW5kbGUgYSAiY29uc3RydWN0b3IiIGF0dHJpYnV0ZTsgYXJndW1lbnRzIGFzIGluCiAg
IHN0cnVjdCBhdHRyaWJ1dGVfc3BlYy5oYW5kbGVyLiAgKi8KCnN0YXRpYyB0cmVlCmhhbmRs
ZV9jb25zdHJ1Y3Rvcl9hdHRyaWJ1dGUgKHRyZWUgKm5vZGUsIHRyZWUgbmFtZSwKCQkJICAg
ICAgdHJlZSBhcmdzIEFUVFJJQlVURV9VTlVTRUQsCgkJCSAgICAgIGludCBmbGFncyBBVFRS
SUJVVEVfVU5VU0VELAoJCQkgICAgICBib29sICpub19hZGRfYXR0cnMpCnsKICB0cmVlIGRl
Y2wgPSAqbm9kZTsKICB0cmVlIHR5cGUgPSBUUkVFX1RZUEUgKGRlY2wpOwoKICBpZiAoVFJF
RV9DT0RFIChkZWNsKSA9PSBGVU5DVElPTl9ERUNMCiAgICAgICYmIFRSRUVfQ09ERSAodHlw
ZSkgPT0gRlVOQ1RJT05fVFlQRQogICAgICAmJiBkZWNsX2Z1bmN0aW9uX2NvbnRleHQgKGRl
Y2wpID09IDApCiAgICB7CiAgICAgIERFQ0xfU1RBVElDX0NPTlNUUlVDVE9SIChkZWNsKSA9
IDE7CiAgICAgIFRSRUVfVVNFRCAoZGVjbCkgPSAxOwogICAgfQogIGVsc2UKICAgIHsKICAg
ICAgd2FybmluZyAoImAlcycgYXR0cmlidXRlIGlnbm9yZWQiLCBJREVOVElGSUVSX1BPSU5U
RVIgKG5hbWUpKTsKICAgICAgKm5vX2FkZF9hdHRycyA9IHRydWU7CiAgICB9CgogIHJldHVy
biBOVUxMX1RSRUU7Cn0KCi8qIEhhbmRsZSBhICJkZXN0cnVjdG9yIiBhdHRyaWJ1dGU7IGFy
Z3VtZW50cyBhcyBpbgogICBzdHJ1Y3QgYXR0cmlidXRlX3NwZWMuaGFuZGxlci4gICovCgpz
dGF0aWMgdHJlZQpoYW5kbGVfZGVzdHJ1Y3Rvcl9hdHRyaWJ1dGUgKHRyZWUgKm5vZGUsIHRy
ZWUgbmFtZSwKCQkJICAgICB0cmVlIGFyZ3MgQVRUUklCVVRFX1VOVVNFRCwKCQkJICAgICBp
bnQgZmxhZ3MgQVRUUklCVVRFX1VOVVNFRCwKCQkJICAgICBib29sICpub19hZGRfYXR0cnMp
CnsKICB0cmVlIGRlY2wgPSAqbm9kZTsKICB0cmVlIHR5cGUgPSBUUkVFX1RZUEUgKGRlY2wp
OwoKICBpZiAoVFJFRV9DT0RFIChkZWNsKSA9PSBGVU5DVElPTl9ERUNMCiAgICAgICYmIFRS
RUVfQ09ERSAodHlwZSkgPT0gRlVOQ1RJT05fVFlQRQogICAgICAmJiBkZWNsX2Z1bmN0aW9u
X2NvbnRleHQgKGRlY2wpID09IDApCiAgICB7CiAgICAgIERFQ0xfU1RBVElDX0RFU1RSVUNU
T1IgKGRlY2wpID0gMTsKICAgICAgVFJFRV9VU0VEIChkZWNsKSA9IDE7CiAgICB9CiAgZWxz
ZQogICAgewogICAgICB3YXJuaW5nICgiYCVzJyBhdHRyaWJ1dGUgaWdub3JlZCIsIElERU5U
SUZJRVJfUE9JTlRFUiAobmFtZSkpOwogICAgICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKICAg
IH0KCiAgcmV0dXJuIE5VTExfVFJFRTsKfQoKLyogSGFuZGxlIGEgIm1vZGUiIGF0dHJpYnV0
ZTsgYXJndW1lbnRzIGFzIGluCiAgIHN0cnVjdCBhdHRyaWJ1dGVfc3BlYy5oYW5kbGVyLiAg
Ki8KCnN0YXRpYyB0cmVlCmhhbmRsZV9tb2RlX2F0dHJpYnV0ZSAodHJlZSAqbm9kZSwgdHJl
ZSBuYW1lLCB0cmVlIGFyZ3MgQVRUUklCVVRFX1VOVVNFRCwKCQkgICAgICAgaW50IGZsYWdz
IEFUVFJJQlVURV9VTlVTRUQsIGJvb2wgKm5vX2FkZF9hdHRycykKewogIHRyZWUgdHlwZSA9
ICpub2RlOwoKICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKCiAgaWYgKFRSRUVfQ09ERSAoVFJF
RV9WQUxVRSAoYXJncykpICE9IElERU5USUZJRVJfTk9ERSkKICAgIHdhcm5pbmcgKCJgJXMn
IGF0dHJpYnV0ZSBpZ25vcmVkIiwgSURFTlRJRklFUl9QT0lOVEVSIChuYW1lKSk7CiAgZWxz
ZQogICAgewogICAgICBpbnQgajsKICAgICAgY29uc3QgY2hhciAqcCA9IElERU5USUZJRVJf
UE9JTlRFUiAoVFJFRV9WQUxVRSAoYXJncykpOwogICAgICBpbnQgbGVuID0gc3RybGVuIChw
KTsKICAgICAgZW51bSBtYWNoaW5lX21vZGUgbW9kZSA9IFZPSURtb2RlOwogICAgICB0cmVl
IHR5cGVmbTsKICAgICAgdHJlZSBwdHJfdHlwZTsKCiAgICAgIGlmIChsZW4gPiA0ICYmIHBb
MF0gPT0gJ18nICYmIHBbMV0gPT0gJ18nCgkgICYmIHBbbGVuIC0gMV0gPT0gJ18nICYmIHBb
bGVuIC0gMl0gPT0gJ18nKQoJewoJICBjaGFyICpuZXdwID0gKGNoYXIgKikgYWxsb2NhIChs
ZW4gLSAxKTsKCgkgIHN0cmNweSAobmV3cCwgJnBbMl0pOwoJICBuZXdwW2xlbiAtIDRdID0g
J1wwJzsKCSAgcCA9IG5ld3A7Cgl9CgogICAgICAvKiBDaGFuZ2UgdGhpcyB0eXBlIHRvIGhh
dmUgYSB0eXBlIHdpdGggdGhlIHNwZWNpZmllZCBtb2RlLgoJIEZpcnN0IGNoZWNrIGZvciB0
aGUgc3BlY2lhbCBtb2Rlcy4gICovCiAgICAgIGlmICghIHN0cmNtcCAocCwgImJ5dGUiKSkK
CW1vZGUgPSBieXRlX21vZGU7CiAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKHAsICJ3b3JkIikp
Cgltb2RlID0gd29yZF9tb2RlOwogICAgICBlbHNlIGlmICghIHN0cmNtcCAocCwgInBvaW50
ZXIiKSkKCW1vZGUgPSBwdHJfbW9kZTsKICAgICAgZWxzZQoJZm9yIChqID0gMDsgaiA8IE5V
TV9NQUNISU5FX01PREVTOyBqKyspCgkgIGlmICghc3RyY21wIChwLCBHRVRfTU9ERV9OQU1F
IChqKSkpCgkgICAgbW9kZSA9IChlbnVtIG1hY2hpbmVfbW9kZSkgajsKCiAgICAgIGlmICht
b2RlID09IFZPSURtb2RlKQoJZXJyb3IgKCJ1bmtub3duIG1hY2hpbmUgbW9kZSBgJXMnIiwg
cCk7CiAgICAgIGVsc2UgaWYgKDAgPT0gKHR5cGVmbSA9ICgqbGFuZ19ob29rcy50eXBlcy50
eXBlX2Zvcl9tb2RlKQoJCSAgICAgKG1vZGUsIFRSRUVfVU5TSUdORUQgKHR5cGUpKSkpCgll
cnJvciAoIm5vIGRhdGEgdHlwZSBmb3IgbW9kZSBgJXMnIiwgcCk7CiAgICAgIGVsc2UgaWYg
KChUUkVFX0NPREUgKHR5cGUpID09IFBPSU5URVJfVFlQRQoJCXx8IFRSRUVfQ09ERSAodHlw
ZSkgPT0gUkVGRVJFTkNFX1RZUEUpCgkgICAgICAgJiYgISgqdGFyZ2V0bS52YWxpZF9wb2lu
dGVyX21vZGUpIChtb2RlKSkKCWVycm9yICgiaW52YWxpZCBwb2ludGVyIG1vZGUgYCVzJyIs
IHApOwogICAgICBlbHNlCgl7CgkgIC8qIElmIHRoaXMgaXMgYSB2ZWN0b3IsIG1ha2Ugc3Vy
ZSB3ZSBlaXRoZXIgaGF2ZSBoYXJkd2FyZQoJICAgICBzdXBwb3J0LCBvciB3ZSBjYW4gZW11
bGF0ZSBpdC4gICovCgkgIGlmIChWRUNUT1JfTU9ERV9QIChtb2RlKSAmJiAhdmVjdG9yX21v
ZGVfdmFsaWRfcCAobW9kZSkpCgkgICAgewoJICAgICAgZXJyb3IgKCJ1bmFibGUgdG8gZW11
bGF0ZSAnJXMnIiwgR0VUX01PREVfTkFNRSAobW9kZSkpOwoJICAgICAgcmV0dXJuIE5VTExf
VFJFRTsKCSAgICB9CgoJICBpZiAoVFJFRV9DT0RFICh0eXBlKSA9PSBQT0lOVEVSX1RZUEUp
CgkgICAgewoJICAgICAgcHRyX3R5cGUgPSBidWlsZF9wb2ludGVyX3R5cGVfZm9yX21vZGUg
KFRSRUVfVFlQRSAodHlwZSksCgkJCQkJCSAgICAgIG1vZGUpOwoJICAgICAgKm5vZGUgPSBw
dHJfdHlwZTsKCSAgICB9CgkgIGVsc2UgaWYgKFRSRUVfQ09ERSAodHlwZSkgPT0gUkVGRVJF
TkNFX1RZUEUpCgkgICAgewoJICAgICAgcHRyX3R5cGUgPSBidWlsZF9yZWZlcmVuY2VfdHlw
ZV9mb3JfbW9kZSAoVFJFRV9UWVBFICh0eXBlKSwKCQkJCQkJCW1vZGUpOwoJICAgICAgKm5v
ZGUgPSBwdHJfdHlwZTsKCSAgICB9CgkgIGVsc2UKCSAgKm5vZGUgPSB0eXBlZm07CgkgIC8q
IE5vIG5lZWQgdG8gbGF5b3V0IHRoZSB0eXBlIGhlcmUuICBUaGUgY2FsbGVyIHNob3VsZCBk
byB0aGlzLiAgKi8KCX0KICAgIH0KCiAgcmV0dXJuIE5VTExfVFJFRTsKfQoKLyogSGFuZGxl
IGEgInNlY3Rpb24iIGF0dHJpYnV0ZTsgYXJndW1lbnRzIGFzIGluCiAgIHN0cnVjdCBhdHRy
aWJ1dGVfc3BlYy5oYW5kbGVyLiAgKi8KCnN0YXRpYyB0cmVlCmhhbmRsZV9zZWN0aW9uX2F0
dHJpYnV0ZSAodHJlZSAqbm9kZSwgdHJlZSBuYW1lIEFUVFJJQlVURV9VTlVTRUQsIHRyZWUg
YXJncywKCQkJICBpbnQgZmxhZ3MgQVRUUklCVVRFX1VOVVNFRCwgYm9vbCAqbm9fYWRkX2F0
dHJzKQp7CiAgdHJlZSBkZWNsID0gKm5vZGU7CgogIGlmICh0YXJnZXRtLmhhdmVfbmFtZWRf
c2VjdGlvbnMpCiAgICB7CiAgICAgIGlmICgoVFJFRV9DT0RFIChkZWNsKSA9PSBGVU5DVElP
Tl9ERUNMCgkgICB8fCBUUkVFX0NPREUgKGRlY2wpID09IFZBUl9ERUNMKQoJICAmJiBUUkVF
X0NPREUgKFRSRUVfVkFMVUUgKGFyZ3MpKSA9PSBTVFJJTkdfQ1NUKQoJewoJICBpZiAoVFJF
RV9DT0RFIChkZWNsKSA9PSBWQVJfREVDTAoJICAgICAgJiYgY3VycmVudF9mdW5jdGlvbl9k
ZWNsICE9IE5VTExfVFJFRQoJICAgICAgJiYgISBUUkVFX1NUQVRJQyAoZGVjbCkpCgkgICAg
ewoJICAgICAgZXJyb3Jfd2l0aF9kZWNsIChkZWNsLAoJCQkgICAgICAgInNlY3Rpb24gYXR0
cmlidXRlIGNhbm5vdCBiZSBzcGVjaWZpZWQgZm9yIGxvY2FsIHZhcmlhYmxlcyIpOwoJICAg
ICAgKm5vX2FkZF9hdHRycyA9IHRydWU7CgkgICAgfQoKCSAgLyogVGhlIGRlY2wgbWF5IGhh
dmUgYWxyZWFkeSBiZWVuIGdpdmVuIGEgc2VjdGlvbiBhdHRyaWJ1dGUKCSAgICAgZnJvbSBh
IHByZXZpb3VzIGRlY2xhcmF0aW9uLiAgRW5zdXJlIHRoZXkgbWF0Y2guICAqLwoJICBlbHNl
IGlmIChERUNMX1NFQ1RJT05fTkFNRSAoZGVjbCkgIT0gTlVMTF9UUkVFCgkJICAgJiYgc3Ry
Y21wIChUUkVFX1NUUklOR19QT0lOVEVSIChERUNMX1NFQ1RJT05fTkFNRSAoZGVjbCkpLAoJ
CQkgICAgICBUUkVFX1NUUklOR19QT0lOVEVSIChUUkVFX1ZBTFVFIChhcmdzKSkpICE9IDAp
CgkgICAgewoJICAgICAgZXJyb3Jfd2l0aF9kZWNsICgqbm9kZSwKCQkJICAgICAgICJzZWN0
aW9uIG9mIGAlcycgY29uZmxpY3RzIHdpdGggcHJldmlvdXMgZGVjbGFyYXRpb24iKTsKCSAg
ICAgICpub19hZGRfYXR0cnMgPSB0cnVlOwoJICAgIH0KCSAgZWxzZQoJICAgIERFQ0xfU0VD
VElPTl9OQU1FIChkZWNsKSA9IFRSRUVfVkFMVUUgKGFyZ3MpOwoJfQogICAgICBlbHNlCgl7
CgkgIGVycm9yX3dpdGhfZGVjbCAoKm5vZGUsCgkJCSAgICJzZWN0aW9uIGF0dHJpYnV0ZSBu
b3QgYWxsb3dlZCBmb3IgYCVzJyIpOwoJICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKCX0KICAg
IH0KICBlbHNlCiAgICB7CiAgICAgIGVycm9yX3dpdGhfZGVjbCAoKm5vZGUsCgkJICAgICAg
ICJzZWN0aW9uIGF0dHJpYnV0ZXMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgdGFyZ2V0
Iik7CiAgICAgICpub19hZGRfYXR0cnMgPSB0cnVlOwogICAgfQoKICByZXR1cm4gTlVMTF9U
UkVFOwp9CgovKiBIYW5kbGUgYSAiYWxpZ25lZCIgYXR0cmlidXRlOyBhcmd1bWVudHMgYXMg
aW4KICAgc3RydWN0IGF0dHJpYnV0ZV9zcGVjLmhhbmRsZXIuICAqLwoKc3RhdGljIHRyZWUK
aGFuZGxlX2FsaWduZWRfYXR0cmlidXRlICh0cmVlICpub2RlLCB0cmVlIG5hbWUgQVRUUklC
VVRFX1VOVVNFRCwgdHJlZSBhcmdzLAoJCQkgIGludCBmbGFncywgYm9vbCAqbm9fYWRkX2F0
dHJzKQp7CiAgdHJlZSBkZWNsID0gTlVMTF9UUkVFOwogIHRyZWUgKnR5cGUgPSBOVUxMOwog
IGludCBpc190eXBlID0gMDsKICB0cmVlIGFsaWduX2V4cHIgPSAoYXJncyA/IFRSRUVfVkFM
VUUgKGFyZ3MpCgkJICAgICA6IHNpemVfaW50IChCSUdHRVNUX0FMSUdOTUVOVCAvIEJJVFNf
UEVSX1VOSVQpKTsKICBpbnQgaTsKCiAgaWYgKERFQ0xfUCAoKm5vZGUpKQogICAgewogICAg
ICBkZWNsID0gKm5vZGU7CiAgICAgIHR5cGUgPSAmVFJFRV9UWVBFIChkZWNsKTsKICAgICAg
aXNfdHlwZSA9IFRSRUVfQ09ERSAoKm5vZGUpID09IFRZUEVfREVDTDsKICAgIH0KICBlbHNl
IGlmIChUWVBFX1AgKCpub2RlKSkKICAgIHR5cGUgPSBub2RlLCBpc190eXBlID0gMTsKCiAg
LyogU3RyaXAgYW55IE5PUHMgb2YgYW55IGtpbmQuICAqLwogIHdoaWxlIChUUkVFX0NPREUg
KGFsaWduX2V4cHIpID09IE5PUF9FWFBSCgkgfHwgVFJFRV9DT0RFIChhbGlnbl9leHByKSA9
PSBDT05WRVJUX0VYUFIKCSB8fCBUUkVFX0NPREUgKGFsaWduX2V4cHIpID09IE5PTl9MVkFM
VUVfRVhQUikKICAgIGFsaWduX2V4cHIgPSBUUkVFX09QRVJBTkQgKGFsaWduX2V4cHIsIDAp
OwoKICBpZiAoVFJFRV9DT0RFIChhbGlnbl9leHByKSAhPSBJTlRFR0VSX0NTVCkKICAgIHsK
ICAgICAgZXJyb3IgKCJyZXF1ZXN0ZWQgYWxpZ25tZW50IGlzIG5vdCBhIGNvbnN0YW50Iik7
CiAgICAgICpub19hZGRfYXR0cnMgPSB0cnVlOwogICAgfQogIGVsc2UgaWYgKChpID0gdHJl
ZV9sb2cyIChhbGlnbl9leHByKSkgPT0gLTEpCiAgICB7CiAgICAgIGVycm9yICgicmVxdWVz
dGVkIGFsaWdubWVudCBpcyBub3QgYSBwb3dlciBvZiAyIik7CiAgICAgICpub19hZGRfYXR0
cnMgPSB0cnVlOwogICAgfQogIGVsc2UgaWYgKGkgPiBIT1NUX0JJVFNfUEVSX0lOVCAtIDIp
CiAgICB7CiAgICAgIGVycm9yICgicmVxdWVzdGVkIGFsaWdubWVudCBpcyB0b28gbGFyZ2Ui
KTsKICAgICAgKm5vX2FkZF9hdHRycyA9IHRydWU7CiAgICB9CiAgZWxzZSBpZiAoaXNfdHlw
ZSkKICAgIHsKICAgICAgLyogSWYgd2UgaGF2ZSBhIFRZUEVfREVDTCwgdGhlbiBjb3B5IHRo
ZSB0eXBlLCBzbyB0aGF0IHdlCgkgZG9uJ3QgYWNjaWRlbnRhbGx5IG1vZGlmeSBhIGJ1aWx0
aW4gdHlwZS4gIFNlZSBwdXNoZGVjbC4gICovCiAgICAgIGlmIChkZWNsICYmIFRSRUVfVFlQ
RSAoZGVjbCkgIT0gZXJyb3JfbWFya19ub2RlCgkgICYmIERFQ0xfT1JJR0lOQUxfVFlQRSAo
ZGVjbCkgPT0gTlVMTF9UUkVFKQoJewoJICB0cmVlIHR0ID0gVFJFRV9UWVBFIChkZWNsKTsK
CSAgKnR5cGUgPSBidWlsZF90eXBlX2NvcHkgKCp0eXBlKTsKCSAgREVDTF9PUklHSU5BTF9U
WVBFIChkZWNsKSA9IHR0OwoJICBUWVBFX05BTUUgKCp0eXBlKSA9IGRlY2w7CgkgIFRSRUVf
VVNFRCAoKnR5cGUpID0gVFJFRV9VU0VEIChkZWNsKTsKCSAgVFJFRV9UWVBFIChkZWNsKSA9
ICp0eXBlOwoJfQogICAgICBlbHNlIGlmICghKGZsYWdzICYgKGludCkgQVRUUl9GTEFHX1RZ
UEVfSU5fUExBQ0UpKQoJKnR5cGUgPSBidWlsZF90eXBlX2NvcHkgKCp0eXBlKTsKCiAgICAg
IFRZUEVfQUxJR04gKCp0eXBlKSA9ICgxIDw8IGkpICogQklUU19QRVJfVU5JVDsKICAgICAg
VFlQRV9VU0VSX0FMSUdOICgqdHlwZSkgPSAxOwogICAgfQogIGVsc2UgaWYgKFRSRUVfQ09E
RSAoZGVjbCkgIT0gVkFSX0RFQ0wKCSAgICYmIFRSRUVfQ09ERSAoZGVjbCkgIT0gRklFTERf
REVDTCkKICAgIHsKICAgICAgZXJyb3Jfd2l0aF9kZWNsIChkZWNsLAoJCSAgICAgICAiYWxp
Z25tZW50IG1heSBub3QgYmUgc3BlY2lmaWVkIGZvciBgJXMnIik7CiAgICAgICpub19hZGRf
YXR0cnMgPSB0cnVlOwogICAgfQogIGVsc2UKICAgIHsKICAgICAgREVDTF9BTElHTiAoZGVj
bCkgPSAoMSA8PCBpKSAqIEJJVFNfUEVSX1VOSVQ7CiAgICAgIERFQ0xfVVNFUl9BTElHTiAo
ZGVjbCkgPSAxOwogICAgfQoKICByZXR1cm4gTlVMTF9UUkVFOwp9CgovKiBIYW5kbGUgYSAi
d2VhayIgYXR0cmlidXRlOyBhcmd1bWVudHMgYXMgaW4KICAgc3RydWN0IGF0dHJpYnV0ZV9z
cGVjLmhhbmRsZXIuICAqLwoKc3RhdGljIHRyZWUKaGFuZGxlX3dlYWtfYXR0cmlidXRlICh0
cmVlICpub2RlLCB0cmVlIG5hbWUgQVRUUklCVVRFX1VOVVNFRCwKCQkgICAgICAgdHJlZSBh
cmdzIEFUVFJJQlVURV9VTlVTRUQsCgkJICAgICAgIGludCBmbGFncyBBVFRSSUJVVEVfVU5V
U0VELAoJCSAgICAgICBib29sICpub19hZGRfYXR0cnMgQVRUUklCVVRFX1VOVVNFRCkKewog
IGRlY2xhcmVfd2VhayAoKm5vZGUpOwoKICByZXR1cm4gTlVMTF9UUkVFOwp9CgovKiBIYW5k
bGUgYW4gImFsaWFzIiBhdHRyaWJ1dGU7IGFyZ3VtZW50cyBhcyBpbgogICBzdHJ1Y3QgYXR0
cmlidXRlX3NwZWMuaGFuZGxlci4gICovCgpzdGF0aWMgdHJlZQpoYW5kbGVfYWxpYXNfYXR0
cmlidXRlICh0cmVlICpub2RlLCB0cmVlIG5hbWUsIHRyZWUgYXJncywKCQkJaW50IGZsYWdz
IEFUVFJJQlVURV9VTlVTRUQsIGJvb2wgKm5vX2FkZF9hdHRycykKewogIHRyZWUgZGVjbCA9
ICpub2RlOwoKICBpZiAoKFRSRUVfQ09ERSAoZGVjbCkgPT0gRlVOQ1RJT05fREVDTCAmJiBE
RUNMX0lOSVRJQUwgKGRlY2wpKQogICAgICB8fCAoVFJFRV9DT0RFIChkZWNsKSAhPSBGVU5D
VElPTl9ERUNMICYmICEgREVDTF9FWFRFUk5BTCAoZGVjbCkpKQogICAgewogICAgICBlcnJv
cl93aXRoX2RlY2wgKGRlY2wsCgkJICAgICAgICJgJXMnIGRlZmluZWQgYm90aCBub3JtYWxs
eSBhbmQgYXMgYW4gYWxpYXMiKTsKICAgICAgKm5vX2FkZF9hdHRycyA9IHRydWU7CiAgICB9
CiAgZWxzZSBpZiAoZGVjbF9mdW5jdGlvbl9jb250ZXh0IChkZWNsKSA9PSAwKQogICAgewog
ICAgICB0cmVlIGlkOwoKICAgICAgaWQgPSBUUkVFX1ZBTFVFIChhcmdzKTsKICAgICAgaWYg
KFRSRUVfQ09ERSAoaWQpICE9IFNUUklOR19DU1QpCgl7CgkgIGVycm9yICgiYWxpYXMgYXJn
IG5vdCBhIHN0cmluZyIpOwoJICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKCSAgcmV0dXJuIE5V
TExfVFJFRTsKCX0KICAgICAgaWQgPSBnZXRfaWRlbnRpZmllciAoVFJFRV9TVFJJTkdfUE9J
TlRFUiAoaWQpKTsKICAgICAgLyogVGhpcyBjb3VudHMgYXMgYSB1c2Ugb2YgdGhlIG9iamVj
dCBwb2ludGVkIHRvLiAgKi8KICAgICAgVFJFRV9VU0VEIChpZCkgPSAxOwoKICAgICAgaWYg
KFRSRUVfQ09ERSAoZGVjbCkgPT0gRlVOQ1RJT05fREVDTCkKCURFQ0xfSU5JVElBTCAoZGVj
bCkgPSBlcnJvcl9tYXJrX25vZGU7CiAgICAgIGVsc2UKCURFQ0xfRVhURVJOQUwgKGRlY2wp
ID0gMDsKICAgIH0KICBlbHNlCiAgICB7CiAgICAgIHdhcm5pbmcgKCJgJXMnIGF0dHJpYnV0
ZSBpZ25vcmVkIiwgSURFTlRJRklFUl9QT0lOVEVSIChuYW1lKSk7CiAgICAgICpub19hZGRf
YXR0cnMgPSB0cnVlOwogICAgfQoKICByZXR1cm4gTlVMTF9UUkVFOwp9CgovKiBIYW5kbGUg
YW4gInZpc2liaWxpdHkiIGF0dHJpYnV0ZTsgYXJndW1lbnRzIGFzIGluCiAgIHN0cnVjdCBh
dHRyaWJ1dGVfc3BlYy5oYW5kbGVyLiAgKi8KCnN0YXRpYyB0cmVlCmhhbmRsZV92aXNpYmls
aXR5X2F0dHJpYnV0ZSAodHJlZSAqbm9kZSwgdHJlZSBuYW1lLCB0cmVlIGFyZ3MsCgkJCSAg
ICAgaW50IGZsYWdzIEFUVFJJQlVURV9VTlVTRUQsCgkJCSAgICAgYm9vbCAqbm9fYWRkX2F0
dHJzKQp7CiAgdHJlZSBkZWNsID0gKm5vZGU7CgogIGlmIChkZWNsX2Z1bmN0aW9uX2NvbnRl
eHQgKGRlY2wpICE9IDAgfHwgISBUUkVFX1BVQkxJQyAoZGVjbCkpCiAgICB7CiAgICAgIHdh
cm5pbmcgKCJgJXMnIGF0dHJpYnV0ZSBpZ25vcmVkIiwgSURFTlRJRklFUl9QT0lOVEVSIChu
YW1lKSk7CiAgICAgICpub19hZGRfYXR0cnMgPSB0cnVlOwogICAgfQogIGVsc2UKICAgIHsK
ICAgICAgdHJlZSBpZDsKCiAgICAgIGlkID0gVFJFRV9WQUxVRSAoYXJncyk7CiAgICAgIGlm
IChUUkVFX0NPREUgKGlkKSAhPSBTVFJJTkdfQ1NUKQoJewoJICBlcnJvciAoInZpc2liaWxp
dHkgYXJnIG5vdCBhIHN0cmluZyIpOwoJICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKCSAgcmV0
dXJuIE5VTExfVFJFRTsKCX0KICAgICAgaWYgKHN0cmNtcCAoVFJFRV9TVFJJTkdfUE9JTlRF
UiAoaWQpLCAiaGlkZGVuIikKCSAgJiYgc3RyY21wIChUUkVFX1NUUklOR19QT0lOVEVSIChp
ZCksICJwcm90ZWN0ZWQiKQoJICAmJiBzdHJjbXAgKFRSRUVfU1RSSU5HX1BPSU5URVIgKGlk
KSwgImludGVybmFsIikKCSAgJiYgc3RyY21wIChUUkVFX1NUUklOR19QT0lOVEVSIChpZCks
ICJkZWZhdWx0IikpCgl7CgkgIGVycm9yICgidmlzaWJpbGl0eSBhcmcgbXVzdCBiZSBvbmUg
b2YgXCJkZWZhdWx0XCIsIFwiaGlkZGVuXCIsIFwicHJvdGVjdGVkXCIgb3IgXCJpbnRlcm5h
bFwiIik7CgkgICpub19hZGRfYXR0cnMgPSB0cnVlOwoJICByZXR1cm4gTlVMTF9UUkVFOwoJ
fQogICAgfQoKICByZXR1cm4gTlVMTF9UUkVFOwp9CgovKiBIYW5kbGUgYW4gInRsc19tb2Rl
bCIgYXR0cmlidXRlOyBhcmd1bWVudHMgYXMgaW4KICAgc3RydWN0IGF0dHJpYnV0ZV9zcGVj
LmhhbmRsZXIuICAqLwoKc3RhdGljIHRyZWUKaGFuZGxlX3Rsc19tb2RlbF9hdHRyaWJ1dGUg
KHRyZWUgKm5vZGUsIHRyZWUgbmFtZSwgdHJlZSBhcmdzLAoJCQkgICAgaW50IGZsYWdzIEFU
VFJJQlVURV9VTlVTRUQsIGJvb2wgKm5vX2FkZF9hdHRycykKewogIHRyZWUgZGVjbCA9ICpu
b2RlOwoKICBpZiAoISBERUNMX1RIUkVBRF9MT0NBTCAoZGVjbCkpCiAgICB7CiAgICAgIHdh
cm5pbmcgKCJgJXMnIGF0dHJpYnV0ZSBpZ25vcmVkIiwgSURFTlRJRklFUl9QT0lOVEVSIChu
YW1lKSk7CiAgICAgICpub19hZGRfYXR0cnMgPSB0cnVlOwogICAgfQogIGVsc2UKICAgIHsK
ICAgICAgdHJlZSBpZDsKCiAgICAgIGlkID0gVFJFRV9WQUxVRSAoYXJncyk7CiAgICAgIGlm
IChUUkVFX0NPREUgKGlkKSAhPSBTVFJJTkdfQ1NUKQoJewoJICBlcnJvciAoInRsc19tb2Rl
bCBhcmcgbm90IGEgc3RyaW5nIik7CgkgICpub19hZGRfYXR0cnMgPSB0cnVlOwoJICByZXR1
cm4gTlVMTF9UUkVFOwoJfQogICAgICBpZiAoc3RyY21wIChUUkVFX1NUUklOR19QT0lOVEVS
IChpZCksICJsb2NhbC1leGVjIikKCSAgJiYgc3RyY21wIChUUkVFX1NUUklOR19QT0lOVEVS
IChpZCksICJpbml0aWFsLWV4ZWMiKQoJICAmJiBzdHJjbXAgKFRSRUVfU1RSSU5HX1BPSU5U
RVIgKGlkKSwgImxvY2FsLWR5bmFtaWMiKQoJICAmJiBzdHJjbXAgKFRSRUVfU1RSSU5HX1BP
SU5URVIgKGlkKSwgImdsb2JhbC1keW5hbWljIikpCgl7CgkgIGVycm9yICgidGxzX21vZGVs
IGFyZyBtdXN0IGJlIG9uZSBvZiBcImxvY2FsLWV4ZWNcIiwgXCJpbml0aWFsLWV4ZWNcIiwg
XCJsb2NhbC1keW5hbWljXCIgb3IgXCJnbG9iYWwtZHluYW1pY1wiIik7CgkgICpub19hZGRf
YXR0cnMgPSB0cnVlOwoJICByZXR1cm4gTlVMTF9UUkVFOwoJfQogICAgfQoKICByZXR1cm4g
TlVMTF9UUkVFOwp9CgovKiBIYW5kbGUgYSAibm9faW5zdHJ1bWVudF9mdW5jdGlvbiIgYXR0
cmlidXRlOyBhcmd1bWVudHMgYXMgaW4KICAgc3RydWN0IGF0dHJpYnV0ZV9zcGVjLmhhbmRs
ZXIuICAqLwoKc3RhdGljIHRyZWUKaGFuZGxlX25vX2luc3RydW1lbnRfZnVuY3Rpb25fYXR0
cmlidXRlICh0cmVlICpub2RlLCB0cmVlIG5hbWUsCgkJCQkJIHRyZWUgYXJncyBBVFRSSUJV
VEVfVU5VU0VELAoJCQkJCSBpbnQgZmxhZ3MgQVRUUklCVVRFX1VOVVNFRCwKCQkJCQkgYm9v
bCAqbm9fYWRkX2F0dHJzKQp7CiAgdHJlZSBkZWNsID0gKm5vZGU7CgogIGlmIChUUkVFX0NP
REUgKGRlY2wpICE9IEZVTkNUSU9OX0RFQ0wpCiAgICB7CiAgICAgIGVycm9yX3dpdGhfZGVj
bCAoZGVjbCwKCQkgICAgICAgImAlcycgYXR0cmlidXRlIGFwcGxpZXMgb25seSB0byBmdW5j
dGlvbnMiLAoJCSAgICAgICBJREVOVElGSUVSX1BPSU5URVIgKG5hbWUpKTsKICAgICAgKm5v
X2FkZF9hdHRycyA9IHRydWU7CiAgICB9CiAgZWxzZSBpZiAoREVDTF9JTklUSUFMIChkZWNs
KSkKICAgIHsKICAgICAgZXJyb3Jfd2l0aF9kZWNsIChkZWNsLAoJCSAgICAgICAiY2FuJ3Qg
c2V0IGAlcycgYXR0cmlidXRlIGFmdGVyIGRlZmluaXRpb24iLAoJCSAgICAgICBJREVOVElG
SUVSX1BPSU5URVIgKG5hbWUpKTsKICAgICAgKm5vX2FkZF9hdHRycyA9IHRydWU7CiAgICB9
CiAgZWxzZQogICAgREVDTF9OT19JTlNUUlVNRU5UX0ZVTkNUSU9OX0VOVFJZX0VYSVQgKGRl
Y2wpID0gMTsKCiAgcmV0dXJuIE5VTExfVFJFRTsKfQoKLyogSGFuZGxlIGEgIm1hbGxvYyIg
YXR0cmlidXRlOyBhcmd1bWVudHMgYXMgaW4KICAgc3RydWN0IGF0dHJpYnV0ZV9zcGVjLmhh
bmRsZXIuICAqLwoKc3RhdGljIHRyZWUKaGFuZGxlX21hbGxvY19hdHRyaWJ1dGUgKHRyZWUg
Km5vZGUsIHRyZWUgbmFtZSwgdHJlZSBhcmdzIEFUVFJJQlVURV9VTlVTRUQsCgkJCSBpbnQg
ZmxhZ3MgQVRUUklCVVRFX1VOVVNFRCwgYm9vbCAqbm9fYWRkX2F0dHJzKQp7CiAgaWYgKFRS
RUVfQ09ERSAoKm5vZGUpID09IEZVTkNUSU9OX0RFQ0wpCiAgICBERUNMX0lTX01BTExPQyAo
Km5vZGUpID0gMTsKICAvKiA/Pz8gVE9ETzogU3VwcG9ydCB0eXBlcy4gICovCiAgZWxzZQog
ICAgewogICAgICB3YXJuaW5nICgiYCVzJyBhdHRyaWJ1dGUgaWdub3JlZCIsIElERU5USUZJ
RVJfUE9JTlRFUiAobmFtZSkpOwogICAgICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKICAgIH0K
CiAgcmV0dXJuIE5VTExfVFJFRTsKfQoKLyogSGFuZGxlIGEgIm5vX2xpbWl0X3N0YWNrIiBh
dHRyaWJ1dGU7IGFyZ3VtZW50cyBhcyBpbgogICBzdHJ1Y3QgYXR0cmlidXRlX3NwZWMuaGFu
ZGxlci4gICovCgpzdGF0aWMgdHJlZQpoYW5kbGVfbm9fbGltaXRfc3RhY2tfYXR0cmlidXRl
ICh0cmVlICpub2RlLCB0cmVlIG5hbWUsCgkJCQkgdHJlZSBhcmdzIEFUVFJJQlVURV9VTlVT
RUQsCgkJCQkgaW50IGZsYWdzIEFUVFJJQlVURV9VTlVTRUQsCgkJCQkgYm9vbCAqbm9fYWRk
X2F0dHJzKQp7CiAgdHJlZSBkZWNsID0gKm5vZGU7CgogIGlmIChUUkVFX0NPREUgKGRlY2wp
ICE9IEZVTkNUSU9OX0RFQ0wpCiAgICB7CiAgICAgIGVycm9yX3dpdGhfZGVjbCAoZGVjbCwK
CQkgICAgICAgImAlcycgYXR0cmlidXRlIGFwcGxpZXMgb25seSB0byBmdW5jdGlvbnMiLAoJ
CSAgICAgICBJREVOVElGSUVSX1BPSU5URVIgKG5hbWUpKTsKICAgICAgKm5vX2FkZF9hdHRy
cyA9IHRydWU7CiAgICB9CiAgZWxzZSBpZiAoREVDTF9JTklUSUFMIChkZWNsKSkKICAgIHsK
ICAgICAgZXJyb3Jfd2l0aF9kZWNsIChkZWNsLAoJCSAgICAgICAiY2FuJ3Qgc2V0IGAlcycg
YXR0cmlidXRlIGFmdGVyIGRlZmluaXRpb24iLAoJCSAgICAgICBJREVOVElGSUVSX1BPSU5U
RVIgKG5hbWUpKTsKICAgICAgKm5vX2FkZF9hdHRycyA9IHRydWU7CiAgICB9CiAgZWxzZQog
ICAgREVDTF9OT19MSU1JVF9TVEFDSyAoZGVjbCkgPSAxOwoKICByZXR1cm4gTlVMTF9UUkVF
Owp9CgovKiBIYW5kbGUgYSAicHVyZSIgYXR0cmlidXRlOyBhcmd1bWVudHMgYXMgaW4KICAg
c3RydWN0IGF0dHJpYnV0ZV9zcGVjLmhhbmRsZXIuICAqLwoKc3RhdGljIHRyZWUKaGFuZGxl
X3B1cmVfYXR0cmlidXRlICh0cmVlICpub2RlLCB0cmVlIG5hbWUsIHRyZWUgYXJncyBBVFRS
SUJVVEVfVU5VU0VELAoJCSAgICAgICBpbnQgZmxhZ3MgQVRUUklCVVRFX1VOVVNFRCwgYm9v
bCAqbm9fYWRkX2F0dHJzKQp7CiAgaWYgKFRSRUVfQ09ERSAoKm5vZGUpID09IEZVTkNUSU9O
X0RFQ0wpCiAgICBERUNMX0lTX1BVUkUgKCpub2RlKSA9IDE7CiAgLyogPz8/IFRPRE86IFN1
cHBvcnQgdHlwZXMuICAqLwogIGVsc2UKICAgIHsKICAgICAgd2FybmluZyAoImAlcycgYXR0
cmlidXRlIGlnbm9yZWQiLCBJREVOVElGSUVSX1BPSU5URVIgKG5hbWUpKTsKICAgICAgKm5v
X2FkZF9hdHRycyA9IHRydWU7CiAgICB9CgogIHJldHVybiBOVUxMX1RSRUU7Cn0KCi8qIEhh
bmRsZSBhICJkZXByZWNhdGVkIiBhdHRyaWJ1dGU7IGFyZ3VtZW50cyBhcyBpbgogICBzdHJ1
Y3QgYXR0cmlidXRlX3NwZWMuaGFuZGxlci4gICovCgpzdGF0aWMgdHJlZQpoYW5kbGVfZGVw
cmVjYXRlZF9hdHRyaWJ1dGUgKHRyZWUgKm5vZGUsIHRyZWUgbmFtZSwKCQkJICAgICB0cmVl
IGFyZ3MgQVRUUklCVVRFX1VOVVNFRCwgaW50IGZsYWdzLAoJCQkgICAgIGJvb2wgKm5vX2Fk
ZF9hdHRycykKewogIHRyZWUgdHlwZSA9IE5VTExfVFJFRTsKICBpbnQgd2FybiA9IDA7CiAg
Y29uc3QgY2hhciAqd2hhdCA9IE5VTEw7CgogIGlmIChERUNMX1AgKCpub2RlKSkKICAgIHsK
ICAgICAgdHJlZSBkZWNsID0gKm5vZGU7CiAgICAgIHR5cGUgPSBUUkVFX1RZUEUgKGRlY2wp
OwoKICAgICAgaWYgKFRSRUVfQ09ERSAoZGVjbCkgPT0gVFlQRV9ERUNMCgkgIHx8IFRSRUVf
Q09ERSAoZGVjbCkgPT0gUEFSTV9ERUNMCgkgIHx8IFRSRUVfQ09ERSAoZGVjbCkgPT0gVkFS
X0RFQ0wKCSAgfHwgVFJFRV9DT0RFIChkZWNsKSA9PSBGVU5DVElPTl9ERUNMCgkgIHx8IFRS
RUVfQ09ERSAoZGVjbCkgPT0gRklFTERfREVDTCkKCVRSRUVfREVQUkVDQVRFRCAoZGVjbCkg
PSAxOwogICAgICBlbHNlCgl3YXJuID0gMTsKICAgIH0KICBlbHNlIGlmIChUWVBFX1AgKCpu
b2RlKSkKICAgIHsKICAgICAgaWYgKCEoZmxhZ3MgJiAoaW50KSBBVFRSX0ZMQUdfVFlQRV9J
Tl9QTEFDRSkpCgkqbm9kZSA9IGJ1aWxkX3R5cGVfY29weSAoKm5vZGUpOwogICAgICBUUkVF
X0RFUFJFQ0FURUQgKCpub2RlKSA9IDE7CiAgICAgIHR5cGUgPSAqbm9kZTsKICAgIH0KICBl
bHNlCiAgICB3YXJuID0gMTsKCiAgaWYgKHdhcm4pCiAgICB7CiAgICAgICpub19hZGRfYXR0
cnMgPSB0cnVlOwogICAgICBpZiAodHlwZSAmJiBUWVBFX05BTUUgKHR5cGUpKQoJewoJICBp
ZiAoVFJFRV9DT0RFIChUWVBFX05BTUUgKHR5cGUpKSA9PSBJREVOVElGSUVSX05PREUpCgkg
ICAgd2hhdCA9IElERU5USUZJRVJfUE9JTlRFUiAoVFlQRV9OQU1FICgqbm9kZSkpOwoJICBl
bHNlIGlmIChUUkVFX0NPREUgKFRZUEVfTkFNRSAodHlwZSkpID09IFRZUEVfREVDTAoJCSAg
ICYmIERFQ0xfTkFNRSAoVFlQRV9OQU1FICh0eXBlKSkpCgkgICAgd2hhdCA9IElERU5USUZJ
RVJfUE9JTlRFUiAoREVDTF9OQU1FIChUWVBFX05BTUUgKHR5cGUpKSk7Cgl9CiAgICAgIGlm
ICh3aGF0KQoJd2FybmluZyAoImAlcycgYXR0cmlidXRlIGlnbm9yZWQgZm9yIGAlcyciLAoJ
CSAgSURFTlRJRklFUl9QT0lOVEVSIChuYW1lKSwgd2hhdCk7CiAgICAgIGVsc2UKCXdhcm5p
bmcgKCJgJXMnIGF0dHJpYnV0ZSBpZ25vcmVkIiwKCQkgICAgICBJREVOVElGSUVSX1BPSU5U
RVIgKG5hbWUpKTsKICAgIH0KCiAgcmV0dXJuIE5VTExfVFJFRTsKfQoKLyogS2VlcCBhIGxp
c3Qgb2YgdmVjdG9yIHR5cGUgbm9kZXMgd2UgY3JlYXRlZCBpbiBoYW5kbGVfdmVjdG9yX3Np
emVfYXR0cmlidXRlLAogICB0byBwcmV2ZW50IHVzIGZyb20gZHVwbGljYXRpbmcgdHlwZSBu
b2RlcyB1bm5lY2Vzc2FyaWx5LgogICBUaGUgbm9ybWFsIG1lY2hhbmlzbSB0byBwcmV2ZW50
IGR1cGxpY2F0ZXMgaXMgdG8gdXNlIHR5cGVfaGFzaF9jYW5vbiwgYnV0CiAgIHNpbmNlIHdl
IHdhbnQgdG8gZGlzdGluZ3Vpc2ggdHlwZXMgdGhhdCBhcmUgZXNzZW50aWFsbHkgaWRlbnRp
Y2FsIChleGNlcHQKICAgZm9yIHRoZWlyIGRlYnVnIHJlcHJlc2VudGF0aW9uKSwgd2UgdXNl
IGEgbG9jYWwgbGlzdCBoZXJlLiAgKi8Kc3RhdGljIEdUWSgoKSkgdHJlZSB2ZWN0b3JfdHlw
ZV9ub2RlX2xpc3QgPSAwOwoKLyogSGFuZGxlIGEgInZlY3Rvcl9zaXplIiBhdHRyaWJ1dGU7
IGFyZ3VtZW50cyBhcyBpbgogICBzdHJ1Y3QgYXR0cmlidXRlX3NwZWMuaGFuZGxlci4gICov
CgpzdGF0aWMgdHJlZQpoYW5kbGVfdmVjdG9yX3NpemVfYXR0cmlidXRlICh0cmVlICpub2Rl
LCB0cmVlIG5hbWUsIHRyZWUgYXJncywKCQkJICAgICAgaW50IGZsYWdzIEFUVFJJQlVURV9V
TlVTRUQsCgkJCSAgICAgIGJvb2wgKm5vX2FkZF9hdHRycykKewogIHVuc2lnbmVkIEhPU1Rf
V0lERV9JTlQgdmVjc2l6ZSwgbnVuaXRzOwogIGVudW0gbWFjaGluZV9tb2RlIG1vZGUsIG9y
aWdfbW9kZSwgbmV3X21vZGU7CiAgdHJlZSB0eXBlID0gKm5vZGUsIG5ld190eXBlID0gTlVM
TF9UUkVFOwogIHRyZWUgdHlwZV9saXN0X25vZGU7CgogICpub19hZGRfYXR0cnMgPSB0cnVl
OwoKICBpZiAoISBob3N0X2ludGVnZXJwIChUUkVFX1ZBTFVFIChhcmdzKSwgMSkpCiAgICB7
CiAgICAgIHdhcm5pbmcgKCJgJXMnIGF0dHJpYnV0ZSBpZ25vcmVkIiwgSURFTlRJRklFUl9Q
T0lOVEVSIChuYW1lKSk7CiAgICAgIHJldHVybiBOVUxMX1RSRUU7CiAgICB9CgogIC8qIEdl
dCB0aGUgdmVjdG9yIHNpemUgKGluIGJ5dGVzKS4gICovCiAgdmVjc2l6ZSA9IHRyZWVfbG93
X2NzdCAoVFJFRV9WQUxVRSAoYXJncyksIDEpOwoKICAvKiBXZSBuZWVkIHRvIHByb3ZpZGUg
Zm9yIHZlY3RvciBwb2ludGVycywgdmVjdG9yIGFycmF5cywgYW5kCiAgICAgZnVuY3Rpb25z
IHJldHVybmluZyB2ZWN0b3JzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgX19hdHRyaWJ1dGVf
XygodmVjdG9yX3NpemUoMTYpKSkgc2hvcnQgKmZvbzsKCiAgICAgSW4gdGhpcyBjYXNlLCB0
aGUgbW9kZSBpcyBTSSwgYnV0IHRoZSB0eXBlIGJlaW5nIG1vZGlmaWVkIGlzCiAgICAgSEks
IHNvIHdlIG5lZWQgdG8gbG9vayBmdXJ0aGVyLiAgKi8KCiAgd2hpbGUgKFBPSU5URVJfVFlQ
RV9QICh0eXBlKQoJIHx8IFRSRUVfQ09ERSAodHlwZSkgPT0gRlVOQ1RJT05fVFlQRQoJIHx8
IFRSRUVfQ09ERSAodHlwZSkgPT0gQVJSQVlfVFlQRSkKICAgIHR5cGUgPSBUUkVFX1RZUEUg
KHR5cGUpOwoKICAvKiBHZXQgdGhlIG1vZGUgb2YgdGhlIHR5cGUgYmVpbmcgbW9kaWZpZWQu
ICAqLwogIG9yaWdfbW9kZSA9IFRZUEVfTU9ERSAodHlwZSk7CgogIGlmIChUUkVFX0NPREUg
KHR5cGUpID09IFJFQ09SRF9UWVBFCiAgICAgIHx8IChHRVRfTU9ERV9DTEFTUyAob3JpZ19t
b2RlKSAhPSBNT0RFX0ZMT0FUCgkgICYmIEdFVF9NT0RFX0NMQVNTIChvcmlnX21vZGUpICE9
IE1PREVfSU5UKQogICAgICB8fCAhIGhvc3RfaW50ZWdlcnAgKFRZUEVfU0laRV9VTklUICh0
eXBlKSwgMSkpCiAgICB7CiAgICAgIGVycm9yICgiaW52YWxpZCB2ZWN0b3IgdHlwZSBmb3Ig
YXR0cmlidXRlIGAlcyciLAoJICAgICBJREVOVElGSUVSX1BPSU5URVIgKG5hbWUpKTsKICAg
ICAgcmV0dXJuIE5VTExfVFJFRTsKICAgIH0KCiAgLyogQ2FsY3VsYXRlIGhvdyBtYW55IHVu
aXRzIGZpdCBpbiB0aGUgdmVjdG9yLiAgKi8KICBudW5pdHMgPSB2ZWNzaXplIC8gdHJlZV9s
b3dfY3N0IChUWVBFX1NJWkVfVU5JVCAodHlwZSksIDEpOwoKICAvKiBGaW5kIGEgc3VpdGFi
bHkgc2l6ZWQgdmVjdG9yLiAgKi8KICBuZXdfbW9kZSA9IFZPSURtb2RlOwogIGZvciAobW9k
ZSA9IEdFVF9DTEFTU19OQVJST1dFU1RfTU9ERSAoR0VUX01PREVfQ0xBU1MgKG9yaWdfbW9k
ZSkgPT0gTU9ERV9JTlQKCQkJCQk/IE1PREVfVkVDVE9SX0lOVAoJCQkJCTogTU9ERV9WRUNU
T1JfRkxPQVQpOwogICAgICAgbW9kZSAhPSBWT0lEbW9kZTsKICAgICAgIG1vZGUgPSBHRVRf
TU9ERV9XSURFUl9NT0RFIChtb2RlKSkKICAgIGlmICh2ZWNzaXplID09IEdFVF9NT0RFX1NJ
WkUgKG1vZGUpCgkmJiBudW5pdHMgPT0gKHVuc2lnbmVkIEhPU1RfV0lERV9JTlQpIEdFVF9N
T0RFX05VTklUUyAobW9kZSkpCiAgICAgIHsKCW5ld19tb2RlID0gbW9kZTsKCWJyZWFrOwog
ICAgICB9CgogICAgaWYgKG5ld19tb2RlID09IFZPSURtb2RlKQogICAgewogICAgICBlcnJv
ciAoIm5vIHZlY3RvciBtb2RlIHdpdGggdGhlIHNpemUgYW5kIHR5cGUgc3BlY2lmaWVkIGNv
dWxkIGJlIGZvdW5kIik7CiAgICAgIHJldHVybiBOVUxMX1RSRUU7CiAgICB9CgogIGZvciAo
dHlwZV9saXN0X25vZGUgPSB2ZWN0b3JfdHlwZV9ub2RlX2xpc3Q7IHR5cGVfbGlzdF9ub2Rl
OwogICAgICAgdHlwZV9saXN0X25vZGUgPSBUUkVFX0NIQUlOICh0eXBlX2xpc3Rfbm9kZSkp
CiAgICB7CiAgICAgIHRyZWUgb3RoZXJfdHlwZSA9IFRSRUVfVkFMVUUgKHR5cGVfbGlzdF9u
b2RlKTsKICAgICAgdHJlZSByZWNvcmQgPSBUWVBFX0RFQlVHX1JFUFJFU0VOVEFUSU9OX1RZ
UEUgKG90aGVyX3R5cGUpOwogICAgICB0cmVlIGZpZWxkcyA9IFRZUEVfRklFTERTIChyZWNv
cmQpOwogICAgICB0cmVlIGZpZWxkX3R5cGUgPSBUUkVFX1RZUEUgKGZpZWxkcyk7CiAgICAg
IHRyZWUgYXJyYXlfdHlwZSA9IFRSRUVfVFlQRSAoZmllbGRfdHlwZSk7CiAgICAgIGlmIChU
UkVFX0NPREUgKGZpZWxkcykgIT0gRklFTERfREVDTAoJICB8fCBUUkVFX0NPREUgKGZpZWxk
X3R5cGUpICE9IEFSUkFZX1RZUEUpCglhYm9ydCAoKTsKCiAgICAgIGlmIChUWVBFX01PREUg
KG90aGVyX3R5cGUpID09IG1vZGUgJiYgdHlwZSA9PSBhcnJheV90eXBlKQoJewoJICBuZXdf
dHlwZSA9IG90aGVyX3R5cGU7CgkgIGJyZWFrOwoJfQogICAgfQoKICBpZiAobmV3X3R5cGUg
PT0gTlVMTF9UUkVFKQogICAgewogICAgICB0cmVlIGluZGV4LCBhcnJheSwgcnQsIGxpc3Rf
bm9kZTsKCiAgICAgIG5ld190eXBlID0gKCpsYW5nX2hvb2tzLnR5cGVzLnR5cGVfZm9yX21v
ZGUpIChuZXdfbW9kZSwKCQkJCQkJICAgIFRSRUVfVU5TSUdORUQgKHR5cGUpKTsKCiAgICAg
IGlmICghbmV3X3R5cGUpCgl7CgkgIGVycm9yICgibm8gdmVjdG9yIG1vZGUgd2l0aCB0aGUg
c2l6ZSBhbmQgdHlwZSBzcGVjaWZpZWQgY291bGQgYmUgZm91bmQiKTsKCSAgcmV0dXJuIE5V
TExfVFJFRTsKCX0KCiAgICAgIG5ld190eXBlID0gYnVpbGRfdHlwZV9jb3B5IChuZXdfdHlw
ZSk7CgogICAgICAvKiBJZiB0aGlzIGlzIGEgdmVjdG9yLCBtYWtlIHN1cmUgd2UgZWl0aGVy
IGhhdmUgaGFyZHdhcmUKICAgICAgICAgc3VwcG9ydCwgb3Igd2UgY2FuIGVtdWxhdGUgaXQu
ICAqLwogICAgICBpZiAoKEdFVF9NT0RFX0NMQVNTIChtb2RlKSA9PSBNT0RFX1ZFQ1RPUl9J
TlQKCSAgIHx8IEdFVF9NT0RFX0NMQVNTIChtb2RlKSA9PSBNT0RFX1ZFQ1RPUl9GTE9BVCkK
CSAgJiYgIXZlY3Rvcl9tb2RlX3ZhbGlkX3AgKG1vZGUpKQoJewoJICBlcnJvciAoInVuYWJs
ZSB0byBlbXVsYXRlICclcyciLCBHRVRfTU9ERV9OQU1FIChtb2RlKSk7CgkgIHJldHVybiBO
VUxMX1RSRUU7Cgl9CgogICAgICAvKiBTZXQgdGhlIGRlYnVnIGluZm9ybWF0aW9uIGhlcmUs
IGJlY2F1c2UgdGhpcyBpcyB0aGUgb25seQoJIHBsYWNlIHdoZXJlIHdlIGtub3cgdGhlIHVu
ZGVybHlpbmcgdHlwZSBmb3IgYSB2ZWN0b3IgbWFkZQoJIHdpdGggdmVjdG9yX3NpemUuICBG
b3IgZGVidWdnaW5nIHB1cnBvc2VzIHdlIHByZXRlbmQgYSB2ZWN0b3IKCSBpcyBhbiBhcnJh
eSB3aXRoaW4gYSBzdHJ1Y3R1cmUuICAqLwogICAgICBpbmRleCA9IGJ1aWxkX2ludF8yIChU
WVBFX1ZFQ1RPUl9TVUJQQVJUUyAobmV3X3R5cGUpIC0gMSwgMCk7CiAgICAgIGFycmF5ID0g
YnVpbGRfYXJyYXlfdHlwZSAodHlwZSwgYnVpbGRfaW5kZXhfdHlwZSAoaW5kZXgpKTsKICAg
ICAgcnQgPSBtYWtlX25vZGUgKFJFQ09SRF9UWVBFKTsKCiAgICAgIFRZUEVfRklFTERTIChy
dCkgPSBidWlsZF9kZWNsIChGSUVMRF9ERUNMLCBnZXRfaWRlbnRpZmllciAoImYiKSwgYXJy
YXkpOwogICAgICBERUNMX0NPTlRFWFQgKFRZUEVfRklFTERTIChydCkpID0gcnQ7CiAgICAg
IGxheW91dF90eXBlIChydCk7CiAgICAgIFRZUEVfREVCVUdfUkVQUkVTRU5UQVRJT05fVFlQ
RSAobmV3X3R5cGUpID0gcnQ7CgogICAgICBsaXN0X25vZGUgPSBidWlsZF90cmVlX2xpc3Qg
KE5VTEwsIG5ld190eXBlKTsKICAgICAgVFJFRV9DSEFJTiAobGlzdF9ub2RlKSA9IHZlY3Rv
cl90eXBlX25vZGVfbGlzdDsKICAgICAgdmVjdG9yX3R5cGVfbm9kZV9saXN0ID0gbGlzdF9u
b2RlOwogICAgfQoKICAvKiBCdWlsZCBiYWNrIHBvaW50ZXJzIGlmIG5lZWRlZC4gICovCiAg
Km5vZGUgPSB2ZWN0b3Jfc2l6ZV9oZWxwZXIgKCpub2RlLCBuZXdfdHlwZSk7CgogIHJldHVy
biBOVUxMX1RSRUU7Cn0KCi8qIEhBQ0suICBHUk9TUy4gIFRoaXMgaXMgYWJzb2x1dGVseSBk
aXNndXN0aW5nLiAgSSB3aXNoIHRoZXJlIHdhcyBhCiAgIGJldHRlciB3YXkuCgogICBJZiB3
ZSByZXF1ZXN0ZWQgYSBwb2ludGVyIHRvIGEgdmVjdG9yLCBidWlsZCB1cCB0aGUgcG9pbnRl
cnMgdGhhdAogICB3ZSBzdHJpcHBlZCBvZmYgd2hpbGUgbG9va2luZyBmb3IgdGhlIGlubmVy
IHR5cGUuICBTaW1pbGFybHkgZm9yCiAgIHJldHVybiB2YWx1ZXMgZnJvbSBmdW5jdGlvbnMu
CgogICBUaGUgYXJndW1lbnQgInR5cGUiIGlzIHRoZSB0b3Agb2YgdGhlIGNoYWluLCBhbmQg
ImJvdHRvbSIgaXMgdGhlCiAgIG5ldyB0eXBlIHdoaWNoIHdlIHdpbGwgcG9pbnQgdG8uICAq
LwoKc3RhdGljIHRyZWUKdmVjdG9yX3NpemVfaGVscGVyICh0cmVlIHR5cGUsIHRyZWUgYm90
dG9tKQp7CiAgdHJlZSBpbm5lciwgb3V0ZXI7CgogIGlmIChQT0lOVEVSX1RZUEVfUCAodHlw
ZSkpCiAgICB7CiAgICAgIGlubmVyID0gdmVjdG9yX3NpemVfaGVscGVyIChUUkVFX1RZUEUg
KHR5cGUpLCBib3R0b20pOwogICAgICBvdXRlciA9IGJ1aWxkX3BvaW50ZXJfdHlwZSAoaW5u
ZXIpOwogICAgfQogIGVsc2UgaWYgKFRSRUVfQ09ERSAodHlwZSkgPT0gQVJSQVlfVFlQRSkK
ICAgIHsKICAgICAgaW5uZXIgPSB2ZWN0b3Jfc2l6ZV9oZWxwZXIgKFRSRUVfVFlQRSAodHlw
ZSksIGJvdHRvbSk7CiAgICAgIG91dGVyID0gYnVpbGRfYXJyYXlfdHlwZSAoaW5uZXIsIFRZ
UEVfVkFMVUVTICh0eXBlKSk7CiAgICB9CiAgZWxzZSBpZiAoVFJFRV9DT0RFICh0eXBlKSA9
PSBGVU5DVElPTl9UWVBFKQogICAgewogICAgICBpbm5lciA9IHZlY3Rvcl9zaXplX2hlbHBl
ciAoVFJFRV9UWVBFICh0eXBlKSwgYm90dG9tKTsKICAgICAgb3V0ZXIgPSBidWlsZF9mdW5j
dGlvbl90eXBlIChpbm5lciwgVFlQRV9WQUxVRVMgKHR5cGUpKTsKICAgIH0KICBlbHNlCiAg
ICByZXR1cm4gYm90dG9tOwoKICBUUkVFX1JFQURPTkxZIChvdXRlcikgPSBUUkVFX1JFQURP
TkxZICh0eXBlKTsKICBUUkVFX1RISVNfVk9MQVRJTEUgKG91dGVyKSA9IFRSRUVfVEhJU19W
T0xBVElMRSAodHlwZSk7CgogIHJldHVybiBvdXRlcjsKfQoKLyogSGFuZGxlIHRoZSAibm9u
bnVsbCIgYXR0cmlidXRlLiAgKi8Kc3RhdGljIHRyZWUKaGFuZGxlX25vbm51bGxfYXR0cmli
dXRlICh0cmVlICpub2RlLCB0cmVlIG5hbWUgQVRUUklCVVRFX1VOVVNFRCwKCQkJICB0cmVl
IGFyZ3MsIGludCBmbGFncyBBVFRSSUJVVEVfVU5VU0VELAoJCQkgIGJvb2wgKm5vX2FkZF9h
dHRycykKewogIHRyZWUgdHlwZSA9ICpub2RlOwogIHVuc2lnbmVkIEhPU1RfV0lERV9JTlQg
YXR0cl9hcmdfbnVtOwoKICAvKiBJZiBubyBhcmd1bWVudHMgYXJlIHNwZWNpZmllZCwgYWxs
IHBvaW50ZXIgYXJndW1lbnRzIHNob3VsZCBiZQogICAgIG5vbi1udWxsLiAgVmVyaWZ5IGEg
ZnVsbCBwcm90b3R5cGUgaXMgZ2l2ZW4gc28gdGhhdCB0aGUgYXJndW1lbnRzCiAgICAgd2ls
bCBoYXZlIHRoZSBjb3JyZWN0IHR5cGVzIHdoZW4gd2UgYWN0dWFsbHkgY2hlY2sgdGhlbSBs
YXRlci4gICovCiAgaWYgKCEgYXJncykKICAgIHsKICAgICAgaWYgKCEgVFlQRV9BUkdfVFlQ
RVMgKHR5cGUpKQoJewoJICBlcnJvciAoIm5vbm51bGwgYXR0cmlidXRlIHdpdGhvdXQgYXJn
dW1lbnRzIG9uIGEgbm9uLXByb3RvdHlwZSIpOwogICAgICAgICAgKm5vX2FkZF9hdHRycyA9
IHRydWU7Cgl9CiAgICAgIHJldHVybiBOVUxMX1RSRUU7CiAgICB9CgogIC8qIEFyZ3VtZW50
IGxpc3Qgc3BlY2lmaWVkLiAgVmVyaWZ5IHRoYXQgZWFjaCBhcmd1bWVudCBudW1iZXIgcmVm
ZXJlbmNlcwogICAgIGEgcG9pbnRlciBhcmd1bWVudC4gICovCiAgZm9yIChhdHRyX2FyZ19u
dW0gPSAxOyBhcmdzOyBhcmdzID0gVFJFRV9DSEFJTiAoYXJncykpCiAgICB7CiAgICAgIHRy
ZWUgYXJndW1lbnQ7CiAgICAgIHVuc2lnbmVkIEhPU1RfV0lERV9JTlQgYXJnX251bSwgY2tf
bnVtOwoKICAgICAgaWYgKCEgZ2V0X25vbm51bGxfb3BlcmFuZCAoVFJFRV9WQUxVRSAoYXJn
cyksICZhcmdfbnVtKSkKCXsKCSAgZXJyb3IgKCJub25udWxsIGFyZ3VtZW50IGhhcyBpbnZh
bGlkIG9wZXJhbmQgbnVtYmVyIChhcmcgJWx1KSIsCgkJICh1bnNpZ25lZCBsb25nKSBhdHRy
X2FyZ19udW0pOwoJICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKCSAgcmV0dXJuIE5VTExfVFJF
RTsKCX0KCiAgICAgIGFyZ3VtZW50ID0gVFlQRV9BUkdfVFlQRVMgKHR5cGUpOwogICAgICBp
ZiAoYXJndW1lbnQpCgl7CgkgIGZvciAoY2tfbnVtID0gMTsgOyBja19udW0rKykKCSAgICB7
CgkgICAgICBpZiAoISBhcmd1bWVudCB8fCBja19udW0gPT0gYXJnX251bSkKCQlicmVhazsK
CSAgICAgIGFyZ3VtZW50ID0gVFJFRV9DSEFJTiAoYXJndW1lbnQpOwoJICAgIH0KCiAgICAg
ICAgICBpZiAoISBhcmd1bWVudAoJICAgICAgfHwgVFJFRV9DT0RFIChUUkVFX1ZBTFVFIChh
cmd1bWVudCkpID09IFZPSURfVFlQRSkKCSAgICB7CgkgICAgICBlcnJvciAoIm5vbm51bGwg
YXJndW1lbnQgd2l0aCBvdXQtb2YtcmFuZ2Ugb3BlcmFuZCBudW1iZXIgKGFyZyAlbHUsIG9w
ZXJhbmQgJWx1KSIsCgkJICAgICAodW5zaWduZWQgbG9uZykgYXR0cl9hcmdfbnVtLCAodW5z
aWduZWQgbG9uZykgYXJnX251bSk7CgkgICAgICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKCSAg
ICAgIHJldHVybiBOVUxMX1RSRUU7CgkgICAgfQoKICAgICAgICAgIGlmIChUUkVFX0NPREUg
KFRSRUVfVkFMVUUgKGFyZ3VtZW50KSkgIT0gUE9JTlRFUl9UWVBFKQoJICAgIHsKCSAgICAg
IGVycm9yICgibm9ubnVsbCBhcmd1bWVudCByZWZlcmVuY2VzIG5vbi1wb2ludGVyIG9wZXJh
bmQgKGFyZyAlbHUsIG9wZXJhbmQgJWx1KSIsCgkJICAgKHVuc2lnbmVkIGxvbmcpIGF0dHJf
YXJnX251bSwgKHVuc2lnbmVkIGxvbmcpIGFyZ19udW0pOwoJICAgICAgKm5vX2FkZF9hdHRy
cyA9IHRydWU7CgkgICAgICByZXR1cm4gTlVMTF9UUkVFOwoJICAgIH0KCX0KICAgIH0KCiAg
cmV0dXJuIE5VTExfVFJFRTsKfQoKLyogQ2hlY2sgdGhlIGFyZ3VtZW50IGxpc3Qgb2YgYSBm
dW5jdGlvbiBjYWxsIGZvciBudWxsIGluIGFyZ3VtZW50IHNsb3RzCiAgIHRoYXQgYXJlIG1h
cmtlZCBhcyByZXF1aXJpbmcgYSBub24tbnVsbCBwb2ludGVyIGFyZ3VtZW50LiAgKi8KCnN0
YXRpYyB2b2lkCmNoZWNrX2Z1bmN0aW9uX25vbm51bGwgKHRyZWUgYXR0cnMsIHRyZWUgcGFy
YW1zKQp7CiAgdHJlZSBhLCBhcmdzLCBwYXJhbTsKICBpbnQgcGFyYW1fbnVtOwoKICBmb3Ig
KGEgPSBhdHRyczsgYTsgYSA9IFRSRUVfQ0hBSU4gKGEpKQogICAgewogICAgICBpZiAoaXNf
YXR0cmlidXRlX3AgKCJub25udWxsIiwgVFJFRV9QVVJQT1NFIChhKSkpCgl7CiAgICAgICAg
ICBhcmdzID0gVFJFRV9WQUxVRSAoYSk7CgogICAgICAgICAgLyogV2FsayB0aGUgYXJndW1l
bnQgbGlzdC4gIElmIHdlIGVuY291bnRlciBhbiBhcmd1bWVudCBudW1iZXIgd2UKICAgICAg
ICAgICAgIHNob3VsZCBjaGVjayBmb3Igbm9uLW51bGwsIGRvIGl0LiAgSWYgdGhlIGF0dHJp
YnV0ZSBoYXMgbm8gYXJncywKICAgICAgICAgICAgIHRoZW4gZXZlcnkgcG9pbnRlciBhcmd1
bWVudCBpcyBjaGVja2VkIChpbiB3aGljaCBjYXNlIHRoZSBjaGVjawoJICAgICBmb3IgcG9p
bnRlciB0eXBlIGlzIGRvbmUgaW4gY2hlY2tfbm9ubnVsbF9hcmcpLiAgKi8KICAgICAgICAg
IGZvciAocGFyYW0gPSBwYXJhbXMsIHBhcmFtX251bSA9IDE7IDsKICAgICAgICAgICAgICAg
cGFyYW1fbnVtKyssIHBhcmFtID0gVFJFRV9DSEFJTiAocGFyYW0pKQogICAgICAgICAgICB7
CiAgICAgICAgICAgICAgaWYgKCEgcGFyYW0pCglicmVhazsKICAgICAgICAgICAgICBpZiAo
ISBhcmdzIHx8IG5vbm51bGxfY2hlY2tfcCAoYXJncywgcGFyYW1fbnVtKSkKCWNoZWNrX2Z1
bmN0aW9uX2FyZ3VtZW50c19yZWN1cnNlIChjaGVja19ub25udWxsX2FyZywgTlVMTCwKCQkJ
CQkgIFRSRUVfVkFMVUUgKHBhcmFtKSwKCQkJCQkgIHBhcmFtX251bSk7CiAgICAgICAgICAg
IH0KCX0KICAgIH0KfQoKLyogSGVscGVyIGZvciBjaGVja19mdW5jdGlvbl9ub25udWxsOyBn
aXZlbiBhIGxpc3Qgb2Ygb3BlcmFuZHMgd2hpY2gKICAgbXVzdCBiZSBub24tbnVsbCBpbiBB
UkdTLCBkZXRlcm1pbmUgaWYgb3BlcmFuZCBQQVJBTV9OVU0gc2hvdWxkIGJlCiAgIGNoZWNr
ZWQuICAqLwoKc3RhdGljIGJvb2wKbm9ubnVsbF9jaGVja19wICh0cmVlIGFyZ3MsIHVuc2ln
bmVkIEhPU1RfV0lERV9JTlQgcGFyYW1fbnVtKQp7CiAgdW5zaWduZWQgSE9TVF9XSURFX0lO
VCBhcmdfbnVtOwoKICBmb3IgKDsgYXJnczsgYXJncyA9IFRSRUVfQ0hBSU4gKGFyZ3MpKQog
ICAgewogICAgICBpZiAoISBnZXRfbm9ubnVsbF9vcGVyYW5kIChUUkVFX1ZBTFVFIChhcmdz
KSwgJmFyZ19udW0pKQogICAgICAgIGFib3J0ICgpOwoKICAgICAgaWYgKGFyZ19udW0gPT0g
cGFyYW1fbnVtKQoJcmV0dXJuIHRydWU7CiAgICB9CiAgcmV0dXJuIGZhbHNlOwp9CgovKiBD
aGVjayB0aGF0IHRoZSBmdW5jdGlvbiBhcmd1bWVudCBQQVJBTSAod2hpY2ggaXMgb3BlcmFu
ZCBudW1iZXIKICAgUEFSQU1fTlVNKSBpcyBub24tbnVsbC4gIFRoaXMgaXMgY2FsbGVkIGJ5
IGNoZWNrX2Z1bmN0aW9uX25vbm51bGwKICAgdmlhIGNoZWNrX2Z1bmN0aW9uX2FyZ3VtZW50
c19yZWN1cnNlLiAgKi8KCnN0YXRpYyB2b2lkCmNoZWNrX25vbm51bGxfYXJnICh2b2lkICpj
dHggQVRUUklCVVRFX1VOVVNFRCwgdHJlZSBwYXJhbSwKCQkgICB1bnNpZ25lZCBIT1NUX1dJ
REVfSU5UIHBhcmFtX251bSkKewogIC8qIEp1c3Qgc2tpcCBjaGVja2luZyB0aGUgYXJndW1l
bnQgaWYgaXQncyBub3QgYSBwb2ludGVyLiAgVGhpcyBjYW4KICAgICBoYXBwZW4gaWYgdGhl
ICJub25udWxsIiBhdHRyaWJ1dGUgd2FzIGdpdmVuIHdpdGhvdXQgYW4gb3BlcmFuZAogICAg
IGxpc3QgKHdoaWNoIG1lYW5zIHRvIGNoZWNrIGV2ZXJ5IHBvaW50ZXIgYXJndW1lbnQpLiAg
Ki8KCiAgaWYgKFRSRUVfQ09ERSAoVFJFRV9UWVBFIChwYXJhbSkpICE9IFBPSU5URVJfVFlQ
RSkKICAgIHJldHVybjsKCiAgaWYgKGludGVnZXJfemVyb3AgKHBhcmFtKSkKICAgIHdhcm5p
bmcgKCJudWxsIGFyZ3VtZW50IHdoZXJlIG5vbi1udWxsIHJlcXVpcmVkIChhcmcgJWx1KSIs
CiAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgcGFyYW1fbnVtKTsKfQoKLyogSGVscGVy
IGZvciBub25udWxsIGF0dHJpYnV0ZSBoYW5kbGluZzsgZmV0Y2ggdGhlIG9wZXJhbmQgbnVt
YmVyCiAgIGZyb20gdGhlIGF0dHJpYnV0ZSBhcmd1bWVudCBsaXN0LiAgKi8KCnN0YXRpYyBi
b29sCmdldF9ub25udWxsX29wZXJhbmQgKHRyZWUgYXJnX251bV9leHByLCB1bnNpZ25lZCBI
T1NUX1dJREVfSU5UICp2YWxwKQp7CiAgLyogU3RyaXAgYW55IGNvbnZlcnNpb25zIGZyb20g
dGhlIGFyZyBudW1iZXIgYW5kIHZlcmlmeSB0aGV5CiAgICAgYXJlIGNvbnN0YW50cy4gICov
CiAgd2hpbGUgKFRSRUVfQ09ERSAoYXJnX251bV9leHByKSA9PSBOT1BfRVhQUgoJIHx8IFRS
RUVfQ09ERSAoYXJnX251bV9leHByKSA9PSBDT05WRVJUX0VYUFIKCSB8fCBUUkVFX0NPREUg
KGFyZ19udW1fZXhwcikgPT0gTk9OX0xWQUxVRV9FWFBSKQogICAgYXJnX251bV9leHByID0g
VFJFRV9PUEVSQU5EIChhcmdfbnVtX2V4cHIsIDApOwoKICBpZiAoVFJFRV9DT0RFIChhcmdf
bnVtX2V4cHIpICE9IElOVEVHRVJfQ1NUCiAgICAgIHx8IFRSRUVfSU5UX0NTVF9ISUdIIChh
cmdfbnVtX2V4cHIpICE9IDApCiAgICByZXR1cm4gZmFsc2U7CgogICp2YWxwID0gVFJFRV9J
TlRfQ1NUX0xPVyAoYXJnX251bV9leHByKTsKICByZXR1cm4gdHJ1ZTsKfQoKLyogSGFuZGxl
IGEgIm5vdGhyb3ciIGF0dHJpYnV0ZTsgYXJndW1lbnRzIGFzIGluCiAgIHN0cnVjdCBhdHRy
aWJ1dGVfc3BlYy5oYW5kbGVyLiAgKi8KCnN0YXRpYyB0cmVlCmhhbmRsZV9ub3Rocm93X2F0
dHJpYnV0ZSAodHJlZSAqbm9kZSwgdHJlZSBuYW1lLCB0cmVlIGFyZ3MgQVRUUklCVVRFX1VO
VVNFRCwKCQkJICBpbnQgZmxhZ3MgQVRUUklCVVRFX1VOVVNFRCwgYm9vbCAqbm9fYWRkX2F0
dHJzKQp7CiAgaWYgKFRSRUVfQ09ERSAoKm5vZGUpID09IEZVTkNUSU9OX0RFQ0wpCiAgICBU
UkVFX05PVEhST1cgKCpub2RlKSA9IDE7CiAgLyogPz8/IFRPRE86IFN1cHBvcnQgdHlwZXMu
ICAqLwogIGVsc2UKICAgIHsKICAgICAgd2FybmluZyAoImAlcycgYXR0cmlidXRlIGlnbm9y
ZWQiLCBJREVOVElGSUVSX1BPSU5URVIgKG5hbWUpKTsKICAgICAgKm5vX2FkZF9hdHRycyA9
IHRydWU7CiAgICB9CgogIHJldHVybiBOVUxMX1RSRUU7Cn0KCi8qIEhhbmRsZSBhICJjbGVh
bnVwIiBhdHRyaWJ1dGU7IGFyZ3VtZW50cyBhcyBpbgogICBzdHJ1Y3QgYXR0cmlidXRlX3Nw
ZWMuaGFuZGxlci4gICovCgpzdGF0aWMgdHJlZQpoYW5kbGVfY2xlYW51cF9hdHRyaWJ1dGUg
KHRyZWUgKm5vZGUsIHRyZWUgbmFtZSwgdHJlZSBhcmdzLAoJCQkgIGludCBmbGFncyBBVFRS
SUJVVEVfVU5VU0VELCBib29sICpub19hZGRfYXR0cnMpCnsKICB0cmVlIGRlY2wgPSAqbm9k
ZTsKICB0cmVlIGNsZWFudXBfaWQsIGNsZWFudXBfZGVjbDsKCiAgLyogPz8/IENvdWxkIHBl
cmhhcHMgc3VwcG9ydCBjbGVhbnVwcyBvbiBUUkVFX1NUQVRJQywgbXVjaCBsaWtlIHdlIGRv
CiAgICAgZm9yIGdsb2JhbCBkZXN0cnVjdG9ycyBpbiBDKysuICBUaGlzIHJlcXVpcmVzIGlu
ZnJhc3RydWN0dXJlIHRoYXQKICAgICB3ZSBkb24ndCBoYXZlIGdlbmVyaWNhbGx5IGF0IHRo
ZSBtb21lbnQuICBJdCdzIGFsc28gbm90IGEgZmVhdHVyZQogICAgIHdlJ2QgYmUgbWlzc2lu
ZyB0b28gbXVjaCwgc2luY2Ugd2UgZG8gaGF2ZSBhdHRyaWJ1dGUgY29uc3RydWN0b3IuICAq
LwogIGlmIChUUkVFX0NPREUgKGRlY2wpICE9IFZBUl9ERUNMIHx8IFRSRUVfU1RBVElDIChk
ZWNsKSkKICAgIHsKICAgICAgd2FybmluZyAoImAlcycgYXR0cmlidXRlIGlnbm9yZWQiLCBJ
REVOVElGSUVSX1BPSU5URVIgKG5hbWUpKTsKICAgICAgKm5vX2FkZF9hdHRycyA9IHRydWU7
CiAgICAgIHJldHVybiBOVUxMX1RSRUU7CiAgICB9CgogIC8qIFZlcmlmeSB0aGF0IHRoZSBh
cmd1bWVudCBpcyBhIGZ1bmN0aW9uIGluIHNjb3BlLiAgKi8KICAvKiA/Pz8gV2UgY291bGQg
c3VwcG9ydCBwb2ludGVycyB0byBmdW5jdGlvbnMgaGVyZSBhcyB3ZWxsLCBpZgogICAgIHRo
YXQgd2FzIGNvbnNpZGVyZWQgZGVzaXJhYmxlLiAgKi8KICBjbGVhbnVwX2lkID0gVFJFRV9W
QUxVRSAoYXJncyk7CiAgaWYgKFRSRUVfQ09ERSAoY2xlYW51cF9pZCkgIT0gSURFTlRJRklF
Ul9OT0RFKQogICAgewogICAgICBlcnJvciAoImNsZWFudXAgYXJnIG5vdCBhbiBpZGVudGlm
aWVyIik7CiAgICAgICpub19hZGRfYXR0cnMgPSB0cnVlOwogICAgICByZXR1cm4gTlVMTF9U
UkVFOwogICAgfQogIGNsZWFudXBfZGVjbCA9IGxvb2t1cF9uYW1lIChjbGVhbnVwX2lkKTsK
ICBpZiAoIWNsZWFudXBfZGVjbCB8fCBUUkVFX0NPREUgKGNsZWFudXBfZGVjbCkgIT0gRlVO
Q1RJT05fREVDTCkKICAgIHsKICAgICAgZXJyb3IgKCJjbGVhbnVwIGFyZyBub3QgYSBmdW5j
dGlvbiIpOwogICAgICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKICAgICAgcmV0dXJuIE5VTExf
VFJFRTsKICAgIH0KCiAgLyogVGhhdCB0aGUgZnVuY3Rpb24gaGFzIHByb3BlciB0eXBlIGlz
IGNoZWNrZWQgd2l0aCB0aGUKICAgICBldmVudHVhbCBjYWxsIHRvIGJ1aWxkX2Z1bmN0aW9u
X2NhbGwuICAqLwoKICByZXR1cm4gTlVMTF9UUkVFOwp9CgwKLyogQ2hlY2sgZm9yIHZhbGlk
IGFyZ3VtZW50cyBiZWluZyBwYXNzZWQgdG8gYSBmdW5jdGlvbi4gICovCnZvaWQKY2hlY2tf
ZnVuY3Rpb25fYXJndW1lbnRzICh0cmVlIGF0dHJzLCB0cmVlIHBhcmFtcykKewogIC8qIENo
ZWNrIGZvciBudWxsIGJlaW5nIHBhc3NlZCBpbiBhIHBvaW50ZXIgYXJndW1lbnQgdGhhdCBt
dXN0IGJlCiAgICAgbm9uLW51bGwuICBXZSBhbHNvIG5lZWQgdG8gZG8gdGhpcyBpZiBmb3Jt
YXQgY2hlY2tpbmcgaXMgZW5hYmxlZC4gICovCgogIGlmICh3YXJuX25vbm51bGwpCiAgICBj
aGVja19mdW5jdGlvbl9ub25udWxsIChhdHRycywgcGFyYW1zKTsKCiAgLyogQ2hlY2sgZm9y
IGVycm9ycyBpbiBmb3JtYXQgc3RyaW5ncy4gICovCgogIGlmICh3YXJuX2Zvcm1hdCkKICAg
IGNoZWNrX2Z1bmN0aW9uX2Zvcm1hdCAoTlVMTCwgYXR0cnMsIHBhcmFtcyk7Cn0KCi8qIEdl
bmVyaWMgYXJndW1lbnQgY2hlY2tpbmcgcmVjdXJzaW9uIHJvdXRpbmUuICBQQVJBTSBpcyB0
aGUgYXJndW1lbnQgdG8KICAgYmUgY2hlY2tlZC4gIFBBUkFNX05VTSBpcyB0aGUgbnVtYmVy
IG9mIHRoZSBhcmd1bWVudC4gIENBTExCQUNLIGlzIGludm9rZWQKICAgb25jZSB0aGUgYXJn
dW1lbnQgaXMgcmVzb2x2ZWQuICBDVFggaXMgY29udGV4dCBmb3IgdGhlIGNhbGxiYWNrLiAg
Ki8Kdm9pZApjaGVja19mdW5jdGlvbl9hcmd1bWVudHNfcmVjdXJzZSAodm9pZCAoKmNhbGxi
YWNrKQoJCQkJICAodm9pZCAqLCB0cmVlLCB1bnNpZ25lZCBIT1NUX1dJREVfSU5UKSwKCQkJ
CSAgdm9pZCAqY3R4LCB0cmVlIHBhcmFtLAoJCQkJICB1bnNpZ25lZCBIT1NUX1dJREVfSU5U
IHBhcmFtX251bSkKewogIGlmIChUUkVFX0NPREUgKHBhcmFtKSA9PSBOT1BfRVhQUikKICAg
IHsKICAgICAgLyogU3RyaXAgY29lcmNpb24uICAqLwogICAgICBjaGVja19mdW5jdGlvbl9h
cmd1bWVudHNfcmVjdXJzZSAoY2FsbGJhY2ssIGN0eCwKCQkJCSAgICAgICAgVFJFRV9PUEVS
QU5EIChwYXJhbSwgMCksIHBhcmFtX251bSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgaWYg
KFRSRUVfQ09ERSAocGFyYW0pID09IENBTExfRVhQUikKICAgIHsKICAgICAgdHJlZSB0eXBl
ID0gVFJFRV9UWVBFIChUUkVFX1RZUEUgKFRSRUVfT1BFUkFORCAocGFyYW0sIDApKSk7CiAg
ICAgIHRyZWUgYXR0cnM7CiAgICAgIGJvb2wgZm91bmRfZm9ybWF0X2FyZyA9IGZhbHNlOwoK
ICAgICAgLyogU2VlIGlmIHRoaXMgaXMgYSBjYWxsIHRvIGEga25vd24gaW50ZXJuYXRpb25h
bGl6YXRpb24gZnVuY3Rpb24KCSB0aGF0IG1vZGlmaWVzIGEgZm9ybWF0IGFyZy4gIFN1Y2gg
YSBmdW5jdGlvbiBtYXkgaGF2ZSBtdWx0aXBsZQoJIGZvcm1hdF9hcmcgYXR0cmlidXRlcyAo
Zm9yIGV4YW1wbGUsIG5nZXR0ZXh0KS4gICovCgogICAgICBmb3IgKGF0dHJzID0gVFlQRV9B
VFRSSUJVVEVTICh0eXBlKTsKCSAgIGF0dHJzOwoJICAgYXR0cnMgPSBUUkVFX0NIQUlOIChh
dHRycykpCglpZiAoaXNfYXR0cmlidXRlX3AgKCJmb3JtYXRfYXJnIiwgVFJFRV9QVVJQT1NF
IChhdHRycykpKQoJICB7CgkgICAgdHJlZSBpbm5lcl9hcmdzOwoJICAgIHRyZWUgZm9ybWF0
X251bV9leHByOwoJICAgIGludCBmb3JtYXRfbnVtOwoJICAgIGludCBpOwoKCSAgICAvKiBF
eHRyYWN0IHRoZSBhcmd1bWVudCBudW1iZXIsIHdoaWNoIHdhcyBwcmV2aW91c2x5IGNoZWNr
ZWQKCSAgICAgICB0byBiZSB2YWxpZC4gICovCgkgICAgZm9ybWF0X251bV9leHByID0gVFJF
RV9WQUxVRSAoVFJFRV9WQUxVRSAoYXR0cnMpKTsKCSAgICB3aGlsZSAoVFJFRV9DT0RFIChm
b3JtYXRfbnVtX2V4cHIpID09IE5PUF9FWFBSCgkJICAgfHwgVFJFRV9DT0RFIChmb3JtYXRf
bnVtX2V4cHIpID09IENPTlZFUlRfRVhQUgoJCSAgIHx8IFRSRUVfQ09ERSAoZm9ybWF0X251
bV9leHByKSA9PSBOT05fTFZBTFVFX0VYUFIpCgkgICAgICBmb3JtYXRfbnVtX2V4cHIgPSBU
UkVFX09QRVJBTkQgKGZvcm1hdF9udW1fZXhwciwgMCk7CgoJICAgIGlmIChUUkVFX0NPREUg
KGZvcm1hdF9udW1fZXhwcikgIT0gSU5URUdFUl9DU1QKCQl8fCBUUkVFX0lOVF9DU1RfSElH
SCAoZm9ybWF0X251bV9leHByKSAhPSAwKQoJICAgICAgYWJvcnQgKCk7CgoJICAgIGZvcm1h
dF9udW0gPSBUUkVFX0lOVF9DU1RfTE9XIChmb3JtYXRfbnVtX2V4cHIpOwoKCSAgICBmb3Ig
KGlubmVyX2FyZ3MgPSBUUkVFX09QRVJBTkQgKHBhcmFtLCAxKSwgaSA9IDE7CgkJIGlubmVy
X2FyZ3MgIT0gMDsKCQkgaW5uZXJfYXJncyA9IFRSRUVfQ0hBSU4gKGlubmVyX2FyZ3MpLCBp
KyspCgkgICAgICBpZiAoaSA9PSBmb3JtYXRfbnVtKQoJCXsKCQkgIGNoZWNrX2Z1bmN0aW9u
X2FyZ3VtZW50c19yZWN1cnNlIChjYWxsYmFjaywgY3R4LAoJCQkJCQkgICAgVFJFRV9WQUxV
RSAoaW5uZXJfYXJncyksCgkJCQkJCSAgICBwYXJhbV9udW0pOwoJCSAgZm91bmRfZm9ybWF0
X2FyZyA9IHRydWU7CgkJICBicmVhazsKCQl9CgkgIH0KCiAgICAgIC8qIElmIHdlIGZvdW5k
IGEgZm9ybWF0X2FyZyBhdHRyaWJ1dGUgYW5kIGRpZCBhIHJlY3Vyc2l2ZSBjaGVjaywKCSB3
ZSBhcmUgZG9uZSB3aXRoIGNoZWNraW5nIHRoaXMgYXJndW1lbnQuICBPdGhlcndpc2UsIHdl
IGNvbnRpbnVlCgkgYW5kIHRoaXMgd2lsbCBiZSBjb25zaWRlcmVkIGEgbm9uLWxpdGVyYWwu
ICAqLwogICAgICBpZiAoZm91bmRfZm9ybWF0X2FyZykKCXJldHVybjsKICAgIH0KCiAgaWYg
KFRSRUVfQ09ERSAocGFyYW0pID09IENPTkRfRVhQUikKICAgIHsKICAgICAgLyogQ2hlY2sg
Ym90aCBoYWx2ZXMgb2YgdGhlIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24uICAqLwogICAgICBj
aGVja19mdW5jdGlvbl9hcmd1bWVudHNfcmVjdXJzZSAoY2FsbGJhY2ssIGN0eCwKCQkJCSAg
ICAgICAgVFJFRV9PUEVSQU5EIChwYXJhbSwgMSksIHBhcmFtX251bSk7CiAgICAgIGNoZWNr
X2Z1bmN0aW9uX2FyZ3VtZW50c19yZWN1cnNlIChjYWxsYmFjaywgY3R4LAoJCQkJICAgICAg
ICBUUkVFX09QRVJBTkQgKHBhcmFtLCAyKSwgcGFyYW1fbnVtKTsKICAgICAgcmV0dXJuOwog
ICAgfQoKICAoKmNhbGxiYWNrKSAoY3R4LCBwYXJhbSwgcGFyYW1fbnVtKTsKfQoKI2luY2x1
ZGUgImd0LWMtY29tbW9uLmgiCg==
_ATEOF


# decode first file and commit to db
$at_traceoff
echo "t_unidiff.at:4781: mimencode -u firstfile.b64"
echo t_unidiff.at:4781 >$at_check_line_file
( $at_traceon; mimencode -u firstfile.b64 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_unidiff.at:4781: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_unidiff.at:4782: mv stdout firstfile"
echo t_unidiff.at:4782 >$at_check_line_file
( $at_traceon; mv stdout firstfile ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_unidiff.at:4782: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_unidiff.at:4783: cp firstfile testfile"
echo t_unidiff.at:4783 >$at_check_line_file
( $at_traceon; cp firstfile testfile ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_unidiff.at:4783: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_unidiff.at:4784: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add testfile"
echo t_unidiff.at:4784 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add testfile ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_unidiff.at:4784: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_unidiff.at:4785: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit blah-blah"
echo t_unidiff.at:4785 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit blah-blah ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_unidiff.at:4785: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_unidiff.at:4786: mv testfile firstfile"
echo t_unidiff.at:4786 >$at_check_line_file
( $at_traceon; mv testfile firstfile ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_unidiff.at:4786: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# decode second file
$at_traceoff
echo "t_unidiff.at:4789: mimencode -u secondfile.b64"
echo t_unidiff.at:4789 >$at_check_line_file
( $at_traceon; mimencode -u secondfile.b64 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_unidiff.at:4789: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_unidiff.at:4790: mv stdout secondfile"
echo t_unidiff.at:4790 >$at_check_line_file
( $at_traceon; mv stdout secondfile ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_unidiff.at:4790: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# calculate diff to second file using monotone
$at_traceoff
echo "t_unidiff.at:4793: cp secondfile testfile"
echo t_unidiff.at:4793 >$at_check_line_file
( $at_traceon; cp secondfile testfile ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_unidiff.at:4793: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_unidiff.at:4794: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net diff"
echo t_unidiff.at:4794 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net diff ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_unidiff.at:4794: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_unidiff.at:4795: mv stdout monodiff"
echo t_unidiff.at:4795 >$at_check_line_file
( $at_traceon; mv stdout monodiff ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_unidiff.at:4795: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# see if patch likes that
$at_traceoff
echo "t_unidiff.at:4798: patch firstfile <monodiff"
echo t_unidiff.at:4798 >$at_check_line_file
( $at_traceon; patch firstfile <monodiff ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_unidiff.at:4798: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# see if the resulting file has been properly patched
$at_traceoff
echo "t_unidiff.at:4801: cmp firstfile secondfile"
echo t_unidiff.at:4801 >$at_check_line_file
( $at_traceon; cmp firstfile secondfile ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_unidiff.at:4801: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


      $at_traceoff
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  6 ) # 6. t_persist_phrase.at:3: persistence of passphrase
    at_setup_line='t_persist_phrase.at:3'
    at_desc='persistence of passphrase'
    $at_quiet $ECHO_N "  6: persistence of passphrase                    $ECHO_C"
    at_xfail=no
    (
      echo "6. t_persist_phrase.at:3: testing ..."
      $at_traceon




cat >test_keys <<'_ATEOF'
[pubkey tester@test.net]
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCfN/cAMabgb6T7m8ksGnpQ7LO6hOdnc/7V
yivrRGtmpwSItljht1bmgLQF37KiSPoMEDUb1stfKxaMsYiy8iTyoQ+M2EVFP37n2rtnNZ0H
oVcQd2sRsCerQFh9nslRPymlkQXUlOiNFN6RlFNcdjkucqNe+YorFX21EYw7XuT5XwIBEQ==
[end]
[privkey tester@test.net]
npy0jyqbZdylFkMjdR9OvlqmDHuBGXpGFPt94h96aG+Lp+OdBCmWx8GueHk8FKkexwPqhRBM
PPopUeuwqxuSX+yEodMl5IHBmin0nLnbOeBjtasjemBFEmdNl/jPDF/AeQ2WHhanB731dSQc
vzLOQfKAYmfk56PPULi9oJJNUxaCkvsWtvaI+HUHZrjyyV7dA4Vsc6Jvx2Yf1+MdDAEGk/Rw
ZtP0LmuoiyvRDFqBF8aTmnotyb4kRKohnJ7VF+y6hYvmtMpM3TKnpR7EbojBzNPqKuO7nPUz
jGxA7F84O24Vbf128PNSI5vj4istow26aPjn28qPjfRrkV30WLL/dXfYJkfkTqglYnoEXvF/
xZoVxxNeAX58mgy0A1ErVxv8U7TwuP983GHEpLwy3gbiP+9akAJCr8r823DHmQqq5QDELibP
cuXZfOttpfVRkcbMhjeF0M6czc4HoKgHTAnf/18hzdZwGX/WWvRIBHImbUJ+mDbp2ByDTfKf
ErGXSvZ3HxCqBD8yx1SnXhV8IDHaBmV9wwYcN+H2cxOWGZk7g7xJS19+a3UQB3c3sSXQVJBp
6QpCZgysxkZwzuXDzzLZPT9SLZz4K2p7+7BwMbpy9ZxcyAzmiEtpA24UP06jtjFN7WcXAdx/
E5Gmoe9b1EiXWdReHjUGpc6k0LQ0PPXAwqrcGdwYbOLDZ5xsQ5AsEYSFtyTS60D1nHBcdNmW
M0eOUJFdJf/uNe/2EApc3a8TyEkZtVqiYtOVV3qDB9NmU4bVOkDqzl1F7zJwATWbmasSdkM3
6lxDkczBfCrEjH5p5Y8DU+ge4e4LRtknY9oBOJ7EQO0twYJg3k0=
[end]
_ATEOF


cat >test_hooks.lua <<'_ATEOF'

-- this is the "testing" set of lua hooks for monotone
-- it's intended to support self-tests, not for use in
-- production. just defines some of the std hooks.

function get_passphrase(keyid)
	return keyid
end

function non_blocking_rng_ok()
	return true
end

function get_manifest_cert_trust(signers, id, name, val)
   return true
end

function get_file_cert_trust(signers, id, name, val)
   return true
end

function accept_testresult_change(old_results, new_results)
   for test,res in pairs(old_results)
   do
      if res == true and new_results[test] ~= true
      then
	 return false
      end
   end
   return true
end

function get_author(branchname)
	return "tester@test.net"
end

function ignore_file(name)
	if (strfind(name, "test_hooks.lua")) then return true end
	if (strfind(name, "test.db")) then return true end
	return false
end

if (attr_functions == nil) then
  attr_functions = {}
end
attr_functions["test_attr"] =
  function(filename, value)
    io.write(string.format("test_attr:%s:%s\n", filename, value))
  end

_ATEOF


$at_traceoff
echo "t_persist_phrase.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init"
echo t_persist_phrase.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_persist_phrase.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_persist_phrase.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys"
echo t_persist_phrase.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_persist_phrase.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_persist_phrase.at:5: rm test_keys"
echo t_persist_phrase.at:5 >$at_check_line_file
( $at_traceon; rm test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_persist_phrase.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



cat >persist.lua <<'_ATEOF'

function persist_phrase_ok()
	return true
end

get_passphrase = nil
_ATEOF


cat >input.txt <<'_ATEOF'
version 0 of the file
_ATEOF


$at_traceoff
echo "t_persist_phrase.at:18: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add input.txt"
echo t_persist_phrase.at:18 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add input.txt ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_persist_phrase.at:18: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


cat >input.txt <<'_ATEOF'
version 1 of the file
_ATEOF


cat >passphrase <<'_ATEOF'
tester@test.net
_ATEOF


$at_traceoff
echo "t_persist_phrase.at:26: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch --rcfile=persist.lua commit blah-blah <passphrase"
echo t_persist_phrase.at:26 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch --rcfile=persist.lua commit blah-blah <passphrase ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_persist_phrase.at:26: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


MSHA=`sha1sum MT/manifest | cut -d ' ' -f 1`
$at_traceoff
echo "t_persist_phrase.at:29: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net ls certs \$MSHA"
echo t_persist_phrase.at:29 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net ls certs $MSHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_persist_phrase.at:29: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_persist_phrase.at:30: mv stdout certs"
echo t_persist_phrase.at:30 >$at_check_line_file
( $at_traceon; mv stdout certs ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_persist_phrase.at:30: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_persist_phrase.at:31: grep branch certs"
echo t_persist_phrase.at:31 >$at_check_line_file
( $at_traceon; grep branch certs ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_persist_phrase.at:31: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_persist_phrase.at:32: grep author certs"
echo t_persist_phrase.at:32 >$at_check_line_file
( $at_traceon; grep author certs ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_persist_phrase.at:32: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_persist_phrase.at:33: grep date certs"
echo t_persist_phrase.at:33 >$at_check_line_file
( $at_traceon; grep date certs ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_persist_phrase.at:33: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_persist_phrase.at:34: grep changelog certs"
echo t_persist_phrase.at:34 >$at_check_line_file
( $at_traceon; grep changelog certs ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_persist_phrase.at:34: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


      $at_traceoff
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  7 ) # 7. t_versions.at:3: multiple version committing
    at_setup_line='t_versions.at:3'
    at_desc='multiple version committing'
    $at_quiet $ECHO_N "  7: multiple version committing                  $ECHO_C"
    at_xfail=no
    (
      echo "7. t_versions.at:3: testing ..."
      $at_traceon




cat >test_keys <<'_ATEOF'
[pubkey tester@test.net]
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCfN/cAMabgb6T7m8ksGnpQ7LO6hOdnc/7V
yivrRGtmpwSItljht1bmgLQF37KiSPoMEDUb1stfKxaMsYiy8iTyoQ+M2EVFP37n2rtnNZ0H
oVcQd2sRsCerQFh9nslRPymlkQXUlOiNFN6RlFNcdjkucqNe+YorFX21EYw7XuT5XwIBEQ==
[end]
[privkey tester@test.net]
npy0jyqbZdylFkMjdR9OvlqmDHuBGXpGFPt94h96aG+Lp+OdBCmWx8GueHk8FKkexwPqhRBM
PPopUeuwqxuSX+yEodMl5IHBmin0nLnbOeBjtasjemBFEmdNl/jPDF/AeQ2WHhanB731dSQc
vzLOQfKAYmfk56PPULi9oJJNUxaCkvsWtvaI+HUHZrjyyV7dA4Vsc6Jvx2Yf1+MdDAEGk/Rw
ZtP0LmuoiyvRDFqBF8aTmnotyb4kRKohnJ7VF+y6hYvmtMpM3TKnpR7EbojBzNPqKuO7nPUz
jGxA7F84O24Vbf128PNSI5vj4istow26aPjn28qPjfRrkV30WLL/dXfYJkfkTqglYnoEXvF/
xZoVxxNeAX58mgy0A1ErVxv8U7TwuP983GHEpLwy3gbiP+9akAJCr8r823DHmQqq5QDELibP
cuXZfOttpfVRkcbMhjeF0M6czc4HoKgHTAnf/18hzdZwGX/WWvRIBHImbUJ+mDbp2ByDTfKf
ErGXSvZ3HxCqBD8yx1SnXhV8IDHaBmV9wwYcN+H2cxOWGZk7g7xJS19+a3UQB3c3sSXQVJBp
6QpCZgysxkZwzuXDzzLZPT9SLZz4K2p7+7BwMbpy9ZxcyAzmiEtpA24UP06jtjFN7WcXAdx/
E5Gmoe9b1EiXWdReHjUGpc6k0LQ0PPXAwqrcGdwYbOLDZ5xsQ5AsEYSFtyTS60D1nHBcdNmW
M0eOUJFdJf/uNe/2EApc3a8TyEkZtVqiYtOVV3qDB9NmU4bVOkDqzl1F7zJwATWbmasSdkM3
6lxDkczBfCrEjH5p5Y8DU+ge4e4LRtknY9oBOJ7EQO0twYJg3k0=
[end]
_ATEOF


cat >test_hooks.lua <<'_ATEOF'

-- this is the "testing" set of lua hooks for monotone
-- it's intended to support self-tests, not for use in
-- production. just defines some of the std hooks.

function get_passphrase(keyid)
	return keyid
end

function non_blocking_rng_ok()
	return true
end

function get_manifest_cert_trust(signers, id, name, val)
   return true
end

function get_file_cert_trust(signers, id, name, val)
   return true
end

function accept_testresult_change(old_results, new_results)
   for test,res in pairs(old_results)
   do
      if res == true and new_results[test] ~= true
      then
	 return false
      end
   end
   return true
end

function get_author(branchname)
	return "tester@test.net"
end

function ignore_file(name)
	if (strfind(name, "test_hooks.lua")) then return true end
	if (strfind(name, "test.db")) then return true end
	return false
end

if (attr_functions == nil) then
  attr_functions = {}
end
attr_functions["test_attr"] =
  function(filename, value)
    io.write(string.format("test_attr:%s:%s\n", filename, value))
  end

_ATEOF


$at_traceoff
echo "t_versions.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init"
echo t_versions.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_versions.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_versions.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys"
echo t_versions.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_versions.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_versions.at:5: rm test_keys"
echo t_versions.at:5 >$at_check_line_file
( $at_traceon; rm test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_versions.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



cat >testfile <<'_ATEOF'
version 0 of the file
_ATEOF

$at_traceoff
echo "t_versions.at:9: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add testfile"
echo t_versions.at:9 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add testfile ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_versions.at:9: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_versions.at:10: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit blah-blah"
echo t_versions.at:10 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit blah-blah ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_versions.at:10: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


for i in 1 2 3 4 5 6
do
  $at_traceoff
echo "t_versions.at:14: echo \"version \$i of the file\""
echo t_versions.at:14 >$at_check_line_file
( $at_traceon; echo "version $i of the file" ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_versions.at:14: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

  $at_traceoff
echo "t_versions.at:15: mv stdout testfile"
echo t_versions.at:15 >$at_check_line_file
( $at_traceon; mv stdout testfile ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_versions.at:15: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

  $at_traceoff
echo "t_versions.at:16: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit blah-blah"
echo t_versions.at:16 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit blah-blah ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_versions.at:16: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

  $at_traceoff
echo "t_versions.at:17: sha1sum testfile | cut -d ' ' -f 1"
echo t_versions.at:17 >$at_check_line_file
( $at_traceon; sha1sum testfile | cut -d ' ' -f 1 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_versions.at:17: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

  $at_traceoff
echo "t_versions.at:18: mv stdout fsha-\$i"
echo t_versions.at:18 >$at_check_line_file
( $at_traceon; mv stdout fsha-$i ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_versions.at:18: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

  $at_traceoff
echo "t_versions.at:19: sha1sum MT/manifest | cut -d ' ' -f 1"
echo t_versions.at:19 >$at_check_line_file
( $at_traceon; sha1sum MT/manifest | cut -d ' ' -f 1 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_versions.at:19: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

  $at_traceoff
echo "t_versions.at:20: mv stdout msha-\$i"
echo t_versions.at:20 >$at_check_line_file
( $at_traceon; mv stdout msha-$i ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_versions.at:20: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

done

for i in 1 2 3 4 5 6
do
  $at_traceoff
echo "t_versions.at:25: echo \"version \$i of the file\""
echo t_versions.at:25 >$at_check_line_file
( $at_traceon; echo "version $i of the file" ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_versions.at:25: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

  $at_traceoff
echo "t_versions.at:26: mv stdout testfile"
echo t_versions.at:26 >$at_check_line_file
( $at_traceon; mv stdout testfile ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_versions.at:26: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


  MSHA=`cat msha-$i`
  FSHA=`cat fsha-$i`

  $at_traceoff
echo "t_versions.at:31: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net cat file \$FSHA"
echo t_versions.at:31 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net cat file $FSHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_versions.at:31: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

  $at_traceoff
echo "t_versions.at:32: cmp stdout testfile"
echo t_versions.at:32 >$at_check_line_file
( $at_traceon; cmp stdout testfile ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_versions.at:32: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


  $at_traceoff
echo "t_versions.at:34: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout \$MSHA ."
echo t_versions.at:34 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout $MSHA . ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_versions.at:34: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

  $at_traceoff
echo "t_versions.at:35: sha1sum testfile | cut -d ' ' -f 1"
echo t_versions.at:35 >$at_check_line_file
( $at_traceon; sha1sum testfile | cut -d ' ' -f 1 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_versions.at:35: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

  $at_traceoff
echo "t_versions.at:36: cmp stdout fsha-\$i"
echo t_versions.at:36 >$at_check_line_file
( $at_traceon; cmp stdout fsha-$i ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_versions.at:36: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


done

      $at_traceoff
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  8 ) # 8. t_fork.at:3: creating a fork
    at_setup_line='t_fork.at:3'
    at_desc='creating a fork'
    $at_quiet $ECHO_N "  8: creating a fork                              $ECHO_C"
    at_xfail=no
    (
      echo "8. t_fork.at:3: testing ..."
      $at_traceon




cat >test_keys <<'_ATEOF'
[pubkey tester@test.net]
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCfN/cAMabgb6T7m8ksGnpQ7LO6hOdnc/7V
yivrRGtmpwSItljht1bmgLQF37KiSPoMEDUb1stfKxaMsYiy8iTyoQ+M2EVFP37n2rtnNZ0H
oVcQd2sRsCerQFh9nslRPymlkQXUlOiNFN6RlFNcdjkucqNe+YorFX21EYw7XuT5XwIBEQ==
[end]
[privkey tester@test.net]
npy0jyqbZdylFkMjdR9OvlqmDHuBGXpGFPt94h96aG+Lp+OdBCmWx8GueHk8FKkexwPqhRBM
PPopUeuwqxuSX+yEodMl5IHBmin0nLnbOeBjtasjemBFEmdNl/jPDF/AeQ2WHhanB731dSQc
vzLOQfKAYmfk56PPULi9oJJNUxaCkvsWtvaI+HUHZrjyyV7dA4Vsc6Jvx2Yf1+MdDAEGk/Rw
ZtP0LmuoiyvRDFqBF8aTmnotyb4kRKohnJ7VF+y6hYvmtMpM3TKnpR7EbojBzNPqKuO7nPUz
jGxA7F84O24Vbf128PNSI5vj4istow26aPjn28qPjfRrkV30WLL/dXfYJkfkTqglYnoEXvF/
xZoVxxNeAX58mgy0A1ErVxv8U7TwuP983GHEpLwy3gbiP+9akAJCr8r823DHmQqq5QDELibP
cuXZfOttpfVRkcbMhjeF0M6czc4HoKgHTAnf/18hzdZwGX/WWvRIBHImbUJ+mDbp2ByDTfKf
ErGXSvZ3HxCqBD8yx1SnXhV8IDHaBmV9wwYcN+H2cxOWGZk7g7xJS19+a3UQB3c3sSXQVJBp
6QpCZgysxkZwzuXDzzLZPT9SLZz4K2p7+7BwMbpy9ZxcyAzmiEtpA24UP06jtjFN7WcXAdx/
E5Gmoe9b1EiXWdReHjUGpc6k0LQ0PPXAwqrcGdwYbOLDZ5xsQ5AsEYSFtyTS60D1nHBcdNmW
M0eOUJFdJf/uNe/2EApc3a8TyEkZtVqiYtOVV3qDB9NmU4bVOkDqzl1F7zJwATWbmasSdkM3
6lxDkczBfCrEjH5p5Y8DU+ge4e4LRtknY9oBOJ7EQO0twYJg3k0=
[end]
_ATEOF


cat >test_hooks.lua <<'_ATEOF'

-- this is the "testing" set of lua hooks for monotone
-- it's intended to support self-tests, not for use in
-- production. just defines some of the std hooks.

function get_passphrase(keyid)
	return keyid
end

function non_blocking_rng_ok()
	return true
end

function get_manifest_cert_trust(signers, id, name, val)
   return true
end

function get_file_cert_trust(signers, id, name, val)
   return true
end

function accept_testresult_change(old_results, new_results)
   for test,res in pairs(old_results)
   do
      if res == true and new_results[test] ~= true
      then
	 return false
      end
   end
   return true
end

function get_author(branchname)
	return "tester@test.net"
end

function ignore_file(name)
	if (strfind(name, "test_hooks.lua")) then return true end
	if (strfind(name, "test.db")) then return true end
	return false
end

if (attr_functions == nil) then
  attr_functions = {}
end
attr_functions["test_attr"] =
  function(filename, value)
    io.write(string.format("test_attr:%s:%s\n", filename, value))
  end

_ATEOF


$at_traceoff
echo "t_fork.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init"
echo t_fork.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fork.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_fork.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys"
echo t_fork.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fork.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_fork.at:5: rm test_keys"
echo t_fork.at:5 >$at_check_line_file
( $at_traceon; rm test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fork.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon




cat >testfile <<'_ATEOF'
version 0 of test file
_ATEOF


$at_traceoff
echo "t_fork.at:11: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add testfile"
echo t_fork.at:11 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add testfile ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fork.at:11: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_fork.at:12: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit blah-blah"
echo t_fork.at:12 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit blah-blah ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fork.at:12: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

ROOT_M_SHA=`sha1sum MT/manifest | cut -d ' ' -f 1`
ROOT_F_SHA=`sha1sum testfile | cut -d ' ' -f 1`

cat >testfile <<'_ATEOF'
left version of fork
_ATEOF

$at_traceoff
echo "t_fork.at:18: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit blah-blah"
echo t_fork.at:18 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit blah-blah ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fork.at:18: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

LEFT_M_SHA=`sha1sum MT/manifest | cut -d ' ' -f 1`
LEFT_F_SHA=`sha1sum testfile | cut -d ' ' -f 1`
$at_traceoff
echo "t_fork.at:21: test \$LEFT_M_SHA != \$ROOT_M_SHA"
echo t_fork.at:21 >$at_check_line_file
( $at_traceon; test $LEFT_M_SHA != $ROOT_M_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fork.at:21: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_fork.at:22: test \$LEFT_F_SHA != \$ROOT_F_SHA"
echo t_fork.at:22 >$at_check_line_file
( $at_traceon; test $LEFT_F_SHA != $ROOT_F_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fork.at:22: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_fork.at:24: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch heads"
echo t_fork.at:24 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch heads ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fork.at:24: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_fork.at:25: grep empty stdout"
echo t_fork.at:25 >$at_check_line_file
( $at_traceon; grep empty stdout ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   1) ;;
   *) echo "t_fork.at:25: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_fork.at:27: rm MT/manifest"
echo t_fork.at:27 >$at_check_line_file
( $at_traceon; rm MT/manifest ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fork.at:27: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_fork.at:27: rm testfile"
echo t_fork.at:27 >$at_check_line_file
( $at_traceon; rm testfile ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fork.at:27: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_fork.at:27: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout \$ROOT_M_SHA ."
echo t_fork.at:27 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout $ROOT_M_SHA . ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fork.at:27: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

PROBE_M_SHA=`sha1sum MT/manifest | cut -d ' ' -f 1`
PROBE_F_SHA=`sha1sum testfile | cut -d ' ' -f 1`
$at_traceoff
echo "t_fork.at:27: test \$PROBE_M_SHA == \$ROOT_M_SHA"
echo t_fork.at:27 >$at_check_line_file
( $at_traceon; test $PROBE_M_SHA == $ROOT_M_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fork.at:27: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_fork.at:27: test \$PROBE_F_SHA == \$ROOT_F_SHA"
echo t_fork.at:27 >$at_check_line_file
( $at_traceon; test $PROBE_F_SHA == $ROOT_F_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fork.at:27: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



cat >testfile <<'_ATEOF'
right version of fork
_ATEOF

$at_traceoff
echo "t_fork.at:31: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add testfile"
echo t_fork.at:31 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add testfile ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fork.at:31: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_fork.at:32: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit blah-blah"
echo t_fork.at:32 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit blah-blah ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fork.at:32: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

RIGHT_M_SHA=`sha1sum MT/manifest | cut -d ' ' -f 1`
RIGHT_F_SHA=`sha1sum testfile | cut -d ' ' -f 1`
$at_traceoff
echo "t_fork.at:35: test \$RIGHT_M_SHA != \$ROOT_M_SHA"
echo t_fork.at:35 >$at_check_line_file
( $at_traceon; test $RIGHT_M_SHA != $ROOT_M_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fork.at:35: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_fork.at:36: test \$RIGHT_F_SHA != \$ROOT_F_SHA"
echo t_fork.at:36 >$at_check_line_file
( $at_traceon; test $RIGHT_F_SHA != $ROOT_F_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fork.at:36: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_fork.at:37: test \$RIGHT_M_SHA != \$LEFT_M_SHA"
echo t_fork.at:37 >$at_check_line_file
( $at_traceon; test $RIGHT_M_SHA != $LEFT_M_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fork.at:37: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_fork.at:38: test \$RIGHT_F_SHA != \$LEFT_F_SHA"
echo t_fork.at:38 >$at_check_line_file
( $at_traceon; test $RIGHT_F_SHA != $LEFT_F_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fork.at:38: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# fork committed ok. now check to make sure
# all 3 nodes are reconstructable


$at_traceoff
echo "t_fork.at:43: rm MT/manifest"
echo t_fork.at:43 >$at_check_line_file
( $at_traceon; rm MT/manifest ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fork.at:43: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_fork.at:43: rm testfile"
echo t_fork.at:43 >$at_check_line_file
( $at_traceon; rm testfile ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fork.at:43: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_fork.at:43: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout \$ROOT_M_SHA ."
echo t_fork.at:43 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout $ROOT_M_SHA . ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fork.at:43: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

PROBE_M_SHA=`sha1sum MT/manifest | cut -d ' ' -f 1`
PROBE_F_SHA=`sha1sum testfile | cut -d ' ' -f 1`
$at_traceoff
echo "t_fork.at:43: test \$PROBE_M_SHA == \$ROOT_M_SHA"
echo t_fork.at:43 >$at_check_line_file
( $at_traceon; test $PROBE_M_SHA == $ROOT_M_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fork.at:43: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_fork.at:43: test \$PROBE_F_SHA == \$ROOT_F_SHA"
echo t_fork.at:43 >$at_check_line_file
( $at_traceon; test $PROBE_F_SHA == $ROOT_F_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fork.at:43: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_fork.at:44: rm MT/manifest"
echo t_fork.at:44 >$at_check_line_file
( $at_traceon; rm MT/manifest ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fork.at:44: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_fork.at:44: rm testfile"
echo t_fork.at:44 >$at_check_line_file
( $at_traceon; rm testfile ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fork.at:44: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_fork.at:44: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout \$LEFT_M_SHA ."
echo t_fork.at:44 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout $LEFT_M_SHA . ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fork.at:44: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

PROBE_M_SHA=`sha1sum MT/manifest | cut -d ' ' -f 1`
PROBE_F_SHA=`sha1sum testfile | cut -d ' ' -f 1`
$at_traceoff
echo "t_fork.at:44: test \$PROBE_M_SHA == \$LEFT_M_SHA"
echo t_fork.at:44 >$at_check_line_file
( $at_traceon; test $PROBE_M_SHA == $LEFT_M_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fork.at:44: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_fork.at:44: test \$PROBE_F_SHA == \$LEFT_F_SHA"
echo t_fork.at:44 >$at_check_line_file
( $at_traceon; test $PROBE_F_SHA == $LEFT_F_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fork.at:44: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_fork.at:45: rm MT/manifest"
echo t_fork.at:45 >$at_check_line_file
( $at_traceon; rm MT/manifest ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fork.at:45: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_fork.at:45: rm testfile"
echo t_fork.at:45 >$at_check_line_file
( $at_traceon; rm testfile ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fork.at:45: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_fork.at:45: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout \$RIGHT_M_SHA ."
echo t_fork.at:45 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout $RIGHT_M_SHA . ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fork.at:45: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

PROBE_M_SHA=`sha1sum MT/manifest | cut -d ' ' -f 1`
PROBE_F_SHA=`sha1sum testfile | cut -d ' ' -f 1`
$at_traceoff
echo "t_fork.at:45: test \$PROBE_M_SHA == \$RIGHT_M_SHA"
echo t_fork.at:45 >$at_check_line_file
( $at_traceon; test $PROBE_M_SHA == $RIGHT_M_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fork.at:45: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_fork.at:45: test \$PROBE_F_SHA == \$RIGHT_F_SHA"
echo t_fork.at:45 >$at_check_line_file
( $at_traceon; test $PROBE_F_SHA == $RIGHT_F_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fork.at:45: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



      $at_traceoff
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  9 ) # 9. t_update.at:3: creating a fork and updating
    at_setup_line='t_update.at:3'
    at_desc='creating a fork and updating'
    $at_quiet $ECHO_N "  9: creating a fork and updating                 $ECHO_C"
    at_xfail=no
    (
      echo "9. t_update.at:3: testing ..."
      $at_traceon




cat >test_keys <<'_ATEOF'
[pubkey tester@test.net]
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCfN/cAMabgb6T7m8ksGnpQ7LO6hOdnc/7V
yivrRGtmpwSItljht1bmgLQF37KiSPoMEDUb1stfKxaMsYiy8iTyoQ+M2EVFP37n2rtnNZ0H
oVcQd2sRsCerQFh9nslRPymlkQXUlOiNFN6RlFNcdjkucqNe+YorFX21EYw7XuT5XwIBEQ==
[end]
[privkey tester@test.net]
npy0jyqbZdylFkMjdR9OvlqmDHuBGXpGFPt94h96aG+Lp+OdBCmWx8GueHk8FKkexwPqhRBM
PPopUeuwqxuSX+yEodMl5IHBmin0nLnbOeBjtasjemBFEmdNl/jPDF/AeQ2WHhanB731dSQc
vzLOQfKAYmfk56PPULi9oJJNUxaCkvsWtvaI+HUHZrjyyV7dA4Vsc6Jvx2Yf1+MdDAEGk/Rw
ZtP0LmuoiyvRDFqBF8aTmnotyb4kRKohnJ7VF+y6hYvmtMpM3TKnpR7EbojBzNPqKuO7nPUz
jGxA7F84O24Vbf128PNSI5vj4istow26aPjn28qPjfRrkV30WLL/dXfYJkfkTqglYnoEXvF/
xZoVxxNeAX58mgy0A1ErVxv8U7TwuP983GHEpLwy3gbiP+9akAJCr8r823DHmQqq5QDELibP
cuXZfOttpfVRkcbMhjeF0M6czc4HoKgHTAnf/18hzdZwGX/WWvRIBHImbUJ+mDbp2ByDTfKf
ErGXSvZ3HxCqBD8yx1SnXhV8IDHaBmV9wwYcN+H2cxOWGZk7g7xJS19+a3UQB3c3sSXQVJBp
6QpCZgysxkZwzuXDzzLZPT9SLZz4K2p7+7BwMbpy9ZxcyAzmiEtpA24UP06jtjFN7WcXAdx/
E5Gmoe9b1EiXWdReHjUGpc6k0LQ0PPXAwqrcGdwYbOLDZ5xsQ5AsEYSFtyTS60D1nHBcdNmW
M0eOUJFdJf/uNe/2EApc3a8TyEkZtVqiYtOVV3qDB9NmU4bVOkDqzl1F7zJwATWbmasSdkM3
6lxDkczBfCrEjH5p5Y8DU+ge4e4LRtknY9oBOJ7EQO0twYJg3k0=
[end]
_ATEOF


cat >test_hooks.lua <<'_ATEOF'

-- this is the "testing" set of lua hooks for monotone
-- it's intended to support self-tests, not for use in
-- production. just defines some of the std hooks.

function get_passphrase(keyid)
	return keyid
end

function non_blocking_rng_ok()
	return true
end

function get_manifest_cert_trust(signers, id, name, val)
   return true
end

function get_file_cert_trust(signers, id, name, val)
   return true
end

function accept_testresult_change(old_results, new_results)
   for test,res in pairs(old_results)
   do
      if res == true and new_results[test] ~= true
      then
	 return false
      end
   end
   return true
end

function get_author(branchname)
	return "tester@test.net"
end

function ignore_file(name)
	if (strfind(name, "test_hooks.lua")) then return true end
	if (strfind(name, "test.db")) then return true end
	return false
end

if (attr_functions == nil) then
  attr_functions = {}
end
attr_functions["test_attr"] =
  function(filename, value)
    io.write(string.format("test_attr:%s:%s\n", filename, value))
  end

_ATEOF


$at_traceoff
echo "t_update.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init"
echo t_update.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_update.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_update.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys"
echo t_update.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_update.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_update.at:5: rm test_keys"
echo t_update.at:5 >$at_check_line_file
( $at_traceon; rm test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_update.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



# this test is kinda like fork, only it doesn't commit the right side of
# the fork; instead, it updates, and (in theory) shifts from right to
# merged-with-left

cat >testfile <<'_ATEOF'
first line of the file
second line of the file
third line of the file
_ATEOF

$at_traceoff
echo "t_update.at:15: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add testfile"
echo t_update.at:15 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add testfile ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_update.at:15: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_update.at:16: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit blah-blah"
echo t_update.at:16 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit blah-blah ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_update.at:16: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

ROOT_M_SHA=`sha1sum MT/manifest | cut -d ' ' -f 1`
ROOT_F_SHA=`sha1sum testfile | cut -d ' ' -f 1`

cat >testfile <<'_ATEOF'
first line of the file
an insertion between first and second
second line of the file
third line of the file
_ATEOF


$at_traceoff
echo "t_update.at:26: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit blah-blah"
echo t_update.at:26 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit blah-blah ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_update.at:26: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

LEFT_M_SHA=`sha1sum MT/manifest | cut -d ' ' -f 1`
LEFT_F_SHA=`sha1sum testfile | cut -d ' ' -f 1`
$at_traceoff
echo "t_update.at:29: test \$LEFT_M_SHA != \$ROOT_M_SHA"
echo t_update.at:29 >$at_check_line_file
( $at_traceon; test $LEFT_M_SHA != $ROOT_M_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_update.at:29: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_update.at:30: test \$LEFT_F_SHA != \$ROOT_F_SHA"
echo t_update.at:30 >$at_check_line_file
( $at_traceon; test $LEFT_F_SHA != $ROOT_F_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_update.at:30: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_update.at:32: rm MT/manifest"
echo t_update.at:32 >$at_check_line_file
( $at_traceon; rm MT/manifest ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_update.at:32: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_update.at:32: rm testfile"
echo t_update.at:32 >$at_check_line_file
( $at_traceon; rm testfile ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_update.at:32: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_update.at:32: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout \$ROOT_M_SHA ."
echo t_update.at:32 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout $ROOT_M_SHA . ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_update.at:32: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

PROBE_M_SHA=`sha1sum MT/manifest | cut -d ' ' -f 1`
PROBE_F_SHA=`sha1sum testfile | cut -d ' ' -f 1`
$at_traceoff
echo "t_update.at:32: test \$PROBE_M_SHA == \$ROOT_M_SHA"
echo t_update.at:32 >$at_check_line_file
( $at_traceon; test $PROBE_M_SHA == $ROOT_M_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_update.at:32: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_update.at:32: test \$PROBE_F_SHA == \$ROOT_F_SHA"
echo t_update.at:32 >$at_check_line_file
( $at_traceon; test $PROBE_F_SHA == $ROOT_F_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_update.at:32: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



cat >testfile <<'_ATEOF'
first line of the file
second line of the file
an insertion between second and third
third line of the file
_ATEOF


$at_traceoff
echo "t_update.at:40: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net update"
echo t_update.at:40 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net update ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_update.at:40: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# files should now be merged

cat >probe <<'_ATEOF'
first line of the file
an insertion between first and second
second line of the file
an insertion between second and third
third line of the file
_ATEOF


$at_traceoff
echo "t_update.at:51: cmp testfile probe"
echo t_update.at:51 >$at_check_line_file
( $at_traceon; cmp testfile probe ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_update.at:51: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


      $at_traceoff
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  10 ) # 10. t_merge.at:3: creating a fork and merging
    at_setup_line='t_merge.at:3'
    at_desc='creating a fork and merging'
    $at_quiet $ECHO_N " 10: creating a fork and merging                  $ECHO_C"
    at_xfail=no
    (
      echo "10. t_merge.at:3: testing ..."
      $at_traceon




cat >test_keys <<'_ATEOF'
[pubkey tester@test.net]
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCfN/cAMabgb6T7m8ksGnpQ7LO6hOdnc/7V
yivrRGtmpwSItljht1bmgLQF37KiSPoMEDUb1stfKxaMsYiy8iTyoQ+M2EVFP37n2rtnNZ0H
oVcQd2sRsCerQFh9nslRPymlkQXUlOiNFN6RlFNcdjkucqNe+YorFX21EYw7XuT5XwIBEQ==
[end]
[privkey tester@test.net]
npy0jyqbZdylFkMjdR9OvlqmDHuBGXpGFPt94h96aG+Lp+OdBCmWx8GueHk8FKkexwPqhRBM
PPopUeuwqxuSX+yEodMl5IHBmin0nLnbOeBjtasjemBFEmdNl/jPDF/AeQ2WHhanB731dSQc
vzLOQfKAYmfk56PPULi9oJJNUxaCkvsWtvaI+HUHZrjyyV7dA4Vsc6Jvx2Yf1+MdDAEGk/Rw
ZtP0LmuoiyvRDFqBF8aTmnotyb4kRKohnJ7VF+y6hYvmtMpM3TKnpR7EbojBzNPqKuO7nPUz
jGxA7F84O24Vbf128PNSI5vj4istow26aPjn28qPjfRrkV30WLL/dXfYJkfkTqglYnoEXvF/
xZoVxxNeAX58mgy0A1ErVxv8U7TwuP983GHEpLwy3gbiP+9akAJCr8r823DHmQqq5QDELibP
cuXZfOttpfVRkcbMhjeF0M6czc4HoKgHTAnf/18hzdZwGX/WWvRIBHImbUJ+mDbp2ByDTfKf
ErGXSvZ3HxCqBD8yx1SnXhV8IDHaBmV9wwYcN+H2cxOWGZk7g7xJS19+a3UQB3c3sSXQVJBp
6QpCZgysxkZwzuXDzzLZPT9SLZz4K2p7+7BwMbpy9ZxcyAzmiEtpA24UP06jtjFN7WcXAdx/
E5Gmoe9b1EiXWdReHjUGpc6k0LQ0PPXAwqrcGdwYbOLDZ5xsQ5AsEYSFtyTS60D1nHBcdNmW
M0eOUJFdJf/uNe/2EApc3a8TyEkZtVqiYtOVV3qDB9NmU4bVOkDqzl1F7zJwATWbmasSdkM3
6lxDkczBfCrEjH5p5Y8DU+ge4e4LRtknY9oBOJ7EQO0twYJg3k0=
[end]
_ATEOF


cat >test_hooks.lua <<'_ATEOF'

-- this is the "testing" set of lua hooks for monotone
-- it's intended to support self-tests, not for use in
-- production. just defines some of the std hooks.

function get_passphrase(keyid)
	return keyid
end

function non_blocking_rng_ok()
	return true
end

function get_manifest_cert_trust(signers, id, name, val)
   return true
end

function get_file_cert_trust(signers, id, name, val)
   return true
end

function accept_testresult_change(old_results, new_results)
   for test,res in pairs(old_results)
   do
      if res == true and new_results[test] ~= true
      then
	 return false
      end
   end
   return true
end

function get_author(branchname)
	return "tester@test.net"
end

function ignore_file(name)
	if (strfind(name, "test_hooks.lua")) then return true end
	if (strfind(name, "test.db")) then return true end
	return false
end

if (attr_functions == nil) then
  attr_functions = {}
end
attr_functions["test_attr"] =
  function(filename, value)
    io.write(string.format("test_attr:%s:%s\n", filename, value))
  end

_ATEOF


$at_traceoff
echo "t_merge.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init"
echo t_merge.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_merge.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_merge.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys"
echo t_merge.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_merge.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_merge.at:5: rm test_keys"
echo t_merge.at:5 >$at_check_line_file
( $at_traceon; rm test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_merge.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



# this test is kinda like update, only it *does* commit the left right
# branch before attempting a merge. it just checks to make sure merging
# works in the context of the "merge" command, not just the "update"
# command.

cat >testfile <<'_ATEOF'
first line of the file
second line of the file
third line of the file
_ATEOF

$at_traceoff
echo "t_merge.at:16: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add testfile"
echo t_merge.at:16 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add testfile ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_merge.at:16: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_merge.at:17: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit blah-blah"
echo t_merge.at:17 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit blah-blah ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_merge.at:17: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

ROOT_M_SHA=`sha1sum MT/manifest | cut -d ' ' -f 1`
ROOT_F_SHA=`sha1sum testfile | cut -d ' ' -f 1`

cat >testfile <<'_ATEOF'
first line of the file
an insertion between first and second
second line of the file
third line of the file
_ATEOF


$at_traceoff
echo "t_merge.at:27: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit blah-blah"
echo t_merge.at:27 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit blah-blah ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_merge.at:27: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

LEFT_M_SHA=`sha1sum MT/manifest | cut -d ' ' -f 1`
LEFT_F_SHA=`sha1sum testfile | cut -d ' ' -f 1`
$at_traceoff
echo "t_merge.at:30: test \$LEFT_M_SHA != \$ROOT_M_SHA"
echo t_merge.at:30 >$at_check_line_file
( $at_traceon; test $LEFT_M_SHA != $ROOT_M_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_merge.at:30: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_merge.at:31: test \$LEFT_F_SHA != \$ROOT_F_SHA"
echo t_merge.at:31 >$at_check_line_file
( $at_traceon; test $LEFT_F_SHA != $ROOT_F_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_merge.at:31: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_merge.at:33: rm MT/manifest"
echo t_merge.at:33 >$at_check_line_file
( $at_traceon; rm MT/manifest ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_merge.at:33: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_merge.at:33: rm testfile"
echo t_merge.at:33 >$at_check_line_file
( $at_traceon; rm testfile ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_merge.at:33: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_merge.at:33: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout \$ROOT_M_SHA ."
echo t_merge.at:33 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout $ROOT_M_SHA . ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_merge.at:33: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

PROBE_M_SHA=`sha1sum MT/manifest | cut -d ' ' -f 1`
PROBE_F_SHA=`sha1sum testfile | cut -d ' ' -f 1`
$at_traceoff
echo "t_merge.at:33: test \$PROBE_M_SHA == \$ROOT_M_SHA"
echo t_merge.at:33 >$at_check_line_file
( $at_traceon; test $PROBE_M_SHA == $ROOT_M_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_merge.at:33: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_merge.at:33: test \$PROBE_F_SHA == \$ROOT_F_SHA"
echo t_merge.at:33 >$at_check_line_file
( $at_traceon; test $PROBE_F_SHA == $ROOT_F_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_merge.at:33: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



cat >testfile <<'_ATEOF'
first line of the file
second line of the file
an insertion between second and third
third line of the file
_ATEOF

$at_traceoff
echo "t_merge.at:40: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit blah-blah"
echo t_merge.at:40 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit blah-blah ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_merge.at:40: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

RIGHT_M_SHA=`sha1sum MT/manifest | cut -d ' ' -f 1`
RIGHT_F_SHA=`sha1sum testfile | cut -d ' ' -f 1`
$at_traceoff
echo "t_merge.at:43: test \$RIGHT_M_SHA != \$ROOT_M_SHA"
echo t_merge.at:43 >$at_check_line_file
( $at_traceon; test $RIGHT_M_SHA != $ROOT_M_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_merge.at:43: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_merge.at:44: test \$RIGHT_F_SHA != \$ROOT_F_SHA"
echo t_merge.at:44 >$at_check_line_file
( $at_traceon; test $RIGHT_F_SHA != $ROOT_F_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_merge.at:44: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_merge.at:45: test \$RIGHT_M_SHA != \$LEFT_M_SHA"
echo t_merge.at:45 >$at_check_line_file
( $at_traceon; test $RIGHT_M_SHA != $LEFT_M_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_merge.at:45: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_merge.at:46: test \$RIGHT_F_SHA != \$LEFT_F_SHA"
echo t_merge.at:46 >$at_check_line_file
( $at_traceon; test $RIGHT_F_SHA != $LEFT_F_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_merge.at:46: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# now merge and update again, this time successfully
$at_traceoff
echo "t_merge.at:49: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch merge"
echo t_merge.at:49 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch merge ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_merge.at:49: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_merge.at:50: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net update"
echo t_merge.at:50 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net update ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_merge.at:50: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_merge.at:52: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch heads"
echo t_merge.at:52 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch heads ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_merge.at:52: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_merge.at:53: grep empty stdout"
echo t_merge.at:53 >$at_check_line_file
( $at_traceon; grep empty stdout ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   1) ;;
   *) echo "t_merge.at:53: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# files should now be merged
cat >probe <<'_ATEOF'
first line of the file
an insertion between first and second
second line of the file
an insertion between second and third
third line of the file
_ATEOF

$at_traceoff
echo "t_merge.at:62: cmp testfile probe"
echo t_merge.at:62 >$at_check_line_file
( $at_traceon; cmp testfile probe ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_merge.at:62: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


      $at_traceoff
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  11 ) # 11. t_unidiff2.at:3: calculation of incorrect unidiffs
    at_setup_line='t_unidiff2.at:3'
    at_desc='calculation of incorrect unidiffs'
    $at_quiet $ECHO_N " 11: calculation of incorrect unidiffs            $ECHO_C"
    at_xfail=no
    (
      echo "11. t_unidiff2.at:3: testing ..."
      $at_traceon


MIMENCODE=`which mimencode 2>/dev/null`
if test -z "$MIMENCODE" ; then
  exit 77
fi



cat >test_keys <<'_ATEOF'
[pubkey tester@test.net]
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCfN/cAMabgb6T7m8ksGnpQ7LO6hOdnc/7V
yivrRGtmpwSItljht1bmgLQF37KiSPoMEDUb1stfKxaMsYiy8iTyoQ+M2EVFP37n2rtnNZ0H
oVcQd2sRsCerQFh9nslRPymlkQXUlOiNFN6RlFNcdjkucqNe+YorFX21EYw7XuT5XwIBEQ==
[end]
[privkey tester@test.net]
npy0jyqbZdylFkMjdR9OvlqmDHuBGXpGFPt94h96aG+Lp+OdBCmWx8GueHk8FKkexwPqhRBM
PPopUeuwqxuSX+yEodMl5IHBmin0nLnbOeBjtasjemBFEmdNl/jPDF/AeQ2WHhanB731dSQc
vzLOQfKAYmfk56PPULi9oJJNUxaCkvsWtvaI+HUHZrjyyV7dA4Vsc6Jvx2Yf1+MdDAEGk/Rw
ZtP0LmuoiyvRDFqBF8aTmnotyb4kRKohnJ7VF+y6hYvmtMpM3TKnpR7EbojBzNPqKuO7nPUz
jGxA7F84O24Vbf128PNSI5vj4istow26aPjn28qPjfRrkV30WLL/dXfYJkfkTqglYnoEXvF/
xZoVxxNeAX58mgy0A1ErVxv8U7TwuP983GHEpLwy3gbiP+9akAJCr8r823DHmQqq5QDELibP
cuXZfOttpfVRkcbMhjeF0M6czc4HoKgHTAnf/18hzdZwGX/WWvRIBHImbUJ+mDbp2ByDTfKf
ErGXSvZ3HxCqBD8yx1SnXhV8IDHaBmV9wwYcN+H2cxOWGZk7g7xJS19+a3UQB3c3sSXQVJBp
6QpCZgysxkZwzuXDzzLZPT9SLZz4K2p7+7BwMbpy9ZxcyAzmiEtpA24UP06jtjFN7WcXAdx/
E5Gmoe9b1EiXWdReHjUGpc6k0LQ0PPXAwqrcGdwYbOLDZ5xsQ5AsEYSFtyTS60D1nHBcdNmW
M0eOUJFdJf/uNe/2EApc3a8TyEkZtVqiYtOVV3qDB9NmU4bVOkDqzl1F7zJwATWbmasSdkM3
6lxDkczBfCrEjH5p5Y8DU+ge4e4LRtknY9oBOJ7EQO0twYJg3k0=
[end]
_ATEOF


cat >test_hooks.lua <<'_ATEOF'

-- this is the "testing" set of lua hooks for monotone
-- it's intended to support self-tests, not for use in
-- production. just defines some of the std hooks.

function get_passphrase(keyid)
	return keyid
end

function non_blocking_rng_ok()
	return true
end

function get_manifest_cert_trust(signers, id, name, val)
   return true
end

function get_file_cert_trust(signers, id, name, val)
   return true
end

function accept_testresult_change(old_results, new_results)
   for test,res in pairs(old_results)
   do
      if res == true and new_results[test] ~= true
      then
	 return false
      end
   end
   return true
end

function get_author(branchname)
	return "tester@test.net"
end

function ignore_file(name)
	if (strfind(name, "test_hooks.lua")) then return true end
	if (strfind(name, "test.db")) then return true end
	return false
end

if (attr_functions == nil) then
  attr_functions = {}
end
attr_functions["test_attr"] =
  function(filename, value)
    io.write(string.format("test_attr:%s:%s\n", filename, value))
  end

_ATEOF


$at_traceoff
echo "t_unidiff2.at:10: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init"
echo t_unidiff2.at:10 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_unidiff2.at:10: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_unidiff2.at:10: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys"
echo t_unidiff2.at:10 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_unidiff2.at:10: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_unidiff2.at:10: rm test_keys"
echo t_unidiff2.at:10 >$at_check_line_file
( $at_traceon; rm test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_unidiff2.at:10: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



cat >firstfile.b64 <<'_ATEOF'
Ly8gY29weXJpZ2h0IChDKSAyMDAyLCAyMDAzIGdyYXlkb24gaG9hcmUgPGdyYXlkb25AcG9i
b3guY29tPgovLyBhbGwgcmlnaHRzIHJlc2VydmVkLgovLyBsaWNlbnNlZCB0byB0aGUgcHVi
bGljIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCAoPj0gMikKLy8gc2VlIHRoZSBm
aWxlIENPUFlJTkcgZm9yIGRldGFpbHMKCiNpbmNsdWRlIDxtYXA+CiNpbmNsdWRlIDxjc3Rk
aW8+CiNpbmNsdWRlIDxzZXQ+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxhbGdvcml0
aG0+CiNpbmNsdWRlIDxpdGVyYXRvcj4KI2luY2x1ZGUgPGJvb3N0L2ZpbGVzeXN0ZW0vcGF0
aC5ocHA+CiNpbmNsdWRlIDxib29zdC9maWxlc3lzdGVtL29wZXJhdGlvbnMuaHBwPgojaW5j
bHVkZSA8Ym9vc3QvbGV4aWNhbF9jYXN0LmhwcD4KCiNpbmNsdWRlICJjb21tYW5kcy5oaCIK
I2luY2x1ZGUgImNvbnN0YW50cy5oaCIKCiNpbmNsdWRlICJhcHBfc3RhdGUuaGgiCiNpbmNs
dWRlICJkaWZmX3BhdGNoLmhoIgojaW5jbHVkZSAiZmlsZV9pby5oaCIKI2luY2x1ZGUgImtl
eXMuaGgiCiNpbmNsdWRlICJtYW5pZmVzdC5oaCIKI2luY2x1ZGUgIm5ldHdvcmsuaGgiCiNp
bmNsdWRlICJwYWNrZXQuaGgiCiNpbmNsdWRlICJwYXRjaF9zZXQuaGgiCiNpbmNsdWRlICJy
Y3NfaW1wb3J0LmhoIgojaW5jbHVkZSAic2FuaXR5LmhoIgojaW5jbHVkZSAiY2VydC5oaCIK
I2luY2x1ZGUgInRyYW5zZm9ybXMuaGgiCiNpbmNsdWRlICJ1cGRhdGUuaGgiCiNpbmNsdWRl
ICJ2b2NhYi5oaCIKI2luY2x1ZGUgIndvcmsuaGgiCgovLwovLyB0aGlzIGZpbGUgZGVmaW5l
cyB0aGUgdGFzay1vcmllbnRlZCAidG9wIGxldmVsIiBjb21tYW5kcyB3aGljaCBjYW4gYmUK
Ly8gaXNzdWVkIGFzIHBhcnQgb2YgYSBtb25vdG9uZSBjb21tYW5kIGxpbmUuIHRoZSBjb21t
YW5kIGxpbmUgY2FuIG9ubHkKLy8gaGF2ZSBvbmUgc3VjaCBjb21tYW5kIG9uIGl0LCBmb2xs
b3dlZCBieSBhIHZlY3RvciBvZiBzdHJpbmdzIHdoaWNoIGFyZSBpdHMKLy8gYXJndW1lbnRz
LiBhbGwgLS1vcHRpb25zIHdpbGwgYmUgcHJvY2Vzc2VkIGJ5IHRoZSBtYWluIHByb2dyYW0g
KmJlZm9yZSoKLy8gY2FsbGluZyBhIGNvbW1hbmQKLy8KLy8gd2UgbWlnaHQgZXhwb3NlIHRo
aXMgYmx1bnQgY29tbWFuZCBpbnRlcmZhY2UgdG8gc2NyaXB0aW5nIHNvbWVkYXkuIGJ1dAov
LyBub3QgdG9kYXkuCgpuYW1lc3BhY2UgY29tbWFuZHMgCnsKICBzdHJ1Y3QgY29tbWFuZDsK
ICBib29sIG9wZXJhdG9yPChjb21tYW5kIGNvbnN0ICYgc2VsZiwgY29tbWFuZCBjb25zdCAm
IG90aGVyKTsKfTsKCm5hbWVzcGFjZSBzdGQKewogIHRlbXBsYXRlIDw+CiAgc3RydWN0IHN0
ZDo6Z3JlYXRlcjxjb21tYW5kczo6Y29tbWFuZCAqPgogIHsKICAgIGJvb2wgb3BlcmF0b3Io
KShjb21tYW5kczo6Y29tbWFuZCBjb25zdCAqIGEsIGNvbW1hbmRzOjpjb21tYW5kIGNvbnN0
ICogYikKICAgIHsKICAgICAgcmV0dXJuICphIDwgKmI7CiAgICB9CiAgfTsKfTsKCm5hbWVz
cGFjZSBjb21tYW5kcyAKewp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IGNvbW1hbmQ7
IAoKc3RhdGljIG1hcDxzdHJpbmcsY29tbWFuZCAqPiBjbWRzOwoKc3RydWN0IGNvbW1hbmQg
CnsKICBzdHJpbmcgbmFtZTsKICBzdHJpbmcgY21kZ3JvdXA7CiAgc3RyaW5nIHBhcmFtczsK
ICBzdHJpbmcgZGVzYzsKICBjb21tYW5kKHN0cmluZyBjb25zdCAmIG4sCgkgIHN0cmluZyBj
b25zdCAmIGcsCgkgIHN0cmluZyBjb25zdCAmIHAsCgkgIHN0cmluZyBjb25zdCAmIGQpIDog
bmFtZShuKSwgY21kZ3JvdXAoZyksIHBhcmFtcyhwKSwgZGVzYyhkKSAKICB7IGNtZHNbbl0g
PSB0aGlzOyB9CiAgdmlydHVhbCB+Y29tbWFuZCgpIHt9CiAgdmlydHVhbCB2b2lkIGV4ZWMo
YXBwX3N0YXRlICYgYXBwLCB2ZWN0b3I8c3RyaW5nPiBjb25zdCAmIGFyZ3MpID0gMDsKfTsK
CmJvb2wgb3BlcmF0b3I8KGNvbW1hbmQgY29uc3QgJiBzZWxmLCBjb21tYW5kIGNvbnN0ICYg
b3RoZXIpCnsKICByZXR1cm4gKChzZWxmLmNtZGdyb3VwIDwgb3RoZXIuY21kZ3JvdXApCgkg
IHx8ICgoc2VsZi5jbWRncm91cCA9PSBvdGhlci5jbWRncm91cCkgJiYgKHNlbGYubmFtZSA8
IG90aGVyLm5hbWUpKSk7Cn0KCgp2b2lkIGV4cGxhaW5fdXNhZ2Uoc3RyaW5nIGNvbnN0ICYg
Y21kLCBvc3RyZWFtICYgb3V0KQp7CiAgbWFwPHN0cmluZyxjb21tYW5kICo+Ojpjb25zdF9p
dGVyYXRvciBpOwogIGkgPSBjbWRzLmZpbmQoY21kKTsKICBpZiAoaSAhPSBjbWRzLmVuZCgp
KQogICAgewogICAgICBvdXQgPDwgIiAgICAgIiA8PCBpLT5zZWNvbmQtPm5hbWUgPDwgIiAi
IDw8IGktPnNlY29uZC0+cGFyYW1zIDw8IGVuZGwKCSAgPDwgIiAgICAgIiA8PCBpLT5zZWNv
bmQtPmRlc2MgPDwgZW5kbCA8PCBlbmRsOwogICAgICByZXR1cm47CiAgICB9CgogIHZlY3Rv
cjxjb21tYW5kICo+IHNvcnRlZDsKICBvdXQgPDwgImNvbW1hbmRzOiIgPDwgZW5kbDsKICBm
b3IgKGkgPSBjbWRzLmJlZ2luKCk7IGkgIT0gY21kcy5lbmQoKTsgKytpKQogICAgewogICAg
ICBzb3J0ZWQucHVzaF9iYWNrKGktPnNlY29uZCk7CiAgICB9CiAgCiAgc29ydChzb3J0ZWQu
YmVnaW4oKSwgc29ydGVkLmVuZCgpLCBzdGQ6OmdyZWF0ZXI8Y29tbWFuZCAqPigpKTsKCiAg
c3RyaW5nIGN1cnJfZ3JvdXA7CiAgc2l6ZV90IGNvbCA9IDA7CiAgc2l6ZV90IGNvbDIgPSAw
OwogIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc29ydGVkLnNpemUoKTsgKytpKQogICAgewog
ICAgICBjb2wyID0gY29sMiA+IHNvcnRlZFtpXS0+Y21kZ3JvdXAuc2l6ZSgpID8gY29sMiA6
IHNvcnRlZFtpXS0+Y21kZ3JvdXAuc2l6ZSgpOwogICAgfQoKICBmb3IgKHNpemVfdCBpID0g
MDsgaSA8IHNvcnRlZC5zaXplKCk7ICsraSkKICAgIHsKICAgICAgaWYgKHNvcnRlZFtpXS0+
Y21kZ3JvdXAgIT0gY3Vycl9ncm91cCkKCXsKCSAgY3Vycl9ncm91cCA9IHNvcnRlZFtpXS0+
Y21kZ3JvdXA7CgkgIG91dCA8PCBlbmRsOwoJICBvdXQgPDwgIiAgIiA8PCBzb3J0ZWRbaV0t
PmNtZGdyb3VwOwoJICBjb2wgPSBzb3J0ZWRbaV0tPmNtZGdyb3VwLnNpemUoKSArIDI7Cgkg
IHdoaWxlIChjb2wrKyA8IChjb2wyICsgMykpCgkgICAgb3V0IDw8ICcgJzsKCX0KICAgICAg
b3V0IDw8ICIgIiA8PCBzb3J0ZWRbaV0tPm5hbWU7CiAgICAgIGNvbCArPSBzb3J0ZWRbaV0t
Pm5hbWUuc2l6ZSgpICsgMTsKICAgICAgaWYgKGNvbCA+PSA3MCkKCXsKCSAgb3V0IDw8IGVu
ZGw7CgkgIGNvbCA9IDA7CgkgIHdoaWxlIChjb2wrKyA8IChjb2wyICsgMykpCgkgICAgb3V0
IDw8ICcgJzsKCX0KICAgIH0KICBvdXQgPDwgZW5kbCA8PCBlbmRsOwp9Cgp2b2lkIHByb2Nl
c3MoYXBwX3N0YXRlICYgYXBwLCBzdHJpbmcgY29uc3QgJiBjbWQsIHZlY3RvcjxzdHJpbmc+
IGNvbnN0ICYgYXJncykKewogIGlmIChjbWRzLmZpbmQoY21kKSAhPSBjbWRzLmVuZCgpKQog
ICAgewogICAgICBMKCJleGVjdXRpbmcgJXMgY29tbWFuZFxuIiwgY21kLmNfc3RyKCkpOwog
ICAgICBjbWRzW2NtZF0tPmV4ZWMoYXBwLCBhcmdzKTsKICAgIH0KICBlbHNlCiAgICB7CiAg
ICAgIHRocm93IHVzYWdlKGNtZCk7CiAgICB9Cn0KCiNkZWZpbmUgQ01EKEMsIGdyb3VwLCBw
YXJhbXMsIGRlc2MpICAgICAgICAgICAgICAgXApzdHJ1Y3QgY21kXyAjIyBDIDogcHVibGlj
IGNvbW1hbmQgICAgICAgICAgICAgICAgIFwKeyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBcCiAgY21kXyAjIyBDKCkgOiBjb21tYW5kKCNDLCBn
cm91cCwgcGFyYW1zLCBkZXNjKSAgXAogIHt9ICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIFwKICB2aXJ0dWFsIHZvaWQgZXhlYyhhcHBfc3RhdGUgJiBh
cHAsICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHN0cmluZz4g
Y29uc3QgJiBhcmdzKTsgXAp9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFwKc3RhdGljIGNtZF8gIyMgQyBDICMjIF9jbWQ7ICAgICAgICAgICAg
ICAgICAgICAgICBcCnZvaWQgY21kXyAjIyBDOjpleGVjKGFwcF9zdGF0ZSAmIGFwcCwgICAg
ICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8c3RyaW5nPiBjb25zdCAm
IGFyZ3MpIFwKCiNkZWZpbmUgQUxJQVMoQywgcmVhbGNvbW1hbmQsIGdyb3VwLCBwYXJhbXMs
IGRlc2MpCVwKQ01EKEMsIGdyb3VwLCBwYXJhbXMsIGRlc2MpCQkJCVwKewkJCQkJCQlcCiAg
cHJvY2VzcyhhcHAsIHN0cmluZygjcmVhbGNvbW1hbmQpLCBhcmdzKTsJCVwKfQoKCnN0YXRp
YyB2b2lkIGVuc3VyZV9ib29rZGlyKCkKewogIG1rZGlyX3AobG9jYWxfcGF0aChib29rX2tl
ZXBpbmdfZGlyKSk7Cn0KCnN0YXRpYyB2b2lkIGdldF9tYW5pZmVzdF9wYXRoKGxvY2FsX3Bh
dGggJiBtX3BhdGgpCnsKICBtX3BhdGggPSAoZnM6OnBhdGgoYm9va19rZWVwaW5nX2Rpcikg
LyBmczo6cGF0aChtYW5pZmVzdF9maWxlX25hbWUpKS5zdHJpbmcoKTsKICBMKCJtYW5pZmVz
dCBwYXRoIGlzICVzXG4iLCBtX3BhdGgoKS5jX3N0cigpKTsKfQoKc3RhdGljIHZvaWQgZ2V0
X3dvcmtfcGF0aChsb2NhbF9wYXRoICYgd19wYXRoKQp7CiAgd19wYXRoID0gKGZzOjpwYXRo
KGJvb2tfa2VlcGluZ19kaXIpIC8gZnM6OnBhdGgod29ya19maWxlX25hbWUpKS5zdHJpbmco
KTsKICBMKCJ3b3JrIHBhdGggaXMgJXNcbiIsIHdfcGF0aCgpLmNfc3RyKCkpOwp9CgpzdGF0
aWMgdm9pZCBnZXRfbWFuaWZlc3RfbWFwKG1hbmlmZXN0X21hcCAmIG0pCnsKICBlbnN1cmVf
Ym9va2RpcigpOwogIGxvY2FsX3BhdGggbV9wYXRoOwogIGJhc2U2NDwgZ3ppcDxkYXRhPiA+
IG1fZGF0YTsKICBnZXRfbWFuaWZlc3RfcGF0aChtX3BhdGgpOwogIGlmIChmaWxlX2V4aXN0
cyhtX3BhdGgpKQogICAgewogICAgICBMKCJsb2FkaW5nIG1hbmlmZXN0IGZpbGUgJXNcbiIs
IG1fcGF0aCgpLmNfc3RyKCkpOyAgICAgIAogICAgICByZWFkX2RhdGEobV9wYXRoLCBtX2Rh
dGEpOwogICAgICByZWFkX21hbmlmZXN0X21hcChtYW5pZmVzdF9kYXRhKG1fZGF0YSksIG0p
OwogICAgICBMKCJyZWFkICVkIG1hbmlmZXN0IGVudHJpZXNcbiIsIG0uc2l6ZSgpKTsKICAg
IH0KICBlbHNlCiAgICB7CiAgICAgIEwoIm5vIG1hbmlmZXN0IGZpbGUgJXNcbiIsIG1fcGF0
aCgpLmNfc3RyKCkpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBwdXRfbWFuaWZlc3RfbWFwKG1h
bmlmZXN0X21hcCBjb25zdCAmIG0pCnsKICBlbnN1cmVfYm9va2RpcigpOwogIGxvY2FsX3Bh
dGggbV9wYXRoOwogIG1hbmlmZXN0X2RhdGEgbV9kYXRhOwogIGdldF9tYW5pZmVzdF9wYXRo
KG1fcGF0aCk7CiAgTCgid3JpdGluZyBtYW5pZmVzdCBmaWxlICVzXG4iLCBtX3BhdGgoKS5j
X3N0cigpKTsKICB3cml0ZV9tYW5pZmVzdF9tYXAobSwgbV9kYXRhKTsKICB3cml0ZV9kYXRh
KG1fcGF0aCwgbV9kYXRhLmlubmVyKCkpOwogIEwoIndyb3RlICVkIG1hbmlmZXN0IGVudHJp
ZXNcbiIsIG0uc2l6ZSgpKTsKfQoKc3RhdGljIHZvaWQgZ2V0X3dvcmtfc2V0KHdvcmtfc2V0
ICYgdykKewogIGVuc3VyZV9ib29rZGlyKCk7CiAgbG9jYWxfcGF0aCB3X3BhdGg7CiAgZ2V0
X3dvcmtfcGF0aCh3X3BhdGgpOwogIGlmIChmaWxlX2V4aXN0cyh3X3BhdGgpKQogICAgewog
ICAgICBMKCJjaGVja2luZyBmb3IgdW4tY29tbWl0dGVkIHdvcmsgZmlsZSAlc1xuIiwgCgl3
X3BhdGgoKS5jX3N0cigpKTsKICAgICAgZGF0YSB3X2RhdGE7CiAgICAgIHJlYWRfZGF0YSh3
X3BhdGgsIHdfZGF0YSk7CiAgICAgIHJlYWRfd29ya19zZXQod19kYXRhLCB3KTsKICAgICAg
TCgicmVhZCAlZCBkZWxzLCAlZCBhZGRzIGZyb20gJXNcbiIsIAoJdy5kZWxzLnNpemUoKSwg
dy5hZGRzLnNpemUoKSwgd19wYXRoKCkuY19zdHIoKSk7CiAgICB9CiAgZWxzZQogICAgewog
ICAgICBMKCJubyB1bi1jb21taXR0ZWQgd29yayBmaWxlICVzXG4iLCB3X3BhdGgoKS5jX3N0
cigpKTsKICAgIH0KfQoKc3RhdGljIHZvaWQgcHV0X3dvcmtfc2V0KHdvcmtfc2V0ICYgdykK
ewogIGxvY2FsX3BhdGggd19wYXRoOwogIGdldF93b3JrX3BhdGgod19wYXRoKTsKCiAgaWYg
KHcuYWRkcy5zaXplKCkgPiAwCiAgICAgIHx8IHcuZGVscy5zaXplKCkgPiAwKQogICAgewog
ICAgICBlbnN1cmVfYm9va2RpcigpOwogICAgICBkYXRhIHdfZGF0YTsKICAgICAgd3JpdGVf
d29ya19zZXQod19kYXRhLCB3KTsKICAgICAgd3JpdGVfZGF0YSh3X3BhdGgsIHdfZGF0YSk7
CiAgICB9CiAgZWxzZQogICAgewogICAgICBkZWxldGVfZmlsZSh3X3BhdGgpOwogICAgfQp9
CgpzdGF0aWMgdm9pZCBjYWxjdWxhdGVfbmV3X21hbmlmZXN0X21hcChtYW5pZmVzdF9tYXAg
Y29uc3QgJiBtX29sZCwgCgkJCQkgICAgICAgbWFuaWZlc3RfbWFwICYgbV9uZXcpCnsKICBw
YXRoX3NldCBwYXRoczsKICB3b3JrX3NldCB3b3JrOwogIGV4dHJhY3RfcGF0aF9zZXQobV9v
bGQsIHBhdGhzKTsKICBnZXRfd29ya19zZXQod29yayk7CiAgaWYgKHdvcmsuZGVscy5zaXpl
KCkgPiAwKQogICAgTCgicmVtb3ZpbmcgJWQgZGVhZCBmaWxlcyBmcm9tIG1hbmlmZXN0XG4i
LCAKICAgICAgd29yay5kZWxzLnNpemUoKSk7CiAgaWYgKHdvcmsuYWRkcy5zaXplKCkgPiAw
KQogICAgTCgiYWRkaW5nICVkIGZpbGVzIHRvIG1hbmlmZXN0XG4iLCB3b3JrLmFkZHMuc2l6
ZSgpKTsKICBhcHBseV93b3JrX3NldCh3b3JrLCBwYXRocyk7CiAgYnVpbGRfbWFuaWZlc3Rf
bWFwKHBhdGhzLCBtX25ldyk7Cn0KCnN0YXRpYyBzdHJpbmcgZ2V0X3N0ZGluKCkKewogIGNo
YXIgYnVmW2J1ZnN6XTsKICBzdHJpbmcgdG1wOwogIHdoaWxlKGNpbikKICAgIHsKICAgICAg
Y2luLnJlYWQoYnVmLCBidWZzeik7CiAgICAgIHRtcC5hcHBlbmQoYnVmLCBjaW4uZ2NvdW50
KCkpOwogICAgfQogIHJldHVybiB0bXA7Cn0KCnN0YXRpYyB2b2lkIGdldF9sb2dfbWVzc2Fn
ZShwYXRjaF9zZXQgY29uc3QgJiBwcywgCgkJCSAgICBhcHBfc3RhdGUgJiBhcHAsCgkJCSAg
ICBzdHJpbmcgJiBsb2dfbWVzc2FnZSkKewogIHN0cmluZyBjb21tZW50YXJ5OwogIHN0cmlu
ZyBzdW1tYXJ5OwogIHN0cmluZ3N0cmVhbSBzczsKICBwYXRjaF9zZXRfdG9fdGV4dF9zdW1t
YXJ5KHBzLCBzcyk7CiAgc3VtbWFyeSA9IHNzLnN0cigpOwogIGNvbW1lbnRhcnkgKz0gIi0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS1cbiI7CiAgY29tbWVudGFyeSArPSAiRW50ZXIgTG9nLiAgTGluZXMg
YmVnaW5uaW5nIHdpdGggYE1UOicgYXJlIHJlbW92ZWQgYXV0b21hdGljYWxseVxuIjsKICBj
b21tZW50YXJ5ICs9ICJcbiI7CiAgY29tbWVudGFyeSArPSAiU3VtbWFyeSBvZiBjaGFuZ2Vz
OlxuIjsKICBjb21tZW50YXJ5ICs9ICJcbiI7CiAgY29tbWVudGFyeSArPSBzdW1tYXJ5Owog
IGNvbW1lbnRhcnkgKz0gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7CiAgTihhcHAubHVhLmhvb2tf
ZWRpdF9jb21tZW50KGNvbW1lbnRhcnksIGxvZ19tZXNzYWdlKSwKICAgICJlZGl0IG9mIGxv
ZyBtZXNzYWdlIGZhaWxlZCIpOwp9CgoKLy8gdGhlIGdvYWwgaGVyZSBpcyB0byBsb29rIGJh
Y2sgdGhyb3VnaCB0aGUgYW5jZXN0cnkgb2YgdGhlIHByb3ZpZGVkCi8vIGNoaWxkLCBjaGVj
a2luZyB0byBzZWUgdGhlIGxlYXN0IGFuY2VzdG9yIGl0IGhhcyB3aGljaCB3ZSByZWNlaXZl
ZCBmcm9tCi8vIHRoZSBnaXZlbiBuZXR3b3JrIHVybC9ncm91cCBwYWlyLgovLwovLyB3ZSB1
c2UgdGhlIGFuY2VzdG9yIGFzIHRoZSBzb3VyY2UgbWFuaWZlc3Qgd2hlbiBidWlsZGluZyBh
IHBhdGNoc2V0IHRvCi8vIHNlbmQgdG8gdGhhdCB1cmwvZ3JvdXAuCgpzdGF0aWMgYm9vbCBm
aW5kX2FuY2VzdG9yX29uX25ldHNlcnZlciAobWFuaWZlc3RfaWQgY29uc3QgJiBjaGlsZCwg
CgkJCQkJdXJsIGNvbnN0ICYgdSwKCQkJCQlncm91cCBjb25zdCAmIGcsIAoJCQkJCW1hbmlm
ZXN0X2lkICYgYW5jLAoJCQkJCWFwcF9zdGF0ZSAmIGFwcCkKewogIHNldDxtYW5pZmVzdF9p
ZD4gZnJvbnRpZXI7CiAgY2VydF9uYW1lIHRuKGFuY2VzdG9yX2NlcnRfbmFtZSk7CiAgZnJv
bnRpZXIuaW5zZXJ0KGNoaWxkKTsKCiAgd2hpbGUgKCFmcm9udGllci5lbXB0eSgpKQogICAg
ewogICAgICBzZXQ8bWFuaWZlc3RfaWQ+IG5leHRfZnJvbnRpZXI7CiAgICAgIGZvciAoc2V0
PG1hbmlmZXN0X2lkPjo6Y29uc3RfaXRlcmF0b3IgaSA9IGZyb250aWVyLmJlZ2luKCk7Cgkg
ICBpICE9IGZyb250aWVyLmVuZCgpOyArK2kpCgl7CgkgIHZlY3RvcjwgbWFuaWZlc3Q8Y2Vy
dD4gPiB0bXA7CgkgIGFwcC5kYi5nZXRfbWFuaWZlc3RfY2VydHMoKmksIHRuLCB0bXApOwoK
CSAgLy8gd2UgZ28gdGhyb3VnaCB0aGlzIHZlY3RvciBiYWNrd2FyZHMgYmVjYXVzZSB3ZSB3
b3VsZCBwcmVmZXIgdG8KCSAgLy8gaGl0IG1vcmUgcmVjZW50bHktcXVldWVkIGFuY2VzdG9y
cyAoc3VjaCBhcyBpbnRlcm1lZGlhdGUgbm9kZXMKCSAgLy8gaW4gYSBtdWx0aS1ub2RlIG1l
cmdlKSByYXRoZXIgdGhhbiBvbGRlciBhbmNlc3RvcnMuIGJ1dCBvZgoJICAvLyBjb3Vyc2Us
IGFueSBhbmNlc3RvciB3aWxsIGRvLgoKCSAgZm9yICh2ZWN0b3I8IG1hbmlmZXN0PGNlcnQ+
ID46OnJldmVyc2VfaXRlcmF0b3IgaiA9IHRtcC5yYmVnaW4oKTsKCSAgICAgICBqICE9IHRt
cC5yZW5kKCk7ICsraikKCSAgICB7CgkgICAgICBjZXJ0X3ZhbHVlIHR2OwoJICAgICAgZGVj
b2RlX2Jhc2U2NChqLT5pbm5lcigpLnZhbHVlLCB0dik7CgkgICAgICBtYW5pZmVzdF9pZCBh
bmNfaWQgKHR2KCkpOwoKCSAgICAgIEwoImxvb2tpbmcgZm9yIHBhcmVudCAlcyBvZiAlcyBv
biBzZXJ2ZXJcbiIsIAoJCWktPmlubmVyKCkoKS5jX3N0cigpLAoJCWFuY19pZC5pbm5lcigp
KCkuY19zdHIoKSk7CgoJICAgICAgaWYgKGFwcC5kYi5tYW5pZmVzdF9leGlzdHNfb25fbmV0
c2VydmVyICh1LCBnLCBhbmNfaWQpKQoJCXsKCQkgIEwoImZvdW5kIHBhcmVudCAlcyBvbiBz
ZXJ2ZXJcbiIsIGFuY19pZC5pbm5lcigpKCkuY19zdHIoKSk7CgkJICBhbmMgPSBhbmNfaWQ7
CgkJICByZXR1cm4gdHJ1ZTsKCQl9CgkgICAgICBlbHNlCgkJbmV4dF9mcm9udGllci5pbnNl
cnQoYW5jX2lkKTsKCSAgICB9CSAgCgl9CgogICAgICBmcm9udGllciA9IG5leHRfZnJvbnRp
ZXI7CiAgICB9CgogIHJldHVybiBmYWxzZTsKfQoKCnN0YXRpYyB2b2lkIHF1ZXVlX2VkZ2Vf
Zm9yX3RhcmdldF9hbmNlc3RvciAocGFpcjx1cmwsZ3JvdXA+IGNvbnN0ICYgdGFyZywKCQkJ
CQkgICAgbWFuaWZlc3RfaWQgY29uc3QgJiBjaGlsZF9pZCwKCQkJCQkgICAgbWFuaWZlc3Rf
bWFwIGNvbnN0ICYgY2hpbGRfbWFwLAoJCQkJCSAgICBhcHBfc3RhdGUgJiBhcHApCnsgIAog
IC8vIG5vdyBoZXJlIGlzIGFuIGludGVyZXN0aW5nIHRoaW5nOiB3ZSAqbWlnaHQqIGJlIHNl
bmRpbmcgZGF0YSB0byBhCiAgLy8gZGVwb3QsIG9yIHNvbWVvbmUgd2l0aCBpbmRldGVybWlu
YXRlIHByZS1leGlzdGluZyBzdGF0ZSAoc2F5IHRoZSBmaXJzdAogIC8vIHRpbWUgd2UgcG9z
dCB0byBuZXRuZXdzKSwgdGhlcmVmb3JlIHdlIGNhbm5vdCBqdXN0ICJzZW5kIHRoZSBlZGdl
IiB3ZQogIC8vIGp1c3QgY29uc3RydWN0ZWQgaW4gYSBtZXJnZSBvciBjb21taXQsIHdlIG5l
ZWQgdG8gc2VuZCBhbiBlZGdlIGZyb20gYQogIC8vIHBhcmVudCB3aGljaCB3ZSBrbm93IHRv
IGJlIHByZXNlbnQgaW4gdGhlIGRlcG90IChvciBlbHNlIGFuIGVkZ2UgZnJvbQogIC8vIHRo
ZSBlbXB0eSBtYXAgLS0gZnVsbCBjb250ZW50cyBvZiBhbGwgZmlsZXMpLiB3aGF0IGlzIHNl
bnQgdGhlcmVmb3JlCiAgLy8gY2hhbmdlcyBvbiBhIGRlcG90LWJ5LWRlcG90IGJhc2lzLiB0
aGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlCiAgLy8gYXBwcm9wcmlhdGUgdGhpbmcgdG8g
c2VuZC4KICAvLwogIC8vIG5iOiB0aGlzIGhhcyBubyBkaXJlY3QgcmVsYXRpb24gdG8gd2hh
dCB3ZSBzdG9yZSBpbiBvdXIgb3duCiAgLy8gZGF0YWJhc2UuIHdlIGFsd2F5cyBzdG9yZSB0
aGUgZWRnZSBmcm9tIG91ciBwYXJlbnQsIGFuZCB3ZSBhbHdheXMga25vdwogIC8vIHdoZW4g
d2UgaGF2ZSBhIHBhcmVudC4KCiAgdmVjdG9yPCBwYWlyPHVybCwgZ3JvdXA+ID4gb25lX3Rh
cmdldDsKICBvbmVfdGFyZ2V0LnB1c2hfYmFjayh0YXJnKTsKICBxdWV1ZWluZ19wYWNrZXRf
d3JpdGVyIHFwdyhhcHAsIG9uZV90YXJnZXQpOwogIAogIG1hbmlmZXN0X2RhdGEgdGFyZ19h
bmNlc3Rvcl9kYXRhOwogIG1hbmlmZXN0X21hcCB0YXJnX2FuY2VzdG9yX21hcDsKICBtYW5p
ZmVzdF9pZCB0YXJnX2FuY2VzdG9yX2lkOwogIAogIGlmIChmaW5kX2FuY2VzdG9yX29uX25l
dHNlcnZlciAoY2hpbGRfaWQsIAoJCQkJICB0YXJnLmZpcnN0LCAKCQkJCSAgdGFyZy5zZWNv
bmQsIAoJCQkJICB0YXJnX2FuY2VzdG9yX2lkLCAKCQkJCSAgYXBwKSkKICAgIHsJICAgIAog
ICAgICBhcHAuZGIuZ2V0X21hbmlmZXN0X3ZlcnNpb24odGFyZ19hbmNlc3Rvcl9pZCwgdGFy
Z19hbmNlc3Rvcl9kYXRhKTsKICAgICAgcmVhZF9tYW5pZmVzdF9tYXAodGFyZ19hbmNlc3Rv
cl9kYXRhLCB0YXJnX2FuY2VzdG9yX21hcCk7CiAgICB9CgogIHBhdGNoX3NldCBwczsKICBt
YW5pZmVzdHNfdG9fcGF0Y2hfc2V0KHRhcmdfYW5jZXN0b3JfbWFwLCBjaGlsZF9tYXAsIGFw
cCwgcHMpOwogIHBhdGNoX3NldF90b19wYWNrZXRzKHBzLCBhcHAsIHFwdyk7CgogIC8vIG5v
dyB0aGF0IHdlJ3ZlIHF1ZXVlZCB0aGUgZGF0YSwgd2UgY2FuIG5vdGUgdGhpcyBuZXcgY2hp
bGQKICAvLyBub2RlIGFzIGV4aXN0aW5nICh3ZWxsIC4uIHNvb24tdG8tZXhpc3QpIG9uIHRo
ZSBzZXJ2ZXIKICBhcHAuZGIubm90ZV9tYW5pZmVzdF9vbl9uZXRzZXJ2ZXIgKHRhcmcuZmly
c3QsIHRhcmcuc2Vjb25kLCBjaGlsZF9pZCk7Cgp9CgoKLy8gdGhpcyBoZWxwZXIgdHJpZXMg
dG8gcHJvZHVjZSBtZXJnZSA8LSBtZXJnZU4obGVmdCxyaWdodCksIHBvc3NpYmx5Ci8vIG1l
cmdlMyBpZiBpdCBjYW4gZmluZCBhbiBhbmNlc3Rvciwgb3RoZXJ3aXNlIG1lcmdlMi4gaXQg
YWxzbyBxdWV1ZXMgdGhlCi8vIGFwcHJvcHJpYXRlIGVkZ2VzIGZyb20ga25vd24gYW5jZXN0
b3JzIHRvIHRoZSBuZXcgbWVyZ2Ugbm9kZSwgdG8gYmUKLy8gdHJhbnNtaXR0ZWQgdG8gZWFj
aCBvZiB0aGUgdGFyZ2V0cyBwcm92aWRlZC4KCnN0YXRpYyB2b2lkIHRyeV9vbmVfbWVyZ2Uo
bWFuaWZlc3RfaWQgY29uc3QgJiBsZWZ0LAoJCQkgIG1hbmlmZXN0X2lkIGNvbnN0ICYgcmln
aHQsCgkJCSAgbWFuaWZlc3RfaWQgJiBtZXJnZWQsCgkJCSAgYXBwX3N0YXRlICYgYXBwLCAK
CQkJICB2ZWN0b3I8IHBhaXI8dXJsLGdyb3VwPiA+IGNvbnN0ICYgdGFyZ2V0cykKewogIG1h
bmlmZXN0X2RhdGEgbGVmdF9kYXRhLCByaWdodF9kYXRhLCBhbmNlc3Rvcl9kYXRhLCBtZXJn
ZWRfZGF0YTsKICBtYW5pZmVzdF9tYXAgbGVmdF9tYXAsIHJpZ2h0X21hcCwgYW5jZXN0b3Jf
bWFwLCBtZXJnZWRfbWFwOwogIG1hbmlmZXN0X2lkIGFuY2VzdG9yOwoKICBhcHAuZGIuZ2V0
X21hbmlmZXN0X3ZlcnNpb24obGVmdCwgbGVmdF9kYXRhKTsKICBhcHAuZGIuZ2V0X21hbmlm
ZXN0X3ZlcnNpb24ocmlnaHQsIHJpZ2h0X2RhdGEpOwogIHJlYWRfbWFuaWZlc3RfbWFwKGxl
ZnRfZGF0YSwgbGVmdF9tYXApOwogIHJlYWRfbWFuaWZlc3RfbWFwKHJpZ2h0X2RhdGEsIHJp
Z2h0X21hcCk7CiAgCiAgc2ltcGxlX21lcmdlX3Byb3ZpZGVyIG1lcmdlcihhcHApOwogIAog
IGlmKGZpbmRfY29tbW9uX2FuY2VzdG9yKGxlZnQsIHJpZ2h0LCBhbmNlc3RvciwgYXBwKSkJ
ICAgIAogICAgewogICAgICBQKCJjb21tb24gYW5jZXN0b3IgJXMgZm91bmQsIHRyeWluZyBt
ZXJnZTNcbiIsIGFuY2VzdG9yLmlubmVyKCkoKS5jX3N0cigpKTsgCiAgICAgIGFwcC5kYi5n
ZXRfbWFuaWZlc3RfdmVyc2lvbihhbmNlc3RvciwgYW5jZXN0b3JfZGF0YSk7CiAgICAgIHJl
YWRfbWFuaWZlc3RfbWFwKGFuY2VzdG9yX2RhdGEsIGFuY2VzdG9yX21hcCk7CiAgICAgIE4o
bWVyZ2UzKGFuY2VzdG9yX21hcCwgbGVmdF9tYXAsIHJpZ2h0X21hcCwgCgkgICAgICAgYXBw
LCBtZXJnZXIsIG1lcmdlZF9tYXApLAoJKHN0cmluZygiZmFpbGVkIHRvIG1lcmdlIG1hbmlm
ZXN0cyAiKQoJICsgbGVmdC5pbm5lcigpKCkgKyAiIGFuZCAiICsgcmlnaHQuaW5uZXIoKSgp
KSk7CSAgICAgIAogICAgfQogIGVsc2UKICAgIHsKICAgICAgUCgibm8gY29tbW9uIGFuY2Vz
dG9yIGZvdW5kLCB0cnlpbmcgbWVyZ2UyXG4iKTsgCiAgICAgIE4obWVyZ2UyKGxlZnRfbWFw
LCByaWdodF9tYXAsIGFwcCwgbWVyZ2VyLCBtZXJnZWRfbWFwKSwKCShzdHJpbmcoImZhaWxl
ZCB0byBtZXJnZSBtYW5pZmVzdHMgIikKCSArIGxlZnQuaW5uZXIoKSgpICsgIiBhbmQgIiAr
IHJpZ2h0LmlubmVyKCkoKSkpOwkgICAgICAKICAgIH0KICAKICB3cml0ZV9tYW5pZmVzdF9t
YXAobWVyZ2VkX21hcCwgbWVyZ2VkX2RhdGEpOwogIGNhbGN1bGF0ZV9tYW5pZmVzdF9tYXBf
aWRlbnQobWVyZ2VkX21hcCwgbWVyZ2VkKTsJICAKICAKICBiYXNlNjQ8IGd6aXA8ZGVsdGE+
ID4gbGVmdF9lZGdlOwogIGRpZmYobGVmdF9kYXRhLmlubmVyKCksIG1lcmdlZF9kYXRhLmlu
bmVyKCksIGxlZnRfZWRnZSk7CgogIC8vIEZJWE1FOiB3ZSBkbyAqbm90KiBtYW51ZmFjdHVy
ZSBvciBzdG9yZSB0aGUgc2Vjb25kIGVkZ2UgdG8KICAvLyB0aGUgbWVyZ2VkIHZlcnNpb24s
IHNpbmNlIGRvaW5nIHNvIHZpb2xhdGVzIHRoZQogIC8vIGFzc3VtcHRpb25zIG9mIHRoZSBk
YiwgYW5kIHRoZSAncmlnaHQnIHZlcnNpb24gYWxyZWFkeQogIC8vIGV4aXN0cyBpbiBpdHMg
ZW50aXJldHksIGFueXdheXMuIHRoaXMgaXMgYSBzdWJ0bGUgaXNzdWUKICAvLyB0aG91Z2gg
YW5kIEknbSBub3Qgc3VyZSBJJ20gbWFraW5nIHRoZSByaWdodAogIC8vIGRlY2lzaW9uLiBy
ZXZpc2l0LiBpZiB5b3UgZG8gbm90IHNlZSB0aGF0IGl0IGlzIGEgc3VidGxlCiAgLy8gaXNz
dWUgSSBzdWdnZXN0IHlvdSBhcmUgbm90IHRoaW5raW5nIGFib3V0IGl0IGxvbmcgZW5vdWdo
LgogIC8vCiAgLy8gYmFzZTY0PCBnemlwPGRlbHRhPiA+IHJpZ2h0X2VkZ2U7CiAgLy8gZGlm
ZihyaWdodF9kYXRhLmlubmVyKCksIG1lcmdlZF9kYXRhLmlubmVyKCksIHJpZ2h0X2VkZ2Up
OwogIC8vIGFwcC5kYi5wdXRfbWFuaWZlc3RfdmVyc2lvbihyaWdodCwgbWVyZ2VkLCByaWdo
dF9lZGdlKTsKICAKICAKICAvLyB3ZSBkbyBvZiBjb3Vyc2UgcmVjb3JkIHRoZSBsZWZ0IGVk
Z2UsIGFuZCBhbmNlc3RyeSByZWxhdGlvbnNoaXAgdG8KICAvLyBib3RoIHByZWRlY2Vzc29y
cy4KCiAgewogICAgcGFja2V0X2RiX3dyaXRlciBkYncoYXBwKTsgICAgCgogICAgZGJ3LmNv
bnN1bWVfbWFuaWZlc3RfZGVsdGEobGVmdCwgbWVyZ2VkLCBsZWZ0X2VkZ2UpOyAgCiAgICBj
ZXJ0X21hbmlmZXN0X2FuY2VzdG9yKGxlZnQsIG1lcmdlZCwgYXBwLCBkYncpOwogICAgY2Vy
dF9tYW5pZmVzdF9hbmNlc3RvcihyaWdodCwgbWVyZ2VkLCBhcHAsIGRidyk7CiAgICBjZXJ0
X21hbmlmZXN0X2RhdGVfbm93KG1lcmdlZCwgYXBwLCBkYncpOwogICAgY2VydF9tYW5pZmVz
dF9hdXRob3JfZGVmYXVsdChtZXJnZWQsIGFwcCwgZGJ3KTsKICAgIAogICAgLy8gbWFrZSBz
dXJlIHRoZSBhcHByb3ByaWF0ZSBlZGdlcyBnZXQgcXVldWVkIGZvciB0aGUgbmV0d29yay4K
ICAgIGZvciAodmVjdG9yPCBwYWlyPHVybCxncm91cD4gPjo6Y29uc3RfaXRlcmF0b3IgdGFy
ZyA9IHRhcmdldHMuYmVnaW4oKTsKCSB0YXJnICE9IHRhcmdldHMuZW5kKCk7ICsrdGFyZykK
ICAgICAgewoJcXVldWVfZWRnZV9mb3JfdGFyZ2V0X2FuY2VzdG9yICgqdGFyZywgbWVyZ2Vk
LCBtZXJnZWRfbWFwLCBhcHApOwogICAgICB9CiAgICAKICAgIHF1ZXVlaW5nX3BhY2tldF93
cml0ZXIgcXB3KGFwcCwgdGFyZ2V0cyk7CiAgICBjZXJ0X21hbmlmZXN0X2FuY2VzdG9yKGxl
ZnQsIG1lcmdlZCwgYXBwLCBxcHcpOwogICAgY2VydF9tYW5pZmVzdF9hbmNlc3RvcihyaWdo
dCwgbWVyZ2VkLCBhcHAsIHFwdyk7CiAgICBjZXJ0X21hbmlmZXN0X2RhdGVfbm93KG1lcmdl
ZCwgYXBwLCBxcHcpOwogICAgY2VydF9tYW5pZmVzdF9hdXRob3JfZGVmYXVsdChtZXJnZWQs
IGFwcCwgcXB3KTsKICB9Cgp9CQkJICAKCgovLyBhY3R1YWwgY29tbWFuZHMgZm9sbG93CgpD
TUQobHNjZXJ0cywgImtleSBhbmQgY2VydCIsICIoZmlsZXxtYW5pZmVzdCkgPGlkPiIsIAog
ICAgImxpc3QgY2VydHMgYXNzb2NpYXRlZCB3aXRoIG1hbmlmZXN0IG9yIGZpbGUiKQp7CiAg
aWYgKGFyZ3Muc2l6ZSgpICE9IDIpCiAgICB0aHJvdyB1c2FnZShuYW1lKTsKCiAgdmVjdG9y
PGNlcnQ+IGNlcnRzOwoKICB0cmFuc2FjdGlvbl9ndWFyZCBndWFyZChhcHAuZGIpOwoKICBp
ZiAoYXJnc1swXSA9PSAibWFuaWZlc3QiKQogICAgewogICAgICBtYW5pZmVzdF9pZCBpZGVu
dChhcmdzWzFdKTsKICAgICAgdmVjdG9yPCBtYW5pZmVzdDxjZXJ0PiA+IHRzOwogICAgICBh
cHAuZGIuZ2V0X21hbmlmZXN0X2NlcnRzKGlkZW50LCB0cyk7CiAgICAgIGZvciAoc2l6ZV90
IGkgPSAwOyBpIDwgdHMuc2l6ZSgpOyArK2kpCgljZXJ0cy5wdXNoX2JhY2sodHNbaV0uaW5u
ZXIoKSk7CiAgICB9CiAgZWxzZSBpZiAoYXJnc1swXSA9PSAiZmlsZSIpCiAgICB7CiAgICAg
IGZpbGVfaWQgaWRlbnQoYXJnc1sxXSk7CiAgICAgIHZlY3RvcjwgZmlsZTxjZXJ0PiA+IHRz
OwogICAgICBhcHAuZGIuZ2V0X2ZpbGVfY2VydHMoaWRlbnQsIHRzKTsKICAgICAgZm9yIChz
aXplX3QgaSA9IDA7IGkgPCB0cy5zaXplKCk7ICsraSkKCWNlcnRzLnB1c2hfYmFjayh0c1tp
XS5pbm5lcigpKTsKICAgIH0KICBlbHNlCiAgICB0aHJvdyB1c2FnZShuYW1lKTsKCQogIGZv
ciAoc2l6ZV90IGkgPSAwOyBpIDwgY2VydHMuc2l6ZSgpOyArK2kpCiAgICB7CiAgICAgIGJv
b2wgb2sgPSBjaGVja19jZXJ0KGFwcCwgY2VydHNbaV0pOwogICAgICBjZXJ0X3ZhbHVlIHR2
OyAgICAgIAogICAgICBkZWNvZGVfYmFzZTY0KGNlcnRzW2ldLnZhbHVlLCB0dik7CiAgICAg
IHN0cmluZyB3YXNoZWQ7CiAgICAgIGlmIChndWVzc19iaW5hcnkodHYoKSkpCgl7CgkgIHdh
c2hlZCA9ICI8YmluYXJ5IGRhdGE+IjsKCX0KICAgICAgZWxzZQoJewoJICB3YXNoZWQgPSB0
digpOwoJfQogICAgICBzdHJpbmcgaGVhZCA9IHN0cmluZyhvayA/ICJvayBzaWcgZnJvbSAi
IDogImJhZCBzaWcgZnJvbSAiKQoJKyAiWyIgKyBjZXJ0c1tpXS5rZXkoKSArICJdIDogIiAK
CSsgIlsiICsgY2VydHNbaV0ubmFtZSgpICsgIl0gPSBbIjsKICAgICAgc3RyaW5nIHBhZCho
ZWFkLnNpemUoKSwgJyAnKTsKICAgICAgdmVjdG9yPHN0cmluZz4gbGluZXM7CiAgICAgIHNw
bGl0X2ludG9fbGluZXMod2FzaGVkLCBsaW5lcyk7CiAgICAgIEkobGluZXMuc2l6ZSgpID4g
MCk7CiAgICAgIGNvdXQgPDwgaGVhZCA8PCBsaW5lc1swXSA7CiAgICAgIGZvciAoc2l6ZV90
IGkgPSAxOyBpIDwgbGluZXMuc2l6ZSgpOyArK2kpCgljb3V0IDw8IGVuZGwgPDwgcGFkIDw8
IGxpbmVzW2ldOwogICAgICBjb3V0IDw8ICJdIiA8PCBlbmRsOwogICAgfSAgCiAgZ3VhcmQu
Y29tbWl0KCk7Cn0KCkNNRChsc2tleXMsICJrZXkgYW5kIGNlcnQiLCAiW3BhcnRpYWwtaWRd
IiwgImxpc3Qga2V5cyIpCnsKICB2ZWN0b3I8cnNhX2tleXBhaXJfaWQ+IHB1YmtleXM7CiAg
dmVjdG9yPHJzYV9rZXlwYWlyX2lkPiBwcml2a2V5czsKCiAgdHJhbnNhY3Rpb25fZ3VhcmQg
Z3VhcmQoYXBwLmRiKTsKCiAgaWYgKGFyZ3Muc2l6ZSgpID09IDApCiAgICBhcHAuZGIuZ2V0
X2tleV9pZHMoIiIsIHB1YmtleXMsIHByaXZrZXlzKTsKICBlbHNlIGlmIChhcmdzLnNpemUo
KSA9PSAxKQogICAgYXBwLmRiLmdldF9rZXlfaWRzKGFyZ3NbMF0sIHB1YmtleXMsIHByaXZr
ZXlzKTsKICBlbHNlCiAgICB0aHJvdyB1c2FnZShuYW1lKTsKICAKICBpZiAocHVia2V5cy5z
aXplKCkgPiAwKQogICAgewogICAgICBjb3V0IDw8IGVuZGwgPDwgIltwdWJsaWMga2V5c10i
IDw8IGVuZGw7CiAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHVia2V5cy5zaXplKCk7
ICsraSkKCWNvdXQgPDwgcHVia2V5c1tpXSgpIDw8IGVuZGw7CiAgICAgIGNvdXQgPDwgZW5k
bDsKICAgIH0KCiAgaWYgKHByaXZrZXlzLnNpemUoKSA+IDApCiAgICB7CiAgICAgIGNvdXQg
PDwgZW5kbCA8PCAiW3ByaXZhdGUga2V5c10iIDw8IGVuZGw7CiAgICAgIGZvciAoc2l6ZV90
IGkgPSAwOyBpIDwgcHJpdmtleXMuc2l6ZSgpOyArK2kpCgljb3V0IDw8IHByaXZrZXlzW2ld
KCkgPDwgZW5kbDsKICAgICAgY291dCA8PCBlbmRsOwogICAgfQoKICBndWFyZC5jb21taXQo
KTsKfQoKQ01EKGdlbmtleSwgImtleSBhbmQgY2VydCIsICI8a2V5aWQ+IiwgImdlbmVyYXRl
IGFuIFJTQSBrZXktcGFpciIpCnsKICBpZiAoYXJncy5zaXplKCkgIT0gMSkKICAgIHRocm93
IHVzYWdlKG5hbWUpOwogIAogIHRyYW5zYWN0aW9uX2d1YXJkIGd1YXJkKGFwcC5kYik7CiAg
cnNhX2tleXBhaXJfaWQgaWRlbnQoYXJnc1swXSk7CgogIE4oISBhcHAuZGIua2V5X2V4aXN0
cyhpZGVudCksCiAgICAoc3RyaW5nKCJrZXkgJyIpICsgaWRlbnQoKSArICInIGFscmVhZHkg
ZXhpc3RzIGluIGRhdGFiYXNlIikpOwogIAogIGJhc2U2NDxyc2FfcHViX2tleT4gcHViOwog
IGJhc2U2NDwgYXJjNDxyc2FfcHJpdl9rZXk+ID4gcHJpdjsKICBQKCJnZW5lcmF0aW5nIGtl
eS1wYWlyICclcydcbiIsIGlkZW50KCkuY19zdHIoKSk7CiAgZ2VuZXJhdGVfa2V5X3BhaXIo
YXBwLmx1YSwgaWRlbnQsIHB1YiwgcHJpdik7CiAgUCgic3RvcmluZyBrZXktcGFpciAnJXMn
IGluIGRhdGFiYXNlXG4iLCBpZGVudCgpLmNfc3RyKCkpOwogIGFwcC5kYi5wdXRfa2V5X3Bh
aXIoaWRlbnQsIHB1YiwgcHJpdik7CgogIGd1YXJkLmNvbW1pdCgpOwp9CgpDTUQoY2VydCwg
ImtleSBhbmQgY2VydCIsICIoZmlsZXxtYW5pZmVzdCkgPGlkPiA8Y2VydG5hbWU+IFtjZXJ0
dmFsXSIsIAogICAgICAgICAgICAgICAgICAgICAgICAiY3JlYXRlIGEgY2VydCBmb3IgYSBm
aWxlIG9yIG1hbmlmZXN0IikKewogIGlmICgoYXJncy5zaXplKCkgIT0gNCkgJiYgKGFyZ3Mu
c2l6ZSgpICE9IDMpKQogICAgdGhyb3cgdXNhZ2UobmFtZSk7CgogIHRyYW5zYWN0aW9uX2d1
YXJkIGd1YXJkKGFwcC5kYik7CgogIGhleGVuYzxpZD4gaWRlbnQoYXJnc1sxXSk7CiAgY2Vy
dF9uYW1lIG5hbWUoYXJnc1syXSk7CgogIHJzYV9rZXlwYWlyX2lkIGtleTsKICBpZiAoYXBw
LnNpZ25pbmdfa2V5KCkgIT0gIiIpCiAgICBrZXkgPSBhcHAuc2lnbmluZ19rZXk7CiAgZWxz
ZQogICAgTihndWVzc19kZWZhdWx0X2tleShrZXksIGFwcCksCiAgICAgICJubyB1bmlxdWUg
cHJpdmF0ZSBrZXkgZm91bmQsIGFuZCBubyBrZXkgc3BlY2lmaWVkIik7CiAgCiAgY2VydF92
YWx1ZSB2YWw7CiAgaWYgKGFyZ3Muc2l6ZSgpID09IDQpCiAgICB2YWwgPSBjZXJ0X3ZhbHVl
KGFyZ3NbM10pOwogIGVsc2UKICAgIHZhbCA9IGNlcnRfdmFsdWUoZ2V0X3N0ZGluKCkpOwoK
ICBiYXNlNjQ8Y2VydF92YWx1ZT4gdmFsX2VuY29kZWQ7CiAgZW5jb2RlX2Jhc2U2NCh2YWws
IHZhbF9lbmNvZGVkKTsKCiAgY2VydCB0KGlkZW50LCBuYW1lLCB2YWxfZW5jb2RlZCwga2V5
KTsKICAKICAvLyBuYjogd2Ugd2FudCB0byB0aHJvdyB1c2FnZSBvbiBtaXMtdXNlICpiZWZv
cmUqIGFza2luZyBmb3IgYQogIC8vIHBhc3NwaHJhc2UuCgogIGlmIChhcmdzWzBdID09ICJm
aWxlIikKICAgIHsKICAgICAgY2FsY3VsYXRlX2NlcnQoYXBwLCB0KTsKICAgICAgYXBwLmRi
LnB1dF9maWxlX2NlcnQoZmlsZTxjZXJ0Pih0KSk7CiAgICB9CiAgZWxzZSBpZiAoYXJnc1sw
XSA9PSAibWFuaWZlc3QiKQogICAgewogICAgICBjYWxjdWxhdGVfY2VydChhcHAsIHQpOwog
ICAgICBhcHAuZGIucHV0X21hbmlmZXN0X2NlcnQobWFuaWZlc3Q8Y2VydD4odCkpOwogICAg
fQogIGVsc2UKICAgIHRocm93IHVzYWdlKHRoaXMtPm5hbWUpOwoKICBndWFyZC5jb21taXQo
KTsKfQoKCkNNRCh0YWcsICJjZXJ0aWZpY2F0ZSIsICI8aWQ+IDx0YWduYW1lPiIsIAogICAg
InB1dCBhIHN5bWJvbGljIHRhZyBjZXJ0IG9uIGEgbWFuaWZlc3QgdmVyc2lvbiIpCnsKICBp
ZiAoYXJncy5zaXplKCkgIT0gMikKICAgIHRocm93IHVzYWdlKG5hbWUpOwogIG1hbmlmZXN0
X2lkIG0oYXJnc1swXSk7CiAgcGFja2V0X2RiX3dyaXRlciBkYncoYXBwKTsKICBjZXJ0X21h
bmlmZXN0X3RhZyhtLCBhcmdzWzFdLCBhcHAsIGRidyk7Cn0KCkNNRChhcHByb3ZlLCAiY2Vy
dGlmaWNhdGUiLCAiKGZpbGV8bWFuaWZlc3QpIDxpZD4iLCAKICAgICJhcHByb3ZlIG9mIGEg
bWFuaWZlc3Qgb3IgZmlsZSB2ZXJzaW9uIikKewogIGlmIChhcmdzLnNpemUoKSAhPSAyKQog
ICAgdGhyb3cgdXNhZ2UobmFtZSk7CiAgaWYgKGFyZ3NbMF0gPT0gIm1hbmlmZXN0IikKICAg
IHsKICAgICAgbWFuaWZlc3RfaWQgbShhcmdzWzFdKTsKICAgICAgcGFja2V0X2RiX3dyaXRl
ciBkYncoYXBwKTsKICAgICAgY2VydF9tYW5pZmVzdF9hcHByb3ZhbChtLCB0cnVlLCBhcHAs
IGRidyk7CiAgICB9CiAgZWxzZSBpZiAoYXJnc1swXSA9PSAiZmlsZSIpCiAgICB7CiAgICAg
IHBhY2tldF9kYl93cml0ZXIgZGJ3KGFwcCk7CiAgICAgIGZpbGVfaWQgZihhcmdzWzFdKTsK
ICAgICAgY2VydF9maWxlX2FwcHJvdmFsKGYsIHRydWUsIGFwcCwgZGJ3KTsKICAgIH0KICBl
bHNlCiAgICB0aHJvdyB1c2FnZShuYW1lKTsKfQoKQ01EKGRpc2FwcHJvdmUsICJjZXJ0aWZp
Y2F0ZSIsICIoZmlsZXxtYW5pZmVzdCkgPGlkPiIsIAogICAgImRpc2FwcHJvdmUgb2YgYSBt
YW5pZmVzdCBvciBmaWxlIHZlcnNpb24iKQp7CiAgaWYgKGFyZ3Muc2l6ZSgpICE9IDIpCiAg
ICB0aHJvdyB1c2FnZShuYW1lKTsKICBpZiAoYXJnc1swXSA9PSAibWFuaWZlc3QiKQogICAg
ewogICAgICBtYW5pZmVzdF9pZCBtKGFyZ3NbMV0pOwogICAgICBwYWNrZXRfZGJfd3JpdGVy
IGRidyhhcHApOwogICAgICBjZXJ0X21hbmlmZXN0X2FwcHJvdmFsKG0sIGZhbHNlLCBhcHAs
IGRidyk7CiAgICB9CiAgZWxzZSBpZiAoYXJnc1swXSA9PSAiZmlsZSIpCiAgICB7CiAgICAg
IGZpbGVfaWQgZihhcmdzWzFdKTsKICAgICAgcGFja2V0X2RiX3dyaXRlciBkYncoYXBwKTsK
ICAgICAgY2VydF9maWxlX2FwcHJvdmFsKGYsIGZhbHNlLCBhcHAsIGRidyk7CiAgICB9CiAg
ZWxzZQogICAgdGhyb3cgdXNhZ2UobmFtZSk7Cn0KCgpDTUQoY29tbWVudCwgImNlcnRpZmlj
YXRlIiwgIihmaWxlfG1hbmlmZXN0KSA8aWQ+IFtjb21tZW50XSIsIAogICAgImNvbW1lbnQg
b24gYSBmaWxlIG9yIG1hbmlmZXN0IHZlcnNpb24iKQp7CiAgaWYgKGFyZ3Muc2l6ZSgpICE9
IDIgJiYgYXJncy5zaXplKCkgIT0gMykKICAgIHRocm93IHVzYWdlKG5hbWUpOwoKICBzdHJp
bmcgY29tbWVudDsKICBpZiAoYXJncy5zaXplKCkgPT0gMykKICAgIGNvbW1lbnQgPSBhcmdz
WzJdOwogIGVsc2UKICAgIE4oYXBwLmx1YS5ob29rX2VkaXRfY29tbWVudCgiIiwgY29tbWVu
dCksICJlZGl0IGNvbW1lbnQgZmFpbGVkIik7CiAgCiAgTihjb21tZW50LmZpbmRfZmlyc3Rf
bm90X29mKCIgXHJcdFxuIikgPT0gc3RyaW5nOjpucG9zLCAiZW1wdHkgY29tbWVudCIpOwoK
ICBpZiAoYXJnc1swXSA9PSAiZmlsZSIpCiAgICB7CiAgICAgIHBhY2tldF9kYl93cml0ZXIg
ZGJ3KGFwcCk7CiAgICAgIGNlcnRfZmlsZV9jb21tZW50KGZpbGVfaWQoYXJnc1sxXSksIGNv
bW1lbnQsIGFwcCwgZGJ3KTsgCiAgICB9CiAgZWxzZSBpZiAoYXJnc1swXSA9PSAibWFuaWZl
c3QiKQogICAgewogICAgICBwYWNrZXRfZGJfd3JpdGVyIGRidyhhcHApOwogICAgICBjZXJ0
X21hbmlmZXN0X2NvbW1lbnQobWFuaWZlc3RfaWQoYXJnc1sxXSksIGNvbW1lbnQsIGFwcCwg
ZGJ3KTsKICAgIH0KICBlbHNlCiAgICB0aHJvdyB1c2FnZShuYW1lKTsKfQoKCgpDTUQoYWRk
LCAid29ya2luZyBjb3B5IiwgIjxwYXRobmFtZT4gWy4uLl0iLCAiYWRkIGZpbGVzIHRvIHdv
cmtpbmcgY29weSIpCnsKICBpZiAoYXJncy5zaXplKCkgPCAxKQogICAgdGhyb3cgdXNhZ2Uo
bmFtZSk7CgogIHRyYW5zYWN0aW9uX2d1YXJkIGd1YXJkKGFwcC5kYik7CgogIG1hbmlmZXN0
X21hcCBtYW47CiAgd29ya19zZXQgd29yazsgIAogIGdldF9tYW5pZmVzdF9tYXAobWFuKTsK
ICBnZXRfd29ya19zZXQod29yayk7CiAgYm9vbCByZXdyaXRlX3dvcmsgPSBmYWxzZTsKCiAg
Zm9yICh2ZWN0b3I8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaSA9IGFyZ3MuYmVnaW4oKTsg
aSAhPSBhcmdzLmVuZCgpOyArK2kpCiAgICBidWlsZF9hZGRpdGlvbihmaWxlX3BhdGgoKmkp
LCBhcHAsIHdvcmssIG1hbiwgcmV3cml0ZV93b3JrKTsKICAKICBndWFyZC5jb21taXQoKTsK
ICAKICAvLyBzbWFsbCByYWNlIGhlcmUKICBpZiAocmV3cml0ZV93b3JrKQogICAgcHV0X3dv
cmtfc2V0KHdvcmspOwp9CgpDTUQoZHJvcCwgIndvcmtpbmcgY29weSIsICI8cGF0aG5hbWU+
IFsuLi5dIiwgImRyb3AgZmlsZXMgZnJvbSB3b3JraW5nIGNvcHkiKQp7CiAgaWYgKGFyZ3Mu
c2l6ZSgpIDwgMSkKICAgIHRocm93IHVzYWdlKG5hbWUpOwoKICBtYW5pZmVzdF9tYXAgbWFu
OwogIHdvcmtfc2V0IHdvcms7CiAgZ2V0X21hbmlmZXN0X21hcChtYW4pOwogIGdldF93b3Jr
X3NldCh3b3JrKTsKICBib29sIHJld3JpdGVfd29yayA9IGZhbHNlOwoKICB0cmFuc2FjdGlv
bl9ndWFyZCBndWFyZChhcHAuZGIpOwoKICBmb3IgKHZlY3RvcjxzdHJpbmc+Ojpjb25zdF9p
dGVyYXRvciBpID0gYXJncy5iZWdpbigpOyBpICE9IGFyZ3MuZW5kKCk7ICsraSkKICAgIGJ1
aWxkX2RlbGV0aW9uKGZpbGVfcGF0aCgqaSksIGFwcCwgd29yaywgbWFuLCByZXdyaXRlX3dv
cmspOwogIAogIGd1YXJkLmNvbW1pdCgpOwoKICAvLyBzbWFsbCByYWNlIGhlcmUKICBpZiAo
cmV3cml0ZV93b3JrKQogICAgcHV0X3dvcmtfc2V0KHdvcmspOwp9CgpDTUQoY29tbWl0LCAi
d29ya2luZyBjb3B5IiwgIltsb2cgbWVzc2FnZV0iLCAiY29tbWl0IHdvcmtpbmcgY29weSB0
byBkYXRhYmFzZSIpCnsKICBzdHJpbmcgbG9nX21lc3NhZ2UoIiIpOwogIG1hbmlmZXN0X21h
cCBtX29sZCwgbV9uZXc7CiAgcGF0Y2hfc2V0IHBzOwoKICBnZXRfbWFuaWZlc3RfbWFwKG1f
b2xkKTsKICBjYWxjdWxhdGVfbmV3X21hbmlmZXN0X21hcChtX29sZCwgbV9uZXcpOwogIG1h
bmlmZXN0X2lkIG9sZF9pZCwgbmV3X2lkOwogIGNhbGN1bGF0ZV9tYW5pZmVzdF9tYXBfaWRl
bnQobV9vbGQsIG9sZF9pZCk7CiAgY2FsY3VsYXRlX21hbmlmZXN0X21hcF9pZGVudChtX25l
dywgbmV3X2lkKTsKCiAgaWYgKGFyZ3Muc2l6ZSgpICE9IDAgJiYgYXJncy5zaXplKCkgIT0g
MSkKICAgIHRocm93IHVzYWdlKG5hbWUpOwogIAogIGNlcnRfdmFsdWUgYnJhbmNobmFtZTsK
ICBpZiAoYXBwLmJyYW5jaF9uYW1lICE9ICIiKQogICAgewogICAgICBicmFuY2huYW1lID0g
YXBwLmJyYW5jaF9uYW1lOwogICAgfQogIGVsc2UKICAgIHsKICAgICAgdmVjdG9yPCBtYW5p
ZmVzdDxjZXJ0PiA+IGNlcnRzOwogICAgICBjZXJ0X25hbWUgYnJhbmNoKGJyYW5jaF9jZXJ0
X25hbWUpOwogICAgICBhcHAuZGIuZ2V0X21hbmlmZXN0X2NlcnRzKG9sZF9pZCwgYnJhbmNo
LCBjZXJ0cyk7CgogICAgICBOKGNlcnRzLnNpemUoKSAhPSAwLCAKCXN0cmluZygibm8gYnJh
bmNoIGNlcnRzIGZvdW5kIGZvciBvbGQgbWFuaWZlc3QgIikKCSsgb2xkX2lkLmlubmVyKCko
KSArICIsIHBsZWFzZSBwcm92aWRlIGEgYnJhbmNoIG5hbWUiKTsKCiAgICAgIE4oY2VydHMu
c2l6ZSgpID09IDEsCglzdHJpbmcoIm11bHRpcGxlIGJyYW5jaCBjZXJ0cyBmb3VuZCBmb3Ig
b2xkIG1hbmlmZXN0ICIpCgkrIG9sZF9pZC5pbm5lcigpKCkgKyAiLCBwbGVhc2UgcHJvdmlk
ZSBhIGJyYW5jaCBuYW1lIik7CgogICAgICBkZWNvZGVfYmFzZTY0KGNlcnRzWzBdLmlubmVy
KCkudmFsdWUsIGJyYW5jaG5hbWUpOwogICAgfQogICAgCiAgTCgiY29tbWl0dGluZyAlcyB0
byBicmFuY2ggJXNcbiIsIAogICAgbmV3X2lkLmlubmVyKCkoKS5jX3N0cigpLCBicmFuY2hu
YW1lKCkuY19zdHIoKSk7CiAgYXBwLmJyYW5jaF9uYW1lID0gYnJhbmNobmFtZSgpOwoKICBt
YW5pZmVzdHNfdG9fcGF0Y2hfc2V0KG1fb2xkLCBtX25ldywgYXBwLCBwcyk7CgogIC8vIGdl
dCBsb2cgbWVzc2FnZQogIGlmIChhcmdzLnNpemUoKSA9PSAxKQogICAgbG9nX21lc3NhZ2Ug
PSBhcmdzWzBdOwogIGVsc2UKICAgIGdldF9sb2dfbWVzc2FnZShwcywgYXBwLCBsb2dfbWVz
c2FnZSk7CgogIE4obG9nX21lc3NhZ2UuZmluZF9maXJzdF9ub3Rfb2YoIiBcclx0XG4iKSAh
PSBzdHJpbmc6Om5wb3MsCiAgICAiZW1wdHkgbG9nIG1lc3NhZ2UiKTsKCiAgewogICAgdHJh
bnNhY3Rpb25fZ3VhcmQgZ3VhcmQoYXBwLmRiKTsKCiAgICAvLyBwcm9jZXNzIG1hbmlmZXN0
IGRlbHRhIG9yIG5ldyBtYW5pZmVzdAogICAgaWYgKGFwcC5kYi5tYW5pZmVzdF92ZXJzaW9u
X2V4aXN0cyhwcy5tX25ldykpCiAgICAgIHsKCUwoInNraXBwaW5nIG1hbmlmZXN0ICVzLCBh
bHJlYWR5IGluIGRhdGFiYXNlXG4iLCBwcy5tX25ldy5pbm5lcigpKCkuY19zdHIoKSk7CiAg
ICAgIH0KICAgIGVsc2UKICAgICAgewoJaWYgKGFwcC5kYi5tYW5pZmVzdF92ZXJzaW9uX2V4
aXN0cyhwcy5tX29sZCkpCgkgIHsKCSAgICBMKCJpbnNlcnRpbmcgbWFuaWZlc3QgZGVsdGEg
JXMgLT4gJXNcbiIsIAoJICAgICAgcHMubV9vbGQuaW5uZXIoKSgpLmNfc3RyKCksIHBzLm1f
bmV3LmlubmVyKCkoKS5jX3N0cigpKTsKCSAgICBtYW5pZmVzdF9kYXRhIG1fb2xkX2RhdGEs
IG1fbmV3X2RhdGE7CgkgICAgYXBwLmRiLmdldF9tYW5pZmVzdF92ZXJzaW9uKHBzLm1fb2xk
LCBtX29sZF9kYXRhKTsKCSAgICB3cml0ZV9tYW5pZmVzdF9tYXAobV9uZXcsIG1fbmV3X2Rh
dGEpOwoJICAgIGJhc2U2NDwgZ3ppcDxkZWx0YT4gPiBkZWw7CgkgICAgZGlmZihtX29sZF9k
YXRhLmlubmVyKCksIG1fbmV3X2RhdGEuaW5uZXIoKSwgZGVsKTsKCSAgICBhcHAuZGIucHV0
X21hbmlmZXN0X3ZlcnNpb24ocHMubV9vbGQsIHBzLm1fbmV3LCBtYW5pZmVzdF9kZWx0YShk
ZWwpKTsKCSAgfQoJZWxzZQoJICB7CgkgICAgTCgiaW5zZXJ0aW5nIGZ1bGwgbWFuaWZlc3Qg
JXNcbiIsIAoJICAgICAgcHMubV9uZXcuaW5uZXIoKSgpLmNfc3RyKCkpOwoJICAgIG1hbmlm
ZXN0X2RhdGEgbV9uZXdfZGF0YTsKCSAgICB3cml0ZV9tYW5pZmVzdF9tYXAobV9uZXcsIG1f
bmV3X2RhdGEpOwoJICAgIGFwcC5kYi5wdXRfbWFuaWZlc3QocHMubV9uZXcsIG1fbmV3X2Rh
dGEpOwoJICB9CiAgICAgIH0KCiAgICAvLyBwcm9jZXNzIGZpbGUgZGVsdGFzCiAgICBmb3Ig
KHNldDxwYXRjaF9kZWx0YT46OmNvbnN0X2l0ZXJhdG9yIGkgPSBwcy5mX2RlbHRhcy5iZWdp
bigpOwoJIGkgIT0gcHMuZl9kZWx0YXMuZW5kKCk7ICsraSkKICAgICAgewoJaWYgKGFwcC5k
Yi5maWxlX3ZlcnNpb25fZXhpc3RzKGktPmlkX25ldykpCgkgIHsKCSAgICBMKCJza2lwcGlu
ZyBmaWxlIGRlbHRhICVzLCBhbHJlYWR5IGluIGRhdGFiYXNlXG4iLCBpLT5pZF9uZXcuaW5u
ZXIoKSgpLmNfc3RyKCkpOwoJICB9CgllbHNlCgkgIHsKCSAgICBpZiAoYXBwLmRiLmZpbGVf
dmVyc2lvbl9leGlzdHMoaS0+aWRfb2xkKSkKCSAgICAgIHsKCQlMKCJpbnNlcnRpbmcgZGVs
dGEgJXMgLT4gJXNcbiIsIAoJCSAgaS0+aWRfb2xkLmlubmVyKCkoKS5jX3N0cigpLCBpLT5p
ZF9uZXcuaW5uZXIoKSgpLmNfc3RyKCkpOwoJCWZpbGVfZGF0YSBvbGRfZGF0YTsKCQliYXNl
NjQ8IGd6aXA8ZGF0YT4gPiBuZXdfZGF0YTsKCQlhcHAuZGIuZ2V0X2ZpbGVfdmVyc2lvbihp
LT5pZF9vbGQsIG9sZF9kYXRhKTsKCQlyZWFkX2RhdGEoaS0+cGF0aCwgbmV3X2RhdGEpOwoJ
CWJhc2U2NDwgZ3ppcDxkZWx0YT4gPiBkZWw7CgkJZGlmZihvbGRfZGF0YS5pbm5lcigpLCBu
ZXdfZGF0YSwgZGVsKTsKCQlhcHAuZGIucHV0X2ZpbGVfdmVyc2lvbihpLT5pZF9vbGQsIGkt
PmlkX25ldywgZmlsZV9kZWx0YShkZWwpKTsKCSAgICAgIH0KCSAgICBlbHNlCgkgICAgICB7
CgkJTCgiaW5zZXJ0aW5nIGZ1bGwgdmVyc2lvbiAlc1xuIiwgaS0+aWRfb2xkLmlubmVyKCko
KS5jX3N0cigpKTsKCQliYXNlNjQ8IGd6aXA8ZGF0YT4gPiBuZXdfZGF0YTsKCQlyZWFkX2Rh
dGEoaS0+cGF0aCwgbmV3X2RhdGEpOwoJCS8vIHNhbml0eSBjaGVjawoJCWhleGVuYzxpZD4g
dGlkOwoJCWNhbGN1bGF0ZV9pZGVudChuZXdfZGF0YSwgdGlkKTsKCQlJKHRpZCA9PSBpLT5p
ZF9uZXcuaW5uZXIoKSk7CgkJYXBwLmRiLnB1dF9maWxlKGktPmlkX25ldywgZmlsZV9kYXRh
KG5ld19kYXRhKSk7CgkgICAgICB9CgkgIH0KICAgICAgfQogIAogICAgLy8gcHJvY2VzcyBm
aWxlIGFkZHMKICAgIGZvciAoc2V0PHBhdGNoX2FkZGl0aW9uPjo6Y29uc3RfaXRlcmF0b3Ig
aSA9IHBzLmZfYWRkcy5iZWdpbigpOwoJIGkgIT0gcHMuZl9hZGRzLmVuZCgpOyArK2kpCiAg
ICAgIHsKCWlmIChhcHAuZGIuZmlsZV92ZXJzaW9uX2V4aXN0cyhpLT5pZGVudCkpCgkgIHsK
CSAgICBMKCJza2lwcGluZyBmaWxlICVzICVzLCBhbHJlYWR5IGluIGRhdGFiYXNlXG4iLCAK
CSAgICAgIGktPnBhdGgoKS5jX3N0cigpLCBpLT5pZGVudC5pbm5lcigpKCkuY19zdHIoKSk7
CgkgIH0KCWVsc2UKCSAgewoJICAgIC8vIGl0J3MgYSBuZXcgZmlsZQoJICAgIEwoImluc2Vy
dGluZyBuZXcgZmlsZSAlcyAlc1xuIiwgCgkgICAgICBpLT5wYXRoKCkuY19zdHIoKSwgaS0+
aWRlbnQuaW5uZXIoKSgpLmNfc3RyKCkpOwoJICAgIGJhc2U2NDwgZ3ppcDxkYXRhPiA+IG5l
d19kYXRhOwoJICAgIHJlYWRfZGF0YShpLT5wYXRoLCBuZXdfZGF0YSk7CgkgICAgYXBwLmRi
LnB1dF9maWxlKGktPmlkZW50LCBuZXdfZGF0YSk7CgkgIH0KICAgICAgfQoKICAgIHBhY2tl
dF9kYl93cml0ZXIgZGJ3KGFwcCk7CgogICAgaWYgKCEgbV9vbGQuZW1wdHkoKSkKICAgICAg
Y2VydF9tYW5pZmVzdF9hbmNlc3Rvcihwcy5tX29sZCwgcHMubV9uZXcsIGFwcCwgZGJ3KTsK
CiAgICBjZXJ0X21hbmlmZXN0X2luX2JyYW5jaChwcy5tX25ldywgYnJhbmNobmFtZSwgYXBw
LCBkYncpOyAKICAgIGNlcnRfbWFuaWZlc3RfZGF0ZV9ub3cocHMubV9uZXcsIGFwcCwgZGJ3
KTsKICAgIGNlcnRfbWFuaWZlc3RfYXV0aG9yX2RlZmF1bHQocHMubV9uZXcsIGFwcCwgZGJ3
KTsKICAgIGNlcnRfbWFuaWZlc3RfY2hhbmdlbG9nKHBzLm1fbmV3LCBsb2dfbWVzc2FnZSwg
YXBwLCBkYncpOwoKICAgIC8vIGNvbW1pdCBkb25lLCBub3cgcXVldWUgZGlmZiBmb3Igc2Vu
ZGluZwoKICAgIGlmIChhcHAuZGIubWFuaWZlc3RfdmVyc2lvbl9leGlzdHMocHMubV9uZXcp
KQogICAgICB7Cgl2ZWN0b3I8IHBhaXI8dXJsLGdyb3VwPiA+IHRhcmdldHM7CglhcHAubHVh
Lmhvb2tfZ2V0X3Bvc3RfdGFyZ2V0cyhicmFuY2huYW1lLCB0YXJnZXRzKTsKCQoJLy8gbWFr
ZSBzdXJlIHRoZSBhcHByb3ByaWF0ZSBlZGdlcyBnZXQgcXVldWVkIGZvciB0aGUgbmV0d29y
ay4KCWZvciAodmVjdG9yPCBwYWlyPHVybCxncm91cD4gPjo6Y29uc3RfaXRlcmF0b3IgdGFy
ZyA9IHRhcmdldHMuYmVnaW4oKTsKCSAgICAgdGFyZyAhPSB0YXJnZXRzLmVuZCgpOyArK3Rh
cmcpCgkgIHsKCSAgICBxdWV1ZV9lZGdlX2Zvcl90YXJnZXRfYW5jZXN0b3IgKCp0YXJnLCBw
cy5tX25ldywgbV9uZXcsIGFwcCk7CgkgIH0KCQoJLy8gdGhyb3cgaW4gYWxsIGF2YWlsYWJs
ZSBjZXJ0cyBmb3IgZ29vZCBtZWFzdXJlCglxdWV1ZWluZ19wYWNrZXRfd3JpdGVyIHFwdyhh
cHAsIHRhcmdldHMpOwoJdmVjdG9yPCBtYW5pZmVzdDxjZXJ0PiA+IGNlcnRzOwoJYXBwLmRi
LmdldF9tYW5pZmVzdF9jZXJ0cyhwcy5tX25ldywgY2VydHMpOwoJZm9yKHZlY3RvcjwgbWFu
aWZlc3Q8Y2VydD4gPjo6Y29uc3RfaXRlcmF0b3IgaSA9IGNlcnRzLmJlZ2luKCk7CgkgICAg
aSAhPSBjZXJ0cy5lbmQoKTsgKytpKQoJICBxcHcuY29uc3VtZV9tYW5pZmVzdF9jZXJ0KCpp
KTsKICAgICAgfSAKICAgIAogICAgZ3VhcmQuY29tbWl0KCk7CiAgfQogIC8vIHNtYWxsIHJh
Y2UgY29uZGl0aW9uIGhlcmUuLi4KICBsb2NhbF9wYXRoIHdfcGF0aDsKICBnZXRfd29ya19w
YXRoKHdfcGF0aCk7CiAgZGVsZXRlX2ZpbGUod19wYXRoKTsKICBwdXRfbWFuaWZlc3RfbWFw
KG1fbmV3KTsKICBQKCJjb21taXR0ZWQgJXNcbiIsIHBzLm1fbmV3LmlubmVyKCkoKS5jX3N0
cigpKTsKfQoKQ01EKHVwZGF0ZSwgIndvcmtpbmcgY29weSIsICJbc29ydCBrZXlzLi4uXSIs
ICJ1cGRhdGUgd29ya2luZyBjb3B5LCByZWxhdGl2ZSB0byBzb3J0aW5nIGtleXMiKQp7Cgog
IG1hbmlmZXN0X2RhdGEgbV9jaG9zZW5fZGF0YTsKICBtYW5pZmVzdF9tYXAgbV9vbGQsIG1f
d29ya2luZywgbV9jaG9zZW4sIG1fbmV3OwogIG1hbmlmZXN0X2lkIG1fb2xkX2lkLCBtX2No
b3Nlbl9pZDsKCiAgdHJhbnNhY3Rpb25fZ3VhcmQgZ3VhcmQoYXBwLmRiKTsKCiAgZ2V0X21h
bmlmZXN0X21hcChtX29sZCk7CiAgY2FsY3VsYXRlX21hbmlmZXN0X21hcF9pZGVudChtX29s
ZCwgbV9vbGRfaWQpOwogIGNhbGN1bGF0ZV9uZXdfbWFuaWZlc3RfbWFwKG1fb2xkLCBtX3dv
cmtpbmcpOwogIAogIHBpY2tfdXBkYXRlX3RhcmdldChtX29sZF9pZCwgYXJncywgYXBwLCBt
X2Nob3Nlbl9pZCk7CiAgUCgic2VsZWN0ZWQgdXBkYXRlIHRhcmdldCAlc1xuIiwKICAgIG1f
Y2hvc2VuX2lkLmlubmVyKCkoKS5jX3N0cigpKTsKICBhcHAuZGIuZ2V0X21hbmlmZXN0X3Zl
cnNpb24obV9jaG9zZW5faWQsIG1fY2hvc2VuX2RhdGEpOwogIHJlYWRfbWFuaWZlc3RfbWFw
KG1fY2hvc2VuX2RhdGEsIG1fY2hvc2VuKTsKCiAgdXBkYXRlX21lcmdlX3Byb3ZpZGVyIG1l
cmdlcihhcHApOwogIE4obWVyZ2UzKG1fb2xkLCBtX2Nob3NlbiwgbV93b3JraW5nLCBhcHAs
IG1lcmdlciwgbV9uZXcpLAogICAgc3RyaW5nKCJtYW5pZmVzdCBtZXJnZSBmYWlsZWQsIG5v
IHVwZGF0ZSBwZXJmb3JtZWQiKSk7CgogIFAoImNhbGN1bGF0aW5nIHBhdGNoc2V0IGZvciB1
cGRhdGVcbiIpOwogIHBhdGNoX3NldCBwczsKICBtYW5pZmVzdHNfdG9fcGF0Y2hfc2V0KG1f
d29ya2luZywgbV9uZXcsIGFwcCwgcHMpOwoKICBMKCJhcHBseWluZyAlZCBkZWxldGlvbnMg
dG8gZmlsZXMgaW4gdHJlZVxuIiwgcHMuZl9kZWxzLnNpemUoKSk7CiAgZm9yIChzZXQ8Zmls
ZV9wYXRoPjo6Y29uc3RfaXRlcmF0b3IgaSA9IHBzLmZfZGVscy5iZWdpbigpOwogICAgICAg
aSAhPSBwcy5mX2RlbHMuZW5kKCk7ICsraSkKICAgIHsKICAgICAgTCgiZGVsZXRpbmcgJXNc
biIsICgqaSkoKS5jX3N0cigpKTsKICAgICAgZGVsZXRlX2ZpbGUoKmkpOwogICAgfQoKICBM
KCJhcHBseWluZyAlZCBtb3ZlcyB0byBmaWxlcyBpbiB0cmVlXG4iLCBwcy5mX21vdmVzLnNp
emUoKSk7CiAgZm9yIChzZXQ8cGF0Y2hfbW92ZT46OmNvbnN0X2l0ZXJhdG9yIGkgPSBwcy5m
X21vdmVzLmJlZ2luKCk7CiAgICAgICBpICE9IHBzLmZfbW92ZXMuZW5kKCk7ICsraSkKICAg
IHsKICAgICAgTCgibW92aW5nICVzIC0+ICVzXG4iLCBpLT5wYXRoX29sZCgpLmNfc3RyKCks
IGktPnBhdGhfbmV3KCkuY19zdHIoKSk7CiAgICAgIG1vdmVfZmlsZShpLT5wYXRoX29sZCwg
aS0+cGF0aF9uZXcpOwogICAgfQogIAogIEwoImFwcGx5aW5nICVkIGFkZGl0aW9ucyB0byB0
cmVlXG4iLCBwcy5mX2FkZHMuc2l6ZSgpKTsKICBmb3IgKHNldDxwYXRjaF9hZGRpdGlvbj46
OmNvbnN0X2l0ZXJhdG9yIGkgPSBwcy5mX2FkZHMuYmVnaW4oKTsKICAgICAgIGkgIT0gcHMu
Zl9hZGRzLmVuZCgpOyArK2kpCiAgICB7CiAgICAgIEwoImFkZGluZyAlcyBhcyAlc1xuIiwg
aS0+aWRlbnQuaW5uZXIoKSgpLmNfc3RyKCksIGktPnBhdGgoKS5jX3N0cigpKTsKICAgICAg
ZmlsZV9kYXRhIHRtcDsKICAgICAgaWYgKGFwcC5kYi5maWxlX3ZlcnNpb25fZXhpc3RzKGkt
PmlkZW50KSkKCWFwcC5kYi5nZXRfZmlsZV92ZXJzaW9uKGktPmlkZW50LCB0bXApOwogICAg
ICBlbHNlIGlmIChtZXJnZXIudGVtcG9yYXJ5X3N0b3JlLmZpbmQoaS0+aWRlbnQpICE9IG1l
cmdlci50ZW1wb3Jhcnlfc3RvcmUuZW5kKCkpCgl0bXAgPSBtZXJnZXIudGVtcG9yYXJ5X3N0
b3JlW2ktPmlkZW50XTsKICAgICAgZWxzZQoJSShmYWxzZSk7IC8vIHRyaXAgYXNzZXJ0LiB0
aGlzIHNob3VsZCBiZSBpbXBvc3NpYmxlLgogICAgICB3cml0ZV9kYXRhKGktPnBhdGgsIHRt
cC5pbm5lcigpKTsKICAgIH0KCiAgTCgiYXBwbHlpbmcgJWQgZGVsdGFzIHRvIHRyZWVcbiIs
IHBzLmZfZGVsdGFzLnNpemUoKSk7CiAgZm9yIChzZXQ8cGF0Y2hfZGVsdGE+Ojpjb25zdF9p
dGVyYXRvciBpID0gcHMuZl9kZWx0YXMuYmVnaW4oKTsKICAgICAgIGkgIT0gcHMuZl9kZWx0
YXMuZW5kKCk7ICsraSkKICAgIHsKICAgICAgUCgidXBkYXRpbmcgZmlsZSAlczogJXMgLT4g
JXNcbiIsIAoJaS0+cGF0aCgpLmNfc3RyKCksCglpLT5pZF9vbGQuaW5uZXIoKSgpLmNfc3Ry
KCksCglpLT5pZF9uZXcuaW5uZXIoKSgpLmNfc3RyKCkpOwogICAgICAKICAgICAgLy8gc2Fu
aXR5IGNoZWNrCiAgICAgIHsKCWJhc2U2NDwgZ3ppcDxkYXRhPiA+IGR0bXA7CgloZXhlbmM8
aWQ+IGR0bXBfaWQ7CglyZWFkX2RhdGEoaS0+cGF0aCwgZHRtcCk7CgljYWxjdWxhdGVfaWRl
bnQoZHRtcCwgZHRtcF9pZCk7CglJKGR0bXBfaWQgPT0gaS0+aWRfb2xkLmlubmVyKCkpOwog
ICAgICB9CgogICAgICAvLyBvaywgcmVwbGFjZSB3aXRoIG5ldyB2ZXJzaW9uCiAgICAgIHsK
CWZpbGVfZGF0YSB0bXA7CglpZiAoYXBwLmRiLmZpbGVfdmVyc2lvbl9leGlzdHMoaS0+aWRf
bmV3KSkKCSAgYXBwLmRiLmdldF9maWxlX3ZlcnNpb24oaS0+aWRfbmV3LCB0bXApOwoJZWxz
ZSBpZiAobWVyZ2VyLnRlbXBvcmFyeV9zdG9yZS5maW5kKGktPmlkX25ldykgIT0gbWVyZ2Vy
LnRlbXBvcmFyeV9zdG9yZS5lbmQoKSkKCSAgdG1wID0gbWVyZ2VyLnRlbXBvcmFyeV9zdG9y
ZVtpLT5pZF9uZXddOwoJZWxzZQoJICBJKGZhbHNlKTsgLy8gdHJpcCBhc3NlcnQuIHRoaXMg
c2hvdWxkIGJlIGltcG9zc2libGUuCgl3cml0ZV9kYXRhKGktPnBhdGgsIHRtcC5pbm5lcigp
KTsKICAgICAgfQogICAgfQogIAogIEwoInVwZGF0ZSBzdWNjZXNzZnVsXG4iKTsKICBndWFy
ZC5jb21taXQoKTsKCiAgLy8gc21hbGwgcmFjZSBjb25kaXRpb24gaGVyZS4uLgogIC8vIG5i
OiB3ZSB3cml0ZSBvdXQgbV9jaG9zZW4sIG5vdCBtX25ldywgYmVjYXVzZSB0aGUgbWFuaWZl
c3Qtb24tZGlzawogIC8vIGlzIHRoZSBiYXNpcyBvZiB0aGUgd29ya2luZyBjb3B5LCBub3Qg
dGhlIHdvcmtpbmcgY29weSBpdHNlbGYuCiAgcHV0X21hbmlmZXN0X21hcChtX2Nob3Nlbik7
CiAgUCgidXBkYXRlZCB0byBiYXNlIHZlcnNpb24gJXNcbiIsIG1fY2hvc2VuX2lkLmlubmVy
KCkoKS5jX3N0cigpKTsKfQoKCgpDTUQoY2F0LCAidHJlZSIsICIoZmlsZXxtYW5pZmVzdCkg
PGlkPiIsICJ3cml0ZSBmaWxlIG9yIG1hbmlmZXN0IGZyb20gZGF0YWJhc2UgdG8gc3Rkb3V0
IikKewogIGlmIChhcmdzLnNpemUoKSAhPSAyKQogICAgdGhyb3cgdXNhZ2UobmFtZSk7Cgog
IHRyYW5zYWN0aW9uX2d1YXJkIGd1YXJkKGFwcC5kYik7CgogIGlmIChhcmdzWzBdID09ICJm
aWxlIikKICAgIHsKICAgICAgZmlsZV9kYXRhIGRhdDsKICAgICAgZmlsZV9pZCBpZGVudChh
cmdzWzFdKTsKCiAgICAgIE4oYXBwLmRiLmZpbGVfdmVyc2lvbl9leGlzdHMoaWRlbnQpLAoJ
KHN0cmluZygibm8gZmlsZSB2ZXJzaW9uICIpICsgaWRlbnQuaW5uZXIoKSgpICsgIiBmb3Vu
ZCBpbiBkYXRhYmFzZSIpKTsKCiAgICAgIEwoImR1bXBpbmcgZmlsZSAlc1xuIiwgaWRlbnQu
aW5uZXIoKSgpLmNfc3RyKCkpOwogICAgICBhcHAuZGIuZ2V0X2ZpbGVfdmVyc2lvbihpZGVu
dCwgZGF0KTsKICAgICAgZGF0YSB1bnBhY2tlZDsKICAgICAgdW5wYWNrKGRhdC5pbm5lcigp
LCB1bnBhY2tlZCk7CiAgICAgIGNvdXQud3JpdGUodW5wYWNrZWQoKS5kYXRhKCksIHVucGFj
a2VkKCkuc2l6ZSgpKTsKCiAgICB9CiAgZWxzZSBpZiAoYXJnc1swXSA9PSAibWFuaWZlc3Qi
KQogICAgewogICAgICBtYW5pZmVzdF9kYXRhIGRhdDsKICAgICAgbWFuaWZlc3RfaWQgaWRl
bnQoYXJnc1sxXSk7CgogICAgICBOKGFwcC5kYi5tYW5pZmVzdF92ZXJzaW9uX2V4aXN0cyhp
ZGVudCksCgkoc3RyaW5nKCJubyBmaWxlIHZlcnNpb24gIikgKyBpZGVudC5pbm5lcigpKCkg
KyAiIGZvdW5kIGluIGRhdGFiYXNlIikpOwoKICAgICAgTCgiZHVtcGluZyBtYW5pZmVzdCAl
c1xuIiwgaWRlbnQuaW5uZXIoKSgpLmNfc3RyKCkpOwogICAgICBhcHAuZGIuZ2V0X21hbmlm
ZXN0X3ZlcnNpb24oaWRlbnQsIGRhdCk7CiAgICAgIGRhdGEgdW5wYWNrZWQ7CiAgICAgIHVu
cGFjayhkYXQuaW5uZXIoKSwgdW5wYWNrZWQpOwogICAgICBjb3V0LndyaXRlKHVucGFja2Vk
KCkuZGF0YSgpLCB1bnBhY2tlZCgpLnNpemUoKSk7CiAgICB9CiAgZWxzZSAKICAgIHRocm93
IHVzYWdlKG5hbWUpOwoKICBndWFyZC5jb21taXQoKTsKfQoKCkNNRChjaGVja291dCwgInRy
ZWUiLCAiPG1hbmlmZXN0LWlkPiIsICJjaGVjayBvdXQgdHJlZSBzdGF0ZSBmcm9tIGRhdGFi
YXNlIikKewogIGlmIChhcmdzLnNpemUoKSAhPSAxKQogICAgdGhyb3cgdXNhZ2UobmFtZSk7
CgogIHRyYW5zYWN0aW9uX2d1YXJkIGd1YXJkKGFwcC5kYik7CgogIGZpbGVfZGF0YSBkYXRh
OwogIG1hbmlmZXN0X2lkIGlkZW50KGFyZ3NbMF0pOwogIG1hbmlmZXN0X21hcCBtOwoKICBO
KGFwcC5kYi5tYW5pZmVzdF92ZXJzaW9uX2V4aXN0cyhpZGVudCksCiAgICAoc3RyaW5nKCJu
byBtYW5pZmVzdCB2ZXJzaW9uICIpICsgaWRlbnQuaW5uZXIoKSgpICsgIiBmb3VuZCBpbiBk
YXRhYmFzZSIpKTsKICAKICBMKCJleHBvcnRpbmcgbWFuaWZlc3QgJXNcbiIsIGlkZW50Lmlu
bmVyKCkoKS5jX3N0cigpKTsKICBtYW5pZmVzdF9kYXRhIG1fZGF0YTsKICBhcHAuZGIuZ2V0
X21hbmlmZXN0X3ZlcnNpb24oaWRlbnQsIG1fZGF0YSk7CiAgcmVhZF9tYW5pZmVzdF9tYXAo
bV9kYXRhLCBtKTsgICAgICAKICBwdXRfbWFuaWZlc3RfbWFwKG0pOwogIAogIGZvciAobWFu
aWZlc3RfbWFwOjpjb25zdF9pdGVyYXRvciBpID0gbS5iZWdpbigpOyBpICE9IG0uZW5kKCk7
ICsraSkKICAgIHsKICAgICAgdmVjdG9yPHN0cmluZz4gYXJnczsKICAgICAgcGF0aF9pZF9w
YWlyIHBpcCgqaSk7CiAgICAgIAogICAgICBOKGFwcC5kYi5maWxlX3ZlcnNpb25fZXhpc3Rz
KHBpcC5pZGVudCgpKSwKCShzdHJpbmcoIm5vIGZpbGUgdmVyc2lvbiAiKQoJICsgcGlwLmlk
ZW50KCkuaW5uZXIoKSgpIAoJICsgIiBmb3VuZCBpbiBkYXRhYmFzZSBmb3IgIgoJICsgcGlw
LnBhdGgoKSgpLmNfc3RyKCkpKTsKICAgICAgCiAgICAgIGZpbGVfZGF0YSBkYXQ7CiAgICAg
IEwoIndyaXRpbmcgZmlsZSAlcyB0byAlc1xuIiwgCglwaXAuaWRlbnQoKS5pbm5lcigpKCku
Y19zdHIoKSwKCXBpcC5wYXRoKCkoKS5jX3N0cigpKTsKICAgICAgYXBwLmRiLmdldF9maWxl
X3ZlcnNpb24ocGlwLmlkZW50KCksIGRhdCk7CiAgICAgIHdyaXRlX2RhdGEocGlwLnBhdGgo
KSwgZGF0LmlubmVyKCkpOwogICAgfQoKICBndWFyZC5jb21taXQoKTsKfQoKQUxJQVMoY28s
IGNoZWNrb3V0LCAidHJlZSIsICI8bWFuaWZlc3QtaWQ+IiwKICAgICAgImNoZWNrIG91dCB0
cmVlIHN0YXRlIGZyb20gZGF0YWJhc2U7IGFsaWFzIGZvciBjaGVja291dCIpCgpDTUQoaGVh
ZHMsICJ0cmVlIiwgIiIsICJzaG93IHVubWVyZ2VkIGhlYWRzIG9mIGJyYW5jaCIpCnsKICB2
ZWN0b3I8bWFuaWZlc3RfaWQ+IGhlYWRzOwogIGlmIChhcmdzLnNpemUoKSAhPSAwKQogICAg
dGhyb3cgdXNhZ2UobmFtZSk7CgogIGlmIChhcHAuYnJhbmNoX25hbWUgPT0gIiIpCiAgICB7
CiAgICAgIGNvdXQgPDwgInBsZWFzZSBzcGVjaWZ5IGEgYnJhbmNoLCB3aXRoIC0tYnJhbmNo
PTxicmFuY2huYW1lPiIgPDwgZW5kbDsKICAgICAgcmV0dXJuOwogICAgfQoKICBnZXRfYnJh
bmNoX2hlYWRzKGFwcC5icmFuY2hfbmFtZSwgYXBwLCBoZWFkcyk7CgogIGlmIChoZWFkcy5z
aXplKCkgPT0gMCkKICAgIGNvdXQgPDwgImJyYW5jaCAnIiA8PCBhcHAuYnJhbmNoX25hbWUg
PDwgIicgaXMgZW1wdHkiIDw8IGVuZGw7CiAgZWxzZSBpZiAoaGVhZHMuc2l6ZSgpID09IDEp
CiAgICBjb3V0IDw8ICJicmFuY2ggJyIgPDwgYXBwLmJyYW5jaF9uYW1lIDw8ICInIGlzIGN1
cnJlbnRseSBtZXJnZWQ6IiA8PCBlbmRsOwogIGVsc2UKICAgIGNvdXQgPDwgImJyYW5jaCAn
IiA8PCBhcHAuYnJhbmNoX25hbWUgPDwgIicgaXMgY3VycmVudGx5IHVubWVyZ2VkOiIgPDwg
ZW5kbDsKCiAgZm9yICh2ZWN0b3I8bWFuaWZlc3RfaWQ+Ojpjb25zdF9pdGVyYXRvciBpID0g
aGVhZHMuYmVnaW4oKTsgCiAgICAgICBpICE9IGhlYWRzLmVuZCgpOyArK2kpCiAgICB7CiAg
ICAgIGNvdXQgPDwgaS0+aW5uZXIoKSgpIDw8IGVuZGw7CiAgICB9Cn0KCgpDTUQobWVyZ2Us
ICJ0cmVlIiwgIiIsICJtZXJnZSB1bm1lcmdlZCBoZWFkcyBvZiBicmFuY2giKQp7CgogIHZl
Y3RvcjxtYW5pZmVzdF9pZD4gaGVhZHM7CgogIGlmIChhcmdzLnNpemUoKSAhPSAwKQogICAg
dGhyb3cgdXNhZ2UobmFtZSk7CgogIGlmIChhcHAuYnJhbmNoX25hbWUgPT0gIiIpCiAgICB7
CiAgICAgIGNvdXQgPDwgInBsZWFzZSBzcGVjaWZ5IGEgYnJhbmNoLCB3aXRoIC0tYnJhbmNo
PTxicmFuY2huYW1lPiIgPDwgZW5kbDsKICAgICAgcmV0dXJuOwogICAgfQoKICBnZXRfYnJh
bmNoX2hlYWRzKGFwcC5icmFuY2hfbmFtZSwgYXBwLCBoZWFkcyk7CgogIGlmIChoZWFkcy5z
aXplKCkgPT0gMCkKICAgIHsKICAgICAgY291dCA8PCAiYnJhbmNoICIgPDwgYXJnc1swXSA8
PCAiaXMgZW1wdHkiIDw8IGVuZGw7CiAgICAgIHJldHVybjsKICAgIH0KICBlbHNlIGlmICho
ZWFkcy5zaXplKCkgPT0gMSkKICAgIHsKICAgICAgY291dCA8PCAiYnJhbmNoICIgPDwgYXJn
c1swXSA8PCAiaXMgbWVyZ2VkIiA8PCBlbmRsOwogICAgICByZXR1cm47CiAgICB9CiAgZWxz
ZQogICAgewogICAgICB2ZWN0b3I8IHBhaXI8dXJsLGdyb3VwPiA+IHRhcmdldHM7CiAgICAg
IGFwcC5sdWEuaG9va19nZXRfcG9zdF90YXJnZXRzKGFwcC5icmFuY2hfbmFtZSwgdGFyZ2V0
cyk7CgogICAgICBtYW5pZmVzdF9pZCBsZWZ0ID0gaGVhZHNbMF07CiAgICAgIG1hbmlmZXN0
X2lkIGFuY2VzdG9yOwogICAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IGhlYWRzLnNpemUo
KTsgKytpKQoJewoJICBtYW5pZmVzdF9pZCByaWdodCA9IGhlYWRzW2ldOwoJICBQKCJtZXJn
aW5nIHdpdGggbWFuaWZlc3QgJWQgLyAlZDogJXMgPC0+ICVzXG4iLAoJICAgIGksIGhlYWRz
LnNpemUoKSwKCSAgICBsZWZ0LmlubmVyKCkoKS5jX3N0cigpLCByaWdodC5pbm5lcigpKCku
Y19zdHIoKSk7CgoJICBtYW5pZmVzdF9pZCBtZXJnZWQ7CgkgIHRyYW5zYWN0aW9uX2d1YXJk
IGd1YXJkKGFwcC5kYik7CgkgIHRyeV9vbmVfbWVyZ2UgKGxlZnQsIHJpZ2h0LCBtZXJnZWQs
IGFwcCwgdGFyZ2V0cyk7CgkgIAkgIAoJICAvLyBtZXJnZWQgMSBlZGdlOyBub3cgd2UgY29t
bWl0IHRoaXMsIHVwZGF0ZSBtZXJnZSBzb3VyY2UgYW5kCgkgIC8vIHRyeSBuZXh0IG9uZQoK
CSAgcGFja2V0X2RiX3dyaXRlciBkYncoYXBwKTsKCSAgcXVldWVpbmdfcGFja2V0X3dyaXRl
ciBxcHcoYXBwLCB0YXJnZXRzKTsKCSAgY2VydF9tYW5pZmVzdF9pbl9icmFuY2gobWVyZ2Vk
LCBhcHAuYnJhbmNoX25hbWUsIGFwcCwgZGJ3KTsKCSAgY2VydF9tYW5pZmVzdF9pbl9icmFu
Y2gobWVyZ2VkLCBhcHAuYnJhbmNoX25hbWUsIGFwcCwgcXB3KTsKCgkgIHN0cmluZyBsb2cg
PSAibWVyZ2Ugb2YgIiArIGxlZnQuaW5uZXIoKSgpICsgIiBhbmQgIiArIHJpZ2h0LmlubmVy
KCkoKTsKCSAgY2VydF9tYW5pZmVzdF9jaGFuZ2Vsb2cobWVyZ2VkLCBsb2csIGFwcCwgZGJ3
KTsKCSAgY2VydF9tYW5pZmVzdF9jaGFuZ2Vsb2cobWVyZ2VkLCBsb2csIGFwcCwgcXB3KTsK
CSAgCgkgIGd1YXJkLmNvbW1pdCgpOwoJICBQKCJbc291cmNlXSAlc1xuW3NvdXJjZV0gJXNc
blttZXJnZWRdICVzXG4iLAoJICAgIGxlZnQuaW5uZXIoKSgpLmNfc3RyKCksCgkgICAgcmln
aHQuaW5uZXIoKSgpLmNfc3RyKCksCgkgICAgbWVyZ2VkLmlubmVyKCkoKS5jX3N0cigpKTsK
CSAgbGVmdCA9IG1lcmdlZDsKCX0KICAgIH0gIAp9CgoKQ01EKHByb3BhZ2F0ZSwgInRyZWUi
LCAiPHNyYy1icmFuY2g+IDxkc3QtYnJhbmNoPiIsIAogICAgIm1lcmdlIGZyb20gb25lIGJy
YW5jaCB0byBhbm90aGVyIGFzeW1tZXRyaWNhbGx5IikKewogIC8qICAKCiAgdGhpcyBpcyBh
IHNwZWNpYWwgbWVyZ2Ugb3BlcmF0b3IsIGJ1dCB2ZXJ5IHVzZWZ1bCBmb3IgcGVvcGxlIG1h
aW50YWluaW5nCiAgInNsaWdodGx5IGRpc3BhcmF0ZSBidXQgcmVsYXRlZCIgdHJlZXMuIGl0
IGRvZXMgYSBvbmUtd2F5IG1lcmdlOyBsZXNzCiAgcG93ZXJmdWwgdGhhbiBwdXR0aW5nIHRo
aW5ncyBpbiB0aGUgc2FtZSBicmFuY2ggYW5kIGFsc28gbW9yZSBmbGV4aWJsZS4KCiAgMS4g
Y2hlY2sgdG8gc2VlIGlmIHNyYyBhbmQgZHN0IGJyYW5jaGVzIGFyZSBtZXJnZWQsIGlmIG5v
dCBhYm9ydCwgaWYgc28KICAgICBjYWxsIGhlYWRzIE4xIGFuZCBOMiByZXNwZWN0aXZlbHku
CgogIDIuIChGSVhNRTogbm90IHlldCBwcmVzZW50KSBydW4gdGhlIGhvb2sgcHJvcGFnYXRl
ICgic3JjLWJyYW5jaCIsCiAgICAgImRzdC1icmFuY2giLCBOMSwgTjIpIHdoaWNoIGdpdmVz
IHRoZSB1c2VyIGEgY2hhbmNlIHRvIG1hc3NhZ2UgTjEgaW50bwogICAgIGEgc3RhdGUgd2hp
Y2ggaXMgbGlrZWx5IHRvICJtZXJnZSBuaWNlbHkiIHdpdGggTjIsIGVnLiBlZGl0IHBhdGhu
YW1lcywKICAgICBvbWl0IG9wdGlvbmFsIGZpbGVzIG9mIG5vIGludGVyZXN0LgoKICAzLiBk
byBhIG5vcm1hbCAyIG9yIDMtd2F5IG1lcmdlIG9uIE4xIGFuZCBOMiwgZGVwZW5kaW5nIG9u
IHRoZQogICAgIGV4aXN0ZW5jZSBvZiBjb21tb24gYW5jZXN0b3JzLgoKICA0LiBzYXZlIHRo
ZSByZXN1bHRzIGFzIHRoZSBkZWx0YSAoTjIsTSksIHRoZSBhbmNlc3RyeSBlZGdlcyAoTjEs
TSkKICAgICBhbmQgKE4yLE0pLCBhbmQgdGhlIGNlcnQgKE4yLGRzdCkuCgogIDUuIHF1ZXVl
IHRoZSByZXN1bHRpbmcgcGFja2V0cyB0byBzZW5kIHRvIHRoZSB1cmwgZm9yIGRzdC1icmFu
Y2gsIG5vdAogICAgIHNyYy1icmFuY2guCgogICovCgogIHZlY3RvcjxtYW5pZmVzdF9pZD4g
c3JjX2hlYWRzLCBkc3RfaGVhZHM7CgogIGlmIChhcmdzLnNpemUoKSAhPSAyKQogICAgdGhy
b3cgdXNhZ2UobmFtZSk7CgogIGdldF9icmFuY2hfaGVhZHMoYXJnc1swXSwgYXBwLCBzcmNf
aGVhZHMpOwogIGdldF9icmFuY2hfaGVhZHMoYXJnc1sxXSwgYXBwLCBkc3RfaGVhZHMpOwoK
ICBpZiAoc3JjX2hlYWRzLnNpemUoKSA9PSAwKQogICAgewogICAgICBjb3V0IDw8ICJicmFu
Y2ggIiA8PCBhcmdzWzBdIDw8ICJpcyBlbXB0eSIgPDwgZW5kbDsKICAgICAgcmV0dXJuOwog
ICAgfQogIGVsc2UgaWYgKHNyY19oZWFkcy5zaXplKCkgIT0gMSkKICAgIHsKICAgICAgY291
dCA8PCAiYnJhbmNoICIgPDwgYXJnc1swXSA8PCAiaXMgbm90IG1lcmdlZCIgPDwgZW5kbDsK
ICAgICAgcmV0dXJuOwogICAgfQogIGVsc2UgaWYgKGRzdF9oZWFkcy5zaXplKCkgPT0gMCkK
ICAgIHsKICAgICAgY291dCA8PCAiYnJhbmNoICIgPDwgYXJnc1sxXSA8PCAiaXMgZW1wdHki
IDw8IGVuZGw7CiAgICAgIHJldHVybjsKICAgIH0KICBlbHNlIGlmIChkc3RfaGVhZHMuc2l6
ZSgpICE9IDEpCiAgICB7CiAgICAgIGNvdXQgPDwgImJyYW5jaCAiIDw8IGFyZ3NbMV0gPDwg
ImlzIG5vdCBtZXJnZWQiIDw8IGVuZGw7CiAgICAgIHJldHVybjsKICAgIH0KICBlbHNlCiAg
ICB7CiAgICAgIHZlY3RvcjwgcGFpcjx1cmwsZ3JvdXA+ID4gdGFyZ2V0czsKICAgICAgYXBw
Lmx1YS5ob29rX2dldF9wb3N0X3RhcmdldHMoYXJnc1sxXSwgdGFyZ2V0cyk7CgogICAgICBt
YW5pZmVzdF9pZCBtZXJnZWQ7CiAgICAgIHRyYW5zYWN0aW9uX2d1YXJkIGd1YXJkKGFwcC5k
Yik7CiAgICAgIHRyeV9vbmVfbWVyZ2UgKHNyY19oZWFkc1swXSwgZHN0X2hlYWRzWzBdLCBt
ZXJnZWQsIGFwcCwgdGFyZ2V0cyk7ICAgICAgCgogICAgICBxdWV1ZWluZ19wYWNrZXRfd3Jp
dGVyIHFwdyhhcHAsIHRhcmdldHMpOwogICAgICBjZXJ0X21hbmlmZXN0X2luX2JyYW5jaCht
ZXJnZWQsIGFwcC5icmFuY2hfbmFtZSwgYXBwLCBxcHcpOwogICAgICBjZXJ0X21hbmlmZXN0
X2NoYW5nZWxvZyhtZXJnZWQsIAoJCQkgICAgICAicHJvcGFnYXRlIG9mICIgCgkJCSAgICAg
ICsgc3JjX2hlYWRzWzBdLmlubmVyKCkoKSAKCQkJICAgICAgKyAiIGFuZCAiIAoJCQkgICAg
ICArIGRzdF9oZWFkc1swXS5pbm5lcigpKCkKCQkJICAgICAgKyAiXG4iCgkJCSAgICAgICsg
ImZyb20gYnJhbmNoICIgCgkJCSAgICAgICsgYXJnc1swXSArICIgdG8gIiArIGFyZ3NbMV0g
KyAiXG4iLCAKCQkJICAgICAgYXBwLCBxcHcpOwkgIAogICAgICBndWFyZC5jb21taXQoKTsg
ICAgICAKICAgIH0KfQoKCgpDTUQoZGlmZiwgImluZm9ybWF0aXZlIiwgIiIsICJzaG93IGN1
cnJlbnQgZGlmZnMgb24gc3Rkb3V0IikKewogIG1hbmlmZXN0X21hcCBtX29sZCwgbV9uZXc7
CiAgcGF0Y2hfc2V0IHBzOwoKICB0cmFuc2FjdGlvbl9ndWFyZCBndWFyZChhcHAuZGIpOwoK
ICBnZXRfbWFuaWZlc3RfbWFwKG1fb2xkKTsKICBjYWxjdWxhdGVfbmV3X21hbmlmZXN0X21h
cChtX29sZCwgbV9uZXcpOwogIG1hbmlmZXN0c190b19wYXRjaF9zZXQobV9vbGQsIG1fbmV3
LCBhcHAsIHBzKTsKCiAgZm9yIChzZXQ8cGF0Y2hfZGVsdGE+Ojpjb25zdF9pdGVyYXRvciBp
ID0gcHMuZl9kZWx0YXMuYmVnaW4oKTsKICAgICAgIGkgIT0gcHMuZl9kZWx0YXMuZW5kKCk7
ICsraSkKICAgIHsKICAgICAgZmlsZV9kYXRhIGZfb2xkOwogICAgICBnemlwPGRhdGE+IGRl
Y29kZWRfb2xkOwogICAgICBkYXRhIGRlY29tcHJlc3NlZF9vbGQsIGRlY29tcHJlc3NlZF9u
ZXc7CiAgICAgIHZlY3RvcjxzdHJpbmc+IG9sZF9saW5lcywgbmV3X2xpbmVzOwoKICAgICAg
YXBwLmRiLmdldF9maWxlX3ZlcnNpb24oaS0+aWRfb2xkLCBmX29sZCk7CiAgICAgIGRlY29k
ZV9iYXNlNjQoZl9vbGQuaW5uZXIoKSwgZGVjb2RlZF9vbGQpOwogICAgICBkZWNvZGVfZ3pp
cChkZWNvZGVkX29sZCwgZGVjb21wcmVzc2VkX29sZCk7CgogICAgICByZWFkX2RhdGEoaS0+
cGF0aCwgZGVjb21wcmVzc2VkX25ldyk7CgogICAgICBzcGxpdF9pbnRvX2xpbmVzKGRlY29t
cHJlc3NlZF9vbGQoKSwgb2xkX2xpbmVzKTsKICAgICAgc3BsaXRfaW50b19saW5lcyhkZWNv
bXByZXNzZWRfbmV3KCksIG5ld19saW5lcyk7CgogICAgICB1bmlkaWZmKGktPnBhdGgoKSwg
aS0+cGF0aCgpLCBvbGRfbGluZXMsIG5ld19saW5lcywgY291dCk7CiAgICB9ICAKICBndWFy
ZC5jb21taXQoKTsKfQoKQ01EKHN0YXR1cywgImluZm9ybWF0aXZlIiwgIiIsICJzaG93IHN0
YXR1cyBvZiB3b3JraW5nIGNvcHkiKQp7CiAgbWFuaWZlc3RfbWFwIG1fb2xkLCBtX25ldzsK
ICBwYXRjaF9zZXQgcHM7CgogIHRyYW5zYWN0aW9uX2d1YXJkIGd1YXJkKGFwcC5kYik7CiAg
Z2V0X21hbmlmZXN0X21hcChtX29sZCk7CiAgY2FsY3VsYXRlX25ld19tYW5pZmVzdF9tYXAo
bV9vbGQsIG1fbmV3KTsKICBtYW5pZmVzdHNfdG9fcGF0Y2hfc2V0KG1fb2xkLCBtX25ldywg
YXBwLCBwcyk7CiAgcGF0Y2hfc2V0X3RvX3RleHRfc3VtbWFyeShwcywgY291dCk7CiAgZ3Vh
cmQuY29tbWl0KCk7Cn0KCgpDTUQobWRlbHRhLCAicGFja2V0IGkvbyIsICI8b2xkaWQ+IDxu
ZXdpZD4iLCAid3JpdGUgbWFuaWZlc3QgZGVsdGEgcGFja2V0IHRvIHN0ZG91dCIpCnsKICBp
ZiAoYXJncy5zaXplKCkgIT0gMikKICAgIHRocm93IHVzYWdlKG5hbWUpOwoKICB0cmFuc2Fj
dGlvbl9ndWFyZCBndWFyZChhcHAuZGIpOwogIHBhY2tldF93cml0ZXIgcHcoY291dCk7Cgog
IG1hbmlmZXN0X2lkIG1fb2xkX2lkLCBtX25ld19pZDsgCiAgbWFuaWZlc3RfZGF0YSBtX29s
ZF9kYXRhLCBtX25ld19kYXRhOwogIG1hbmlmZXN0X21hcCBtX29sZCwgbV9uZXc7CiAgcGF0
Y2hfc2V0IHBzOyAgICAgIAogIG1fb2xkX2lkID0gaGV4ZW5jPGlkPihhcmdzWzBdKTsgCiAg
bV9uZXdfaWQgPSBoZXhlbmM8aWQ+KGFyZ3NbMV0pOwogIGFwcC5kYi5nZXRfbWFuaWZlc3Rf
dmVyc2lvbihtX29sZF9pZCwgbV9vbGRfZGF0YSk7CiAgYXBwLmRiLmdldF9tYW5pZmVzdF92
ZXJzaW9uKG1fbmV3X2lkLCBtX25ld19kYXRhKTsKICByZWFkX21hbmlmZXN0X21hcChtX29s
ZF9kYXRhLCBtX29sZCk7CiAgcmVhZF9tYW5pZmVzdF9tYXAobV9uZXdfZGF0YSwgbV9uZXcp
OwogIG1hbmlmZXN0c190b19wYXRjaF9zZXQobV9vbGQsIG1fbmV3LCBhcHAsIHBzKTsKICBw
YXRjaF9zZXRfdG9fcGFja2V0cyhwcywgYXBwLCBwdyk7ICAKICBndWFyZC5jb21taXQoKTsK
fQoKQ01EKGZkZWx0YSwgInBhY2tldCBpL28iLCAiPG9sZGlkPiA8bmV3aWQ+IiwgIndyaXRl
IGZpbGUgZGVsdGEgcGFja2V0IHRvIHN0ZG91dCIpCnsKICBpZiAoYXJncy5zaXplKCkgIT0g
MikKICAgIHRocm93IHVzYWdlKG5hbWUpOwoKICB0cmFuc2FjdGlvbl9ndWFyZCBndWFyZChh
cHAuZGIpOwogIHBhY2tldF93cml0ZXIgcHcoY291dCk7CgogIGZpbGVfaWQgZl9vbGRfaWQs
IGZfbmV3X2lkOwogIGZpbGVfZGF0YSBmX29sZF9kYXRhLCBmX25ld19kYXRhOwogIGZfb2xk
X2lkID0gaGV4ZW5jPGlkPihhcmdzWzBdKTsKICBmX25ld19pZCA9IGhleGVuYzxpZD4oYXJn
c1sxXSk7ICAgICAKICBhcHAuZGIuZ2V0X2ZpbGVfdmVyc2lvbihmX29sZF9pZCwgZl9vbGRf
ZGF0YSk7CiAgYXBwLmRiLmdldF9maWxlX3ZlcnNpb24oZl9uZXdfaWQsIGZfbmV3X2RhdGEp
OwogIGJhc2U2NDwgZ3ppcDxkZWx0YT4gPiBkZWw7CiAgZGlmZihmX29sZF9kYXRhLmlubmVy
KCksIGZfbmV3X2RhdGEuaW5uZXIoKSwgZGVsKTsKICBwdy5jb25zdW1lX2ZpbGVfZGVsdGEo
Zl9vbGRfaWQsIGZfbmV3X2lkLCBmaWxlX2RlbHRhKGRlbCkpOyAgCiAgZ3VhcmQuY29tbWl0
KCk7Cn0KCkNNRChtZGF0YSwgInBhY2tldCBpL28iLCAiPGlkPiIsICJ3cml0ZSBtYW5pZmVz
dCBkYXRhIHBhY2tldCB0byBzdGRvdXQiKQp7CiAgaWYgKGFyZ3Muc2l6ZSgpICE9IDEpCiAg
ICB0aHJvdyB1c2FnZShuYW1lKTsKCiAgdHJhbnNhY3Rpb25fZ3VhcmQgZ3VhcmQoYXBwLmRi
KTsKICBwYWNrZXRfd3JpdGVyIHB3KGNvdXQpOwoKICBtYW5pZmVzdF9pZCBtX2lkOwogIG1h
bmlmZXN0X2RhdGEgbV9kYXRhOwogIG1faWQgPSBoZXhlbmM8aWQ+KGFyZ3NbMF0pOwogIGFw
cC5kYi5nZXRfbWFuaWZlc3RfdmVyc2lvbihtX2lkLCBtX2RhdGEpOwogIHB3LmNvbnN1bWVf
bWFuaWZlc3RfZGF0YShtX2lkLCBtX2RhdGEpOyAgCiAgZ3VhcmQuY29tbWl0KCk7Cn0KCgpD
TUQoZmRhdGEsICJwYWNrZXQgaS9vIiwgIjxpZD4iLCAid3JpdGUgZmlsZSBkYXRhIHBhY2tl
dCB0byBzdGRvdXQiKQp7CiAgaWYgKGFyZ3Muc2l6ZSgpICE9IDEpCiAgICB0aHJvdyB1c2Fn
ZShuYW1lKTsKCiAgdHJhbnNhY3Rpb25fZ3VhcmQgZ3VhcmQoYXBwLmRiKTsKICBwYWNrZXRf
d3JpdGVyIHB3KGNvdXQpOwoKICBmaWxlX2lkIGZfaWQ7CiAgZmlsZV9kYXRhIGZfZGF0YTsK
ICBmX2lkID0gaGV4ZW5jPGlkPihhcmdzWzBdKTsKICBhcHAuZGIuZ2V0X2ZpbGVfdmVyc2lv
bihmX2lkLCBmX2RhdGEpOwogIHB3LmNvbnN1bWVfZmlsZV9kYXRhKGZfaWQsIGZfZGF0YSk7
ICAKICBndWFyZC5jb21taXQoKTsKfQoKQ01EKG1jZXJ0cywgInBhY2tldCBpL28iLCAiPGlk
PiIsICJ3cml0ZSBtYW5pZmVzdCBjZXJ0IHBhY2tldHMgdG8gc3Rkb3V0IikKewogIGlmIChh
cmdzLnNpemUoKSAhPSAxKQogICAgdGhyb3cgdXNhZ2UobmFtZSk7CgogIHRyYW5zYWN0aW9u
X2d1YXJkIGd1YXJkKGFwcC5kYik7CiAgcGFja2V0X3dyaXRlciBwdyhjb3V0KTsKCiAgbWFu
aWZlc3RfaWQgbV9pZDsKICB2ZWN0b3I8IG1hbmlmZXN0PGNlcnQ+ID4gY2VydHM7CgogIG1f
aWQgPSBoZXhlbmM8aWQ+KGFyZ3NbMF0pOwogIGFwcC5kYi5nZXRfbWFuaWZlc3RfY2VydHMo
bV9pZCwgY2VydHMpOwogIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2VydHMuc2l6ZSgpOyAr
K2kpCiAgICBwdy5jb25zdW1lX21hbmlmZXN0X2NlcnQoY2VydHNbaV0pOwogIGd1YXJkLmNv
bW1pdCgpOwp9CgpDTUQoZmNlcnRzLCAicGFja2V0IGkvbyIsICI8aWQ+IiwgIndyaXRlIGZp
bGUgY2VydCBwYWNrZXRzIHRvIHN0ZG91dCIpCnsKICBpZiAoYXJncy5zaXplKCkgIT0gMSkK
ICAgIHRocm93IHVzYWdlKG5hbWUpOwoKICB0cmFuc2FjdGlvbl9ndWFyZCBndWFyZChhcHAu
ZGIpOwogIHBhY2tldF93cml0ZXIgcHcoY291dCk7CgogIGZpbGVfaWQgZl9pZDsKICB2ZWN0
b3I8IGZpbGU8Y2VydD4gPiBjZXJ0czsKCiAgZl9pZCA9IGhleGVuYzxpZD4oYXJnc1swXSk7
CiAgYXBwLmRiLmdldF9maWxlX2NlcnRzKGZfaWQsIGNlcnRzKTsKICBmb3IgKHNpemVfdCBp
ID0gMDsgaSA8IGNlcnRzLnNpemUoKTsgKytpKQogICAgcHcuY29uc3VtZV9maWxlX2NlcnQo
Y2VydHNbaV0pOwogIGd1YXJkLmNvbW1pdCgpOwp9CgpDTUQocHVia2V5LCAicGFja2V0IGkv
byIsICI8aWQ+IiwgIndyaXRlIHB1YmxpYyBrZXkgcGFja2V0IHRvIHN0ZG91dCIpCnsKICBp
ZiAoYXJncy5zaXplKCkgIT0gMSkKICAgIHRocm93IHVzYWdlKG5hbWUpOwoKICB0cmFuc2Fj
dGlvbl9ndWFyZCBndWFyZChhcHAuZGIpOwogIHBhY2tldF93cml0ZXIgcHcoY291dCk7CiAg
cnNhX2tleXBhaXJfaWQgaWRlbnQoYXJnc1swXSk7CiAgYmFzZTY0PCByc2FfcHViX2tleSA+
IGtleTsKICBhcHAuZGIuZ2V0X2tleShpZGVudCwga2V5KTsKICBwdy5jb25zdW1lX3B1Ymxp
Y19rZXkoaWRlbnQsIGtleSk7CiAgZ3VhcmQuY29tbWl0KCk7Cn0KCkNNRChwcml2a2V5LCAi
cGFja2V0IGkvbyIsICI8aWQ+IiwgIndyaXRlIHByaXZhdGUga2V5IHBhY2tldCB0byBzdGRv
dXQiKQp7CiAgaWYgKGFyZ3Muc2l6ZSgpICE9IDEpCiAgICB0aHJvdyB1c2FnZShuYW1lKTsK
CiAgdHJhbnNhY3Rpb25fZ3VhcmQgZ3VhcmQoYXBwLmRiKTsKICBwYWNrZXRfd3JpdGVyIHB3
KGNvdXQpOwogIHJzYV9rZXlwYWlyX2lkIGlkZW50KGFyZ3NbMF0pOwogIGJhc2U2NDwgYXJj
NDxyc2FfcHJpdl9rZXk+ID4ga2V5OwogIGFwcC5kYi5nZXRfa2V5KGlkZW50LCBrZXkpOwog
IHB3LmNvbnN1bWVfcHJpdmF0ZV9rZXkoaWRlbnQsIGtleSk7CiAgZ3VhcmQuY29tbWl0KCk7
Cn0KCgpDTUQocmVhZCwgInBhY2tldCBpL28iLCAiIiwgInJlYWQgcGFja2V0cyBmcm9tIHN0
ZGluIikKewogIHRyYW5zYWN0aW9uX2d1YXJkIGd1YXJkKGFwcC5kYik7CiAgcGFja2V0X2Ri
X3dyaXRlciBkYncoYXBwLCB0cnVlKTsKICBzaXplX3QgY291bnQgPSByZWFkX3BhY2tldHMo
Y2luLCBkYncpOwogIE4oY291bnQgIT0gMCwgIm5vIHBhY2tldHMgZm91bmQgb24gc3RkaW4i
KTsKICBpZiAoY291bnQgPT0gMSkKICAgIFAoInJlYWQgMSBwYWNrZXRcbiIpOwogIGVsc2UK
ICAgIFAoInJlYWQgJWQgcGFja2V0c1xuIiwgY291bnQpOwogIGd1YXJkLmNvbW1pdCgpOwp9
CgoKQ01EKGFncmFwaCwgImdyYXBoIHZpc3VhbGl6YXRpb24iLCAiIiwgImR1bXAgYW5jZXN0
cnkgZ3JhcGggdG8gc3Rkb3V0IikKewogIHZlY3RvcjwgbWFuaWZlc3Q8Y2VydD4gPiBjZXJ0
czsKICB0cmFuc2FjdGlvbl9ndWFyZCBndWFyZChhcHAuZGIpOwogIGFwcC5kYi5nZXRfbWFu
aWZlc3RfY2VydHMoYW5jZXN0b3JfY2VydF9uYW1lLCBjZXJ0cyk7CiAgc2V0PHN0cmluZz4g
bm9kZXM7CiAgdmVjdG9yPCBwYWlyPHN0cmluZywgc3RyaW5nPiA+IGVkZ2VzOwogIGZvcih2
ZWN0b3I8IG1hbmlmZXN0PGNlcnQ+ID46Oml0ZXJhdG9yIGkgPSBjZXJ0cy5iZWdpbigpOwog
ICAgICBpICE9IGNlcnRzLmVuZCgpOyArK2kpCiAgICB7CiAgICAgIGNlcnRfdmFsdWUgdHY7
CiAgICAgIGRlY29kZV9iYXNlNjQoaS0+aW5uZXIoKS52YWx1ZSwgdHYpOwogICAgICBub2Rl
cy5pbnNlcnQodHYoKSk7CiAgICAgIG5vZGVzLmluc2VydChpLT5pbm5lcigpLmlkZW50KCkp
OwogICAgICBlZGdlcy5wdXNoX2JhY2sobWFrZV9wYWlyKHR2KCksIGktPmlubmVyKCkuaWRl
bnQoKSkpOwogICAgfQogIGNvdXQgPDwgImdyYXBoOiAiIDw8IGVuZGwgPDwgInsiIDw8IGVu
ZGw7IC8vIG9wZW4gZ3JhcGgKICBmb3IgKHNldDxzdHJpbmc+OjppdGVyYXRvciBpID0gbm9k
ZXMuYmVnaW4oKTsgaSAhPSBub2Rlcy5lbmQoKTsKICAgICAgICsraSkKICAgIHsKICAgICAg
Y291dCA8PCAibm9kZTogeyB0aXRsZSA6IFwiIiA8PCAqaSA8PCAiXCJ9IiA8PCBlbmRsOwog
ICAgfQogIGZvciAodmVjdG9yPCBwYWlyPHN0cmluZyxzdHJpbmc+ID46Oml0ZXJhdG9yIGkg
PSBlZGdlcy5iZWdpbigpOyBpICE9IGVkZ2VzLmVuZCgpOwogICAgICAgKytpKQogICAgewog
ICAgICBjb3V0IDw8ICJlZGdlOiB7IHNvdXJjZW5hbWUgOiBcIiIgPDwgaS0+Zmlyc3QgPDwg
IlwiIiA8PCBlbmRsCgkgICA8PCAiICAgICAgICB0YXJnZXRuYW1lIDogXCIiIDw8IGktPnNl
Y29uZCA8PCAiXCIgfSIgPDwgZW5kbDsKICAgIH0KICBjb3V0IDw8ICJ9IiA8PCBlbmRsIDw8
IGVuZGw7IC8vIGNsb3NlIGdyYXBoCiAgZ3VhcmQuY29tbWl0KCk7Cn0KCkNNRChmZXRjaCwg
Im5ldHdvcmsiLCAiW1VSTF0gW2dyb3VwbmFtZV0iLCAiZmV0Y2ggcmVjZW50IGNoYW5nZXMg
ZnJvbSBuZXR3b3JrIikKewogIGlmIChhcmdzLnNpemUoKSA+IDIpCiAgICB0aHJvdyB1c2Fn
ZShuYW1lKTsKCiAgdmVjdG9yPCBwYWlyPHVybCxncm91cD4gPiBzb3VyY2VzOwoKICBpZiAo
YXJncy5zaXplKCkgPT0gMCkKICAgIHsKICAgICAgaWYgKGFwcC5icmFuY2hfbmFtZSA9PSAi
IikKCXsKCSAgUCgibm8gYnJhbmNoIG5hbWUgcHJvdmlkZWQsIGZldGNoaW5nIGZyb20gYWxs
IGtub3duIFVSTHNcbiIpOwoJICBhcHAuZGIuZ2V0X2FsbF9rbm93bl9zb3VyY2VzKHNvdXJj
ZXMpOwoJfQogICAgICBlbHNlCgl7CgkgIE4oYXBwLmx1YS5ob29rX2dldF9mZXRjaF9zb3Vy
Y2VzKGFwcC5icmFuY2hfbmFtZSwgc291cmNlcyksCgkgICAgKCJubyBVUkwgLyBncm91cCBw
YWlycyBmb3VuZCBmb3IgYnJhbmNoICIgKyBhcHAuYnJhbmNoX25hbWUpKTsgCgl9CiAgICB9
CiAgZWxzZQogICAgewogICAgICBOKGFyZ3Muc2l6ZSgpID09IDIsICJuZWVkIFVSTCBhbmQg
Z3JvdXBuYW1lIik7CiAgICAgIHNvdXJjZXMucHVzaF9iYWNrKG1ha2VfcGFpcih1cmwoYXJn
c1swXSksCgkJCQkgIGdyb3VwKGFyZ3NbMV0pKSk7CiAgICB9CiAgCiAgZmV0Y2hfcXVldWVk
X2Jsb2JzX2Zyb21fbmV0d29yayhzb3VyY2VzLCBhcHApOwp9CgpDTUQocG9zdCwgIm5ldHdv
cmsiLCAiW1VSTF0gW2dyb3VwbmFtZV0iLCAicG9zdCBxdWV1ZWQgY2hhbmdlcyB0byBuZXR3
b3JrIikKewogIGlmIChhcmdzLnNpemUoKSA+IDIpCiAgICB0aHJvdyB1c2FnZShuYW1lKTsK
CiAgdmVjdG9yPCBwYWlyPHVybCxncm91cD4gPiB0YXJnZXRzOwogIGlmIChhcmdzLnNpemUo
KSA9PSAwKQogICAgewogICAgICBpZiAoYXBwLmJyYW5jaF9uYW1lID09ICIiKQoJewoJICBQ
KCJubyBicmFuY2ggbmFtZSBwcm92aWRlZCwgcG9zdGluZyBhbGwgcXVldWVkIHRhcmdldHNc
biIpOwoJICBhcHAuZGIuZ2V0X3F1ZXVlZF90YXJnZXRzKHRhcmdldHMpOwoJfQogICAgICBl
bHNlCgl7CgkgIE4oYXBwLmx1YS5ob29rX2dldF9wb3N0X3RhcmdldHMoYXBwLmJyYW5jaF9u
YW1lLCB0YXJnZXRzKSwKCSAgICAoIm5vIFVSTCAvIGdyb3VwIHBhaXJzIGZvdW5kIGZvciBi
cmFuY2ggIiArIGFwcC5icmFuY2hfbmFtZSkpOyAKCX0KICAgIH0gIAogIGVsc2UKICAgIHsK
ICAgICAgTihhcmdzLnNpemUoKSA9PSAyLCAibmVlZCBVUkwgYW5kIGdyb3VwbmFtZSIpOwog
ICAgICB0YXJnZXRzLnB1c2hfYmFjayhtYWtlX3BhaXIodXJsKGFyZ3NbMF0pLAoJCQkJICBn
cm91cChhcmdzWzFdKSkpOwogICAgfQoKICBwb3N0X3F1ZXVlZF9ibG9ic190b19uZXR3b3Jr
KHRhcmdldHMsIGFwcCk7Cn0KCgpDTUQocmNzX2ltcG9ydCwgInJjcyIsICI8cmNzZmlsZT4g
Li4uIiwgImltcG9ydCBhbGwgdmVyc2lvbnMgaW4gUkNTIGZpbGVzIikKewogIGlmIChhcmdz
LnNpemUoKSA8IDEpCiAgICB0aHJvdyB1c2FnZShuYW1lKTsKICAKICB0cmFuc2FjdGlvbl9n
dWFyZCBndWFyZChhcHAuZGIpOwogIGZvciAodmVjdG9yPHN0cmluZz46OmNvbnN0X2l0ZXJh
dG9yIGkgPSBhcmdzLmJlZ2luKCk7CiAgICAgICBpICE9IGFyZ3MuZW5kKCk7ICsraSkKICAg
IHsKICAgICAgaW1wb3J0X3Jjc19maWxlKGZzOjpwYXRoKCppKSwgYXBwLmRiKTsKICAgIH0K
ICBndWFyZC5jb21taXQoKTsKfQoKCkNNRChjdnNfaW1wb3J0LCAicmNzIiwgIjxjdnNyb290
PiIsICJpbXBvcnQgYWxsIHZlcnNpb25zIGluIENWUyByZXBvc2l0b3J5IikKewogIGlmIChh
cmdzLnNpemUoKSAhPSAxKQogICAgdGhyb3cgdXNhZ2UobmFtZSk7CgogIGltcG9ydF9jdnNf
cmVwbyhmczo6cGF0aChhcmdzLmF0KDApKSwgYXBwKTsKfQoKCn07IC8vIG5hbWVzcGFjZSBj
b21tYW5kcwo=
_ATEOF


cat >secondfile.b64 <<'_ATEOF'
Ly8gY29weXJpZ2h0IChDKSAyMDAyLCAyMDAzIGdyYXlkb24gaG9hcmUgPGdyYXlkb25AcG9i
b3guY29tPgovLyBhbGwgcmlnaHRzIHJlc2VydmVkLgovLyBsaWNlbnNlZCB0byB0aGUgcHVi
bGljIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCAoPj0gMikKLy8gc2VlIHRoZSBm
aWxlIENPUFlJTkcgZm9yIGRldGFpbHMKCiNpbmNsdWRlIDxtYXA+CiNpbmNsdWRlIDxjc3Rk
aW8+CiNpbmNsdWRlIDxzZXQ+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxhbGdvcml0
aG0+CiNpbmNsdWRlIDxpdGVyYXRvcj4KI2luY2x1ZGUgPGJvb3N0L2ZpbGVzeXN0ZW0vcGF0
aC5ocHA+CiNpbmNsdWRlIDxib29zdC9maWxlc3lzdGVtL29wZXJhdGlvbnMuaHBwPgojaW5j
bHVkZSA8Ym9vc3QvbGV4aWNhbF9jYXN0LmhwcD4KCiNpbmNsdWRlICJjb21tYW5kcy5oaCIK
I2luY2x1ZGUgImNvbnN0YW50cy5oaCIKCiNpbmNsdWRlICJhcHBfc3RhdGUuaGgiCiNpbmNs
dWRlICJkaWZmX3BhdGNoLmhoIgojaW5jbHVkZSAiZmlsZV9pby5oaCIKI2luY2x1ZGUgImtl
eXMuaGgiCiNpbmNsdWRlICJtYW5pZmVzdC5oaCIKI2luY2x1ZGUgIm5ldHdvcmsuaGgiCiNp
bmNsdWRlICJwYWNrZXQuaGgiCiNpbmNsdWRlICJwYXRjaF9zZXQuaGgiCiNpbmNsdWRlICJy
Y3NfaW1wb3J0LmhoIgojaW5jbHVkZSAic2FuaXR5LmhoIgojaW5jbHVkZSAiY2VydC5oaCIK
I2luY2x1ZGUgInRyYW5zZm9ybXMuaGgiCiNpbmNsdWRlICJ1cGRhdGUuaGgiCiNpbmNsdWRl
ICJ2b2NhYi5oaCIKI2luY2x1ZGUgIndvcmsuaGgiCgovLwovLyB0aGlzIGZpbGUgZGVmaW5l
cyB0aGUgdGFzay1vcmllbnRlZCAidG9wIGxldmVsIiBjb21tYW5kcyB3aGljaCBjYW4gYmUK
Ly8gaXNzdWVkIGFzIHBhcnQgb2YgYSBtb25vdG9uZSBjb21tYW5kIGxpbmUuIHRoZSBjb21t
YW5kIGxpbmUgY2FuIG9ubHkKLy8gaGF2ZSBvbmUgc3VjaCBjb21tYW5kIG9uIGl0LCBmb2xs
b3dlZCBieSBhIHZlY3RvciBvZiBzdHJpbmdzIHdoaWNoIGFyZSBpdHMKLy8gYXJndW1lbnRz
LiBhbGwgLS1vcHRpb25zIHdpbGwgYmUgcHJvY2Vzc2VkIGJ5IHRoZSBtYWluIHByb2dyYW0g
KmJlZm9yZSoKLy8gY2FsbGluZyBhIGNvbW1hbmQKLy8KLy8gd2UgbWlnaHQgZXhwb3NlIHRo
aXMgYmx1bnQgY29tbWFuZCBpbnRlcmZhY2UgdG8gc2NyaXB0aW5nIHNvbWVkYXkuIGJ1dAov
LyBub3QgdG9kYXkuCgpuYW1lc3BhY2UgY29tbWFuZHMgCnsKICBzdHJ1Y3QgY29tbWFuZDsK
ICBib29sIG9wZXJhdG9yPChjb21tYW5kIGNvbnN0ICYgc2VsZiwgY29tbWFuZCBjb25zdCAm
IG90aGVyKTsKfTsKCm5hbWVzcGFjZSBzdGQKewogIHRlbXBsYXRlIDw+CiAgc3RydWN0IHN0
ZDo6Z3JlYXRlcjxjb21tYW5kczo6Y29tbWFuZCAqPgogIHsKICAgIGJvb2wgb3BlcmF0b3Io
KShjb21tYW5kczo6Y29tbWFuZCBjb25zdCAqIGEsIGNvbW1hbmRzOjpjb21tYW5kIGNvbnN0
ICogYikKICAgIHsKICAgICAgcmV0dXJuICphIDwgKmI7CiAgICB9CiAgfTsKfTsKCm5hbWVz
cGFjZSBjb21tYW5kcyAKewp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IGNvbW1hbmQ7
IAoKc3RhdGljIG1hcDxzdHJpbmcsY29tbWFuZCAqPiBjbWRzOwoKc3RydWN0IGNvbW1hbmQg
CnsKICBzdHJpbmcgbmFtZTsKICBzdHJpbmcgY21kZ3JvdXA7CiAgc3RyaW5nIHBhcmFtczsK
ICBzdHJpbmcgZGVzYzsKICBjb21tYW5kKHN0cmluZyBjb25zdCAmIG4sCgkgIHN0cmluZyBj
b25zdCAmIGcsCgkgIHN0cmluZyBjb25zdCAmIHAsCgkgIHN0cmluZyBjb25zdCAmIGQpIDog
bmFtZShuKSwgY21kZ3JvdXAoZyksIHBhcmFtcyhwKSwgZGVzYyhkKSAKICB7IGNtZHNbbl0g
PSB0aGlzOyB9CiAgdmlydHVhbCB+Y29tbWFuZCgpIHt9CiAgdmlydHVhbCB2b2lkIGV4ZWMo
YXBwX3N0YXRlICYgYXBwLCB2ZWN0b3I8c3RyaW5nPiBjb25zdCAmIGFyZ3MpID0gMDsKfTsK
CmJvb2wgb3BlcmF0b3I8KGNvbW1hbmQgY29uc3QgJiBzZWxmLCBjb21tYW5kIGNvbnN0ICYg
b3RoZXIpCnsKICByZXR1cm4gKChzZWxmLmNtZGdyb3VwIDwgb3RoZXIuY21kZ3JvdXApCgkg
IHx8ICgoc2VsZi5jbWRncm91cCA9PSBvdGhlci5jbWRncm91cCkgJiYgKHNlbGYubmFtZSA8
IG90aGVyLm5hbWUpKSk7Cn0KCgp2b2lkIGV4cGxhaW5fdXNhZ2Uoc3RyaW5nIGNvbnN0ICYg
Y21kLCBvc3RyZWFtICYgb3V0KQp7CiAgbWFwPHN0cmluZyxjb21tYW5kICo+Ojpjb25zdF9p
dGVyYXRvciBpOwogIGkgPSBjbWRzLmZpbmQoY21kKTsKICBpZiAoaSAhPSBjbWRzLmVuZCgp
KQogICAgewogICAgICBvdXQgPDwgIiAgICAgIiA8PCBpLT5zZWNvbmQtPm5hbWUgPDwgIiAi
IDw8IGktPnNlY29uZC0+cGFyYW1zIDw8IGVuZGwKCSAgPDwgIiAgICAgIiA8PCBpLT5zZWNv
bmQtPmRlc2MgPDwgZW5kbCA8PCBlbmRsOwogICAgICByZXR1cm47CiAgICB9CgogIHZlY3Rv
cjxjb21tYW5kICo+IHNvcnRlZDsKICBvdXQgPDwgImNvbW1hbmRzOiIgPDwgZW5kbDsKICBm
b3IgKGkgPSBjbWRzLmJlZ2luKCk7IGkgIT0gY21kcy5lbmQoKTsgKytpKQogICAgewogICAg
ICBzb3J0ZWQucHVzaF9iYWNrKGktPnNlY29uZCk7CiAgICB9CiAgCiAgc29ydChzb3J0ZWQu
YmVnaW4oKSwgc29ydGVkLmVuZCgpLCBzdGQ6OmdyZWF0ZXI8Y29tbWFuZCAqPigpKTsKCiAg
c3RyaW5nIGN1cnJfZ3JvdXA7CiAgc2l6ZV90IGNvbCA9IDA7CiAgc2l6ZV90IGNvbDIgPSAw
OwogIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc29ydGVkLnNpemUoKTsgKytpKQogICAgewog
ICAgICBjb2wyID0gY29sMiA+IHNvcnRlZFtpXS0+Y21kZ3JvdXAuc2l6ZSgpID8gY29sMiA6
IHNvcnRlZFtpXS0+Y21kZ3JvdXAuc2l6ZSgpOwogICAgfQoKICBmb3IgKHNpemVfdCBpID0g
MDsgaSA8IHNvcnRlZC5zaXplKCk7ICsraSkKICAgIHsKICAgICAgaWYgKHNvcnRlZFtpXS0+
Y21kZ3JvdXAgIT0gY3Vycl9ncm91cCkKCXsKCSAgY3Vycl9ncm91cCA9IHNvcnRlZFtpXS0+
Y21kZ3JvdXA7CgkgIG91dCA8PCBlbmRsOwoJICBvdXQgPDwgIiAgIiA8PCBzb3J0ZWRbaV0t
PmNtZGdyb3VwOwoJICBjb2wgPSBzb3J0ZWRbaV0tPmNtZGdyb3VwLnNpemUoKSArIDI7Cgkg
IHdoaWxlIChjb2wrKyA8IChjb2wyICsgMykpCgkgICAgb3V0IDw8ICcgJzsKCX0KICAgICAg
b3V0IDw8ICIgIiA8PCBzb3J0ZWRbaV0tPm5hbWU7CiAgICAgIGNvbCArPSBzb3J0ZWRbaV0t
Pm5hbWUuc2l6ZSgpICsgMTsKICAgICAgaWYgKGNvbCA+PSA3MCkKCXsKCSAgb3V0IDw8IGVu
ZGw7CgkgIGNvbCA9IDA7CgkgIHdoaWxlIChjb2wrKyA8IChjb2wyICsgMykpCgkgICAgb3V0
IDw8ICcgJzsKCX0KICAgIH0KICBvdXQgPDwgZW5kbCA8PCBlbmRsOwp9Cgp2b2lkIHByb2Nl
c3MoYXBwX3N0YXRlICYgYXBwLCBzdHJpbmcgY29uc3QgJiBjbWQsIHZlY3RvcjxzdHJpbmc+
IGNvbnN0ICYgYXJncykKewogIGlmIChjbWRzLmZpbmQoY21kKSAhPSBjbWRzLmVuZCgpKQog
ICAgewogICAgICBMKCJleGVjdXRpbmcgJXMgY29tbWFuZFxuIiwgY21kLmNfc3RyKCkpOwog
ICAgICBjbWRzW2NtZF0tPmV4ZWMoYXBwLCBhcmdzKTsKICAgIH0KICBlbHNlCiAgICB7CiAg
ICAgIHRocm93IHVzYWdlKGNtZCk7CiAgICB9Cn0KCiNkZWZpbmUgQ01EKEMsIGdyb3VwLCBw
YXJhbXMsIGRlc2MpICAgICAgICAgICAgICAgXApzdHJ1Y3QgY21kXyAjIyBDIDogcHVibGlj
IGNvbW1hbmQgICAgICAgICAgICAgICAgIFwKeyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBcCiAgY21kXyAjIyBDKCkgOiBjb21tYW5kKCNDLCBn
cm91cCwgcGFyYW1zLCBkZXNjKSAgXAogIHt9ICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIFwKICB2aXJ0dWFsIHZvaWQgZXhlYyhhcHBfc3RhdGUgJiBh
cHAsICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHN0cmluZz4g
Y29uc3QgJiBhcmdzKTsgXAp9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFwKc3RhdGljIGNtZF8gIyMgQyBDICMjIF9jbWQ7ICAgICAgICAgICAg
ICAgICAgICAgICBcCnZvaWQgY21kXyAjIyBDOjpleGVjKGFwcF9zdGF0ZSAmIGFwcCwgICAg
ICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8c3RyaW5nPiBjb25zdCAm
IGFyZ3MpIFwKCiNkZWZpbmUgQUxJQVMoQywgcmVhbGNvbW1hbmQsIGdyb3VwLCBwYXJhbXMs
IGRlc2MpCVwKQ01EKEMsIGdyb3VwLCBwYXJhbXMsIGRlc2MpCQkJCVwKewkJCQkJCQlcCiAg
cHJvY2VzcyhhcHAsIHN0cmluZygjcmVhbGNvbW1hbmQpLCBhcmdzKTsJCVwKfQoKCnN0YXRp
YyB2b2lkIGVuc3VyZV9ib29rZGlyKCkKewogIG1rZGlyX3AobG9jYWxfcGF0aChib29rX2tl
ZXBpbmdfZGlyKSk7Cn0KCnN0YXRpYyB2b2lkIGdldF9tYW5pZmVzdF9wYXRoKGxvY2FsX3Bh
dGggJiBtX3BhdGgpCnsKICBtX3BhdGggPSAoZnM6OnBhdGgoYm9va19rZWVwaW5nX2Rpcikg
LyBmczo6cGF0aChtYW5pZmVzdF9maWxlX25hbWUpKS5zdHJpbmcoKTsKICBMKCJtYW5pZmVz
dCBwYXRoIGlzICVzXG4iLCBtX3BhdGgoKS5jX3N0cigpKTsKfQoKc3RhdGljIHZvaWQgZ2V0
X3dvcmtfcGF0aChsb2NhbF9wYXRoICYgd19wYXRoKQp7CiAgd19wYXRoID0gKGZzOjpwYXRo
KGJvb2tfa2VlcGluZ19kaXIpIC8gZnM6OnBhdGgod29ya19maWxlX25hbWUpKS5zdHJpbmco
KTsKICBMKCJ3b3JrIHBhdGggaXMgJXNcbiIsIHdfcGF0aCgpLmNfc3RyKCkpOwp9CgpzdGF0
aWMgdm9pZCBnZXRfbWFuaWZlc3RfbWFwKG1hbmlmZXN0X21hcCAmIG0pCnsKICBlbnN1cmVf
Ym9va2RpcigpOwogIGxvY2FsX3BhdGggbV9wYXRoOwogIGJhc2U2NDwgZ3ppcDxkYXRhPiA+
IG1fZGF0YTsKICBnZXRfbWFuaWZlc3RfcGF0aChtX3BhdGgpOwogIGlmIChmaWxlX2V4aXN0
cyhtX3BhdGgpKQogICAgewogICAgICBMKCJsb2FkaW5nIG1hbmlmZXN0IGZpbGUgJXNcbiIs
IG1fcGF0aCgpLmNfc3RyKCkpOyAgICAgIAogICAgICByZWFkX2RhdGEobV9wYXRoLCBtX2Rh
dGEpOwogICAgICByZWFkX21hbmlmZXN0X21hcChtYW5pZmVzdF9kYXRhKG1fZGF0YSksIG0p
OwogICAgICBMKCJyZWFkICVkIG1hbmlmZXN0IGVudHJpZXNcbiIsIG0uc2l6ZSgpKTsKICAg
IH0KICBlbHNlCiAgICB7CiAgICAgIEwoIm5vIG1hbmlmZXN0IGZpbGUgJXNcbiIsIG1fcGF0
aCgpLmNfc3RyKCkpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBwdXRfbWFuaWZlc3RfbWFwKG1h
bmlmZXN0X21hcCBjb25zdCAmIG0pCnsKICBlbnN1cmVfYm9va2RpcigpOwogIGxvY2FsX3Bh
dGggbV9wYXRoOwogIG1hbmlmZXN0X2RhdGEgbV9kYXRhOwogIGdldF9tYW5pZmVzdF9wYXRo
KG1fcGF0aCk7CiAgTCgid3JpdGluZyBtYW5pZmVzdCBmaWxlICVzXG4iLCBtX3BhdGgoKS5j
X3N0cigpKTsKICB3cml0ZV9tYW5pZmVzdF9tYXAobSwgbV9kYXRhKTsKICB3cml0ZV9kYXRh
KG1fcGF0aCwgbV9kYXRhLmlubmVyKCkpOwogIEwoIndyb3RlICVkIG1hbmlmZXN0IGVudHJp
ZXNcbiIsIG0uc2l6ZSgpKTsKfQoKc3RhdGljIHZvaWQgZ2V0X3dvcmtfc2V0KHdvcmtfc2V0
ICYgdykKewogIGVuc3VyZV9ib29rZGlyKCk7CiAgbG9jYWxfcGF0aCB3X3BhdGg7CiAgZ2V0
X3dvcmtfcGF0aCh3X3BhdGgpOwogIGlmIChmaWxlX2V4aXN0cyh3X3BhdGgpKQogICAgewog
ICAgICBMKCJjaGVja2luZyBmb3IgdW4tY29tbWl0dGVkIHdvcmsgZmlsZSAlc1xuIiwgCgl3
X3BhdGgoKS5jX3N0cigpKTsKICAgICAgZGF0YSB3X2RhdGE7CiAgICAgIHJlYWRfZGF0YSh3
X3BhdGgsIHdfZGF0YSk7CiAgICAgIHJlYWRfd29ya19zZXQod19kYXRhLCB3KTsKICAgICAg
TCgicmVhZCAlZCBkZWxzLCAlZCBhZGRzIGZyb20gJXNcbiIsIAoJdy5kZWxzLnNpemUoKSwg
dy5hZGRzLnNpemUoKSwgd19wYXRoKCkuY19zdHIoKSk7CiAgICB9CiAgZWxzZQogICAgewog
ICAgICBMKCJubyB1bi1jb21taXR0ZWQgd29yayBmaWxlICVzXG4iLCB3X3BhdGgoKS5jX3N0
cigpKTsKICAgIH0KfQoKc3RhdGljIHZvaWQgcHV0X3dvcmtfc2V0KHdvcmtfc2V0ICYgdykK
ewogIGxvY2FsX3BhdGggd19wYXRoOwogIGdldF93b3JrX3BhdGgod19wYXRoKTsKCiAgaWYg
KHcuYWRkcy5zaXplKCkgPiAwCiAgICAgIHx8IHcuZGVscy5zaXplKCkgPiAwKQogICAgewog
ICAgICBlbnN1cmVfYm9va2RpcigpOwogICAgICBkYXRhIHdfZGF0YTsKICAgICAgd3JpdGVf
d29ya19zZXQod19kYXRhLCB3KTsKICAgICAgd3JpdGVfZGF0YSh3X3BhdGgsIHdfZGF0YSk7
CiAgICB9CiAgZWxzZQogICAgewogICAgICBkZWxldGVfZmlsZSh3X3BhdGgpOwogICAgfQp9
CgpzdGF0aWMgdm9pZCBjYWxjdWxhdGVfbmV3X21hbmlmZXN0X21hcChtYW5pZmVzdF9tYXAg
Y29uc3QgJiBtX29sZCwgCgkJCQkgICAgICAgbWFuaWZlc3RfbWFwICYgbV9uZXcpCnsKICBw
YXRoX3NldCBwYXRoczsKICB3b3JrX3NldCB3b3JrOwogIGV4dHJhY3RfcGF0aF9zZXQobV9v
bGQsIHBhdGhzKTsKICBnZXRfd29ya19zZXQod29yayk7CiAgaWYgKHdvcmsuZGVscy5zaXpl
KCkgPiAwKQogICAgTCgicmVtb3ZpbmcgJWQgZGVhZCBmaWxlcyBmcm9tIG1hbmlmZXN0XG4i
LCAKICAgICAgd29yay5kZWxzLnNpemUoKSk7CiAgaWYgKHdvcmsuYWRkcy5zaXplKCkgPiAw
KQogICAgTCgiYWRkaW5nICVkIGZpbGVzIHRvIG1hbmlmZXN0XG4iLCB3b3JrLmFkZHMuc2l6
ZSgpKTsKICBhcHBseV93b3JrX3NldCh3b3JrLCBwYXRocyk7CiAgYnVpbGRfbWFuaWZlc3Rf
bWFwKHBhdGhzLCBtX25ldyk7Cn0KCnN0YXRpYyBzdHJpbmcgZ2V0X3N0ZGluKCkKewogIGNo
YXIgYnVmW2J1ZnN6XTsKICBzdHJpbmcgdG1wOwogIHdoaWxlKGNpbikKICAgIHsKICAgICAg
Y2luLnJlYWQoYnVmLCBidWZzeik7CiAgICAgIHRtcC5hcHBlbmQoYnVmLCBjaW4uZ2NvdW50
KCkpOwogICAgfQogIHJldHVybiB0bXA7Cn0KCnN0YXRpYyB2b2lkIGdldF9sb2dfbWVzc2Fn
ZShwYXRjaF9zZXQgY29uc3QgJiBwcywgCgkJCSAgICBhcHBfc3RhdGUgJiBhcHAsCgkJCSAg
ICBzdHJpbmcgJiBsb2dfbWVzc2FnZSkKewogIHN0cmluZyBjb21tZW50YXJ5OwogIHN0cmlu
ZyBzdW1tYXJ5OwogIHN0cmluZ3N0cmVhbSBzczsKICBwYXRjaF9zZXRfdG9fdGV4dF9zdW1t
YXJ5KHBzLCBzcyk7CiAgc3VtbWFyeSA9IHNzLnN0cigpOwogIGNvbW1lbnRhcnkgKz0gIi0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS1cbiI7CiAgY29tbWVudGFyeSArPSAiRW50ZXIgTG9nLiAgTGluZXMg
YmVnaW5uaW5nIHdpdGggYE1UOicgYXJlIHJlbW92ZWQgYXV0b21hdGljYWxseVxuIjsKICBj
b21tZW50YXJ5ICs9ICJcbiI7CiAgY29tbWVudGFyeSArPSAiU3VtbWFyeSBvZiBjaGFuZ2Vz
OlxuIjsKICBjb21tZW50YXJ5ICs9ICJcbiI7CiAgY29tbWVudGFyeSArPSBzdW1tYXJ5Owog
IGNvbW1lbnRhcnkgKz0gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7CiAgTihhcHAubHVhLmhvb2tf
ZWRpdF9jb21tZW50KGNvbW1lbnRhcnksIGxvZ19tZXNzYWdlKSwKICAgICJlZGl0IG9mIGxv
ZyBtZXNzYWdlIGZhaWxlZCIpOwp9CgoKLy8gdGhlIGdvYWwgaGVyZSBpcyB0byBsb29rIGJh
Y2sgdGhyb3VnaCB0aGUgYW5jZXN0cnkgb2YgdGhlIHByb3ZpZGVkCi8vIGNoaWxkLCBjaGVj
a2luZyB0byBzZWUgdGhlIGxlYXN0IGFuY2VzdG9yIGl0IGhhcyB3aGljaCB3ZSByZWNlaXZl
ZCBmcm9tCi8vIHRoZSBnaXZlbiBuZXR3b3JrIHVybC9ncm91cCBwYWlyLgovLwovLyB3ZSB1
c2UgdGhlIGFuY2VzdG9yIGFzIHRoZSBzb3VyY2UgbWFuaWZlc3Qgd2hlbiBidWlsZGluZyBh
IHBhdGNoc2V0IHRvCi8vIHNlbmQgdG8gdGhhdCB1cmwvZ3JvdXAuCgpzdGF0aWMgYm9vbCBm
aW5kX2FuY2VzdG9yX29uX25ldHNlcnZlciAobWFuaWZlc3RfaWQgY29uc3QgJiBjaGlsZCwg
CgkJCQkJdXJsIGNvbnN0ICYgdSwKCQkJCQlncm91cCBjb25zdCAmIGcsIAoJCQkJCW1hbmlm
ZXN0X2lkICYgYW5jLAoJCQkJCWFwcF9zdGF0ZSAmIGFwcCkKewogIHNldDxtYW5pZmVzdF9p
ZD4gZnJvbnRpZXI7CiAgY2VydF9uYW1lIHRuKGFuY2VzdG9yX2NlcnRfbmFtZSk7CiAgZnJv
bnRpZXIuaW5zZXJ0KGNoaWxkKTsKCiAgd2hpbGUgKCFmcm9udGllci5lbXB0eSgpKQogICAg
ewogICAgICBzZXQ8bWFuaWZlc3RfaWQ+IG5leHRfZnJvbnRpZXI7CiAgICAgIGZvciAoc2V0
PG1hbmlmZXN0X2lkPjo6Y29uc3RfaXRlcmF0b3IgaSA9IGZyb250aWVyLmJlZ2luKCk7Cgkg
ICBpICE9IGZyb250aWVyLmVuZCgpOyArK2kpCgl7CgkgIHZlY3RvcjwgbWFuaWZlc3Q8Y2Vy
dD4gPiB0bXA7CgkgIGFwcC5kYi5nZXRfbWFuaWZlc3RfY2VydHMoKmksIHRuLCB0bXApOwoK
CSAgLy8gd2UgZ28gdGhyb3VnaCB0aGlzIHZlY3RvciBiYWNrd2FyZHMgYmVjYXVzZSB3ZSB3
b3VsZCBwcmVmZXIgdG8KCSAgLy8gaGl0IG1vcmUgcmVjZW50bHktcXVldWVkIGFuY2VzdG9y
cyAoc3VjaCBhcyBpbnRlcm1lZGlhdGUgbm9kZXMKCSAgLy8gaW4gYSBtdWx0aS1ub2RlIG1l
cmdlKSByYXRoZXIgdGhhbiBvbGRlciBhbmNlc3RvcnMuIGJ1dCBvZgoJICAvLyBjb3Vyc2Us
IGFueSBhbmNlc3RvciB3aWxsIGRvLgoKCSAgZm9yICh2ZWN0b3I8IG1hbmlmZXN0PGNlcnQ+
ID46OnJldmVyc2VfaXRlcmF0b3IgaiA9IHRtcC5yYmVnaW4oKTsKCSAgICAgICBqICE9IHRt
cC5yZW5kKCk7ICsraikKCSAgICB7CgkgICAgICBjZXJ0X3ZhbHVlIHR2OwoJICAgICAgZGVj
b2RlX2Jhc2U2NChqLT5pbm5lcigpLnZhbHVlLCB0dik7CgkgICAgICBtYW5pZmVzdF9pZCBh
bmNfaWQgKHR2KCkpOwoKCSAgICAgIEwoImxvb2tpbmcgZm9yIHBhcmVudCAlcyBvZiAlcyBv
biBzZXJ2ZXJcbiIsIAoJCWktPmlubmVyKCkoKS5jX3N0cigpLAoJCWFuY19pZC5pbm5lcigp
KCkuY19zdHIoKSk7CgoJICAgICAgaWYgKGFwcC5kYi5tYW5pZmVzdF9leGlzdHNfb25fbmV0
c2VydmVyICh1LCBnLCBhbmNfaWQpKQoJCXsKCQkgIEwoImZvdW5kIHBhcmVudCAlcyBvbiBz
ZXJ2ZXJcbiIsIGFuY19pZC5pbm5lcigpKCkuY19zdHIoKSk7CgkJICBhbmMgPSBhbmNfaWQ7
CgkJICByZXR1cm4gdHJ1ZTsKCQl9CgkgICAgICBlbHNlCgkJbmV4dF9mcm9udGllci5pbnNl
cnQoYW5jX2lkKTsKCSAgICB9CSAgCgl9CgogICAgICBmcm9udGllciA9IG5leHRfZnJvbnRp
ZXI7CiAgICB9CgogIHJldHVybiBmYWxzZTsKfQoKCnN0YXRpYyB2b2lkIHF1ZXVlX2VkZ2Vf
Zm9yX3RhcmdldF9hbmNlc3RvciAocGFpcjx1cmwsZ3JvdXA+IGNvbnN0ICYgdGFyZywKCQkJ
CQkgICAgbWFuaWZlc3RfaWQgY29uc3QgJiBjaGlsZF9pZCwKCQkJCQkgICAgbWFuaWZlc3Rf
bWFwIGNvbnN0ICYgY2hpbGRfbWFwLAoJCQkJCSAgICBhcHBfc3RhdGUgJiBhcHApCnsgIAog
IC8vIG5vdyBoZXJlIGlzIGFuIGludGVyZXN0aW5nIHRoaW5nOiB3ZSAqbWlnaHQqIGJlIHNl
bmRpbmcgZGF0YSB0byBhCiAgLy8gZGVwb3QsIG9yIHNvbWVvbmUgd2l0aCBpbmRldGVybWlu
YXRlIHByZS1leGlzdGluZyBzdGF0ZSAoc2F5IHRoZSBmaXJzdAogIC8vIHRpbWUgd2UgcG9z
dCB0byBuZXRuZXdzKSwgdGhlcmVmb3JlIHdlIGNhbm5vdCBqdXN0ICJzZW5kIHRoZSBlZGdl
IiB3ZQogIC8vIGp1c3QgY29uc3RydWN0ZWQgaW4gYSBtZXJnZSBvciBjb21taXQsIHdlIG5l
ZWQgdG8gc2VuZCBhbiBlZGdlIGZyb20gYQogIC8vIHBhcmVudCB3aGljaCB3ZSBrbm93IHRv
IGJlIHByZXNlbnQgaW4gdGhlIGRlcG90IChvciBlbHNlIGFuIGVkZ2UgZnJvbQogIC8vIHRo
ZSBlbXB0eSBtYXAgLS0gZnVsbCBjb250ZW50cyBvZiBhbGwgZmlsZXMpLiB3aGF0IGlzIHNl
bnQgdGhlcmVmb3JlCiAgLy8gY2hhbmdlcyBvbiBhIGRlcG90LWJ5LWRlcG90IGJhc2lzLiB0
aGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlCiAgLy8gYXBwcm9wcmlhdGUgdGhpbmcgdG8g
c2VuZC4KICAvLwogIC8vIG5iOiB0aGlzIGhhcyBubyBkaXJlY3QgcmVsYXRpb24gdG8gd2hh
dCB3ZSBzdG9yZSBpbiBvdXIgb3duCiAgLy8gZGF0YWJhc2UuIHdlIGFsd2F5cyBzdG9yZSB0
aGUgZWRnZSBmcm9tIG91ciBwYXJlbnQsIGFuZCB3ZSBhbHdheXMga25vdwogIC8vIHdoZW4g
d2UgaGF2ZSBhIHBhcmVudC4KCiAgdmVjdG9yPCBwYWlyPHVybCwgZ3JvdXA+ID4gb25lX3Rh
cmdldDsKICBvbmVfdGFyZ2V0LnB1c2hfYmFjayh0YXJnKTsKICBxdWV1ZWluZ19wYWNrZXRf
d3JpdGVyIHFwdyhhcHAsIG9uZV90YXJnZXQpOwogIAogIG1hbmlmZXN0X2RhdGEgdGFyZ19h
bmNlc3Rvcl9kYXRhOwogIG1hbmlmZXN0X21hcCB0YXJnX2FuY2VzdG9yX21hcDsKICBtYW5p
ZmVzdF9pZCB0YXJnX2FuY2VzdG9yX2lkOwogIAogIGlmIChmaW5kX2FuY2VzdG9yX29uX25l
dHNlcnZlciAoY2hpbGRfaWQsIAoJCQkJICB0YXJnLmZpcnN0LCAKCQkJCSAgdGFyZy5zZWNv
bmQsIAoJCQkJICB0YXJnX2FuY2VzdG9yX2lkLCAKCQkJCSAgYXBwKSkKICAgIHsJICAgIAog
ICAgICBhcHAuZGIuZ2V0X21hbmlmZXN0X3ZlcnNpb24odGFyZ19hbmNlc3Rvcl9pZCwgdGFy
Z19hbmNlc3Rvcl9kYXRhKTsKICAgICAgcmVhZF9tYW5pZmVzdF9tYXAodGFyZ19hbmNlc3Rv
cl9kYXRhLCB0YXJnX2FuY2VzdG9yX21hcCk7CiAgICB9CgogIHBhdGNoX3NldCBwczsKICBt
YW5pZmVzdHNfdG9fcGF0Y2hfc2V0KHRhcmdfYW5jZXN0b3JfbWFwLCBjaGlsZF9tYXAsIGFw
cCwgcHMpOwogIHBhdGNoX3NldF90b19wYWNrZXRzKHBzLCBhcHAsIHFwdyk7CgogIC8vIG5v
dyB0aGF0IHdlJ3ZlIHF1ZXVlZCB0aGUgZGF0YSwgd2UgY2FuIG5vdGUgdGhpcyBuZXcgY2hp
bGQKICAvLyBub2RlIGFzIGV4aXN0aW5nICh3ZWxsIC4uIHNvb24tdG8tZXhpc3QpIG9uIHRo
ZSBzZXJ2ZXIKICBhcHAuZGIubm90ZV9tYW5pZmVzdF9vbl9uZXRzZXJ2ZXIgKHRhcmcuZmly
c3QsIHRhcmcuc2Vjb25kLCBjaGlsZF9pZCk7Cgp9CgoKLy8gdGhpcyBoZWxwZXIgdHJpZXMg
dG8gcHJvZHVjZSBtZXJnZSA8LSBtZXJnZU4obGVmdCxyaWdodCksIHBvc3NpYmx5Ci8vIG1l
cmdlMyBpZiBpdCBjYW4gZmluZCBhbiBhbmNlc3Rvciwgb3RoZXJ3aXNlIG1lcmdlMi4gaXQg
YWxzbyBxdWV1ZXMgdGhlCi8vIGFwcHJvcHJpYXRlIGVkZ2VzIGZyb20ga25vd24gYW5jZXN0
b3JzIHRvIHRoZSBuZXcgbWVyZ2Ugbm9kZSwgdG8gYmUKLy8gdHJhbnNtaXR0ZWQgdG8gZWFj
aCBvZiB0aGUgdGFyZ2V0cyBwcm92aWRlZC4KCnN0YXRpYyB2b2lkIHRyeV9vbmVfbWVyZ2Uo
bWFuaWZlc3RfaWQgY29uc3QgJiBsZWZ0LAoJCQkgIG1hbmlmZXN0X2lkIGNvbnN0ICYgcmln
aHQsCgkJCSAgbWFuaWZlc3RfaWQgJiBtZXJnZWQsCgkJCSAgYXBwX3N0YXRlICYgYXBwLCAK
CQkJICB2ZWN0b3I8IHBhaXI8dXJsLGdyb3VwPiA+IGNvbnN0ICYgdGFyZ2V0cykKewogIG1h
bmlmZXN0X2RhdGEgbGVmdF9kYXRhLCByaWdodF9kYXRhLCBhbmNlc3Rvcl9kYXRhLCBtZXJn
ZWRfZGF0YTsKICBtYW5pZmVzdF9tYXAgbGVmdF9tYXAsIHJpZ2h0X21hcCwgYW5jZXN0b3Jf
bWFwLCBtZXJnZWRfbWFwOwogIG1hbmlmZXN0X2lkIGFuY2VzdG9yOwoKICBhcHAuZGIuZ2V0
X21hbmlmZXN0X3ZlcnNpb24obGVmdCwgbGVmdF9kYXRhKTsKICBhcHAuZGIuZ2V0X21hbmlm
ZXN0X3ZlcnNpb24ocmlnaHQsIHJpZ2h0X2RhdGEpOwogIHJlYWRfbWFuaWZlc3RfbWFwKGxl
ZnRfZGF0YSwgbGVmdF9tYXApOwogIHJlYWRfbWFuaWZlc3RfbWFwKHJpZ2h0X2RhdGEsIHJp
Z2h0X21hcCk7CiAgCiAgc2ltcGxlX21lcmdlX3Byb3ZpZGVyIG1lcmdlcihhcHApOwogIAog
IGlmKGZpbmRfY29tbW9uX2FuY2VzdG9yKGxlZnQsIHJpZ2h0LCBhbmNlc3RvciwgYXBwKSkJ
ICAgIAogICAgewogICAgICBQKCJjb21tb24gYW5jZXN0b3IgJXMgZm91bmQsIHRyeWluZyBt
ZXJnZTNcbiIsIGFuY2VzdG9yLmlubmVyKCkoKS5jX3N0cigpKTsgCiAgICAgIGFwcC5kYi5n
ZXRfbWFuaWZlc3RfdmVyc2lvbihhbmNlc3RvciwgYW5jZXN0b3JfZGF0YSk7CiAgICAgIHJl
YWRfbWFuaWZlc3RfbWFwKGFuY2VzdG9yX2RhdGEsIGFuY2VzdG9yX21hcCk7CiAgICAgIE4o
bWVyZ2UzKGFuY2VzdG9yX21hcCwgbGVmdF9tYXAsIHJpZ2h0X21hcCwgCgkgICAgICAgYXBw
LCBtZXJnZXIsIG1lcmdlZF9tYXApLAoJKHN0cmluZygiZmFpbGVkIHRvIG1lcmdlIG1hbmlm
ZXN0cyAiKQoJICsgbGVmdC5pbm5lcigpKCkgKyAiIGFuZCAiICsgcmlnaHQuaW5uZXIoKSgp
KSk7CSAgICAgIAogICAgfQogIGVsc2UKICAgIHsKICAgICAgUCgibm8gY29tbW9uIGFuY2Vz
dG9yIGZvdW5kLCB0cnlpbmcgbWVyZ2UyXG4iKTsgCiAgICAgIE4obWVyZ2UyKGxlZnRfbWFw
LCByaWdodF9tYXAsIGFwcCwgbWVyZ2VyLCBtZXJnZWRfbWFwKSwKCShzdHJpbmcoImZhaWxl
ZCB0byBtZXJnZSBtYW5pZmVzdHMgIikKCSArIGxlZnQuaW5uZXIoKSgpICsgIiBhbmQgIiAr
IHJpZ2h0LmlubmVyKCkoKSkpOwkgICAgICAKICAgIH0KICAKICB3cml0ZV9tYW5pZmVzdF9t
YXAobWVyZ2VkX21hcCwgbWVyZ2VkX2RhdGEpOwogIGNhbGN1bGF0ZV9tYW5pZmVzdF9tYXBf
aWRlbnQobWVyZ2VkX21hcCwgbWVyZ2VkKTsJICAKICAKICBiYXNlNjQ8IGd6aXA8ZGVsdGE+
ID4gbGVmdF9lZGdlOwogIGRpZmYobGVmdF9kYXRhLmlubmVyKCksIG1lcmdlZF9kYXRhLmlu
bmVyKCksIGxlZnRfZWRnZSk7CgogIC8vIEZJWE1FOiB3ZSBkbyAqbm90KiBtYW51ZmFjdHVy
ZSBvciBzdG9yZSB0aGUgc2Vjb25kIGVkZ2UgdG8KICAvLyB0aGUgbWVyZ2VkIHZlcnNpb24s
IHNpbmNlIGRvaW5nIHNvIHZpb2xhdGVzIHRoZQogIC8vIGFzc3VtcHRpb25zIG9mIHRoZSBk
YiwgYW5kIHRoZSAncmlnaHQnIHZlcnNpb24gYWxyZWFkeQogIC8vIGV4aXN0cyBpbiBpdHMg
ZW50aXJldHksIGFueXdheXMuIHRoaXMgaXMgYSBzdWJ0bGUgaXNzdWUKICAvLyB0aG91Z2gg
YW5kIEknbSBub3Qgc3VyZSBJJ20gbWFraW5nIHRoZSByaWdodAogIC8vIGRlY2lzaW9uLiBy
ZXZpc2l0LiBpZiB5b3UgZG8gbm90IHNlZSB0aGF0IGl0IGlzIGEgc3VidGxlCiAgLy8gaXNz
dWUgSSBzdWdnZXN0IHlvdSBhcmUgbm90IHRoaW5raW5nIGFib3V0IGl0IGxvbmcgZW5vdWdo
LgogIC8vCiAgLy8gYmFzZTY0PCBnemlwPGRlbHRhPiA+IHJpZ2h0X2VkZ2U7CiAgLy8gZGlm
ZihyaWdodF9kYXRhLmlubmVyKCksIG1lcmdlZF9kYXRhLmlubmVyKCksIHJpZ2h0X2VkZ2Up
OwogIC8vIGFwcC5kYi5wdXRfbWFuaWZlc3RfdmVyc2lvbihyaWdodCwgbWVyZ2VkLCByaWdo
dF9lZGdlKTsKICAKICAKICAvLyB3ZSBkbyBvZiBjb3Vyc2UgcmVjb3JkIHRoZSBsZWZ0IGVk
Z2UsIGFuZCBhbmNlc3RyeSByZWxhdGlvbnNoaXAgdG8KICAvLyBib3RoIHByZWRlY2Vzc29y
cy4KCiAgewogICAgcGFja2V0X2RiX3dyaXRlciBkYncoYXBwKTsgICAgCgogICAgZGJ3LmNv
bnN1bWVfbWFuaWZlc3RfZGVsdGEobGVmdCwgbWVyZ2VkLCBsZWZ0X2VkZ2UpOyAgCiAgICBj
ZXJ0X21hbmlmZXN0X2FuY2VzdG9yKGxlZnQsIG1lcmdlZCwgYXBwLCBkYncpOwogICAgY2Vy
dF9tYW5pZmVzdF9hbmNlc3RvcihyaWdodCwgbWVyZ2VkLCBhcHAsIGRidyk7CiAgICBjZXJ0
X21hbmlmZXN0X2RhdGVfbm93KG1lcmdlZCwgYXBwLCBkYncpOwogICAgY2VydF9tYW5pZmVz
dF9hdXRob3JfZGVmYXVsdChtZXJnZWQsIGFwcCwgZGJ3KTsKICAgIAogICAgLy8gbWFrZSBz
dXJlIHRoZSBhcHByb3ByaWF0ZSBlZGdlcyBnZXQgcXVldWVkIGZvciB0aGUgbmV0d29yay4K
ICAgIGZvciAodmVjdG9yPCBwYWlyPHVybCxncm91cD4gPjo6Y29uc3RfaXRlcmF0b3IgdGFy
ZyA9IHRhcmdldHMuYmVnaW4oKTsKCSB0YXJnICE9IHRhcmdldHMuZW5kKCk7ICsrdGFyZykK
ICAgICAgewoJcXVldWVfZWRnZV9mb3JfdGFyZ2V0X2FuY2VzdG9yICgqdGFyZywgbWVyZ2Vk
LCBtZXJnZWRfbWFwLCBhcHApOwogICAgICB9CiAgICAKICAgIHF1ZXVlaW5nX3BhY2tldF93
cml0ZXIgcXB3KGFwcCwgdGFyZ2V0cyk7CiAgICBjZXJ0X21hbmlmZXN0X2FuY2VzdG9yKGxl
ZnQsIG1lcmdlZCwgYXBwLCBxcHcpOwogICAgY2VydF9tYW5pZmVzdF9hbmNlc3RvcihyaWdo
dCwgbWVyZ2VkLCBhcHAsIHFwdyk7CiAgICBjZXJ0X21hbmlmZXN0X2RhdGVfbm93KG1lcmdl
ZCwgYXBwLCBxcHcpOwogICAgY2VydF9tYW5pZmVzdF9hdXRob3JfZGVmYXVsdChtZXJnZWQs
IGFwcCwgcXB3KTsKICB9Cgp9CQkJICAKCgovLyBhY3R1YWwgY29tbWFuZHMgZm9sbG93CgpD
TUQobHNjZXJ0cywgImtleSBhbmQgY2VydCIsICIoZmlsZXxtYW5pZmVzdCkgPGlkPiIsIAog
ICAgImxpc3QgY2VydHMgYXNzb2NpYXRlZCB3aXRoIG1hbmlmZXN0IG9yIGZpbGUiKQp7CiAg
aWYgKGFyZ3Muc2l6ZSgpICE9IDIpCiAgICB0aHJvdyB1c2FnZShuYW1lKTsKCiAgdmVjdG9y
PGNlcnQ+IGNlcnRzOwoKICB0cmFuc2FjdGlvbl9ndWFyZCBndWFyZChhcHAuZGIpOwoKICBp
ZiAoYXJnc1swXSA9PSAibWFuaWZlc3QiKQogICAgewogICAgICBtYW5pZmVzdF9pZCBpZGVu
dChhcmdzWzFdKTsKICAgICAgdmVjdG9yPCBtYW5pZmVzdDxjZXJ0PiA+IHRzOwogICAgICBh
cHAuZGIuZ2V0X21hbmlmZXN0X2NlcnRzKGlkZW50LCB0cyk7CiAgICAgIGZvciAoc2l6ZV90
IGkgPSAwOyBpIDwgdHMuc2l6ZSgpOyArK2kpCgljZXJ0cy5wdXNoX2JhY2sodHNbaV0uaW5u
ZXIoKSk7CiAgICB9CiAgZWxzZSBpZiAoYXJnc1swXSA9PSAiZmlsZSIpCiAgICB7CiAgICAg
IGZpbGVfaWQgaWRlbnQoYXJnc1sxXSk7CiAgICAgIHZlY3RvcjwgZmlsZTxjZXJ0PiA+IHRz
OwogICAgICBhcHAuZGIuZ2V0X2ZpbGVfY2VydHMoaWRlbnQsIHRzKTsKICAgICAgZm9yIChz
aXplX3QgaSA9IDA7IGkgPCB0cy5zaXplKCk7ICsraSkKCWNlcnRzLnB1c2hfYmFjayh0c1tp
XS5pbm5lcigpKTsKICAgIH0KICBlbHNlCiAgICB0aHJvdyB1c2FnZShuYW1lKTsKCQogIGZv
ciAoc2l6ZV90IGkgPSAwOyBpIDwgY2VydHMuc2l6ZSgpOyArK2kpCiAgICB7CiAgICAgIGJv
b2wgb2sgPSBjaGVja19jZXJ0KGFwcCwgY2VydHNbaV0pOwogICAgICBjZXJ0X3ZhbHVlIHR2
OyAgICAgIAogICAgICBkZWNvZGVfYmFzZTY0KGNlcnRzW2ldLnZhbHVlLCB0dik7CiAgICAg
IHN0cmluZyB3YXNoZWQ7CiAgICAgIGlmIChndWVzc19iaW5hcnkodHYoKSkpCgl7CgkgIHdh
c2hlZCA9ICI8YmluYXJ5IGRhdGE+IjsKCX0KICAgICAgZWxzZQoJewoJICB3YXNoZWQgPSB0
digpOwoJfQogICAgICBzdHJpbmcgaGVhZCA9IHN0cmluZyhvayA/ICJvayBzaWcgZnJvbSAi
IDogImJhZCBzaWcgZnJvbSAiKQoJKyAiWyIgKyBjZXJ0c1tpXS5rZXkoKSArICJdIDogIiAK
CSsgIlsiICsgY2VydHNbaV0ubmFtZSgpICsgIl0gPSBbIjsKICAgICAgc3RyaW5nIHBhZCho
ZWFkLnNpemUoKSwgJyAnKTsKICAgICAgdmVjdG9yPHN0cmluZz4gbGluZXM7CiAgICAgIHNw
bGl0X2ludG9fbGluZXMod2FzaGVkLCBsaW5lcyk7CiAgICAgIEkobGluZXMuc2l6ZSgpID4g
MCk7CiAgICAgIGNvdXQgPDwgaGVhZCA8PCBsaW5lc1swXSA7CiAgICAgIGZvciAoc2l6ZV90
IGkgPSAxOyBpIDwgbGluZXMuc2l6ZSgpOyArK2kpCgljb3V0IDw8IGVuZGwgPDwgcGFkIDw8
IGxpbmVzW2ldOwogICAgICBjb3V0IDw8ICJdIiA8PCBlbmRsOwogICAgfSAgCiAgZ3VhcmQu
Y29tbWl0KCk7Cn0KCkNNRChsc2tleXMsICJrZXkgYW5kIGNlcnQiLCAiW3BhcnRpYWwtaWRd
IiwgImxpc3Qga2V5cyIpCnsKICB2ZWN0b3I8cnNhX2tleXBhaXJfaWQ+IHB1YmtleXM7CiAg
dmVjdG9yPHJzYV9rZXlwYWlyX2lkPiBwcml2a2V5czsKCiAgdHJhbnNhY3Rpb25fZ3VhcmQg
Z3VhcmQoYXBwLmRiKTsKCiAgaWYgKGFyZ3Muc2l6ZSgpID09IDApCiAgICBhcHAuZGIuZ2V0
X2tleV9pZHMoIiIsIHB1YmtleXMsIHByaXZrZXlzKTsKICBlbHNlIGlmIChhcmdzLnNpemUo
KSA9PSAxKQogICAgYXBwLmRiLmdldF9rZXlfaWRzKGFyZ3NbMF0sIHB1YmtleXMsIHByaXZr
ZXlzKTsKICBlbHNlCiAgICB0aHJvdyB1c2FnZShuYW1lKTsKICAKICBpZiAocHVia2V5cy5z
aXplKCkgPiAwKQogICAgewogICAgICBjb3V0IDw8IGVuZGwgPDwgIltwdWJsaWMga2V5c10i
IDw8IGVuZGw7CiAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHVia2V5cy5zaXplKCk7
ICsraSkKCWNvdXQgPDwgcHVia2V5c1tpXSgpIDw8IGVuZGw7CiAgICAgIGNvdXQgPDwgZW5k
bDsKICAgIH0KCiAgaWYgKHByaXZrZXlzLnNpemUoKSA+IDApCiAgICB7CiAgICAgIGNvdXQg
PDwgZW5kbCA8PCAiW3ByaXZhdGUga2V5c10iIDw8IGVuZGw7CiAgICAgIGZvciAoc2l6ZV90
IGkgPSAwOyBpIDwgcHJpdmtleXMuc2l6ZSgpOyArK2kpCgljb3V0IDw8IHByaXZrZXlzW2ld
KCkgPDwgZW5kbDsKICAgICAgY291dCA8PCBlbmRsOwogICAgfQoKICBndWFyZC5jb21taXQo
KTsKfQoKQ01EKGdlbmtleSwgImtleSBhbmQgY2VydCIsICI8a2V5aWQ+IiwgImdlbmVyYXRl
IGFuIFJTQSBrZXktcGFpciIpCnsKICBpZiAoYXJncy5zaXplKCkgIT0gMSkKICAgIHRocm93
IHVzYWdlKG5hbWUpOwogIAogIHRyYW5zYWN0aW9uX2d1YXJkIGd1YXJkKGFwcC5kYik7CiAg
cnNhX2tleXBhaXJfaWQgaWRlbnQoYXJnc1swXSk7CgogIE4oISBhcHAuZGIua2V5X2V4aXN0
cyhpZGVudCksCiAgICAoc3RyaW5nKCJrZXkgJyIpICsgaWRlbnQoKSArICInIGFscmVhZHkg
ZXhpc3RzIGluIGRhdGFiYXNlIikpOwogIAogIGJhc2U2NDxyc2FfcHViX2tleT4gcHViOwog
IGJhc2U2NDwgYXJjNDxyc2FfcHJpdl9rZXk+ID4gcHJpdjsKICBQKCJnZW5lcmF0aW5nIGtl
eS1wYWlyICclcydcbiIsIGlkZW50KCkuY19zdHIoKSk7CiAgZ2VuZXJhdGVfa2V5X3BhaXIo
YXBwLmx1YSwgaWRlbnQsIHB1YiwgcHJpdik7CiAgUCgic3RvcmluZyBrZXktcGFpciAnJXMn
IGluIGRhdGFiYXNlXG4iLCBpZGVudCgpLmNfc3RyKCkpOwogIGFwcC5kYi5wdXRfa2V5X3Bh
aXIoaWRlbnQsIHB1YiwgcHJpdik7CgogIGd1YXJkLmNvbW1pdCgpOwp9CgpDTUQoY2VydCwg
ImtleSBhbmQgY2VydCIsICIoZmlsZXxtYW5pZmVzdCkgPGlkPiA8Y2VydG5hbWU+IFtjZXJ0
dmFsXSIsIAogICAgICAgICAgICAgICAgICAgICAgICAiY3JlYXRlIGEgY2VydCBmb3IgYSBm
aWxlIG9yIG1hbmlmZXN0IikKewogIGlmICgoYXJncy5zaXplKCkgIT0gNCkgJiYgKGFyZ3Mu
c2l6ZSgpICE9IDMpKQogICAgdGhyb3cgdXNhZ2UobmFtZSk7CgogIHRyYW5zYWN0aW9uX2d1
YXJkIGd1YXJkKGFwcC5kYik7CgogIGhleGVuYzxpZD4gaWRlbnQoYXJnc1sxXSk7CiAgY2Vy
dF9uYW1lIG5hbWUoYXJnc1syXSk7CgogIHJzYV9rZXlwYWlyX2lkIGtleTsKICBpZiAoYXBw
LnNpZ25pbmdfa2V5KCkgIT0gIiIpCiAgICBrZXkgPSBhcHAuc2lnbmluZ19rZXk7CiAgZWxz
ZQogICAgTihndWVzc19kZWZhdWx0X2tleShrZXksIGFwcCksCiAgICAgICJubyB1bmlxdWUg
cHJpdmF0ZSBrZXkgZm91bmQsIGFuZCBubyBrZXkgc3BlY2lmaWVkIik7CiAgCiAgY2VydF92
YWx1ZSB2YWw7CiAgaWYgKGFyZ3Muc2l6ZSgpID09IDQpCiAgICB2YWwgPSBjZXJ0X3ZhbHVl
KGFyZ3NbM10pOwogIGVsc2UKICAgIHZhbCA9IGNlcnRfdmFsdWUoZ2V0X3N0ZGluKCkpOwoK
ICBiYXNlNjQ8Y2VydF92YWx1ZT4gdmFsX2VuY29kZWQ7CiAgZW5jb2RlX2Jhc2U2NCh2YWws
IHZhbF9lbmNvZGVkKTsKCiAgY2VydCB0KGlkZW50LCBuYW1lLCB2YWxfZW5jb2RlZCwga2V5
KTsKICAKICAvLyBuYjogd2Ugd2FudCB0byB0aHJvdyB1c2FnZSBvbiBtaXMtdXNlICpiZWZv
cmUqIGFza2luZyBmb3IgYQogIC8vIHBhc3NwaHJhc2UuCgogIGlmIChhcmdzWzBdID09ICJm
aWxlIikKICAgIHsKICAgICAgY2FsY3VsYXRlX2NlcnQoYXBwLCB0KTsKICAgICAgYXBwLmRi
LnB1dF9maWxlX2NlcnQoZmlsZTxjZXJ0Pih0KSk7CiAgICB9CiAgZWxzZSBpZiAoYXJnc1sw
XSA9PSAibWFuaWZlc3QiKQogICAgewogICAgICBjYWxjdWxhdGVfY2VydChhcHAsIHQpOwog
ICAgICBhcHAuZGIucHV0X21hbmlmZXN0X2NlcnQobWFuaWZlc3Q8Y2VydD4odCkpOwogICAg
fQogIGVsc2UKICAgIHRocm93IHVzYWdlKHRoaXMtPm5hbWUpOwoKICBndWFyZC5jb21taXQo
KTsKfQoKCkNNRCh0YWcsICJjZXJ0aWZpY2F0ZSIsICI8aWQ+IDx0YWduYW1lPiIsIAogICAg
InB1dCBhIHN5bWJvbGljIHRhZyBjZXJ0IG9uIGEgbWFuaWZlc3QgdmVyc2lvbiIpCnsKICBp
ZiAoYXJncy5zaXplKCkgIT0gMikKICAgIHRocm93IHVzYWdlKG5hbWUpOwogIG1hbmlmZXN0
X2lkIG0oYXJnc1swXSk7CiAgcGFja2V0X2RiX3dyaXRlciBkYncoYXBwKTsKICBjZXJ0X21h
bmlmZXN0X3RhZyhtLCBhcmdzWzFdLCBhcHAsIGRidyk7Cn0KCkNNRChhcHByb3ZlLCAiY2Vy
dGlmaWNhdGUiLCAiKGZpbGV8bWFuaWZlc3QpIDxpZD4iLCAKICAgICJhcHByb3ZlIG9mIGEg
bWFuaWZlc3Qgb3IgZmlsZSB2ZXJzaW9uIikKewogIGlmIChhcmdzLnNpemUoKSAhPSAyKQog
ICAgdGhyb3cgdXNhZ2UobmFtZSk7CiAgaWYgKGFyZ3NbMF0gPT0gIm1hbmlmZXN0IikKICAg
IHsKICAgICAgbWFuaWZlc3RfaWQgbShhcmdzWzFdKTsKICAgICAgcGFja2V0X2RiX3dyaXRl
ciBkYncoYXBwKTsKICAgICAgY2VydF9tYW5pZmVzdF9hcHByb3ZhbChtLCB0cnVlLCBhcHAs
IGRidyk7CiAgICB9CiAgZWxzZSBpZiAoYXJnc1swXSA9PSAiZmlsZSIpCiAgICB7CiAgICAg
IHBhY2tldF9kYl93cml0ZXIgZGJ3KGFwcCk7CiAgICAgIGZpbGVfaWQgZihhcmdzWzFdKTsK
ICAgICAgY2VydF9maWxlX2FwcHJvdmFsKGYsIHRydWUsIGFwcCwgZGJ3KTsKICAgIH0KICBl
bHNlCiAgICB0aHJvdyB1c2FnZShuYW1lKTsKfQoKQ01EKGRpc2FwcHJvdmUsICJjZXJ0aWZp
Y2F0ZSIsICIoZmlsZXxtYW5pZmVzdCkgPGlkPiIsIAogICAgImRpc2FwcHJvdmUgb2YgYSBt
YW5pZmVzdCBvciBmaWxlIHZlcnNpb24iKQp7CiAgaWYgKGFyZ3Muc2l6ZSgpICE9IDIpCiAg
ICB0aHJvdyB1c2FnZShuYW1lKTsKICBpZiAoYXJnc1swXSA9PSAibWFuaWZlc3QiKQogICAg
ewogICAgICBtYW5pZmVzdF9pZCBtKGFyZ3NbMV0pOwogICAgICBwYWNrZXRfZGJfd3JpdGVy
IGRidyhhcHApOwogICAgICBjZXJ0X21hbmlmZXN0X2FwcHJvdmFsKG0sIGZhbHNlLCBhcHAs
IGRidyk7CiAgICB9CiAgZWxzZSBpZiAoYXJnc1swXSA9PSAiZmlsZSIpCiAgICB7CiAgICAg
IGZpbGVfaWQgZihhcmdzWzFdKTsKICAgICAgcGFja2V0X2RiX3dyaXRlciBkYncoYXBwKTsK
ICAgICAgY2VydF9maWxlX2FwcHJvdmFsKGYsIGZhbHNlLCBhcHAsIGRidyk7CiAgICB9CiAg
ZWxzZQogICAgdGhyb3cgdXNhZ2UobmFtZSk7Cn0KCgpDTUQoY29tbWVudCwgImNlcnRpZmlj
YXRlIiwgIihmaWxlfG1hbmlmZXN0KSA8aWQ+IFtjb21tZW50XSIsIAogICAgImNvbW1lbnQg
b24gYSBmaWxlIG9yIG1hbmlmZXN0IHZlcnNpb24iKQp7CiAgaWYgKGFyZ3Muc2l6ZSgpICE9
IDIgJiYgYXJncy5zaXplKCkgIT0gMykKICAgIHRocm93IHVzYWdlKG5hbWUpOwoKICBzdHJp
bmcgY29tbWVudDsKICBpZiAoYXJncy5zaXplKCkgPT0gMykKICAgIGNvbW1lbnQgPSBhcmdz
WzJdOwogIGVsc2UKICAgIE4oYXBwLmx1YS5ob29rX2VkaXRfY29tbWVudCgiIiwgY29tbWVu
dCksICJlZGl0IGNvbW1lbnQgZmFpbGVkIik7CiAgCiAgTihjb21tZW50LmZpbmRfZmlyc3Rf
bm90X29mKCIgXHJcdFxuIikgPT0gc3RyaW5nOjpucG9zLCAiZW1wdHkgY29tbWVudCIpOwoK
ICBpZiAoYXJnc1swXSA9PSAiZmlsZSIpCiAgICB7CiAgICAgIHBhY2tldF9kYl93cml0ZXIg
ZGJ3KGFwcCk7CiAgICAgIGNlcnRfZmlsZV9jb21tZW50KGZpbGVfaWQoYXJnc1sxXSksIGNv
bW1lbnQsIGFwcCwgZGJ3KTsgCiAgICB9CiAgZWxzZSBpZiAoYXJnc1swXSA9PSAibWFuaWZl
c3QiKQogICAgewogICAgICBwYWNrZXRfZGJfd3JpdGVyIGRidyhhcHApOwogICAgICBjZXJ0
X21hbmlmZXN0X2NvbW1lbnQobWFuaWZlc3RfaWQoYXJnc1sxXSksIGNvbW1lbnQsIGFwcCwg
ZGJ3KTsKICAgIH0KICBlbHNlCiAgICB0aHJvdyB1c2FnZShuYW1lKTsKfQoKCgpDTUQoYWRk
LCAid29ya2luZyBjb3B5IiwgIjxwYXRobmFtZT4gWy4uLl0iLCAiYWRkIGZpbGVzIHRvIHdv
cmtpbmcgY29weSIpCnsKICBpZiAoYXJncy5zaXplKCkgPCAxKQogICAgdGhyb3cgdXNhZ2Uo
bmFtZSk7CgogIHRyYW5zYWN0aW9uX2d1YXJkIGd1YXJkKGFwcC5kYik7CgogIG1hbmlmZXN0
X21hcCBtYW47CiAgd29ya19zZXQgd29yazsgIAogIGdldF9tYW5pZmVzdF9tYXAobWFuKTsK
ICBnZXRfd29ya19zZXQod29yayk7CiAgYm9vbCByZXdyaXRlX3dvcmsgPSBmYWxzZTsKCiAg
Zm9yICh2ZWN0b3I8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaSA9IGFyZ3MuYmVnaW4oKTsg
aSAhPSBhcmdzLmVuZCgpOyArK2kpCiAgICBidWlsZF9hZGRpdGlvbihmaWxlX3BhdGgoKmkp
LCBhcHAsIHdvcmssIG1hbiwgcmV3cml0ZV93b3JrKTsKICAKICBndWFyZC5jb21taXQoKTsK
ICAKICAvLyBzbWFsbCByYWNlIGhlcmUKICBpZiAocmV3cml0ZV93b3JrKQogICAgcHV0X3dv
cmtfc2V0KHdvcmspOwp9CgpDTUQoZHJvcCwgIndvcmtpbmcgY29weSIsICI8cGF0aG5hbWU+
IFsuLi5dIiwgImRyb3AgZmlsZXMgZnJvbSB3b3JraW5nIGNvcHkiKQp7CiAgaWYgKGFyZ3Mu
c2l6ZSgpIDwgMSkKICAgIHRocm93IHVzYWdlKG5hbWUpOwoKICBtYW5pZmVzdF9tYXAgbWFu
OwogIHdvcmtfc2V0IHdvcms7CiAgZ2V0X21hbmlmZXN0X21hcChtYW4pOwogIGdldF93b3Jr
X3NldCh3b3JrKTsKICBib29sIHJld3JpdGVfd29yayA9IGZhbHNlOwoKICB0cmFuc2FjdGlv
bl9ndWFyZCBndWFyZChhcHAuZGIpOwoKICBmb3IgKHZlY3RvcjxzdHJpbmc+Ojpjb25zdF9p
dGVyYXRvciBpID0gYXJncy5iZWdpbigpOyBpICE9IGFyZ3MuZW5kKCk7ICsraSkKICAgIGJ1
aWxkX2RlbGV0aW9uKGZpbGVfcGF0aCgqaSksIGFwcCwgd29yaywgbWFuLCByZXdyaXRlX3dv
cmspOwogIAogIGd1YXJkLmNvbW1pdCgpOwoKICAvLyBzbWFsbCByYWNlIGhlcmUKICBpZiAo
cmV3cml0ZV93b3JrKQogICAgcHV0X3dvcmtfc2V0KHdvcmspOwp9CgpDTUQoY29tbWl0LCAi
d29ya2luZyBjb3B5IiwgIltsb2cgbWVzc2FnZV0iLCAiY29tbWl0IHdvcmtpbmcgY29weSB0
byBkYXRhYmFzZSIpCnsKICBzdHJpbmcgbG9nX21lc3NhZ2UoIiIpOwogIG1hbmlmZXN0X21h
cCBtX29sZCwgbV9uZXc7CiAgcGF0Y2hfc2V0IHBzOwoKICBnZXRfbWFuaWZlc3RfbWFwKG1f
b2xkKTsKICBjYWxjdWxhdGVfbmV3X21hbmlmZXN0X21hcChtX29sZCwgbV9uZXcpOwogIG1h
bmlmZXN0X2lkIG9sZF9pZCwgbmV3X2lkOwogIGNhbGN1bGF0ZV9tYW5pZmVzdF9tYXBfaWRl
bnQobV9vbGQsIG9sZF9pZCk7CiAgY2FsY3VsYXRlX21hbmlmZXN0X21hcF9pZGVudChtX25l
dywgbmV3X2lkKTsKCiAgaWYgKGFyZ3Muc2l6ZSgpICE9IDAgJiYgYXJncy5zaXplKCkgIT0g
MSkKICAgIHRocm93IHVzYWdlKG5hbWUpOwogIAogIGNlcnRfdmFsdWUgYnJhbmNobmFtZTsK
ICBpZiAoYXBwLmJyYW5jaF9uYW1lICE9ICIiKQogICAgewogICAgICBicmFuY2huYW1lID0g
YXBwLmJyYW5jaF9uYW1lOwogICAgfQogIGVsc2UKICAgIHsKICAgICAgdmVjdG9yPCBtYW5p
ZmVzdDxjZXJ0PiA+IGNlcnRzOwogICAgICBjZXJ0X25hbWUgYnJhbmNoKGJyYW5jaF9jZXJ0
X25hbWUpOwogICAgICBhcHAuZGIuZ2V0X21hbmlmZXN0X2NlcnRzKG9sZF9pZCwgYnJhbmNo
LCBjZXJ0cyk7CgogICAgICBOKGNlcnRzLnNpemUoKSAhPSAwLCAKCXN0cmluZygibm8gYnJh
bmNoIGNlcnRzIGZvdW5kIGZvciBvbGQgbWFuaWZlc3QgIikKCSsgb2xkX2lkLmlubmVyKCko
KSArICIsIHBsZWFzZSBwcm92aWRlIGEgYnJhbmNoIG5hbWUiKTsKCiAgICAgIE4oY2VydHMu
c2l6ZSgpID09IDEsCglzdHJpbmcoIm11bHRpcGxlIGJyYW5jaCBjZXJ0cyBmb3VuZCBmb3Ig
b2xkIG1hbmlmZXN0ICIpCgkrIG9sZF9pZC5pbm5lcigpKCkgKyAiLCBwbGVhc2UgcHJvdmlk
ZSBhIGJyYW5jaCBuYW1lIik7CgogICAgICBkZWNvZGVfYmFzZTY0KGNlcnRzWzBdLmlubmVy
KCkudmFsdWUsIGJyYW5jaG5hbWUpOwogICAgfQogICAgCiAgTCgiY29tbWl0dGluZyAlcyB0
byBicmFuY2ggJXNcbiIsIAogICAgbmV3X2lkLmlubmVyKCkoKS5jX3N0cigpLCBicmFuY2hu
YW1lKCkuY19zdHIoKSk7CiAgYXBwLmJyYW5jaF9uYW1lID0gYnJhbmNobmFtZSgpOwoKICBt
YW5pZmVzdHNfdG9fcGF0Y2hfc2V0KG1fb2xkLCBtX25ldywgYXBwLCBwcyk7CgogIC8vIGdl
dCBsb2cgbWVzc2FnZQogIGlmIChhcmdzLnNpemUoKSA9PSAxKQogICAgbG9nX21lc3NhZ2Ug
PSBhcmdzWzBdOwogIGVsc2UKICAgIGdldF9sb2dfbWVzc2FnZShwcywgYXBwLCBsb2dfbWVz
c2FnZSk7CgogIE4obG9nX21lc3NhZ2UuZmluZF9maXJzdF9ub3Rfb2YoIiBcclx0XG4iKSAh
PSBzdHJpbmc6Om5wb3MsCiAgICAiZW1wdHkgbG9nIG1lc3NhZ2UiKTsKCiAgewogICAgdHJh
bnNhY3Rpb25fZ3VhcmQgZ3VhcmQoYXBwLmRiKTsKCiAgICAvLyBwcm9jZXNzIG1hbmlmZXN0
IGRlbHRhIG9yIG5ldyBtYW5pZmVzdAogICAgaWYgKGFwcC5kYi5tYW5pZmVzdF92ZXJzaW9u
X2V4aXN0cyhwcy5tX25ldykpCiAgICAgIHsKCUwoInNraXBwaW5nIG1hbmlmZXN0ICVzLCBh
bHJlYWR5IGluIGRhdGFiYXNlXG4iLCBwcy5tX25ldy5pbm5lcigpKCkuY19zdHIoKSk7CiAg
ICAgIH0KICAgIGVsc2UKICAgICAgewoJaWYgKGFwcC5kYi5tYW5pZmVzdF92ZXJzaW9uX2V4
aXN0cyhwcy5tX29sZCkpCgkgIHsKCSAgICBMKCJpbnNlcnRpbmcgbWFuaWZlc3QgZGVsdGEg
JXMgLT4gJXNcbiIsIAoJICAgICAgcHMubV9vbGQuaW5uZXIoKSgpLmNfc3RyKCksIHBzLm1f
bmV3LmlubmVyKCkoKS5jX3N0cigpKTsKCSAgICBtYW5pZmVzdF9kYXRhIG1fb2xkX2RhdGEs
IG1fbmV3X2RhdGE7CgkgICAgYXBwLmRiLmdldF9tYW5pZmVzdF92ZXJzaW9uKHBzLm1fb2xk
LCBtX29sZF9kYXRhKTsKCSAgICB3cml0ZV9tYW5pZmVzdF9tYXAobV9uZXcsIG1fbmV3X2Rh
dGEpOwoJICAgIGJhc2U2NDwgZ3ppcDxkZWx0YT4gPiBkZWw7CgkgICAgZGlmZihtX29sZF9k
YXRhLmlubmVyKCksIG1fbmV3X2RhdGEuaW5uZXIoKSwgZGVsKTsKCSAgICBhcHAuZGIucHV0
X21hbmlmZXN0X3ZlcnNpb24ocHMubV9vbGQsIHBzLm1fbmV3LCBtYW5pZmVzdF9kZWx0YShk
ZWwpKTsKCSAgfQoJZWxzZQoJICB7CgkgICAgTCgiaW5zZXJ0aW5nIGZ1bGwgbWFuaWZlc3Qg
JXNcbiIsIAoJICAgICAgcHMubV9uZXcuaW5uZXIoKSgpLmNfc3RyKCkpOwoJICAgIG1hbmlm
ZXN0X2RhdGEgbV9uZXdfZGF0YTsKCSAgICB3cml0ZV9tYW5pZmVzdF9tYXAobV9uZXcsIG1f
bmV3X2RhdGEpOwoJICAgIGFwcC5kYi5wdXRfbWFuaWZlc3QocHMubV9uZXcsIG1fbmV3X2Rh
dGEpOwoJICB9CiAgICAgIH0KCiAgICAvLyBwcm9jZXNzIGZpbGUgZGVsdGFzCiAgICBmb3Ig
KHNldDxwYXRjaF9kZWx0YT46OmNvbnN0X2l0ZXJhdG9yIGkgPSBwcy5mX2RlbHRhcy5iZWdp
bigpOwoJIGkgIT0gcHMuZl9kZWx0YXMuZW5kKCk7ICsraSkKICAgICAgewoJaWYgKGFwcC5k
Yi5maWxlX3ZlcnNpb25fZXhpc3RzKGktPmlkX25ldykpCgkgIHsKCSAgICBMKCJza2lwcGlu
ZyBmaWxlIGRlbHRhICVzLCBhbHJlYWR5IGluIGRhdGFiYXNlXG4iLCBpLT5pZF9uZXcuaW5u
ZXIoKSgpLmNfc3RyKCkpOwoJICB9CgllbHNlCgkgIHsKCSAgICBpZiAoYXBwLmRiLmZpbGVf
dmVyc2lvbl9leGlzdHMoaS0+aWRfb2xkKSkKCSAgICAgIHsKCQlMKCJpbnNlcnRpbmcgZGVs
dGEgJXMgLT4gJXNcbiIsIAoJCSAgaS0+aWRfb2xkLmlubmVyKCkoKS5jX3N0cigpLCBpLT5p
ZF9uZXcuaW5uZXIoKSgpLmNfc3RyKCkpOwoJCWZpbGVfZGF0YSBvbGRfZGF0YTsKCQliYXNl
NjQ8IGd6aXA8ZGF0YT4gPiBuZXdfZGF0YTsKCQlhcHAuZGIuZ2V0X2ZpbGVfdmVyc2lvbihp
LT5pZF9vbGQsIG9sZF9kYXRhKTsKCQlyZWFkX2RhdGEoaS0+cGF0aCwgbmV3X2RhdGEpOwoJ
CWJhc2U2NDwgZ3ppcDxkZWx0YT4gPiBkZWw7CgkJZGlmZihvbGRfZGF0YS5pbm5lcigpLCBu
ZXdfZGF0YSwgZGVsKTsKCQlhcHAuZGIucHV0X2ZpbGVfdmVyc2lvbihpLT5pZF9vbGQsIGkt
PmlkX25ldywgZmlsZV9kZWx0YShkZWwpKTsKCSAgICAgIH0KCSAgICBlbHNlCgkgICAgICB7
CgkJTCgiaW5zZXJ0aW5nIGZ1bGwgdmVyc2lvbiAlc1xuIiwgaS0+aWRfb2xkLmlubmVyKCko
KS5jX3N0cigpKTsKCQliYXNlNjQ8IGd6aXA8ZGF0YT4gPiBuZXdfZGF0YTsKCQlyZWFkX2Rh
dGEoaS0+cGF0aCwgbmV3X2RhdGEpOwoJCS8vIHNhbml0eSBjaGVjawoJCWhleGVuYzxpZD4g
dGlkOwoJCWNhbGN1bGF0ZV9pZGVudChuZXdfZGF0YSwgdGlkKTsKCQlJKHRpZCA9PSBpLT5p
ZF9uZXcuaW5uZXIoKSk7CgkJYXBwLmRiLnB1dF9maWxlKGktPmlkX25ldywgZmlsZV9kYXRh
KG5ld19kYXRhKSk7CgkgICAgICB9CgkgIH0KICAgICAgfQogIAogICAgLy8gcHJvY2VzcyBm
aWxlIGFkZHMKICAgIGZvciAoc2V0PHBhdGNoX2FkZGl0aW9uPjo6Y29uc3RfaXRlcmF0b3Ig
aSA9IHBzLmZfYWRkcy5iZWdpbigpOwoJIGkgIT0gcHMuZl9hZGRzLmVuZCgpOyArK2kpCiAg
ICAgIHsKCWlmIChhcHAuZGIuZmlsZV92ZXJzaW9uX2V4aXN0cyhpLT5pZGVudCkpCgkgIHsK
CSAgICBMKCJza2lwcGluZyBmaWxlICVzICVzLCBhbHJlYWR5IGluIGRhdGFiYXNlXG4iLCAK
CSAgICAgIGktPnBhdGgoKS5jX3N0cigpLCBpLT5pZGVudC5pbm5lcigpKCkuY19zdHIoKSk7
CgkgIH0KCWVsc2UKCSAgewoJICAgIC8vIGl0J3MgYSBuZXcgZmlsZQoJICAgIEwoImluc2Vy
dGluZyBuZXcgZmlsZSAlcyAlc1xuIiwgCgkgICAgICBpLT5wYXRoKCkuY19zdHIoKSwgaS0+
aWRlbnQuaW5uZXIoKSgpLmNfc3RyKCkpOwoJICAgIGJhc2U2NDwgZ3ppcDxkYXRhPiA+IG5l
d19kYXRhOwoJICAgIHJlYWRfZGF0YShpLT5wYXRoLCBuZXdfZGF0YSk7CgkgICAgYXBwLmRi
LnB1dF9maWxlKGktPmlkZW50LCBuZXdfZGF0YSk7CgkgIH0KICAgICAgfQoKICAgIHBhY2tl
dF9kYl93cml0ZXIgZGJ3KGFwcCk7CgogICAgaWYgKCEgbV9vbGQuZW1wdHkoKSkKICAgICAg
Y2VydF9tYW5pZmVzdF9hbmNlc3Rvcihwcy5tX29sZCwgcHMubV9uZXcsIGFwcCwgZGJ3KTsK
CiAgICBjZXJ0X21hbmlmZXN0X2luX2JyYW5jaChwcy5tX25ldywgYnJhbmNobmFtZSwgYXBw
LCBkYncpOyAKICAgIGNlcnRfbWFuaWZlc3RfZGF0ZV9ub3cocHMubV9uZXcsIGFwcCwgZGJ3
KTsKICAgIGNlcnRfbWFuaWZlc3RfYXV0aG9yX2RlZmF1bHQocHMubV9uZXcsIGFwcCwgZGJ3
KTsKICAgIGNlcnRfbWFuaWZlc3RfY2hhbmdlbG9nKHBzLm1fbmV3LCBsb2dfbWVzc2FnZSwg
YXBwLCBkYncpOwoKICAgIC8vIGNvbW1pdCBkb25lLCBub3cgcXVldWUgZGlmZiBmb3Igc2Vu
ZGluZwoKICAgIGlmIChhcHAuZGIubWFuaWZlc3RfdmVyc2lvbl9leGlzdHMocHMubV9uZXcp
KQogICAgICB7Cgl2ZWN0b3I8IHBhaXI8dXJsLGdyb3VwPiA+IHRhcmdldHM7CglhcHAubHVh
Lmhvb2tfZ2V0X3Bvc3RfdGFyZ2V0cyhicmFuY2huYW1lLCB0YXJnZXRzKTsKCQoJLy8gbWFr
ZSBzdXJlIHRoZSBhcHByb3ByaWF0ZSBlZGdlcyBnZXQgcXVldWVkIGZvciB0aGUgbmV0d29y
ay4KCWZvciAodmVjdG9yPCBwYWlyPHVybCxncm91cD4gPjo6Y29uc3RfaXRlcmF0b3IgdGFy
ZyA9IHRhcmdldHMuYmVnaW4oKTsKCSAgICAgdGFyZyAhPSB0YXJnZXRzLmVuZCgpOyArK3Rh
cmcpCgkgIHsKCSAgICBxdWV1ZV9lZGdlX2Zvcl90YXJnZXRfYW5jZXN0b3IgKCp0YXJnLCBw
cy5tX25ldywgbV9uZXcsIGFwcCk7CgkgIH0KCQoJLy8gdGhyb3cgaW4gYWxsIGF2YWlsYWJs
ZSBjZXJ0cyBmb3IgZ29vZCBtZWFzdXJlCglxdWV1ZWluZ19wYWNrZXRfd3JpdGVyIHFwdyhh
cHAsIHRhcmdldHMpOwoJdmVjdG9yPCBtYW5pZmVzdDxjZXJ0PiA+IGNlcnRzOwoJYXBwLmRi
LmdldF9tYW5pZmVzdF9jZXJ0cyhwcy5tX25ldywgY2VydHMpOwoJZm9yKHZlY3RvcjwgbWFu
aWZlc3Q8Y2VydD4gPjo6Y29uc3RfaXRlcmF0b3IgaSA9IGNlcnRzLmJlZ2luKCk7CgkgICAg
aSAhPSBjZXJ0cy5lbmQoKTsgKytpKQoJICBxcHcuY29uc3VtZV9tYW5pZmVzdF9jZXJ0KCpp
KTsKICAgICAgfSAKICAgIAogICAgZ3VhcmQuY29tbWl0KCk7CiAgfQogIC8vIHNtYWxsIHJh
Y2UgY29uZGl0aW9uIGhlcmUuLi4KICBsb2NhbF9wYXRoIHdfcGF0aDsKICBnZXRfd29ya19w
YXRoKHdfcGF0aCk7CiAgZGVsZXRlX2ZpbGUod19wYXRoKTsKICBwdXRfbWFuaWZlc3RfbWFw
KG1fbmV3KTsKICBQKCJjb21taXR0ZWQgJXNcbiIsIHBzLm1fbmV3LmlubmVyKCkoKS5jX3N0
cigpKTsKfQoKQ01EKHVwZGF0ZSwgIndvcmtpbmcgY29weSIsICJbc29ydCBrZXlzLi4uXSIs
ICJ1cGRhdGUgd29ya2luZyBjb3B5LCByZWxhdGl2ZSB0byBzb3J0aW5nIGtleXMiKQp7Cgog
IG1hbmlmZXN0X2RhdGEgbV9jaG9zZW5fZGF0YTsKICBtYW5pZmVzdF9tYXAgbV9vbGQsIG1f
d29ya2luZywgbV9jaG9zZW4sIG1fbmV3OwogIG1hbmlmZXN0X2lkIG1fb2xkX2lkLCBtX2No
b3Nlbl9pZDsKCiAgdHJhbnNhY3Rpb25fZ3VhcmQgZ3VhcmQoYXBwLmRiKTsKCiAgZ2V0X21h
bmlmZXN0X21hcChtX29sZCk7CiAgY2FsY3VsYXRlX21hbmlmZXN0X21hcF9pZGVudChtX29s
ZCwgbV9vbGRfaWQpOwogIGNhbGN1bGF0ZV9uZXdfbWFuaWZlc3RfbWFwKG1fb2xkLCBtX3dv
cmtpbmcpOwogIAogIHBpY2tfdXBkYXRlX3RhcmdldChtX29sZF9pZCwgYXJncywgYXBwLCBt
X2Nob3Nlbl9pZCk7CiAgUCgic2VsZWN0ZWQgdXBkYXRlIHRhcmdldCAlc1xuIiwKICAgIG1f
Y2hvc2VuX2lkLmlubmVyKCkoKS5jX3N0cigpKTsKICBhcHAuZGIuZ2V0X21hbmlmZXN0X3Zl
cnNpb24obV9jaG9zZW5faWQsIG1fY2hvc2VuX2RhdGEpOwogIHJlYWRfbWFuaWZlc3RfbWFw
KG1fY2hvc2VuX2RhdGEsIG1fY2hvc2VuKTsKCiAgdXBkYXRlX21lcmdlX3Byb3ZpZGVyIG1l
cmdlcihhcHApOwogIE4obWVyZ2UzKG1fb2xkLCBtX2Nob3NlbiwgbV93b3JraW5nLCBhcHAs
IG1lcmdlciwgbV9uZXcpLAogICAgc3RyaW5nKCJtYW5pZmVzdCBtZXJnZSBmYWlsZWQsIG5v
IHVwZGF0ZSBwZXJmb3JtZWQiKSk7CgogIFAoImNhbGN1bGF0aW5nIHBhdGNoc2V0IGZvciB1
cGRhdGVcbiIpOwogIHBhdGNoX3NldCBwczsKICBtYW5pZmVzdHNfdG9fcGF0Y2hfc2V0KG1f
d29ya2luZywgbV9uZXcsIGFwcCwgcHMpOwoKICBMKCJhcHBseWluZyAlZCBkZWxldGlvbnMg
dG8gZmlsZXMgaW4gdHJlZVxuIiwgcHMuZl9kZWxzLnNpemUoKSk7CiAgZm9yIChzZXQ8Zmls
ZV9wYXRoPjo6Y29uc3RfaXRlcmF0b3IgaSA9IHBzLmZfZGVscy5iZWdpbigpOwogICAgICAg
aSAhPSBwcy5mX2RlbHMuZW5kKCk7ICsraSkKICAgIHsKICAgICAgTCgiZGVsZXRpbmcgJXNc
biIsICgqaSkoKS5jX3N0cigpKTsKICAgICAgZGVsZXRlX2ZpbGUoKmkpOwogICAgfQoKICBM
KCJhcHBseWluZyAlZCBtb3ZlcyB0byBmaWxlcyBpbiB0cmVlXG4iLCBwcy5mX21vdmVzLnNp
emUoKSk7CiAgZm9yIChzZXQ8cGF0Y2hfbW92ZT46OmNvbnN0X2l0ZXJhdG9yIGkgPSBwcy5m
X21vdmVzLmJlZ2luKCk7CiAgICAgICBpICE9IHBzLmZfbW92ZXMuZW5kKCk7ICsraSkKICAg
IHsKICAgICAgTCgibW92aW5nICVzIC0+ICVzXG4iLCBpLT5wYXRoX29sZCgpLmNfc3RyKCks
IGktPnBhdGhfbmV3KCkuY19zdHIoKSk7CiAgICAgIG1vdmVfZmlsZShpLT5wYXRoX29sZCwg
aS0+cGF0aF9uZXcpOwogICAgfQogIAogIEwoImFwcGx5aW5nICVkIGFkZGl0aW9ucyB0byB0
cmVlXG4iLCBwcy5mX2FkZHMuc2l6ZSgpKTsKICBmb3IgKHNldDxwYXRjaF9hZGRpdGlvbj46
OmNvbnN0X2l0ZXJhdG9yIGkgPSBwcy5mX2FkZHMuYmVnaW4oKTsKICAgICAgIGkgIT0gcHMu
Zl9hZGRzLmVuZCgpOyArK2kpCiAgICB7CiAgICAgIEwoImFkZGluZyAlcyBhcyAlc1xuIiwg
aS0+aWRlbnQuaW5uZXIoKSgpLmNfc3RyKCksIGktPnBhdGgoKS5jX3N0cigpKTsKICAgICAg
ZmlsZV9kYXRhIHRtcDsKICAgICAgaWYgKGFwcC5kYi5maWxlX3ZlcnNpb25fZXhpc3RzKGkt
PmlkZW50KSkKCWFwcC5kYi5nZXRfZmlsZV92ZXJzaW9uKGktPmlkZW50LCB0bXApOwogICAg
ICBlbHNlIGlmIChtZXJnZXIudGVtcG9yYXJ5X3N0b3JlLmZpbmQoaS0+aWRlbnQpICE9IG1l
cmdlci50ZW1wb3Jhcnlfc3RvcmUuZW5kKCkpCgl0bXAgPSBtZXJnZXIudGVtcG9yYXJ5X3N0
b3JlW2ktPmlkZW50XTsKICAgICAgZWxzZQoJSShmYWxzZSk7IC8vIHRyaXAgYXNzZXJ0LiB0
aGlzIHNob3VsZCBiZSBpbXBvc3NpYmxlLgogICAgICB3cml0ZV9kYXRhKGktPnBhdGgsIHRt
cC5pbm5lcigpKTsKICAgIH0KCiAgTCgiYXBwbHlpbmcgJWQgZGVsdGFzIHRvIHRyZWVcbiIs
IHBzLmZfZGVsdGFzLnNpemUoKSk7CiAgZm9yIChzZXQ8cGF0Y2hfZGVsdGE+Ojpjb25zdF9p
dGVyYXRvciBpID0gcHMuZl9kZWx0YXMuYmVnaW4oKTsKICAgICAgIGkgIT0gcHMuZl9kZWx0
YXMuZW5kKCk7ICsraSkKICAgIHsKICAgICAgUCgidXBkYXRpbmcgZmlsZSAlczogJXMgLT4g
JXNcbiIsIAoJaS0+cGF0aCgpLmNfc3RyKCksCglpLT5pZF9vbGQuaW5uZXIoKSgpLmNfc3Ry
KCksCglpLT5pZF9uZXcuaW5uZXIoKSgpLmNfc3RyKCkpOwogICAgICAKICAgICAgLy8gc2Fu
aXR5IGNoZWNrCiAgICAgIHsKCWJhc2U2NDwgZ3ppcDxkYXRhPiA+IGR0bXA7CgloZXhlbmM8
aWQ+IGR0bXBfaWQ7CglyZWFkX2RhdGEoaS0+cGF0aCwgZHRtcCk7CgljYWxjdWxhdGVfaWRl
bnQoZHRtcCwgZHRtcF9pZCk7CglJKGR0bXBfaWQgPT0gaS0+aWRfb2xkLmlubmVyKCkpOwog
ICAgICB9CgogICAgICAvLyBvaywgcmVwbGFjZSB3aXRoIG5ldyB2ZXJzaW9uCiAgICAgIHsK
CWZpbGVfZGF0YSB0bXA7CglpZiAoYXBwLmRiLmZpbGVfdmVyc2lvbl9leGlzdHMoaS0+aWRf
bmV3KSkKCSAgYXBwLmRiLmdldF9maWxlX3ZlcnNpb24oaS0+aWRfbmV3LCB0bXApOwoJZWxz
ZSBpZiAobWVyZ2VyLnRlbXBvcmFyeV9zdG9yZS5maW5kKGktPmlkX25ldykgIT0gbWVyZ2Vy
LnRlbXBvcmFyeV9zdG9yZS5lbmQoKSkKCSAgdG1wID0gbWVyZ2VyLnRlbXBvcmFyeV9zdG9y
ZVtpLT5pZF9uZXddOwoJZWxzZQoJICBJKGZhbHNlKTsgLy8gdHJpcCBhc3NlcnQuIHRoaXMg
c2hvdWxkIGJlIGltcG9zc2libGUuCgl3cml0ZV9kYXRhKGktPnBhdGgsIHRtcC5pbm5lcigp
KTsKICAgICAgfQogICAgfQogIAogIEwoInVwZGF0ZSBzdWNjZXNzZnVsXG4iKTsKICBndWFy
ZC5jb21taXQoKTsKCiAgLy8gc21hbGwgcmFjZSBjb25kaXRpb24gaGVyZS4uLgogIC8vIG5i
OiB3ZSB3cml0ZSBvdXQgbV9jaG9zZW4sIG5vdCBtX25ldywgYmVjYXVzZSB0aGUgbWFuaWZl
c3Qtb24tZGlzawogIC8vIGlzIHRoZSBiYXNpcyBvZiB0aGUgd29ya2luZyBjb3B5LCBub3Qg
dGhlIHdvcmtpbmcgY29weSBpdHNlbGYuCiAgcHV0X21hbmlmZXN0X21hcChtX2Nob3Nlbik7
CiAgUCgidXBkYXRlZCB0byBiYXNlIHZlcnNpb24gJXNcbiIsIG1fY2hvc2VuX2lkLmlubmVy
KCkoKS5jX3N0cigpKTsKfQoKCgpDTUQoY2F0LCAidHJlZSIsICIoZmlsZXxtYW5pZmVzdCkg
PGlkPiIsICJ3cml0ZSBmaWxlIG9yIG1hbmlmZXN0IGZyb20gZGF0YWJhc2UgdG8gc3Rkb3V0
IikKewogIGlmIChhcmdzLnNpemUoKSAhPSAyKQogICAgdGhyb3cgdXNhZ2UobmFtZSk7Cgog
IHRyYW5zYWN0aW9uX2d1YXJkIGd1YXJkKGFwcC5kYik7CgogIGlmIChhcmdzWzBdID09ICJm
aWxlIikKICAgIHsKICAgICAgZmlsZV9kYXRhIGRhdDsKICAgICAgZmlsZV9pZCBpZGVudChh
cmdzWzFdKTsKCiAgICAgIE4oYXBwLmRiLmZpbGVfdmVyc2lvbl9leGlzdHMoaWRlbnQpLAoJ
KHN0cmluZygibm8gZmlsZSB2ZXJzaW9uICIpICsgaWRlbnQuaW5uZXIoKSgpICsgIiBmb3Vu
ZCBpbiBkYXRhYmFzZSIpKTsKCiAgICAgIEwoImR1bXBpbmcgZmlsZSAlc1xuIiwgaWRlbnQu
aW5uZXIoKSgpLmNfc3RyKCkpOwogICAgICBhcHAuZGIuZ2V0X2ZpbGVfdmVyc2lvbihpZGVu
dCwgZGF0KTsKICAgICAgZGF0YSB1bnBhY2tlZDsKICAgICAgdW5wYWNrKGRhdC5pbm5lcigp
LCB1bnBhY2tlZCk7CiAgICAgIGNvdXQud3JpdGUodW5wYWNrZWQoKS5kYXRhKCksIHVucGFj
a2VkKCkuc2l6ZSgpKTsKCiAgICB9CiAgZWxzZSBpZiAoYXJnc1swXSA9PSAibWFuaWZlc3Qi
KQogICAgewogICAgICBtYW5pZmVzdF9kYXRhIGRhdDsKICAgICAgbWFuaWZlc3RfaWQgaWRl
bnQoYXJnc1sxXSk7CgogICAgICBOKGFwcC5kYi5tYW5pZmVzdF92ZXJzaW9uX2V4aXN0cyhp
ZGVudCksCgkoc3RyaW5nKCJubyBmaWxlIHZlcnNpb24gIikgKyBpZGVudC5pbm5lcigpKCkg
KyAiIGZvdW5kIGluIGRhdGFiYXNlIikpOwoKICAgICAgTCgiZHVtcGluZyBtYW5pZmVzdCAl
c1xuIiwgaWRlbnQuaW5uZXIoKSgpLmNfc3RyKCkpOwogICAgICBhcHAuZGIuZ2V0X21hbmlm
ZXN0X3ZlcnNpb24oaWRlbnQsIGRhdCk7CiAgICAgIGRhdGEgdW5wYWNrZWQ7CiAgICAgIHVu
cGFjayhkYXQuaW5uZXIoKSwgdW5wYWNrZWQpOwogICAgICBjb3V0LndyaXRlKHVucGFja2Vk
KCkuZGF0YSgpLCB1bnBhY2tlZCgpLnNpemUoKSk7CiAgICB9CiAgZWxzZSAKICAgIHRocm93
IHVzYWdlKG5hbWUpOwoKICBndWFyZC5jb21taXQoKTsKfQoKCkNNRChjaGVja291dCwgInRy
ZWUiLCAiPG1hbmlmZXN0LWlkPiIsICJjaGVjayBvdXQgdHJlZSBzdGF0ZSBmcm9tIGRhdGFi
YXNlIikKewogIGlmIChhcmdzLnNpemUoKSAhPSAxKQogICAgdGhyb3cgdXNhZ2UobmFtZSk7
CgogIHRyYW5zYWN0aW9uX2d1YXJkIGd1YXJkKGFwcC5kYik7CgogIGZpbGVfZGF0YSBkYXRh
OwogIG1hbmlmZXN0X2lkIGlkZW50KGFyZ3NbMF0pOwogIG1hbmlmZXN0X21hcCBtOwoKICBO
KGFwcC5kYi5tYW5pZmVzdF92ZXJzaW9uX2V4aXN0cyhpZGVudCksCiAgICAoc3RyaW5nKCJu
byBtYW5pZmVzdCB2ZXJzaW9uICIpICsgaWRlbnQuaW5uZXIoKSgpICsgIiBmb3VuZCBpbiBk
YXRhYmFzZSIpKTsKICAKICBMKCJleHBvcnRpbmcgbWFuaWZlc3QgJXNcbiIsIGlkZW50Lmlu
bmVyKCkoKS5jX3N0cigpKTsKICBtYW5pZmVzdF9kYXRhIG1fZGF0YTsKICBhcHAuZGIuZ2V0
X21hbmlmZXN0X3ZlcnNpb24oaWRlbnQsIG1fZGF0YSk7CiAgcmVhZF9tYW5pZmVzdF9tYXAo
bV9kYXRhLCBtKTsgICAgICAKICBwdXRfbWFuaWZlc3RfbWFwKG0pOwogIAogIGZvciAobWFu
aWZlc3RfbWFwOjpjb25zdF9pdGVyYXRvciBpID0gbS5iZWdpbigpOyBpICE9IG0uZW5kKCk7
ICsraSkKICAgIHsKICAgICAgdmVjdG9yPHN0cmluZz4gYXJnczsKICAgICAgcGF0aF9pZF9w
YWlyIHBpcCgqaSk7CiAgICAgIAogICAgICBOKGFwcC5kYi5maWxlX3ZlcnNpb25fZXhpc3Rz
KHBpcC5pZGVudCgpKSwKCShzdHJpbmcoIm5vIGZpbGUgdmVyc2lvbiAiKQoJICsgcGlwLmlk
ZW50KCkuaW5uZXIoKSgpIAoJICsgIiBmb3VuZCBpbiBkYXRhYmFzZSBmb3IgIgoJICsgcGlw
LnBhdGgoKSgpLmNfc3RyKCkpKTsKICAgICAgCiAgICAgIGZpbGVfZGF0YSBkYXQ7CiAgICAg
IEwoIndyaXRpbmcgZmlsZSAlcyB0byAlc1xuIiwgCglwaXAuaWRlbnQoKS5pbm5lcigpKCku
Y19zdHIoKSwKCXBpcC5wYXRoKCkoKS5jX3N0cigpKTsKICAgICAgYXBwLmRiLmdldF9maWxl
X3ZlcnNpb24ocGlwLmlkZW50KCksIGRhdCk7CiAgICAgIHdyaXRlX2RhdGEocGlwLnBhdGgo
KSwgZGF0LmlubmVyKCkpOwogICAgfQoKICBndWFyZC5jb21taXQoKTsKfQoKQUxJQVMoY28s
IGNoZWNrb3V0LCAidHJlZSIsICI8bWFuaWZlc3QtaWQ+IiwKICAgICAgImNoZWNrIG91dCB0
cmVlIHN0YXRlIGZyb20gZGF0YWJhc2U7IGFsaWFzIGZvciBjaGVja291dCIpCgpDTUQoaGVh
ZHMsICJ0cmVlIiwgIiIsICJzaG93IHVubWVyZ2VkIGhlYWRzIG9mIGJyYW5jaCIpCnsKICB2
ZWN0b3I8bWFuaWZlc3RfaWQ+IGhlYWRzOwogIGlmIChhcmdzLnNpemUoKSAhPSAwKQogICAg
dGhyb3cgdXNhZ2UobmFtZSk7CgogIGlmIChhcHAuYnJhbmNoX25hbWUgPT0gIiIpCiAgICB7
CiAgICAgIGNvdXQgPDwgInBsZWFzZSBzcGVjaWZ5IGEgYnJhbmNoLCB3aXRoIC0tYnJhbmNo
PTxicmFuY2huYW1lPiIgPDwgZW5kbDsKICAgICAgcmV0dXJuOwogICAgfQoKICBnZXRfYnJh
bmNoX2hlYWRzKGFwcC5icmFuY2hfbmFtZSwgYXBwLCBoZWFkcyk7CgogIGlmIChoZWFkcy5z
aXplKCkgPT0gMCkKICAgIGNvdXQgPDwgImJyYW5jaCAnIiA8PCBhcHAuYnJhbmNoX25hbWUg
PDwgIicgaXMgZW1wdHkiIDw8IGVuZGw7CiAgZWxzZSBpZiAoaGVhZHMuc2l6ZSgpID09IDEp
CiAgICBjb3V0IDw8ICJicmFuY2ggJyIgPDwgYXBwLmJyYW5jaF9uYW1lIDw8ICInIGlzIGN1
cnJlbnRseSBtZXJnZWQ6IiA8PCBlbmRsOwogIGVsc2UKICAgIGNvdXQgPDwgImJyYW5jaCAn
IiA8PCBhcHAuYnJhbmNoX25hbWUgPDwgIicgaXMgY3VycmVudGx5IHVubWVyZ2VkOiIgPDwg
ZW5kbDsKCiAgZm9yICh2ZWN0b3I8bWFuaWZlc3RfaWQ+Ojpjb25zdF9pdGVyYXRvciBpID0g
aGVhZHMuYmVnaW4oKTsgCiAgICAgICBpICE9IGhlYWRzLmVuZCgpOyArK2kpCiAgICB7CiAg
ICAgIGNvdXQgPDwgaS0+aW5uZXIoKSgpIDw8IGVuZGw7CiAgICB9Cn0KCgpDTUQobWVyZ2Us
ICJ0cmVlIiwgIiIsICJtZXJnZSB1bm1lcmdlZCBoZWFkcyBvZiBicmFuY2giKQp7CgogIHZl
Y3RvcjxtYW5pZmVzdF9pZD4gaGVhZHM7CgogIGlmIChhcmdzLnNpemUoKSAhPSAwKQogICAg
dGhyb3cgdXNhZ2UobmFtZSk7CgogIGlmIChhcHAuYnJhbmNoX25hbWUgPT0gIiIpCiAgICB7
CiAgICAgIGNvdXQgPDwgInBsZWFzZSBzcGVjaWZ5IGEgYnJhbmNoLCB3aXRoIC0tYnJhbmNo
PTxicmFuY2huYW1lPiIgPDwgZW5kbDsKICAgICAgcmV0dXJuOwogICAgfQoKICBnZXRfYnJh
bmNoX2hlYWRzKGFwcC5icmFuY2hfbmFtZSwgYXBwLCBoZWFkcyk7CgogIGlmIChoZWFkcy5z
aXplKCkgPT0gMCkKICAgIHsKICAgICAgY291dCA8PCAiYnJhbmNoICIgPDwgYXJnc1swXSA8
PCAiaXMgZW1wdHkiIDw8IGVuZGw7CiAgICAgIHJldHVybjsKICAgIH0KICBlbHNlIGlmICho
ZWFkcy5zaXplKCkgPT0gMSkKICAgIHsKICAgICAgY291dCA8PCAiYnJhbmNoICIgPDwgYXJn
c1swXSA8PCAiaXMgbWVyZ2VkIiA8PCBlbmRsOwogICAgICByZXR1cm47CiAgICB9CiAgZWxz
ZQogICAgewogICAgICB2ZWN0b3I8IHBhaXI8dXJsLGdyb3VwPiA+IHRhcmdldHM7CiAgICAg
IGFwcC5sdWEuaG9va19nZXRfcG9zdF90YXJnZXRzKGFwcC5icmFuY2hfbmFtZSwgdGFyZ2V0
cyk7CgogICAgICBtYW5pZmVzdF9pZCBsZWZ0ID0gaGVhZHNbMF07CiAgICAgIG1hbmlmZXN0
X2lkIGFuY2VzdG9yOwogICAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IGhlYWRzLnNpemUo
KTsgKytpKQoJewoJICBtYW5pZmVzdF9pZCByaWdodCA9IGhlYWRzW2ldOwoJICBQKCJtZXJn
aW5nIHdpdGggbWFuaWZlc3QgJWQgLyAlZDogJXMgPC0+ICVzXG4iLAoJICAgIGksIGhlYWRz
LnNpemUoKSwKCSAgICBsZWZ0LmlubmVyKCkoKS5jX3N0cigpLCByaWdodC5pbm5lcigpKCku
Y19zdHIoKSk7CgoJICBtYW5pZmVzdF9pZCBtZXJnZWQ7CgkgIHRyYW5zYWN0aW9uX2d1YXJk
IGd1YXJkKGFwcC5kYik7CgkgIHRyeV9vbmVfbWVyZ2UgKGxlZnQsIHJpZ2h0LCBtZXJnZWQs
IGFwcCwgdGFyZ2V0cyk7CgkgIAkgIAoJICAvLyBtZXJnZWQgMSBlZGdlOyBub3cgd2UgY29t
bWl0IHRoaXMsIHVwZGF0ZSBtZXJnZSBzb3VyY2UgYW5kCgkgIC8vIHRyeSBuZXh0IG9uZQoK
CSAgcGFja2V0X2RiX3dyaXRlciBkYncoYXBwKTsKCSAgcXVldWVpbmdfcGFja2V0X3dyaXRl
ciBxcHcoYXBwLCB0YXJnZXRzKTsKCSAgY2VydF9tYW5pZmVzdF9pbl9icmFuY2gobWVyZ2Vk
LCBhcHAuYnJhbmNoX25hbWUsIGFwcCwgZGJ3KTsKCSAgY2VydF9tYW5pZmVzdF9pbl9icmFu
Y2gobWVyZ2VkLCBhcHAuYnJhbmNoX25hbWUsIGFwcCwgcXB3KTsKCgkgIHN0cmluZyBsb2cg
PSAibWVyZ2Ugb2YgIiArIGxlZnQuaW5uZXIoKSgpICsgIiBhbmQgIiArIHJpZ2h0LmlubmVy
KCkoKTsKCSAgY2VydF9tYW5pZmVzdF9jaGFuZ2Vsb2cobWVyZ2VkLCBsb2csIGFwcCwgZGJ3
KTsKCSAgY2VydF9tYW5pZmVzdF9jaGFuZ2Vsb2cobWVyZ2VkLCBsb2csIGFwcCwgcXB3KTsK
CSAgCgkgIGd1YXJkLmNvbW1pdCgpOwoJICBQKCJbc291cmNlXSAlc1xuW3NvdXJjZV0gJXNc
blttZXJnZWRdICVzXG4iLAoJICAgIGxlZnQuaW5uZXIoKSgpLmNfc3RyKCksCgkgICAgcmln
aHQuaW5uZXIoKSgpLmNfc3RyKCksCgkgICAgbWVyZ2VkLmlubmVyKCkoKS5jX3N0cigpKTsK
CSAgbGVmdCA9IG1lcmdlZDsKCX0KICAgIH0gIAp9CgoKQ01EKHByb3BhZ2F0ZSwgInRyZWUi
LCAiPHNyYy1icmFuY2g+IDxkc3QtYnJhbmNoPiIsIAogICAgIm1lcmdlIGZyb20gb25lIGJy
YW5jaCB0byBhbm90aGVyIGFzeW1tZXRyaWNhbGx5IikKewogIC8qICAKCiAgdGhpcyBpcyBh
IHNwZWNpYWwgbWVyZ2Ugb3BlcmF0b3IsIGJ1dCB2ZXJ5IHVzZWZ1bCBmb3IgcGVvcGxlIG1h
aW50YWluaW5nCiAgInNsaWdodGx5IGRpc3BhcmF0ZSBidXQgcmVsYXRlZCIgdHJlZXMuIGl0
IGRvZXMgYSBvbmUtd2F5IG1lcmdlOyBsZXNzCiAgcG93ZXJmdWwgdGhhbiBwdXR0aW5nIHRo
aW5ncyBpbiB0aGUgc2FtZSBicmFuY2ggYW5kIGFsc28gbW9yZSBmbGV4aWJsZS4KCiAgMS4g
Y2hlY2sgdG8gc2VlIGlmIHNyYyBhbmQgZHN0IGJyYW5jaGVzIGFyZSBtZXJnZWQsIGlmIG5v
dCBhYm9ydCwgaWYgc28KICAgICBjYWxsIGhlYWRzIE4xIGFuZCBOMiByZXNwZWN0aXZlbHku
CgogIDIuIChGSVhNRTogbm90IHlldCBwcmVzZW50KSBydW4gdGhlIGhvb2sgcHJvcGFnYXRl
ICgic3JjLWJyYW5jaCIsCiAgICAgImRzdC1icmFuY2giLCBOMSwgTjIpIHdoaWNoIGdpdmVz
IHRoZSB1c2VyIGEgY2hhbmNlIHRvIG1hc3NhZ2UgTjEgaW50bwogICAgIGEgc3RhdGUgd2hp
Y2ggaXMgbGlrZWx5IHRvICJtZXJnZSBuaWNlbHkiIHdpdGggTjIsIGVnLiBlZGl0IHBhdGhu
YW1lcywKICAgICBvbWl0IG9wdGlvbmFsIGZpbGVzIG9mIG5vIGludGVyZXN0LgoKICAzLiBk
byBhIG5vcm1hbCAyIG9yIDMtd2F5IG1lcmdlIG9uIE4xIGFuZCBOMiwgZGVwZW5kaW5nIG9u
IHRoZQogICAgIGV4aXN0ZW5jZSBvZiBjb21tb24gYW5jZXN0b3JzLgoKICA0LiBzYXZlIHRo
ZSByZXN1bHRzIGFzIHRoZSBkZWx0YSAoTjIsTSksIHRoZSBhbmNlc3RyeSBlZGdlcyAoTjEs
TSkKICAgICBhbmQgKE4yLE0pLCBhbmQgdGhlIGNlcnQgKE4yLGRzdCkuCgogIDUuIHF1ZXVl
IHRoZSByZXN1bHRpbmcgcGFja2V0cyB0byBzZW5kIHRvIHRoZSB1cmwgZm9yIGRzdC1icmFu
Y2gsIG5vdAogICAgIHNyYy1icmFuY2guCgogICovCgogIHZlY3RvcjxtYW5pZmVzdF9pZD4g
c3JjX2hlYWRzLCBkc3RfaGVhZHM7CgogIGlmIChhcmdzLnNpemUoKSAhPSAyKQogICAgdGhy
b3cgdXNhZ2UobmFtZSk7CgogIGdldF9icmFuY2hfaGVhZHMoYXJnc1swXSwgYXBwLCBzcmNf
aGVhZHMpOwogIGdldF9icmFuY2hfaGVhZHMoYXJnc1sxXSwgYXBwLCBkc3RfaGVhZHMpOwoK
ICBpZiAoc3JjX2hlYWRzLnNpemUoKSA9PSAwKQogICAgewogICAgICBjb3V0IDw8ICJicmFu
Y2ggIiA8PCBhcmdzWzBdIDw8ICJpcyBlbXB0eSIgPDwgZW5kbDsKICAgICAgcmV0dXJuOwog
ICAgfQogIGVsc2UgaWYgKHNyY19oZWFkcy5zaXplKCkgIT0gMSkKICAgIHsKICAgICAgY291
dCA8PCAiYnJhbmNoICIgPDwgYXJnc1swXSA8PCAiaXMgbm90IG1lcmdlZCIgPDwgZW5kbDsK
ICAgICAgcmV0dXJuOwogICAgfQogIGVsc2UgaWYgKGRzdF9oZWFkcy5zaXplKCkgPT0gMCkK
ICAgIHsKICAgICAgY291dCA8PCAiYnJhbmNoICIgPDwgYXJnc1sxXSA8PCAiaXMgZW1wdHki
IDw8IGVuZGw7CiAgICAgIHJldHVybjsKICAgIH0KICBlbHNlIGlmIChkc3RfaGVhZHMuc2l6
ZSgpICE9IDEpCiAgICB7CiAgICAgIGNvdXQgPDwgImJyYW5jaCAiIDw8IGFyZ3NbMV0gPDwg
ImlzIG5vdCBtZXJnZWQiIDw8IGVuZGw7CiAgICAgIHJldHVybjsKICAgIH0KICBlbHNlCiAg
ICB7CiAgICAgIHZlY3RvcjwgcGFpcjx1cmwsZ3JvdXA+ID4gdGFyZ2V0czsKICAgICAgYXBw
Lmx1YS5ob29rX2dldF9wb3N0X3RhcmdldHMoYXJnc1sxXSwgdGFyZ2V0cyk7CgogICAgICBt
YW5pZmVzdF9pZCBtZXJnZWQ7CiAgICAgIHRyYW5zYWN0aW9uX2d1YXJkIGd1YXJkKGFwcC5k
Yik7CiAgICAgIHRyeV9vbmVfbWVyZ2UgKHNyY19oZWFkc1swXSwgZHN0X2hlYWRzWzBdLCBt
ZXJnZWQsIGFwcCwgdGFyZ2V0cyk7ICAgICAgCgogICAgICBxdWV1ZWluZ19wYWNrZXRfd3Jp
dGVyIHFwdyhhcHAsIHRhcmdldHMpOwogICAgICBjZXJ0X21hbmlmZXN0X2luX2JyYW5jaCht
ZXJnZWQsIGFwcC5icmFuY2hfbmFtZSwgYXBwLCBxcHcpOwogICAgICBjZXJ0X21hbmlmZXN0
X2NoYW5nZWxvZyhtZXJnZWQsIAoJCQkgICAgICAicHJvcGFnYXRlIG9mICIgCgkJCSAgICAg
ICsgc3JjX2hlYWRzWzBdLmlubmVyKCkoKSAKCQkJICAgICAgKyAiIGFuZCAiIAoJCQkgICAg
ICArIGRzdF9oZWFkc1swXS5pbm5lcigpKCkKCQkJICAgICAgKyAiXG4iCgkJCSAgICAgICsg
ImZyb20gYnJhbmNoICIgCgkJCSAgICAgICsgYXJnc1swXSArICIgdG8gIiArIGFyZ3NbMV0g
KyAiXG4iLCAKCQkJICAgICAgYXBwLCBxcHcpOwkgIAogICAgICBndWFyZC5jb21taXQoKTsg
ICAgICAKICAgIH0KfQoKCgpDTUQoZGlmZiwgImluZm9ybWF0aXZlIiwgIiIsICJzaG93IGN1
cnJlbnQgZGlmZnMgb24gc3Rkb3V0IikKewogIG1hbmlmZXN0X21hcCBtX29sZCwgbV9uZXc7
CiAgcGF0Y2hfc2V0IHBzOwoKICB0cmFuc2FjdGlvbl9ndWFyZCBndWFyZChhcHAuZGIpOwoK
ICBpZiAoYXJncy5zaXplKCkgPiAwKQogICAgewogICAgICBtYW5pZmVzdF9kYXRhIGRhdDsK
ICAgICAgbWFuaWZlc3RfaWQgaWRlbnQoYXJnc1swXSk7CgogICAgICBOKGFwcC5kYi5tYW5p
ZmVzdF92ZXJzaW9uX2V4aXN0cyhpZGVudCksCgkoc3RyaW5nKCJubyBmaWxlIHZlcnNpb24g
IikgKyBpZGVudC5pbm5lcigpKCkgKyAiIGZvdW5kIGluIGRhdGFiYXNlIikpOwoKICAgICAg
TCgiZ2V0dGluZyBtYW5pZmVzdCAlc1xuIiwgaWRlbnQuaW5uZXIoKSgpLmNfc3RyKCkpOwog
ICAgICBhcHAuZGIuZ2V0X21hbmlmZXN0X3ZlcnNpb24oaWRlbnQsIGRhdCk7CiAgICAgIHJl
YWRfbWFuaWZlc3RfbWFwKGRhdCwgbV9vbGQpOwogICAgfQogIGVsc2UKICAgIGdldF9tYW5p
ZmVzdF9tYXAobV9vbGQpOwoKICBpZiAoYXJncy5zaXplKCkgPiAxKQogICAgewogICAgICBt
YW5pZmVzdF9kYXRhIGRhdDsKICAgICAgbWFuaWZlc3RfaWQgaWRlbnQoYXJnc1sxXSk7Cgog
ICAgICBOKGFwcC5kYi5tYW5pZmVzdF92ZXJzaW9uX2V4aXN0cyhpZGVudCksCgkoc3RyaW5n
KCJubyBmaWxlIHZlcnNpb24gIikgKyBpZGVudC5pbm5lcigpKCkgKyAiIGZvdW5kIGluIGRh
dGFiYXNlIikpOwoKICAgICAgTCgiZ2V0dGluZyBtYW5pZmVzdCAlc1xuIiwgaWRlbnQuaW5u
ZXIoKSgpLmNfc3RyKCkpOwogICAgICBhcHAuZGIuZ2V0X21hbmlmZXN0X3ZlcnNpb24oaWRl
bnQsIGRhdCk7CiAgICAgIHJlYWRfbWFuaWZlc3RfbWFwKGRhdCwgbV9uZXcpOwogICAgfQog
IGVsc2UKICAgIGNhbGN1bGF0ZV9uZXdfbWFuaWZlc3RfbWFwKG1fb2xkLCBtX25ldyk7Cgog
IG1hbmlmZXN0c190b19wYXRjaF9zZXQobV9vbGQsIG1fbmV3LCBhcHAsIHBzKTsKCiAgZm9y
IChzZXQ8cGF0Y2hfZGVsdGE+Ojpjb25zdF9pdGVyYXRvciBpID0gcHMuZl9kZWx0YXMuYmVn
aW4oKTsKICAgICAgIGkgIT0gcHMuZl9kZWx0YXMuZW5kKCk7ICsraSkKICAgIHsKICAgICAg
ZmlsZV9kYXRhIGZfb2xkLCBmX25ldzsKICAgICAgZ3ppcDxkYXRhPiBkZWNvZGVkX29sZCwg
ZGVjb2RlZF9uZXc7CiAgICAgIGRhdGEgZGVjb21wcmVzc2VkX29sZCwgZGVjb21wcmVzc2Vk
X25ldzsKICAgICAgdmVjdG9yPHN0cmluZz4gb2xkX2xpbmVzLCBuZXdfbGluZXM7CgogICAg
ICBhcHAuZGIuZ2V0X2ZpbGVfdmVyc2lvbihpLT5pZF9vbGQsIGZfb2xkKTsKICAgICAgZGVj
b2RlX2Jhc2U2NChmX29sZC5pbm5lcigpLCBkZWNvZGVkX29sZCk7CiAgICAgIGRlY29kZV9n
emlwKGRlY29kZWRfb2xkLCBkZWNvbXByZXNzZWRfb2xkKTsKCiAgICAgIGlmIChhcmdzLnNp
emUoKSA+IDEpCgl7CgkgIGFwcC5kYi5nZXRfZmlsZV92ZXJzaW9uKGktPmlkX25ldywgZl9u
ZXcpOwoJICBkZWNvZGVfYmFzZTY0KGZfbmV3LmlubmVyKCksIGRlY29kZWRfbmV3KTsKCSAg
ZGVjb2RlX2d6aXAoZGVjb2RlZF9uZXcsIGRlY29tcHJlc3NlZF9uZXcpOwoJfQogICAgICBl
bHNlCglyZWFkX2RhdGEoaS0+cGF0aCwgZGVjb21wcmVzc2VkX25ldyk7CgogICAgICBzcGxp
dF9pbnRvX2xpbmVzKGRlY29tcHJlc3NlZF9vbGQoKSwgb2xkX2xpbmVzKTsKICAgICAgc3Bs
aXRfaW50b19saW5lcyhkZWNvbXByZXNzZWRfbmV3KCksIG5ld19saW5lcyk7CgogICAgICB1
bmlkaWZmKGktPnBhdGgoKSwgaS0+cGF0aCgpLCBvbGRfbGluZXMsIG5ld19saW5lcywgY291
dCk7CiAgICB9ICAKICBndWFyZC5jb21taXQoKTsKfQoKQ01EKHN0YXR1cywgImluZm9ybWF0
aXZlIiwgIiIsICJzaG93IHN0YXR1cyBvZiB3b3JraW5nIGNvcHkiKQp7CiAgbWFuaWZlc3Rf
bWFwIG1fb2xkLCBtX25ldzsKICBwYXRjaF9zZXQgcHM7CgogIHRyYW5zYWN0aW9uX2d1YXJk
IGd1YXJkKGFwcC5kYik7CiAgZ2V0X21hbmlmZXN0X21hcChtX29sZCk7CiAgY2FsY3VsYXRl
X25ld19tYW5pZmVzdF9tYXAobV9vbGQsIG1fbmV3KTsKICBtYW5pZmVzdHNfdG9fcGF0Y2hf
c2V0KG1fb2xkLCBtX25ldywgYXBwLCBwcyk7CiAgcGF0Y2hfc2V0X3RvX3RleHRfc3VtbWFy
eShwcywgY291dCk7CiAgZ3VhcmQuY29tbWl0KCk7Cn0KCgpDTUQobWRlbHRhLCAicGFja2V0
IGkvbyIsICI8b2xkaWQ+IDxuZXdpZD4iLCAid3JpdGUgbWFuaWZlc3QgZGVsdGEgcGFja2V0
IHRvIHN0ZG91dCIpCnsKICBpZiAoYXJncy5zaXplKCkgIT0gMikKICAgIHRocm93IHVzYWdl
KG5hbWUpOwoKICB0cmFuc2FjdGlvbl9ndWFyZCBndWFyZChhcHAuZGIpOwogIHBhY2tldF93
cml0ZXIgcHcoY291dCk7CgogIG1hbmlmZXN0X2lkIG1fb2xkX2lkLCBtX25ld19pZDsgCiAg
bWFuaWZlc3RfZGF0YSBtX29sZF9kYXRhLCBtX25ld19kYXRhOwogIG1hbmlmZXN0X21hcCBt
X29sZCwgbV9uZXc7CiAgcGF0Y2hfc2V0IHBzOyAgICAgIAogIG1fb2xkX2lkID0gaGV4ZW5j
PGlkPihhcmdzWzBdKTsgCiAgbV9uZXdfaWQgPSBoZXhlbmM8aWQ+KGFyZ3NbMV0pOwogIGFw
cC5kYi5nZXRfbWFuaWZlc3RfdmVyc2lvbihtX29sZF9pZCwgbV9vbGRfZGF0YSk7CiAgYXBw
LmRiLmdldF9tYW5pZmVzdF92ZXJzaW9uKG1fbmV3X2lkLCBtX25ld19kYXRhKTsKICByZWFk
X21hbmlmZXN0X21hcChtX29sZF9kYXRhLCBtX29sZCk7CiAgcmVhZF9tYW5pZmVzdF9tYXAo
bV9uZXdfZGF0YSwgbV9uZXcpOwogIG1hbmlmZXN0c190b19wYXRjaF9zZXQobV9vbGQsIG1f
bmV3LCBhcHAsIHBzKTsKICBwYXRjaF9zZXRfdG9fcGFja2V0cyhwcywgYXBwLCBwdyk7ICAK
ICBndWFyZC5jb21taXQoKTsKfQoKQ01EKGZkZWx0YSwgInBhY2tldCBpL28iLCAiPG9sZGlk
PiA8bmV3aWQ+IiwgIndyaXRlIGZpbGUgZGVsdGEgcGFja2V0IHRvIHN0ZG91dCIpCnsKICBp
ZiAoYXJncy5zaXplKCkgIT0gMikKICAgIHRocm93IHVzYWdlKG5hbWUpOwoKICB0cmFuc2Fj
dGlvbl9ndWFyZCBndWFyZChhcHAuZGIpOwogIHBhY2tldF93cml0ZXIgcHcoY291dCk7Cgog
IGZpbGVfaWQgZl9vbGRfaWQsIGZfbmV3X2lkOwogIGZpbGVfZGF0YSBmX29sZF9kYXRhLCBm
X25ld19kYXRhOwogIGZfb2xkX2lkID0gaGV4ZW5jPGlkPihhcmdzWzBdKTsKICBmX25ld19p
ZCA9IGhleGVuYzxpZD4oYXJnc1sxXSk7ICAgICAKICBhcHAuZGIuZ2V0X2ZpbGVfdmVyc2lv
bihmX29sZF9pZCwgZl9vbGRfZGF0YSk7CiAgYXBwLmRiLmdldF9maWxlX3ZlcnNpb24oZl9u
ZXdfaWQsIGZfbmV3X2RhdGEpOwogIGJhc2U2NDwgZ3ppcDxkZWx0YT4gPiBkZWw7CiAgZGlm
ZihmX29sZF9kYXRhLmlubmVyKCksIGZfbmV3X2RhdGEuaW5uZXIoKSwgZGVsKTsKICBwdy5j
b25zdW1lX2ZpbGVfZGVsdGEoZl9vbGRfaWQsIGZfbmV3X2lkLCBmaWxlX2RlbHRhKGRlbCkp
OyAgCiAgZ3VhcmQuY29tbWl0KCk7Cn0KCkNNRChtZGF0YSwgInBhY2tldCBpL28iLCAiPGlk
PiIsICJ3cml0ZSBtYW5pZmVzdCBkYXRhIHBhY2tldCB0byBzdGRvdXQiKQp7CiAgaWYgKGFy
Z3Muc2l6ZSgpICE9IDEpCiAgICB0aHJvdyB1c2FnZShuYW1lKTsKCiAgdHJhbnNhY3Rpb25f
Z3VhcmQgZ3VhcmQoYXBwLmRiKTsKICBwYWNrZXRfd3JpdGVyIHB3KGNvdXQpOwoKICBtYW5p
ZmVzdF9pZCBtX2lkOwogIG1hbmlmZXN0X2RhdGEgbV9kYXRhOwogIG1faWQgPSBoZXhlbmM8
aWQ+KGFyZ3NbMF0pOwogIGFwcC5kYi5nZXRfbWFuaWZlc3RfdmVyc2lvbihtX2lkLCBtX2Rh
dGEpOwogIHB3LmNvbnN1bWVfbWFuaWZlc3RfZGF0YShtX2lkLCBtX2RhdGEpOyAgCiAgZ3Vh
cmQuY29tbWl0KCk7Cn0KCgpDTUQoZmRhdGEsICJwYWNrZXQgaS9vIiwgIjxpZD4iLCAid3Jp
dGUgZmlsZSBkYXRhIHBhY2tldCB0byBzdGRvdXQiKQp7CiAgaWYgKGFyZ3Muc2l6ZSgpICE9
IDEpCiAgICB0aHJvdyB1c2FnZShuYW1lKTsKCiAgdHJhbnNhY3Rpb25fZ3VhcmQgZ3VhcmQo
YXBwLmRiKTsKICBwYWNrZXRfd3JpdGVyIHB3KGNvdXQpOwoKICBmaWxlX2lkIGZfaWQ7CiAg
ZmlsZV9kYXRhIGZfZGF0YTsKICBmX2lkID0gaGV4ZW5jPGlkPihhcmdzWzBdKTsKICBhcHAu
ZGIuZ2V0X2ZpbGVfdmVyc2lvbihmX2lkLCBmX2RhdGEpOwogIHB3LmNvbnN1bWVfZmlsZV9k
YXRhKGZfaWQsIGZfZGF0YSk7ICAKICBndWFyZC5jb21taXQoKTsKfQoKQ01EKG1jZXJ0cywg
InBhY2tldCBpL28iLCAiPGlkPiIsICJ3cml0ZSBtYW5pZmVzdCBjZXJ0IHBhY2tldHMgdG8g
c3Rkb3V0IikKewogIGlmIChhcmdzLnNpemUoKSAhPSAxKQogICAgdGhyb3cgdXNhZ2UobmFt
ZSk7CgogIHRyYW5zYWN0aW9uX2d1YXJkIGd1YXJkKGFwcC5kYik7CiAgcGFja2V0X3dyaXRl
ciBwdyhjb3V0KTsKCiAgbWFuaWZlc3RfaWQgbV9pZDsKICB2ZWN0b3I8IG1hbmlmZXN0PGNl
cnQ+ID4gY2VydHM7CgogIG1faWQgPSBoZXhlbmM8aWQ+KGFyZ3NbMF0pOwogIGFwcC5kYi5n
ZXRfbWFuaWZlc3RfY2VydHMobV9pZCwgY2VydHMpOwogIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgY2VydHMuc2l6ZSgpOyArK2kpCiAgICBwdy5jb25zdW1lX21hbmlmZXN0X2NlcnQoY2Vy
dHNbaV0pOwogIGd1YXJkLmNvbW1pdCgpOwp9CgpDTUQoZmNlcnRzLCAicGFja2V0IGkvbyIs
ICI8aWQ+IiwgIndyaXRlIGZpbGUgY2VydCBwYWNrZXRzIHRvIHN0ZG91dCIpCnsKICBpZiAo
YXJncy5zaXplKCkgIT0gMSkKICAgIHRocm93IHVzYWdlKG5hbWUpOwoKICB0cmFuc2FjdGlv
bl9ndWFyZCBndWFyZChhcHAuZGIpOwogIHBhY2tldF93cml0ZXIgcHcoY291dCk7CgogIGZp
bGVfaWQgZl9pZDsKICB2ZWN0b3I8IGZpbGU8Y2VydD4gPiBjZXJ0czsKCiAgZl9pZCA9IGhl
eGVuYzxpZD4oYXJnc1swXSk7CiAgYXBwLmRiLmdldF9maWxlX2NlcnRzKGZfaWQsIGNlcnRz
KTsKICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNlcnRzLnNpemUoKTsgKytpKQogICAgcHcu
Y29uc3VtZV9maWxlX2NlcnQoY2VydHNbaV0pOwogIGd1YXJkLmNvbW1pdCgpOwp9CgpDTUQo
cHVia2V5LCAicGFja2V0IGkvbyIsICI8aWQ+IiwgIndyaXRlIHB1YmxpYyBrZXkgcGFja2V0
IHRvIHN0ZG91dCIpCnsKICBpZiAoYXJncy5zaXplKCkgIT0gMSkKICAgIHRocm93IHVzYWdl
KG5hbWUpOwoKICB0cmFuc2FjdGlvbl9ndWFyZCBndWFyZChhcHAuZGIpOwogIHBhY2tldF93
cml0ZXIgcHcoY291dCk7CiAgcnNhX2tleXBhaXJfaWQgaWRlbnQoYXJnc1swXSk7CiAgYmFz
ZTY0PCByc2FfcHViX2tleSA+IGtleTsKICBhcHAuZGIuZ2V0X2tleShpZGVudCwga2V5KTsK
ICBwdy5jb25zdW1lX3B1YmxpY19rZXkoaWRlbnQsIGtleSk7CiAgZ3VhcmQuY29tbWl0KCk7
Cn0KCkNNRChwcml2a2V5LCAicGFja2V0IGkvbyIsICI8aWQ+IiwgIndyaXRlIHByaXZhdGUg
a2V5IHBhY2tldCB0byBzdGRvdXQiKQp7CiAgaWYgKGFyZ3Muc2l6ZSgpICE9IDEpCiAgICB0
aHJvdyB1c2FnZShuYW1lKTsKCiAgdHJhbnNhY3Rpb25fZ3VhcmQgZ3VhcmQoYXBwLmRiKTsK
ICBwYWNrZXRfd3JpdGVyIHB3KGNvdXQpOwogIHJzYV9rZXlwYWlyX2lkIGlkZW50KGFyZ3Nb
MF0pOwogIGJhc2U2NDwgYXJjNDxyc2FfcHJpdl9rZXk+ID4ga2V5OwogIGFwcC5kYi5nZXRf
a2V5KGlkZW50LCBrZXkpOwogIHB3LmNvbnN1bWVfcHJpdmF0ZV9rZXkoaWRlbnQsIGtleSk7
CiAgZ3VhcmQuY29tbWl0KCk7Cn0KCgpDTUQocmVhZCwgInBhY2tldCBpL28iLCAiIiwgInJl
YWQgcGFja2V0cyBmcm9tIHN0ZGluIikKewogIHRyYW5zYWN0aW9uX2d1YXJkIGd1YXJkKGFw
cC5kYik7CiAgcGFja2V0X2RiX3dyaXRlciBkYncoYXBwLCB0cnVlKTsKICBzaXplX3QgY291
bnQgPSByZWFkX3BhY2tldHMoY2luLCBkYncpOwogIE4oY291bnQgIT0gMCwgIm5vIHBhY2tl
dHMgZm91bmQgb24gc3RkaW4iKTsKICBpZiAoY291bnQgPT0gMSkKICAgIFAoInJlYWQgMSBw
YWNrZXRcbiIpOwogIGVsc2UKICAgIFAoInJlYWQgJWQgcGFja2V0c1xuIiwgY291bnQpOwog
IGd1YXJkLmNvbW1pdCgpOwp9CgoKQ01EKGFncmFwaCwgImdyYXBoIHZpc3VhbGl6YXRpb24i
LCAiIiwgImR1bXAgYW5jZXN0cnkgZ3JhcGggdG8gc3Rkb3V0IikKewogIHZlY3RvcjwgbWFu
aWZlc3Q8Y2VydD4gPiBjZXJ0czsKICB0cmFuc2FjdGlvbl9ndWFyZCBndWFyZChhcHAuZGIp
OwogIGFwcC5kYi5nZXRfbWFuaWZlc3RfY2VydHMoYW5jZXN0b3JfY2VydF9uYW1lLCBjZXJ0
cyk7CiAgc2V0PHN0cmluZz4gbm9kZXM7CiAgdmVjdG9yPCBwYWlyPHN0cmluZywgc3RyaW5n
PiA+IGVkZ2VzOwogIGZvcih2ZWN0b3I8IG1hbmlmZXN0PGNlcnQ+ID46Oml0ZXJhdG9yIGkg
PSBjZXJ0cy5iZWdpbigpOwogICAgICBpICE9IGNlcnRzLmVuZCgpOyArK2kpCiAgICB7CiAg
ICAgIGNlcnRfdmFsdWUgdHY7CiAgICAgIGRlY29kZV9iYXNlNjQoaS0+aW5uZXIoKS52YWx1
ZSwgdHYpOwogICAgICBub2Rlcy5pbnNlcnQodHYoKSk7CiAgICAgIG5vZGVzLmluc2VydChp
LT5pbm5lcigpLmlkZW50KCkpOwogICAgICBlZGdlcy5wdXNoX2JhY2sobWFrZV9wYWlyKHR2
KCksIGktPmlubmVyKCkuaWRlbnQoKSkpOwogICAgfQogIGNvdXQgPDwgImdyYXBoOiAiIDw8
IGVuZGwgPDwgInsiIDw8IGVuZGw7IC8vIG9wZW4gZ3JhcGgKICBmb3IgKHNldDxzdHJpbmc+
OjppdGVyYXRvciBpID0gbm9kZXMuYmVnaW4oKTsgaSAhPSBub2Rlcy5lbmQoKTsKICAgICAg
ICsraSkKICAgIHsKICAgICAgY291dCA8PCAibm9kZTogeyB0aXRsZSA6IFwiIiA8PCAqaSA8
PCAiXCJ9IiA8PCBlbmRsOwogICAgfQogIGZvciAodmVjdG9yPCBwYWlyPHN0cmluZyxzdHJp
bmc+ID46Oml0ZXJhdG9yIGkgPSBlZGdlcy5iZWdpbigpOyBpICE9IGVkZ2VzLmVuZCgpOwog
ICAgICAgKytpKQogICAgewogICAgICBjb3V0IDw8ICJlZGdlOiB7IHNvdXJjZW5hbWUgOiBc
IiIgPDwgaS0+Zmlyc3QgPDwgIlwiIiA8PCBlbmRsCgkgICA8PCAiICAgICAgICB0YXJnZXRu
YW1lIDogXCIiIDw8IGktPnNlY29uZCA8PCAiXCIgfSIgPDwgZW5kbDsKICAgIH0KICBjb3V0
IDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7IC8vIGNsb3NlIGdyYXBoCiAgZ3VhcmQuY29tbWl0
KCk7Cn0KCkNNRChmZXRjaCwgIm5ldHdvcmsiLCAiW1VSTF0gW2dyb3VwbmFtZV0iLCAiZmV0
Y2ggcmVjZW50IGNoYW5nZXMgZnJvbSBuZXR3b3JrIikKewogIGlmIChhcmdzLnNpemUoKSA+
IDIpCiAgICB0aHJvdyB1c2FnZShuYW1lKTsKCiAgdmVjdG9yPCBwYWlyPHVybCxncm91cD4g
PiBzb3VyY2VzOwoKICBpZiAoYXJncy5zaXplKCkgPT0gMCkKICAgIHsKICAgICAgaWYgKGFw
cC5icmFuY2hfbmFtZSA9PSAiIikKCXsKCSAgUCgibm8gYnJhbmNoIG5hbWUgcHJvdmlkZWQs
IGZldGNoaW5nIGZyb20gYWxsIGtub3duIFVSTHNcbiIpOwoJICBhcHAuZGIuZ2V0X2FsbF9r
bm93bl9zb3VyY2VzKHNvdXJjZXMpOwoJfQogICAgICBlbHNlCgl7CgkgIE4oYXBwLmx1YS5o
b29rX2dldF9mZXRjaF9zb3VyY2VzKGFwcC5icmFuY2hfbmFtZSwgc291cmNlcyksCgkgICAg
KCJubyBVUkwgLyBncm91cCBwYWlycyBmb3VuZCBmb3IgYnJhbmNoICIgKyBhcHAuYnJhbmNo
X25hbWUpKTsgCgl9CiAgICB9CiAgZWxzZQogICAgewogICAgICBOKGFyZ3Muc2l6ZSgpID09
IDIsICJuZWVkIFVSTCBhbmQgZ3JvdXBuYW1lIik7CiAgICAgIHNvdXJjZXMucHVzaF9iYWNr
KG1ha2VfcGFpcih1cmwoYXJnc1swXSksCgkJCQkgIGdyb3VwKGFyZ3NbMV0pKSk7CiAgICB9
CiAgCiAgZmV0Y2hfcXVldWVkX2Jsb2JzX2Zyb21fbmV0d29yayhzb3VyY2VzLCBhcHApOwp9
CgpDTUQocG9zdCwgIm5ldHdvcmsiLCAiW1VSTF0gW2dyb3VwbmFtZV0iLCAicG9zdCBxdWV1
ZWQgY2hhbmdlcyB0byBuZXR3b3JrIikKewogIGlmIChhcmdzLnNpemUoKSA+IDIpCiAgICB0
aHJvdyB1c2FnZShuYW1lKTsKCiAgdmVjdG9yPCBwYWlyPHVybCxncm91cD4gPiB0YXJnZXRz
OwogIGlmIChhcmdzLnNpemUoKSA9PSAwKQogICAgewogICAgICBpZiAoYXBwLmJyYW5jaF9u
YW1lID09ICIiKQoJewoJICBQKCJubyBicmFuY2ggbmFtZSBwcm92aWRlZCwgcG9zdGluZyBh
bGwgcXVldWVkIHRhcmdldHNcbiIpOwoJICBhcHAuZGIuZ2V0X3F1ZXVlZF90YXJnZXRzKHRh
cmdldHMpOwoJfQogICAgICBlbHNlCgl7CgkgIE4oYXBwLmx1YS5ob29rX2dldF9wb3N0X3Rh
cmdldHMoYXBwLmJyYW5jaF9uYW1lLCB0YXJnZXRzKSwKCSAgICAoIm5vIFVSTCAvIGdyb3Vw
IHBhaXJzIGZvdW5kIGZvciBicmFuY2ggIiArIGFwcC5icmFuY2hfbmFtZSkpOyAKCX0KICAg
IH0gIAogIGVsc2UKICAgIHsKICAgICAgTihhcmdzLnNpemUoKSA9PSAyLCAibmVlZCBVUkwg
YW5kIGdyb3VwbmFtZSIpOwogICAgICB0YXJnZXRzLnB1c2hfYmFjayhtYWtlX3BhaXIodXJs
KGFyZ3NbMF0pLAoJCQkJICBncm91cChhcmdzWzFdKSkpOwogICAgfQoKICBwb3N0X3F1ZXVl
ZF9ibG9ic190b19uZXR3b3JrKHRhcmdldHMsIGFwcCk7Cn0KCgpDTUQocmNzX2ltcG9ydCwg
InJjcyIsICI8cmNzZmlsZT4gLi4uIiwgImltcG9ydCBhbGwgdmVyc2lvbnMgaW4gUkNTIGZp
bGVzIikKewogIGlmIChhcmdzLnNpemUoKSA8IDEpCiAgICB0aHJvdyB1c2FnZShuYW1lKTsK
ICAKICB0cmFuc2FjdGlvbl9ndWFyZCBndWFyZChhcHAuZGIpOwogIGZvciAodmVjdG9yPHN0
cmluZz46OmNvbnN0X2l0ZXJhdG9yIGkgPSBhcmdzLmJlZ2luKCk7CiAgICAgICBpICE9IGFy
Z3MuZW5kKCk7ICsraSkKICAgIHsKICAgICAgaW1wb3J0X3Jjc19maWxlKGZzOjpwYXRoKCpp
KSwgYXBwLmRiKTsKICAgIH0KICBndWFyZC5jb21taXQoKTsKfQoKCkNNRChjdnNfaW1wb3J0
LCAicmNzIiwgIjxjdnNyb290PiIsICJpbXBvcnQgYWxsIHZlcnNpb25zIGluIENWUyByZXBv
c2l0b3J5IikKewogIGlmIChhcmdzLnNpemUoKSAhPSAxKQogICAgdGhyb3cgdXNhZ2UobmFt
ZSk7CgogIGltcG9ydF9jdnNfcmVwbyhmczo6cGF0aChhcmdzLmF0KDApKSwgYXBwKTsKfQoK
Cn07IC8vIG5hbWVzcGFjZSBjb21tYW5kcwo=
_ATEOF


# decode first file and commit to db
$at_traceoff
echo "t_unidiff2.at:1690: mimencode -u firstfile.b64"
echo t_unidiff2.at:1690 >$at_check_line_file
( $at_traceon; mimencode -u firstfile.b64 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_unidiff2.at:1690: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_unidiff2.at:1691: mv stdout firstfile"
echo t_unidiff2.at:1691 >$at_check_line_file
( $at_traceon; mv stdout firstfile ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_unidiff2.at:1691: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_unidiff2.at:1692: cp firstfile testfile"
echo t_unidiff2.at:1692 >$at_check_line_file
( $at_traceon; cp firstfile testfile ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_unidiff2.at:1692: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_unidiff2.at:1693: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add testfile"
echo t_unidiff2.at:1693 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add testfile ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_unidiff2.at:1693: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_unidiff2.at:1694: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit blah-blah"
echo t_unidiff2.at:1694 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit blah-blah ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_unidiff2.at:1694: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_unidiff2.at:1695: mv testfile firstfile"
echo t_unidiff2.at:1695 >$at_check_line_file
( $at_traceon; mv testfile firstfile ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_unidiff2.at:1695: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# decode second file
$at_traceoff
echo "t_unidiff2.at:1698: mimencode -u secondfile.b64"
echo t_unidiff2.at:1698 >$at_check_line_file
( $at_traceon; mimencode -u secondfile.b64 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_unidiff2.at:1698: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_unidiff2.at:1699: mv stdout secondfile"
echo t_unidiff2.at:1699 >$at_check_line_file
( $at_traceon; mv stdout secondfile ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_unidiff2.at:1699: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# calculate diff to second file using monotone
$at_traceoff
echo "t_unidiff2.at:1702: cp secondfile testfile"
echo t_unidiff2.at:1702 >$at_check_line_file
( $at_traceon; cp secondfile testfile ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_unidiff2.at:1702: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_unidiff2.at:1703: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net diff"
echo t_unidiff2.at:1703 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net diff ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_unidiff2.at:1703: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_unidiff2.at:1704: mv stdout monodiff"
echo t_unidiff2.at:1704 >$at_check_line_file
( $at_traceon; mv stdout monodiff ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_unidiff2.at:1704: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# look for a meaningless change
$at_traceoff
echo "t_unidiff2.at:1707: grep ^-\$ monodiff"
echo t_unidiff2.at:1707 >$at_check_line_file
( $at_traceon; grep ^-$ monodiff ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   1) ;;
   *) echo "t_unidiff2.at:1707: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


      $at_traceoff
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  12 ) # 12. t_cwork.at:3: delete work file on checkout
    at_setup_line='t_cwork.at:3'
    at_desc='delete work file on checkout'
    $at_quiet $ECHO_N " 12: delete work file on checkout                 $ECHO_C"
    at_xfail=no
    (
      echo "12. t_cwork.at:3: testing ..."
      $at_traceon




cat >test_keys <<'_ATEOF'
[pubkey tester@test.net]
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCfN/cAMabgb6T7m8ksGnpQ7LO6hOdnc/7V
yivrRGtmpwSItljht1bmgLQF37KiSPoMEDUb1stfKxaMsYiy8iTyoQ+M2EVFP37n2rtnNZ0H
oVcQd2sRsCerQFh9nslRPymlkQXUlOiNFN6RlFNcdjkucqNe+YorFX21EYw7XuT5XwIBEQ==
[end]
[privkey tester@test.net]
npy0jyqbZdylFkMjdR9OvlqmDHuBGXpGFPt94h96aG+Lp+OdBCmWx8GueHk8FKkexwPqhRBM
PPopUeuwqxuSX+yEodMl5IHBmin0nLnbOeBjtasjemBFEmdNl/jPDF/AeQ2WHhanB731dSQc
vzLOQfKAYmfk56PPULi9oJJNUxaCkvsWtvaI+HUHZrjyyV7dA4Vsc6Jvx2Yf1+MdDAEGk/Rw
ZtP0LmuoiyvRDFqBF8aTmnotyb4kRKohnJ7VF+y6hYvmtMpM3TKnpR7EbojBzNPqKuO7nPUz
jGxA7F84O24Vbf128PNSI5vj4istow26aPjn28qPjfRrkV30WLL/dXfYJkfkTqglYnoEXvF/
xZoVxxNeAX58mgy0A1ErVxv8U7TwuP983GHEpLwy3gbiP+9akAJCr8r823DHmQqq5QDELibP
cuXZfOttpfVRkcbMhjeF0M6czc4HoKgHTAnf/18hzdZwGX/WWvRIBHImbUJ+mDbp2ByDTfKf
ErGXSvZ3HxCqBD8yx1SnXhV8IDHaBmV9wwYcN+H2cxOWGZk7g7xJS19+a3UQB3c3sSXQVJBp
6QpCZgysxkZwzuXDzzLZPT9SLZz4K2p7+7BwMbpy9ZxcyAzmiEtpA24UP06jtjFN7WcXAdx/
E5Gmoe9b1EiXWdReHjUGpc6k0LQ0PPXAwqrcGdwYbOLDZ5xsQ5AsEYSFtyTS60D1nHBcdNmW
M0eOUJFdJf/uNe/2EApc3a8TyEkZtVqiYtOVV3qDB9NmU4bVOkDqzl1F7zJwATWbmasSdkM3
6lxDkczBfCrEjH5p5Y8DU+ge4e4LRtknY9oBOJ7EQO0twYJg3k0=
[end]
_ATEOF


cat >test_hooks.lua <<'_ATEOF'

-- this is the "testing" set of lua hooks for monotone
-- it's intended to support self-tests, not for use in
-- production. just defines some of the std hooks.

function get_passphrase(keyid)
	return keyid
end

function non_blocking_rng_ok()
	return true
end

function get_manifest_cert_trust(signers, id, name, val)
   return true
end

function get_file_cert_trust(signers, id, name, val)
   return true
end

function accept_testresult_change(old_results, new_results)
   for test,res in pairs(old_results)
   do
      if res == true and new_results[test] ~= true
      then
	 return false
      end
   end
   return true
end

function get_author(branchname)
	return "tester@test.net"
end

function ignore_file(name)
	if (strfind(name, "test_hooks.lua")) then return true end
	if (strfind(name, "test.db")) then return true end
	return false
end

if (attr_functions == nil) then
  attr_functions = {}
end
attr_functions["test_attr"] =
  function(filename, value)
    io.write(string.format("test_attr:%s:%s\n", filename, value))
  end

_ATEOF


$at_traceoff
echo "t_cwork.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init"
echo t_cwork.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cwork.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cwork.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys"
echo t_cwork.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cwork.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cwork.at:5: rm test_keys"
echo t_cwork.at:5 >$at_check_line_file
( $at_traceon; rm test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cwork.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



cat >testfile0 <<'_ATEOF'
version 0 of first test file
_ATEOF

cat >testfile1 <<'_ATEOF'
version 1 of second test file
_ATEOF


$at_traceoff
echo "t_cwork.at:12: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add testfile0"
echo t_cwork.at:12 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add testfile0 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cwork.at:12: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cwork.at:13: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit 'blah blah'"
echo t_cwork.at:13 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit 'blah blah' ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cwork.at:13: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

V1=`sha1sum MT/manifest | cut -d ' ' -f 1`
$at_traceoff
echo "t_cwork.at:15: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add testfile1"
echo t_cwork.at:15 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add testfile1 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cwork.at:15: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cwork.at:16: test -e MT/work"
echo t_cwork.at:16 >$at_check_line_file
( $at_traceon; test -e MT/work ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cwork.at:16: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cwork.at:17: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout \$V1 ."
echo t_cwork.at:17 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout $V1 . ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cwork.at:17: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cwork.at:18: test ! -e MT/work"
echo t_cwork.at:18 >$at_check_line_file
( $at_traceon; test ! -e MT/work ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cwork.at:18: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


      $at_traceoff
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  13 ) # 13. t_revert.at:3: revert file to base version
    at_setup_line='t_revert.at:3'
    at_desc='revert file to base version'
    $at_quiet $ECHO_N " 13: revert file to base version                  $ECHO_C"
    at_xfail=no
    (
      echo "13. t_revert.at:3: testing ..."
      $at_traceon




cat >test_keys <<'_ATEOF'
[pubkey tester@test.net]
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCfN/cAMabgb6T7m8ksGnpQ7LO6hOdnc/7V
yivrRGtmpwSItljht1bmgLQF37KiSPoMEDUb1stfKxaMsYiy8iTyoQ+M2EVFP37n2rtnNZ0H
oVcQd2sRsCerQFh9nslRPymlkQXUlOiNFN6RlFNcdjkucqNe+YorFX21EYw7XuT5XwIBEQ==
[end]
[privkey tester@test.net]
npy0jyqbZdylFkMjdR9OvlqmDHuBGXpGFPt94h96aG+Lp+OdBCmWx8GueHk8FKkexwPqhRBM
PPopUeuwqxuSX+yEodMl5IHBmin0nLnbOeBjtasjemBFEmdNl/jPDF/AeQ2WHhanB731dSQc
vzLOQfKAYmfk56PPULi9oJJNUxaCkvsWtvaI+HUHZrjyyV7dA4Vsc6Jvx2Yf1+MdDAEGk/Rw
ZtP0LmuoiyvRDFqBF8aTmnotyb4kRKohnJ7VF+y6hYvmtMpM3TKnpR7EbojBzNPqKuO7nPUz
jGxA7F84O24Vbf128PNSI5vj4istow26aPjn28qPjfRrkV30WLL/dXfYJkfkTqglYnoEXvF/
xZoVxxNeAX58mgy0A1ErVxv8U7TwuP983GHEpLwy3gbiP+9akAJCr8r823DHmQqq5QDELibP
cuXZfOttpfVRkcbMhjeF0M6czc4HoKgHTAnf/18hzdZwGX/WWvRIBHImbUJ+mDbp2ByDTfKf
ErGXSvZ3HxCqBD8yx1SnXhV8IDHaBmV9wwYcN+H2cxOWGZk7g7xJS19+a3UQB3c3sSXQVJBp
6QpCZgysxkZwzuXDzzLZPT9SLZz4K2p7+7BwMbpy9ZxcyAzmiEtpA24UP06jtjFN7WcXAdx/
E5Gmoe9b1EiXWdReHjUGpc6k0LQ0PPXAwqrcGdwYbOLDZ5xsQ5AsEYSFtyTS60D1nHBcdNmW
M0eOUJFdJf/uNe/2EApc3a8TyEkZtVqiYtOVV3qDB9NmU4bVOkDqzl1F7zJwATWbmasSdkM3
6lxDkczBfCrEjH5p5Y8DU+ge4e4LRtknY9oBOJ7EQO0twYJg3k0=
[end]
_ATEOF


cat >test_hooks.lua <<'_ATEOF'

-- this is the "testing" set of lua hooks for monotone
-- it's intended to support self-tests, not for use in
-- production. just defines some of the std hooks.

function get_passphrase(keyid)
	return keyid
end

function non_blocking_rng_ok()
	return true
end

function get_manifest_cert_trust(signers, id, name, val)
   return true
end

function get_file_cert_trust(signers, id, name, val)
   return true
end

function accept_testresult_change(old_results, new_results)
   for test,res in pairs(old_results)
   do
      if res == true and new_results[test] ~= true
      then
	 return false
      end
   end
   return true
end

function get_author(branchname)
	return "tester@test.net"
end

function ignore_file(name)
	if (strfind(name, "test_hooks.lua")) then return true end
	if (strfind(name, "test.db")) then return true end
	return false
end

if (attr_functions == nil) then
  attr_functions = {}
end
attr_functions["test_attr"] =
  function(filename, value)
    io.write(string.format("test_attr:%s:%s\n", filename, value))
  end

_ATEOF


$at_traceoff
echo "t_revert.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init"
echo t_revert.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys"
echo t_revert.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:5: rm test_keys"
echo t_revert.at:5 >$at_check_line_file
( $at_traceon; rm test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



cat >testfile0 <<'_ATEOF'
version 0 of first test file
_ATEOF


$at_traceoff
echo "t_revert.at:10: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add testfile0"
echo t_revert.at:10 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add testfile0 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:10: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

V1=`sha1sum testfile0 | cut -d ' ' -f 1`
$at_traceoff
echo "t_revert.at:12: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit 'blah blah'"
echo t_revert.at:12 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit 'blah blah' ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:12: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# check reverting a single file by name

cat >testfile0 <<'_ATEOF'
squirrils monkeys dingos
_ATEOF


$at_traceoff
echo "t_revert.at:19: grep squirrils testfile0"
echo t_revert.at:19 >$at_check_line_file
( $at_traceon; grep squirrils testfile0 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:19: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:20: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net revert testfile0"
echo t_revert.at:20 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net revert testfile0 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:20: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:21: grep squirrils testfile0"
echo t_revert.at:21 >$at_check_line_file
( $at_traceon; grep squirrils testfile0 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   1) ;;
   *) echo "t_revert.at:21: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

V2=`sha1sum testfile0 | cut -d ' ' -f 1`
$at_traceoff
echo "t_revert.at:23: test \$V1 == \$V2"
echo t_revert.at:23 >$at_check_line_file
( $at_traceon; test $V1 == $V2 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:23: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



# check reverting the whole tree

cat >testfile0 <<'_ATEOF'
squirrils monkeys dingos
_ATEOF

$at_traceoff
echo "t_revert.at:30: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net status"
echo t_revert.at:30 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net status ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:30: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:31: grep testfile0 stdout"
echo t_revert.at:31 >$at_check_line_file
( $at_traceon; grep testfile0 stdout ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:31: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:32: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net revert"
echo t_revert.at:32 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net revert ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:32: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:33: test ! -e MT/work"
echo t_revert.at:33 >$at_check_line_file
( $at_traceon; test ! -e MT/work ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:33: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:34: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net status"
echo t_revert.at:34 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net status ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:34: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:35: grep testfile0 stdout"
echo t_revert.at:35 >$at_check_line_file
( $at_traceon; grep testfile0 stdout ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   1) ;;
   *) echo "t_revert.at:35: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



# check reverting a delete

$at_traceoff
echo "t_revert.at:40: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net drop testfile0"
echo t_revert.at:40 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net drop testfile0 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:40: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:41: grep testfile0 MT/work"
echo t_revert.at:41 >$at_check_line_file
( $at_traceon; grep testfile0 MT/work ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:41: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:42: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net status"
echo t_revert.at:42 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net status ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:42: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:43: grep testfile0 stdout"
echo t_revert.at:43 >$at_check_line_file
( $at_traceon; grep testfile0 stdout ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:43: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:44: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net revert"
echo t_revert.at:44 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net revert ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:44: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:45: test ! -e MT/work"
echo t_revert.at:45 >$at_check_line_file
( $at_traceon; test ! -e MT/work ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:45: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:46: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net status"
echo t_revert.at:46 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net status ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:46: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:47: grep testfile0 stdout"
echo t_revert.at:47 >$at_check_line_file
( $at_traceon; grep testfile0 stdout ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   1) ;;
   *) echo "t_revert.at:47: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



# check reverting a change and a delete

$at_traceoff
echo "t_revert.at:52: echo 'liver and maude' >> testfile0"
echo t_revert.at:52 >$at_check_line_file
( $at_traceon; echo 'liver and maude' >> testfile0 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:52: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:53: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net drop testfile0"
echo t_revert.at:53 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net drop testfile0 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:53: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:54: grep testfile0 MT/work"
echo t_revert.at:54 >$at_check_line_file
( $at_traceon; grep testfile0 MT/work ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:54: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:55: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net status"
echo t_revert.at:55 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net status ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:55: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:56: grep testfile0 stdout"
echo t_revert.at:56 >$at_check_line_file
( $at_traceon; grep testfile0 stdout ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:56: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:57: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net revert testfile0"
echo t_revert.at:57 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net revert testfile0 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:57: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:58: test ! -e MT/work"
echo t_revert.at:58 >$at_check_line_file
( $at_traceon; test ! -e MT/work ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:58: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:59: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net status"
echo t_revert.at:59 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net status ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:59: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:60: grep testfile0 stdout"
echo t_revert.at:60 >$at_check_line_file
( $at_traceon; grep testfile0 stdout ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   1) ;;
   *) echo "t_revert.at:60: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

V3=`sha1sum testfile0 | cut -d ' ' -f 1`
$at_traceoff
echo "t_revert.at:62: test \$V1 == \$V3"
echo t_revert.at:62 >$at_check_line_file
( $at_traceon; test $V1 == $V3 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:62: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# check reverting an add

cat >testfile1 <<'_ATEOF'
squirrils monkeys dingos
_ATEOF

$at_traceoff
echo "t_revert.at:68: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add testfile1"
echo t_revert.at:68 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add testfile1 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:68: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:69: grep testfile1 MT/work"
echo t_revert.at:69 >$at_check_line_file
( $at_traceon; grep testfile1 MT/work ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:69: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:70: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net status"
echo t_revert.at:70 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net status ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:70: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:71: grep testfile1 stdout"
echo t_revert.at:71 >$at_check_line_file
( $at_traceon; grep testfile1 stdout ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:71: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:72: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net revert"
echo t_revert.at:72 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net revert ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:72: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:73: test ! -e MT/work"
echo t_revert.at:73 >$at_check_line_file
( $at_traceon; test ! -e MT/work ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:73: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:74: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net status"
echo t_revert.at:74 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net status ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:74: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:75: grep testfile1 stdout"
echo t_revert.at:75 >$at_check_line_file
( $at_traceon; grep testfile1 stdout ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   1) ;;
   *) echo "t_revert.at:75: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# check reverting a directory

$at_traceoff
echo "t_revert.at:79: mkdir sub"
echo t_revert.at:79 >$at_check_line_file
( $at_traceon; mkdir sub ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:79: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

cat >sub/testfile2 <<'_ATEOF'
maude
_ATEOF

$at_traceoff
echo "t_revert.at:82: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add sub/testfile2"
echo t_revert.at:82 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add sub/testfile2 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:82: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:83: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit 'new file'"
echo t_revert.at:83 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit 'new file' ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:83: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

cat >sub/testfile2 <<'_ATEOF'
liver
_ATEOF

$at_traceoff
echo "t_revert.at:86: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net status"
echo t_revert.at:86 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net status ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:86: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:87: grep sub stdout"
echo t_revert.at:87 >$at_check_line_file
( $at_traceon; grep sub stdout ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:87: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:88: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net revert sub"
echo t_revert.at:88 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net revert sub ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:88: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:89: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net status"
echo t_revert.at:89 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net status ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:89: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:90: grep sub stdout"
echo t_revert.at:90 >$at_check_line_file
( $at_traceon; grep sub stdout ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   1) ;;
   *) echo "t_revert.at:90: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# it also shouldn't matter how we spell the subdirectory name
cat >sub/testfile2 <<'_ATEOF'
liver
_ATEOF

$at_traceoff
echo "t_revert.at:95: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net status"
echo t_revert.at:95 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net status ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:95: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:96: grep sub stdout"
echo t_revert.at:96 >$at_check_line_file
( $at_traceon; grep sub stdout ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:96: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:97: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net revert sub/"
echo t_revert.at:97 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net revert sub/ ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:97: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:98: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net status"
echo t_revert.at:98 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net status ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert.at:98: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_revert.at:99: grep sub stdout"
echo t_revert.at:99 >$at_check_line_file
( $at_traceon; grep sub stdout ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   1) ;;
   *) echo "t_revert.at:99: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



      $at_traceoff
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  14 ) # 14. t_drop.at:3: drop and re-add file does nothing
    at_setup_line='t_drop.at:3'
    at_desc='drop and re-add file does nothing'
    $at_quiet $ECHO_N " 14: drop and re-add file does nothing            $ECHO_C"
    at_xfail=no
    (
      echo "14. t_drop.at:3: testing ..."
      $at_traceon




cat >test_keys <<'_ATEOF'
[pubkey tester@test.net]
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCfN/cAMabgb6T7m8ksGnpQ7LO6hOdnc/7V
yivrRGtmpwSItljht1bmgLQF37KiSPoMEDUb1stfKxaMsYiy8iTyoQ+M2EVFP37n2rtnNZ0H
oVcQd2sRsCerQFh9nslRPymlkQXUlOiNFN6RlFNcdjkucqNe+YorFX21EYw7XuT5XwIBEQ==
[end]
[privkey tester@test.net]
npy0jyqbZdylFkMjdR9OvlqmDHuBGXpGFPt94h96aG+Lp+OdBCmWx8GueHk8FKkexwPqhRBM
PPopUeuwqxuSX+yEodMl5IHBmin0nLnbOeBjtasjemBFEmdNl/jPDF/AeQ2WHhanB731dSQc
vzLOQfKAYmfk56PPULi9oJJNUxaCkvsWtvaI+HUHZrjyyV7dA4Vsc6Jvx2Yf1+MdDAEGk/Rw
ZtP0LmuoiyvRDFqBF8aTmnotyb4kRKohnJ7VF+y6hYvmtMpM3TKnpR7EbojBzNPqKuO7nPUz
jGxA7F84O24Vbf128PNSI5vj4istow26aPjn28qPjfRrkV30WLL/dXfYJkfkTqglYnoEXvF/
xZoVxxNeAX58mgy0A1ErVxv8U7TwuP983GHEpLwy3gbiP+9akAJCr8r823DHmQqq5QDELibP
cuXZfOttpfVRkcbMhjeF0M6czc4HoKgHTAnf/18hzdZwGX/WWvRIBHImbUJ+mDbp2ByDTfKf
ErGXSvZ3HxCqBD8yx1SnXhV8IDHaBmV9wwYcN+H2cxOWGZk7g7xJS19+a3UQB3c3sSXQVJBp
6QpCZgysxkZwzuXDzzLZPT9SLZz4K2p7+7BwMbpy9ZxcyAzmiEtpA24UP06jtjFN7WcXAdx/
E5Gmoe9b1EiXWdReHjUGpc6k0LQ0PPXAwqrcGdwYbOLDZ5xsQ5AsEYSFtyTS60D1nHBcdNmW
M0eOUJFdJf/uNe/2EApc3a8TyEkZtVqiYtOVV3qDB9NmU4bVOkDqzl1F7zJwATWbmasSdkM3
6lxDkczBfCrEjH5p5Y8DU+ge4e4LRtknY9oBOJ7EQO0twYJg3k0=
[end]
_ATEOF


cat >test_hooks.lua <<'_ATEOF'

-- this is the "testing" set of lua hooks for monotone
-- it's intended to support self-tests, not for use in
-- production. just defines some of the std hooks.

function get_passphrase(keyid)
	return keyid
end

function non_blocking_rng_ok()
	return true
end

function get_manifest_cert_trust(signers, id, name, val)
   return true
end

function get_file_cert_trust(signers, id, name, val)
   return true
end

function accept_testresult_change(old_results, new_results)
   for test,res in pairs(old_results)
   do
      if res == true and new_results[test] ~= true
      then
	 return false
      end
   end
   return true
end

function get_author(branchname)
	return "tester@test.net"
end

function ignore_file(name)
	if (strfind(name, "test_hooks.lua")) then return true end
	if (strfind(name, "test.db")) then return true end
	return false
end

if (attr_functions == nil) then
  attr_functions = {}
end
attr_functions["test_attr"] =
  function(filename, value)
    io.write(string.format("test_attr:%s:%s\n", filename, value))
  end

_ATEOF


$at_traceoff
echo "t_drop.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init"
echo t_drop.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_drop.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_drop.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys"
echo t_drop.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_drop.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_drop.at:5: rm test_keys"
echo t_drop.at:5 >$at_check_line_file
( $at_traceon; rm test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_drop.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



cat >maude <<'_ATEOF'
the file maude
_ATEOF


cat >liver <<'_ATEOF'
the file liver
_ATEOF


$at_traceoff
echo "t_drop.at:13: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add maude"
echo t_drop.at:13 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add maude ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_drop.at:13: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_drop.at:14: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit 'committed'"
echo t_drop.at:14 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit 'committed' ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_drop.at:14: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_drop.at:16: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net drop maude"
echo t_drop.at:16 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net drop maude ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_drop.at:16: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_drop.at:17: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add maude"
echo t_drop.at:17 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add maude ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_drop.at:17: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_drop.at:18: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net status"
echo t_drop.at:18 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net status ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_drop.at:18: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_drop.at:19: grep 'no changes' stdout"
echo t_drop.at:19 >$at_check_line_file
( $at_traceon; grep 'no changes' stdout ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_drop.at:19: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_drop.at:21: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add liver"
echo t_drop.at:21 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add liver ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_drop.at:21: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_drop.at:22: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net drop liver"
echo t_drop.at:22 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net drop liver ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_drop.at:22: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_drop.at:23: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net status"
echo t_drop.at:23 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net status ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_drop.at:23: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_drop.at:24: grep 'no changes' stdout"
echo t_drop.at:24 >$at_check_line_file
( $at_traceon; grep 'no changes' stdout ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_drop.at:24: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


      $at_traceoff
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  15 ) # 15. t_cross.at:3: creating a bad criss-cross merge
    at_setup_line='t_cross.at:3'
    at_desc='creating a bad criss-cross merge'
    $at_quiet $ECHO_N " 15: creating a bad criss-cross merge             $ECHO_C"
    at_xfail=no
    (
      echo "15. t_cross.at:3: testing ..."
      $at_traceon




cat >test_keys <<'_ATEOF'
[pubkey tester@test.net]
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCfN/cAMabgb6T7m8ksGnpQ7LO6hOdnc/7V
yivrRGtmpwSItljht1bmgLQF37KiSPoMEDUb1stfKxaMsYiy8iTyoQ+M2EVFP37n2rtnNZ0H
oVcQd2sRsCerQFh9nslRPymlkQXUlOiNFN6RlFNcdjkucqNe+YorFX21EYw7XuT5XwIBEQ==
[end]
[privkey tester@test.net]
npy0jyqbZdylFkMjdR9OvlqmDHuBGXpGFPt94h96aG+Lp+OdBCmWx8GueHk8FKkexwPqhRBM
PPopUeuwqxuSX+yEodMl5IHBmin0nLnbOeBjtasjemBFEmdNl/jPDF/AeQ2WHhanB731dSQc
vzLOQfKAYmfk56PPULi9oJJNUxaCkvsWtvaI+HUHZrjyyV7dA4Vsc6Jvx2Yf1+MdDAEGk/Rw
ZtP0LmuoiyvRDFqBF8aTmnotyb4kRKohnJ7VF+y6hYvmtMpM3TKnpR7EbojBzNPqKuO7nPUz
jGxA7F84O24Vbf128PNSI5vj4istow26aPjn28qPjfRrkV30WLL/dXfYJkfkTqglYnoEXvF/
xZoVxxNeAX58mgy0A1ErVxv8U7TwuP983GHEpLwy3gbiP+9akAJCr8r823DHmQqq5QDELibP
cuXZfOttpfVRkcbMhjeF0M6czc4HoKgHTAnf/18hzdZwGX/WWvRIBHImbUJ+mDbp2ByDTfKf
ErGXSvZ3HxCqBD8yx1SnXhV8IDHaBmV9wwYcN+H2cxOWGZk7g7xJS19+a3UQB3c3sSXQVJBp
6QpCZgysxkZwzuXDzzLZPT9SLZz4K2p7+7BwMbpy9ZxcyAzmiEtpA24UP06jtjFN7WcXAdx/
E5Gmoe9b1EiXWdReHjUGpc6k0LQ0PPXAwqrcGdwYbOLDZ5xsQ5AsEYSFtyTS60D1nHBcdNmW
M0eOUJFdJf/uNe/2EApc3a8TyEkZtVqiYtOVV3qDB9NmU4bVOkDqzl1F7zJwATWbmasSdkM3
6lxDkczBfCrEjH5p5Y8DU+ge4e4LRtknY9oBOJ7EQO0twYJg3k0=
[end]
_ATEOF


cat >test_hooks.lua <<'_ATEOF'

-- this is the "testing" set of lua hooks for monotone
-- it's intended to support self-tests, not for use in
-- production. just defines some of the std hooks.

function get_passphrase(keyid)
	return keyid
end

function non_blocking_rng_ok()
	return true
end

function get_manifest_cert_trust(signers, id, name, val)
   return true
end

function get_file_cert_trust(signers, id, name, val)
   return true
end

function accept_testresult_change(old_results, new_results)
   for test,res in pairs(old_results)
   do
      if res == true and new_results[test] ~= true
      then
	 return false
      end
   end
   return true
end

function get_author(branchname)
	return "tester@test.net"
end

function ignore_file(name)
	if (strfind(name, "test_hooks.lua")) then return true end
	if (strfind(name, "test.db")) then return true end
	return false
end

if (attr_functions == nil) then
  attr_functions = {}
end
attr_functions["test_attr"] =
  function(filename, value)
    io.write(string.format("test_attr:%s:%s\n", filename, value))
  end

_ATEOF


$at_traceoff
echo "t_cross.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init"
echo t_cross.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cross.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cross.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys"
echo t_cross.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cross.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cross.at:5: rm test_keys"
echo t_cross.at:5 >$at_check_line_file
( $at_traceon; rm test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cross.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



# this test demonstrates a tricky case in which two parties, bob and
# alice, merge a fork, left and right, differently. bob chooses the
# changes in the left node, alice chooses the changes in the right
# node.
#
# the result of merging their merges incorrectly succeeds, considering
# the LCA(bob,alice) as either foo or bar, and thereby seeing one of
# the edges (left->bob or right->alice) as having "no changes", and
# letting the edge "with changes" (right->bob, or left->alice) clobber
# it.
#
# this should be fixed so the merge-of-merges conflicts.

cat >shared.anc <<'_ATEOF'
base version data
_ATEOF

cat >shared.left <<'_ATEOF'
conflicting data on left side
_ATEOF

cat >shared.right <<'_ATEOF'
conflicting data on right side
_ATEOF

cat >specific.left <<'_ATEOF'
non-conflicting mergeable data on left side
_ATEOF

cat >specific.right <<'_ATEOF'
non-conflicting mergeable data on right side
_ATEOF

cat >specific.alice <<'_ATEOF'
non-conflicting mergeable data in bob
_ATEOF

cat >specific.bob <<'_ATEOF'
non-conflicting mergeable data in alice
_ATEOF


# construct ancestor
$at_traceoff
echo "t_cross.at:36: cp shared.anc shared"
echo t_cross.at:36 >$at_check_line_file
( $at_traceon; cp shared.anc shared ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cross.at:36: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cross.at:37: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add shared"
echo t_cross.at:37 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add shared ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cross.at:37: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cross.at:38: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit ancestor"
echo t_cross.at:38 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit ancestor ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cross.at:38: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

ROOT_M_SHA=`sha1sum MT/manifest | cut -d ' ' -f 1`
ROOT_F_SHA=`sha1sum shared | cut -d ' ' -f 1`

# construct left node
$at_traceoff
echo "t_cross.at:43: cp shared.left shared"
echo t_cross.at:43 >$at_check_line_file
( $at_traceon; cp shared.left shared ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cross.at:43: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cross.at:44: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add specific.left"
echo t_cross.at:44 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add specific.left ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cross.at:44: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cross.at:45: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit left"
echo t_cross.at:45 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit left ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cross.at:45: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

LEFT_M_SHA=`sha1sum MT/manifest | cut -d ' ' -f 1`
LEFT_F_SHA=`sha1sum shared | cut -d ' ' -f 1`
$at_traceoff
echo "t_cross.at:48: test \$LEFT_M_SHA != \$ROOT_M_SHA"
echo t_cross.at:48 >$at_check_line_file
( $at_traceon; test $LEFT_M_SHA != $ROOT_M_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cross.at:48: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cross.at:49: test \$LEFT_F_SHA != \$ROOT_F_SHA"
echo t_cross.at:49 >$at_check_line_file
( $at_traceon; test $LEFT_F_SHA != $ROOT_F_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cross.at:49: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# revert to root

$at_traceoff
echo "t_cross.at:52: rm MT/manifest"
echo t_cross.at:52 >$at_check_line_file
( $at_traceon; rm MT/manifest ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cross.at:52: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cross.at:52: rm shared"
echo t_cross.at:52 >$at_check_line_file
( $at_traceon; rm shared ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cross.at:52: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cross.at:52: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout \$ROOT_M_SHA ."
echo t_cross.at:52 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout $ROOT_M_SHA . ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cross.at:52: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

PROBE_M_SHA=`sha1sum MT/manifest | cut -d ' ' -f 1`
PROBE_F_SHA=`sha1sum shared | cut -d ' ' -f 1`
$at_traceoff
echo "t_cross.at:52: test \$PROBE_M_SHA == \$ROOT_M_SHA"
echo t_cross.at:52 >$at_check_line_file
( $at_traceon; test $PROBE_M_SHA == $ROOT_M_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cross.at:52: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cross.at:52: test \$PROBE_F_SHA == \$ROOT_F_SHA"
echo t_cross.at:52 >$at_check_line_file
( $at_traceon; test $PROBE_F_SHA == $ROOT_F_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cross.at:52: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



# construct right node
$at_traceoff
echo "t_cross.at:55: cp shared.right shared"
echo t_cross.at:55 >$at_check_line_file
( $at_traceon; cp shared.right shared ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cross.at:55: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cross.at:56: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add specific.right"
echo t_cross.at:56 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add specific.right ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cross.at:56: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cross.at:57: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit right"
echo t_cross.at:57 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit right ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cross.at:57: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

RIGHT_M_SHA=`sha1sum MT/manifest | cut -d ' ' -f 1`
RIGHT_F_SHA=`sha1sum shared | cut -d ' ' -f 1`
$at_traceoff
echo "t_cross.at:60: test \$RIGHT_M_SHA != \$ROOT_M_SHA"
echo t_cross.at:60 >$at_check_line_file
( $at_traceon; test $RIGHT_M_SHA != $ROOT_M_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cross.at:60: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cross.at:61: test \$RIGHT_F_SHA != \$ROOT_F_SHA"
echo t_cross.at:61 >$at_check_line_file
( $at_traceon; test $RIGHT_F_SHA != $ROOT_F_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cross.at:61: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cross.at:62: test \$RIGHT_M_SHA != \$LEFT_M_SHA"
echo t_cross.at:62 >$at_check_line_file
( $at_traceon; test $RIGHT_M_SHA != $LEFT_M_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cross.at:62: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cross.at:63: test \$RIGHT_F_SHA != \$LEFT_F_SHA"
echo t_cross.at:63 >$at_check_line_file
( $at_traceon; test $RIGHT_F_SHA != $LEFT_F_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cross.at:63: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# construct alice, a derivative of right but with the specific change
# in left, and an ancestor edge to left.
$at_traceoff
echo "t_cross.at:67: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add specific.left"
echo t_cross.at:67 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add specific.left ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cross.at:67: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cross.at:68: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add specific.alice"
echo t_cross.at:68 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add specific.alice ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cross.at:68: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cross.at:69: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit alice"
echo t_cross.at:69 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit alice ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cross.at:69: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

ALICE_M_SHA=`sha1sum MT/manifest | cut -d ' ' -f 1`
$at_traceoff
echo "t_cross.at:71: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net cert manifest \$ALICE_M_SHA ancestor \$LEFT_M_SHA"
echo t_cross.at:71 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net cert manifest $ALICE_M_SHA ancestor $LEFT_M_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cross.at:71: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# revert to left

$at_traceoff
echo "t_cross.at:74: rm MT/manifest"
echo t_cross.at:74 >$at_check_line_file
( $at_traceon; rm MT/manifest ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cross.at:74: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cross.at:74: rm shared"
echo t_cross.at:74 >$at_check_line_file
( $at_traceon; rm shared ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cross.at:74: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cross.at:74: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout \$LEFT_M_SHA ."
echo t_cross.at:74 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout $LEFT_M_SHA . ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cross.at:74: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

PROBE_M_SHA=`sha1sum MT/manifest | cut -d ' ' -f 1`
PROBE_F_SHA=`sha1sum shared | cut -d ' ' -f 1`
$at_traceoff
echo "t_cross.at:74: test \$PROBE_M_SHA == \$LEFT_M_SHA"
echo t_cross.at:74 >$at_check_line_file
( $at_traceon; test $PROBE_M_SHA == $LEFT_M_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cross.at:74: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cross.at:74: test \$PROBE_F_SHA == \$LEFT_F_SHA"
echo t_cross.at:74 >$at_check_line_file
( $at_traceon; test $PROBE_F_SHA == $LEFT_F_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cross.at:74: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_cross.at:75: grep specific.right MT/manifest"
echo t_cross.at:75 >$at_check_line_file
( $at_traceon; grep specific.right MT/manifest ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   1) ;;
   *) echo "t_cross.at:75: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# construct bob, a derivative of left but with the specific change
# in right, and an ancestor edge to right.
$at_traceoff
echo "t_cross.at:79: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add specific.right"
echo t_cross.at:79 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add specific.right ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cross.at:79: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cross.at:80: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add specific.bob"
echo t_cross.at:80 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add specific.bob ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cross.at:80: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cross.at:81: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit bob"
echo t_cross.at:81 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit bob ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cross.at:81: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

BOB_M_SHA=`sha1sum MT/manifest | cut -d ' ' -f 1`
$at_traceoff
echo "t_cross.at:83: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net cert manifest \$BOB_M_SHA ancestor \$RIGHT_M_SHA"
echo t_cross.at:83 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net cert manifest $BOB_M_SHA ancestor $RIGHT_M_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cross.at:83: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# now merge the merges. this *should* fail.
$at_traceoff
echo "t_cross.at:86: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch merge"
echo t_cross.at:86 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch merge ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   1) ;;
   *) echo "t_cross.at:86: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


      $at_traceoff
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  16 ) # 16. t_rename.at:3: renaming a file
    at_setup_line='t_rename.at:3'
    at_desc='renaming a file'
    $at_quiet $ECHO_N " 16: renaming a file                              $ECHO_C"
    at_xfail=no
    (
      echo "16. t_rename.at:3: testing ..."
      $at_traceon




cat >test_keys <<'_ATEOF'
[pubkey tester@test.net]
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCfN/cAMabgb6T7m8ksGnpQ7LO6hOdnc/7V
yivrRGtmpwSItljht1bmgLQF37KiSPoMEDUb1stfKxaMsYiy8iTyoQ+M2EVFP37n2rtnNZ0H
oVcQd2sRsCerQFh9nslRPymlkQXUlOiNFN6RlFNcdjkucqNe+YorFX21EYw7XuT5XwIBEQ==
[end]
[privkey tester@test.net]
npy0jyqbZdylFkMjdR9OvlqmDHuBGXpGFPt94h96aG+Lp+OdBCmWx8GueHk8FKkexwPqhRBM
PPopUeuwqxuSX+yEodMl5IHBmin0nLnbOeBjtasjemBFEmdNl/jPDF/AeQ2WHhanB731dSQc
vzLOQfKAYmfk56PPULi9oJJNUxaCkvsWtvaI+HUHZrjyyV7dA4Vsc6Jvx2Yf1+MdDAEGk/Rw
ZtP0LmuoiyvRDFqBF8aTmnotyb4kRKohnJ7VF+y6hYvmtMpM3TKnpR7EbojBzNPqKuO7nPUz
jGxA7F84O24Vbf128PNSI5vj4istow26aPjn28qPjfRrkV30WLL/dXfYJkfkTqglYnoEXvF/
xZoVxxNeAX58mgy0A1ErVxv8U7TwuP983GHEpLwy3gbiP+9akAJCr8r823DHmQqq5QDELibP
cuXZfOttpfVRkcbMhjeF0M6czc4HoKgHTAnf/18hzdZwGX/WWvRIBHImbUJ+mDbp2ByDTfKf
ErGXSvZ3HxCqBD8yx1SnXhV8IDHaBmV9wwYcN+H2cxOWGZk7g7xJS19+a3UQB3c3sSXQVJBp
6QpCZgysxkZwzuXDzzLZPT9SLZz4K2p7+7BwMbpy9ZxcyAzmiEtpA24UP06jtjFN7WcXAdx/
E5Gmoe9b1EiXWdReHjUGpc6k0LQ0PPXAwqrcGdwYbOLDZ5xsQ5AsEYSFtyTS60D1nHBcdNmW
M0eOUJFdJf/uNe/2EApc3a8TyEkZtVqiYtOVV3qDB9NmU4bVOkDqzl1F7zJwATWbmasSdkM3
6lxDkczBfCrEjH5p5Y8DU+ge4e4LRtknY9oBOJ7EQO0twYJg3k0=
[end]
_ATEOF


cat >test_hooks.lua <<'_ATEOF'

-- this is the "testing" set of lua hooks for monotone
-- it's intended to support self-tests, not for use in
-- production. just defines some of the std hooks.

function get_passphrase(keyid)
	return keyid
end

function non_blocking_rng_ok()
	return true
end

function get_manifest_cert_trust(signers, id, name, val)
   return true
end

function get_file_cert_trust(signers, id, name, val)
   return true
end

function accept_testresult_change(old_results, new_results)
   for test,res in pairs(old_results)
   do
      if res == true and new_results[test] ~= true
      then
	 return false
      end
   end
   return true
end

function get_author(branchname)
	return "tester@test.net"
end

function ignore_file(name)
	if (strfind(name, "test_hooks.lua")) then return true end
	if (strfind(name, "test.db")) then return true end
	return false
end

if (attr_functions == nil) then
  attr_functions = {}
end
attr_functions["test_attr"] =
  function(filename, value)
    io.write(string.format("test_attr:%s:%s\n", filename, value))
  end

_ATEOF


$at_traceoff
echo "t_rename.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init"
echo t_rename.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_rename.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys"
echo t_rename.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_rename.at:5: rm test_keys"
echo t_rename.at:5 >$at_check_line_file
( $at_traceon; rm test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



cat >foo <<'_ATEOF'
foo file
_ATEOF

cat >bleh <<'_ATEOF'
bleh file
_ATEOF


# produce root
$at_traceoff
echo "t_rename.at:13: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add foo"
echo t_rename.at:13 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add foo ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename.at:13: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_rename.at:14: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit blah-blah"
echo t_rename.at:14 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit blah-blah ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename.at:14: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

ROOT_M_SHA=`sha1sum MT/manifest | cut -d ' ' -f 1`
ROOT_F_SHA=`sha1sum foo | cut -d ' ' -f 1`

# produce move edge
$at_traceoff
echo "t_rename.at:19: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net rename foo bar"
echo t_rename.at:19 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net rename foo bar ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename.at:19: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_rename.at:20: cp foo bar"
echo t_rename.at:20 >$at_check_line_file
( $at_traceon; cp foo bar ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename.at:20: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_rename.at:21: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit blah-blah"
echo t_rename.at:21 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit blah-blah ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename.at:21: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# revert to root

$at_traceoff
echo "t_rename.at:24: rm MT/manifest"
echo t_rename.at:24 >$at_check_line_file
( $at_traceon; rm MT/manifest ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename.at:24: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_rename.at:24: rm foo"
echo t_rename.at:24 >$at_check_line_file
( $at_traceon; rm foo ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename.at:24: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_rename.at:24: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout \$ROOT_M_SHA ."
echo t_rename.at:24 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout $ROOT_M_SHA . ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename.at:24: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

PROBE_M_SHA=`sha1sum MT/manifest | cut -d ' ' -f 1`
PROBE_F_SHA=`sha1sum foo | cut -d ' ' -f 1`
$at_traceoff
echo "t_rename.at:24: test \$PROBE_M_SHA == \$ROOT_M_SHA"
echo t_rename.at:24 >$at_check_line_file
( $at_traceon; test $PROBE_M_SHA == $ROOT_M_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename.at:24: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_rename.at:24: test \$PROBE_F_SHA == \$ROOT_F_SHA"
echo t_rename.at:24 >$at_check_line_file
( $at_traceon; test $PROBE_F_SHA == $ROOT_F_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename.at:24: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_rename.at:25: rm bar"
echo t_rename.at:25 >$at_check_line_file
( $at_traceon; rm bar ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename.at:25: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# make a simple add edge
$at_traceoff
echo "t_rename.at:28: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add bleh"
echo t_rename.at:28 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add bleh ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename.at:28: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_rename.at:29: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit blah-blah"
echo t_rename.at:29 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit blah-blah ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename.at:29: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# merge the add and the rename
$at_traceoff
echo "t_rename.at:32: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net merge"
echo t_rename.at:32 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net merge ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename.at:32: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_rename.at:33: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net update"
echo t_rename.at:33 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net update ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename.at:33: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_rename.at:34: grep bar MT/manifest"
echo t_rename.at:34 >$at_check_line_file
( $at_traceon; grep bar MT/manifest ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename.at:34: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_rename.at:35: grep bleh MT/manifest"
echo t_rename.at:35 >$at_check_line_file
( $at_traceon; grep bleh MT/manifest ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename.at:35: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_rename.at:36: grep foo MT/manifest"
echo t_rename.at:36 >$at_check_line_file
( $at_traceon; grep foo MT/manifest ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   1) ;;
   *) echo "t_rename.at:36: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_rename.at:37: rm bar"
echo t_rename.at:37 >$at_check_line_file
( $at_traceon; rm bar ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename.at:37: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# rename a rename target
$at_traceoff
echo "t_rename.at:40: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net rename bleh blah"
echo t_rename.at:40 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net rename bleh blah ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename.at:40: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_rename.at:41: grep bleh MT/work"
echo t_rename.at:41 >$at_check_line_file
( $at_traceon; grep bleh MT/work ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename.at:41: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_rename.at:42: grep blah MT/work"
echo t_rename.at:42 >$at_check_line_file
( $at_traceon; grep blah MT/work ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename.at:42: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_rename.at:43: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net rename blah blyh"
echo t_rename.at:43 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net rename blah blyh ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename.at:43: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_rename.at:44: grep bleh MT/work"
echo t_rename.at:44 >$at_check_line_file
( $at_traceon; grep bleh MT/work ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename.at:44: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_rename.at:45: grep blah MT/work"
echo t_rename.at:45 >$at_check_line_file
( $at_traceon; grep blah MT/work ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   1) ;;
   *) echo "t_rename.at:45: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_rename.at:46: grep blyh MT/work"
echo t_rename.at:46 >$at_check_line_file
( $at_traceon; grep blyh MT/work ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename.at:46: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# undo a rename
$at_traceoff
echo "t_rename.at:49: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net rename blyh bleh"
echo t_rename.at:49 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net rename blyh bleh ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename.at:49: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_rename.at:50: test -f MT/work"
echo t_rename.at:50 >$at_check_line_file
( $at_traceon; test -f MT/work ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   1) ;;
   *) echo "t_rename.at:50: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


      $at_traceoff
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  17 ) # 17. t_renamed.at:3: renaming a directory
    at_setup_line='t_renamed.at:3'
    at_desc='renaming a directory'
    $at_quiet $ECHO_N " 17: renaming a directory                         $ECHO_C"
    at_xfail=no
    (
      echo "17. t_renamed.at:3: testing ..."
      $at_traceon




cat >test_keys <<'_ATEOF'
[pubkey tester@test.net]
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCfN/cAMabgb6T7m8ksGnpQ7LO6hOdnc/7V
yivrRGtmpwSItljht1bmgLQF37KiSPoMEDUb1stfKxaMsYiy8iTyoQ+M2EVFP37n2rtnNZ0H
oVcQd2sRsCerQFh9nslRPymlkQXUlOiNFN6RlFNcdjkucqNe+YorFX21EYw7XuT5XwIBEQ==
[end]
[privkey tester@test.net]
npy0jyqbZdylFkMjdR9OvlqmDHuBGXpGFPt94h96aG+Lp+OdBCmWx8GueHk8FKkexwPqhRBM
PPopUeuwqxuSX+yEodMl5IHBmin0nLnbOeBjtasjemBFEmdNl/jPDF/AeQ2WHhanB731dSQc
vzLOQfKAYmfk56PPULi9oJJNUxaCkvsWtvaI+HUHZrjyyV7dA4Vsc6Jvx2Yf1+MdDAEGk/Rw
ZtP0LmuoiyvRDFqBF8aTmnotyb4kRKohnJ7VF+y6hYvmtMpM3TKnpR7EbojBzNPqKuO7nPUz
jGxA7F84O24Vbf128PNSI5vj4istow26aPjn28qPjfRrkV30WLL/dXfYJkfkTqglYnoEXvF/
xZoVxxNeAX58mgy0A1ErVxv8U7TwuP983GHEpLwy3gbiP+9akAJCr8r823DHmQqq5QDELibP
cuXZfOttpfVRkcbMhjeF0M6czc4HoKgHTAnf/18hzdZwGX/WWvRIBHImbUJ+mDbp2ByDTfKf
ErGXSvZ3HxCqBD8yx1SnXhV8IDHaBmV9wwYcN+H2cxOWGZk7g7xJS19+a3UQB3c3sSXQVJBp
6QpCZgysxkZwzuXDzzLZPT9SLZz4K2p7+7BwMbpy9ZxcyAzmiEtpA24UP06jtjFN7WcXAdx/
E5Gmoe9b1EiXWdReHjUGpc6k0LQ0PPXAwqrcGdwYbOLDZ5xsQ5AsEYSFtyTS60D1nHBcdNmW
M0eOUJFdJf/uNe/2EApc3a8TyEkZtVqiYtOVV3qDB9NmU4bVOkDqzl1F7zJwATWbmasSdkM3
6lxDkczBfCrEjH5p5Y8DU+ge4e4LRtknY9oBOJ7EQO0twYJg3k0=
[end]
_ATEOF


cat >test_hooks.lua <<'_ATEOF'

-- this is the "testing" set of lua hooks for monotone
-- it's intended to support self-tests, not for use in
-- production. just defines some of the std hooks.

function get_passphrase(keyid)
	return keyid
end

function non_blocking_rng_ok()
	return true
end

function get_manifest_cert_trust(signers, id, name, val)
   return true
end

function get_file_cert_trust(signers, id, name, val)
   return true
end

function accept_testresult_change(old_results, new_results)
   for test,res in pairs(old_results)
   do
      if res == true and new_results[test] ~= true
      then
	 return false
      end
   end
   return true
end

function get_author(branchname)
	return "tester@test.net"
end

function ignore_file(name)
	if (strfind(name, "test_hooks.lua")) then return true end
	if (strfind(name, "test.db")) then return true end
	return false
end

if (attr_functions == nil) then
  attr_functions = {}
end
attr_functions["test_attr"] =
  function(filename, value)
    io.write(string.format("test_attr:%s:%s\n", filename, value))
  end

_ATEOF


$at_traceoff
echo "t_renamed.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init"
echo t_renamed.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_renamed.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_renamed.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys"
echo t_renamed.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_renamed.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_renamed.at:5: rm test_keys"
echo t_renamed.at:5 >$at_check_line_file
( $at_traceon; rm test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_renamed.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_renamed.at:7: mkdir foo"
echo t_renamed.at:7 >$at_check_line_file
( $at_traceon; mkdir foo ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_renamed.at:7: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


cat >foo/foo <<'_ATEOF'
foo file
_ATEOF

cat >bleh <<'_ATEOF'
bleh file
_ATEOF


# produce root
$at_traceoff
echo "t_renamed.at:15: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add foo"
echo t_renamed.at:15 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add foo ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_renamed.at:15: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_renamed.at:16: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit blah-blah"
echo t_renamed.at:16 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit blah-blah ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_renamed.at:16: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

ROOT_M_SHA=`sha1sum MT/manifest | cut -d ' ' -f 1`
ROOT_F_SHA=`sha1sum foo/foo | cut -d ' ' -f 1`

# produce move edge
$at_traceoff
echo "t_renamed.at:21: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net rename foo bar"
echo t_renamed.at:21 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net rename foo bar ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_renamed.at:21: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_renamed.at:22: cp -ar foo bar"
echo t_renamed.at:22 >$at_check_line_file
( $at_traceon; cp -ar foo bar ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_renamed.at:22: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_renamed.at:23: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit blah-blah"
echo t_renamed.at:23 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit blah-blah ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_renamed.at:23: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# revert to root

$at_traceoff
echo "t_renamed.at:26: rm MT/manifest"
echo t_renamed.at:26 >$at_check_line_file
( $at_traceon; rm MT/manifest ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_renamed.at:26: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_renamed.at:26: rm foo/foo"
echo t_renamed.at:26 >$at_check_line_file
( $at_traceon; rm foo/foo ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_renamed.at:26: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_renamed.at:26: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout \$ROOT_M_SHA ."
echo t_renamed.at:26 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout $ROOT_M_SHA . ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_renamed.at:26: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

PROBE_M_SHA=`sha1sum MT/manifest | cut -d ' ' -f 1`
PROBE_F_SHA=`sha1sum foo/foo | cut -d ' ' -f 1`
$at_traceoff
echo "t_renamed.at:26: test \$PROBE_M_SHA == \$ROOT_M_SHA"
echo t_renamed.at:26 >$at_check_line_file
( $at_traceon; test $PROBE_M_SHA == $ROOT_M_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_renamed.at:26: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_renamed.at:26: test \$PROBE_F_SHA == \$ROOT_F_SHA"
echo t_renamed.at:26 >$at_check_line_file
( $at_traceon; test $PROBE_F_SHA == $ROOT_F_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_renamed.at:26: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_renamed.at:27: rm -Rf bar"
echo t_renamed.at:27 >$at_check_line_file
( $at_traceon; rm -Rf bar ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_renamed.at:27: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# make an add *into the directory*
cat >foo/bar <<'_ATEOF'
bar file
_ATEOF

$at_traceoff
echo "t_renamed.at:32: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add foo/bar"
echo t_renamed.at:32 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add foo/bar ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_renamed.at:32: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_renamed.at:33: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit blah-blah"
echo t_renamed.at:33 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit blah-blah ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_renamed.at:33: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# merge the add and the rename
$at_traceoff
echo "t_renamed.at:36: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net merge"
echo t_renamed.at:36 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net merge ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_renamed.at:36: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_renamed.at:37: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net update"
echo t_renamed.at:37 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net update ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_renamed.at:37: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_renamed.at:38: grep bar/bar MT/manifest"
echo t_renamed.at:38 >$at_check_line_file
( $at_traceon; grep bar/bar MT/manifest ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_renamed.at:38: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_renamed.at:39: grep bar/foo MT/manifest"
echo t_renamed.at:39 >$at_check_line_file
( $at_traceon; grep bar/foo MT/manifest ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_renamed.at:39: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_renamed.at:40: grep foo/bar MT/manifest"
echo t_renamed.at:40 >$at_check_line_file
( $at_traceon; grep foo/bar MT/manifest ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   1) ;;
   *) echo "t_renamed.at:40: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_renamed.at:41: grep foo/foo MT/manifest"
echo t_renamed.at:41 >$at_check_line_file
( $at_traceon; grep foo/foo MT/manifest ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   1) ;;
   *) echo "t_renamed.at:41: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_renamed.at:42: test -e bar/bar"
echo t_renamed.at:42 >$at_check_line_file
( $at_traceon; test -e bar/bar ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_renamed.at:42: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_renamed.at:43: test -e bar/foo"
echo t_renamed.at:43 >$at_check_line_file
( $at_traceon; test -e bar/foo ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_renamed.at:43: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


      $at_traceoff
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  18 ) # 18. t_erename.at:3: renaming and editing a file
    at_setup_line='t_erename.at:3'
    at_desc='renaming and editing a file'
    $at_quiet $ECHO_N " 18: renaming and editing a file                  $ECHO_C"
    at_xfail=no
    (
      echo "18. t_erename.at:3: testing ..."
      $at_traceon




cat >test_keys <<'_ATEOF'
[pubkey tester@test.net]
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCfN/cAMabgb6T7m8ksGnpQ7LO6hOdnc/7V
yivrRGtmpwSItljht1bmgLQF37KiSPoMEDUb1stfKxaMsYiy8iTyoQ+M2EVFP37n2rtnNZ0H
oVcQd2sRsCerQFh9nslRPymlkQXUlOiNFN6RlFNcdjkucqNe+YorFX21EYw7XuT5XwIBEQ==
[end]
[privkey tester@test.net]
npy0jyqbZdylFkMjdR9OvlqmDHuBGXpGFPt94h96aG+Lp+OdBCmWx8GueHk8FKkexwPqhRBM
PPopUeuwqxuSX+yEodMl5IHBmin0nLnbOeBjtasjemBFEmdNl/jPDF/AeQ2WHhanB731dSQc
vzLOQfKAYmfk56PPULi9oJJNUxaCkvsWtvaI+HUHZrjyyV7dA4Vsc6Jvx2Yf1+MdDAEGk/Rw
ZtP0LmuoiyvRDFqBF8aTmnotyb4kRKohnJ7VF+y6hYvmtMpM3TKnpR7EbojBzNPqKuO7nPUz
jGxA7F84O24Vbf128PNSI5vj4istow26aPjn28qPjfRrkV30WLL/dXfYJkfkTqglYnoEXvF/
xZoVxxNeAX58mgy0A1ErVxv8U7TwuP983GHEpLwy3gbiP+9akAJCr8r823DHmQqq5QDELibP
cuXZfOttpfVRkcbMhjeF0M6czc4HoKgHTAnf/18hzdZwGX/WWvRIBHImbUJ+mDbp2ByDTfKf
ErGXSvZ3HxCqBD8yx1SnXhV8IDHaBmV9wwYcN+H2cxOWGZk7g7xJS19+a3UQB3c3sSXQVJBp
6QpCZgysxkZwzuXDzzLZPT9SLZz4K2p7+7BwMbpy9ZxcyAzmiEtpA24UP06jtjFN7WcXAdx/
E5Gmoe9b1EiXWdReHjUGpc6k0LQ0PPXAwqrcGdwYbOLDZ5xsQ5AsEYSFtyTS60D1nHBcdNmW
M0eOUJFdJf/uNe/2EApc3a8TyEkZtVqiYtOVV3qDB9NmU4bVOkDqzl1F7zJwATWbmasSdkM3
6lxDkczBfCrEjH5p5Y8DU+ge4e4LRtknY9oBOJ7EQO0twYJg3k0=
[end]
_ATEOF


cat >test_hooks.lua <<'_ATEOF'

-- this is the "testing" set of lua hooks for monotone
-- it's intended to support self-tests, not for use in
-- production. just defines some of the std hooks.

function get_passphrase(keyid)
	return keyid
end

function non_blocking_rng_ok()
	return true
end

function get_manifest_cert_trust(signers, id, name, val)
   return true
end

function get_file_cert_trust(signers, id, name, val)
   return true
end

function accept_testresult_change(old_results, new_results)
   for test,res in pairs(old_results)
   do
      if res == true and new_results[test] ~= true
      then
	 return false
      end
   end
   return true
end

function get_author(branchname)
	return "tester@test.net"
end

function ignore_file(name)
	if (strfind(name, "test_hooks.lua")) then return true end
	if (strfind(name, "test.db")) then return true end
	return false
end

if (attr_functions == nil) then
  attr_functions = {}
end
attr_functions["test_attr"] =
  function(filename, value)
    io.write(string.format("test_attr:%s:%s\n", filename, value))
  end

_ATEOF


$at_traceoff
echo "t_erename.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init"
echo t_erename.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_erename.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_erename.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys"
echo t_erename.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_erename.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_erename.at:5: rm test_keys"
echo t_erename.at:5 >$at_check_line_file
( $at_traceon; rm test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_erename.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



cat >foo1 <<'_ATEOF'
foo file 1
_ATEOF

cat >foo2 <<'_ATEOF'
foo file 2
_ATEOF

cat >bar1 <<'_ATEOF'
bar file 1
_ATEOF

cat >bar2 <<'_ATEOF'
bar file 2
_ATEOF

cat >bleh <<'_ATEOF'
bleh file
_ATEOF


# produce root
$at_traceoff
echo "t_erename.at:19: cp foo1 foo"
echo t_erename.at:19 >$at_check_line_file
( $at_traceon; cp foo1 foo ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_erename.at:19: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_erename.at:20: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add foo"
echo t_erename.at:20 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add foo ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_erename.at:20: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_erename.at:21: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit root"
echo t_erename.at:21 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit root ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_erename.at:21: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

ROOT_M_SHA=`sha1sum MT/manifest | cut -d ' ' -f 1`
ROOT_F_SHA=`sha1sum foo | cut -d ' ' -f 1`

# produce 4-step path with move in the middle
$at_traceoff
echo "t_erename.at:26: cp foo2 foo"
echo t_erename.at:26 >$at_check_line_file
( $at_traceon; cp foo2 foo ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_erename.at:26: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_erename.at:27: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit edit-foo"
echo t_erename.at:27 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit edit-foo ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_erename.at:27: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_erename.at:28: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net rename foo bar"
echo t_erename.at:28 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net rename foo bar ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_erename.at:28: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_erename.at:29: cp bar1 bar"
echo t_erename.at:29 >$at_check_line_file
( $at_traceon; cp bar1 bar ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_erename.at:29: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_erename.at:30: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit rename-to-bar"
echo t_erename.at:30 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit rename-to-bar ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_erename.at:30: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_erename.at:31: cp bar2 bar"
echo t_erename.at:31 >$at_check_line_file
( $at_traceon; cp bar2 bar ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_erename.at:31: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_erename.at:32: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit edit-bar"
echo t_erename.at:32 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit edit-bar ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_erename.at:32: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# revert to root

$at_traceoff
echo "t_erename.at:35: rm MT/manifest"
echo t_erename.at:35 >$at_check_line_file
( $at_traceon; rm MT/manifest ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_erename.at:35: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_erename.at:35: rm foo"
echo t_erename.at:35 >$at_check_line_file
( $at_traceon; rm foo ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_erename.at:35: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_erename.at:35: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout \$ROOT_M_SHA ."
echo t_erename.at:35 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout $ROOT_M_SHA . ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_erename.at:35: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

PROBE_M_SHA=`sha1sum MT/manifest | cut -d ' ' -f 1`
PROBE_F_SHA=`sha1sum foo | cut -d ' ' -f 1`
$at_traceoff
echo "t_erename.at:35: test \$PROBE_M_SHA == \$ROOT_M_SHA"
echo t_erename.at:35 >$at_check_line_file
( $at_traceon; test $PROBE_M_SHA == $ROOT_M_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_erename.at:35: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_erename.at:35: test \$PROBE_F_SHA == \$ROOT_F_SHA"
echo t_erename.at:35 >$at_check_line_file
( $at_traceon; test $PROBE_F_SHA == $ROOT_F_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_erename.at:35: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_erename.at:36: rm bar"
echo t_erename.at:36 >$at_check_line_file
( $at_traceon; rm bar ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_erename.at:36: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# make a simple add edge
$at_traceoff
echo "t_erename.at:39: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add bleh"
echo t_erename.at:39 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add bleh ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_erename.at:39: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_erename.at:40: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit blah-blah"
echo t_erename.at:40 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit blah-blah ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_erename.at:40: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# merge the add and the rename
$at_traceoff
echo "t_erename.at:43: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net merge"
echo t_erename.at:43 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net merge ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_erename.at:43: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_erename.at:44: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net update"
echo t_erename.at:44 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net update ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_erename.at:44: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_erename.at:45: grep bar MT/manifest"
echo t_erename.at:45 >$at_check_line_file
( $at_traceon; grep bar MT/manifest ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_erename.at:45: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_erename.at:46: grep bleh MT/manifest"
echo t_erename.at:46 >$at_check_line_file
( $at_traceon; grep bleh MT/manifest ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_erename.at:46: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_erename.at:47: grep foo MT/manifest"
echo t_erename.at:47 >$at_check_line_file
( $at_traceon; grep foo MT/manifest ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   1) ;;
   *) echo "t_erename.at:47: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# now the moment of truth: do we *think* there was a rename?
$at_traceoff
echo "t_erename.at:50: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net diff \$ROOT_M_SHA"
echo t_erename.at:50 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net diff $ROOT_M_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_erename.at:50: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_erename.at:51: grep move stdout"
echo t_erename.at:51 >$at_check_line_file
( $at_traceon; grep move stdout ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_erename.at:51: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_erename.at:53: rm bar"
echo t_erename.at:53 >$at_check_line_file
( $at_traceon; rm bar ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_erename.at:53: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


      $at_traceoff
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  19 ) # 19. t_cvsimport.at:3: importing CVS files
    at_setup_line='t_cvsimport.at:3'
    at_desc='importing CVS files'
    $at_quiet $ECHO_N " 19: importing CVS files                          $ECHO_C"
    at_xfail=no
    (
      echo "19. t_cvsimport.at:3: testing ..."
      $at_traceon




cat >test_keys <<'_ATEOF'
[pubkey tester@test.net]
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCfN/cAMabgb6T7m8ksGnpQ7LO6hOdnc/7V
yivrRGtmpwSItljht1bmgLQF37KiSPoMEDUb1stfKxaMsYiy8iTyoQ+M2EVFP37n2rtnNZ0H
oVcQd2sRsCerQFh9nslRPymlkQXUlOiNFN6RlFNcdjkucqNe+YorFX21EYw7XuT5XwIBEQ==
[end]
[privkey tester@test.net]
npy0jyqbZdylFkMjdR9OvlqmDHuBGXpGFPt94h96aG+Lp+OdBCmWx8GueHk8FKkexwPqhRBM
PPopUeuwqxuSX+yEodMl5IHBmin0nLnbOeBjtasjemBFEmdNl/jPDF/AeQ2WHhanB731dSQc
vzLOQfKAYmfk56PPULi9oJJNUxaCkvsWtvaI+HUHZrjyyV7dA4Vsc6Jvx2Yf1+MdDAEGk/Rw
ZtP0LmuoiyvRDFqBF8aTmnotyb4kRKohnJ7VF+y6hYvmtMpM3TKnpR7EbojBzNPqKuO7nPUz
jGxA7F84O24Vbf128PNSI5vj4istow26aPjn28qPjfRrkV30WLL/dXfYJkfkTqglYnoEXvF/
xZoVxxNeAX58mgy0A1ErVxv8U7TwuP983GHEpLwy3gbiP+9akAJCr8r823DHmQqq5QDELibP
cuXZfOttpfVRkcbMhjeF0M6czc4HoKgHTAnf/18hzdZwGX/WWvRIBHImbUJ+mDbp2ByDTfKf
ErGXSvZ3HxCqBD8yx1SnXhV8IDHaBmV9wwYcN+H2cxOWGZk7g7xJS19+a3UQB3c3sSXQVJBp
6QpCZgysxkZwzuXDzzLZPT9SLZz4K2p7+7BwMbpy9ZxcyAzmiEtpA24UP06jtjFN7WcXAdx/
E5Gmoe9b1EiXWdReHjUGpc6k0LQ0PPXAwqrcGdwYbOLDZ5xsQ5AsEYSFtyTS60D1nHBcdNmW
M0eOUJFdJf/uNe/2EApc3a8TyEkZtVqiYtOVV3qDB9NmU4bVOkDqzl1F7zJwATWbmasSdkM3
6lxDkczBfCrEjH5p5Y8DU+ge4e4LRtknY9oBOJ7EQO0twYJg3k0=
[end]
_ATEOF


cat >test_hooks.lua <<'_ATEOF'

-- this is the "testing" set of lua hooks for monotone
-- it's intended to support self-tests, not for use in
-- production. just defines some of the std hooks.

function get_passphrase(keyid)
	return keyid
end

function non_blocking_rng_ok()
	return true
end

function get_manifest_cert_trust(signers, id, name, val)
   return true
end

function get_file_cert_trust(signers, id, name, val)
   return true
end

function accept_testresult_change(old_results, new_results)
   for test,res in pairs(old_results)
   do
      if res == true and new_results[test] ~= true
      then
	 return false
      end
   end
   return true
end

function get_author(branchname)
	return "tester@test.net"
end

function ignore_file(name)
	if (strfind(name, "test_hooks.lua")) then return true end
	if (strfind(name, "test.db")) then return true end
	return false
end

if (attr_functions == nil) then
  attr_functions = {}
end
attr_functions["test_attr"] =
  function(filename, value)
    io.write(string.format("test_attr:%s:%s\n", filename, value))
  end

_ATEOF


$at_traceoff
echo "t_cvsimport.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init"
echo t_cvsimport.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cvsimport.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cvsimport.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys"
echo t_cvsimport.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cvsimport.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cvsimport.at:5: rm test_keys"
echo t_cvsimport.at:5 >$at_check_line_file
( $at_traceon; rm test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cvsimport.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



cat >importme.0 <<'_ATEOF'
version 0 of test file
_ATEOF


cat >importme.1 <<'_ATEOF'
version 1 of test file
_ATEOF


cat >importme.2 <<'_ATEOF'
version 2 of test file
_ATEOF


cat >importme.3 <<'_ATEOF'
version 3 of test file
_ATEOF


TSHA0=`sha1sum importme.0 | cut -d ' ' -f 1`
TSHA1=`sha1sum importme.1 | cut -d ' ' -f 1`
TSHA2=`sha1sum importme.2 | cut -d ' ' -f 1`
TSHA3=`sha1sum importme.3 | cut -d ' ' -f 1`

# build the cvs repository

CVSROOT=`pwd`/cvs-repository
$at_traceoff
echo "t_cvsimport.at:27: cvs -q -d \$CVSROOT init"
echo t_cvsimport.at:27 >$at_check_line_file
( $at_traceon; cvs -q -d $CVSROOT init ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cvsimport.at:27: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cvsimport.at:28: test -e \$CVSROOT"
echo t_cvsimport.at:28 >$at_check_line_file
( $at_traceon; test -e $CVSROOT ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cvsimport.at:28: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cvsimport.at:29: test -e \$CVSROOT/CVSROOT"
echo t_cvsimport.at:29 >$at_check_line_file
( $at_traceon; test -e $CVSROOT/CVSROOT ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cvsimport.at:29: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cvsimport.at:30: test -e \$CVSROOT/CVSROOT/history"
echo t_cvsimport.at:30 >$at_check_line_file
( $at_traceon; test -e $CVSROOT/CVSROOT/history ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cvsimport.at:30: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# check out the working copy and make some commits

$at_traceoff
echo "t_cvsimport.at:34: cvs -d \$CVSROOT co ."
echo t_cvsimport.at:34 >$at_check_line_file
( $at_traceon; cvs -d $CVSROOT co . ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cvsimport.at:34: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cvsimport.at:35: mkdir testdir"
echo t_cvsimport.at:35 >$at_check_line_file
( $at_traceon; mkdir testdir ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cvsimport.at:35: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cvsimport.at:36: cp importme.0 testdir/importme"
echo t_cvsimport.at:36 >$at_check_line_file
( $at_traceon; cp importme.0 testdir/importme ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cvsimport.at:36: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cvsimport.at:37: cvs -d \$CVSROOT add testdir"
echo t_cvsimport.at:37 >$at_check_line_file
( $at_traceon; cvs -d $CVSROOT add testdir ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cvsimport.at:37: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cvsimport.at:38: cvs -d \$CVSROOT add testdir/importme"
echo t_cvsimport.at:38 >$at_check_line_file
( $at_traceon; cvs -d $CVSROOT add testdir/importme ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cvsimport.at:38: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cvsimport.at:39: cvs -d \$CVSROOT commit -m 'commit 0' testdir/importme"
echo t_cvsimport.at:39 >$at_check_line_file
( $at_traceon; cvs -d $CVSROOT commit -m 'commit 0' testdir/importme ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cvsimport.at:39: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cvsimport.at:40: cp importme.1 testdir/importme"
echo t_cvsimport.at:40 >$at_check_line_file
( $at_traceon; cp importme.1 testdir/importme ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cvsimport.at:40: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cvsimport.at:41: cvs -d \$CVSROOT commit -m 'commit 1' testdir/importme"
echo t_cvsimport.at:41 >$at_check_line_file
( $at_traceon; cvs -d $CVSROOT commit -m 'commit 1' testdir/importme ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cvsimport.at:41: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cvsimport.at:42: cp importme.2 testdir/importme"
echo t_cvsimport.at:42 >$at_check_line_file
( $at_traceon; cp importme.2 testdir/importme ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cvsimport.at:42: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cvsimport.at:43: cvs -d \$CVSROOT commit -m 'commit 2' testdir/importme"
echo t_cvsimport.at:43 >$at_check_line_file
( $at_traceon; cvs -d $CVSROOT commit -m 'commit 2' testdir/importme ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cvsimport.at:43: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cvsimport.at:44: cp importme.3 testdir/importme"
echo t_cvsimport.at:44 >$at_check_line_file
( $at_traceon; cp importme.3 testdir/importme ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cvsimport.at:44: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cvsimport.at:45: cvs -d \$CVSROOT commit -m 'commit 3' testdir/importme"
echo t_cvsimport.at:45 >$at_check_line_file
( $at_traceon; cvs -d $CVSROOT commit -m 'commit 3' testdir/importme ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cvsimport.at:45: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# import into monotone and check presence of files

$at_traceoff
echo "t_cvsimport.at:49: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch cvs_import \$CVSROOT/testdir"
echo t_cvsimport.at:49 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch cvs_import $CVSROOT/testdir ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cvsimport.at:49: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cvsimport.at:50: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net cat file \$TSHA0"
echo t_cvsimport.at:50 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net cat file $TSHA0 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cvsimport.at:50: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cvsimport.at:51: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net cat file \$TSHA1"
echo t_cvsimport.at:51 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net cat file $TSHA1 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cvsimport.at:51: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cvsimport.at:52: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net cat file \$TSHA2"
echo t_cvsimport.at:52 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net cat file $TSHA2 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cvsimport.at:52: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cvsimport.at:53: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net cat file \$TSHA3"
echo t_cvsimport.at:53 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net cat file $TSHA3 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cvsimport.at:53: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


      $at_traceoff
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  20 ) # 20. t_i18n_file.at:3: importing files with non-english names
    at_setup_line='t_i18n_file.at:3'
    at_desc='importing files with non-english names'
    $at_quiet $ECHO_N " 20: importing files with non-english names       $ECHO_C"
    at_xfail=no
    (
      echo "20. t_i18n_file.at:3: testing ..."
      $at_traceon




cat >test_keys <<'_ATEOF'
[pubkey tester@test.net]
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCfN/cAMabgb6T7m8ksGnpQ7LO6hOdnc/7V
yivrRGtmpwSItljht1bmgLQF37KiSPoMEDUb1stfKxaMsYiy8iTyoQ+M2EVFP37n2rtnNZ0H
oVcQd2sRsCerQFh9nslRPymlkQXUlOiNFN6RlFNcdjkucqNe+YorFX21EYw7XuT5XwIBEQ==
[end]
[privkey tester@test.net]
npy0jyqbZdylFkMjdR9OvlqmDHuBGXpGFPt94h96aG+Lp+OdBCmWx8GueHk8FKkexwPqhRBM
PPopUeuwqxuSX+yEodMl5IHBmin0nLnbOeBjtasjemBFEmdNl/jPDF/AeQ2WHhanB731dSQc
vzLOQfKAYmfk56PPULi9oJJNUxaCkvsWtvaI+HUHZrjyyV7dA4Vsc6Jvx2Yf1+MdDAEGk/Rw
ZtP0LmuoiyvRDFqBF8aTmnotyb4kRKohnJ7VF+y6hYvmtMpM3TKnpR7EbojBzNPqKuO7nPUz
jGxA7F84O24Vbf128PNSI5vj4istow26aPjn28qPjfRrkV30WLL/dXfYJkfkTqglYnoEXvF/
xZoVxxNeAX58mgy0A1ErVxv8U7TwuP983GHEpLwy3gbiP+9akAJCr8r823DHmQqq5QDELibP
cuXZfOttpfVRkcbMhjeF0M6czc4HoKgHTAnf/18hzdZwGX/WWvRIBHImbUJ+mDbp2ByDTfKf
ErGXSvZ3HxCqBD8yx1SnXhV8IDHaBmV9wwYcN+H2cxOWGZk7g7xJS19+a3UQB3c3sSXQVJBp
6QpCZgysxkZwzuXDzzLZPT9SLZz4K2p7+7BwMbpy9ZxcyAzmiEtpA24UP06jtjFN7WcXAdx/
E5Gmoe9b1EiXWdReHjUGpc6k0LQ0PPXAwqrcGdwYbOLDZ5xsQ5AsEYSFtyTS60D1nHBcdNmW
M0eOUJFdJf/uNe/2EApc3a8TyEkZtVqiYtOVV3qDB9NmU4bVOkDqzl1F7zJwATWbmasSdkM3
6lxDkczBfCrEjH5p5Y8DU+ge4e4LRtknY9oBOJ7EQO0twYJg3k0=
[end]
_ATEOF


cat >test_hooks.lua <<'_ATEOF'

-- this is the "testing" set of lua hooks for monotone
-- it's intended to support self-tests, not for use in
-- production. just defines some of the std hooks.

function get_passphrase(keyid)
	return keyid
end

function non_blocking_rng_ok()
	return true
end

function get_manifest_cert_trust(signers, id, name, val)
   return true
end

function get_file_cert_trust(signers, id, name, val)
   return true
end

function accept_testresult_change(old_results, new_results)
   for test,res in pairs(old_results)
   do
      if res == true and new_results[test] ~= true
      then
	 return false
      end
   end
   return true
end

function get_author(branchname)
	return "tester@test.net"
end

function ignore_file(name)
	if (strfind(name, "test_hooks.lua")) then return true end
	if (strfind(name, "test.db")) then return true end
	return false
end

if (attr_functions == nil) then
  attr_functions = {}
end
attr_functions["test_attr"] =
  function(filename, value)
    io.write(string.format("test_attr:%s:%s\n", filename, value))
  end

_ATEOF


$at_traceoff
echo "t_i18n_file.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init"
echo t_i18n_file.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_i18n_file.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_i18n_file.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys"
echo t_i18n_file.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_i18n_file.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_i18n_file.at:5: rm test_keys"
echo t_i18n_file.at:5 >$at_check_line_file
( $at_traceon; rm test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_i18n_file.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



EUROPEAN_UTF8=`printf "\xC3\xB6\xC3\xA4\xC3\xBc\xC3\x9F"`
EUROPEAN_8859_1=`printf "\xF6\xE4\xFC\xDF"`

JAPANESE_UTF8=`printf "\xE3\x81\xA6\xE3\x81\x99\xE3\x81\xA8"`
JAPANESE_EUC_JP=`printf "\xA4\xC6\xA4\xB9\xA4\xC8"`

$at_traceoff
echo "t_i18n_file.at:13: mkdir tmp"
echo t_i18n_file.at:13 >$at_check_line_file
( $at_traceon; mkdir tmp ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_i18n_file.at:13: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_i18n_file.at:14: touch \"tmp/file name with spaces\""
echo t_i18n_file.at:14 >$at_check_line_file
( $at_traceon; touch "tmp/file name with spaces" ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_i18n_file.at:14: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_i18n_file.at:15: touch \"tmp/file+name-with_funny@symbols%etc:\""
echo t_i18n_file.at:15 >$at_check_line_file
( $at_traceon; touch "tmp/file+name-with_funny@symbols%etc:" ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_i18n_file.at:15: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_i18n_file.at:16: touch \"tmp/\$EUROPEAN_UTF8\""
echo t_i18n_file.at:16 >$at_check_line_file
( $at_traceon; touch "tmp/$EUROPEAN_UTF8" ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_i18n_file.at:16: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_i18n_file.at:17: touch \"tmp/\$JAPANESE_UTF8\""
echo t_i18n_file.at:17 >$at_check_line_file
( $at_traceon; touch "tmp/$JAPANESE_UTF8" ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_i18n_file.at:17: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_i18n_file.at:18: touch \"tmp/\$EUROPEAN_8859_1\""
echo t_i18n_file.at:18 >$at_check_line_file
( $at_traceon; touch "tmp/$EUROPEAN_8859_1" ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_i18n_file.at:18: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_i18n_file.at:19: touch \"tmp/\$JAPANESE_EUC_JP\""
echo t_i18n_file.at:19 >$at_check_line_file
( $at_traceon; touch "tmp/$JAPANESE_EUC_JP" ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_i18n_file.at:19: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_i18n_file.at:21: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add \"tmp/file name with spaces\""
echo t_i18n_file.at:21 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add "tmp/file name with spaces" ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_i18n_file.at:21: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_i18n_file.at:22: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add \"tmp/file+name-with_funny@symbols%etc:\""
echo t_i18n_file.at:22 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add "tmp/file+name-with_funny@symbols%etc:" ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_i18n_file.at:22: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# add some files with UTF8 names
export LANG=en_US.utf8
export CHARSET=utf8
$at_traceoff
echo "t_i18n_file.at:27: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add \"tmp/\$EUROPEAN_UTF8\""
echo t_i18n_file.at:27 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add "tmp/$EUROPEAN_UTF8" ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_i18n_file.at:27: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_i18n_file.at:28: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add \"tmp/\$JAPANESE_UTF8\""
echo t_i18n_file.at:28 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add "tmp/$JAPANESE_UTF8" ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_i18n_file.at:28: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# remove the UTF8 file, change locale, and add it again. both should work.
export LANG=de_DE.iso88591
export CHARSET=iso88591
$at_traceoff
echo "t_i18n_file.at:33: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net drop \"tmp/\$EUROPEAN_8859_1\""
echo t_i18n_file.at:33 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net drop "tmp/$EUROPEAN_8859_1" ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_i18n_file.at:33: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_i18n_file.at:34: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add \"tmp/\$EUROPEAN_8859_1\""
echo t_i18n_file.at:34 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add "tmp/$EUROPEAN_8859_1" ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_i18n_file.at:34: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


export LANG=ja_JP.eucjp
export CHARSET=eucjp
$at_traceoff
echo "t_i18n_file.at:38: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net drop \"tmp/\$JAPANESE_EUC_JP\""
echo t_i18n_file.at:38 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net drop "tmp/$JAPANESE_EUC_JP" ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_i18n_file.at:38: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_i18n_file.at:39: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add \"tmp/\$JAPANESE_EUC_JP\""
echo t_i18n_file.at:39 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add "tmp/$JAPANESE_EUC_JP" ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_i18n_file.at:39: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_i18n_file.at:41: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit 'blah blah'"
echo t_i18n_file.at:41 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit 'blah blah' ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_i18n_file.at:41: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_i18n_file.at:42: grep funny MT/manifest"
echo t_i18n_file.at:42 >$at_check_line_file
( $at_traceon; grep funny MT/manifest ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_i18n_file.at:42: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_i18n_file.at:43: grep spaces MT/manifest"
echo t_i18n_file.at:43 >$at_check_line_file
( $at_traceon; grep spaces MT/manifest ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_i18n_file.at:43: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_i18n_file.at:44: grep \$JAPANESE_UTF8 MT/manifest"
echo t_i18n_file.at:44 >$at_check_line_file
( $at_traceon; grep $JAPANESE_UTF8 MT/manifest ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_i18n_file.at:44: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_i18n_file.at:45: grep \$EUROPEAN_UTF8 MT/manifest"
echo t_i18n_file.at:45 >$at_check_line_file
( $at_traceon; grep $EUROPEAN_UTF8 MT/manifest ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_i18n_file.at:45: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_i18n_file.at:47: rm -Rf tmp"
echo t_i18n_file.at:47 >$at_check_line_file
( $at_traceon; rm -Rf tmp ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_i18n_file.at:47: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


      $at_traceoff
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  21 ) # 21. t_fmerge.at:3: external unit test of the line merger
    at_setup_line='t_fmerge.at:3'
    at_desc='external unit test of the line merger'
    $at_quiet $ECHO_N " 21: external unit test of the line merger        $ECHO_C"
    at_xfail=no
    (
      echo "21. t_fmerge.at:3: testing ..."
      $at_traceon


MIMENCODE=`which mimencode 2>/dev/null`
if test -z "$MIMENCODE" ; then
  exit 77
fi

DIFF3=`which diff3 2>/dev/null`
if test -z "$DIFF3" ; then
  exit 77
fi

GZIP=`which gzip 2>/dev/null`
if test -z "$GZIP" ; then
  exit 77
fi




cat >test_keys <<'_ATEOF'
[pubkey tester@test.net]
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCfN/cAMabgb6T7m8ksGnpQ7LO6hOdnc/7V
yivrRGtmpwSItljht1bmgLQF37KiSPoMEDUb1stfKxaMsYiy8iTyoQ+M2EVFP37n2rtnNZ0H
oVcQd2sRsCerQFh9nslRPymlkQXUlOiNFN6RlFNcdjkucqNe+YorFX21EYw7XuT5XwIBEQ==
[end]
[privkey tester@test.net]
npy0jyqbZdylFkMjdR9OvlqmDHuBGXpGFPt94h96aG+Lp+OdBCmWx8GueHk8FKkexwPqhRBM
PPopUeuwqxuSX+yEodMl5IHBmin0nLnbOeBjtasjemBFEmdNl/jPDF/AeQ2WHhanB731dSQc
vzLOQfKAYmfk56PPULi9oJJNUxaCkvsWtvaI+HUHZrjyyV7dA4Vsc6Jvx2Yf1+MdDAEGk/Rw
ZtP0LmuoiyvRDFqBF8aTmnotyb4kRKohnJ7VF+y6hYvmtMpM3TKnpR7EbojBzNPqKuO7nPUz
jGxA7F84O24Vbf128PNSI5vj4istow26aPjn28qPjfRrkV30WLL/dXfYJkfkTqglYnoEXvF/
xZoVxxNeAX58mgy0A1ErVxv8U7TwuP983GHEpLwy3gbiP+9akAJCr8r823DHmQqq5QDELibP
cuXZfOttpfVRkcbMhjeF0M6czc4HoKgHTAnf/18hzdZwGX/WWvRIBHImbUJ+mDbp2ByDTfKf
ErGXSvZ3HxCqBD8yx1SnXhV8IDHaBmV9wwYcN+H2cxOWGZk7g7xJS19+a3UQB3c3sSXQVJBp
6QpCZgysxkZwzuXDzzLZPT9SLZz4K2p7+7BwMbpy9ZxcyAzmiEtpA24UP06jtjFN7WcXAdx/
E5Gmoe9b1EiXWdReHjUGpc6k0LQ0PPXAwqrcGdwYbOLDZ5xsQ5AsEYSFtyTS60D1nHBcdNmW
M0eOUJFdJf/uNe/2EApc3a8TyEkZtVqiYtOVV3qDB9NmU4bVOkDqzl1F7zJwATWbmasSdkM3
6lxDkczBfCrEjH5p5Y8DU+ge4e4LRtknY9oBOJ7EQO0twYJg3k0=
[end]
_ATEOF


cat >test_hooks.lua <<'_ATEOF'

-- this is the "testing" set of lua hooks for monotone
-- it's intended to support self-tests, not for use in
-- production. just defines some of the std hooks.

function get_passphrase(keyid)
	return keyid
end

function non_blocking_rng_ok()
	return true
end

function get_manifest_cert_trust(signers, id, name, val)
   return true
end

function get_file_cert_trust(signers, id, name, val)
   return true
end

function accept_testresult_change(old_results, new_results)
   for test,res in pairs(old_results)
   do
      if res == true and new_results[test] ~= true
      then
	 return false
      end
   end
   return true
end

function get_author(branchname)
	return "tester@test.net"
end

function ignore_file(name)
	if (strfind(name, "test_hooks.lua")) then return true end
	if (strfind(name, "test.db")) then return true end
	return false
end

if (attr_functions == nil) then
  attr_functions = {}
end
attr_functions["test_attr"] =
  function(filename, value)
    io.write(string.format("test_attr:%s:%s\n", filename, value))
  end

_ATEOF


$at_traceoff
echo "t_fmerge.at:21: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init"
echo t_fmerge.at:21 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fmerge.at:21: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_fmerge.at:21: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys"
echo t_fmerge.at:21 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fmerge.at:21: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_fmerge.at:21: rm test_keys"
echo t_fmerge.at:21 >$at_check_line_file
( $at_traceon; rm test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fmerge.at:21: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



cat >left.gz.enc <<'_ATEOF'
H4sICOXi9D8CA2xlZnQA7Vr7c9vGEf5Z/CvO9MQGbQp+xM1MLVmNLCuOJoqlMeWkHceDAYEj
iQrEsXhIYhz3b++3ew8c+LCVtJ3pD/XYJnC3t7e3t/vtg7ybFUnepFLsZ6qqSxnPD3p33RhG
smLqj8zjxUHPe69lOcfKcOYTNUVW1Wl3TLOiMW9wrLDpo2oWlzKNFnUZzhYd9v2kXC5qtVg8
isvkWTjrb5oax5X8ZtvkTN5smeGHPBtvmVZVSeJunIPAW2bKimf8KVVUdVzUUFFnyaVcrg7l
TbwyUpdxUU1UOV8lreIiq5c82Hv0SCRqsSyz6awWwdFAPH38+OmQ/v9aTMt4mapCzBRULPbN
67cLNVY3YaJw2Vgd57ng1ZUoZSXLK5mGNJ5niSwqmYpaiXomxaIZY0g0RSpLHqDLr4Sa8Mvr
N+/E6/NTERy8EE8HtL6SkmcmWS7F0dn5307evBY4jUhlHWd5xaKDAJJdZ5BhUapxPM6XRCOv
sMdYinEzrURWgCyrmFEosvp+JTC9pOUwHZZvKmt9hqFYqLJmNnGRQoakKWW+DEWlyhJjY9XU
4BbXYa/XVDBJUcRzWS3iBDLyNZ6f763NwJz3LD0b7fPnrdViBldcQzVXKktFqiKy1mAkk5fL
Wr7MVXIp7onFrIShDns7OwJ/VifjZa7idND72BPiNPgu6JdNUdBuxIo0k8gKqi7EV6kYYyGr
PY3r+JeiPxBfWQZhlf0qg8FgD2wO3x49E/GzQG8cEnEwGBo5fML4WXiuNxixkwaWmVuyyvxT
98SADSgirirNO4AhRzOlLiucDM90Zj40vCOC3S/irIywjF0DJBjKUke0UW1aMRpDiGWkh6F5
IWAF1zBOAqKa7a2pyD4VxMrjG20BcBZBhjaE8kQSJzNWrWhlFkE20bzAYWm5ZfUA76VqpjPm
nGcTSYqP6UbgTHOBawq1cc5kvqjE9UwWms9SNfdh2fP4Uu81i/PJbqp+lYVIZAlfS5tSz8AP
aTM4xlyWU2xQag6VmsuaJA3xDqvLSawK0GpOL14IhgxoOurOROoyGOztscr4mmC/z58Du/e7
VzA0Kj0waq5oCf5mExGs7HXPXkUVTrIiDfjSBuLOCzcsMToY9OgOP/L/7sJAIRzde175Yc+Q
GHM8rKpsWgSlzAqgyqKUdZTEVb1Ptm4M5cEBmbIxSm3IvhWzgcm6KQv9Bhs1J3FKAkj4Zqrt
zjOnFelxBWxKuNyx1FdV5WrMuEL8jC1qU6ONBdlBu8HtTqgPx+fECVth2oMayPCmOsf+hP9l
brb7KFrhvzv564/Hz8k5GF7TUi2EvEFMaREERp2VoiMu8Y4gUDOpfsWtPXv852+sehNAHk28
58kP7H1mL0ZVHSboQAqIT0jfVHfW5GFvwd8H1/HygShUsWsQW4pYO/Achl/Uod2VeO/vi74k
xfk+SzvgEsXJK/G+TyR8o8GAHkX/g3gu+nsek3CSN9UscNZiPnAfIsmKaJLiuI/3WtNtklqY
/EYgrtRRFSM0WoI6gTnFdV0GevFQ3Ksda0MLhrUbCpMon+TxVNx7If55fPT9WcupWuF0cTQ6
fHP2s2FpyRC+ejsfeztfXgESTIQQMM8KGeC6hvpCh+L+L8V9TfG7PA+rB4wWuSz4heTa4Ws1
WOlwlmEXqKOAjPN4OZYhEa5DyqC3o71tx/eTKsyQc5R1AOCUEeGU8VONJXpvfQAy/Z1P9hqT
uE5mIgjDcGC0NJdzqEmf/rFRgF75Wf3pqzNaNLYHbMv1SkSDazx9WjFOTaDHtux7i8t2W+vD
fYKN9mo5X+RxTbn2ciEpJREXB53wew21ywhJWXCBgHkV58PVIIq70RF0xQspZmmAe3BdqmL6
IBQnyF+K+zUnb4W6Jqd+dfx2VxaJQuIJG1Ei1oz8PWAaioAG940PgM01YoRoFiKX8RXhZBlf
s6tq5EFCN0fWqRLNqZRTWEtFNnItKWgWqgbcJZdI28bQLyEYUmjIYixKzDGJPeqZZnBIvOJa
lT9j6Ah7Fs1i/+LgLwLxWIlLnKMKQ1gYZgg2sps7bTYBvUX6dOza8LJOENAp0SgrLpkSGeBl
4C1x9wq1h1DUMQ8HltRN24HwR6RZ8VQeU7B0WCOTW7qht3M3PvgTK0GR00lcL/j4yWN7q6mf
SG5lRBbv+5ivJALiwASOjFEUH/sbeO2Jhw8z+Kc38z77gBX3f3l837mI9jG76e9lbtW9gT87
VI+dZioLWcKtKBvSMLOatYr2D6WFimM+S2Pi5Y4Brm15LSUXeiWyxfmiJmvjhGITD13Fcn6G
OovYHVD2i0cgzHCNjusCTV1mV5qcF9AbVjh3t9F/gYox4RyY3MylyamSFbl7nl1iBOVmquac
4GBdEtPMNLuSLjPGHGX7OfCuRjqx3E2xHzJavTDkmMqZain/0UhA/ZjQAQePUE3jGiZxTlm7
Dgd3XGKGJKBDyfmrNbG72QQV50S8PD07+gElZPQW/w5/Ojw5PXx5eix8oxFKLaqgXyhhuQkQ
i/gK5aZOMHAyyjg606X8u0xqmfZh6XddJiW2nQGJgSTCIuWSQRsp1VtNrUZSwuTesjbOWQ8I
WZv4sFN1UNrUh3TluM0h3yQeiM4zCgJS+8y127oZMIV5M/k8Ls/aO/OlT2IWkD7gJ1T3UrED
0rejw+NRdHZ4fB6Nvj+MXknd2yh5XQDJh7QSWQCfoA09NO2E5rkNVeGQfcKEf6KxtbI7vF1P
UvsHgd5NArCeQFNW2pYImkMHHXfsoAdoq1rRvQ0QrevguHA6aMa8werZm7G9N33y9o5uLzcv
X0v6KS/SM2uyw4Woc0O9DHGtyksJ1WqvteWIakrq6DQ5qk2gUAJySbWlRsZIQ0ngq3nYAsje
ZkJ9rKFFJibjCGNVmSLK7HLUanVqmxR6TTDwD7NlcWDMEiHWN1nLyUjps/pkkJ0TRwqmMZQg
/yis/9uY/lmgtuzYa8wCk4/YqVrRGYZdbsSnmsVP2vMR6LsXjfobdkwlx0ILCR3gSaVR9MZZ
22hx8mGzSD963Zf/h5j/coj5QxHm32uOObswqAhWgb7X/73+2G06Xa5fuw98H40Oo/MfjkZP
rp78iUF+BB+SJflmxU/cCtvcdAvuGJIQpVm9hBmJ3377UiuOJLydBJr53uY2nLGbe/esmLob
Z1pxTq62FaeHhJt7z723TsvIrxM0zuwyXpD2HZZvhOAukuvE248YOinwwMena0Hn1sWP44ON
OwHe7Wxn1xqDX85FWKyVfKQj5sZWjNZak+WpAUfS9gSxwamu9aN1JXbV4ITecXUnQnjCCyp+
CroLbIN+E5sho4hm1hrBrUxQN1eCQl6L7VSBE4ol/rS1DaNhMyvoeyy46JWMJsBKCs19etDf
L5kTOBVhX8F5Rp+ul+Xpu++HMqQlZQlA9ZqBfS2E7elt6jZZ71hrMFF3iefaWre3cgP1fBGY
iMx6tQka6Ujr47ssh+3qUZ0nP9BMXS7HtK6dELSBlBpaDPA2HcJJ0ybxsiEX4Y3dtGt9S19J
19ZyBX/LoZc1cO7EWJfMZHJ5u+TJJqifSZQsyaba1mVAGDCVuqtyVzIhSlunsNpa3rSV8GcS
IrtuJS1CxJA38TwrpEmp/wNR4ydZZpNMx40r8/zZyOGIbh87bhE6WjEs/y+Gj1YQP4B44rUh
xA4Kb357GPGLVXxuCQzerROVA+Bu7gkqTmncl0V24LbfF6Fe8yKFfl0JDVuAtt3KfQvqRlYA
1g+fNhA4nVFd4BVEK9WQz69tJbb6vu2993a2orWl6eJ19xuQTWjZmsImvHRCdiDTczHnfKZ/
0XVSBjATsbkP0LEORzb06QbWpr0xd52+8e4ejCyDU1lM65k1ZFMWmwpBy8uIZ37NcFM/BG8R
T+OMDIgGderLd8uUfk4UfJXarGOwhtAu+dJA6uT8SmwSn89mb0pHEvFAXE1gAm/enZ46YbkP
8fAh11Jc0yOdFwvFTsBt9et4SUl2hhjMv1PQP4IgdBPVPC5rzcetgHVRAUb1FuLqVKmUu+pD
0VC4rhtITz+e6JmUx/dzFo6Mrit28MBZhrPnye7BOWr1LzhrVy/Oabeqi6qiz/SkyVKuJtxr
ziX2uZps7C/j44To9jZF/E7kMXHf0BpborO9lvUpjvOWOy2BjqZUUnJF+e7k9FX07s3JRXRx
PLoYeb/haYqsBufK/DSo85WOM5wIxVUBAcpswbSBjmVtXMbTnh4I4zRFdE/1hP52wQ7TUn8c
f1+enY0uoqPvj49+OD87eXPhmjBk4gzecPWqP7ANSC/GU4rdH6vxk6dff0uc6ZdEmnBTpNfB
1pvd3BLx+p0be/NDYftOfntUh8f1s5AC+acHeUxGd1Nr+ewPEuxo0Cf57TD8idatHWU1wcAj
Uaw3mqyMWrZhuw+b8XbNO2hx3LQMHmWwITVbVUl3N7udOdy4VJeyiBwR/SLDPT8UfQEPIt9H
wZ1nsr/3eUGpw/EZYe98WdpVeZzQto9HdksGwC4SsAVXTUY/kxD8qT3hJNAvfLv0tHuAhYEW
hlwuOjocHQf3tnqU2VI3Wwgc11z2X17k0u0kKQAA
_ATEOF


cat >right.gz.enc <<'_ATEOF'
H4sICOXi9D8CA3JpZ2h0AO1a+3PbxhH+WfwrzvRYAmUKfsTNTCVZjSwrjiaKpTHlpB3HgwGB
I4kIBFg8RDGO+7f3270HDnzIStLO9Id6bBO429vb28e3e0s+TLIorWMpDpO8rAoZTo86D+0Y
RpJs7I5Mw9lRx3mvZDHFSn/iEtVZUlZxe0yxojFncJhj0yflJCxkHMyqwp/MWuy7UbGYVfls
9iQsohf+pLtuahiW8utNkxN5u2GGH9JkuGE6LwsSd+0cBN4wU5Q8407lWVmFWQUVtZZcy8Xy
UFqHSyNVEWblKC+my6RlmCXVggc7T56IKJ8timQ8qYR30hPPnz593qf/vxLjIlzEeSYmOVQs
DvXrN7N8mN/6UQ5jY3WYpoJXl6KQpSxuZOzTeJpEMitlLKpcVBMpZvUQQ6LOYlnwABm/FPmI
X968fS/eXJ4L7+ileN6j9aWUPDNKUilOLi7/cfb2jcBpRCyrMElLFh0EkGyeQIZZkQ/DYbog
GnmDPYZSDOtxKZIMZEnJjHyRVDulwPSClsN1WL6xrNQZ+mKWFxWzCbMYMkR1IdOFL8q8KDA2
zOsK3MLK73TqEi4psnAqy1kYQUY24+XlwcoM3PnA0LPT7u83XosZmLiCam7yJBZxHpC3egMZ
vVpU8lWaR9diW8wmBRy139naEvizPBku0jyMe51PHSHOvW+9blFnGe1GrEgzkSyh6kw8isUQ
C1ntcViFP2fdnnhkGPhl8qv0er0DsDl+d/JChC88tbFPxF6vr+VwCcMX/qXaYMBB6hlmdsky
88/tEwM2oIiwLBVvD44cTPL8usTJ8Exn5kMjOgL4/SxMigDLODRAgqEktkRr1aYUozCEWAZq
GJoXAl4wh3MSEFXsb3VJ/plDrDS8VR6AYBHkaH0oT0RhNGHVikZm4SUjxQscFoZbUvXwXuT1
eMKc02QkSfEhWQTBNBUwk6+ccyLTWSnmE5kpPou83oFnT8NrtdckTEd7cf6rzEQkC8RaXBdq
BnFImyEwprIYY4NCcSjzqaxIUh/v8LqUxCoBrfr04qVgyICmg/ZMkF97vYMDVhmbCf67vw/s
PmyboK9VeqTVXNIS/E1Gwlvaa9uYovRHSRZ7bLSeePDSDkuM9nodsuEn/t8aDBTC0n3glR8P
NIl2x+OyTMaZV8gkA6rMClkFUVhWh+Tr2lF2j8iVtVMqR3a9mB1MVnWRqTf4qD6JVRJAwnVT
5XeOOy1JDxOwK8G4Q6lMVab5kHGF+GlfVK5GGwvyg2aD+51QHY7PiRM2wjQH1ZDhTLWO/Rn/
y1Rv90k0wn979vcfTvcpOBhe4yKfCXmLnNIgCJw6KURLXOIdQKB6VP4Kq714+tevjXojQB5N
fODJjxx9ei9GVZUm6EA5EJ+Qvi4frMjD0YK/u/NwsSuyPNvTiC1FqAJ4CsfPKt/sSrwPD0VX
kuLcmKUdYERx9lp86BIJW9Tr0aPofhT7onvgMPFHaV1OPOst+gP2EFGSBaMYx3160LhuHVVC
1zcCeaUKyhCp0RBUEdwprKrCU4v7YruyrDUtGFZ2yI+CdJSGY7H9Uvzr9OS7i4ZTucTp6mRw
/PbiJ83SkCF9dbY+dba+vAIkmPAhYJpk0oO5+sqgfbHzc7ajKH5X5GF1j9EilRm/kFxbbFaN
lRZnGXaBOjmQcRouhtInwlVI6XW2VLRtuXFS+glqjqLyAJwyIJzScaqwRO2tDkCuv/XZmDEK
q2giPN/3e1pLUzmFmtTpn2oFqJV36k+ZTmtR+x6wLVUrkQ3mePq85JyKQI1t2PcexrZbq8N9
ho92KjmdpWFFtfZiJqkkEVdHrfQ7h9plgKLMu0LCvAnT/nIShW1UBl2KQspZCuB250WejXd9
cYb6JdupuHjL8jkF9evTd3syi3IUnvCRXISKkbsHXCMnoIG98QGwmSNHiHomUhneEE4W4ZxD
VSEPCropqs48UpwKOYa3lOQjc0lJM8srwF10jbJtCP0SgqGEhizao8QUk9ijmigGx8QrrPLi
JwydYM+snh1eHf1NIB/n4hrnKH0fHoYZgo3k9kFTTUBvgTodhzairJUEVEk0SLJrpkQFeO05
S6xdoXYfijrlYc+Q2mkz4P+AMiscy1NKlhZrZHTPMHR2bucHd2IpKXI5CfOCj1s8NlaN3UJy
IyPyeDfGXCUREHs6cSSMovg4XMPrQDx+nCA+nZkPyUes2Pn56Y4NERVjZtPfy9yoew1/DqgO
B81YZrJAWFE1pGBmuWoVzR8qC3PO+SyNzpdbGrg21bVUXKiVqBans4q8jQuKdTzULZbrM9yz
iN0RVb94BML0V+j4XqCoi+RGkfMCesMKG+4m+89wY4y4BqYws2VynMuSwj1NrjGC62acT7nA
wboopJlxciNtZYw5qvZT4F2FcmKxF2M/VLRqoc85lSvVQv6zloD6IaEDDh7gNg0zjMKUqnaV
Dh7YwgxFQIuS61fjYg+TEW6cI/Hq/OLke1whg3f4d/zj8dn58avzU+E6jcjzWel1s1wYbgLE
IrzBdVMVGDgZVRyt6UL+IqNKxl14+kNbSYlNZ0BhIIkwi/nKoJyU7lt1lQ+khMu9Y21csh6Q
stbx4aBqobS+H5LJYc0+WxIPROc4BQGpeea726obMIV+0/U8jGf8nfnSJzHzSB+IE7r30mUH
pO8Gx6eD4OL49DIYfHccvJaqt1HwOg+S94VtaezvgwkKAj5Mk4WI0srPc2suiH0OD10JEI25
Nls9mPV0APdMMIGuBVZraSpQm9uC4tACyi0z6GDbsoJUmwNEq+o4zaw66iFvsHz2emhMqE7e
mOv+cvPylfqfSiQ1syI7oomaONTWEPO8uJZQrQpgczPJ64KaO3WKiycAKQK5pGumAslAoYrn
qrnfYMnBekJ1rL4BKSbjZGNUGSPh7HECa3Rq+hVqjddzD7Nhsac9FNnW9V7DSUvpsvqsQZ5r
SMqrIZQg/yjC/2l4vxOzDTuOGr1AlyZmqsrpDP02N+JTTsJnzfkI/+2LSgBrdowlp0WDDi0M
iqVW9NpZ03Ox8mGzQD06jZj/Z5v/crb5Q8nmz/XJrF9oVAQrT9n1f69Vdp+ml23dHgLfB4Pj
4PL7k8Gzm2d/YZAfIIZkQbFZ8hN3xdb337wHmsTHLa1awI3Eb799qStHEt5PAsX8YH1HTvvN
9rYRUzXmdFfOytV05dSQsHMfuA3X6h65VwaFM3uMF6R9i+VrIbiN5KoGdzOGKgoc8HHpGtC5
9z3I8sHGrQRvdzazKz3CL9ciLNZSPdISc21XRmmtTtJYgyNpe4TcYFXXxNGqEttqsEJv2Sso
UnjEC0p+8toLTK9+HZs+o4hi1jjBvVxQ9Vm8TM7FZirPCsUSf97YkVGwmWT0lRZC9EYGI2Al
peYuPaivmvQJrIqwr+A6o0vmZXm69quiBGVJUQBQnb5gVwlh2nvrGk8mOlZ6TdRo4rnm2ttZ
skA1nXk6I7NeTYFGOlL6+DZJ4btqVJXMu4qpreWY1nYWvCaRUm+LAd6UQzhpXEdONWQzvPab
Zq3r6Uvl2kqt4G7Zd6oGrp0Y66KJjK7vVzyZAvWOQsmQrLvm2goIA/rSbi+8S5UQla1jeG0l
b5tL8R0FkVm3VBYhY8jbcJpkUpfU/4Gs8aMsklGi8saNfr4zc1ii++eOe6SORgzD/4vpoxHE
TSCOeE0KMYPCmd+cRtx7Kz43JAbH6kRlAbhde4KKSxr7vZEZuO9XR7ivOZlCvS6lhg1A22xl
vxC1I0sA66ZPkwiszuhe4FyIlm5DLr+mq9jo+75272xtRGtD08br9pch69CycYV1eGmFbEGm
E2I2+HQrox2kDGA6Y3MfoOUdlqzv0vWMTztj1pyu8+4dDQyDc5mNq4lxZH0t1jcEJS8jnv5h
w231GLxFOA4TciAaVKUv25Yp3ZrIexSbqqO3gtC2+FJAauV8JNaJz2czllKZROyKmxFc4O37
83MrLPchHj/muxTf6VHOi1nOQcAd9nm4oCI7QQ7mnyyo30MQuolyGhaV4mNXwLvoAkb3LeTV
cZ7H3GDvi5rSdVVDevodRUeXPG6cs3DkdG2xvV3rGdafR3tHl7irfyFY23qxQbtRXXQruqM9
TZ5yM+K2cyqxz81obasZH2dEd7Au47cyj877mlb7Ep3tjazOcZx33GnxVDalKyXfKN+fnb8O
3r89uwquTgdXA+fnPHWWVOBc6l8Jtb7dsY4T4HKVQYAimTGtp3JZk5fxdKAG/DCOkd1jNaG+
aDDDtNQdx99XFxeDq+Dku9OT7y8vzt5e2SYMuTiDN0K97PZML9LJ8VRid4f58Nnzr74hzvSj
IkW4LtOrZOvMrm+JOK3PtW36vjB9J7dTqtLj6llIgfwrhDQkp7utlHzmtwlm1OuS/GYY8UTr
Vo6yXGDgkShWG01GRiVbv9mH3Xiz5i20WG5KBofSW1OaLaukvZvZTh9uWOTXMgssEf04wz4/
Fl2BCKLYx4U7TWT34G5BqcNxh7APviztsjxWaNPHI78lB+AQ8diDyzqhX0wI/lSRcOapF7Yu
Pe0dYaGnhKGQC06OB6fe9saI0luqZguB40rI/hs1S4vULykAAA==
_ATEOF


cat >ancestor.gz.enc <<'_ATEOF'
H4sICOXi9D8CA2FuY2VzdG9yAO1a+3PbxhH+WfwrzvTEBm0KfsTNTC1ZjSwrjiaKpTHlpB3H
gzkCRxIViGPxkMQ47t/eb/ceAPiwlWQ60x/qkUXgbm9vbx/f7h51N83jrE6U2E91WRVKzg96
d/0YRtJ82h6Zy8VBr/VeqWKOleGsTVTnaVkl3THDisZag2ONTR+VM1moJFpURThbdNj342K5
qPRi8UgW8bNw1t80NZal+mbb5EzdbJnhhywdb5nWZUHibpyDwFtmipJn2lM6LyuZV1BRZ8ml
Wq4OZbVcGakKmZcTXcxXSUuZp9WSB3uPHolYL5ZFOp1VIjgaiKePHz8d0u+vxbSQy0TnYqah
YrFvX79d6LG+CWMNY2O1zDLBq0tRqFIVVyoJaTxLY5WXKhGVFtVMiUU9xpCo80QVPEDGL4We
8MvrN+/E6/NTERy8EE8HtL5UimcmaabE0dn5P07evBY4jUhUJdOsZNFBAMmuU8iwKPRYjrMl
0agr7DFWYlxPS5HmIEtLZhSKtLpfCkwvaTlch+WbqsqcYSgWuqiYjcwTyBDXhcqWoSh1UWBs
rOsK3GQV9np1CZcUuZyrciFjyMhmPD/fW5uBO+85enba588br8UMTFxBNVc6TUSiI/LWYKTi
l8tKvcx0fCnuicWsgKMOezs7Av9WJ+Uy0zIZ9D72hDgNvgv6RZ3ntBuxIs3EqoSqc/FVIsZY
yGpPZCV/yfsD8ZVjEJbpryoYDPbA5vDt0TMhnwVm45CIg8HQytEmlM/Cc7PBiIM0cMz8klXm
n7onBmxAEbIsDe8AjhzNtL4scTI805n50IiOCH6/kGkRYRmHBkgwlCaeaKPajGIMhhDLyAxD
80LAC67hnAREFftbXZJ/aoiVyRvjAQgWQY42hPJELOMZq1Y0MosgnRhe4LB03NJqgPdC19MZ
c87SiSLFS7IIgmkuYKbQOOdMZYtSXM9UbvgsdX0fnj2Xl2avmcwmu4n+VeUiVgViLakLM4M4
pM0QGHNVTLFBYTiUeq4qkjTEO7wuI7FKQKs9vXghGDKg6ag7E+nLYLC3xypjM8F/nz8Hdu93
TTC0Kj2wai5pCX7SiQhW9rrnTFGGkzRPAjbaQNx54YcVRgeDHtnwI//2BgOF8HTveeWHPUti
3fGwLNNpHhQqzYEqi0JVUSzLap983TrKgwNyZeuUxpHbXswOpqq6yM0bfNSexCsJINF2U+N3
LXdakR4mYFeCccfKmKrM9JhxhfhZXzSuRhsL8oNmg9ud0ByOz4kTNsI0B7WQ0ZrqHPsTfqvM
bvdRNMJ/d/L3H4+fU3AwvCaFXgh1g5zSIAicOi1ER1ziHUGgelL+Cqs9e/zXb5x6Y0AeTbzn
yQ8cfXYvRlWTJuhAGohPSF+Xd9bk4WjBz4NruXwgcp3vWsRWQpoAnsPx8yp0uxLv/X3RV6S4
dszSDjCiOHkl3veJhC0aDOhR9D+I56K/12ISTrK6nAXeW+wH7CHiNI8mCY77eK9x3TquhK1v
BPJKFZUSqdERVDHcSVZVEZjFQ3Gv8qwtLRhWfiiMo2ySyam490L8+/jo+7OGU7nC6eJodPjm
7GfL0pEhffV2PvZ2vrwCJJgIIWCW5iqAuYbGoENx/5f8vqH4XZGH1QNGi0zl/EJy7bBZLVZ6
nGXYBepoIONcLscqJMJ1SBn0dky07bTjpAxT1BxFFQA4VUQ4ZePUYInZ2xyAXH/nkzNjLKt4
JoIwDAdWS3M1h5rM6R9bBZiVn9WfMZ3VovU9YFtmViIbXOPp04pzGgIztmXfWxjbb20O9wk+
2qvUfJHJimrt5UJRSSIuDjrp9xpqVxGKsuACCfNKZsPVJArbmAy6EoWUswzAPbgudD59EIoT
1C/5/YqLt1xfU1C/On67q/JYo/CEj2ghDaP2HnANTUADe+MDYHONHCHqhciUvCKcLOQ1h6pB
HhR0c1SdOjacCjWFt5TkI9eKkmauK8BdfImybQz9EoKhhIYs1qPEHJPYo5oZBofES1a6+BlD
R9gzrxf7Fwd/E8jHWlziHGUYwsMwQ7CR3txpqgnoLTKn49BGlHWSgCmJRml+yZSoAC+D1hJv
V6g9hKKOeThwpH7aDYQ/osySU3VMydJjjYpvGYatnbv5oT2xkhS5nIR5waddPDZWTdqF5FZG
5PHtGGsriYA4sIkjZRTFx/4GXnvi4cMU8dmaeZ9+wIr7vzy+70PExJjb9Pcyd+rewJ8DqsdB
M1W5KhBWVA0ZmFmtWkXzj8pCzTmfpbH5cscC17a6looLsxLV4nxRkbdxQbGJh+liuT5Dn0Xs
Dqj6xSMQZrhGx32BoS7SK0POC+gNK3y4u+y/QMcYcw1MYebL5ESrksI9Sy8xgnYz0XMucLAu
ljQzTa+Ur4wxR9V+BryrUE4sdxPsh4rWLAw5p3KlWqh/1QpQPyZ0wMEjdNMww0RmVLWbdHDH
F2YoAjqUXL86F7ubTtBxTsTL07OjH9BCRm/x//Cnw5PTw5enx6LtNELrRRn0cy0cNwFiIa/Q
bpoCAyejiqMzXah/qrhSSR+eftdXUmLbGVAYKCLME24ZjJNSv1VXeqQUXO4ta+Oc9YCUtYkP
B1UHpW1/SCaHNYdsSTwQXcspCEjdM/du627AFPbN1vMwnvN35kufxCwgfSBOqO+lZgekb0eH
x6Po7PD4PBp9fxi9UuZuo+B1ASQf0kpUAXyCJvXQtBea5zZ0hUOOCZv+icb1yv7wbj1J3T4I
9G4LgPUCmqrSpkUwHDrouOMGW4C2qhVztwGidR0c514H9Zg3WD17PXZ2MydvbHR7uXn5WtFP
dZGZWZMdIUQ3N3SXIa51camgWhO1rh3RdUE3OnWGbhMoFINcUW9pkDEyUBK01TxsAGRvM6E5
1tAhE5NxhnGqTJBldjlrNTp1lxRmTTBoH2bL4sC6JVJs22UdJytlm9Uni+xcOFIylVCC+qOw
/qcx/bNA7dhx1NgFth5xU5WmMwy73IhPOZNPmvMR6PsXg/obdkwU50IHCR3gSZRV9MZZd9Hi
5cNmkXls3b78P8X8l1PMH8owf+5yzPuFRUWwCoxd//fux25z0+Xva/eB76PRYXT+w9HoydWT
vzDIjxBDqqDYLPmJr8I2X7oFdyxJiNasWsKNxG+/fekqjiS8nQSG+d7mazjrN/fuOTHNbZy9
ivNyNVdxZkj4ufd899a5Mmr3CQZndhkvSPseyzdCcBfJTeHdzhimKGiBT5uuAZ1bNz+eDzbu
JHi/s5tduxj8ci3CYq3UIx0xVy+OjMLqNEssLpKiJ0gLXmtNCK3rr6uBFXlt14kEHvOakp+C
7hp3Pb+J05AxpOkwvRfcygd7O0GursV2isDLNGguqDZe8TiXXLvVoSsdnmsazN7Kwav5IrBp
kI/jqiKSzcjxXZrBYcyoKU4fGKa+gGJa38MHTfaiWyQ2patBAFlJHbdKEJ9WrcWatW1zrdRI
awm6veWwlaq5YGGAiWcqvmwt2NQK+oIBA7ax9U3hSuFAVd4UNq7UTdM4fqZ+cOtWqggArLqR
8zRXtgJdaUTwyRV8N+Bb4hHFhjYHFJymaMa/3Pb+H/V3K/LNa8sWW8Km2cZ/o+VH1sKlG9VX
qkgnqa3vWoXtSlXb5sVcNoXOT46XY9qKIpesncq9MazWu0ZjV7SAt24ETzZs0w1cRmmNee1R
8nBShSO3/lTl02rmMoltKmx9ZcRl17XfBd9UD8FayKlMyVw0aLyGNcqU7YwSfJU4zB40x+VL
vS2K9vnMhImX/Sux8UhbLOOsYKBDPBBXE+Dim3enp/5Q3O09fMgVK3dOKJrEQrNr8uXltVxS
KZPGM/NtsPmqmSoPUc5lURk+fgUgl8pcqmqzpZhqnfAxh6LO4VZVjQPRV9Q9e8ffTsosHGFY
V+zAGau5f5zsHpyjIfpCBHU15SNpkwIdLIvPXPyRP11N+EIvU9jnarLxEg8fJ0S3twnhO3hl
cd7SWpejs71W1SmO85bb2cCgJ9XtXLa/Ozl9Fb17c3IRXRyPLkatP5So87QC59L+/UXn3ty7
UoQKNocARbpg2sAgYNM54mnPDIQySYDmiZkwV7humJa2x/Hz8uxsdBEdfX989MP52cmbC9/p
UiQwiiIVlv2Bu+VpdZxUx/THevzk6dffEmf6cw1DuCk/GIhuzW7uO1uXShsvQPlyZ+0OyqDT
+llIgfz9bibJ6W4qI5/71teNBn2S3w0jnGjd2lFW0xIeiWK9m3cyGtmGzT7sxts17xHIczMy
tCiD1VTsFdHdw21ijzQu9KXKI09EX3b754eiLxA3jGsSkKL6e58Xj5rHz4h4Z5uMq1J4Ud3F
CPkoGZvDIWBvLeuUvncW/Gm8/iQwL2xJeto9wMLAiEDhFR0djo6De1ujx25pulfCwbXw/A+k
HA4KdSYAAA==
_ATEOF


mimencode -u <left.gz.enc | gunzip >left
mimencode -u <right.gz.enc | gunzip >right
mimencode -u <ancestor.gz.enc | gunzip >ancestor

ANC=cec9ec2e479b700ea267e70feb5a4eb15155190d
LEFT=52f65363d555fecd3d2e887a207c3add0a949638
RIGHT=3ea0b30aa5c7b20329ce9170ff4d379522c8bcda

AVER=`sha1sum ancestor | cut -d ' ' -f 1`
LVER=`sha1sum left | cut -d ' ' -f 1`
RVER=`sha1sum right | cut -d ' ' -f 1`

$at_traceoff
echo "t_fmerge.at:231: test \$AVER == \$ANC"
echo t_fmerge.at:231 >$at_check_line_file
( $at_traceon; test $AVER == $ANC ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fmerge.at:231: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_fmerge.at:232: test \$LVER == \$LEFT"
echo t_fmerge.at:232 >$at_check_line_file
( $at_traceon; test $LVER == $LEFT ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fmerge.at:232: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_fmerge.at:233: test \$RVER == \$RIGHT"
echo t_fmerge.at:233 >$at_check_line_file
( $at_traceon; test $RVER == $RIGHT ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fmerge.at:233: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_fmerge.at:235: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net fload <ancestor"
echo t_fmerge.at:235 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net fload <ancestor ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fmerge.at:235: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_fmerge.at:236: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net fload <left"
echo t_fmerge.at:236 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net fload <left ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fmerge.at:236: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_fmerge.at:237: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net fload <right"
echo t_fmerge.at:237 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net fload <right ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fmerge.at:237: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_fmerge.at:239: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net fmerge \$ANC \$LEFT \$RIGHT"
echo t_fmerge.at:239 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net fmerge $ANC $LEFT $RIGHT ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fmerge.at:239: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_fmerge.at:240: mv stdout merge.monotone"
echo t_fmerge.at:240 >$at_check_line_file
( $at_traceon; mv stdout merge.monotone ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fmerge.at:240: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_fmerge.at:242: diff3 -E --merge left ancestor right"
echo t_fmerge.at:242 >$at_check_line_file
( $at_traceon; diff3 -E --merge left ancestor right ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fmerge.at:242: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_fmerge.at:243: mv stdout merge.diff3"
echo t_fmerge.at:243 >$at_check_line_file
( $at_traceon; mv stdout merge.diff3 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fmerge.at:243: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_fmerge.at:245: cmp merge.monotone merge.diff3"
echo t_fmerge.at:245 >$at_check_line_file
( $at_traceon; cmp merge.monotone merge.diff3 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_fmerge.at:245: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


      $at_traceoff
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  22 ) # 22. t_netsync.at:3: exchanging work via netsync
    at_setup_line='t_netsync.at:3'
    at_desc='exchanging work via netsync'
    $at_quiet $ECHO_N " 22: exchanging work via netsync                  $ECHO_C"
    at_xfail=no
    (
      echo "22. t_netsync.at:3: testing ..."
      $at_traceon




cat >test_keys <<'_ATEOF'
[pubkey tester@test.net]
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCfN/cAMabgb6T7m8ksGnpQ7LO6hOdnc/7V
yivrRGtmpwSItljht1bmgLQF37KiSPoMEDUb1stfKxaMsYiy8iTyoQ+M2EVFP37n2rtnNZ0H
oVcQd2sRsCerQFh9nslRPymlkQXUlOiNFN6RlFNcdjkucqNe+YorFX21EYw7XuT5XwIBEQ==
[end]
[privkey tester@test.net]
npy0jyqbZdylFkMjdR9OvlqmDHuBGXpGFPt94h96aG+Lp+OdBCmWx8GueHk8FKkexwPqhRBM
PPopUeuwqxuSX+yEodMl5IHBmin0nLnbOeBjtasjemBFEmdNl/jPDF/AeQ2WHhanB731dSQc
vzLOQfKAYmfk56PPULi9oJJNUxaCkvsWtvaI+HUHZrjyyV7dA4Vsc6Jvx2Yf1+MdDAEGk/Rw
ZtP0LmuoiyvRDFqBF8aTmnotyb4kRKohnJ7VF+y6hYvmtMpM3TKnpR7EbojBzNPqKuO7nPUz
jGxA7F84O24Vbf128PNSI5vj4istow26aPjn28qPjfRrkV30WLL/dXfYJkfkTqglYnoEXvF/
xZoVxxNeAX58mgy0A1ErVxv8U7TwuP983GHEpLwy3gbiP+9akAJCr8r823DHmQqq5QDELibP
cuXZfOttpfVRkcbMhjeF0M6czc4HoKgHTAnf/18hzdZwGX/WWvRIBHImbUJ+mDbp2ByDTfKf
ErGXSvZ3HxCqBD8yx1SnXhV8IDHaBmV9wwYcN+H2cxOWGZk7g7xJS19+a3UQB3c3sSXQVJBp
6QpCZgysxkZwzuXDzzLZPT9SLZz4K2p7+7BwMbpy9ZxcyAzmiEtpA24UP06jtjFN7WcXAdx/
E5Gmoe9b1EiXWdReHjUGpc6k0LQ0PPXAwqrcGdwYbOLDZ5xsQ5AsEYSFtyTS60D1nHBcdNmW
M0eOUJFdJf/uNe/2EApc3a8TyEkZtVqiYtOVV3qDB9NmU4bVOkDqzl1F7zJwATWbmasSdkM3
6lxDkczBfCrEjH5p5Y8DU+ge4e4LRtknY9oBOJ7EQO0twYJg3k0=
[end]
_ATEOF


cat >test_hooks.lua <<'_ATEOF'

-- this is the "testing" set of lua hooks for monotone
-- it's intended to support self-tests, not for use in
-- production. just defines some of the std hooks.

function get_passphrase(keyid)
	return keyid
end

function non_blocking_rng_ok()
	return true
end

function get_manifest_cert_trust(signers, id, name, val)
   return true
end

function get_file_cert_trust(signers, id, name, val)
   return true
end

function accept_testresult_change(old_results, new_results)
   for test,res in pairs(old_results)
   do
      if res == true and new_results[test] ~= true
      then
	 return false
      end
   end
   return true
end

function get_author(branchname)
	return "tester@test.net"
end

function ignore_file(name)
	if (strfind(name, "test_hooks.lua")) then return true end
	if (strfind(name, "test.db")) then return true end
	return false
end

if (attr_functions == nil) then
  attr_functions = {}
end
attr_functions["test_attr"] =
  function(filename, value)
    io.write(string.format("test_attr:%s:%s\n", filename, value))
  end

_ATEOF


$at_traceoff
echo "t_netsync.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init"
echo t_netsync.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_netsync.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys"
echo t_netsync.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_netsync.at:5: rm test_keys"
echo t_netsync.at:5 >$at_check_line_file
( $at_traceon; rm test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_netsync.at:6: cp test.db test2.db"
echo t_netsync.at:6 >$at_check_line_file
( $at_traceon; cp test.db test2.db ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync.at:6: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


cat >netsync.lua <<'_ATEOF'

function get_netsync_read_permitted(collection, identity)
	return true
end

function get_netsync_write_permitted(collection, identity)
	return true
end
_ATEOF


cat >testfile <<'_ATEOF'
version 0 of test file
_ATEOF

$at_traceoff
echo "t_netsync.at:20: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add testfile"
echo t_netsync.at:20 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add testfile ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync.at:20: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_netsync.at:21: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch --rcfile=netsync.lua commit blah-blah"
echo t_netsync.at:21 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch --rcfile=netsync.lua commit blah-blah ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync.at:21: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

F_VER0=`sha1sum testfile | cut -d ' ' -f 1`
VER0=`sha1sum MT/manifest | cut -d ' ' -f 1`

cat >testfile <<'_ATEOF'
version 1 of test file
_ATEOF

$at_traceoff
echo "t_netsync.at:27: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --rcfile=netsync.lua commit blah-blah"
echo t_netsync.at:27 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --rcfile=netsync.lua commit blah-blah ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync.at:27: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

F_VER1=`sha1sum testfile | cut -d ' ' -f 1`
VER1=`sha1sum MT/manifest | cut -d ' ' -f 1`

killall -q -KILL monotone
         monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --rcfile=netsync.lua               serve 127.0.0.1:5555 testbranch &
$at_traceoff
echo "t_netsync.at:33: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --rcfile=netsync.lua --db=test2.db pull 127.0.0.1:5555 testbranch"
echo t_netsync.at:33 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --rcfile=netsync.lua --db=test2.db pull 127.0.0.1:5555 testbranch ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync.at:33: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

killall -q -KILL monotone

$at_traceoff
echo "t_netsync.at:36: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --db=test2.db ls certs \$VER0"
echo t_netsync.at:36 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --db=test2.db ls certs $VER0 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync.at:36: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_netsync.at:37: mv stdout certs"
echo t_netsync.at:37 >$at_check_line_file
( $at_traceon; mv stdout certs ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync.at:37: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_netsync.at:38: grep date certs"
echo t_netsync.at:38 >$at_check_line_file
( $at_traceon; grep date certs ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync.at:38: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_netsync.at:39: grep author certs"
echo t_netsync.at:39 >$at_check_line_file
( $at_traceon; grep author certs ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync.at:39: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_netsync.at:40: grep branch certs"
echo t_netsync.at:40 >$at_check_line_file
( $at_traceon; grep branch certs ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync.at:40: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_netsync.at:41: grep changelog certs"
echo t_netsync.at:41 >$at_check_line_file
( $at_traceon; grep changelog certs ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync.at:41: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_netsync.at:42: grep bad certs"
echo t_netsync.at:42 >$at_check_line_file
( $at_traceon; grep bad certs ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   1) ;;
   *) echo "t_netsync.at:42: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_netsync.at:44: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --db=test2.db ls certs \$VER1"
echo t_netsync.at:44 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --db=test2.db ls certs $VER1 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync.at:44: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_netsync.at:45: mv stdout certs"
echo t_netsync.at:45 >$at_check_line_file
( $at_traceon; mv stdout certs ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync.at:45: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_netsync.at:46: grep date certs"
echo t_netsync.at:46 >$at_check_line_file
( $at_traceon; grep date certs ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync.at:46: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_netsync.at:47: grep author certs"
echo t_netsync.at:47 >$at_check_line_file
( $at_traceon; grep author certs ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync.at:47: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_netsync.at:48: grep branch certs"
echo t_netsync.at:48 >$at_check_line_file
( $at_traceon; grep branch certs ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync.at:48: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_netsync.at:49: grep changelog certs"
echo t_netsync.at:49 >$at_check_line_file
( $at_traceon; grep changelog certs ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync.at:49: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_netsync.at:50: grep ancestor certs"
echo t_netsync.at:50 >$at_check_line_file
( $at_traceon; grep ancestor certs ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync.at:50: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_netsync.at:51: grep bad certs"
echo t_netsync.at:51 >$at_check_line_file
( $at_traceon; grep bad certs ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   1) ;;
   *) echo "t_netsync.at:51: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_netsync.at:53: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --db=test2.db cat manifest \$VER0"
echo t_netsync.at:53 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --db=test2.db cat manifest $VER0 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync.at:53: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

CHK=`sha1sum stdout | cut -d ' ' -f 1`
$at_traceoff
echo "t_netsync.at:55: test \$CHK == \$VER0"
echo t_netsync.at:55 >$at_check_line_file
( $at_traceon; test $CHK == $VER0 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync.at:55: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_netsync.at:57: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --db=test2.db cat manifest \$VER1"
echo t_netsync.at:57 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --db=test2.db cat manifest $VER1 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync.at:57: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

CHK=`sha1sum stdout | cut -d ' ' -f 1`
$at_traceoff
echo "t_netsync.at:59: test \$CHK == \$VER1"
echo t_netsync.at:59 >$at_check_line_file
( $at_traceon; test $CHK == $VER1 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync.at:59: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_netsync.at:61: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --db=test2.db cat file \$F_VER0"
echo t_netsync.at:61 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --db=test2.db cat file $F_VER0 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync.at:61: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

CHK=`sha1sum stdout | cut -d ' ' -f 1`
$at_traceoff
echo "t_netsync.at:63: test \$CHK == \$F_VER0"
echo t_netsync.at:63 >$at_check_line_file
( $at_traceon; test $CHK == $F_VER0 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync.at:63: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_netsync.at:65: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --db=test2.db cat file \$F_VER1"
echo t_netsync.at:65 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --db=test2.db cat file $F_VER1 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync.at:65: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

CHK=`sha1sum stdout | cut -d ' ' -f 1`
$at_traceoff
echo "t_netsync.at:67: test \$CHK == \$F_VER1"
echo t_netsync.at:67 >$at_check_line_file
( $at_traceon; test $CHK == $F_VER1 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync.at:67: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_netsync.at:69: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db info"
echo t_netsync.at:69 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db info ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync.at:69: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

INFO1=`sha1sum stdout | cut -d ' ' -f 1`
$at_traceoff
echo "t_netsync.at:71: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --db=test2.db db info"
echo t_netsync.at:71 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --db=test2.db db info ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync.at:71: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

INFO2=`sha1sum stdout | cut -d ' ' -f 1`
$at_traceoff
echo "t_netsync.at:73: test \$INFO1 == \$INFO2"
echo t_netsync.at:73 >$at_check_line_file
( $at_traceon; test $INFO1 == $INFO2 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync.at:73: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


      $at_traceoff
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  23 ) # 23. t_disapprove.at:3: creating a trusted and untrusted update
    at_setup_line='t_disapprove.at:3'
    at_desc='creating a trusted and untrusted update'
    $at_quiet $ECHO_N " 23: creating a trusted and untrusted update      $ECHO_C"
    at_xfail=no
    (
      echo "23. t_disapprove.at:3: testing ..."
      $at_traceon




cat >test_keys <<'_ATEOF'
[pubkey tester@test.net]
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCfN/cAMabgb6T7m8ksGnpQ7LO6hOdnc/7V
yivrRGtmpwSItljht1bmgLQF37KiSPoMEDUb1stfKxaMsYiy8iTyoQ+M2EVFP37n2rtnNZ0H
oVcQd2sRsCerQFh9nslRPymlkQXUlOiNFN6RlFNcdjkucqNe+YorFX21EYw7XuT5XwIBEQ==
[end]
[privkey tester@test.net]
npy0jyqbZdylFkMjdR9OvlqmDHuBGXpGFPt94h96aG+Lp+OdBCmWx8GueHk8FKkexwPqhRBM
PPopUeuwqxuSX+yEodMl5IHBmin0nLnbOeBjtasjemBFEmdNl/jPDF/AeQ2WHhanB731dSQc
vzLOQfKAYmfk56PPULi9oJJNUxaCkvsWtvaI+HUHZrjyyV7dA4Vsc6Jvx2Yf1+MdDAEGk/Rw
ZtP0LmuoiyvRDFqBF8aTmnotyb4kRKohnJ7VF+y6hYvmtMpM3TKnpR7EbojBzNPqKuO7nPUz
jGxA7F84O24Vbf128PNSI5vj4istow26aPjn28qPjfRrkV30WLL/dXfYJkfkTqglYnoEXvF/
xZoVxxNeAX58mgy0A1ErVxv8U7TwuP983GHEpLwy3gbiP+9akAJCr8r823DHmQqq5QDELibP
cuXZfOttpfVRkcbMhjeF0M6czc4HoKgHTAnf/18hzdZwGX/WWvRIBHImbUJ+mDbp2ByDTfKf
ErGXSvZ3HxCqBD8yx1SnXhV8IDHaBmV9wwYcN+H2cxOWGZk7g7xJS19+a3UQB3c3sSXQVJBp
6QpCZgysxkZwzuXDzzLZPT9SLZz4K2p7+7BwMbpy9ZxcyAzmiEtpA24UP06jtjFN7WcXAdx/
E5Gmoe9b1EiXWdReHjUGpc6k0LQ0PPXAwqrcGdwYbOLDZ5xsQ5AsEYSFtyTS60D1nHBcdNmW
M0eOUJFdJf/uNe/2EApc3a8TyEkZtVqiYtOVV3qDB9NmU4bVOkDqzl1F7zJwATWbmasSdkM3
6lxDkczBfCrEjH5p5Y8DU+ge4e4LRtknY9oBOJ7EQO0twYJg3k0=
[end]
_ATEOF


cat >test_hooks.lua <<'_ATEOF'

-- this is the "testing" set of lua hooks for monotone
-- it's intended to support self-tests, not for use in
-- production. just defines some of the std hooks.

function get_passphrase(keyid)
	return keyid
end

function non_blocking_rng_ok()
	return true
end

function get_manifest_cert_trust(signers, id, name, val)
   return true
end

function get_file_cert_trust(signers, id, name, val)
   return true
end

function accept_testresult_change(old_results, new_results)
   for test,res in pairs(old_results)
   do
      if res == true and new_results[test] ~= true
      then
	 return false
      end
   end
   return true
end

function get_author(branchname)
	return "tester@test.net"
end

function ignore_file(name)
	if (strfind(name, "test_hooks.lua")) then return true end
	if (strfind(name, "test.db")) then return true end
	return false
end

if (attr_functions == nil) then
  attr_functions = {}
end
attr_functions["test_attr"] =
  function(filename, value)
    io.write(string.format("test_attr:%s:%s\n", filename, value))
  end

_ATEOF


$at_traceoff
echo "t_disapprove.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init"
echo t_disapprove.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_disapprove.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_disapprove.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys"
echo t_disapprove.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_disapprove.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_disapprove.at:5: rm test_keys"
echo t_disapprove.at:5 >$at_check_line_file
( $at_traceon; rm test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_disapprove.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



cat >testfile <<'_ATEOF'
first line of the file
second line of the file
third line of the file
_ATEOF

$at_traceoff
echo "t_disapprove.at:11: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add testfile"
echo t_disapprove.at:11 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add testfile ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_disapprove.at:11: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_disapprove.at:12: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit blah-blah"
echo t_disapprove.at:12 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit blah-blah ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_disapprove.at:12: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

ROOT_M_SHA=`sha1sum MT/manifest | cut -d ' ' -f 1`
ROOT_F_SHA=`sha1sum testfile | cut -d ' ' -f 1`

cat >testfile <<'_ATEOF'
first line of the file
an insertion between first and second
second line of the file
third line of the file
_ATEOF


$at_traceoff
echo "t_disapprove.at:22: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit blah-blah"
echo t_disapprove.at:22 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit blah-blah ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_disapprove.at:22: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

LEFT_GOOD_M_SHA=`sha1sum MT/manifest | cut -d ' ' -f 1`
LEFT_GOOD_F_SHA=`sha1sum testfile | cut -d ' ' -f 1`
$at_traceoff
echo "t_disapprove.at:25: test \$LEFT_GOOD_M_SHA != \$ROOT_M_SHA"
echo t_disapprove.at:25 >$at_check_line_file
( $at_traceon; test $LEFT_GOOD_M_SHA != $ROOT_M_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_disapprove.at:25: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_disapprove.at:26: test \$LEFT_GOOD_F_SHA != \$ROOT_F_SHA"
echo t_disapprove.at:26 >$at_check_line_file
( $at_traceon; test $LEFT_GOOD_F_SHA != $ROOT_F_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_disapprove.at:26: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


cat >testfile <<'_ATEOF'
first line of the file
an insertion between first and second
second line of the file
third line of the file
an evil line which should never be seen
_ATEOF


$at_traceoff
echo "t_disapprove.at:35: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit blah-blah"
echo t_disapprove.at:35 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit blah-blah ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_disapprove.at:35: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

LEFT_BAD_M_SHA=`sha1sum MT/manifest | cut -d ' ' -f 1`
LEFT_BAD_F_SHA=`sha1sum testfile | cut -d ' ' -f 1`
$at_traceoff
echo "t_disapprove.at:38: test \$LEFT_BAD_M_SHA != \$LEFT_GOOD_M_SHA"
echo t_disapprove.at:38 >$at_check_line_file
( $at_traceon; test $LEFT_BAD_M_SHA != $LEFT_GOOD_M_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_disapprove.at:38: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_disapprove.at:39: test \$LEFT_BAD_F_SHA != \$LEFT_GOOD_F_SHA"
echo t_disapprove.at:39 >$at_check_line_file
( $at_traceon; test $LEFT_BAD_F_SHA != $LEFT_GOOD_F_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_disapprove.at:39: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_disapprove.at:41: rm MT/manifest"
echo t_disapprove.at:41 >$at_check_line_file
( $at_traceon; rm MT/manifest ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_disapprove.at:41: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_disapprove.at:41: rm testfile"
echo t_disapprove.at:41 >$at_check_line_file
( $at_traceon; rm testfile ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_disapprove.at:41: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_disapprove.at:41: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout \$ROOT_M_SHA ."
echo t_disapprove.at:41 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout $ROOT_M_SHA . ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_disapprove.at:41: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

PROBE_M_SHA=`sha1sum MT/manifest | cut -d ' ' -f 1`
PROBE_F_SHA=`sha1sum testfile | cut -d ' ' -f 1`
$at_traceoff
echo "t_disapprove.at:41: test \$PROBE_M_SHA == \$ROOT_M_SHA"
echo t_disapprove.at:41 >$at_check_line_file
( $at_traceon; test $PROBE_M_SHA == $ROOT_M_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_disapprove.at:41: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_disapprove.at:41: test \$PROBE_F_SHA == \$ROOT_F_SHA"
echo t_disapprove.at:41 >$at_check_line_file
( $at_traceon; test $PROBE_F_SHA == $ROOT_F_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_disapprove.at:41: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



cat >testfile <<'_ATEOF'
first line of the file
second line of the file
an insertion between second and third
third line of the file
_ATEOF



$at_traceoff
echo "t_disapprove.at:50: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net disapprove \$LEFT_GOOD_M_SHA \$LEFT_BAD_M_SHA"
echo t_disapprove.at:50 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net disapprove $LEFT_GOOD_M_SHA $LEFT_BAD_M_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_disapprove.at:50: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_disapprove.at:51: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net update"
echo t_disapprove.at:51 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net update ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_disapprove.at:51: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# files should now be merged

cat >probe <<'_ATEOF'
first line of the file
an insertion between first and second
second line of the file
an insertion between second and third
third line of the file
_ATEOF


$at_traceoff
echo "t_disapprove.at:62: cmp testfile probe"
echo t_disapprove.at:62 >$at_check_line_file
( $at_traceon; cmp testfile probe ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_disapprove.at:62: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


      $at_traceoff
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  24 ) # 24. t_testresult.at:3: creating a good and bad test result
    at_setup_line='t_testresult.at:3'
    at_desc='creating a good and bad test result'
    $at_quiet $ECHO_N " 24: creating a good and bad test result          $ECHO_C"
    at_xfail=no
    (
      echo "24. t_testresult.at:3: testing ..."
      $at_traceon




cat >test_keys <<'_ATEOF'
[pubkey tester@test.net]
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCfN/cAMabgb6T7m8ksGnpQ7LO6hOdnc/7V
yivrRGtmpwSItljht1bmgLQF37KiSPoMEDUb1stfKxaMsYiy8iTyoQ+M2EVFP37n2rtnNZ0H
oVcQd2sRsCerQFh9nslRPymlkQXUlOiNFN6RlFNcdjkucqNe+YorFX21EYw7XuT5XwIBEQ==
[end]
[privkey tester@test.net]
npy0jyqbZdylFkMjdR9OvlqmDHuBGXpGFPt94h96aG+Lp+OdBCmWx8GueHk8FKkexwPqhRBM
PPopUeuwqxuSX+yEodMl5IHBmin0nLnbOeBjtasjemBFEmdNl/jPDF/AeQ2WHhanB731dSQc
vzLOQfKAYmfk56PPULi9oJJNUxaCkvsWtvaI+HUHZrjyyV7dA4Vsc6Jvx2Yf1+MdDAEGk/Rw
ZtP0LmuoiyvRDFqBF8aTmnotyb4kRKohnJ7VF+y6hYvmtMpM3TKnpR7EbojBzNPqKuO7nPUz
jGxA7F84O24Vbf128PNSI5vj4istow26aPjn28qPjfRrkV30WLL/dXfYJkfkTqglYnoEXvF/
xZoVxxNeAX58mgy0A1ErVxv8U7TwuP983GHEpLwy3gbiP+9akAJCr8r823DHmQqq5QDELibP
cuXZfOttpfVRkcbMhjeF0M6czc4HoKgHTAnf/18hzdZwGX/WWvRIBHImbUJ+mDbp2ByDTfKf
ErGXSvZ3HxCqBD8yx1SnXhV8IDHaBmV9wwYcN+H2cxOWGZk7g7xJS19+a3UQB3c3sSXQVJBp
6QpCZgysxkZwzuXDzzLZPT9SLZz4K2p7+7BwMbpy9ZxcyAzmiEtpA24UP06jtjFN7WcXAdx/
E5Gmoe9b1EiXWdReHjUGpc6k0LQ0PPXAwqrcGdwYbOLDZ5xsQ5AsEYSFtyTS60D1nHBcdNmW
M0eOUJFdJf/uNe/2EApc3a8TyEkZtVqiYtOVV3qDB9NmU4bVOkDqzl1F7zJwATWbmasSdkM3
6lxDkczBfCrEjH5p5Y8DU+ge4e4LRtknY9oBOJ7EQO0twYJg3k0=
[end]
_ATEOF


cat >test_hooks.lua <<'_ATEOF'

-- this is the "testing" set of lua hooks for monotone
-- it's intended to support self-tests, not for use in
-- production. just defines some of the std hooks.

function get_passphrase(keyid)
	return keyid
end

function non_blocking_rng_ok()
	return true
end

function get_manifest_cert_trust(signers, id, name, val)
   return true
end

function get_file_cert_trust(signers, id, name, val)
   return true
end

function accept_testresult_change(old_results, new_results)
   for test,res in pairs(old_results)
   do
      if res == true and new_results[test] ~= true
      then
	 return false
      end
   end
   return true
end

function get_author(branchname)
	return "tester@test.net"
end

function ignore_file(name)
	if (strfind(name, "test_hooks.lua")) then return true end
	if (strfind(name, "test.db")) then return true end
	return false
end

if (attr_functions == nil) then
  attr_functions = {}
end
attr_functions["test_attr"] =
  function(filename, value)
    io.write(string.format("test_attr:%s:%s\n", filename, value))
  end

_ATEOF


$at_traceoff
echo "t_testresult.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init"
echo t_testresult.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_testresult.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_testresult.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys"
echo t_testresult.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_testresult.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_testresult.at:5: rm test_keys"
echo t_testresult.at:5 >$at_check_line_file
( $at_traceon; rm test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_testresult.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



cat >testfile <<'_ATEOF'
first line of the file
second line of the file
third line of the file
_ATEOF

$at_traceoff
echo "t_testresult.at:11: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add testfile"
echo t_testresult.at:11 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add testfile ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_testresult.at:11: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_testresult.at:12: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit blah-blah"
echo t_testresult.at:12 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit blah-blah ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_testresult.at:12: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

ROOT_M_SHA=`sha1sum MT/manifest | cut -d ' ' -f 1`
ROOT_F_SHA=`sha1sum testfile | cut -d ' ' -f 1`

cat >testfile <<'_ATEOF'
first line of the file
an insertion between first and second
second line of the file
third line of the file
_ATEOF


$at_traceoff
echo "t_testresult.at:22: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit blah-blah"
echo t_testresult.at:22 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit blah-blah ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_testresult.at:22: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

LEFT_GOOD_M_SHA=`sha1sum MT/manifest | cut -d ' ' -f 1`
LEFT_GOOD_F_SHA=`sha1sum testfile | cut -d ' ' -f 1`
$at_traceoff
echo "t_testresult.at:25: test \$LEFT_GOOD_M_SHA != \$ROOT_M_SHA"
echo t_testresult.at:25 >$at_check_line_file
( $at_traceon; test $LEFT_GOOD_M_SHA != $ROOT_M_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_testresult.at:25: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_testresult.at:26: test \$LEFT_GOOD_F_SHA != \$ROOT_F_SHA"
echo t_testresult.at:26 >$at_check_line_file
( $at_traceon; test $LEFT_GOOD_F_SHA != $ROOT_F_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_testresult.at:26: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


cat >testfile <<'_ATEOF'
first line of the file
an insertion between first and second
second line of the file
third line of the file
an evil line which should never be seen
_ATEOF


$at_traceoff
echo "t_testresult.at:35: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit blah-blah"
echo t_testresult.at:35 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit blah-blah ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_testresult.at:35: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

LEFT_BAD_M_SHA=`sha1sum MT/manifest | cut -d ' ' -f 1`
LEFT_BAD_F_SHA=`sha1sum testfile | cut -d ' ' -f 1`
$at_traceoff
echo "t_testresult.at:38: test \$LEFT_BAD_M_SHA != \$LEFT_GOOD_M_SHA"
echo t_testresult.at:38 >$at_check_line_file
( $at_traceon; test $LEFT_BAD_M_SHA != $LEFT_GOOD_M_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_testresult.at:38: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_testresult.at:39: test \$LEFT_BAD_F_SHA != \$LEFT_GOOD_F_SHA"
echo t_testresult.at:39 >$at_check_line_file
( $at_traceon; test $LEFT_BAD_F_SHA != $LEFT_GOOD_F_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_testresult.at:39: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_testresult.at:41: rm MT/manifest"
echo t_testresult.at:41 >$at_check_line_file
( $at_traceon; rm MT/manifest ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_testresult.at:41: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_testresult.at:41: rm testfile"
echo t_testresult.at:41 >$at_check_line_file
( $at_traceon; rm testfile ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_testresult.at:41: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_testresult.at:41: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout \$ROOT_M_SHA ."
echo t_testresult.at:41 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout $ROOT_M_SHA . ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_testresult.at:41: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

PROBE_M_SHA=`sha1sum MT/manifest | cut -d ' ' -f 1`
PROBE_F_SHA=`sha1sum testfile | cut -d ' ' -f 1`
$at_traceoff
echo "t_testresult.at:41: test \$PROBE_M_SHA == \$ROOT_M_SHA"
echo t_testresult.at:41 >$at_check_line_file
( $at_traceon; test $PROBE_M_SHA == $ROOT_M_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_testresult.at:41: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_testresult.at:41: test \$PROBE_F_SHA == \$ROOT_F_SHA"
echo t_testresult.at:41 >$at_check_line_file
( $at_traceon; test $PROBE_F_SHA == $ROOT_F_SHA ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_testresult.at:41: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



cat >testfile <<'_ATEOF'
first line of the file
second line of the file
an insertion between second and third
third line of the file
_ATEOF



$at_traceoff
echo "t_testresult.at:50: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net testresult \$ROOT_M_SHA 1"
echo t_testresult.at:50 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net testresult $ROOT_M_SHA 1 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_testresult.at:50: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_testresult.at:51: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net testresult \$LEFT_GOOD_M_SHA 1"
echo t_testresult.at:51 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net testresult $LEFT_GOOD_M_SHA 1 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_testresult.at:51: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_testresult.at:52: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net testresult \$LEFT_BAD_M_SHA 0"
echo t_testresult.at:52 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net testresult $LEFT_BAD_M_SHA 0 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_testresult.at:52: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_testresult.at:53: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net update"
echo t_testresult.at:53 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net update ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_testresult.at:53: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# files should now be merged

cat >probe <<'_ATEOF'
first line of the file
an insertion between first and second
second line of the file
an insertion between second and third
third line of the file
_ATEOF


$at_traceoff
echo "t_testresult.at:64: cmp testfile probe"
echo t_testresult.at:64 >$at_check_line_file
( $at_traceon; cmp testfile probe ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_testresult.at:64: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


      $at_traceoff
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  25 ) # 25. t_singlecvs.at:3: importing a CVS file with one version
    at_setup_line='t_singlecvs.at:3'
    at_desc='importing a CVS file with one version'
    $at_quiet $ECHO_N " 25: importing a CVS file with one version        $ECHO_C"
    at_xfail=no
    (
      echo "25. t_singlecvs.at:3: testing ..."
      $at_traceon




cat >test_keys <<'_ATEOF'
[pubkey tester@test.net]
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCfN/cAMabgb6T7m8ksGnpQ7LO6hOdnc/7V
yivrRGtmpwSItljht1bmgLQF37KiSPoMEDUb1stfKxaMsYiy8iTyoQ+M2EVFP37n2rtnNZ0H
oVcQd2sRsCerQFh9nslRPymlkQXUlOiNFN6RlFNcdjkucqNe+YorFX21EYw7XuT5XwIBEQ==
[end]
[privkey tester@test.net]
npy0jyqbZdylFkMjdR9OvlqmDHuBGXpGFPt94h96aG+Lp+OdBCmWx8GueHk8FKkexwPqhRBM
PPopUeuwqxuSX+yEodMl5IHBmin0nLnbOeBjtasjemBFEmdNl/jPDF/AeQ2WHhanB731dSQc
vzLOQfKAYmfk56PPULi9oJJNUxaCkvsWtvaI+HUHZrjyyV7dA4Vsc6Jvx2Yf1+MdDAEGk/Rw
ZtP0LmuoiyvRDFqBF8aTmnotyb4kRKohnJ7VF+y6hYvmtMpM3TKnpR7EbojBzNPqKuO7nPUz
jGxA7F84O24Vbf128PNSI5vj4istow26aPjn28qPjfRrkV30WLL/dXfYJkfkTqglYnoEXvF/
xZoVxxNeAX58mgy0A1ErVxv8U7TwuP983GHEpLwy3gbiP+9akAJCr8r823DHmQqq5QDELibP
cuXZfOttpfVRkcbMhjeF0M6czc4HoKgHTAnf/18hzdZwGX/WWvRIBHImbUJ+mDbp2ByDTfKf
ErGXSvZ3HxCqBD8yx1SnXhV8IDHaBmV9wwYcN+H2cxOWGZk7g7xJS19+a3UQB3c3sSXQVJBp
6QpCZgysxkZwzuXDzzLZPT9SLZz4K2p7+7BwMbpy9ZxcyAzmiEtpA24UP06jtjFN7WcXAdx/
E5Gmoe9b1EiXWdReHjUGpc6k0LQ0PPXAwqrcGdwYbOLDZ5xsQ5AsEYSFtyTS60D1nHBcdNmW
M0eOUJFdJf/uNe/2EApc3a8TyEkZtVqiYtOVV3qDB9NmU4bVOkDqzl1F7zJwATWbmasSdkM3
6lxDkczBfCrEjH5p5Y8DU+ge4e4LRtknY9oBOJ7EQO0twYJg3k0=
[end]
_ATEOF


cat >test_hooks.lua <<'_ATEOF'

-- this is the "testing" set of lua hooks for monotone
-- it's intended to support self-tests, not for use in
-- production. just defines some of the std hooks.

function get_passphrase(keyid)
	return keyid
end

function non_blocking_rng_ok()
	return true
end

function get_manifest_cert_trust(signers, id, name, val)
   return true
end

function get_file_cert_trust(signers, id, name, val)
   return true
end

function accept_testresult_change(old_results, new_results)
   for test,res in pairs(old_results)
   do
      if res == true and new_results[test] ~= true
      then
	 return false
      end
   end
   return true
end

function get_author(branchname)
	return "tester@test.net"
end

function ignore_file(name)
	if (strfind(name, "test_hooks.lua")) then return true end
	if (strfind(name, "test.db")) then return true end
	return false
end

if (attr_functions == nil) then
  attr_functions = {}
end
attr_functions["test_attr"] =
  function(filename, value)
    io.write(string.format("test_attr:%s:%s\n", filename, value))
  end

_ATEOF


$at_traceoff
echo "t_singlecvs.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init"
echo t_singlecvs.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_singlecvs.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_singlecvs.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys"
echo t_singlecvs.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_singlecvs.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_singlecvs.at:5: rm test_keys"
echo t_singlecvs.at:5 >$at_check_line_file
( $at_traceon; rm test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_singlecvs.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



cat >importme.0 <<'_ATEOF'
version 0 of test file
_ATEOF


TSHA0=`sha1sum importme.0 | cut -d ' ' -f 1`

# build the cvs repository

CVSROOT=`pwd`/cvs-repository
$at_traceoff
echo "t_singlecvs.at:15: cvs -q -d \$CVSROOT init"
echo t_singlecvs.at:15 >$at_check_line_file
( $at_traceon; cvs -q -d $CVSROOT init ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_singlecvs.at:15: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_singlecvs.at:16: test -e \$CVSROOT"
echo t_singlecvs.at:16 >$at_check_line_file
( $at_traceon; test -e $CVSROOT ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_singlecvs.at:16: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_singlecvs.at:17: test -e \$CVSROOT/CVSROOT"
echo t_singlecvs.at:17 >$at_check_line_file
( $at_traceon; test -e $CVSROOT/CVSROOT ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_singlecvs.at:17: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_singlecvs.at:18: test -e \$CVSROOT/CVSROOT/history"
echo t_singlecvs.at:18 >$at_check_line_file
( $at_traceon; test -e $CVSROOT/CVSROOT/history ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_singlecvs.at:18: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# check out the working copy and make a commit

$at_traceoff
echo "t_singlecvs.at:22: cvs -d \$CVSROOT co ."
echo t_singlecvs.at:22 >$at_check_line_file
( $at_traceon; cvs -d $CVSROOT co . ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_singlecvs.at:22: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_singlecvs.at:23: mkdir testdir"
echo t_singlecvs.at:23 >$at_check_line_file
( $at_traceon; mkdir testdir ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_singlecvs.at:23: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_singlecvs.at:24: cp importme.0 testdir/importme"
echo t_singlecvs.at:24 >$at_check_line_file
( $at_traceon; cp importme.0 testdir/importme ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_singlecvs.at:24: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_singlecvs.at:25: cvs -d \$CVSROOT add testdir"
echo t_singlecvs.at:25 >$at_check_line_file
( $at_traceon; cvs -d $CVSROOT add testdir ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_singlecvs.at:25: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_singlecvs.at:26: cvs -d \$CVSROOT add testdir/importme"
echo t_singlecvs.at:26 >$at_check_line_file
( $at_traceon; cvs -d $CVSROOT add testdir/importme ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_singlecvs.at:26: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_singlecvs.at:27: cvs -d \$CVSROOT commit -m 'commit 0' testdir/importme"
echo t_singlecvs.at:27 >$at_check_line_file
( $at_traceon; cvs -d $CVSROOT commit -m 'commit 0' testdir/importme ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_singlecvs.at:27: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# import into monotone and check presence of file

$at_traceoff
echo "t_singlecvs.at:31: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch cvs_import \$CVSROOT/testdir"
echo t_singlecvs.at:31 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch cvs_import $CVSROOT/testdir ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_singlecvs.at:31: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_singlecvs.at:32: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net cat file \$TSHA0"
echo t_singlecvs.at:32 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net cat file $TSHA0 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_singlecvs.at:32: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


      $at_traceoff
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  26 ) # 26. t_singlenetsync.at:3: single manifest netsync
    at_setup_line='t_singlenetsync.at:3'
    at_desc='single manifest netsync'
    $at_quiet $ECHO_N " 26: single manifest netsync                      $ECHO_C"
    at_xfail=no
    (
      echo "26. t_singlenetsync.at:3: testing ..."
      $at_traceon




cat >test_keys <<'_ATEOF'
[pubkey tester@test.net]
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCfN/cAMabgb6T7m8ksGnpQ7LO6hOdnc/7V
yivrRGtmpwSItljht1bmgLQF37KiSPoMEDUb1stfKxaMsYiy8iTyoQ+M2EVFP37n2rtnNZ0H
oVcQd2sRsCerQFh9nslRPymlkQXUlOiNFN6RlFNcdjkucqNe+YorFX21EYw7XuT5XwIBEQ==
[end]
[privkey tester@test.net]
npy0jyqbZdylFkMjdR9OvlqmDHuBGXpGFPt94h96aG+Lp+OdBCmWx8GueHk8FKkexwPqhRBM
PPopUeuwqxuSX+yEodMl5IHBmin0nLnbOeBjtasjemBFEmdNl/jPDF/AeQ2WHhanB731dSQc
vzLOQfKAYmfk56PPULi9oJJNUxaCkvsWtvaI+HUHZrjyyV7dA4Vsc6Jvx2Yf1+MdDAEGk/Rw
ZtP0LmuoiyvRDFqBF8aTmnotyb4kRKohnJ7VF+y6hYvmtMpM3TKnpR7EbojBzNPqKuO7nPUz
jGxA7F84O24Vbf128PNSI5vj4istow26aPjn28qPjfRrkV30WLL/dXfYJkfkTqglYnoEXvF/
xZoVxxNeAX58mgy0A1ErVxv8U7TwuP983GHEpLwy3gbiP+9akAJCr8r823DHmQqq5QDELibP
cuXZfOttpfVRkcbMhjeF0M6czc4HoKgHTAnf/18hzdZwGX/WWvRIBHImbUJ+mDbp2ByDTfKf
ErGXSvZ3HxCqBD8yx1SnXhV8IDHaBmV9wwYcN+H2cxOWGZk7g7xJS19+a3UQB3c3sSXQVJBp
6QpCZgysxkZwzuXDzzLZPT9SLZz4K2p7+7BwMbpy9ZxcyAzmiEtpA24UP06jtjFN7WcXAdx/
E5Gmoe9b1EiXWdReHjUGpc6k0LQ0PPXAwqrcGdwYbOLDZ5xsQ5AsEYSFtyTS60D1nHBcdNmW
M0eOUJFdJf/uNe/2EApc3a8TyEkZtVqiYtOVV3qDB9NmU4bVOkDqzl1F7zJwATWbmasSdkM3
6lxDkczBfCrEjH5p5Y8DU+ge4e4LRtknY9oBOJ7EQO0twYJg3k0=
[end]
_ATEOF


cat >test_hooks.lua <<'_ATEOF'

-- this is the "testing" set of lua hooks for monotone
-- it's intended to support self-tests, not for use in
-- production. just defines some of the std hooks.

function get_passphrase(keyid)
	return keyid
end

function non_blocking_rng_ok()
	return true
end

function get_manifest_cert_trust(signers, id, name, val)
   return true
end

function get_file_cert_trust(signers, id, name, val)
   return true
end

function accept_testresult_change(old_results, new_results)
   for test,res in pairs(old_results)
   do
      if res == true and new_results[test] ~= true
      then
	 return false
      end
   end
   return true
end

function get_author(branchname)
	return "tester@test.net"
end

function ignore_file(name)
	if (strfind(name, "test_hooks.lua")) then return true end
	if (strfind(name, "test.db")) then return true end
	return false
end

if (attr_functions == nil) then
  attr_functions = {}
end
attr_functions["test_attr"] =
  function(filename, value)
    io.write(string.format("test_attr:%s:%s\n", filename, value))
  end

_ATEOF


$at_traceoff
echo "t_singlenetsync.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init"
echo t_singlenetsync.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_singlenetsync.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_singlenetsync.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys"
echo t_singlenetsync.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_singlenetsync.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_singlenetsync.at:5: rm test_keys"
echo t_singlenetsync.at:5 >$at_check_line_file
( $at_traceon; rm test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_singlenetsync.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_singlenetsync.at:6: cp test.db test2.db"
echo t_singlenetsync.at:6 >$at_check_line_file
( $at_traceon; cp test.db test2.db ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_singlenetsync.at:6: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


cat >netsync.lua <<'_ATEOF'

function get_netsync_read_permitted(collection, identity)
	return true
end

function get_netsync_write_permitted(collection, identity)
	return true
end
_ATEOF


cat >testfile <<'_ATEOF'
version 0 of test file
_ATEOF

$at_traceoff
echo "t_singlenetsync.at:20: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add testfile"
echo t_singlenetsync.at:20 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add testfile ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_singlenetsync.at:20: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_singlenetsync.at:21: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch --rcfile=netsync.lua commit blah-blah"
echo t_singlenetsync.at:21 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch --rcfile=netsync.lua commit blah-blah ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_singlenetsync.at:21: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

F_VER0=`sha1sum testfile | cut -d ' ' -f 1`
VER0=`sha1sum MT/manifest | cut -d ' ' -f 1`

killall -q -KILL monotone
         monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --rcfile=netsync.lua               serve 127.0.0.1:5555 testbranch &
$at_traceoff
echo "t_singlenetsync.at:27: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --rcfile=netsync.lua --db=test2.db pull 127.0.0.1:5555 testbranch"
echo t_singlenetsync.at:27 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --rcfile=netsync.lua --db=test2.db pull 127.0.0.1:5555 testbranch ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_singlenetsync.at:27: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

killall -q -KILL monotone

$at_traceoff
echo "t_singlenetsync.at:30: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --db=test2.db ls certs \$VER0"
echo t_singlenetsync.at:30 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --db=test2.db ls certs $VER0 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_singlenetsync.at:30: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_singlenetsync.at:31: mv stdout certs"
echo t_singlenetsync.at:31 >$at_check_line_file
( $at_traceon; mv stdout certs ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_singlenetsync.at:31: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_singlenetsync.at:32: grep date certs"
echo t_singlenetsync.at:32 >$at_check_line_file
( $at_traceon; grep date certs ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_singlenetsync.at:32: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_singlenetsync.at:33: grep author certs"
echo t_singlenetsync.at:33 >$at_check_line_file
( $at_traceon; grep author certs ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_singlenetsync.at:33: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_singlenetsync.at:34: grep branch certs"
echo t_singlenetsync.at:34 >$at_check_line_file
( $at_traceon; grep branch certs ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_singlenetsync.at:34: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_singlenetsync.at:35: grep changelog certs"
echo t_singlenetsync.at:35 >$at_check_line_file
( $at_traceon; grep changelog certs ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_singlenetsync.at:35: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_singlenetsync.at:36: grep bad certs"
echo t_singlenetsync.at:36 >$at_check_line_file
( $at_traceon; grep bad certs ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   1) ;;
   *) echo "t_singlenetsync.at:36: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_singlenetsync.at:38: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --db=test2.db cat manifest \$VER0"
echo t_singlenetsync.at:38 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --db=test2.db cat manifest $VER0 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_singlenetsync.at:38: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

CHK=`sha1sum stdout | cut -d ' ' -f 1`
$at_traceoff
echo "t_singlenetsync.at:40: test \$CHK == \$VER0"
echo t_singlenetsync.at:40 >$at_check_line_file
( $at_traceon; test $CHK == $VER0 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_singlenetsync.at:40: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_singlenetsync.at:42: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --db=test2.db cat file \$F_VER0"
echo t_singlenetsync.at:42 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --db=test2.db cat file $F_VER0 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_singlenetsync.at:42: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

CHK=`sha1sum stdout | cut -d ' ' -f 1`
$at_traceoff
echo "t_singlenetsync.at:44: test \$CHK == \$F_VER0"
echo t_singlenetsync.at:44 >$at_check_line_file
( $at_traceon; test $CHK == $F_VER0 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_singlenetsync.at:44: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_singlenetsync.at:46: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db info"
echo t_singlenetsync.at:46 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db info ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_singlenetsync.at:46: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

INFO1=`sha1sum stdout | cut -d ' ' -f 1`
$at_traceoff
echo "t_singlenetsync.at:48: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --db=test2.db db info"
echo t_singlenetsync.at:48 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --db=test2.db db info ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_singlenetsync.at:48: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

INFO2=`sha1sum stdout | cut -d ' ' -f 1`
$at_traceoff
echo "t_singlenetsync.at:50: test \$INFO1 == \$INFO2"
echo t_singlenetsync.at:50 >$at_check_line_file
( $at_traceon; test $INFO1 == $INFO2 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_singlenetsync.at:50: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


      $at_traceoff
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  27 ) # 27. t_ls_missing.at:3: list missing files
    at_setup_line='t_ls_missing.at:3'
    at_desc='list missing files'
    $at_quiet $ECHO_N " 27: list missing files                           $ECHO_C"
    at_xfail=no
    (
      echo "27. t_ls_missing.at:3: testing ..."
      $at_traceon




cat >test_keys <<'_ATEOF'
[pubkey tester@test.net]
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCfN/cAMabgb6T7m8ksGnpQ7LO6hOdnc/7V
yivrRGtmpwSItljht1bmgLQF37KiSPoMEDUb1stfKxaMsYiy8iTyoQ+M2EVFP37n2rtnNZ0H
oVcQd2sRsCerQFh9nslRPymlkQXUlOiNFN6RlFNcdjkucqNe+YorFX21EYw7XuT5XwIBEQ==
[end]
[privkey tester@test.net]
npy0jyqbZdylFkMjdR9OvlqmDHuBGXpGFPt94h96aG+Lp+OdBCmWx8GueHk8FKkexwPqhRBM
PPopUeuwqxuSX+yEodMl5IHBmin0nLnbOeBjtasjemBFEmdNl/jPDF/AeQ2WHhanB731dSQc
vzLOQfKAYmfk56PPULi9oJJNUxaCkvsWtvaI+HUHZrjyyV7dA4Vsc6Jvx2Yf1+MdDAEGk/Rw
ZtP0LmuoiyvRDFqBF8aTmnotyb4kRKohnJ7VF+y6hYvmtMpM3TKnpR7EbojBzNPqKuO7nPUz
jGxA7F84O24Vbf128PNSI5vj4istow26aPjn28qPjfRrkV30WLL/dXfYJkfkTqglYnoEXvF/
xZoVxxNeAX58mgy0A1ErVxv8U7TwuP983GHEpLwy3gbiP+9akAJCr8r823DHmQqq5QDELibP
cuXZfOttpfVRkcbMhjeF0M6czc4HoKgHTAnf/18hzdZwGX/WWvRIBHImbUJ+mDbp2ByDTfKf
ErGXSvZ3HxCqBD8yx1SnXhV8IDHaBmV9wwYcN+H2cxOWGZk7g7xJS19+a3UQB3c3sSXQVJBp
6QpCZgysxkZwzuXDzzLZPT9SLZz4K2p7+7BwMbpy9ZxcyAzmiEtpA24UP06jtjFN7WcXAdx/
E5Gmoe9b1EiXWdReHjUGpc6k0LQ0PPXAwqrcGdwYbOLDZ5xsQ5AsEYSFtyTS60D1nHBcdNmW
M0eOUJFdJf/uNe/2EApc3a8TyEkZtVqiYtOVV3qDB9NmU4bVOkDqzl1F7zJwATWbmasSdkM3
6lxDkczBfCrEjH5p5Y8DU+ge4e4LRtknY9oBOJ7EQO0twYJg3k0=
[end]
_ATEOF


cat >test_hooks.lua <<'_ATEOF'

-- this is the "testing" set of lua hooks for monotone
-- it's intended to support self-tests, not for use in
-- production. just defines some of the std hooks.

function get_passphrase(keyid)
	return keyid
end

function non_blocking_rng_ok()
	return true
end

function get_manifest_cert_trust(signers, id, name, val)
   return true
end

function get_file_cert_trust(signers, id, name, val)
   return true
end

function accept_testresult_change(old_results, new_results)
   for test,res in pairs(old_results)
   do
      if res == true and new_results[test] ~= true
      then
	 return false
      end
   end
   return true
end

function get_author(branchname)
	return "tester@test.net"
end

function ignore_file(name)
	if (strfind(name, "test_hooks.lua")) then return true end
	if (strfind(name, "test.db")) then return true end
	return false
end

if (attr_functions == nil) then
  attr_functions = {}
end
attr_functions["test_attr"] =
  function(filename, value)
    io.write(string.format("test_attr:%s:%s\n", filename, value))
  end

_ATEOF


$at_traceoff
echo "t_ls_missing.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init"
echo t_ls_missing.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_ls_missing.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_ls_missing.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys"
echo t_ls_missing.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_ls_missing.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_ls_missing.at:5: rm test_keys"
echo t_ls_missing.at:5 >$at_check_line_file
( $at_traceon; rm test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_ls_missing.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



cat >foo <<'_ATEOF'
the foo file
_ATEOF


cat >bar <<'_ATEOF'
the bar file
_ATEOF


$at_traceoff
echo "t_ls_missing.at:13: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net ls missing"
echo t_ls_missing.at:13 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net ls missing ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_ls_missing.at:13: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_ls_missing.at:15: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add foo bar"
echo t_ls_missing.at:15 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add foo bar ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_ls_missing.at:15: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_ls_missing.at:16: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net ls missing"
echo t_ls_missing.at:16 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net ls missing ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_ls_missing.at:16: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_ls_missing.at:18: rm foo"
echo t_ls_missing.at:18 >$at_check_line_file
( $at_traceon; rm foo ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_ls_missing.at:18: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_ls_missing.at:20: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net ls missing"
echo t_ls_missing.at:20 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net ls missing ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo >>$at_stdout; echo "foo
" | $at_diff - $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_ls_missing.at:20: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_ls_missing.at:22: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net drop foo"
echo t_ls_missing.at:22 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net drop foo ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_ls_missing.at:22: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_ls_missing.at:23: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net ls missing"
echo t_ls_missing.at:23 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net ls missing ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_ls_missing.at:23: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_ls_missing.at:25: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit 'committed'"
echo t_ls_missing.at:25 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit 'committed' ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_ls_missing.at:25: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_ls_missing.at:26: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net ls missing"
echo t_ls_missing.at:26 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net ls missing ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_ls_missing.at:26: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_ls_missing.at:28: rm bar"
echo t_ls_missing.at:28 >$at_check_line_file
( $at_traceon; rm bar ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_ls_missing.at:28: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_ls_missing.at:30: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net ls missing"
echo t_ls_missing.at:30 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net ls missing ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo >>$at_stdout; echo "bar
" | $at_diff - $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_ls_missing.at:30: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_ls_missing.at:32: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net drop bar"
echo t_ls_missing.at:32 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net drop bar ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_ls_missing.at:32: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_ls_missing.at:33: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net ls missing"
echo t_ls_missing.at:33 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net ls missing ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_ls_missing.at:33: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


      $at_traceoff
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  28 ) # 28. t_attributes.at:3: attribute support
    at_setup_line='t_attributes.at:3'
    at_desc='attribute support'
    $at_quiet $ECHO_N " 28: attribute support                            $ECHO_C"
    at_xfail=no
    (
      echo "28. t_attributes.at:3: testing ..."
      $at_traceon




cat >test_keys <<'_ATEOF'
[pubkey tester@test.net]
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCfN/cAMabgb6T7m8ksGnpQ7LO6hOdnc/7V
yivrRGtmpwSItljht1bmgLQF37KiSPoMEDUb1stfKxaMsYiy8iTyoQ+M2EVFP37n2rtnNZ0H
oVcQd2sRsCerQFh9nslRPymlkQXUlOiNFN6RlFNcdjkucqNe+YorFX21EYw7XuT5XwIBEQ==
[end]
[privkey tester@test.net]
npy0jyqbZdylFkMjdR9OvlqmDHuBGXpGFPt94h96aG+Lp+OdBCmWx8GueHk8FKkexwPqhRBM
PPopUeuwqxuSX+yEodMl5IHBmin0nLnbOeBjtasjemBFEmdNl/jPDF/AeQ2WHhanB731dSQc
vzLOQfKAYmfk56PPULi9oJJNUxaCkvsWtvaI+HUHZrjyyV7dA4Vsc6Jvx2Yf1+MdDAEGk/Rw
ZtP0LmuoiyvRDFqBF8aTmnotyb4kRKohnJ7VF+y6hYvmtMpM3TKnpR7EbojBzNPqKuO7nPUz
jGxA7F84O24Vbf128PNSI5vj4istow26aPjn28qPjfRrkV30WLL/dXfYJkfkTqglYnoEXvF/
xZoVxxNeAX58mgy0A1ErVxv8U7TwuP983GHEpLwy3gbiP+9akAJCr8r823DHmQqq5QDELibP
cuXZfOttpfVRkcbMhjeF0M6czc4HoKgHTAnf/18hzdZwGX/WWvRIBHImbUJ+mDbp2ByDTfKf
ErGXSvZ3HxCqBD8yx1SnXhV8IDHaBmV9wwYcN+H2cxOWGZk7g7xJS19+a3UQB3c3sSXQVJBp
6QpCZgysxkZwzuXDzzLZPT9SLZz4K2p7+7BwMbpy9ZxcyAzmiEtpA24UP06jtjFN7WcXAdx/
E5Gmoe9b1EiXWdReHjUGpc6k0LQ0PPXAwqrcGdwYbOLDZ5xsQ5AsEYSFtyTS60D1nHBcdNmW
M0eOUJFdJf/uNe/2EApc3a8TyEkZtVqiYtOVV3qDB9NmU4bVOkDqzl1F7zJwATWbmasSdkM3
6lxDkczBfCrEjH5p5Y8DU+ge4e4LRtknY9oBOJ7EQO0twYJg3k0=
[end]
_ATEOF


cat >test_hooks.lua <<'_ATEOF'

-- this is the "testing" set of lua hooks for monotone
-- it's intended to support self-tests, not for use in
-- production. just defines some of the std hooks.

function get_passphrase(keyid)
	return keyid
end

function non_blocking_rng_ok()
	return true
end

function get_manifest_cert_trust(signers, id, name, val)
   return true
end

function get_file_cert_trust(signers, id, name, val)
   return true
end

function accept_testresult_change(old_results, new_results)
   for test,res in pairs(old_results)
   do
      if res == true and new_results[test] ~= true
      then
	 return false
      end
   end
   return true
end

function get_author(branchname)
	return "tester@test.net"
end

function ignore_file(name)
	if (strfind(name, "test_hooks.lua")) then return true end
	if (strfind(name, "test.db")) then return true end
	return false
end

if (attr_functions == nil) then
  attr_functions = {}
end
attr_functions["test_attr"] =
  function(filename, value)
    io.write(string.format("test_attr:%s:%s\n", filename, value))
  end

_ATEOF


$at_traceoff
echo "t_attributes.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init"
echo t_attributes.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_attributes.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_attributes.at:5: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys"
echo t_attributes.at:5 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_attributes.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_attributes.at:5: rm test_keys"
echo t_attributes.at:5 >$at_check_line_file
( $at_traceon; rm test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_attributes.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



cat >foo <<'_ATEOF'
some data
_ATEOF

# Check a single character filename too, because those have had bugs.
cat >a <<'_ATEOF'
some data
_ATEOF

cat >.mt-attrs <<'_ATEOF'
test_attr true foo
test_attr 1 a
_ATEOF


$at_traceoff
echo "t_attributes.at:17: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add foo"
echo t_attributes.at:17 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add foo ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_attributes.at:17: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_attributes.at:18: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add .mt-attrs"
echo t_attributes.at:18 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add .mt-attrs ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_attributes.at:18: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_attributes.at:19: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit blah-blah"
echo t_attributes.at:19 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit blah-blah ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_attributes.at:19: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

CO_M_SHA1=`sha1sum MT/manifest | cut -d ' ' -f 1`

cat >.mt-attrs <<'_ATEOF'
test_attr 2 a
_ATEOF

$at_traceoff
echo "t_attributes.at:24: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit blah-blah"
echo t_attributes.at:24 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit blah-blah ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_attributes.at:24: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

UPDATE_M_SHA1=`sha1sum MT/manifest | cut -d ' ' -f 1`

# Check checkouts.
$at_traceoff
echo "t_attributes.at:28: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout \$CO_M_SHA1 co-dir"
echo t_attributes.at:28 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout $CO_M_SHA1 co-dir ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_attributes.at:28: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_attributes.at:29: grep \"test_attr:foo:true\" stdout"
echo t_attributes.at:29 >$at_check_line_file
( $at_traceon; grep "test_attr:foo:true" stdout ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_attributes.at:29: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_attributes.at:30: grep \"test_attr:a:1\" stdout"
echo t_attributes.at:30 >$at_check_line_file
( $at_traceon; grep "test_attr:a:1" stdout ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_attributes.at:30: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# Check updates.
$at_traceoff
echo "t_attributes.at:33: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout \$UPDATE_M_SHA1 co-dir"
echo t_attributes.at:33 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout $UPDATE_M_SHA1 co-dir ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_attributes.at:33: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_attributes.at:34: grep \"test_attr:foo\" stdout"
echo t_attributes.at:34 >$at_check_line_file
( $at_traceon; grep "test_attr:foo" stdout ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   1) ;;
   *) echo "t_attributes.at:34: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_attributes.at:35: grep \"test_attr:a:2\" stdout"
echo t_attributes.at:35 >$at_check_line_file
( $at_traceon; grep "test_attr:a:2" stdout ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_attributes.at:35: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


      $at_traceoff
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  29 ) # 29. t_single_char_filenames.at:6: single character filename support
    at_setup_line='t_single_char_filenames.at:6'
    at_desc='single character filename support'
    $at_quiet $ECHO_N " 29: single character filename support            $ECHO_C"
    at_xfail=no
    (
      echo "29. t_single_char_filenames.at:6: testing ..."
      $at_traceon




cat >test_keys <<'_ATEOF'
[pubkey tester@test.net]
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCfN/cAMabgb6T7m8ksGnpQ7LO6hOdnc/7V
yivrRGtmpwSItljht1bmgLQF37KiSPoMEDUb1stfKxaMsYiy8iTyoQ+M2EVFP37n2rtnNZ0H
oVcQd2sRsCerQFh9nslRPymlkQXUlOiNFN6RlFNcdjkucqNe+YorFX21EYw7XuT5XwIBEQ==
[end]
[privkey tester@test.net]
npy0jyqbZdylFkMjdR9OvlqmDHuBGXpGFPt94h96aG+Lp+OdBCmWx8GueHk8FKkexwPqhRBM
PPopUeuwqxuSX+yEodMl5IHBmin0nLnbOeBjtasjemBFEmdNl/jPDF/AeQ2WHhanB731dSQc
vzLOQfKAYmfk56PPULi9oJJNUxaCkvsWtvaI+HUHZrjyyV7dA4Vsc6Jvx2Yf1+MdDAEGk/Rw
ZtP0LmuoiyvRDFqBF8aTmnotyb4kRKohnJ7VF+y6hYvmtMpM3TKnpR7EbojBzNPqKuO7nPUz
jGxA7F84O24Vbf128PNSI5vj4istow26aPjn28qPjfRrkV30WLL/dXfYJkfkTqglYnoEXvF/
xZoVxxNeAX58mgy0A1ErVxv8U7TwuP983GHEpLwy3gbiP+9akAJCr8r823DHmQqq5QDELibP
cuXZfOttpfVRkcbMhjeF0M6czc4HoKgHTAnf/18hzdZwGX/WWvRIBHImbUJ+mDbp2ByDTfKf
ErGXSvZ3HxCqBD8yx1SnXhV8IDHaBmV9wwYcN+H2cxOWGZk7g7xJS19+a3UQB3c3sSXQVJBp
6QpCZgysxkZwzuXDzzLZPT9SLZz4K2p7+7BwMbpy9ZxcyAzmiEtpA24UP06jtjFN7WcXAdx/
E5Gmoe9b1EiXWdReHjUGpc6k0LQ0PPXAwqrcGdwYbOLDZ5xsQ5AsEYSFtyTS60D1nHBcdNmW
M0eOUJFdJf/uNe/2EApc3a8TyEkZtVqiYtOVV3qDB9NmU4bVOkDqzl1F7zJwATWbmasSdkM3
6lxDkczBfCrEjH5p5Y8DU+ge4e4LRtknY9oBOJ7EQO0twYJg3k0=
[end]
_ATEOF


cat >test_hooks.lua <<'_ATEOF'

-- this is the "testing" set of lua hooks for monotone
-- it's intended to support self-tests, not for use in
-- production. just defines some of the std hooks.

function get_passphrase(keyid)
	return keyid
end

function non_blocking_rng_ok()
	return true
end

function get_manifest_cert_trust(signers, id, name, val)
   return true
end

function get_file_cert_trust(signers, id, name, val)
   return true
end

function accept_testresult_change(old_results, new_results)
   for test,res in pairs(old_results)
   do
      if res == true and new_results[test] ~= true
      then
	 return false
      end
   end
   return true
end

function get_author(branchname)
	return "tester@test.net"
end

function ignore_file(name)
	if (strfind(name, "test_hooks.lua")) then return true end
	if (strfind(name, "test.db")) then return true end
	return false
end

if (attr_functions == nil) then
  attr_functions = {}
end
attr_functions["test_attr"] =
  function(filename, value)
    io.write(string.format("test_attr:%s:%s\n", filename, value))
  end

_ATEOF


$at_traceoff
echo "t_single_char_filenames.at:8: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init"
echo t_single_char_filenames.at:8 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net db init ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_single_char_filenames.at:8: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_single_char_filenames.at:8: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys"
echo t_single_char_filenames.at:8 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net read <test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_single_char_filenames.at:8: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_single_char_filenames.at:8: rm test_keys"
echo t_single_char_filenames.at:8 >$at_check_line_file
( $at_traceon; rm test_keys ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_single_char_filenames.at:8: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



cat >a <<'_ATEOF'
some data
_ATEOF


$at_traceoff
echo "t_single_char_filenames.at:13: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add a"
echo t_single_char_filenames.at:13 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net add a ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_single_char_filenames.at:13: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_single_char_filenames.at:14: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit blah-blah"
echo t_single_char_filenames.at:14 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net --branch=testbranch commit blah-blah ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_single_char_filenames.at:14: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

A_M_SHA1=`sha1sum MT/manifest | cut -d ' ' -f 1`

$at_traceoff
echo "t_single_char_filenames.at:17: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net rename a b"
echo t_single_char_filenames.at:17 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net rename a b ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_single_char_filenames.at:17: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_single_char_filenames.at:18: mv a b"
echo t_single_char_filenames.at:18 >$at_check_line_file
( $at_traceon; mv a b ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_single_char_filenames.at:18: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_single_char_filenames.at:19: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit blah-blah"
echo t_single_char_filenames.at:19 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit blah-blah ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_single_char_filenames.at:19: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

B_M_SHA1=`sha1sum MT/manifest | cut -d ' ' -f 1`

$at_traceoff
echo "t_single_char_filenames.at:22: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net drop b"
echo t_single_char_filenames.at:22 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net drop b ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_single_char_filenames.at:22: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_single_char_filenames.at:23: rm -f b"
echo t_single_char_filenames.at:23 >$at_check_line_file
( $at_traceon; rm -f b ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_single_char_filenames.at:23: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_single_char_filenames.at:24: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit blah-blah"
echo t_single_char_filenames.at:24 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net commit blah-blah ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_single_char_filenames.at:24: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

NULL_M_SHA1=`sha1sum MT/manifest | cut -d ' ' -f 1`

$at_traceoff
echo "t_single_char_filenames.at:27: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout \$A_M_SHA1 a-dir"
echo t_single_char_filenames.at:27 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout $A_M_SHA1 a-dir ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_single_char_filenames.at:27: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_single_char_filenames.at:28: test -e a-dir/a"
echo t_single_char_filenames.at:28 >$at_check_line_file
( $at_traceon; test -e a-dir/a ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_single_char_filenames.at:28: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_single_char_filenames.at:29: test ! -e a-dir/b"
echo t_single_char_filenames.at:29 >$at_check_line_file
( $at_traceon; test ! -e a-dir/b ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_single_char_filenames.at:29: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_single_char_filenames.at:31: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout \$B_M_SHA1 b-dir"
echo t_single_char_filenames.at:31 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout $B_M_SHA1 b-dir ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_single_char_filenames.at:31: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_single_char_filenames.at:32: test ! -e b-dir/a"
echo t_single_char_filenames.at:32 >$at_check_line_file
( $at_traceon; test ! -e b-dir/a ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_single_char_filenames.at:32: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_single_char_filenames.at:33: test -e b-dir/b"
echo t_single_char_filenames.at:33 >$at_check_line_file
( $at_traceon; test -e b-dir/b ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_single_char_filenames.at:33: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_single_char_filenames.at:35: monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout \$NULL_M_SHA1 null-dir"
echo t_single_char_filenames.at:35 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_hooks.lua --nostd --norc --db=test.db --key=tester@test.net checkout $NULL_M_SHA1 null-dir ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_single_char_filenames.at:35: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_single_char_filenames.at:36: test ! -e null-dir/a"
echo t_single_char_filenames.at:36 >$at_check_line_file
( $at_traceon; test ! -e null-dir/a ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_single_char_filenames.at:36: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_single_char_filenames.at:37: test ! -e null-dir/b"
echo t_single_char_filenames.at:37 >$at_check_line_file
( $at_traceon; test ! -e null-dir/b ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
$at_diff $at_devnull $at_stderr || at_failed=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_single_char_filenames.at:37: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


      $at_traceoff
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;


  * )
    echo "$as_me: no such test group: $at_group" >&2
    continue
    ;;
  esac

  # Be sure to come back to the suite directory, in particular
  # since below we might `rm' the group directory we are in currently.
  cd $at_suite_dir

  case $at_group in
    banner-*) ;;
    *)
      if test ! -f $at_check_line_file; then
	sed "s/^ */$as_me: warning: /" <<_ATEOF
	A failure happened in a test group before any test could be
	run. This means that test suite is improperly designed.  Please
	report this failure to <graydon@pobox.com>.
_ATEOF
    	echo "$at_setup_line" >$at_check_line_file
      fi
      at_group_count=`expr 1 + $at_group_count`
      $at_verbose $ECHO_N "$at_group. $at_setup_line: $ECHO_C"
      echo $ECHO_N "$at_group. $at_setup_line: $ECHO_C" >> $at_group_log
      case $at_xfail:$at_status in
	yes:0)
	    at_msg="UNEXPECTED PASS"
	    at_xpass_list="$at_xpass_list $at_group"
	    at_errexit=$at_errexit_p
	    ;;
	no:0)
	    at_msg="ok"
	    at_pass_list="$at_pass_list $at_group"
	    at_errexit=false
	    ;;
	*:77)
	    at_msg="skipped (`cat $at_check_line_file`)"
	    at_skip_list="$at_skip_list $at_group"
	    at_errexit=false
	    ;;
	yes:*)
	    at_msg="expected failure (`cat $at_check_line_file`)"
	    at_xfail_list="$at_xfail_list $at_group"
	    at_errexit=false
	    ;;
	no:*)
	    at_msg="FAILED (`cat $at_check_line_file`)"
	    at_fail_list="$at_fail_list $at_group"
	    at_errexit=$at_errexit_p
	    ;;
      esac
      echo $at_msg
      at_log_msg="$at_group. $at_desc ($at_setup_line): $at_msg"
      case $at_status in
	0|77)
	  # $at_times_file is only available if the group succeeded.
	  # We're not including the group log, so the success message
	  # is written in the global log separately.  But we also
	  # write to the group log in case they're using -d.
	  if test -f $at_times_file; then
	    at_log_msg="$at_log_msg	(`sed 1d $at_times_file`)"
	    rm -f $at_times_file
          fi
	  echo "$at_log_msg" >> $at_group_log
	  echo "$at_log_msg" >&5

	  # Cleanup the group directory, unless the user wants the files.
	  $at_debug_p || rm -rf $at_group_dir
	  ;;
	*)
	  # Upon failure, include the log into the testsuite's global
	  # log.  The failure message is written in the group log.  It
	  # is later included in the global log.
	  echo "$at_log_msg" >> $at_group_log

	  # Upon failure, keep the group directory for autopsy, and
	  # create the debugging script.
	  {
	    echo "#! /bin/sh"
	    echo 'test "${ZSH_VERSION+set}" = set && alias -g '\''${1+"$@"}'\''='\''"$@"'\'''
	    echo "cd $at_dir"
	    echo 'exec ${CONFIG_SHELL-'"$SHELL"'}' "$0" \
	         '-v -d' "$at_debug_args" "$at_group" '${1+"$@"}'
	    echo 'exit 1'
	  } >$at_group_dir/run
	  chmod +x $at_group_dir/run
	  $at_errexit && break
	  ;;
      esac
      ;;
  esac
done

# Back to the top directory.
cd $at_dir

# Compute the duration of the suite.
at_stop_date=`date`
at_stop_time=`(date +%s) 2>/dev/null`
echo "$as_me: ending at: $at_stop_date" >&5
at_duration_s=`(expr $at_stop_time - $at_start_time) 2>/dev/null`
at_duration_m=`(expr $at_duration_s / 60) 2>/dev/null`
at_duration_h=`(expr $at_duration_m / 60) 2>/dev/null`
at_duration_s=`(expr $at_duration_s % 60) 2>/dev/null`
at_duration_m=`(expr $at_duration_m % 60) 2>/dev/null`
at_duration="${at_duration_h}h ${at_duration_m}m ${at_duration_s}s"
if test "$at_duration" != "h m s"; then
  echo "$as_me: test suite duration: $at_duration" >&5
fi

# Wrap up the test suite with summary statistics.
at_skip_count=`set dummy $at_skip_list; shift; echo $#`
at_fail_count=`set dummy $at_fail_list; shift; echo $#`
at_xpass_count=`set dummy $at_xpass_list; shift; echo $#`
at_xfail_count=`set dummy $at_xfail_list; shift; echo $#`

at_run_count=`expr $at_group_count - $at_skip_count`
at_unexpected_count=`expr $at_xpass_count + $at_fail_count`
at_total_fail_count=`expr $at_xfail_count + $at_fail_count`

echo
cat <<\_ASBOX
## ------------- ##
## Test results. ##
## ------------- ##
_ASBOX
echo
{
  echo
  cat <<\_ASBOX
## ------------- ##
## Test results. ##
## ------------- ##
_ASBOX
  echo
} >&5

if test $at_run_count = 1; then
  at_result="1 test"
  at_were=was
else
  at_result="$at_run_count tests"
  at_were=were
fi
if $at_errexit_p && test $at_unexpected_count != 0; then
  if test $at_xpass_count = 1; then
    at_result="$at_result $at_were run, one passed"
  else
    at_result="$at_result $at_were run, one failed"
  fi
  at_result="$at_result unexpectedly and inhibited subsequent tests."
else
  # Don't you just love exponential explosion of the number of cases?
  case $at_xpass_count:$at_fail_count:$at_xfail_count in
    # So far, so good.
    0:0:0) at_result="$at_result $at_were successful." ;;
    0:0:*) at_result="$at_result behaved as expected." ;;

    # Some unexpected failures
    0:*:0) at_result="$at_result $at_were run,
$at_fail_count failed unexpectedly." ;;

    # Some failures, both expected and unexpected
    0:*:1) at_result="$at_result $at_were run,
$at_total_fail_count failed ($at_xfail_count expected failure)." ;;
    0:*:*) at_result="$at_result $at_were run,
$at_total_fail_count failed ($at_xfail_count expected failures)." ;;

    # No unexpected failures, but some xpasses
    *:0:*) at_result="$at_result $at_were run,
$at_xpass_count passed unexpectedly." ;;

    # No expected failures, but failures and xpasses
    *:1:0) at_result="$at_result $at_were run,
$at_unexpected_count did not behave as expected ($at_fail_count unexpected failure)." ;;
    *:*:0) at_result="$at_result $at_were run,
$at_unexpected_count did not behave as expected ($at_fail_count unexpected failures)." ;;

    # All of them.
    *:*:1) at_result="$at_result $at_were run,
$at_xpass_count passed unexpectedly,
$at_total_fail_count failed ($at_xfail_count expected failure)." ;;
    *:*:*) at_result="$at_result $at_were run,
$at_xpass_count passed unexpectedly,
$at_total_fail_count failed ($at_xfail_count expected failures)." ;;
  esac

  if test $at_skip_count = 0 && test $at_run_count -gt 1; then
    at_result="All $at_result"
  fi
fi

# Now put skips in the mix.
case $at_skip_count in
  0) ;;
  1) at_result="$at_result
1 test was skipped." ;;
  *) at_result="$at_result
$at_skip_count tests were skipped." ;;
esac

if test $at_unexpected_count = 0; then
  echo "$at_result"
  echo "$at_result" >&5
else
  echo "ERROR: $at_result" >&2
  echo "ERROR: $at_result" >&5
  {
    echo
    cat <<\_ASBOX
## ------------------------ ##
## Summary of the failures. ##
## ------------------------ ##
_ASBOX

    # Summary of failed and skipped tests.
    if test $at_fail_count != 0; then
      echo "Failed tests:"
      $SHELL $0 $at_fail_list --list
      echo
    fi
    if test $at_skip_count != 0; then
      echo "Skipped tests:"
      $SHELL $0 $at_skip_list --list
      echo
    fi
    if test $at_xpass_count != 0; then
      echo "Unexpected passes:"
      $SHELL $0 $at_xpass_list --list
      echo
    fi
    if test $at_fail_count != 0; then
      cat <<\_ASBOX
## ---------------------- ##
## Detailed failed tests. ##
## ---------------------- ##
_ASBOX
      echo
      for at_group in $at_fail_list
      do
        # Normalize the test group number.
        at_group_normalized=`expr "00000$at_group" : ".*\($at_format\)"`
        # Create a fresh directory for the next test group, and enter.
        at_group_dir=$at_suite_dir/$at_group_normalized
        at_group_log=$at_group_dir/$as_me.log
        cat $at_group_log
        echo
      done
      echo
    fi
    if test -n "$at_top_srcdir"; then
      sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
## $at_top_builddir/config.log ##
_ASBOX
      sed 's/^/| /' $at_top_builddir/config.log
      echo
    fi
  } >&5

  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
## $as_me.log was created. ##
_ASBOX

  echo
  echo "Please send \`$as_me.log' and all information you think might help:"
  echo
  echo "   To: <graydon@pobox.com>"
  echo "   Subject: [monotone 0.13] $as_me:$at_fail_list${at_fail_list:+ failed${at_xpass_list:+,}}$at_xpass_list${at_xpass_list:+ passed unexpectedly}"
  echo
  if test $at_debug_p = false; then
    echo
    echo 'You may investigate any problem if you feel able to do so, in which'
    echo 'case the test suite provides a good starting point.'
    echo
  fi
    exit 1
fi

exit 0


