#! /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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172'
# 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_merge_add.at:1;merging adds;;
12;t_related_merge2_data.at:1;merging data in unrelated files;;
13;t_merge2_add.at:1;merging adds in unrelated revisions;;
14;t_merge2_data.at:1;merging data in unrelated revisions;;
15;t_unidiff2.at:3;calculation of incorrect unidiffs;;
16;t_cwork.at:3;delete work file on checkout;;
17;t_revert.at:3;revert file to base version;;
18;t_add.at:3;addition of files and directories;;
19;t_drop.at:3;add and then drop file does nothing;;
20;t_drop_missing.at:3;drop missing and unknown files;;
21;t_cross.at:3;creating a bad criss-cross merge;;
22;t_rename.at:3;renaming a file;;
23;t_renamed.at:3;renaming a directory;;
24;t_erename.at:3;renaming and editing a file;;
25;t_cvsimport.at:3;importing CVS files;;
26;t_i18n_file.at:3;importing files with non-english names;;
27;t_fmerge.at:3;external unit test of the line merger;;
28;t_netsync.at:3;exchanging work via netsync;netsync;
29;t_netsync_single.at:3;single manifest netsync;netsync;
30;t_netsync_pubkey.at:1;netsync transfers public keys;netsync;
31;t_netsync_repeated.at:1;repeatedly exchanging work via netsync;netsync;
32;t_netsync_unrelated.at:1;(normal) netsync on partially unrelated revisions;netsync;
33;t_disapprove.at:3;disapproving of a revision;;
34;t_testresult.at:3;creating a good and bad test result;;
35;t_singlecvs.at:3;importing a CVS file with one version;;
36;t_ls_missing.at:3;list missing files;;
37;t_attributes.at:3;attr set/get commands;;
38;t_single_char_filenames.at:6;single character filename support;;
39;t_restrictions.at:3;manifest restrictions;;
40;t_subdirs.at:3;subdirectory restrictions;;
41;t_movepatch.at:3;renaming a patched file;;
42;t_movedel.at:3;renaming a deleted file;;
43;t_remerge.at:3;merging a rename twice;;
44;t_update_missing.at:3;updating from a merge which adds a file;;
45;t_chkeypass.at:3;changing passphrase of a private key;;
46;t_diff_added_file.at:3;diffing a revision with an added file;;
47;t_update_to_revision.at:3;updating to a given revision;;
48;t_heads.at:3;'heads';;
49;t_heads_discontinuous_branch.at:3;'heads' with discontinuous branches;;
50;t_merge_1.at:1;test a merge;;
51;t_merge_2.at:1;test a merge 2;;
52;t_tags.at:3;tags and tagging of revisions;;
53;t_add_dot.at:1;monotone add .;;
54;t_cleanup_empty_dir.at:1;(minor) update cleans emptied directories;;
55;t_merge_add_del.at:3;(imp) merging <add a> with <add a, drop a>;;
56;t_add_edge.at:1;merging an add edge;;
57;t_patch_drop_add.at:1;merge(<>, <patch a, drop a, add a>);;
58;t_add_drop_add.at:1;merge(<>, <add a, drop a, add a>);;
59;t_merge2_add_drop_add.at:1;merge(<add a>, <add a, drop a, add a>);;
60;t_add_patch_drop_add.at:1;merge(<>, <add a, patch a, drop a, add a>);;
61;t_patch_vs_drop_add.at:1;merge(<patch a>, <drop a, add a>);;
62;t_explicit_merge.at:1;explicit_merge;;
63;t_ambig_update.at:1;update with multiple candidates;;
64;t_checkout_dir.at:1;checkout validates target directory;;
65;t_checkout_options.at:1;checkout creates right MT/options;;
66;t_trusted.at:1;trust hooks and 'trusted' command;;
67;t_attr.at:1;attr set adds .mt-attrs;;
68;t_rcfile_required.at:1;--rcfile requires extant file;;
69;t_persistent_server_revision.at:1;persistent netsync server - revs & certs;netsync;
70;t_persistent_server_keys.at:1;persistent netsync server - keys;netsync;
71;t_fmerge_normalize.at:1;first extent normalization pass;;
72;t_delete_dir.at:1;(imp) deleting directories;;
73;t_migrate_schema.at:1;schema migration;;
74;t_dump_load.at:1;database dump/load;;
75;t_no_change_deltas.at:1;no-change deltas disappear;;
76;t_drop_rename_patch.at:1;merge(<>, <drop a, rename b a, patch a>);;
77;t_cmdline_options.at:1;verification of command line options;;
78;t_log_nonexistent.at:1;log hides deleted/renamed files;;
79;t_crlf.at:1;CRLF line normalization;;
80;t_netsync_diffbranch.at:1;(normal) pull a netsync branch which has a parent from another branch;netsync;
81;t_netsync_nocerts.at:1;(normal) netsync revision with no certs;;
82;t_check_same_db_contents.at:1;check_same_db_contents macro;;
83;t_merge_ancestor.at:1;merge rev with ancestor;;
84;t_propagate_desc.at:1;propagate a descendent;;
85;t_propagate_anc.at:1;propagate an ancestor;;
86;t_status_missing.at:1;(normal) status with missing files;;
87;t_persistent_server_keys_2.at:1;(imp) persistent netsync server - keys 2;netsync;
88;t_update_1.at:1;update 1;;
89;t_vcheck.at:1;(todo) vcheck;;
90;t_db_with_dots.at:1;--db with ..;;
91;t_subdir_add.at:1;add in subdir;;
92;t_subdir_drop.at:1;(minor) drop in subdir;;
93;t_subdir_revert.at:1;revert in subdirs;;
94;t_subdir_rename.at:1;rename in subdir;;
95;t_subdir_attr.at:3;attr command in subdirs;;
96;t_lca_1.at:1;(minor) an lca;;
97;t_update_2.at:1;(normal) update 2;;
98;t_rename_dir_cross_level.at:1;rename_dir to non-sibling;;
99;t_rename_added_in_rename.at:1;merge with add, rename file, and rename dir;;
100;t_rename_conflict.at:1;merge(<rename a b>, <rename a c>);;
101;t_rename_dir_patch.at:1;merge(<patch foo/a>, <rename foo/ bar/>);;
102;t_delete_dir_patch.at:1;(imp) merge(<patch foo/a>, <delete foo/>);;
103;t_revert_dirs.at:1;revert directories;;
104;t_revert_rename.at:1;revert renames;;
105;t_revert_unchanged.at:3;revert unchanged file preserves mtime;;
106;t_cdiff.at:1;(minor) context diff;;
107;t_no_rename_overwrite.at:1;rename cannot overwrite files;;
108;t_checkout_noop_on_fail.at:1;failed checkout is a no-op;;
109;t_monotone_agent.at:1;(todo) write monotone-agent;;
110;t_approval_semantics.at:1;(todo) design approval semantics;;
111;t_rebuild.at:1;db rebuild;;
112;t_lua_privkey.at:1;reading private keys from lua hooks;;
113;t_i18n_changelog.at:3;committing with a non-english message;;
114;t_restrictions_warn_on_unknown.at:1;warn on bad restriction;;
115;t_need_mt_revision.at:1;MT/revision is required;;
116;t_update_null_revision.at:1;update no-ops when no parent revision;;
117;t_branch_checkout.at:1;branch-based checkout;;
118;t_load_into_existing.at:1;db load must create a new db;;
119;t_automate_version.at:1;automate automate_version;;
120;t_automate_heads.at:1;automate heads;;
121;t_merge_normalization_edge_case.at:1;merge normalization edge case;;
122;t_undo_update.at:1;(todo) undo_update command;;
123;t_change_empty_file.at:3;modification of an empty file;;
124;t_largish_file.at:1;largish file;;
125;t_add_intermediate_MT_path.at:3;files with intermediate MT path elements;;
126;t_merge_3.at:1;(minor) test a merge 3;;
127;t_merge_4.at:1;(minor) test a merge 4;;
128;t_db_missing.at:1;db missing;;
129;t_database_check.at:3;database check;;
130;t_add_owndb.at:1;(minor) add own db;;
131;t_can_execute.at:1;can execute things;;
132;t_diff_binary.at:1;diff a binary file;;
133;t_command_completion.at:1;command completion;;
134;t_merge_rename_file_and_rename_dir.at:3;merge rename file and rename dir;;
135;t_diff_restrict.at:1;diff respects restrictions;;
136;t_cat_file_by_name.at:1;cat file REV PATH;;
137;t_epoch.at:1;client absorbs and checks epochs;netsync;
138;t_epoch_server.at:1;server aborbs and checks epochs;netsync;
139;t_epoch_unidirectional.at:1;epochs are not sent upstream by pull;netsync;
140;t_vars.at:1;vars;;
141;t_netsync_defaults.at:1;default server/collection;netsync;
142;t_netsync_set_defaults.at:1;default server/collection setting;netsync;
143;t_netsync_absorbs.at:1;client absorbs server key;netsync;
144;t_netsync_checks_server_key.at:1;netsync verifies server keys;;
145;t_merge_5.at:1;test a merge 5;;
146;t_empty_id_completion.at:1;empty id completion;;
147;t_empty_path.at:1;empty string as a path name;;
148;t_empty_env.at:1;empty environment;;
149;t_short_opts.at:5;short options work correctly;;
150;t_netsync_sigpipe.at:3;netsync is not interrupted by SIGPIPE;netsync;
151;t_setup_creates_log.at:3;setup creates MT/log;;
152;t_checkout_creates_log.at:3;checkout creates MT/log;;
153;t_commit_log_1.at:3;commit using MT/log;;
154;t_commit_log_2.at:3;commit w/o MT/log being present;;
155;t_dropkey_1.at:3;drop a public key;;
156;t_dropkey_2.at:3;drop a public and private key;;
157;t_rename_attr.at:1;rename moves attributes;;
158;t_automate_descendents.at:1;automate descendents;;
159;t_automate_erase_ancestors.at:1;automate erase_ancestors;;
160;t_automate_toposort.at:1;automate toposort;;
161;t_diff_first_rev.at:1;diff in a never-committed project;;
162;t_automate_ancestry_difference.at:1;automate ancestry_difference;;
163;t_automate_leaves.at:1;automate leaves;;
164;t_log_depth.at:1;only log a few entries instead of the whole log;;
165;t_commit_log_3.at:3;commit using MT/log and --message;;
166;t_at_sign.at:1;check that --xargs / -@ behave correctly;;
167;t_db_execute.at:1;db execute;;
168;t_sql_unpack.at:1;sql functions unpack, unbase64;;
169;t_final_space.at:1;files with spaces at the end;;
170;t_inodeprints.at:1;inodeprints;;
171;t_inodeprints_update.at:1;update updates inodeprints;;
172;t_ls_known.at:3;listing working copy manifests;;
'

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.18)"
	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 <monotone-devel@nongnu.org>.
_ATEOF
  exit 0
fi

# List of tests.
if $at_list_p; then
  cat <<_ATEOF
monotone 0.18 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.18 test suite: integration tests. ##
## -------------------------------------------- ##
_ASBOX
{
  cat <<\_ASBOX
## -------------------------------------------- ##
## monotone 0.18 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 --debug --help"
echo t_null.at:10 >$at_check_line_file
( $at_traceon; monotone --debug --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




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_scan.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_scan.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_scan.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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

$at_traceoff
echo "t_scan.at:11:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o testfile0
fi
"
echo t_scan.at:11 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o testfile0
fi
 ) >$at_stdout 2>$at_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: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

# Needed if this file (t_scan.at) was checked out using CR+LF

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

$at_traceoff
echo "t_scan.at:16:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o foo/testfile1
fi
"
echo t_scan.at:16 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o foo/testfile1
fi
 ) >$at_stdout 2>$at_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: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


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

$at_traceoff
echo "t_scan.at:20:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o foo/bar/testfile2
fi
"
echo t_scan.at:20 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o foo/bar/testfile2
fi
 ) >$at_stdout 2>$at_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: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


cat >manifest <<'_ATEOF'
85d521304e3660f05bbb458b05d0efc6e981f832  foo/bar/testfile2
14c5b672e2181377e41e6d8c5ce21457d8342667  foo/testfile1
5c39de9ca49b3aa34fa21f5778954665d947476c  testfile0
_ATEOF


$at_traceoff
echo "t_scan.at:27: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile0 foo"
echo t_scan.at:27 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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_scan.at:28: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message='blah blah'"
echo t_scan.at:28 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message='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: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_scan.at:29: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR cat manifest"
echo t_scan.at:29 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_scan.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_scan.at:30:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_scan.at:30 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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: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_scan.at:31: cmp stdout manifest"
echo t_scan.at:31 >$at_check_line_file
( $at_traceon; cmp stdout 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: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
      $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




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_import.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_import.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_import.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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

$at_traceoff
echo "t_import.at:9:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o importme
fi
"
echo t_import.at:9 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o importme
fi
 ) >$at_stdout 2>$at_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: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


TSHA=`monotone --norc identify importme`

$at_traceoff
echo "t_import.at:13: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add importme"
echo t_import.at:13 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message='blah blah'"
echo t_import.at:14 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message='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: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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR cat file \$TSHA"
echo t_import.at:15 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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_import.at:16:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_import.at:16 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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: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_import.at:17: cmp importme stdout"
echo t_import.at:17 >$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: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
      $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




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_genkey.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_genkey.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_genkey.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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

# fail to enter a passphrase
$at_traceoff
echo "t_genkey.at:10: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR genkey \$TKEY </dev/null"
echo t_genkey.at:10 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR genkey $TKEY </dev/null ) >$at_stdout 2>$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_genkey.at:10: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# fail to enter passphrase twice
$at_traceoff
echo "t_genkey.at:13: echo \$TKEY | \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR genkey \$TKEY"
echo t_genkey.at:13 >$at_check_line_file
( $at_traceon; echo $TKEY | $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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;;
   1) ;;
   *) echo "t_genkey.at:13: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# generate a new key
$at_traceoff
echo "t_genkey.at:16: (echo \$TKEY; echo \$TKEY) | \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR genkey \$TKEY"
echo t_genkey.at:16 >$at_check_line_file
( $at_traceon; (echo $TKEY; echo $TKEY) | $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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


# check key exists
$at_traceoff
echo "t_genkey.at:19: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls keys"
echo t_genkey.at:19 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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_genkey.at:20: grep \$TKEY stdout"
echo t_genkey.at:20 >$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: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


# check globbing on name works
$at_traceoff
echo "t_genkey.at:23: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls keys happy\\*"
echo t_genkey.at:23 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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_genkey.at:24: grep \$TKEY stdout"
echo t_genkey.at:24 >$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: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


# check globbing on bogus name misses key
$at_traceoff
echo "t_genkey.at:27: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls keys burp\\*"
echo t_genkey.at:27 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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_genkey.at:28: grep \$TKEY stdout"
echo t_genkey.at:28 >$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:28: 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:36: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add input.txt"
echo t_genkey.at:36 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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_genkey.at:37: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message='blah blah'"
echo t_genkey.at:37 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message='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: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

TSHA=`cat MT/revision`
$at_traceoff
echo "t_genkey.at:39: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --key=\$TKEY cert \$TSHA color pink"
echo t_genkey.at:39 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --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: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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls certs \$TSHA"
echo t_genkey.at:40 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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


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

$at_traceoff
echo "t_genkey.at:45: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --key=\$TKEY cert \$TSHA color < cert-data"
echo t_genkey.at:45 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --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: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_genkey.at:46: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls certs \$TSHA"
echo t_genkey.at:46 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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_genkey.at:47: grep pink stdout"
echo t_genkey.at:47 >$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: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_genkey.at:48: grep yellow stdout"
echo t_genkey.at:48 >$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: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
      $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



if which mimencode 2>/dev/null; then
  UNB64_COMMAND="mimencode -u"
elif which recode 2>/dev/null; then
  UNB64_COMMAND="recode /Base64"
elif perl -MMIME::Base64 -e 1 2>/dev/null; then
  UNB64_COMMAND="perl -MMIME::Base64 -ne 'print decode_base64(\$_)'"
elif python -c 'import sys;sys.exit(not hasattr("", "decode"))' 2>/dev/null; then
  UNB64_COMMAND="python -c 'import sys;sys.stdout.write(sys.stdin.read().decode("'"'"base64"'"'"))'"
else
  # This is lame!  We should XFAIL the test so the user knows that
  # they're not, you know, actually testing the software.  But
  # Autotest runs XFAIL conditions in a completely different shell, so
  # we can't without duplicating the whole test here.
  exit 77
fi
# Poor man's logging:
$at_traceoff
echo "t_unidiff.at:5: echo \$UNB64_COMMAND"
echo t_unidiff.at:5 >$at_check_line_file
( $at_traceon; echo $UNB64_COMMAND ) >$at_stdout 2>$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: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





# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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:7: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_unidiff.at:7 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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: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_unidiff.at:7: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_unidiff.at:7 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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_unidiff.at:7: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_unidiff.at:7 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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_unidiff.at:7: rm test_keys"
echo t_unidiff.at:7 >$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: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 >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:4778: if test \"\$OSTYPE\" == \"msys\"; then
  mimencode -u -o firstfile firstfile.b64
else
  eval \$UNB64_COMMAND <firstfile.b64 >firstfile
fi
"
echo t_unidiff.at:4778 >$at_check_line_file
( $at_traceon; if test "$OSTYPE" == "msys"; then
  mimencode -u -o firstfile firstfile.b64
else
  eval $UNB64_COMMAND <firstfile.b64 >firstfile
fi
 ) >$at_stdout 2>$at_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:4778: exit code was $at_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:4779: cp firstfile testfile"
echo t_unidiff.at:4779 >$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:4779: exit code was $at_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:4780: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_unidiff.at:4780 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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:4780: exit code was $at_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:4781: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message=blah-blah"
echo t_unidiff.at:4781 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message=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: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 testfile firstfile"
echo t_unidiff.at:4782 >$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: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


# decode second file
$at_traceoff
echo "t_unidiff.at:4785: if test \"\$OSTYPE\" == \"msys\"; then
  mimencode -u -o secondfile secondfile.b64
else
  eval \$UNB64_COMMAND <secondfile.b64 >secondfile
fi
"
echo t_unidiff.at:4785 >$at_check_line_file
( $at_traceon; if test "$OSTYPE" == "msys"; then
  mimencode -u -o secondfile secondfile.b64
else
  eval $UNB64_COMMAND <secondfile.b64 >secondfile
fi
 ) >$at_stdout 2>$at_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: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


# calculate diff to second file using monotone
$at_traceoff
echo "t_unidiff.at:4788: cp secondfile testfile"
echo t_unidiff.at:4788 >$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:4788: exit code was $at_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:4789: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR diff"
echo t_unidiff.at:4789 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_unidiff.at:4790 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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: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

$at_traceoff
echo "t_unidiff.at:4791: mv stdout monodiff"
echo t_unidiff.at:4791 >$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:4791: 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:4794: patch firstfile <monodiff"
echo t_unidiff.at:4794 >$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
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: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


# see if the resulting file has been properly patched
$at_traceoff
echo "t_unidiff.at:4797: cmp firstfile secondfile"
echo t_unidiff.at:4797 >$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:4797: exit code 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




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_persist_phrase.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_persist_phrase.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_persist_phrase.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add input.txt"
echo t_persist_phrase.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch --rcfile=persist.lua commit --message=blah-blah <passphrase"
echo t_persist_phrase.at:26 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch --rcfile=persist.lua commit --message=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


TSHA=`cat MT/revision`
$at_traceoff
echo "t_persist_phrase.at:29: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls certs \$TSHA"
echo t_persist_phrase.at:29 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_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




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_versions.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_versions.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_versions.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_versions.at:9 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message=blah-blah"
echo t_versions.at:10 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message=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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message=blah-blah"
echo t_versions.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message=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: monotone --norc identify testfile"
echo t_versions.at:17 >$at_check_line_file
( $at_traceon; monotone --norc identify 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:; 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: cat MT/revision"
echo t_versions.at:19 >$at_check_line_file
( $at_traceon; cat MT/revision ) >$at_stdout 2>$at_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 rsha-\$i"
echo t_versions.at:20 >$at_check_line_file
( $at_traceon; mv stdout rsha-$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


  RSHA=`cat rsha-$i`
  FSHA=`cat fsha-$i`

  $at_traceoff
echo "t_versions.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR cat file \$FSHA"
echo t_versions.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_versions.at:32 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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: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:33: cmp stdout testfile"
echo t_versions.at:33 >$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: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_versions.at:35: rm -rf MT"
echo t_versions.at:35 >$at_check_line_file
( $at_traceon; rm -rf MT ) >$at_stdout 2>$at_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: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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$RSHA ."
echo t_versions.at:36 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $RSHA . ) >$at_stdout 2>$at_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: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_versions.at:37: monotone --norc identify testfile"
echo t_versions.at:37 >$at_check_line_file
( $at_traceon; monotone --norc identify 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_versions.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_versions.at:38: cmp stdout fsha-\$i"
echo t_versions.at:38 >$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: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


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




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_fork.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_fork.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_fork.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_fork.at:11 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message=blah-blah"
echo t_fork.at:12 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message=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_R_SHA=`cat MT/revision`
ROOT_F_SHA=`monotone --norc identify testfile`

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

$at_traceoff
echo "t_fork.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message=blah-blah"
echo t_fork.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message=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_R_SHA=`cat MT/revision`
LEFT_F_SHA=`monotone --norc identify testfile`
$at_traceoff
echo "t_fork.at:21: test \$LEFT_R_SHA != \$ROOT_R_SHA"
echo t_fork.at:21 >$at_check_line_file
( $at_traceon; test $LEFT_R_SHA != $ROOT_R_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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch heads"
echo t_fork.at:24 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --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 -rf MT.old"
echo t_fork.at:27 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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: mv  MT MT.old"
echo t_fork.at:27 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$ROOT_R_SHA ."
echo t_fork.at:27 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $ROOT_R_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

$at_traceoff
echo "t_fork.at:27: mv MT.old/options MT"
echo t_fork.at:27 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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

PROBE_R_SHA=`cat MT/revision`
PROBE_F_SHA=`monotone --norc identify testfile`
$at_traceoff
echo "t_fork.at:27: test \$PROBE_R_SHA = \$ROOT_R_SHA"
echo t_fork.at:27 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $ROOT_R_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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_fork.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message=blah-blah"
echo t_fork.at:32 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message=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_R_SHA=`cat MT/revision`
RIGHT_F_SHA=`monotone --norc identify testfile`
$at_traceoff
echo "t_fork.at:35: test \$RIGHT_R_SHA != \$ROOT_R_SHA"
echo t_fork.at:35 >$at_check_line_file
( $at_traceon; test $RIGHT_R_SHA != $ROOT_R_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_R_SHA != \$LEFT_R_SHA"
echo t_fork.at:37 >$at_check_line_file
( $at_traceon; test $RIGHT_R_SHA != $LEFT_R_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 -rf MT.old"
echo t_fork.at:43 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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: mv  MT MT.old"
echo t_fork.at:43 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$ROOT_R_SHA ."
echo t_fork.at:43 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $ROOT_R_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

$at_traceoff
echo "t_fork.at:43: mv MT.old/options MT"
echo t_fork.at:43 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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

PROBE_R_SHA=`cat MT/revision`
PROBE_F_SHA=`monotone --norc identify testfile`
$at_traceoff
echo "t_fork.at:43: test \$PROBE_R_SHA = \$ROOT_R_SHA"
echo t_fork.at:43 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $ROOT_R_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 -rf MT.old"
echo t_fork.at:44 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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: mv  MT MT.old"
echo t_fork.at:44 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$LEFT_R_SHA ."
echo t_fork.at:44 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $LEFT_R_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

$at_traceoff
echo "t_fork.at:44: mv MT.old/options MT"
echo t_fork.at:44 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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

PROBE_R_SHA=`cat MT/revision`
PROBE_F_SHA=`monotone --norc identify testfile`
$at_traceoff
echo "t_fork.at:44: test \$PROBE_R_SHA = \$LEFT_R_SHA"
echo t_fork.at:44 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $LEFT_R_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 -rf MT.old"
echo t_fork.at:45 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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: mv  MT MT.old"
echo t_fork.at:45 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$RIGHT_R_SHA ."
echo t_fork.at:45 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $RIGHT_R_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

$at_traceoff
echo "t_fork.at:45: mv MT.old/options MT"
echo t_fork.at:45 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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

PROBE_R_SHA=`cat MT/revision`
PROBE_F_SHA=`monotone --norc identify testfile`
$at_traceoff
echo "t_fork.at:45: test \$PROBE_R_SHA = \$RIGHT_R_SHA"
echo t_fork.at:45 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $RIGHT_R_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




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_update.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_update.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_update.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_update.at:15 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message=blah-blah"
echo t_update.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message=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_R_SHA=`cat MT/revision`
ROOT_F_SHA=`monotone --norc identify testfile`

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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message=blah-blah"
echo t_update.at:26 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message=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_R_SHA=`cat MT/revision`
LEFT_F_SHA=`monotone --norc identify testfile`
$at_traceoff
echo "t_update.at:29: test \$LEFT_R_SHA != \$ROOT_R_SHA"
echo t_update.at:29 >$at_check_line_file
( $at_traceon; test $LEFT_R_SHA != $ROOT_R_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 -rf MT.old"
echo t_update.at:32 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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: mv  MT MT.old"
echo t_update.at:32 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$ROOT_R_SHA ."
echo t_update.at:32 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $ROOT_R_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

$at_traceoff
echo "t_update.at:32: mv MT.old/options MT"
echo t_update.at:32 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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

PROBE_R_SHA=`cat MT/revision`
PROBE_F_SHA=`monotone --norc identify testfile`
$at_traceoff
echo "t_update.at:32: test \$PROBE_R_SHA = \$ROOT_R_SHA"
echo t_update.at:32 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $ROOT_R_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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update"
echo t_update.at:40 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_merge.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_merge.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_merge.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_merge.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message=blah-blah"
echo t_merge.at:17 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message=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_R_SHA=`cat MT/revision`
ROOT_F_SHA=`monotone --norc identify testfile`

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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message=blah-blah"
echo t_merge.at:27 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message=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_R_SHA=`cat MT/revision`
LEFT_F_SHA=`monotone --norc identify testfile`
$at_traceoff
echo "t_merge.at:30: test \$LEFT_R_SHA != \$ROOT_R_SHA"
echo t_merge.at:30 >$at_check_line_file
( $at_traceon; test $LEFT_R_SHA != $ROOT_R_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 -rf MT.old"
echo t_merge.at:33 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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: mv  MT MT.old"
echo t_merge.at:33 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$ROOT_R_SHA ."
echo t_merge.at:33 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $ROOT_R_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

$at_traceoff
echo "t_merge.at:33: mv MT.old/options MT"
echo t_merge.at:33 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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

PROBE_R_SHA=`cat MT/revision`
PROBE_F_SHA=`monotone --norc identify testfile`
$at_traceoff
echo "t_merge.at:33: test \$PROBE_R_SHA = \$ROOT_R_SHA"
echo t_merge.at:33 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $ROOT_R_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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message=blah-blah"
echo t_merge.at:40 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message=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_R_SHA=`cat MT/revision`
RIGHT_F_SHA=`monotone --norc identify testfile`
$at_traceoff
echo "t_merge.at:43: test \$RIGHT_R_SHA != \$ROOT_R_SHA"
echo t_merge.at:43 >$at_check_line_file
( $at_traceon; test $RIGHT_R_SHA != $ROOT_R_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_R_SHA != \$LEFT_R_SHA"
echo t_merge.at:45 >$at_check_line_file
( $at_traceon; test $RIGHT_R_SHA != $LEFT_R_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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch merge"
echo t_merge.at:49 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update"
echo t_merge.at:50 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch heads"
echo t_merge.at:52 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --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_merge_add.at:1: merging adds
    at_setup_line='t_merge_add.at:1'
    at_desc='merging adds'
    $at_quiet $ECHO_N " 11: merging adds                                 $ECHO_C"
    at_xfail=no
    (
      echo "11. t_merge_add.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_add.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_merge_add.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_add.at:2: exit code was $at_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_add.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_merge_add.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_add.at:2: exit code was $at_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_add.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_merge_add.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_add.at:2: exit code was $at_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_add.at:2: rm test_keys"
echo t_merge_add.at:2 >$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_add.at:2: 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 >irrelevantfile <<'_ATEOF'
this is just a file
_ATEOF

$at_traceoff
echo "t_merge_add.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add irrelevantfile"
echo t_merge_add.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add irrelevantfile ) >$at_stdout 2>$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_add.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_add.at:6: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_merge_add.at:6 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_add.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


ANC=`cat MT/revision`


cat >testfile1 <<'_ATEOF'
This is test file 1
_ATEOF

$at_traceoff
echo "t_merge_add.at:10: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile1"
echo t_merge_add.at:10 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_merge_add.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_merge_add.at:11: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_merge_add.at:11 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_add.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


LEFT=`cat MT/revision`


$at_traceoff
echo "t_merge_add.at:14: rm -rf MT.old"
echo t_merge_add.at:14 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_add.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_merge_add.at:14: mv  MT MT.old"
echo t_merge_add.at:14 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_add.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_merge_add.at:14: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$ANC ."
echo t_merge_add.at:14 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $ANC . ) >$at_stdout 2>$at_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_add.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_merge_add.at:14: mv MT.old/options MT"
echo t_merge_add.at:14 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_add.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_merge_add.at:14: test \$PROBE_R_SHA = \$ANC"
echo t_merge_add.at:14 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $ANC ) >$at_stdout 2>$at_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_add.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




cat >testfile2 <<'_ATEOF'
This is test file 2
_ATEOF

$at_traceoff
echo "t_merge_add.at:17: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile2"
echo t_merge_add.at:17 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add 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_merge_add.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_merge_add.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_merge_add.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_add.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


RIGHT=`cat MT/revision`

$at_traceoff
echo "t_merge_add.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch merge"
echo t_merge_add.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --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_add.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_merge_add.at:22: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update"
echo t_merge_add.at:22 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_add.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


cat >expected_irrelevant <<'_ATEOF'
this is just a file
_ATEOF

cat >expected_data1 <<'_ATEOF'
This is test file 1
_ATEOF

cat >expected_data2 <<'_ATEOF'
This is test file 2
_ATEOF


$at_traceoff
echo "t_merge_add.at:31: cmp irrelevantfile expected_irrelevant"
echo t_merge_add.at:31 >$at_check_line_file
( $at_traceon; cmp irrelevantfile expected_irrelevant ) >$at_stdout 2>$at_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_add.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_add.at:32: cmp testfile1 expected_data1"
echo t_merge_add.at:32 >$at_check_line_file
( $at_traceon; cmp testfile1 expected_data1 ) >$at_stdout 2>$at_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_add.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_merge_add.at:33: cmp testfile2 expected_data2"
echo t_merge_add.at:33 >$at_check_line_file
( $at_traceon; cmp testfile2 expected_data2 ) >$at_stdout 2>$at_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_add.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`
    ;;

  12 ) # 12. t_related_merge2_data.at:1: merging data in unrelated files
    at_setup_line='t_related_merge2_data.at:1'
    at_desc='merging data in unrelated files'
    $at_quiet $ECHO_N " 12: merging data in unrelated files              $ECHO_C"
    at_xfail=no
    (
      echo "12. t_related_merge2_data.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_related_merge2_data.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_related_merge2_data.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_related_merge2_data.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_related_merge2_data.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_related_merge2_data.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_related_merge2_data.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_related_merge2_data.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_related_merge2_data.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_related_merge2_data.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_related_merge2_data.at:2: rm test_keys"
echo t_related_merge2_data.at:2 >$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_related_merge2_data.at:2: 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 <<'_ATEOF'
line 1: foo
line 2: something unexpected
line 3: baz
line 4: quux
_ATEOF

cat >right <<'_ATEOF'
line 1: foo
line 2: bar
line 3: baz
line 4: something unexpected
_ATEOF



cat >foo <<'_ATEOF'
irrelevant file
_ATEOF

$at_traceoff
echo "t_related_merge2_data.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add foo"
echo t_related_merge2_data.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_related_merge2_data.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_related_merge2_data.at:17: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_related_merge2_data.at:17 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_related_merge2_data.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


ANC=`cat MT/revision`

$at_traceoff
echo "t_related_merge2_data.at:20: cp -f left testfile"
echo t_related_merge2_data.at:20 >$at_check_line_file
( $at_traceon; cp -f left 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_related_merge2_data.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_related_merge2_data.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_related_merge2_data.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_related_merge2_data.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_related_merge2_data.at:22: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_related_merge2_data.at:22 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_related_merge2_data.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=`cat MT/revision`


$at_traceoff
echo "t_related_merge2_data.at:25: rm -rf MT.old"
echo t_related_merge2_data.at:25 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_related_merge2_data.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_related_merge2_data.at:25: mv  MT MT.old"
echo t_related_merge2_data.at:25 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_related_merge2_data.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_related_merge2_data.at:25: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$ANC ."
echo t_related_merge2_data.at:25 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $ANC . ) >$at_stdout 2>$at_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_related_merge2_data.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_related_merge2_data.at:25: mv MT.old/options MT"
echo t_related_merge2_data.at:25 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_related_merge2_data.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_related_merge2_data.at:25: test \$PROBE_R_SHA = \$ANC"
echo t_related_merge2_data.at:25 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $ANC ) >$at_stdout 2>$at_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_related_merge2_data.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_related_merge2_data.at:27: cp -f right testfile"
echo t_related_merge2_data.at:27 >$at_check_line_file
( $at_traceon; cp -f right 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_related_merge2_data.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_related_merge2_data.at:28: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_related_merge2_data.at:28 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_related_merge2_data.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_related_merge2_data.at:29: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_related_merge2_data.at:29 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_related_merge2_data.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


RIGHT=`cat MT/revision`

$at_traceoff
echo "t_related_merge2_data.at:32: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch merge"
echo t_related_merge2_data.at:32 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --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_related_merge2_data.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_related_merge2_data.at:33: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update"
echo t_related_merge2_data.at:33 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_related_merge2_data.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 >expected_foo <<'_ATEOF'
irrelevant file
_ATEOF


$at_traceoff
echo "t_related_merge2_data.at:38: cmp foo expected_foo"
echo t_related_merge2_data.at:38 >$at_check_line_file
( $at_traceon; cmp foo expected_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=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_related_merge2_data.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_related_merge2_data.at:39: cmp left testfile || cmp right testfile"
echo t_related_merge2_data.at:39 >$at_check_line_file
( $at_traceon; cmp left testfile || cmp right 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_related_merge2_data.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  13 ) # 13. t_merge2_add.at:1: merging adds in unrelated revisions
    at_setup_line='t_merge2_add.at:1'
    at_desc='merging adds in unrelated revisions'
    $at_quiet $ECHO_N " 13: merging adds in unrelated revisions          $ECHO_C"
    at_xfail=no
    (
      echo "13. t_merge2_add.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_merge2_add.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_merge2_add.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_merge2_add.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_merge2_add.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_merge2_add.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_merge2_add.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_merge2_add.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_merge2_add.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_merge2_add.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_merge2_add.at:2: rm test_keys"
echo t_merge2_add.at:2 >$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_merge2_add.at:2: 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 >testfile1 <<'_ATEOF'
This is test file 1
_ATEOF

$at_traceoff
echo "t_merge2_add.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile1"
echo t_merge2_add.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_merge2_add.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_merge2_add.at:6: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_merge2_add.at:6 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_merge2_add.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


LEFT=`cat MT/revision`

$at_traceoff
echo "t_merge2_add.at:9: rm -rf MT"
echo t_merge2_add.at:9 >$at_check_line_file
( $at_traceon; rm -rf MT ) >$at_stdout 2>$at_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_merge2_add.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_merge2_add.at:10: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_merge2_add.at:10 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$at_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_merge2_add.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 >testfile2 <<'_ATEOF'
This is test file 2
_ATEOF

$at_traceoff
echo "t_merge2_add.at:13: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile2"
echo t_merge2_add.at:13 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add 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_merge2_add.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_merge2_add.at:14: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_merge2_add.at:14 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_merge2_add.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


RIGHT=`cat MT/revision`

$at_traceoff
echo "t_merge2_add.at:17: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch merge"
echo t_merge2_add.at:17 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --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_merge2_add.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_merge2_add.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update"
echo t_merge2_add.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_merge2_add.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 >expected_data1 <<'_ATEOF'
This is test file 1
_ATEOF

cat >expected_data2 <<'_ATEOF'
This is test file 2
_ATEOF


$at_traceoff
echo "t_merge2_add.at:25: cmp testfile1 expected_data1"
echo t_merge2_add.at:25 >$at_check_line_file
( $at_traceon; cmp testfile1 expected_data1 ) >$at_stdout 2>$at_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_merge2_add.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_merge2_add.at:26: cmp testfile2 expected_data2"
echo t_merge2_add.at:26 >$at_check_line_file
( $at_traceon; cmp testfile2 expected_data2 ) >$at_stdout 2>$at_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_merge2_add.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  14 ) # 14. t_merge2_data.at:1: merging data in unrelated revisions
    at_setup_line='t_merge2_data.at:1'
    at_desc='merging data in unrelated revisions'
    $at_quiet $ECHO_N " 14: merging data in unrelated revisions          $ECHO_C"
    at_xfail=no
    (
      echo "14. t_merge2_data.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_merge2_data.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_merge2_data.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_merge2_data.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_merge2_data.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_merge2_data.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_merge2_data.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_merge2_data.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_merge2_data.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_merge2_data.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_merge2_data.at:2: rm test_keys"
echo t_merge2_data.at:2 >$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_merge2_data.at:2: 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 <<'_ATEOF'
line 1: foo
line 2: something unexpected
line 3: baz
line 4: quux
_ATEOF

cat >right <<'_ATEOF'
line 1: foo
line 2: bar
line 3: baz
line 4: something unexpected
_ATEOF


$at_traceoff
echo "t_merge2_data.at:15: cp -f left testfile"
echo t_merge2_data.at:15 >$at_check_line_file
( $at_traceon; cp -f left 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_merge2_data.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_merge2_data.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_merge2_data.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_merge2_data.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_merge2_data.at:17: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_merge2_data.at:17 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_merge2_data.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


LEFT=`cat MT/revision`

$at_traceoff
echo "t_merge2_data.at:20: rm -rf MT"
echo t_merge2_data.at:20 >$at_check_line_file
( $at_traceon; rm -rf MT ) >$at_stdout 2>$at_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_merge2_data.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_merge2_data.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_merge2_data.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$at_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_merge2_data.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_merge2_data.at:23: cp -f right testfile"
echo t_merge2_data.at:23 >$at_check_line_file
( $at_traceon; cp -f right 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_merge2_data.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_merge2_data.at:24: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_merge2_data.at:24 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_merge2_data.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_merge2_data.at:25: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_merge2_data.at:25 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_merge2_data.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


RIGHT=`cat MT/revision`

$at_traceoff
echo "t_merge2_data.at:28: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch merge"
echo t_merge2_data.at:28 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --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_merge2_data.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_merge2_data.at:29: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update"
echo t_merge2_data.at:29 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_merge2_data.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_merge2_data.at:31: cmp left testfile || cmp right testfile"
echo t_merge2_data.at:31 >$at_check_line_file
( $at_traceon; cmp left testfile || cmp right 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_merge2_data.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  15 ) # 15. 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 " 15: calculation of incorrect unidiffs            $ECHO_C"
    at_xfail=no
    (
      echo "15. t_unidiff2.at:3: testing ..."
      $at_traceon



if which mimencode 2>/dev/null; then
  UNB64_COMMAND="mimencode -u"
elif which recode 2>/dev/null; then
  UNB64_COMMAND="recode /Base64"
elif perl -MMIME::Base64 -e 1 2>/dev/null; then
  UNB64_COMMAND="perl -MMIME::Base64 -ne 'print decode_base64(\$_)'"
elif python -c 'import sys;sys.exit(not hasattr("", "decode"))' 2>/dev/null; then
  UNB64_COMMAND="python -c 'import sys;sys.stdout.write(sys.stdin.read().decode("'"'"base64"'"'"))'"
else
  # This is lame!  We should XFAIL the test so the user knows that
  # they're not, you know, actually testing the software.  But
  # Autotest runs XFAIL conditions in a completely different shell, so
  # we can't without duplicating the whole test here.
  exit 77
fi
# Poor man's logging:
$at_traceoff
echo "t_unidiff2.at:5: echo \$UNB64_COMMAND"
echo t_unidiff2.at:5 >$at_check_line_file
( $at_traceon; echo $UNB64_COMMAND ) >$at_stdout 2>$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: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





# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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:7: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_unidiff2.at:7 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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: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_unidiff2.at:7: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_unidiff2.at:7 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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_unidiff2.at:7: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_unidiff2.at:7 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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_unidiff2.at:7: rm test_keys"
echo t_unidiff2.at:7 >$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: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 >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:1687: if test \"\$OSTYPE\" == \"msys\"; then
  mimencode -u -o firstfile firstfile.b64
else
  eval \$UNB64_COMMAND <firstfile.b64 >firstfile
fi
"
echo t_unidiff2.at:1687 >$at_check_line_file
( $at_traceon; if test "$OSTYPE" == "msys"; then
  mimencode -u -o firstfile firstfile.b64
else
  eval $UNB64_COMMAND <firstfile.b64 >firstfile
fi
 ) >$at_stdout 2>$at_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:1687: exit code was $at_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:1688: cp firstfile testfile"
echo t_unidiff2.at:1688 >$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:1688: exit code was $at_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:1689: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_unidiff2.at:1689 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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:1689: exit code was $at_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:1690: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message=blah-blah"
echo t_unidiff2.at:1690 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message=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: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 testfile firstfile"
echo t_unidiff2.at:1691 >$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: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


# decode second file
$at_traceoff
echo "t_unidiff2.at:1694: if test \"\$OSTYPE\" == \"msys\"; then
  mimencode -u -o secondfile secondfile.b64
else
  eval \$UNB64_COMMAND <secondfile.b64 >secondfile
fi
"
echo t_unidiff2.at:1694 >$at_check_line_file
( $at_traceon; if test "$OSTYPE" == "msys"; then
  mimencode -u -o secondfile secondfile.b64
else
  eval $UNB64_COMMAND <secondfile.b64 >secondfile
fi
 ) >$at_stdout 2>$at_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: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


# calculate diff to second file using monotone
$at_traceoff
echo "t_unidiff2.at:1697: cp secondfile testfile"
echo t_unidiff2.at:1697 >$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:1697: exit code was $at_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:1698: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR diff"
echo t_unidiff2.at:1698 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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 monodiff"
echo t_unidiff2.at:1699 >$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: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


# look for a meaningless change
$at_traceoff
echo "t_unidiff2.at:1702: grep ^-\$ monodiff"
echo t_unidiff2.at:1702 >$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:1702: 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_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 " 16: delete work file on checkout                 $ECHO_C"
    at_xfail=no
    (
      echo "16. t_cwork.at:3: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_cwork.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_cwork.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_cwork.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile0"
echo t_cwork.at:12 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message='blah blah'"
echo t_cwork.at:13 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message='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=`cat MT/revision`
$at_traceoff
echo "t_cwork.at:15: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile1"
echo t_cwork.at:15 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: rm -rf MT"
echo t_cwork.at:17 >$at_check_line_file
( $at_traceon; rm -rf MT ) >$at_stdout 2>$at_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: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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$V1 ."
echo t_cwork.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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_cwork.at:19: test ! -e MT/work"
echo t_cwork.at:19 >$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: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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  17 ) # 17. 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 " 17: revert file to base version                  $ECHO_C"
    at_xfail=no
    (
      echo "17. t_revert.at:3: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_revert.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_revert.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_revert.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile0"
echo t_revert.at:10 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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=`monotone --norc identify testfile0`
$at_traceoff
echo "t_revert.at:12: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message='blah blah'"
echo t_revert.at:12 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message='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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR revert testfile0"
echo t_revert.at:20 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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=`monotone --norc identify testfile0`
$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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_revert.at:30 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR revert"
echo t_revert.at:32 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_revert.at:34 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR drop testfile0"
echo t_revert.at:40 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_revert.at:42 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR revert"
echo t_revert.at:44 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_revert.at:46 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR drop testfile0"
echo t_revert.at:53 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_revert.at:55 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR revert testfile0"
echo t_revert.at:57 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_revert.at:59 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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=`monotone --norc identify testfile0`
$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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile1"
echo t_revert.at:68 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_revert.at:70 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR revert"
echo t_revert.at:72 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_revert.at:74 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add sub/testfile2"
echo t_revert.at:82 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message='new file'"
echo t_revert.at:83 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message='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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_revert.at:86 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR revert sub"
echo t_revert.at:88 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_revert.at:89 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_revert.at:95 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR revert sub/"
echo t_revert.at:97 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_revert.at:98 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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


# check reverting a missing file
$at_traceoff
echo "t_revert.at:102: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR revert"
echo t_revert.at:102 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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:102: exit code was $at_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:103: rm testfile0"
echo t_revert.at:103 >$at_check_line_file
( $at_traceon; rm 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=:
$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:103: exit code was $at_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:104: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_revert.at:104 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR status ) >$at_stdout 2>$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_revert.at:104: 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_revert.at:105: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR revert testfile0"
echo t_revert.at:105 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR revert 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_revert.at:105: exit code was $at_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:106: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_revert.at:106 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR status ) >$at_stdout 2>$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:106: 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 some changes and leaving others

$at_traceoff
echo "t_revert.at:110: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR revert"
echo t_revert.at:110 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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:110: exit code was $at_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:111: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_revert.at:111 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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:111: exit code was $at_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:113: cp testfile0 foofile0"
echo t_revert.at:113 >$at_check_line_file
( $at_traceon; cp testfile0 foofile0 ) >$at_stdout 2>$at_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:113: exit code was $at_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:114: cp sub/testfile2 sub/foofile2"
echo t_revert.at:114 >$at_check_line_file
( $at_traceon; cp sub/testfile2 sub/foofile2 ) >$at_stdout 2>$at_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:114: exit code was $at_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:116: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename testfile0 foofile0"
echo t_revert.at:116 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename testfile0 foofile0 ) >$at_stdout 2>$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:116: exit code was $at_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:117: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename sub/testfile2 sub/foofile2"
echo t_revert.at:117 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename sub/testfile2 sub/foofile2 ) >$at_stdout 2>$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:117: exit code was $at_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:119: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_revert.at:119 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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:119: exit code was $at_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:120: grep foofile0 stdout"
echo t_revert.at:120 >$at_check_line_file
( $at_traceon; grep foofile0 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:120: exit code was $at_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:121: grep foofile2 stdout"
echo t_revert.at:121 >$at_check_line_file
( $at_traceon; grep foofile2 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:121: exit code was $at_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:122: test -e MT/work"
echo t_revert.at:122 >$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:122: exit code was $at_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:124: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR revert sub/foofile2"
echo t_revert.at:124 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR revert sub/foofile2 ) >$at_stdout 2>$at_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:124: exit code was $at_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:125: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_revert.at:125 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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:125: exit code was $at_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:126: grep foofile0 stdout"
echo t_revert.at:126 >$at_check_line_file
( $at_traceon; grep foofile0 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:126: exit code was $at_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:127: grep foofile2 stdout"
echo t_revert.at:127 >$at_check_line_file
( $at_traceon; grep foofile2 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:127: 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_revert.at:128: test -e MT/work"
echo t_revert.at:128 >$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:128: exit code was $at_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:130: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR revert foofile0"
echo t_revert.at:130 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR revert foofile0 ) >$at_stdout 2>$at_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:130: exit code was $at_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:131: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_revert.at:131 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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:131: exit code was $at_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:132: grep foofile0 stdout"
echo t_revert.at:132 >$at_check_line_file
( $at_traceon; grep foofile0 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:132: 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_revert.at:133: grep foofile2 stdout"
echo t_revert.at:133 >$at_check_line_file
( $at_traceon; grep foofile2 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:133: 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_revert.at:134: test ! -e MT/work"
echo t_revert.at:134 >$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:134: exit code 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_add.at:3: addition of files and directories
    at_setup_line='t_add.at:3'
    at_desc='addition of files and directories'
    $at_quiet $ECHO_N " 18: addition of files and directories            $ECHO_C"
    at_xfail=no
    (
      echo "18. t_add.at:3: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_add.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_add.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_add.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_add.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_add.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_add.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_add.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_add.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_add.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_add.at:5: rm test_keys"
echo t_add.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_add.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_add.at:7: mkdir dir"
echo t_add.at:7 >$at_check_line_file
( $at_traceon; mkdir 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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_add.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 >file0 <<'_ATEOF'
file 0
_ATEOF

cat >dir/file1 <<'_ATEOF'
file 1
_ATEOF

cat >dir/file2 <<'_ATEOF'
file 2
_ATEOF


# adding a non-existent file should fail

$at_traceoff
echo "t_add.at:17: monotone add foobar"
echo t_add.at:17 >$at_check_line_file
( $at_traceon; monotone add foobar ) >$at_stdout 2>$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_add.at:17: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# newly added files should appear as such

$at_traceoff
echo "t_add.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add file0"
echo t_add.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add file0 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; tee stderr <$at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_add.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_add.at:22: grep 'adding file0' stderr"
echo t_add.at:22 >$at_check_line_file
( $at_traceon; grep 'adding file0' stderr ) >$at_stdout 2>$at_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_add.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_add.at:24: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add dir"
echo t_add.at:24 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add dir ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; tee stderr <$at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_add.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_add.at:25: grep 'adding dir/file1' stderr"
echo t_add.at:25 >$at_check_line_file
( $at_traceon; grep 'adding dir/file1' stderr ) >$at_stdout 2>$at_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_add.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_add.at:26: grep 'adding dir/file2' stderr"
echo t_add.at:26 >$at_check_line_file
( $at_traceon; grep 'adding dir/file2' stderr ) >$at_stdout 2>$at_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_add.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_add.at:28: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_add.at:28 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_add.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_add.at:29: grep file0 stdout"
echo t_add.at:29 >$at_check_line_file
( $at_traceon; grep file0 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_add.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_add.at:30: grep file1 stdout"
echo t_add.at:30 >$at_check_line_file
( $at_traceon; grep file1 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_add.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_add.at:31: grep file2 stdout"
echo t_add.at:31 >$at_check_line_file
( $at_traceon; grep file2 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_add.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_add.at:33: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message 'add files'"
echo t_add.at:33 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 'add files' ) >$at_stdout 2>$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_add.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


# redundant additions should not appear
# (i.e. they should be ignored)

$at_traceoff
echo "t_add.at:38: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add file0"
echo t_add.at:38 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add file0 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; tee stderr <$at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_add.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_add.at:39: grep 'skipping file0' stderr"
echo t_add.at:39 >$at_check_line_file
( $at_traceon; grep 'skipping file0' stderr ) >$at_stdout 2>$at_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_add.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_add.at:41: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add dir"
echo t_add.at:41 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add dir ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; tee stderr <$at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_add.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_add.at:42: grep 'skipping dir/file1' stderr"
echo t_add.at:42 >$at_check_line_file
( $at_traceon; grep 'skipping dir/file1' stderr ) >$at_stdout 2>$at_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_add.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_add.at:43: grep 'skipping dir/file2' stderr"
echo t_add.at:43 >$at_check_line_file
( $at_traceon; grep 'skipping dir/file2' stderr ) >$at_stdout 2>$at_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_add.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_add.at:45: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_add.at:45 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_add.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_add.at:46: grep file0 stdout"
echo t_add.at:46 >$at_check_line_file
( $at_traceon; grep file0 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_add.at:46: 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_add.at:47: grep file1 stdout"
echo t_add.at:47 >$at_check_line_file
( $at_traceon; grep file1 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_add.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

$at_traceoff
echo "t_add.at:48: grep file2 stdout"
echo t_add.at:48 >$at_check_line_file
( $at_traceon; grep file2 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_add.at:48: 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`
    ;;

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




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_drop.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_drop.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_drop.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add maude"
echo t_drop.at:13 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR drop maude"
echo t_drop.at:14 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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:15: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_drop.at:15 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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_drop.at:16: grep -v '_file' stdout"
echo t_drop.at:16 >$at_check_line_file
( $at_traceon; grep -v '_file' 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: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:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add liver"
echo t_drop.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR drop liver"
echo t_drop.at:19 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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:20: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_drop.at:20 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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_drop.at:21: grep -v '_file' stdout"
echo t_drop.at:21 >$at_check_line_file
( $at_traceon; grep -v '_file' 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: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`
    ;;

  20 ) # 20. t_drop_missing.at:3: drop missing and unknown files
    at_setup_line='t_drop_missing.at:3'
    at_desc='drop missing and unknown files'
    $at_quiet $ECHO_N " 20: drop missing and unknown files               $ECHO_C"
    at_xfail=no
    (
      echo "20. t_drop_missing.at:3: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_missing.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_drop_missing.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_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_drop_missing.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_drop_missing.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_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_drop_missing.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_drop_missing.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_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_drop_missing.at:5: rm test_keys"
echo t_drop_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_drop_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 >maude <<'_ATEOF'
the file maude
_ATEOF


$at_traceoff
echo "t_drop_missing.at:10: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add maude"
echo t_drop_missing.at:10 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_missing.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_drop_missing.at:11: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message 'committed'"
echo t_drop_missing.at:11 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message '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_missing.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_drop_missing.at:13: rm maude"
echo t_drop_missing.at:13 >$at_check_line_file
( $at_traceon; rm maude ) >$at_stdout 2>$at_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_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_drop_missing.at:14: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR drop maude"
echo t_drop_missing.at:14 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR drop maude ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; tee stderr <$at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_drop_missing.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_missing.at:15: grep 'adding maude to working copy delete set' stderr"
echo t_drop_missing.at:15 >$at_check_line_file
( $at_traceon; grep 'adding maude to working copy delete set' stderr ) >$at_stdout 2>$at_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_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_drop_missing.at:17: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_drop_missing.at:17 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_missing.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_missing.at:18: grep maude stdout"
echo t_drop_missing.at:18 >$at_check_line_file
( $at_traceon; grep maude 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_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_drop_missing.at:20: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR drop foobar"
echo t_drop_missing.at:20 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR drop foobar ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; tee stderr <$at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_drop_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_drop_missing.at:21: grep 'skipping foobar' stderr"
echo t_drop_missing.at:21 >$at_check_line_file
( $at_traceon; grep 'skipping foobar' stderr ) >$at_stdout 2>$at_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_missing.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`
    ;;

  21 ) # 21. 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 " 21: creating a bad criss-cross merge             $ECHO_C"
    at_xfail=no
    (
      echo "21. t_cross.at:3: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_cross.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_cross.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_cross.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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


# this case is somewhat tricky to set up too... we use two different
# keys (bob and alice) that don't trust each other so that they can
# produce two different merge results

cat >bob.lua <<'_ATEOF'

function merge3(anc_path, left_path, right_path, merged_path, ancestor, left, right)
   return left
end

function get_passphrase(key) return "bob" end

function get_author(branch) return "bob" end

function get_revision_cert_trust(signers, id, name, val)
   for k,v in pairs(signers) do
        if (v ~= "alice") then return true end
   end
   return false
end
_ATEOF


cat >alice.lua <<'_ATEOF'

function merge3(anc_path, left_path, right_path, merged_path, ancestor, left, right)
   return right
end

function get_passphrase(key) return "alice" end

function get_author(branch) return "alice" end

function get_revision_cert_trust(signers, id, name, val)
   for k,v in pairs(signers) do
        if (v ~= "bob") then return true end
   end
   return false
end
_ATEOF





$at_traceoff
echo "t_cross.at:76: (echo \"bob\"; echo \"bob\") | monotone --rcfile=test_hooks.lua --rcfile=bob.lua --nostd --norc --db=test.db --key=bob genkey bob"
echo t_cross.at:76 >$at_check_line_file
( $at_traceon; (echo "bob"; echo "bob") | monotone --rcfile=test_hooks.lua --rcfile=bob.lua --nostd --norc --db=test.db --key=bob genkey 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:76: exit code was $at_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:77: (echo \"alice\"; echo \"alice\") | monotone --rcfile=test_hooks.lua --rcfile=alice.lua --nostd --norc --db=test.db --key=alice genkey alice"
echo t_cross.at:77 >$at_check_line_file
( $at_traceon; (echo "alice"; echo "alice") | monotone --rcfile=test_hooks.lua --rcfile=alice.lua --nostd --norc --db=test.db --key=alice genkey 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:77: 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 ancestor
$at_traceoff
echo "t_cross.at:80: cp shared.anc shared"
echo t_cross.at:80 >$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: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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add shared"
echo t_cross.at:81 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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

$at_traceoff
echo "t_cross.at:82: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message=ancestor"
echo t_cross.at:82 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message=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: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

ROOT_R_SHA=`cat MT/revision`
ROOT_F_SHA=`monotone --norc identify shared`

# construct left node
$at_traceoff
echo "t_cross.at:87: cp shared.left shared"
echo t_cross.at:87 >$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: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_cross.at:88: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add specific.left"
echo t_cross.at:88 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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_cross.at:89: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message=left"
echo t_cross.at:89 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message=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: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

LEFT_R_SHA=`cat MT/revision`
LEFT_F_SHA=`monotone --norc identify shared`
$at_traceoff
echo "t_cross.at:92: test \$LEFT_R_SHA != \$ROOT_R_SHA"
echo t_cross.at:92 >$at_check_line_file
( $at_traceon; test $LEFT_R_SHA != $ROOT_R_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:92: exit code was $at_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:93: test \$LEFT_F_SHA != \$ROOT_F_SHA"
echo t_cross.at:93 >$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:93: 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:96: rm -rf MT.old"
echo t_cross.at:96 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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: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_cross.at:96: mv  MT MT.old"
echo t_cross.at:96 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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: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_cross.at:96: rm shared"
echo t_cross.at:96 >$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: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_cross.at:96: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$ROOT_R_SHA ."
echo t_cross.at:96 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $ROOT_R_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: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_cross.at:96: mv MT.old/options MT"
echo t_cross.at:96 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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: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

PROBE_R_SHA=`cat MT/revision`
PROBE_F_SHA=`monotone --norc identify shared`
$at_traceoff
echo "t_cross.at:96: test \$PROBE_R_SHA = \$ROOT_R_SHA"
echo t_cross.at:96 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $ROOT_R_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: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_cross.at:96: test \$PROBE_F_SHA = \$ROOT_F_SHA"
echo t_cross.at:96 >$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: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



# construct right node
$at_traceoff
echo "t_cross.at:99: cp shared.right shared"
echo t_cross.at:99 >$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:99: exit code was $at_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:100: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add specific.right"
echo t_cross.at:100 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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:100: exit code was $at_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:101: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message=right"
echo t_cross.at:101 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message=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:101: 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_R_SHA=`cat MT/revision`
RIGHT_F_SHA=`monotone --norc identify shared`
$at_traceoff
echo "t_cross.at:104: test \$RIGHT_R_SHA != \$ROOT_R_SHA"
echo t_cross.at:104 >$at_check_line_file
( $at_traceon; test $RIGHT_R_SHA != $ROOT_R_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:104: exit code was $at_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:105: test \$RIGHT_F_SHA != \$ROOT_F_SHA"
echo t_cross.at:105 >$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:105: exit code was $at_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:106: test \$RIGHT_R_SHA != \$LEFT_R_SHA"
echo t_cross.at:106 >$at_check_line_file
( $at_traceon; test $RIGHT_R_SHA != $LEFT_R_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:106: exit code was $at_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:107: test \$RIGHT_F_SHA != \$LEFT_F_SHA"
echo t_cross.at:107 >$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:107: 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:111: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add specific.left"
echo t_cross.at:111 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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:111: exit code was $at_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:112: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add specific.alice"
echo t_cross.at:112 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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:112: exit code was $at_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:113: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message=alice"
echo t_cross.at:113 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message=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:113: 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_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_cross.at:115: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR cert manifest \$ALICE_R_SHA ancestor \$LEFT_R_SHA"
echo t_cross.at:115 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR cert manifest $ALICE_R_SHA ancestor $LEFT_R_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:115: 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:118: rm -rf MT.old"
echo t_cross.at:118 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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:118: exit code was $at_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:118: mv  MT MT.old"
echo t_cross.at:118 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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:118: exit code was $at_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:118: rm shared"
echo t_cross.at:118 >$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:118: exit code was $at_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:118: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$LEFT_R_SHA ."
echo t_cross.at:118 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $LEFT_R_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:118: exit code was $at_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:118: mv MT.old/options MT"
echo t_cross.at:118 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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:118: 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_R_SHA=`cat MT/revision`
PROBE_F_SHA=`monotone --norc identify shared`
$at_traceoff
echo "t_cross.at:118: test \$PROBE_R_SHA = \$LEFT_R_SHA"
echo t_cross.at:118 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $LEFT_R_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:118: exit code was $at_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:118: test \$PROBE_F_SHA = \$LEFT_F_SHA"
echo t_cross.at:118 >$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:118: 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 bob, a derivative of left but with the specific change
# in right, and an ancestor edge to right.
$at_traceoff
echo "t_cross.at:122: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add specific.right"
echo t_cross.at:122 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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:122: exit code was $at_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:123: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add specific.bob"
echo t_cross.at:123 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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:123: exit code was $at_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:124: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message=bob"
echo t_cross.at:124 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message=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:124: 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_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_cross.at:126: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR cert manifest \$BOB_R_SHA ancestor \$RIGHT_R_SHA"
echo t_cross.at:126 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR cert manifest $BOB_R_SHA ancestor $RIGHT_R_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:126: 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.
# because there are conflicting changes and
# we have no merge3 hook to fall back on

$at_traceoff
echo "t_cross.at:132: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch merge"
echo t_cross.at:132 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --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:132: 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`
    ;;

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




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_rename.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_rename.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_rename.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add foo"
echo t_rename.at:13 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message=blah-blah"
echo t_rename.at:14 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message=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_R_SHA=`cat MT/revision`
ROOT_F_SHA=`monotone --norc identify foo`

# produce move edge
$at_traceoff
echo "t_rename.at:19: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename foo bar"
echo t_rename.at:19 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message=blah-blah"
echo t_rename.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message=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 -rf MT.old"
echo t_rename.at:24 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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: mv  MT MT.old"
echo t_rename.at:24 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$ROOT_R_SHA ."
echo t_rename.at:24 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $ROOT_R_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

$at_traceoff
echo "t_rename.at:24: mv MT.old/options MT"
echo t_rename.at:24 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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

PROBE_R_SHA=`cat MT/revision`
PROBE_F_SHA=`monotone --norc identify foo`
$at_traceoff
echo "t_rename.at:24: test \$PROBE_R_SHA = \$ROOT_R_SHA"
echo t_rename.at:24 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $ROOT_R_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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add bleh"
echo t_rename.at:28 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message=blah-blah"
echo t_rename.at:29 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message=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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR merge"
echo t_rename.at:32 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update"
echo t_rename.at:33 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR cat manifest"
echo t_rename.at:34 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   *);;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_rename.at:35: mv stdout manifest"
echo t_rename.at:35 >$at_check_line_file
( $at_traceon; mv stdout 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: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 bar manifest"
echo t_rename.at:36 >$at_check_line_file
( $at_traceon; grep bar 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: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_rename.at:37: grep bleh manifest"
echo t_rename.at:37 >$at_check_line_file
( $at_traceon; grep bleh 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: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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename bleh blah"
echo t_rename.at:40 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename blah blyh"
echo t_rename.at:43 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename blyh bleh"
echo t_rename.at:49 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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


# move file before renaming it
$at_traceoff
echo "t_rename.at:53: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_rename.at:53 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR status ) >$at_stdout 2>$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: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_rename.at:54: mv bar barfoo"
echo t_rename.at:54 >$at_check_line_file
( $at_traceon; mv bar barfoo ) >$at_stdout 2>$at_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: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_rename.at:55: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename bar barfoo"
echo t_rename.at:55 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename bar barfoo ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; tee stderr <$at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename.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_rename.at:56: grep 'adding bar -> barfoo to working copy rename set' stderr"
echo t_rename.at:56 >$at_check_line_file
( $at_traceon; grep 'adding bar -> barfoo to working copy rename set' stderr ) >$at_stdout 2>$at_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: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_rename.at:57: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_rename.at:57 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR status ) >$at_stdout 2>$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: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


# move file to wrong place before renaming it
$at_traceoff
echo "t_rename.at:60: mv barfoo bar"
echo t_rename.at:60 >$at_check_line_file
( $at_traceon; mv barfoo 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: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_rename.at:61: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR revert"
echo t_rename.at:61 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_rename.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_rename.at:62: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_rename.at:62 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR status ) >$at_stdout 2>$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: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_rename.at:63: mv bar barfoofoo"
echo t_rename.at:63 >$at_check_line_file
( $at_traceon; mv bar barfoofoo ) >$at_stdout 2>$at_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: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_rename.at:64: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename bar barfoo"
echo t_rename.at:64 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename bar barfoo ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; tee stderr <$at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename.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
echo "t_rename.at:65: grep 'adding bar -> barfoo to working copy rename set' stderr"
echo t_rename.at:65 >$at_check_line_file
( $at_traceon; grep 'adding bar -> barfoo to working copy rename set' stderr ) >$at_stdout 2>$at_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: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

$at_traceoff
echo "t_rename.at:66: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_rename.at:66 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR status ) >$at_stdout 2>$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:66: 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`
    ;;

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




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_renamed.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_renamed.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_renamed.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add foo"
echo t_renamed.at:15 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message=blah-blah"
echo t_renamed.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message=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_R_SHA=`cat MT/revision`
ROOT_F_SHA=`monotone --norc identify foo/foo`

# produce move edge
$at_traceoff
echo "t_renamed.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename foo bar"
echo t_renamed.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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 -pr foo bar"
echo t_renamed.at:22 >$at_check_line_file
( $at_traceon; cp -pr 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message=blah-blah"
echo t_renamed.at:23 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message=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 -rf MT.old"
echo t_renamed.at:26 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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: mv  MT MT.old"
echo t_renamed.at:26 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$ROOT_R_SHA ."
echo t_renamed.at:26 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $ROOT_R_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

$at_traceoff
echo "t_renamed.at:26: mv MT.old/options MT"
echo t_renamed.at:26 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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

PROBE_R_SHA=`cat MT/revision`
PROBE_F_SHA=`monotone --norc identify foo/foo`
$at_traceoff
echo "t_renamed.at:26: test \$PROBE_R_SHA = \$ROOT_R_SHA"
echo t_renamed.at:26 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $ROOT_R_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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add foo/bar"
echo t_renamed.at:32 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message=blah-blah"
echo t_renamed.at:33 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message=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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR merge"
echo t_renamed.at:36 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update"
echo t_renamed.at:37 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR cat manifest"
echo t_renamed.at:38 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   *);;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_renamed.at:39: mv stdout manifest"
echo t_renamed.at:39 >$at_check_line_file
( $at_traceon; mv stdout 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: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 bar/bar manifest"
echo t_renamed.at:40 >$at_check_line_file
( $at_traceon; grep bar/bar 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: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_renamed.at:41: grep bar/foo manifest"
echo t_renamed.at:41 >$at_check_line_file
( $at_traceon; grep bar/foo 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: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_renamed.at:42: grep foo/bar manifest"
echo t_renamed.at:42 >$at_check_line_file
( $at_traceon; grep foo/bar 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: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_renamed.at:43: grep foo/foo manifest"
echo t_renamed.at:43 >$at_check_line_file
( $at_traceon; grep foo/foo 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:43: 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:44: test -e bar/bar"
echo t_renamed.at:44 >$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: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_renamed.at:45: test -e bar/foo"
echo t_renamed.at:45 >$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: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`
    ;;

  24 ) # 24. 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 " 24: renaming and editing a file                  $ECHO_C"
    at_xfail=no
    (
      echo "24. t_erename.at:3: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_erename.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_erename.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_erename.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add foo"
echo t_erename.at:20 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message=root"
echo t_erename.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message=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_R_SHA=`cat MT/revision`
ROOT_F_SHA=`monotone --norc identify foo`

# 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message=edit-foo"
echo t_erename.at:27 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message=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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename foo bar"
echo t_erename.at:28 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message=rename-to-bar"
echo t_erename.at:30 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message=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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message=edit-bar"
echo t_erename.at:32 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message=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 -rf MT.old"
echo t_erename.at:35 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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: mv  MT MT.old"
echo t_erename.at:35 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$ROOT_R_SHA ."
echo t_erename.at:35 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $ROOT_R_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

$at_traceoff
echo "t_erename.at:35: mv MT.old/options MT"
echo t_erename.at:35 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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

PROBE_R_SHA=`cat MT/revision`
PROBE_F_SHA=`monotone --norc identify foo`
$at_traceoff
echo "t_erename.at:35: test \$PROBE_R_SHA = \$ROOT_R_SHA"
echo t_erename.at:35 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $ROOT_R_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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add bleh"
echo t_erename.at:39 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message=blah-blah"
echo t_erename.at:40 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message=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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR merge"
echo t_erename.at:43 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update"
echo t_erename.at:44 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR cat manifest"
echo t_erename.at:45 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   *);;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_erename.at:46: mv stdout manifest"
echo t_erename.at:46 >$at_check_line_file
( $at_traceon; mv stdout 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: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 bar manifest"
echo t_erename.at:47 >$at_check_line_file
( $at_traceon; grep bar 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: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_erename.at:48: grep bleh manifest"
echo t_erename.at:48 >$at_check_line_file
( $at_traceon; grep bleh 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: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_erename.at:49: grep foo manifest"
echo t_erename.at:49 >$at_check_line_file
( $at_traceon; grep foo 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:49: 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:52: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR diff --revision \$ROOT_R_SHA"
echo t_erename.at:52 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR diff --revision $ROOT_R_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: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_erename.at:53: grep rename stdout"
echo t_erename.at:53 >$at_check_line_file
( $at_traceon; grep rename 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: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_erename.at:55: rm bar"
echo t_erename.at:55 >$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: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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

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




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_cvsimport.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_cvsimport.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_cvsimport.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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=`monotone --norc identify importme.0`
TSHA1=`monotone --norc identify importme.1`
TSHA2=`monotone --norc identify importme.2`
TSHA3=`monotone --norc identify importme.3`

# 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch cvs_import \$CVSROOT/testdir"
echo t_cvsimport.at:49 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR cat file \$TSHA0"
echo t_cvsimport.at:50 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR cat file \$TSHA1"
echo t_cvsimport.at:51 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR cat file \$TSHA2"
echo t_cvsimport.at:52 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR cat file \$TSHA3"
echo t_cvsimport.at:53 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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


# also check that history is okay -- has a unique head, and it's the
# right one.

$at_traceoff
echo "t_cvsimport.at:58: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout --branch=testbranch mtcodir"
echo t_cvsimport.at:58 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout --branch=testbranch mtcodir ) >$at_stdout 2>$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: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_cvsimport.at:59: cmp importme.3 mtcodir/importme"
echo t_cvsimport.at:59 >$at_check_line_file
( $at_traceon; cmp importme.3 mtcodir/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: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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  26 ) # 26. 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 " 26: importing files with non-english names       $ECHO_C"
    at_xfail=no
    (
      echo "26. t_i18n_file.at:3: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_i18n_file.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_i18n_file.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_i18n_file.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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"`

if test "$OSTYPE" == "msys"; then
  FUNNY_FILENAME="file+name-with_funny@symbols%etc"
else
  FUNNY_FILENAME="file+name-with_funny@symbols%etc:"
fi

$at_traceoff
echo "t_i18n_file.at:19: mkdir tmp"
echo t_i18n_file.at:19 >$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: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:20: touch \"tmp/file name with spaces\""
echo t_i18n_file.at:20 >$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: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_i18n_file.at:21: touch \"tmp/\$FUNNY_FILENAME\""
echo t_i18n_file.at:21 >$at_check_line_file
( $at_traceon; touch "tmp/$FUNNY_FILENAME" ) >$at_stdout 2>$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: touch \"tmp/\$EUROPEAN_UTF8\""
echo t_i18n_file.at:22 >$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: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_i18n_file.at:23: touch \"tmp/\$JAPANESE_UTF8\""
echo t_i18n_file.at:23 >$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: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_i18n_file.at:24: touch \"tmp/\$EUROPEAN_8859_1\""
echo t_i18n_file.at:24 >$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: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_i18n_file.at:25: touch \"tmp/\$JAPANESE_EUC_JP\""
echo t_i18n_file.at:25 >$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: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_i18n_file.at:27: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add \"tmp/file name with spaces\""
echo t_i18n_file.at:27 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add \"tmp/\$FUNNY_FILENAME\""
echo t_i18n_file.at:28 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add "tmp/$FUNNY_FILENAME" ) >$at_stdout 2>$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


# add some files with UTF8 names
export LANG=en_US.utf-8
export CHARSET=utf-8
$at_traceoff
echo "t_i18n_file.at:33: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add \"tmp/\$EUROPEAN_UTF8\""
echo t_i18n_file.at:33 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add \"tmp/\$JAPANESE_UTF8\""
echo t_i18n_file.at:34 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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_i18n_file.at:36: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message 'adding european and japanese names in UTF-8'"
echo t_i18n_file.at:36 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 'adding european and japanese names in UTF-8' ) >$at_stdout 2>$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: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


# check the names showed up in our manifest

$at_traceoff
echo "t_i18n_file.at:40: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR cat manifest"
echo t_i18n_file.at:40 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_i18n_file.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_i18n_file.at:41: mv stdout manifest"
echo t_i18n_file.at:41 >$at_check_line_file
( $at_traceon; mv stdout 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_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 manifest"
echo t_i18n_file.at:42 >$at_check_line_file
( $at_traceon; grep funny 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 manifest"
echo t_i18n_file.at:43 >$at_check_line_file
( $at_traceon; grep spaces 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 manifest"
echo t_i18n_file.at:44 >$at_check_line_file
( $at_traceon; grep $JAPANESE_UTF8 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 manifest"
echo t_i18n_file.at:45 >$at_check_line_file
( $at_traceon; grep $EUROPEAN_UTF8 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


# remove the UTF8 files, change locales, and add them again. both should work.

export LANG=de_DE.iso-8859-1
export CHARSET=iso-8859-1
$at_traceoff
echo "t_i18n_file.at:51: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR drop \"tmp/\$EUROPEAN_8859_1\""
echo t_i18n_file.at:51 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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_i18n_file.at:52: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add \"tmp/\$EUROPEAN_8859_1\""
echo t_i18n_file.at:52 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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_i18n_file.at:54: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message 'adding european name in ISO 8859-1'"
echo t_i18n_file.at:54 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 'adding european name in ISO 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: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


export LANG=ja_JP.euc-jp
export CHARSET=euc-jp
$at_traceoff
echo "t_i18n_file.at:58: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR drop \"tmp/\$JAPANESE_EUC_JP\""
echo t_i18n_file.at:58 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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_i18n_file.at:59: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add \"tmp/\$JAPANESE_EUC_JP\""
echo t_i18n_file.at:59 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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_i18n_file.at:61: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message 'adding japanese name in EUC-JP'"
echo t_i18n_file.at:61 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 'adding japanese name in 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: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


# check the names showed up in our manifest

$at_traceoff
echo "t_i18n_file.at:65: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR cat manifest"
echo t_i18n_file.at:65 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_i18n_file.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

$at_traceoff
echo "t_i18n_file.at:66: mv stdout manifest"
echo t_i18n_file.at:66 >$at_check_line_file
( $at_traceon; mv stdout 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_i18n_file.at:66: exit code was $at_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:67: grep funny manifest"
echo t_i18n_file.at:67 >$at_check_line_file
( $at_traceon; grep funny 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: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_i18n_file.at:68: grep spaces manifest"
echo t_i18n_file.at:68 >$at_check_line_file
( $at_traceon; grep spaces 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: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_i18n_file.at:69: grep \$JAPANESE_UTF8 manifest"
echo t_i18n_file.at:69 >$at_check_line_file
( $at_traceon; grep $JAPANESE_UTF8 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: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_i18n_file.at:70: grep \$EUROPEAN_UTF8 manifest"
echo t_i18n_file.at:70 >$at_check_line_file
( $at_traceon; grep $EUROPEAN_UTF8 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: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_i18n_file.at:72: rm -Rf tmp"
echo t_i18n_file.at:72 >$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: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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  27 ) # 27. 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 " 27: external unit test of the line merger        $ECHO_C"
    at_xfail=no
    (
      echo "27. t_fmerge.at:3: testing ..."
      $at_traceon


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



if which mimencode 2>/dev/null; then
  UNB64_COMMAND="mimencode -u"
elif which recode 2>/dev/null; then
  UNB64_COMMAND="recode /Base64"
elif perl -MMIME::Base64 -e 1 2>/dev/null; then
  UNB64_COMMAND="perl -MMIME::Base64 -ne 'print decode_base64(\$_)'"
elif python -c 'import sys;sys.exit(not hasattr("", "decode"))' 2>/dev/null; then
  UNB64_COMMAND="python -c 'import sys;sys.stdout.write(sys.stdin.read().decode("'"'"base64"'"'"))'"
else
  # This is lame!  We should XFAIL the test so the user knows that
  # they're not, you know, actually testing the software.  But
  # Autotest runs XFAIL conditions in a completely different shell, so
  # we can't without duplicating the whole test here.
  exit 77
fi
# Poor man's logging:
$at_traceoff
echo "t_fmerge.at:10: echo \$UNB64_COMMAND"
echo t_fmerge.at:10 >$at_check_line_file
( $at_traceon; echo $UNB64_COMMAND ) >$at_stdout 2>$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: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



if which gunzip 2>/dev/null; then
  # This is lame!  We should XFAIL the test so the user knows that
  # they're not, you know, actually testing the software.  But
  # Autotest runs XFAIL conditions in a completely different shell, so
  # we can't without duplicating the whole test here.
  UNGZ_COMMAND="gunzip -c"
fi
# Poor man's logging:
$at_traceoff
echo "t_fmerge.at:10: echo \$UNGZ_COMMAND"
echo t_fmerge.at:10 >$at_check_line_file
( $at_traceon; echo $UNGZ_COMMAND ) >$at_stdout 2>$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: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






# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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:12: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_fmerge.at:12 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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: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_fmerge.at:12: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_fmerge.at:12 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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_fmerge.at:12: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_fmerge.at:12 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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_fmerge.at:12: rm test_keys"
echo t_fmerge.at:12 >$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: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



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



$at_traceoff
echo "t_fmerge.at:210: if test \"\$OSTYPE\" == \"msys\"; then
  mimencode -u -o left.gz left.gz.enc
else
  eval \$UNB64_COMMAND <left.gz.enc >left.gz
fi
"
echo t_fmerge.at:210 >$at_check_line_file
( $at_traceon; if test "$OSTYPE" == "msys"; then
  mimencode -u -o left.gz left.gz.enc
else
  eval $UNB64_COMMAND <left.gz.enc >left.gz
fi
 ) >$at_stdout 2>$at_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:210: exit code was $at_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:210: eval \$UNGZ_COMMAND <left.gz >left
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o left
fi
"
echo t_fmerge.at:210 >$at_check_line_file
( $at_traceon; eval $UNGZ_COMMAND <left.gz >left
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o left
fi
 ) >$at_stdout 2>$at_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:210: exit code was $at_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:211: if test \"\$OSTYPE\" == \"msys\"; then
  mimencode -u -o right.gz right.gz.enc
else
  eval \$UNB64_COMMAND <right.gz.enc >right.gz
fi
"
echo t_fmerge.at:211 >$at_check_line_file
( $at_traceon; if test "$OSTYPE" == "msys"; then
  mimencode -u -o right.gz right.gz.enc
else
  eval $UNB64_COMMAND <right.gz.enc >right.gz
fi
 ) >$at_stdout 2>$at_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:211: exit code was $at_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:211: eval \$UNGZ_COMMAND <right.gz >right
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o right
fi
"
echo t_fmerge.at:211 >$at_check_line_file
( $at_traceon; eval $UNGZ_COMMAND <right.gz >right
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o right
fi
 ) >$at_stdout 2>$at_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:211: exit code was $at_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:212: if test \"\$OSTYPE\" == \"msys\"; then
  mimencode -u -o ancestor.gz ancestor.gz.enc
else
  eval \$UNB64_COMMAND <ancestor.gz.enc >ancestor.gz
fi
"
echo t_fmerge.at:212 >$at_check_line_file
( $at_traceon; if test "$OSTYPE" == "msys"; then
  mimencode -u -o ancestor.gz ancestor.gz.enc
else
  eval $UNB64_COMMAND <ancestor.gz.enc >ancestor.gz
fi
 ) >$at_stdout 2>$at_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:212: exit code was $at_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:212: eval \$UNGZ_COMMAND <ancestor.gz >ancestor
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o ancestor
fi
"
echo t_fmerge.at:212 >$at_check_line_file
( $at_traceon; eval $UNGZ_COMMAND <ancestor.gz >ancestor
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o ancestor
fi
 ) >$at_stdout 2>$at_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:212: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



ANC=cec9ec2e479b700ea267e70feb5a4eb15155190d
LEFT=52f65363d555fecd3d2e887a207c3add0a949638
RIGHT=3ea0b30aa5c7b20329ce9170ff4d379522c8bcda

AVER=`monotone --norc identify ancestor`
LVER=`monotone --norc identify left`
RVER=`monotone --norc identify right`

$at_traceoff
echo "t_fmerge.at:222: test \$AVER = \$ANC"
echo t_fmerge.at:222 >$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:222: exit code was $at_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:223: test \$LVER = \$LEFT"
echo t_fmerge.at:223 >$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:223: exit code was $at_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:224: test \$RVER = \$RIGHT"
echo t_fmerge.at:224 >$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:224: exit code was $at_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:226: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR fload <ancestor"
echo t_fmerge.at:226 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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:226: exit code was $at_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:227: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR fload <left"
echo t_fmerge.at:227 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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:227: exit code was $at_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:228: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR fload <right"
echo t_fmerge.at:228 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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:228: exit code was $at_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:230: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR fmerge \$ANC \$LEFT \$RIGHT"
echo t_fmerge.at:230 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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:230: exit code was $at_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:231:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_fmerge.at:231 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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: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: mv stdout merge.monotone"
echo t_fmerge.at:232 >$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: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:234: diff3 -E --merge left ancestor right"
echo t_fmerge.at:234 >$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:234: exit code was $at_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: mv stdout merge.diff3"
echo t_fmerge.at:235 >$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: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:237: cmp merge.monotone merge.diff3"
echo t_fmerge.at:237 >$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: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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  28 ) # 28. 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 " 28: exchanging work via netsync                  $ECHO_C"
    at_xfail=no
    (
      echo "28. t_netsync.at:3: testing ..."
      $at_traceon





# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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:6: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_netsync.at:6 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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: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_netsync.at:6: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_netsync.at:6 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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_netsync.at:6: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_netsync.at:6 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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_netsync.at:6: rm test_keys"
echo t_netsync.at:6 >$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: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_netsync.at:7: cp test.db test2.db"
echo t_netsync.at:7 >$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: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_netsync.at:7: cp test.db test3.db"
echo t_netsync.at:7 >$at_check_line_file
( $at_traceon; cp test.db test3.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: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 >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:11: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_netsync.at:11 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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_netsync.at:12: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_netsync.at:12 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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: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

F_VER0=`monotone --norc identify testfile`
VER0=`cat MT/revision`

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

$at_traceoff
echo "t_netsync.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message blah-blah"
echo t_netsync.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message 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: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

F_VER1=`monotone --norc identify testfile`
VER1=`cat MT/revision`




if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi

$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --rcfile=netsync.lua serve localhost:5555 testbranch &
sleep 4



$at_traceoff
echo "t_netsync.at:22: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost:5555 testbranch"
echo t_netsync.at:22 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost: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: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





if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill " $a);}'
  # MinGW has no killall.  The weird a=1 thing is to avoid autotest treating  as its own parameter
else
  killall monotone 2>/dev/null
fi

sleep 1

if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi




$at_traceoff
echo "t_netsync.at:24: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db ls certs \$VER0"
echo t_netsync.at:24 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --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: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_netsync.at:25: mv stdout certs"
echo t_netsync.at:25 >$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: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_netsync.at:26: grep date certs"
echo t_netsync.at:26 >$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: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_netsync.at:27: grep author certs"
echo t_netsync.at:27 >$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: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_netsync.at:28: grep branch certs"
echo t_netsync.at:28 >$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: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_netsync.at:29: grep changelog certs"
echo t_netsync.at:29 >$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: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_netsync.at:30: grep bad certs"
echo t_netsync.at:30 >$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:30: 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:32: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db ls certs \$VER1"
echo t_netsync.at:32 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --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: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_netsync.at:33: mv stdout certs"
echo t_netsync.at:33 >$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: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_netsync.at:34: grep date certs"
echo t_netsync.at:34 >$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: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_netsync.at:35: grep author certs"
echo t_netsync.at:35 >$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: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_netsync.at:36: grep branch certs"
echo t_netsync.at:36 >$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: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: grep changelog certs"
echo t_netsync.at:37 >$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: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 bad certs"
echo t_netsync.at:38 >$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:38: 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:40: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db cat revision \$VER0"
echo t_netsync.at:40 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db cat revision $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: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:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_netsync.at:41 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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: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

CHK=`monotone --norc identify stdout`
$at_traceoff
echo "t_netsync.at:43: test \$CHK = \$VER0"
echo t_netsync.at:43 >$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: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_netsync.at:45: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db cat revision \$VER1"
echo t_netsync.at:45 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db cat revision $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: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:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_netsync.at:46 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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: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

CHK=`monotone --norc identify stdout`
$at_traceoff
echo "t_netsync.at:48: test \$CHK = \$VER1"
echo t_netsync.at:48 >$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: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:50: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db cat file \$F_VER0"
echo t_netsync.at:50 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --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: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:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_netsync.at:51 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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: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

CHK=`monotone --norc identify stdout`
$at_traceoff
echo "t_netsync.at:53: test \$CHK = \$F_VER0"
echo t_netsync.at:53 >$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: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_netsync.at:55: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db cat file \$F_VER1"
echo t_netsync.at:55 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --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: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:56:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_netsync.at:56 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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: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

CHK=`monotone --norc identify stdout`
$at_traceoff
echo "t_netsync.at:58: test \$CHK = \$F_VER1"
echo t_netsync.at:58 >$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: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_netsync.at:60: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db info"
echo t_netsync.at:60 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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_netsync.at:61:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_netsync.at:61 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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: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

INFO1=`monotone --norc identify stdout`
$at_traceoff
echo "t_netsync.at:63: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db db info"
echo t_netsync.at:63 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --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: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:64:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_netsync.at:64 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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: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

INFO2=`monotone --norc identify stdout`
$at_traceoff
echo "t_netsync.at:66: test \$INFO1 = \$INFO2"
echo t_netsync.at:66 >$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:66: exit code 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_netsync_single.at:3: single manifest netsync
    at_setup_line='t_netsync_single.at:3'
    at_desc='single manifest netsync'
    $at_quiet $ECHO_N " 29: single manifest netsync                      $ECHO_C"
    at_xfail=no
    (
      echo "29. t_netsync_single.at:3: testing ..."
      $at_traceon





# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_single.at:6: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_netsync_single.at:6 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_single.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_netsync_single.at:6: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_netsync_single.at:6 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_single.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_netsync_single.at:6: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_netsync_single.at:6 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_single.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_netsync_single.at:6: rm test_keys"
echo t_netsync_single.at:6 >$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_single.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_netsync_single.at:7: cp test.db test2.db"
echo t_netsync_single.at:7 >$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_single.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 >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_single.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_netsync_single.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_single.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_netsync_single.at:22: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch --rcfile=netsync.lua commit --message blah-blah"
echo t_netsync_single.at:22 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch --rcfile=netsync.lua commit --message 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_single.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

F_VER0=`monotone --norc identify testfile`
VER0=`cat MT/revision`


if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi

         $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --rcfile=netsync.lua               serve 127.0.0.1:5555 testbranch &
sleep 5
$at_traceoff
echo "t_netsync_single.at:29: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --rcfile=netsync.lua --db=test2.db pull 127.0.0.1:5555 testbranch"
echo t_netsync_single.at:29 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --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_single.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


if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi


$at_traceoff
echo "t_netsync_single.at:32: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db ls certs \$VER0"
echo t_netsync_single.at:32 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --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_single.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_netsync_single.at:33: mv stdout certs"
echo t_netsync_single.at:33 >$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_single.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_netsync_single.at:34: grep date certs"
echo t_netsync_single.at:34 >$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_single.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_netsync_single.at:35: grep author certs"
echo t_netsync_single.at:35 >$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_single.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_netsync_single.at:36: grep branch certs"
echo t_netsync_single.at:36 >$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_single.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_single.at:37: grep changelog certs"
echo t_netsync_single.at:37 >$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_single.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_single.at:38: grep bad certs"
echo t_netsync_single.at:38 >$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_single.at:38: 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_single.at:40: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db cat revision \$VER0"
echo t_netsync_single.at:40 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db cat revision $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_single.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_single.at:41:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_netsync_single.at:41 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_single.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

CHK=`monotone --norc identify stdout`
$at_traceoff
echo "t_netsync_single.at:43: test \$CHK = \$VER0"
echo t_netsync_single.at:43 >$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_single.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_netsync_single.at:45: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db cat file \$F_VER0"
echo t_netsync_single.at:45 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --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_single.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_single.at:46:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_netsync_single.at:46 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_single.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

CHK=`monotone --norc identify stdout`
$at_traceoff
echo "t_netsync_single.at:48: test \$CHK = \$F_VER0"
echo t_netsync_single.at:48 >$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_single.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_single.at:50: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db info"
echo t_netsync_single.at:50 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_single.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

INFO1=`monotone --norc identify stdout`
$at_traceoff
echo "t_netsync_single.at:52: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db db info"
echo t_netsync_single.at:52 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --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_single.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

INFO2=`monotone --norc identify stdout`
$at_traceoff
echo "t_netsync_single.at:54: test \$INFO1 = \$INFO2"
echo t_netsync_single.at:54 >$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_single.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  30 ) # 30. t_netsync_pubkey.at:1: netsync transfers public keys
    at_setup_line='t_netsync_pubkey.at:1'
    at_desc='netsync transfers public keys'
    $at_quiet $ECHO_N " 30: netsync transfers public keys                $ECHO_C"
    at_xfail=no
    (
      echo "30. t_netsync_pubkey.at:1: testing ..."
      $at_traceon





# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_pubkey.at:4: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_netsync_pubkey.at:4 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_pubkey.at:4: exit code was $at_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_pubkey.at:4: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_netsync_pubkey.at:4 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_pubkey.at:4: exit code was $at_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_pubkey.at:4: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_netsync_pubkey.at:4 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_pubkey.at:4: exit code was $at_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_pubkey.at:4: rm test_keys"
echo t_netsync_pubkey.at:4 >$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_pubkey.at:4: exit code was $at_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_pubkey.at:5: cp test.db test2.db"
echo t_netsync_pubkey.at:5 >$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_pubkey.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_pubkey.at:5: cp test.db test3.db"
echo t_netsync_pubkey.at:5 >$at_check_line_file
( $at_traceon; cp test.db test3.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_pubkey.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 >netsync.lua <<'_ATEOF'

function get_netsync_read_permitted(collection, identity)
	return true
end

function get_netsync_write_permitted(collection, identity)
	return true
end
_ATEOF




PUBKEY=52f32ec62128ea3541ebdd9d17400e268cfcd3fe
PRIVKEY=6bc487f69face10123d80a053ef11b76e3d82068
cat >newkeys.txt <<'_ATEOF'
[pubkey foo@test.example.com]
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQC+6X7+HI715//0pWHWGcN/tw439uUUahtD
wV8ckNKFTCKnWU0U4mzanMoKJCeSRttR7uRkmWPQX3e9pq8Klcpocws1/XpJr31NhDqvWmTb
ABduS/GJeSZugrU6MYBLX12eLUCynWXoSXRGtX+9Xrjt2pAMAq3LkSDcRUUgYOCS+wIBEQ==
[end]
[privkey foo@test.example.com]
V5sdpIQJk4r4nvMUBnuoaEjmV+PJXkoXn5GnYlDK++tg+JiWVQyDra7m0psmEuOACfZpN6aU
21cdFhuSnU9pPerUBnSo7BrzAdw2d6Qenz5N/oxOn1lM+9he0ooAiwrHUmjqyrhZCPnybvGV
6vPBSyPfFaMBjWOIgsabvGqIQEWOSxeDAjAWIwJGblzz4x8NIfBFw/NUMu9ljdvGy2XV5a8Q
ERyzZlByYJV0u2W+4ES58L43jvirXpYc3peenus8j1kaVwgFFR6Rqvqgxt28oPBA1usV5HXz
7CN3CxGAlhaHFO1Ke+13L3dv9uTGr5gfzGidKLm6ocBRxYx2vOKEanIxFpgSzqCrPnUgNzaC
SQt0I+msb9CosL1x+puLv96mF78cRRzXpIULxgOlVfdukoiNzdy2sNCuBpAM593rtXPfRRR3
PlEImiE9LJmnD70eNlKFmVEAs0EKPM2Hk0FLVrB5B8KPRfufq816+ie3gVkNytvIOqch7WrS
T7uBHbrFwhVJG190foSqefSDwXF/D0CmqrbPZ+tjK/nC3jentNTAO14dMM1uAuNXdGVY961o
nd2i+b4MhQwa9/uRV13Trg9/IWmmOpEplUk9FdEPLXNiAULgbc1tY+W69R4wDmdwm0IN7jb6
Awr3xkFSMAla+oMHZ86Ytm4hDER6TfHACcK685QSNVWOuIIGNLULPht7bwnSi6qLb4wcLXV3
tPU2bJoTyjp5hdos762XrZjp4OPM3zS9nOL/86rfGn02kHItf5qgsa2ZLTae0Kgl9Gbv9JHD
Ppeoic6H3AxzmdvGRV85sylfNqcfarayoNMEOGK61NpW46iibA==
[end]
_ATEOF


$at_traceoff
echo "t_netsync_pubkey.at:30: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <newkeys.txt"
echo t_netsync_pubkey.at:30 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR read <newkeys.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_netsync_pubkey.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_netsync_pubkey.at:31: rm -f newkeys.txt"
echo t_netsync_pubkey.at:31 >$at_check_line_file
( $at_traceon; rm -f newkeys.txt ) >$at_stdout 2>$at_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_pubkey.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


# First commit a version that doesn't use the new key, and make sure
# that it doesn't get transferred.

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

$at_traceoff
echo "t_netsync_pubkey.at:36: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_netsync_pubkey.at:36 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_pubkey.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_pubkey.at:37: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_netsync_pubkey.at:37 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_pubkey.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






if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi

$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --rcfile=netsync.lua serve localhost:5555 testbranch &
sleep 4



$at_traceoff
echo "t_netsync_pubkey.at:39: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost:5555 testbranch"
echo t_netsync_pubkey.at:39 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost: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_pubkey.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





if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill " $a);}'
  # MinGW has no killall.  The weird a=1 thing is to avoid autotest treating  as its own parameter
else
  killall monotone 2>/dev/null
fi

sleep 1

if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi




$at_traceoff
echo "t_netsync_pubkey.at:41: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db ls keys"
echo t_netsync_pubkey.at:41 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db ls 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync_pubkey.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_pubkey.at:42: grep -q \$PUBKEY stdout"
echo t_netsync_pubkey.at:42 >$at_check_line_file
( $at_traceon; grep -q $PUBKEY 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_netsync_pubkey.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_pubkey.at:43: grep -q \$PRIVKEY stdout"
echo t_netsync_pubkey.at:43 >$at_check_line_file
( $at_traceon; grep -q $PRIVKEY 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_netsync_pubkey.at:43: 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 commit a version that does use the new key, and make sure that
# now it does get transferred.

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


$at_traceoff
echo "t_netsync_pubkey.at:49: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah --key=foo@test.example.com"
echo t_netsync_pubkey.at:49 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message blah-blah --key=foo@test.example.com ) >$at_stdout 2>$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_pubkey.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





if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi

$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --rcfile=netsync.lua serve localhost:5555 testbranch &
sleep 4



$at_traceoff
echo "t_netsync_pubkey.at:51: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost:5555 testbranch"
echo t_netsync_pubkey.at:51 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost: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_pubkey.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





if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill " $a);}'
  # MinGW has no killall.  The weird a=1 thing is to avoid autotest treating  as its own parameter
else
  killall monotone 2>/dev/null
fi

sleep 1

if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi




$at_traceoff
echo "t_netsync_pubkey.at:53: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db ls keys"
echo t_netsync_pubkey.at:53 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db ls 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync_pubkey.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_netsync_pubkey.at:54: grep -q \$PUBKEY stdout"
echo t_netsync_pubkey.at:54 >$at_check_line_file
( $at_traceon; grep -q $PUBKEY 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;;
   0) ;;
   *) echo "t_netsync_pubkey.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_netsync_pubkey.at:55: grep -q \$PRIVKEY stdout"
echo t_netsync_pubkey.at:55 >$at_check_line_file
( $at_traceon; grep -q $PRIVKEY 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_netsync_pubkey.at:55: 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`
    ;;

  31 ) # 31. t_netsync_repeated.at:1: repeatedly exchanging work via netsync
    at_setup_line='t_netsync_repeated.at:1'
    at_desc='repeatedly exchanging work via netsync'
    $at_quiet $ECHO_N " 31: repeatedly exchanging work via netsync       $ECHO_C"
    at_xfail=no
    (
      echo "31. t_netsync_repeated.at:1: testing ..."
      $at_traceon





# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_repeated.at:4: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_netsync_repeated.at:4 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_repeated.at:4: exit code was $at_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_repeated.at:4: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_netsync_repeated.at:4 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_repeated.at:4: exit code was $at_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_repeated.at:4: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_netsync_repeated.at:4 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_repeated.at:4: exit code was $at_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_repeated.at:4: rm test_keys"
echo t_netsync_repeated.at:4 >$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_repeated.at:4: exit code was $at_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_repeated.at:5: cp test.db test2.db"
echo t_netsync_repeated.at:5 >$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_repeated.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_repeated.at:5: cp test.db test3.db"
echo t_netsync_repeated.at:5 >$at_check_line_file
( $at_traceon; cp test.db test3.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_repeated.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 >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 data
_ATEOF

$at_traceoff
echo "t_netsync_repeated.at:8: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_netsync_repeated.at:8 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_repeated.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_netsync_repeated.at:9: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_netsync_repeated.at:9 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_repeated.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


VER0=`cat MT/revision`




if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi

$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --rcfile=netsync.lua serve localhost:5555 testbranch &
sleep 4



$at_traceoff
echo "t_netsync_repeated.at:12: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost:5555 testbranch"
echo t_netsync_repeated.at:12 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost: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_repeated.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





if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill " $a);}'
  # MinGW has no killall.  The weird a=1 thing is to avoid autotest treating  as its own parameter
else
  killall monotone 2>/dev/null
fi

sleep 1

if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi





cat >testfile2 <<'_ATEOF'
some data
_ATEOF

$at_traceoff
echo "t_netsync_repeated.at:15: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile2"
echo t_netsync_repeated.at:15 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add 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_netsync_repeated.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_netsync_repeated.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_netsync_repeated.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_repeated.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


VER1=`cat MT/revision`


$at_traceoff
echo "t_netsync_repeated.at:19: rm -rf MT.old"
echo t_netsync_repeated.at:19 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_repeated.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_netsync_repeated.at:19: mv  MT MT.old"
echo t_netsync_repeated.at:19 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_repeated.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_netsync_repeated.at:19: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$VER0 ."
echo t_netsync_repeated.at:19 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $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:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync_repeated.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_netsync_repeated.at:19: mv MT.old/options MT"
echo t_netsync_repeated.at:19 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_repeated.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_netsync_repeated.at:19: test \$PROBE_R_SHA = \$VER0"
echo t_netsync_repeated.at:19 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $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_repeated.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




cat >testfile <<'_ATEOF'
version 1 data
_ATEOF



$at_traceoff
echo "t_netsync_repeated.at:23: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_netsync_repeated.at:23 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_repeated.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


VER2=`cat MT/revision`

$at_traceoff
echo "t_netsync_repeated.at:26: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch merge"
echo t_netsync_repeated.at:26 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --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_netsync_repeated.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_netsync_repeated.at:27: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update"
echo t_netsync_repeated.at:27 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_netsync_repeated.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

VER3=`cat MT/revision`




if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi

$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --rcfile=netsync.lua serve localhost:5555 testbranch &
sleep 4



$at_traceoff
echo "t_netsync_repeated.at:30: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost:5555 testbranch"
echo t_netsync_repeated.at:30 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost: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_repeated.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





if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill " $a);}'
  # MinGW has no killall.  The weird a=1 thing is to avoid autotest treating  as its own parameter
else
  killall monotone 2>/dev/null
fi

sleep 1

if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi





$at_traceoff
echo "t_netsync_repeated.at:32: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR agraph"
echo t_netsync_repeated.at:32 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR agraph ) >$at_stdout 2>$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_netsync_repeated.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_netsync_repeated.at:32: mv stdout expout"
echo t_netsync_repeated.at:32 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_repeated.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_netsync_repeated.at:32: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db agraph"
echo t_netsync_repeated.at:32 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db agraph ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync_repeated.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_netsync_repeated.at:34: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls certs \$VER1"
echo t_netsync_repeated.at:34 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR ls certs $VER1 ) >$at_stdout 2>$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_netsync_repeated.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_netsync_repeated.at:34: mv stdout expout"
echo t_netsync_repeated.at:34 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_repeated.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_netsync_repeated.at:34: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db ls certs \$VER1"
echo t_netsync_repeated.at:34 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --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
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync_repeated.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_netsync_repeated.at:35: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls certs \$VER2"
echo t_netsync_repeated.at:35 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR ls certs $VER2 ) >$at_stdout 2>$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_netsync_repeated.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_netsync_repeated.at:35: mv stdout expout"
echo t_netsync_repeated.at:35 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_repeated.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_netsync_repeated.at:35: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db ls certs \$VER2"
echo t_netsync_repeated.at:35 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db ls certs $VER2 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync_repeated.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_netsync_repeated.at:36: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls certs \$VER3"
echo t_netsync_repeated.at:36 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR ls certs $VER3 ) >$at_stdout 2>$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_netsync_repeated.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_repeated.at:36: mv stdout expout"
echo t_netsync_repeated.at:36 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_repeated.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_repeated.at:36: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db ls certs \$VER3"
echo t_netsync_repeated.at:36 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db ls certs $VER3 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync_repeated.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  32 ) # 32. t_netsync_unrelated.at:1: (normal) netsync on partially unrelated revisions
    at_setup_line='t_netsync_unrelated.at:1'
    at_desc='(normal) netsync on partially unrelated revisions'
    $at_quiet $ECHO_N " 32: (normal) netsync on partially unrelated revisions$ECHO_C"
    at_xfail=yes
    (
      echo "32. t_netsync_unrelated.at:1: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_unrelated.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_netsync_unrelated.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_unrelated.at:3: exit code was $at_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_unrelated.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_netsync_unrelated.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_unrelated.at:3: exit code was $at_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_unrelated.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_netsync_unrelated.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_unrelated.at:3: exit code was $at_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_unrelated.at:3: rm test_keys"
echo t_netsync_unrelated.at:3 >$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_unrelated.at:3: 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 tests netsync'ing
#
#   A   B
#    \ /
#     C
#
# where A starts out shared, but B and C do not.

# For analysis and discussion of solutions, see:
#   http://lists.gnu.org/archive/html/monotone-devel/2004-11/msg00043.html
# There are other strategies that might be good besides the one
# mentioned there; doing sideways deltas between heads, all sorts of
# possibilities for maybe-efficient algorithms.

# This test is a bug report.




$at_traceoff
echo "t_netsync_unrelated.at:22: cp test.db test2.db"
echo t_netsync_unrelated.at:22 >$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_unrelated.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_netsync_unrelated.at:22: cp test.db test3.db"
echo t_netsync_unrelated.at:22 >$at_check_line_file
( $at_traceon; cp test.db test3.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_unrelated.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

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 >testfile1 <<'_ATEOF'
This is test file 1
_ATEOF

$at_traceoff
echo "t_netsync_unrelated.at:25: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile1"
echo t_netsync_unrelated.at:25 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_netsync_unrelated.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_netsync_unrelated.at:26: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_netsync_unrelated.at:26 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_unrelated.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


BASE=`cat MT/revision`




if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi

$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --rcfile=netsync.lua serve localhost:5555 testbranch &
sleep 4



$at_traceoff
echo "t_netsync_unrelated.at:29: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost:5555 testbranch"
echo t_netsync_unrelated.at:29 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost: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_unrelated.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





if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill " $a);}'
  # MinGW has no killall.  The weird a=1 thing is to avoid autotest treating  as its own parameter
else
  killall monotone 2>/dev/null
fi

sleep 1

if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi





$at_traceoff
echo "t_netsync_unrelated.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR agraph"
echo t_netsync_unrelated.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR agraph ) >$at_stdout 2>$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_netsync_unrelated.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_netsync_unrelated.at:31: mv stdout expout"
echo t_netsync_unrelated.at:31 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_unrelated.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_netsync_unrelated.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db agraph"
echo t_netsync_unrelated.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db agraph ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync_unrelated.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_netsync_unrelated.at:32: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls certs \$BASE"
echo t_netsync_unrelated.at:32 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR ls certs $BASE ) >$at_stdout 2>$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_netsync_unrelated.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_netsync_unrelated.at:32: mv stdout expout"
echo t_netsync_unrelated.at:32 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_unrelated.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_netsync_unrelated.at:32: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls certs \$BASE"
echo t_netsync_unrelated.at:32 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR ls certs $BASE ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync_unrelated.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_netsync_unrelated.at:34: rm -rf MT"
echo t_netsync_unrelated.at:34 >$at_check_line_file
( $at_traceon; rm -rf MT ) >$at_stdout 2>$at_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_unrelated.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_netsync_unrelated.at:35: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_netsync_unrelated.at:35 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_unrelated.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 >testfile2 <<'_ATEOF'
This is test file 2
_ATEOF

$at_traceoff
echo "t_netsync_unrelated.at:38: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile2"
echo t_netsync_unrelated.at:38 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add 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_netsync_unrelated.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_unrelated.at:39: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_netsync_unrelated.at:39 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_unrelated.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


UNRELATED=`cat MT/revision`

$at_traceoff
echo "t_netsync_unrelated.at:42: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch merge"
echo t_netsync_unrelated.at:42 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --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_netsync_unrelated.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_netsync_unrelated.at:43: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update"
echo t_netsync_unrelated.at:43 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_netsync_unrelated.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

MERGE=`cat MT/revision`




if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi

$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --rcfile=netsync.lua serve localhost:5555 testbranch &
sleep 4



$at_traceoff
echo "t_netsync_unrelated.at:46: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost:5555 testbranch"
echo t_netsync_unrelated.at:46 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost: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_unrelated.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





if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill " $a);}'
  # MinGW has no killall.  The weird a=1 thing is to avoid autotest treating  as its own parameter
else
  killall monotone 2>/dev/null
fi

sleep 1

if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi





$at_traceoff
echo "t_netsync_unrelated.at:48: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR agraph"
echo t_netsync_unrelated.at:48 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR agraph ) >$at_stdout 2>$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_netsync_unrelated.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_unrelated.at:48: mv stdout expout"
echo t_netsync_unrelated.at:48 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_unrelated.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_unrelated.at:48: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db agraph"
echo t_netsync_unrelated.at:48 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db agraph ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync_unrelated.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_unrelated.at:49: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls certs \$BASE"
echo t_netsync_unrelated.at:49 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR ls certs $BASE ) >$at_stdout 2>$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_netsync_unrelated.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_unrelated.at:49: mv stdout expout"
echo t_netsync_unrelated.at:49 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_unrelated.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_unrelated.at:49: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls certs \$BASE"
echo t_netsync_unrelated.at:49 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR ls certs $BASE ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync_unrelated.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_unrelated.at:50: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls certs \$UNRELATED"
echo t_netsync_unrelated.at:50 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR ls certs $UNRELATED ) >$at_stdout 2>$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_netsync_unrelated.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_unrelated.at:50: mv stdout expout"
echo t_netsync_unrelated.at:50 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_unrelated.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_unrelated.at:50: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls certs \$UNRELATED"
echo t_netsync_unrelated.at:50 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR ls certs $UNRELATED ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync_unrelated.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_unrelated.at:51: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls certs \$MERGE"
echo t_netsync_unrelated.at:51 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR ls certs $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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync_unrelated.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_netsync_unrelated.at:51: mv stdout expout"
echo t_netsync_unrelated.at:51 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_unrelated.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_netsync_unrelated.at:51: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls certs \$MERGE"
echo t_netsync_unrelated.at:51 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR ls certs $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
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync_unrelated.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`
    ;;

  33 ) # 33. t_disapprove.at:3: disapproving of a revision
    at_setup_line='t_disapprove.at:3'
    at_desc='disapproving of a revision'
    $at_quiet $ECHO_N " 33: disapproving of a revision                   $ECHO_C"
    at_xfail=no
    (
      echo "33. t_disapprove.at:3: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_disapprove.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_disapprove.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_disapprove.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_disapprove.at:11 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_disapprove.at:12 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_R_SHA=`cat MT/revision`
ROOT_F_SHA=`monotone --norc identify testfile`

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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message \"left good version\""
echo t_disapprove.at:22 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message "left good version" ) >$at_stdout 2>$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_R_SHA=`cat MT/revision`
LEFT_GOOD_F_SHA=`monotone --norc identify testfile`
$at_traceoff
echo "t_disapprove.at:25: test \$LEFT_GOOD_R_SHA != \$ROOT_R_SHA"
echo t_disapprove.at:25 >$at_check_line_file
( $at_traceon; test $LEFT_GOOD_R_SHA != $ROOT_R_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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message \"left bad version\""
echo t_disapprove.at:35 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message "left bad version" ) >$at_stdout 2>$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_R_SHA=`cat MT/revision`
LEFT_BAD_F_SHA=`monotone --norc identify testfile`
$at_traceoff
echo "t_disapprove.at:38: test \$LEFT_BAD_R_SHA != \$LEFT_GOOD_R_SHA"
echo t_disapprove.at:38 >$at_check_line_file
( $at_traceon; test $LEFT_BAD_R_SHA != $LEFT_GOOD_R_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 -rf MT.old"
echo t_disapprove.at:41 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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: mv  MT MT.old"
echo t_disapprove.at:41 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$ROOT_R_SHA ."
echo t_disapprove.at:41 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $ROOT_R_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

$at_traceoff
echo "t_disapprove.at:41: mv MT.old/options MT"
echo t_disapprove.at:41 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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

PROBE_R_SHA=`cat MT/revision`
PROBE_F_SHA=`monotone --norc identify testfile`
$at_traceoff
echo "t_disapprove.at:41: test \$PROBE_R_SHA = \$ROOT_R_SHA"
echo t_disapprove.at:41 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $ROOT_R_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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR disapprove \$LEFT_BAD_R_SHA"
echo t_disapprove.at:50 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR disapprove $LEFT_BAD_R_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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update"
echo t_disapprove.at:51 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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`
    ;;

  34 ) # 34. 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 " 34: creating a good and bad test result          $ECHO_C"
    at_xfail=no
    (
      echo "34. t_testresult.at:3: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_testresult.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_testresult.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_testresult.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_testresult.at:11 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message=blah-blah"
echo t_testresult.at:12 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message=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_R_SHA=`cat MT/revision`
ROOT_F_SHA=`monotone --norc identify testfile`

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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message=blah-blah"
echo t_testresult.at:22 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message=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_R_SHA=`cat MT/revision`
LEFT_GOOD_F_SHA=`monotone --norc identify testfile`
$at_traceoff
echo "t_testresult.at:25: test \$LEFT_GOOD_R_SHA != \$ROOT_R_SHA"
echo t_testresult.at:25 >$at_check_line_file
( $at_traceon; test $LEFT_GOOD_R_SHA != $ROOT_R_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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message=blah-blah"
echo t_testresult.at:35 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message=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_R_SHA=`cat MT/revision`
LEFT_BAD_F_SHA=`monotone --norc identify testfile`
$at_traceoff
echo "t_testresult.at:38: test \$LEFT_BAD_R_SHA != \$LEFT_GOOD_R_SHA"
echo t_testresult.at:38 >$at_check_line_file
( $at_traceon; test $LEFT_BAD_R_SHA != $LEFT_GOOD_R_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 -rf MT.old"
echo t_testresult.at:41 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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: mv  MT MT.old"
echo t_testresult.at:41 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$ROOT_R_SHA ."
echo t_testresult.at:41 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $ROOT_R_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

$at_traceoff
echo "t_testresult.at:41: mv MT.old/options MT"
echo t_testresult.at:41 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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

PROBE_R_SHA=`cat MT/revision`
PROBE_F_SHA=`monotone --norc identify testfile`
$at_traceoff
echo "t_testresult.at:41: test \$PROBE_R_SHA = \$ROOT_R_SHA"
echo t_testresult.at:41 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $ROOT_R_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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR testresult \$ROOT_R_SHA 1"
echo t_testresult.at:50 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR testresult $ROOT_R_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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR testresult \$LEFT_GOOD_R_SHA 1"
echo t_testresult.at:51 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR testresult $LEFT_GOOD_R_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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR testresult \$LEFT_BAD_R_SHA 0"
echo t_testresult.at:52 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR testresult $LEFT_BAD_R_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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update"
echo t_testresult.at:53 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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`
    ;;

  35 ) # 35. 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 " 35: importing a CVS file with one version        $ECHO_C"
    at_xfail=no
    (
      echo "35. t_singlecvs.at:3: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_singlecvs.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_singlecvs.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_singlecvs.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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=`monotone --norc identify importme.0`

# 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch cvs_import \$CVSROOT/testdir"
echo t_singlecvs.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR cat file \$TSHA0"
echo t_singlecvs.at:32 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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`
    ;;

  36 ) # 36. 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 " 36: list missing files                           $ECHO_C"
    at_xfail=no
    (
      echo "36. t_ls_missing.at:3: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_ls_missing.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_ls_missing.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_ls_missing.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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


cat >missingfoo <<'_ATEOF'
foo
_ATEOF


cat >missingbar <<'_ATEOF'
bar
_ATEOF


$at_traceoff
echo "t_ls_missing.at:19: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls missing"
echo t_ls_missing.at:19 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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_ls_missing.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add foo bar"
echo t_ls_missing.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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_ls_missing.at:22: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls missing"
echo t_ls_missing.at:22 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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:24: rm foo"
echo t_ls_missing.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_ls_missing.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_ls_missing.at:25: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls missing"
echo t_ls_missing.at:25 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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 stdout:; tee stdout <$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:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_ls_missing.at:26 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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:27: cmp stdout missingfoo"
echo t_ls_missing.at:27 >$at_check_line_file
( $at_traceon; cmp stdout missingfoo ) >$at_stdout 2>$at_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_ls_missing.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_ls_missing.at:29: touch foo"
echo t_ls_missing.at:29 >$at_check_line_file
( $at_traceon; touch 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: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_ls_missing.at:30: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR drop foo"
echo t_ls_missing.at:30 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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:31: rm foo"
echo t_ls_missing.at:31 >$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: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_ls_missing.at:32: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls missing"
echo t_ls_missing.at:32 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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:34: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message='committed'"
echo t_ls_missing.at:34 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message='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: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_ls_missing.at:35: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls missing"
echo t_ls_missing.at:35 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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_ls_missing.at:37: rm bar"
echo t_ls_missing.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_ls_missing.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_ls_missing.at:38: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls missing"
echo t_ls_missing.at:38 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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 stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_ls_missing.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_ls_missing.at:39:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_ls_missing.at:39 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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: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_ls_missing.at:40: cmp stdout missingbar"
echo t_ls_missing.at:40 >$at_check_line_file
( $at_traceon; cmp stdout missingbar ) >$at_stdout 2>$at_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_ls_missing.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_ls_missing.at:42: touch bar"
echo t_ls_missing.at:42 >$at_check_line_file
( $at_traceon; touch 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: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_ls_missing.at:43: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR drop bar"
echo t_ls_missing.at:43 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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_ls_missing.at:44: rm bar"
echo t_ls_missing.at:44 >$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: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_ls_missing.at:45: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls missing"
echo t_ls_missing.at:45 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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`
    ;;

  37 ) # 37. t_attributes.at:3: attr set/get commands
    at_setup_line='t_attributes.at:3'
    at_desc='attr set/get commands'
    $at_quiet $ECHO_N " 37: attr set/get commands                        $ECHO_C"
    at_xfail=no
    (
      echo "37. t_attributes.at:3: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_attributes.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_attributes.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_attributes.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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'
file "foo"
 test_attr "true"

 file "a"
 test_attr "1"
_ATEOF


$at_traceoff
echo "t_attributes.at:20: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add foo"
echo t_attributes.at:20 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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_attributes.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add .mt-attrs"
echo t_attributes.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: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_attributes.at:22: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message=blah-blah"
echo t_attributes.at:22 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message=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: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

CO_R_SHA1=`cat MT/revision`

cat >.mt-attrs <<'_ATEOF'

file "a"
test_attr "2"
_ATEOF

$at_traceoff
echo "t_attributes.at:29: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message=blah-blah"
echo t_attributes.at:29 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message=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: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

UPDATE_R_SHA1=`cat MT/revision`

# Check checkouts.
$at_traceoff
echo "t_attributes.at:33: rm -rf co-dir/MT"
echo t_attributes.at:33 >$at_check_line_file
( $at_traceon; rm -rf co-dir/MT ) >$at_stdout 2>$at_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: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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$CO_R_SHA1 co-dir"
echo t_attributes.at:34 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $CO_R_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: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_attributes.at:35: grep \"test_attr:foo:true\" stdout"
echo t_attributes.at:35 >$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: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_attributes.at:36: grep \"test_attr:a:1\" stdout"
echo t_attributes.at:36 >$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: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


# Check updates.
$at_traceoff
echo "t_attributes.at:39: rm -rf co-dir/MT"
echo t_attributes.at:39 >$at_check_line_file
( $at_traceon; rm -rf co-dir/MT ) >$at_stdout 2>$at_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: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_attributes.at:40: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$UPDATE_R_SHA1 co-dir"
echo t_attributes.at:40 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $UPDATE_R_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: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_attributes.at:41: grep \"test_attr:foo\" stdout"
echo t_attributes.at:41 >$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: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_attributes.at:42: grep \"test_attr:a:2\" stdout"
echo t_attributes.at:42 >$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: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


# check that files must exist to have attributes set
$at_traceoff
echo "t_attributes.at:45: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR attr set missing execute"
echo t_attributes.at:45 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR attr set missing execute ) >$at_stdout 2>$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_attributes.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  38 ) # 38. 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 " 38: single character filename support            $ECHO_C"
    at_xfail=no
    (
      echo "38. t_single_char_filenames.at:6: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_single_char_filenames.at:8 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_single_char_filenames.at:8 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_single_char_filenames.at:8 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add a"
echo t_single_char_filenames.at:13 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message=blah-blah"
echo t_single_char_filenames.at:14 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message=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_R_SHA1=`cat MT/revision`

$at_traceoff
echo "t_single_char_filenames.at:17: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename a b"
echo t_single_char_filenames.at:17 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message=blah-blah"
echo t_single_char_filenames.at:19 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message=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_R_SHA1=`cat MT/revision`

$at_traceoff
echo "t_single_char_filenames.at:22: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR drop b"
echo t_single_char_filenames.at:22 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message=blah-blah"
echo t_single_char_filenames.at:24 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message=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_R_SHA1=`cat MT/revision`

$at_traceoff
echo "t_single_char_filenames.at:27: rm -rf MT"
echo t_single_char_filenames.at:27 >$at_check_line_file
( $at_traceon; rm -rf MT ) >$at_stdout 2>$at_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: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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$A_R_SHA1 a-dir"
echo t_single_char_filenames.at:28 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $A_R_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: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/a"
echo t_single_char_filenames.at:29 >$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: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:30: test ! -e a-dir/b"
echo t_single_char_filenames.at:30 >$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: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_single_char_filenames.at:32: rm -rf MT"
echo t_single_char_filenames.at:32 >$at_check_line_file
( $at_traceon; rm -rf MT ) >$at_stdout 2>$at_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: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: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$B_R_SHA1 b-dir"
echo t_single_char_filenames.at:33 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $B_R_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: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:34: test ! -e b-dir/a"
echo t_single_char_filenames.at:34 >$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: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_single_char_filenames.at:35: test -e b-dir/b"
echo t_single_char_filenames.at:35 >$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: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:37: rm -rf MT"
echo t_single_char_filenames.at:37 >$at_check_line_file
( $at_traceon; rm -rf MT ) >$at_stdout 2>$at_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: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_single_char_filenames.at:38: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$NULL_R_SHA1 null-dir"
echo t_single_char_filenames.at:38 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $NULL_R_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: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_single_char_filenames.at:39: test ! -e null-dir/a"
echo t_single_char_filenames.at:39 >$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: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_single_char_filenames.at:40: test ! -e null-dir/b"
echo t_single_char_filenames.at:40 >$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: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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  39 ) # 39. t_restrictions.at:3: manifest restrictions
    at_setup_line='t_restrictions.at:3'
    at_desc='manifest restrictions'
    $at_quiet $ECHO_N " 39: manifest restrictions                        $ECHO_C"
    at_xfail=no
    (
      echo "39. t_restrictions.at:3: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_restrictions.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_restrictions.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_restrictions.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_restrictions.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_restrictions.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_restrictions.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_restrictions.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_restrictions.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_restrictions.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_restrictions.at:5: rm test_keys"
echo t_restrictions.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_restrictions.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 >ignored.lua <<'_ATEOF'

function ignore_file(name)
   if (string.find(name, "%.o$")) then return true end
   return false;
end
_ATEOF


$at_traceoff
echo "t_restrictions.at:14: mkdir work"
echo t_restrictions.at:14 >$at_check_line_file
( $at_traceon; mkdir 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_restrictions.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


cat >work/foo.o <<'_ATEOF'
version 1 of foo.o
_ATEOF


cat >work/fileX <<'_ATEOF'
version 1 of fileX which will be renamed to work/file1
_ATEOF


cat >work/file2 <<'_ATEOF'
version 1 of file2
_ATEOF


cat >work/file3 <<'_ATEOF'
version 1 of file3
_ATEOF


cat >work/file4 <<'_ATEOF'
version 1 of file4
_ATEOF


$at_traceoff
echo "t_restrictions.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add work/fileX"
echo t_restrictions.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add work/fileX ) >$at_stdout 2>$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_restrictions.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_restrictions.at:32: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add work/file2"
echo t_restrictions.at:32 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add work/file2 ) >$at_stdout 2>$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_restrictions.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_restrictions.at:33: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add work/file3"
echo t_restrictions.at:33 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add work/file3 ) >$at_stdout 2>$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_restrictions.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


# test restriction of unknown, missing, ignored files

$at_traceoff
echo "t_restrictions.at:37: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls unknown"
echo t_restrictions.at:37 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR ls unknown ) >$at_stdout 2>$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_restrictions.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_restrictions.at:38: grep work/file4 stdout"
echo t_restrictions.at:38 >$at_check_line_file
( $at_traceon; grep work/file4 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_restrictions.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_restrictions.at:40: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls unknown work"
echo t_restrictions.at:40 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR ls unknown 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_restrictions.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_restrictions.at:41: grep work/file4 stdout"
echo t_restrictions.at:41 >$at_check_line_file
( $at_traceon; grep work/file4 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_restrictions.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_restrictions.at:43: mv work/file2 work/filex2"
echo t_restrictions.at:43 >$at_check_line_file
( $at_traceon; mv work/file2 work/filex2 ) >$at_stdout 2>$at_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_restrictions.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_restrictions.at:45: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls missing"
echo t_restrictions.at:45 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR ls missing ) >$at_stdout 2>$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_restrictions.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_restrictions.at:46: grep work/file2 stdout"
echo t_restrictions.at:46 >$at_check_line_file
( $at_traceon; grep work/file2 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_restrictions.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_restrictions.at:48: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls missing work/file2"
echo t_restrictions.at:48 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR ls missing work/file2 ) >$at_stdout 2>$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_restrictions.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_restrictions.at:49: grep work/file2 stdout"
echo t_restrictions.at:49 >$at_check_line_file
( $at_traceon; grep work/file2 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_restrictions.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_restrictions.at:51: mv work/filex2 work/file2"
echo t_restrictions.at:51 >$at_check_line_file
( $at_traceon; mv work/filex2 work/file2 ) >$at_stdout 2>$at_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_restrictions.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_restrictions.at:53: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls ignored --rcfile=ignored.lua"
echo t_restrictions.at:53 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR ls ignored --rcfile=ignored.lua ) >$at_stdout 2>$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_restrictions.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_restrictions.at:54: grep work/foo.o stdout"
echo t_restrictions.at:54 >$at_check_line_file
( $at_traceon; grep work/foo.o 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_restrictions.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_restrictions.at:56: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls ignored --rcfile=ignored.lua work"
echo t_restrictions.at:56 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR ls ignored --rcfile=ignored.lua 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_restrictions.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_restrictions.at:57: grep work/foo.o stdout"
echo t_restrictions.at:57 >$at_check_line_file
( $at_traceon; grep work/foo.o 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_restrictions.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


# initial commit

$at_traceoff
echo "t_restrictions.at:61: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message='add fileX23'"
echo t_restrictions.at:61 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message='add fileX23' ) >$at_stdout 2>$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_restrictions.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


# create moved, dropped, and changed work to test status, diff, commit

$at_traceoff
echo "t_restrictions.at:65: mv work/fileX work/file1"
echo t_restrictions.at:65 >$at_check_line_file
( $at_traceon; mv work/fileX work/file1 ) >$at_stdout 2>$at_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_restrictions.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

$at_traceoff
echo "t_restrictions.at:66: rm work/file2"
echo t_restrictions.at:66 >$at_check_line_file
( $at_traceon; rm work/file2 ) >$at_stdout 2>$at_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_restrictions.at:66: 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 >work/file3 <<'_ATEOF'
version 2 of file3 with some changes
_ATEOF


$at_traceoff
echo "t_restrictions.at:71: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename work/fileX work/file1"
echo t_restrictions.at:71 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename work/fileX work/file1 ) >$at_stdout 2>$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_restrictions.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_restrictions.at:72: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR drop work/file2"
echo t_restrictions.at:72 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR drop work/file2 ) >$at_stdout 2>$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_restrictions.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_restrictions.at:73: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add work/file4"
echo t_restrictions.at:73 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add work/file4 ) >$at_stdout 2>$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_restrictions.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


# moved fileX to file1
# dropped file2
# changed file3
# added file4

# test for files included/excluded in various outputs





# status

$at_traceoff
echo "t_restrictions.at:104: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_restrictions.at:104 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR status ) >$at_stdout 2>$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_restrictions.at:104: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_restrictions.at:105:
files=\"\"
for i in X 1 2 3 4
do
        grep work/file\$i stdout || files=\"\$files \$i\"
done
echo \"missed: \$files\"
test -z \"\$files\"
"
echo t_restrictions.at:105 >$at_check_line_file
( $at_traceon;
files=""
for i in X 1 2 3 4
do
        grep work/file$i stdout || files="$files $i"
done
echo "missed: $files"
test -z "$files"
 ) >$at_stdout 2>$at_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_restrictions.at:105: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# include both source and target of rename

$at_traceoff
echo "t_restrictions.at:109: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status work/fileX work/file1"
echo t_restrictions.at:109 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR status work/fileX work/file1 ) >$at_stdout 2>$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_restrictions.at:109: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_restrictions.at:110:
files=\"\"
for i in X 1
do
        grep work/file\$i stdout || files=\"\$files \$i\"
done
echo \"missed: \$files\"
test -z \"\$files\"
"
echo t_restrictions.at:110 >$at_check_line_file
( $at_traceon;
files=""
for i in X 1
do
        grep work/file$i stdout || files="$files $i"
done
echo "missed: $files"
test -z "$files"
 ) >$at_stdout 2>$at_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_restrictions.at:110: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_restrictions.at:111:
files=\"\"
for i in 2 3 4
do
        grep work/file\$i stdout && files=\"\$files \$i\"
done
echo \"seen: \$files\"
test -z \"\$files\"
"
echo t_restrictions.at:111 >$at_check_line_file
( $at_traceon;
files=""
for i in 2 3 4
do
        grep work/file$i stdout && files="$files $i"
done
echo "seen: $files"
test -z "$files"
 ) >$at_stdout 2>$at_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_restrictions.at:111: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# include drop

$at_traceoff
echo "t_restrictions.at:115: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status work/file2"
echo t_restrictions.at:115 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR status work/file2 ) >$at_stdout 2>$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_restrictions.at:115: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_restrictions.at:116:
files=\"\"
for i in 2
do
        grep work/file\$i stdout || files=\"\$files \$i\"
done
echo \"missed: \$files\"
test -z \"\$files\"
"
echo t_restrictions.at:116 >$at_check_line_file
( $at_traceon;
files=""
for i in 2
do
        grep work/file$i stdout || files="$files $i"
done
echo "missed: $files"
test -z "$files"
 ) >$at_stdout 2>$at_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_restrictions.at:116: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_restrictions.at:117:
files=\"\"
for i in X 1 3 4
do
        grep work/file\$i stdout && files=\"\$files \$i\"
done
echo \"seen: \$files\"
test -z \"\$files\"
"
echo t_restrictions.at:117 >$at_check_line_file
( $at_traceon;
files=""
for i in X 1 3 4
do
        grep work/file$i stdout && files="$files $i"
done
echo "seen: $files"
test -z "$files"
 ) >$at_stdout 2>$at_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_restrictions.at:117: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# include delta

$at_traceoff
echo "t_restrictions.at:121: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status work/file3"
echo t_restrictions.at:121 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR status work/file3 ) >$at_stdout 2>$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_restrictions.at:121: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_restrictions.at:122:
files=\"\"
for i in 3
do
        grep work/file\$i stdout || files=\"\$files \$i\"
done
echo \"missed: \$files\"
test -z \"\$files\"
"
echo t_restrictions.at:122 >$at_check_line_file
( $at_traceon;
files=""
for i in 3
do
        grep work/file$i stdout || files="$files $i"
done
echo "missed: $files"
test -z "$files"
 ) >$at_stdout 2>$at_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_restrictions.at:122: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_restrictions.at:123:
files=\"\"
for i in X 1 2 4
do
        grep work/file\$i stdout && files=\"\$files \$i\"
done
echo \"seen: \$files\"
test -z \"\$files\"
"
echo t_restrictions.at:123 >$at_check_line_file
( $at_traceon;
files=""
for i in X 1 2 4
do
        grep work/file$i stdout && files="$files $i"
done
echo "seen: $files"
test -z "$files"
 ) >$at_stdout 2>$at_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_restrictions.at:123: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# include add

$at_traceoff
echo "t_restrictions.at:127: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status work/file4"
echo t_restrictions.at:127 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR status work/file4 ) >$at_stdout 2>$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_restrictions.at:127: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_restrictions.at:128:
files=\"\"
for i in 4
do
        grep work/file\$i stdout || files=\"\$files \$i\"
done
echo \"missed: \$files\"
test -z \"\$files\"
"
echo t_restrictions.at:128 >$at_check_line_file
( $at_traceon;
files=""
for i in 4
do
        grep work/file$i stdout || files="$files $i"
done
echo "missed: $files"
test -z "$files"
 ) >$at_stdout 2>$at_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_restrictions.at:128: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_restrictions.at:129:
files=\"\"
for i in X 1 2 3
do
        grep work/file\$i stdout && files=\"\$files \$i\"
done
echo \"seen: \$files\"
test -z \"\$files\"
"
echo t_restrictions.at:129 >$at_check_line_file
( $at_traceon;
files=""
for i in X 1 2 3
do
        grep work/file$i stdout && files="$files $i"
done
echo "seen: $files"
test -z "$files"
 ) >$at_stdout 2>$at_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_restrictions.at:129: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# diff

$at_traceoff
echo "t_restrictions.at:133: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR diff"
echo t_restrictions.at:133 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR diff ) >$at_stdout 2>$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_restrictions.at:133: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_restrictions.at:134:
files=\"\"
for i in X 1 2 3 4
do
        grep work/file\$i stdout || files=\"\$files \$i\"
done
echo \"missed: \$files\"
test -z \"\$files\"
"
echo t_restrictions.at:134 >$at_check_line_file
( $at_traceon;
files=""
for i in X 1 2 3 4
do
        grep work/file$i stdout || files="$files $i"
done
echo "missed: $files"
test -z "$files"
 ) >$at_stdout 2>$at_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_restrictions.at:134: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# include both source and target of rename

$at_traceoff
echo "t_restrictions.at:138: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR diff work/fileX work/file1"
echo t_restrictions.at:138 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR diff work/fileX work/file1 ) >$at_stdout 2>$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_restrictions.at:138: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_restrictions.at:139:
files=\"\"
for i in X 1
do
        grep work/file\$i stdout || files=\"\$files \$i\"
done
echo \"missed: \$files\"
test -z \"\$files\"
"
echo t_restrictions.at:139 >$at_check_line_file
( $at_traceon;
files=""
for i in X 1
do
        grep work/file$i stdout || files="$files $i"
done
echo "missed: $files"
test -z "$files"
 ) >$at_stdout 2>$at_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_restrictions.at:139: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_restrictions.at:140:
files=\"\"
for i in 2 3 4
do
        grep work/file\$i stdout && files=\"\$files \$i\"
done
echo \"seen: \$files\"
test -z \"\$files\"
"
echo t_restrictions.at:140 >$at_check_line_file
( $at_traceon;
files=""
for i in 2 3 4
do
        grep work/file$i stdout && files="$files $i"
done
echo "seen: $files"
test -z "$files"
 ) >$at_stdout 2>$at_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_restrictions.at:140: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# include drop

$at_traceoff
echo "t_restrictions.at:144: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR diff work/file2"
echo t_restrictions.at:144 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR diff work/file2 ) >$at_stdout 2>$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_restrictions.at:144: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_restrictions.at:145:
files=\"\"
for i in 2
do
        grep work/file\$i stdout || files=\"\$files \$i\"
done
echo \"missed: \$files\"
test -z \"\$files\"
"
echo t_restrictions.at:145 >$at_check_line_file
( $at_traceon;
files=""
for i in 2
do
        grep work/file$i stdout || files="$files $i"
done
echo "missed: $files"
test -z "$files"
 ) >$at_stdout 2>$at_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_restrictions.at:145: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_restrictions.at:146:
files=\"\"
for i in X 1 3 4
do
        grep work/file\$i stdout && files=\"\$files \$i\"
done
echo \"seen: \$files\"
test -z \"\$files\"
"
echo t_restrictions.at:146 >$at_check_line_file
( $at_traceon;
files=""
for i in X 1 3 4
do
        grep work/file$i stdout && files="$files $i"
done
echo "seen: $files"
test -z "$files"
 ) >$at_stdout 2>$at_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_restrictions.at:146: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# include delta

$at_traceoff
echo "t_restrictions.at:150: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR diff work/file3"
echo t_restrictions.at:150 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR diff work/file3 ) >$at_stdout 2>$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_restrictions.at:150: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_restrictions.at:151:
files=\"\"
for i in 3
do
        grep work/file\$i stdout || files=\"\$files \$i\"
done
echo \"missed: \$files\"
test -z \"\$files\"
"
echo t_restrictions.at:151 >$at_check_line_file
( $at_traceon;
files=""
for i in 3
do
        grep work/file$i stdout || files="$files $i"
done
echo "missed: $files"
test -z "$files"
 ) >$at_stdout 2>$at_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_restrictions.at:151: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_restrictions.at:152:
files=\"\"
for i in X 1 2 4
do
        grep work/file\$i stdout && files=\"\$files \$i\"
done
echo \"seen: \$files\"
test -z \"\$files\"
"
echo t_restrictions.at:152 >$at_check_line_file
( $at_traceon;
files=""
for i in X 1 2 4
do
        grep work/file$i stdout && files="$files $i"
done
echo "seen: $files"
test -z "$files"
 ) >$at_stdout 2>$at_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_restrictions.at:152: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# include add

$at_traceoff
echo "t_restrictions.at:156: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR diff work/file4"
echo t_restrictions.at:156 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR diff work/file4 ) >$at_stdout 2>$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_restrictions.at:156: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_restrictions.at:157:
files=\"\"
for i in 4
do
        grep work/file\$i stdout || files=\"\$files \$i\"
done
echo \"missed: \$files\"
test -z \"\$files\"
"
echo t_restrictions.at:157 >$at_check_line_file
( $at_traceon;
files=""
for i in 4
do
        grep work/file$i stdout || files="$files $i"
done
echo "missed: $files"
test -z "$files"
 ) >$at_stdout 2>$at_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_restrictions.at:157: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_restrictions.at:158:
files=\"\"
for i in X 1 2 3
do
        grep work/file\$i stdout && files=\"\$files \$i\"
done
echo \"seen: \$files\"
test -z \"\$files\"
"
echo t_restrictions.at:158 >$at_check_line_file
( $at_traceon;
files=""
for i in X 1 2 3
do
        grep work/file$i stdout && files="$files $i"
done
echo "seen: $files"
test -z "$files"
 ) >$at_stdout 2>$at_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_restrictions.at:158: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# commit

$at_traceoff
echo "t_restrictions.at:162: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_restrictions.at:162 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR status ) >$at_stdout 2>$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_restrictions.at:162: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_restrictions.at:163:
files=\"\"
for i in X 1 2 3 4
do
        grep work/file\$i stdout || files=\"\$files \$i\"
done
echo \"missed: \$files\"
test -z \"\$files\"
"
echo t_restrictions.at:163 >$at_check_line_file
( $at_traceon;
files=""
for i in X 1 2 3 4
do
        grep work/file$i stdout || files="$files $i"
done
echo "missed: $files"
test -z "$files"
 ) >$at_stdout 2>$at_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_restrictions.at:163: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# include rename source and target

$at_traceoff
echo "t_restrictions.at:167: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message='move fileX to file1' work/fileX work/file1"
echo t_restrictions.at:167 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message='move fileX to file1' work/fileX work/file1 ) >$at_stdout 2>$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_restrictions.at:167: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_restrictions.at:169: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_restrictions.at:169 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR status ) >$at_stdout 2>$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_restrictions.at:169: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_restrictions.at:170:
files=\"\"
for i in 2 3 4
do
        grep work/file\$i stdout || files=\"\$files \$i\"
done
echo \"missed: \$files\"
test -z \"\$files\"
"
echo t_restrictions.at:170 >$at_check_line_file
( $at_traceon;
files=""
for i in 2 3 4
do
        grep work/file$i stdout || files="$files $i"
done
echo "missed: $files"
test -z "$files"
 ) >$at_stdout 2>$at_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_restrictions.at:170: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_restrictions.at:171:
files=\"\"
for i in X 1
do
        grep work/file\$i stdout && files=\"\$files \$i\"
done
echo \"seen: \$files\"
test -z \"\$files\"
"
echo t_restrictions.at:171 >$at_check_line_file
( $at_traceon;
files=""
for i in X 1
do
        grep work/file$i stdout && files="$files $i"
done
echo "seen: $files"
test -z "$files"
 ) >$at_stdout 2>$at_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_restrictions.at:171: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# include drop

$at_traceoff
echo "t_restrictions.at:175: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message='drop file2' work/file2"
echo t_restrictions.at:175 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message='drop file2' work/file2 ) >$at_stdout 2>$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_restrictions.at:175: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_restrictions.at:177: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_restrictions.at:177 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR status ) >$at_stdout 2>$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_restrictions.at:177: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_restrictions.at:178:
files=\"\"
for i in 3 4
do
        grep work/file\$i stdout || files=\"\$files \$i\"
done
echo \"missed: \$files\"
test -z \"\$files\"
"
echo t_restrictions.at:178 >$at_check_line_file
( $at_traceon;
files=""
for i in 3 4
do
        grep work/file$i stdout || files="$files $i"
done
echo "missed: $files"
test -z "$files"
 ) >$at_stdout 2>$at_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_restrictions.at:178: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_restrictions.at:179:
files=\"\"
for i in X 1 2
do
        grep work/file\$i stdout && files=\"\$files \$i\"
done
echo \"seen: \$files\"
test -z \"\$files\"
"
echo t_restrictions.at:179 >$at_check_line_file
( $at_traceon;
files=""
for i in X 1 2
do
        grep work/file$i stdout && files="$files $i"
done
echo "seen: $files"
test -z "$files"
 ) >$at_stdout 2>$at_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_restrictions.at:179: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# include delta

$at_traceoff
echo "t_restrictions.at:183: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message='change file3' work/file3"
echo t_restrictions.at:183 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message='change file3' work/file3 ) >$at_stdout 2>$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_restrictions.at:183: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_restrictions.at:185: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_restrictions.at:185 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR status ) >$at_stdout 2>$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_restrictions.at:185: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_restrictions.at:186:
files=\"\"
for i in 4
do
        grep work/file\$i stdout || files=\"\$files \$i\"
done
echo \"missed: \$files\"
test -z \"\$files\"
"
echo t_restrictions.at:186 >$at_check_line_file
( $at_traceon;
files=""
for i in 4
do
        grep work/file$i stdout || files="$files $i"
done
echo "missed: $files"
test -z "$files"
 ) >$at_stdout 2>$at_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_restrictions.at:186: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_restrictions.at:187:
files=\"\"
for i in X 1 2 3
do
        grep work/file\$i stdout && files=\"\$files \$i\"
done
echo \"seen: \$files\"
test -z \"\$files\"
"
echo t_restrictions.at:187 >$at_check_line_file
( $at_traceon;
files=""
for i in X 1 2 3
do
        grep work/file$i stdout && files="$files $i"
done
echo "seen: $files"
test -z "$files"
 ) >$at_stdout 2>$at_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_restrictions.at:187: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# include add

$at_traceoff
echo "t_restrictions.at:191: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message='add file4' work/file4"
echo t_restrictions.at:191 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message='add file4' work/file4 ) >$at_stdout 2>$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_restrictions.at:191: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_restrictions.at:193: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_restrictions.at:193 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR status ) >$at_stdout 2>$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_restrictions.at:193: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_restrictions.at:194:
files=\"\"
for i in X 1 2 3 4
do
        grep work/file\$i stdout && files=\"\$files \$i\"
done
echo \"seen: \$files\"
test -z \"\$files\"
"
echo t_restrictions.at:194 >$at_check_line_file
( $at_traceon;
files=""
for i in X 1 2 3 4
do
        grep work/file$i stdout && files="$files $i"
done
echo "seen: $files"
test -z "$files"
 ) >$at_stdout 2>$at_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_restrictions.at:194: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# setup for excluded commits

# moved file1 to fileY
# dropped file2
# changed file3
# added file4

# moved file3 to file
# dropped file1
# changed file4
# added file5

# exclude rename source
# exclude rename target
# exclude drop
# exclude delta
# exclude add

# test bad removal of restricted files
# (set/iterator/erase bug found by matt@ucc.asn.au)

for i in one two three four five six seven eight nine ten eleven twelve
do
  $at_traceoff
echo "t_restrictions.at:219: echo \"file \$i\""
echo t_restrictions.at:219 >$at_check_line_file
( $at_traceon; echo "file $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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_restrictions.at:219: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

  $at_traceoff
echo "t_restrictions.at:220: mv stdout file.\$i"
echo t_restrictions.at:220 >$at_check_line_file
( $at_traceon; mv stdout file.$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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_restrictions.at:220: 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
echo "t_restrictions.at:223: ls"
echo t_restrictions.at:223 >$at_check_line_file
( $at_traceon; ls ) >$at_stdout 2>$at_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_restrictions.at:223: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_restrictions.at:225: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add file.*"
echo t_restrictions.at:225 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add 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_restrictions.at:225: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_restrictions.at:226: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message='add 12 files'"
echo t_restrictions.at:226 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message='add 12 files' ) >$at_stdout 2>$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_restrictions.at:226: 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 one three four five six seven eight nine ten eleven
do
  $at_traceoff
echo "t_restrictions.at:230: echo \"new file \$i\""
echo t_restrictions.at:230 >$at_check_line_file
( $at_traceon; echo "new file $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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_restrictions.at:230: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

  $at_traceoff
echo "t_restrictions.at:231: mv stdout file.\$i"
echo t_restrictions.at:231 >$at_check_line_file
( $at_traceon; mv stdout file.$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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_restrictions.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

done

$at_traceoff
echo "t_restrictions.at:234: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR diff file.four file.ten"
echo t_restrictions.at:234 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR diff file.four file.ten ) >$at_stdout 2>$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_restrictions.at:234: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_restrictions.at:236: grep \"file.four\" stdout"
echo t_restrictions.at:236 >$at_check_line_file
( $at_traceon; grep "file.four" 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_restrictions.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_restrictions.at:237: grep \"file.ten\"  stdout"
echo t_restrictions.at:237 >$at_check_line_file
( $at_traceon; grep "file.ten"  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_restrictions.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


# none of these should show up in the diff
# only four and ten are included

for i in one two three five six seven eight nine eleven twelve
do
        $at_traceoff
echo "t_restrictions.at:244: grep \"file.\$i\"  stdout"
echo t_restrictions.at:244 >$at_check_line_file
( $at_traceon; grep "file.$i"  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_restrictions.at:244: exit code was $at_status, expected 1"
      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`
    ;;

  40 ) # 40. t_subdirs.at:3: subdirectory restrictions
    at_setup_line='t_subdirs.at:3'
    at_desc='subdirectory restrictions'
    $at_quiet $ECHO_N " 40: subdirectory restrictions                    $ECHO_C"
    at_xfail=no
    (
      echo "40. t_subdirs.at:3: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_subdirs.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_subdirs.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_subdirs.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_subdirs.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_subdirs.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_subdirs.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_subdirs.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_subdirs.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_subdirs.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_subdirs.at:5: rm test_keys"
echo t_subdirs.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_subdirs.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_subdirs.at:7: mkdir foo bar"
echo t_subdirs.at:7 >$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_subdirs.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.txt <<'_ATEOF'
file foo.txt in dir foo
_ATEOF

cat >bar/bar.txt <<'_ATEOF'
file bar.txt in dir bar
_ATEOF


$at_traceoff
echo "t_subdirs.at:14: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add foo"
echo t_subdirs.at:14 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_subdirs.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_subdirs.at:15: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add bar"
echo t_subdirs.at:15 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add 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_subdirs.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


# should have tests for
# add, drop, rename, revert
#       - which use prefixing
# ls unknown, ignored, missing
#       - which use add_restriction and in_restriction directly
# commit, diff, status
#       - which use add_restriction and in_restriction through
#         restrict_patch_set

$at_traceoff
echo "t_subdirs.at:26: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_subdirs.at:26 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_subdirs.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_subdirs.at:27: grep 'foo/foo' stdout"
echo t_subdirs.at:27 >$at_check_line_file
( $at_traceon; grep 'foo/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;;
   0) ;;
   *) echo "t_subdirs.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_subdirs.at:28: grep 'bar/bar' stdout"
echo t_subdirs.at:28 >$at_check_line_file
( $at_traceon; grep 'bar/bar' 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_subdirs.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


ROOT=`pwd`


cd foo
$at_traceoff
echo "t_subdirs.at:34: monotone --rcfile=\$ROOT/test_hooks.lua --nostd --norc --db=\$ROOT/test.db --key=tester@test.net status"
echo t_subdirs.at:34 >$at_check_line_file
( $at_traceon; monotone --rcfile=$ROOT/test_hooks.lua --nostd --norc --db=$ROOT/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_subdirs.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_subdirs.at:35: grep 'foo/foo' stdout"
echo t_subdirs.at:35 >$at_check_line_file
( $at_traceon; grep 'foo/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;;
   0) ;;
   *) echo "t_subdirs.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_subdirs.at:36: grep 'bar/bar' stdout"
echo t_subdirs.at:36 >$at_check_line_file
( $at_traceon; grep 'bar/bar' 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_subdirs.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_subdirs.at:38: monotone --rcfile=\$ROOT/test_hooks.lua --nostd --norc --db=\$ROOT/test.db --key=tester@test.net status ."
echo t_subdirs.at:38 >$at_check_line_file
( $at_traceon; monotone --rcfile=$ROOT/test_hooks.lua --nostd --norc --db=$ROOT/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_subdirs.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_subdirs.at:39: grep 'foo/foo' stdout"
echo t_subdirs.at:39 >$at_check_line_file
( $at_traceon; grep 'foo/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;;
   0) ;;
   *) echo "t_subdirs.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_subdirs.at:40: grep 'bar/bar' stdout"
echo t_subdirs.at:40 >$at_check_line_file
( $at_traceon; grep 'bar/bar' 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_subdirs.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_subdirs.at:42: monotone --rcfile=\$ROOT/test_hooks.lua --nostd --norc --db=\$ROOT/test.db --key=tester@test.net status .."
echo t_subdirs.at:42 >$at_check_line_file
( $at_traceon; monotone --rcfile=$ROOT/test_hooks.lua --nostd --norc --db=$ROOT/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_subdirs.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_subdirs.at:43: grep 'foo/foo' stdout"
echo t_subdirs.at:43 >$at_check_line_file
( $at_traceon; grep 'foo/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;;
   0) ;;
   *) echo "t_subdirs.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_subdirs.at:44: grep 'bar/bar' stdout"
echo t_subdirs.at:44 >$at_check_line_file
( $at_traceon; grep 'bar/bar' 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_subdirs.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

cd ..

cd bar
$at_traceoff
echo "t_subdirs.at:48: monotone --rcfile=\$ROOT/test_hooks.lua --nostd --norc --db=\$ROOT/test.db --key=tester@test.net status"
echo t_subdirs.at:48 >$at_check_line_file
( $at_traceon; monotone --rcfile=$ROOT/test_hooks.lua --nostd --norc --db=$ROOT/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_subdirs.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_subdirs.at:49: grep 'foo/foo' stdout"
echo t_subdirs.at:49 >$at_check_line_file
( $at_traceon; grep 'foo/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;;
   0) ;;
   *) echo "t_subdirs.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_subdirs.at:50: grep 'bar/bar' stdout"
echo t_subdirs.at:50 >$at_check_line_file
( $at_traceon; grep 'bar/bar' 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_subdirs.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_subdirs.at:52: monotone --rcfile=\$ROOT/test_hooks.lua --nostd --norc --db=\$ROOT/test.db --key=tester@test.net status ."
echo t_subdirs.at:52 >$at_check_line_file
( $at_traceon; monotone --rcfile=$ROOT/test_hooks.lua --nostd --norc --db=$ROOT/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_subdirs.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_subdirs.at:53: grep 'foo/foo' stdout"
echo t_subdirs.at:53 >$at_check_line_file
( $at_traceon; grep 'foo/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_subdirs.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

$at_traceoff
echo "t_subdirs.at:54: grep 'bar/bar' stdout"
echo t_subdirs.at:54 >$at_check_line_file
( $at_traceon; grep 'bar/bar' 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_subdirs.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_subdirs.at:56: monotone --rcfile=\$ROOT/test_hooks.lua --nostd --norc --db=\$ROOT/test.db --key=tester@test.net status .."
echo t_subdirs.at:56 >$at_check_line_file
( $at_traceon; monotone --rcfile=$ROOT/test_hooks.lua --nostd --norc --db=$ROOT/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_subdirs.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_subdirs.at:57: grep 'foo/foo' stdout"
echo t_subdirs.at:57 >$at_check_line_file
( $at_traceon; grep 'foo/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;;
   0) ;;
   *) echo "t_subdirs.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_subdirs.at:58: grep 'bar/bar' stdout"
echo t_subdirs.at:58 >$at_check_line_file
( $at_traceon; grep 'bar/bar' 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_subdirs.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

cd ..

# TODO: test a.c a.h a/foo.c a/foo.h from inside and outside of a

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

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




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_movepatch.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_movepatch.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_movepatch.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_movepatch.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_movepatch.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_movepatch.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_movepatch.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_movepatch.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_movepatch.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_movepatch.at:5: rm test_keys"
echo t_movepatch.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_movepatch.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_movepatch.at:13: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add foo"
echo t_movepatch.at:13 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_movepatch.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_movepatch.at:14: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message=blah-blah"
echo t_movepatch.at:14 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message=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_movepatch.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_R_SHA=`cat MT/revision`
ROOT_F_SHA=`monotone --norc identify foo`

# produce move edge
$at_traceoff
echo "t_movepatch.at:19: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename foo bar"
echo t_movepatch.at:19 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_movepatch.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_movepatch.at:20: cp foo bar"
echo t_movepatch.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_movepatch.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_movepatch.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message=blah-blah"
echo t_movepatch.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message=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_movepatch.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_movepatch.at:24: rm -rf MT.old"
echo t_movepatch.at:24 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_movepatch.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_movepatch.at:24: mv  MT MT.old"
echo t_movepatch.at:24 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_movepatch.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_movepatch.at:24: rm foo"
echo t_movepatch.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_movepatch.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_movepatch.at:24: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$ROOT_R_SHA ."
echo t_movepatch.at:24 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $ROOT_R_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_movepatch.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_movepatch.at:24: mv MT.old/options MT"
echo t_movepatch.at:24 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_movepatch.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_R_SHA=`cat MT/revision`
PROBE_F_SHA=`monotone --norc identify foo`
$at_traceoff
echo "t_movepatch.at:24: test \$PROBE_R_SHA = \$ROOT_R_SHA"
echo t_movepatch.at:24 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $ROOT_R_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_movepatch.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_movepatch.at:24: test \$PROBE_F_SHA = \$ROOT_F_SHA"
echo t_movepatch.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_movepatch.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_movepatch.at:25: rm bar"
echo t_movepatch.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_movepatch.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 delta edge on the move preimage
$at_traceoff
echo "t_movepatch.at:28: cp bleh foo"
echo t_movepatch.at:28 >$at_check_line_file
( $at_traceon; cp bleh 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_movepatch.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_movepatch.at:29: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message=blah-blah"
echo t_movepatch.at:29 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message=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_movepatch.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 delta and the rename
$at_traceoff
echo "t_movepatch.at:32: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR merge"
echo t_movepatch.at:32 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_movepatch.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_movepatch.at:33: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update"
echo t_movepatch.at:33 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_movepatch.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


# check that the delta landed on the renamed target
$at_traceoff
echo "t_movepatch.at:36: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR cat manifest"
echo t_movepatch.at:36 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_movepatch.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_movepatch.at:37: mv stdout manifest"
echo t_movepatch.at:37 >$at_check_line_file
( $at_traceon; mv stdout 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_movepatch.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_movepatch.at:38: grep bar manifest"
echo t_movepatch.at:38 >$at_check_line_file
( $at_traceon; grep bar 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_movepatch.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_movepatch.at:39: grep foo manifest"
echo t_movepatch.at:39 >$at_check_line_file
( $at_traceon; grep foo 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_movepatch.at:39: 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_movepatch.at:40: grep bleh bar"
echo t_movepatch.at:40 >$at_check_line_file
( $at_traceon; grep bleh 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_movepatch.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_movepatch.at:41: rm bar"
echo t_movepatch.at:41 >$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_movepatch.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

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




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_movedel.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_movedel.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_movedel.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_movedel.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_movedel.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_movedel.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_movedel.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_movedel.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_movedel.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_movedel.at:5: rm test_keys"
echo t_movedel.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_movedel.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 >baz <<'_ATEOF'
baz file
_ATEOF


# produce root
$at_traceoff
echo "t_movedel.at:13: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add foo"
echo t_movedel.at:13 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_movedel.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_movedel.at:14: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message=blah-blah"
echo t_movedel.at:14 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message=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_movedel.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_R_SHA=`cat MT/revision`
ROOT_F_SHA=`monotone --norc identify foo`

# produce move edge
$at_traceoff
echo "t_movedel.at:19: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add baz"
echo t_movedel.at:19 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add baz ) >$at_stdout 2>$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_movedel.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_movedel.at:20: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename foo bar"
echo t_movedel.at:20 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_movedel.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_movedel.at:21: cp foo bar"
echo t_movedel.at:21 >$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_movedel.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_movedel.at:22: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message=blah-blah"
echo t_movedel.at:22 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message=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_movedel.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


# revert to root

$at_traceoff
echo "t_movedel.at:25: rm -rf MT.old"
echo t_movedel.at:25 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_movedel.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_movedel.at:25: mv  MT MT.old"
echo t_movedel.at:25 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_movedel.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_movedel.at:25: rm foo"
echo t_movedel.at:25 >$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_movedel.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_movedel.at:25: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$ROOT_R_SHA ."
echo t_movedel.at:25 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $ROOT_R_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_movedel.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_movedel.at:25: mv MT.old/options MT"
echo t_movedel.at:25 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_movedel.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

PROBE_R_SHA=`cat MT/revision`
PROBE_F_SHA=`monotone --norc identify foo`
$at_traceoff
echo "t_movedel.at:25: test \$PROBE_R_SHA = \$ROOT_R_SHA"
echo t_movedel.at:25 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $ROOT_R_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_movedel.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_movedel.at:25: test \$PROBE_F_SHA = \$ROOT_F_SHA"
echo t_movedel.at:25 >$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_movedel.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_movedel.at:26: rm bar"
echo t_movedel.at:26 >$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_movedel.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


# make a delete edge on the move preimage
$at_traceoff
echo "t_movedel.at:29: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR drop foo"
echo t_movedel.at:29 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_movedel.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_movedel.at:30: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message=blah-blah"
echo t_movedel.at:30 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message=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_movedel.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


# merge the del and the rename
$at_traceoff
echo "t_movedel.at:33: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR merge"
echo t_movedel.at:33 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_movedel.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_movedel.at:34: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update"
echo t_movedel.at:34 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_movedel.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


# check that the delete landed on the renamed target
$at_traceoff
echo "t_movedel.at:37: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR cat manifest"
echo t_movedel.at:37 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_movedel.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_movedel.at:38: mv stdout manifest"
echo t_movedel.at:38 >$at_check_line_file
( $at_traceon; mv stdout 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_movedel.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_movedel.at:39: grep baz manifest"
echo t_movedel.at:39 >$at_check_line_file
( $at_traceon; grep baz 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_movedel.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_movedel.at:40: grep bar manifest"
echo t_movedel.at:40 >$at_check_line_file
( $at_traceon; grep bar 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_movedel.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_movedel.at:41: grep foo manifest"
echo t_movedel.at:41 >$at_check_line_file
( $at_traceon; grep foo 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_movedel.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  43 ) # 43. t_remerge.at:3: merging a rename twice
    at_setup_line='t_remerge.at:3'
    at_desc='merging a rename twice'
    $at_quiet $ECHO_N " 43: merging a rename twice                       $ECHO_C"
    at_xfail=no
    (
      echo "43. t_remerge.at:3: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_remerge.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_remerge.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_remerge.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_remerge.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_remerge.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_remerge.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_remerge.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_remerge.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_remerge.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_remerge.at:5: rm test_keys"
echo t_remerge.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_remerge.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



# x_branch   y_branch
#
#   A
#   |\   this edge says rename(x, y)
#   | ----------
#   |           \
#   B            E--------\
#   |            |         |
#   |            F         |
#   C            |         |
#   |\propagate1 |         |
#   | -----------G         |
#   |            |         J
#   |            H         |
#   D            |         |
#    \propagate2 |         |
#     -----------I---------K

cat >x <<'_ATEOF'
data of state A
_ATEOF

cat >foo <<'_ATEOF'
extra blah blah foo
_ATEOF

cat >bar <<'_ATEOF'
extra blah blah bar
_ATEOF

cat >baz <<'_ATEOF'
extra blah blah baz
_ATEOF

cat >quux <<'_ATEOF'
extra blah blah quux
_ATEOF


# produce state A
$at_traceoff
echo "t_remerge.at:37: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add x"
echo t_remerge.at:37 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add x ) >$at_stdout 2>$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_remerge.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_remerge.at:38: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch.x commit --message 'state A'"
echo t_remerge.at:38 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch.x commit --message 'state 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_remerge.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

A_REVISION_SHA=`cat MT/revision`

# produce state B
echo "data of state B" >x
$at_traceoff
echo "t_remerge.at:43: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch.x commit --message 'state B'"
echo t_remerge.at:43 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch.x commit --message 'state 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_remerge.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


# produce state C
echo "data of state C" >x
$at_traceoff
echo "t_remerge.at:47: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch.x commit --message 'state C'"
echo t_remerge.at:47 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch.x commit --message 'state C' ) >$at_stdout 2>$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_remerge.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

C_REVISION_SHA=`cat MT/revision`

# produce state E

$at_traceoff
echo "t_remerge.at:51: rm -rf MT.old"
echo t_remerge.at:51 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_remerge.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_remerge.at:51: mv  MT MT.old"
echo t_remerge.at:51 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_remerge.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_remerge.at:51: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$A_REVISION_SHA ."
echo t_remerge.at:51 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $A_REVISION_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_remerge.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_remerge.at:51: mv MT.old/options MT"
echo t_remerge.at:51 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_remerge.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_remerge.at:51: test \$PROBE_R_SHA = \$A_REVISION_SHA"
echo t_remerge.at:51 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $A_REVISION_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_remerge.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_remerge.at:52: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename x y"
echo t_remerge.at:52 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename x y ) >$at_stdout 2>$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_remerge.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

mv x y
$at_traceoff
echo "t_remerge.at:54: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch.y commit --message 'state E'"
echo t_remerge.at:54 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch.y commit --message 'state E' ) >$at_stdout 2>$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_remerge.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

E_REVISION_SHA=`cat MT/revision`

# produce state F
$at_traceoff
echo "t_remerge.at:58: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add foo"
echo t_remerge.at:58 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_remerge.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_remerge.at:59: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch.y commit --message 'state F'"
echo t_remerge.at:59 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch.y commit --message 'state F' ) >$at_stdout 2>$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_remerge.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


# produce state G
$at_traceoff
echo "t_remerge.at:62: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR propagate branch.x branch.y"
echo t_remerge.at:62 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR propagate branch.x branch.y ) >$at_stdout 2>$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_remerge.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_remerge.at:63: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch.y update"
echo t_remerge.at:63 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch.y 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_remerge.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

G_REVISION_SHA=`cat MT/revision`
$at_traceoff
echo "t_remerge.at:65: grep 'state C' y"
echo t_remerge.at:65 >$at_check_line_file
( $at_traceon; grep 'state C' y ) >$at_stdout 2>$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_remerge.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


# produce state D

$at_traceoff
echo "t_remerge.at:68: rm -rf MT.old"
echo t_remerge.at:68 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_remerge.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_remerge.at:68: mv  MT MT.old"
echo t_remerge.at:68 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_remerge.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_remerge.at:68: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$C_REVISION_SHA ."
echo t_remerge.at:68 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $C_REVISION_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_remerge.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_remerge.at:68: mv MT.old/options MT"
echo t_remerge.at:68 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_remerge.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_remerge.at:68: test \$PROBE_R_SHA = \$C_REVISION_SHA"
echo t_remerge.at:68 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $C_REVISION_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_remerge.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


echo "data of state D" >x
$at_traceoff
echo "t_remerge.at:70: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add bar"
echo t_remerge.at:70 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add 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_remerge.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_remerge.at:71: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch.x commit --message 'state D'"
echo t_remerge.at:71 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch.x commit --message 'state D' ) >$at_stdout 2>$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_remerge.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


# produce state H

$at_traceoff
echo "t_remerge.at:74: rm -rf MT.old"
echo t_remerge.at:74 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_remerge.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_remerge.at:74: mv  MT MT.old"
echo t_remerge.at:74 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_remerge.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_remerge.at:74: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$G_REVISION_SHA ."
echo t_remerge.at:74 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $G_REVISION_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_remerge.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_remerge.at:74: mv MT.old/options MT"
echo t_remerge.at:74 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_remerge.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_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_remerge.at:74: test \$PROBE_R_SHA = \$G_REVISION_SHA"
echo t_remerge.at:74 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $G_REVISION_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_remerge.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_remerge.at:75: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add baz"
echo t_remerge.at:75 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add baz ) >$at_stdout 2>$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_remerge.at:75: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_remerge.at:76: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch.y commit --message 'state H'"
echo t_remerge.at:76 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch.y commit --message 'state H' ) >$at_stdout 2>$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_remerge.at:76: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# produce state I
$at_traceoff
echo "t_remerge.at:79: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR propagate branch.x branch.y"
echo t_remerge.at:79 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR propagate branch.x branch.y ) >$at_stdout 2>$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_remerge.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_remerge.at:80: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch.y update"
echo t_remerge.at:80 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch.y 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_remerge.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_remerge.at:81: grep 'state D' y"
echo t_remerge.at:81 >$at_check_line_file
( $at_traceon; grep 'state D' y ) >$at_stdout 2>$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_remerge.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


# produce state J

$at_traceoff
echo "t_remerge.at:84: rm -rf MT.old"
echo t_remerge.at:84 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_remerge.at:84: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_remerge.at:84: mv  MT MT.old"
echo t_remerge.at:84 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_remerge.at:84: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_remerge.at:84: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$E_REVISION_SHA ."
echo t_remerge.at:84 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $E_REVISION_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_remerge.at:84: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_remerge.at:84: mv MT.old/options MT"
echo t_remerge.at:84 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_remerge.at:84: 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_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_remerge.at:84: test \$PROBE_R_SHA = \$E_REVISION_SHA"
echo t_remerge.at:84 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $E_REVISION_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_remerge.at:84: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_remerge.at:85: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add quux"
echo t_remerge.at:85 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add quux ) >$at_stdout 2>$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_remerge.at:85: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_remerge.at:86: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch.y commit --message 'state J'"
echo t_remerge.at:86 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch.y commit --message 'state J' ) >$at_stdout 2>$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_remerge.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


# produce state K
$at_traceoff
echo "t_remerge.at:89: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch.y merge"
echo t_remerge.at:89 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch.y 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_remerge.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_remerge.at:90: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch.y update"
echo t_remerge.at:90 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch.y 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_remerge.at:90: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_remerge.at:92: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR cat manifest"
echo t_remerge.at:92 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_remerge.at:92: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_remerge.at:93: mv stdout manifest"
echo t_remerge.at:93 >$at_check_line_file
( $at_traceon; mv stdout 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_remerge.at:93: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_remerge.at:94: grep y manifest"
echo t_remerge.at:94 >$at_check_line_file
( $at_traceon; grep y 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_remerge.at:94: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_remerge.at:95: grep -v x manifest"
echo t_remerge.at:95 >$at_check_line_file
( $at_traceon; grep -v x 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_remerge.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_remerge.at:96: test -f y"
echo t_remerge.at:96 >$at_check_line_file
( $at_traceon; test -f y ) >$at_stdout 2>$at_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_remerge.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_remerge.at:97: grep 'state D' y"
echo t_remerge.at:97 >$at_check_line_file
( $at_traceon; grep 'state D' y ) >$at_stdout 2>$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_remerge.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  44 ) # 44. t_update_missing.at:3: updating from a merge which adds a file
    at_setup_line='t_update_missing.at:3'
    at_desc='updating from a merge which adds a file'
    $at_quiet $ECHO_N " 44: updating from a merge which adds a file      $ECHO_C"
    at_xfail=no
    (
      echo "44. t_update_missing.at:3: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_missing.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_update_missing.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_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_update_missing.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_update_missing.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_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_update_missing.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_update_missing.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_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_update_missing.at:5: rm test_keys"
echo t_update_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_update_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



touch a

$at_traceoff
echo "t_update_missing.at:9: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=a add a"
echo t_update_missing.at:9 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=a 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_update_missing.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_update_missing.at:10: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=a commit --message \"commit a\""
echo t_update_missing.at:10 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=a commit --message "commit 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_update_missing.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


ROOT_R_SHA=`cat MT/revision`
ROOT_F_SHA=`monotone --norc identify a`

mkdir b
touch b/c

$at_traceoff
echo "t_update_missing.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=a add b"
echo t_update_missing.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=a add 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_update_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_update_missing.at:19: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=a commit --message \"commit b/c\""
echo t_update_missing.at:19 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=a commit --message "commit b/c" ) >$at_stdout 2>$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_missing.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_update_missing.at:21: rm -rf MT.old"
echo t_update_missing.at:21 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_missing.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_update_missing.at:21: mv  MT MT.old"
echo t_update_missing.at:21 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_missing.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_update_missing.at:21: rm a"
echo t_update_missing.at:21 >$at_check_line_file
( $at_traceon; rm 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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_update_missing.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_update_missing.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$ROOT_R_SHA ."
echo t_update_missing.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $ROOT_R_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_missing.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_update_missing.at:21: mv MT.old/options MT"
echo t_update_missing.at:21 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_missing.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

PROBE_R_SHA=`cat MT/revision`
PROBE_F_SHA=`monotone --norc identify a`
$at_traceoff
echo "t_update_missing.at:21: test \$PROBE_R_SHA = \$ROOT_R_SHA"
echo t_update_missing.at:21 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $ROOT_R_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_missing.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_update_missing.at:21: test \$PROBE_F_SHA = \$ROOT_F_SHA"
echo t_update_missing.at:21 >$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_missing.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



rm b/c
rmdir b
touch d

$at_traceoff
echo "t_update_missing.at:27: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=a add d"
echo t_update_missing.at:27 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=a add d ) >$at_stdout 2>$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_missing.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_update_missing.at:28: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=a commit --message \"commit d\""
echo t_update_missing.at:28 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=a commit --message "commit d" ) >$at_stdout 2>$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_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_update_missing.at:30: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=a merge"
echo t_update_missing.at:30 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=a 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_update_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_update_missing.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=a update"
echo t_update_missing.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=a 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_missing.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  45 ) # 45. t_chkeypass.at:3: changing passphrase of a private key
    at_setup_line='t_chkeypass.at:3'
    at_desc='changing passphrase of a private key'
    $at_quiet $ECHO_N " 45: changing passphrase of a private key         $ECHO_C"
    at_xfail=no
    (
      echo "45. t_chkeypass.at:3: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_chkeypass.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_chkeypass.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_chkeypass.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_chkeypass.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_chkeypass.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_chkeypass.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_chkeypass.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_chkeypass.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_chkeypass.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_chkeypass.at:5: rm test_keys"
echo t_chkeypass.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_chkeypass.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_chkeypass.at:10: (echo \$TKEY; echo \$TKEY) | \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR genkey \$TKEY"
echo t_chkeypass.at:10 >$at_check_line_file
( $at_traceon; (echo $TKEY; echo $TKEY) | $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_chkeypass.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


# fail to enter any passphrase
$at_traceoff
echo "t_chkeypass.at:13: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR chkeypass \$TKEY </dev/null"
echo t_chkeypass.at:13 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR chkeypass $TKEY </dev/null ) >$at_stdout 2>$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_chkeypass.at:13: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# fail to give correct old passphrase
$at_traceoff
echo "t_chkeypass.at:16: (echo bad; echo bad; echo bad) | \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR chkeypass \$TKEY"
echo t_chkeypass.at:16 >$at_check_line_file
( $at_traceon; (echo bad; echo bad; echo bad) | $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR chkeypass $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;;
   1) ;;
   *) echo "t_chkeypass.at:16: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# fail to repeat new password
$at_traceoff
echo "t_chkeypass.at:19: (echo \$TKEY; echo \$TKEY-new; echo bad) | \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR chkeypass \$TKEY"
echo t_chkeypass.at:19 >$at_check_line_file
( $at_traceon; (echo $TKEY; echo $TKEY-new; echo bad) | $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR chkeypass $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;;
   1) ;;
   *) echo "t_chkeypass.at:19: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# change the passphrase successfully
$at_traceoff
echo "t_chkeypass.at:22: (echo \$TKEY; echo \$TKEY-new; echo \$TKEY-new) | \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR chkeypass \$TKEY"
echo t_chkeypass.at:22 >$at_check_line_file
( $at_traceon; (echo $TKEY; echo $TKEY-new; echo $TKEY-new) | $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR chkeypass $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_chkeypass.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


# check that the passphrase changed
$at_traceoff
echo "t_chkeypass.at:25: (echo \$TKEY-new; echo \$TKEY; echo \$TKEY) | \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR chkeypass \$TKEY"
echo t_chkeypass.at:25 >$at_check_line_file
( $at_traceon; (echo $TKEY-new; echo $TKEY; echo $TKEY) | $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR chkeypass $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_chkeypass.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  46 ) # 46. t_diff_added_file.at:3: diffing a revision with an added file
    at_setup_line='t_diff_added_file.at:3'
    at_desc='diffing a revision with an added file'
    $at_quiet $ECHO_N " 46: diffing a revision with an added file        $ECHO_C"
    at_xfail=no
    (
      echo "46. t_diff_added_file.at:3: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_diff_added_file.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_diff_added_file.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_diff_added_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_diff_added_file.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_diff_added_file.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_diff_added_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_diff_added_file.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_diff_added_file.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_diff_added_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_diff_added_file.at:5: rm test_keys"
echo t_diff_added_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_diff_added_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



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

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


$at_traceoff
echo "t_diff_added_file.at:12: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add foo1"
echo t_diff_added_file.at:12 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add foo1 ) >$at_stdout 2>$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_diff_added_file.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_diff_added_file.at:13: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah"
echo t_diff_added_file.at:13 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_diff_added_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

parent=`cat MT/revision`
$at_traceoff
echo "t_diff_added_file.at:15: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add foo2"
echo t_diff_added_file.at:15 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add foo2 ) >$at_stdout 2>$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_diff_added_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_diff_added_file.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message bleh"
echo t_diff_added_file.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_diff_added_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_diff_added_file.at:17: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR diff --revision=\$parent --revision=\`cat MT/revision\`"
echo t_diff_added_file.at:17 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR diff --revision=$parent --revision=`cat MT/revision` ) >$at_stdout 2>$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_diff_added_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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  47 ) # 47. t_update_to_revision.at:3: updating to a given revision
    at_setup_line='t_update_to_revision.at:3'
    at_desc='updating to a given revision'
    $at_quiet $ECHO_N " 47: updating to a given revision                 $ECHO_C"
    at_xfail=no
    (
      echo "47. t_update_to_revision.at:3: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_to_revision.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_update_to_revision.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_to_revision.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_to_revision.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_update_to_revision.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_to_revision.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_to_revision.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_update_to_revision.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_to_revision.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_to_revision.at:5: rm test_keys"
echo t_update_to_revision.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_to_revision.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 >root <<'_ATEOF'
first line of the file
second line of the file
third line of the file
_ATEOF

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

cat >left-leaf <<'_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

cat >right-leaf <<'_ATEOF'
first line of the file
an insertion between first and second
a changed second line of the file
third line of the file
_ATEOF

cat >modified-left-leaf <<'_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
a new fourth line
_ATEOF

cat >modified-root <<'_ATEOF'
first line of the file
second line of the file
third line of the file
a new fourth line
_ATEOF


# Create root revision.
$at_traceoff
echo "t_update_to_revision.at:41: cp root testfile"
echo t_update_to_revision.at:41 >$at_check_line_file
( $at_traceon; cp root 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_to_revision.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_update_to_revision.at:42: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_update_to_revision.at:42 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_to_revision.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_update_to_revision.at:43: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_update_to_revision.at:43 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_to_revision.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

ROOT_R_SHA=`cat MT/revision`

# Create middle revision based off root.
$at_traceoff
echo "t_update_to_revision.at:47: cp middle testfile"
echo t_update_to_revision.at:47 >$at_check_line_file
( $at_traceon; cp middle 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_to_revision.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_update_to_revision.at:48: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message blah-blah"
echo t_update_to_revision.at:48 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message 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_to_revision.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

MIDDLE_R_SHA=`cat MT/revision`

# Create leaf revision based off middle.
$at_traceoff
echo "t_update_to_revision.at:52: cp left-leaf testfile"
echo t_update_to_revision.at:52 >$at_check_line_file
( $at_traceon; cp left-leaf 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_to_revision.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_update_to_revision.at:53: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message blah-blah"
echo t_update_to_revision.at:53 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message 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_to_revision.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
g
LEFT_LEAF_R_SHA=`cat MT/revision`

# Test going backward in the revision tree.
$at_traceoff
echo "t_update_to_revision.at:57: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update \$ROOT_R_SHA"
echo t_update_to_revision.at:57 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR update $ROOT_R_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_update_to_revision.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

diff -u testfile root
$at_traceoff
echo "t_update_to_revision.at:59: cmp testfile root"
echo t_update_to_revision.at:59 >$at_check_line_file
( $at_traceon; cmp testfile root ) >$at_stdout 2>$at_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_to_revision.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


# Test going forward in the revision tree.
$at_traceoff
echo "t_update_to_revision.at:62: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update \$MIDDLE_R_SHA"
echo t_update_to_revision.at:62 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR update $MIDDLE_R_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_update_to_revision.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_update_to_revision.at:63: cmp testfile middle"
echo t_update_to_revision.at:63 >$at_check_line_file
( $at_traceon; cmp testfile middle ) >$at_stdout 2>$at_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_to_revision.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


# Create a fork from middle.
$at_traceoff
echo "t_update_to_revision.at:66: cp right-leaf testfile"
echo t_update_to_revision.at:66 >$at_check_line_file
( $at_traceon; cp right-leaf 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_to_revision.at:66: exit code was $at_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_to_revision.at:67: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message blah-blah"
echo t_update_to_revision.at:67 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message 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_to_revision.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

RIGHT_LEAF_R_SHA=`cat MT/revision`

# Test going from the right left to the left leaf via the common ancestor.
$at_traceoff
echo "t_update_to_revision.at:71: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update \$LEFT_LEAF_R_SHA"
echo t_update_to_revision.at:71 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR update $LEFT_LEAF_R_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_update_to_revision.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_update_to_revision.at:72: cmp testfile left-leaf"
echo t_update_to_revision.at:72 >$at_check_line_file
( $at_traceon; cmp testfile left-leaf ) >$at_stdout 2>$at_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_to_revision.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


# Test that working copy changes are kept while going backward.
$at_traceoff
echo "t_update_to_revision.at:75: cp modified-left-leaf testfile"
echo t_update_to_revision.at:75 >$at_check_line_file
( $at_traceon; cp modified-left-leaf 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_to_revision.at:75: exit code was $at_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_to_revision.at:76: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update \$ROOT_R_SHA"
echo t_update_to_revision.at:76 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR update $ROOT_R_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_update_to_revision.at:76: exit code was $at_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_to_revision.at:77: cmp testfile modified-root"
echo t_update_to_revision.at:77 >$at_check_line_file
( $at_traceon; cmp testfile modified-root ) >$at_stdout 2>$at_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_to_revision.at:77: exit code 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`
    ;;

  48 ) # 48. t_heads.at:3: 'heads'
    at_setup_line='t_heads.at:3'
    at_desc=''heads''
    $at_quiet $ECHO_N " 48: 'heads'                                      $ECHO_C"
    at_xfail=no
    (
      echo "48. t_heads.at:3: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_heads.at:4: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_heads.at:4 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_heads.at:4: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_heads.at:4: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_heads.at:4 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_heads.at:4: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_heads.at:4: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_heads.at:4 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_heads.at:4: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_heads.at:4: rm test_keys"
echo t_heads.at:4 >$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_heads.at:4: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



# Create a single revision in branch1
#
#          root (branch1)
#
# branch1 heads: root

cat >f <<'_ATEOF'
base data
_ATEOF


$at_traceoff
echo "t_heads.at:15: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add f"
echo t_heads.at:15 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add f ) >$at_stdout 2>$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_heads.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_heads.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch1 commit --message blah-blah"
echo t_heads.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch1 commit --message 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_heads.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_R_SHA=`cat MT/revision`

$at_traceoff
echo "t_heads.at:19: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch1 heads"
echo t_heads.at:19 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch1 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_heads.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_heads.at:20: grep -q \$ROOT_R_SHA stdout"
echo t_heads.at:20 >$at_check_line_file
( $at_traceon; grep -q $ROOT_R_SHA 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;;
   0) ;;
   *) echo "t_heads.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


# Create a child
#
#          root (branch1)
#          /
#    child1 (branch1)
#
# branch1 heads: child1

cat >f <<'_ATEOF'
child1 data
_ATEOF

$at_traceoff
echo "t_heads.at:32: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch1 commit --message blah-blah"
echo t_heads.at:32 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch1 commit --message 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_heads.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

CHILD1_R_SHA=`cat MT/revision`

$at_traceoff
echo "t_heads.at:35: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch1 heads"
echo t_heads.at:35 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch1 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_heads.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_heads.at:36: grep -q \$ROOT_R_SHA stdout"
echo t_heads.at:36 >$at_check_line_file
( $at_traceon; grep -q $ROOT_R_SHA 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_heads.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_heads.at:37: grep -q \$CHILD1_R_SHA stdout"
echo t_heads.at:37 >$at_check_line_file
( $at_traceon; grep -q $CHILD1_R_SHA 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;;
   0) ;;
   *) echo "t_heads.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


# Create another child
#
#          root (branch1)
#          /           \
#    child1 (branch1)   child2 (branch1)
#
# branch1 heads: child1, child2


$at_traceoff
echo "t_heads.at:47: rm -rf MT.old"
echo t_heads.at:47 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_heads.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_heads.at:47: mv  MT MT.old"
echo t_heads.at:47 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_heads.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_heads.at:47: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$ROOT_R_SHA ."
echo t_heads.at:47 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $ROOT_R_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_heads.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_heads.at:47: mv MT.old/options MT"
echo t_heads.at:47 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_heads.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_heads.at:47: test \$PROBE_R_SHA = \$ROOT_R_SHA"
echo t_heads.at:47 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $ROOT_R_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_heads.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


cat >f <<'_ATEOF'
child2 data
_ATEOF

$at_traceoff
echo "t_heads.at:50: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch1 commit --message blah-blah"
echo t_heads.at:50 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch1 commit --message 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_heads.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

CHILD2_R_SHA=`cat MT/revision`

$at_traceoff
echo "t_heads.at:53: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch1 heads"
echo t_heads.at:53 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch1 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_heads.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_heads.at:54: grep -q \$ROOT_R_SHA stdout"
echo t_heads.at:54 >$at_check_line_file
( $at_traceon; grep -q $ROOT_R_SHA 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_heads.at:54: 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_heads.at:55: grep -q \$CHILD1_R_SHA stdout"
echo t_heads.at:55 >$at_check_line_file
( $at_traceon; grep -q $CHILD1_R_SHA 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;;
   0) ;;
   *) echo "t_heads.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_heads.at:56: grep -q \$CHILD2_R_SHA stdout"
echo t_heads.at:56 >$at_check_line_file
( $at_traceon; grep -q $CHILD2_R_SHA 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;;
   0) ;;
   *) echo "t_heads.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


# Branch from the second child into branch2
#
#          root (branch1)
#          /           \
#    child1 (branch1)   child2 (branch1)
#                         \
#                          child3 (branch2)
#
# branch1 heads: child1, child2
# branch2 heads: child3

cat >f <<'_ATEOF'
child3 data
_ATEOF

$at_traceoff
echo "t_heads.at:71: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch2 commit --message blah-blah"
echo t_heads.at:71 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch2 commit --message 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_heads.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

CHILD3_R_SHA=`cat MT/revision`

$at_traceoff
echo "t_heads.at:74: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch1 heads"
echo t_heads.at:74 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch1 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_heads.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_heads.at:75: grep -q \$ROOT_R_SHA stdout"
echo t_heads.at:75 >$at_check_line_file
( $at_traceon; grep -q $ROOT_R_SHA 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_heads.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

$at_traceoff
echo "t_heads.at:76: grep -q \$CHILD1_R_SHA stdout"
echo t_heads.at:76 >$at_check_line_file
( $at_traceon; grep -q $CHILD1_R_SHA 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;;
   0) ;;
   *) echo "t_heads.at:76: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_heads.at:77: grep -q \$CHILD2_R_SHA stdout"
echo t_heads.at:77 >$at_check_line_file
( $at_traceon; grep -q $CHILD2_R_SHA 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;;
   0) ;;
   *) echo "t_heads.at:77: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_heads.at:78: grep -q \$CHILD3_R_SHA stdout"
echo t_heads.at:78 >$at_check_line_file
( $at_traceon; grep -q $CHILD3_R_SHA 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_heads.at:78: 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_heads.at:79: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch2 heads"
echo t_heads.at:79 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch2 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_heads.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_heads.at:80: grep -q \$ROOT_R_SHA stdout"
echo t_heads.at:80 >$at_check_line_file
( $at_traceon; grep -q $ROOT_R_SHA 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_heads.at:80: 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_heads.at:81: grep -q \$CHILD1_R_SHA stdout"
echo t_heads.at:81 >$at_check_line_file
( $at_traceon; grep -q $CHILD1_R_SHA 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_heads.at:81: 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_heads.at:82: grep -q \$CHILD2_R_SHA stdout"
echo t_heads.at:82 >$at_check_line_file
( $at_traceon; grep -q $CHILD2_R_SHA 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_heads.at:82: 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_heads.at:83: grep -q \$CHILD3_R_SHA stdout"
echo t_heads.at:83 >$at_check_line_file
( $at_traceon; grep -q $CHILD3_R_SHA 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;;
   0) ;;
   *) echo "t_heads.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


# Branch from the first child into branch2
#
#          root (branch1)
#          /           \
#    child1 (branch1)   child2 (branch1)
#       /                 \
#   child4 (branch2)       child3 (branch2)
#
# branch1 heads: child1, child2
# branch2 heads: child3, child4


$at_traceoff
echo "t_heads.at:96: rm -rf MT.old"
echo t_heads.at:96 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_heads.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_heads.at:96: mv  MT MT.old"
echo t_heads.at:96 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_heads.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_heads.at:96: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$CHILD1_R_SHA ."
echo t_heads.at:96 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $CHILD1_R_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_heads.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_heads.at:96: mv MT.old/options MT"
echo t_heads.at:96 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_heads.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_heads.at:96: test \$PROBE_R_SHA = \$CHILD1_R_SHA"
echo t_heads.at:96 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $CHILD1_R_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_heads.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


cat >f <<'_ATEOF'
child4 data
_ATEOF

$at_traceoff
echo "t_heads.at:99: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch2 commit --message blah-blah"
echo t_heads.at:99 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch2 commit --message 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_heads.at:99: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

CHILD4_R_SHA=`cat MT/revision`

$at_traceoff
echo "t_heads.at:102: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch1 heads"
echo t_heads.at:102 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch1 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_heads.at:102: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_heads.at:103: grep -q \$ROOT_R_SHA stdout"
echo t_heads.at:103 >$at_check_line_file
( $at_traceon; grep -q $ROOT_R_SHA 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_heads.at:103: 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_heads.at:104: grep -q \$CHILD1_R_SHA stdout"
echo t_heads.at:104 >$at_check_line_file
( $at_traceon; grep -q $CHILD1_R_SHA 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;;
   0) ;;
   *) echo "t_heads.at:104: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_heads.at:105: grep -q \$CHILD2_R_SHA stdout"
echo t_heads.at:105 >$at_check_line_file
( $at_traceon; grep -q $CHILD2_R_SHA 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;;
   0) ;;
   *) echo "t_heads.at:105: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_heads.at:106: grep -q \$CHILD3_R_SHA stdout"
echo t_heads.at:106 >$at_check_line_file
( $at_traceon; grep -q $CHILD3_R_SHA 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_heads.at:106: 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_heads.at:107: grep -q \$CHILD4_R_SHA stdout"
echo t_heads.at:107 >$at_check_line_file
( $at_traceon; grep -q $CHILD4_R_SHA 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_heads.at:107: 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_heads.at:108: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch2 heads"
echo t_heads.at:108 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch2 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_heads.at:108: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_heads.at:109: grep -q \$ROOT_R_SHA stdout"
echo t_heads.at:109 >$at_check_line_file
( $at_traceon; grep -q $ROOT_R_SHA 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_heads.at:109: 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_heads.at:110: grep -q \$CHILD1_R_SHA stdout"
echo t_heads.at:110 >$at_check_line_file
( $at_traceon; grep -q $CHILD1_R_SHA 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_heads.at:110: 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_heads.at:111: grep -q \$CHILD2_R_SHA stdout"
echo t_heads.at:111 >$at_check_line_file
( $at_traceon; grep -q $CHILD2_R_SHA 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_heads.at:111: 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_heads.at:112: grep -q \$CHILD3_R_SHA stdout"
echo t_heads.at:112 >$at_check_line_file
( $at_traceon; grep -q $CHILD3_R_SHA 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;;
   0) ;;
   *) echo "t_heads.at:112: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_heads.at:113: grep -q \$CHILD4_R_SHA stdout"
echo t_heads.at:113 >$at_check_line_file
( $at_traceon; grep -q $CHILD4_R_SHA 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;;
   0) ;;
   *) echo "t_heads.at:113: exit code 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`
    ;;

  49 ) # 49. t_heads_discontinuous_branch.at:3: 'heads' with discontinuous branches
    at_setup_line='t_heads_discontinuous_branch.at:3'
    at_desc=''heads' with discontinuous branches'
    $at_quiet $ECHO_N " 49: 'heads' with discontinuous branches          $ECHO_C"
    at_xfail=no
    (
      echo "49. t_heads_discontinuous_branch.at:3: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_heads_discontinuous_branch.at:4: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_heads_discontinuous_branch.at:4 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_heads_discontinuous_branch.at:4: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_heads_discontinuous_branch.at:4: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_heads_discontinuous_branch.at:4 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_heads_discontinuous_branch.at:4: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_heads_discontinuous_branch.at:4: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_heads_discontinuous_branch.at:4 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_heads_discontinuous_branch.at:4: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_heads_discontinuous_branch.at:4: rm test_keys"
echo t_heads_discontinuous_branch.at:4 >$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_heads_discontinuous_branch.at:4: 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 tests the 'heads' command with a graph like:
#
#    r1 (branch1)
#    |
#    r2 (branch2)
#    |
#    r3 (branch1)
#
# 'heads' on branch1 should show only r3, not r1.

# Create R1
cat >f <<'_ATEOF'
r1 data
_ATEOF

$at_traceoff
echo "t_heads_discontinuous_branch.at:19: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add f"
echo t_heads_discontinuous_branch.at:19 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add f ) >$at_stdout 2>$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_heads_discontinuous_branch.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_heads_discontinuous_branch.at:20: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch1 commit --message blah-blah"
echo t_heads_discontinuous_branch.at:20 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch1 commit --message 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_heads_discontinuous_branch.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

R1_R_SHA=`cat MT/revision`

# Sanity check first...
$at_traceoff
echo "t_heads_discontinuous_branch.at:24: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch1 heads"
echo t_heads_discontinuous_branch.at:24 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch1 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_heads_discontinuous_branch.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_heads_discontinuous_branch.at:25: grep -q \$R1_R_SHA stdout"
echo t_heads_discontinuous_branch.at:25 >$at_check_line_file
( $at_traceon; grep -q $R1_R_SHA 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;;
   0) ;;
   *) echo "t_heads_discontinuous_branch.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


# Now create R2
cat >f <<'_ATEOF'
r2 data
_ATEOF

$at_traceoff
echo "t_heads_discontinuous_branch.at:30: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch2 commit --message blah-blah"
echo t_heads_discontinuous_branch.at:30 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch2 commit --message 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_heads_discontinuous_branch.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

R2_R_SHA=`cat MT/revision`

# Now create R3
cat >f <<'_ATEOF'
r3 data
_ATEOF

$at_traceoff
echo "t_heads_discontinuous_branch.at:36: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch1 commit --message blah-blah"
echo t_heads_discontinuous_branch.at:36 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch1 commit --message 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_heads_discontinuous_branch.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

R3_R_SHA=`cat MT/revision`

# Now check heads on branch1
$at_traceoff
echo "t_heads_discontinuous_branch.at:40: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch1 heads"
echo t_heads_discontinuous_branch.at:40 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch1 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_heads_discontinuous_branch.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_heads_discontinuous_branch.at:41: grep -q \$R1_R_SHA stdout"
echo t_heads_discontinuous_branch.at:41 >$at_check_line_file
( $at_traceon; grep -q $R1_R_SHA 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_heads_discontinuous_branch.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_heads_discontinuous_branch.at:42: grep -q \$R2_R_SHA stdout"
echo t_heads_discontinuous_branch.at:42 >$at_check_line_file
( $at_traceon; grep -q $R2_R_SHA 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_heads_discontinuous_branch.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_heads_discontinuous_branch.at:43: grep -q \$R3_R_SHA stdout"
echo t_heads_discontinuous_branch.at:43 >$at_check_line_file
( $at_traceon; grep -q $R3_R_SHA 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;;
   0) ;;
   *) echo "t_heads_discontinuous_branch.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`
    ;;

  50 ) # 50. t_merge_1.at:1: test a merge
    at_setup_line='t_merge_1.at:1'
    at_desc='test a merge'
    $at_quiet $ECHO_N " 50: test a merge                                 $ECHO_C"
    at_xfail=no
    (
      echo "50. t_merge_1.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_1.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_merge_1.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_1.at:2: exit code was $at_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_1.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_merge_1.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_1.at:2: exit code was $at_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_1.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_merge_1.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_1.at:2: exit code was $at_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_1.at:2: rm test_keys"
echo t_merge_1.at:2 >$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_1.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon




if which mimencode 2>/dev/null; then
  UNB64_COMMAND="mimencode -u"
elif which recode 2>/dev/null; then
  UNB64_COMMAND="recode /Base64"
elif perl -MMIME::Base64 -e 1 2>/dev/null; then
  UNB64_COMMAND="perl -MMIME::Base64 -ne 'print decode_base64(\$_)'"
elif python -c 'import sys;sys.exit(not hasattr("", "decode"))' 2>/dev/null; then
  UNB64_COMMAND="python -c 'import sys;sys.stdout.write(sys.stdin.read().decode("'"'"base64"'"'"))'"
else
  # This is lame!  We should XFAIL the test so the user knows that
  # they're not, you know, actually testing the software.  But
  # Autotest runs XFAIL conditions in a completely different shell, so
  # we can't without duplicating the whole test here.
  exit 77
fi
# Poor man's logging:
$at_traceoff
echo "t_merge_1.at:4: echo \$UNB64_COMMAND"
echo t_merge_1.at:4 >$at_check_line_file
( $at_traceon; echo $UNB64_COMMAND ) >$at_stdout 2>$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_1.at:4: 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 is a real merge error.  'right' contains only a single added
# function; when it was really merged with 'left', the last line of
# this function was lost.

# This may actually be a bug in the unidiff algorithm; 'diff' and
# 'monotone diff' produce different results when calculating
# diff(parent, left).

cat >parent.b64 <<'_ATEOF'
Ly8gY29weXJpZ2h0IChDKSAyMDAyLCAyMDAzIGdyYXlkb24gaG9hcmUgPGdyYXlkb25AcG9i
b3guY29tPgovLyBhbGwgcmlnaHRzIHJlc2VydmVkLgovLyBsaWNlbnNlZCB0byB0aGUgcHVi
bGljIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCAoPj0gMikKLy8gc2VlIHRoZSBm
aWxlIENPUFlJTkcgZm9yIGRldGFpbHMKCiNpbmNsdWRlIDxpdGVyYXRvcj4KI2luY2x1ZGUg
PGxpc3Q+CiNpbmNsdWRlIDxzZXQ+CiNpbmNsdWRlIDxzc3RyZWFtPgojaW5jbHVkZSA8dmVj
dG9yPgoKI2luY2x1ZGUgPHN0ZGFyZy5oPgoKI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIu
aHBwPgojaW5jbHVkZSA8Ym9vc3QvbGV4aWNhbF9jYXN0LmhwcD4KI2luY2x1ZGUgPGJvb3N0
L2ZpbGVzeXN0ZW0vcGF0aC5ocHA+CiNpbmNsdWRlIDxib29zdC9maWxlc3lzdGVtL29wZXJh
dGlvbnMuaHBwPgoKI2luY2x1ZGUgPHNxbGl0ZS5oPgoKI2luY2x1ZGUgImFwcF9zdGF0ZS5o
aCIKI2luY2x1ZGUgImNlcnQuaGgiCiNpbmNsdWRlICJjbGVhbnVwLmhoIgojaW5jbHVkZSAi
Y29uc3RhbnRzLmhoIgojaW5jbHVkZSAiZGF0YWJhc2UuaGgiCiNpbmNsdWRlICJrZXlzLmho
IgojaW5jbHVkZSAic2FuaXR5LmhoIgojaW5jbHVkZSAic2NoZW1hX21pZ3JhdGlvbi5oaCIK
I2luY2x1ZGUgImNlcnQuaGgiCiNpbmNsdWRlICJ0cmFuc2Zvcm1zLmhoIgojaW5jbHVkZSAi
dWkuaGgiCiNpbmNsdWRlICJ2b2NhYi5oaCIKI2luY2x1ZGUgInhkZWx0YS5oaCIKCi8vIGRl
ZmluZWQgaW4gc2NoZW1hLnNxbCwgY29udmVydGVkIHRvIGhlYWRlcjoKI2luY2x1ZGUgInNj
aGVtYS5oIgoKLy8gZGVmaW5lZCBpbiB2aWV3cy5zcWwsIGNvbnZlcnRlZCB0byBoZWFkZXI6
CiNpbmNsdWRlICJ2aWV3cy5oIgoKLy8gdGhpcyBmaWxlIGRlZmluZXMgYSBwdWJsaWMsIHR5
cGVkIGludGVyZmFjZSB0byB0aGUgZGF0YWJhc2UuCi8vIHRoZSBkYXRhYmFzZSBjbGFzcyBl
bmNhcHN1bGF0ZXMgYWxsIGtub3dsZWRnZSBhYm91dCBzcWxpdGUsCi8vIHRoZSBzY2hlbWEs
IGFuZCBhbGwgU1FMIHN0YXRlbWVudHMgdXNlZCB0byBhY2Nlc3MgdGhlIHNjaGVtYS4KLy8K
Ly8gc2VlIGZpbGUgc2NoZW1hLnNxbCBmb3IgdGhlIHRleHQgb2YgdGhlIHNjaGVtYS4KCnVz
aW5nIGJvb3N0OjpzaGFyZWRfcHRyOwp1c2luZyBib29zdDo6bGV4aWNhbF9jYXN0Owp1c2lu
ZyBuYW1lc3BhY2Ugc3RkOwoKaW50IGNvbnN0IG9uZV9yb3cgPSAxOwppbnQgY29uc3Qgb25l
X2NvbCA9IDE7CmludCBjb25zdCBhbnlfcm93cyA9IC0xOwppbnQgY29uc3QgYW55X2NvbHMg
PSAtMTsKCmV4dGVybiAiQyIgewogIC8vIHN0cmFuZ2VseSB0aGlzIGlzbid0IGRlY2xhcmVk
LCBldmVuIHRob3VnaCBpdCdzIHByZXNlbnQgaW4gbXkgc3FsaXRlLgogIGNoYXIgKnNxbGl0
ZV92bXByaW50Zihjb25zdCBjaGFyICp6Rm9ybWF0LCB2YV9saXN0KTsKfQoKZGF0YWJhc2U6
OmRhdGFiYXNlKGZzOjpwYXRoIGNvbnN0ICYgZm4pIDoKICBmaWxlbmFtZShmbiksCiAgLy8g
bmIuIHVwZGF0ZSB0aGlzIGlmIHlvdSBjaGFuZ2UgdGhlIHNjaGVtYS4gdW5mb3J0dW5hdGVs
eSB3ZSBhcmUgbm90CiAgLy8gdXNpbmcgc2VsZi1kaWdlc3Rpbmcgc2NoZW1hcyBkdWUgdG8g
Y29tbWVudCBpcnJlZ3VsYXJpdGllcyBhbmQKICAvLyBub24tYWxwaGFiZXRpYyBvcmRlcmlu
ZyBvZiB0YWJsZXMgaW4gc3FsIHNvdXJjZSBmaWxlcy4gd2UgY291bGQgY3JlYXRlCiAgLy8g
YSB0ZW1wb3JhcnkgZGIsIHdyaXRlIG91ciBpbnRlbmRlZCBzY2hlbWEgaW50byBpdCwgYW5k
IHJlYWQgaXQgYmFjaywKICAvLyBidXQgdGhpcyBzZWVtcyBsaWtlIGl0IHdvdWxkIGJlIHRv
byBydWRlLiBwb3NzaWJseSByZXZpc2l0IHRoaXMgaXNzdWUuCiAgc2NoZW1hKCJjMWU4NjU4
OGUxMWFkMDdmYTUzZTVkMjk0ZWRjMDQzY2UxZDQwMDVhIiksCiAgX19zcWwoTlVMTCksCiAg
dHJhbnNhY3Rpb25fbGV2ZWwoMCkKe30KCnZvaWQgCmRhdGFiYXNlOjpjaGVja19zY2hlbWEo
KQp7CiAgc3RyaW5nIGRiX3NjaGVtYV9pZDsgIAogIGNhbGN1bGF0ZV9zY2hlbWFfaWQgKF9f
c3FsLCBkYl9zY2hlbWFfaWQpOwogIE4gKHNjaGVtYSA9PSBkYl9zY2hlbWFfaWQsCiAgICAg
RigiZGF0YWJhc2Ugc2NoZW1hcyBkbyBub3QgbWF0Y2g6ICIKICAgICAgICJ3YW50ZWQgJXMs
IGdvdCAlcy4gdHJ5IG1pZ3JhdGluZyBkYXRhYmFzZSIpIAogICAgICUgc2NoZW1hICUgZGJf
c2NoZW1hX2lkKTsKfQoKc3RhdGljIHZvaWQgCnNxbGl0ZV91bmJhc2U2NF9mbihzcWxpdGVf
ZnVuYyAqZiwgaW50IG5hcmdzLCBjaGFyIGNvbnN0ICoqIGFyZ3MpCnsKICBpZiAobmFyZ3Mg
IT0gMSkKICAgIHsKICAgICAgc3FsaXRlX3NldF9yZXN1bHRfZXJyb3IoZiwgIm5lZWQgZXhh
Y3RseSAxIGFyZyB0byB1bmJhc2U2NCgpIiwgLTEpOwogICAgICByZXR1cm47CiAgICB9CiAg
ZGF0YSBkZWNvZGVkOwogIGRlY29kZV9iYXNlNjQoYmFzZTY0PGRhdGE+KHN0cmluZyhhcmdz
WzBdKSksIGRlY29kZWQpOwogIHNxbGl0ZV9zZXRfcmVzdWx0X3N0cmluZyhmLCBkZWNvZGVk
KCkuY19zdHIoKSwgZGVjb2RlZCgpLnNpemUoKSk7Cn0KCnZvaWQgCmRhdGFiYXNlOjpzZXRf
YXBwKGFwcF9zdGF0ZSAqIGFwcCkKewogIF9fYXBwID0gYXBwOwp9CgpzdHJ1Y3Qgc3FsaXRl
ICogCmRhdGFiYXNlOjpzcWwoYm9vbCBpbml0KQp7CiAgaWYgKCEgX19zcWwpCiAgICB7CiAg
ICAgIGlmICghIGluaXQpCgl7CgkgIGlmIChmaWxlbmFtZS5zdHJpbmcoKSA9PSAiIikKCSAg
ICB0aHJvdyBpbmZvcm1hdGl2ZV9mYWlsdXJlKHN0cmluZygibm8gZGF0YWJhc2Ugc3BlY2lm
aWVkIikpOwoJICBlbHNlIGlmICghIGZzOjpleGlzdHMoZmlsZW5hbWUpKQoJICAgIHRocm93
IGluZm9ybWF0aXZlX2ZhaWx1cmUoc3RyaW5nKCJkYXRhYmFzZSAiKSArIGZpbGVuYW1lLnN0
cmluZygpICsKCQkJCSAgICAgIHN0cmluZygiIGRvZXMgbm90IGV4aXN0IikpOwoJfQogICAg
ICBOKGZpbGVuYW1lLnN0cmluZygpICE9ICIiLAoJRigibmVlZCBkYXRhYmFzZSBuYW1lIikp
OwogICAgICBjaGFyICogZXJybXNnID0gTlVMTDsKICAgICAgX19zcWwgPSBzcWxpdGVfb3Bl
bihmaWxlbmFtZS5zdHJpbmcoKS5jX3N0cigpLCAwNzU1LCAmZXJybXNnKTsKICAgICAgaWYg
KCEgX19zcWwpCgl0aHJvdyBvb3BzKHN0cmluZygiY291bGQgbm90IG9wZW4gZGF0YWJhc2U6
ICIpICsgZmlsZW5hbWUuc3RyaW5nKCkgKyAKCQkgICAoZXJybXNnID8gKCI6ICIgKyBzdHJp
bmcoZXJybXNnKSkgOiAiIikpOwogICAgICBpZiAoaW5pdCkKCWV4ZWN1dGUoc2NoZW1hX2Nv
bnN0YW50KTsKCiAgICAgIGNoZWNrX3NjaGVtYSgpOwogICAgICBpbnN0YWxsX2Z1bmN0aW9u
cyhfX2FwcCk7CiAgICAgIGluc3RhbGxfdmlld3MoKTsKICAgIH0KICByZXR1cm4gX19zcWw7
Cn0KCnZvaWQgCmRhdGFiYXNlOjppbml0aWFsaXplKCkKewogIGlmIChfX3NxbCkKICAgIHRo
cm93IG9vcHMoImNhbm5vdCBpbml0aWFsaXplIGRhdGFiYXNlIHdoaWxlIGl0IGlzIG9wZW4i
KTsKCiAgTighZnM6OmV4aXN0cyhmaWxlbmFtZSksCiAgICBGKCJjb3VsZCBub3QgaW5pdGlh
bGl6ZSBkYXRhYmFzZTogJXM6IGFscmVhZHkgZXhpc3RzIikgCiAgICAlIGZpbGVuYW1lLnN0
cmluZygpKTsKCiAgZnM6OnBhdGggam91cm5hbCA9IG1rcGF0aChmaWxlbmFtZS5zdHJpbmco
KSArICItam91cm5hbCIpOwogIE4oIWZzOjpleGlzdHMoam91cm5hbCksCiAgICBGKCJleGlz
dGluZyAocG9zc2libHkgc3RhbGUpIGpvdXJuYWwgZmlsZSAnJXMnIGhhcyBzYW1lIHN0ZW0g
YXMgbmV3IGRhdGFiYXNlICclcyciKQogICAgJSBqb3VybmFsLnN0cmluZygpICUgZmlsZW5h
bWUuc3RyaW5nKCkpOwoKICBzcWxpdGUgKnMgPSBzcWwodHJ1ZSk7CiAgSShzICE9IE5VTEwp
Owp9CgoKc3RydWN0IApkdW1wX3JlcXVlc3QKewogIGR1bXBfcmVxdWVzdCgpIHt9OwogIHN0
cnVjdCBzcWxpdGUgKnNxbDsKICBzdHJpbmcgdGFibGVfbmFtZTsKICBvc3RyZWFtICpvdXQ7
Cn07CgpzdGF0aWMgaW50IApkdW1wX3Jvd19jYih2b2lkICpkYXRhLCBpbnQgbiwgY2hhciAq
KnZhbHMsIGNoYXIgKipjb2xzKQp7CiAgZHVtcF9yZXF1ZXN0ICpkdW1wID0gcmVpbnRlcnBy
ZXRfY2FzdDxkdW1wX3JlcXVlc3QgKj4oZGF0YSk7CiAgSShkdW1wICE9IE5VTEwpOwogIEko
dmFscyAhPSBOVUxMKTsKICBJKGR1bXAtPm91dCAhPSBOVUxMKTsKICAqKGR1bXAtPm91dCkg
PDwgRigiSU5TRVJUIElOVE8gJXMgVkFMVUVTKCIpICUgZHVtcC0+dGFibGVfbmFtZTsKICBm
b3IgKGludCBpID0gMDsgaSA8IG47ICsraSkKICAgIHsKICAgICAgaWYgKGkgIT0gMCkKCSoo
ZHVtcC0+b3V0KSA8PCAnLCc7CgogICAgICBpZiAodmFsc1tpXSA9PSBOVUxMKQoJKihkdW1w
LT5vdXQpIDw8ICJOVUxMIjsKICAgICAgZWxzZQoJewoJICAqKGR1bXAtPm91dCkgPDwgIici
OwoJICBmb3IgKGNoYXIgKmNwID0gdmFsc1tpXTsgKmNwOyArK2NwKQoJICAgIHsKCSAgICAg
IGlmICgqY3AgPT0gJ1wnJykKCQkqKGR1bXAtPm91dCkgPDwgIicnIjsKCSAgICAgIGVsc2UK
CQkqKGR1bXAtPm91dCkgPDwgKmNwOwoJICAgIH0KCSAgKihkdW1wLT5vdXQpIDw8ICInIjsK
CX0KICAgIH0KICAqKGR1bXAtPm91dCkgPDwgIik7XG4iOyAgCiAgcmV0dXJuIDA7Cn0KCnN0
YXRpYyBpbnQgCmR1bXBfdGFibGVfY2Iodm9pZCAqZGF0YSwgaW50IG4sIGNoYXIgKip2YWxz
LCBjaGFyICoqY29scykKewogIGR1bXBfcmVxdWVzdCAqZHVtcCA9IHJlaW50ZXJwcmV0X2Nh
c3Q8ZHVtcF9yZXF1ZXN0ICo+KGRhdGEpOwogIEkoZHVtcCAhPSBOVUxMKTsKICBJKGR1bXAt
PnNxbCAhPSBOVUxMKTsKICBJKHZhbHMgIT0gTlVMTCk7CiAgSSh2YWxzWzBdICE9IE5VTEwp
OwogIEkodmFsc1sxXSAhPSBOVUxMKTsKICBJKHZhbHNbMl0gIT0gTlVMTCk7CiAgSShuID09
IDMpOwogIGlmIChzdHJpbmcodmFsc1sxXSkgPT0gInRhYmxlIikKICAgIHsKICAgICAgKihk
dW1wLT5vdXQpIDw8IHZhbHNbMl0gPDwgIjtcbiI7CiAgICAgIGR1bXAtPnRhYmxlX25hbWUg
PSBzdHJpbmcodmFsc1swXSk7CiAgICAgIHNxbGl0ZV9leGVjX3ByaW50ZihkdW1wLT5zcWws
ICJTRUxFQ1QgKiBGUk9NICclcSciLCAKCQkJIGR1bXBfcm93X2NiLCBkYXRhLCBOVUxMLCB2
YWxzWzBdKTsKICAgIH0KICByZXR1cm4gMDsKfQoKdm9pZCAKZGF0YWJhc2U6OmR1bXAob3N0
cmVhbSAmIG91dCkKewogIGR1bXBfcmVxdWVzdCByZXE7CiAgcmVxLm91dCA9ICZvdXQ7CiAg
cmVxLnNxbCA9IHNxbCgpOwogIG91dCA8PCAiQkVHSU4gVFJBTlNBQ1RJT047XG4iOwogIGlu
dCByZXMgPSBzcWxpdGVfZXhlYyhyZXEuc3FsLAoJCQkiU0VMRUNUIG5hbWUsIHR5cGUsIHNx
bCBGUk9NIHNxbGl0ZV9tYXN0ZXIgIgoJCQkiV0hFUkUgdHlwZT0ndGFibGUnIEFORCBzcWwg
Tk9UIE5VTEwgIgoJCQkiT1JERVIgQlkgc3Vic3RyKHR5cGUsMiwxKSwgbmFtZSIsCgkJCWR1
bXBfdGFibGVfY2IsICZyZXEsIE5VTEwpOwogIEkocmVzID09IFNRTElURV9PSyk7CiAgb3V0
IDw8ICJDT01NSVQ7XG4iOwp9Cgp2b2lkIApkYXRhYmFzZTo6bG9hZChpc3RyZWFtICYgaW4p
CnsKICBjaGFyIGJ1Zltjb25zdGFudHM6OmJ1ZnN6XTsKICBzdHJpbmcgdG1wOwoKICBOKGZp
bGVuYW1lLnN0cmluZygpICE9ICIiLAogICAgRigibmVlZCBkYXRhYmFzZSBuYW1lIikpOwog
IGNoYXIgKiBlcnJtc2cgPSBOVUxMOwogIF9fc3FsID0gc3FsaXRlX29wZW4oZmlsZW5hbWUu
c3RyaW5nKCkuY19zdHIoKSwgMDc1NSwgJmVycm1zZyk7CiAgaWYgKCEgX19zcWwpCiAgICB0
aHJvdyBvb3BzKHN0cmluZygiY291bGQgbm90IG9wZW4gZGF0YWJhc2U6ICIpICsgZmlsZW5h
bWUuc3RyaW5nKCkgKyAKCSAgICAgICAoZXJybXNnID8gKCI6ICIgKyBzdHJpbmcoZXJybXNn
KSkgOiAiIikpOwogIAogIHdoaWxlKGluKQogICAgewogICAgICBpbi5yZWFkKGJ1ZiwgY29u
c3RhbnRzOjpidWZzeik7CiAgICAgIHRtcC5hcHBlbmQoYnVmLCBpbi5nY291bnQoKSk7CiAg
ICB9CgogIGV4ZWN1dGUodG1wLmNfc3RyKCkpOwp9CgoKdm9pZCAKZGF0YWJhc2U6OmRlYnVn
KHN0cmluZyBjb25zdCAmIHNxbCwgb3N0cmVhbSAmIG91dCkKewogIHJlc3VsdHMgcmVzOwog
IGZldGNoKHJlcywgYW55X2NvbHMsIGFueV9yb3dzLCBzcWwuY19zdHIoKSk7CiAgb3V0IDw8
ICInIiA8PCBzcWwgPDwgIicgLT4gIiA8PCByZXMuc2l6ZSgpIDw8ICIgcm93c1xuIiA8PCBl
bmRsOwogIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzLnNpemUoKTsgKytpKQogICAgewog
ICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHJlc1tpXS5zaXplKCk7ICsraikKCXsKCSAg
aWYgKGogIT0gMCkKCSAgICBvdXQgPDwgIiB8ICI7CgkgIG91dCA8PCByZXNbaV1bal07Cgl9
CiAgICAgIG91dCA8PCBlbmRsOwogICAgfQp9Cgp1bnNpZ25lZCBsb25nIApkYXRhYmFzZTo6
Z2V0X3N0YXRpc3RpYyhzdHJpbmcgY29uc3QgJiBxdWVyeSkKewogIHJlc3VsdHMgcmVzOwog
IGZldGNoKHJlcywgMSwgMSwgcXVlcnkuY19zdHIoKSk7CiAgcmV0dXJuIGxleGljYWxfY2Fz
dDx1bnNpZ25lZCBsb25nPihyZXNbMF1bMF0pOwp9Cgp2b2lkIApkYXRhYmFzZTo6aW5mbyhv
c3RyZWFtICYgb3V0KQp7CiAgc3RyaW5nIGlkOwogIGNhbGN1bGF0ZV9zY2hlbWFfaWQoc3Fs
KCksIGlkKTsKICBvdXQgPDwgInNjaGVtYSB2ZXJzaW9uICA6ICIgPDwgaWQgPDwgZW5kbDsK
ICBvdXQgPDwgImZ1bGwgbWFuaWZlc3RzICA6ICIgPDwgZ2V0X3N0YXRpc3RpYygiU0VMRUNU
IENPVU5UKCopIEZST00gbWFuaWZlc3RzIikgPDwgZW5kbDsKICBvdXQgPDwgIm1hbmlmZXN0
IGRlbHRhcyA6ICIgPDwgZ2V0X3N0YXRpc3RpYygiU0VMRUNUIENPVU5UKCopIEZST00gbWFu
aWZlc3RfZGVsdGFzIikgPDwgZW5kbDsKICBvdXQgPDwgImZ1bGwgZmlsZXMgICAgICA6ICIg
PDwgZ2V0X3N0YXRpc3RpYygiU0VMRUNUIENPVU5UKCopIEZST00gZmlsZXMiKSA8PCBlbmRs
OwogIG91dCA8PCAiZmlsZSBkZWx0YXMgICAgIDogIiA8PCBnZXRfc3RhdGlzdGljKCJTRUxF
Q1QgQ09VTlQoKikgRlJPTSBmaWxlX2RlbHRhcyIpIDw8IGVuZGw7Cn0KCnZvaWQgCmRhdGFi
YXNlOjp2ZXJzaW9uKG9zdHJlYW0gJiBvdXQpCnsKICBzdHJpbmcgaWQ7CiAgY2FsY3VsYXRl
X3NjaGVtYV9pZChzcWwoKSwgaWQpOwogIG91dCA8PCAiZGF0YWJhc2Ugc2NoZW1hIHZlcnNp
b246ICIgPDwgaWQgPDwgZW5kbDsKfQoKdm9pZCAKZGF0YWJhc2U6Om1pZ3JhdGUoKQp7ICAK
ICBOKGZpbGVuYW1lLnN0cmluZygpICE9ICIiLAogICAgRigibmVlZCBkYXRhYmFzZSBuYW1l
IikpOwogIGNoYXIgKiBlcnJtc2cgPSBOVUxMOwogIF9fc3FsID0gc3FsaXRlX29wZW4oZmls
ZW5hbWUuc3RyaW5nKCkuY19zdHIoKSwgMDc1NSwgJmVycm1zZyk7CiAgaWYgKCEgX19zcWwp
CiAgICB0aHJvdyBvb3BzKHN0cmluZygiY291bGQgbm90IG9wZW4gZGF0YWJhc2U6ICIpICsg
ZmlsZW5hbWUuc3RyaW5nKCkgKyAKCSAgICAgICAoZXJybXNnID8gKCI6ICIgKyBzdHJpbmco
ZXJybXNnKSkgOiAiIikpOwogIG1pZ3JhdGVfbW9ub3RvbmVfc2NoZW1hKF9fc3FsKTsKICBz
cWxpdGVfY2xvc2UoX19zcWwpOwp9Cgp2b2lkIApkYXRhYmFzZTo6cmVoYXNoKCkKewogIHRy
YW5zYWN0aW9uX2d1YXJkIGd1YXJkKCp0aGlzKTsKICB0aWNrZXIgbWNlcnRzKCJtY2VydHMi
LCAibSIsIDEpOwogIHRpY2tlciBmY2VydHMoImZjZXJ0cyIsICJmIiwgMSk7CiAgdGlja2Vy
IHB1YmtleXMoInB1YmtleXMiLCAiKyIsIDEpOwogIHRpY2tlciBwcml2a2V5cygicHJpdmtl
eXMiLCAiISIsIDEpOwogIAogIHsKICAgIC8vIHJlaGFzaCBhbGwgbWNlcnRzCiAgICByZXN1
bHRzIHJlczsKICAgIHZlY3RvcjxjZXJ0PiBjZXJ0czsKICAgIGZldGNoKHJlcywgNSwgYW55
X3Jvd3MsIAoJICAiU0VMRUNUIGlkLCBuYW1lLCB2YWx1ZSwga2V5cGFpciwgc2lnbmF0dXJl
ICIKCSAgIkZST00gbWFuaWZlc3RfY2VydHMiKTsKICAgIHJlc3VsdHNfdG9fY2VydHMocmVz
LCBjZXJ0cyk7CiAgICBleGVjdXRlKCJERUxFVEUgRlJPTSBtYW5pZmVzdF9jZXJ0cyIpOwog
ICAgZm9yKHZlY3RvcjxjZXJ0Pjo6Y29uc3RfaXRlcmF0b3IgaSA9IGNlcnRzLmJlZ2luKCk7
IGkgIT0gY2VydHMuZW5kKCk7ICsraSkKICAgICAgewoJcHV0X2NlcnQoKmksICJtYW5pZmVz
dF9jZXJ0cyIpOwoJKyttY2VydHM7CiAgICAgIH0KICB9CgogIHsKICAgIC8vIHJlaGFzaCBh
bGwgZmNlcnRzCiAgICByZXN1bHRzIHJlczsKICAgIHZlY3RvcjxjZXJ0PiBjZXJ0czsgICAg
CiAgICBmZXRjaChyZXMsIDUsIGFueV9yb3dzLCAKCSAgIlNFTEVDVCBpZCwgbmFtZSwgdmFs
dWUsIGtleXBhaXIsIHNpZ25hdHVyZSAiCgkgICJGUk9NIGZpbGVfY2VydHMiKTsKICAgIHJl
c3VsdHNfdG9fY2VydHMocmVzLCBjZXJ0cyk7CiAgICBleGVjdXRlKCJERUxFVEUgRlJPTSBm
aWxlX2NlcnRzIik7CiAgICBmb3IodmVjdG9yPGNlcnQ+Ojpjb25zdF9pdGVyYXRvciBpID0g
Y2VydHMuYmVnaW4oKTsgaSAhPSBjZXJ0cy5lbmQoKTsgKytpKQogICAgICB7CglwdXRfY2Vy
dCgqaSwgImZpbGVfY2VydHMiKTsKCSsrZmNlcnRzOwogICAgICB9CiAgfQogIAoKICB7CiAg
ICAvLyByZWhhc2ggYWxsIHB1YmtleXMKICAgIHJlc3VsdHMgcmVzOwogICAgZmV0Y2gocmVz
LCAyLCBhbnlfcm93cywgIlNFTEVDVCBpZCwga2V5ZGF0YSBGUk9NIHB1YmxpY19rZXlzIik7
CiAgICBleGVjdXRlKCJERUxFVEUgRlJPTSBwdWJsaWNfa2V5cyIpOwogICAgZm9yIChzaXpl
X3QgaSA9IDA7IGkgPCByZXMuc2l6ZSgpOyArK2kpCiAgICAgIHsKCWhleGVuYzxpZD4gdG1w
OwoJa2V5X2hhc2hfY29kZShyc2Ffa2V5cGFpcl9pZChyZXNbaV1bMF0pLCBiYXNlNjQ8cnNh
X3B1Yl9rZXk+KHJlc1tpXVsxXSksIHRtcCk7CglleGVjdXRlKCJJTlNFUlQgSU5UTyBwdWJs
aWNfa2V5cyBWQUxVRVMoJyVxJywgJyVxJywgJyVxJykiLCAKCQl0bXAoKS5jX3N0cigpLCBy
ZXNbaV1bMF0uY19zdHIoKSwgcmVzW2ldWzFdLmNfc3RyKCkpOwoJKytwdWJrZXlzOwogICAg
ICB9CiAgfQoKewogICAgLy8gcmVoYXNoIGFsbCBwcml2a2V5cwogICAgcmVzdWx0cyByZXM7
CiAgICBmZXRjaChyZXMsIDIsIGFueV9yb3dzLCAiU0VMRUNUIGlkLCBrZXlkYXRhIEZST00g
cHJpdmF0ZV9rZXlzIik7CiAgICBleGVjdXRlKCJERUxFVEUgRlJPTSBwcml2YXRlX2tleXMi
KTsKICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzLnNpemUoKTsgKytpKQogICAgICB7
CgloZXhlbmM8aWQ+IHRtcDsKCWtleV9oYXNoX2NvZGUocnNhX2tleXBhaXJfaWQocmVzW2ld
WzBdKSwgYmFzZTY0PCBhcmM0PHJzYV9wcml2X2tleT4gPihyZXNbaV1bMV0pLCB0bXApOwoJ
ZXhlY3V0ZSgiSU5TRVJUIElOVE8gcHJpdmF0ZV9rZXlzIFZBTFVFUygnJXEnLCAnJXEnLCAn
JXEnKSIsIAoJCXRtcCgpLmNfc3RyKCksIHJlc1tpXVswXS5jX3N0cigpLCByZXNbaV1bMV0u
Y19zdHIoKSk7CgkrK3ByaXZrZXlzOwogICAgICB9CiAgfQoKICBndWFyZC5jb21taXQoKTsK
fQoKdm9pZCAKZGF0YWJhc2U6OmVuc3VyZV9vcGVuKCkKewogIHNxbGl0ZSAqcyA9IHNxbCgp
OwogIEkocyAhPSBOVUxMKTsKfQoKZGF0YWJhc2U6On5kYXRhYmFzZSgpIAp7CiAgaWYgKF9f
c3FsKQogICAgewogICAgICBzcWxpdGVfY2xvc2UoX19zcWwpOwogICAgICBfX3NxbCA9IDA7
CiAgICB9Cn0KCnN0YXRpYyB2b2lkIAphc3NlcnRfc3FsaXRlX29rKGludCByZXMpCnsKICBz
d2l0Y2ggKHJlcykKICAgIHsgICAgICAKICAgIGNhc2UgU1FMSVRFX09LOiAKICAgICAgYnJl
YWs7CgogICAgY2FzZSBTUUxJVEVfRVJST1I6CiAgICAgIHRocm93IG9vcHMoIlNRTCBlcnJv
ciBvciBtaXNzaW5nIGRhdGFiYXNlIik7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgU1FMSVRF
X0lOVEVSTkFMOgogICAgICB0aHJvdyBvb3BzKCJBbiBpbnRlcm5hbCBsb2dpYyBlcnJvciBp
biBTUUxpdGUiKTsKICAgICAgYnJlYWs7CgogICAgY2FzZSBTUUxJVEVfUEVSTToKICAgICAg
dGhyb3cgb29wcygiQWNjZXNzIHBlcm1pc3Npb24gZGVuaWVkIik7CiAgICAgIGJyZWFrOwoK
ICAgIGNhc2UgU1FMSVRFX0FCT1JUOgogICAgICB0aHJvdyBvb3BzKCJDYWxsYmFjayByb3V0
aW5lIHJlcXVlc3RlZCBhbiBhYm9ydCIpOwogICAgICBicmVhazsKCiAgICBjYXNlIFNRTElU
RV9CVVNZOgogICAgICB0aHJvdyBvb3BzKCJUaGUgZGF0YWJhc2UgZmlsZSBpcyBsb2NrZWQi
KTsKICAgICAgYnJlYWs7CgogICAgY2FzZSBTUUxJVEVfTE9DS0VEOgogICAgICB0aHJvdyBv
b3BzKCJBIHRhYmxlIGluIHRoZSBkYXRhYmFzZSBpcyBsb2NrZWQiKTsKICAgICAgYnJlYWs7
CgogICAgY2FzZSBTUUxJVEVfTk9NRU06CiAgICAgIHRocm93IG9vcHMoIkEgbWFsbG9jKCkg
ZmFpbGVkIik7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgU1FMSVRFX1JFQURPTkxZOgogICAg
ICB0aHJvdyBvb3BzKCJBdHRlbXB0IHRvIHdyaXRlIGEgcmVhZG9ubHkgZGF0YWJhc2UiKTsK
ICAgICAgYnJlYWs7CgogICAgY2FzZSBTUUxJVEVfSU5URVJSVVBUOgogICAgICB0aHJvdyBv
b3BzKCJPcGVyYXRpb24gdGVybWluYXRlZCBieSBzcWxpdGVfaW50ZXJydXB0KCkiKTsKICAg
ICAgYnJlYWs7CgogICAgY2FzZSBTUUxJVEVfSU9FUlI6CiAgICAgIHRocm93IG9vcHMoIlNv
bWUga2luZCBvZiBkaXNrIEkvTyBlcnJvciBvY2N1cnJlZCIpOwogICAgICBicmVhazsKCiAg
ICBjYXNlIFNRTElURV9DT1JSVVBUOgogICAgICB0aHJvdyBvb3BzKCJUaGUgZGF0YWJhc2Ug
ZGlzayBpbWFnZSBpcyBtYWxmb3JtZWQiKTsKICAgICAgYnJlYWs7CgogICAgY2FzZSBTUUxJ
VEVfTk9URk9VTkQ6CiAgICAgIHRocm93IG9vcHMoIihJbnRlcm5hbCBPbmx5KSBUYWJsZSBv
ciByZWNvcmQgbm90IGZvdW5kIik7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgU1FMSVRFX0ZV
TEw6CiAgICAgIHRocm93IG9vcHMoIkluc2VydGlvbiBmYWlsZWQgYmVjYXVzZSBkYXRhYmFz
ZSBpcyBmdWxsIik7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgU1FMSVRFX0NBTlRPUEVOOgog
ICAgICB0aHJvdyBvb3BzKCJVbmFibGUgdG8gb3BlbiB0aGUgZGF0YWJhc2UgZmlsZSIpOwog
ICAgICBicmVhazsKCiAgICBjYXNlIFNRTElURV9QUk9UT0NPTDoKICAgICAgdGhyb3cgb29w
cygiZGF0YWJhc2UgbG9jayBwcm90b2NvbCBlcnJvciIpOwogICAgICBicmVhazsKCiAgICBj
YXNlIFNRTElURV9FTVBUWToKICAgICAgdGhyb3cgb29wcygiKEludGVybmFsIE9ubHkpIGRh
dGFiYXNlIHRhYmxlIGlzIGVtcHR5Iik7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgU1FMSVRF
X1NDSEVNQToKICAgICAgdGhyb3cgb29wcygiVGhlIGRhdGFiYXNlIHNjaGVtYSBjaGFuZ2Vk
Iik7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgU1FMSVRFX1RPT0JJRzoKICAgICAgdGhyb3cg
b29wcygiVG9vIG11Y2ggZGF0YSBmb3Igb25lIHJvdyBvZiBhIHRhYmxlIik7CiAgICAgIGJy
ZWFrOwoKICAgIGNhc2UgU1FMSVRFX0NPTlNUUkFJTlQ6CiAgICAgIHRocm93IG9vcHMoIkFi
b3J0IGR1ZSB0byBjb250cmFpbnQgdmlvbGF0aW9uIik7CiAgICAgIGJyZWFrOwoKICAgIGNh
c2UgU1FMSVRFX01JU01BVENIOgogICAgICB0aHJvdyBvb3BzKCJEYXRhIHR5cGUgbWlzbWF0
Y2giKTsKICAgICAgYnJlYWs7CgogICAgY2FzZSBTUUxJVEVfTUlTVVNFOgogICAgICB0aHJv
dyBvb3BzKCJMaWJyYXJ5IHVzZWQgaW5jb3JyZWN0bHkiKTsKICAgICAgYnJlYWs7CgogICAg
ZGVmYXVsdDoKICAgICAgdGhyb3cgb29wcyhzdHJpbmcoIlVua25vd24gREIgcmVzdWx0IGNv
ZGU6ICIpICsgbGV4aWNhbF9jYXN0PHN0cmluZz4ocmVzKSk7CiAgICAgIGJyZWFrOwogICAg
fQp9Cgp2b2lkIApkYXRhYmFzZTo6ZXhlY3V0ZShjaGFyIGNvbnN0ICogcXVlcnksIC4uLikK
ewogIHZhX2xpc3QgYXA7CiAgaW50IHJlczsKICBjaGFyICogZXJybXNnID0gTlVMTDsKCiAg
dmFfc3RhcnQoYXAsIHF1ZXJ5KTsKCiAgLy8gbG9nIGl0CiAgY2hhciAqIGZvcm1hdHRlZCA9
IHNxbGl0ZV92bXByaW50ZihxdWVyeSwgYXApOwogIHN0cmluZyBxcShmb3JtYXR0ZWQpOwog
IGlmIChxcS5zaXplKCkgPiBjb25zdGFudHM6OmRiX2xvZ19saW5lX3N6KSAKICAgIHFxID0g
cXEuc3Vic3RyKDAsIGNvbnN0YW50czo6ZGJfbG9nX2xpbmVfc3opICsgc3RyaW5nKCIgLi4u
Iik7CiAgTChGKCJkYi5leGVjdXRlKFwiJXNcIilcbiIpICUgcXEpOwogIHNxbGl0ZV9mcmVl
bWVtKGZvcm1hdHRlZCk7CgogIHZhX2VuZChhcCk7CiAgdmFfc3RhcnQoYXAsIHF1ZXJ5KTsK
CiAgLy8gZG8gaXQKICByZXMgPSBzcWxpdGVfZXhlY192cHJpbnRmKHNxbCgpLCBxdWVyeSwg
TlVMTCwgTlVMTCwgJmVycm1zZywgYXApOwoKICB2YV9lbmQoYXApOwoKICBpZiAoZXJybXNn
KQogICAgdGhyb3cgb29wcyhzdHJpbmcoInNxbGl0ZSBleGVjIGVycm9yICIpICsgZXJybXNn
KTsKCiAgYXNzZXJ0X3NxbGl0ZV9vayhyZXMpOwoKfQoKdm9pZCAKZGF0YWJhc2U6OmZldGNo
KHJlc3VsdHMgJiByZXMsIAoJCWludCBjb25zdCB3YW50X2NvbHMsIAoJCWludCBjb25zdCB3
YW50X3Jvd3MsIAoJCWNoYXIgY29uc3QgKiBxdWVyeSwgLi4uKQp7CiAgY2hhciAqKiByZXN1
bHQgPSBOVUxMOwogIGludCBucm93OwogIGludCBuY29sOwogIGNoYXIgKiBlcnJtc2cgPSBO
VUxMOwogIGludCByZXNjb2RlOwoKICB2YV9saXN0IGFwOwogIHJlcy5jbGVhcigpOwogIHJl
cy5yZXNpemUoMCk7CiAgdmFfc3RhcnQoYXAsIHF1ZXJ5KTsKCiAgLy8gbG9nIGl0CiAgY2hh
ciAqIGZvcm1hdHRlZCA9IHNxbGl0ZV92bXByaW50ZihxdWVyeSwgYXApOwogIHN0cmluZyBx
cShmb3JtYXR0ZWQpOwogIGlmIChxcS5zaXplKCkgPiBjb25zdGFudHM6OmxvZ19saW5lX3N6
KSAKICAgIHFxID0gcXEuc3Vic3RyKDAsIGNvbnN0YW50czo6bG9nX2xpbmVfc3opICsgc3Ry
aW5nKCIgLi4uIik7CiAgTChGKCJkYi5mZXRjaChcIiVzXCIpXG4iKSAlIHFxKTsKICBzcWxp
dGVfZnJlZW1lbShmb3JtYXR0ZWQpOwoKICB2YV9lbmQoYXApOwogIHZhX3N0YXJ0KGFwLCBx
dWVyeSk7CgogIC8vIGRvIGl0CiAgcmVzY29kZSA9IHNxbGl0ZV9nZXRfdGFibGVfdnByaW50
ZihzcWwoKSwgcXVlcnksICZyZXN1bHQsICZucm93LCAmbmNvbCwgJmVycm1zZywgYXApOwoK
ICB2YV9lbmQoYXApOwoKICBjbGVhbnVwX3B0cjxjaGFyICoqLCB2b2lkPiAKICAgIHJlc3Vs
dF9ndWFyZChyZXN1bHQsICZzcWxpdGVfZnJlZV90YWJsZSk7CgogIHN0cmluZyBjdHggPSBz
dHJpbmcoImRiIHF1ZXJ5IFsiKSArIHN0cmluZyhxdWVyeSkgKyAiXTogIjsKCiAgaWYgKGVy
cm1zZykKICAgIHRocm93IG9vcHMoY3R4ICsgc3RyaW5nKCJzcWxpdGUgZXJyb3IgIikgKyBl
cnJtc2cpOwogIGFzc2VydF9zcWxpdGVfb2socmVzY29kZSk7CgogIGlmICh3YW50X2NvbHMg
PT0gMCAmJiBuY29sID09IDApIHJldHVybjsKICBpZiAod2FudF9yb3dzID09IDAgJiYgbnJv
dyA9PSAwKSByZXR1cm47CiAgaWYgKHdhbnRfY29scyA9PSBhbnlfcm93cyAmJiBuY29sID09
IDApIHJldHVybjsKICBpZiAod2FudF9yb3dzID09IGFueV9yb3dzICYmIG5yb3cgPT0gMCkg
cmV0dXJuOwoKICBpZiAod2FudF9jb2xzICE9IGFueV9jb2xzICYmCiAgICAgIG5jb2wgIT0g
d2FudF9jb2xzKQogICAgdGhyb3cgb29wcygoRigiJXMgd2FudGVkICVkIGNvbHVtbnMsIGdv
dCAlcyIpCgkJJSBjdHggJSB3YW50X2NvbHMgJSBuY29sKS5zdHIoKSk7CgogIGlmICh3YW50
X3Jvd3MgIT0gYW55X3Jvd3MgJiYKICAgICAgbnJvdyAhPSB3YW50X3Jvd3MpCiAgICB0aHJv
dyBvb3BzKChGKCIlcyB3YW50ZWQgJWQgcm93cywgZ290ICVzIikKCQklIGN0eCAlIHdhbnRf
cm93cyAlIG5yb3cpLnN0cigpKTsKCiAgaWYgKCFyZXN1bHQpCiAgICB0aHJvdyBvb3BzKGN0
eCArICJudWxsIHJlc3VsdCBzZXQiKTsKCiAgZm9yIChpbnQgaSA9IDA7IGkgPCBuY29sOyAr
K2kpIAogICAgaWYgKCFyZXN1bHRbaV0pCiAgICAgIHRocm93IG9vcHMoY3R4ICsgIm51bGwg
Y29sdW1uIG5hbWUiKTsKCiAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbnJvdzsgKytyb3cp
IAogICAgewogICAgICB2ZWN0b3I8c3RyaW5nPiByb3d2ZWM7CiAgICAgIGZvciAoaW50IGNv
bCA9IDA7IGNvbCA8IG5jb2w7ICsrY29sKQoJewoJICBpbnQgaSA9ICgoMSArIHJvdykgKiBu
Y29sKSArIGNvbDsKCSAgaWYgKCFyZXN1bHRbaV0pCgkgICAgdGhyb3cgb29wcyhjdHggKyAi
bnVsbCByZXN1bHQgdmFsdWUiKTsKCSAgZWxzZQoJICAgIHJvd3ZlYy5wdXNoX2JhY2socmVz
dWx0W2ldKTsKCX0KICAgICAgcmVzLnB1c2hfYmFjayhyb3d2ZWMpOwogICAgfQp9CgovLyBn
ZW5lcmFsIGFwcGxpY2F0aW9uLWxldmVsIGxvZ2ljCgp2b2lkIApkYXRhYmFzZTo6c2V0X2Zp
bGVuYW1lKGZzOjpwYXRoIGNvbnN0ICYgZmlsZSkKewogIGlmIChfX3NxbCkKICAgIHsKICAg
ICAgdGhyb3cgb29wcygiY2Fubm90IGNoYW5nZSBmaWxlbmFtZSB0byAiICsgZmlsZS5zdHJp
bmcoKSArICIgd2hpbGUgZGIgaXMgb3BlbiIpOwogICAgfQogIGZpbGVuYW1lID0gZmlsZTsK
fQoKdm9pZCAKZGF0YWJhc2U6OmJlZ2luX3RyYW5zYWN0aW9uKCkgCnsKICBpZiAodHJhbnNh
Y3Rpb25fbGV2ZWwgPT0gMCkKICAgICAgZXhlY3V0ZSgiQkVHSU4iKTsKICB0cmFuc2FjdGlv
bl9sZXZlbCsrOwp9Cgp2b2lkIApkYXRhYmFzZTo6Y29tbWl0X3RyYW5zYWN0aW9uKCkKewog
IGlmICh0cmFuc2FjdGlvbl9sZXZlbCA9PSAxKQogICAgZXhlY3V0ZSgiQ09NTUlUIik7CiAg
dHJhbnNhY3Rpb25fbGV2ZWwtLTsKfQoKdm9pZCAKZGF0YWJhc2U6OnJvbGxiYWNrX3RyYW5z
YWN0aW9uKCkKewogIGlmICh0cmFuc2FjdGlvbl9sZXZlbCA9PSAxKQogICAgZXhlY3V0ZSgi
Uk9MTEJBQ0siKTsKICB0cmFuc2FjdGlvbl9sZXZlbC0tOwp9CgoKYm9vbCAKZGF0YWJhc2U6
OmV4aXN0cyhoZXhlbmM8aWQ+IGNvbnN0ICYgaWRlbnQsCgkJICAgICAgc3RyaW5nIGNvbnN0
ICYgdGFibGUpCnsKICByZXN1bHRzIHJlczsKICBmZXRjaChyZXMsIG9uZV9jb2wsIGFueV9y
b3dzLCAKCSJTRUxFQ1QgaWQgRlJPTSAnJXEnIFdIRVJFIGlkID0gJyVxJyIsCgl0YWJsZS5j
X3N0cigpLCBpZGVudCgpLmNfc3RyKCkpOwogIEkoKHJlcy5zaXplKCkgPT0gMSkgfHwgKHJl
cy5zaXplKCkgPT0gMCkpOwogIHJldHVybiByZXMuc2l6ZSgpID09IDE7Cn0KCgpib29sIApk
YXRhYmFzZTo6ZGVsdGFfZXhpc3RzKGhleGVuYzxpZD4gY29uc3QgJiBpZGVudCwKCQkgICAg
ICAgc3RyaW5nIGNvbnN0ICYgdGFibGUpCnsKICByZXN1bHRzIHJlczsKICBmZXRjaChyZXMs
IG9uZV9jb2wsIGFueV9yb3dzLCAKCSJTRUxFQ1QgaWQgRlJPTSAnJXEnIFdIRVJFIGlkID0g
JyVxJyIsCgl0YWJsZS5jX3N0cigpLCBpZGVudCgpLmNfc3RyKCkpOwogIHJldHVybiByZXMu
c2l6ZSgpID4gMDsKfQoKYm9vbCAKZGF0YWJhc2U6OmRlbHRhX2V4aXN0cyhoZXhlbmM8aWQ+
IGNvbnN0ICYgaWRlbnQsCgkJICAgICAgIGhleGVuYzxpZD4gY29uc3QgJiBiYXNlLAoJCSAg
ICAgICBzdHJpbmcgY29uc3QgJiB0YWJsZSkKewogIHJlc3VsdHMgcmVzOwogIGZldGNoKHJl
cywgb25lX2NvbCwgYW55X3Jvd3MsIAoJIlNFTEVDVCBpZCBGUk9NICclcScgV0hFUkUgaWQg
PSAnJXEnIEFORCBiYXNlID0gJyVxJyIsCgl0YWJsZS5jX3N0cigpLCBpZGVudCgpLmNfc3Ry
KCksIGJhc2UoKS5jX3N0cigpKTsKICBJKChyZXMuc2l6ZSgpID09IDEpIHx8IChyZXMuc2l6
ZSgpID09IDApKTsKICByZXR1cm4gcmVzLnNpemUoKSA9PSAxOwp9CgppbnQgCmRhdGFiYXNl
Ojpjb3VudChzdHJpbmcgY29uc3QgJiB0YWJsZSkKewogIHJlc3VsdHMgcmVzOwogIGZldGNo
KHJlcywgb25lX2NvbCwgb25lX3JvdywgCgkiU0VMRUNUIENPVU5UKCopIEZST00gJyVxJyIs
IAoJdGFibGUuY19zdHIoKSk7CiAgcmV0dXJuIGxleGljYWxfY2FzdDxpbnQ+KHJlc1swXVsw
XSk7ICAKfQoKdm9pZCAKZGF0YWJhc2U6OmdldChoZXhlbmM8aWQ+IGNvbnN0ICYgaWRlbnQs
CgkgICAgICBiYXNlNjQ8IGd6aXA8ZGF0YT4gPiAmIGRhdCwKCSAgICAgIHN0cmluZyBjb25z
dCAmIHRhYmxlKQp7CiAgcmVzdWx0cyByZXM7CiAgZmV0Y2gocmVzLCBvbmVfY29sLCBvbmVf
cm93LAoJIlNFTEVDVCBkYXRhIEZST00gJyVxJyBXSEVSRSBpZCA9ICclcSciLCAKCXRhYmxl
LmNfc3RyKCksIGlkZW50KCkuY19zdHIoKSk7CgogIC8vIGNvbnNpc3RlbmN5IGNoZWNrCiAg
YmFzZTY0PGd6aXA8ZGF0YT4gPiByZGF0YShyZXNbMF1bMF0pOwogIGhleGVuYzxpZD4gdGlk
OwogIGNhbGN1bGF0ZV9pZGVudChyZGF0YSwgdGlkKTsKICBJKHRpZCA9PSBpZGVudCk7Cgog
IGRhdCA9IHJkYXRhOwp9Cgp2b2lkIApkYXRhYmFzZTo6Z2V0X2RlbHRhKGhleGVuYzxpZD4g
Y29uc3QgJiBpZGVudCwKCQkgICAgaGV4ZW5jPGlkPiBjb25zdCAmIGJhc2UsCgkJICAgIGJh
c2U2NDwgZ3ppcDxkZWx0YT4gPiAmIGRlbCwKCQkgICAgc3RyaW5nIGNvbnN0ICYgdGFibGUp
CnsKICBJKGlkZW50KCkgIT0gIiIpOwogIEkoYmFzZSgpICE9ICIiKTsKICByZXN1bHRzIHJl
czsKICBmZXRjaChyZXMsIG9uZV9jb2wsIG9uZV9yb3csCgkiU0VMRUNUIGRlbHRhIEZST00g
JyVxJyBXSEVSRSBpZCA9ICclcScgQU5EIGJhc2UgPSAnJXEnIiwgCgl0YWJsZS5jX3N0cigp
LCBpZGVudCgpLmNfc3RyKCksIGJhc2UoKS5jX3N0cigpKTsKICBkZWwgPSByZXNbMF1bMF07
Cn0KCnZvaWQgCmRhdGFiYXNlOjpwdXQoaGV4ZW5jPGlkPiBjb25zdCAmIGlkZW50LAoJICAg
ICAgYmFzZTY0PCBnemlwPGRhdGE+ID4gY29uc3QgJiBkYXQsCgkgICAgICBzdHJpbmcgY29u
c3QgJiB0YWJsZSkKewogIC8vIGNvbnNpc3RlbmN5IGNoZWNrCiAgSShpZGVudCgpICE9ICIi
KTsKICBoZXhlbmM8aWQ+IHRpZDsKICBjYWxjdWxhdGVfaWRlbnQoZGF0LCB0aWQpOwogIEko
dGlkID09IGlkZW50KTsKICAKICBleGVjdXRlKCJJTlNFUlQgSU5UTyAnJXEnIFZBTFVFUygn
JXEnLCAnJXEnKSIsIAoJICB0YWJsZS5jX3N0cigpLCBpZGVudCgpLmNfc3RyKCksIGRhdCgp
LmNfc3RyKCkpOwp9CgoKdm9pZCAKZGF0YWJhc2U6OnB1dF9kZWx0YShoZXhlbmM8aWQ+IGNv
bnN0ICYgaWRlbnQsCgkJICAgIGhleGVuYzxpZD4gY29uc3QgJiBiYXNlLAoJCSAgICBiYXNl
NjQ8Z3ppcDxkZWx0YT4gPiBjb25zdCAmIGRlbCwKCQkgICAgc3RyaW5nIGNvbnN0ICYgdGFi
bGUpCnsKICAvLyBuYjogZGVsdGEgc2NoZW1hIGlzIChpZCwgYmFzZSwgZGVsdGEpCiAgSShp
ZGVudCgpICE9ICIiKTsKICBJKGJhc2UoKSAhPSAiIik7CiAgZXhlY3V0ZSgiSU5TRVJUIElO
VE8gJyVxJyBWQUxVRVMoJyVxJywgJyVxJywgJyVxJykiLCAKCSAgdGFibGUuY19zdHIoKSwg
CgkgIGlkZW50KCkuY19zdHIoKSwgYmFzZSgpLmNfc3RyKCksIGRlbCgpLmNfc3RyKCkpOwp9
Cgp2b2lkIApkYXRhYmFzZTo6Z2V0X3ZlcnNpb24oaGV4ZW5jPGlkPiBjb25zdCAmIGlkZW50
LAoJCSAgICAgIGJhc2U2NDwgZ3ppcDxkYXRhPiA+ICYgZGF0LAoJCSAgICAgIHN0cmluZyBj
b25zdCAmIGRhdGFfdGFibGUsCgkJICAgICAgc3RyaW5nIGNvbnN0ICYgZGVsdGFfdGFibGUp
CnsKICBJKGlkZW50KCkgIT0gIiIpOwogIGlmIChleGlzdHMoaWRlbnQsIGRhdGFfdGFibGUp
KQogICAgewogICAgICAvLyBlYXN5IHBhdGgKICAgICAgZ2V0KGlkZW50LCBkYXQsIGRhdGFf
dGFibGUpOwogICAgfQogIGVsc2UKICAgIHsKICAgICAgLy8gdHJpY2t5IHBhdGgKCiAgICAg
IC8vIHdlIHN0YXJ0IGZyb20gdGhlIGZpbGUgd2Ugd2FudCB0byByZWNvbnN0cnVjdCBhbmQg
d29yayAqZm9yd2FyZHMqCiAgICAgIC8vIHRocm91Z2ggdGhlIGRhdGFiYXNlLCB1bnRpbCB3
ZSBnZXQgdG8gYSBmdWxsIGRhdGEgb2JqZWN0LiB3ZSB0aGVuCiAgICAgIC8vIHRyYWNlIGJh
Y2sgdGhyb3VnaCB0aGUgbGlzdCBvZiBlZGdlcyB3ZSBmb2xsb3dlZCB0byBnZXQgdG8gdGhl
IGRhdGEKICAgICAgLy8gb2JqZWN0LCBhcHBseWluZyByZXZlcnNlIGRlbHRhcy4KICAgICAg
Ly8KICAgICAgLy8gdGhlIGVmZmVjdCBvZiB0aGlzIGFsZ29yaXRobSBpcyBicmVhZHRoLWZp
cnN0IHNlYXJjaCwgYmFja3dhcmRzCiAgICAgIC8vIHRocm91Z2ggdGhlIHN0b3JhZ2UgZ3Jh
cGgsIHRvIGRpc2NvdmVyIGEgZm9yd2FyZHMgc2hvcnRlc3QgcGF0aCwgYW5kCiAgICAgIC8v
IHRoZW4gZm9sbG93aW5nIHRoYXQgc2hvcnRlc3QgcGF0aCB3aXRoIGRlbHRhIGFwcGxpY2F0
aW9uLgogICAgICAvLwogICAgICAvLyB3ZSB1c2VkIHRvIGRvIHRoaXMgd2l0aCB0aGUgYm9v
c3QgZ3JhcGggbGlicmFyeSwgYnV0IGl0IGludm92bGVkCiAgICAgIC8vIGxvYWRpbmcgdG9v
IG11Y2ggb2YgdGhlIHN0b3JhZ2UgZ3JhcGggaW50byBtZW1vcnkgYXQgYW55IG1vbWVudC4g
dGhpcwogICAgICAvLyBpbXBlcmF0aXZlIHZlcnNpb24gb25seSBsb2FkcyB0aGUgZGVzY2Vu
ZGVudHMgb2YgdGhlIHJlY29uc3RydWN0aW9uCiAgICAgIC8vIG5vZGUsIHNvIGl0IG11Y2gg
Y2hlYXBlciBpbiB0ZXJtcyBvZiBtZW1vcnkuCiAgICAgIC8vCiAgICAgIC8vIHdlIGFsc28g
bWFpbnRhaW4gYSBjeWNsZS1kZXRlY3Rpbmcgc2V0LCBqdXN0IHRvIGJlIHNhZmUKICAgICAg
CiAgICAgIEwoRigicmVjb25zdHJ1Y3RpbmcgJXMgaW4gJXNcbiIpICUgaWRlbnQgJSBkZWx0
YV90YWJsZSk7CiAgICAgIEkoZGVsdGFfZXhpc3RzKGlkZW50LCBkZWx0YV90YWJsZSkpOwog
ICAgICAKICAgICAgLy8gbmI6IGFuIGVkZ2UgbWFwIGdvZXMgaW4gdGhlIGRpcmVjdGlvbiBv
ZiB0aGUKICAgICAgLy8gZGVsdGEsICpub3QqIHRoZSBkaXJlY3Rpb24gd2UgZGlzY292ZXIg
dGhpbmdzIGluLAogICAgICAvLyBpLmUuIGVhY2ggbWFwIGlzIG9mIHRoZSBmb3JtIFtuZXdp
ZF0gLT4gW29sZGlkXQoKICAgICAgdHlwZWRlZiBtYXA8IGhleGVuYzxpZD4sIGhleGVuYzxp
ZD4gPiBlZGdlbWFwOwogICAgICBsaXN0PCBzaGFyZWRfcHRyPGVkZ2VtYXA+ID4gcGF0aHM7
CgogICAgICBzZXQ8IGhleGVuYzxpZD4gPiBmcm9udGllciwgY3ljbGVzOwogICAgICBmcm9u
dGllci5pbnNlcnQoaWRlbnQpOwoKICAgICAgYm9vbCBmb3VuZF9yb290ID0gZmFsc2U7CiAg
ICAgIGhleGVuYzxpZD4gcm9vdCgiIik7CgogICAgICB3aGlsZSAoISBmb3VuZF9yb290KQoJ
ewoJICBzZXQ8IGhleGVuYzxpZD4gPiBuZXh0X2Zyb250aWVyOwoJICBzaGFyZWRfcHRyPGVk
Z2VtYXA+IGZyb250aWVyX21hcChuZXcgZWRnZW1hcCgpKTsKCgkgIEkoIWZyb250aWVyLmVt
cHR5KCkpOwoKCSAgZm9yIChzZXQ8IGhleGVuYzxpZD4gPjo6Y29uc3RfaXRlcmF0b3IgaSA9
IGZyb250aWVyLmJlZ2luKCk7CgkgICAgICAgaSAhPSBmcm9udGllci5lbmQoKTsgKytpKQoJ
ICAgIHsKCSAgICAgIGlmIChleGlzdHMoKmksIGRhdGFfdGFibGUpKQoJCXsKCQkgIHJvb3Qg
PSAqaTsKCQkgIGZvdW5kX3Jvb3QgPSB0cnVlOwoJCSAgYnJlYWs7CgkJfQoJICAgICAgZWxz
ZQoJCXsKCQkgIGN5Y2xlcy5pbnNlcnQoKmkpOwoJCSAgcmVzdWx0cyByZXM7CgkJICBmZXRj
aChyZXMsIG9uZV9jb2wsIGFueV9yb3dzLCAiU0VMRUNUIGJhc2UgZnJvbSAnJXEnIFdIRVJF
IGlkID0gJyVxJyIsCgkJCWRlbHRhX3RhYmxlLmNfc3RyKCksICgqaSkoKS5jX3N0cigpKTsK
CQkgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgcmVzLnNpemUoKTsgKytrKQoJCSAgICB7CgkJ
ICAgICAgaGV4ZW5jPGlkPiBjb25zdCBueHQocmVzW2tdWzBdKTsKCgkJICAgICAgaWYgKGN5
Y2xlcy5maW5kKG54dCkgIT0gY3ljbGVzLmVuZCgpKQoJCQl0aHJvdyBvb3BzKCJjeWNsZSBp
biB0YWJsZSAnIiArIGRlbHRhX3RhYmxlICsgIicsIGF0IG5vZGUgIiAKCQkJCSAgICsgKCpp
KSgpICsgIiA8LSAiICsgbnh0KCkpOwoKCQkgICAgICBuZXh0X2Zyb250aWVyLmluc2VydChu
eHQpOwoKCQkgICAgICBpZiAoZnJvbnRpZXJfbWFwLT5maW5kKG54dCkgPT0gZnJvbnRpZXJf
bWFwLT5lbmQoKSkKCQkJewoJCQkgIEwoRigiaW5zZXJ0aW5nIGVkZ2U6ICVzIDwtICVzXG4i
KSAlICgqaSkgJSBueHQpOwoJCQkgIGZyb250aWVyX21hcC0+aW5zZXJ0KG1ha2VfcGFpcihu
eHQsICppKSk7CgkJCX0KCQkgICAgICBlbHNlCgkJCUwoRigic2tpcHBpbmcgbWVyZ2UgZWRn
ZSAlcyA8LSAlc1xuIikgJSAoKmkpICUgbnh0KTsKCQkgICAgfQoJCX0KCSAgICB9CgkgIGlm
ICghZm91bmRfcm9vdCkKCSAgICB7CgkgICAgICBmcm9udGllciA9IG5leHRfZnJvbnRpZXI7
CgkgICAgICBwYXRocy5wdXNoX2Zyb250KGZyb250aWVyX21hcCk7CgkgICAgfQoJfQoKICAg
ICAgLy8gcGF0aCBidWlsdCwgbm93IGFsbCB3ZSBuZWVkIHRvIGRvIGlzIGZvbGxvdyBpdCBi
YWNrCgogICAgICBJKGZvdW5kX3Jvb3QpOwogICAgICBJKHJvb3QoKSAhPSAiIik7CiAgICAg
IGJhc2U2NDwgZ3ppcDxkYXRhPiA+IGJlZ2luX3BhY2tlZDsKICAgICAgZGF0YSBiZWdpbjsg
ICAgICAKICAgICAgZ2V0KHJvb3QsIGJlZ2luX3BhY2tlZCwgZGF0YV90YWJsZSk7CiAgICAg
IHVucGFjayhiZWdpbl9wYWNrZWQsIGJlZ2luKTsKICAgICAgaGV4ZW5jPGlkPiBjdXJyID0g
cm9vdDsKCiAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGRlbHRhX2FwcGxpY2F0b3I+IGFwcCA9
IG5ld19waWVjZXdpc2VfYXBwbGljYXRvcigpOwogICAgICBhcHAtPmJlZ2luKGJlZ2luKCkp
OwogICAgICAKICAgICAgZm9yIChsaXN0PCBzaGFyZWRfcHRyPGVkZ2VtYXA+ID46OmNvbnN0
X2l0ZXJhdG9yIHAgPSBwYXRocy5iZWdpbigpOwoJICAgcCAhPSBwYXRocy5lbmQoKTsgKytw
KQoJewoJICBzaGFyZWRfcHRyPGVkZ2VtYXA+IGkgPSAqcDsKCSAgSShpLT5maW5kKGN1cnIp
ICE9IGktPmVuZCgpKTsKCSAgaGV4ZW5jPGlkPiBjb25zdCBueHQgPSBpLT5maW5kKGN1cnIp
LT5zZWNvbmQ7CgoJICBMKEYoImZvbGxvd2luZyBkZWx0YSAlcyAtPiAlc1xuIikgJSBjdXJy
ICUgbnh0KTsKCSAgYmFzZTY0PCBnemlwPGRlbHRhPiA+IGRlbF9wYWNrZWQ7CgkgIGdldF9k
ZWx0YShueHQsIGN1cnIsIGRlbF9wYWNrZWQsIGRlbHRhX3RhYmxlKTsKCSAgZGVsdGEgZGVs
OwoJICB1bnBhY2soZGVsX3BhY2tlZCwgZGVsKTsKCSAgYXBwbHlfZGVsdGEgKGFwcCwgZGVs
KCkpOwoJICBhcHAtPm5leHQoKTsKCSAgY3VyciA9IG54dDsKCX0KCiAgICAgIHN0cmluZyB0
bXA7CiAgICAgIGFwcC0+ZmluaXNoKHRtcCk7CiAgICAgIGRhdGEgZW5kKHRtcCk7CgogICAg
ICBoZXhlbmM8aWQ+IGZpbmFsOwogICAgICBjYWxjdWxhdGVfaWRlbnQoZW5kLCBmaW5hbCk7
CiAgICAgIEkoZmluYWwgPT0gaWRlbnQpOwogICAgICBwYWNrKGVuZCwgZGF0KTsKICAgIH0K
fQoKCnZvaWQgCmRhdGFiYXNlOjpkcm9wKGhleGVuYzxpZD4gY29uc3QgJiBpZGVudCwgCgkg
ICAgICAgc3RyaW5nIGNvbnN0ICYgdGFibGUpCnsKICBleGVjdXRlKCJERUxFVEUgRlJPTSAn
JXEnIFdIRVJFIGlkID0gJyVxJyIsICAKCSAgdGFibGUuY19zdHIoKSwKCSAgaWRlbnQoKS5j
X3N0cigpKTsKfQoKdm9pZCAKZGF0YWJhc2U6OnB1dF92ZXJzaW9uKGhleGVuYzxpZD4gY29u
c3QgJiBvbGRfaWQsCgkJICAgICAgaGV4ZW5jPGlkPiBjb25zdCAmIG5ld19pZCwKCQkgICAg
ICBiYXNlNjQ8IGd6aXA8ZGVsdGE+ID4gY29uc3QgJiBkZWwsCgkJICAgICAgc3RyaW5nIGNv
bnN0ICYgZGF0YV90YWJsZSwKCQkgICAgICBzdHJpbmcgY29uc3QgJiBkZWx0YV90YWJsZSkK
ewoKICBiYXNlNjQ8IGd6aXA8ZGF0YT4gPiBvbGRfZGF0YSwgbmV3X2RhdGE7CiAgYmFzZTY0
PCBnemlwPGRlbHRhPiA+IHJldmVyc2VfZGVsdGE7CiAgCiAgZ2V0X3ZlcnNpb24ob2xkX2lk
LCBvbGRfZGF0YSwgZGF0YV90YWJsZSwgZGVsdGFfdGFibGUpOwogIHBhdGNoKG9sZF9kYXRh
LCBkZWwsIG5ld19kYXRhKTsKICBkaWZmKG5ld19kYXRhLCBvbGRfZGF0YSwgcmV2ZXJzZV9k
ZWx0YSk7CiAgICAgIAogIHRyYW5zYWN0aW9uX2d1YXJkIGd1YXJkKCp0aGlzKTsKICBpZiAo
ZXhpc3RzKG9sZF9pZCwgZGF0YV90YWJsZSkpCiAgICB7CiAgICAgIC8vIGRlc2NlbmRlbnQg
b2YgYSBoZWFkIHZlcnNpb24gcmVwbGFjZXMgdGhlIGhlYWQsIHRoZXJlZm9yZSBvbGQgaGVh
ZAogICAgICAvLyBtdXN0IGJlIGRpc3Bvc2VkIG9mCiAgICAgIGRyb3Aob2xkX2lkLCBkYXRh
X3RhYmxlKTsKICAgIH0KICBwdXQobmV3X2lkLCBuZXdfZGF0YSwgZGF0YV90YWJsZSk7CiAg
cHV0X2RlbHRhKG9sZF9pZCwgbmV3X2lkLCByZXZlcnNlX2RlbHRhLCBkZWx0YV90YWJsZSk7
CiAgZ3VhcmQuY29tbWl0KCk7Cn0KCnZvaWQgCmRhdGFiYXNlOjpwdXRfcmV2ZXJzZV92ZXJz
aW9uKGhleGVuYzxpZD4gY29uc3QgJiBuZXdfaWQsCgkJCSAgICAgIGhleGVuYzxpZD4gY29u
c3QgJiBvbGRfaWQsCgkJCSAgICAgIGJhc2U2NDwgZ3ppcDxkZWx0YT4gPiBjb25zdCAmIHJl
dmVyc2VfZGVsLAoJCQkgICAgICBzdHJpbmcgY29uc3QgJiBkYXRhX3RhYmxlLAoJCQkgICAg
ICBzdHJpbmcgY29uc3QgJiBkZWx0YV90YWJsZSkKewogIGJhc2U2NDwgZ3ppcDxkYXRhPiA+
IG9sZF9kYXRhLCBuZXdfZGF0YTsKICAKICBnZXRfdmVyc2lvbihuZXdfaWQsIG5ld19kYXRh
LCBkYXRhX3RhYmxlLCBkZWx0YV90YWJsZSk7CiAgcGF0Y2gobmV3X2RhdGEsIHJldmVyc2Vf
ZGVsLCBvbGRfZGF0YSk7CiAgaGV4ZW5jPGlkPiBjaGVjazsKICBjYWxjdWxhdGVfaWRlbnQo
b2xkX2RhdGEsIGNoZWNrKTsKICBJKG9sZF9pZCA9PSBjaGVjayk7CiAgICAgIAogIHRyYW5z
YWN0aW9uX2d1YXJkIGd1YXJkKCp0aGlzKTsKICBwdXRfZGVsdGEob2xkX2lkLCBuZXdfaWQs
IHJldmVyc2VfZGVsLCBkZWx0YV90YWJsZSk7CiAgZ3VhcmQuY29tbWl0KCk7Cn0KCgoKLy8g
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tCi8vIC0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAtLQovLyAtLSAgICAgICAgICAgICAgcHVibGljIGludGVyZmFjZSBm
b2xsb3dzICAgICAgICAgICAgICAgICAgLS0KLy8gLS0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi8vIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYm9vbCAK
ZGF0YWJhc2U6OmZpbGVfdmVyc2lvbl9leGlzdHMoZmlsZV9pZCBjb25zdCAmIGlkKQp7CiAg
cmV0dXJuIGRlbHRhX2V4aXN0cyhpZC5pbm5lcigpLCAiZmlsZV9kZWx0YXMiKSAKICAgIHx8
IGV4aXN0cyhpZC5pbm5lcigpLCAiZmlsZXMiKTsKfQoKYm9vbCAKZGF0YWJhc2U6Om1hbmlm
ZXN0X3ZlcnNpb25fZXhpc3RzKG1hbmlmZXN0X2lkIGNvbnN0ICYgaWQpCnsKICByZXR1cm4g
ZGVsdGFfZXhpc3RzKGlkLmlubmVyKCksICJtYW5pZmVzdF9kZWx0YXMiKSAKICAgIHx8IGV4
aXN0cyhpZC5pbm5lcigpLCAibWFuaWZlc3RzIik7Cn0KCmJvb2wgCmRhdGFiYXNlOjpyZXZp
c2lvbl9leGlzdHMocmV2aXNpb25faWQgY29uc3QgJiBpZCkKewogIHJldHVybiBleGlzdHMo
aWQuaW5uZXIoKSwgInJldmlzaW9ucyIpOwp9CgoKdm9pZCAKZGF0YWJhc2U6OmdldF9maWxl
X3ZlcnNpb24oZmlsZV9pZCBjb25zdCAmIGlkLAoJCQkgICBmaWxlX2RhdGEgJiBkYXQpCnsK
ICBiYXNlNjQ8IGd6aXA8ZGF0YT4gPiB0bXA7CiAgZ2V0X3ZlcnNpb24oaWQuaW5uZXIoKSwg
dG1wLCAiZmlsZXMiLCAiZmlsZV9kZWx0YXMiKTsKICBkYXQgPSB0bXA7Cn0KCnZvaWQgCmRh
dGFiYXNlOjpnZXRfbWFuaWZlc3RfdmVyc2lvbihtYW5pZmVzdF9pZCBjb25zdCAmIGlkLAoJ
CQkgICAgICAgbWFuaWZlc3RfZGF0YSAmIGRhdCkKewogIGJhc2U2NDwgZ3ppcDxkYXRhPiA+
IHRtcDsKICBnZXRfdmVyc2lvbihpZC5pbm5lcigpLCB0bXAsICJtYW5pZmVzdHMiLCAibWFu
aWZlc3RfZGVsdGFzIik7CiAgZGF0ID0gdG1wOwp9Cgp2b2lkIApkYXRhYmFzZTo6Z2V0X21h
bmlmZXN0KG1hbmlmZXN0X2lkIGNvbnN0ICYgaWQsCgkJICAgICAgIG1hbmlmZXN0X21hcCAm
IG1tKQp7CiAgbWFuaWZlc3RfZGF0YSBtZGF0OwogIGdldF9tYW5pZmVzdF92ZXJzaW9uKGlk
LCBtZGF0KTsKICByZWFkX21hbmlmZXN0X21hcChtZGF0LCBtbSk7Cn0KCgp2b2lkIApkYXRh
YmFzZTo6cHV0X2ZpbGUoZmlsZV9pZCBjb25zdCAmIGlkLAoJCSAgIGZpbGVfZGF0YSBjb25z
dCAmIGRhdCkKewogIHB1dChpZC5pbm5lcigpLCBkYXQuaW5uZXIoKSwgImZpbGVzIik7Cn0K
CnZvaWQgCmRhdGFiYXNlOjpwdXRfZmlsZV92ZXJzaW9uKGZpbGVfaWQgY29uc3QgJiBvbGRf
aWQsCgkJCSAgIGZpbGVfaWQgY29uc3QgJiBuZXdfaWQsCgkJCSAgIGZpbGVfZGVsdGEgY29u
c3QgJiBkZWwpCnsKICBwdXRfdmVyc2lvbihvbGRfaWQuaW5uZXIoKSwgbmV3X2lkLmlubmVy
KCksIGRlbC5pbm5lcigpLCAKCSAgICAgICJmaWxlcyIsICJmaWxlX2RlbHRhcyIpOwp9Cgp2
b2lkIApkYXRhYmFzZTo6cHV0X2ZpbGVfcmV2ZXJzZV92ZXJzaW9uKGZpbGVfaWQgY29uc3Qg
JiBuZXdfaWQsCgkJCQkgICBmaWxlX2lkIGNvbnN0ICYgb2xkX2lkLAkJCQkgICAKCQkJCSAg
IGZpbGVfZGVsdGEgY29uc3QgJiBkZWwpCnsKICBwdXRfcmV2ZXJzZV92ZXJzaW9uKG5ld19p
ZC5pbm5lcigpLCBvbGRfaWQuaW5uZXIoKSwgZGVsLmlubmVyKCksIAoJCSAgICAgICJmaWxl
cyIsICJmaWxlX2RlbHRhcyIpOwp9CgoKdm9pZCAKZGF0YWJhc2U6OnB1dF9tYW5pZmVzdCht
YW5pZmVzdF9pZCBjb25zdCAmIGlkLAoJCSAgICAgICBtYW5pZmVzdF9kYXRhIGNvbnN0ICYg
ZGF0KQp7CiAgcHV0KGlkLmlubmVyKCksIGRhdC5pbm5lcigpLCAibWFuaWZlc3RzIik7Cn0K
CnZvaWQgCmRhdGFiYXNlOjpwdXRfbWFuaWZlc3RfdmVyc2lvbihtYW5pZmVzdF9pZCBjb25z
dCAmIG9sZF9pZCwKCQkJICAgICAgIG1hbmlmZXN0X2lkIGNvbnN0ICYgbmV3X2lkLAoJCQkg
ICAgICAgbWFuaWZlc3RfZGVsdGEgY29uc3QgJiBkZWwpCnsKICBwdXRfdmVyc2lvbihvbGRf
aWQuaW5uZXIoKSwgbmV3X2lkLmlubmVyKCksIGRlbC5pbm5lcigpLCAKCSAgICAgICJtYW5p
ZmVzdHMiLCAibWFuaWZlc3RfZGVsdGFzIik7Cn0KCnZvaWQgCmRhdGFiYXNlOjpwdXRfbWFu
aWZlc3RfcmV2ZXJzZV92ZXJzaW9uKG1hbmlmZXN0X2lkIGNvbnN0ICYgbmV3X2lkLAoJCQkJ
ICAgICAgIG1hbmlmZXN0X2lkIGNvbnN0ICYgb2xkX2lkLAkJCQkgICAKCQkJCSAgICAgICBt
YW5pZmVzdF9kZWx0YSBjb25zdCAmIGRlbCkKewogIHB1dF9yZXZlcnNlX3ZlcnNpb24obmV3
X2lkLmlubmVyKCksIG9sZF9pZC5pbm5lcigpLCBkZWwuaW5uZXIoKSwgCgkJICAgICAgIm1h
bmlmZXN0cyIsICJtYW5pZmVzdF9kZWx0YXMiKTsKfQoKCnZvaWQgCmRhdGFiYXNlOjpnZXRf
cmV2aXNpb25fYW5jZXN0cnkoc3RkOjpzZXQ8c3RkOjpwYWlyPHJldmlzaW9uX2lkLCByZXZp
c2lvbl9pZD4gPiAmIGdyYXBoKQp7CiAgcmVzdWx0cyByZXM7CiAgZ3JhcGguY2xlYXIoKTsK
ICBmZXRjaChyZXMsIDIsIGFueV9yb3dzLCAKCSJTRUxFQ1QgcGFyZW50LGNoaWxkIEZST00g
cmV2aXNpb25fYW5jZXN0cnkiKTsKICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlcy5zaXpl
KCk7ICsraSkKICAgIGdyYXBoLmluc2VydChzdGQ6Om1ha2VfcGFpcihyZXZpc2lvbl9pZChy
ZXNbaV1bMF0pLAoJCQkJcmV2aXNpb25faWQocmVzW2ldWzFdKSkpOwp9Cgp2b2lkIApkYXRh
YmFzZTo6Z2V0X3JldmlzaW9uX3BhcmVudHMocmV2aXNpb25faWQgY29uc3QgJiBpZCwKCQkJ
ICAgICAgc2V0PHJldmlzaW9uX2lkPiAmIHBhcmVudHMpCnsKICByZXN1bHRzIHJlczsKICBw
YXJlbnRzLmNsZWFyKCk7CiAgZmV0Y2gocmVzLCBvbmVfY29sLCBhbnlfcm93cywgCgkiU0VM
RUNUIHBhcmVudCBGUk9NIHJldmlzaW9uX2FuY2VzdHJ5IFdIRVJFIGNoaWxkID0gJyVxJyIs
CglpZC5pbm5lcigpKCkuY19zdHIoKSk7CiAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXMu
c2l6ZSgpOyArK2kpCiAgICBwYXJlbnRzLmluc2VydChyZXZpc2lvbl9pZChyZXNbaV1bMF0p
KTsKfQoKdm9pZCAKZGF0YWJhc2U6OmdldF9yZXZpc2lvbl9jaGlsZHJlbihyZXZpc2lvbl9p
ZCBjb25zdCAmIGlkLAoJCQkJc2V0PHJldmlzaW9uX2lkPiAmIGNoaWxkcmVuKQp7CiAgcmVz
dWx0cyByZXM7CiAgY2hpbGRyZW4uY2xlYXIoKTsKICBmZXRjaChyZXMsIG9uZV9jb2wsIGFu
eV9yb3dzLCAKCSJTRUxFQ1QgY2hpbGQgRlJPTSByZXZpc2lvbl9hbmNlc3RyeSBXSEVSRSBw
YXJlbnQgPSAnJXEnIiwKCWlkLmlubmVyKCkoKS5jX3N0cigpKTsKICBmb3IgKHNpemVfdCBp
ID0gMDsgaSA8IHJlcy5zaXplKCk7ICsraSkKICAgIGNoaWxkcmVuLmluc2VydChyZXZpc2lv
bl9pZChyZXNbaV1bMF0pKTsKfQoKdm9pZCAKZGF0YWJhc2U6OmdldF9yZXZpc2lvbl9tYW5p
ZmVzdChyZXZpc2lvbl9pZCBjb25zdCAmIHJpZCwKCQkJICAgICAgIG1hbmlmZXN0X2lkICYg
bWlkKQp7CiAgcmV2aXNpb25fc2V0IHJldjsKICBnZXRfcmV2aXNpb24ocmlkLCByZXYpOwog
IG1pZCA9IHJldi5uZXdfbWFuaWZlc3Q7Cn0KCnZvaWQgCmRhdGFiYXNlOjpnZXRfcmV2aXNp
b24ocmV2aXNpb25faWQgY29uc3QgJiBpZCwKCQkgICAgICAgcmV2aXNpb25fc2V0ICYgcmV2
KQp7CiAgcmV2aXNpb25fZGF0YSBkOwogIGdldF9yZXZpc2lvbihpZCwgZCk7CiAgcmVhZF9y
ZXZpc2lvbl9zZXQoZCwgcmV2KTsKfQoKdm9pZCAKZGF0YWJhc2U6OmdldF9yZXZpc2lvbihy
ZXZpc2lvbl9pZCBjb25zdCAmIGlkLAoJCSAgICAgICByZXZpc2lvbl9kYXRhICYgZGF0KQp7
CiAgcmVzdWx0cyByZXM7CiAgZmV0Y2gocmVzLCBvbmVfY29sLCBvbmVfcm93LCAKCSJTRUxF
Q1QgZGF0YSBGUk9NIHJldmlzaW9ucyBXSEVSRSBpZCA9ICclcSciLAoJaWQuaW5uZXIoKSgp
LmNfc3RyKCkpOwoKICBkYXQgPSByZXZpc2lvbl9kYXRhKHJlc1swXVswXSk7CgogIC8vIHZl
cmlmeSB0aGF0IHdlIGdvdCBhIHJldmlzaW9uIHdpdGggdGhlIHJpZ2h0IGlkCiAgewogICAg
cmV2aXNpb25faWQgdG1wOwogICAgY2FsY3VsYXRlX2lkZW50KGRhdCwgdG1wKTsKICAgIEko
aWQgPT0gdG1wKTsKICB9Cn0KCnZvaWQgCmRhdGFiYXNlOjpwdXRfcmV2aXNpb24ocmV2aXNp
b25faWQgY29uc3QgJiBuZXdfaWQsCgkJICAgICAgIHJldmlzaW9uX3NldCBjb25zdCAmIHJl
dikKewoKICBJKCFyZXZpc2lvbl9leGlzdHMobmV3X2lkKSk7CiAgcmV2aXNpb25fZGF0YSBk
OwoKICB3cml0ZV9yZXZpc2lvbl9zZXQocmV2LCBkKTsKICByZXZpc2lvbl9pZCB0bXA7CiAg
Y2FsY3VsYXRlX2lkZW50KGQsIHRtcCk7CiAgSSh0bXAgPT0gbmV3X2lkKTsKCiAgdHJhbnNh
Y3Rpb25fZ3VhcmQgZ3VhcmQoKnRoaXMpOwoKICBleGVjdXRlKCJJTlNFUlQgSU5UTyByZXZp
c2lvbnMgVkFMVUVTKCclcScsICclcScpIiwgCgkgIG5ld19pZC5pbm5lcigpKCkuY19zdHIo
KSwgCgkgIGQuaW5uZXIoKSgpLmNfc3RyKCkpOwoKICBmb3IgKGVkZ2VfbWFwOjpjb25zdF9p
dGVyYXRvciBlID0gcmV2LmVkZ2VzLmJlZ2luKCk7CiAgICAgICBlICE9IHJldi5lZGdlcy5l
bmQoKTsgKytlKQogICAgewogICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyByZXZpc2lvbl9h
bmNlc3RyeSBWQUxVRVMoJyVxJywgJyVxJykiLCAKCSAgICAgIGVkZ2Vfb2xkX3JldmlzaW9u
KGUpLmlubmVyKCkoKS5jX3N0cigpLAoJICAgICAgbmV3X2lkLmlubmVyKCkoKS5jX3N0cigp
KTsKICAgIH0KCiAgZ3VhcmQuY29tbWl0KCk7Cn0KCnZvaWQgCmRhdGFiYXNlOjpwdXRfcmV2
aXNpb24ocmV2aXNpb25faWQgY29uc3QgJiBuZXdfaWQsCgkJICAgICAgIHJldmlzaW9uX2Rh
dGEgY29uc3QgJiBkYXQpCnsKICByZXZpc2lvbl9zZXQgcmV2OwogIHJlYWRfcmV2aXNpb25f
c2V0KGRhdCwgcmV2KTsKICBwdXRfcmV2aXNpb24obmV3X2lkLCByZXYpOwp9CgoKLy8gY3J5
cHRvIGtleSBtYW5hZ2VtZW50Cgp2b2lkIApkYXRhYmFzZTo6Z2V0X2tleV9pZHMoc3RyaW5n
IGNvbnN0ICYgcGF0dGVybiwKCQkgICAgICB2ZWN0b3I8cnNhX2tleXBhaXJfaWQ+ICYgcHVi
a2V5cywKCQkgICAgICB2ZWN0b3I8cnNhX2tleXBhaXJfaWQ+ICYgcHJpdmtleXMpCnsKICBw
dWJrZXlzLmNsZWFyKCk7CiAgcHJpdmtleXMuY2xlYXIoKTsKICByZXN1bHRzIHJlczsKCiAg
aWYgKHBhdHRlcm4gIT0gIiIpCiAgICBmZXRjaChyZXMsIG9uZV9jb2wsIGFueV9yb3dzLCAK
CSAgIlNFTEVDVCBpZCBmcm9tIHB1YmxpY19rZXlzIFdIRVJFIGlkIEdMT0IgJyVxJyIsCgkg
IHBhdHRlcm4uY19zdHIoKSk7CiAgZWxzZQogICAgZmV0Y2gocmVzLCBvbmVfY29sLCBhbnlf
cm93cywgCgkgICJTRUxFQ1QgaWQgZnJvbSBwdWJsaWNfa2V5cyIpOwoKICBmb3IgKHNpemVf
dCBpID0gMDsgaSA8IHJlcy5zaXplKCk7ICsraSkKICAgIHB1YmtleXMucHVzaF9iYWNrKHJl
c1tpXVswXSk7CgogIGlmIChwYXR0ZXJuICE9ICIiKQogICAgZmV0Y2gocmVzLCBvbmVfY29s
LCBhbnlfcm93cywgCgkgICJTRUxFQ1QgaWQgZnJvbSBwcml2YXRlX2tleXMgV0hFUkUgaWQg
R0xPQiAnJXEnIiwKCSAgcGF0dGVybi5jX3N0cigpKTsKICBlbHNlCiAgICBmZXRjaChyZXMs
IG9uZV9jb2wsIGFueV9yb3dzLCAKCSAgIlNFTEVDVCBpZCBmcm9tIHByaXZhdGVfa2V5cyIp
OwoKICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlcy5zaXplKCk7ICsraSkKICAgIHByaXZr
ZXlzLnB1c2hfYmFjayhyZXNbaV1bMF0pOwp9Cgp2b2lkIApkYXRhYmFzZTo6Z2V0X3ByaXZh
dGVfa2V5cyh2ZWN0b3I8cnNhX2tleXBhaXJfaWQ+ICYgcHJpdmtleXMpCnsKICBwcml2a2V5
cy5jbGVhcigpOwogIHJlc3VsdHMgcmVzOwogIGZldGNoKHJlcywgb25lX2NvbCwgYW55X3Jv
d3MsICAiU0VMRUNUIGlkIGZyb20gcHJpdmF0ZV9rZXlzIik7CiAgZm9yIChzaXplX3QgaSA9
IDA7IGkgPCByZXMuc2l6ZSgpOyArK2kpCiAgICBwcml2a2V5cy5wdXNoX2JhY2socmVzW2ld
WzBdKTsKfQoKYm9vbCAKZGF0YWJhc2U6OnB1YmxpY19rZXlfZXhpc3RzKGhleGVuYzxpZD4g
Y29uc3QgJiBoYXNoKQp7CiAgcmVzdWx0cyByZXM7CiAgZmV0Y2gocmVzLCBvbmVfY29sLCBh
bnlfcm93cywgCgkiU0VMRUNUIGlkIEZST00gcHVibGljX2tleXMgV0hFUkUgaGFzaCA9ICcl
cSciLAoJaGFzaCgpLmNfc3RyKCkpOwogIEkoKHJlcy5zaXplKCkgPT0gMSkgfHwgKHJlcy5z
aXplKCkgPT0gMCkpOwogIGlmIChyZXMuc2l6ZSgpID09IDEpIAogICAgcmV0dXJuIHRydWU7
CiAgcmV0dXJuIGZhbHNlOwp9Cgpib29sIApkYXRhYmFzZTo6cHVibGljX2tleV9leGlzdHMo
cnNhX2tleXBhaXJfaWQgY29uc3QgJiBpZCkKewogIHJlc3VsdHMgcmVzOwogIGZldGNoKHJl
cywgb25lX2NvbCwgYW55X3Jvd3MsIAoJIlNFTEVDVCBpZCBGUk9NIHB1YmxpY19rZXlzIFdI
RVJFIGlkID0gJyVxJyIsCglpZCgpLmNfc3RyKCkpOwogIEkoKHJlcy5zaXplKCkgPT0gMSkg
fHwgKHJlcy5zaXplKCkgPT0gMCkpOwogIGlmIChyZXMuc2l6ZSgpID09IDEpIAogICAgcmV0
dXJuIHRydWU7CiAgcmV0dXJuIGZhbHNlOwp9Cgpib29sIApkYXRhYmFzZTo6cHJpdmF0ZV9r
ZXlfZXhpc3RzKHJzYV9rZXlwYWlyX2lkIGNvbnN0ICYgaWQpCnsKICByZXN1bHRzIHJlczsK
ICBmZXRjaChyZXMsIG9uZV9jb2wsIGFueV9yb3dzLAoJIlNFTEVDVCBpZCBGUk9NIHByaXZh
dGVfa2V5cyBXSEVSRSBpZCA9ICclcSciLAoJaWQoKS5jX3N0cigpKTsKICBJKChyZXMuc2l6
ZSgpID09IDEpIHx8IChyZXMuc2l6ZSgpID09IDApKTsKICBpZiAocmVzLnNpemUoKSA9PSAx
KQogICAgcmV0dXJuIHRydWU7CiAgcmV0dXJuIGZhbHNlOwp9Cgpib29sIApkYXRhYmFzZTo6
a2V5X2V4aXN0cyhyc2Ffa2V5cGFpcl9pZCBjb25zdCAmIGlkKQp7CiAgcmV0dXJuIHB1Ymxp
Y19rZXlfZXhpc3RzKGlkKSB8fCBwcml2YXRlX2tleV9leGlzdHMoaWQpOwp9Cgp2b2lkIApk
YXRhYmFzZTo6Z2V0X3B1YmtleShoZXhlbmM8aWQ+IGNvbnN0ICYgaGFzaCwgCgkJICAgICBy
c2Ffa2V5cGFpcl9pZCAmIGlkLAoJCSAgICAgYmFzZTY0PHJzYV9wdWJfa2V5PiAmIHB1Yl9l
bmNvZGVkKQp7CiAgcmVzdWx0cyByZXM7CiAgZmV0Y2gocmVzLCAyLCBvbmVfcm93LCAKCSJT
RUxFQ1QgaWQsIGtleWRhdGEgRlJPTSBwdWJsaWNfa2V5cyB3aGVyZSBoYXNoID0gJyVxJyIs
IAoJaGFzaCgpLmNfc3RyKCkpOwogIGlkID0gcmVzWzBdWzBdOwogIHB1Yl9lbmNvZGVkID0g
cmVzWzBdWzFdOwp9Cgp2b2lkIApkYXRhYmFzZTo6Z2V0X2tleShyc2Ffa2V5cGFpcl9pZCBj
b25zdCAmIHB1Yl9pZCwgCgkJICBiYXNlNjQ8cnNhX3B1Yl9rZXk+ICYgcHViX2VuY29kZWQp
CnsKICByZXN1bHRzIHJlczsKICBmZXRjaChyZXMsIG9uZV9jb2wsIG9uZV9yb3csIAoJIlNF
TEVDVCBrZXlkYXRhIEZST00gcHVibGljX2tleXMgd2hlcmUgaWQgPSAnJXEnIiwgCglwdWJf
aWQoKS5jX3N0cigpKTsKICBwdWJfZW5jb2RlZCA9IHJlc1swXVswXTsKfQoKdm9pZCAKZGF0
YWJhc2U6OmdldF9rZXkocnNhX2tleXBhaXJfaWQgY29uc3QgJiBwcml2X2lkLCAKCQkgIGJh
c2U2NDwgYXJjNDxyc2FfcHJpdl9rZXk+ID4gJiBwcml2X2VuY29kZWQpCnsKICByZXN1bHRz
IHJlczsKICBmZXRjaChyZXMsIG9uZV9jb2wsIG9uZV9jb2wsIAoJIlNFTEVDVCBrZXlkYXRh
IEZST00gcHJpdmF0ZV9rZXlzIHdoZXJlIGlkID0gJyVxJyIsIAoJcHJpdl9pZCgpLmNfc3Ry
KCkpOwogIHByaXZfZW5jb2RlZCA9IHJlc1swXVswXTsKfQoKCnZvaWQgCmRhdGFiYXNlOjpw
dXRfa2V5KHJzYV9rZXlwYWlyX2lkIGNvbnN0ICYgcHViX2lkLCAKCQkgIGJhc2U2NDxyc2Ff
cHViX2tleT4gY29uc3QgJiBwdWJfZW5jb2RlZCkKewogIGhleGVuYzxpZD4gdGhhc2g7CiAg
a2V5X2hhc2hfY29kZShwdWJfaWQsIHB1Yl9lbmNvZGVkLCB0aGFzaCk7CiAgZXhlY3V0ZSgi
SU5TRVJUIElOVE8gcHVibGljX2tleXMgVkFMVUVTKCclcScsICclcScsICclcScpIiwgCgkg
IHRoYXNoKCkuY19zdHIoKSwgcHViX2lkKCkuY19zdHIoKSwgcHViX2VuY29kZWQoKS5jX3N0
cigpKTsKfQoKdm9pZCAKZGF0YWJhc2U6OnB1dF9rZXkocnNhX2tleXBhaXJfaWQgY29uc3Qg
JiBwcml2X2lkLCAKCQkgIGJhc2U2NDwgYXJjNDxyc2FfcHJpdl9rZXk+ID4gY29uc3QgJiBw
cml2X2VuY29kZWQpCnsKICAKICBoZXhlbmM8aWQ+IHRoYXNoOwogIGtleV9oYXNoX2NvZGUo
cHJpdl9pZCwgcHJpdl9lbmNvZGVkLCB0aGFzaCk7CiAgZXhlY3V0ZSgiSU5TRVJUIElOVE8g
cHJpdmF0ZV9rZXlzIFZBTFVFUygnJXEnLCAnJXEnLCAnJXEnKSIsIAoJICB0aGFzaCgpLmNf
c3RyKCksIHByaXZfaWQoKS5jX3N0cigpLCBwcml2X2VuY29kZWQoKS5jX3N0cigpKTsKfQoK
dm9pZCAKZGF0YWJhc2U6OnB1dF9rZXlfcGFpcihyc2Ffa2V5cGFpcl9pZCBjb25zdCAmIGlk
LCAKCQkgICAgICAgYmFzZTY0PHJzYV9wdWJfa2V5PiBjb25zdCAmIHB1Yl9lbmNvZGVkLAoJ
CSAgICAgICBiYXNlNjQ8IGFyYzQ8cnNhX3ByaXZfa2V5PiA+IGNvbnN0ICYgcHJpdl9lbmNv
ZGVkKQp7CiAgdHJhbnNhY3Rpb25fZ3VhcmQgZ3VhcmQoKnRoaXMpOwogIHB1dF9rZXkoaWQs
IHB1Yl9lbmNvZGVkKTsKICBwdXRfa2V5KGlkLCBwcml2X2VuY29kZWQpOwogIGd1YXJkLmNv
bW1pdCgpOwp9CgoKLy8gY2VydCBtYW5hZ2VtZW50Cgpib29sIApkYXRhYmFzZTo6Y2VydF9l
eGlzdHMoY2VydCBjb25zdCAmIHQsCgkJICAgICAgc3RyaW5nIGNvbnN0ICYgdGFibGUpCnsK
ICByZXN1bHRzIHJlczsKICBmZXRjaChyZXMsIDEsIGFueV9yb3dzLAoJIlNFTEVDVCBpZCBG
Uk9NICclcScgV0hFUkUgaWQgPSAnJXEnICIKCSJBTkQgbmFtZSA9ICclcScgQU5EIHZhbHVl
ID0gJyVxJyAiIAoJIkFORCBrZXlwYWlyID0gJyVxJyBBTkQgc2lnbmF0dXJlID0gJyVxJyAi
LAoJdGFibGUuY19zdHIoKSwKCXQuaWRlbnQoKS5jX3N0cigpLAoJdC5uYW1lKCkuY19zdHIo
KSwKCXQudmFsdWUoKS5jX3N0cigpLAoJdC5rZXkoKS5jX3N0cigpLAoJdC5zaWcoKS5jX3N0
cigpKTsKICBJKHJlcy5zaXplKCkgPT0gMCB8fCByZXMuc2l6ZSgpID09IDEpOwogIHJldHVy
biByZXMuc2l6ZSgpID09IDE7Cn0KCnZvaWQgCmRhdGFiYXNlOjpwdXRfY2VydChjZXJ0IGNv
bnN0ICYgdCwKCQkgICBzdHJpbmcgY29uc3QgJiB0YWJsZSkKewogIGhleGVuYzxpZD4gdGhh
c2g7CiAgY2VydF9oYXNoX2NvZGUodCwgdGhhc2gpOwogIGV4ZWN1dGUoIklOU0VSVCBJTlRP
ICclcScgVkFMVUVTKCclcScsICclcScsICclcScsICclcScsICclcScsICclcScpIiwgCgkg
IHRhYmxlLmNfc3RyKCksCgkgIHRoYXNoKCkuY19zdHIoKSwKCSAgdC5pZGVudCgpLmNfc3Ry
KCksCgkgIHQubmFtZSgpLmNfc3RyKCksIAoJICB0LnZhbHVlKCkuY19zdHIoKSwKCSAgdC5r
ZXkoKS5jX3N0cigpLAoJICB0LnNpZygpLmNfc3RyKCkpOwp9Cgp2b2lkIApkYXRhYmFzZTo6
cmVzdWx0c190b19jZXJ0cyhyZXN1bHRzIGNvbnN0ICYgcmVzLAoJCQkgICB2ZWN0b3I8Y2Vy
dD4gJiBjZXJ0cykKewogIGNlcnRzLmNsZWFyKCk7CiAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCByZXMuc2l6ZSgpOyArK2kpCiAgICB7CiAgICAgIGNlcnQgdDsKICAgICAgdCA9IGNlcnQo
aGV4ZW5jPGlkPihyZXNbaV1bMF0pLCAKCSAgICAgIGNlcnRfbmFtZShyZXNbaV1bMV0pLAoJ
ICAgICAgYmFzZTY0PGNlcnRfdmFsdWU+KHJlc1tpXVsyXSksCgkgICAgICByc2Ffa2V5cGFp
cl9pZChyZXNbaV1bM10pLAoJICAgICAgYmFzZTY0PHJzYV9zaGExX3NpZ25hdHVyZT4ocmVz
W2ldWzRdKSk7CiAgICAgIGNlcnRzLnB1c2hfYmFjayh0KTsKICAgIH0KfQoKCnN0cnVjdCB2
YWxpZF9jZXJ0cwp7CiAgc2V0PHJzYV9rZXlwYWlyX2lkPiB2YWxpZF9zaWduZXJzOwogIGhl
eGVuYzxpZD4gaWRlbnQ7CiAgY2VydF9uYW1lIG5hbWU7CiAgYmFzZTY0PGNlcnRfdmFsdWU+
IHZhbDsKICBzdHJpbmcgc2lnbmF0dXJlX3R5cGU7CgogIHZhbGlkX2NlcnRzKHN0cmluZyBj
b25zdCAmIHR5KSAKICAgIDogc2lnbmF0dXJlX3R5cGUodHkpIAogIHsKICAgIEwoRigiY29u
c3RydWN0aW5nIHZhbGlkaXR5IGNoZWNrZXIgZm9yICVzIGNlcnRzXG4iKSAlIHR5KTsKICB9
CgogIGJvb2wgY2hlY2tfc2lnbmVyX3RydXN0KGFwcF9zdGF0ZSAmIGFwcCkKICB7CiAgICBi
b29sIHRydXN0ZWQgPSBmYWxzZTsKCiAgICBMKEYoImNoZWNraW5nICVkIHNpZ25lciAlcyBj
ZXJ0IHRydXN0IHNldFxuIikgCiAgICAgICUgdmFsaWRfc2lnbmVycy5zaXplKCkgJSBzaWdu
YXR1cmVfdHlwZSk7CiAgICB0cnkKICAgICAgewoJY2VydF92YWx1ZSB2OwoJZGVjb2RlX2Jh
c2U2NCh2YWwsIHYpOwoJLy8gRklYTUU6IGxhbWUgc3RyaW5nLW1ha2VzLXRoZS1tb2RlIGFy
Z3VtZW50CglpZiAoc2lnbmF0dXJlX3R5cGUgPT0gInJldmlzaW9uIikKCSAgdHJ1c3RlZCA9
IGFwcC5sdWEuaG9va19nZXRfcmV2aXNpb25fY2VydF90cnVzdCh2YWxpZF9zaWduZXJzLAoJ
CQkJCQkJaWRlbnQsIG5hbWUsIHYpOwoJZWxzZSBpZiAoc2lnbmF0dXJlX3R5cGUgPT0gIm1h
bmlmZXN0IikKCSAgdHJ1c3RlZCA9IGFwcC5sdWEuaG9va19nZXRfbWFuaWZlc3RfY2VydF90
cnVzdCh2YWxpZF9zaWduZXJzLAoJCQkJCQkJIGlkZW50LCBuYW1lLCB2KTsKCWVsc2UgaWYg
KHNpZ25hdHVyZV90eXBlID09ICJmaWxlIikKCSAgdHJ1c3RlZCA9IGFwcC5sdWEuaG9va19n
ZXRfZmlsZV9jZXJ0X3RydXN0KHZhbGlkX3NpZ25lcnMsCgkJCQkJCSAgICAgaWRlbnQsIG5h
bWUsIHYpOwoJZWxzZQoJICBJKGZhbHNlKTsgLy8gc2hvdWxkIGJlIGlsbGVnYWwKICAgICAg
fQogICAgY2F0Y2ggKC4uLikKICAgICAgewoJVyhGKCJleGNlcHRpb24gaW4gc3FsaXRlIHZh
bGlkX2NlcnRzOjpjaGVja19zZXRfdHJ1c3RcbiIpKTsKICAgICAgfQogICAgCiAgICBpZiAo
dHJ1c3RlZCkKICAgICAgTChGKCJ0cnVzdCBmdW5jdGlvbiBsaWtlZCAlZCAlcyBzaWduZXJz
XG4iKSAKCSUgdmFsaWRfc2lnbmVycy5zaXplKCkgJSBzaWduYXR1cmVfdHlwZSk7CiAgICBl
bHNlCiAgICAgIEwoRigidHJ1c3QgZnVuY3Rpb24gZGlzbGlrZWQgJWQgJXMgc2lnbmVyc1xu
IikgCgklIHZhbGlkX3NpZ25lcnMuc2l6ZSgpICUgc2lnbmF0dXJlX3R5cGUpOwogICAgCiAg
ICByZXR1cm4gdHJ1c3RlZDsKICB9CgogIHZvaWQgY2hlY2tfc2luZ2xlX3NpZ25lcihhcHBf
c3RhdGUgJiBhcHAsCgkJCSAgIGludCBhcmdjLCAKCQkJICAgY2hhciBjb25zdCAqKiBhcmd2
KQogIHsKICAgIHRyeQogICAgICB7CgkvLyBhcmdzIGFyZTogaGFzaCwgaWQsIG5hbWUsIHZh
bHVlLCBrZXlwYWlyLCBwdWJrZXksIHNpZ25hdHVyZQoJLy8gTChGKCJlbnRyaWVzIGFyZSBb
JXNdIFslc10gWyVzXSBbJXNdIFslc10gWyVzXSBbJXNdXG4iKSAKCS8vIAkgICUgYXJndlsw
XSAlIGFyZ3ZbMV0gJSBhcmd2WzJdICUgYXJndlszXSAlIGFyZ3ZbNF0gJSBhcmd2WzVdICUg
YXJndls2XSk7CgoJY2VydCB0bXAgPSBjZXJ0KGhleGVuYzxpZD4oYXJndlsxXSksIAoJCQlj
ZXJ0X25hbWUoYXJndlsyXSksCgkJCWJhc2U2NDxjZXJ0X3ZhbHVlPihhcmd2WzNdKSwKCQkJ
cnNhX2tleXBhaXJfaWQoYXJndls0XSksCgkJCWJhc2U2NDxyc2Ffc2hhMV9zaWduYXR1cmU+
KGFyZ3ZbNl0pKTsKCgliYXNlNjQ8cnNhX3B1Yl9rZXk+IHBrKGFyZ3ZbNV0pOwoKCWlmIChp
ZGVudCgpLmVtcHR5KCkpCgkgIGlkZW50ID0gdG1wLmlkZW50OwoJZWxzZQoJICBJKGlkZW50
ID09IHRtcC5pZGVudCk7CgoJaWYgKG5hbWUoKS5lbXB0eSgpKQoJICBuYW1lID0gdG1wLm5h
bWU7CgllbHNlCgkgIEkobmFtZSA9PSB0bXAubmFtZSk7CgoJaWYgKHZhbCgpLmVtcHR5KCkp
CgkgIHZhbCA9IHRtcC52YWx1ZTsKCWVsc2UKCSAgSSh2YWwgPT0gdG1wLnZhbHVlKTsKCgkv
LyAJTChGKCJleGFtaW5pbmcgJyVzJyAlcyBjZXJ0IGZyb20gJXNcbiIpIAoJLy8gCSAgJSBu
YW1lICUgc2lnbmF0dXJlX3R5cGUgJSBpZGVudCk7CgoJc3RyaW5nIHR4dDsKCWNlcnRfc2ln
bmFibGVfdGV4dCh0bXAsIHR4dCk7CglpZiAoY2hlY2tfc2lnbmF0dXJlKGFwcC5sdWEsIHRt
cC5rZXksIHBrLCB0eHQsIHRtcC5zaWcpKQoJICB7CgkgICAgTChGKCJvayAnJXMnICVzIGNl
cnQgZnJvbSAlc1xuIikgCgkgICAgICAlIG5hbWUgJSBzaWduYXR1cmVfdHlwZSAlIHRtcC5r
ZXkpOwoJICAgIHZhbGlkX3NpZ25lcnMuaW5zZXJ0KHRtcC5rZXkpOwoJICB9CgllbHNlCgkg
IHsKCSAgICBXKEYoImJhZCAnJXMnICVzIGNlcnQgZnJvbSAlc1xuIikgCgkgICAgICAlIG5h
bWUgJSBzaWduYXR1cmVfdHlwZSAlIHRtcC5rZXkpOwoJICB9CiAgICAgIH0KICAgIGNhdGNo
IChzdGQ6OmV4Y2VwdGlvbiAmIGUpCiAgICAgIHsKCVcoRigic3RkOjpleGNlcHRpb24gaW4g
c3FsaXRlIHZhbGlkX2NlcnRzOjpjaGVja19zaW5nbGVfc2lnbmVyOiAlc1xuIikgJSBlLndo
YXQoKSk7CiAgICAgIH0KICAgIGNhdGNoICguLi4pCiAgICAgIHsKCVcoRigidW5rbm93biBl
eGNlcHRpb24gaW4gc3FsaXRlIHZhbGlkX2NlcnRzOjpjaGVja19zaW5nbGVfc2lnbmVyXG4i
KSk7CiAgICAgIH0KICB9Cn07CgpleHRlcm4gIkMiCnsKCnN0YXRpYyB2b2lkCnRydXN0ZWRf
c3RlcF9jYWxsYmFjayhzcWxpdGVfZnVuYyAqIGZuX2N0eCwgCgkJICAgICAgaW50IGFyZ2Ms
IAoJCSAgICAgIGNoYXIgY29uc3QgKiogYXJndikKewogIGFwcF9zdGF0ZSAqIGFwcCA9IE5V
TEw7IAogIHZhbGlkX2NlcnRzICoqIHZwcDsKCiAgSShmbl9jdHgpOwogIEkoYXJnYyA9PSA4
KTsKICBJKGFyZ3YpOwogIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgODsgKytpKQogICAgSShh
cmd2W2ldKTsKCiAgYXBwID0gc3RhdGljX2Nhc3Q8YXBwX3N0YXRlICo+KHNxbGl0ZV91c2Vy
X2RhdGEoZm5fY3R4KSk7CiAgSShhcHApOwogIHZwcCA9IHN0YXRpY19jYXN0PHZhbGlkX2Nl
cnRzICoqPihzcWxpdGVfYWdncmVnYXRlX2NvbnRleHQoZm5fY3R4LCBzaXplb2YodmFsaWRf
Y2VydHMgKikpKTsKICBJKHZwcCk7CiAgaWYgKCEgKCp2cHApKQogICAgKnZwcCA9IG5ldyB2
YWxpZF9jZXJ0cyhzdHJpbmcoYXJndlswXSkpOwogIEkoKnZwcCk7CiAgKCp2cHApLT5jaGVj
a19zaW5nbGVfc2lnbmVyKCphcHAsIGFyZ2MtMSwgYXJndisxKTsgIAp9CgpzdGF0aWMgdm9p
ZAp0cnVzdGVkX2ZpbmFsaXplX2NhbGxiYWNrKHNxbGl0ZV9mdW5jICogZm5fY3R4KQp7CiAg
YXBwX3N0YXRlICogYXBwID0gTlVMTDsgCiAgdmFsaWRfY2VydHMgKiogdnBwOwogIGFwcCA9
IHN0YXRpY19jYXN0PGFwcF9zdGF0ZSAqPihzcWxpdGVfdXNlcl9kYXRhKGZuX2N0eCkpOwog
IEkoYXBwKTsKICB2cHAgPSBzdGF0aWNfY2FzdDx2YWxpZF9jZXJ0cyAqKj4oc3FsaXRlX2Fn
Z3JlZ2F0ZV9jb250ZXh0KGZuX2N0eCwgc2l6ZW9mKHZhbGlkX2NlcnRzICopKSk7CgogIEko
dnBwKTsKICBJKCp2cHApOwoKICBpZiAoKCp2cHApLT5jaGVja19zaWduZXJfdHJ1c3QoKmFw
cCkpCiAgICBzcWxpdGVfc2V0X3Jlc3VsdF9pbnQoZm5fY3R4LCAxKTsKICBlbHNlCiAgICBz
cWxpdGVfc2V0X3Jlc3VsdF9pbnQoZm5fY3R4LCAwKTsKCiAgZGVsZXRlICgqdnBwKTsKfQp9
CgoKdm9pZApkYXRhYmFzZTo6aW5zdGFsbF9mdW5jdGlvbnMoYXBwX3N0YXRlICogYXBwKQp7
CiAgLy8gcmVnaXN0ZXIgYW55IGZ1bmN0aW9ucyB3ZSdyZSBnb2luZyB0byB1c2UKICBJKHNx
bGl0ZV9jcmVhdGVfZnVuY3Rpb24oc3FsKCksICJ1bmJhc2U2NCIsIC0xLCAKCQkJICAgJnNx
bGl0ZV91bmJhc2U2NF9mbiwgCgkJCSAgIE5VTEwpID09IDApOwoKICBJKHNxbGl0ZV9jcmVh
dGVfYWdncmVnYXRlKHNxbCgpLCAidHJ1c3RlZCIsIDgsIAoJCQkgICAgJnRydXN0ZWRfc3Rl
cF9jYWxsYmFjaywKCQkJICAgICZ0cnVzdGVkX2ZpbmFsaXplX2NhbGxiYWNrLAoJCQkgICAg
YXBwKSA9PSAwKTsKfQoKdm9pZApkYXRhYmFzZTo6aW5zdGFsbF92aWV3cygpCnsKICAvLyBk
ZWxldGUgYW55IGV4aXN0aW5nIHZpZXdzCiAgcmVzdWx0cyByZXM7CiAgZmV0Y2gocmVzLCBv
bmVfY29sLCBhbnlfcm93cywKCSJTRUxFQ1QgbmFtZSBGUk9NIHNxbGl0ZV9tYXN0ZXIgV0hF
UkUgdHlwZT0ndmlldyciKTsKICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlcy5zaXplKCk7
ICsraSkKICAgIHsKICAgICAgZXhlY3V0ZSgiRFJPUCBWSUVXICclcSciLCByZXNbaV1bMF0u
Y19zdHIoKSk7CiAgICB9CiAgLy8gcmVnaXN0ZXIgYW55IHZpZXdzIHdlJ3JlIGdvaW5nIHRv
IHVzZQogIGV4ZWN1dGUodmlld3NfY29uc3RhbnQpOwp9Cgp2b2lkIApkYXRhYmFzZTo6Z2V0
X2hlYWRzKGJhc2U2NDxjZXJ0X3ZhbHVlPiBjb25zdCAmIGJyYW5jaCwKCQkgICAgc3RkOjpz
ZXQ8cmV2aXNpb25faWQ+ICYgaGVhZHMpCnsKICByZXN1bHRzIHJlczsKICBmZXRjaChyZXMs
IG9uZV9jb2wsIGFueV9yb3dzLAoJIlNFTEVDVCBpZCAiCgkiRlJPTSBicmFuY2hfaGVhZHMg
IgoJIldIRVJFIHZhbHVlID0gJyVxJyIsCglicmFuY2goKS5jX3N0cigpKTsKICBoZWFkcy5j
bGVhcigpOwogIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzLnNpemUoKTsgKytpKQogICAg
ewogICAgICBoZWFkcy5pbnNlcnQocmV2aXNpb25faWQocmVzW2ldWzBdKSk7CiAgICB9Cn0K
CnZvaWQgCmRhdGFiYXNlOjpnZXRfY2VydHMoaGV4ZW5jPGlkPiBjb25zdCAmIGlkZW50LCAK
CQkgICAgdmVjdG9yPGNlcnQ+ICYgY2VydHMsCQkJCgkJICAgIHN0cmluZyBjb25zdCAmIHRh
YmxlKQp7CiAgcmVzdWx0cyByZXM7CiAgZmV0Y2gocmVzLCA1LCBhbnlfcm93cywgCgkiU0VM
RUNUIGlkLCBuYW1lLCB2YWx1ZSwga2V5cGFpciwgc2lnbmF0dXJlIEZST00gJyVxJyAiCgki
V0hFUkUgaWQgPSAnJXEnIiwgCgl0YWJsZS5jX3N0cigpLCAJCglpZGVudCgpLmNfc3RyKCkp
OwogIHJlc3VsdHNfdG9fY2VydHMocmVzLCBjZXJ0cyk7Cn0KCgp2b2lkIApkYXRhYmFzZTo6
Z2V0X2NlcnRzKGNlcnRfbmFtZSBjb25zdCAmIG5hbWUsIAkgICAgICAKCQkgICAgdmVjdG9y
PGNlcnQ+ICYgY2VydHMsCgkJICAgIHN0cmluZyBjb25zdCAmIHRhYmxlKQp7CiAgcmVzdWx0
cyByZXM7CiAgZmV0Y2gocmVzLCA1LCBhbnlfcm93cywgCgkiU0VMRUNUIGlkLCBuYW1lLCB2
YWx1ZSwga2V5cGFpciwgc2lnbmF0dXJlICIKCSJGUk9NICclcScgV0hFUkUgbmFtZSA9ICcl
cSciLCAKCXRhYmxlLmNfc3RyKCksIAkKCW5hbWUoKS5jX3N0cigpKTsKICByZXN1bHRzX3Rv
X2NlcnRzKHJlcywgY2VydHMpOwp9CgoKdm9pZCAKZGF0YWJhc2U6OmdldF9jZXJ0cyhoZXhl
bmM8aWQ+IGNvbnN0ICYgaWRlbnQsIAoJCSAgICBjZXJ0X25hbWUgY29uc3QgJiBuYW1lLCAJ
ICAgICAgCgkJICAgIHZlY3RvcjxjZXJ0PiAmIGNlcnRzLAoJCSAgICBzdHJpbmcgY29uc3Qg
JiB0YWJsZSkKewogIHJlc3VsdHMgcmVzOwogIGZldGNoKHJlcywgNSwgYW55X3Jvd3MsIAoJ
IlNFTEVDVCBpZCwgbmFtZSwgdmFsdWUsIGtleXBhaXIsIHNpZ25hdHVyZSAiCgkiRlJPTSAn
JXEnICIKCSJXSEVSRSBpZCA9ICclcScgQU5EIG5hbWUgPSAnJXEnIiwgCgl0YWJsZS5jX3N0
cigpLCAJCglpZGVudCgpLmNfc3RyKCksCgluYW1lKCkuY19zdHIoKSk7CiAgcmVzdWx0c190
b19jZXJ0cyhyZXMsIGNlcnRzKTsKfQoKdm9pZCAKZGF0YWJhc2U6OmdldF9jZXJ0cyhjZXJ0
X25hbWUgY29uc3QgJiBuYW1lLAoJCSAgICBiYXNlNjQ8Y2VydF92YWx1ZT4gY29uc3QgJiB2
YWwsIAoJCSAgICB2ZWN0b3I8Y2VydD4gJiBjZXJ0cywKCQkgICAgc3RyaW5nIGNvbnN0ICYg
dGFibGUpCnsKICByZXN1bHRzIHJlczsKICBmZXRjaChyZXMsIDUsIGFueV9yb3dzLCAKCSJT
RUxFQ1QgaWQsIG5hbWUsIHZhbHVlLCBrZXlwYWlyLCBzaWduYXR1cmUgIgoJIkZST00gJyVx
JyAiCgkiV0hFUkUgbmFtZSA9ICclcScgQU5EIHZhbHVlID0gJyVxJyIsIAoJdGFibGUuY19z
dHIoKSwgCQoJbmFtZSgpLmNfc3RyKCksCgl2YWwoKS5jX3N0cigpKTsKICByZXN1bHRzX3Rv
X2NlcnRzKHJlcywgY2VydHMpOwp9CgoKdm9pZCAKZGF0YWJhc2U6OmdldF9jZXJ0cyhoZXhl
bmM8aWQ+IGNvbnN0ICYgaWRlbnQsIAoJCSAgICBjZXJ0X25hbWUgY29uc3QgJiBuYW1lLCAJ
ICAgICAgCgkJICAgIGJhc2U2NDxjZXJ0X3ZhbHVlPiBjb25zdCAmIHZhbHVlLAoJCSAgICB2
ZWN0b3I8Y2VydD4gJiBjZXJ0cywKCQkgICAgc3RyaW5nIGNvbnN0ICYgdGFibGUpCnsKICBy
ZXN1bHRzIHJlczsKICBmZXRjaChyZXMsIDUsIGFueV9yb3dzLCAKCSJTRUxFQ1QgaWQsIG5h
bWUsIHZhbHVlLCBrZXlwYWlyLCBzaWduYXR1cmUgIgoJIkZST00gJyVxJyAiCgkiV0hFUkUg
aWQgPSAnJXEnIEFORCBuYW1lID0gJyVxJyBBTkQgdmFsdWUgPSAnJXEnIiwgCgl0YWJsZS5j
X3N0cigpLCAJCglpZGVudCgpLmNfc3RyKCksCgluYW1lKCkuY19zdHIoKSwKCXZhbHVlKCku
Y19zdHIoKSk7CiAgcmVzdWx0c190b19jZXJ0cyhyZXMsIGNlcnRzKTsKfQoKCgpib29sIApk
YXRhYmFzZTo6cmV2aXNpb25fY2VydF9leGlzdHMocmV2aXNpb248Y2VydD4gY29uc3QgJiBj
ZXJ0KQp7IAogIHJldHVybiBjZXJ0X2V4aXN0cyhjZXJ0LmlubmVyKCksICJyZXZpc2lvbl9j
ZXJ0cyIpOyAKfQoKYm9vbCAKZGF0YWJhc2U6Om1hbmlmZXN0X2NlcnRfZXhpc3RzKG1hbmlm
ZXN0PGNlcnQ+IGNvbnN0ICYgY2VydCkKeyAKICByZXR1cm4gY2VydF9leGlzdHMoY2VydC5p
bm5lcigpLCAibWFuaWZlc3RfY2VydHMiKTsgCn0KCmJvb2wgCmRhdGFiYXNlOjpmaWxlX2Nl
cnRfZXhpc3RzKGZpbGU8Y2VydD4gY29uc3QgJiBjZXJ0KQp7IAogIHJldHVybiBjZXJ0X2V4
aXN0cyhjZXJ0LmlubmVyKCksICJmaWxlX2NlcnRzIik7IAp9Cgp2b2lkIApkYXRhYmFzZTo6
cHV0X21hbmlmZXN0X2NlcnQobWFuaWZlc3Q8Y2VydD4gY29uc3QgJiBjZXJ0KQp7IAogIHB1
dF9jZXJ0KGNlcnQuaW5uZXIoKSwgIm1hbmlmZXN0X2NlcnRzIik7IAp9Cgp2b2lkIApkYXRh
YmFzZTo6cHV0X3JldmlzaW9uX2NlcnQocmV2aXNpb248Y2VydD4gY29uc3QgJiBjZXJ0KQp7
IAogIHB1dF9jZXJ0KGNlcnQuaW5uZXIoKSwgInJldmlzaW9uX2NlcnRzIik7IAp9Cgp2b2lk
IApkYXRhYmFzZTo6cHV0X2ZpbGVfY2VydChmaWxlPGNlcnQ+IGNvbnN0ICYgY2VydCkKeyAK
ICBwdXRfY2VydChjZXJ0LmlubmVyKCksICJmaWxlX2NlcnRzIik7IAp9Cgp2b2lkIApkYXRh
YmFzZTo6Z2V0X2ZpbGVfY2VydHMoY2VydF9uYW1lIGNvbnN0ICYgbmFtZSwgCgkJCSB2ZWN0
b3I8IGZpbGU8Y2VydD4gPiAmIHRzKQp7CiAgdmVjdG9yPGNlcnQ+IGNlcnRzOwogIGdldF9j
ZXJ0cyhuYW1lLCBjZXJ0cywgImZpbGVfY2VydHMiKTsKICB0cy5jbGVhcigpOwogIGNvcHko
Y2VydHMuYmVnaW4oKSwgY2VydHMuZW5kKCksIGJhY2tfaW5zZXJ0ZXIodHMpKTsgIAp9Cgp2
b2lkIApkYXRhYmFzZTo6Z2V0X2ZpbGVfY2VydHMoZmlsZV9pZCBjb25zdCAmIGlkLCAKCQkJ
IGNlcnRfbmFtZSBjb25zdCAmIG5hbWUsIAoJCQkgdmVjdG9yPCBmaWxlPGNlcnQ+ID4gJiB0
cykKewogIHZlY3RvcjxjZXJ0PiBjZXJ0czsKICBnZXRfY2VydHMoaWQuaW5uZXIoKSwgbmFt
ZSwgY2VydHMsICJmaWxlX2NlcnRzIik7CiAgdHMuY2xlYXIoKTsKICBjb3B5KGNlcnRzLmJl
Z2luKCksIGNlcnRzLmVuZCgpLCBiYWNrX2luc2VydGVyKHRzKSk7ICAgIAp9Cgp2b2lkIApk
YXRhYmFzZTo6Z2V0X2ZpbGVfY2VydHMoY2VydF9uYW1lIGNvbnN0ICYgbmFtZSwKCQkJIGJh
c2U2NDxjZXJ0X3ZhbHVlPiBjb25zdCAmIHZhbCwgCgkJCSB2ZWN0b3I8IGZpbGU8Y2VydD4g
PiAmIHRzKQp7CiAgdmVjdG9yPGNlcnQ+IGNlcnRzOwogIGdldF9jZXJ0cyhuYW1lLCB2YWws
IGNlcnRzLCAiZmlsZV9jZXJ0cyIpOwogIHRzLmNsZWFyKCk7CiAgY29weShjZXJ0cy5iZWdp
bigpLCBjZXJ0cy5lbmQoKSwgYmFja19pbnNlcnRlcih0cykpOyAgCn0KCnZvaWQgCmRhdGFi
YXNlOjpnZXRfZmlsZV9jZXJ0cyhmaWxlX2lkIGNvbnN0ICYgaWQsIAoJCQkgY2VydF9uYW1l
IGNvbnN0ICYgbmFtZSwKCQkJIGJhc2U2NDxjZXJ0X3ZhbHVlPiBjb25zdCAmIHZhbCwgCgkJ
CSB2ZWN0b3I8IGZpbGU8Y2VydD4gPiAmIHRzKQp7CiAgdmVjdG9yPGNlcnQ+IGNlcnRzOwog
IGdldF9jZXJ0cyhpZC5pbm5lcigpLCBuYW1lLCB2YWwsIGNlcnRzLCAiZmlsZV9jZXJ0cyIp
OwogIHRzLmNsZWFyKCk7CiAgY29weShjZXJ0cy5iZWdpbigpLCBjZXJ0cy5lbmQoKSwgYmFj
a19pbnNlcnRlcih0cykpOyAgCn0KCnZvaWQgCmRhdGFiYXNlOjpnZXRfZmlsZV9jZXJ0cyhm
aWxlX2lkIGNvbnN0ICYgaWQsIAoJCQkgdmVjdG9yPCBmaWxlPGNlcnQ+ID4gJiB0cykKeyAK
ICB2ZWN0b3I8Y2VydD4gY2VydHM7CiAgZ2V0X2NlcnRzKGlkLmlubmVyKCksIGNlcnRzLCAi
ZmlsZV9jZXJ0cyIpOyAKICB0cy5jbGVhcigpOwogIGNvcHkoY2VydHMuYmVnaW4oKSwgY2Vy
dHMuZW5kKCksIGJhY2tfaW5zZXJ0ZXIodHMpKTsKfQoKCmJvb2wgCmRhdGFiYXNlOjpmaWxl
X2NlcnRfZXhpc3RzKGhleGVuYzxpZD4gY29uc3QgJiBoYXNoKQp7CiAgcmVzdWx0cyByZXM7
CiAgdmVjdG9yPGNlcnQ+IGNlcnRzOwogIGZldGNoKHJlcywgb25lX2NvbCwgYW55X3Jvd3Ms
IAoJIlNFTEVDVCBpZCAiCgkiRlJPTSBmaWxlX2NlcnRzICIKCSJXSEVSRSBoYXNoID0gJyVx
JyIsIAoJaGFzaCgpLmNfc3RyKCkpOwogIEkocmVzLnNpemUoKSA9PSAwIHx8IHJlcy5zaXpl
KCkgPT0gMSk7CiAgcmV0dXJuIChyZXMuc2l6ZSgpID09IDEpOwp9Cgp2b2lkIApkYXRhYmFz
ZTo6Z2V0X2ZpbGVfY2VydChoZXhlbmM8aWQ+IGNvbnN0ICYgaGFzaCwKCQkJZmlsZTxjZXJ0
PiAmIGMpCnsKICByZXN1bHRzIHJlczsKICB2ZWN0b3I8Y2VydD4gY2VydHM7CiAgZmV0Y2go
cmVzLCA1LCBvbmVfcm93LCAKCSJTRUxFQ1QgaWQsIG5hbWUsIHZhbHVlLCBrZXlwYWlyLCBz
aWduYXR1cmUgIgoJIkZST00gZmlsZV9jZXJ0cyAiCgkiV0hFUkUgaGFzaCA9ICclcSciLCAK
CWhhc2goKS5jX3N0cigpKTsKICByZXN1bHRzX3RvX2NlcnRzKHJlcywgY2VydHMpOwogIEko
Y2VydHMuc2l6ZSgpID09IDEpOwogIGMgPSBmaWxlPGNlcnQ+KGNlcnRzWzBdKTsKfQoKCgp2
b2lkIApkYXRhYmFzZTo6Z2V0X3JldmlzaW9uX2NlcnRzKGNlcnRfbmFtZSBjb25zdCAmIG5h
bWUsIAoJCQkgICAgdmVjdG9yPCByZXZpc2lvbjxjZXJ0PiA+ICYgdHMpCnsKICB2ZWN0b3I8
Y2VydD4gY2VydHM7CiAgZ2V0X2NlcnRzKG5hbWUsIGNlcnRzLCAicmV2aXNpb25fY2VydHMi
KTsKICB0cy5jbGVhcigpOwogIGNvcHkoY2VydHMuYmVnaW4oKSwgY2VydHMuZW5kKCksIGJh
Y2tfaW5zZXJ0ZXIodHMpKTsgIAp9Cgp2b2lkIApkYXRhYmFzZTo6Z2V0X3JldmlzaW9uX2Nl
cnRzKHJldmlzaW9uX2lkIGNvbnN0ICYgaWQsIAoJCQkgICAgY2VydF9uYW1lIGNvbnN0ICYg
bmFtZSwgCgkJCSAgICB2ZWN0b3I8IHJldmlzaW9uPGNlcnQ+ID4gJiB0cykKewogIHZlY3Rv
cjxjZXJ0PiBjZXJ0czsKICBnZXRfY2VydHMoaWQuaW5uZXIoKSwgbmFtZSwgY2VydHMsICJy
ZXZpc2lvbl9jZXJ0cyIpOwogIHRzLmNsZWFyKCk7CiAgY29weShjZXJ0cy5iZWdpbigpLCBj
ZXJ0cy5lbmQoKSwgYmFja19pbnNlcnRlcih0cykpOyAgCn0KCnZvaWQgCmRhdGFiYXNlOjpn
ZXRfcmV2aXNpb25fY2VydHMocmV2aXNpb25faWQgY29uc3QgJiBpZCwgCgkJCSAgICBjZXJ0
X25hbWUgY29uc3QgJiBuYW1lLAoJCQkgICAgYmFzZTY0PGNlcnRfdmFsdWU+IGNvbnN0ICYg
dmFsLCAKCQkJICAgIHZlY3RvcjwgcmV2aXNpb248Y2VydD4gPiAmIHRzKQp7CiAgdmVjdG9y
PGNlcnQ+IGNlcnRzOwogIGdldF9jZXJ0cyhpZC5pbm5lcigpLCBuYW1lLCB2YWwsIGNlcnRz
LCAicmV2aXNpb25fY2VydHMiKTsKICB0cy5jbGVhcigpOwogIGNvcHkoY2VydHMuYmVnaW4o
KSwgY2VydHMuZW5kKCksIGJhY2tfaW5zZXJ0ZXIodHMpKTsgIAp9Cgp2b2lkIApkYXRhYmFz
ZTo6Z2V0X3JldmlzaW9uX2NlcnRzKGNlcnRfbmFtZSBjb25zdCAmIG5hbWUsCgkJCSAgICBi
YXNlNjQ8Y2VydF92YWx1ZT4gY29uc3QgJiB2YWwsIAoJCQkgICAgdmVjdG9yPCByZXZpc2lv
bjxjZXJ0PiA+ICYgdHMpCnsKICB2ZWN0b3I8Y2VydD4gY2VydHM7CiAgZ2V0X2NlcnRzKG5h
bWUsIHZhbCwgY2VydHMsICJyZXZpc2lvbl9jZXJ0cyIpOwogIHRzLmNsZWFyKCk7CiAgY29w
eShjZXJ0cy5iZWdpbigpLCBjZXJ0cy5lbmQoKSwgYmFja19pbnNlcnRlcih0cykpOyAgCn0K
CnZvaWQgCmRhdGFiYXNlOjpnZXRfcmV2aXNpb25fY2VydHMocmV2aXNpb25faWQgY29uc3Qg
JiBpZCwgCgkJCSAgICB2ZWN0b3I8IHJldmlzaW9uPGNlcnQ+ID4gJiB0cykKeyAKICB2ZWN0
b3I8Y2VydD4gY2VydHM7CiAgZ2V0X2NlcnRzKGlkLmlubmVyKCksIGNlcnRzLCAicmV2aXNp
b25fY2VydHMiKTsgCiAgdHMuY2xlYXIoKTsKICBjb3B5KGNlcnRzLmJlZ2luKCksIGNlcnRz
LmVuZCgpLCBiYWNrX2luc2VydGVyKHRzKSk7Cn0KCnZvaWQgCmRhdGFiYXNlOjpnZXRfcmV2
aXNpb25fY2VydChoZXhlbmM8aWQ+IGNvbnN0ICYgaGFzaCwKCQkJICAgcmV2aXNpb248Y2Vy
dD4gJiBjKQp7CiAgcmVzdWx0cyByZXM7CiAgdmVjdG9yPGNlcnQ+IGNlcnRzOwogIGZldGNo
KHJlcywgNSwgb25lX3JvdywgCgkiU0VMRUNUIGlkLCBuYW1lLCB2YWx1ZSwga2V5cGFpciwg
c2lnbmF0dXJlICIKCSJGUk9NIHJldmlzaW9uX2NlcnRzICIKCSJXSEVSRSBoYXNoID0gJyVx
JyIsIAoJaGFzaCgpLmNfc3RyKCkpOwogIHJlc3VsdHNfdG9fY2VydHMocmVzLCBjZXJ0cyk7
CiAgSShjZXJ0cy5zaXplKCkgPT0gMSk7CiAgYyA9IHJldmlzaW9uPGNlcnQ+KGNlcnRzWzBd
KTsKfQoKYm9vbCAKZGF0YWJhc2U6OnJldmlzaW9uX2NlcnRfZXhpc3RzKGhleGVuYzxpZD4g
Y29uc3QgJiBoYXNoKQp7CiAgcmVzdWx0cyByZXM7CiAgdmVjdG9yPGNlcnQ+IGNlcnRzOwog
IGZldGNoKHJlcywgb25lX2NvbCwgYW55X3Jvd3MsIAoJIlNFTEVDVCBpZCAiCgkiRlJPTSBy
ZXZpc2lvbl9jZXJ0cyAiCgkiV0hFUkUgaGFzaCA9ICclcSciLCAKCWhhc2goKS5jX3N0cigp
KTsKICBJKHJlcy5zaXplKCkgPT0gMCB8fCByZXMuc2l6ZSgpID09IDEpOwogIHJldHVybiAo
cmVzLnNpemUoKSA9PSAxKTsKfQoKYm9vbCAKZGF0YWJhc2U6Om1hbmlmZXN0X2NlcnRfZXhp
c3RzKGhleGVuYzxpZD4gY29uc3QgJiBoYXNoKQp7CiAgcmVzdWx0cyByZXM7CiAgdmVjdG9y
PGNlcnQ+IGNlcnRzOwogIGZldGNoKHJlcywgb25lX2NvbCwgYW55X3Jvd3MsIAoJIlNFTEVD
VCBpZCAiCgkiRlJPTSBtYW5pZmVzdF9jZXJ0cyAiCgkiV0hFUkUgaGFzaCA9ICclcSciLCAK
CWhhc2goKS5jX3N0cigpKTsKICBJKHJlcy5zaXplKCkgPT0gMCB8fCByZXMuc2l6ZSgpID09
IDEpOwogIHJldHVybiAocmVzLnNpemUoKSA9PSAxKTsKfQoKdm9pZCAKZGF0YWJhc2U6Omdl
dF9tYW5pZmVzdF9jZXJ0KGhleGVuYzxpZD4gY29uc3QgJiBoYXNoLAoJCQkgICAgbWFuaWZl
c3Q8Y2VydD4gJiBjKQp7CiAgcmVzdWx0cyByZXM7CiAgdmVjdG9yPGNlcnQ+IGNlcnRzOwog
IGZldGNoKHJlcywgNSwgb25lX3JvdywgCgkiU0VMRUNUIGlkLCBuYW1lLCB2YWx1ZSwga2V5
cGFpciwgc2lnbmF0dXJlICIKCSJGUk9NIG1hbmlmZXN0X2NlcnRzICIKCSJXSEVSRSBoYXNo
ID0gJyVxJyIsIAoJaGFzaCgpLmNfc3RyKCkpOwogIHJlc3VsdHNfdG9fY2VydHMocmVzLCBj
ZXJ0cyk7CiAgSShjZXJ0cy5zaXplKCkgPT0gMSk7CiAgYyA9IG1hbmlmZXN0PGNlcnQ+KGNl
cnRzWzBdKTsKfQoKdm9pZCAKZGF0YWJhc2U6OmdldF9tYW5pZmVzdF9jZXJ0cyhtYW5pZmVz
dF9pZCBjb25zdCAmIGlkLCAKCQkJICAgICB2ZWN0b3I8IG1hbmlmZXN0PGNlcnQ+ID4gJiB0
cykKeyAKICB2ZWN0b3I8Y2VydD4gY2VydHM7CiAgZ2V0X2NlcnRzKGlkLmlubmVyKCksIGNl
cnRzLCAibWFuaWZlc3RfY2VydHMiKTsgCiAgdHMuY2xlYXIoKTsKICBjb3B5KGNlcnRzLmJl
Z2luKCksIGNlcnRzLmVuZCgpLCBiYWNrX2luc2VydGVyKHRzKSk7Cn0KCgp2b2lkIApkYXRh
YmFzZTo6Z2V0X21hbmlmZXN0X2NlcnRzKGNlcnRfbmFtZSBjb25zdCAmIG5hbWUsIAoJCQkg
ICAgdmVjdG9yPCBtYW5pZmVzdDxjZXJ0PiA+ICYgdHMpCnsKICB2ZWN0b3I8Y2VydD4gY2Vy
dHM7CiAgZ2V0X2NlcnRzKG5hbWUsIGNlcnRzLCAibWFuaWZlc3RfY2VydHMiKTsKICB0cy5j
bGVhcigpOwogIGNvcHkoY2VydHMuYmVnaW4oKSwgY2VydHMuZW5kKCksIGJhY2tfaW5zZXJ0
ZXIodHMpKTsgIAp9Cgp2b2lkIApkYXRhYmFzZTo6Z2V0X21hbmlmZXN0X2NlcnRzKG1hbmlm
ZXN0X2lkIGNvbnN0ICYgaWQsIAoJCQkgICAgIGNlcnRfbmFtZSBjb25zdCAmIG5hbWUsIAoJ
CQkgICAgIHZlY3RvcjwgbWFuaWZlc3Q8Y2VydD4gPiAmIHRzKQp7CiAgdmVjdG9yPGNlcnQ+
IGNlcnRzOwogIGdldF9jZXJ0cyhpZC5pbm5lcigpLCBuYW1lLCBjZXJ0cywgIm1hbmlmZXN0
X2NlcnRzIik7CiAgdHMuY2xlYXIoKTsKICBjb3B5KGNlcnRzLmJlZ2luKCksIGNlcnRzLmVu
ZCgpLCBiYWNrX2luc2VydGVyKHRzKSk7ICAKfQoKCi8vIGNvbXBsZXRpb25zCnZvaWQgCmRh
dGFiYXNlOjpjb21wbGV0ZShzdHJpbmcgY29uc3QgJiBwYXJ0aWFsLAoJCSAgIHNldDxyZXZp
c2lvbl9pZD4gJiBjb21wbGV0aW9ucykKewogIHJlc3VsdHMgcmVzOwogIGNvbXBsZXRpb25z
LmNsZWFyKCk7CgogIGZldGNoKHJlcywgMSwgYW55X3Jvd3MsCgkiU0VMRUNUIGlkIEZST00g
cmV2aXNpb25zIFdIRVJFIGlkIEdMT0IgJyVxKiciLAoJcGFydGlhbC5jX3N0cigpKTsKCiAg
Zm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXMuc2l6ZSgpOyArK2kpCiAgICBjb21wbGV0aW9u
cy5pbnNlcnQocmV2aXNpb25faWQocmVzW2ldWzBdKSk7ICAKfQoKCnZvaWQgCmRhdGFiYXNl
Ojpjb21wbGV0ZShzdHJpbmcgY29uc3QgJiBwYXJ0aWFsLAoJCSAgIHNldDxtYW5pZmVzdF9p
ZD4gJiBjb21wbGV0aW9ucykKewogIHJlc3VsdHMgcmVzOwogIGNvbXBsZXRpb25zLmNsZWFy
KCk7CgogIGZldGNoKHJlcywgMSwgYW55X3Jvd3MsCgkiU0VMRUNUIGlkIEZST00gbWFuaWZl
c3RzIFdIRVJFIGlkIEdMT0IgJyVxKiciLAoJcGFydGlhbC5jX3N0cigpKTsKCiAgZm9yIChz
aXplX3QgaSA9IDA7IGkgPCByZXMuc2l6ZSgpOyArK2kpCiAgICBjb21wbGV0aW9ucy5pbnNl
cnQobWFuaWZlc3RfaWQocmVzW2ldWzBdKSk7ICAKICAKICByZXMuY2xlYXIoKTsKCiAgZmV0
Y2gocmVzLCAxLCBhbnlfcm93cywKCSJTRUxFQ1QgaWQgRlJPTSBtYW5pZmVzdF9kZWx0YXMg
V0hFUkUgaWQgR0xPQiAnJXEqJyIsCglwYXJ0aWFsLmNfc3RyKCkpOwoKICBmb3IgKHNpemVf
dCBpID0gMDsgaSA8IHJlcy5zaXplKCk7ICsraSkKICAgIGNvbXBsZXRpb25zLmluc2VydCht
YW5pZmVzdF9pZChyZXNbaV1bMF0pKTsgIAp9Cgp2b2lkIApkYXRhYmFzZTo6Y29tcGxldGUo
c3RyaW5nIGNvbnN0ICYgcGFydGlhbCwKCQkgICBzZXQ8ZmlsZV9pZD4gJiBjb21wbGV0aW9u
cykKewogIHJlc3VsdHMgcmVzOwogIGNvbXBsZXRpb25zLmNsZWFyKCk7CgogIGZldGNoKHJl
cywgMSwgYW55X3Jvd3MsCgkiU0VMRUNUIGlkIEZST00gZmlsZXMgV0hFUkUgaWQgR0xPQiAn
JXEqJyIsCglwYXJ0aWFsLmNfc3RyKCkpOwoKICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJl
cy5zaXplKCk7ICsraSkKICAgIGNvbXBsZXRpb25zLmluc2VydChmaWxlX2lkKHJlc1tpXVsw
XSkpOyAgCiAgCiAgcmVzLmNsZWFyKCk7CgogIGZldGNoKHJlcywgMSwgYW55X3Jvd3MsCgki
U0VMRUNUIGlkIEZST00gZmlsZV9kZWx0YXMgV0hFUkUgaWQgR0xPQiAnJXEqJyIsCglwYXJ0
aWFsLmNfc3RyKCkpOwoKICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlcy5zaXplKCk7ICsr
aSkKICAgIGNvbXBsZXRpb25zLmluc2VydChmaWxlX2lkKHJlc1tpXVswXSkpOyAgCn0KCnVz
aW5nIGNvbW1hbmRzOjpzZWxlY3Rvcl90eXBlOwoKc3RhdGljIHZvaWQgc2VsZWN0b3JfdG9f
Y2VydG5hbWUoc2VsZWN0b3JfdHlwZSB0eSwKCQkJCSBzdHJpbmcgJiBzKQp7CiAgc3dpdGNo
ICh0eSkKICAgIHsKICAgIGNhc2UgY29tbWFuZHM6OnNlbF9hdXRob3I6CiAgICAgIHMgPSBh
dXRob3JfY2VydF9uYW1lOwogICAgICBicmVhazsKICAgIGNhc2UgY29tbWFuZHM6OnNlbF9i
cmFuY2g6CiAgICAgIHMgPSBicmFuY2hfY2VydF9uYW1lOwogICAgICBicmVhazsKICAgIGNh
c2UgY29tbWFuZHM6OnNlbF9kYXRlOgogICAgICBzID0gZGF0ZV9jZXJ0X25hbWU7CiAgICAg
IGJyZWFrOwogICAgY2FzZSBjb21tYW5kczo6c2VsX3RhZzoKICAgICAgcyA9IHRhZ19jZXJ0
X25hbWU7CiAgICAgIGJyZWFrOwogICAgY2FzZSBjb21tYW5kczo6c2VsX2lkZW50OgogICAg
Y2FzZSBjb21tYW5kczo6c2VsX3Vua25vd246CiAgICAgIEkoZmFsc2UpOyAvLyBkb24ndCBk
byB0aGlzLgogICAgICBicmVhazsKICAgIH0KfQoKdm9pZCBkYXRhYmFzZTo6Y29tcGxldGUo
c2VsZWN0b3JfdHlwZSB0eSwKCQkJc3RyaW5nIGNvbnN0ICYgcGFydGlhbCwKCQkJdmVjdG9y
PHBhaXI8c2VsZWN0b3JfdHlwZSwgc3RyaW5nPiA+IGNvbnN0ICYgbGltaXQsCgkJCXNldDxz
dHJpbmc+ICYgY29tcGxldGlvbnMpCnsKICBjb21wbGV0aW9ucy5jbGVhcigpOwoKICAvLyBz
dGVwIDE6IHRoZSBsaW1pdCBpcyB0cmFuc2Zvcm1lZCBpbnRvIGFuIFNRTCBzZWxlY3Qgc3Rh
dGVtZW50IHdoaWNoCiAgLy8gc2VsZWN0cyBhIHNldCBvZiBJRHMgZnJvbSB0aGUgbWFuaWZl
c3RfY2VydHMgdGFibGUgd2hpY2ggbWF0Y2ggdGhlCiAgLy8gbGltaXQuICB0aGlzIGlzIGRv
bmUgYnkgYnVpbGRpbmcgYW4gU1FMIHNlbGVjdCBzdGF0ZW1lbnQgZm9yIGVhY2ggdGVybQog
IC8vIGluIHRoZSBsaW1pdCBhbmQgdGhlbiBJTlRFUlNFQ1RpbmcgdGhlbSBhbGwuCgogIHN0
cmluZyBsaW0gPSAiKCI7CiAgYm9vbCBmaXJzdF9saW1pdCA9IHRydWU7CiAgZm9yICh2ZWN0
b3I8cGFpcjxzZWxlY3Rvcl90eXBlLCBzdHJpbmc+ID46OmNvbnN0X2l0ZXJhdG9yIGkgPSBs
aW1pdC5iZWdpbigpOwogICAgICAgaSAhPSBsaW1pdC5lbmQoKTsgKytpKQogICAgewogICAg
ICBpZiAoZmlyc3RfbGltaXQpCglmaXJzdF9saW1pdCA9IGZhbHNlOwogICAgICBlbHNlCgls
aW0gKz0gIiBJTlRFUlNFQ1QgIjsKICAgICAgCiAgICAgIGlmIChpLT5maXJzdCA9PSBjb21t
YW5kczo6c2VsX2lkZW50KQoJewoJICBsaW0gKz0gIlNFTEVDVCBpZCBGUk9NIHJldmlzaW9u
X2NlcnRzICI7CgkgIGxpbSArPSAoRigiV0hFUkUgaWQgR0xPQiAnJXMqJyIpIAoJCSAgJSBp
LT5zZWNvbmQpLnN0cigpOwoJfQogICAgICBlbHNlIGlmIChpLT5maXJzdCA9PSBjb21tYW5k
czo6c2VsX3Vua25vd24pCgl7CgkgIGxpbSArPSAiU0VMRUNUIGlkIEZST00gcmV2aXNpb25f
Y2VydHMgIjsKCSAgbGltICs9IChGKCIgV0hFUkUgKG5hbWU9JyVzJyBPUiBuYW1lPSclcycg
T1IgbmFtZT0nJXMnKSIpCgkJICAlIGF1dGhvcl9jZXJ0X25hbWUgCgkJICAlIHRhZ19jZXJ0
X25hbWUgCgkJICAlIGJyYW5jaF9jZXJ0X25hbWUpLnN0cigpOwoJICBsaW0gKz0gKEYoIiBB
TkQgdW5iYXNlNjQodmFsdWUpIGdsb2IgJyolcyonIikKCQkgICUgaS0+c2Vjb25kKS5zdHIo
KTsJICAKCX0KICAgICAgZWxzZQoJewoJICBzdHJpbmcgY2VydG5hbWU7CgkgIHNlbGVjdG9y
X3RvX2NlcnRuYW1lKGktPmZpcnN0LCBjZXJ0bmFtZSk7CgkgIGxpbSArPSAiU0VMRUNUIGlk
IEZST00gcmV2aXNpb25fY2VydHMgIjsKCSAgbGltICs9IChGKCJXSEVSRSBuYW1lPSclcycg
QU5EIHVuYmFzZTY0KHZhbHVlKSBnbG9iICcqJXMqJyIpCgkJICAlIGNlcnRuYW1lICUgaS0+
c2Vjb25kKS5zdHIoKTsKCX0KICAgIH0KICBsaW0gKz0gIikiOwogIAogIC8vIHN0ZXAgMjog
ZGVwZW5kaW5nIG9uIHdoYXQgd2UndmUgYmVlbiBhc2tlZCB0byBkaXNhbWJpZ3VhdGUsIHdl
CiAgLy8gd2lsbCBjb21wbGV0ZSBlaXRoZXIgc29tZSBpZGVudHMsIG9yIGNlcnQgdmFsdWVz
LCBvciAidW5rbm93biIKICAvLyB3aGljaCBnZW5lcmFsbHkgbWVhbnMgImF1dGhvciwgdGFn
IG9yIGJyYW5jaCIKCiAgc3RyaW5nIHF1ZXJ5OwogIGlmICh0eSA9PSBjb21tYW5kczo6c2Vs
X2lkZW50KQogICAgewogICAgICBxdWVyeSA9IChGKCJTRUxFQ1QgaWQgRlJPTSAlcyIpICUg
bGltKS5zdHIoKTsKICAgIH0KICBlbHNlIAogICAgewogICAgICBxdWVyeSA9ICJTRUxFQ1Qg
dmFsdWUgRlJPTSByZXZpc2lvbl9jZXJ0cyBXSEVSRSI7CiAgICAgIGlmICh0eSA9PSBjb21t
YW5kczo6c2VsX3Vua25vd24pCgl7CSAgCQoJICBxdWVyeSArPSAKCSAgICAoRigiIChuYW1l
PSclcycgT1IgbmFtZT0nJXMnIE9SIG5hbWU9JyVzJykiKQoJICAgICAlIGF1dGhvcl9jZXJ0
X25hbWUgCgkgICAgICUgdGFnX2NlcnRfbmFtZSAKCSAgICAgJSBicmFuY2hfY2VydF9uYW1l
KS5zdHIoKTsKCX0KICAgICAgZWxzZQoJewoJICBzdHJpbmcgY2VydG5hbWU7CgkgIHNlbGVj
dG9yX3RvX2NlcnRuYW1lKHR5LCBjZXJ0bmFtZSk7CgkgIHF1ZXJ5ICs9IAoJICAgIChGKCIg
KG5hbWU9JyVzJykiKSAlIGNlcnRuYW1lKS5zdHIoKTsKCX0KICAgICAgICAKICAgICAgcXVl
cnkgKz0gKEYoIiBBTkQgKHVuYmFzZTY0KHZhbHVlKSBHTE9CICcqJXMqJykiKSAlIHBhcnRp
YWwpLnN0cigpOwogICAgICBxdWVyeSArPSAoRigiIEFORCAoaWQgSU4gJXMpIikgJSBsaW0p
LnN0cigpOwogICAgfQoKICByZXN1bHRzIHJlczsKICBmZXRjaChyZXMsIG9uZV9jb2wsIGFu
eV9yb3dzLCBxdWVyeS5jX3N0cigpKTsKICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlcy5z
aXplKCk7ICsraSkKICAgIHsKICAgICAgaWYgKHR5ID09IGNvbW1hbmRzOjpzZWxfaWRlbnQp
Cgljb21wbGV0aW9ucy5pbnNlcnQocmVzW2ldWzBdKTsKICAgICAgZWxzZQoJewoJICBiYXNl
NjQ8ZGF0YT4gcm93X2VuY29kZWQocmVzW2ldWzBdKTsKCSAgZGF0YSByb3dfZGVjb2RlZDsK
CSAgZGVjb2RlX2Jhc2U2NChyb3dfZW5jb2RlZCwgcm93X2RlY29kZWQpOwoJICBjb21wbGV0
aW9ucy5pbnNlcnQocm93X2RlY29kZWQoKSk7Cgl9CiAgICB9Cn0KCgovLyBtZXJrbGUgbm9k
ZXMKCmJvb2wgCmRhdGFiYXNlOjptZXJrbGVfbm9kZV9leGlzdHMoc3RyaW5nIGNvbnN0ICYg
dHlwZSwKCQkJICAgICB1dGY4IGNvbnN0ICYgY29sbGVjdGlvbiwgCgkJCSAgICAgc2l6ZV90
IGxldmVsLAoJCQkgICAgIGhleGVuYzxwcmVmaXg+IGNvbnN0ICYgcHJlZml4KQp7CiAgcmVz
dWx0cyByZXM7CiAgZmV0Y2gocmVzLCBvbmVfY29sLCBvbmVfcm93LCAKCSJTRUxFQ1QgQ09V
TlQoKikgIgoJIkZST00gbWVya2xlX25vZGVzICIKCSJXSEVSRSB0eXBlID0gJyVxJyAiCgki
QU5EIGNvbGxlY3Rpb24gPSAnJXEnICIKCSJBTkQgbGV2ZWwgPSAlZCAiCgkiQU5EIHByZWZp
eCA9ICclcScgIiwKCXR5cGUuY19zdHIoKSwgY29sbGVjdGlvbigpLmNfc3RyKCksIGxldmVs
LCBwcmVmaXgoKS5jX3N0cigpKTsKICBzaXplX3Qgbl9ub2RlcyA9IGxleGljYWxfY2FzdDxz
aXplX3Q+KHJlc1swXVswXSk7CiAgSShuX25vZGVzID09IDAgfHwgbl9ub2RlcyA9PSAxKTsK
ICByZXR1cm4gbl9ub2RlcyA9PSAxOwp9Cgp2b2lkIApkYXRhYmFzZTo6Z2V0X21lcmtsZV9u
b2RlKHN0cmluZyBjb25zdCAmIHR5cGUsCgkJCSAgdXRmOCBjb25zdCAmIGNvbGxlY3Rpb24s
IAoJCQkgIHNpemVfdCBsZXZlbCwKCQkJICBoZXhlbmM8cHJlZml4PiBjb25zdCAmIHByZWZp
eCwKCQkJICBiYXNlNjQ8bWVya2xlPiAmIG5vZGUpCnsKICByZXN1bHRzIHJlczsKICBmZXRj
aChyZXMsIG9uZV9jb2wsIG9uZV9yb3csIAoJIlNFTEVDVCBib2R5ICIKCSJGUk9NIG1lcmts
ZV9ub2RlcyAiCgkiV0hFUkUgdHlwZSA9ICclcScgIgoJIkFORCBjb2xsZWN0aW9uID0gJyVx
JyAiCgkiQU5EIGxldmVsID0gJWQgIgoJIkFORCBwcmVmaXggPSAnJXEnIiwKCXR5cGUuY19z
dHIoKSwgY29sbGVjdGlvbigpLmNfc3RyKCksIGxldmVsLCBwcmVmaXgoKS5jX3N0cigpKTsK
ICBub2RlID0gcmVzWzBdWzBdOwp9Cgp2b2lkIApkYXRhYmFzZTo6cHV0X21lcmtsZV9ub2Rl
KHN0cmluZyBjb25zdCAmIHR5cGUsCgkJCSAgdXRmOCBjb25zdCAmIGNvbGxlY3Rpb24sIAoJ
CQkgIHNpemVfdCBsZXZlbCwKCQkJICBoZXhlbmM8cHJlZml4PiBjb25zdCAmIHByZWZpeCwJ
CQkJICAgICAgIAoJCQkgIGJhc2U2NDxtZXJrbGU+IGNvbnN0ICYgbm9kZSkKewogIGV4ZWN1
dGUoIklOU0VSVCBPUiBSRVBMQUNFICIKCSAgIklOVE8gbWVya2xlX25vZGVzICIKCSAgIlZB
TFVFUyAoJyVxJywgJyVxJywgJWQsICclcScsICclcScpIiwKCSAgdHlwZS5jX3N0cigpLCBj
b2xsZWN0aW9uKCkuY19zdHIoKSwgbGV2ZWwsIHByZWZpeCgpLmNfc3RyKCksIG5vZGUoKS5j
X3N0cigpKTsKfQoKdm9pZCAKZGF0YWJhc2U6OmVyYXNlX21lcmtsZV9ub2RlcyhzdHJpbmcg
Y29uc3QgJiB0eXBlLAoJCQkgICAgIHV0ZjggY29uc3QgJiBjb2xsZWN0aW9uKQp7CiAgZXhl
Y3V0ZSgiREVMRVRFIEZST00gbWVya2xlX25vZGVzICIKCSAgIldIRVJFIHR5cGUgPSAnJXEn
ICIKCSAgIkFORCBjb2xsZWN0aW9uID0gJyVxJyIsCgkgIHR5cGUuY19zdHIoKSwgY29sbGVj
dGlvbigpLmNfc3RyKCkpOwp9CgovLyB0cmFuc2FjdGlvbiBndWFyZHMKCnRyYW5zYWN0aW9u
X2d1YXJkOjp0cmFuc2FjdGlvbl9ndWFyZChkYXRhYmFzZSAmIGQpIDogY29tbWl0dGVkKGZh
bHNlKSwgZGIoZCkgCnsKICBkYi5iZWdpbl90cmFuc2FjdGlvbigpOwp9CnRyYW5zYWN0aW9u
X2d1YXJkOjp+dHJhbnNhY3Rpb25fZ3VhcmQoKQp7CiAgaWYgKGNvbW1pdHRlZCkKICAgIGRi
LmNvbW1pdF90cmFuc2FjdGlvbigpOwogIGVsc2UKICAgIGRiLnJvbGxiYWNrX3RyYW5zYWN0
aW9uKCk7Cn0KCnZvaWQgCnRyYW5zYWN0aW9uX2d1YXJkOjpjb21taXQoKQp7CiAgY29tbWl0
dGVkID0gdHJ1ZTsKfQoK
_ATEOF


cat >left.b64 <<'_ATEOF'
Ly8gY29weXJpZ2h0IChDKSAyMDAyLCAyMDAzIGdyYXlkb24gaG9hcmUgPGdyYXlkb25AcG9i
b3guY29tPgovLyBhbGwgcmlnaHRzIHJlc2VydmVkLgovLyBsaWNlbnNlZCB0byB0aGUgcHVi
bGljIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCAoPj0gMikKLy8gc2VlIHRoZSBm
aWxlIENPUFlJTkcgZm9yIGRldGFpbHMKCiNpbmNsdWRlIDxpdGVyYXRvcj4KI2luY2x1ZGUg
PGxpc3Q+CiNpbmNsdWRlIDxzZXQ+CiNpbmNsdWRlIDxzc3RyZWFtPgojaW5jbHVkZSA8dmVj
dG9yPgoKI2luY2x1ZGUgPHN0ZGFyZy5oPgoKI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIu
aHBwPgojaW5jbHVkZSA8Ym9vc3QvbGV4aWNhbF9jYXN0LmhwcD4KI2luY2x1ZGUgPGJvb3N0
L2ZpbGVzeXN0ZW0vcGF0aC5ocHA+CiNpbmNsdWRlIDxib29zdC9maWxlc3lzdGVtL29wZXJh
dGlvbnMuaHBwPgoKI2luY2x1ZGUgPHNxbGl0ZS5oPgoKI2luY2x1ZGUgImFwcF9zdGF0ZS5o
aCIKI2luY2x1ZGUgImNlcnQuaGgiCiNpbmNsdWRlICJjbGVhbnVwLmhoIgojaW5jbHVkZSAi
Y29uc3RhbnRzLmhoIgojaW5jbHVkZSAiZGF0YWJhc2UuaGgiCiNpbmNsdWRlICJrZXlzLmho
IgojaW5jbHVkZSAic2FuaXR5LmhoIgojaW5jbHVkZSAic2NoZW1hX21pZ3JhdGlvbi5oaCIK
I2luY2x1ZGUgImNlcnQuaGgiCiNpbmNsdWRlICJ0cmFuc2Zvcm1zLmhoIgojaW5jbHVkZSAi
dWkuaGgiCiNpbmNsdWRlICJ2b2NhYi5oaCIKI2luY2x1ZGUgInhkZWx0YS5oaCIKCi8vIGRl
ZmluZWQgaW4gc2NoZW1hLnNxbCwgY29udmVydGVkIHRvIGhlYWRlcjoKI2luY2x1ZGUgInNj
aGVtYS5oIgoKLy8gZGVmaW5lZCBpbiB2aWV3cy5zcWwsIGNvbnZlcnRlZCB0byBoZWFkZXI6
CiNpbmNsdWRlICJ2aWV3cy5oIgoKLy8gdGhpcyBmaWxlIGRlZmluZXMgYSBwdWJsaWMsIHR5
cGVkIGludGVyZmFjZSB0byB0aGUgZGF0YWJhc2UuCi8vIHRoZSBkYXRhYmFzZSBjbGFzcyBl
bmNhcHN1bGF0ZXMgYWxsIGtub3dsZWRnZSBhYm91dCBzcWxpdGUsCi8vIHRoZSBzY2hlbWEs
IGFuZCBhbGwgU1FMIHN0YXRlbWVudHMgdXNlZCB0byBhY2Nlc3MgdGhlIHNjaGVtYS4KLy8K
Ly8gc2VlIGZpbGUgc2NoZW1hLnNxbCBmb3IgdGhlIHRleHQgb2YgdGhlIHNjaGVtYS4KCnVz
aW5nIGJvb3N0OjpzaGFyZWRfcHRyOwp1c2luZyBib29zdDo6bGV4aWNhbF9jYXN0Owp1c2lu
ZyBuYW1lc3BhY2Ugc3RkOwoKaW50IGNvbnN0IG9uZV9yb3cgPSAxOwppbnQgY29uc3Qgb25l
X2NvbCA9IDE7CmludCBjb25zdCBhbnlfcm93cyA9IC0xOwppbnQgY29uc3QgYW55X2NvbHMg
PSAtMTsKCmV4dGVybiAiQyIgewogIC8vIHN0cmFuZ2VseSB0aGlzIGlzbid0IGRlY2xhcmVk
LCBldmVuIHRob3VnaCBpdCdzIHByZXNlbnQgaW4gbXkgc3FsaXRlLgogIGNoYXIgKnNxbGl0
ZV92bXByaW50Zihjb25zdCBjaGFyICp6Rm9ybWF0LCB2YV9saXN0KTsKfQoKZGF0YWJhc2U6
OmRhdGFiYXNlKGZzOjpwYXRoIGNvbnN0ICYgZm4pIDoKICBmaWxlbmFtZShmbiksCiAgLy8g
bmIuIHVwZGF0ZSB0aGlzIGlmIHlvdSBjaGFuZ2UgdGhlIHNjaGVtYS4gdW5mb3J0dW5hdGVs
eSB3ZSBhcmUgbm90CiAgLy8gdXNpbmcgc2VsZi1kaWdlc3Rpbmcgc2NoZW1hcyBkdWUgdG8g
Y29tbWVudCBpcnJlZ3VsYXJpdGllcyBhbmQKICAvLyBub24tYWxwaGFiZXRpYyBvcmRlcmlu
ZyBvZiB0YWJsZXMgaW4gc3FsIHNvdXJjZSBmaWxlcy4gd2UgY291bGQgY3JlYXRlCiAgLy8g
YSB0ZW1wb3JhcnkgZGIsIHdyaXRlIG91ciBpbnRlbmRlZCBzY2hlbWEgaW50byBpdCwgYW5k
IHJlYWQgaXQgYmFjaywKICAvLyBidXQgdGhpcyBzZWVtcyBsaWtlIGl0IHdvdWxkIGJlIHRv
byBydWRlLiBwb3NzaWJseSByZXZpc2l0IHRoaXMgaXNzdWUuCiAgc2NoZW1hKCJjMWU4NjU4
OGUxMWFkMDdmYTUzZTVkMjk0ZWRjMDQzY2UxZDQwMDVhIiksCiAgX19zcWwoTlVMTCksCiAg
dHJhbnNhY3Rpb25fbGV2ZWwoMCkKe30KCnZvaWQgCmRhdGFiYXNlOjpjaGVja19zY2hlbWEo
KQp7CiAgc3RyaW5nIGRiX3NjaGVtYV9pZDsgIAogIGNhbGN1bGF0ZV9zY2hlbWFfaWQgKF9f
c3FsLCBkYl9zY2hlbWFfaWQpOwogIE4gKHNjaGVtYSA9PSBkYl9zY2hlbWFfaWQsCiAgICAg
RigiZGF0YWJhc2Ugc2NoZW1hcyBkbyBub3QgbWF0Y2g6ICIKICAgICAgICJ3YW50ZWQgJXMs
IGdvdCAlcy4gdHJ5IG1pZ3JhdGluZyBkYXRhYmFzZSIpIAogICAgICUgc2NoZW1hICUgZGJf
c2NoZW1hX2lkKTsKfQoKc3RhdGljIHZvaWQgCnNxbGl0ZV91bmJhc2U2NF9mbihzcWxpdGVf
ZnVuYyAqZiwgaW50IG5hcmdzLCBjaGFyIGNvbnN0ICoqIGFyZ3MpCnsKICBpZiAobmFyZ3Mg
IT0gMSkKICAgIHsKICAgICAgc3FsaXRlX3NldF9yZXN1bHRfZXJyb3IoZiwgIm5lZWQgZXhh
Y3RseSAxIGFyZyB0byB1bmJhc2U2NCgpIiwgLTEpOwogICAgICByZXR1cm47CiAgICB9CiAg
ZGF0YSBkZWNvZGVkOwogIGRlY29kZV9iYXNlNjQoYmFzZTY0PGRhdGE+KHN0cmluZyhhcmdz
WzBdKSksIGRlY29kZWQpOwogIHNxbGl0ZV9zZXRfcmVzdWx0X3N0cmluZyhmLCBkZWNvZGVk
KCkuY19zdHIoKSwgZGVjb2RlZCgpLnNpemUoKSk7Cn0KCnZvaWQgCmRhdGFiYXNlOjpzZXRf
YXBwKGFwcF9zdGF0ZSAqIGFwcCkKewogIF9fYXBwID0gYXBwOwp9CgpzdHJ1Y3Qgc3FsaXRl
ICogCmRhdGFiYXNlOjpzcWwoYm9vbCBpbml0KQp7CiAgaWYgKCEgX19zcWwpCiAgICB7CiAg
ICAgIGlmICghIGluaXQpCiAgICAgICAgewogICAgICAgICAgaWYgKGZpbGVuYW1lLnN0cmlu
ZygpID09ICIiKQogICAgICAgICAgICB0aHJvdyBpbmZvcm1hdGl2ZV9mYWlsdXJlKHN0cmlu
Zygibm8gZGF0YWJhc2Ugc3BlY2lmaWVkIikpOwogICAgICAgICAgZWxzZSBpZiAoISBmczo6
ZXhpc3RzKGZpbGVuYW1lKSkKICAgICAgICAgICAgdGhyb3cgaW5mb3JtYXRpdmVfZmFpbHVy
ZShzdHJpbmcoImRhdGFiYXNlICIpICsgZmlsZW5hbWUuc3RyaW5nKCkgKwogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygiIGRvZXMgbm90IGV4aXN0Iikp
OwogICAgICAgIH0KICAgICAgTihmaWxlbmFtZS5zdHJpbmcoKSAhPSAiIiwKICAgICAgICBG
KCJuZWVkIGRhdGFiYXNlIG5hbWUiKSk7CiAgICAgIGNoYXIgKiBlcnJtc2cgPSBOVUxMOwog
ICAgICBfX3NxbCA9IHNxbGl0ZV9vcGVuKGZpbGVuYW1lLnN0cmluZygpLmNfc3RyKCksIDA3
NTUsICZlcnJtc2cpOwogICAgICBpZiAoISBfX3NxbCkKICAgICAgICB0aHJvdyBvb3BzKHN0
cmluZygiY291bGQgbm90IG9wZW4gZGF0YWJhc2U6ICIpICsgZmlsZW5hbWUuc3RyaW5nKCkg
KyAKICAgICAgICAgICAgICAgICAgIChlcnJtc2cgPyAoIjogIiArIHN0cmluZyhlcnJtc2cp
KSA6ICIiKSk7CiAgICAgIGlmIChpbml0KQogICAgICAgIGV4ZWN1dGUoc2NoZW1hX2NvbnN0
YW50KTsKCiAgICAgIGNoZWNrX3NjaGVtYSgpOwogICAgICBpbnN0YWxsX2Z1bmN0aW9ucyhf
X2FwcCk7CiAgICAgIGluc3RhbGxfdmlld3MoKTsKICAgIH0KICByZXR1cm4gX19zcWw7Cn0K
CnZvaWQgCmRhdGFiYXNlOjppbml0aWFsaXplKCkKewogIGlmIChfX3NxbCkKICAgIHRocm93
IG9vcHMoImNhbm5vdCBpbml0aWFsaXplIGRhdGFiYXNlIHdoaWxlIGl0IGlzIG9wZW4iKTsK
CiAgTighZnM6OmV4aXN0cyhmaWxlbmFtZSksCiAgICBGKCJjb3VsZCBub3QgaW5pdGlhbGl6
ZSBkYXRhYmFzZTogJXM6IGFscmVhZHkgZXhpc3RzIikgCiAgICAlIGZpbGVuYW1lLnN0cmlu
ZygpKTsKCiAgZnM6OnBhdGggam91cm5hbCA9IG1rcGF0aChmaWxlbmFtZS5zdHJpbmcoKSAr
ICItam91cm5hbCIpOwogIE4oIWZzOjpleGlzdHMoam91cm5hbCksCiAgICBGKCJleGlzdGlu
ZyAocG9zc2libHkgc3RhbGUpIGpvdXJuYWwgZmlsZSAnJXMnIGhhcyBzYW1lIHN0ZW0gYXMg
bmV3IGRhdGFiYXNlICclcyciKQogICAgJSBqb3VybmFsLnN0cmluZygpICUgZmlsZW5hbWUu
c3RyaW5nKCkpOwoKICBzcWxpdGUgKnMgPSBzcWwodHJ1ZSk7CiAgSShzICE9IE5VTEwpOwp9
CgoKc3RydWN0IApkdW1wX3JlcXVlc3QKewogIGR1bXBfcmVxdWVzdCgpIHt9OwogIHN0cnVj
dCBzcWxpdGUgKnNxbDsKICBzdHJpbmcgdGFibGVfbmFtZTsKICBvc3RyZWFtICpvdXQ7Cn07
CgpzdGF0aWMgaW50IApkdW1wX3Jvd19jYih2b2lkICpkYXRhLCBpbnQgbiwgY2hhciAqKnZh
bHMsIGNoYXIgKipjb2xzKQp7CiAgZHVtcF9yZXF1ZXN0ICpkdW1wID0gcmVpbnRlcnByZXRf
Y2FzdDxkdW1wX3JlcXVlc3QgKj4oZGF0YSk7CiAgSShkdW1wICE9IE5VTEwpOwogIEkodmFs
cyAhPSBOVUxMKTsKICBJKGR1bXAtPm91dCAhPSBOVUxMKTsKICAqKGR1bXAtPm91dCkgPDwg
RigiSU5TRVJUIElOVE8gJXMgVkFMVUVTKCIpICUgZHVtcC0+dGFibGVfbmFtZTsKICBmb3Ig
KGludCBpID0gMDsgaSA8IG47ICsraSkKICAgIHsKICAgICAgaWYgKGkgIT0gMCkKICAgICAg
ICAqKGR1bXAtPm91dCkgPDwgJywnOwoKICAgICAgaWYgKHZhbHNbaV0gPT0gTlVMTCkKICAg
ICAgICAqKGR1bXAtPm91dCkgPDwgIk5VTEwiOwogICAgICBlbHNlCiAgICAgICAgewogICAg
ICAgICAgKihkdW1wLT5vdXQpIDw8ICInIjsKICAgICAgICAgIGZvciAoY2hhciAqY3AgPSB2
YWxzW2ldOyAqY3A7ICsrY3ApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBpZiAoKmNw
ID09ICdcJycpCiAgICAgICAgICAgICAgICAqKGR1bXAtPm91dCkgPDwgIicnIjsKICAgICAg
ICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAqKGR1bXAtPm91dCkgPDwgKmNwOwogICAg
ICAgICAgICB9CiAgICAgICAgICAqKGR1bXAtPm91dCkgPDwgIiciOwogICAgICAgIH0KICAg
IH0KICAqKGR1bXAtPm91dCkgPDwgIik7XG4iOyAgCiAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBp
bnQgCmR1bXBfdGFibGVfY2Iodm9pZCAqZGF0YSwgaW50IG4sIGNoYXIgKip2YWxzLCBjaGFy
ICoqY29scykKewogIGR1bXBfcmVxdWVzdCAqZHVtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZHVt
cF9yZXF1ZXN0ICo+KGRhdGEpOwogIEkoZHVtcCAhPSBOVUxMKTsKICBJKGR1bXAtPnNxbCAh
PSBOVUxMKTsKICBJKHZhbHMgIT0gTlVMTCk7CiAgSSh2YWxzWzBdICE9IE5VTEwpOwogIEko
dmFsc1sxXSAhPSBOVUxMKTsKICBJKHZhbHNbMl0gIT0gTlVMTCk7CiAgSShuID09IDMpOwog
IGlmIChzdHJpbmcodmFsc1sxXSkgPT0gInRhYmxlIikKICAgIHsKICAgICAgKihkdW1wLT5v
dXQpIDw8IHZhbHNbMl0gPDwgIjtcbiI7CiAgICAgIGR1bXAtPnRhYmxlX25hbWUgPSBzdHJp
bmcodmFsc1swXSk7CiAgICAgIHNxbGl0ZV9leGVjX3ByaW50ZihkdW1wLT5zcWwsICJTRUxF
Q1QgKiBGUk9NICclcSciLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBfcm93X2Ni
LCBkYXRhLCBOVUxMLCB2YWxzWzBdKTsKICAgIH0KICByZXR1cm4gMDsKfQoKdm9pZCAKZGF0
YWJhc2U6OmR1bXAob3N0cmVhbSAmIG91dCkKewogIGR1bXBfcmVxdWVzdCByZXE7CiAgcmVx
Lm91dCA9ICZvdXQ7CiAgcmVxLnNxbCA9IHNxbCgpOwogIG91dCA8PCAiQkVHSU4gVFJBTlNB
Q1RJT047XG4iOwogIGludCByZXMgPSBzcWxpdGVfZXhlYyhyZXEuc3FsLAogICAgICAgICAg
ICAgICAgICAgICAgICAiU0VMRUNUIG5hbWUsIHR5cGUsIHNxbCBGUk9NIHNxbGl0ZV9tYXN0
ZXIgIgogICAgICAgICAgICAgICAgICAgICAgICAiV0hFUkUgdHlwZT0ndGFibGUnIEFORCBz
cWwgTk9UIE5VTEwgIgogICAgICAgICAgICAgICAgICAgICAgICAiT1JERVIgQlkgc3Vic3Ry
KHR5cGUsMiwxKSwgbmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBfdGFibGVf
Y2IsICZyZXEsIE5VTEwpOwogIEkocmVzID09IFNRTElURV9PSyk7CiAgb3V0IDw8ICJDT01N
SVQ7XG4iOwp9Cgp2b2lkIApkYXRhYmFzZTo6bG9hZChpc3RyZWFtICYgaW4pCnsKICBjaGFy
IGJ1Zltjb25zdGFudHM6OmJ1ZnN6XTsKICBzdHJpbmcgdG1wOwoKICBOKGZpbGVuYW1lLnN0
cmluZygpICE9ICIiLAogICAgRigibmVlZCBkYXRhYmFzZSBuYW1lIikpOwogIGNoYXIgKiBl
cnJtc2cgPSBOVUxMOwogIF9fc3FsID0gc3FsaXRlX29wZW4oZmlsZW5hbWUuc3RyaW5nKCku
Y19zdHIoKSwgMDc1NSwgJmVycm1zZyk7CiAgaWYgKCEgX19zcWwpCiAgICB0aHJvdyBvb3Bz
KHN0cmluZygiY291bGQgbm90IG9wZW4gZGF0YWJhc2U6ICIpICsgZmlsZW5hbWUuc3RyaW5n
KCkgKyAKICAgICAgICAgICAgICAgKGVycm1zZyA/ICgiOiAiICsgc3RyaW5nKGVycm1zZykp
IDogIiIpKTsKICAKICB3aGlsZShpbikKICAgIHsKICAgICAgaW4ucmVhZChidWYsIGNvbnN0
YW50czo6YnVmc3opOwogICAgICB0bXAuYXBwZW5kKGJ1ZiwgaW4uZ2NvdW50KCkpOwogICAg
fQoKICBleGVjdXRlKHRtcC5jX3N0cigpKTsKfQoKCnZvaWQgCmRhdGFiYXNlOjpkZWJ1Zyhz
dHJpbmcgY29uc3QgJiBzcWwsIG9zdHJlYW0gJiBvdXQpCnsKICByZXN1bHRzIHJlczsKICBm
ZXRjaChyZXMsIGFueV9jb2xzLCBhbnlfcm93cywgc3FsLmNfc3RyKCkpOwogIG91dCA8PCAi
JyIgPDwgc3FsIDw8ICInIC0+ICIgPDwgcmVzLnNpemUoKSA8PCAiIHJvd3NcbiIgPDwgZW5k
bDsKICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlcy5zaXplKCk7ICsraSkKICAgIHsKICAg
ICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCByZXNbaV0uc2l6ZSgpOyArK2opCiAgICAgICAg
ewogICAgICAgICAgaWYgKGogIT0gMCkKICAgICAgICAgICAgb3V0IDw8ICIgfCAiOwogICAg
ICAgICAgb3V0IDw8IHJlc1tpXVtqXTsKICAgICAgICB9CiAgICAgIG91dCA8PCBlbmRsOwog
ICAgfQp9Cgp1bnNpZ25lZCBsb25nIApkYXRhYmFzZTo6Z2V0X3N0YXRpc3RpYyhzdHJpbmcg
Y29uc3QgJiBxdWVyeSkKewogIHJlc3VsdHMgcmVzOwogIGZldGNoKHJlcywgMSwgMSwgcXVl
cnkuY19zdHIoKSk7CiAgcmV0dXJuIGxleGljYWxfY2FzdDx1bnNpZ25lZCBsb25nPihyZXNb
MF1bMF0pOwp9Cgp2b2lkIApkYXRhYmFzZTo6aW5mbyhvc3RyZWFtICYgb3V0KQp7CiAgc3Ry
aW5nIGlkOwogIGNhbGN1bGF0ZV9zY2hlbWFfaWQoc3FsKCksIGlkKTsKICBvdXQgPDwgInNj
aGVtYSB2ZXJzaW9uICA6ICIgPDwgaWQgPDwgZW5kbDsKICBvdXQgPDwgImZ1bGwgbWFuaWZl
c3RzICA6ICIgPDwgZ2V0X3N0YXRpc3RpYygiU0VMRUNUIENPVU5UKCopIEZST00gbWFuaWZl
c3RzIikgPDwgZW5kbDsKICBvdXQgPDwgIm1hbmlmZXN0IGRlbHRhcyA6ICIgPDwgZ2V0X3N0
YXRpc3RpYygiU0VMRUNUIENPVU5UKCopIEZST00gbWFuaWZlc3RfZGVsdGFzIikgPDwgZW5k
bDsKICBvdXQgPDwgImZ1bGwgZmlsZXMgICAgICA6ICIgPDwgZ2V0X3N0YXRpc3RpYygiU0VM
RUNUIENPVU5UKCopIEZST00gZmlsZXMiKSA8PCBlbmRsOwogIG91dCA8PCAiZmlsZSBkZWx0
YXMgICAgIDogIiA8PCBnZXRfc3RhdGlzdGljKCJTRUxFQ1QgQ09VTlQoKikgRlJPTSBmaWxl
X2RlbHRhcyIpIDw8IGVuZGw7Cn0KCnZvaWQgCmRhdGFiYXNlOjp2ZXJzaW9uKG9zdHJlYW0g
JiBvdXQpCnsKICBzdHJpbmcgaWQ7CiAgY2FsY3VsYXRlX3NjaGVtYV9pZChzcWwoKSwgaWQp
OwogIG91dCA8PCAiZGF0YWJhc2Ugc2NoZW1hIHZlcnNpb246ICIgPDwgaWQgPDwgZW5kbDsK
fQoKdm9pZCAKZGF0YWJhc2U6Om1pZ3JhdGUoKQp7ICAKICBOKGZpbGVuYW1lLnN0cmluZygp
ICE9ICIiLAogICAgRigibmVlZCBkYXRhYmFzZSBuYW1lIikpOwogIGNoYXIgKiBlcnJtc2cg
PSBOVUxMOwogIF9fc3FsID0gc3FsaXRlX29wZW4oZmlsZW5hbWUuc3RyaW5nKCkuY19zdHIo
KSwgMDc1NSwgJmVycm1zZyk7CiAgaWYgKCEgX19zcWwpCiAgICB0aHJvdyBvb3BzKHN0cmlu
ZygiY291bGQgbm90IG9wZW4gZGF0YWJhc2U6ICIpICsgZmlsZW5hbWUuc3RyaW5nKCkgKyAK
ICAgICAgICAgICAgICAgKGVycm1zZyA/ICgiOiAiICsgc3RyaW5nKGVycm1zZykpIDogIiIp
KTsKICBtaWdyYXRlX21vbm90b25lX3NjaGVtYShfX3NxbCk7CiAgc3FsaXRlX2Nsb3NlKF9f
c3FsKTsKfQoKdm9pZCAKZGF0YWJhc2U6OnJlaGFzaCgpCnsKICB0cmFuc2FjdGlvbl9ndWFy
ZCBndWFyZCgqdGhpcyk7CiAgdGlja2VyIG1jZXJ0cygibWNlcnRzIiwgIm0iLCAxKTsKICB0
aWNrZXIgZmNlcnRzKCJmY2VydHMiLCAiZiIsIDEpOwogIHRpY2tlciBwdWJrZXlzKCJwdWJr
ZXlzIiwgIisiLCAxKTsKICB0aWNrZXIgcHJpdmtleXMoInByaXZrZXlzIiwgIiEiLCAxKTsK
ICAKICB7CiAgICAvLyByZWhhc2ggYWxsIG1jZXJ0cwogICAgcmVzdWx0cyByZXM7CiAgICB2
ZWN0b3I8Y2VydD4gY2VydHM7CiAgICBmZXRjaChyZXMsIDUsIGFueV9yb3dzLCAKICAgICAg
ICAgICJTRUxFQ1QgaWQsIG5hbWUsIHZhbHVlLCBrZXlwYWlyLCBzaWduYXR1cmUgIgogICAg
ICAgICAgIkZST00gbWFuaWZlc3RfY2VydHMiKTsKICAgIHJlc3VsdHNfdG9fY2VydHMocmVz
LCBjZXJ0cyk7CiAgICBleGVjdXRlKCJERUxFVEUgRlJPTSBtYW5pZmVzdF9jZXJ0cyIpOwog
ICAgZm9yKHZlY3RvcjxjZXJ0Pjo6Y29uc3RfaXRlcmF0b3IgaSA9IGNlcnRzLmJlZ2luKCk7
IGkgIT0gY2VydHMuZW5kKCk7ICsraSkKICAgICAgewogICAgICAgIHB1dF9jZXJ0KCppLCAi
bWFuaWZlc3RfY2VydHMiKTsKICAgICAgICArK21jZXJ0czsKICAgICAgfQogIH0KCiAgewog
ICAgLy8gcmVoYXNoIGFsbCBmY2VydHMKICAgIHJlc3VsdHMgcmVzOwogICAgdmVjdG9yPGNl
cnQ+IGNlcnRzOyAgICAKICAgIGZldGNoKHJlcywgNSwgYW55X3Jvd3MsIAogICAgICAgICAg
IlNFTEVDVCBpZCwgbmFtZSwgdmFsdWUsIGtleXBhaXIsIHNpZ25hdHVyZSAiCiAgICAgICAg
ICAiRlJPTSBmaWxlX2NlcnRzIik7CiAgICByZXN1bHRzX3RvX2NlcnRzKHJlcywgY2VydHMp
OwogICAgZXhlY3V0ZSgiREVMRVRFIEZST00gZmlsZV9jZXJ0cyIpOwogICAgZm9yKHZlY3Rv
cjxjZXJ0Pjo6Y29uc3RfaXRlcmF0b3IgaSA9IGNlcnRzLmJlZ2luKCk7IGkgIT0gY2VydHMu
ZW5kKCk7ICsraSkKICAgICAgewogICAgICAgIHB1dF9jZXJ0KCppLCAiZmlsZV9jZXJ0cyIp
OwogICAgICAgICsrZmNlcnRzOwogICAgICB9CiAgfQogIAoKICB7CiAgICAvLyByZWhhc2gg
YWxsIHB1YmtleXMKICAgIHJlc3VsdHMgcmVzOwogICAgZmV0Y2gocmVzLCAyLCBhbnlfcm93
cywgIlNFTEVDVCBpZCwga2V5ZGF0YSBGUk9NIHB1YmxpY19rZXlzIik7CiAgICBleGVjdXRl
KCJERUxFVEUgRlJPTSBwdWJsaWNfa2V5cyIpOwogICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCByZXMuc2l6ZSgpOyArK2kpCiAgICAgIHsKICAgICAgICBoZXhlbmM8aWQ+IHRtcDsKICAg
ICAgICBrZXlfaGFzaF9jb2RlKHJzYV9rZXlwYWlyX2lkKHJlc1tpXVswXSksIGJhc2U2NDxy
c2FfcHViX2tleT4ocmVzW2ldWzFdKSwgdG1wKTsKICAgICAgICBleGVjdXRlKCJJTlNFUlQg
SU5UTyBwdWJsaWNfa2V5cyBWQUxVRVMoJyVxJywgJyVxJywgJyVxJykiLCAKICAgICAgICAg
ICAgICAgIHRtcCgpLmNfc3RyKCksIHJlc1tpXVswXS5jX3N0cigpLCByZXNbaV1bMV0uY19z
dHIoKSk7CiAgICAgICAgKytwdWJrZXlzOwogICAgICB9CiAgfQoKewogICAgLy8gcmVoYXNo
IGFsbCBwcml2a2V5cwogICAgcmVzdWx0cyByZXM7CiAgICBmZXRjaChyZXMsIDIsIGFueV9y
b3dzLCAiU0VMRUNUIGlkLCBrZXlkYXRhIEZST00gcHJpdmF0ZV9rZXlzIik7CiAgICBleGVj
dXRlKCJERUxFVEUgRlJPTSBwcml2YXRlX2tleXMiKTsKICAgIGZvciAoc2l6ZV90IGkgPSAw
OyBpIDwgcmVzLnNpemUoKTsgKytpKQogICAgICB7CiAgICAgICAgaGV4ZW5jPGlkPiB0bXA7
CiAgICAgICAga2V5X2hhc2hfY29kZShyc2Ffa2V5cGFpcl9pZChyZXNbaV1bMF0pLCBiYXNl
NjQ8IGFyYzQ8cnNhX3ByaXZfa2V5PiA+KHJlc1tpXVsxXSksIHRtcCk7CiAgICAgICAgZXhl
Y3V0ZSgiSU5TRVJUIElOVE8gcHJpdmF0ZV9rZXlzIFZBTFVFUygnJXEnLCAnJXEnLCAnJXEn
KSIsIAogICAgICAgICAgICAgICAgdG1wKCkuY19zdHIoKSwgcmVzW2ldWzBdLmNfc3RyKCks
IHJlc1tpXVsxXS5jX3N0cigpKTsKICAgICAgICArK3ByaXZrZXlzOwogICAgICB9CiAgfQoK
ICBndWFyZC5jb21taXQoKTsKfQoKdm9pZCAKZGF0YWJhc2U6OmVuc3VyZV9vcGVuKCkKewog
IHNxbGl0ZSAqcyA9IHNxbCgpOwogIEkocyAhPSBOVUxMKTsKfQoKZGF0YWJhc2U6On5kYXRh
YmFzZSgpIAp7CiAgaWYgKF9fc3FsKQogICAgewogICAgICBzcWxpdGVfY2xvc2UoX19zcWwp
OwogICAgICBfX3NxbCA9IDA7CiAgICB9Cn0KCnN0YXRpYyB2b2lkIAphc3NlcnRfc3FsaXRl
X29rKGludCByZXMpCnsKICBzd2l0Y2ggKHJlcykKICAgIHsgICAgICAKICAgIGNhc2UgU1FM
SVRFX09LOiAKICAgICAgYnJlYWs7CgogICAgY2FzZSBTUUxJVEVfRVJST1I6CiAgICAgIHRo
cm93IG9vcHMoIlNRTCBlcnJvciBvciBtaXNzaW5nIGRhdGFiYXNlIik7CiAgICAgIGJyZWFr
OwoKICAgIGNhc2UgU1FMSVRFX0lOVEVSTkFMOgogICAgICB0aHJvdyBvb3BzKCJBbiBpbnRl
cm5hbCBsb2dpYyBlcnJvciBpbiBTUUxpdGUiKTsKICAgICAgYnJlYWs7CgogICAgY2FzZSBT
UUxJVEVfUEVSTToKICAgICAgdGhyb3cgb29wcygiQWNjZXNzIHBlcm1pc3Npb24gZGVuaWVk
Iik7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgU1FMSVRFX0FCT1JUOgogICAgICB0aHJvdyBv
b3BzKCJDYWxsYmFjayByb3V0aW5lIHJlcXVlc3RlZCBhbiBhYm9ydCIpOwogICAgICBicmVh
azsKCiAgICBjYXNlIFNRTElURV9CVVNZOgogICAgICB0aHJvdyBvb3BzKCJUaGUgZGF0YWJh
c2UgZmlsZSBpcyBsb2NrZWQiKTsKICAgICAgYnJlYWs7CgogICAgY2FzZSBTUUxJVEVfTE9D
S0VEOgogICAgICB0aHJvdyBvb3BzKCJBIHRhYmxlIGluIHRoZSBkYXRhYmFzZSBpcyBsb2Nr
ZWQiKTsKICAgICAgYnJlYWs7CgogICAgY2FzZSBTUUxJVEVfTk9NRU06CiAgICAgIHRocm93
IG9vcHMoIkEgbWFsbG9jKCkgZmFpbGVkIik7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgU1FM
SVRFX1JFQURPTkxZOgogICAgICB0aHJvdyBvb3BzKCJBdHRlbXB0IHRvIHdyaXRlIGEgcmVh
ZG9ubHkgZGF0YWJhc2UiKTsKICAgICAgYnJlYWs7CgogICAgY2FzZSBTUUxJVEVfSU5URVJS
VVBUOgogICAgICB0aHJvdyBvb3BzKCJPcGVyYXRpb24gdGVybWluYXRlZCBieSBzcWxpdGVf
aW50ZXJydXB0KCkiKTsKICAgICAgYnJlYWs7CgogICAgY2FzZSBTUUxJVEVfSU9FUlI6CiAg
ICAgIHRocm93IG9vcHMoIlNvbWUga2luZCBvZiBkaXNrIEkvTyBlcnJvciBvY2N1cnJlZCIp
OwogICAgICBicmVhazsKCiAgICBjYXNlIFNRTElURV9DT1JSVVBUOgogICAgICB0aHJvdyBv
b3BzKCJUaGUgZGF0YWJhc2UgZGlzayBpbWFnZSBpcyBtYWxmb3JtZWQiKTsKICAgICAgYnJl
YWs7CgogICAgY2FzZSBTUUxJVEVfTk9URk9VTkQ6CiAgICAgIHRocm93IG9vcHMoIihJbnRl
cm5hbCBPbmx5KSBUYWJsZSBvciByZWNvcmQgbm90IGZvdW5kIik7CiAgICAgIGJyZWFrOwoK
ICAgIGNhc2UgU1FMSVRFX0ZVTEw6CiAgICAgIHRocm93IG9vcHMoIkluc2VydGlvbiBmYWls
ZWQgYmVjYXVzZSBkYXRhYmFzZSBpcyBmdWxsIik7CiAgICAgIGJyZWFrOwoKICAgIGNhc2Ug
U1FMSVRFX0NBTlRPUEVOOgogICAgICB0aHJvdyBvb3BzKCJVbmFibGUgdG8gb3BlbiB0aGUg
ZGF0YWJhc2UgZmlsZSIpOwogICAgICBicmVhazsKCiAgICBjYXNlIFNRTElURV9QUk9UT0NP
TDoKICAgICAgdGhyb3cgb29wcygiZGF0YWJhc2UgbG9jayBwcm90b2NvbCBlcnJvciIpOwog
ICAgICBicmVhazsKCiAgICBjYXNlIFNRTElURV9FTVBUWToKICAgICAgdGhyb3cgb29wcygi
KEludGVybmFsIE9ubHkpIGRhdGFiYXNlIHRhYmxlIGlzIGVtcHR5Iik7CiAgICAgIGJyZWFr
OwoKICAgIGNhc2UgU1FMSVRFX1NDSEVNQToKICAgICAgdGhyb3cgb29wcygiVGhlIGRhdGFi
YXNlIHNjaGVtYSBjaGFuZ2VkIik7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgU1FMSVRFX1RP
T0JJRzoKICAgICAgdGhyb3cgb29wcygiVG9vIG11Y2ggZGF0YSBmb3Igb25lIHJvdyBvZiBh
IHRhYmxlIik7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgU1FMSVRFX0NPTlNUUkFJTlQ6CiAg
ICAgIHRocm93IG9vcHMoIkFib3J0IGR1ZSB0byBjb250cmFpbnQgdmlvbGF0aW9uIik7CiAg
ICAgIGJyZWFrOwoKICAgIGNhc2UgU1FMSVRFX01JU01BVENIOgogICAgICB0aHJvdyBvb3Bz
KCJEYXRhIHR5cGUgbWlzbWF0Y2giKTsKICAgICAgYnJlYWs7CgogICAgY2FzZSBTUUxJVEVf
TUlTVVNFOgogICAgICB0aHJvdyBvb3BzKCJMaWJyYXJ5IHVzZWQgaW5jb3JyZWN0bHkiKTsK
ICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgdGhyb3cgb29wcyhzdHJpbmcoIlVu
a25vd24gREIgcmVzdWx0IGNvZGU6ICIpICsgbGV4aWNhbF9jYXN0PHN0cmluZz4ocmVzKSk7
CiAgICAgIGJyZWFrOwogICAgfQp9Cgp2b2lkIApkYXRhYmFzZTo6ZXhlY3V0ZShjaGFyIGNv
bnN0ICogcXVlcnksIC4uLikKewogIHZhX2xpc3QgYXA7CiAgaW50IHJlczsKICBjaGFyICog
ZXJybXNnID0gTlVMTDsKCiAgdmFfc3RhcnQoYXAsIHF1ZXJ5KTsKCiAgLy8gbG9nIGl0CiAg
Y2hhciAqIGZvcm1hdHRlZCA9IHNxbGl0ZV92bXByaW50ZihxdWVyeSwgYXApOwogIHN0cmlu
ZyBxcShmb3JtYXR0ZWQpOwogIGlmIChxcS5zaXplKCkgPiBjb25zdGFudHM6OmRiX2xvZ19s
aW5lX3N6KSAKICAgIHFxID0gcXEuc3Vic3RyKDAsIGNvbnN0YW50czo6ZGJfbG9nX2xpbmVf
c3opICsgc3RyaW5nKCIgLi4uIik7CiAgTChGKCJkYi5leGVjdXRlKFwiJXNcIilcbiIpICUg
cXEpOwogIHNxbGl0ZV9mcmVlbWVtKGZvcm1hdHRlZCk7CgogIHZhX2VuZChhcCk7CiAgdmFf
c3RhcnQoYXAsIHF1ZXJ5KTsKCiAgLy8gZG8gaXQKICByZXMgPSBzcWxpdGVfZXhlY192cHJp
bnRmKHNxbCgpLCBxdWVyeSwgTlVMTCwgTlVMTCwgJmVycm1zZywgYXApOwoKICB2YV9lbmQo
YXApOwoKICBpZiAoZXJybXNnKQogICAgdGhyb3cgb29wcyhzdHJpbmcoInNxbGl0ZSBleGVj
IGVycm9yICIpICsgZXJybXNnKTsKCiAgYXNzZXJ0X3NxbGl0ZV9vayhyZXMpOwoKfQoKdm9p
ZCAKZGF0YWJhc2U6OmZldGNoKHJlc3VsdHMgJiByZXMsIAogICAgICAgICAgICAgICAgaW50
IGNvbnN0IHdhbnRfY29scywgCiAgICAgICAgICAgICAgICBpbnQgY29uc3Qgd2FudF9yb3dz
LCAKICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKiBxdWVyeSwgLi4uKQp7CiAgY2hhciAq
KiByZXN1bHQgPSBOVUxMOwogIGludCBucm93OwogIGludCBuY29sOwogIGNoYXIgKiBlcnJt
c2cgPSBOVUxMOwogIGludCByZXNjb2RlOwoKICB2YV9saXN0IGFwOwogIHJlcy5jbGVhcigp
OwogIHJlcy5yZXNpemUoMCk7CiAgdmFfc3RhcnQoYXAsIHF1ZXJ5KTsKCiAgLy8gbG9nIGl0
CiAgY2hhciAqIGZvcm1hdHRlZCA9IHNxbGl0ZV92bXByaW50ZihxdWVyeSwgYXApOwogIHN0
cmluZyBxcShmb3JtYXR0ZWQpOwogIGlmIChxcS5zaXplKCkgPiBjb25zdGFudHM6OmxvZ19s
aW5lX3N6KSAKICAgIHFxID0gcXEuc3Vic3RyKDAsIGNvbnN0YW50czo6bG9nX2xpbmVfc3op
ICsgc3RyaW5nKCIgLi4uIik7CiAgTChGKCJkYi5mZXRjaChcIiVzXCIpXG4iKSAlIHFxKTsK
ICBzcWxpdGVfZnJlZW1lbShmb3JtYXR0ZWQpOwoKICB2YV9lbmQoYXApOwogIHZhX3N0YXJ0
KGFwLCBxdWVyeSk7CgogIC8vIGRvIGl0CiAgcmVzY29kZSA9IHNxbGl0ZV9nZXRfdGFibGVf
dnByaW50ZihzcWwoKSwgcXVlcnksICZyZXN1bHQsICZucm93LCAmbmNvbCwgJmVycm1zZywg
YXApOwoKICB2YV9lbmQoYXApOwoKICBjbGVhbnVwX3B0cjxjaGFyICoqLCB2b2lkPiAKICAg
IHJlc3VsdF9ndWFyZChyZXN1bHQsICZzcWxpdGVfZnJlZV90YWJsZSk7CgogIHN0cmluZyBj
dHggPSBzdHJpbmcoImRiIHF1ZXJ5IFsiKSArIHN0cmluZyhxdWVyeSkgKyAiXTogIjsKCiAg
aWYgKGVycm1zZykKICAgIHRocm93IG9vcHMoY3R4ICsgc3RyaW5nKCJzcWxpdGUgZXJyb3Ig
IikgKyBlcnJtc2cpOwogIGFzc2VydF9zcWxpdGVfb2socmVzY29kZSk7CgogIGlmICh3YW50
X2NvbHMgPT0gMCAmJiBuY29sID09IDApIHJldHVybjsKICBpZiAod2FudF9yb3dzID09IDAg
JiYgbnJvdyA9PSAwKSByZXR1cm47CiAgaWYgKHdhbnRfY29scyA9PSBhbnlfcm93cyAmJiBu
Y29sID09IDApIHJldHVybjsKICBpZiAod2FudF9yb3dzID09IGFueV9yb3dzICYmIG5yb3cg
PT0gMCkgcmV0dXJuOwoKICBpZiAod2FudF9jb2xzICE9IGFueV9jb2xzICYmCiAgICAgIG5j
b2wgIT0gd2FudF9jb2xzKQogICAgdGhyb3cgb29wcygoRigiJXMgd2FudGVkICVkIGNvbHVt
bnMsIGdvdCAlcyIpCiAgICAgICAgICAgICAgICAlIGN0eCAlIHdhbnRfY29scyAlIG5jb2wp
LnN0cigpKTsKCiAgaWYgKHdhbnRfcm93cyAhPSBhbnlfcm93cyAmJgogICAgICBucm93ICE9
IHdhbnRfcm93cykKICAgIHRocm93IG9vcHMoKEYoIiVzIHdhbnRlZCAlZCByb3dzLCBnb3Qg
JXMiKQogICAgICAgICAgICAgICAgJSBjdHggJSB3YW50X3Jvd3MgJSBucm93KS5zdHIoKSk7
CgogIGlmICghcmVzdWx0KQogICAgdGhyb3cgb29wcyhjdHggKyAibnVsbCByZXN1bHQgc2V0
Iik7CgogIGZvciAoaW50IGkgPSAwOyBpIDwgbmNvbDsgKytpKSAKICAgIGlmICghcmVzdWx0
W2ldKQogICAgICB0aHJvdyBvb3BzKGN0eCArICJudWxsIGNvbHVtbiBuYW1lIik7CgogIGZv
ciAoaW50IHJvdyA9IDA7IHJvdyA8IG5yb3c7ICsrcm93KSAKICAgIHsKICAgICAgdmVjdG9y
PHN0cmluZz4gcm93dmVjOwogICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBuY29sOyAr
K2NvbCkKICAgICAgICB7CiAgICAgICAgICBpbnQgaSA9ICgoMSArIHJvdykgKiBuY29sKSAr
IGNvbDsKICAgICAgICAgIGlmICghcmVzdWx0W2ldKQogICAgICAgICAgICB0aHJvdyBvb3Bz
KGN0eCArICJudWxsIHJlc3VsdCB2YWx1ZSIpOwogICAgICAgICAgZWxzZQogICAgICAgICAg
ICByb3d2ZWMucHVzaF9iYWNrKHJlc3VsdFtpXSk7CiAgICAgICAgfQogICAgICByZXMucHVz
aF9iYWNrKHJvd3ZlYyk7CiAgICB9Cn0KCi8vIGdlbmVyYWwgYXBwbGljYXRpb24tbGV2ZWwg
bG9naWMKCnZvaWQgCmRhdGFiYXNlOjpzZXRfZmlsZW5hbWUoZnM6OnBhdGggY29uc3QgJiBm
aWxlKQp7CiAgaWYgKF9fc3FsKQogICAgewogICAgICB0aHJvdyBvb3BzKCJjYW5ub3QgY2hh
bmdlIGZpbGVuYW1lIHRvICIgKyBmaWxlLnN0cmluZygpICsgIiB3aGlsZSBkYiBpcyBvcGVu
Iik7CiAgICB9CiAgZmlsZW5hbWUgPSBmaWxlOwp9Cgp2b2lkIApkYXRhYmFzZTo6YmVnaW5f
dHJhbnNhY3Rpb24oKSAKewogIGlmICh0cmFuc2FjdGlvbl9sZXZlbCA9PSAwKQogICAgICBl
eGVjdXRlKCJCRUdJTiIpOwogIHRyYW5zYWN0aW9uX2xldmVsKys7Cn0KCnZvaWQgCmRhdGFi
YXNlOjpjb21taXRfdHJhbnNhY3Rpb24oKQp7CiAgaWYgKHRyYW5zYWN0aW9uX2xldmVsID09
IDEpCiAgICBleGVjdXRlKCJDT01NSVQiKTsKICB0cmFuc2FjdGlvbl9sZXZlbC0tOwp9Cgp2
b2lkIApkYXRhYmFzZTo6cm9sbGJhY2tfdHJhbnNhY3Rpb24oKQp7CiAgaWYgKHRyYW5zYWN0
aW9uX2xldmVsID09IDEpCiAgICBleGVjdXRlKCJST0xMQkFDSyIpOwogIHRyYW5zYWN0aW9u
X2xldmVsLS07Cn0KCgpib29sIApkYXRhYmFzZTo6ZXhpc3RzKGhleGVuYzxpZD4gY29uc3Qg
JiBpZGVudCwKICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjb25zdCAmIHRhYmxlKQp7
CiAgcmVzdWx0cyByZXM7CiAgZmV0Y2gocmVzLCBvbmVfY29sLCBhbnlfcm93cywgCiAgICAg
ICAgIlNFTEVDVCBpZCBGUk9NICclcScgV0hFUkUgaWQgPSAnJXEnIiwKICAgICAgICB0YWJs
ZS5jX3N0cigpLCBpZGVudCgpLmNfc3RyKCkpOwogIEkoKHJlcy5zaXplKCkgPT0gMSkgfHwg
KHJlcy5zaXplKCkgPT0gMCkpOwogIHJldHVybiByZXMuc2l6ZSgpID09IDE7Cn0KCgpib29s
IApkYXRhYmFzZTo6ZGVsdGFfZXhpc3RzKGhleGVuYzxpZD4gY29uc3QgJiBpZGVudCwKICAg
ICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY29uc3QgJiB0YWJsZSkKewogIHJlc3VsdHMg
cmVzOwogIGZldGNoKHJlcywgb25lX2NvbCwgYW55X3Jvd3MsIAogICAgICAgICJTRUxFQ1Qg
aWQgRlJPTSAnJXEnIFdIRVJFIGlkID0gJyVxJyIsCiAgICAgICAgdGFibGUuY19zdHIoKSwg
aWRlbnQoKS5jX3N0cigpKTsKICByZXR1cm4gcmVzLnNpemUoKSA+IDA7Cn0KCmJvb2wgCmRh
dGFiYXNlOjpkZWx0YV9leGlzdHMoaGV4ZW5jPGlkPiBjb25zdCAmIGlkZW50LAogICAgICAg
ICAgICAgICAgICAgICAgIGhleGVuYzxpZD4gY29uc3QgJiBiYXNlLAogICAgICAgICAgICAg
ICAgICAgICAgIHN0cmluZyBjb25zdCAmIHRhYmxlKQp7CiAgcmVzdWx0cyByZXM7CiAgZmV0
Y2gocmVzLCBvbmVfY29sLCBhbnlfcm93cywgCiAgICAgICAgIlNFTEVDVCBpZCBGUk9NICcl
cScgV0hFUkUgaWQgPSAnJXEnIEFORCBiYXNlID0gJyVxJyIsCiAgICAgICAgdGFibGUuY19z
dHIoKSwgaWRlbnQoKS5jX3N0cigpLCBiYXNlKCkuY19zdHIoKSk7CiAgSSgocmVzLnNpemUo
KSA9PSAxKSB8fCAocmVzLnNpemUoKSA9PSAwKSk7CiAgcmV0dXJuIHJlcy5zaXplKCkgPT0g
MTsKfQoKaW50IApkYXRhYmFzZTo6Y291bnQoc3RyaW5nIGNvbnN0ICYgdGFibGUpCnsKICBy
ZXN1bHRzIHJlczsKICBmZXRjaChyZXMsIG9uZV9jb2wsIG9uZV9yb3csIAogICAgICAgICJT
RUxFQ1QgQ09VTlQoKikgRlJPTSAnJXEnIiwgCiAgICAgICAgdGFibGUuY19zdHIoKSk7CiAg
cmV0dXJuIGxleGljYWxfY2FzdDxpbnQ+KHJlc1swXVswXSk7ICAKfQoKdm9pZCAKZGF0YWJh
c2U6OmdldChoZXhlbmM8aWQ+IGNvbnN0ICYgaWRlbnQsCiAgICAgICAgICAgICAgYmFzZTY0
PCBnemlwPGRhdGE+ID4gJiBkYXQsCiAgICAgICAgICAgICAgc3RyaW5nIGNvbnN0ICYgdGFi
bGUpCnsKICByZXN1bHRzIHJlczsKICBmZXRjaChyZXMsIG9uZV9jb2wsIG9uZV9yb3csCiAg
ICAgICAgIlNFTEVDVCBkYXRhIEZST00gJyVxJyBXSEVSRSBpZCA9ICclcSciLCAKICAgICAg
ICB0YWJsZS5jX3N0cigpLCBpZGVudCgpLmNfc3RyKCkpOwoKICAvLyBjb25zaXN0ZW5jeSBj
aGVjawogIGJhc2U2NDxnemlwPGRhdGE+ID4gcmRhdGEocmVzWzBdWzBdKTsKICBoZXhlbmM8
aWQ+IHRpZDsKICBjYWxjdWxhdGVfaWRlbnQocmRhdGEsIHRpZCk7CiAgSSh0aWQgPT0gaWRl
bnQpOwoKICBkYXQgPSByZGF0YTsKfQoKdm9pZCAKZGF0YWJhc2U6OmdldF9kZWx0YShoZXhl
bmM8aWQ+IGNvbnN0ICYgaWRlbnQsCiAgICAgICAgICAgICAgICAgICAgaGV4ZW5jPGlkPiBj
b25zdCAmIGJhc2UsCiAgICAgICAgICAgICAgICAgICAgYmFzZTY0PCBnemlwPGRlbHRhPiA+
ICYgZGVsLAogICAgICAgICAgICAgICAgICAgIHN0cmluZyBjb25zdCAmIHRhYmxlKQp7CiAg
SShpZGVudCgpICE9ICIiKTsKICBJKGJhc2UoKSAhPSAiIik7CiAgcmVzdWx0cyByZXM7CiAg
ZmV0Y2gocmVzLCBvbmVfY29sLCBvbmVfcm93LAogICAgICAgICJTRUxFQ1QgZGVsdGEgRlJP
TSAnJXEnIFdIRVJFIGlkID0gJyVxJyBBTkQgYmFzZSA9ICclcSciLCAKICAgICAgICB0YWJs
ZS5jX3N0cigpLCBpZGVudCgpLmNfc3RyKCksIGJhc2UoKS5jX3N0cigpKTsKICBkZWwgPSBy
ZXNbMF1bMF07Cn0KCnZvaWQgCmRhdGFiYXNlOjpwdXQoaGV4ZW5jPGlkPiBjb25zdCAmIGlk
ZW50LAogICAgICAgICAgICAgIGJhc2U2NDwgZ3ppcDxkYXRhPiA+IGNvbnN0ICYgZGF0LAog
ICAgICAgICAgICAgIHN0cmluZyBjb25zdCAmIHRhYmxlKQp7CiAgLy8gY29uc2lzdGVuY3kg
Y2hlY2sKICBJKGlkZW50KCkgIT0gIiIpOwogIGhleGVuYzxpZD4gdGlkOwogIGNhbGN1bGF0
ZV9pZGVudChkYXQsIHRpZCk7CiAgSSh0aWQgPT0gaWRlbnQpOwogIAogIGV4ZWN1dGUoIklO
U0VSVCBJTlRPICclcScgVkFMVUVTKCclcScsICclcScpIiwgCiAgICAgICAgICB0YWJsZS5j
X3N0cigpLCBpZGVudCgpLmNfc3RyKCksIGRhdCgpLmNfc3RyKCkpOwp9CgoKdm9pZCAKZGF0
YWJhc2U6OnB1dF9kZWx0YShoZXhlbmM8aWQ+IGNvbnN0ICYgaWRlbnQsCiAgICAgICAgICAg
ICAgICAgICAgaGV4ZW5jPGlkPiBjb25zdCAmIGJhc2UsCiAgICAgICAgICAgICAgICAgICAg
YmFzZTY0PGd6aXA8ZGVsdGE+ID4gY29uc3QgJiBkZWwsCiAgICAgICAgICAgICAgICAgICAg
c3RyaW5nIGNvbnN0ICYgdGFibGUpCnsKICAvLyBuYjogZGVsdGEgc2NoZW1hIGlzIChpZCwg
YmFzZSwgZGVsdGEpCiAgSShpZGVudCgpICE9ICIiKTsKICBJKGJhc2UoKSAhPSAiIik7CiAg
ZXhlY3V0ZSgiSU5TRVJUIElOVE8gJyVxJyBWQUxVRVMoJyVxJywgJyVxJywgJyVxJykiLCAK
ICAgICAgICAgIHRhYmxlLmNfc3RyKCksIAogICAgICAgICAgaWRlbnQoKS5jX3N0cigpLCBi
YXNlKCkuY19zdHIoKSwgZGVsKCkuY19zdHIoKSk7Cn0KCnZvaWQgCmRhdGFiYXNlOjpnZXRf
dmVyc2lvbihoZXhlbmM8aWQ+IGNvbnN0ICYgaWRlbnQsCiAgICAgICAgICAgICAgICAgICAg
ICBiYXNlNjQ8IGd6aXA8ZGF0YT4gPiAmIGRhdCwKICAgICAgICAgICAgICAgICAgICAgIHN0
cmluZyBjb25zdCAmIGRhdGFfdGFibGUsCiAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcg
Y29uc3QgJiBkZWx0YV90YWJsZSkKewogIEkoaWRlbnQoKSAhPSAiIik7CiAgaWYgKGV4aXN0
cyhpZGVudCwgZGF0YV90YWJsZSkpCiAgICB7CiAgICAgIC8vIGVhc3kgcGF0aAogICAgICBn
ZXQoaWRlbnQsIGRhdCwgZGF0YV90YWJsZSk7CiAgICB9CiAgZWxzZQogICAgewogICAgICAv
LyB0cmlja3kgcGF0aAoKICAgICAgLy8gd2Ugc3RhcnQgZnJvbSB0aGUgZmlsZSB3ZSB3YW50
IHRvIHJlY29uc3RydWN0IGFuZCB3b3JrICpmb3J3YXJkcyoKICAgICAgLy8gdGhyb3VnaCB0
aGUgZGF0YWJhc2UsIHVudGlsIHdlIGdldCB0byBhIGZ1bGwgZGF0YSBvYmplY3QuIHdlIHRo
ZW4KICAgICAgLy8gdHJhY2UgYmFjayB0aHJvdWdoIHRoZSBsaXN0IG9mIGVkZ2VzIHdlIGZv
bGxvd2VkIHRvIGdldCB0byB0aGUgZGF0YQogICAgICAvLyBvYmplY3QsIGFwcGx5aW5nIHJl
dmVyc2UgZGVsdGFzLgogICAgICAvLwogICAgICAvLyB0aGUgZWZmZWN0IG9mIHRoaXMgYWxn
b3JpdGhtIGlzIGJyZWFkdGgtZmlyc3Qgc2VhcmNoLCBiYWNrd2FyZHMKICAgICAgLy8gdGhy
b3VnaCB0aGUgc3RvcmFnZSBncmFwaCwgdG8gZGlzY292ZXIgYSBmb3J3YXJkcyBzaG9ydGVz
dCBwYXRoLCBhbmQKICAgICAgLy8gdGhlbiBmb2xsb3dpbmcgdGhhdCBzaG9ydGVzdCBwYXRo
IHdpdGggZGVsdGEgYXBwbGljYXRpb24uCiAgICAgIC8vCiAgICAgIC8vIHdlIHVzZWQgdG8g
ZG8gdGhpcyB3aXRoIHRoZSBib29zdCBncmFwaCBsaWJyYXJ5LCBidXQgaXQgaW52b3ZsZWQK
ICAgICAgLy8gbG9hZGluZyB0b28gbXVjaCBvZiB0aGUgc3RvcmFnZSBncmFwaCBpbnRvIG1l
bW9yeSBhdCBhbnkgbW9tZW50LiB0aGlzCiAgICAgIC8vIGltcGVyYXRpdmUgdmVyc2lvbiBv
bmx5IGxvYWRzIHRoZSBkZXNjZW5kZW50cyBvZiB0aGUgcmVjb25zdHJ1Y3Rpb24KICAgICAg
Ly8gbm9kZSwgc28gaXQgbXVjaCBjaGVhcGVyIGluIHRlcm1zIG9mIG1lbW9yeS4KICAgICAg
Ly8KICAgICAgLy8gd2UgYWxzbyBtYWludGFpbiBhIGN5Y2xlLWRldGVjdGluZyBzZXQsIGp1
c3QgdG8gYmUgc2FmZQogICAgICAKICAgICAgTChGKCJyZWNvbnN0cnVjdGluZyAlcyBpbiAl
c1xuIikgJSBpZGVudCAlIGRlbHRhX3RhYmxlKTsKICAgICAgSShkZWx0YV9leGlzdHMoaWRl
bnQsIGRlbHRhX3RhYmxlKSk7CiAgICAgIAogICAgICAvLyBuYjogYW4gZWRnZSBtYXAgZ29l
cyBpbiB0aGUgZGlyZWN0aW9uIG9mIHRoZQogICAgICAvLyBkZWx0YSwgKm5vdCogdGhlIGRp
cmVjdGlvbiB3ZSBkaXNjb3ZlciB0aGluZ3MgaW4sCiAgICAgIC8vIGkuZS4gZWFjaCBtYXAg
aXMgb2YgdGhlIGZvcm0gW25ld2lkXSAtPiBbb2xkaWRdCgogICAgICB0eXBlZGVmIG1hcDwg
aGV4ZW5jPGlkPiwgaGV4ZW5jPGlkPiA+IGVkZ2VtYXA7CiAgICAgIGxpc3Q8IHNoYXJlZF9w
dHI8ZWRnZW1hcD4gPiBwYXRoczsKCiAgICAgIHNldDwgaGV4ZW5jPGlkPiA+IGZyb250aWVy
LCBjeWNsZXM7CiAgICAgIGZyb250aWVyLmluc2VydChpZGVudCk7CgogICAgICBib29sIGZv
dW5kX3Jvb3QgPSBmYWxzZTsKICAgICAgaGV4ZW5jPGlkPiByb290KCIiKTsKCiAgICAgIHdo
aWxlICghIGZvdW5kX3Jvb3QpCiAgICAgICAgewogICAgICAgICAgc2V0PCBoZXhlbmM8aWQ+
ID4gbmV4dF9mcm9udGllcjsKICAgICAgICAgIHNoYXJlZF9wdHI8ZWRnZW1hcD4gZnJvbnRp
ZXJfbWFwKG5ldyBlZGdlbWFwKCkpOwoKICAgICAgICAgIEkoIWZyb250aWVyLmVtcHR5KCkp
OwoKICAgICAgICAgIGZvciAoc2V0PCBoZXhlbmM8aWQ+ID46OmNvbnN0X2l0ZXJhdG9yIGkg
PSBmcm9udGllci5iZWdpbigpOwogICAgICAgICAgICAgICBpICE9IGZyb250aWVyLmVuZCgp
OyArK2kpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBpZiAoZXhpc3RzKCppLCBkYXRh
X3RhYmxlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgcm9vdCA9ICpp
OwogICAgICAgICAgICAgICAgICBmb3VuZF9yb290ID0gdHJ1ZTsKICAgICAgICAgICAgICAg
ICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZWxzZQogICAgICAg
ICAgICAgICAgewogICAgICAgICAgICAgICAgICBjeWNsZXMuaW5zZXJ0KCppKTsKICAgICAg
ICAgICAgICAgICAgcmVzdWx0cyByZXM7CiAgICAgICAgICAgICAgICAgIGZldGNoKHJlcywg
b25lX2NvbCwgYW55X3Jvd3MsICJTRUxFQ1QgYmFzZSBmcm9tICclcScgV0hFUkUgaWQgPSAn
JXEnIiwKICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFfdGFibGUuY19zdHIoKSwgKCpp
KSgpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8
IHJlcy5zaXplKCk7ICsraykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAg
ICAgICAgICBoZXhlbmM8aWQ+IGNvbnN0IG54dChyZXNba11bMF0pOwoKICAgICAgICAgICAg
ICAgICAgICAgIGlmIChjeWNsZXMuZmluZChueHQpICE9IGN5Y2xlcy5lbmQoKSkKICAgICAg
ICAgICAgICAgICAgICAgICAgdGhyb3cgb29wcygiY3ljbGUgaW4gdGFibGUgJyIgKyBkZWx0
YV90YWJsZSArICInLCBhdCBub2RlICIgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgKyAoKmkpKCkgKyAiIDwtICIgKyBueHQoKSk7CgogICAgICAgICAgICAgICAgICAg
ICAgbmV4dF9mcm9udGllci5pbnNlcnQobnh0KTsKCiAgICAgICAgICAgICAgICAgICAgICBp
ZiAoZnJvbnRpZXJfbWFwLT5maW5kKG54dCkgPT0gZnJvbnRpZXJfbWFwLT5lbmQoKSkKICAg
ICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgIEwoRigi
aW5zZXJ0aW5nIGVkZ2U6ICVzIDwtICVzXG4iKSAlICgqaSkgJSBueHQpOwogICAgICAgICAg
ICAgICAgICAgICAgICAgIGZyb250aWVyX21hcC0+aW5zZXJ0KG1ha2VfcGFpcihueHQsICpp
KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIGVs
c2UKICAgICAgICAgICAgICAgICAgICAgICAgTChGKCJza2lwcGluZyBtZXJnZSBlZGdlICVz
IDwtICVzXG4iKSAlICgqaSkgJSBueHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAg
ICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgaWYgKCFmb3VuZF9yb290KQog
ICAgICAgICAgICB7CiAgICAgICAgICAgICAgZnJvbnRpZXIgPSBuZXh0X2Zyb250aWVyOwog
ICAgICAgICAgICAgIHBhdGhzLnB1c2hfZnJvbnQoZnJvbnRpZXJfbWFwKTsKICAgICAgICAg
ICAgfQogICAgICAgIH0KCiAgICAgIC8vIHBhdGggYnVpbHQsIG5vdyBhbGwgd2UgbmVlZCB0
byBkbyBpcyBmb2xsb3cgaXQgYmFjawoKICAgICAgSShmb3VuZF9yb290KTsKICAgICAgSShy
b290KCkgIT0gIiIpOwogICAgICBiYXNlNjQ8IGd6aXA8ZGF0YT4gPiBiZWdpbl9wYWNrZWQ7
CiAgICAgIGRhdGEgYmVnaW47ICAgICAgCiAgICAgIGdldChyb290LCBiZWdpbl9wYWNrZWQs
IGRhdGFfdGFibGUpOwogICAgICB1bnBhY2soYmVnaW5fcGFja2VkLCBiZWdpbik7CiAgICAg
IGhleGVuYzxpZD4gY3VyciA9IHJvb3Q7CgogICAgICBib29zdDo6c2hhcmVkX3B0cjxkZWx0
YV9hcHBsaWNhdG9yPiBhcHAgPSBuZXdfcGllY2V3aXNlX2FwcGxpY2F0b3IoKTsKICAgICAg
YXBwLT5iZWdpbihiZWdpbigpKTsKICAgICAgCiAgICAgIGZvciAobGlzdDwgc2hhcmVkX3B0
cjxlZGdlbWFwPiA+Ojpjb25zdF9pdGVyYXRvciBwID0gcGF0aHMuYmVnaW4oKTsKICAgICAg
ICAgICBwICE9IHBhdGhzLmVuZCgpOyArK3ApCiAgICAgICAgewogICAgICAgICAgc2hhcmVk
X3B0cjxlZGdlbWFwPiBpID0gKnA7CiAgICAgICAgICBJKGktPmZpbmQoY3VycikgIT0gaS0+
ZW5kKCkpOwogICAgICAgICAgaGV4ZW5jPGlkPiBjb25zdCBueHQgPSBpLT5maW5kKGN1cnIp
LT5zZWNvbmQ7CgogICAgICAgICAgTChGKCJmb2xsb3dpbmcgZGVsdGEgJXMgLT4gJXNcbiIp
ICUgY3VyciAlIG54dCk7CiAgICAgICAgICBiYXNlNjQ8IGd6aXA8ZGVsdGE+ID4gZGVsX3Bh
Y2tlZDsKICAgICAgICAgIGdldF9kZWx0YShueHQsIGN1cnIsIGRlbF9wYWNrZWQsIGRlbHRh
X3RhYmxlKTsKICAgICAgICAgIGRlbHRhIGRlbDsKICAgICAgICAgIHVucGFjayhkZWxfcGFj
a2VkLCBkZWwpOwogICAgICAgICAgYXBwbHlfZGVsdGEgKGFwcCwgZGVsKCkpOwogICAgICAg
ICAgYXBwLT5uZXh0KCk7CiAgICAgICAgICBjdXJyID0gbnh0OwogICAgICAgIH0KCiAgICAg
IHN0cmluZyB0bXA7CiAgICAgIGFwcC0+ZmluaXNoKHRtcCk7CiAgICAgIGRhdGEgZW5kKHRt
cCk7CgogICAgICBoZXhlbmM8aWQ+IGZpbmFsOwogICAgICBjYWxjdWxhdGVfaWRlbnQoZW5k
LCBmaW5hbCk7CiAgICAgIEkoZmluYWwgPT0gaWRlbnQpOwogICAgICBwYWNrKGVuZCwgZGF0
KTsKICAgIH0KfQoKCnZvaWQgCmRhdGFiYXNlOjpkcm9wKGhleGVuYzxpZD4gY29uc3QgJiBp
ZGVudCwgCiAgICAgICAgICAgICAgIHN0cmluZyBjb25zdCAmIHRhYmxlKQp7CiAgZXhlY3V0
ZSgiREVMRVRFIEZST00gJyVxJyBXSEVSRSBpZCA9ICclcSciLCAgCiAgICAgICAgICB0YWJs
ZS5jX3N0cigpLAogICAgICAgICAgaWRlbnQoKS5jX3N0cigpKTsKfQoKdm9pZCAKZGF0YWJh
c2U6OnB1dF92ZXJzaW9uKGhleGVuYzxpZD4gY29uc3QgJiBvbGRfaWQsCiAgICAgICAgICAg
ICAgICAgICAgICBoZXhlbmM8aWQ+IGNvbnN0ICYgbmV3X2lkLAogICAgICAgICAgICAgICAg
ICAgICAgYmFzZTY0PCBnemlwPGRlbHRhPiA+IGNvbnN0ICYgZGVsLAogICAgICAgICAgICAg
ICAgICAgICAgc3RyaW5nIGNvbnN0ICYgZGF0YV90YWJsZSwKICAgICAgICAgICAgICAgICAg
ICAgIHN0cmluZyBjb25zdCAmIGRlbHRhX3RhYmxlKQp7CgogIGJhc2U2NDwgZ3ppcDxkYXRh
PiA+IG9sZF9kYXRhLCBuZXdfZGF0YTsKICBiYXNlNjQ8IGd6aXA8ZGVsdGE+ID4gcmV2ZXJz
ZV9kZWx0YTsKICAKICBnZXRfdmVyc2lvbihvbGRfaWQsIG9sZF9kYXRhLCBkYXRhX3RhYmxl
LCBkZWx0YV90YWJsZSk7CiAgcGF0Y2gob2xkX2RhdGEsIGRlbCwgbmV3X2RhdGEpOwogIGRp
ZmYobmV3X2RhdGEsIG9sZF9kYXRhLCByZXZlcnNlX2RlbHRhKTsKICAgICAgCiAgdHJhbnNh
Y3Rpb25fZ3VhcmQgZ3VhcmQoKnRoaXMpOwogIGlmIChleGlzdHMob2xkX2lkLCBkYXRhX3Rh
YmxlKSkKICAgIHsKICAgICAgLy8gZGVzY2VuZGVudCBvZiBhIGhlYWQgdmVyc2lvbiByZXBs
YWNlcyB0aGUgaGVhZCwgdGhlcmVmb3JlIG9sZCBoZWFkCiAgICAgIC8vIG11c3QgYmUgZGlz
cG9zZWQgb2YKICAgICAgZHJvcChvbGRfaWQsIGRhdGFfdGFibGUpOwogICAgfQogIHB1dChu
ZXdfaWQsIG5ld19kYXRhLCBkYXRhX3RhYmxlKTsKICBwdXRfZGVsdGEob2xkX2lkLCBuZXdf
aWQsIHJldmVyc2VfZGVsdGEsIGRlbHRhX3RhYmxlKTsKICBndWFyZC5jb21taXQoKTsKfQoK
dm9pZCAKZGF0YWJhc2U6OnB1dF9yZXZlcnNlX3ZlcnNpb24oaGV4ZW5jPGlkPiBjb25zdCAm
IG5ld19pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGV4ZW5jPGlkPiBjb25z
dCAmIG9sZF9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0PCBnemlw
PGRlbHRhPiA+IGNvbnN0ICYgcmV2ZXJzZV9kZWwsCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHN0cmluZyBjb25zdCAmIGRhdGFfdGFibGUsCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHN0cmluZyBjb25zdCAmIGRlbHRhX3RhYmxlKQp7CiAgYmFzZTY0PCBnemlw
PGRhdGE+ID4gb2xkX2RhdGEsIG5ld19kYXRhOwogIAogIGdldF92ZXJzaW9uKG5ld19pZCwg
bmV3X2RhdGEsIGRhdGFfdGFibGUsIGRlbHRhX3RhYmxlKTsKICBwYXRjaChuZXdfZGF0YSwg
cmV2ZXJzZV9kZWwsIG9sZF9kYXRhKTsKICBoZXhlbmM8aWQ+IGNoZWNrOwogIGNhbGN1bGF0
ZV9pZGVudChvbGRfZGF0YSwgY2hlY2spOwogIEkob2xkX2lkID09IGNoZWNrKTsKICAgICAg
CiAgdHJhbnNhY3Rpb25fZ3VhcmQgZ3VhcmQoKnRoaXMpOwogIHB1dF9kZWx0YShvbGRfaWQs
IG5ld19pZCwgcmV2ZXJzZV9kZWwsIGRlbHRhX3RhYmxlKTsKICBndWFyZC5jb21taXQoKTsK
fQoKCgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0KLy8gLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIC0tCi8vIC0tICAgICAgICAgICAgICBwdWJsaWMgaW50
ZXJmYWNlIGZvbGxvd3MgICAgICAgICAgICAgICAgICAtLQovLyAtLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KLy8gLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
Cgpib29sIApkYXRhYmFzZTo6ZmlsZV92ZXJzaW9uX2V4aXN0cyhmaWxlX2lkIGNvbnN0ICYg
aWQpCnsKICByZXR1cm4gZGVsdGFfZXhpc3RzKGlkLmlubmVyKCksICJmaWxlX2RlbHRhcyIp
IAogICAgfHwgZXhpc3RzKGlkLmlubmVyKCksICJmaWxlcyIpOwp9Cgpib29sIApkYXRhYmFz
ZTo6bWFuaWZlc3RfdmVyc2lvbl9leGlzdHMobWFuaWZlc3RfaWQgY29uc3QgJiBpZCkKewog
IHJldHVybiBkZWx0YV9leGlzdHMoaWQuaW5uZXIoKSwgIm1hbmlmZXN0X2RlbHRhcyIpIAog
ICAgfHwgZXhpc3RzKGlkLmlubmVyKCksICJtYW5pZmVzdHMiKTsKfQoKYm9vbCAKZGF0YWJh
c2U6OnJldmlzaW9uX2V4aXN0cyhyZXZpc2lvbl9pZCBjb25zdCAmIGlkKQp7CiAgcmV0dXJu
IGV4aXN0cyhpZC5pbm5lcigpLCAicmV2aXNpb25zIik7Cn0KCgp2b2lkIApkYXRhYmFzZTo6
Z2V0X2ZpbGVfdmVyc2lvbihmaWxlX2lkIGNvbnN0ICYgaWQsCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGZpbGVfZGF0YSAmIGRhdCkKewogIGJhc2U2NDwgZ3ppcDxkYXRhPiA+IHRt
cDsKICBnZXRfdmVyc2lvbihpZC5pbm5lcigpLCB0bXAsICJmaWxlcyIsICJmaWxlX2RlbHRh
cyIpOwogIGRhdCA9IHRtcDsKfQoKdm9pZCAKZGF0YWJhc2U6OmdldF9tYW5pZmVzdF92ZXJz
aW9uKG1hbmlmZXN0X2lkIGNvbnN0ICYgaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBtYW5pZmVzdF9kYXRhICYgZGF0KQp7CiAgYmFzZTY0PCBnemlwPGRhdGE+ID4gdG1w
OwogIGdldF92ZXJzaW9uKGlkLmlubmVyKCksIHRtcCwgIm1hbmlmZXN0cyIsICJtYW5pZmVz
dF9kZWx0YXMiKTsKICBkYXQgPSB0bXA7Cn0KCnZvaWQgCmRhdGFiYXNlOjpnZXRfbWFuaWZl
c3QobWFuaWZlc3RfaWQgY29uc3QgJiBpZCwKICAgICAgICAgICAgICAgICAgICAgICBtYW5p
ZmVzdF9tYXAgJiBtbSkKewogIG1hbmlmZXN0X2RhdGEgbWRhdDsKICBnZXRfbWFuaWZlc3Rf
dmVyc2lvbihpZCwgbWRhdCk7CiAgcmVhZF9tYW5pZmVzdF9tYXAobWRhdCwgbW0pOwp9CgoK
dm9pZCAKZGF0YWJhc2U6OnB1dF9maWxlKGZpbGVfaWQgY29uc3QgJiBpZCwKICAgICAgICAg
ICAgICAgICAgIGZpbGVfZGF0YSBjb25zdCAmIGRhdCkKewogIHB1dChpZC5pbm5lcigpLCBk
YXQuaW5uZXIoKSwgImZpbGVzIik7Cn0KCnZvaWQgCmRhdGFiYXNlOjpwdXRfZmlsZV92ZXJz
aW9uKGZpbGVfaWQgY29uc3QgJiBvbGRfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAg
IGZpbGVfaWQgY29uc3QgJiBuZXdfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZp
bGVfZGVsdGEgY29uc3QgJiBkZWwpCnsKICBwdXRfdmVyc2lvbihvbGRfaWQuaW5uZXIoKSwg
bmV3X2lkLmlubmVyKCksIGRlbC5pbm5lcigpLCAKICAgICAgICAgICAgICAiZmlsZXMiLCAi
ZmlsZV9kZWx0YXMiKTsKfQoKdm9pZCAKZGF0YWJhc2U6OnB1dF9maWxlX3JldmVyc2VfdmVy
c2lvbihmaWxlX2lkIGNvbnN0ICYgbmV3X2lkLAogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGZpbGVfaWQgY29uc3QgJiBvbGRfaWQsICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9k
ZWx0YSBjb25zdCAmIGRlbCkKewogIHB1dF9yZXZlcnNlX3ZlcnNpb24obmV3X2lkLmlubmVy
KCksIG9sZF9pZC5pbm5lcigpLCBkZWwuaW5uZXIoKSwgCiAgICAgICAgICAgICAgICAgICAg
ICAiZmlsZXMiLCAiZmlsZV9kZWx0YXMiKTsKfQoKCnZvaWQgCmRhdGFiYXNlOjpwdXRfbWFu
aWZlc3QobWFuaWZlc3RfaWQgY29uc3QgJiBpZCwKICAgICAgICAgICAgICAgICAgICAgICBt
YW5pZmVzdF9kYXRhIGNvbnN0ICYgZGF0KQp7CiAgcHV0KGlkLmlubmVyKCksIGRhdC5pbm5l
cigpLCAibWFuaWZlc3RzIik7Cn0KCnZvaWQgCmRhdGFiYXNlOjpwdXRfbWFuaWZlc3RfdmVy
c2lvbihtYW5pZmVzdF9pZCBjb25zdCAmIG9sZF9pZCwKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIG1hbmlmZXN0X2lkIGNvbnN0ICYgbmV3X2lkLAogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgbWFuaWZlc3RfZGVsdGEgY29uc3QgJiBkZWwpCnsKICBwdXRfdmVy
c2lvbihvbGRfaWQuaW5uZXIoKSwgbmV3X2lkLmlubmVyKCksIGRlbC5pbm5lcigpLCAKICAg
ICAgICAgICAgICAibWFuaWZlc3RzIiwgIm1hbmlmZXN0X2RlbHRhcyIpOwp9Cgp2b2lkIApk
YXRhYmFzZTo6cHV0X21hbmlmZXN0X3JldmVyc2VfdmVyc2lvbihtYW5pZmVzdF9pZCBjb25z
dCAmIG5ld19pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFu
aWZlc3RfaWQgY29uc3QgJiBvbGRfaWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0X2Rl
bHRhIGNvbnN0ICYgZGVsKQp7CiAgcHV0X3JldmVyc2VfdmVyc2lvbihuZXdfaWQuaW5uZXIo
KSwgb2xkX2lkLmlubmVyKCksIGRlbC5pbm5lcigpLCAKICAgICAgICAgICAgICAgICAgICAg
ICJtYW5pZmVzdHMiLCAibWFuaWZlc3RfZGVsdGFzIik7Cn0KCgp2b2lkIApkYXRhYmFzZTo6
Z2V0X3JldmlzaW9uX2FuY2VzdHJ5KHN0ZDo6c2V0PHN0ZDo6cGFpcjxyZXZpc2lvbl9pZCwg
cmV2aXNpb25faWQ+ID4gJiBncmFwaCkKewogIHJlc3VsdHMgcmVzOwogIGdyYXBoLmNsZWFy
KCk7CiAgZmV0Y2gocmVzLCAyLCBhbnlfcm93cywgCiAgICAgICAgIlNFTEVDVCBwYXJlbnQs
Y2hpbGQgRlJPTSByZXZpc2lvbl9hbmNlc3RyeSIpOwogIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgcmVzLnNpemUoKTsgKytpKQogICAgZ3JhcGguaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHJl
dmlzaW9uX2lkKHJlc1tpXVswXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
cmV2aXNpb25faWQocmVzW2ldWzFdKSkpOwp9Cgp2b2lkIApkYXRhYmFzZTo6Z2V0X3Jldmlz
aW9uX3BhcmVudHMocmV2aXNpb25faWQgY29uc3QgJiBpZCwKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgc2V0PHJldmlzaW9uX2lkPiAmIHBhcmVudHMpCnsKICByZXN1bHRzIHJl
czsKICBwYXJlbnRzLmNsZWFyKCk7CiAgZmV0Y2gocmVzLCBvbmVfY29sLCBhbnlfcm93cywg
CiAgICAgICAgIlNFTEVDVCBwYXJlbnQgRlJPTSByZXZpc2lvbl9hbmNlc3RyeSBXSEVSRSBj
aGlsZCA9ICclcSciLAogICAgICAgIGlkLmlubmVyKCkoKS5jX3N0cigpKTsKICBmb3IgKHNp
emVfdCBpID0gMDsgaSA8IHJlcy5zaXplKCk7ICsraSkKICAgIHBhcmVudHMuaW5zZXJ0KHJl
dmlzaW9uX2lkKHJlc1tpXVswXSkpOwp9Cgp2b2lkIApkYXRhYmFzZTo6Z2V0X3JldmlzaW9u
X2NoaWxkcmVuKHJldmlzaW9uX2lkIGNvbnN0ICYgaWQsCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgc2V0PHJldmlzaW9uX2lkPiAmIGNoaWxkcmVuKQp7CiAgcmVzdWx0cyBy
ZXM7CiAgY2hpbGRyZW4uY2xlYXIoKTsKICBmZXRjaChyZXMsIG9uZV9jb2wsIGFueV9yb3dz
LCAKICAgICAgICAiU0VMRUNUIGNoaWxkIEZST00gcmV2aXNpb25fYW5jZXN0cnkgV0hFUkUg
cGFyZW50ID0gJyVxJyIsCiAgICAgICAgaWQuaW5uZXIoKSgpLmNfc3RyKCkpOwogIGZvciAo
c2l6ZV90IGkgPSAwOyBpIDwgcmVzLnNpemUoKTsgKytpKQogICAgY2hpbGRyZW4uaW5zZXJ0
KHJldmlzaW9uX2lkKHJlc1tpXVswXSkpOwp9Cgp2b2lkIApkYXRhYmFzZTo6Z2V0X3Jldmlz
aW9uX21hbmlmZXN0KHJldmlzaW9uX2lkIGNvbnN0ICYgcmlkLAogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgbWFuaWZlc3RfaWQgJiBtaWQpCnsKICByZXZpc2lvbl9zZXQgcmV2
OwogIGdldF9yZXZpc2lvbihyaWQsIHJldik7CiAgbWlkID0gcmV2Lm5ld19tYW5pZmVzdDsK
fQoKdm9pZCAKZGF0YWJhc2U6OmdldF9yZXZpc2lvbihyZXZpc2lvbl9pZCBjb25zdCAmIGlk
LAogICAgICAgICAgICAgICAgICAgICAgIHJldmlzaW9uX3NldCAmIHJldikKewogIHJldmlz
aW9uX2RhdGEgZDsKICBnZXRfcmV2aXNpb24oaWQsIGQpOwogIHJlYWRfcmV2aXNpb25fc2V0
KGQsIHJldik7Cn0KCnZvaWQgCmRhdGFiYXNlOjpnZXRfcmV2aXNpb24ocmV2aXNpb25faWQg
Y29uc3QgJiBpZCwKICAgICAgICAgICAgICAgICAgICAgICByZXZpc2lvbl9kYXRhICYgZGF0
KQp7CiAgcmVzdWx0cyByZXM7CiAgZmV0Y2gocmVzLCBvbmVfY29sLCBvbmVfcm93LCAKICAg
ICAgICAiU0VMRUNUIGRhdGEgRlJPTSByZXZpc2lvbnMgV0hFUkUgaWQgPSAnJXEnIiwKICAg
ICAgICBpZC5pbm5lcigpKCkuY19zdHIoKSk7CgogIGRhdCA9IHJldmlzaW9uX2RhdGEocmVz
WzBdWzBdKTsKCiAgLy8gdmVyaWZ5IHRoYXQgd2UgZ290IGEgcmV2aXNpb24gd2l0aCB0aGUg
cmlnaHQgaWQKICB7CiAgICByZXZpc2lvbl9pZCB0bXA7CiAgICBjYWxjdWxhdGVfaWRlbnQo
ZGF0LCB0bXApOwogICAgSShpZCA9PSB0bXApOwogIH0KfQoKdm9pZCAKZGF0YWJhc2U6OnB1
dF9yZXZpc2lvbihyZXZpc2lvbl9pZCBjb25zdCAmIG5ld19pZCwKICAgICAgICAgICAgICAg
ICAgICAgICByZXZpc2lvbl9zZXQgY29uc3QgJiByZXYpCnsKCiAgSSghcmV2aXNpb25fZXhp
c3RzKG5ld19pZCkpOwogIHJldmlzaW9uX2RhdGEgZDsKCiAgd3JpdGVfcmV2aXNpb25fc2V0
KHJldiwgZCk7CiAgcmV2aXNpb25faWQgdG1wOwogIGNhbGN1bGF0ZV9pZGVudChkLCB0bXAp
OwogIEkodG1wID09IG5ld19pZCk7CgogIHRyYW5zYWN0aW9uX2d1YXJkIGd1YXJkKCp0aGlz
KTsKCiAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gcmV2aXNpb25zIFZBTFVFUygnJXEnLCAnJXEn
KSIsIAogICAgICAgICAgbmV3X2lkLmlubmVyKCkoKS5jX3N0cigpLCAKICAgICAgICAgIGQu
aW5uZXIoKSgpLmNfc3RyKCkpOwoKICBmb3IgKGVkZ2VfbWFwOjpjb25zdF9pdGVyYXRvciBl
ID0gcmV2LmVkZ2VzLmJlZ2luKCk7CiAgICAgICBlICE9IHJldi5lZGdlcy5lbmQoKTsgKytl
KQogICAgewogICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyByZXZpc2lvbl9hbmNlc3RyeSBW
QUxVRVMoJyVxJywgJyVxJykiLCAKICAgICAgICAgICAgICBlZGdlX29sZF9yZXZpc2lvbihl
KS5pbm5lcigpKCkuY19zdHIoKSwKICAgICAgICAgICAgICBuZXdfaWQuaW5uZXIoKSgpLmNf
c3RyKCkpOwogICAgfQoKICBndWFyZC5jb21taXQoKTsKfQoKdm9pZCAKZGF0YWJhc2U6OnB1
dF9yZXZpc2lvbihyZXZpc2lvbl9pZCBjb25zdCAmIG5ld19pZCwKICAgICAgICAgICAgICAg
ICAgICAgICByZXZpc2lvbl9kYXRhIGNvbnN0ICYgZGF0KQp7CiAgcmV2aXNpb25fc2V0IHJl
djsKICByZWFkX3JldmlzaW9uX3NldChkYXQsIHJldik7CiAgcHV0X3JldmlzaW9uKG5ld19p
ZCwgcmV2KTsKfQoKCi8vIGNyeXB0byBrZXkgbWFuYWdlbWVudAoKdm9pZCAKZGF0YWJhc2U6
OmdldF9rZXlfaWRzKHN0cmluZyBjb25zdCAmIHBhdHRlcm4sCiAgICAgICAgICAgICAgICAg
ICAgICB2ZWN0b3I8cnNhX2tleXBhaXJfaWQ+ICYgcHVia2V5cywKICAgICAgICAgICAgICAg
ICAgICAgIHZlY3Rvcjxyc2Ffa2V5cGFpcl9pZD4gJiBwcml2a2V5cykKewogIHB1YmtleXMu
Y2xlYXIoKTsKICBwcml2a2V5cy5jbGVhcigpOwogIHJlc3VsdHMgcmVzOwoKICBpZiAocGF0
dGVybiAhPSAiIikKICAgIGZldGNoKHJlcywgb25lX2NvbCwgYW55X3Jvd3MsIAogICAgICAg
ICAgIlNFTEVDVCBpZCBmcm9tIHB1YmxpY19rZXlzIFdIRVJFIGlkIEdMT0IgJyVxJyIsCiAg
ICAgICAgICBwYXR0ZXJuLmNfc3RyKCkpOwogIGVsc2UKICAgIGZldGNoKHJlcywgb25lX2Nv
bCwgYW55X3Jvd3MsIAogICAgICAgICAgIlNFTEVDVCBpZCBmcm9tIHB1YmxpY19rZXlzIik7
CgogIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzLnNpemUoKTsgKytpKQogICAgcHVia2V5
cy5wdXNoX2JhY2socmVzW2ldWzBdKTsKCiAgaWYgKHBhdHRlcm4gIT0gIiIpCiAgICBmZXRj
aChyZXMsIG9uZV9jb2wsIGFueV9yb3dzLCAKICAgICAgICAgICJTRUxFQ1QgaWQgZnJvbSBw
cml2YXRlX2tleXMgV0hFUkUgaWQgR0xPQiAnJXEnIiwKICAgICAgICAgIHBhdHRlcm4uY19z
dHIoKSk7CiAgZWxzZQogICAgZmV0Y2gocmVzLCBvbmVfY29sLCBhbnlfcm93cywgCiAgICAg
ICAgICAiU0VMRUNUIGlkIGZyb20gcHJpdmF0ZV9rZXlzIik7CgogIGZvciAoc2l6ZV90IGkg
PSAwOyBpIDwgcmVzLnNpemUoKTsgKytpKQogICAgcHJpdmtleXMucHVzaF9iYWNrKHJlc1tp
XVswXSk7Cn0KCnZvaWQgCmRhdGFiYXNlOjpnZXRfcHJpdmF0ZV9rZXlzKHZlY3Rvcjxyc2Ff
a2V5cGFpcl9pZD4gJiBwcml2a2V5cykKewogIHByaXZrZXlzLmNsZWFyKCk7CiAgcmVzdWx0
cyByZXM7CiAgZmV0Y2gocmVzLCBvbmVfY29sLCBhbnlfcm93cywgICJTRUxFQ1QgaWQgZnJv
bSBwcml2YXRlX2tleXMiKTsKICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlcy5zaXplKCk7
ICsraSkKICAgIHByaXZrZXlzLnB1c2hfYmFjayhyZXNbaV1bMF0pOwp9Cgpib29sIApkYXRh
YmFzZTo6cHVibGljX2tleV9leGlzdHMoaGV4ZW5jPGlkPiBjb25zdCAmIGhhc2gpCnsKICBy
ZXN1bHRzIHJlczsKICBmZXRjaChyZXMsIG9uZV9jb2wsIGFueV9yb3dzLCAKICAgICAgICAi
U0VMRUNUIGlkIEZST00gcHVibGljX2tleXMgV0hFUkUgaGFzaCA9ICclcSciLAogICAgICAg
IGhhc2goKS5jX3N0cigpKTsKICBJKChyZXMuc2l6ZSgpID09IDEpIHx8IChyZXMuc2l6ZSgp
ID09IDApKTsKICBpZiAocmVzLnNpemUoKSA9PSAxKSAKICAgIHJldHVybiB0cnVlOwogIHJl
dHVybiBmYWxzZTsKfQoKYm9vbCAKZGF0YWJhc2U6OnB1YmxpY19rZXlfZXhpc3RzKHJzYV9r
ZXlwYWlyX2lkIGNvbnN0ICYgaWQpCnsKICByZXN1bHRzIHJlczsKICBmZXRjaChyZXMsIG9u
ZV9jb2wsIGFueV9yb3dzLCAKICAgICAgICAiU0VMRUNUIGlkIEZST00gcHVibGljX2tleXMg
V0hFUkUgaWQgPSAnJXEnIiwKICAgICAgICBpZCgpLmNfc3RyKCkpOwogIEkoKHJlcy5zaXpl
KCkgPT0gMSkgfHwgKHJlcy5zaXplKCkgPT0gMCkpOwogIGlmIChyZXMuc2l6ZSgpID09IDEp
IAogICAgcmV0dXJuIHRydWU7CiAgcmV0dXJuIGZhbHNlOwp9Cgpib29sIApkYXRhYmFzZTo6
cHJpdmF0ZV9rZXlfZXhpc3RzKHJzYV9rZXlwYWlyX2lkIGNvbnN0ICYgaWQpCnsKICByZXN1
bHRzIHJlczsKICBmZXRjaChyZXMsIG9uZV9jb2wsIGFueV9yb3dzLAogICAgICAgICJTRUxF
Q1QgaWQgRlJPTSBwcml2YXRlX2tleXMgV0hFUkUgaWQgPSAnJXEnIiwKICAgICAgICBpZCgp
LmNfc3RyKCkpOwogIEkoKHJlcy5zaXplKCkgPT0gMSkgfHwgKHJlcy5zaXplKCkgPT0gMCkp
OwogIGlmIChyZXMuc2l6ZSgpID09IDEpCiAgICByZXR1cm4gdHJ1ZTsKICByZXR1cm4gZmFs
c2U7Cn0KCmJvb2wgCmRhdGFiYXNlOjprZXlfZXhpc3RzKHJzYV9rZXlwYWlyX2lkIGNvbnN0
ICYgaWQpCnsKICByZXR1cm4gcHVibGljX2tleV9leGlzdHMoaWQpIHx8IHByaXZhdGVfa2V5
X2V4aXN0cyhpZCk7Cn0KCnZvaWQgCmRhdGFiYXNlOjpnZXRfcHVia2V5KGhleGVuYzxpZD4g
Y29uc3QgJiBoYXNoLCAKICAgICAgICAgICAgICAgICAgICAgcnNhX2tleXBhaXJfaWQgJiBp
ZCwKICAgICAgICAgICAgICAgICAgICAgYmFzZTY0PHJzYV9wdWJfa2V5PiAmIHB1Yl9lbmNv
ZGVkKQp7CiAgcmVzdWx0cyByZXM7CiAgZmV0Y2gocmVzLCAyLCBvbmVfcm93LCAKICAgICAg
ICAiU0VMRUNUIGlkLCBrZXlkYXRhIEZST00gcHVibGljX2tleXMgd2hlcmUgaGFzaCA9ICcl
cSciLCAKICAgICAgICBoYXNoKCkuY19zdHIoKSk7CiAgaWQgPSByZXNbMF1bMF07CiAgcHVi
X2VuY29kZWQgPSByZXNbMF1bMV07Cn0KCnZvaWQgCmRhdGFiYXNlOjpnZXRfa2V5KHJzYV9r
ZXlwYWlyX2lkIGNvbnN0ICYgcHViX2lkLCAKICAgICAgICAgICAgICAgICAgYmFzZTY0PHJz
YV9wdWJfa2V5PiAmIHB1Yl9lbmNvZGVkKQp7CiAgcmVzdWx0cyByZXM7CiAgZmV0Y2gocmVz
LCBvbmVfY29sLCBvbmVfcm93LCAKICAgICAgICAiU0VMRUNUIGtleWRhdGEgRlJPTSBwdWJs
aWNfa2V5cyB3aGVyZSBpZCA9ICclcSciLCAKICAgICAgICBwdWJfaWQoKS5jX3N0cigpKTsK
ICBwdWJfZW5jb2RlZCA9IHJlc1swXVswXTsKfQoKdm9pZCAKZGF0YWJhc2U6OmdldF9rZXko
cnNhX2tleXBhaXJfaWQgY29uc3QgJiBwcml2X2lkLCAKICAgICAgICAgICAgICAgICAgYmFz
ZTY0PCBhcmM0PHJzYV9wcml2X2tleT4gPiAmIHByaXZfZW5jb2RlZCkKewogIHJlc3VsdHMg
cmVzOwogIGZldGNoKHJlcywgb25lX2NvbCwgb25lX2NvbCwgCiAgICAgICAgIlNFTEVDVCBr
ZXlkYXRhIEZST00gcHJpdmF0ZV9rZXlzIHdoZXJlIGlkID0gJyVxJyIsIAogICAgICAgIHBy
aXZfaWQoKS5jX3N0cigpKTsKICBwcml2X2VuY29kZWQgPSByZXNbMF1bMF07Cn0KCgp2b2lk
IApkYXRhYmFzZTo6cHV0X2tleShyc2Ffa2V5cGFpcl9pZCBjb25zdCAmIHB1Yl9pZCwgCiAg
ICAgICAgICAgICAgICAgIGJhc2U2NDxyc2FfcHViX2tleT4gY29uc3QgJiBwdWJfZW5jb2Rl
ZCkKewogIGhleGVuYzxpZD4gdGhhc2g7CiAga2V5X2hhc2hfY29kZShwdWJfaWQsIHB1Yl9l
bmNvZGVkLCB0aGFzaCk7CiAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gcHVibGljX2tleXMgVkFM
VUVTKCclcScsICclcScsICclcScpIiwgCiAgICAgICAgICB0aGFzaCgpLmNfc3RyKCksIHB1
Yl9pZCgpLmNfc3RyKCksIHB1Yl9lbmNvZGVkKCkuY19zdHIoKSk7Cn0KCnZvaWQgCmRhdGFi
YXNlOjpwdXRfa2V5KHJzYV9rZXlwYWlyX2lkIGNvbnN0ICYgcHJpdl9pZCwgCiAgICAgICAg
ICAgICAgICAgIGJhc2U2NDwgYXJjNDxyc2FfcHJpdl9rZXk+ID4gY29uc3QgJiBwcml2X2Vu
Y29kZWQpCnsKICAKICBoZXhlbmM8aWQ+IHRoYXNoOwogIGtleV9oYXNoX2NvZGUocHJpdl9p
ZCwgcHJpdl9lbmNvZGVkLCB0aGFzaCk7CiAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gcHJpdmF0
ZV9rZXlzIFZBTFVFUygnJXEnLCAnJXEnLCAnJXEnKSIsIAogICAgICAgICAgdGhhc2goKS5j
X3N0cigpLCBwcml2X2lkKCkuY19zdHIoKSwgcHJpdl9lbmNvZGVkKCkuY19zdHIoKSk7Cn0K
CnZvaWQgCmRhdGFiYXNlOjpwdXRfa2V5X3BhaXIocnNhX2tleXBhaXJfaWQgY29uc3QgJiBp
ZCwgCiAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0PHJzYV9wdWJfa2V5PiBjb25zdCAm
IHB1Yl9lbmNvZGVkLAogICAgICAgICAgICAgICAgICAgICAgIGJhc2U2NDwgYXJjNDxyc2Ff
cHJpdl9rZXk+ID4gY29uc3QgJiBwcml2X2VuY29kZWQpCnsKICB0cmFuc2FjdGlvbl9ndWFy
ZCBndWFyZCgqdGhpcyk7CiAgcHV0X2tleShpZCwgcHViX2VuY29kZWQpOwogIHB1dF9rZXko
aWQsIHByaXZfZW5jb2RlZCk7CiAgZ3VhcmQuY29tbWl0KCk7Cn0KCgovLyBjZXJ0IG1hbmFn
ZW1lbnQKCmJvb2wgCmRhdGFiYXNlOjpjZXJ0X2V4aXN0cyhjZXJ0IGNvbnN0ICYgdCwKICAg
ICAgICAgICAgICAgICAgICAgIHN0cmluZyBjb25zdCAmIHRhYmxlKQp7CiAgcmVzdWx0cyBy
ZXM7CiAgZmV0Y2gocmVzLCAxLCBhbnlfcm93cywKICAgICAgICAiU0VMRUNUIGlkIEZST00g
JyVxJyBXSEVSRSBpZCA9ICclcScgIgogICAgICAgICJBTkQgbmFtZSA9ICclcScgQU5EIHZh
bHVlID0gJyVxJyAiIAogICAgICAgICJBTkQga2V5cGFpciA9ICclcScgQU5EIHNpZ25hdHVy
ZSA9ICclcScgIiwKICAgICAgICB0YWJsZS5jX3N0cigpLAogICAgICAgIHQuaWRlbnQoKS5j
X3N0cigpLAogICAgICAgIHQubmFtZSgpLmNfc3RyKCksCiAgICAgICAgdC52YWx1ZSgpLmNf
c3RyKCksCiAgICAgICAgdC5rZXkoKS5jX3N0cigpLAogICAgICAgIHQuc2lnKCkuY19zdHIo
KSk7CiAgSShyZXMuc2l6ZSgpID09IDAgfHwgcmVzLnNpemUoKSA9PSAxKTsKICByZXR1cm4g
cmVzLnNpemUoKSA9PSAxOwp9Cgp2b2lkIApkYXRhYmFzZTo6cHV0X2NlcnQoY2VydCBjb25z
dCAmIHQsCiAgICAgICAgICAgICAgICAgICBzdHJpbmcgY29uc3QgJiB0YWJsZSkKewogIGhl
eGVuYzxpZD4gdGhhc2g7CiAgY2VydF9oYXNoX2NvZGUodCwgdGhhc2gpOwogIGV4ZWN1dGUo
IklOU0VSVCBJTlRPICclcScgVkFMVUVTKCclcScsICclcScsICclcScsICclcScsICclcScs
ICclcScpIiwgCiAgICAgICAgICB0YWJsZS5jX3N0cigpLAogICAgICAgICAgdGhhc2goKS5j
X3N0cigpLAogICAgICAgICAgdC5pZGVudCgpLmNfc3RyKCksCiAgICAgICAgICB0Lm5hbWUo
KS5jX3N0cigpLCAKICAgICAgICAgIHQudmFsdWUoKS5jX3N0cigpLAogICAgICAgICAgdC5r
ZXkoKS5jX3N0cigpLAogICAgICAgICAgdC5zaWcoKS5jX3N0cigpKTsKfQoKdm9pZCAKZGF0
YWJhc2U6OnJlc3VsdHNfdG9fY2VydHMocmVzdWx0cyBjb25zdCAmIHJlcywKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgdmVjdG9yPGNlcnQ+ICYgY2VydHMpCnsKICBjZXJ0cy5jbGVh
cigpOwogIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzLnNpemUoKTsgKytpKQogICAgewog
ICAgICBjZXJ0IHQ7CiAgICAgIHQgPSBjZXJ0KGhleGVuYzxpZD4ocmVzW2ldWzBdKSwgCiAg
ICAgICAgICAgICAgY2VydF9uYW1lKHJlc1tpXVsxXSksCiAgICAgICAgICAgICAgYmFzZTY0
PGNlcnRfdmFsdWU+KHJlc1tpXVsyXSksCiAgICAgICAgICAgICAgcnNhX2tleXBhaXJfaWQo
cmVzW2ldWzNdKSwKICAgICAgICAgICAgICBiYXNlNjQ8cnNhX3NoYTFfc2lnbmF0dXJlPihy
ZXNbaV1bNF0pKTsKICAgICAgY2VydHMucHVzaF9iYWNrKHQpOwogICAgfQp9CgoKc3RydWN0
IHZhbGlkX2NlcnRzCnsKICBzZXQ8cnNhX2tleXBhaXJfaWQ+IHZhbGlkX3NpZ25lcnM7CiAg
aGV4ZW5jPGlkPiBpZGVudDsKICBjZXJ0X25hbWUgbmFtZTsKICBiYXNlNjQ8Y2VydF92YWx1
ZT4gdmFsOwogIHN0cmluZyBzaWduYXR1cmVfdHlwZTsKCiAgdmFsaWRfY2VydHMoc3RyaW5n
IGNvbnN0ICYgdHkpIAogICAgOiBzaWduYXR1cmVfdHlwZSh0eSkgCiAgewogICAgTChGKCJj
b25zdHJ1Y3RpbmcgdmFsaWRpdHkgY2hlY2tlciBmb3IgJXMgY2VydHNcbiIpICUgdHkpOwog
IH0KCiAgYm9vbCBjaGVja19zaWduZXJfdHJ1c3QoYXBwX3N0YXRlICYgYXBwKQogIHsKICAg
IGJvb2wgdHJ1c3RlZCA9IGZhbHNlOwoKICAgIEwoRigiY2hlY2tpbmcgJWQgc2lnbmVyICVz
IGNlcnQgdHJ1c3Qgc2V0XG4iKSAKICAgICAgJSB2YWxpZF9zaWduZXJzLnNpemUoKSAlIHNp
Z25hdHVyZV90eXBlKTsKICAgIHRyeQogICAgICB7CiAgICAgICAgY2VydF92YWx1ZSB2Owog
ICAgICAgIGRlY29kZV9iYXNlNjQodmFsLCB2KTsKICAgICAgICAvLyBGSVhNRTogbGFtZSBz
dHJpbmctbWFrZXMtdGhlLW1vZGUgYXJndW1lbnQKICAgICAgICBpZiAoc2lnbmF0dXJlX3R5
cGUgPT0gInJldmlzaW9uIikKICAgICAgICAgIHRydXN0ZWQgPSBhcHAubHVhLmhvb2tfZ2V0
X3JldmlzaW9uX2NlcnRfdHJ1c3QodmFsaWRfc2lnbmVycywKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwgbmFtZSwgdik7
CiAgICAgICAgZWxzZSBpZiAoc2lnbmF0dXJlX3R5cGUgPT0gIm1hbmlmZXN0IikKICAgICAg
ICAgIHRydXN0ZWQgPSBhcHAubHVhLmhvb2tfZ2V0X21hbmlmZXN0X2NlcnRfdHJ1c3QodmFs
aWRfc2lnbmVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgaWRlbnQsIG5hbWUsIHYpOwogICAgICAgIGVsc2UgaWYgKHNpZ25h
dHVyZV90eXBlID09ICJmaWxlIikKICAgICAgICAgIHRydXN0ZWQgPSBhcHAubHVhLmhvb2tf
Z2V0X2ZpbGVfY2VydF90cnVzdCh2YWxpZF9zaWduZXJzLAogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LCBuYW1lLCB2KTsKICAg
ICAgICBlbHNlCiAgICAgICAgICBJKGZhbHNlKTsgLy8gc2hvdWxkIGJlIGlsbGVnYWwKICAg
ICAgfQogICAgY2F0Y2ggKC4uLikKICAgICAgewogICAgICAgIFcoRigiZXhjZXB0aW9uIGlu
IHNxbGl0ZSB2YWxpZF9jZXJ0czo6Y2hlY2tfc2V0X3RydXN0XG4iKSk7CiAgICAgIH0KICAg
IAogICAgaWYgKHRydXN0ZWQpCiAgICAgIEwoRigidHJ1c3QgZnVuY3Rpb24gbGlrZWQgJWQg
JXMgc2lnbmVyc1xuIikgCiAgICAgICAgJSB2YWxpZF9zaWduZXJzLnNpemUoKSAlIHNpZ25h
dHVyZV90eXBlKTsKICAgIGVsc2UKICAgICAgTChGKCJ0cnVzdCBmdW5jdGlvbiBkaXNsaWtl
ZCAlZCAlcyBzaWduZXJzXG4iKSAKICAgICAgICAlIHZhbGlkX3NpZ25lcnMuc2l6ZSgpICUg
c2lnbmF0dXJlX3R5cGUpOwogICAgCiAgICByZXR1cm4gdHJ1c3RlZDsKICB9CgogIHZvaWQg
Y2hlY2tfc2luZ2xlX3NpZ25lcihhcHBfc3RhdGUgJiBhcHAsCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGludCBhcmdjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBj
b25zdCAqKiBhcmd2KQogIHsKICAgIHRyeQogICAgICB7CiAgICAgICAgLy8gYXJncyBhcmU6
IGhhc2gsIGlkLCBuYW1lLCB2YWx1ZSwga2V5cGFpciwgcHVia2V5LCBzaWduYXR1cmUKICAg
ICAgICAvLyBMKEYoImVudHJpZXMgYXJlIFslc10gWyVzXSBbJXNdIFslc10gWyVzXSBbJXNd
IFslc11cbiIpIAogICAgICAgIC8vICAgICAgICAlIGFyZ3ZbMF0gJSBhcmd2WzFdICUgYXJn
dlsyXSAlIGFyZ3ZbM10gJSBhcmd2WzRdICUgYXJndls1XSAlIGFyZ3ZbNl0pOwoKICAgICAg
ICBjZXJ0IHRtcCA9IGNlcnQoaGV4ZW5jPGlkPihhcmd2WzFdKSwgCiAgICAgICAgICAgICAg
ICAgICAgICAgIGNlcnRfbmFtZShhcmd2WzJdKSwKICAgICAgICAgICAgICAgICAgICAgICAg
YmFzZTY0PGNlcnRfdmFsdWU+KGFyZ3ZbM10pLAogICAgICAgICAgICAgICAgICAgICAgICBy
c2Ffa2V5cGFpcl9pZChhcmd2WzRdKSwKICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0
PHJzYV9zaGExX3NpZ25hdHVyZT4oYXJndls2XSkpOwoKICAgICAgICBiYXNlNjQ8cnNhX3B1
Yl9rZXk+IHBrKGFyZ3ZbNV0pOwoKICAgICAgICBpZiAoaWRlbnQoKS5lbXB0eSgpKQogICAg
ICAgICAgaWRlbnQgPSB0bXAuaWRlbnQ7CiAgICAgICAgZWxzZQogICAgICAgICAgSShpZGVu
dCA9PSB0bXAuaWRlbnQpOwoKICAgICAgICBpZiAobmFtZSgpLmVtcHR5KCkpCiAgICAgICAg
ICBuYW1lID0gdG1wLm5hbWU7CiAgICAgICAgZWxzZQogICAgICAgICAgSShuYW1lID09IHRt
cC5uYW1lKTsKCiAgICAgICAgaWYgKHZhbCgpLmVtcHR5KCkpCiAgICAgICAgICB2YWwgPSB0
bXAudmFsdWU7CiAgICAgICAgZWxzZQogICAgICAgICAgSSh2YWwgPT0gdG1wLnZhbHVlKTsK
CiAgICAgICAgLy8gICAgICBMKEYoImV4YW1pbmluZyAnJXMnICVzIGNlcnQgZnJvbSAlc1xu
IikgCiAgICAgICAgLy8gICAgICAgICUgbmFtZSAlIHNpZ25hdHVyZV90eXBlICUgaWRlbnQp
OwoKICAgICAgICBzdHJpbmcgdHh0OwogICAgICAgIGNlcnRfc2lnbmFibGVfdGV4dCh0bXAs
IHR4dCk7CiAgICAgICAgaWYgKGNoZWNrX3NpZ25hdHVyZShhcHAubHVhLCB0bXAua2V5LCBw
aywgdHh0LCB0bXAuc2lnKSkKICAgICAgICAgIHsKICAgICAgICAgICAgTChGKCJvayAnJXMn
ICVzIGNlcnQgZnJvbSAlc1xuIikgCiAgICAgICAgICAgICAgJSBuYW1lICUgc2lnbmF0dXJl
X3R5cGUgJSB0bXAua2V5KTsKICAgICAgICAgICAgdmFsaWRfc2lnbmVycy5pbnNlcnQodG1w
LmtleSk7CiAgICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgewogICAgICAgICAg
ICBXKEYoImJhZCAnJXMnICVzIGNlcnQgZnJvbSAlc1xuIikgCiAgICAgICAgICAgICAgJSBu
YW1lICUgc2lnbmF0dXJlX3R5cGUgJSB0bXAua2V5KTsKICAgICAgICAgIH0KICAgICAgfQog
ICAgY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uICYgZSkKICAgICAgewogICAgICAgIFcoRigic3Rk
OjpleGNlcHRpb24gaW4gc3FsaXRlIHZhbGlkX2NlcnRzOjpjaGVja19zaW5nbGVfc2lnbmVy
OiAlc1xuIikgJSBlLndoYXQoKSk7CiAgICAgIH0KICAgIGNhdGNoICguLi4pCiAgICAgIHsK
ICAgICAgICBXKEYoInVua25vd24gZXhjZXB0aW9uIGluIHNxbGl0ZSB2YWxpZF9jZXJ0czo6
Y2hlY2tfc2luZ2xlX3NpZ25lclxuIikpOwogICAgICB9CiAgfQp9OwoKZXh0ZXJuICJDIgp7
CgpzdGF0aWMgdm9pZAp0cnVzdGVkX3N0ZXBfY2FsbGJhY2soc3FsaXRlX2Z1bmMgKiBmbl9j
dHgsIAogICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MsIAogICAgICAgICAgICAgICAg
ICAgICAgY2hhciBjb25zdCAqKiBhcmd2KQp7CiAgYXBwX3N0YXRlICogYXBwID0gTlVMTDsg
CiAgdmFsaWRfY2VydHMgKiogdnBwOwoKICBJKGZuX2N0eCk7CiAgSShhcmdjID09IDgpOwog
IEkoYXJndik7CiAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCA4OyArK2kpCiAgICBJKGFyZ3Zb
aV0pOwoKICBhcHAgPSBzdGF0aWNfY2FzdDxhcHBfc3RhdGUgKj4oc3FsaXRlX3VzZXJfZGF0
YShmbl9jdHgpKTsKICBJKGFwcCk7CiAgdnBwID0gc3RhdGljX2Nhc3Q8dmFsaWRfY2VydHMg
Kio+KHNxbGl0ZV9hZ2dyZWdhdGVfY29udGV4dChmbl9jdHgsIHNpemVvZih2YWxpZF9jZXJ0
cyAqKSkpOwogIEkodnBwKTsKICBpZiAoISAoKnZwcCkpCiAgICAqdnBwID0gbmV3IHZhbGlk
X2NlcnRzKHN0cmluZyhhcmd2WzBdKSk7CiAgSSgqdnBwKTsKICAoKnZwcCktPmNoZWNrX3Np
bmdsZV9zaWduZXIoKmFwcCwgYXJnYy0xLCBhcmd2KzEpOyAgCn0KCnN0YXRpYyB2b2lkCnRy
dXN0ZWRfZmluYWxpemVfY2FsbGJhY2soc3FsaXRlX2Z1bmMgKiBmbl9jdHgpCnsKICBhcHBf
c3RhdGUgKiBhcHAgPSBOVUxMOyAKICB2YWxpZF9jZXJ0cyAqKiB2cHA7CiAgYXBwID0gc3Rh
dGljX2Nhc3Q8YXBwX3N0YXRlICo+KHNxbGl0ZV91c2VyX2RhdGEoZm5fY3R4KSk7CiAgSShh
cHApOwogIHZwcCA9IHN0YXRpY19jYXN0PHZhbGlkX2NlcnRzICoqPihzcWxpdGVfYWdncmVn
YXRlX2NvbnRleHQoZm5fY3R4LCBzaXplb2YodmFsaWRfY2VydHMgKikpKTsKCiAgSSh2cHAp
OwogIEkoKnZwcCk7CgogIGlmICgoKnZwcCktPmNoZWNrX3NpZ25lcl90cnVzdCgqYXBwKSkK
ICAgIHNxbGl0ZV9zZXRfcmVzdWx0X2ludChmbl9jdHgsIDEpOwogIGVsc2UKICAgIHNxbGl0
ZV9zZXRfcmVzdWx0X2ludChmbl9jdHgsIDApOwoKICBkZWxldGUgKCp2cHApOwp9Cn0KCgp2
b2lkCmRhdGFiYXNlOjppbnN0YWxsX2Z1bmN0aW9ucyhhcHBfc3RhdGUgKiBhcHApCnsKICAv
LyByZWdpc3RlciBhbnkgZnVuY3Rpb25zIHdlJ3JlIGdvaW5nIHRvIHVzZQogIEkoc3FsaXRl
X2NyZWF0ZV9mdW5jdGlvbihzcWwoKSwgInVuYmFzZTY0IiwgLTEsIAogICAgICAgICAgICAg
ICAgICAgICAgICAgICAmc3FsaXRlX3VuYmFzZTY0X2ZuLCAKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgTlVMTCkgPT0gMCk7CgogIEkoc3FsaXRlX2NyZWF0ZV9hZ2dyZWdhdGUoc3Fs
KCksICJ0cnVzdGVkIiwgOCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJ1c3Rl
ZF9zdGVwX2NhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRydXN0ZWRf
ZmluYWxpemVfY2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHApID09
IDApOwp9Cgp2b2lkCmRhdGFiYXNlOjppbnN0YWxsX3ZpZXdzKCkKewogIC8vIGRlbGV0ZSBh
bnkgZXhpc3Rpbmcgdmlld3MKICByZXN1bHRzIHJlczsKICBmZXRjaChyZXMsIG9uZV9jb2ws
IGFueV9yb3dzLAogICAgICAgICJTRUxFQ1QgbmFtZSBGUk9NIHNxbGl0ZV9tYXN0ZXIgV0hF
UkUgdHlwZT0ndmlldyciKTsKICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlcy5zaXplKCk7
ICsraSkKICAgIHsKICAgICAgZXhlY3V0ZSgiRFJPUCBWSUVXICclcSciLCByZXNbaV1bMF0u
Y19zdHIoKSk7CiAgICB9CiAgLy8gcmVnaXN0ZXIgYW55IHZpZXdzIHdlJ3JlIGdvaW5nIHRv
IHVzZQogIGV4ZWN1dGUodmlld3NfY29uc3RhbnQpOwp9Cgp2b2lkIApkYXRhYmFzZTo6Z2V0
X2hlYWRzKGJhc2U2NDxjZXJ0X3ZhbHVlPiBjb25zdCAmIGJyYW5jaCwKICAgICAgICAgICAg
ICAgICAgICBzdGQ6OnNldDxyZXZpc2lvbl9pZD4gJiBoZWFkcykKewogIHJlc3VsdHMgcmVz
OwogIGZldGNoKHJlcywgb25lX2NvbCwgYW55X3Jvd3MsCiAgICAgICAgIlNFTEVDVCBwYXJl
bnQgIgogICAgICAgICJGUk9NIGJyYW5jaF9oZWFkcyAiCiAgICAgICAgIldIRVJFIHZhbHVl
ID0gJyVxJyIsCiAgICAgICAgYnJhbmNoKCkuY19zdHIoKSk7CiAgaGVhZHMuY2xlYXIoKTsK
ICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlcy5zaXplKCk7ICsraSkKICAgIHsKICAgICAg
aGVhZHMuaW5zZXJ0KHJldmlzaW9uX2lkKHJlc1tpXVswXSkpOwogICAgfQp9Cgp2b2lkIApk
YXRhYmFzZTo6Z2V0X2NlcnRzKGhleGVuYzxpZD4gY29uc3QgJiBpZGVudCwgCiAgICAgICAg
ICAgICAgICAgICAgdmVjdG9yPGNlcnQ+ICYgY2VydHMsICAgICAgICAgICAgICAgICAgICAg
ICAKICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY29uc3QgJiB0YWJsZSkKewogIHJlc3Vs
dHMgcmVzOwogIGZldGNoKHJlcywgNSwgYW55X3Jvd3MsIAogICAgICAgICJTRUxFQ1QgaWQs
IG5hbWUsIHZhbHVlLCBrZXlwYWlyLCBzaWduYXR1cmUgRlJPTSAnJXEnICIKICAgICAgICAi
V0hFUkUgaWQgPSAnJXEnIiwgCiAgICAgICAgdGFibGUuY19zdHIoKSwgIAogICAgICAgIGlk
ZW50KCkuY19zdHIoKSk7CiAgcmVzdWx0c190b19jZXJ0cyhyZXMsIGNlcnRzKTsKfQoKCnZv
aWQgCmRhdGFiYXNlOjpnZXRfY2VydHMoY2VydF9uYW1lIGNvbnN0ICYgbmFtZSwgICAgICAg
ICAgIAogICAgICAgICAgICAgICAgICAgIHZlY3RvcjxjZXJ0PiAmIGNlcnRzLAogICAgICAg
ICAgICAgICAgICAgIHN0cmluZyBjb25zdCAmIHRhYmxlKQp7CiAgcmVzdWx0cyByZXM7CiAg
ZmV0Y2gocmVzLCA1LCBhbnlfcm93cywgCiAgICAgICAgIlNFTEVDVCBpZCwgbmFtZSwgdmFs
dWUsIGtleXBhaXIsIHNpZ25hdHVyZSAiCiAgICAgICAgIkZST00gJyVxJyBXSEVSRSBuYW1l
ID0gJyVxJyIsIAogICAgICAgIHRhYmxlLmNfc3RyKCksICAKICAgICAgICBuYW1lKCkuY19z
dHIoKSk7CiAgcmVzdWx0c190b19jZXJ0cyhyZXMsIGNlcnRzKTsKfQoKCnZvaWQgCmRhdGFi
YXNlOjpnZXRfY2VydHMoaGV4ZW5jPGlkPiBjb25zdCAmIGlkZW50LCAKICAgICAgICAgICAg
ICAgICAgICBjZXJ0X25hbWUgY29uc3QgJiBuYW1lLCAgICAgICAgICAgCiAgICAgICAgICAg
ICAgICAgICAgdmVjdG9yPGNlcnQ+ICYgY2VydHMsCiAgICAgICAgICAgICAgICAgICAgc3Ry
aW5nIGNvbnN0ICYgdGFibGUpCnsKICByZXN1bHRzIHJlczsKICBmZXRjaChyZXMsIDUsIGFu
eV9yb3dzLCAKICAgICAgICAiU0VMRUNUIGlkLCBuYW1lLCB2YWx1ZSwga2V5cGFpciwgc2ln
bmF0dXJlICIKICAgICAgICAiRlJPTSAnJXEnICIKICAgICAgICAiV0hFUkUgaWQgPSAnJXEn
IEFORCBuYW1lID0gJyVxJyIsIAogICAgICAgIHRhYmxlLmNfc3RyKCksICAKICAgICAgICBp
ZGVudCgpLmNfc3RyKCksCiAgICAgICAgbmFtZSgpLmNfc3RyKCkpOwogIHJlc3VsdHNfdG9f
Y2VydHMocmVzLCBjZXJ0cyk7Cn0KCnZvaWQgCmRhdGFiYXNlOjpnZXRfY2VydHMoY2VydF9u
YW1lIGNvbnN0ICYgbmFtZSwKICAgICAgICAgICAgICAgICAgICBiYXNlNjQ8Y2VydF92YWx1
ZT4gY29uc3QgJiB2YWwsIAogICAgICAgICAgICAgICAgICAgIHZlY3RvcjxjZXJ0PiAmIGNl
cnRzLAogICAgICAgICAgICAgICAgICAgIHN0cmluZyBjb25zdCAmIHRhYmxlKQp7CiAgcmVz
dWx0cyByZXM7CiAgZmV0Y2gocmVzLCA1LCBhbnlfcm93cywgCiAgICAgICAgIlNFTEVDVCBp
ZCwgbmFtZSwgdmFsdWUsIGtleXBhaXIsIHNpZ25hdHVyZSAiCiAgICAgICAgIkZST00gJyVx
JyAiCiAgICAgICAgIldIRVJFIG5hbWUgPSAnJXEnIEFORCB2YWx1ZSA9ICclcSciLCAKICAg
ICAgICB0YWJsZS5jX3N0cigpLCAgCiAgICAgICAgbmFtZSgpLmNfc3RyKCksCiAgICAgICAg
dmFsKCkuY19zdHIoKSk7CiAgcmVzdWx0c190b19jZXJ0cyhyZXMsIGNlcnRzKTsKfQoKCnZv
aWQgCmRhdGFiYXNlOjpnZXRfY2VydHMoaGV4ZW5jPGlkPiBjb25zdCAmIGlkZW50LCAKICAg
ICAgICAgICAgICAgICAgICBjZXJ0X25hbWUgY29uc3QgJiBuYW1lLCAgICAgICAgICAgCiAg
ICAgICAgICAgICAgICAgICAgYmFzZTY0PGNlcnRfdmFsdWU+IGNvbnN0ICYgdmFsdWUsCiAg
ICAgICAgICAgICAgICAgICAgdmVjdG9yPGNlcnQ+ICYgY2VydHMsCiAgICAgICAgICAgICAg
ICAgICAgc3RyaW5nIGNvbnN0ICYgdGFibGUpCnsKICByZXN1bHRzIHJlczsKICBmZXRjaChy
ZXMsIDUsIGFueV9yb3dzLCAKICAgICAgICAiU0VMRUNUIGlkLCBuYW1lLCB2YWx1ZSwga2V5
cGFpciwgc2lnbmF0dXJlICIKICAgICAgICAiRlJPTSAnJXEnICIKICAgICAgICAiV0hFUkUg
aWQgPSAnJXEnIEFORCBuYW1lID0gJyVxJyBBTkQgdmFsdWUgPSAnJXEnIiwgCiAgICAgICAg
dGFibGUuY19zdHIoKSwgIAogICAgICAgIGlkZW50KCkuY19zdHIoKSwKICAgICAgICBuYW1l
KCkuY19zdHIoKSwKICAgICAgICB2YWx1ZSgpLmNfc3RyKCkpOwogIHJlc3VsdHNfdG9fY2Vy
dHMocmVzLCBjZXJ0cyk7Cn0KCgoKYm9vbCAKZGF0YWJhc2U6OnJldmlzaW9uX2NlcnRfZXhp
c3RzKHJldmlzaW9uPGNlcnQ+IGNvbnN0ICYgY2VydCkKeyAKICByZXR1cm4gY2VydF9leGlz
dHMoY2VydC5pbm5lcigpLCAicmV2aXNpb25fY2VydHMiKTsgCn0KCmJvb2wgCmRhdGFiYXNl
OjptYW5pZmVzdF9jZXJ0X2V4aXN0cyhtYW5pZmVzdDxjZXJ0PiBjb25zdCAmIGNlcnQpCnsg
CiAgcmV0dXJuIGNlcnRfZXhpc3RzKGNlcnQuaW5uZXIoKSwgIm1hbmlmZXN0X2NlcnRzIik7
IAp9Cgpib29sIApkYXRhYmFzZTo6ZmlsZV9jZXJ0X2V4aXN0cyhmaWxlPGNlcnQ+IGNvbnN0
ICYgY2VydCkKeyAKICByZXR1cm4gY2VydF9leGlzdHMoY2VydC5pbm5lcigpLCAiZmlsZV9j
ZXJ0cyIpOyAKfQoKdm9pZCAKZGF0YWJhc2U6OnB1dF9tYW5pZmVzdF9jZXJ0KG1hbmlmZXN0
PGNlcnQ+IGNvbnN0ICYgY2VydCkKeyAKICBwdXRfY2VydChjZXJ0LmlubmVyKCksICJtYW5p
ZmVzdF9jZXJ0cyIpOyAKfQoKdm9pZCAKZGF0YWJhc2U6OnB1dF9yZXZpc2lvbl9jZXJ0KHJl
dmlzaW9uPGNlcnQ+IGNvbnN0ICYgY2VydCkKeyAKICBwdXRfY2VydChjZXJ0LmlubmVyKCks
ICJyZXZpc2lvbl9jZXJ0cyIpOyAKfQoKdm9pZCAKZGF0YWJhc2U6OnB1dF9maWxlX2NlcnQo
ZmlsZTxjZXJ0PiBjb25zdCAmIGNlcnQpCnsgCiAgcHV0X2NlcnQoY2VydC5pbm5lcigpLCAi
ZmlsZV9jZXJ0cyIpOyAKfQoKdm9pZCAKZGF0YWJhc2U6OmdldF9maWxlX2NlcnRzKGNlcnRf
bmFtZSBjb25zdCAmIG5hbWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPCBm
aWxlPGNlcnQ+ID4gJiB0cykKewogIHZlY3RvcjxjZXJ0PiBjZXJ0czsKICBnZXRfY2VydHMo
bmFtZSwgY2VydHMsICJmaWxlX2NlcnRzIik7CiAgdHMuY2xlYXIoKTsKICBjb3B5KGNlcnRz
LmJlZ2luKCksIGNlcnRzLmVuZCgpLCBiYWNrX2luc2VydGVyKHRzKSk7ICAKfQoKdm9pZCAK
ZGF0YWJhc2U6OmdldF9maWxlX2NlcnRzKGZpbGVfaWQgY29uc3QgJiBpZCwgCiAgICAgICAg
ICAgICAgICAgICAgICAgICBjZXJ0X25hbWUgY29uc3QgJiBuYW1lLCAKICAgICAgICAgICAg
ICAgICAgICAgICAgIHZlY3RvcjwgZmlsZTxjZXJ0PiA+ICYgdHMpCnsKICB2ZWN0b3I8Y2Vy
dD4gY2VydHM7CiAgZ2V0X2NlcnRzKGlkLmlubmVyKCksIG5hbWUsIGNlcnRzLCAiZmlsZV9j
ZXJ0cyIpOwogIHRzLmNsZWFyKCk7CiAgY29weShjZXJ0cy5iZWdpbigpLCBjZXJ0cy5lbmQo
KSwgYmFja19pbnNlcnRlcih0cykpOyAgICAKfQoKdm9pZCAKZGF0YWJhc2U6OmdldF9maWxl
X2NlcnRzKGNlcnRfbmFtZSBjb25zdCAmIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAg
ICBiYXNlNjQ8Y2VydF92YWx1ZT4gY29uc3QgJiB2YWwsIAogICAgICAgICAgICAgICAgICAg
ICAgICAgdmVjdG9yPCBmaWxlPGNlcnQ+ID4gJiB0cykKewogIHZlY3RvcjxjZXJ0PiBjZXJ0
czsKICBnZXRfY2VydHMobmFtZSwgdmFsLCBjZXJ0cywgImZpbGVfY2VydHMiKTsKICB0cy5j
bGVhcigpOwogIGNvcHkoY2VydHMuYmVnaW4oKSwgY2VydHMuZW5kKCksIGJhY2tfaW5zZXJ0
ZXIodHMpKTsgIAp9Cgp2b2lkIApkYXRhYmFzZTo6Z2V0X2ZpbGVfY2VydHMoZmlsZV9pZCBj
b25zdCAmIGlkLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfbmFtZSBjb25zdCAm
IG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlNjQ8Y2VydF92YWx1ZT4gY29u
c3QgJiB2YWwsIAogICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPCBmaWxlPGNlcnQ+
ID4gJiB0cykKewogIHZlY3RvcjxjZXJ0PiBjZXJ0czsKICBnZXRfY2VydHMoaWQuaW5uZXIo
KSwgbmFtZSwgdmFsLCBjZXJ0cywgImZpbGVfY2VydHMiKTsKICB0cy5jbGVhcigpOwogIGNv
cHkoY2VydHMuYmVnaW4oKSwgY2VydHMuZW5kKCksIGJhY2tfaW5zZXJ0ZXIodHMpKTsgIAp9
Cgp2b2lkIApkYXRhYmFzZTo6Z2V0X2ZpbGVfY2VydHMoZmlsZV9pZCBjb25zdCAmIGlkLCAK
ICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjwgZmlsZTxjZXJ0PiA+ICYgdHMpCnsg
CiAgdmVjdG9yPGNlcnQ+IGNlcnRzOwogIGdldF9jZXJ0cyhpZC5pbm5lcigpLCBjZXJ0cywg
ImZpbGVfY2VydHMiKTsgCiAgdHMuY2xlYXIoKTsKICBjb3B5KGNlcnRzLmJlZ2luKCksIGNl
cnRzLmVuZCgpLCBiYWNrX2luc2VydGVyKHRzKSk7Cn0KCgpib29sIApkYXRhYmFzZTo6Zmls
ZV9jZXJ0X2V4aXN0cyhoZXhlbmM8aWQ+IGNvbnN0ICYgaGFzaCkKewogIHJlc3VsdHMgcmVz
OwogIHZlY3RvcjxjZXJ0PiBjZXJ0czsKICBmZXRjaChyZXMsIG9uZV9jb2wsIGFueV9yb3dz
LCAKICAgICAgICAiU0VMRUNUIGlkICIKICAgICAgICAiRlJPTSBmaWxlX2NlcnRzICIKICAg
ICAgICAiV0hFUkUgaGFzaCA9ICclcSciLCAKICAgICAgICBoYXNoKCkuY19zdHIoKSk7CiAg
SShyZXMuc2l6ZSgpID09IDAgfHwgcmVzLnNpemUoKSA9PSAxKTsKICByZXR1cm4gKHJlcy5z
aXplKCkgPT0gMSk7Cn0KCnZvaWQgCmRhdGFiYXNlOjpnZXRfZmlsZV9jZXJ0KGhleGVuYzxp
ZD4gY29uc3QgJiBoYXNoLAogICAgICAgICAgICAgICAgICAgICAgICBmaWxlPGNlcnQ+ICYg
YykKewogIHJlc3VsdHMgcmVzOwogIHZlY3RvcjxjZXJ0PiBjZXJ0czsKICBmZXRjaChyZXMs
IDUsIG9uZV9yb3csIAogICAgICAgICJTRUxFQ1QgaWQsIG5hbWUsIHZhbHVlLCBrZXlwYWly
LCBzaWduYXR1cmUgIgogICAgICAgICJGUk9NIGZpbGVfY2VydHMgIgogICAgICAgICJXSEVS
RSBoYXNoID0gJyVxJyIsIAogICAgICAgIGhhc2goKS5jX3N0cigpKTsKICByZXN1bHRzX3Rv
X2NlcnRzKHJlcywgY2VydHMpOwogIEkoY2VydHMuc2l6ZSgpID09IDEpOwogIGMgPSBmaWxl
PGNlcnQ+KGNlcnRzWzBdKTsKfQoKCgp2b2lkIApkYXRhYmFzZTo6Z2V0X3JldmlzaW9uX2Nl
cnRzKGNlcnRfbmFtZSBjb25zdCAmIG5hbWUsIAogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgdmVjdG9yPCByZXZpc2lvbjxjZXJ0PiA+ICYgdHMpCnsKICB2ZWN0b3I8Y2VydD4gY2Vy
dHM7CiAgZ2V0X2NlcnRzKG5hbWUsIGNlcnRzLCAicmV2aXNpb25fY2VydHMiKTsKICB0cy5j
bGVhcigpOwogIGNvcHkoY2VydHMuYmVnaW4oKSwgY2VydHMuZW5kKCksIGJhY2tfaW5zZXJ0
ZXIodHMpKTsgIAp9Cgp2b2lkIApkYXRhYmFzZTo6Z2V0X3JldmlzaW9uX2NlcnRzKHJldmlz
aW9uX2lkIGNvbnN0ICYgaWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9u
YW1lIGNvbnN0ICYgbmFtZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8
IHJldmlzaW9uPGNlcnQ+ID4gJiB0cykKewogIHZlY3RvcjxjZXJ0PiBjZXJ0czsKICBnZXRf
Y2VydHMoaWQuaW5uZXIoKSwgbmFtZSwgY2VydHMsICJyZXZpc2lvbl9jZXJ0cyIpOwogIHRz
LmNsZWFyKCk7CiAgY29weShjZXJ0cy5iZWdpbigpLCBjZXJ0cy5lbmQoKSwgYmFja19pbnNl
cnRlcih0cykpOyAgCn0KCnZvaWQgCmRhdGFiYXNlOjpnZXRfcmV2aXNpb25fY2VydHMocmV2
aXNpb25faWQgY29uc3QgJiBpZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0
X25hbWUgY29uc3QgJiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0
PGNlcnRfdmFsdWU+IGNvbnN0ICYgdmFsLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHZlY3RvcjwgcmV2aXNpb248Y2VydD4gPiAmIHRzKQp7CiAgdmVjdG9yPGNlcnQ+IGNlcnRz
OwogIGdldF9jZXJ0cyhpZC5pbm5lcigpLCBuYW1lLCB2YWwsIGNlcnRzLCAicmV2aXNpb25f
Y2VydHMiKTsKICB0cy5jbGVhcigpOwogIGNvcHkoY2VydHMuYmVnaW4oKSwgY2VydHMuZW5k
KCksIGJhY2tfaW5zZXJ0ZXIodHMpKTsgIAp9Cgp2b2lkIApkYXRhYmFzZTo6Z2V0X3Jldmlz
aW9uX2NlcnRzKGNlcnRfbmFtZSBjb25zdCAmIG5hbWUsCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBiYXNlNjQ8Y2VydF92YWx1ZT4gY29uc3QgJiB2YWwsIAogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgdmVjdG9yPCByZXZpc2lvbjxjZXJ0PiA+ICYgdHMpCnsKICB2ZWN0
b3I8Y2VydD4gY2VydHM7CiAgZ2V0X2NlcnRzKG5hbWUsIHZhbCwgY2VydHMsICJyZXZpc2lv
bl9jZXJ0cyIpOwogIHRzLmNsZWFyKCk7CiAgY29weShjZXJ0cy5iZWdpbigpLCBjZXJ0cy5l
bmQoKSwgYmFja19pbnNlcnRlcih0cykpOyAgCn0KCnZvaWQgCmRhdGFiYXNlOjpnZXRfcmV2
aXNpb25fY2VydHMocmV2aXNpb25faWQgY29uc3QgJiBpZCwgCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB2ZWN0b3I8IHJldmlzaW9uPGNlcnQ+ID4gJiB0cykKeyAKICB2ZWN0b3I8
Y2VydD4gY2VydHM7CiAgZ2V0X2NlcnRzKGlkLmlubmVyKCksIGNlcnRzLCAicmV2aXNpb25f
Y2VydHMiKTsgCiAgdHMuY2xlYXIoKTsKICBjb3B5KGNlcnRzLmJlZ2luKCksIGNlcnRzLmVu
ZCgpLCBiYWNrX2luc2VydGVyKHRzKSk7Cn0KCnZvaWQgCmRhdGFiYXNlOjpnZXRfcmV2aXNp
b25fY2VydChoZXhlbmM8aWQ+IGNvbnN0ICYgaGFzaCwKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgcmV2aXNpb248Y2VydD4gJiBjKQp7CiAgcmVzdWx0cyByZXM7CiAgdmVjdG9yPGNl
cnQ+IGNlcnRzOwogIGZldGNoKHJlcywgNSwgb25lX3JvdywgCiAgICAgICAgIlNFTEVDVCBp
ZCwgbmFtZSwgdmFsdWUsIGtleXBhaXIsIHNpZ25hdHVyZSAiCiAgICAgICAgIkZST00gcmV2
aXNpb25fY2VydHMgIgogICAgICAgICJXSEVSRSBoYXNoID0gJyVxJyIsIAogICAgICAgIGhh
c2goKS5jX3N0cigpKTsKICByZXN1bHRzX3RvX2NlcnRzKHJlcywgY2VydHMpOwogIEkoY2Vy
dHMuc2l6ZSgpID09IDEpOwogIGMgPSByZXZpc2lvbjxjZXJ0PihjZXJ0c1swXSk7Cn0KCmJv
b2wgCmRhdGFiYXNlOjpyZXZpc2lvbl9jZXJ0X2V4aXN0cyhoZXhlbmM8aWQ+IGNvbnN0ICYg
aGFzaCkKewogIHJlc3VsdHMgcmVzOwogIHZlY3RvcjxjZXJ0PiBjZXJ0czsKICBmZXRjaChy
ZXMsIG9uZV9jb2wsIGFueV9yb3dzLCAKICAgICAgICAiU0VMRUNUIGlkICIKICAgICAgICAi
RlJPTSByZXZpc2lvbl9jZXJ0cyAiCiAgICAgICAgIldIRVJFIGhhc2ggPSAnJXEnIiwgCiAg
ICAgICAgaGFzaCgpLmNfc3RyKCkpOwogIEkocmVzLnNpemUoKSA9PSAwIHx8IHJlcy5zaXpl
KCkgPT0gMSk7CiAgcmV0dXJuIChyZXMuc2l6ZSgpID09IDEpOwp9Cgpib29sIApkYXRhYmFz
ZTo6bWFuaWZlc3RfY2VydF9leGlzdHMoaGV4ZW5jPGlkPiBjb25zdCAmIGhhc2gpCnsKICBy
ZXN1bHRzIHJlczsKICB2ZWN0b3I8Y2VydD4gY2VydHM7CiAgZmV0Y2gocmVzLCBvbmVfY29s
LCBhbnlfcm93cywgCiAgICAgICAgIlNFTEVDVCBpZCAiCiAgICAgICAgIkZST00gbWFuaWZl
c3RfY2VydHMgIgogICAgICAgICJXSEVSRSBoYXNoID0gJyVxJyIsIAogICAgICAgIGhhc2go
KS5jX3N0cigpKTsKICBJKHJlcy5zaXplKCkgPT0gMCB8fCByZXMuc2l6ZSgpID09IDEpOwog
IHJldHVybiAocmVzLnNpemUoKSA9PSAxKTsKfQoKdm9pZCAKZGF0YWJhc2U6OmdldF9tYW5p
ZmVzdF9jZXJ0KGhleGVuYzxpZD4gY29uc3QgJiBoYXNoLAogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgbWFuaWZlc3Q8Y2VydD4gJiBjKQp7CiAgcmVzdWx0cyByZXM7CiAgdmVjdG9y
PGNlcnQ+IGNlcnRzOwogIGZldGNoKHJlcywgNSwgb25lX3JvdywgCiAgICAgICAgIlNFTEVD
VCBpZCwgbmFtZSwgdmFsdWUsIGtleXBhaXIsIHNpZ25hdHVyZSAiCiAgICAgICAgIkZST00g
bWFuaWZlc3RfY2VydHMgIgogICAgICAgICJXSEVSRSBoYXNoID0gJyVxJyIsIAogICAgICAg
IGhhc2goKS5jX3N0cigpKTsKICByZXN1bHRzX3RvX2NlcnRzKHJlcywgY2VydHMpOwogIEko
Y2VydHMuc2l6ZSgpID09IDEpOwogIGMgPSBtYW5pZmVzdDxjZXJ0PihjZXJ0c1swXSk7Cn0K
CnZvaWQgCmRhdGFiYXNlOjpnZXRfbWFuaWZlc3RfY2VydHMobWFuaWZlc3RfaWQgY29uc3Qg
JiBpZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPCBtYW5pZmVzdDxj
ZXJ0PiA+ICYgdHMpCnsgCiAgdmVjdG9yPGNlcnQ+IGNlcnRzOwogIGdldF9jZXJ0cyhpZC5p
bm5lcigpLCBjZXJ0cywgIm1hbmlmZXN0X2NlcnRzIik7IAogIHRzLmNsZWFyKCk7CiAgY29w
eShjZXJ0cy5iZWdpbigpLCBjZXJ0cy5lbmQoKSwgYmFja19pbnNlcnRlcih0cykpOwp9CgoK
dm9pZCAKZGF0YWJhc2U6OmdldF9tYW5pZmVzdF9jZXJ0cyhjZXJ0X25hbWUgY29uc3QgJiBu
YW1lLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjwgbWFuaWZlc3Q8Y2Vy
dD4gPiAmIHRzKQp7CiAgdmVjdG9yPGNlcnQ+IGNlcnRzOwogIGdldF9jZXJ0cyhuYW1lLCBj
ZXJ0cywgIm1hbmlmZXN0X2NlcnRzIik7CiAgdHMuY2xlYXIoKTsKICBjb3B5KGNlcnRzLmJl
Z2luKCksIGNlcnRzLmVuZCgpLCBiYWNrX2luc2VydGVyKHRzKSk7ICAKfQoKdm9pZCAKZGF0
YWJhc2U6OmdldF9tYW5pZmVzdF9jZXJ0cyhtYW5pZmVzdF9pZCBjb25zdCAmIGlkLCAKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X25hbWUgY29uc3QgJiBuYW1lLCAKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8IG1hbmlmZXN0PGNlcnQ+ID4gJiB0
cykKewogIHZlY3RvcjxjZXJ0PiBjZXJ0czsKICBnZXRfY2VydHMoaWQuaW5uZXIoKSwgbmFt
ZSwgY2VydHMsICJtYW5pZmVzdF9jZXJ0cyIpOwogIHRzLmNsZWFyKCk7CiAgY29weShjZXJ0
cy5iZWdpbigpLCBjZXJ0cy5lbmQoKSwgYmFja19pbnNlcnRlcih0cykpOyAgCn0KCgovLyBj
b21wbGV0aW9ucwp2b2lkIApkYXRhYmFzZTo6Y29tcGxldGUoc3RyaW5nIGNvbnN0ICYgcGFy
dGlhbCwKICAgICAgICAgICAgICAgICAgIHNldDxyZXZpc2lvbl9pZD4gJiBjb21wbGV0aW9u
cykKewogIHJlc3VsdHMgcmVzOwogIGNvbXBsZXRpb25zLmNsZWFyKCk7CgogIGZldGNoKHJl
cywgMSwgYW55X3Jvd3MsCiAgICAgICAgIlNFTEVDVCBpZCBGUk9NIHJldmlzaW9ucyBXSEVS
RSBpZCBHTE9CICclcSonIiwKICAgICAgICBwYXJ0aWFsLmNfc3RyKCkpOwoKICBmb3IgKHNp
emVfdCBpID0gMDsgaSA8IHJlcy5zaXplKCk7ICsraSkKICAgIGNvbXBsZXRpb25zLmluc2Vy
dChyZXZpc2lvbl9pZChyZXNbaV1bMF0pKTsgIAp9CgoKdm9pZCAKZGF0YWJhc2U6OmNvbXBs
ZXRlKHN0cmluZyBjb25zdCAmIHBhcnRpYWwsCiAgICAgICAgICAgICAgICAgICBzZXQ8bWFu
aWZlc3RfaWQ+ICYgY29tcGxldGlvbnMpCnsKICByZXN1bHRzIHJlczsKICBjb21wbGV0aW9u
cy5jbGVhcigpOwoKICBmZXRjaChyZXMsIDEsIGFueV9yb3dzLAogICAgICAgICJTRUxFQ1Qg
aWQgRlJPTSBtYW5pZmVzdHMgV0hFUkUgaWQgR0xPQiAnJXEqJyIsCiAgICAgICAgcGFydGlh
bC5jX3N0cigpKTsKCiAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXMuc2l6ZSgpOyArK2kp
CiAgICBjb21wbGV0aW9ucy5pbnNlcnQobWFuaWZlc3RfaWQocmVzW2ldWzBdKSk7ICAKICAK
ICByZXMuY2xlYXIoKTsKCiAgZmV0Y2gocmVzLCAxLCBhbnlfcm93cywKICAgICAgICAiU0VM
RUNUIGlkIEZST00gbWFuaWZlc3RfZGVsdGFzIFdIRVJFIGlkIEdMT0IgJyVxKiciLAogICAg
ICAgIHBhcnRpYWwuY19zdHIoKSk7CgogIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzLnNp
emUoKTsgKytpKQogICAgY29tcGxldGlvbnMuaW5zZXJ0KG1hbmlmZXN0X2lkKHJlc1tpXVsw
XSkpOyAgCn0KCnZvaWQgCmRhdGFiYXNlOjpjb21wbGV0ZShzdHJpbmcgY29uc3QgJiBwYXJ0
aWFsLAogICAgICAgICAgICAgICAgICAgc2V0PGZpbGVfaWQ+ICYgY29tcGxldGlvbnMpCnsK
ICByZXN1bHRzIHJlczsKICBjb21wbGV0aW9ucy5jbGVhcigpOwoKICBmZXRjaChyZXMsIDEs
IGFueV9yb3dzLAogICAgICAgICJTRUxFQ1QgaWQgRlJPTSBmaWxlcyBXSEVSRSBpZCBHTE9C
ICclcSonIiwKICAgICAgICBwYXJ0aWFsLmNfc3RyKCkpOwoKICBmb3IgKHNpemVfdCBpID0g
MDsgaSA8IHJlcy5zaXplKCk7ICsraSkKICAgIGNvbXBsZXRpb25zLmluc2VydChmaWxlX2lk
KHJlc1tpXVswXSkpOyAgCiAgCiAgcmVzLmNsZWFyKCk7CgogIGZldGNoKHJlcywgMSwgYW55
X3Jvd3MsCiAgICAgICAgIlNFTEVDVCBpZCBGUk9NIGZpbGVfZGVsdGFzIFdIRVJFIGlkIEdM
T0IgJyVxKiciLAogICAgICAgIHBhcnRpYWwuY19zdHIoKSk7CgogIGZvciAoc2l6ZV90IGkg
PSAwOyBpIDwgcmVzLnNpemUoKTsgKytpKQogICAgY29tcGxldGlvbnMuaW5zZXJ0KGZpbGVf
aWQocmVzW2ldWzBdKSk7ICAKfQoKdXNpbmcgY29tbWFuZHM6OnNlbGVjdG9yX3R5cGU7Cgpz
dGF0aWMgdm9pZCBzZWxlY3Rvcl90b19jZXJ0bmFtZShzZWxlY3Rvcl90eXBlIHR5LAogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgJiBzKQp7CiAgc3dpdGNoICh0
eSkKICAgIHsKICAgIGNhc2UgY29tbWFuZHM6OnNlbF9hdXRob3I6CiAgICAgIHMgPSBhdXRo
b3JfY2VydF9uYW1lOwogICAgICBicmVhazsKICAgIGNhc2UgY29tbWFuZHM6OnNlbF9icmFu
Y2g6CiAgICAgIHMgPSBicmFuY2hfY2VydF9uYW1lOwogICAgICBicmVhazsKICAgIGNhc2Ug
Y29tbWFuZHM6OnNlbF9kYXRlOgogICAgICBzID0gZGF0ZV9jZXJ0X25hbWU7CiAgICAgIGJy
ZWFrOwogICAgY2FzZSBjb21tYW5kczo6c2VsX3RhZzoKICAgICAgcyA9IHRhZ19jZXJ0X25h
bWU7CiAgICAgIGJyZWFrOwogICAgY2FzZSBjb21tYW5kczo6c2VsX2lkZW50OgogICAgY2Fz
ZSBjb21tYW5kczo6c2VsX3Vua25vd246CiAgICAgIEkoZmFsc2UpOyAvLyBkb24ndCBkbyB0
aGlzLgogICAgICBicmVhazsKICAgIH0KfQoKdm9pZCBkYXRhYmFzZTo6Y29tcGxldGUoc2Vs
ZWN0b3JfdHlwZSB0eSwKICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNvbnN0ICYg
cGFydGlhbCwKICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHBhaXI8c2VsZWN0b3Jf
dHlwZSwgc3RyaW5nPiA+IGNvbnN0ICYgbGltaXQsCiAgICAgICAgICAgICAgICAgICAgICAg
IHNldDxzdHJpbmc+ICYgY29tcGxldGlvbnMpCnsKICBjb21wbGV0aW9ucy5jbGVhcigpOwoK
ICAvLyBzdGVwIDE6IHRoZSBsaW1pdCBpcyB0cmFuc2Zvcm1lZCBpbnRvIGFuIFNRTCBzZWxl
Y3Qgc3RhdGVtZW50IHdoaWNoCiAgLy8gc2VsZWN0cyBhIHNldCBvZiBJRHMgZnJvbSB0aGUg
bWFuaWZlc3RfY2VydHMgdGFibGUgd2hpY2ggbWF0Y2ggdGhlCiAgLy8gbGltaXQuICB0aGlz
IGlzIGRvbmUgYnkgYnVpbGRpbmcgYW4gU1FMIHNlbGVjdCBzdGF0ZW1lbnQgZm9yIGVhY2gg
dGVybQogIC8vIGluIHRoZSBsaW1pdCBhbmQgdGhlbiBJTlRFUlNFQ1RpbmcgdGhlbSBhbGwu
CgogIHN0cmluZyBsaW0gPSAiKCI7CiAgYm9vbCBmaXJzdF9saW1pdCA9IHRydWU7CiAgZm9y
ICh2ZWN0b3I8cGFpcjxzZWxlY3Rvcl90eXBlLCBzdHJpbmc+ID46OmNvbnN0X2l0ZXJhdG9y
IGkgPSBsaW1pdC5iZWdpbigpOwogICAgICAgaSAhPSBsaW1pdC5lbmQoKTsgKytpKQogICAg
ewogICAgICBpZiAoZmlyc3RfbGltaXQpCiAgICAgICAgZmlyc3RfbGltaXQgPSBmYWxzZTsK
ICAgICAgZWxzZQogICAgICAgIGxpbSArPSAiIElOVEVSU0VDVCAiOwogICAgICAKICAgICAg
aWYgKGktPmZpcnN0ID09IGNvbW1hbmRzOjpzZWxfaWRlbnQpCiAgICAgICAgewogICAgICAg
ICAgbGltICs9ICJTRUxFQ1QgaWQgRlJPTSByZXZpc2lvbl9jZXJ0cyAiOwogICAgICAgICAg
bGltICs9IChGKCJXSEVSRSBpZCBHTE9CICclcyonIikgCiAgICAgICAgICAgICAgICAgICUg
aS0+c2Vjb25kKS5zdHIoKTsKICAgICAgICB9CiAgICAgIGVsc2UgaWYgKGktPmZpcnN0ID09
IGNvbW1hbmRzOjpzZWxfdW5rbm93bikKICAgICAgICB7CiAgICAgICAgICBsaW0gKz0gIlNF
TEVDVCBpZCBGUk9NIHJldmlzaW9uX2NlcnRzICI7CiAgICAgICAgICBsaW0gKz0gKEYoIiBX
SEVSRSAobmFtZT0nJXMnIE9SIG5hbWU9JyVzJyBPUiBuYW1lPSclcycpIikKICAgICAgICAg
ICAgICAgICAgJSBhdXRob3JfY2VydF9uYW1lIAogICAgICAgICAgICAgICAgICAlIHRhZ19j
ZXJ0X25hbWUgCiAgICAgICAgICAgICAgICAgICUgYnJhbmNoX2NlcnRfbmFtZSkuc3RyKCk7
CiAgICAgICAgICBsaW0gKz0gKEYoIiBBTkQgdW5iYXNlNjQodmFsdWUpIGdsb2IgJyolcyon
IikKICAgICAgICAgICAgICAgICAgJSBpLT5zZWNvbmQpLnN0cigpOyAgICAgCiAgICAgICAg
fQogICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgc3RyaW5nIGNlcnRuYW1lOwogICAg
ICAgICAgc2VsZWN0b3JfdG9fY2VydG5hbWUoaS0+Zmlyc3QsIGNlcnRuYW1lKTsKICAgICAg
ICAgIGxpbSArPSAiU0VMRUNUIGlkIEZST00gcmV2aXNpb25fY2VydHMgIjsKICAgICAgICAg
IGxpbSArPSAoRigiV0hFUkUgbmFtZT0nJXMnIEFORCB1bmJhc2U2NCh2YWx1ZSkgZ2xvYiAn
KiVzKiciKQogICAgICAgICAgICAgICAgICAlIGNlcnRuYW1lICUgaS0+c2Vjb25kKS5zdHIo
KTsKICAgICAgICB9CiAgICB9CiAgbGltICs9ICIpIjsKICAKICAvLyBzdGVwIDI6IGRlcGVu
ZGluZyBvbiB3aGF0IHdlJ3ZlIGJlZW4gYXNrZWQgdG8gZGlzYW1iaWd1YXRlLCB3ZQogIC8v
IHdpbGwgY29tcGxldGUgZWl0aGVyIHNvbWUgaWRlbnRzLCBvciBjZXJ0IHZhbHVlcywgb3Ig
InVua25vd24iCiAgLy8gd2hpY2ggZ2VuZXJhbGx5IG1lYW5zICJhdXRob3IsIHRhZyBvciBi
cmFuY2giCgogIHN0cmluZyBxdWVyeTsKICBpZiAodHkgPT0gY29tbWFuZHM6OnNlbF9pZGVu
dCkKICAgIHsKICAgICAgcXVlcnkgPSAoRigiU0VMRUNUIGlkIEZST00gJXMiKSAlIGxpbSku
c3RyKCk7CiAgICB9CiAgZWxzZSAKICAgIHsKICAgICAgcXVlcnkgPSAiU0VMRUNUIHZhbHVl
IEZST00gcmV2aXNpb25fY2VydHMgV0hFUkUiOwogICAgICBpZiAodHkgPT0gY29tbWFuZHM6
OnNlbF91bmtub3duKQogICAgICAgIHsgICAgICAgICAgICAgICAKICAgICAgICAgIHF1ZXJ5
ICs9IAogICAgICAgICAgICAoRigiIChuYW1lPSclcycgT1IgbmFtZT0nJXMnIE9SIG5hbWU9
JyVzJykiKQogICAgICAgICAgICAgJSBhdXRob3JfY2VydF9uYW1lIAogICAgICAgICAgICAg
JSB0YWdfY2VydF9uYW1lIAogICAgICAgICAgICAgJSBicmFuY2hfY2VydF9uYW1lKS5zdHIo
KTsKICAgICAgICB9CiAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICBzdHJpbmcgY2Vy
dG5hbWU7CiAgICAgICAgICBzZWxlY3Rvcl90b19jZXJ0bmFtZSh0eSwgY2VydG5hbWUpOwog
ICAgICAgICAgcXVlcnkgKz0gCiAgICAgICAgICAgIChGKCIgKG5hbWU9JyVzJykiKSAlIGNl
cnRuYW1lKS5zdHIoKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgIHF1ZXJ5ICs9IChGKCIg
QU5EICh1bmJhc2U2NCh2YWx1ZSkgR0xPQiAnKiVzKicpIikgJSBwYXJ0aWFsKS5zdHIoKTsK
ICAgICAgcXVlcnkgKz0gKEYoIiBBTkQgKGlkIElOICVzKSIpICUgbGltKS5zdHIoKTsKICAg
IH0KCiAgcmVzdWx0cyByZXM7CiAgZmV0Y2gocmVzLCBvbmVfY29sLCBhbnlfcm93cywgcXVl
cnkuY19zdHIoKSk7CiAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXMuc2l6ZSgpOyArK2kp
CiAgICB7CiAgICAgIGlmICh0eSA9PSBjb21tYW5kczo6c2VsX2lkZW50KQogICAgICAgIGNv
bXBsZXRpb25zLmluc2VydChyZXNbaV1bMF0pOwogICAgICBlbHNlCiAgICAgICAgewogICAg
ICAgICAgYmFzZTY0PGRhdGE+IHJvd19lbmNvZGVkKHJlc1tpXVswXSk7CiAgICAgICAgICBk
YXRhIHJvd19kZWNvZGVkOwogICAgICAgICAgZGVjb2RlX2Jhc2U2NChyb3dfZW5jb2RlZCwg
cm93X2RlY29kZWQpOwogICAgICAgICAgY29tcGxldGlvbnMuaW5zZXJ0KHJvd19kZWNvZGVk
KCkpOwogICAgICAgIH0KICAgIH0KfQoKCi8vIG1lcmtsZSBub2RlcwoKYm9vbCAKZGF0YWJh
c2U6Om1lcmtsZV9ub2RlX2V4aXN0cyhzdHJpbmcgY29uc3QgJiB0eXBlLAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHV0ZjggY29uc3QgJiBjb2xsZWN0aW9uLCAKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGV2ZWwsCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaGV4ZW5jPHByZWZpeD4gY29uc3QgJiBwcmVmaXgpCnsKICByZXN1bHRzIHJl
czsKICBmZXRjaChyZXMsIG9uZV9jb2wsIG9uZV9yb3csIAogICAgICAgICJTRUxFQ1QgQ09V
TlQoKikgIgogICAgICAgICJGUk9NIG1lcmtsZV9ub2RlcyAiCiAgICAgICAgIldIRVJFIHR5
cGUgPSAnJXEnICIKICAgICAgICAiQU5EIGNvbGxlY3Rpb24gPSAnJXEnICIKICAgICAgICAi
QU5EIGxldmVsID0gJWQgIgogICAgICAgICJBTkQgcHJlZml4ID0gJyVxJyAiLAogICAgICAg
IHR5cGUuY19zdHIoKSwgY29sbGVjdGlvbigpLmNfc3RyKCksIGxldmVsLCBwcmVmaXgoKS5j
X3N0cigpKTsKICBzaXplX3Qgbl9ub2RlcyA9IGxleGljYWxfY2FzdDxzaXplX3Q+KHJlc1sw
XVswXSk7CiAgSShuX25vZGVzID09IDAgfHwgbl9ub2RlcyA9PSAxKTsKICByZXR1cm4gbl9u
b2RlcyA9PSAxOwp9Cgp2b2lkIApkYXRhYmFzZTo6Z2V0X21lcmtsZV9ub2RlKHN0cmluZyBj
b25zdCAmIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdXRmOCBjb25zdCAmIGNv
bGxlY3Rpb24sIAogICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZXZlbCwKICAg
ICAgICAgICAgICAgICAgICAgICAgICBoZXhlbmM8cHJlZml4PiBjb25zdCAmIHByZWZpeCwK
ICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlNjQ8bWVya2xlPiAmIG5vZGUpCnsKICBy
ZXN1bHRzIHJlczsKICBmZXRjaChyZXMsIG9uZV9jb2wsIG9uZV9yb3csIAogICAgICAgICJT
RUxFQ1QgYm9keSAiCiAgICAgICAgIkZST00gbWVya2xlX25vZGVzICIKICAgICAgICAiV0hF
UkUgdHlwZSA9ICclcScgIgogICAgICAgICJBTkQgY29sbGVjdGlvbiA9ICclcScgIgogICAg
ICAgICJBTkQgbGV2ZWwgPSAlZCAiCiAgICAgICAgIkFORCBwcmVmaXggPSAnJXEnIiwKICAg
ICAgICB0eXBlLmNfc3RyKCksIGNvbGxlY3Rpb24oKS5jX3N0cigpLCBsZXZlbCwgcHJlZml4
KCkuY19zdHIoKSk7CiAgbm9kZSA9IHJlc1swXVswXTsKfQoKdm9pZCAKZGF0YWJhc2U6OnB1
dF9tZXJrbGVfbm9kZShzdHJpbmcgY29uc3QgJiB0eXBlLAogICAgICAgICAgICAgICAgICAg
ICAgICAgIHV0ZjggY29uc3QgJiBjb2xsZWN0aW9uLCAKICAgICAgICAgICAgICAgICAgICAg
ICAgICBzaXplX3QgbGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaGV4ZW5jPHBy
ZWZpeD4gY29uc3QgJiBwcmVmaXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0PG1lcmtsZT4gY29uc3Qg
JiBub2RlKQp7CiAgZXhlY3V0ZSgiSU5TRVJUIE9SIFJFUExBQ0UgIgogICAgICAgICAgIklO
VE8gbWVya2xlX25vZGVzICIKICAgICAgICAgICJWQUxVRVMgKCclcScsICclcScsICVkLCAn
JXEnLCAnJXEnKSIsCiAgICAgICAgICB0eXBlLmNfc3RyKCksIGNvbGxlY3Rpb24oKS5jX3N0
cigpLCBsZXZlbCwgcHJlZml4KCkuY19zdHIoKSwgbm9kZSgpLmNfc3RyKCkpOwp9Cgp2b2lk
IApkYXRhYmFzZTo6ZXJhc2VfbWVya2xlX25vZGVzKHN0cmluZyBjb25zdCAmIHR5cGUsCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRmOCBjb25zdCAmIGNvbGxlY3Rpb24pCnsK
ICBleGVjdXRlKCJERUxFVEUgRlJPTSBtZXJrbGVfbm9kZXMgIgogICAgICAgICAgIldIRVJF
IHR5cGUgPSAnJXEnICIKICAgICAgICAgICJBTkQgY29sbGVjdGlvbiA9ICclcSciLAogICAg
ICAgICAgdHlwZS5jX3N0cigpLCBjb2xsZWN0aW9uKCkuY19zdHIoKSk7Cn0KCi8vIHRyYW5z
YWN0aW9uIGd1YXJkcwoKdHJhbnNhY3Rpb25fZ3VhcmQ6OnRyYW5zYWN0aW9uX2d1YXJkKGRh
dGFiYXNlICYgZCkgOiBjb21taXR0ZWQoZmFsc2UpLCBkYihkKSAKewogIGRiLmJlZ2luX3Ry
YW5zYWN0aW9uKCk7Cn0KdHJhbnNhY3Rpb25fZ3VhcmQ6On50cmFuc2FjdGlvbl9ndWFyZCgp
CnsKICBpZiAoY29tbWl0dGVkKQogICAgZGIuY29tbWl0X3RyYW5zYWN0aW9uKCk7CiAgZWxz
ZQogICAgZGIucm9sbGJhY2tfdHJhbnNhY3Rpb24oKTsKfQoKdm9pZCAKdHJhbnNhY3Rpb25f
Z3VhcmQ6OmNvbW1pdCgpCnsKICBjb21taXR0ZWQgPSB0cnVlOwp9Cgo=
_ATEOF


cat >right.b64 <<'_ATEOF'
Ly8gY29weXJpZ2h0IChDKSAyMDAyLCAyMDAzIGdyYXlkb24gaG9hcmUgPGdyYXlkb25AcG9i
b3guY29tPgovLyBhbGwgcmlnaHRzIHJlc2VydmVkLgovLyBsaWNlbnNlZCB0byB0aGUgcHVi
bGljIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCAoPj0gMikKLy8gc2VlIHRoZSBm
aWxlIENPUFlJTkcgZm9yIGRldGFpbHMKCiNpbmNsdWRlIDxpdGVyYXRvcj4KI2luY2x1ZGUg
PGxpc3Q+CiNpbmNsdWRlIDxzZXQ+CiNpbmNsdWRlIDxzc3RyZWFtPgojaW5jbHVkZSA8dmVj
dG9yPgoKI2luY2x1ZGUgPHN0ZGFyZy5oPgoKI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIu
aHBwPgojaW5jbHVkZSA8Ym9vc3QvbGV4aWNhbF9jYXN0LmhwcD4KI2luY2x1ZGUgPGJvb3N0
L2ZpbGVzeXN0ZW0vcGF0aC5ocHA+CiNpbmNsdWRlIDxib29zdC9maWxlc3lzdGVtL29wZXJh
dGlvbnMuaHBwPgoKI2luY2x1ZGUgPHNxbGl0ZS5oPgoKI2luY2x1ZGUgImFwcF9zdGF0ZS5o
aCIKI2luY2x1ZGUgImNlcnQuaGgiCiNpbmNsdWRlICJjbGVhbnVwLmhoIgojaW5jbHVkZSAi
Y29uc3RhbnRzLmhoIgojaW5jbHVkZSAiZGF0YWJhc2UuaGgiCiNpbmNsdWRlICJrZXlzLmho
IgojaW5jbHVkZSAic2FuaXR5LmhoIgojaW5jbHVkZSAic2NoZW1hX21pZ3JhdGlvbi5oaCIK
I2luY2x1ZGUgImNlcnQuaGgiCiNpbmNsdWRlICJ0cmFuc2Zvcm1zLmhoIgojaW5jbHVkZSAi
dWkuaGgiCiNpbmNsdWRlICJ2b2NhYi5oaCIKI2luY2x1ZGUgInhkZWx0YS5oaCIKCi8vIGRl
ZmluZWQgaW4gc2NoZW1hLnNxbCwgY29udmVydGVkIHRvIGhlYWRlcjoKI2luY2x1ZGUgInNj
aGVtYS5oIgoKLy8gZGVmaW5lZCBpbiB2aWV3cy5zcWwsIGNvbnZlcnRlZCB0byBoZWFkZXI6
CiNpbmNsdWRlICJ2aWV3cy5oIgoKLy8gdGhpcyBmaWxlIGRlZmluZXMgYSBwdWJsaWMsIHR5
cGVkIGludGVyZmFjZSB0byB0aGUgZGF0YWJhc2UuCi8vIHRoZSBkYXRhYmFzZSBjbGFzcyBl
bmNhcHN1bGF0ZXMgYWxsIGtub3dsZWRnZSBhYm91dCBzcWxpdGUsCi8vIHRoZSBzY2hlbWEs
IGFuZCBhbGwgU1FMIHN0YXRlbWVudHMgdXNlZCB0byBhY2Nlc3MgdGhlIHNjaGVtYS4KLy8K
Ly8gc2VlIGZpbGUgc2NoZW1hLnNxbCBmb3IgdGhlIHRleHQgb2YgdGhlIHNjaGVtYS4KCnVz
aW5nIGJvb3N0OjpzaGFyZWRfcHRyOwp1c2luZyBib29zdDo6bGV4aWNhbF9jYXN0Owp1c2lu
ZyBuYW1lc3BhY2Ugc3RkOwoKaW50IGNvbnN0IG9uZV9yb3cgPSAxOwppbnQgY29uc3Qgb25l
X2NvbCA9IDE7CmludCBjb25zdCBhbnlfcm93cyA9IC0xOwppbnQgY29uc3QgYW55X2NvbHMg
PSAtMTsKCmV4dGVybiAiQyIgewogIC8vIHN0cmFuZ2VseSB0aGlzIGlzbid0IGRlY2xhcmVk
LCBldmVuIHRob3VnaCBpdCdzIHByZXNlbnQgaW4gbXkgc3FsaXRlLgogIGNoYXIgKnNxbGl0
ZV92bXByaW50Zihjb25zdCBjaGFyICp6Rm9ybWF0LCB2YV9saXN0KTsKfQoKZGF0YWJhc2U6
OmRhdGFiYXNlKGZzOjpwYXRoIGNvbnN0ICYgZm4pIDoKICBmaWxlbmFtZShmbiksCiAgLy8g
bmIuIHVwZGF0ZSB0aGlzIGlmIHlvdSBjaGFuZ2UgdGhlIHNjaGVtYS4gdW5mb3J0dW5hdGVs
eSB3ZSBhcmUgbm90CiAgLy8gdXNpbmcgc2VsZi1kaWdlc3Rpbmcgc2NoZW1hcyBkdWUgdG8g
Y29tbWVudCBpcnJlZ3VsYXJpdGllcyBhbmQKICAvLyBub24tYWxwaGFiZXRpYyBvcmRlcmlu
ZyBvZiB0YWJsZXMgaW4gc3FsIHNvdXJjZSBmaWxlcy4gd2UgY291bGQgY3JlYXRlCiAgLy8g
YSB0ZW1wb3JhcnkgZGIsIHdyaXRlIG91ciBpbnRlbmRlZCBzY2hlbWEgaW50byBpdCwgYW5k
IHJlYWQgaXQgYmFjaywKICAvLyBidXQgdGhpcyBzZWVtcyBsaWtlIGl0IHdvdWxkIGJlIHRv
byBydWRlLiBwb3NzaWJseSByZXZpc2l0IHRoaXMgaXNzdWUuCiAgc2NoZW1hKCJjMWU4NjU4
OGUxMWFkMDdmYTUzZTVkMjk0ZWRjMDQzY2UxZDQwMDVhIiksCiAgX19zcWwoTlVMTCksCiAg
dHJhbnNhY3Rpb25fbGV2ZWwoMCkKe30KCnZvaWQgCmRhdGFiYXNlOjpjaGVja19zY2hlbWEo
KQp7CiAgc3RyaW5nIGRiX3NjaGVtYV9pZDsgIAogIGNhbGN1bGF0ZV9zY2hlbWFfaWQgKF9f
c3FsLCBkYl9zY2hlbWFfaWQpOwogIE4gKHNjaGVtYSA9PSBkYl9zY2hlbWFfaWQsCiAgICAg
RigiZGF0YWJhc2Ugc2NoZW1hcyBkbyBub3QgbWF0Y2g6ICIKICAgICAgICJ3YW50ZWQgJXMs
IGdvdCAlcy4gdHJ5IG1pZ3JhdGluZyBkYXRhYmFzZSIpIAogICAgICUgc2NoZW1hICUgZGJf
c2NoZW1hX2lkKTsKfQoKc3RhdGljIHZvaWQgCnNxbGl0ZV91bmJhc2U2NF9mbihzcWxpdGVf
ZnVuYyAqZiwgaW50IG5hcmdzLCBjaGFyIGNvbnN0ICoqIGFyZ3MpCnsKICBpZiAobmFyZ3Mg
IT0gMSkKICAgIHsKICAgICAgc3FsaXRlX3NldF9yZXN1bHRfZXJyb3IoZiwgIm5lZWQgZXhh
Y3RseSAxIGFyZyB0byB1bmJhc2U2NCgpIiwgLTEpOwogICAgICByZXR1cm47CiAgICB9CiAg
ZGF0YSBkZWNvZGVkOwogIGRlY29kZV9iYXNlNjQoYmFzZTY0PGRhdGE+KHN0cmluZyhhcmdz
WzBdKSksIGRlY29kZWQpOwogIHNxbGl0ZV9zZXRfcmVzdWx0X3N0cmluZyhmLCBkZWNvZGVk
KCkuY19zdHIoKSwgZGVjb2RlZCgpLnNpemUoKSk7Cn0KCnZvaWQgCmRhdGFiYXNlOjpzZXRf
YXBwKGFwcF9zdGF0ZSAqIGFwcCkKewogIF9fYXBwID0gYXBwOwp9CgpzdHJ1Y3Qgc3FsaXRl
ICogCmRhdGFiYXNlOjpzcWwoYm9vbCBpbml0KQp7CiAgaWYgKCEgX19zcWwpCiAgICB7CiAg
ICAgIGlmICghIGluaXQpCgl7CgkgIGlmIChmaWxlbmFtZS5zdHJpbmcoKSA9PSAiIikKCSAg
ICB0aHJvdyBpbmZvcm1hdGl2ZV9mYWlsdXJlKHN0cmluZygibm8gZGF0YWJhc2Ugc3BlY2lm
aWVkIikpOwoJICBlbHNlIGlmICghIGZzOjpleGlzdHMoZmlsZW5hbWUpKQoJICAgIHRocm93
IGluZm9ybWF0aXZlX2ZhaWx1cmUoc3RyaW5nKCJkYXRhYmFzZSAiKSArIGZpbGVuYW1lLnN0
cmluZygpICsKCQkJCSAgICAgIHN0cmluZygiIGRvZXMgbm90IGV4aXN0IikpOwoJfQogICAg
ICBOKGZpbGVuYW1lLnN0cmluZygpICE9ICIiLAoJRigibmVlZCBkYXRhYmFzZSBuYW1lIikp
OwogICAgICBjaGFyICogZXJybXNnID0gTlVMTDsKICAgICAgX19zcWwgPSBzcWxpdGVfb3Bl
bihmaWxlbmFtZS5zdHJpbmcoKS5jX3N0cigpLCAwNzU1LCAmZXJybXNnKTsKICAgICAgaWYg
KCEgX19zcWwpCgl0aHJvdyBvb3BzKHN0cmluZygiY291bGQgbm90IG9wZW4gZGF0YWJhc2U6
ICIpICsgZmlsZW5hbWUuc3RyaW5nKCkgKyAKCQkgICAoZXJybXNnID8gKCI6ICIgKyBzdHJp
bmcoZXJybXNnKSkgOiAiIikpOwogICAgICBpZiAoaW5pdCkKCWV4ZWN1dGUoc2NoZW1hX2Nv
bnN0YW50KTsKCiAgICAgIGNoZWNrX3NjaGVtYSgpOwogICAgICBpbnN0YWxsX2Z1bmN0aW9u
cyhfX2FwcCk7CiAgICAgIGluc3RhbGxfdmlld3MoKTsKICAgIH0KICByZXR1cm4gX19zcWw7
Cn0KCnZvaWQgCmRhdGFiYXNlOjppbml0aWFsaXplKCkKewogIGlmIChfX3NxbCkKICAgIHRo
cm93IG9vcHMoImNhbm5vdCBpbml0aWFsaXplIGRhdGFiYXNlIHdoaWxlIGl0IGlzIG9wZW4i
KTsKCiAgTighZnM6OmV4aXN0cyhmaWxlbmFtZSksCiAgICBGKCJjb3VsZCBub3QgaW5pdGlh
bGl6ZSBkYXRhYmFzZTogJXM6IGFscmVhZHkgZXhpc3RzIikgCiAgICAlIGZpbGVuYW1lLnN0
cmluZygpKTsKCiAgZnM6OnBhdGggam91cm5hbCA9IG1rcGF0aChmaWxlbmFtZS5zdHJpbmco
KSArICItam91cm5hbCIpOwogIE4oIWZzOjpleGlzdHMoam91cm5hbCksCiAgICBGKCJleGlz
dGluZyAocG9zc2libHkgc3RhbGUpIGpvdXJuYWwgZmlsZSAnJXMnIGhhcyBzYW1lIHN0ZW0g
YXMgbmV3IGRhdGFiYXNlICclcyciKQogICAgJSBqb3VybmFsLnN0cmluZygpICUgZmlsZW5h
bWUuc3RyaW5nKCkpOwoKICBzcWxpdGUgKnMgPSBzcWwodHJ1ZSk7CiAgSShzICE9IE5VTEwp
Owp9CgoKc3RydWN0IApkdW1wX3JlcXVlc3QKewogIGR1bXBfcmVxdWVzdCgpIHt9OwogIHN0
cnVjdCBzcWxpdGUgKnNxbDsKICBzdHJpbmcgdGFibGVfbmFtZTsKICBvc3RyZWFtICpvdXQ7
Cn07CgpzdGF0aWMgaW50IApkdW1wX3Jvd19jYih2b2lkICpkYXRhLCBpbnQgbiwgY2hhciAq
KnZhbHMsIGNoYXIgKipjb2xzKQp7CiAgZHVtcF9yZXF1ZXN0ICpkdW1wID0gcmVpbnRlcnBy
ZXRfY2FzdDxkdW1wX3JlcXVlc3QgKj4oZGF0YSk7CiAgSShkdW1wICE9IE5VTEwpOwogIEko
dmFscyAhPSBOVUxMKTsKICBJKGR1bXAtPm91dCAhPSBOVUxMKTsKICAqKGR1bXAtPm91dCkg
PDwgRigiSU5TRVJUIElOVE8gJXMgVkFMVUVTKCIpICUgZHVtcC0+dGFibGVfbmFtZTsKICBm
b3IgKGludCBpID0gMDsgaSA8IG47ICsraSkKICAgIHsKICAgICAgaWYgKGkgIT0gMCkKCSoo
ZHVtcC0+b3V0KSA8PCAnLCc7CgogICAgICBpZiAodmFsc1tpXSA9PSBOVUxMKQoJKihkdW1w
LT5vdXQpIDw8ICJOVUxMIjsKICAgICAgZWxzZQoJewoJICAqKGR1bXAtPm91dCkgPDwgIici
OwoJICBmb3IgKGNoYXIgKmNwID0gdmFsc1tpXTsgKmNwOyArK2NwKQoJICAgIHsKCSAgICAg
IGlmICgqY3AgPT0gJ1wnJykKCQkqKGR1bXAtPm91dCkgPDwgIicnIjsKCSAgICAgIGVsc2UK
CQkqKGR1bXAtPm91dCkgPDwgKmNwOwoJICAgIH0KCSAgKihkdW1wLT5vdXQpIDw8ICInIjsK
CX0KICAgIH0KICAqKGR1bXAtPm91dCkgPDwgIik7XG4iOyAgCiAgcmV0dXJuIDA7Cn0KCnN0
YXRpYyBpbnQgCmR1bXBfdGFibGVfY2Iodm9pZCAqZGF0YSwgaW50IG4sIGNoYXIgKip2YWxz
LCBjaGFyICoqY29scykKewogIGR1bXBfcmVxdWVzdCAqZHVtcCA9IHJlaW50ZXJwcmV0X2Nh
c3Q8ZHVtcF9yZXF1ZXN0ICo+KGRhdGEpOwogIEkoZHVtcCAhPSBOVUxMKTsKICBJKGR1bXAt
PnNxbCAhPSBOVUxMKTsKICBJKHZhbHMgIT0gTlVMTCk7CiAgSSh2YWxzWzBdICE9IE5VTEwp
OwogIEkodmFsc1sxXSAhPSBOVUxMKTsKICBJKHZhbHNbMl0gIT0gTlVMTCk7CiAgSShuID09
IDMpOwogIGlmIChzdHJpbmcodmFsc1sxXSkgPT0gInRhYmxlIikKICAgIHsKICAgICAgKihk
dW1wLT5vdXQpIDw8IHZhbHNbMl0gPDwgIjtcbiI7CiAgICAgIGR1bXAtPnRhYmxlX25hbWUg
PSBzdHJpbmcodmFsc1swXSk7CiAgICAgIHNxbGl0ZV9leGVjX3ByaW50ZihkdW1wLT5zcWws
ICJTRUxFQ1QgKiBGUk9NICclcSciLCAKCQkJIGR1bXBfcm93X2NiLCBkYXRhLCBOVUxMLCB2
YWxzWzBdKTsKICAgIH0KICByZXR1cm4gMDsKfQoKdm9pZCAKZGF0YWJhc2U6OmR1bXAob3N0
cmVhbSAmIG91dCkKewogIGR1bXBfcmVxdWVzdCByZXE7CiAgcmVxLm91dCA9ICZvdXQ7CiAg
cmVxLnNxbCA9IHNxbCgpOwogIG91dCA8PCAiQkVHSU4gVFJBTlNBQ1RJT047XG4iOwogIGlu
dCByZXMgPSBzcWxpdGVfZXhlYyhyZXEuc3FsLAoJCQkiU0VMRUNUIG5hbWUsIHR5cGUsIHNx
bCBGUk9NIHNxbGl0ZV9tYXN0ZXIgIgoJCQkiV0hFUkUgdHlwZT0ndGFibGUnIEFORCBzcWwg
Tk9UIE5VTEwgIgoJCQkiT1JERVIgQlkgc3Vic3RyKHR5cGUsMiwxKSwgbmFtZSIsCgkJCWR1
bXBfdGFibGVfY2IsICZyZXEsIE5VTEwpOwogIEkocmVzID09IFNRTElURV9PSyk7CiAgb3V0
IDw8ICJDT01NSVQ7XG4iOwp9Cgp2b2lkIApkYXRhYmFzZTo6bG9hZChpc3RyZWFtICYgaW4p
CnsKICBjaGFyIGJ1Zltjb25zdGFudHM6OmJ1ZnN6XTsKICBzdHJpbmcgdG1wOwoKICBOKGZp
bGVuYW1lLnN0cmluZygpICE9ICIiLAogICAgRigibmVlZCBkYXRhYmFzZSBuYW1lIikpOwog
IGNoYXIgKiBlcnJtc2cgPSBOVUxMOwogIF9fc3FsID0gc3FsaXRlX29wZW4oZmlsZW5hbWUu
c3RyaW5nKCkuY19zdHIoKSwgMDc1NSwgJmVycm1zZyk7CiAgaWYgKCEgX19zcWwpCiAgICB0
aHJvdyBvb3BzKHN0cmluZygiY291bGQgbm90IG9wZW4gZGF0YWJhc2U6ICIpICsgZmlsZW5h
bWUuc3RyaW5nKCkgKyAKCSAgICAgICAoZXJybXNnID8gKCI6ICIgKyBzdHJpbmcoZXJybXNn
KSkgOiAiIikpOwogIAogIHdoaWxlKGluKQogICAgewogICAgICBpbi5yZWFkKGJ1ZiwgY29u
c3RhbnRzOjpidWZzeik7CiAgICAgIHRtcC5hcHBlbmQoYnVmLCBpbi5nY291bnQoKSk7CiAg
ICB9CgogIGV4ZWN1dGUodG1wLmNfc3RyKCkpOwp9CgoKdm9pZCAKZGF0YWJhc2U6OmRlYnVn
KHN0cmluZyBjb25zdCAmIHNxbCwgb3N0cmVhbSAmIG91dCkKewogIHJlc3VsdHMgcmVzOwog
IGZldGNoKHJlcywgYW55X2NvbHMsIGFueV9yb3dzLCBzcWwuY19zdHIoKSk7CiAgb3V0IDw8
ICInIiA8PCBzcWwgPDwgIicgLT4gIiA8PCByZXMuc2l6ZSgpIDw8ICIgcm93c1xuIiA8PCBl
bmRsOwogIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzLnNpemUoKTsgKytpKQogICAgewog
ICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHJlc1tpXS5zaXplKCk7ICsraikKCXsKCSAg
aWYgKGogIT0gMCkKCSAgICBvdXQgPDwgIiB8ICI7CgkgIG91dCA8PCByZXNbaV1bal07Cgl9
CiAgICAgIG91dCA8PCBlbmRsOwogICAgfQp9Cgp1bnNpZ25lZCBsb25nIApkYXRhYmFzZTo6
Z2V0X3N0YXRpc3RpYyhzdHJpbmcgY29uc3QgJiBxdWVyeSkKewogIHJlc3VsdHMgcmVzOwog
IGZldGNoKHJlcywgMSwgMSwgcXVlcnkuY19zdHIoKSk7CiAgcmV0dXJuIGxleGljYWxfY2Fz
dDx1bnNpZ25lZCBsb25nPihyZXNbMF1bMF0pOwp9Cgp2b2lkIApkYXRhYmFzZTo6aW5mbyhv
c3RyZWFtICYgb3V0KQp7CiAgc3RyaW5nIGlkOwogIGNhbGN1bGF0ZV9zY2hlbWFfaWQoc3Fs
KCksIGlkKTsKICBvdXQgPDwgInNjaGVtYSB2ZXJzaW9uICA6ICIgPDwgaWQgPDwgZW5kbDsK
ICBvdXQgPDwgImZ1bGwgbWFuaWZlc3RzICA6ICIgPDwgZ2V0X3N0YXRpc3RpYygiU0VMRUNU
IENPVU5UKCopIEZST00gbWFuaWZlc3RzIikgPDwgZW5kbDsKICBvdXQgPDwgIm1hbmlmZXN0
IGRlbHRhcyA6ICIgPDwgZ2V0X3N0YXRpc3RpYygiU0VMRUNUIENPVU5UKCopIEZST00gbWFu
aWZlc3RfZGVsdGFzIikgPDwgZW5kbDsKICBvdXQgPDwgImZ1bGwgZmlsZXMgICAgICA6ICIg
PDwgZ2V0X3N0YXRpc3RpYygiU0VMRUNUIENPVU5UKCopIEZST00gZmlsZXMiKSA8PCBlbmRs
OwogIG91dCA8PCAiZmlsZSBkZWx0YXMgICAgIDogIiA8PCBnZXRfc3RhdGlzdGljKCJTRUxF
Q1QgQ09VTlQoKikgRlJPTSBmaWxlX2RlbHRhcyIpIDw8IGVuZGw7Cn0KCnZvaWQgCmRhdGFi
YXNlOjp2ZXJzaW9uKG9zdHJlYW0gJiBvdXQpCnsKICBzdHJpbmcgaWQ7CiAgY2FsY3VsYXRl
X3NjaGVtYV9pZChzcWwoKSwgaWQpOwogIG91dCA8PCAiZGF0YWJhc2Ugc2NoZW1hIHZlcnNp
b246ICIgPDwgaWQgPDwgZW5kbDsKfQoKdm9pZCAKZGF0YWJhc2U6Om1pZ3JhdGUoKQp7ICAK
ICBOKGZpbGVuYW1lLnN0cmluZygpICE9ICIiLAogICAgRigibmVlZCBkYXRhYmFzZSBuYW1l
IikpOwogIGNoYXIgKiBlcnJtc2cgPSBOVUxMOwogIF9fc3FsID0gc3FsaXRlX29wZW4oZmls
ZW5hbWUuc3RyaW5nKCkuY19zdHIoKSwgMDc1NSwgJmVycm1zZyk7CiAgaWYgKCEgX19zcWwp
CiAgICB0aHJvdyBvb3BzKHN0cmluZygiY291bGQgbm90IG9wZW4gZGF0YWJhc2U6ICIpICsg
ZmlsZW5hbWUuc3RyaW5nKCkgKyAKCSAgICAgICAoZXJybXNnID8gKCI6ICIgKyBzdHJpbmco
ZXJybXNnKSkgOiAiIikpOwogIG1pZ3JhdGVfbW9ub3RvbmVfc2NoZW1hKF9fc3FsKTsKICBz
cWxpdGVfY2xvc2UoX19zcWwpOwp9Cgp2b2lkIApkYXRhYmFzZTo6cmVoYXNoKCkKewogIHRy
YW5zYWN0aW9uX2d1YXJkIGd1YXJkKCp0aGlzKTsKICB0aWNrZXIgbWNlcnRzKCJtY2VydHMi
LCAibSIsIDEpOwogIHRpY2tlciBmY2VydHMoImZjZXJ0cyIsICJmIiwgMSk7CiAgdGlja2Vy
IHB1YmtleXMoInB1YmtleXMiLCAiKyIsIDEpOwogIHRpY2tlciBwcml2a2V5cygicHJpdmtl
eXMiLCAiISIsIDEpOwogIAogIHsKICAgIC8vIHJlaGFzaCBhbGwgbWNlcnRzCiAgICByZXN1
bHRzIHJlczsKICAgIHZlY3RvcjxjZXJ0PiBjZXJ0czsKICAgIGZldGNoKHJlcywgNSwgYW55
X3Jvd3MsIAoJICAiU0VMRUNUIGlkLCBuYW1lLCB2YWx1ZSwga2V5cGFpciwgc2lnbmF0dXJl
ICIKCSAgIkZST00gbWFuaWZlc3RfY2VydHMiKTsKICAgIHJlc3VsdHNfdG9fY2VydHMocmVz
LCBjZXJ0cyk7CiAgICBleGVjdXRlKCJERUxFVEUgRlJPTSBtYW5pZmVzdF9jZXJ0cyIpOwog
ICAgZm9yKHZlY3RvcjxjZXJ0Pjo6Y29uc3RfaXRlcmF0b3IgaSA9IGNlcnRzLmJlZ2luKCk7
IGkgIT0gY2VydHMuZW5kKCk7ICsraSkKICAgICAgewoJcHV0X2NlcnQoKmksICJtYW5pZmVz
dF9jZXJ0cyIpOwoJKyttY2VydHM7CiAgICAgIH0KICB9CgogIHsKICAgIC8vIHJlaGFzaCBh
bGwgZmNlcnRzCiAgICByZXN1bHRzIHJlczsKICAgIHZlY3RvcjxjZXJ0PiBjZXJ0czsgICAg
CiAgICBmZXRjaChyZXMsIDUsIGFueV9yb3dzLCAKCSAgIlNFTEVDVCBpZCwgbmFtZSwgdmFs
dWUsIGtleXBhaXIsIHNpZ25hdHVyZSAiCgkgICJGUk9NIGZpbGVfY2VydHMiKTsKICAgIHJl
c3VsdHNfdG9fY2VydHMocmVzLCBjZXJ0cyk7CiAgICBleGVjdXRlKCJERUxFVEUgRlJPTSBm
aWxlX2NlcnRzIik7CiAgICBmb3IodmVjdG9yPGNlcnQ+Ojpjb25zdF9pdGVyYXRvciBpID0g
Y2VydHMuYmVnaW4oKTsgaSAhPSBjZXJ0cy5lbmQoKTsgKytpKQogICAgICB7CglwdXRfY2Vy
dCgqaSwgImZpbGVfY2VydHMiKTsKCSsrZmNlcnRzOwogICAgICB9CiAgfQogIAoKICB7CiAg
ICAvLyByZWhhc2ggYWxsIHB1YmtleXMKICAgIHJlc3VsdHMgcmVzOwogICAgZmV0Y2gocmVz
LCAyLCBhbnlfcm93cywgIlNFTEVDVCBpZCwga2V5ZGF0YSBGUk9NIHB1YmxpY19rZXlzIik7
CiAgICBleGVjdXRlKCJERUxFVEUgRlJPTSBwdWJsaWNfa2V5cyIpOwogICAgZm9yIChzaXpl
X3QgaSA9IDA7IGkgPCByZXMuc2l6ZSgpOyArK2kpCiAgICAgIHsKCWhleGVuYzxpZD4gdG1w
OwoJa2V5X2hhc2hfY29kZShyc2Ffa2V5cGFpcl9pZChyZXNbaV1bMF0pLCBiYXNlNjQ8cnNh
X3B1Yl9rZXk+KHJlc1tpXVsxXSksIHRtcCk7CglleGVjdXRlKCJJTlNFUlQgSU5UTyBwdWJs
aWNfa2V5cyBWQUxVRVMoJyVxJywgJyVxJywgJyVxJykiLCAKCQl0bXAoKS5jX3N0cigpLCBy
ZXNbaV1bMF0uY19zdHIoKSwgcmVzW2ldWzFdLmNfc3RyKCkpOwoJKytwdWJrZXlzOwogICAg
ICB9CiAgfQoKewogICAgLy8gcmVoYXNoIGFsbCBwcml2a2V5cwogICAgcmVzdWx0cyByZXM7
CiAgICBmZXRjaChyZXMsIDIsIGFueV9yb3dzLCAiU0VMRUNUIGlkLCBrZXlkYXRhIEZST00g
cHJpdmF0ZV9rZXlzIik7CiAgICBleGVjdXRlKCJERUxFVEUgRlJPTSBwcml2YXRlX2tleXMi
KTsKICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzLnNpemUoKTsgKytpKQogICAgICB7
CgloZXhlbmM8aWQ+IHRtcDsKCWtleV9oYXNoX2NvZGUocnNhX2tleXBhaXJfaWQocmVzW2ld
WzBdKSwgYmFzZTY0PCBhcmM0PHJzYV9wcml2X2tleT4gPihyZXNbaV1bMV0pLCB0bXApOwoJ
ZXhlY3V0ZSgiSU5TRVJUIElOVE8gcHJpdmF0ZV9rZXlzIFZBTFVFUygnJXEnLCAnJXEnLCAn
JXEnKSIsIAoJCXRtcCgpLmNfc3RyKCksIHJlc1tpXVswXS5jX3N0cigpLCByZXNbaV1bMV0u
Y19zdHIoKSk7CgkrK3ByaXZrZXlzOwogICAgICB9CiAgfQoKICBndWFyZC5jb21taXQoKTsK
fQoKdm9pZCAKZGF0YWJhc2U6OmVuc3VyZV9vcGVuKCkKewogIHNxbGl0ZSAqcyA9IHNxbCgp
OwogIEkocyAhPSBOVUxMKTsKfQoKZGF0YWJhc2U6On5kYXRhYmFzZSgpIAp7CiAgaWYgKF9f
c3FsKQogICAgewogICAgICBzcWxpdGVfY2xvc2UoX19zcWwpOwogICAgICBfX3NxbCA9IDA7
CiAgICB9Cn0KCnN0YXRpYyB2b2lkIAphc3NlcnRfc3FsaXRlX29rKGludCByZXMpCnsKICBz
d2l0Y2ggKHJlcykKICAgIHsgICAgICAKICAgIGNhc2UgU1FMSVRFX09LOiAKICAgICAgYnJl
YWs7CgogICAgY2FzZSBTUUxJVEVfRVJST1I6CiAgICAgIHRocm93IG9vcHMoIlNRTCBlcnJv
ciBvciBtaXNzaW5nIGRhdGFiYXNlIik7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgU1FMSVRF
X0lOVEVSTkFMOgogICAgICB0aHJvdyBvb3BzKCJBbiBpbnRlcm5hbCBsb2dpYyBlcnJvciBp
biBTUUxpdGUiKTsKICAgICAgYnJlYWs7CgogICAgY2FzZSBTUUxJVEVfUEVSTToKICAgICAg
dGhyb3cgb29wcygiQWNjZXNzIHBlcm1pc3Npb24gZGVuaWVkIik7CiAgICAgIGJyZWFrOwoK
ICAgIGNhc2UgU1FMSVRFX0FCT1JUOgogICAgICB0aHJvdyBvb3BzKCJDYWxsYmFjayByb3V0
aW5lIHJlcXVlc3RlZCBhbiBhYm9ydCIpOwogICAgICBicmVhazsKCiAgICBjYXNlIFNRTElU
RV9CVVNZOgogICAgICB0aHJvdyBvb3BzKCJUaGUgZGF0YWJhc2UgZmlsZSBpcyBsb2NrZWQi
KTsKICAgICAgYnJlYWs7CgogICAgY2FzZSBTUUxJVEVfTE9DS0VEOgogICAgICB0aHJvdyBv
b3BzKCJBIHRhYmxlIGluIHRoZSBkYXRhYmFzZSBpcyBsb2NrZWQiKTsKICAgICAgYnJlYWs7
CgogICAgY2FzZSBTUUxJVEVfTk9NRU06CiAgICAgIHRocm93IG9vcHMoIkEgbWFsbG9jKCkg
ZmFpbGVkIik7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgU1FMSVRFX1JFQURPTkxZOgogICAg
ICB0aHJvdyBvb3BzKCJBdHRlbXB0IHRvIHdyaXRlIGEgcmVhZG9ubHkgZGF0YWJhc2UiKTsK
ICAgICAgYnJlYWs7CgogICAgY2FzZSBTUUxJVEVfSU5URVJSVVBUOgogICAgICB0aHJvdyBv
b3BzKCJPcGVyYXRpb24gdGVybWluYXRlZCBieSBzcWxpdGVfaW50ZXJydXB0KCkiKTsKICAg
ICAgYnJlYWs7CgogICAgY2FzZSBTUUxJVEVfSU9FUlI6CiAgICAgIHRocm93IG9vcHMoIlNv
bWUga2luZCBvZiBkaXNrIEkvTyBlcnJvciBvY2N1cnJlZCIpOwogICAgICBicmVhazsKCiAg
ICBjYXNlIFNRTElURV9DT1JSVVBUOgogICAgICB0aHJvdyBvb3BzKCJUaGUgZGF0YWJhc2Ug
ZGlzayBpbWFnZSBpcyBtYWxmb3JtZWQiKTsKICAgICAgYnJlYWs7CgogICAgY2FzZSBTUUxJ
VEVfTk9URk9VTkQ6CiAgICAgIHRocm93IG9vcHMoIihJbnRlcm5hbCBPbmx5KSBUYWJsZSBv
ciByZWNvcmQgbm90IGZvdW5kIik7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgU1FMSVRFX0ZV
TEw6CiAgICAgIHRocm93IG9vcHMoIkluc2VydGlvbiBmYWlsZWQgYmVjYXVzZSBkYXRhYmFz
ZSBpcyBmdWxsIik7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgU1FMSVRFX0NBTlRPUEVOOgog
ICAgICB0aHJvdyBvb3BzKCJVbmFibGUgdG8gb3BlbiB0aGUgZGF0YWJhc2UgZmlsZSIpOwog
ICAgICBicmVhazsKCiAgICBjYXNlIFNRTElURV9QUk9UT0NPTDoKICAgICAgdGhyb3cgb29w
cygiZGF0YWJhc2UgbG9jayBwcm90b2NvbCBlcnJvciIpOwogICAgICBicmVhazsKCiAgICBj
YXNlIFNRTElURV9FTVBUWToKICAgICAgdGhyb3cgb29wcygiKEludGVybmFsIE9ubHkpIGRh
dGFiYXNlIHRhYmxlIGlzIGVtcHR5Iik7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgU1FMSVRF
X1NDSEVNQToKICAgICAgdGhyb3cgb29wcygiVGhlIGRhdGFiYXNlIHNjaGVtYSBjaGFuZ2Vk
Iik7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgU1FMSVRFX1RPT0JJRzoKICAgICAgdGhyb3cg
b29wcygiVG9vIG11Y2ggZGF0YSBmb3Igb25lIHJvdyBvZiBhIHRhYmxlIik7CiAgICAgIGJy
ZWFrOwoKICAgIGNhc2UgU1FMSVRFX0NPTlNUUkFJTlQ6CiAgICAgIHRocm93IG9vcHMoIkFi
b3J0IGR1ZSB0byBjb250cmFpbnQgdmlvbGF0aW9uIik7CiAgICAgIGJyZWFrOwoKICAgIGNh
c2UgU1FMSVRFX01JU01BVENIOgogICAgICB0aHJvdyBvb3BzKCJEYXRhIHR5cGUgbWlzbWF0
Y2giKTsKICAgICAgYnJlYWs7CgogICAgY2FzZSBTUUxJVEVfTUlTVVNFOgogICAgICB0aHJv
dyBvb3BzKCJMaWJyYXJ5IHVzZWQgaW5jb3JyZWN0bHkiKTsKICAgICAgYnJlYWs7CgogICAg
ZGVmYXVsdDoKICAgICAgdGhyb3cgb29wcyhzdHJpbmcoIlVua25vd24gREIgcmVzdWx0IGNv
ZGU6ICIpICsgbGV4aWNhbF9jYXN0PHN0cmluZz4ocmVzKSk7CiAgICAgIGJyZWFrOwogICAg
fQp9Cgp2b2lkIApkYXRhYmFzZTo6ZXhlY3V0ZShjaGFyIGNvbnN0ICogcXVlcnksIC4uLikK
ewogIHZhX2xpc3QgYXA7CiAgaW50IHJlczsKICBjaGFyICogZXJybXNnID0gTlVMTDsKCiAg
dmFfc3RhcnQoYXAsIHF1ZXJ5KTsKCiAgLy8gbG9nIGl0CiAgY2hhciAqIGZvcm1hdHRlZCA9
IHNxbGl0ZV92bXByaW50ZihxdWVyeSwgYXApOwogIHN0cmluZyBxcShmb3JtYXR0ZWQpOwog
IGlmIChxcS5zaXplKCkgPiBjb25zdGFudHM6OmRiX2xvZ19saW5lX3N6KSAKICAgIHFxID0g
cXEuc3Vic3RyKDAsIGNvbnN0YW50czo6ZGJfbG9nX2xpbmVfc3opICsgc3RyaW5nKCIgLi4u
Iik7CiAgTChGKCJkYi5leGVjdXRlKFwiJXNcIilcbiIpICUgcXEpOwogIHNxbGl0ZV9mcmVl
bWVtKGZvcm1hdHRlZCk7CgogIHZhX2VuZChhcCk7CiAgdmFfc3RhcnQoYXAsIHF1ZXJ5KTsK
CiAgLy8gZG8gaXQKICByZXMgPSBzcWxpdGVfZXhlY192cHJpbnRmKHNxbCgpLCBxdWVyeSwg
TlVMTCwgTlVMTCwgJmVycm1zZywgYXApOwoKICB2YV9lbmQoYXApOwoKICBpZiAoZXJybXNn
KQogICAgdGhyb3cgb29wcyhzdHJpbmcoInNxbGl0ZSBleGVjIGVycm9yICIpICsgZXJybXNn
KTsKCiAgYXNzZXJ0X3NxbGl0ZV9vayhyZXMpOwoKfQoKdm9pZCAKZGF0YWJhc2U6OmZldGNo
KHJlc3VsdHMgJiByZXMsIAoJCWludCBjb25zdCB3YW50X2NvbHMsIAoJCWludCBjb25zdCB3
YW50X3Jvd3MsIAoJCWNoYXIgY29uc3QgKiBxdWVyeSwgLi4uKQp7CiAgY2hhciAqKiByZXN1
bHQgPSBOVUxMOwogIGludCBucm93OwogIGludCBuY29sOwogIGNoYXIgKiBlcnJtc2cgPSBO
VUxMOwogIGludCByZXNjb2RlOwoKICB2YV9saXN0IGFwOwogIHJlcy5jbGVhcigpOwogIHJl
cy5yZXNpemUoMCk7CiAgdmFfc3RhcnQoYXAsIHF1ZXJ5KTsKCiAgLy8gbG9nIGl0CiAgY2hh
ciAqIGZvcm1hdHRlZCA9IHNxbGl0ZV92bXByaW50ZihxdWVyeSwgYXApOwogIHN0cmluZyBx
cShmb3JtYXR0ZWQpOwogIGlmIChxcS5zaXplKCkgPiBjb25zdGFudHM6OmxvZ19saW5lX3N6
KSAKICAgIHFxID0gcXEuc3Vic3RyKDAsIGNvbnN0YW50czo6bG9nX2xpbmVfc3opICsgc3Ry
aW5nKCIgLi4uIik7CiAgTChGKCJkYi5mZXRjaChcIiVzXCIpXG4iKSAlIHFxKTsKICBzcWxp
dGVfZnJlZW1lbShmb3JtYXR0ZWQpOwoKICB2YV9lbmQoYXApOwogIHZhX3N0YXJ0KGFwLCBx
dWVyeSk7CgogIC8vIGRvIGl0CiAgcmVzY29kZSA9IHNxbGl0ZV9nZXRfdGFibGVfdnByaW50
ZihzcWwoKSwgcXVlcnksICZyZXN1bHQsICZucm93LCAmbmNvbCwgJmVycm1zZywgYXApOwoK
ICB2YV9lbmQoYXApOwoKICBjbGVhbnVwX3B0cjxjaGFyICoqLCB2b2lkPiAKICAgIHJlc3Vs
dF9ndWFyZChyZXN1bHQsICZzcWxpdGVfZnJlZV90YWJsZSk7CgogIHN0cmluZyBjdHggPSBz
dHJpbmcoImRiIHF1ZXJ5IFsiKSArIHN0cmluZyhxdWVyeSkgKyAiXTogIjsKCiAgaWYgKGVy
cm1zZykKICAgIHRocm93IG9vcHMoY3R4ICsgc3RyaW5nKCJzcWxpdGUgZXJyb3IgIikgKyBl
cnJtc2cpOwogIGFzc2VydF9zcWxpdGVfb2socmVzY29kZSk7CgogIGlmICh3YW50X2NvbHMg
PT0gMCAmJiBuY29sID09IDApIHJldHVybjsKICBpZiAod2FudF9yb3dzID09IDAgJiYgbnJv
dyA9PSAwKSByZXR1cm47CiAgaWYgKHdhbnRfY29scyA9PSBhbnlfcm93cyAmJiBuY29sID09
IDApIHJldHVybjsKICBpZiAod2FudF9yb3dzID09IGFueV9yb3dzICYmIG5yb3cgPT0gMCkg
cmV0dXJuOwoKICBpZiAod2FudF9jb2xzICE9IGFueV9jb2xzICYmCiAgICAgIG5jb2wgIT0g
d2FudF9jb2xzKQogICAgdGhyb3cgb29wcygoRigiJXMgd2FudGVkICVkIGNvbHVtbnMsIGdv
dCAlcyIpCgkJJSBjdHggJSB3YW50X2NvbHMgJSBuY29sKS5zdHIoKSk7CgogIGlmICh3YW50
X3Jvd3MgIT0gYW55X3Jvd3MgJiYKICAgICAgbnJvdyAhPSB3YW50X3Jvd3MpCiAgICB0aHJv
dyBvb3BzKChGKCIlcyB3YW50ZWQgJWQgcm93cywgZ290ICVzIikKCQklIGN0eCAlIHdhbnRf
cm93cyAlIG5yb3cpLnN0cigpKTsKCiAgaWYgKCFyZXN1bHQpCiAgICB0aHJvdyBvb3BzKGN0
eCArICJudWxsIHJlc3VsdCBzZXQiKTsKCiAgZm9yIChpbnQgaSA9IDA7IGkgPCBuY29sOyAr
K2kpIAogICAgaWYgKCFyZXN1bHRbaV0pCiAgICAgIHRocm93IG9vcHMoY3R4ICsgIm51bGwg
Y29sdW1uIG5hbWUiKTsKCiAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbnJvdzsgKytyb3cp
IAogICAgewogICAgICB2ZWN0b3I8c3RyaW5nPiByb3d2ZWM7CiAgICAgIGZvciAoaW50IGNv
bCA9IDA7IGNvbCA8IG5jb2w7ICsrY29sKQoJewoJICBpbnQgaSA9ICgoMSArIHJvdykgKiBu
Y29sKSArIGNvbDsKCSAgaWYgKCFyZXN1bHRbaV0pCgkgICAgdGhyb3cgb29wcyhjdHggKyAi
bnVsbCByZXN1bHQgdmFsdWUiKTsKCSAgZWxzZQoJICAgIHJvd3ZlYy5wdXNoX2JhY2socmVz
dWx0W2ldKTsKCX0KICAgICAgcmVzLnB1c2hfYmFjayhyb3d2ZWMpOwogICAgfQp9CgovLyBn
ZW5lcmFsIGFwcGxpY2F0aW9uLWxldmVsIGxvZ2ljCgp2b2lkIApkYXRhYmFzZTo6c2V0X2Zp
bGVuYW1lKGZzOjpwYXRoIGNvbnN0ICYgZmlsZSkKewogIGlmIChfX3NxbCkKICAgIHsKICAg
ICAgdGhyb3cgb29wcygiY2Fubm90IGNoYW5nZSBmaWxlbmFtZSB0byAiICsgZmlsZS5zdHJp
bmcoKSArICIgd2hpbGUgZGIgaXMgb3BlbiIpOwogICAgfQogIGZpbGVuYW1lID0gZmlsZTsK
fQoKdm9pZCAKZGF0YWJhc2U6OmJlZ2luX3RyYW5zYWN0aW9uKCkgCnsKICBpZiAodHJhbnNh
Y3Rpb25fbGV2ZWwgPT0gMCkKICAgICAgZXhlY3V0ZSgiQkVHSU4iKTsKICB0cmFuc2FjdGlv
bl9sZXZlbCsrOwp9Cgp2b2lkIApkYXRhYmFzZTo6Y29tbWl0X3RyYW5zYWN0aW9uKCkKewog
IGlmICh0cmFuc2FjdGlvbl9sZXZlbCA9PSAxKQogICAgZXhlY3V0ZSgiQ09NTUlUIik7CiAg
dHJhbnNhY3Rpb25fbGV2ZWwtLTsKfQoKdm9pZCAKZGF0YWJhc2U6OnJvbGxiYWNrX3RyYW5z
YWN0aW9uKCkKewogIGlmICh0cmFuc2FjdGlvbl9sZXZlbCA9PSAxKQogICAgZXhlY3V0ZSgi
Uk9MTEJBQ0siKTsKICB0cmFuc2FjdGlvbl9sZXZlbC0tOwp9CgoKYm9vbCAKZGF0YWJhc2U6
OmV4aXN0cyhoZXhlbmM8aWQ+IGNvbnN0ICYgaWRlbnQsCgkJICAgICAgc3RyaW5nIGNvbnN0
ICYgdGFibGUpCnsKICByZXN1bHRzIHJlczsKICBmZXRjaChyZXMsIG9uZV9jb2wsIGFueV9y
b3dzLCAKCSJTRUxFQ1QgaWQgRlJPTSAnJXEnIFdIRVJFIGlkID0gJyVxJyIsCgl0YWJsZS5j
X3N0cigpLCBpZGVudCgpLmNfc3RyKCkpOwogIEkoKHJlcy5zaXplKCkgPT0gMSkgfHwgKHJl
cy5zaXplKCkgPT0gMCkpOwogIHJldHVybiByZXMuc2l6ZSgpID09IDE7Cn0KCgpib29sIApk
YXRhYmFzZTo6ZGVsdGFfZXhpc3RzKGhleGVuYzxpZD4gY29uc3QgJiBpZGVudCwKCQkgICAg
ICAgc3RyaW5nIGNvbnN0ICYgdGFibGUpCnsKICByZXN1bHRzIHJlczsKICBmZXRjaChyZXMs
IG9uZV9jb2wsIGFueV9yb3dzLCAKCSJTRUxFQ1QgaWQgRlJPTSAnJXEnIFdIRVJFIGlkID0g
JyVxJyIsCgl0YWJsZS5jX3N0cigpLCBpZGVudCgpLmNfc3RyKCkpOwogIHJldHVybiByZXMu
c2l6ZSgpID4gMDsKfQoKYm9vbCAKZGF0YWJhc2U6OmRlbHRhX2V4aXN0cyhoZXhlbmM8aWQ+
IGNvbnN0ICYgaWRlbnQsCgkJICAgICAgIGhleGVuYzxpZD4gY29uc3QgJiBiYXNlLAoJCSAg
ICAgICBzdHJpbmcgY29uc3QgJiB0YWJsZSkKewogIHJlc3VsdHMgcmVzOwogIGZldGNoKHJl
cywgb25lX2NvbCwgYW55X3Jvd3MsIAoJIlNFTEVDVCBpZCBGUk9NICclcScgV0hFUkUgaWQg
PSAnJXEnIEFORCBiYXNlID0gJyVxJyIsCgl0YWJsZS5jX3N0cigpLCBpZGVudCgpLmNfc3Ry
KCksIGJhc2UoKS5jX3N0cigpKTsKICBJKChyZXMuc2l6ZSgpID09IDEpIHx8IChyZXMuc2l6
ZSgpID09IDApKTsKICByZXR1cm4gcmVzLnNpemUoKSA9PSAxOwp9CgppbnQgCmRhdGFiYXNl
Ojpjb3VudChzdHJpbmcgY29uc3QgJiB0YWJsZSkKewogIHJlc3VsdHMgcmVzOwogIGZldGNo
KHJlcywgb25lX2NvbCwgb25lX3JvdywgCgkiU0VMRUNUIENPVU5UKCopIEZST00gJyVxJyIs
IAoJdGFibGUuY19zdHIoKSk7CiAgcmV0dXJuIGxleGljYWxfY2FzdDxpbnQ+KHJlc1swXVsw
XSk7ICAKfQoKdm9pZCAKZGF0YWJhc2U6OmdldChoZXhlbmM8aWQ+IGNvbnN0ICYgaWRlbnQs
CgkgICAgICBiYXNlNjQ8IGd6aXA8ZGF0YT4gPiAmIGRhdCwKCSAgICAgIHN0cmluZyBjb25z
dCAmIHRhYmxlKQp7CiAgcmVzdWx0cyByZXM7CiAgZmV0Y2gocmVzLCBvbmVfY29sLCBvbmVf
cm93LAoJIlNFTEVDVCBkYXRhIEZST00gJyVxJyBXSEVSRSBpZCA9ICclcSciLCAKCXRhYmxl
LmNfc3RyKCksIGlkZW50KCkuY19zdHIoKSk7CgogIC8vIGNvbnNpc3RlbmN5IGNoZWNrCiAg
YmFzZTY0PGd6aXA8ZGF0YT4gPiByZGF0YShyZXNbMF1bMF0pOwogIGhleGVuYzxpZD4gdGlk
OwogIGNhbGN1bGF0ZV9pZGVudChyZGF0YSwgdGlkKTsKICBJKHRpZCA9PSBpZGVudCk7Cgog
IGRhdCA9IHJkYXRhOwp9Cgp2b2lkIApkYXRhYmFzZTo6Z2V0X2RlbHRhKGhleGVuYzxpZD4g
Y29uc3QgJiBpZGVudCwKCQkgICAgaGV4ZW5jPGlkPiBjb25zdCAmIGJhc2UsCgkJICAgIGJh
c2U2NDwgZ3ppcDxkZWx0YT4gPiAmIGRlbCwKCQkgICAgc3RyaW5nIGNvbnN0ICYgdGFibGUp
CnsKICBJKGlkZW50KCkgIT0gIiIpOwogIEkoYmFzZSgpICE9ICIiKTsKICByZXN1bHRzIHJl
czsKICBmZXRjaChyZXMsIG9uZV9jb2wsIG9uZV9yb3csCgkiU0VMRUNUIGRlbHRhIEZST00g
JyVxJyBXSEVSRSBpZCA9ICclcScgQU5EIGJhc2UgPSAnJXEnIiwgCgl0YWJsZS5jX3N0cigp
LCBpZGVudCgpLmNfc3RyKCksIGJhc2UoKS5jX3N0cigpKTsKICBkZWwgPSByZXNbMF1bMF07
Cn0KCnZvaWQgCmRhdGFiYXNlOjpwdXQoaGV4ZW5jPGlkPiBjb25zdCAmIGlkZW50LAoJICAg
ICAgYmFzZTY0PCBnemlwPGRhdGE+ID4gY29uc3QgJiBkYXQsCgkgICAgICBzdHJpbmcgY29u
c3QgJiB0YWJsZSkKewogIC8vIGNvbnNpc3RlbmN5IGNoZWNrCiAgSShpZGVudCgpICE9ICIi
KTsKICBoZXhlbmM8aWQ+IHRpZDsKICBjYWxjdWxhdGVfaWRlbnQoZGF0LCB0aWQpOwogIEko
dGlkID09IGlkZW50KTsKICAKICBleGVjdXRlKCJJTlNFUlQgSU5UTyAnJXEnIFZBTFVFUygn
JXEnLCAnJXEnKSIsIAoJICB0YWJsZS5jX3N0cigpLCBpZGVudCgpLmNfc3RyKCksIGRhdCgp
LmNfc3RyKCkpOwp9CgoKdm9pZCAKZGF0YWJhc2U6OnB1dF9kZWx0YShoZXhlbmM8aWQ+IGNv
bnN0ICYgaWRlbnQsCgkJICAgIGhleGVuYzxpZD4gY29uc3QgJiBiYXNlLAoJCSAgICBiYXNl
NjQ8Z3ppcDxkZWx0YT4gPiBjb25zdCAmIGRlbCwKCQkgICAgc3RyaW5nIGNvbnN0ICYgdGFi
bGUpCnsKICAvLyBuYjogZGVsdGEgc2NoZW1hIGlzIChpZCwgYmFzZSwgZGVsdGEpCiAgSShp
ZGVudCgpICE9ICIiKTsKICBJKGJhc2UoKSAhPSAiIik7CiAgZXhlY3V0ZSgiSU5TRVJUIElO
VE8gJyVxJyBWQUxVRVMoJyVxJywgJyVxJywgJyVxJykiLCAKCSAgdGFibGUuY19zdHIoKSwg
CgkgIGlkZW50KCkuY19zdHIoKSwgYmFzZSgpLmNfc3RyKCksIGRlbCgpLmNfc3RyKCkpOwp9
Cgp2b2lkIApkYXRhYmFzZTo6Z2V0X3ZlcnNpb24oaGV4ZW5jPGlkPiBjb25zdCAmIGlkZW50
LAoJCSAgICAgIGJhc2U2NDwgZ3ppcDxkYXRhPiA+ICYgZGF0LAoJCSAgICAgIHN0cmluZyBj
b25zdCAmIGRhdGFfdGFibGUsCgkJICAgICAgc3RyaW5nIGNvbnN0ICYgZGVsdGFfdGFibGUp
CnsKICBJKGlkZW50KCkgIT0gIiIpOwogIGlmIChleGlzdHMoaWRlbnQsIGRhdGFfdGFibGUp
KQogICAgewogICAgICAvLyBlYXN5IHBhdGgKICAgICAgZ2V0KGlkZW50LCBkYXQsIGRhdGFf
dGFibGUpOwogICAgfQogIGVsc2UKICAgIHsKICAgICAgLy8gdHJpY2t5IHBhdGgKCiAgICAg
IC8vIHdlIHN0YXJ0IGZyb20gdGhlIGZpbGUgd2Ugd2FudCB0byByZWNvbnN0cnVjdCBhbmQg
d29yayAqZm9yd2FyZHMqCiAgICAgIC8vIHRocm91Z2ggdGhlIGRhdGFiYXNlLCB1bnRpbCB3
ZSBnZXQgdG8gYSBmdWxsIGRhdGEgb2JqZWN0LiB3ZSB0aGVuCiAgICAgIC8vIHRyYWNlIGJh
Y2sgdGhyb3VnaCB0aGUgbGlzdCBvZiBlZGdlcyB3ZSBmb2xsb3dlZCB0byBnZXQgdG8gdGhl
IGRhdGEKICAgICAgLy8gb2JqZWN0LCBhcHBseWluZyByZXZlcnNlIGRlbHRhcy4KICAgICAg
Ly8KICAgICAgLy8gdGhlIGVmZmVjdCBvZiB0aGlzIGFsZ29yaXRobSBpcyBicmVhZHRoLWZp
cnN0IHNlYXJjaCwgYmFja3dhcmRzCiAgICAgIC8vIHRocm91Z2ggdGhlIHN0b3JhZ2UgZ3Jh
cGgsIHRvIGRpc2NvdmVyIGEgZm9yd2FyZHMgc2hvcnRlc3QgcGF0aCwgYW5kCiAgICAgIC8v
IHRoZW4gZm9sbG93aW5nIHRoYXQgc2hvcnRlc3QgcGF0aCB3aXRoIGRlbHRhIGFwcGxpY2F0
aW9uLgogICAgICAvLwogICAgICAvLyB3ZSB1c2VkIHRvIGRvIHRoaXMgd2l0aCB0aGUgYm9v
c3QgZ3JhcGggbGlicmFyeSwgYnV0IGl0IGludm92bGVkCiAgICAgIC8vIGxvYWRpbmcgdG9v
IG11Y2ggb2YgdGhlIHN0b3JhZ2UgZ3JhcGggaW50byBtZW1vcnkgYXQgYW55IG1vbWVudC4g
dGhpcwogICAgICAvLyBpbXBlcmF0aXZlIHZlcnNpb24gb25seSBsb2FkcyB0aGUgZGVzY2Vu
ZGVudHMgb2YgdGhlIHJlY29uc3RydWN0aW9uCiAgICAgIC8vIG5vZGUsIHNvIGl0IG11Y2gg
Y2hlYXBlciBpbiB0ZXJtcyBvZiBtZW1vcnkuCiAgICAgIC8vCiAgICAgIC8vIHdlIGFsc28g
bWFpbnRhaW4gYSBjeWNsZS1kZXRlY3Rpbmcgc2V0LCBqdXN0IHRvIGJlIHNhZmUKICAgICAg
CiAgICAgIEwoRigicmVjb25zdHJ1Y3RpbmcgJXMgaW4gJXNcbiIpICUgaWRlbnQgJSBkZWx0
YV90YWJsZSk7CiAgICAgIEkoZGVsdGFfZXhpc3RzKGlkZW50LCBkZWx0YV90YWJsZSkpOwog
ICAgICAKICAgICAgLy8gbmI6IGFuIGVkZ2UgbWFwIGdvZXMgaW4gdGhlIGRpcmVjdGlvbiBv
ZiB0aGUKICAgICAgLy8gZGVsdGEsICpub3QqIHRoZSBkaXJlY3Rpb24gd2UgZGlzY292ZXIg
dGhpbmdzIGluLAogICAgICAvLyBpLmUuIGVhY2ggbWFwIGlzIG9mIHRoZSBmb3JtIFtuZXdp
ZF0gLT4gW29sZGlkXQoKICAgICAgdHlwZWRlZiBtYXA8IGhleGVuYzxpZD4sIGhleGVuYzxp
ZD4gPiBlZGdlbWFwOwogICAgICBsaXN0PCBzaGFyZWRfcHRyPGVkZ2VtYXA+ID4gcGF0aHM7
CgogICAgICBzZXQ8IGhleGVuYzxpZD4gPiBmcm9udGllciwgY3ljbGVzOwogICAgICBmcm9u
dGllci5pbnNlcnQoaWRlbnQpOwoKICAgICAgYm9vbCBmb3VuZF9yb290ID0gZmFsc2U7CiAg
ICAgIGhleGVuYzxpZD4gcm9vdCgiIik7CgogICAgICB3aGlsZSAoISBmb3VuZF9yb290KQoJ
ewoJICBzZXQ8IGhleGVuYzxpZD4gPiBuZXh0X2Zyb250aWVyOwoJICBzaGFyZWRfcHRyPGVk
Z2VtYXA+IGZyb250aWVyX21hcChuZXcgZWRnZW1hcCgpKTsKCgkgIEkoIWZyb250aWVyLmVt
cHR5KCkpOwoKCSAgZm9yIChzZXQ8IGhleGVuYzxpZD4gPjo6Y29uc3RfaXRlcmF0b3IgaSA9
IGZyb250aWVyLmJlZ2luKCk7CgkgICAgICAgaSAhPSBmcm9udGllci5lbmQoKTsgKytpKQoJ
ICAgIHsKCSAgICAgIGlmIChleGlzdHMoKmksIGRhdGFfdGFibGUpKQoJCXsKCQkgIHJvb3Qg
PSAqaTsKCQkgIGZvdW5kX3Jvb3QgPSB0cnVlOwoJCSAgYnJlYWs7CgkJfQoJICAgICAgZWxz
ZQoJCXsKCQkgIGN5Y2xlcy5pbnNlcnQoKmkpOwoJCSAgcmVzdWx0cyByZXM7CgkJICBmZXRj
aChyZXMsIG9uZV9jb2wsIGFueV9yb3dzLCAiU0VMRUNUIGJhc2UgZnJvbSAnJXEnIFdIRVJF
IGlkID0gJyVxJyIsCgkJCWRlbHRhX3RhYmxlLmNfc3RyKCksICgqaSkoKS5jX3N0cigpKTsK
CQkgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgcmVzLnNpemUoKTsgKytrKQoJCSAgICB7CgkJ
ICAgICAgaGV4ZW5jPGlkPiBjb25zdCBueHQocmVzW2tdWzBdKTsKCgkJICAgICAgaWYgKGN5
Y2xlcy5maW5kKG54dCkgIT0gY3ljbGVzLmVuZCgpKQoJCQl0aHJvdyBvb3BzKCJjeWNsZSBp
biB0YWJsZSAnIiArIGRlbHRhX3RhYmxlICsgIicsIGF0IG5vZGUgIiAKCQkJCSAgICsgKCpp
KSgpICsgIiA8LSAiICsgbnh0KCkpOwoKCQkgICAgICBuZXh0X2Zyb250aWVyLmluc2VydChu
eHQpOwoKCQkgICAgICBpZiAoZnJvbnRpZXJfbWFwLT5maW5kKG54dCkgPT0gZnJvbnRpZXJf
bWFwLT5lbmQoKSkKCQkJewoJCQkgIEwoRigiaW5zZXJ0aW5nIGVkZ2U6ICVzIDwtICVzXG4i
KSAlICgqaSkgJSBueHQpOwoJCQkgIGZyb250aWVyX21hcC0+aW5zZXJ0KG1ha2VfcGFpcihu
eHQsICppKSk7CgkJCX0KCQkgICAgICBlbHNlCgkJCUwoRigic2tpcHBpbmcgbWVyZ2UgZWRn
ZSAlcyA8LSAlc1xuIikgJSAoKmkpICUgbnh0KTsKCQkgICAgfQoJCX0KCSAgICB9CgkgIGlm
ICghZm91bmRfcm9vdCkKCSAgICB7CgkgICAgICBmcm9udGllciA9IG5leHRfZnJvbnRpZXI7
CgkgICAgICBwYXRocy5wdXNoX2Zyb250KGZyb250aWVyX21hcCk7CgkgICAgfQoJfQoKICAg
ICAgLy8gcGF0aCBidWlsdCwgbm93IGFsbCB3ZSBuZWVkIHRvIGRvIGlzIGZvbGxvdyBpdCBi
YWNrCgogICAgICBJKGZvdW5kX3Jvb3QpOwogICAgICBJKHJvb3QoKSAhPSAiIik7CiAgICAg
IGJhc2U2NDwgZ3ppcDxkYXRhPiA+IGJlZ2luX3BhY2tlZDsKICAgICAgZGF0YSBiZWdpbjsg
ICAgICAKICAgICAgZ2V0KHJvb3QsIGJlZ2luX3BhY2tlZCwgZGF0YV90YWJsZSk7CiAgICAg
IHVucGFjayhiZWdpbl9wYWNrZWQsIGJlZ2luKTsKICAgICAgaGV4ZW5jPGlkPiBjdXJyID0g
cm9vdDsKCiAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGRlbHRhX2FwcGxpY2F0b3I+IGFwcCA9
IG5ld19waWVjZXdpc2VfYXBwbGljYXRvcigpOwogICAgICBhcHAtPmJlZ2luKGJlZ2luKCkp
OwogICAgICAKICAgICAgZm9yIChsaXN0PCBzaGFyZWRfcHRyPGVkZ2VtYXA+ID46OmNvbnN0
X2l0ZXJhdG9yIHAgPSBwYXRocy5iZWdpbigpOwoJICAgcCAhPSBwYXRocy5lbmQoKTsgKytw
KQoJewoJICBzaGFyZWRfcHRyPGVkZ2VtYXA+IGkgPSAqcDsKCSAgSShpLT5maW5kKGN1cnIp
ICE9IGktPmVuZCgpKTsKCSAgaGV4ZW5jPGlkPiBjb25zdCBueHQgPSBpLT5maW5kKGN1cnIp
LT5zZWNvbmQ7CgoJICBMKEYoImZvbGxvd2luZyBkZWx0YSAlcyAtPiAlc1xuIikgJSBjdXJy
ICUgbnh0KTsKCSAgYmFzZTY0PCBnemlwPGRlbHRhPiA+IGRlbF9wYWNrZWQ7CgkgIGdldF9k
ZWx0YShueHQsIGN1cnIsIGRlbF9wYWNrZWQsIGRlbHRhX3RhYmxlKTsKCSAgZGVsdGEgZGVs
OwoJICB1bnBhY2soZGVsX3BhY2tlZCwgZGVsKTsKCSAgYXBwbHlfZGVsdGEgKGFwcCwgZGVs
KCkpOwoJICBhcHAtPm5leHQoKTsKCSAgY3VyciA9IG54dDsKCX0KCiAgICAgIHN0cmluZyB0
bXA7CiAgICAgIGFwcC0+ZmluaXNoKHRtcCk7CiAgICAgIGRhdGEgZW5kKHRtcCk7CgogICAg
ICBoZXhlbmM8aWQ+IGZpbmFsOwogICAgICBjYWxjdWxhdGVfaWRlbnQoZW5kLCBmaW5hbCk7
CiAgICAgIEkoZmluYWwgPT0gaWRlbnQpOwogICAgICBwYWNrKGVuZCwgZGF0KTsKICAgIH0K
fQoKCnZvaWQgCmRhdGFiYXNlOjpkcm9wKGhleGVuYzxpZD4gY29uc3QgJiBpZGVudCwgCgkg
ICAgICAgc3RyaW5nIGNvbnN0ICYgdGFibGUpCnsKICBleGVjdXRlKCJERUxFVEUgRlJPTSAn
JXEnIFdIRVJFIGlkID0gJyVxJyIsICAKCSAgdGFibGUuY19zdHIoKSwKCSAgaWRlbnQoKS5j
X3N0cigpKTsKfQoKdm9pZCAKZGF0YWJhc2U6OnB1dF92ZXJzaW9uKGhleGVuYzxpZD4gY29u
c3QgJiBvbGRfaWQsCgkJICAgICAgaGV4ZW5jPGlkPiBjb25zdCAmIG5ld19pZCwKCQkgICAg
ICBiYXNlNjQ8IGd6aXA8ZGVsdGE+ID4gY29uc3QgJiBkZWwsCgkJICAgICAgc3RyaW5nIGNv
bnN0ICYgZGF0YV90YWJsZSwKCQkgICAgICBzdHJpbmcgY29uc3QgJiBkZWx0YV90YWJsZSkK
ewoKICBiYXNlNjQ8IGd6aXA8ZGF0YT4gPiBvbGRfZGF0YSwgbmV3X2RhdGE7CiAgYmFzZTY0
PCBnemlwPGRlbHRhPiA+IHJldmVyc2VfZGVsdGE7CiAgCiAgZ2V0X3ZlcnNpb24ob2xkX2lk
LCBvbGRfZGF0YSwgZGF0YV90YWJsZSwgZGVsdGFfdGFibGUpOwogIHBhdGNoKG9sZF9kYXRh
LCBkZWwsIG5ld19kYXRhKTsKICBkaWZmKG5ld19kYXRhLCBvbGRfZGF0YSwgcmV2ZXJzZV9k
ZWx0YSk7CiAgICAgIAogIHRyYW5zYWN0aW9uX2d1YXJkIGd1YXJkKCp0aGlzKTsKICBpZiAo
ZXhpc3RzKG9sZF9pZCwgZGF0YV90YWJsZSkpCiAgICB7CiAgICAgIC8vIGRlc2NlbmRlbnQg
b2YgYSBoZWFkIHZlcnNpb24gcmVwbGFjZXMgdGhlIGhlYWQsIHRoZXJlZm9yZSBvbGQgaGVh
ZAogICAgICAvLyBtdXN0IGJlIGRpc3Bvc2VkIG9mCiAgICAgIGRyb3Aob2xkX2lkLCBkYXRh
X3RhYmxlKTsKICAgIH0KICBwdXQobmV3X2lkLCBuZXdfZGF0YSwgZGF0YV90YWJsZSk7CiAg
cHV0X2RlbHRhKG9sZF9pZCwgbmV3X2lkLCByZXZlcnNlX2RlbHRhLCBkZWx0YV90YWJsZSk7
CiAgZ3VhcmQuY29tbWl0KCk7Cn0KCnZvaWQgCmRhdGFiYXNlOjpwdXRfcmV2ZXJzZV92ZXJz
aW9uKGhleGVuYzxpZD4gY29uc3QgJiBuZXdfaWQsCgkJCSAgICAgIGhleGVuYzxpZD4gY29u
c3QgJiBvbGRfaWQsCgkJCSAgICAgIGJhc2U2NDwgZ3ppcDxkZWx0YT4gPiBjb25zdCAmIHJl
dmVyc2VfZGVsLAoJCQkgICAgICBzdHJpbmcgY29uc3QgJiBkYXRhX3RhYmxlLAoJCQkgICAg
ICBzdHJpbmcgY29uc3QgJiBkZWx0YV90YWJsZSkKewogIGJhc2U2NDwgZ3ppcDxkYXRhPiA+
IG9sZF9kYXRhLCBuZXdfZGF0YTsKICAKICBnZXRfdmVyc2lvbihuZXdfaWQsIG5ld19kYXRh
LCBkYXRhX3RhYmxlLCBkZWx0YV90YWJsZSk7CiAgcGF0Y2gobmV3X2RhdGEsIHJldmVyc2Vf
ZGVsLCBvbGRfZGF0YSk7CiAgaGV4ZW5jPGlkPiBjaGVjazsKICBjYWxjdWxhdGVfaWRlbnQo
b2xkX2RhdGEsIGNoZWNrKTsKICBJKG9sZF9pZCA9PSBjaGVjayk7CiAgICAgIAogIHRyYW5z
YWN0aW9uX2d1YXJkIGd1YXJkKCp0aGlzKTsKICBwdXRfZGVsdGEob2xkX2lkLCBuZXdfaWQs
IHJldmVyc2VfZGVsLCBkZWx0YV90YWJsZSk7CiAgZ3VhcmQuY29tbWl0KCk7Cn0KCgoKLy8g
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tCi8vIC0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAtLQovLyAtLSAgICAgICAgICAgICAgcHVibGljIGludGVyZmFjZSBm
b2xsb3dzICAgICAgICAgICAgICAgICAgLS0KLy8gLS0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi8vIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYm9vbCAK
ZGF0YWJhc2U6OmZpbGVfdmVyc2lvbl9leGlzdHMoZmlsZV9pZCBjb25zdCAmIGlkKQp7CiAg
cmV0dXJuIGRlbHRhX2V4aXN0cyhpZC5pbm5lcigpLCAiZmlsZV9kZWx0YXMiKSAKICAgIHx8
IGV4aXN0cyhpZC5pbm5lcigpLCAiZmlsZXMiKTsKfQoKYm9vbCAKZGF0YWJhc2U6Om1hbmlm
ZXN0X3ZlcnNpb25fZXhpc3RzKG1hbmlmZXN0X2lkIGNvbnN0ICYgaWQpCnsKICByZXR1cm4g
ZGVsdGFfZXhpc3RzKGlkLmlubmVyKCksICJtYW5pZmVzdF9kZWx0YXMiKSAKICAgIHx8IGV4
aXN0cyhpZC5pbm5lcigpLCAibWFuaWZlc3RzIik7Cn0KCmJvb2wgCmRhdGFiYXNlOjpyZXZp
c2lvbl9leGlzdHMocmV2aXNpb25faWQgY29uc3QgJiBpZCkKewogIHJldHVybiBleGlzdHMo
aWQuaW5uZXIoKSwgInJldmlzaW9ucyIpOwp9CgoKdm9pZCAKZGF0YWJhc2U6OmdldF9maWxl
X3ZlcnNpb24oZmlsZV9pZCBjb25zdCAmIGlkLAoJCQkgICBmaWxlX2RhdGEgJiBkYXQpCnsK
ICBiYXNlNjQ8IGd6aXA8ZGF0YT4gPiB0bXA7CiAgZ2V0X3ZlcnNpb24oaWQuaW5uZXIoKSwg
dG1wLCAiZmlsZXMiLCAiZmlsZV9kZWx0YXMiKTsKICBkYXQgPSB0bXA7Cn0KCnZvaWQgCmRh
dGFiYXNlOjpnZXRfbWFuaWZlc3RfdmVyc2lvbihtYW5pZmVzdF9pZCBjb25zdCAmIGlkLAoJ
CQkgICAgICAgbWFuaWZlc3RfZGF0YSAmIGRhdCkKewogIGJhc2U2NDwgZ3ppcDxkYXRhPiA+
IHRtcDsKICBnZXRfdmVyc2lvbihpZC5pbm5lcigpLCB0bXAsICJtYW5pZmVzdHMiLCAibWFu
aWZlc3RfZGVsdGFzIik7CiAgZGF0ID0gdG1wOwp9Cgp2b2lkIApkYXRhYmFzZTo6Z2V0X21h
bmlmZXN0KG1hbmlmZXN0X2lkIGNvbnN0ICYgaWQsCgkJICAgICAgIG1hbmlmZXN0X21hcCAm
IG1tKQp7CiAgbWFuaWZlc3RfZGF0YSBtZGF0OwogIGdldF9tYW5pZmVzdF92ZXJzaW9uKGlk
LCBtZGF0KTsKICByZWFkX21hbmlmZXN0X21hcChtZGF0LCBtbSk7Cn0KCgp2b2lkIApkYXRh
YmFzZTo6cHV0X2ZpbGUoZmlsZV9pZCBjb25zdCAmIGlkLAoJCSAgIGZpbGVfZGF0YSBjb25z
dCAmIGRhdCkKewogIHB1dChpZC5pbm5lcigpLCBkYXQuaW5uZXIoKSwgImZpbGVzIik7Cn0K
CnZvaWQgCmRhdGFiYXNlOjpwdXRfZmlsZV92ZXJzaW9uKGZpbGVfaWQgY29uc3QgJiBvbGRf
aWQsCgkJCSAgIGZpbGVfaWQgY29uc3QgJiBuZXdfaWQsCgkJCSAgIGZpbGVfZGVsdGEgY29u
c3QgJiBkZWwpCnsKICBwdXRfdmVyc2lvbihvbGRfaWQuaW5uZXIoKSwgbmV3X2lkLmlubmVy
KCksIGRlbC5pbm5lcigpLCAKCSAgICAgICJmaWxlcyIsICJmaWxlX2RlbHRhcyIpOwp9Cgp2
b2lkIApkYXRhYmFzZTo6cHV0X2ZpbGVfcmV2ZXJzZV92ZXJzaW9uKGZpbGVfaWQgY29uc3Qg
JiBuZXdfaWQsCgkJCQkgICBmaWxlX2lkIGNvbnN0ICYgb2xkX2lkLAkJCQkgICAKCQkJCSAg
IGZpbGVfZGVsdGEgY29uc3QgJiBkZWwpCnsKICBwdXRfcmV2ZXJzZV92ZXJzaW9uKG5ld19p
ZC5pbm5lcigpLCBvbGRfaWQuaW5uZXIoKSwgZGVsLmlubmVyKCksIAoJCSAgICAgICJmaWxl
cyIsICJmaWxlX2RlbHRhcyIpOwp9CgoKdm9pZCAKZGF0YWJhc2U6OnB1dF9tYW5pZmVzdCht
YW5pZmVzdF9pZCBjb25zdCAmIGlkLAoJCSAgICAgICBtYW5pZmVzdF9kYXRhIGNvbnN0ICYg
ZGF0KQp7CiAgcHV0KGlkLmlubmVyKCksIGRhdC5pbm5lcigpLCAibWFuaWZlc3RzIik7Cn0K
CnZvaWQgCmRhdGFiYXNlOjpwdXRfbWFuaWZlc3RfdmVyc2lvbihtYW5pZmVzdF9pZCBjb25z
dCAmIG9sZF9pZCwKCQkJICAgICAgIG1hbmlmZXN0X2lkIGNvbnN0ICYgbmV3X2lkLAoJCQkg
ICAgICAgbWFuaWZlc3RfZGVsdGEgY29uc3QgJiBkZWwpCnsKICBwdXRfdmVyc2lvbihvbGRf
aWQuaW5uZXIoKSwgbmV3X2lkLmlubmVyKCksIGRlbC5pbm5lcigpLCAKCSAgICAgICJtYW5p
ZmVzdHMiLCAibWFuaWZlc3RfZGVsdGFzIik7Cn0KCnZvaWQgCmRhdGFiYXNlOjpwdXRfbWFu
aWZlc3RfcmV2ZXJzZV92ZXJzaW9uKG1hbmlmZXN0X2lkIGNvbnN0ICYgbmV3X2lkLAoJCQkJ
ICAgICAgIG1hbmlmZXN0X2lkIGNvbnN0ICYgb2xkX2lkLAkJCQkgICAKCQkJCSAgICAgICBt
YW5pZmVzdF9kZWx0YSBjb25zdCAmIGRlbCkKewogIHB1dF9yZXZlcnNlX3ZlcnNpb24obmV3
X2lkLmlubmVyKCksIG9sZF9pZC5pbm5lcigpLCBkZWwuaW5uZXIoKSwgCgkJICAgICAgIm1h
bmlmZXN0cyIsICJtYW5pZmVzdF9kZWx0YXMiKTsKfQoKCnZvaWQgCmRhdGFiYXNlOjpnZXRf
cmV2aXNpb25fYW5jZXN0cnkoc3RkOjpzZXQ8c3RkOjpwYWlyPHJldmlzaW9uX2lkLCByZXZp
c2lvbl9pZD4gPiAmIGdyYXBoKQp7CiAgcmVzdWx0cyByZXM7CiAgZ3JhcGguY2xlYXIoKTsK
ICBmZXRjaChyZXMsIDIsIGFueV9yb3dzLCAKCSJTRUxFQ1QgcGFyZW50LGNoaWxkIEZST00g
cmV2aXNpb25fYW5jZXN0cnkiKTsKICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlcy5zaXpl
KCk7ICsraSkKICAgIGdyYXBoLmluc2VydChzdGQ6Om1ha2VfcGFpcihyZXZpc2lvbl9pZChy
ZXNbaV1bMF0pLAoJCQkJcmV2aXNpb25faWQocmVzW2ldWzFdKSkpOwp9Cgp2b2lkIApkYXRh
YmFzZTo6Z2V0X3JldmlzaW9uX3BhcmVudHMocmV2aXNpb25faWQgY29uc3QgJiBpZCwKCQkJ
ICAgICAgc2V0PHJldmlzaW9uX2lkPiAmIHBhcmVudHMpCnsKICByZXN1bHRzIHJlczsKICBw
YXJlbnRzLmNsZWFyKCk7CiAgZmV0Y2gocmVzLCBvbmVfY29sLCBhbnlfcm93cywgCgkiU0VM
RUNUIHBhcmVudCBGUk9NIHJldmlzaW9uX2FuY2VzdHJ5IFdIRVJFIGNoaWxkID0gJyVxJyIs
CglpZC5pbm5lcigpKCkuY19zdHIoKSk7CiAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXMu
c2l6ZSgpOyArK2kpCiAgICBwYXJlbnRzLmluc2VydChyZXZpc2lvbl9pZChyZXNbaV1bMF0p
KTsKfQoKdm9pZCAKZGF0YWJhc2U6OmdldF9yZXZpc2lvbl9jaGlsZHJlbihyZXZpc2lvbl9p
ZCBjb25zdCAmIGlkLAoJCQkJc2V0PHJldmlzaW9uX2lkPiAmIGNoaWxkcmVuKQp7CiAgcmVz
dWx0cyByZXM7CiAgY2hpbGRyZW4uY2xlYXIoKTsKICBmZXRjaChyZXMsIG9uZV9jb2wsIGFu
eV9yb3dzLCAKCSJTRUxFQ1QgY2hpbGQgRlJPTSByZXZpc2lvbl9hbmNlc3RyeSBXSEVSRSBw
YXJlbnQgPSAnJXEnIiwKCWlkLmlubmVyKCkoKS5jX3N0cigpKTsKICBmb3IgKHNpemVfdCBp
ID0gMDsgaSA8IHJlcy5zaXplKCk7ICsraSkKICAgIGNoaWxkcmVuLmluc2VydChyZXZpc2lv
bl9pZChyZXNbaV1bMF0pKTsKfQoKdm9pZCAKZGF0YWJhc2U6OmdldF9yZXZpc2lvbl9tYW5p
ZmVzdChyZXZpc2lvbl9pZCBjb25zdCAmIHJpZCwKCQkJICAgICAgIG1hbmlmZXN0X2lkICYg
bWlkKQp7CiAgcmV2aXNpb25fc2V0IHJldjsKICBnZXRfcmV2aXNpb24ocmlkLCByZXYpOwog
IG1pZCA9IHJldi5uZXdfbWFuaWZlc3Q7Cn0KCnZvaWQgCmRhdGFiYXNlOjpnZXRfcmV2aXNp
b24ocmV2aXNpb25faWQgY29uc3QgJiBpZCwKCQkgICAgICAgcmV2aXNpb25fc2V0ICYgcmV2
KQp7CiAgcmV2aXNpb25fZGF0YSBkOwogIGdldF9yZXZpc2lvbihpZCwgZCk7CiAgcmVhZF9y
ZXZpc2lvbl9zZXQoZCwgcmV2KTsKfQoKdm9pZCAKZGF0YWJhc2U6OmdldF9yZXZpc2lvbihy
ZXZpc2lvbl9pZCBjb25zdCAmIGlkLAoJCSAgICAgICByZXZpc2lvbl9kYXRhICYgZGF0KQp7
CiAgcmVzdWx0cyByZXM7CiAgZmV0Y2gocmVzLCBvbmVfY29sLCBvbmVfcm93LCAKCSJTRUxF
Q1QgZGF0YSBGUk9NIHJldmlzaW9ucyBXSEVSRSBpZCA9ICclcSciLAoJaWQuaW5uZXIoKSgp
LmNfc3RyKCkpOwoKICBkYXQgPSByZXZpc2lvbl9kYXRhKHJlc1swXVswXSk7CgogIC8vIHZl
cmlmeSB0aGF0IHdlIGdvdCBhIHJldmlzaW9uIHdpdGggdGhlIHJpZ2h0IGlkCiAgewogICAg
cmV2aXNpb25faWQgdG1wOwogICAgY2FsY3VsYXRlX2lkZW50KGRhdCwgdG1wKTsKICAgIEko
aWQgPT0gdG1wKTsKICB9Cn0KCnZvaWQgCmRhdGFiYXNlOjpwdXRfcmV2aXNpb24ocmV2aXNp
b25faWQgY29uc3QgJiBuZXdfaWQsCgkJICAgICAgIHJldmlzaW9uX3NldCBjb25zdCAmIHJl
dikKewoKICBJKCFyZXZpc2lvbl9leGlzdHMobmV3X2lkKSk7CiAgcmV2aXNpb25fZGF0YSBk
OwoKICB3cml0ZV9yZXZpc2lvbl9zZXQocmV2LCBkKTsKICByZXZpc2lvbl9pZCB0bXA7CiAg
Y2FsY3VsYXRlX2lkZW50KGQsIHRtcCk7CiAgSSh0bXAgPT0gbmV3X2lkKTsKCiAgdHJhbnNh
Y3Rpb25fZ3VhcmQgZ3VhcmQoKnRoaXMpOwoKICBleGVjdXRlKCJJTlNFUlQgSU5UTyByZXZp
c2lvbnMgVkFMVUVTKCclcScsICclcScpIiwgCgkgIG5ld19pZC5pbm5lcigpKCkuY19zdHIo
KSwgCgkgIGQuaW5uZXIoKSgpLmNfc3RyKCkpOwoKICBmb3IgKGVkZ2VfbWFwOjpjb25zdF9p
dGVyYXRvciBlID0gcmV2LmVkZ2VzLmJlZ2luKCk7CiAgICAgICBlICE9IHJldi5lZGdlcy5l
bmQoKTsgKytlKQogICAgewogICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyByZXZpc2lvbl9h
bmNlc3RyeSBWQUxVRVMoJyVxJywgJyVxJykiLCAKCSAgICAgIGVkZ2Vfb2xkX3JldmlzaW9u
KGUpLmlubmVyKCkoKS5jX3N0cigpLAoJICAgICAgbmV3X2lkLmlubmVyKCkoKS5jX3N0cigp
KTsKICAgIH0KCiAgZ3VhcmQuY29tbWl0KCk7Cn0KCnZvaWQgCmRhdGFiYXNlOjpwdXRfcmV2
aXNpb24ocmV2aXNpb25faWQgY29uc3QgJiBuZXdfaWQsCgkJICAgICAgIHJldmlzaW9uX2Rh
dGEgY29uc3QgJiBkYXQpCnsKICByZXZpc2lvbl9zZXQgcmV2OwogIHJlYWRfcmV2aXNpb25f
c2V0KGRhdCwgcmV2KTsKICBwdXRfcmV2aXNpb24obmV3X2lkLCByZXYpOwp9CgoKLy8gY3J5
cHRvIGtleSBtYW5hZ2VtZW50Cgp2b2lkIApkYXRhYmFzZTo6Z2V0X2tleV9pZHMoc3RyaW5n
IGNvbnN0ICYgcGF0dGVybiwKCQkgICAgICB2ZWN0b3I8cnNhX2tleXBhaXJfaWQ+ICYgcHVi
a2V5cywKCQkgICAgICB2ZWN0b3I8cnNhX2tleXBhaXJfaWQ+ICYgcHJpdmtleXMpCnsKICBw
dWJrZXlzLmNsZWFyKCk7CiAgcHJpdmtleXMuY2xlYXIoKTsKICByZXN1bHRzIHJlczsKCiAg
aWYgKHBhdHRlcm4gIT0gIiIpCiAgICBmZXRjaChyZXMsIG9uZV9jb2wsIGFueV9yb3dzLCAK
CSAgIlNFTEVDVCBpZCBmcm9tIHB1YmxpY19rZXlzIFdIRVJFIGlkIEdMT0IgJyVxJyIsCgkg
IHBhdHRlcm4uY19zdHIoKSk7CiAgZWxzZQogICAgZmV0Y2gocmVzLCBvbmVfY29sLCBhbnlf
cm93cywgCgkgICJTRUxFQ1QgaWQgZnJvbSBwdWJsaWNfa2V5cyIpOwoKICBmb3IgKHNpemVf
dCBpID0gMDsgaSA8IHJlcy5zaXplKCk7ICsraSkKICAgIHB1YmtleXMucHVzaF9iYWNrKHJl
c1tpXVswXSk7CgogIGlmIChwYXR0ZXJuICE9ICIiKQogICAgZmV0Y2gocmVzLCBvbmVfY29s
LCBhbnlfcm93cywgCgkgICJTRUxFQ1QgaWQgZnJvbSBwcml2YXRlX2tleXMgV0hFUkUgaWQg
R0xPQiAnJXEnIiwKCSAgcGF0dGVybi5jX3N0cigpKTsKICBlbHNlCiAgICBmZXRjaChyZXMs
IG9uZV9jb2wsIGFueV9yb3dzLCAKCSAgIlNFTEVDVCBpZCBmcm9tIHByaXZhdGVfa2V5cyIp
OwoKICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlcy5zaXplKCk7ICsraSkKICAgIHByaXZr
ZXlzLnB1c2hfYmFjayhyZXNbaV1bMF0pOwp9Cgp2b2lkIApkYXRhYmFzZTo6Z2V0X3ByaXZh
dGVfa2V5cyh2ZWN0b3I8cnNhX2tleXBhaXJfaWQ+ICYgcHJpdmtleXMpCnsKICBwcml2a2V5
cy5jbGVhcigpOwogIHJlc3VsdHMgcmVzOwogIGZldGNoKHJlcywgb25lX2NvbCwgYW55X3Jv
d3MsICAiU0VMRUNUIGlkIGZyb20gcHJpdmF0ZV9rZXlzIik7CiAgZm9yIChzaXplX3QgaSA9
IDA7IGkgPCByZXMuc2l6ZSgpOyArK2kpCiAgICBwcml2a2V5cy5wdXNoX2JhY2socmVzW2ld
WzBdKTsKfQoKYm9vbCAKZGF0YWJhc2U6OnB1YmxpY19rZXlfZXhpc3RzKGhleGVuYzxpZD4g
Y29uc3QgJiBoYXNoKQp7CiAgcmVzdWx0cyByZXM7CiAgZmV0Y2gocmVzLCBvbmVfY29sLCBh
bnlfcm93cywgCgkiU0VMRUNUIGlkIEZST00gcHVibGljX2tleXMgV0hFUkUgaGFzaCA9ICcl
cSciLAoJaGFzaCgpLmNfc3RyKCkpOwogIEkoKHJlcy5zaXplKCkgPT0gMSkgfHwgKHJlcy5z
aXplKCkgPT0gMCkpOwogIGlmIChyZXMuc2l6ZSgpID09IDEpIAogICAgcmV0dXJuIHRydWU7
CiAgcmV0dXJuIGZhbHNlOwp9Cgpib29sIApkYXRhYmFzZTo6cHVibGljX2tleV9leGlzdHMo
cnNhX2tleXBhaXJfaWQgY29uc3QgJiBpZCkKewogIHJlc3VsdHMgcmVzOwogIGZldGNoKHJl
cywgb25lX2NvbCwgYW55X3Jvd3MsIAoJIlNFTEVDVCBpZCBGUk9NIHB1YmxpY19rZXlzIFdI
RVJFIGlkID0gJyVxJyIsCglpZCgpLmNfc3RyKCkpOwogIEkoKHJlcy5zaXplKCkgPT0gMSkg
fHwgKHJlcy5zaXplKCkgPT0gMCkpOwogIGlmIChyZXMuc2l6ZSgpID09IDEpIAogICAgcmV0
dXJuIHRydWU7CiAgcmV0dXJuIGZhbHNlOwp9Cgpib29sIApkYXRhYmFzZTo6cHJpdmF0ZV9r
ZXlfZXhpc3RzKHJzYV9rZXlwYWlyX2lkIGNvbnN0ICYgaWQpCnsKICByZXN1bHRzIHJlczsK
ICBmZXRjaChyZXMsIG9uZV9jb2wsIGFueV9yb3dzLAoJIlNFTEVDVCBpZCBGUk9NIHByaXZh
dGVfa2V5cyBXSEVSRSBpZCA9ICclcSciLAoJaWQoKS5jX3N0cigpKTsKICBJKChyZXMuc2l6
ZSgpID09IDEpIHx8IChyZXMuc2l6ZSgpID09IDApKTsKICBpZiAocmVzLnNpemUoKSA9PSAx
KQogICAgcmV0dXJuIHRydWU7CiAgcmV0dXJuIGZhbHNlOwp9Cgpib29sIApkYXRhYmFzZTo6
a2V5X2V4aXN0cyhyc2Ffa2V5cGFpcl9pZCBjb25zdCAmIGlkKQp7CiAgcmV0dXJuIHB1Ymxp
Y19rZXlfZXhpc3RzKGlkKSB8fCBwcml2YXRlX2tleV9leGlzdHMoaWQpOwp9Cgp2b2lkIApk
YXRhYmFzZTo6Z2V0X3B1YmtleShoZXhlbmM8aWQ+IGNvbnN0ICYgaGFzaCwgCgkJICAgICBy
c2Ffa2V5cGFpcl9pZCAmIGlkLAoJCSAgICAgYmFzZTY0PHJzYV9wdWJfa2V5PiAmIHB1Yl9l
bmNvZGVkKQp7CiAgcmVzdWx0cyByZXM7CiAgZmV0Y2gocmVzLCAyLCBvbmVfcm93LCAKCSJT
RUxFQ1QgaWQsIGtleWRhdGEgRlJPTSBwdWJsaWNfa2V5cyB3aGVyZSBoYXNoID0gJyVxJyIs
IAoJaGFzaCgpLmNfc3RyKCkpOwogIGlkID0gcmVzWzBdWzBdOwogIHB1Yl9lbmNvZGVkID0g
cmVzWzBdWzFdOwp9Cgp2b2lkIApkYXRhYmFzZTo6Z2V0X2tleShyc2Ffa2V5cGFpcl9pZCBj
b25zdCAmIHB1Yl9pZCwgCgkJICBiYXNlNjQ8cnNhX3B1Yl9rZXk+ICYgcHViX2VuY29kZWQp
CnsKICByZXN1bHRzIHJlczsKICBmZXRjaChyZXMsIG9uZV9jb2wsIG9uZV9yb3csIAoJIlNF
TEVDVCBrZXlkYXRhIEZST00gcHVibGljX2tleXMgd2hlcmUgaWQgPSAnJXEnIiwgCglwdWJf
aWQoKS5jX3N0cigpKTsKICBwdWJfZW5jb2RlZCA9IHJlc1swXVswXTsKfQoKdm9pZCAKZGF0
YWJhc2U6OmdldF9rZXkocnNhX2tleXBhaXJfaWQgY29uc3QgJiBwcml2X2lkLCAKCQkgIGJh
c2U2NDwgYXJjNDxyc2FfcHJpdl9rZXk+ID4gJiBwcml2X2VuY29kZWQpCnsKICByZXN1bHRz
IHJlczsKICBmZXRjaChyZXMsIG9uZV9jb2wsIG9uZV9jb2wsIAoJIlNFTEVDVCBrZXlkYXRh
IEZST00gcHJpdmF0ZV9rZXlzIHdoZXJlIGlkID0gJyVxJyIsIAoJcHJpdl9pZCgpLmNfc3Ry
KCkpOwogIHByaXZfZW5jb2RlZCA9IHJlc1swXVswXTsKfQoKCnZvaWQgCmRhdGFiYXNlOjpw
dXRfa2V5KHJzYV9rZXlwYWlyX2lkIGNvbnN0ICYgcHViX2lkLCAKCQkgIGJhc2U2NDxyc2Ff
cHViX2tleT4gY29uc3QgJiBwdWJfZW5jb2RlZCkKewogIGhleGVuYzxpZD4gdGhhc2g7CiAg
a2V5X2hhc2hfY29kZShwdWJfaWQsIHB1Yl9lbmNvZGVkLCB0aGFzaCk7CiAgZXhlY3V0ZSgi
SU5TRVJUIElOVE8gcHVibGljX2tleXMgVkFMVUVTKCclcScsICclcScsICclcScpIiwgCgkg
IHRoYXNoKCkuY19zdHIoKSwgcHViX2lkKCkuY19zdHIoKSwgcHViX2VuY29kZWQoKS5jX3N0
cigpKTsKfQoKdm9pZCAKZGF0YWJhc2U6OnB1dF9rZXkocnNhX2tleXBhaXJfaWQgY29uc3Qg
JiBwcml2X2lkLCAKCQkgIGJhc2U2NDwgYXJjNDxyc2FfcHJpdl9rZXk+ID4gY29uc3QgJiBw
cml2X2VuY29kZWQpCnsKICAKICBoZXhlbmM8aWQ+IHRoYXNoOwogIGtleV9oYXNoX2NvZGUo
cHJpdl9pZCwgcHJpdl9lbmNvZGVkLCB0aGFzaCk7CiAgZXhlY3V0ZSgiSU5TRVJUIElOVE8g
cHJpdmF0ZV9rZXlzIFZBTFVFUygnJXEnLCAnJXEnLCAnJXEnKSIsIAoJICB0aGFzaCgpLmNf
c3RyKCksIHByaXZfaWQoKS5jX3N0cigpLCBwcml2X2VuY29kZWQoKS5jX3N0cigpKTsKfQoK
dm9pZCAKZGF0YWJhc2U6OnB1dF9rZXlfcGFpcihyc2Ffa2V5cGFpcl9pZCBjb25zdCAmIGlk
LCAKCQkgICAgICAgYmFzZTY0PHJzYV9wdWJfa2V5PiBjb25zdCAmIHB1Yl9lbmNvZGVkLAoJ
CSAgICAgICBiYXNlNjQ8IGFyYzQ8cnNhX3ByaXZfa2V5PiA+IGNvbnN0ICYgcHJpdl9lbmNv
ZGVkKQp7CiAgdHJhbnNhY3Rpb25fZ3VhcmQgZ3VhcmQoKnRoaXMpOwogIHB1dF9rZXkoaWQs
IHB1Yl9lbmNvZGVkKTsKICBwdXRfa2V5KGlkLCBwcml2X2VuY29kZWQpOwogIGd1YXJkLmNv
bW1pdCgpOwp9Cgp2b2lkCmRhdGFiYXNlOjpkZWxldGVfcHJpdmF0ZV9rZXkocnNhX2tleXBh
aXJfaWQgY29uc3QgJiBwdWJfaWQpCnsKICBleGVjdXRlKCJERUxFVEUgRlJPTSBwcml2YXRl
X2tleXMgV0hFUkUgaWQgPSAnJXEnIiwKCSAgcHViX2lkKCkuY19zdHIoKSk7Cn0KCi8vIGNl
cnQgbWFuYWdlbWVudAoKYm9vbCAKZGF0YWJhc2U6OmNlcnRfZXhpc3RzKGNlcnQgY29uc3Qg
JiB0LAoJCSAgICAgIHN0cmluZyBjb25zdCAmIHRhYmxlKQp7CiAgcmVzdWx0cyByZXM7CiAg
ZmV0Y2gocmVzLCAxLCBhbnlfcm93cywKCSJTRUxFQ1QgaWQgRlJPTSAnJXEnIFdIRVJFIGlk
ID0gJyVxJyAiCgkiQU5EIG5hbWUgPSAnJXEnIEFORCB2YWx1ZSA9ICclcScgIiAKCSJBTkQg
a2V5cGFpciA9ICclcScgQU5EIHNpZ25hdHVyZSA9ICclcScgIiwKCXRhYmxlLmNfc3RyKCks
Cgl0LmlkZW50KCkuY19zdHIoKSwKCXQubmFtZSgpLmNfc3RyKCksCgl0LnZhbHVlKCkuY19z
dHIoKSwKCXQua2V5KCkuY19zdHIoKSwKCXQuc2lnKCkuY19zdHIoKSk7CiAgSShyZXMuc2l6
ZSgpID09IDAgfHwgcmVzLnNpemUoKSA9PSAxKTsKICByZXR1cm4gcmVzLnNpemUoKSA9PSAx
Owp9Cgp2b2lkIApkYXRhYmFzZTo6cHV0X2NlcnQoY2VydCBjb25zdCAmIHQsCgkJICAgc3Ry
aW5nIGNvbnN0ICYgdGFibGUpCnsKICBoZXhlbmM8aWQ+IHRoYXNoOwogIGNlcnRfaGFzaF9j
b2RlKHQsIHRoYXNoKTsKICBleGVjdXRlKCJJTlNFUlQgSU5UTyAnJXEnIFZBTFVFUygnJXEn
LCAnJXEnLCAnJXEnLCAnJXEnLCAnJXEnLCAnJXEnKSIsIAoJICB0YWJsZS5jX3N0cigpLAoJ
ICB0aGFzaCgpLmNfc3RyKCksCgkgIHQuaWRlbnQoKS5jX3N0cigpLAoJICB0Lm5hbWUoKS5j
X3N0cigpLCAKCSAgdC52YWx1ZSgpLmNfc3RyKCksCgkgIHQua2V5KCkuY19zdHIoKSwKCSAg
dC5zaWcoKS5jX3N0cigpKTsKfQoKdm9pZCAKZGF0YWJhc2U6OnJlc3VsdHNfdG9fY2VydHMo
cmVzdWx0cyBjb25zdCAmIHJlcywKCQkJICAgdmVjdG9yPGNlcnQ+ICYgY2VydHMpCnsKICBj
ZXJ0cy5jbGVhcigpOwogIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzLnNpemUoKTsgKytp
KQogICAgewogICAgICBjZXJ0IHQ7CiAgICAgIHQgPSBjZXJ0KGhleGVuYzxpZD4ocmVzW2ld
WzBdKSwgCgkgICAgICBjZXJ0X25hbWUocmVzW2ldWzFdKSwKCSAgICAgIGJhc2U2NDxjZXJ0
X3ZhbHVlPihyZXNbaV1bMl0pLAoJICAgICAgcnNhX2tleXBhaXJfaWQocmVzW2ldWzNdKSwK
CSAgICAgIGJhc2U2NDxyc2Ffc2hhMV9zaWduYXR1cmU+KHJlc1tpXVs0XSkpOwogICAgICBj
ZXJ0cy5wdXNoX2JhY2sodCk7CiAgICB9Cn0KCgpzdHJ1Y3QgdmFsaWRfY2VydHMKewogIHNl
dDxyc2Ffa2V5cGFpcl9pZD4gdmFsaWRfc2lnbmVyczsKICBoZXhlbmM8aWQ+IGlkZW50Owog
IGNlcnRfbmFtZSBuYW1lOwogIGJhc2U2NDxjZXJ0X3ZhbHVlPiB2YWw7CiAgc3RyaW5nIHNp
Z25hdHVyZV90eXBlOwoKICB2YWxpZF9jZXJ0cyhzdHJpbmcgY29uc3QgJiB0eSkgCiAgICA6
IHNpZ25hdHVyZV90eXBlKHR5KSAKICB7CiAgICBMKEYoImNvbnN0cnVjdGluZyB2YWxpZGl0
eSBjaGVja2VyIGZvciAlcyBjZXJ0c1xuIikgJSB0eSk7CiAgfQoKICBib29sIGNoZWNrX3Np
Z25lcl90cnVzdChhcHBfc3RhdGUgJiBhcHApCiAgewogICAgYm9vbCB0cnVzdGVkID0gZmFs
c2U7CgogICAgTChGKCJjaGVja2luZyAlZCBzaWduZXIgJXMgY2VydCB0cnVzdCBzZXRcbiIp
IAogICAgICAlIHZhbGlkX3NpZ25lcnMuc2l6ZSgpICUgc2lnbmF0dXJlX3R5cGUpOwogICAg
dHJ5CiAgICAgIHsKCWNlcnRfdmFsdWUgdjsKCWRlY29kZV9iYXNlNjQodmFsLCB2KTsKCS8v
IEZJWE1FOiBsYW1lIHN0cmluZy1tYWtlcy10aGUtbW9kZSBhcmd1bWVudAoJaWYgKHNpZ25h
dHVyZV90eXBlID09ICJyZXZpc2lvbiIpCgkgIHRydXN0ZWQgPSBhcHAubHVhLmhvb2tfZ2V0
X3JldmlzaW9uX2NlcnRfdHJ1c3QodmFsaWRfc2lnbmVycywKCQkJCQkJCWlkZW50LCBuYW1l
LCB2KTsKCWVsc2UgaWYgKHNpZ25hdHVyZV90eXBlID09ICJtYW5pZmVzdCIpCgkgIHRydXN0
ZWQgPSBhcHAubHVhLmhvb2tfZ2V0X21hbmlmZXN0X2NlcnRfdHJ1c3QodmFsaWRfc2lnbmVy
cywKCQkJCQkJCSBpZGVudCwgbmFtZSwgdik7CgllbHNlIGlmIChzaWduYXR1cmVfdHlwZSA9
PSAiZmlsZSIpCgkgIHRydXN0ZWQgPSBhcHAubHVhLmhvb2tfZ2V0X2ZpbGVfY2VydF90cnVz
dCh2YWxpZF9zaWduZXJzLAoJCQkJCQkgICAgIGlkZW50LCBuYW1lLCB2KTsKCWVsc2UKCSAg
SShmYWxzZSk7IC8vIHNob3VsZCBiZSBpbGxlZ2FsCiAgICAgIH0KICAgIGNhdGNoICguLi4p
CiAgICAgIHsKCVcoRigiZXhjZXB0aW9uIGluIHNxbGl0ZSB2YWxpZF9jZXJ0czo6Y2hlY2tf
c2V0X3RydXN0XG4iKSk7CiAgICAgIH0KICAgIAogICAgaWYgKHRydXN0ZWQpCiAgICAgIEwo
RigidHJ1c3QgZnVuY3Rpb24gbGlrZWQgJWQgJXMgc2lnbmVyc1xuIikgCgklIHZhbGlkX3Np
Z25lcnMuc2l6ZSgpICUgc2lnbmF0dXJlX3R5cGUpOwogICAgZWxzZQogICAgICBMKEYoInRy
dXN0IGZ1bmN0aW9uIGRpc2xpa2VkICVkICVzIHNpZ25lcnNcbiIpIAoJJSB2YWxpZF9zaWdu
ZXJzLnNpemUoKSAlIHNpZ25hdHVyZV90eXBlKTsKICAgIAogICAgcmV0dXJuIHRydXN0ZWQ7
CiAgfQoKICB2b2lkIGNoZWNrX3NpbmdsZV9zaWduZXIoYXBwX3N0YXRlICYgYXBwLAoJCQkg
ICBpbnQgYXJnYywgCgkJCSAgIGNoYXIgY29uc3QgKiogYXJndikKICB7CiAgICB0cnkKICAg
ICAgewoJLy8gYXJncyBhcmU6IGhhc2gsIGlkLCBuYW1lLCB2YWx1ZSwga2V5cGFpciwgcHVi
a2V5LCBzaWduYXR1cmUKCS8vIEwoRigiZW50cmllcyBhcmUgWyVzXSBbJXNdIFslc10gWyVz
XSBbJXNdIFslc10gWyVzXVxuIikgCgkvLyAJICAlIGFyZ3ZbMF0gJSBhcmd2WzFdICUgYXJn
dlsyXSAlIGFyZ3ZbM10gJSBhcmd2WzRdICUgYXJndls1XSAlIGFyZ3ZbNl0pOwoKCWNlcnQg
dG1wID0gY2VydChoZXhlbmM8aWQ+KGFyZ3ZbMV0pLCAKCQkJY2VydF9uYW1lKGFyZ3ZbMl0p
LAoJCQliYXNlNjQ8Y2VydF92YWx1ZT4oYXJndlszXSksCgkJCXJzYV9rZXlwYWlyX2lkKGFy
Z3ZbNF0pLAoJCQliYXNlNjQ8cnNhX3NoYTFfc2lnbmF0dXJlPihhcmd2WzZdKSk7CgoJYmFz
ZTY0PHJzYV9wdWJfa2V5PiBwayhhcmd2WzVdKTsKCglpZiAoaWRlbnQoKS5lbXB0eSgpKQoJ
ICBpZGVudCA9IHRtcC5pZGVudDsKCWVsc2UKCSAgSShpZGVudCA9PSB0bXAuaWRlbnQpOwoK
CWlmIChuYW1lKCkuZW1wdHkoKSkKCSAgbmFtZSA9IHRtcC5uYW1lOwoJZWxzZQoJICBJKG5h
bWUgPT0gdG1wLm5hbWUpOwoKCWlmICh2YWwoKS5lbXB0eSgpKQoJICB2YWwgPSB0bXAudmFs
dWU7CgllbHNlCgkgIEkodmFsID09IHRtcC52YWx1ZSk7CgoJLy8gCUwoRigiZXhhbWluaW5n
ICclcycgJXMgY2VydCBmcm9tICVzXG4iKSAKCS8vIAkgICUgbmFtZSAlIHNpZ25hdHVyZV90
eXBlICUgaWRlbnQpOwoKCXN0cmluZyB0eHQ7CgljZXJ0X3NpZ25hYmxlX3RleHQodG1wLCB0
eHQpOwoJaWYgKGNoZWNrX3NpZ25hdHVyZShhcHAubHVhLCB0bXAua2V5LCBwaywgdHh0LCB0
bXAuc2lnKSkKCSAgewoJICAgIEwoRigib2sgJyVzJyAlcyBjZXJ0IGZyb20gJXNcbiIpIAoJ
ICAgICAgJSBuYW1lICUgc2lnbmF0dXJlX3R5cGUgJSB0bXAua2V5KTsKCSAgICB2YWxpZF9z
aWduZXJzLmluc2VydCh0bXAua2V5KTsKCSAgfQoJZWxzZQoJICB7CgkgICAgVyhGKCJiYWQg
JyVzJyAlcyBjZXJ0IGZyb20gJXNcbiIpIAoJICAgICAgJSBuYW1lICUgc2lnbmF0dXJlX3R5
cGUgJSB0bXAua2V5KTsKCSAgfQogICAgICB9CiAgICBjYXRjaCAoc3RkOjpleGNlcHRpb24g
JiBlKQogICAgICB7CglXKEYoInN0ZDo6ZXhjZXB0aW9uIGluIHNxbGl0ZSB2YWxpZF9jZXJ0
czo6Y2hlY2tfc2luZ2xlX3NpZ25lcjogJXNcbiIpICUgZS53aGF0KCkpOwogICAgICB9CiAg
ICBjYXRjaCAoLi4uKQogICAgICB7CglXKEYoInVua25vd24gZXhjZXB0aW9uIGluIHNxbGl0
ZSB2YWxpZF9jZXJ0czo6Y2hlY2tfc2luZ2xlX3NpZ25lclxuIikpOwogICAgICB9CiAgfQp9
OwoKZXh0ZXJuICJDIgp7CgpzdGF0aWMgdm9pZAp0cnVzdGVkX3N0ZXBfY2FsbGJhY2soc3Fs
aXRlX2Z1bmMgKiBmbl9jdHgsIAoJCSAgICAgIGludCBhcmdjLCAKCQkgICAgICBjaGFyIGNv
bnN0ICoqIGFyZ3YpCnsKICBhcHBfc3RhdGUgKiBhcHAgPSBOVUxMOyAKICB2YWxpZF9jZXJ0
cyAqKiB2cHA7CgogIEkoZm5fY3R4KTsKICBJKGFyZ2MgPT0gOCk7CiAgSShhcmd2KTsKICBm
b3IgKHNpemVfdCBpID0gMDsgaSA8IDg7ICsraSkKICAgIEkoYXJndltpXSk7CgogIGFwcCA9
IHN0YXRpY19jYXN0PGFwcF9zdGF0ZSAqPihzcWxpdGVfdXNlcl9kYXRhKGZuX2N0eCkpOwog
IEkoYXBwKTsKICB2cHAgPSBzdGF0aWNfY2FzdDx2YWxpZF9jZXJ0cyAqKj4oc3FsaXRlX2Fn
Z3JlZ2F0ZV9jb250ZXh0KGZuX2N0eCwgc2l6ZW9mKHZhbGlkX2NlcnRzICopKSk7CiAgSSh2
cHApOwogIGlmICghICgqdnBwKSkKICAgICp2cHAgPSBuZXcgdmFsaWRfY2VydHMoc3RyaW5n
KGFyZ3ZbMF0pKTsKICBJKCp2cHApOwogICgqdnBwKS0+Y2hlY2tfc2luZ2xlX3NpZ25lcigq
YXBwLCBhcmdjLTEsIGFyZ3YrMSk7ICAKfQoKc3RhdGljIHZvaWQKdHJ1c3RlZF9maW5hbGl6
ZV9jYWxsYmFjayhzcWxpdGVfZnVuYyAqIGZuX2N0eCkKewogIGFwcF9zdGF0ZSAqIGFwcCA9
IE5VTEw7IAogIHZhbGlkX2NlcnRzICoqIHZwcDsKICBhcHAgPSBzdGF0aWNfY2FzdDxhcHBf
c3RhdGUgKj4oc3FsaXRlX3VzZXJfZGF0YShmbl9jdHgpKTsKICBJKGFwcCk7CiAgdnBwID0g
c3RhdGljX2Nhc3Q8dmFsaWRfY2VydHMgKio+KHNxbGl0ZV9hZ2dyZWdhdGVfY29udGV4dChm
bl9jdHgsIHNpemVvZih2YWxpZF9jZXJ0cyAqKSkpOwoKICBJKHZwcCk7CiAgSSgqdnBwKTsK
CiAgaWYgKCgqdnBwKS0+Y2hlY2tfc2lnbmVyX3RydXN0KCphcHApKQogICAgc3FsaXRlX3Nl
dF9yZXN1bHRfaW50KGZuX2N0eCwgMSk7CiAgZWxzZQogICAgc3FsaXRlX3NldF9yZXN1bHRf
aW50KGZuX2N0eCwgMCk7CgogIGRlbGV0ZSAoKnZwcCk7Cn0KfQoKCnZvaWQKZGF0YWJhc2U6
Omluc3RhbGxfZnVuY3Rpb25zKGFwcF9zdGF0ZSAqIGFwcCkKewogIC8vIHJlZ2lzdGVyIGFu
eSBmdW5jdGlvbnMgd2UncmUgZ29pbmcgdG8gdXNlCiAgSShzcWxpdGVfY3JlYXRlX2Z1bmN0
aW9uKHNxbCgpLCAidW5iYXNlNjQiLCAtMSwgCgkJCSAgICZzcWxpdGVfdW5iYXNlNjRfZm4s
IAoJCQkgICBOVUxMKSA9PSAwKTsKCiAgSShzcWxpdGVfY3JlYXRlX2FnZ3JlZ2F0ZShzcWwo
KSwgInRydXN0ZWQiLCA4LCAKCQkJICAgICZ0cnVzdGVkX3N0ZXBfY2FsbGJhY2ssCgkJCSAg
ICAmdHJ1c3RlZF9maW5hbGl6ZV9jYWxsYmFjaywKCQkJICAgIGFwcCkgPT0gMCk7Cn0KCnZv
aWQKZGF0YWJhc2U6Omluc3RhbGxfdmlld3MoKQp7CiAgLy8gZGVsZXRlIGFueSBleGlzdGlu
ZyB2aWV3cwogIHJlc3VsdHMgcmVzOwogIGZldGNoKHJlcywgb25lX2NvbCwgYW55X3Jvd3Ms
CgkiU0VMRUNUIG5hbWUgRlJPTSBzcWxpdGVfbWFzdGVyIFdIRVJFIHR5cGU9J3ZpZXcnIik7
CiAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXMuc2l6ZSgpOyArK2kpCiAgICB7CiAgICAg
IGV4ZWN1dGUoIkRST1AgVklFVyAnJXEnIiwgcmVzW2ldWzBdLmNfc3RyKCkpOwogICAgfQog
IC8vIHJlZ2lzdGVyIGFueSB2aWV3cyB3ZSdyZSBnb2luZyB0byB1c2UKICBleGVjdXRlKHZp
ZXdzX2NvbnN0YW50KTsKfQoKdm9pZCAKZGF0YWJhc2U6OmdldF9oZWFkcyhiYXNlNjQ8Y2Vy
dF92YWx1ZT4gY29uc3QgJiBicmFuY2gsCgkJICAgIHN0ZDo6c2V0PHJldmlzaW9uX2lkPiAm
IGhlYWRzKQp7CiAgcmVzdWx0cyByZXM7CiAgZmV0Y2gocmVzLCBvbmVfY29sLCBhbnlfcm93
cywKCSJTRUxFQ1QgaWQgIgoJIkZST00gYnJhbmNoX2hlYWRzICIKCSJXSEVSRSB2YWx1ZSA9
ICclcSciLAoJYnJhbmNoKCkuY19zdHIoKSk7CiAgaGVhZHMuY2xlYXIoKTsKICBmb3IgKHNp
emVfdCBpID0gMDsgaSA8IHJlcy5zaXplKCk7ICsraSkKICAgIHsKICAgICAgaGVhZHMuaW5z
ZXJ0KHJldmlzaW9uX2lkKHJlc1tpXVswXSkpOwogICAgfQp9Cgp2b2lkIApkYXRhYmFzZTo6
Z2V0X2NlcnRzKGhleGVuYzxpZD4gY29uc3QgJiBpZGVudCwgCgkJICAgIHZlY3RvcjxjZXJ0
PiAmIGNlcnRzLAkJCQoJCSAgICBzdHJpbmcgY29uc3QgJiB0YWJsZSkKewogIHJlc3VsdHMg
cmVzOwogIGZldGNoKHJlcywgNSwgYW55X3Jvd3MsIAoJIlNFTEVDVCBpZCwgbmFtZSwgdmFs
dWUsIGtleXBhaXIsIHNpZ25hdHVyZSBGUk9NICclcScgIgoJIldIRVJFIGlkID0gJyVxJyIs
IAoJdGFibGUuY19zdHIoKSwgCQoJaWRlbnQoKS5jX3N0cigpKTsKICByZXN1bHRzX3RvX2Nl
cnRzKHJlcywgY2VydHMpOwp9CgoKdm9pZCAKZGF0YWJhc2U6OmdldF9jZXJ0cyhjZXJ0X25h
bWUgY29uc3QgJiBuYW1lLCAJICAgICAgCgkJICAgIHZlY3RvcjxjZXJ0PiAmIGNlcnRzLAoJ
CSAgICBzdHJpbmcgY29uc3QgJiB0YWJsZSkKewogIHJlc3VsdHMgcmVzOwogIGZldGNoKHJl
cywgNSwgYW55X3Jvd3MsIAoJIlNFTEVDVCBpZCwgbmFtZSwgdmFsdWUsIGtleXBhaXIsIHNp
Z25hdHVyZSAiCgkiRlJPTSAnJXEnIFdIRVJFIG5hbWUgPSAnJXEnIiwgCgl0YWJsZS5jX3N0
cigpLCAJCgluYW1lKCkuY19zdHIoKSk7CiAgcmVzdWx0c190b19jZXJ0cyhyZXMsIGNlcnRz
KTsKfQoKCnZvaWQgCmRhdGFiYXNlOjpnZXRfY2VydHMoaGV4ZW5jPGlkPiBjb25zdCAmIGlk
ZW50LCAKCQkgICAgY2VydF9uYW1lIGNvbnN0ICYgbmFtZSwgCSAgICAgIAoJCSAgICB2ZWN0
b3I8Y2VydD4gJiBjZXJ0cywKCQkgICAgc3RyaW5nIGNvbnN0ICYgdGFibGUpCnsKICByZXN1
bHRzIHJlczsKICBmZXRjaChyZXMsIDUsIGFueV9yb3dzLCAKCSJTRUxFQ1QgaWQsIG5hbWUs
IHZhbHVlLCBrZXlwYWlyLCBzaWduYXR1cmUgIgoJIkZST00gJyVxJyAiCgkiV0hFUkUgaWQg
PSAnJXEnIEFORCBuYW1lID0gJyVxJyIsIAoJdGFibGUuY19zdHIoKSwgCQoJaWRlbnQoKS5j
X3N0cigpLAoJbmFtZSgpLmNfc3RyKCkpOwogIHJlc3VsdHNfdG9fY2VydHMocmVzLCBjZXJ0
cyk7Cn0KCnZvaWQgCmRhdGFiYXNlOjpnZXRfY2VydHMoY2VydF9uYW1lIGNvbnN0ICYgbmFt
ZSwKCQkgICAgYmFzZTY0PGNlcnRfdmFsdWU+IGNvbnN0ICYgdmFsLCAKCQkgICAgdmVjdG9y
PGNlcnQ+ICYgY2VydHMsCgkJICAgIHN0cmluZyBjb25zdCAmIHRhYmxlKQp7CiAgcmVzdWx0
cyByZXM7CiAgZmV0Y2gocmVzLCA1LCBhbnlfcm93cywgCgkiU0VMRUNUIGlkLCBuYW1lLCB2
YWx1ZSwga2V5cGFpciwgc2lnbmF0dXJlICIKCSJGUk9NICclcScgIgoJIldIRVJFIG5hbWUg
PSAnJXEnIEFORCB2YWx1ZSA9ICclcSciLCAKCXRhYmxlLmNfc3RyKCksIAkKCW5hbWUoKS5j
X3N0cigpLAoJdmFsKCkuY19zdHIoKSk7CiAgcmVzdWx0c190b19jZXJ0cyhyZXMsIGNlcnRz
KTsKfQoKCnZvaWQgCmRhdGFiYXNlOjpnZXRfY2VydHMoaGV4ZW5jPGlkPiBjb25zdCAmIGlk
ZW50LCAKCQkgICAgY2VydF9uYW1lIGNvbnN0ICYgbmFtZSwgCSAgICAgIAoJCSAgICBiYXNl
NjQ8Y2VydF92YWx1ZT4gY29uc3QgJiB2YWx1ZSwKCQkgICAgdmVjdG9yPGNlcnQ+ICYgY2Vy
dHMsCgkJICAgIHN0cmluZyBjb25zdCAmIHRhYmxlKQp7CiAgcmVzdWx0cyByZXM7CiAgZmV0
Y2gocmVzLCA1LCBhbnlfcm93cywgCgkiU0VMRUNUIGlkLCBuYW1lLCB2YWx1ZSwga2V5cGFp
ciwgc2lnbmF0dXJlICIKCSJGUk9NICclcScgIgoJIldIRVJFIGlkID0gJyVxJyBBTkQgbmFt
ZSA9ICclcScgQU5EIHZhbHVlID0gJyVxJyIsIAoJdGFibGUuY19zdHIoKSwgCQoJaWRlbnQo
KS5jX3N0cigpLAoJbmFtZSgpLmNfc3RyKCksCgl2YWx1ZSgpLmNfc3RyKCkpOwogIHJlc3Vs
dHNfdG9fY2VydHMocmVzLCBjZXJ0cyk7Cn0KCgoKYm9vbCAKZGF0YWJhc2U6OnJldmlzaW9u
X2NlcnRfZXhpc3RzKHJldmlzaW9uPGNlcnQ+IGNvbnN0ICYgY2VydCkKeyAKICByZXR1cm4g
Y2VydF9leGlzdHMoY2VydC5pbm5lcigpLCAicmV2aXNpb25fY2VydHMiKTsgCn0KCmJvb2wg
CmRhdGFiYXNlOjptYW5pZmVzdF9jZXJ0X2V4aXN0cyhtYW5pZmVzdDxjZXJ0PiBjb25zdCAm
IGNlcnQpCnsgCiAgcmV0dXJuIGNlcnRfZXhpc3RzKGNlcnQuaW5uZXIoKSwgIm1hbmlmZXN0
X2NlcnRzIik7IAp9Cgpib29sIApkYXRhYmFzZTo6ZmlsZV9jZXJ0X2V4aXN0cyhmaWxlPGNl
cnQ+IGNvbnN0ICYgY2VydCkKeyAKICByZXR1cm4gY2VydF9leGlzdHMoY2VydC5pbm5lcigp
LCAiZmlsZV9jZXJ0cyIpOyAKfQoKdm9pZCAKZGF0YWJhc2U6OnB1dF9tYW5pZmVzdF9jZXJ0
KG1hbmlmZXN0PGNlcnQ+IGNvbnN0ICYgY2VydCkKeyAKICBwdXRfY2VydChjZXJ0LmlubmVy
KCksICJtYW5pZmVzdF9jZXJ0cyIpOyAKfQoKdm9pZCAKZGF0YWJhc2U6OnB1dF9yZXZpc2lv
bl9jZXJ0KHJldmlzaW9uPGNlcnQ+IGNvbnN0ICYgY2VydCkKeyAKICBwdXRfY2VydChjZXJ0
LmlubmVyKCksICJyZXZpc2lvbl9jZXJ0cyIpOyAKfQoKdm9pZCAKZGF0YWJhc2U6OnB1dF9m
aWxlX2NlcnQoZmlsZTxjZXJ0PiBjb25zdCAmIGNlcnQpCnsgCiAgcHV0X2NlcnQoY2VydC5p
bm5lcigpLCAiZmlsZV9jZXJ0cyIpOyAKfQoKdm9pZCAKZGF0YWJhc2U6OmdldF9maWxlX2Nl
cnRzKGNlcnRfbmFtZSBjb25zdCAmIG5hbWUsIAoJCQkgdmVjdG9yPCBmaWxlPGNlcnQ+ID4g
JiB0cykKewogIHZlY3RvcjxjZXJ0PiBjZXJ0czsKICBnZXRfY2VydHMobmFtZSwgY2VydHMs
ICJmaWxlX2NlcnRzIik7CiAgdHMuY2xlYXIoKTsKICBjb3B5KGNlcnRzLmJlZ2luKCksIGNl
cnRzLmVuZCgpLCBiYWNrX2luc2VydGVyKHRzKSk7ICAKfQoKdm9pZCAKZGF0YWJhc2U6Omdl
dF9maWxlX2NlcnRzKGZpbGVfaWQgY29uc3QgJiBpZCwgCgkJCSBjZXJ0X25hbWUgY29uc3Qg
JiBuYW1lLCAKCQkJIHZlY3RvcjwgZmlsZTxjZXJ0PiA+ICYgdHMpCnsKICB2ZWN0b3I8Y2Vy
dD4gY2VydHM7CiAgZ2V0X2NlcnRzKGlkLmlubmVyKCksIG5hbWUsIGNlcnRzLCAiZmlsZV9j
ZXJ0cyIpOwogIHRzLmNsZWFyKCk7CiAgY29weShjZXJ0cy5iZWdpbigpLCBjZXJ0cy5lbmQo
KSwgYmFja19pbnNlcnRlcih0cykpOyAgICAKfQoKdm9pZCAKZGF0YWJhc2U6OmdldF9maWxl
X2NlcnRzKGNlcnRfbmFtZSBjb25zdCAmIG5hbWUsCgkJCSBiYXNlNjQ8Y2VydF92YWx1ZT4g
Y29uc3QgJiB2YWwsIAoJCQkgdmVjdG9yPCBmaWxlPGNlcnQ+ID4gJiB0cykKewogIHZlY3Rv
cjxjZXJ0PiBjZXJ0czsKICBnZXRfY2VydHMobmFtZSwgdmFsLCBjZXJ0cywgImZpbGVfY2Vy
dHMiKTsKICB0cy5jbGVhcigpOwogIGNvcHkoY2VydHMuYmVnaW4oKSwgY2VydHMuZW5kKCks
IGJhY2tfaW5zZXJ0ZXIodHMpKTsgIAp9Cgp2b2lkIApkYXRhYmFzZTo6Z2V0X2ZpbGVfY2Vy
dHMoZmlsZV9pZCBjb25zdCAmIGlkLCAKCQkJIGNlcnRfbmFtZSBjb25zdCAmIG5hbWUsCgkJ
CSBiYXNlNjQ8Y2VydF92YWx1ZT4gY29uc3QgJiB2YWwsIAoJCQkgdmVjdG9yPCBmaWxlPGNl
cnQ+ID4gJiB0cykKewogIHZlY3RvcjxjZXJ0PiBjZXJ0czsKICBnZXRfY2VydHMoaWQuaW5u
ZXIoKSwgbmFtZSwgdmFsLCBjZXJ0cywgImZpbGVfY2VydHMiKTsKICB0cy5jbGVhcigpOwog
IGNvcHkoY2VydHMuYmVnaW4oKSwgY2VydHMuZW5kKCksIGJhY2tfaW5zZXJ0ZXIodHMpKTsg
IAp9Cgp2b2lkIApkYXRhYmFzZTo6Z2V0X2ZpbGVfY2VydHMoZmlsZV9pZCBjb25zdCAmIGlk
LCAKCQkJIHZlY3RvcjwgZmlsZTxjZXJ0PiA+ICYgdHMpCnsgCiAgdmVjdG9yPGNlcnQ+IGNl
cnRzOwogIGdldF9jZXJ0cyhpZC5pbm5lcigpLCBjZXJ0cywgImZpbGVfY2VydHMiKTsgCiAg
dHMuY2xlYXIoKTsKICBjb3B5KGNlcnRzLmJlZ2luKCksIGNlcnRzLmVuZCgpLCBiYWNrX2lu
c2VydGVyKHRzKSk7Cn0KCgpib29sIApkYXRhYmFzZTo6ZmlsZV9jZXJ0X2V4aXN0cyhoZXhl
bmM8aWQ+IGNvbnN0ICYgaGFzaCkKewogIHJlc3VsdHMgcmVzOwogIHZlY3RvcjxjZXJ0PiBj
ZXJ0czsKICBmZXRjaChyZXMsIG9uZV9jb2wsIGFueV9yb3dzLCAKCSJTRUxFQ1QgaWQgIgoJ
IkZST00gZmlsZV9jZXJ0cyAiCgkiV0hFUkUgaGFzaCA9ICclcSciLCAKCWhhc2goKS5jX3N0
cigpKTsKICBJKHJlcy5zaXplKCkgPT0gMCB8fCByZXMuc2l6ZSgpID09IDEpOwogIHJldHVy
biAocmVzLnNpemUoKSA9PSAxKTsKfQoKdm9pZCAKZGF0YWJhc2U6OmdldF9maWxlX2NlcnQo
aGV4ZW5jPGlkPiBjb25zdCAmIGhhc2gsCgkJCWZpbGU8Y2VydD4gJiBjKQp7CiAgcmVzdWx0
cyByZXM7CiAgdmVjdG9yPGNlcnQ+IGNlcnRzOwogIGZldGNoKHJlcywgNSwgb25lX3Jvdywg
CgkiU0VMRUNUIGlkLCBuYW1lLCB2YWx1ZSwga2V5cGFpciwgc2lnbmF0dXJlICIKCSJGUk9N
IGZpbGVfY2VydHMgIgoJIldIRVJFIGhhc2ggPSAnJXEnIiwgCgloYXNoKCkuY19zdHIoKSk7
CiAgcmVzdWx0c190b19jZXJ0cyhyZXMsIGNlcnRzKTsKICBJKGNlcnRzLnNpemUoKSA9PSAx
KTsKICBjID0gZmlsZTxjZXJ0PihjZXJ0c1swXSk7Cn0KCgoKdm9pZCAKZGF0YWJhc2U6Omdl
dF9yZXZpc2lvbl9jZXJ0cyhjZXJ0X25hbWUgY29uc3QgJiBuYW1lLCAKCQkJICAgIHZlY3Rv
cjwgcmV2aXNpb248Y2VydD4gPiAmIHRzKQp7CiAgdmVjdG9yPGNlcnQ+IGNlcnRzOwogIGdl
dF9jZXJ0cyhuYW1lLCBjZXJ0cywgInJldmlzaW9uX2NlcnRzIik7CiAgdHMuY2xlYXIoKTsK
ICBjb3B5KGNlcnRzLmJlZ2luKCksIGNlcnRzLmVuZCgpLCBiYWNrX2luc2VydGVyKHRzKSk7
ICAKfQoKdm9pZCAKZGF0YWJhc2U6OmdldF9yZXZpc2lvbl9jZXJ0cyhyZXZpc2lvbl9pZCBj
b25zdCAmIGlkLCAKCQkJICAgIGNlcnRfbmFtZSBjb25zdCAmIG5hbWUsIAoJCQkgICAgdmVj
dG9yPCByZXZpc2lvbjxjZXJ0PiA+ICYgdHMpCnsKICB2ZWN0b3I8Y2VydD4gY2VydHM7CiAg
Z2V0X2NlcnRzKGlkLmlubmVyKCksIG5hbWUsIGNlcnRzLCAicmV2aXNpb25fY2VydHMiKTsK
ICB0cy5jbGVhcigpOwogIGNvcHkoY2VydHMuYmVnaW4oKSwgY2VydHMuZW5kKCksIGJhY2tf
aW5zZXJ0ZXIodHMpKTsgIAp9Cgp2b2lkIApkYXRhYmFzZTo6Z2V0X3JldmlzaW9uX2NlcnRz
KHJldmlzaW9uX2lkIGNvbnN0ICYgaWQsIAoJCQkgICAgY2VydF9uYW1lIGNvbnN0ICYgbmFt
ZSwKCQkJICAgIGJhc2U2NDxjZXJ0X3ZhbHVlPiBjb25zdCAmIHZhbCwgCgkJCSAgICB2ZWN0
b3I8IHJldmlzaW9uPGNlcnQ+ID4gJiB0cykKewogIHZlY3RvcjxjZXJ0PiBjZXJ0czsKICBn
ZXRfY2VydHMoaWQuaW5uZXIoKSwgbmFtZSwgdmFsLCBjZXJ0cywgInJldmlzaW9uX2NlcnRz
Iik7CiAgdHMuY2xlYXIoKTsKICBjb3B5KGNlcnRzLmJlZ2luKCksIGNlcnRzLmVuZCgpLCBi
YWNrX2luc2VydGVyKHRzKSk7ICAKfQoKdm9pZCAKZGF0YWJhc2U6OmdldF9yZXZpc2lvbl9j
ZXJ0cyhjZXJ0X25hbWUgY29uc3QgJiBuYW1lLAoJCQkgICAgYmFzZTY0PGNlcnRfdmFsdWU+
IGNvbnN0ICYgdmFsLCAKCQkJICAgIHZlY3RvcjwgcmV2aXNpb248Y2VydD4gPiAmIHRzKQp7
CiAgdmVjdG9yPGNlcnQ+IGNlcnRzOwogIGdldF9jZXJ0cyhuYW1lLCB2YWwsIGNlcnRzLCAi
cmV2aXNpb25fY2VydHMiKTsKICB0cy5jbGVhcigpOwogIGNvcHkoY2VydHMuYmVnaW4oKSwg
Y2VydHMuZW5kKCksIGJhY2tfaW5zZXJ0ZXIodHMpKTsgIAp9Cgp2b2lkIApkYXRhYmFzZTo6
Z2V0X3JldmlzaW9uX2NlcnRzKHJldmlzaW9uX2lkIGNvbnN0ICYgaWQsIAoJCQkgICAgdmVj
dG9yPCByZXZpc2lvbjxjZXJ0PiA+ICYgdHMpCnsgCiAgdmVjdG9yPGNlcnQ+IGNlcnRzOwog
IGdldF9jZXJ0cyhpZC5pbm5lcigpLCBjZXJ0cywgInJldmlzaW9uX2NlcnRzIik7IAogIHRz
LmNsZWFyKCk7CiAgY29weShjZXJ0cy5iZWdpbigpLCBjZXJ0cy5lbmQoKSwgYmFja19pbnNl
cnRlcih0cykpOwp9Cgp2b2lkIApkYXRhYmFzZTo6Z2V0X3JldmlzaW9uX2NlcnQoaGV4ZW5j
PGlkPiBjb25zdCAmIGhhc2gsCgkJCSAgIHJldmlzaW9uPGNlcnQ+ICYgYykKewogIHJlc3Vs
dHMgcmVzOwogIHZlY3RvcjxjZXJ0PiBjZXJ0czsKICBmZXRjaChyZXMsIDUsIG9uZV9yb3cs
IAoJIlNFTEVDVCBpZCwgbmFtZSwgdmFsdWUsIGtleXBhaXIsIHNpZ25hdHVyZSAiCgkiRlJP
TSByZXZpc2lvbl9jZXJ0cyAiCgkiV0hFUkUgaGFzaCA9ICclcSciLCAKCWhhc2goKS5jX3N0
cigpKTsKICByZXN1bHRzX3RvX2NlcnRzKHJlcywgY2VydHMpOwogIEkoY2VydHMuc2l6ZSgp
ID09IDEpOwogIGMgPSByZXZpc2lvbjxjZXJ0PihjZXJ0c1swXSk7Cn0KCmJvb2wgCmRhdGFi
YXNlOjpyZXZpc2lvbl9jZXJ0X2V4aXN0cyhoZXhlbmM8aWQ+IGNvbnN0ICYgaGFzaCkKewog
IHJlc3VsdHMgcmVzOwogIHZlY3RvcjxjZXJ0PiBjZXJ0czsKICBmZXRjaChyZXMsIG9uZV9j
b2wsIGFueV9yb3dzLCAKCSJTRUxFQ1QgaWQgIgoJIkZST00gcmV2aXNpb25fY2VydHMgIgoJ
IldIRVJFIGhhc2ggPSAnJXEnIiwgCgloYXNoKCkuY19zdHIoKSk7CiAgSShyZXMuc2l6ZSgp
ID09IDAgfHwgcmVzLnNpemUoKSA9PSAxKTsKICByZXR1cm4gKHJlcy5zaXplKCkgPT0gMSk7
Cn0KCmJvb2wgCmRhdGFiYXNlOjptYW5pZmVzdF9jZXJ0X2V4aXN0cyhoZXhlbmM8aWQ+IGNv
bnN0ICYgaGFzaCkKewogIHJlc3VsdHMgcmVzOwogIHZlY3RvcjxjZXJ0PiBjZXJ0czsKICBm
ZXRjaChyZXMsIG9uZV9jb2wsIGFueV9yb3dzLCAKCSJTRUxFQ1QgaWQgIgoJIkZST00gbWFu
aWZlc3RfY2VydHMgIgoJIldIRVJFIGhhc2ggPSAnJXEnIiwgCgloYXNoKCkuY19zdHIoKSk7
CiAgSShyZXMuc2l6ZSgpID09IDAgfHwgcmVzLnNpemUoKSA9PSAxKTsKICByZXR1cm4gKHJl
cy5zaXplKCkgPT0gMSk7Cn0KCnZvaWQgCmRhdGFiYXNlOjpnZXRfbWFuaWZlc3RfY2VydCho
ZXhlbmM8aWQ+IGNvbnN0ICYgaGFzaCwKCQkJICAgIG1hbmlmZXN0PGNlcnQ+ICYgYykKewog
IHJlc3VsdHMgcmVzOwogIHZlY3RvcjxjZXJ0PiBjZXJ0czsKICBmZXRjaChyZXMsIDUsIG9u
ZV9yb3csIAoJIlNFTEVDVCBpZCwgbmFtZSwgdmFsdWUsIGtleXBhaXIsIHNpZ25hdHVyZSAi
CgkiRlJPTSBtYW5pZmVzdF9jZXJ0cyAiCgkiV0hFUkUgaGFzaCA9ICclcSciLCAKCWhhc2go
KS5jX3N0cigpKTsKICByZXN1bHRzX3RvX2NlcnRzKHJlcywgY2VydHMpOwogIEkoY2VydHMu
c2l6ZSgpID09IDEpOwogIGMgPSBtYW5pZmVzdDxjZXJ0PihjZXJ0c1swXSk7Cn0KCnZvaWQg
CmRhdGFiYXNlOjpnZXRfbWFuaWZlc3RfY2VydHMobWFuaWZlc3RfaWQgY29uc3QgJiBpZCwg
CgkJCSAgICAgdmVjdG9yPCBtYW5pZmVzdDxjZXJ0PiA+ICYgdHMpCnsgCiAgdmVjdG9yPGNl
cnQ+IGNlcnRzOwogIGdldF9jZXJ0cyhpZC5pbm5lcigpLCBjZXJ0cywgIm1hbmlmZXN0X2Nl
cnRzIik7IAogIHRzLmNsZWFyKCk7CiAgY29weShjZXJ0cy5iZWdpbigpLCBjZXJ0cy5lbmQo
KSwgYmFja19pbnNlcnRlcih0cykpOwp9CgoKdm9pZCAKZGF0YWJhc2U6OmdldF9tYW5pZmVz
dF9jZXJ0cyhjZXJ0X25hbWUgY29uc3QgJiBuYW1lLCAKCQkJICAgIHZlY3RvcjwgbWFuaWZl
c3Q8Y2VydD4gPiAmIHRzKQp7CiAgdmVjdG9yPGNlcnQ+IGNlcnRzOwogIGdldF9jZXJ0cyhu
YW1lLCBjZXJ0cywgIm1hbmlmZXN0X2NlcnRzIik7CiAgdHMuY2xlYXIoKTsKICBjb3B5KGNl
cnRzLmJlZ2luKCksIGNlcnRzLmVuZCgpLCBiYWNrX2luc2VydGVyKHRzKSk7ICAKfQoKdm9p
ZCAKZGF0YWJhc2U6OmdldF9tYW5pZmVzdF9jZXJ0cyhtYW5pZmVzdF9pZCBjb25zdCAmIGlk
LCAKCQkJICAgICBjZXJ0X25hbWUgY29uc3QgJiBuYW1lLCAKCQkJICAgICB2ZWN0b3I8IG1h
bmlmZXN0PGNlcnQ+ID4gJiB0cykKewogIHZlY3RvcjxjZXJ0PiBjZXJ0czsKICBnZXRfY2Vy
dHMoaWQuaW5uZXIoKSwgbmFtZSwgY2VydHMsICJtYW5pZmVzdF9jZXJ0cyIpOwogIHRzLmNs
ZWFyKCk7CiAgY29weShjZXJ0cy5iZWdpbigpLCBjZXJ0cy5lbmQoKSwgYmFja19pbnNlcnRl
cih0cykpOyAgCn0KCgovLyBjb21wbGV0aW9ucwp2b2lkIApkYXRhYmFzZTo6Y29tcGxldGUo
c3RyaW5nIGNvbnN0ICYgcGFydGlhbCwKCQkgICBzZXQ8cmV2aXNpb25faWQ+ICYgY29tcGxl
dGlvbnMpCnsKICByZXN1bHRzIHJlczsKICBjb21wbGV0aW9ucy5jbGVhcigpOwoKICBmZXRj
aChyZXMsIDEsIGFueV9yb3dzLAoJIlNFTEVDVCBpZCBGUk9NIHJldmlzaW9ucyBXSEVSRSBp
ZCBHTE9CICclcSonIiwKCXBhcnRpYWwuY19zdHIoKSk7CgogIGZvciAoc2l6ZV90IGkgPSAw
OyBpIDwgcmVzLnNpemUoKTsgKytpKQogICAgY29tcGxldGlvbnMuaW5zZXJ0KHJldmlzaW9u
X2lkKHJlc1tpXVswXSkpOyAgCn0KCgp2b2lkIApkYXRhYmFzZTo6Y29tcGxldGUoc3RyaW5n
IGNvbnN0ICYgcGFydGlhbCwKCQkgICBzZXQ8bWFuaWZlc3RfaWQ+ICYgY29tcGxldGlvbnMp
CnsKICByZXN1bHRzIHJlczsKICBjb21wbGV0aW9ucy5jbGVhcigpOwoKICBmZXRjaChyZXMs
IDEsIGFueV9yb3dzLAoJIlNFTEVDVCBpZCBGUk9NIG1hbmlmZXN0cyBXSEVSRSBpZCBHTE9C
ICclcSonIiwKCXBhcnRpYWwuY19zdHIoKSk7CgogIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwg
cmVzLnNpemUoKTsgKytpKQogICAgY29tcGxldGlvbnMuaW5zZXJ0KG1hbmlmZXN0X2lkKHJl
c1tpXVswXSkpOyAgCiAgCiAgcmVzLmNsZWFyKCk7CgogIGZldGNoKHJlcywgMSwgYW55X3Jv
d3MsCgkiU0VMRUNUIGlkIEZST00gbWFuaWZlc3RfZGVsdGFzIFdIRVJFIGlkIEdMT0IgJyVx
KiciLAoJcGFydGlhbC5jX3N0cigpKTsKCiAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXMu
c2l6ZSgpOyArK2kpCiAgICBjb21wbGV0aW9ucy5pbnNlcnQobWFuaWZlc3RfaWQocmVzW2ld
WzBdKSk7ICAKfQoKdm9pZCAKZGF0YWJhc2U6OmNvbXBsZXRlKHN0cmluZyBjb25zdCAmIHBh
cnRpYWwsCgkJICAgc2V0PGZpbGVfaWQ+ICYgY29tcGxldGlvbnMpCnsKICByZXN1bHRzIHJl
czsKICBjb21wbGV0aW9ucy5jbGVhcigpOwoKICBmZXRjaChyZXMsIDEsIGFueV9yb3dzLAoJ
IlNFTEVDVCBpZCBGUk9NIGZpbGVzIFdIRVJFIGlkIEdMT0IgJyVxKiciLAoJcGFydGlhbC5j
X3N0cigpKTsKCiAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXMuc2l6ZSgpOyArK2kpCiAg
ICBjb21wbGV0aW9ucy5pbnNlcnQoZmlsZV9pZChyZXNbaV1bMF0pKTsgIAogIAogIHJlcy5j
bGVhcigpOwoKICBmZXRjaChyZXMsIDEsIGFueV9yb3dzLAoJIlNFTEVDVCBpZCBGUk9NIGZp
bGVfZGVsdGFzIFdIRVJFIGlkIEdMT0IgJyVxKiciLAoJcGFydGlhbC5jX3N0cigpKTsKCiAg
Zm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXMuc2l6ZSgpOyArK2kpCiAgICBjb21wbGV0aW9u
cy5pbnNlcnQoZmlsZV9pZChyZXNbaV1bMF0pKTsgIAp9Cgp1c2luZyBjb21tYW5kczo6c2Vs
ZWN0b3JfdHlwZTsKCnN0YXRpYyB2b2lkIHNlbGVjdG9yX3RvX2NlcnRuYW1lKHNlbGVjdG9y
X3R5cGUgdHksCgkJCQkgc3RyaW5nICYgcykKewogIHN3aXRjaCAodHkpCiAgICB7CiAgICBj
YXNlIGNvbW1hbmRzOjpzZWxfYXV0aG9yOgogICAgICBzID0gYXV0aG9yX2NlcnRfbmFtZTsK
ICAgICAgYnJlYWs7CiAgICBjYXNlIGNvbW1hbmRzOjpzZWxfYnJhbmNoOgogICAgICBzID0g
YnJhbmNoX2NlcnRfbmFtZTsKICAgICAgYnJlYWs7CiAgICBjYXNlIGNvbW1hbmRzOjpzZWxf
ZGF0ZToKICAgICAgcyA9IGRhdGVfY2VydF9uYW1lOwogICAgICBicmVhazsKICAgIGNhc2Ug
Y29tbWFuZHM6OnNlbF90YWc6CiAgICAgIHMgPSB0YWdfY2VydF9uYW1lOwogICAgICBicmVh
azsKICAgIGNhc2UgY29tbWFuZHM6OnNlbF9pZGVudDoKICAgIGNhc2UgY29tbWFuZHM6OnNl
bF91bmtub3duOgogICAgICBJKGZhbHNlKTsgLy8gZG9uJ3QgZG8gdGhpcy4KICAgICAgYnJl
YWs7CiAgICB9Cn0KCnZvaWQgZGF0YWJhc2U6OmNvbXBsZXRlKHNlbGVjdG9yX3R5cGUgdHks
CgkJCXN0cmluZyBjb25zdCAmIHBhcnRpYWwsCgkJCXZlY3RvcjxwYWlyPHNlbGVjdG9yX3R5
cGUsIHN0cmluZz4gPiBjb25zdCAmIGxpbWl0LAoJCQlzZXQ8c3RyaW5nPiAmIGNvbXBsZXRp
b25zKQp7CiAgY29tcGxldGlvbnMuY2xlYXIoKTsKCiAgLy8gc3RlcCAxOiB0aGUgbGltaXQg
aXMgdHJhbnNmb3JtZWQgaW50byBhbiBTUUwgc2VsZWN0IHN0YXRlbWVudCB3aGljaAogIC8v
IHNlbGVjdHMgYSBzZXQgb2YgSURzIGZyb20gdGhlIG1hbmlmZXN0X2NlcnRzIHRhYmxlIHdo
aWNoIG1hdGNoIHRoZQogIC8vIGxpbWl0LiAgdGhpcyBpcyBkb25lIGJ5IGJ1aWxkaW5nIGFu
IFNRTCBzZWxlY3Qgc3RhdGVtZW50IGZvciBlYWNoIHRlcm0KICAvLyBpbiB0aGUgbGltaXQg
YW5kIHRoZW4gSU5URVJTRUNUaW5nIHRoZW0gYWxsLgoKICBzdHJpbmcgbGltID0gIigiOwog
IGJvb2wgZmlyc3RfbGltaXQgPSB0cnVlOwogIGZvciAodmVjdG9yPHBhaXI8c2VsZWN0b3Jf
dHlwZSwgc3RyaW5nPiA+Ojpjb25zdF9pdGVyYXRvciBpID0gbGltaXQuYmVnaW4oKTsKICAg
ICAgIGkgIT0gbGltaXQuZW5kKCk7ICsraSkKICAgIHsKICAgICAgaWYgKGZpcnN0X2xpbWl0
KQoJZmlyc3RfbGltaXQgPSBmYWxzZTsKICAgICAgZWxzZQoJbGltICs9ICIgSU5URVJTRUNU
ICI7CiAgICAgIAogICAgICBpZiAoaS0+Zmlyc3QgPT0gY29tbWFuZHM6OnNlbF9pZGVudCkK
CXsKCSAgbGltICs9ICJTRUxFQ1QgaWQgRlJPTSByZXZpc2lvbl9jZXJ0cyAiOwoJICBsaW0g
Kz0gKEYoIldIRVJFIGlkIEdMT0IgJyVzKiciKSAKCQkgICUgaS0+c2Vjb25kKS5zdHIoKTsK
CX0KICAgICAgZWxzZSBpZiAoaS0+Zmlyc3QgPT0gY29tbWFuZHM6OnNlbF91bmtub3duKQoJ
ewoJICBsaW0gKz0gIlNFTEVDVCBpZCBGUk9NIHJldmlzaW9uX2NlcnRzICI7CgkgIGxpbSAr
PSAoRigiIFdIRVJFIChuYW1lPSclcycgT1IgbmFtZT0nJXMnIE9SIG5hbWU9JyVzJykiKQoJ
CSAgJSBhdXRob3JfY2VydF9uYW1lIAoJCSAgJSB0YWdfY2VydF9uYW1lIAoJCSAgJSBicmFu
Y2hfY2VydF9uYW1lKS5zdHIoKTsKCSAgbGltICs9IChGKCIgQU5EIHVuYmFzZTY0KHZhbHVl
KSBnbG9iICcqJXMqJyIpCgkJICAlIGktPnNlY29uZCkuc3RyKCk7CSAgCgl9CiAgICAgIGVs
c2UKCXsKCSAgc3RyaW5nIGNlcnRuYW1lOwoJICBzZWxlY3Rvcl90b19jZXJ0bmFtZShpLT5m
aXJzdCwgY2VydG5hbWUpOwoJICBsaW0gKz0gIlNFTEVDVCBpZCBGUk9NIHJldmlzaW9uX2Nl
cnRzICI7CgkgIGxpbSArPSAoRigiV0hFUkUgbmFtZT0nJXMnIEFORCB1bmJhc2U2NCh2YWx1
ZSkgZ2xvYiAnKiVzKiciKQoJCSAgJSBjZXJ0bmFtZSAlIGktPnNlY29uZCkuc3RyKCk7Cgl9
CiAgICB9CiAgbGltICs9ICIpIjsKICAKICAvLyBzdGVwIDI6IGRlcGVuZGluZyBvbiB3aGF0
IHdlJ3ZlIGJlZW4gYXNrZWQgdG8gZGlzYW1iaWd1YXRlLCB3ZQogIC8vIHdpbGwgY29tcGxl
dGUgZWl0aGVyIHNvbWUgaWRlbnRzLCBvciBjZXJ0IHZhbHVlcywgb3IgInVua25vd24iCiAg
Ly8gd2hpY2ggZ2VuZXJhbGx5IG1lYW5zICJhdXRob3IsIHRhZyBvciBicmFuY2giCgogIHN0
cmluZyBxdWVyeTsKICBpZiAodHkgPT0gY29tbWFuZHM6OnNlbF9pZGVudCkKICAgIHsKICAg
ICAgcXVlcnkgPSAoRigiU0VMRUNUIGlkIEZST00gJXMiKSAlIGxpbSkuc3RyKCk7CiAgICB9
CiAgZWxzZSAKICAgIHsKICAgICAgcXVlcnkgPSAiU0VMRUNUIHZhbHVlIEZST00gcmV2aXNp
b25fY2VydHMgV0hFUkUiOwogICAgICBpZiAodHkgPT0gY29tbWFuZHM6OnNlbF91bmtub3du
KQoJewkgIAkKCSAgcXVlcnkgKz0gCgkgICAgKEYoIiAobmFtZT0nJXMnIE9SIG5hbWU9JyVz
JyBPUiBuYW1lPSclcycpIikKCSAgICAgJSBhdXRob3JfY2VydF9uYW1lIAoJICAgICAlIHRh
Z19jZXJ0X25hbWUgCgkgICAgICUgYnJhbmNoX2NlcnRfbmFtZSkuc3RyKCk7Cgl9CiAgICAg
IGVsc2UKCXsKCSAgc3RyaW5nIGNlcnRuYW1lOwoJICBzZWxlY3Rvcl90b19jZXJ0bmFtZSh0
eSwgY2VydG5hbWUpOwoJICBxdWVyeSArPSAKCSAgICAoRigiIChuYW1lPSclcycpIikgJSBj
ZXJ0bmFtZSkuc3RyKCk7Cgl9CiAgICAgICAgCiAgICAgIHF1ZXJ5ICs9IChGKCIgQU5EICh1
bmJhc2U2NCh2YWx1ZSkgR0xPQiAnKiVzKicpIikgJSBwYXJ0aWFsKS5zdHIoKTsKICAgICAg
cXVlcnkgKz0gKEYoIiBBTkQgKGlkIElOICVzKSIpICUgbGltKS5zdHIoKTsKICAgIH0KCiAg
cmVzdWx0cyByZXM7CiAgZmV0Y2gocmVzLCBvbmVfY29sLCBhbnlfcm93cywgcXVlcnkuY19z
dHIoKSk7CiAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXMuc2l6ZSgpOyArK2kpCiAgICB7
CiAgICAgIGlmICh0eSA9PSBjb21tYW5kczo6c2VsX2lkZW50KQoJY29tcGxldGlvbnMuaW5z
ZXJ0KHJlc1tpXVswXSk7CiAgICAgIGVsc2UKCXsKCSAgYmFzZTY0PGRhdGE+IHJvd19lbmNv
ZGVkKHJlc1tpXVswXSk7CgkgIGRhdGEgcm93X2RlY29kZWQ7CgkgIGRlY29kZV9iYXNlNjQo
cm93X2VuY29kZWQsIHJvd19kZWNvZGVkKTsKCSAgY29tcGxldGlvbnMuaW5zZXJ0KHJvd19k
ZWNvZGVkKCkpOwoJfQogICAgfQp9CgoKLy8gbWVya2xlIG5vZGVzCgpib29sIApkYXRhYmFz
ZTo6bWVya2xlX25vZGVfZXhpc3RzKHN0cmluZyBjb25zdCAmIHR5cGUsCgkJCSAgICAgdXRm
OCBjb25zdCAmIGNvbGxlY3Rpb24sIAoJCQkgICAgIHNpemVfdCBsZXZlbCwKCQkJICAgICBo
ZXhlbmM8cHJlZml4PiBjb25zdCAmIHByZWZpeCkKewogIHJlc3VsdHMgcmVzOwogIGZldGNo
KHJlcywgb25lX2NvbCwgb25lX3JvdywgCgkiU0VMRUNUIENPVU5UKCopICIKCSJGUk9NIG1l
cmtsZV9ub2RlcyAiCgkiV0hFUkUgdHlwZSA9ICclcScgIgoJIkFORCBjb2xsZWN0aW9uID0g
JyVxJyAiCgkiQU5EIGxldmVsID0gJWQgIgoJIkFORCBwcmVmaXggPSAnJXEnICIsCgl0eXBl
LmNfc3RyKCksIGNvbGxlY3Rpb24oKS5jX3N0cigpLCBsZXZlbCwgcHJlZml4KCkuY19zdHIo
KSk7CiAgc2l6ZV90IG5fbm9kZXMgPSBsZXhpY2FsX2Nhc3Q8c2l6ZV90PihyZXNbMF1bMF0p
OwogIEkobl9ub2RlcyA9PSAwIHx8IG5fbm9kZXMgPT0gMSk7CiAgcmV0dXJuIG5fbm9kZXMg
PT0gMTsKfQoKdm9pZCAKZGF0YWJhc2U6OmdldF9tZXJrbGVfbm9kZShzdHJpbmcgY29uc3Qg
JiB0eXBlLAoJCQkgIHV0ZjggY29uc3QgJiBjb2xsZWN0aW9uLCAKCQkJICBzaXplX3QgbGV2
ZWwsCgkJCSAgaGV4ZW5jPHByZWZpeD4gY29uc3QgJiBwcmVmaXgsCgkJCSAgYmFzZTY0PG1l
cmtsZT4gJiBub2RlKQp7CiAgcmVzdWx0cyByZXM7CiAgZmV0Y2gocmVzLCBvbmVfY29sLCBv
bmVfcm93LCAKCSJTRUxFQ1QgYm9keSAiCgkiRlJPTSBtZXJrbGVfbm9kZXMgIgoJIldIRVJF
IHR5cGUgPSAnJXEnICIKCSJBTkQgY29sbGVjdGlvbiA9ICclcScgIgoJIkFORCBsZXZlbCA9
ICVkICIKCSJBTkQgcHJlZml4ID0gJyVxJyIsCgl0eXBlLmNfc3RyKCksIGNvbGxlY3Rpb24o
KS5jX3N0cigpLCBsZXZlbCwgcHJlZml4KCkuY19zdHIoKSk7CiAgbm9kZSA9IHJlc1swXVsw
XTsKfQoKdm9pZCAKZGF0YWJhc2U6OnB1dF9tZXJrbGVfbm9kZShzdHJpbmcgY29uc3QgJiB0
eXBlLAoJCQkgIHV0ZjggY29uc3QgJiBjb2xsZWN0aW9uLCAKCQkJICBzaXplX3QgbGV2ZWws
CgkJCSAgaGV4ZW5jPHByZWZpeD4gY29uc3QgJiBwcmVmaXgsCQkJCSAgICAgICAKCQkJICBi
YXNlNjQ8bWVya2xlPiBjb25zdCAmIG5vZGUpCnsKICBleGVjdXRlKCJJTlNFUlQgT1IgUkVQ
TEFDRSAiCgkgICJJTlRPIG1lcmtsZV9ub2RlcyAiCgkgICJWQUxVRVMgKCclcScsICclcScs
ICVkLCAnJXEnLCAnJXEnKSIsCgkgIHR5cGUuY19zdHIoKSwgY29sbGVjdGlvbigpLmNfc3Ry
KCksIGxldmVsLCBwcmVmaXgoKS5jX3N0cigpLCBub2RlKCkuY19zdHIoKSk7Cn0KCnZvaWQg
CmRhdGFiYXNlOjplcmFzZV9tZXJrbGVfbm9kZXMoc3RyaW5nIGNvbnN0ICYgdHlwZSwKCQkJ
ICAgICB1dGY4IGNvbnN0ICYgY29sbGVjdGlvbikKewogIGV4ZWN1dGUoIkRFTEVURSBGUk9N
IG1lcmtsZV9ub2RlcyAiCgkgICJXSEVSRSB0eXBlID0gJyVxJyAiCgkgICJBTkQgY29sbGVj
dGlvbiA9ICclcSciLAoJICB0eXBlLmNfc3RyKCksIGNvbGxlY3Rpb24oKS5jX3N0cigpKTsK
fQoKLy8gdHJhbnNhY3Rpb24gZ3VhcmRzCgp0cmFuc2FjdGlvbl9ndWFyZDo6dHJhbnNhY3Rp
b25fZ3VhcmQoZGF0YWJhc2UgJiBkKSA6IGNvbW1pdHRlZChmYWxzZSksIGRiKGQpIAp7CiAg
ZGIuYmVnaW5fdHJhbnNhY3Rpb24oKTsKfQp0cmFuc2FjdGlvbl9ndWFyZDo6fnRyYW5zYWN0
aW9uX2d1YXJkKCkKewogIGlmIChjb21taXR0ZWQpCiAgICBkYi5jb21taXRfdHJhbnNhY3Rp
b24oKTsKICBlbHNlCiAgICBkYi5yb2xsYmFja190cmFuc2FjdGlvbigpOwp9Cgp2b2lkIAp0
cmFuc2FjdGlvbl9ndWFyZDo6Y29tbWl0KCkKewogIGNvbW1pdHRlZCA9IHRydWU7Cn0KCg==
_ATEOF


cat >correct.b64 <<'_ATEOF'
Ly8gY29weXJpZ2h0IChDKSAyMDAyLCAyMDAzIGdyYXlkb24gaG9hcmUgPGdyYXlkb25AcG9i
b3guY29tPgovLyBhbGwgcmlnaHRzIHJlc2VydmVkLgovLyBsaWNlbnNlZCB0byB0aGUgcHVi
bGljIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCAoPj0gMikKLy8gc2VlIHRoZSBm
aWxlIENPUFlJTkcgZm9yIGRldGFpbHMKCiNpbmNsdWRlIDxpdGVyYXRvcj4KI2luY2x1ZGUg
PGxpc3Q+CiNpbmNsdWRlIDxzZXQ+CiNpbmNsdWRlIDxzc3RyZWFtPgojaW5jbHVkZSA8dmVj
dG9yPgoKI2luY2x1ZGUgPHN0ZGFyZy5oPgoKI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIu
aHBwPgojaW5jbHVkZSA8Ym9vc3QvbGV4aWNhbF9jYXN0LmhwcD4KI2luY2x1ZGUgPGJvb3N0
L2ZpbGVzeXN0ZW0vcGF0aC5ocHA+CiNpbmNsdWRlIDxib29zdC9maWxlc3lzdGVtL29wZXJh
dGlvbnMuaHBwPgoKI2luY2x1ZGUgPHNxbGl0ZS5oPgoKI2luY2x1ZGUgImFwcF9zdGF0ZS5o
aCIKI2luY2x1ZGUgImNlcnQuaGgiCiNpbmNsdWRlICJjbGVhbnVwLmhoIgojaW5jbHVkZSAi
Y29uc3RhbnRzLmhoIgojaW5jbHVkZSAiZGF0YWJhc2UuaGgiCiNpbmNsdWRlICJrZXlzLmho
IgojaW5jbHVkZSAic2FuaXR5LmhoIgojaW5jbHVkZSAic2NoZW1hX21pZ3JhdGlvbi5oaCIK
I2luY2x1ZGUgImNlcnQuaGgiCiNpbmNsdWRlICJ0cmFuc2Zvcm1zLmhoIgojaW5jbHVkZSAi
dWkuaGgiCiNpbmNsdWRlICJ2b2NhYi5oaCIKI2luY2x1ZGUgInhkZWx0YS5oaCIKCi8vIGRl
ZmluZWQgaW4gc2NoZW1hLnNxbCwgY29udmVydGVkIHRvIGhlYWRlcjoKI2luY2x1ZGUgInNj
aGVtYS5oIgoKLy8gZGVmaW5lZCBpbiB2aWV3cy5zcWwsIGNvbnZlcnRlZCB0byBoZWFkZXI6
CiNpbmNsdWRlICJ2aWV3cy5oIgoKLy8gdGhpcyBmaWxlIGRlZmluZXMgYSBwdWJsaWMsIHR5
cGVkIGludGVyZmFjZSB0byB0aGUgZGF0YWJhc2UuCi8vIHRoZSBkYXRhYmFzZSBjbGFzcyBl
bmNhcHN1bGF0ZXMgYWxsIGtub3dsZWRnZSBhYm91dCBzcWxpdGUsCi8vIHRoZSBzY2hlbWEs
IGFuZCBhbGwgU1FMIHN0YXRlbWVudHMgdXNlZCB0byBhY2Nlc3MgdGhlIHNjaGVtYS4KLy8K
Ly8gc2VlIGZpbGUgc2NoZW1hLnNxbCBmb3IgdGhlIHRleHQgb2YgdGhlIHNjaGVtYS4KCnVz
aW5nIGJvb3N0OjpzaGFyZWRfcHRyOwp1c2luZyBib29zdDo6bGV4aWNhbF9jYXN0Owp1c2lu
ZyBuYW1lc3BhY2Ugc3RkOwoKaW50IGNvbnN0IG9uZV9yb3cgPSAxOwppbnQgY29uc3Qgb25l
X2NvbCA9IDE7CmludCBjb25zdCBhbnlfcm93cyA9IC0xOwppbnQgY29uc3QgYW55X2NvbHMg
PSAtMTsKCmV4dGVybiAiQyIgewogIC8vIHN0cmFuZ2VseSB0aGlzIGlzbid0IGRlY2xhcmVk
LCBldmVuIHRob3VnaCBpdCdzIHByZXNlbnQgaW4gbXkgc3FsaXRlLgogIGNoYXIgKnNxbGl0
ZV92bXByaW50Zihjb25zdCBjaGFyICp6Rm9ybWF0LCB2YV9saXN0KTsKfQoKZGF0YWJhc2U6
OmRhdGFiYXNlKGZzOjpwYXRoIGNvbnN0ICYgZm4pIDoKICBmaWxlbmFtZShmbiksCiAgLy8g
bmIuIHVwZGF0ZSB0aGlzIGlmIHlvdSBjaGFuZ2UgdGhlIHNjaGVtYS4gdW5mb3J0dW5hdGVs
eSB3ZSBhcmUgbm90CiAgLy8gdXNpbmcgc2VsZi1kaWdlc3Rpbmcgc2NoZW1hcyBkdWUgdG8g
Y29tbWVudCBpcnJlZ3VsYXJpdGllcyBhbmQKICAvLyBub24tYWxwaGFiZXRpYyBvcmRlcmlu
ZyBvZiB0YWJsZXMgaW4gc3FsIHNvdXJjZSBmaWxlcy4gd2UgY291bGQgY3JlYXRlCiAgLy8g
YSB0ZW1wb3JhcnkgZGIsIHdyaXRlIG91ciBpbnRlbmRlZCBzY2hlbWEgaW50byBpdCwgYW5k
IHJlYWQgaXQgYmFjaywKICAvLyBidXQgdGhpcyBzZWVtcyBsaWtlIGl0IHdvdWxkIGJlIHRv
byBydWRlLiBwb3NzaWJseSByZXZpc2l0IHRoaXMgaXNzdWUuCiAgc2NoZW1hKCJjMWU4NjU4
OGUxMWFkMDdmYTUzZTVkMjk0ZWRjMDQzY2UxZDQwMDVhIiksCiAgX19zcWwoTlVMTCksCiAg
dHJhbnNhY3Rpb25fbGV2ZWwoMCkKe30KCnZvaWQgCmRhdGFiYXNlOjpjaGVja19zY2hlbWEo
KQp7CiAgc3RyaW5nIGRiX3NjaGVtYV9pZDsgIAogIGNhbGN1bGF0ZV9zY2hlbWFfaWQgKF9f
c3FsLCBkYl9zY2hlbWFfaWQpOwogIE4gKHNjaGVtYSA9PSBkYl9zY2hlbWFfaWQsCiAgICAg
RigiZGF0YWJhc2Ugc2NoZW1hcyBkbyBub3QgbWF0Y2g6ICIKICAgICAgICJ3YW50ZWQgJXMs
IGdvdCAlcy4gdHJ5IG1pZ3JhdGluZyBkYXRhYmFzZSIpIAogICAgICUgc2NoZW1hICUgZGJf
c2NoZW1hX2lkKTsKfQoKc3RhdGljIHZvaWQgCnNxbGl0ZV91bmJhc2U2NF9mbihzcWxpdGVf
ZnVuYyAqZiwgaW50IG5hcmdzLCBjaGFyIGNvbnN0ICoqIGFyZ3MpCnsKICBpZiAobmFyZ3Mg
IT0gMSkKICAgIHsKICAgICAgc3FsaXRlX3NldF9yZXN1bHRfZXJyb3IoZiwgIm5lZWQgZXhh
Y3RseSAxIGFyZyB0byB1bmJhc2U2NCgpIiwgLTEpOwogICAgICByZXR1cm47CiAgICB9CiAg
ZGF0YSBkZWNvZGVkOwogIGRlY29kZV9iYXNlNjQoYmFzZTY0PGRhdGE+KHN0cmluZyhhcmdz
WzBdKSksIGRlY29kZWQpOwogIHNxbGl0ZV9zZXRfcmVzdWx0X3N0cmluZyhmLCBkZWNvZGVk
KCkuY19zdHIoKSwgZGVjb2RlZCgpLnNpemUoKSk7Cn0KCnZvaWQgCmRhdGFiYXNlOjpzZXRf
YXBwKGFwcF9zdGF0ZSAqIGFwcCkKewogIF9fYXBwID0gYXBwOwp9CgpzdHJ1Y3Qgc3FsaXRl
ICogCmRhdGFiYXNlOjpzcWwoYm9vbCBpbml0KQp7CiAgaWYgKCEgX19zcWwpCiAgICB7CiAg
ICAgIGlmICghIGluaXQpCiAgICAgICAgewogICAgICAgICAgaWYgKGZpbGVuYW1lLnN0cmlu
ZygpID09ICIiKQogICAgICAgICAgICB0aHJvdyBpbmZvcm1hdGl2ZV9mYWlsdXJlKHN0cmlu
Zygibm8gZGF0YWJhc2Ugc3BlY2lmaWVkIikpOwogICAgICAgICAgZWxzZSBpZiAoISBmczo6
ZXhpc3RzKGZpbGVuYW1lKSkKICAgICAgICAgICAgdGhyb3cgaW5mb3JtYXRpdmVfZmFpbHVy
ZShzdHJpbmcoImRhdGFiYXNlICIpICsgZmlsZW5hbWUuc3RyaW5nKCkgKwogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygiIGRvZXMgbm90IGV4aXN0Iikp
OwogICAgICAgIH0KICAgICAgTihmaWxlbmFtZS5zdHJpbmcoKSAhPSAiIiwKICAgICAgICBG
KCJuZWVkIGRhdGFiYXNlIG5hbWUiKSk7CiAgICAgIGNoYXIgKiBlcnJtc2cgPSBOVUxMOwog
ICAgICBfX3NxbCA9IHNxbGl0ZV9vcGVuKGZpbGVuYW1lLnN0cmluZygpLmNfc3RyKCksIDA3
NTUsICZlcnJtc2cpOwogICAgICBpZiAoISBfX3NxbCkKICAgICAgICB0aHJvdyBvb3BzKHN0
cmluZygiY291bGQgbm90IG9wZW4gZGF0YWJhc2U6ICIpICsgZmlsZW5hbWUuc3RyaW5nKCkg
KyAKICAgICAgICAgICAgICAgICAgIChlcnJtc2cgPyAoIjogIiArIHN0cmluZyhlcnJtc2cp
KSA6ICIiKSk7CiAgICAgIGlmIChpbml0KQogICAgICAgIGV4ZWN1dGUoc2NoZW1hX2NvbnN0
YW50KTsKCiAgICAgIGNoZWNrX3NjaGVtYSgpOwogICAgICBpbnN0YWxsX2Z1bmN0aW9ucyhf
X2FwcCk7CiAgICAgIGluc3RhbGxfdmlld3MoKTsKICAgIH0KICByZXR1cm4gX19zcWw7Cn0K
CnZvaWQgCmRhdGFiYXNlOjppbml0aWFsaXplKCkKewogIGlmIChfX3NxbCkKICAgIHRocm93
IG9vcHMoImNhbm5vdCBpbml0aWFsaXplIGRhdGFiYXNlIHdoaWxlIGl0IGlzIG9wZW4iKTsK
CiAgTighZnM6OmV4aXN0cyhmaWxlbmFtZSksCiAgICBGKCJjb3VsZCBub3QgaW5pdGlhbGl6
ZSBkYXRhYmFzZTogJXM6IGFscmVhZHkgZXhpc3RzIikgCiAgICAlIGZpbGVuYW1lLnN0cmlu
ZygpKTsKCiAgZnM6OnBhdGggam91cm5hbCA9IG1rcGF0aChmaWxlbmFtZS5zdHJpbmcoKSAr
ICItam91cm5hbCIpOwogIE4oIWZzOjpleGlzdHMoam91cm5hbCksCiAgICBGKCJleGlzdGlu
ZyAocG9zc2libHkgc3RhbGUpIGpvdXJuYWwgZmlsZSAnJXMnIGhhcyBzYW1lIHN0ZW0gYXMg
bmV3IGRhdGFiYXNlICclcyciKQogICAgJSBqb3VybmFsLnN0cmluZygpICUgZmlsZW5hbWUu
c3RyaW5nKCkpOwoKICBzcWxpdGUgKnMgPSBzcWwodHJ1ZSk7CiAgSShzICE9IE5VTEwpOwp9
CgoKc3RydWN0IApkdW1wX3JlcXVlc3QKewogIGR1bXBfcmVxdWVzdCgpIHt9OwogIHN0cnVj
dCBzcWxpdGUgKnNxbDsKICBzdHJpbmcgdGFibGVfbmFtZTsKICBvc3RyZWFtICpvdXQ7Cn07
CgpzdGF0aWMgaW50IApkdW1wX3Jvd19jYih2b2lkICpkYXRhLCBpbnQgbiwgY2hhciAqKnZh
bHMsIGNoYXIgKipjb2xzKQp7CiAgZHVtcF9yZXF1ZXN0ICpkdW1wID0gcmVpbnRlcnByZXRf
Y2FzdDxkdW1wX3JlcXVlc3QgKj4oZGF0YSk7CiAgSShkdW1wICE9IE5VTEwpOwogIEkodmFs
cyAhPSBOVUxMKTsKICBJKGR1bXAtPm91dCAhPSBOVUxMKTsKICAqKGR1bXAtPm91dCkgPDwg
RigiSU5TRVJUIElOVE8gJXMgVkFMVUVTKCIpICUgZHVtcC0+dGFibGVfbmFtZTsKICBmb3Ig
KGludCBpID0gMDsgaSA8IG47ICsraSkKICAgIHsKICAgICAgaWYgKGkgIT0gMCkKICAgICAg
ICAqKGR1bXAtPm91dCkgPDwgJywnOwoKICAgICAgaWYgKHZhbHNbaV0gPT0gTlVMTCkKICAg
ICAgICAqKGR1bXAtPm91dCkgPDwgIk5VTEwiOwogICAgICBlbHNlCiAgICAgICAgewogICAg
ICAgICAgKihkdW1wLT5vdXQpIDw8ICInIjsKICAgICAgICAgIGZvciAoY2hhciAqY3AgPSB2
YWxzW2ldOyAqY3A7ICsrY3ApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBpZiAoKmNw
ID09ICdcJycpCiAgICAgICAgICAgICAgICAqKGR1bXAtPm91dCkgPDwgIicnIjsKICAgICAg
ICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAqKGR1bXAtPm91dCkgPDwgKmNwOwogICAg
ICAgICAgICB9CiAgICAgICAgICAqKGR1bXAtPm91dCkgPDwgIiciOwogICAgICAgIH0KICAg
IH0KICAqKGR1bXAtPm91dCkgPDwgIik7XG4iOyAgCiAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBp
bnQgCmR1bXBfdGFibGVfY2Iodm9pZCAqZGF0YSwgaW50IG4sIGNoYXIgKip2YWxzLCBjaGFy
ICoqY29scykKewogIGR1bXBfcmVxdWVzdCAqZHVtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZHVt
cF9yZXF1ZXN0ICo+KGRhdGEpOwogIEkoZHVtcCAhPSBOVUxMKTsKICBJKGR1bXAtPnNxbCAh
PSBOVUxMKTsKICBJKHZhbHMgIT0gTlVMTCk7CiAgSSh2YWxzWzBdICE9IE5VTEwpOwogIEko
dmFsc1sxXSAhPSBOVUxMKTsKICBJKHZhbHNbMl0gIT0gTlVMTCk7CiAgSShuID09IDMpOwog
IGlmIChzdHJpbmcodmFsc1sxXSkgPT0gInRhYmxlIikKICAgIHsKICAgICAgKihkdW1wLT5v
dXQpIDw8IHZhbHNbMl0gPDwgIjtcbiI7CiAgICAgIGR1bXAtPnRhYmxlX25hbWUgPSBzdHJp
bmcodmFsc1swXSk7CiAgICAgIHNxbGl0ZV9leGVjX3ByaW50ZihkdW1wLT5zcWwsICJTRUxF
Q1QgKiBGUk9NICclcSciLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBfcm93X2Ni
LCBkYXRhLCBOVUxMLCB2YWxzWzBdKTsKICAgIH0KICByZXR1cm4gMDsKfQoKdm9pZCAKZGF0
YWJhc2U6OmR1bXAob3N0cmVhbSAmIG91dCkKewogIGR1bXBfcmVxdWVzdCByZXE7CiAgcmVx
Lm91dCA9ICZvdXQ7CiAgcmVxLnNxbCA9IHNxbCgpOwogIG91dCA8PCAiQkVHSU4gVFJBTlNB
Q1RJT047XG4iOwogIGludCByZXMgPSBzcWxpdGVfZXhlYyhyZXEuc3FsLAogICAgICAgICAg
ICAgICAgICAgICAgICAiU0VMRUNUIG5hbWUsIHR5cGUsIHNxbCBGUk9NIHNxbGl0ZV9tYXN0
ZXIgIgogICAgICAgICAgICAgICAgICAgICAgICAiV0hFUkUgdHlwZT0ndGFibGUnIEFORCBz
cWwgTk9UIE5VTEwgIgogICAgICAgICAgICAgICAgICAgICAgICAiT1JERVIgQlkgc3Vic3Ry
KHR5cGUsMiwxKSwgbmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBfdGFibGVf
Y2IsICZyZXEsIE5VTEwpOwogIEkocmVzID09IFNRTElURV9PSyk7CiAgb3V0IDw8ICJDT01N
SVQ7XG4iOwp9Cgp2b2lkIApkYXRhYmFzZTo6bG9hZChpc3RyZWFtICYgaW4pCnsKICBjaGFy
IGJ1Zltjb25zdGFudHM6OmJ1ZnN6XTsKICBzdHJpbmcgdG1wOwoKICBOKGZpbGVuYW1lLnN0
cmluZygpICE9ICIiLAogICAgRigibmVlZCBkYXRhYmFzZSBuYW1lIikpOwogIGNoYXIgKiBl
cnJtc2cgPSBOVUxMOwogIF9fc3FsID0gc3FsaXRlX29wZW4oZmlsZW5hbWUuc3RyaW5nKCku
Y19zdHIoKSwgMDc1NSwgJmVycm1zZyk7CiAgaWYgKCEgX19zcWwpCiAgICB0aHJvdyBvb3Bz
KHN0cmluZygiY291bGQgbm90IG9wZW4gZGF0YWJhc2U6ICIpICsgZmlsZW5hbWUuc3RyaW5n
KCkgKyAKICAgICAgICAgICAgICAgKGVycm1zZyA/ICgiOiAiICsgc3RyaW5nKGVycm1zZykp
IDogIiIpKTsKICAKICB3aGlsZShpbikKICAgIHsKICAgICAgaW4ucmVhZChidWYsIGNvbnN0
YW50czo6YnVmc3opOwogICAgICB0bXAuYXBwZW5kKGJ1ZiwgaW4uZ2NvdW50KCkpOwogICAg
fQoKICBleGVjdXRlKHRtcC5jX3N0cigpKTsKfQoKCnZvaWQgCmRhdGFiYXNlOjpkZWJ1Zyhz
dHJpbmcgY29uc3QgJiBzcWwsIG9zdHJlYW0gJiBvdXQpCnsKICByZXN1bHRzIHJlczsKICBm
ZXRjaChyZXMsIGFueV9jb2xzLCBhbnlfcm93cywgc3FsLmNfc3RyKCkpOwogIG91dCA8PCAi
JyIgPDwgc3FsIDw8ICInIC0+ICIgPDwgcmVzLnNpemUoKSA8PCAiIHJvd3NcbiIgPDwgZW5k
bDsKICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlcy5zaXplKCk7ICsraSkKICAgIHsKICAg
ICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCByZXNbaV0uc2l6ZSgpOyArK2opCiAgICAgICAg
ewogICAgICAgICAgaWYgKGogIT0gMCkKICAgICAgICAgICAgb3V0IDw8ICIgfCAiOwogICAg
ICAgICAgb3V0IDw8IHJlc1tpXVtqXTsKICAgICAgICB9CiAgICAgIG91dCA8PCBlbmRsOwog
ICAgfQp9Cgp1bnNpZ25lZCBsb25nIApkYXRhYmFzZTo6Z2V0X3N0YXRpc3RpYyhzdHJpbmcg
Y29uc3QgJiBxdWVyeSkKewogIHJlc3VsdHMgcmVzOwogIGZldGNoKHJlcywgMSwgMSwgcXVl
cnkuY19zdHIoKSk7CiAgcmV0dXJuIGxleGljYWxfY2FzdDx1bnNpZ25lZCBsb25nPihyZXNb
MF1bMF0pOwp9Cgp2b2lkIApkYXRhYmFzZTo6aW5mbyhvc3RyZWFtICYgb3V0KQp7CiAgc3Ry
aW5nIGlkOwogIGNhbGN1bGF0ZV9zY2hlbWFfaWQoc3FsKCksIGlkKTsKICBvdXQgPDwgInNj
aGVtYSB2ZXJzaW9uICA6ICIgPDwgaWQgPDwgZW5kbDsKICBvdXQgPDwgImZ1bGwgbWFuaWZl
c3RzICA6ICIgPDwgZ2V0X3N0YXRpc3RpYygiU0VMRUNUIENPVU5UKCopIEZST00gbWFuaWZl
c3RzIikgPDwgZW5kbDsKICBvdXQgPDwgIm1hbmlmZXN0IGRlbHRhcyA6ICIgPDwgZ2V0X3N0
YXRpc3RpYygiU0VMRUNUIENPVU5UKCopIEZST00gbWFuaWZlc3RfZGVsdGFzIikgPDwgZW5k
bDsKICBvdXQgPDwgImZ1bGwgZmlsZXMgICAgICA6ICIgPDwgZ2V0X3N0YXRpc3RpYygiU0VM
RUNUIENPVU5UKCopIEZST00gZmlsZXMiKSA8PCBlbmRsOwogIG91dCA8PCAiZmlsZSBkZWx0
YXMgICAgIDogIiA8PCBnZXRfc3RhdGlzdGljKCJTRUxFQ1QgQ09VTlQoKikgRlJPTSBmaWxl
X2RlbHRhcyIpIDw8IGVuZGw7Cn0KCnZvaWQgCmRhdGFiYXNlOjp2ZXJzaW9uKG9zdHJlYW0g
JiBvdXQpCnsKICBzdHJpbmcgaWQ7CiAgY2FsY3VsYXRlX3NjaGVtYV9pZChzcWwoKSwgaWQp
OwogIG91dCA8PCAiZGF0YWJhc2Ugc2NoZW1hIHZlcnNpb246ICIgPDwgaWQgPDwgZW5kbDsK
fQoKdm9pZCAKZGF0YWJhc2U6Om1pZ3JhdGUoKQp7ICAKICBOKGZpbGVuYW1lLnN0cmluZygp
ICE9ICIiLAogICAgRigibmVlZCBkYXRhYmFzZSBuYW1lIikpOwogIGNoYXIgKiBlcnJtc2cg
PSBOVUxMOwogIF9fc3FsID0gc3FsaXRlX29wZW4oZmlsZW5hbWUuc3RyaW5nKCkuY19zdHIo
KSwgMDc1NSwgJmVycm1zZyk7CiAgaWYgKCEgX19zcWwpCiAgICB0aHJvdyBvb3BzKHN0cmlu
ZygiY291bGQgbm90IG9wZW4gZGF0YWJhc2U6ICIpICsgZmlsZW5hbWUuc3RyaW5nKCkgKyAK
ICAgICAgICAgICAgICAgKGVycm1zZyA/ICgiOiAiICsgc3RyaW5nKGVycm1zZykpIDogIiIp
KTsKICBtaWdyYXRlX21vbm90b25lX3NjaGVtYShfX3NxbCk7CiAgc3FsaXRlX2Nsb3NlKF9f
c3FsKTsKfQoKdm9pZCAKZGF0YWJhc2U6OnJlaGFzaCgpCnsKICB0cmFuc2FjdGlvbl9ndWFy
ZCBndWFyZCgqdGhpcyk7CiAgdGlja2VyIG1jZXJ0cygibWNlcnRzIiwgIm0iLCAxKTsKICB0
aWNrZXIgZmNlcnRzKCJmY2VydHMiLCAiZiIsIDEpOwogIHRpY2tlciBwdWJrZXlzKCJwdWJr
ZXlzIiwgIisiLCAxKTsKICB0aWNrZXIgcHJpdmtleXMoInByaXZrZXlzIiwgIiEiLCAxKTsK
ICAKICB7CiAgICAvLyByZWhhc2ggYWxsIG1jZXJ0cwogICAgcmVzdWx0cyByZXM7CiAgICB2
ZWN0b3I8Y2VydD4gY2VydHM7CiAgICBmZXRjaChyZXMsIDUsIGFueV9yb3dzLCAKICAgICAg
ICAgICJTRUxFQ1QgaWQsIG5hbWUsIHZhbHVlLCBrZXlwYWlyLCBzaWduYXR1cmUgIgogICAg
ICAgICAgIkZST00gbWFuaWZlc3RfY2VydHMiKTsKICAgIHJlc3VsdHNfdG9fY2VydHMocmVz
LCBjZXJ0cyk7CiAgICBleGVjdXRlKCJERUxFVEUgRlJPTSBtYW5pZmVzdF9jZXJ0cyIpOwog
ICAgZm9yKHZlY3RvcjxjZXJ0Pjo6Y29uc3RfaXRlcmF0b3IgaSA9IGNlcnRzLmJlZ2luKCk7
IGkgIT0gY2VydHMuZW5kKCk7ICsraSkKICAgICAgewogICAgICAgIHB1dF9jZXJ0KCppLCAi
bWFuaWZlc3RfY2VydHMiKTsKICAgICAgICArK21jZXJ0czsKICAgICAgfQogIH0KCiAgewog
ICAgLy8gcmVoYXNoIGFsbCBmY2VydHMKICAgIHJlc3VsdHMgcmVzOwogICAgdmVjdG9yPGNl
cnQ+IGNlcnRzOyAgICAKICAgIGZldGNoKHJlcywgNSwgYW55X3Jvd3MsIAogICAgICAgICAg
IlNFTEVDVCBpZCwgbmFtZSwgdmFsdWUsIGtleXBhaXIsIHNpZ25hdHVyZSAiCiAgICAgICAg
ICAiRlJPTSBmaWxlX2NlcnRzIik7CiAgICByZXN1bHRzX3RvX2NlcnRzKHJlcywgY2VydHMp
OwogICAgZXhlY3V0ZSgiREVMRVRFIEZST00gZmlsZV9jZXJ0cyIpOwogICAgZm9yKHZlY3Rv
cjxjZXJ0Pjo6Y29uc3RfaXRlcmF0b3IgaSA9IGNlcnRzLmJlZ2luKCk7IGkgIT0gY2VydHMu
ZW5kKCk7ICsraSkKICAgICAgewogICAgICAgIHB1dF9jZXJ0KCppLCAiZmlsZV9jZXJ0cyIp
OwogICAgICAgICsrZmNlcnRzOwogICAgICB9CiAgfQogIAoKICB7CiAgICAvLyByZWhhc2gg
YWxsIHB1YmtleXMKICAgIHJlc3VsdHMgcmVzOwogICAgZmV0Y2gocmVzLCAyLCBhbnlfcm93
cywgIlNFTEVDVCBpZCwga2V5ZGF0YSBGUk9NIHB1YmxpY19rZXlzIik7CiAgICBleGVjdXRl
KCJERUxFVEUgRlJPTSBwdWJsaWNfa2V5cyIpOwogICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCByZXMuc2l6ZSgpOyArK2kpCiAgICAgIHsKICAgICAgICBoZXhlbmM8aWQ+IHRtcDsKICAg
ICAgICBrZXlfaGFzaF9jb2RlKHJzYV9rZXlwYWlyX2lkKHJlc1tpXVswXSksIGJhc2U2NDxy
c2FfcHViX2tleT4ocmVzW2ldWzFdKSwgdG1wKTsKICAgICAgICBleGVjdXRlKCJJTlNFUlQg
SU5UTyBwdWJsaWNfa2V5cyBWQUxVRVMoJyVxJywgJyVxJywgJyVxJykiLCAKICAgICAgICAg
ICAgICAgIHRtcCgpLmNfc3RyKCksIHJlc1tpXVswXS5jX3N0cigpLCByZXNbaV1bMV0uY19z
dHIoKSk7CiAgICAgICAgKytwdWJrZXlzOwogICAgICB9CiAgfQoKewogICAgLy8gcmVoYXNo
IGFsbCBwcml2a2V5cwogICAgcmVzdWx0cyByZXM7CiAgICBmZXRjaChyZXMsIDIsIGFueV9y
b3dzLCAiU0VMRUNUIGlkLCBrZXlkYXRhIEZST00gcHJpdmF0ZV9rZXlzIik7CiAgICBleGVj
dXRlKCJERUxFVEUgRlJPTSBwcml2YXRlX2tleXMiKTsKICAgIGZvciAoc2l6ZV90IGkgPSAw
OyBpIDwgcmVzLnNpemUoKTsgKytpKQogICAgICB7CiAgICAgICAgaGV4ZW5jPGlkPiB0bXA7
CiAgICAgICAga2V5X2hhc2hfY29kZShyc2Ffa2V5cGFpcl9pZChyZXNbaV1bMF0pLCBiYXNl
NjQ8IGFyYzQ8cnNhX3ByaXZfa2V5PiA+KHJlc1tpXVsxXSksIHRtcCk7CiAgICAgICAgZXhl
Y3V0ZSgiSU5TRVJUIElOVE8gcHJpdmF0ZV9rZXlzIFZBTFVFUygnJXEnLCAnJXEnLCAnJXEn
KSIsIAogICAgICAgICAgICAgICAgdG1wKCkuY19zdHIoKSwgcmVzW2ldWzBdLmNfc3RyKCks
IHJlc1tpXVsxXS5jX3N0cigpKTsKICAgICAgICArK3ByaXZrZXlzOwogICAgICB9CiAgfQoK
ICBndWFyZC5jb21taXQoKTsKfQoKdm9pZCAKZGF0YWJhc2U6OmVuc3VyZV9vcGVuKCkKewog
IHNxbGl0ZSAqcyA9IHNxbCgpOwogIEkocyAhPSBOVUxMKTsKfQoKZGF0YWJhc2U6On5kYXRh
YmFzZSgpIAp7CiAgaWYgKF9fc3FsKQogICAgewogICAgICBzcWxpdGVfY2xvc2UoX19zcWwp
OwogICAgICBfX3NxbCA9IDA7CiAgICB9Cn0KCnN0YXRpYyB2b2lkIAphc3NlcnRfc3FsaXRl
X29rKGludCByZXMpCnsKICBzd2l0Y2ggKHJlcykKICAgIHsgICAgICAKICAgIGNhc2UgU1FM
SVRFX09LOiAKICAgICAgYnJlYWs7CgogICAgY2FzZSBTUUxJVEVfRVJST1I6CiAgICAgIHRo
cm93IG9vcHMoIlNRTCBlcnJvciBvciBtaXNzaW5nIGRhdGFiYXNlIik7CiAgICAgIGJyZWFr
OwoKICAgIGNhc2UgU1FMSVRFX0lOVEVSTkFMOgogICAgICB0aHJvdyBvb3BzKCJBbiBpbnRl
cm5hbCBsb2dpYyBlcnJvciBpbiBTUUxpdGUiKTsKICAgICAgYnJlYWs7CgogICAgY2FzZSBT
UUxJVEVfUEVSTToKICAgICAgdGhyb3cgb29wcygiQWNjZXNzIHBlcm1pc3Npb24gZGVuaWVk
Iik7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgU1FMSVRFX0FCT1JUOgogICAgICB0aHJvdyBv
b3BzKCJDYWxsYmFjayByb3V0aW5lIHJlcXVlc3RlZCBhbiBhYm9ydCIpOwogICAgICBicmVh
azsKCiAgICBjYXNlIFNRTElURV9CVVNZOgogICAgICB0aHJvdyBvb3BzKCJUaGUgZGF0YWJh
c2UgZmlsZSBpcyBsb2NrZWQiKTsKICAgICAgYnJlYWs7CgogICAgY2FzZSBTUUxJVEVfTE9D
S0VEOgogICAgICB0aHJvdyBvb3BzKCJBIHRhYmxlIGluIHRoZSBkYXRhYmFzZSBpcyBsb2Nr
ZWQiKTsKICAgICAgYnJlYWs7CgogICAgY2FzZSBTUUxJVEVfTk9NRU06CiAgICAgIHRocm93
IG9vcHMoIkEgbWFsbG9jKCkgZmFpbGVkIik7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgU1FM
SVRFX1JFQURPTkxZOgogICAgICB0aHJvdyBvb3BzKCJBdHRlbXB0IHRvIHdyaXRlIGEgcmVh
ZG9ubHkgZGF0YWJhc2UiKTsKICAgICAgYnJlYWs7CgogICAgY2FzZSBTUUxJVEVfSU5URVJS
VVBUOgogICAgICB0aHJvdyBvb3BzKCJPcGVyYXRpb24gdGVybWluYXRlZCBieSBzcWxpdGVf
aW50ZXJydXB0KCkiKTsKICAgICAgYnJlYWs7CgogICAgY2FzZSBTUUxJVEVfSU9FUlI6CiAg
ICAgIHRocm93IG9vcHMoIlNvbWUga2luZCBvZiBkaXNrIEkvTyBlcnJvciBvY2N1cnJlZCIp
OwogICAgICBicmVhazsKCiAgICBjYXNlIFNRTElURV9DT1JSVVBUOgogICAgICB0aHJvdyBv
b3BzKCJUaGUgZGF0YWJhc2UgZGlzayBpbWFnZSBpcyBtYWxmb3JtZWQiKTsKICAgICAgYnJl
YWs7CgogICAgY2FzZSBTUUxJVEVfTk9URk9VTkQ6CiAgICAgIHRocm93IG9vcHMoIihJbnRl
cm5hbCBPbmx5KSBUYWJsZSBvciByZWNvcmQgbm90IGZvdW5kIik7CiAgICAgIGJyZWFrOwoK
ICAgIGNhc2UgU1FMSVRFX0ZVTEw6CiAgICAgIHRocm93IG9vcHMoIkluc2VydGlvbiBmYWls
ZWQgYmVjYXVzZSBkYXRhYmFzZSBpcyBmdWxsIik7CiAgICAgIGJyZWFrOwoKICAgIGNhc2Ug
U1FMSVRFX0NBTlRPUEVOOgogICAgICB0aHJvdyBvb3BzKCJVbmFibGUgdG8gb3BlbiB0aGUg
ZGF0YWJhc2UgZmlsZSIpOwogICAgICBicmVhazsKCiAgICBjYXNlIFNRTElURV9QUk9UT0NP
TDoKICAgICAgdGhyb3cgb29wcygiZGF0YWJhc2UgbG9jayBwcm90b2NvbCBlcnJvciIpOwog
ICAgICBicmVhazsKCiAgICBjYXNlIFNRTElURV9FTVBUWToKICAgICAgdGhyb3cgb29wcygi
KEludGVybmFsIE9ubHkpIGRhdGFiYXNlIHRhYmxlIGlzIGVtcHR5Iik7CiAgICAgIGJyZWFr
OwoKICAgIGNhc2UgU1FMSVRFX1NDSEVNQToKICAgICAgdGhyb3cgb29wcygiVGhlIGRhdGFi
YXNlIHNjaGVtYSBjaGFuZ2VkIik7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgU1FMSVRFX1RP
T0JJRzoKICAgICAgdGhyb3cgb29wcygiVG9vIG11Y2ggZGF0YSBmb3Igb25lIHJvdyBvZiBh
IHRhYmxlIik7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgU1FMSVRFX0NPTlNUUkFJTlQ6CiAg
ICAgIHRocm93IG9vcHMoIkFib3J0IGR1ZSB0byBjb250cmFpbnQgdmlvbGF0aW9uIik7CiAg
ICAgIGJyZWFrOwoKICAgIGNhc2UgU1FMSVRFX01JU01BVENIOgogICAgICB0aHJvdyBvb3Bz
KCJEYXRhIHR5cGUgbWlzbWF0Y2giKTsKICAgICAgYnJlYWs7CgogICAgY2FzZSBTUUxJVEVf
TUlTVVNFOgogICAgICB0aHJvdyBvb3BzKCJMaWJyYXJ5IHVzZWQgaW5jb3JyZWN0bHkiKTsK
ICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgdGhyb3cgb29wcyhzdHJpbmcoIlVu
a25vd24gREIgcmVzdWx0IGNvZGU6ICIpICsgbGV4aWNhbF9jYXN0PHN0cmluZz4ocmVzKSk7
CiAgICAgIGJyZWFrOwogICAgfQp9Cgp2b2lkIApkYXRhYmFzZTo6ZXhlY3V0ZShjaGFyIGNv
bnN0ICogcXVlcnksIC4uLikKewogIHZhX2xpc3QgYXA7CiAgaW50IHJlczsKICBjaGFyICog
ZXJybXNnID0gTlVMTDsKCiAgdmFfc3RhcnQoYXAsIHF1ZXJ5KTsKCiAgLy8gbG9nIGl0CiAg
Y2hhciAqIGZvcm1hdHRlZCA9IHNxbGl0ZV92bXByaW50ZihxdWVyeSwgYXApOwogIHN0cmlu
ZyBxcShmb3JtYXR0ZWQpOwogIGlmIChxcS5zaXplKCkgPiBjb25zdGFudHM6OmRiX2xvZ19s
aW5lX3N6KSAKICAgIHFxID0gcXEuc3Vic3RyKDAsIGNvbnN0YW50czo6ZGJfbG9nX2xpbmVf
c3opICsgc3RyaW5nKCIgLi4uIik7CiAgTChGKCJkYi5leGVjdXRlKFwiJXNcIilcbiIpICUg
cXEpOwogIHNxbGl0ZV9mcmVlbWVtKGZvcm1hdHRlZCk7CgogIHZhX2VuZChhcCk7CiAgdmFf
c3RhcnQoYXAsIHF1ZXJ5KTsKCiAgLy8gZG8gaXQKICByZXMgPSBzcWxpdGVfZXhlY192cHJp
bnRmKHNxbCgpLCBxdWVyeSwgTlVMTCwgTlVMTCwgJmVycm1zZywgYXApOwoKICB2YV9lbmQo
YXApOwoKICBpZiAoZXJybXNnKQogICAgdGhyb3cgb29wcyhzdHJpbmcoInNxbGl0ZSBleGVj
IGVycm9yICIpICsgZXJybXNnKTsKCiAgYXNzZXJ0X3NxbGl0ZV9vayhyZXMpOwoKfQoKdm9p
ZCAKZGF0YWJhc2U6OmZldGNoKHJlc3VsdHMgJiByZXMsIAogICAgICAgICAgICAgICAgaW50
IGNvbnN0IHdhbnRfY29scywgCiAgICAgICAgICAgICAgICBpbnQgY29uc3Qgd2FudF9yb3dz
LCAKICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKiBxdWVyeSwgLi4uKQp7CiAgY2hhciAq
KiByZXN1bHQgPSBOVUxMOwogIGludCBucm93OwogIGludCBuY29sOwogIGNoYXIgKiBlcnJt
c2cgPSBOVUxMOwogIGludCByZXNjb2RlOwoKICB2YV9saXN0IGFwOwogIHJlcy5jbGVhcigp
OwogIHJlcy5yZXNpemUoMCk7CiAgdmFfc3RhcnQoYXAsIHF1ZXJ5KTsKCiAgLy8gbG9nIGl0
CiAgY2hhciAqIGZvcm1hdHRlZCA9IHNxbGl0ZV92bXByaW50ZihxdWVyeSwgYXApOwogIHN0
cmluZyBxcShmb3JtYXR0ZWQpOwogIGlmIChxcS5zaXplKCkgPiBjb25zdGFudHM6OmxvZ19s
aW5lX3N6KSAKICAgIHFxID0gcXEuc3Vic3RyKDAsIGNvbnN0YW50czo6bG9nX2xpbmVfc3op
ICsgc3RyaW5nKCIgLi4uIik7CiAgTChGKCJkYi5mZXRjaChcIiVzXCIpXG4iKSAlIHFxKTsK
ICBzcWxpdGVfZnJlZW1lbShmb3JtYXR0ZWQpOwoKICB2YV9lbmQoYXApOwogIHZhX3N0YXJ0
KGFwLCBxdWVyeSk7CgogIC8vIGRvIGl0CiAgcmVzY29kZSA9IHNxbGl0ZV9nZXRfdGFibGVf
dnByaW50ZihzcWwoKSwgcXVlcnksICZyZXN1bHQsICZucm93LCAmbmNvbCwgJmVycm1zZywg
YXApOwoKICB2YV9lbmQoYXApOwoKICBjbGVhbnVwX3B0cjxjaGFyICoqLCB2b2lkPiAKICAg
IHJlc3VsdF9ndWFyZChyZXN1bHQsICZzcWxpdGVfZnJlZV90YWJsZSk7CgogIHN0cmluZyBj
dHggPSBzdHJpbmcoImRiIHF1ZXJ5IFsiKSArIHN0cmluZyhxdWVyeSkgKyAiXTogIjsKCiAg
aWYgKGVycm1zZykKICAgIHRocm93IG9vcHMoY3R4ICsgc3RyaW5nKCJzcWxpdGUgZXJyb3Ig
IikgKyBlcnJtc2cpOwogIGFzc2VydF9zcWxpdGVfb2socmVzY29kZSk7CgogIGlmICh3YW50
X2NvbHMgPT0gMCAmJiBuY29sID09IDApIHJldHVybjsKICBpZiAod2FudF9yb3dzID09IDAg
JiYgbnJvdyA9PSAwKSByZXR1cm47CiAgaWYgKHdhbnRfY29scyA9PSBhbnlfcm93cyAmJiBu
Y29sID09IDApIHJldHVybjsKICBpZiAod2FudF9yb3dzID09IGFueV9yb3dzICYmIG5yb3cg
PT0gMCkgcmV0dXJuOwoKICBpZiAod2FudF9jb2xzICE9IGFueV9jb2xzICYmCiAgICAgIG5j
b2wgIT0gd2FudF9jb2xzKQogICAgdGhyb3cgb29wcygoRigiJXMgd2FudGVkICVkIGNvbHVt
bnMsIGdvdCAlcyIpCiAgICAgICAgICAgICAgICAlIGN0eCAlIHdhbnRfY29scyAlIG5jb2wp
LnN0cigpKTsKCiAgaWYgKHdhbnRfcm93cyAhPSBhbnlfcm93cyAmJgogICAgICBucm93ICE9
IHdhbnRfcm93cykKICAgIHRocm93IG9vcHMoKEYoIiVzIHdhbnRlZCAlZCByb3dzLCBnb3Qg
JXMiKQogICAgICAgICAgICAgICAgJSBjdHggJSB3YW50X3Jvd3MgJSBucm93KS5zdHIoKSk7
CgogIGlmICghcmVzdWx0KQogICAgdGhyb3cgb29wcyhjdHggKyAibnVsbCByZXN1bHQgc2V0
Iik7CgogIGZvciAoaW50IGkgPSAwOyBpIDwgbmNvbDsgKytpKSAKICAgIGlmICghcmVzdWx0
W2ldKQogICAgICB0aHJvdyBvb3BzKGN0eCArICJudWxsIGNvbHVtbiBuYW1lIik7CgogIGZv
ciAoaW50IHJvdyA9IDA7IHJvdyA8IG5yb3c7ICsrcm93KSAKICAgIHsKICAgICAgdmVjdG9y
PHN0cmluZz4gcm93dmVjOwogICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBuY29sOyAr
K2NvbCkKICAgICAgICB7CiAgICAgICAgICBpbnQgaSA9ICgoMSArIHJvdykgKiBuY29sKSAr
IGNvbDsKICAgICAgICAgIGlmICghcmVzdWx0W2ldKQogICAgICAgICAgICB0aHJvdyBvb3Bz
KGN0eCArICJudWxsIHJlc3VsdCB2YWx1ZSIpOwogICAgICAgICAgZWxzZQogICAgICAgICAg
ICByb3d2ZWMucHVzaF9iYWNrKHJlc3VsdFtpXSk7CiAgICAgICAgfQogICAgICByZXMucHVz
aF9iYWNrKHJvd3ZlYyk7CiAgICB9Cn0KCi8vIGdlbmVyYWwgYXBwbGljYXRpb24tbGV2ZWwg
bG9naWMKCnZvaWQgCmRhdGFiYXNlOjpzZXRfZmlsZW5hbWUoZnM6OnBhdGggY29uc3QgJiBm
aWxlKQp7CiAgaWYgKF9fc3FsKQogICAgewogICAgICB0aHJvdyBvb3BzKCJjYW5ub3QgY2hh
bmdlIGZpbGVuYW1lIHRvICIgKyBmaWxlLnN0cmluZygpICsgIiB3aGlsZSBkYiBpcyBvcGVu
Iik7CiAgICB9CiAgZmlsZW5hbWUgPSBmaWxlOwp9Cgp2b2lkIApkYXRhYmFzZTo6YmVnaW5f
dHJhbnNhY3Rpb24oKSAKewogIGlmICh0cmFuc2FjdGlvbl9sZXZlbCA9PSAwKQogICAgICBl
eGVjdXRlKCJCRUdJTiIpOwogIHRyYW5zYWN0aW9uX2xldmVsKys7Cn0KCnZvaWQgCmRhdGFi
YXNlOjpjb21taXRfdHJhbnNhY3Rpb24oKQp7CiAgaWYgKHRyYW5zYWN0aW9uX2xldmVsID09
IDEpCiAgICBleGVjdXRlKCJDT01NSVQiKTsKICB0cmFuc2FjdGlvbl9sZXZlbC0tOwp9Cgp2
b2lkIApkYXRhYmFzZTo6cm9sbGJhY2tfdHJhbnNhY3Rpb24oKQp7CiAgaWYgKHRyYW5zYWN0
aW9uX2xldmVsID09IDEpCiAgICBleGVjdXRlKCJST0xMQkFDSyIpOwogIHRyYW5zYWN0aW9u
X2xldmVsLS07Cn0KCgpib29sIApkYXRhYmFzZTo6ZXhpc3RzKGhleGVuYzxpZD4gY29uc3Qg
JiBpZGVudCwKICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjb25zdCAmIHRhYmxlKQp7
CiAgcmVzdWx0cyByZXM7CiAgZmV0Y2gocmVzLCBvbmVfY29sLCBhbnlfcm93cywgCiAgICAg
ICAgIlNFTEVDVCBpZCBGUk9NICclcScgV0hFUkUgaWQgPSAnJXEnIiwKICAgICAgICB0YWJs
ZS5jX3N0cigpLCBpZGVudCgpLmNfc3RyKCkpOwogIEkoKHJlcy5zaXplKCkgPT0gMSkgfHwg
KHJlcy5zaXplKCkgPT0gMCkpOwogIHJldHVybiByZXMuc2l6ZSgpID09IDE7Cn0KCgpib29s
IApkYXRhYmFzZTo6ZGVsdGFfZXhpc3RzKGhleGVuYzxpZD4gY29uc3QgJiBpZGVudCwKICAg
ICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY29uc3QgJiB0YWJsZSkKewogIHJlc3VsdHMg
cmVzOwogIGZldGNoKHJlcywgb25lX2NvbCwgYW55X3Jvd3MsIAogICAgICAgICJTRUxFQ1Qg
aWQgRlJPTSAnJXEnIFdIRVJFIGlkID0gJyVxJyIsCiAgICAgICAgdGFibGUuY19zdHIoKSwg
aWRlbnQoKS5jX3N0cigpKTsKICByZXR1cm4gcmVzLnNpemUoKSA+IDA7Cn0KCmJvb2wgCmRh
dGFiYXNlOjpkZWx0YV9leGlzdHMoaGV4ZW5jPGlkPiBjb25zdCAmIGlkZW50LAogICAgICAg
ICAgICAgICAgICAgICAgIGhleGVuYzxpZD4gY29uc3QgJiBiYXNlLAogICAgICAgICAgICAg
ICAgICAgICAgIHN0cmluZyBjb25zdCAmIHRhYmxlKQp7CiAgcmVzdWx0cyByZXM7CiAgZmV0
Y2gocmVzLCBvbmVfY29sLCBhbnlfcm93cywgCiAgICAgICAgIlNFTEVDVCBpZCBGUk9NICcl
cScgV0hFUkUgaWQgPSAnJXEnIEFORCBiYXNlID0gJyVxJyIsCiAgICAgICAgdGFibGUuY19z
dHIoKSwgaWRlbnQoKS5jX3N0cigpLCBiYXNlKCkuY19zdHIoKSk7CiAgSSgocmVzLnNpemUo
KSA9PSAxKSB8fCAocmVzLnNpemUoKSA9PSAwKSk7CiAgcmV0dXJuIHJlcy5zaXplKCkgPT0g
MTsKfQoKaW50IApkYXRhYmFzZTo6Y291bnQoc3RyaW5nIGNvbnN0ICYgdGFibGUpCnsKICBy
ZXN1bHRzIHJlczsKICBmZXRjaChyZXMsIG9uZV9jb2wsIG9uZV9yb3csIAogICAgICAgICJT
RUxFQ1QgQ09VTlQoKikgRlJPTSAnJXEnIiwgCiAgICAgICAgdGFibGUuY19zdHIoKSk7CiAg
cmV0dXJuIGxleGljYWxfY2FzdDxpbnQ+KHJlc1swXVswXSk7ICAKfQoKdm9pZCAKZGF0YWJh
c2U6OmdldChoZXhlbmM8aWQ+IGNvbnN0ICYgaWRlbnQsCiAgICAgICAgICAgICAgYmFzZTY0
PCBnemlwPGRhdGE+ID4gJiBkYXQsCiAgICAgICAgICAgICAgc3RyaW5nIGNvbnN0ICYgdGFi
bGUpCnsKICByZXN1bHRzIHJlczsKICBmZXRjaChyZXMsIG9uZV9jb2wsIG9uZV9yb3csCiAg
ICAgICAgIlNFTEVDVCBkYXRhIEZST00gJyVxJyBXSEVSRSBpZCA9ICclcSciLCAKICAgICAg
ICB0YWJsZS5jX3N0cigpLCBpZGVudCgpLmNfc3RyKCkpOwoKICAvLyBjb25zaXN0ZW5jeSBj
aGVjawogIGJhc2U2NDxnemlwPGRhdGE+ID4gcmRhdGEocmVzWzBdWzBdKTsKICBoZXhlbmM8
aWQ+IHRpZDsKICBjYWxjdWxhdGVfaWRlbnQocmRhdGEsIHRpZCk7CiAgSSh0aWQgPT0gaWRl
bnQpOwoKICBkYXQgPSByZGF0YTsKfQoKdm9pZCAKZGF0YWJhc2U6OmdldF9kZWx0YShoZXhl
bmM8aWQ+IGNvbnN0ICYgaWRlbnQsCiAgICAgICAgICAgICAgICAgICAgaGV4ZW5jPGlkPiBj
b25zdCAmIGJhc2UsCiAgICAgICAgICAgICAgICAgICAgYmFzZTY0PCBnemlwPGRlbHRhPiA+
ICYgZGVsLAogICAgICAgICAgICAgICAgICAgIHN0cmluZyBjb25zdCAmIHRhYmxlKQp7CiAg
SShpZGVudCgpICE9ICIiKTsKICBJKGJhc2UoKSAhPSAiIik7CiAgcmVzdWx0cyByZXM7CiAg
ZmV0Y2gocmVzLCBvbmVfY29sLCBvbmVfcm93LAogICAgICAgICJTRUxFQ1QgZGVsdGEgRlJP
TSAnJXEnIFdIRVJFIGlkID0gJyVxJyBBTkQgYmFzZSA9ICclcSciLCAKICAgICAgICB0YWJs
ZS5jX3N0cigpLCBpZGVudCgpLmNfc3RyKCksIGJhc2UoKS5jX3N0cigpKTsKICBkZWwgPSBy
ZXNbMF1bMF07Cn0KCnZvaWQgCmRhdGFiYXNlOjpwdXQoaGV4ZW5jPGlkPiBjb25zdCAmIGlk
ZW50LAogICAgICAgICAgICAgIGJhc2U2NDwgZ3ppcDxkYXRhPiA+IGNvbnN0ICYgZGF0LAog
ICAgICAgICAgICAgIHN0cmluZyBjb25zdCAmIHRhYmxlKQp7CiAgLy8gY29uc2lzdGVuY3kg
Y2hlY2sKICBJKGlkZW50KCkgIT0gIiIpOwogIGhleGVuYzxpZD4gdGlkOwogIGNhbGN1bGF0
ZV9pZGVudChkYXQsIHRpZCk7CiAgSSh0aWQgPT0gaWRlbnQpOwogIAogIGV4ZWN1dGUoIklO
U0VSVCBJTlRPICclcScgVkFMVUVTKCclcScsICclcScpIiwgCiAgICAgICAgICB0YWJsZS5j
X3N0cigpLCBpZGVudCgpLmNfc3RyKCksIGRhdCgpLmNfc3RyKCkpOwp9CgoKdm9pZCAKZGF0
YWJhc2U6OnB1dF9kZWx0YShoZXhlbmM8aWQ+IGNvbnN0ICYgaWRlbnQsCiAgICAgICAgICAg
ICAgICAgICAgaGV4ZW5jPGlkPiBjb25zdCAmIGJhc2UsCiAgICAgICAgICAgICAgICAgICAg
YmFzZTY0PGd6aXA8ZGVsdGE+ID4gY29uc3QgJiBkZWwsCiAgICAgICAgICAgICAgICAgICAg
c3RyaW5nIGNvbnN0ICYgdGFibGUpCnsKICAvLyBuYjogZGVsdGEgc2NoZW1hIGlzIChpZCwg
YmFzZSwgZGVsdGEpCiAgSShpZGVudCgpICE9ICIiKTsKICBJKGJhc2UoKSAhPSAiIik7CiAg
ZXhlY3V0ZSgiSU5TRVJUIElOVE8gJyVxJyBWQUxVRVMoJyVxJywgJyVxJywgJyVxJykiLCAK
ICAgICAgICAgIHRhYmxlLmNfc3RyKCksIAogICAgICAgICAgaWRlbnQoKS5jX3N0cigpLCBi
YXNlKCkuY19zdHIoKSwgZGVsKCkuY19zdHIoKSk7Cn0KCnZvaWQgCmRhdGFiYXNlOjpnZXRf
dmVyc2lvbihoZXhlbmM8aWQ+IGNvbnN0ICYgaWRlbnQsCiAgICAgICAgICAgICAgICAgICAg
ICBiYXNlNjQ8IGd6aXA8ZGF0YT4gPiAmIGRhdCwKICAgICAgICAgICAgICAgICAgICAgIHN0
cmluZyBjb25zdCAmIGRhdGFfdGFibGUsCiAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcg
Y29uc3QgJiBkZWx0YV90YWJsZSkKewogIEkoaWRlbnQoKSAhPSAiIik7CiAgaWYgKGV4aXN0
cyhpZGVudCwgZGF0YV90YWJsZSkpCiAgICB7CiAgICAgIC8vIGVhc3kgcGF0aAogICAgICBn
ZXQoaWRlbnQsIGRhdCwgZGF0YV90YWJsZSk7CiAgICB9CiAgZWxzZQogICAgewogICAgICAv
LyB0cmlja3kgcGF0aAoKICAgICAgLy8gd2Ugc3RhcnQgZnJvbSB0aGUgZmlsZSB3ZSB3YW50
IHRvIHJlY29uc3RydWN0IGFuZCB3b3JrICpmb3J3YXJkcyoKICAgICAgLy8gdGhyb3VnaCB0
aGUgZGF0YWJhc2UsIHVudGlsIHdlIGdldCB0byBhIGZ1bGwgZGF0YSBvYmplY3QuIHdlIHRo
ZW4KICAgICAgLy8gdHJhY2UgYmFjayB0aHJvdWdoIHRoZSBsaXN0IG9mIGVkZ2VzIHdlIGZv
bGxvd2VkIHRvIGdldCB0byB0aGUgZGF0YQogICAgICAvLyBvYmplY3QsIGFwcGx5aW5nIHJl
dmVyc2UgZGVsdGFzLgogICAgICAvLwogICAgICAvLyB0aGUgZWZmZWN0IG9mIHRoaXMgYWxn
b3JpdGhtIGlzIGJyZWFkdGgtZmlyc3Qgc2VhcmNoLCBiYWNrd2FyZHMKICAgICAgLy8gdGhy
b3VnaCB0aGUgc3RvcmFnZSBncmFwaCwgdG8gZGlzY292ZXIgYSBmb3J3YXJkcyBzaG9ydGVz
dCBwYXRoLCBhbmQKICAgICAgLy8gdGhlbiBmb2xsb3dpbmcgdGhhdCBzaG9ydGVzdCBwYXRo
IHdpdGggZGVsdGEgYXBwbGljYXRpb24uCiAgICAgIC8vCiAgICAgIC8vIHdlIHVzZWQgdG8g
ZG8gdGhpcyB3aXRoIHRoZSBib29zdCBncmFwaCBsaWJyYXJ5LCBidXQgaXQgaW52b3ZsZWQK
ICAgICAgLy8gbG9hZGluZyB0b28gbXVjaCBvZiB0aGUgc3RvcmFnZSBncmFwaCBpbnRvIG1l
bW9yeSBhdCBhbnkgbW9tZW50LiB0aGlzCiAgICAgIC8vIGltcGVyYXRpdmUgdmVyc2lvbiBv
bmx5IGxvYWRzIHRoZSBkZXNjZW5kZW50cyBvZiB0aGUgcmVjb25zdHJ1Y3Rpb24KICAgICAg
Ly8gbm9kZSwgc28gaXQgbXVjaCBjaGVhcGVyIGluIHRlcm1zIG9mIG1lbW9yeS4KICAgICAg
Ly8KICAgICAgLy8gd2UgYWxzbyBtYWludGFpbiBhIGN5Y2xlLWRldGVjdGluZyBzZXQsIGp1
c3QgdG8gYmUgc2FmZQogICAgICAKICAgICAgTChGKCJyZWNvbnN0cnVjdGluZyAlcyBpbiAl
c1xuIikgJSBpZGVudCAlIGRlbHRhX3RhYmxlKTsKICAgICAgSShkZWx0YV9leGlzdHMoaWRl
bnQsIGRlbHRhX3RhYmxlKSk7CiAgICAgIAogICAgICAvLyBuYjogYW4gZWRnZSBtYXAgZ29l
cyBpbiB0aGUgZGlyZWN0aW9uIG9mIHRoZQogICAgICAvLyBkZWx0YSwgKm5vdCogdGhlIGRp
cmVjdGlvbiB3ZSBkaXNjb3ZlciB0aGluZ3MgaW4sCiAgICAgIC8vIGkuZS4gZWFjaCBtYXAg
aXMgb2YgdGhlIGZvcm0gW25ld2lkXSAtPiBbb2xkaWRdCgogICAgICB0eXBlZGVmIG1hcDwg
aGV4ZW5jPGlkPiwgaGV4ZW5jPGlkPiA+IGVkZ2VtYXA7CiAgICAgIGxpc3Q8IHNoYXJlZF9w
dHI8ZWRnZW1hcD4gPiBwYXRoczsKCiAgICAgIHNldDwgaGV4ZW5jPGlkPiA+IGZyb250aWVy
LCBjeWNsZXM7CiAgICAgIGZyb250aWVyLmluc2VydChpZGVudCk7CgogICAgICBib29sIGZv
dW5kX3Jvb3QgPSBmYWxzZTsKICAgICAgaGV4ZW5jPGlkPiByb290KCIiKTsKCiAgICAgIHdo
aWxlICghIGZvdW5kX3Jvb3QpCiAgICAgICAgewogICAgICAgICAgc2V0PCBoZXhlbmM8aWQ+
ID4gbmV4dF9mcm9udGllcjsKICAgICAgICAgIHNoYXJlZF9wdHI8ZWRnZW1hcD4gZnJvbnRp
ZXJfbWFwKG5ldyBlZGdlbWFwKCkpOwoKICAgICAgICAgIEkoIWZyb250aWVyLmVtcHR5KCkp
OwoKICAgICAgICAgIGZvciAoc2V0PCBoZXhlbmM8aWQ+ID46OmNvbnN0X2l0ZXJhdG9yIGkg
PSBmcm9udGllci5iZWdpbigpOwogICAgICAgICAgICAgICBpICE9IGZyb250aWVyLmVuZCgp
OyArK2kpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBpZiAoZXhpc3RzKCppLCBkYXRh
X3RhYmxlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgcm9vdCA9ICpp
OwogICAgICAgICAgICAgICAgICBmb3VuZF9yb290ID0gdHJ1ZTsKICAgICAgICAgICAgICAg
ICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZWxzZQogICAgICAg
ICAgICAgICAgewogICAgICAgICAgICAgICAgICBjeWNsZXMuaW5zZXJ0KCppKTsKICAgICAg
ICAgICAgICAgICAgcmVzdWx0cyByZXM7CiAgICAgICAgICAgICAgICAgIGZldGNoKHJlcywg
b25lX2NvbCwgYW55X3Jvd3MsICJTRUxFQ1QgYmFzZSBmcm9tICclcScgV0hFUkUgaWQgPSAn
JXEnIiwKICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFfdGFibGUuY19zdHIoKSwgKCpp
KSgpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8
IHJlcy5zaXplKCk7ICsraykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAg
ICAgICAgICBoZXhlbmM8aWQ+IGNvbnN0IG54dChyZXNba11bMF0pOwoKICAgICAgICAgICAg
ICAgICAgICAgIGlmIChjeWNsZXMuZmluZChueHQpICE9IGN5Y2xlcy5lbmQoKSkKICAgICAg
ICAgICAgICAgICAgICAgICAgdGhyb3cgb29wcygiY3ljbGUgaW4gdGFibGUgJyIgKyBkZWx0
YV90YWJsZSArICInLCBhdCBub2RlICIgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgKyAoKmkpKCkgKyAiIDwtICIgKyBueHQoKSk7CgogICAgICAgICAgICAgICAgICAg
ICAgbmV4dF9mcm9udGllci5pbnNlcnQobnh0KTsKCiAgICAgICAgICAgICAgICAgICAgICBp
ZiAoZnJvbnRpZXJfbWFwLT5maW5kKG54dCkgPT0gZnJvbnRpZXJfbWFwLT5lbmQoKSkKICAg
ICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgIEwoRigi
aW5zZXJ0aW5nIGVkZ2U6ICVzIDwtICVzXG4iKSAlICgqaSkgJSBueHQpOwogICAgICAgICAg
ICAgICAgICAgICAgICAgIGZyb250aWVyX21hcC0+aW5zZXJ0KG1ha2VfcGFpcihueHQsICpp
KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIGVs
c2UKICAgICAgICAgICAgICAgICAgICAgICAgTChGKCJza2lwcGluZyBtZXJnZSBlZGdlICVz
IDwtICVzXG4iKSAlICgqaSkgJSBueHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAg
ICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgaWYgKCFmb3VuZF9yb290KQog
ICAgICAgICAgICB7CiAgICAgICAgICAgICAgZnJvbnRpZXIgPSBuZXh0X2Zyb250aWVyOwog
ICAgICAgICAgICAgIHBhdGhzLnB1c2hfZnJvbnQoZnJvbnRpZXJfbWFwKTsKICAgICAgICAg
ICAgfQogICAgICAgIH0KCiAgICAgIC8vIHBhdGggYnVpbHQsIG5vdyBhbGwgd2UgbmVlZCB0
byBkbyBpcyBmb2xsb3cgaXQgYmFjawoKICAgICAgSShmb3VuZF9yb290KTsKICAgICAgSShy
b290KCkgIT0gIiIpOwogICAgICBiYXNlNjQ8IGd6aXA8ZGF0YT4gPiBiZWdpbl9wYWNrZWQ7
CiAgICAgIGRhdGEgYmVnaW47ICAgICAgCiAgICAgIGdldChyb290LCBiZWdpbl9wYWNrZWQs
IGRhdGFfdGFibGUpOwogICAgICB1bnBhY2soYmVnaW5fcGFja2VkLCBiZWdpbik7CiAgICAg
IGhleGVuYzxpZD4gY3VyciA9IHJvb3Q7CgogICAgICBib29zdDo6c2hhcmVkX3B0cjxkZWx0
YV9hcHBsaWNhdG9yPiBhcHAgPSBuZXdfcGllY2V3aXNlX2FwcGxpY2F0b3IoKTsKICAgICAg
YXBwLT5iZWdpbihiZWdpbigpKTsKICAgICAgCiAgICAgIGZvciAobGlzdDwgc2hhcmVkX3B0
cjxlZGdlbWFwPiA+Ojpjb25zdF9pdGVyYXRvciBwID0gcGF0aHMuYmVnaW4oKTsKICAgICAg
ICAgICBwICE9IHBhdGhzLmVuZCgpOyArK3ApCiAgICAgICAgewogICAgICAgICAgc2hhcmVk
X3B0cjxlZGdlbWFwPiBpID0gKnA7CiAgICAgICAgICBJKGktPmZpbmQoY3VycikgIT0gaS0+
ZW5kKCkpOwogICAgICAgICAgaGV4ZW5jPGlkPiBjb25zdCBueHQgPSBpLT5maW5kKGN1cnIp
LT5zZWNvbmQ7CgogICAgICAgICAgTChGKCJmb2xsb3dpbmcgZGVsdGEgJXMgLT4gJXNcbiIp
ICUgY3VyciAlIG54dCk7CiAgICAgICAgICBiYXNlNjQ8IGd6aXA8ZGVsdGE+ID4gZGVsX3Bh
Y2tlZDsKICAgICAgICAgIGdldF9kZWx0YShueHQsIGN1cnIsIGRlbF9wYWNrZWQsIGRlbHRh
X3RhYmxlKTsKICAgICAgICAgIGRlbHRhIGRlbDsKICAgICAgICAgIHVucGFjayhkZWxfcGFj
a2VkLCBkZWwpOwogICAgICAgICAgYXBwbHlfZGVsdGEgKGFwcCwgZGVsKCkpOwogICAgICAg
ICAgYXBwLT5uZXh0KCk7CiAgICAgICAgICBjdXJyID0gbnh0OwogICAgICAgIH0KCiAgICAg
IHN0cmluZyB0bXA7CiAgICAgIGFwcC0+ZmluaXNoKHRtcCk7CiAgICAgIGRhdGEgZW5kKHRt
cCk7CgogICAgICBoZXhlbmM8aWQ+IGZpbmFsOwogICAgICBjYWxjdWxhdGVfaWRlbnQoZW5k
LCBmaW5hbCk7CiAgICAgIEkoZmluYWwgPT0gaWRlbnQpOwogICAgICBwYWNrKGVuZCwgZGF0
KTsKICAgIH0KfQoKCnZvaWQgCmRhdGFiYXNlOjpkcm9wKGhleGVuYzxpZD4gY29uc3QgJiBp
ZGVudCwgCiAgICAgICAgICAgICAgIHN0cmluZyBjb25zdCAmIHRhYmxlKQp7CiAgZXhlY3V0
ZSgiREVMRVRFIEZST00gJyVxJyBXSEVSRSBpZCA9ICclcSciLCAgCiAgICAgICAgICB0YWJs
ZS5jX3N0cigpLAogICAgICAgICAgaWRlbnQoKS5jX3N0cigpKTsKfQoKdm9pZCAKZGF0YWJh
c2U6OnB1dF92ZXJzaW9uKGhleGVuYzxpZD4gY29uc3QgJiBvbGRfaWQsCiAgICAgICAgICAg
ICAgICAgICAgICBoZXhlbmM8aWQ+IGNvbnN0ICYgbmV3X2lkLAogICAgICAgICAgICAgICAg
ICAgICAgYmFzZTY0PCBnemlwPGRlbHRhPiA+IGNvbnN0ICYgZGVsLAogICAgICAgICAgICAg
ICAgICAgICAgc3RyaW5nIGNvbnN0ICYgZGF0YV90YWJsZSwKICAgICAgICAgICAgICAgICAg
ICAgIHN0cmluZyBjb25zdCAmIGRlbHRhX3RhYmxlKQp7CgogIGJhc2U2NDwgZ3ppcDxkYXRh
PiA+IG9sZF9kYXRhLCBuZXdfZGF0YTsKICBiYXNlNjQ8IGd6aXA8ZGVsdGE+ID4gcmV2ZXJz
ZV9kZWx0YTsKICAKICBnZXRfdmVyc2lvbihvbGRfaWQsIG9sZF9kYXRhLCBkYXRhX3RhYmxl
LCBkZWx0YV90YWJsZSk7CiAgcGF0Y2gob2xkX2RhdGEsIGRlbCwgbmV3X2RhdGEpOwogIGRp
ZmYobmV3X2RhdGEsIG9sZF9kYXRhLCByZXZlcnNlX2RlbHRhKTsKICAgICAgCiAgdHJhbnNh
Y3Rpb25fZ3VhcmQgZ3VhcmQoKnRoaXMpOwogIGlmIChleGlzdHMob2xkX2lkLCBkYXRhX3Rh
YmxlKSkKICAgIHsKICAgICAgLy8gZGVzY2VuZGVudCBvZiBhIGhlYWQgdmVyc2lvbiByZXBs
YWNlcyB0aGUgaGVhZCwgdGhlcmVmb3JlIG9sZCBoZWFkCiAgICAgIC8vIG11c3QgYmUgZGlz
cG9zZWQgb2YKICAgICAgZHJvcChvbGRfaWQsIGRhdGFfdGFibGUpOwogICAgfQogIHB1dChu
ZXdfaWQsIG5ld19kYXRhLCBkYXRhX3RhYmxlKTsKICBwdXRfZGVsdGEob2xkX2lkLCBuZXdf
aWQsIHJldmVyc2VfZGVsdGEsIGRlbHRhX3RhYmxlKTsKICBndWFyZC5jb21taXQoKTsKfQoK
dm9pZCAKZGF0YWJhc2U6OnB1dF9yZXZlcnNlX3ZlcnNpb24oaGV4ZW5jPGlkPiBjb25zdCAm
IG5ld19pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGV4ZW5jPGlkPiBjb25z
dCAmIG9sZF9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0PCBnemlw
PGRlbHRhPiA+IGNvbnN0ICYgcmV2ZXJzZV9kZWwsCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHN0cmluZyBjb25zdCAmIGRhdGFfdGFibGUsCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHN0cmluZyBjb25zdCAmIGRlbHRhX3RhYmxlKQp7CiAgYmFzZTY0PCBnemlw
PGRhdGE+ID4gb2xkX2RhdGEsIG5ld19kYXRhOwogIAogIGdldF92ZXJzaW9uKG5ld19pZCwg
bmV3X2RhdGEsIGRhdGFfdGFibGUsIGRlbHRhX3RhYmxlKTsKICBwYXRjaChuZXdfZGF0YSwg
cmV2ZXJzZV9kZWwsIG9sZF9kYXRhKTsKICBoZXhlbmM8aWQ+IGNoZWNrOwogIGNhbGN1bGF0
ZV9pZGVudChvbGRfZGF0YSwgY2hlY2spOwogIEkob2xkX2lkID09IGNoZWNrKTsKICAgICAg
CiAgdHJhbnNhY3Rpb25fZ3VhcmQgZ3VhcmQoKnRoaXMpOwogIHB1dF9kZWx0YShvbGRfaWQs
IG5ld19pZCwgcmV2ZXJzZV9kZWwsIGRlbHRhX3RhYmxlKTsKICBndWFyZC5jb21taXQoKTsK
fQoKCgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0KLy8gLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIC0tCi8vIC0tICAgICAgICAgICAgICBwdWJsaWMgaW50
ZXJmYWNlIGZvbGxvd3MgICAgICAgICAgICAgICAgICAtLQovLyAtLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KLy8gLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
Cgpib29sIApkYXRhYmFzZTo6ZmlsZV92ZXJzaW9uX2V4aXN0cyhmaWxlX2lkIGNvbnN0ICYg
aWQpCnsKICByZXR1cm4gZGVsdGFfZXhpc3RzKGlkLmlubmVyKCksICJmaWxlX2RlbHRhcyIp
IAogICAgfHwgZXhpc3RzKGlkLmlubmVyKCksICJmaWxlcyIpOwp9Cgpib29sIApkYXRhYmFz
ZTo6bWFuaWZlc3RfdmVyc2lvbl9leGlzdHMobWFuaWZlc3RfaWQgY29uc3QgJiBpZCkKewog
IHJldHVybiBkZWx0YV9leGlzdHMoaWQuaW5uZXIoKSwgIm1hbmlmZXN0X2RlbHRhcyIpIAog
ICAgfHwgZXhpc3RzKGlkLmlubmVyKCksICJtYW5pZmVzdHMiKTsKfQoKYm9vbCAKZGF0YWJh
c2U6OnJldmlzaW9uX2V4aXN0cyhyZXZpc2lvbl9pZCBjb25zdCAmIGlkKQp7CiAgcmV0dXJu
IGV4aXN0cyhpZC5pbm5lcigpLCAicmV2aXNpb25zIik7Cn0KCgp2b2lkIApkYXRhYmFzZTo6
Z2V0X2ZpbGVfdmVyc2lvbihmaWxlX2lkIGNvbnN0ICYgaWQsCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGZpbGVfZGF0YSAmIGRhdCkKewogIGJhc2U2NDwgZ3ppcDxkYXRhPiA+IHRt
cDsKICBnZXRfdmVyc2lvbihpZC5pbm5lcigpLCB0bXAsICJmaWxlcyIsICJmaWxlX2RlbHRh
cyIpOwogIGRhdCA9IHRtcDsKfQoKdm9pZCAKZGF0YWJhc2U6OmdldF9tYW5pZmVzdF92ZXJz
aW9uKG1hbmlmZXN0X2lkIGNvbnN0ICYgaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBtYW5pZmVzdF9kYXRhICYgZGF0KQp7CiAgYmFzZTY0PCBnemlwPGRhdGE+ID4gdG1w
OwogIGdldF92ZXJzaW9uKGlkLmlubmVyKCksIHRtcCwgIm1hbmlmZXN0cyIsICJtYW5pZmVz
dF9kZWx0YXMiKTsKICBkYXQgPSB0bXA7Cn0KCnZvaWQgCmRhdGFiYXNlOjpnZXRfbWFuaWZl
c3QobWFuaWZlc3RfaWQgY29uc3QgJiBpZCwKICAgICAgICAgICAgICAgICAgICAgICBtYW5p
ZmVzdF9tYXAgJiBtbSkKewogIG1hbmlmZXN0X2RhdGEgbWRhdDsKICBnZXRfbWFuaWZlc3Rf
dmVyc2lvbihpZCwgbWRhdCk7CiAgcmVhZF9tYW5pZmVzdF9tYXAobWRhdCwgbW0pOwp9CgoK
dm9pZCAKZGF0YWJhc2U6OnB1dF9maWxlKGZpbGVfaWQgY29uc3QgJiBpZCwKICAgICAgICAg
ICAgICAgICAgIGZpbGVfZGF0YSBjb25zdCAmIGRhdCkKewogIHB1dChpZC5pbm5lcigpLCBk
YXQuaW5uZXIoKSwgImZpbGVzIik7Cn0KCnZvaWQgCmRhdGFiYXNlOjpwdXRfZmlsZV92ZXJz
aW9uKGZpbGVfaWQgY29uc3QgJiBvbGRfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAg
IGZpbGVfaWQgY29uc3QgJiBuZXdfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZp
bGVfZGVsdGEgY29uc3QgJiBkZWwpCnsKICBwdXRfdmVyc2lvbihvbGRfaWQuaW5uZXIoKSwg
bmV3X2lkLmlubmVyKCksIGRlbC5pbm5lcigpLCAKICAgICAgICAgICAgICAiZmlsZXMiLCAi
ZmlsZV9kZWx0YXMiKTsKfQoKdm9pZCAKZGF0YWJhc2U6OnB1dF9maWxlX3JldmVyc2VfdmVy
c2lvbihmaWxlX2lkIGNvbnN0ICYgbmV3X2lkLAogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGZpbGVfaWQgY29uc3QgJiBvbGRfaWQsICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9k
ZWx0YSBjb25zdCAmIGRlbCkKewogIHB1dF9yZXZlcnNlX3ZlcnNpb24obmV3X2lkLmlubmVy
KCksIG9sZF9pZC5pbm5lcigpLCBkZWwuaW5uZXIoKSwgCiAgICAgICAgICAgICAgICAgICAg
ICAiZmlsZXMiLCAiZmlsZV9kZWx0YXMiKTsKfQoKCnZvaWQgCmRhdGFiYXNlOjpwdXRfbWFu
aWZlc3QobWFuaWZlc3RfaWQgY29uc3QgJiBpZCwKICAgICAgICAgICAgICAgICAgICAgICBt
YW5pZmVzdF9kYXRhIGNvbnN0ICYgZGF0KQp7CiAgcHV0KGlkLmlubmVyKCksIGRhdC5pbm5l
cigpLCAibWFuaWZlc3RzIik7Cn0KCnZvaWQgCmRhdGFiYXNlOjpwdXRfbWFuaWZlc3RfdmVy
c2lvbihtYW5pZmVzdF9pZCBjb25zdCAmIG9sZF9pZCwKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIG1hbmlmZXN0X2lkIGNvbnN0ICYgbmV3X2lkLAogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgbWFuaWZlc3RfZGVsdGEgY29uc3QgJiBkZWwpCnsKICBwdXRfdmVy
c2lvbihvbGRfaWQuaW5uZXIoKSwgbmV3X2lkLmlubmVyKCksIGRlbC5pbm5lcigpLCAKICAg
ICAgICAgICAgICAibWFuaWZlc3RzIiwgIm1hbmlmZXN0X2RlbHRhcyIpOwp9Cgp2b2lkIApk
YXRhYmFzZTo6cHV0X21hbmlmZXN0X3JldmVyc2VfdmVyc2lvbihtYW5pZmVzdF9pZCBjb25z
dCAmIG5ld19pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFu
aWZlc3RfaWQgY29uc3QgJiBvbGRfaWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0X2Rl
bHRhIGNvbnN0ICYgZGVsKQp7CiAgcHV0X3JldmVyc2VfdmVyc2lvbihuZXdfaWQuaW5uZXIo
KSwgb2xkX2lkLmlubmVyKCksIGRlbC5pbm5lcigpLCAKICAgICAgICAgICAgICAgICAgICAg
ICJtYW5pZmVzdHMiLCAibWFuaWZlc3RfZGVsdGFzIik7Cn0KCgp2b2lkIApkYXRhYmFzZTo6
Z2V0X3JldmlzaW9uX2FuY2VzdHJ5KHN0ZDo6c2V0PHN0ZDo6cGFpcjxyZXZpc2lvbl9pZCwg
cmV2aXNpb25faWQ+ID4gJiBncmFwaCkKewogIHJlc3VsdHMgcmVzOwogIGdyYXBoLmNsZWFy
KCk7CiAgZmV0Y2gocmVzLCAyLCBhbnlfcm93cywgCiAgICAgICAgIlNFTEVDVCBwYXJlbnQs
Y2hpbGQgRlJPTSByZXZpc2lvbl9hbmNlc3RyeSIpOwogIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgcmVzLnNpemUoKTsgKytpKQogICAgZ3JhcGguaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHJl
dmlzaW9uX2lkKHJlc1tpXVswXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
cmV2aXNpb25faWQocmVzW2ldWzFdKSkpOwp9Cgp2b2lkIApkYXRhYmFzZTo6Z2V0X3Jldmlz
aW9uX3BhcmVudHMocmV2aXNpb25faWQgY29uc3QgJiBpZCwKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgc2V0PHJldmlzaW9uX2lkPiAmIHBhcmVudHMpCnsKICByZXN1bHRzIHJl
czsKICBwYXJlbnRzLmNsZWFyKCk7CiAgZmV0Y2gocmVzLCBvbmVfY29sLCBhbnlfcm93cywg
CiAgICAgICAgIlNFTEVDVCBwYXJlbnQgRlJPTSByZXZpc2lvbl9hbmNlc3RyeSBXSEVSRSBj
aGlsZCA9ICclcSciLAogICAgICAgIGlkLmlubmVyKCkoKS5jX3N0cigpKTsKICBmb3IgKHNp
emVfdCBpID0gMDsgaSA8IHJlcy5zaXplKCk7ICsraSkKICAgIHBhcmVudHMuaW5zZXJ0KHJl
dmlzaW9uX2lkKHJlc1tpXVswXSkpOwp9Cgp2b2lkIApkYXRhYmFzZTo6Z2V0X3JldmlzaW9u
X2NoaWxkcmVuKHJldmlzaW9uX2lkIGNvbnN0ICYgaWQsCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgc2V0PHJldmlzaW9uX2lkPiAmIGNoaWxkcmVuKQp7CiAgcmVzdWx0cyBy
ZXM7CiAgY2hpbGRyZW4uY2xlYXIoKTsKICBmZXRjaChyZXMsIG9uZV9jb2wsIGFueV9yb3dz
LCAKICAgICAgICAiU0VMRUNUIGNoaWxkIEZST00gcmV2aXNpb25fYW5jZXN0cnkgV0hFUkUg
cGFyZW50ID0gJyVxJyIsCiAgICAgICAgaWQuaW5uZXIoKSgpLmNfc3RyKCkpOwogIGZvciAo
c2l6ZV90IGkgPSAwOyBpIDwgcmVzLnNpemUoKTsgKytpKQogICAgY2hpbGRyZW4uaW5zZXJ0
KHJldmlzaW9uX2lkKHJlc1tpXVswXSkpOwp9Cgp2b2lkIApkYXRhYmFzZTo6Z2V0X3Jldmlz
aW9uX21hbmlmZXN0KHJldmlzaW9uX2lkIGNvbnN0ICYgcmlkLAogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgbWFuaWZlc3RfaWQgJiBtaWQpCnsKICByZXZpc2lvbl9zZXQgcmV2
OwogIGdldF9yZXZpc2lvbihyaWQsIHJldik7CiAgbWlkID0gcmV2Lm5ld19tYW5pZmVzdDsK
fQoKdm9pZCAKZGF0YWJhc2U6OmdldF9yZXZpc2lvbihyZXZpc2lvbl9pZCBjb25zdCAmIGlk
LAogICAgICAgICAgICAgICAgICAgICAgIHJldmlzaW9uX3NldCAmIHJldikKewogIHJldmlz
aW9uX2RhdGEgZDsKICBnZXRfcmV2aXNpb24oaWQsIGQpOwogIHJlYWRfcmV2aXNpb25fc2V0
KGQsIHJldik7Cn0KCnZvaWQgCmRhdGFiYXNlOjpnZXRfcmV2aXNpb24ocmV2aXNpb25faWQg
Y29uc3QgJiBpZCwKICAgICAgICAgICAgICAgICAgICAgICByZXZpc2lvbl9kYXRhICYgZGF0
KQp7CiAgcmVzdWx0cyByZXM7CiAgZmV0Y2gocmVzLCBvbmVfY29sLCBvbmVfcm93LCAKICAg
ICAgICAiU0VMRUNUIGRhdGEgRlJPTSByZXZpc2lvbnMgV0hFUkUgaWQgPSAnJXEnIiwKICAg
ICAgICBpZC5pbm5lcigpKCkuY19zdHIoKSk7CgogIGRhdCA9IHJldmlzaW9uX2RhdGEocmVz
WzBdWzBdKTsKCiAgLy8gdmVyaWZ5IHRoYXQgd2UgZ290IGEgcmV2aXNpb24gd2l0aCB0aGUg
cmlnaHQgaWQKICB7CiAgICByZXZpc2lvbl9pZCB0bXA7CiAgICBjYWxjdWxhdGVfaWRlbnQo
ZGF0LCB0bXApOwogICAgSShpZCA9PSB0bXApOwogIH0KfQoKdm9pZCAKZGF0YWJhc2U6OnB1
dF9yZXZpc2lvbihyZXZpc2lvbl9pZCBjb25zdCAmIG5ld19pZCwKICAgICAgICAgICAgICAg
ICAgICAgICByZXZpc2lvbl9zZXQgY29uc3QgJiByZXYpCnsKCiAgSSghcmV2aXNpb25fZXhp
c3RzKG5ld19pZCkpOwogIHJldmlzaW9uX2RhdGEgZDsKCiAgd3JpdGVfcmV2aXNpb25fc2V0
KHJldiwgZCk7CiAgcmV2aXNpb25faWQgdG1wOwogIGNhbGN1bGF0ZV9pZGVudChkLCB0bXAp
OwogIEkodG1wID09IG5ld19pZCk7CgogIHRyYW5zYWN0aW9uX2d1YXJkIGd1YXJkKCp0aGlz
KTsKCiAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gcmV2aXNpb25zIFZBTFVFUygnJXEnLCAnJXEn
KSIsIAogICAgICAgICAgbmV3X2lkLmlubmVyKCkoKS5jX3N0cigpLCAKICAgICAgICAgIGQu
aW5uZXIoKSgpLmNfc3RyKCkpOwoKICBmb3IgKGVkZ2VfbWFwOjpjb25zdF9pdGVyYXRvciBl
ID0gcmV2LmVkZ2VzLmJlZ2luKCk7CiAgICAgICBlICE9IHJldi5lZGdlcy5lbmQoKTsgKytl
KQogICAgewogICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyByZXZpc2lvbl9hbmNlc3RyeSBW
QUxVRVMoJyVxJywgJyVxJykiLCAKICAgICAgICAgICAgICBlZGdlX29sZF9yZXZpc2lvbihl
KS5pbm5lcigpKCkuY19zdHIoKSwKICAgICAgICAgICAgICBuZXdfaWQuaW5uZXIoKSgpLmNf
c3RyKCkpOwogICAgfQoKICBndWFyZC5jb21taXQoKTsKfQoKdm9pZCAKZGF0YWJhc2U6OnB1
dF9yZXZpc2lvbihyZXZpc2lvbl9pZCBjb25zdCAmIG5ld19pZCwKICAgICAgICAgICAgICAg
ICAgICAgICByZXZpc2lvbl9kYXRhIGNvbnN0ICYgZGF0KQp7CiAgcmV2aXNpb25fc2V0IHJl
djsKICByZWFkX3JldmlzaW9uX3NldChkYXQsIHJldik7CiAgcHV0X3JldmlzaW9uKG5ld19p
ZCwgcmV2KTsKfQoKCi8vIGNyeXB0byBrZXkgbWFuYWdlbWVudAoKdm9pZCAKZGF0YWJhc2U6
OmdldF9rZXlfaWRzKHN0cmluZyBjb25zdCAmIHBhdHRlcm4sCiAgICAgICAgICAgICAgICAg
ICAgICB2ZWN0b3I8cnNhX2tleXBhaXJfaWQ+ICYgcHVia2V5cywKICAgICAgICAgICAgICAg
ICAgICAgIHZlY3Rvcjxyc2Ffa2V5cGFpcl9pZD4gJiBwcml2a2V5cykKewogIHB1YmtleXMu
Y2xlYXIoKTsKICBwcml2a2V5cy5jbGVhcigpOwogIHJlc3VsdHMgcmVzOwoKICBpZiAocGF0
dGVybiAhPSAiIikKICAgIGZldGNoKHJlcywgb25lX2NvbCwgYW55X3Jvd3MsIAogICAgICAg
ICAgIlNFTEVDVCBpZCBmcm9tIHB1YmxpY19rZXlzIFdIRVJFIGlkIEdMT0IgJyVxJyIsCiAg
ICAgICAgICBwYXR0ZXJuLmNfc3RyKCkpOwogIGVsc2UKICAgIGZldGNoKHJlcywgb25lX2Nv
bCwgYW55X3Jvd3MsIAogICAgICAgICAgIlNFTEVDVCBpZCBmcm9tIHB1YmxpY19rZXlzIik7
CgogIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzLnNpemUoKTsgKytpKQogICAgcHVia2V5
cy5wdXNoX2JhY2socmVzW2ldWzBdKTsKCiAgaWYgKHBhdHRlcm4gIT0gIiIpCiAgICBmZXRj
aChyZXMsIG9uZV9jb2wsIGFueV9yb3dzLCAKICAgICAgICAgICJTRUxFQ1QgaWQgZnJvbSBw
cml2YXRlX2tleXMgV0hFUkUgaWQgR0xPQiAnJXEnIiwKICAgICAgICAgIHBhdHRlcm4uY19z
dHIoKSk7CiAgZWxzZQogICAgZmV0Y2gocmVzLCBvbmVfY29sLCBhbnlfcm93cywgCiAgICAg
ICAgICAiU0VMRUNUIGlkIGZyb20gcHJpdmF0ZV9rZXlzIik7CgogIGZvciAoc2l6ZV90IGkg
PSAwOyBpIDwgcmVzLnNpemUoKTsgKytpKQogICAgcHJpdmtleXMucHVzaF9iYWNrKHJlc1tp
XVswXSk7Cn0KCnZvaWQgCmRhdGFiYXNlOjpnZXRfcHJpdmF0ZV9rZXlzKHZlY3Rvcjxyc2Ff
a2V5cGFpcl9pZD4gJiBwcml2a2V5cykKewogIHByaXZrZXlzLmNsZWFyKCk7CiAgcmVzdWx0
cyByZXM7CiAgZmV0Y2gocmVzLCBvbmVfY29sLCBhbnlfcm93cywgICJTRUxFQ1QgaWQgZnJv
bSBwcml2YXRlX2tleXMiKTsKICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlcy5zaXplKCk7
ICsraSkKICAgIHByaXZrZXlzLnB1c2hfYmFjayhyZXNbaV1bMF0pOwp9Cgpib29sIApkYXRh
YmFzZTo6cHVibGljX2tleV9leGlzdHMoaGV4ZW5jPGlkPiBjb25zdCAmIGhhc2gpCnsKICBy
ZXN1bHRzIHJlczsKICBmZXRjaChyZXMsIG9uZV9jb2wsIGFueV9yb3dzLCAKICAgICAgICAi
U0VMRUNUIGlkIEZST00gcHVibGljX2tleXMgV0hFUkUgaGFzaCA9ICclcSciLAogICAgICAg
IGhhc2goKS5jX3N0cigpKTsKICBJKChyZXMuc2l6ZSgpID09IDEpIHx8IChyZXMuc2l6ZSgp
ID09IDApKTsKICBpZiAocmVzLnNpemUoKSA9PSAxKSAKICAgIHJldHVybiB0cnVlOwogIHJl
dHVybiBmYWxzZTsKfQoKYm9vbCAKZGF0YWJhc2U6OnB1YmxpY19rZXlfZXhpc3RzKHJzYV9r
ZXlwYWlyX2lkIGNvbnN0ICYgaWQpCnsKICByZXN1bHRzIHJlczsKICBmZXRjaChyZXMsIG9u
ZV9jb2wsIGFueV9yb3dzLCAKICAgICAgICAiU0VMRUNUIGlkIEZST00gcHVibGljX2tleXMg
V0hFUkUgaWQgPSAnJXEnIiwKICAgICAgICBpZCgpLmNfc3RyKCkpOwogIEkoKHJlcy5zaXpl
KCkgPT0gMSkgfHwgKHJlcy5zaXplKCkgPT0gMCkpOwogIGlmIChyZXMuc2l6ZSgpID09IDEp
IAogICAgcmV0dXJuIHRydWU7CiAgcmV0dXJuIGZhbHNlOwp9Cgpib29sIApkYXRhYmFzZTo6
cHJpdmF0ZV9rZXlfZXhpc3RzKHJzYV9rZXlwYWlyX2lkIGNvbnN0ICYgaWQpCnsKICByZXN1
bHRzIHJlczsKICBmZXRjaChyZXMsIG9uZV9jb2wsIGFueV9yb3dzLAogICAgICAgICJTRUxF
Q1QgaWQgRlJPTSBwcml2YXRlX2tleXMgV0hFUkUgaWQgPSAnJXEnIiwKICAgICAgICBpZCgp
LmNfc3RyKCkpOwogIEkoKHJlcy5zaXplKCkgPT0gMSkgfHwgKHJlcy5zaXplKCkgPT0gMCkp
OwogIGlmIChyZXMuc2l6ZSgpID09IDEpCiAgICByZXR1cm4gdHJ1ZTsKICByZXR1cm4gZmFs
c2U7Cn0KCmJvb2wgCmRhdGFiYXNlOjprZXlfZXhpc3RzKHJzYV9rZXlwYWlyX2lkIGNvbnN0
ICYgaWQpCnsKICByZXR1cm4gcHVibGljX2tleV9leGlzdHMoaWQpIHx8IHByaXZhdGVfa2V5
X2V4aXN0cyhpZCk7Cn0KCnZvaWQgCmRhdGFiYXNlOjpnZXRfcHVia2V5KGhleGVuYzxpZD4g
Y29uc3QgJiBoYXNoLCAKICAgICAgICAgICAgICAgICAgICAgcnNhX2tleXBhaXJfaWQgJiBp
ZCwKICAgICAgICAgICAgICAgICAgICAgYmFzZTY0PHJzYV9wdWJfa2V5PiAmIHB1Yl9lbmNv
ZGVkKQp7CiAgcmVzdWx0cyByZXM7CiAgZmV0Y2gocmVzLCAyLCBvbmVfcm93LCAKICAgICAg
ICAiU0VMRUNUIGlkLCBrZXlkYXRhIEZST00gcHVibGljX2tleXMgd2hlcmUgaGFzaCA9ICcl
cSciLCAKICAgICAgICBoYXNoKCkuY19zdHIoKSk7CiAgaWQgPSByZXNbMF1bMF07CiAgcHVi
X2VuY29kZWQgPSByZXNbMF1bMV07Cn0KCnZvaWQgCmRhdGFiYXNlOjpnZXRfa2V5KHJzYV9r
ZXlwYWlyX2lkIGNvbnN0ICYgcHViX2lkLCAKICAgICAgICAgICAgICAgICAgYmFzZTY0PHJz
YV9wdWJfa2V5PiAmIHB1Yl9lbmNvZGVkKQp7CiAgcmVzdWx0cyByZXM7CiAgZmV0Y2gocmVz
LCBvbmVfY29sLCBvbmVfcm93LCAKICAgICAgICAiU0VMRUNUIGtleWRhdGEgRlJPTSBwdWJs
aWNfa2V5cyB3aGVyZSBpZCA9ICclcSciLCAKICAgICAgICBwdWJfaWQoKS5jX3N0cigpKTsK
ICBwdWJfZW5jb2RlZCA9IHJlc1swXVswXTsKfQoKdm9pZCAKZGF0YWJhc2U6OmdldF9rZXko
cnNhX2tleXBhaXJfaWQgY29uc3QgJiBwcml2X2lkLCAKICAgICAgICAgICAgICAgICAgYmFz
ZTY0PCBhcmM0PHJzYV9wcml2X2tleT4gPiAmIHByaXZfZW5jb2RlZCkKewogIHJlc3VsdHMg
cmVzOwogIGZldGNoKHJlcywgb25lX2NvbCwgb25lX2NvbCwgCiAgICAgICAgIlNFTEVDVCBr
ZXlkYXRhIEZST00gcHJpdmF0ZV9rZXlzIHdoZXJlIGlkID0gJyVxJyIsIAogICAgICAgIHBy
aXZfaWQoKS5jX3N0cigpKTsKICBwcml2X2VuY29kZWQgPSByZXNbMF1bMF07Cn0KCgp2b2lk
IApkYXRhYmFzZTo6cHV0X2tleShyc2Ffa2V5cGFpcl9pZCBjb25zdCAmIHB1Yl9pZCwgCiAg
ICAgICAgICAgICAgICAgIGJhc2U2NDxyc2FfcHViX2tleT4gY29uc3QgJiBwdWJfZW5jb2Rl
ZCkKewogIGhleGVuYzxpZD4gdGhhc2g7CiAga2V5X2hhc2hfY29kZShwdWJfaWQsIHB1Yl9l
bmNvZGVkLCB0aGFzaCk7CiAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gcHVibGljX2tleXMgVkFM
VUVTKCclcScsICclcScsICclcScpIiwgCiAgICAgICAgICB0aGFzaCgpLmNfc3RyKCksIHB1
Yl9pZCgpLmNfc3RyKCksIHB1Yl9lbmNvZGVkKCkuY19zdHIoKSk7Cn0KCnZvaWQgCmRhdGFi
YXNlOjpwdXRfa2V5KHJzYV9rZXlwYWlyX2lkIGNvbnN0ICYgcHJpdl9pZCwgCiAgICAgICAg
ICAgICAgICAgIGJhc2U2NDwgYXJjNDxyc2FfcHJpdl9rZXk+ID4gY29uc3QgJiBwcml2X2Vu
Y29kZWQpCnsKICAKICBoZXhlbmM8aWQ+IHRoYXNoOwogIGtleV9oYXNoX2NvZGUocHJpdl9p
ZCwgcHJpdl9lbmNvZGVkLCB0aGFzaCk7CiAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gcHJpdmF0
ZV9rZXlzIFZBTFVFUygnJXEnLCAnJXEnLCAnJXEnKSIsIAogICAgICAgICAgdGhhc2goKS5j
X3N0cigpLCBwcml2X2lkKCkuY19zdHIoKSwgcHJpdl9lbmNvZGVkKCkuY19zdHIoKSk7Cn0K
CnZvaWQgCmRhdGFiYXNlOjpwdXRfa2V5X3BhaXIocnNhX2tleXBhaXJfaWQgY29uc3QgJiBp
ZCwgCiAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0PHJzYV9wdWJfa2V5PiBjb25zdCAm
IHB1Yl9lbmNvZGVkLAogICAgICAgICAgICAgICAgICAgICAgIGJhc2U2NDwgYXJjNDxyc2Ff
cHJpdl9rZXk+ID4gY29uc3QgJiBwcml2X2VuY29kZWQpCnsKICB0cmFuc2FjdGlvbl9ndWFy
ZCBndWFyZCgqdGhpcyk7CiAgcHV0X2tleShpZCwgcHViX2VuY29kZWQpOwogIHB1dF9rZXko
aWQsIHByaXZfZW5jb2RlZCk7CiAgZ3VhcmQuY29tbWl0KCk7Cn0KCnZvaWQKZGF0YWJhc2U6
OmRlbGV0ZV9wcml2YXRlX2tleShyc2Ffa2V5cGFpcl9pZCBjb25zdCAmIHB1Yl9pZCkKewog
IGV4ZWN1dGUoIkRFTEVURSBGUk9NIHByaXZhdGVfa2V5cyBXSEVSRSBpZCA9ICclcSciLAoJ
ICBwdWJfaWQoKS5jX3N0cigpKTsKfQoKLy8gY2VydCBtYW5hZ2VtZW50Cgpib29sIApkYXRh
YmFzZTo6Y2VydF9leGlzdHMoY2VydCBjb25zdCAmIHQsCiAgICAgICAgICAgICAgICAgICAg
ICBzdHJpbmcgY29uc3QgJiB0YWJsZSkKewogIHJlc3VsdHMgcmVzOwogIGZldGNoKHJlcywg
MSwgYW55X3Jvd3MsCiAgICAgICAgIlNFTEVDVCBpZCBGUk9NICclcScgV0hFUkUgaWQgPSAn
JXEnICIKICAgICAgICAiQU5EIG5hbWUgPSAnJXEnIEFORCB2YWx1ZSA9ICclcScgIiAKICAg
ICAgICAiQU5EIGtleXBhaXIgPSAnJXEnIEFORCBzaWduYXR1cmUgPSAnJXEnICIsCiAgICAg
ICAgdGFibGUuY19zdHIoKSwKICAgICAgICB0LmlkZW50KCkuY19zdHIoKSwKICAgICAgICB0
Lm5hbWUoKS5jX3N0cigpLAogICAgICAgIHQudmFsdWUoKS5jX3N0cigpLAogICAgICAgIHQu
a2V5KCkuY19zdHIoKSwKICAgICAgICB0LnNpZygpLmNfc3RyKCkpOwogIEkocmVzLnNpemUo
KSA9PSAwIHx8IHJlcy5zaXplKCkgPT0gMSk7CiAgcmV0dXJuIHJlcy5zaXplKCkgPT0gMTsK
fQoKdm9pZCAKZGF0YWJhc2U6OnB1dF9jZXJ0KGNlcnQgY29uc3QgJiB0LAogICAgICAgICAg
ICAgICAgICAgc3RyaW5nIGNvbnN0ICYgdGFibGUpCnsKICBoZXhlbmM8aWQ+IHRoYXNoOwog
IGNlcnRfaGFzaF9jb2RlKHQsIHRoYXNoKTsKICBleGVjdXRlKCJJTlNFUlQgSU5UTyAnJXEn
IFZBTFVFUygnJXEnLCAnJXEnLCAnJXEnLCAnJXEnLCAnJXEnLCAnJXEnKSIsIAogICAgICAg
ICAgdGFibGUuY19zdHIoKSwKICAgICAgICAgIHRoYXNoKCkuY19zdHIoKSwKICAgICAgICAg
IHQuaWRlbnQoKS5jX3N0cigpLAogICAgICAgICAgdC5uYW1lKCkuY19zdHIoKSwgCiAgICAg
ICAgICB0LnZhbHVlKCkuY19zdHIoKSwKICAgICAgICAgIHQua2V5KCkuY19zdHIoKSwKICAg
ICAgICAgIHQuc2lnKCkuY19zdHIoKSk7Cn0KCnZvaWQgCmRhdGFiYXNlOjpyZXN1bHRzX3Rv
X2NlcnRzKHJlc3VsdHMgY29uc3QgJiByZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAg
IHZlY3RvcjxjZXJ0PiAmIGNlcnRzKQp7CiAgY2VydHMuY2xlYXIoKTsKICBmb3IgKHNpemVf
dCBpID0gMDsgaSA8IHJlcy5zaXplKCk7ICsraSkKICAgIHsKICAgICAgY2VydCB0OwogICAg
ICB0ID0gY2VydChoZXhlbmM8aWQ+KHJlc1tpXVswXSksIAogICAgICAgICAgICAgIGNlcnRf
bmFtZShyZXNbaV1bMV0pLAogICAgICAgICAgICAgIGJhc2U2NDxjZXJ0X3ZhbHVlPihyZXNb
aV1bMl0pLAogICAgICAgICAgICAgIHJzYV9rZXlwYWlyX2lkKHJlc1tpXVszXSksCiAgICAg
ICAgICAgICAgYmFzZTY0PHJzYV9zaGExX3NpZ25hdHVyZT4ocmVzW2ldWzRdKSk7CiAgICAg
IGNlcnRzLnB1c2hfYmFjayh0KTsKICAgIH0KfQoKCnN0cnVjdCB2YWxpZF9jZXJ0cwp7CiAg
c2V0PHJzYV9rZXlwYWlyX2lkPiB2YWxpZF9zaWduZXJzOwogIGhleGVuYzxpZD4gaWRlbnQ7
CiAgY2VydF9uYW1lIG5hbWU7CiAgYmFzZTY0PGNlcnRfdmFsdWU+IHZhbDsKICBzdHJpbmcg
c2lnbmF0dXJlX3R5cGU7CgogIHZhbGlkX2NlcnRzKHN0cmluZyBjb25zdCAmIHR5KSAKICAg
IDogc2lnbmF0dXJlX3R5cGUodHkpIAogIHsKICAgIEwoRigiY29uc3RydWN0aW5nIHZhbGlk
aXR5IGNoZWNrZXIgZm9yICVzIGNlcnRzXG4iKSAlIHR5KTsKICB9CgogIGJvb2wgY2hlY2tf
c2lnbmVyX3RydXN0KGFwcF9zdGF0ZSAmIGFwcCkKICB7CiAgICBib29sIHRydXN0ZWQgPSBm
YWxzZTsKCiAgICBMKEYoImNoZWNraW5nICVkIHNpZ25lciAlcyBjZXJ0IHRydXN0IHNldFxu
IikgCiAgICAgICUgdmFsaWRfc2lnbmVycy5zaXplKCkgJSBzaWduYXR1cmVfdHlwZSk7CiAg
ICB0cnkKICAgICAgewogICAgICAgIGNlcnRfdmFsdWUgdjsKICAgICAgICBkZWNvZGVfYmFz
ZTY0KHZhbCwgdik7CiAgICAgICAgLy8gRklYTUU6IGxhbWUgc3RyaW5nLW1ha2VzLXRoZS1t
b2RlIGFyZ3VtZW50CiAgICAgICAgaWYgKHNpZ25hdHVyZV90eXBlID09ICJyZXZpc2lvbiIp
CiAgICAgICAgICB0cnVzdGVkID0gYXBwLmx1YS5ob29rX2dldF9yZXZpc2lvbl9jZXJ0X3Ry
dXN0KHZhbGlkX3NpZ25lcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgaWRlbnQsIG5hbWUsIHYpOwogICAgICAgIGVsc2UgaWYg
KHNpZ25hdHVyZV90eXBlID09ICJtYW5pZmVzdCIpCiAgICAgICAgICB0cnVzdGVkID0gYXBw
Lmx1YS5ob29rX2dldF9tYW5pZmVzdF9jZXJ0X3RydXN0KHZhbGlkX3NpZ25lcnMsCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlk
ZW50LCBuYW1lLCB2KTsKICAgICAgICBlbHNlIGlmIChzaWduYXR1cmVfdHlwZSA9PSAiZmls
ZSIpCiAgICAgICAgICB0cnVzdGVkID0gYXBwLmx1YS5ob29rX2dldF9maWxlX2NlcnRfdHJ1
c3QodmFsaWRfc2lnbmVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBpZGVudCwgbmFtZSwgdik7CiAgICAgICAgZWxzZQogICAgICAg
ICAgSShmYWxzZSk7IC8vIHNob3VsZCBiZSBpbGxlZ2FsCiAgICAgIH0KICAgIGNhdGNoICgu
Li4pCiAgICAgIHsKICAgICAgICBXKEYoImV4Y2VwdGlvbiBpbiBzcWxpdGUgdmFsaWRfY2Vy
dHM6OmNoZWNrX3NldF90cnVzdFxuIikpOwogICAgICB9CiAgICAKICAgIGlmICh0cnVzdGVk
KQogICAgICBMKEYoInRydXN0IGZ1bmN0aW9uIGxpa2VkICVkICVzIHNpZ25lcnNcbiIpIAog
ICAgICAgICUgdmFsaWRfc2lnbmVycy5zaXplKCkgJSBzaWduYXR1cmVfdHlwZSk7CiAgICBl
bHNlCiAgICAgIEwoRigidHJ1c3QgZnVuY3Rpb24gZGlzbGlrZWQgJWQgJXMgc2lnbmVyc1xu
IikgCiAgICAgICAgJSB2YWxpZF9zaWduZXJzLnNpemUoKSAlIHNpZ25hdHVyZV90eXBlKTsK
ICAgIAogICAgcmV0dXJuIHRydXN0ZWQ7CiAgfQoKICB2b2lkIGNoZWNrX3NpbmdsZV9zaWdu
ZXIoYXBwX3N0YXRlICYgYXBwLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJn
YywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKiogYXJndikKICB7
CiAgICB0cnkKICAgICAgewogICAgICAgIC8vIGFyZ3MgYXJlOiBoYXNoLCBpZCwgbmFtZSwg
dmFsdWUsIGtleXBhaXIsIHB1YmtleSwgc2lnbmF0dXJlCiAgICAgICAgLy8gTChGKCJlbnRy
aWVzIGFyZSBbJXNdIFslc10gWyVzXSBbJXNdIFslc10gWyVzXSBbJXNdXG4iKSAKICAgICAg
ICAvLyAgICAgICAgJSBhcmd2WzBdICUgYXJndlsxXSAlIGFyZ3ZbMl0gJSBhcmd2WzNdICUg
YXJndls0XSAlIGFyZ3ZbNV0gJSBhcmd2WzZdKTsKCiAgICAgICAgY2VydCB0bXAgPSBjZXJ0
KGhleGVuYzxpZD4oYXJndlsxXSksIAogICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X25h
bWUoYXJndlsyXSksCiAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U2NDxjZXJ0X3ZhbHVl
Pihhcmd2WzNdKSwKICAgICAgICAgICAgICAgICAgICAgICAgcnNhX2tleXBhaXJfaWQoYXJn
dls0XSksCiAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U2NDxyc2Ffc2hhMV9zaWduYXR1
cmU+KGFyZ3ZbNl0pKTsKCiAgICAgICAgYmFzZTY0PHJzYV9wdWJfa2V5PiBwayhhcmd2WzVd
KTsKCiAgICAgICAgaWYgKGlkZW50KCkuZW1wdHkoKSkKICAgICAgICAgIGlkZW50ID0gdG1w
LmlkZW50OwogICAgICAgIGVsc2UKICAgICAgICAgIEkoaWRlbnQgPT0gdG1wLmlkZW50KTsK
CiAgICAgICAgaWYgKG5hbWUoKS5lbXB0eSgpKQogICAgICAgICAgbmFtZSA9IHRtcC5uYW1l
OwogICAgICAgIGVsc2UKICAgICAgICAgIEkobmFtZSA9PSB0bXAubmFtZSk7CgogICAgICAg
IGlmICh2YWwoKS5lbXB0eSgpKQogICAgICAgICAgdmFsID0gdG1wLnZhbHVlOwogICAgICAg
IGVsc2UKICAgICAgICAgIEkodmFsID09IHRtcC52YWx1ZSk7CgogICAgICAgIC8vICAgICAg
TChGKCJleGFtaW5pbmcgJyVzJyAlcyBjZXJ0IGZyb20gJXNcbiIpIAogICAgICAgIC8vICAg
ICAgICAlIG5hbWUgJSBzaWduYXR1cmVfdHlwZSAlIGlkZW50KTsKCiAgICAgICAgc3RyaW5n
IHR4dDsKICAgICAgICBjZXJ0X3NpZ25hYmxlX3RleHQodG1wLCB0eHQpOwogICAgICAgIGlm
IChjaGVja19zaWduYXR1cmUoYXBwLmx1YSwgdG1wLmtleSwgcGssIHR4dCwgdG1wLnNpZykp
CiAgICAgICAgICB7CiAgICAgICAgICAgIEwoRigib2sgJyVzJyAlcyBjZXJ0IGZyb20gJXNc
biIpIAogICAgICAgICAgICAgICUgbmFtZSAlIHNpZ25hdHVyZV90eXBlICUgdG1wLmtleSk7
CiAgICAgICAgICAgIHZhbGlkX3NpZ25lcnMuaW5zZXJ0KHRtcC5rZXkpOwogICAgICAgICAg
fQogICAgICAgIGVsc2UKICAgICAgICAgIHsKICAgICAgICAgICAgVyhGKCJiYWQgJyVzJyAl
cyBjZXJ0IGZyb20gJXNcbiIpIAogICAgICAgICAgICAgICUgbmFtZSAlIHNpZ25hdHVyZV90
eXBlICUgdG1wLmtleSk7CiAgICAgICAgICB9CiAgICAgIH0KICAgIGNhdGNoIChzdGQ6OmV4
Y2VwdGlvbiAmIGUpCiAgICAgIHsKICAgICAgICBXKEYoInN0ZDo6ZXhjZXB0aW9uIGluIHNx
bGl0ZSB2YWxpZF9jZXJ0czo6Y2hlY2tfc2luZ2xlX3NpZ25lcjogJXNcbiIpICUgZS53aGF0
KCkpOwogICAgICB9CiAgICBjYXRjaCAoLi4uKQogICAgICB7CiAgICAgICAgVyhGKCJ1bmtu
b3duIGV4Y2VwdGlvbiBpbiBzcWxpdGUgdmFsaWRfY2VydHM6OmNoZWNrX3NpbmdsZV9zaWdu
ZXJcbiIpKTsKICAgICAgfQogIH0KfTsKCmV4dGVybiAiQyIKewoKc3RhdGljIHZvaWQKdHJ1
c3RlZF9zdGVwX2NhbGxiYWNrKHNxbGl0ZV9mdW5jICogZm5fY3R4LCAKICAgICAgICAgICAg
ICAgICAgICAgIGludCBhcmdjLCAKICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3Qg
KiogYXJndikKewogIGFwcF9zdGF0ZSAqIGFwcCA9IE5VTEw7IAogIHZhbGlkX2NlcnRzICoq
IHZwcDsKCiAgSShmbl9jdHgpOwogIEkoYXJnYyA9PSA4KTsKICBJKGFyZ3YpOwogIGZvciAo
c2l6ZV90IGkgPSAwOyBpIDwgODsgKytpKQogICAgSShhcmd2W2ldKTsKCiAgYXBwID0gc3Rh
dGljX2Nhc3Q8YXBwX3N0YXRlICo+KHNxbGl0ZV91c2VyX2RhdGEoZm5fY3R4KSk7CiAgSShh
cHApOwogIHZwcCA9IHN0YXRpY19jYXN0PHZhbGlkX2NlcnRzICoqPihzcWxpdGVfYWdncmVn
YXRlX2NvbnRleHQoZm5fY3R4LCBzaXplb2YodmFsaWRfY2VydHMgKikpKTsKICBJKHZwcCk7
CiAgaWYgKCEgKCp2cHApKQogICAgKnZwcCA9IG5ldyB2YWxpZF9jZXJ0cyhzdHJpbmcoYXJn
dlswXSkpOwogIEkoKnZwcCk7CiAgKCp2cHApLT5jaGVja19zaW5nbGVfc2lnbmVyKCphcHAs
IGFyZ2MtMSwgYXJndisxKTsgIAp9CgpzdGF0aWMgdm9pZAp0cnVzdGVkX2ZpbmFsaXplX2Nh
bGxiYWNrKHNxbGl0ZV9mdW5jICogZm5fY3R4KQp7CiAgYXBwX3N0YXRlICogYXBwID0gTlVM
TDsgCiAgdmFsaWRfY2VydHMgKiogdnBwOwogIGFwcCA9IHN0YXRpY19jYXN0PGFwcF9zdGF0
ZSAqPihzcWxpdGVfdXNlcl9kYXRhKGZuX2N0eCkpOwogIEkoYXBwKTsKICB2cHAgPSBzdGF0
aWNfY2FzdDx2YWxpZF9jZXJ0cyAqKj4oc3FsaXRlX2FnZ3JlZ2F0ZV9jb250ZXh0KGZuX2N0
eCwgc2l6ZW9mKHZhbGlkX2NlcnRzICopKSk7CgogIEkodnBwKTsKICBJKCp2cHApOwoKICBp
ZiAoKCp2cHApLT5jaGVja19zaWduZXJfdHJ1c3QoKmFwcCkpCiAgICBzcWxpdGVfc2V0X3Jl
c3VsdF9pbnQoZm5fY3R4LCAxKTsKICBlbHNlCiAgICBzcWxpdGVfc2V0X3Jlc3VsdF9pbnQo
Zm5fY3R4LCAwKTsKCiAgZGVsZXRlICgqdnBwKTsKfQp9CgoKdm9pZApkYXRhYmFzZTo6aW5z
dGFsbF9mdW5jdGlvbnMoYXBwX3N0YXRlICogYXBwKQp7CiAgLy8gcmVnaXN0ZXIgYW55IGZ1
bmN0aW9ucyB3ZSdyZSBnb2luZyB0byB1c2UKICBJKHNxbGl0ZV9jcmVhdGVfZnVuY3Rpb24o
c3FsKCksICJ1bmJhc2U2NCIsIC0xLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNx
bGl0ZV91bmJhc2U2NF9mbiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09
IDApOwoKICBJKHNxbGl0ZV9jcmVhdGVfYWdncmVnYXRlKHNxbCgpLCAidHJ1c3RlZCIsIDgs
IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRydXN0ZWRfc3RlcF9jYWxsYmFjaywK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cnVzdGVkX2ZpbmFsaXplX2NhbGxiYWNr
LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwKSA9PSAwKTsKfQoKdm9pZApkYXRh
YmFzZTo6aW5zdGFsbF92aWV3cygpCnsKICAvLyBkZWxldGUgYW55IGV4aXN0aW5nIHZpZXdz
CiAgcmVzdWx0cyByZXM7CiAgZmV0Y2gocmVzLCBvbmVfY29sLCBhbnlfcm93cywKICAgICAg
ICAiU0VMRUNUIG5hbWUgRlJPTSBzcWxpdGVfbWFzdGVyIFdIRVJFIHR5cGU9J3ZpZXcnIik7
CiAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXMuc2l6ZSgpOyArK2kpCiAgICB7CiAgICAg
IGV4ZWN1dGUoIkRST1AgVklFVyAnJXEnIiwgcmVzW2ldWzBdLmNfc3RyKCkpOwogICAgfQog
IC8vIHJlZ2lzdGVyIGFueSB2aWV3cyB3ZSdyZSBnb2luZyB0byB1c2UKICBleGVjdXRlKHZp
ZXdzX2NvbnN0YW50KTsKfQoKdm9pZCAKZGF0YWJhc2U6OmdldF9oZWFkcyhiYXNlNjQ8Y2Vy
dF92YWx1ZT4gY29uc3QgJiBicmFuY2gsCiAgICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8
cmV2aXNpb25faWQ+ICYgaGVhZHMpCnsKICByZXN1bHRzIHJlczsKICBmZXRjaChyZXMsIG9u
ZV9jb2wsIGFueV9yb3dzLAogICAgICAgICJTRUxFQ1QgcGFyZW50ICIKICAgICAgICAiRlJP
TSBicmFuY2hfaGVhZHMgIgogICAgICAgICJXSEVSRSB2YWx1ZSA9ICclcSciLAogICAgICAg
IGJyYW5jaCgpLmNfc3RyKCkpOwogIGhlYWRzLmNsZWFyKCk7CiAgZm9yIChzaXplX3QgaSA9
IDA7IGkgPCByZXMuc2l6ZSgpOyArK2kpCiAgICB7CiAgICAgIGhlYWRzLmluc2VydChyZXZp
c2lvbl9pZChyZXNbaV1bMF0pKTsKICAgIH0KfQoKdm9pZCAKZGF0YWJhc2U6OmdldF9jZXJ0
cyhoZXhlbmM8aWQ+IGNvbnN0ICYgaWRlbnQsIAogICAgICAgICAgICAgICAgICAgIHZlY3Rv
cjxjZXJ0PiAmIGNlcnRzLCAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAg
ICAgICAgc3RyaW5nIGNvbnN0ICYgdGFibGUpCnsKICByZXN1bHRzIHJlczsKICBmZXRjaChy
ZXMsIDUsIGFueV9yb3dzLCAKICAgICAgICAiU0VMRUNUIGlkLCBuYW1lLCB2YWx1ZSwga2V5
cGFpciwgc2lnbmF0dXJlIEZST00gJyVxJyAiCiAgICAgICAgIldIRVJFIGlkID0gJyVxJyIs
IAogICAgICAgIHRhYmxlLmNfc3RyKCksICAKICAgICAgICBpZGVudCgpLmNfc3RyKCkpOwog
IHJlc3VsdHNfdG9fY2VydHMocmVzLCBjZXJ0cyk7Cn0KCgp2b2lkIApkYXRhYmFzZTo6Z2V0
X2NlcnRzKGNlcnRfbmFtZSBjb25zdCAmIG5hbWUsICAgICAgICAgICAKICAgICAgICAgICAg
ICAgICAgICB2ZWN0b3I8Y2VydD4gJiBjZXJ0cywKICAgICAgICAgICAgICAgICAgICBzdHJp
bmcgY29uc3QgJiB0YWJsZSkKewogIHJlc3VsdHMgcmVzOwogIGZldGNoKHJlcywgNSwgYW55
X3Jvd3MsIAogICAgICAgICJTRUxFQ1QgaWQsIG5hbWUsIHZhbHVlLCBrZXlwYWlyLCBzaWdu
YXR1cmUgIgogICAgICAgICJGUk9NICclcScgV0hFUkUgbmFtZSA9ICclcSciLCAKICAgICAg
ICB0YWJsZS5jX3N0cigpLCAgCiAgICAgICAgbmFtZSgpLmNfc3RyKCkpOwogIHJlc3VsdHNf
dG9fY2VydHMocmVzLCBjZXJ0cyk7Cn0KCgp2b2lkIApkYXRhYmFzZTo6Z2V0X2NlcnRzKGhl
eGVuYzxpZD4gY29uc3QgJiBpZGVudCwgCiAgICAgICAgICAgICAgICAgICAgY2VydF9uYW1l
IGNvbnN0ICYgbmFtZSwgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIHZlY3Rvcjxj
ZXJ0PiAmIGNlcnRzLAogICAgICAgICAgICAgICAgICAgIHN0cmluZyBjb25zdCAmIHRhYmxl
KQp7CiAgcmVzdWx0cyByZXM7CiAgZmV0Y2gocmVzLCA1LCBhbnlfcm93cywgCiAgICAgICAg
IlNFTEVDVCBpZCwgbmFtZSwgdmFsdWUsIGtleXBhaXIsIHNpZ25hdHVyZSAiCiAgICAgICAg
IkZST00gJyVxJyAiCiAgICAgICAgIldIRVJFIGlkID0gJyVxJyBBTkQgbmFtZSA9ICclcSci
LCAKICAgICAgICB0YWJsZS5jX3N0cigpLCAgCiAgICAgICAgaWRlbnQoKS5jX3N0cigpLAog
ICAgICAgIG5hbWUoKS5jX3N0cigpKTsKICByZXN1bHRzX3RvX2NlcnRzKHJlcywgY2VydHMp
Owp9Cgp2b2lkIApkYXRhYmFzZTo6Z2V0X2NlcnRzKGNlcnRfbmFtZSBjb25zdCAmIG5hbWUs
CiAgICAgICAgICAgICAgICAgICAgYmFzZTY0PGNlcnRfdmFsdWU+IGNvbnN0ICYgdmFsLCAK
ICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8Y2VydD4gJiBjZXJ0cywKICAgICAgICAgICAg
ICAgICAgICBzdHJpbmcgY29uc3QgJiB0YWJsZSkKewogIHJlc3VsdHMgcmVzOwogIGZldGNo
KHJlcywgNSwgYW55X3Jvd3MsIAogICAgICAgICJTRUxFQ1QgaWQsIG5hbWUsIHZhbHVlLCBr
ZXlwYWlyLCBzaWduYXR1cmUgIgogICAgICAgICJGUk9NICclcScgIgogICAgICAgICJXSEVS
RSBuYW1lID0gJyVxJyBBTkQgdmFsdWUgPSAnJXEnIiwgCiAgICAgICAgdGFibGUuY19zdHIo
KSwgIAogICAgICAgIG5hbWUoKS5jX3N0cigpLAogICAgICAgIHZhbCgpLmNfc3RyKCkpOwog
IHJlc3VsdHNfdG9fY2VydHMocmVzLCBjZXJ0cyk7Cn0KCgp2b2lkIApkYXRhYmFzZTo6Z2V0
X2NlcnRzKGhleGVuYzxpZD4gY29uc3QgJiBpZGVudCwgCiAgICAgICAgICAgICAgICAgICAg
Y2VydF9uYW1lIGNvbnN0ICYgbmFtZSwgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAg
IGJhc2U2NDxjZXJ0X3ZhbHVlPiBjb25zdCAmIHZhbHVlLAogICAgICAgICAgICAgICAgICAg
IHZlY3RvcjxjZXJ0PiAmIGNlcnRzLAogICAgICAgICAgICAgICAgICAgIHN0cmluZyBjb25z
dCAmIHRhYmxlKQp7CiAgcmVzdWx0cyByZXM7CiAgZmV0Y2gocmVzLCA1LCBhbnlfcm93cywg
CiAgICAgICAgIlNFTEVDVCBpZCwgbmFtZSwgdmFsdWUsIGtleXBhaXIsIHNpZ25hdHVyZSAi
CiAgICAgICAgIkZST00gJyVxJyAiCiAgICAgICAgIldIRVJFIGlkID0gJyVxJyBBTkQgbmFt
ZSA9ICclcScgQU5EIHZhbHVlID0gJyVxJyIsIAogICAgICAgIHRhYmxlLmNfc3RyKCksICAK
ICAgICAgICBpZGVudCgpLmNfc3RyKCksCiAgICAgICAgbmFtZSgpLmNfc3RyKCksCiAgICAg
ICAgdmFsdWUoKS5jX3N0cigpKTsKICByZXN1bHRzX3RvX2NlcnRzKHJlcywgY2VydHMpOwp9
CgoKCmJvb2wgCmRhdGFiYXNlOjpyZXZpc2lvbl9jZXJ0X2V4aXN0cyhyZXZpc2lvbjxjZXJ0
PiBjb25zdCAmIGNlcnQpCnsgCiAgcmV0dXJuIGNlcnRfZXhpc3RzKGNlcnQuaW5uZXIoKSwg
InJldmlzaW9uX2NlcnRzIik7IAp9Cgpib29sIApkYXRhYmFzZTo6bWFuaWZlc3RfY2VydF9l
eGlzdHMobWFuaWZlc3Q8Y2VydD4gY29uc3QgJiBjZXJ0KQp7IAogIHJldHVybiBjZXJ0X2V4
aXN0cyhjZXJ0LmlubmVyKCksICJtYW5pZmVzdF9jZXJ0cyIpOyAKfQoKYm9vbCAKZGF0YWJh
c2U6OmZpbGVfY2VydF9leGlzdHMoZmlsZTxjZXJ0PiBjb25zdCAmIGNlcnQpCnsgCiAgcmV0
dXJuIGNlcnRfZXhpc3RzKGNlcnQuaW5uZXIoKSwgImZpbGVfY2VydHMiKTsgCn0KCnZvaWQg
CmRhdGFiYXNlOjpwdXRfbWFuaWZlc3RfY2VydChtYW5pZmVzdDxjZXJ0PiBjb25zdCAmIGNl
cnQpCnsgCiAgcHV0X2NlcnQoY2VydC5pbm5lcigpLCAibWFuaWZlc3RfY2VydHMiKTsgCn0K
CnZvaWQgCmRhdGFiYXNlOjpwdXRfcmV2aXNpb25fY2VydChyZXZpc2lvbjxjZXJ0PiBjb25z
dCAmIGNlcnQpCnsgCiAgcHV0X2NlcnQoY2VydC5pbm5lcigpLCAicmV2aXNpb25fY2VydHMi
KTsgCn0KCnZvaWQgCmRhdGFiYXNlOjpwdXRfZmlsZV9jZXJ0KGZpbGU8Y2VydD4gY29uc3Qg
JiBjZXJ0KQp7IAogIHB1dF9jZXJ0KGNlcnQuaW5uZXIoKSwgImZpbGVfY2VydHMiKTsgCn0K
CnZvaWQgCmRhdGFiYXNlOjpnZXRfZmlsZV9jZXJ0cyhjZXJ0X25hbWUgY29uc3QgJiBuYW1l
LCAKICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjwgZmlsZTxjZXJ0PiA+ICYgdHMp
CnsKICB2ZWN0b3I8Y2VydD4gY2VydHM7CiAgZ2V0X2NlcnRzKG5hbWUsIGNlcnRzLCAiZmls
ZV9jZXJ0cyIpOwogIHRzLmNsZWFyKCk7CiAgY29weShjZXJ0cy5iZWdpbigpLCBjZXJ0cy5l
bmQoKSwgYmFja19pbnNlcnRlcih0cykpOyAgCn0KCnZvaWQgCmRhdGFiYXNlOjpnZXRfZmls
ZV9jZXJ0cyhmaWxlX2lkIGNvbnN0ICYgaWQsIAogICAgICAgICAgICAgICAgICAgICAgICAg
Y2VydF9uYW1lIGNvbnN0ICYgbmFtZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0
b3I8IGZpbGU8Y2VydD4gPiAmIHRzKQp7CiAgdmVjdG9yPGNlcnQ+IGNlcnRzOwogIGdldF9j
ZXJ0cyhpZC5pbm5lcigpLCBuYW1lLCBjZXJ0cywgImZpbGVfY2VydHMiKTsKICB0cy5jbGVh
cigpOwogIGNvcHkoY2VydHMuYmVnaW4oKSwgY2VydHMuZW5kKCksIGJhY2tfaW5zZXJ0ZXIo
dHMpKTsgICAgCn0KCnZvaWQgCmRhdGFiYXNlOjpnZXRfZmlsZV9jZXJ0cyhjZXJ0X25hbWUg
Y29uc3QgJiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0PGNlcnRfdmFs
dWU+IGNvbnN0ICYgdmFsLCAKICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjwgZmls
ZTxjZXJ0PiA+ICYgdHMpCnsKICB2ZWN0b3I8Y2VydD4gY2VydHM7CiAgZ2V0X2NlcnRzKG5h
bWUsIHZhbCwgY2VydHMsICJmaWxlX2NlcnRzIik7CiAgdHMuY2xlYXIoKTsKICBjb3B5KGNl
cnRzLmJlZ2luKCksIGNlcnRzLmVuZCgpLCBiYWNrX2luc2VydGVyKHRzKSk7ICAKfQoKdm9p
ZCAKZGF0YWJhc2U6OmdldF9maWxlX2NlcnRzKGZpbGVfaWQgY29uc3QgJiBpZCwgCiAgICAg
ICAgICAgICAgICAgICAgICAgICBjZXJ0X25hbWUgY29uc3QgJiBuYW1lLAogICAgICAgICAg
ICAgICAgICAgICAgICAgYmFzZTY0PGNlcnRfdmFsdWU+IGNvbnN0ICYgdmFsLCAKICAgICAg
ICAgICAgICAgICAgICAgICAgIHZlY3RvcjwgZmlsZTxjZXJ0PiA+ICYgdHMpCnsKICB2ZWN0
b3I8Y2VydD4gY2VydHM7CiAgZ2V0X2NlcnRzKGlkLmlubmVyKCksIG5hbWUsIHZhbCwgY2Vy
dHMsICJmaWxlX2NlcnRzIik7CiAgdHMuY2xlYXIoKTsKICBjb3B5KGNlcnRzLmJlZ2luKCks
IGNlcnRzLmVuZCgpLCBiYWNrX2luc2VydGVyKHRzKSk7ICAKfQoKdm9pZCAKZGF0YWJhc2U6
OmdldF9maWxlX2NlcnRzKGZpbGVfaWQgY29uc3QgJiBpZCwgCiAgICAgICAgICAgICAgICAg
ICAgICAgICB2ZWN0b3I8IGZpbGU8Y2VydD4gPiAmIHRzKQp7IAogIHZlY3RvcjxjZXJ0PiBj
ZXJ0czsKICBnZXRfY2VydHMoaWQuaW5uZXIoKSwgY2VydHMsICJmaWxlX2NlcnRzIik7IAog
IHRzLmNsZWFyKCk7CiAgY29weShjZXJ0cy5iZWdpbigpLCBjZXJ0cy5lbmQoKSwgYmFja19p
bnNlcnRlcih0cykpOwp9CgoKYm9vbCAKZGF0YWJhc2U6OmZpbGVfY2VydF9leGlzdHMoaGV4
ZW5jPGlkPiBjb25zdCAmIGhhc2gpCnsKICByZXN1bHRzIHJlczsKICB2ZWN0b3I8Y2VydD4g
Y2VydHM7CiAgZmV0Y2gocmVzLCBvbmVfY29sLCBhbnlfcm93cywgCiAgICAgICAgIlNFTEVD
VCBpZCAiCiAgICAgICAgIkZST00gZmlsZV9jZXJ0cyAiCiAgICAgICAgIldIRVJFIGhhc2gg
PSAnJXEnIiwgCiAgICAgICAgaGFzaCgpLmNfc3RyKCkpOwogIEkocmVzLnNpemUoKSA9PSAw
IHx8IHJlcy5zaXplKCkgPT0gMSk7CiAgcmV0dXJuIChyZXMuc2l6ZSgpID09IDEpOwp9Cgp2
b2lkIApkYXRhYmFzZTo6Z2V0X2ZpbGVfY2VydChoZXhlbmM8aWQ+IGNvbnN0ICYgaGFzaCwK
ICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTxjZXJ0PiAmIGMpCnsKICByZXN1bHRzIHJl
czsKICB2ZWN0b3I8Y2VydD4gY2VydHM7CiAgZmV0Y2gocmVzLCA1LCBvbmVfcm93LCAKICAg
ICAgICAiU0VMRUNUIGlkLCBuYW1lLCB2YWx1ZSwga2V5cGFpciwgc2lnbmF0dXJlICIKICAg
ICAgICAiRlJPTSBmaWxlX2NlcnRzICIKICAgICAgICAiV0hFUkUgaGFzaCA9ICclcSciLCAK
ICAgICAgICBoYXNoKCkuY19zdHIoKSk7CiAgcmVzdWx0c190b19jZXJ0cyhyZXMsIGNlcnRz
KTsKICBJKGNlcnRzLnNpemUoKSA9PSAxKTsKICBjID0gZmlsZTxjZXJ0PihjZXJ0c1swXSk7
Cn0KCgoKdm9pZCAKZGF0YWJhc2U6OmdldF9yZXZpc2lvbl9jZXJ0cyhjZXJ0X25hbWUgY29u
c3QgJiBuYW1lLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjwgcmV2aXNp
b248Y2VydD4gPiAmIHRzKQp7CiAgdmVjdG9yPGNlcnQ+IGNlcnRzOwogIGdldF9jZXJ0cyhu
YW1lLCBjZXJ0cywgInJldmlzaW9uX2NlcnRzIik7CiAgdHMuY2xlYXIoKTsKICBjb3B5KGNl
cnRzLmJlZ2luKCksIGNlcnRzLmVuZCgpLCBiYWNrX2luc2VydGVyKHRzKSk7ICAKfQoKdm9p
ZCAKZGF0YWJhc2U6OmdldF9yZXZpc2lvbl9jZXJ0cyhyZXZpc2lvbl9pZCBjb25zdCAmIGlk
LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfbmFtZSBjb25zdCAmIG5hbWUs
IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPCByZXZpc2lvbjxjZXJ0PiA+
ICYgdHMpCnsKICB2ZWN0b3I8Y2VydD4gY2VydHM7CiAgZ2V0X2NlcnRzKGlkLmlubmVyKCks
IG5hbWUsIGNlcnRzLCAicmV2aXNpb25fY2VydHMiKTsKICB0cy5jbGVhcigpOwogIGNvcHko
Y2VydHMuYmVnaW4oKSwgY2VydHMuZW5kKCksIGJhY2tfaW5zZXJ0ZXIodHMpKTsgIAp9Cgp2
b2lkIApkYXRhYmFzZTo6Z2V0X3JldmlzaW9uX2NlcnRzKHJldmlzaW9uX2lkIGNvbnN0ICYg
aWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9uYW1lIGNvbnN0ICYgbmFt
ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U2NDxjZXJ0X3ZhbHVlPiBjb25z
dCAmIHZhbCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8IHJldmlzaW9u
PGNlcnQ+ID4gJiB0cykKewogIHZlY3RvcjxjZXJ0PiBjZXJ0czsKICBnZXRfY2VydHMoaWQu
aW5uZXIoKSwgbmFtZSwgdmFsLCBjZXJ0cywgInJldmlzaW9uX2NlcnRzIik7CiAgdHMuY2xl
YXIoKTsKICBjb3B5KGNlcnRzLmJlZ2luKCksIGNlcnRzLmVuZCgpLCBiYWNrX2luc2VydGVy
KHRzKSk7ICAKfQoKdm9pZCAKZGF0YWJhc2U6OmdldF9yZXZpc2lvbl9jZXJ0cyhjZXJ0X25h
bWUgY29uc3QgJiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0PGNl
cnRfdmFsdWU+IGNvbnN0ICYgdmFsLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZl
Y3RvcjwgcmV2aXNpb248Y2VydD4gPiAmIHRzKQp7CiAgdmVjdG9yPGNlcnQ+IGNlcnRzOwog
IGdldF9jZXJ0cyhuYW1lLCB2YWwsIGNlcnRzLCAicmV2aXNpb25fY2VydHMiKTsKICB0cy5j
bGVhcigpOwogIGNvcHkoY2VydHMuYmVnaW4oKSwgY2VydHMuZW5kKCksIGJhY2tfaW5zZXJ0
ZXIodHMpKTsgIAp9Cgp2b2lkIApkYXRhYmFzZTo6Z2V0X3JldmlzaW9uX2NlcnRzKHJldmlz
aW9uX2lkIGNvbnN0ICYgaWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9y
PCByZXZpc2lvbjxjZXJ0PiA+ICYgdHMpCnsgCiAgdmVjdG9yPGNlcnQ+IGNlcnRzOwogIGdl
dF9jZXJ0cyhpZC5pbm5lcigpLCBjZXJ0cywgInJldmlzaW9uX2NlcnRzIik7IAogIHRzLmNs
ZWFyKCk7CiAgY29weShjZXJ0cy5iZWdpbigpLCBjZXJ0cy5lbmQoKSwgYmFja19pbnNlcnRl
cih0cykpOwp9Cgp2b2lkIApkYXRhYmFzZTo6Z2V0X3JldmlzaW9uX2NlcnQoaGV4ZW5jPGlk
PiBjb25zdCAmIGhhc2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldmlzaW9uPGNl
cnQ+ICYgYykKewogIHJlc3VsdHMgcmVzOwogIHZlY3RvcjxjZXJ0PiBjZXJ0czsKICBmZXRj
aChyZXMsIDUsIG9uZV9yb3csIAogICAgICAgICJTRUxFQ1QgaWQsIG5hbWUsIHZhbHVlLCBr
ZXlwYWlyLCBzaWduYXR1cmUgIgogICAgICAgICJGUk9NIHJldmlzaW9uX2NlcnRzICIKICAg
ICAgICAiV0hFUkUgaGFzaCA9ICclcSciLCAKICAgICAgICBoYXNoKCkuY19zdHIoKSk7CiAg
cmVzdWx0c190b19jZXJ0cyhyZXMsIGNlcnRzKTsKICBJKGNlcnRzLnNpemUoKSA9PSAxKTsK
ICBjID0gcmV2aXNpb248Y2VydD4oY2VydHNbMF0pOwp9Cgpib29sIApkYXRhYmFzZTo6cmV2
aXNpb25fY2VydF9leGlzdHMoaGV4ZW5jPGlkPiBjb25zdCAmIGhhc2gpCnsKICByZXN1bHRz
IHJlczsKICB2ZWN0b3I8Y2VydD4gY2VydHM7CiAgZmV0Y2gocmVzLCBvbmVfY29sLCBhbnlf
cm93cywgCiAgICAgICAgIlNFTEVDVCBpZCAiCiAgICAgICAgIkZST00gcmV2aXNpb25fY2Vy
dHMgIgogICAgICAgICJXSEVSRSBoYXNoID0gJyVxJyIsIAogICAgICAgIGhhc2goKS5jX3N0
cigpKTsKICBJKHJlcy5zaXplKCkgPT0gMCB8fCByZXMuc2l6ZSgpID09IDEpOwogIHJldHVy
biAocmVzLnNpemUoKSA9PSAxKTsKfQoKYm9vbCAKZGF0YWJhc2U6Om1hbmlmZXN0X2NlcnRf
ZXhpc3RzKGhleGVuYzxpZD4gY29uc3QgJiBoYXNoKQp7CiAgcmVzdWx0cyByZXM7CiAgdmVj
dG9yPGNlcnQ+IGNlcnRzOwogIGZldGNoKHJlcywgb25lX2NvbCwgYW55X3Jvd3MsIAogICAg
ICAgICJTRUxFQ1QgaWQgIgogICAgICAgICJGUk9NIG1hbmlmZXN0X2NlcnRzICIKICAgICAg
ICAiV0hFUkUgaGFzaCA9ICclcSciLCAKICAgICAgICBoYXNoKCkuY19zdHIoKSk7CiAgSShy
ZXMuc2l6ZSgpID09IDAgfHwgcmVzLnNpemUoKSA9PSAxKTsKICByZXR1cm4gKHJlcy5zaXpl
KCkgPT0gMSk7Cn0KCnZvaWQgCmRhdGFiYXNlOjpnZXRfbWFuaWZlc3RfY2VydChoZXhlbmM8
aWQ+IGNvbnN0ICYgaGFzaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0
PGNlcnQ+ICYgYykKewogIHJlc3VsdHMgcmVzOwogIHZlY3RvcjxjZXJ0PiBjZXJ0czsKICBm
ZXRjaChyZXMsIDUsIG9uZV9yb3csIAogICAgICAgICJTRUxFQ1QgaWQsIG5hbWUsIHZhbHVl
LCBrZXlwYWlyLCBzaWduYXR1cmUgIgogICAgICAgICJGUk9NIG1hbmlmZXN0X2NlcnRzICIK
ICAgICAgICAiV0hFUkUgaGFzaCA9ICclcSciLCAKICAgICAgICBoYXNoKCkuY19zdHIoKSk7
CiAgcmVzdWx0c190b19jZXJ0cyhyZXMsIGNlcnRzKTsKICBJKGNlcnRzLnNpemUoKSA9PSAx
KTsKICBjID0gbWFuaWZlc3Q8Y2VydD4oY2VydHNbMF0pOwp9Cgp2b2lkIApkYXRhYmFzZTo6
Z2V0X21hbmlmZXN0X2NlcnRzKG1hbmlmZXN0X2lkIGNvbnN0ICYgaWQsIAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHZlY3RvcjwgbWFuaWZlc3Q8Y2VydD4gPiAmIHRzKQp7IAog
IHZlY3RvcjxjZXJ0PiBjZXJ0czsKICBnZXRfY2VydHMoaWQuaW5uZXIoKSwgY2VydHMsICJt
YW5pZmVzdF9jZXJ0cyIpOyAKICB0cy5jbGVhcigpOwogIGNvcHkoY2VydHMuYmVnaW4oKSwg
Y2VydHMuZW5kKCksIGJhY2tfaW5zZXJ0ZXIodHMpKTsKfQoKCnZvaWQgCmRhdGFiYXNlOjpn
ZXRfbWFuaWZlc3RfY2VydHMoY2VydF9uYW1lIGNvbnN0ICYgbmFtZSwgCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB2ZWN0b3I8IG1hbmlmZXN0PGNlcnQ+ID4gJiB0cykKewogIHZl
Y3RvcjxjZXJ0PiBjZXJ0czsKICBnZXRfY2VydHMobmFtZSwgY2VydHMsICJtYW5pZmVzdF9j
ZXJ0cyIpOwogIHRzLmNsZWFyKCk7CiAgY29weShjZXJ0cy5iZWdpbigpLCBjZXJ0cy5lbmQo
KSwgYmFja19pbnNlcnRlcih0cykpOyAgCn0KCnZvaWQgCmRhdGFiYXNlOjpnZXRfbWFuaWZl
c3RfY2VydHMobWFuaWZlc3RfaWQgY29uc3QgJiBpZCwgCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgY2VydF9uYW1lIGNvbnN0ICYgbmFtZSwgCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgdmVjdG9yPCBtYW5pZmVzdDxjZXJ0PiA+ICYgdHMpCnsKICB2ZWN0b3I8Y2Vy
dD4gY2VydHM7CiAgZ2V0X2NlcnRzKGlkLmlubmVyKCksIG5hbWUsIGNlcnRzLCAibWFuaWZl
c3RfY2VydHMiKTsKICB0cy5jbGVhcigpOwogIGNvcHkoY2VydHMuYmVnaW4oKSwgY2VydHMu
ZW5kKCksIGJhY2tfaW5zZXJ0ZXIodHMpKTsgIAp9CgoKLy8gY29tcGxldGlvbnMKdm9pZCAK
ZGF0YWJhc2U6OmNvbXBsZXRlKHN0cmluZyBjb25zdCAmIHBhcnRpYWwsCiAgICAgICAgICAg
ICAgICAgICBzZXQ8cmV2aXNpb25faWQ+ICYgY29tcGxldGlvbnMpCnsKICByZXN1bHRzIHJl
czsKICBjb21wbGV0aW9ucy5jbGVhcigpOwoKICBmZXRjaChyZXMsIDEsIGFueV9yb3dzLAog
ICAgICAgICJTRUxFQ1QgaWQgRlJPTSByZXZpc2lvbnMgV0hFUkUgaWQgR0xPQiAnJXEqJyIs
CiAgICAgICAgcGFydGlhbC5jX3N0cigpKTsKCiAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBy
ZXMuc2l6ZSgpOyArK2kpCiAgICBjb21wbGV0aW9ucy5pbnNlcnQocmV2aXNpb25faWQocmVz
W2ldWzBdKSk7ICAKfQoKCnZvaWQgCmRhdGFiYXNlOjpjb21wbGV0ZShzdHJpbmcgY29uc3Qg
JiBwYXJ0aWFsLAogICAgICAgICAgICAgICAgICAgc2V0PG1hbmlmZXN0X2lkPiAmIGNvbXBs
ZXRpb25zKQp7CiAgcmVzdWx0cyByZXM7CiAgY29tcGxldGlvbnMuY2xlYXIoKTsKCiAgZmV0
Y2gocmVzLCAxLCBhbnlfcm93cywKICAgICAgICAiU0VMRUNUIGlkIEZST00gbWFuaWZlc3Rz
IFdIRVJFIGlkIEdMT0IgJyVxKiciLAogICAgICAgIHBhcnRpYWwuY19zdHIoKSk7CgogIGZv
ciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzLnNpemUoKTsgKytpKQogICAgY29tcGxldGlvbnMu
aW5zZXJ0KG1hbmlmZXN0X2lkKHJlc1tpXVswXSkpOyAgCiAgCiAgcmVzLmNsZWFyKCk7Cgog
IGZldGNoKHJlcywgMSwgYW55X3Jvd3MsCiAgICAgICAgIlNFTEVDVCBpZCBGUk9NIG1hbmlm
ZXN0X2RlbHRhcyBXSEVSRSBpZCBHTE9CICclcSonIiwKICAgICAgICBwYXJ0aWFsLmNfc3Ry
KCkpOwoKICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlcy5zaXplKCk7ICsraSkKICAgIGNv
bXBsZXRpb25zLmluc2VydChtYW5pZmVzdF9pZChyZXNbaV1bMF0pKTsgIAp9Cgp2b2lkIApk
YXRhYmFzZTo6Y29tcGxldGUoc3RyaW5nIGNvbnN0ICYgcGFydGlhbCwKICAgICAgICAgICAg
ICAgICAgIHNldDxmaWxlX2lkPiAmIGNvbXBsZXRpb25zKQp7CiAgcmVzdWx0cyByZXM7CiAg
Y29tcGxldGlvbnMuY2xlYXIoKTsKCiAgZmV0Y2gocmVzLCAxLCBhbnlfcm93cywKICAgICAg
ICAiU0VMRUNUIGlkIEZST00gZmlsZXMgV0hFUkUgaWQgR0xPQiAnJXEqJyIsCiAgICAgICAg
cGFydGlhbC5jX3N0cigpKTsKCiAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXMuc2l6ZSgp
OyArK2kpCiAgICBjb21wbGV0aW9ucy5pbnNlcnQoZmlsZV9pZChyZXNbaV1bMF0pKTsgIAog
IAogIHJlcy5jbGVhcigpOwoKICBmZXRjaChyZXMsIDEsIGFueV9yb3dzLAogICAgICAgICJT
RUxFQ1QgaWQgRlJPTSBmaWxlX2RlbHRhcyBXSEVSRSBpZCBHTE9CICclcSonIiwKICAgICAg
ICBwYXJ0aWFsLmNfc3RyKCkpOwoKICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlcy5zaXpl
KCk7ICsraSkKICAgIGNvbXBsZXRpb25zLmluc2VydChmaWxlX2lkKHJlc1tpXVswXSkpOyAg
Cn0KCnVzaW5nIGNvbW1hbmRzOjpzZWxlY3Rvcl90eXBlOwoKc3RhdGljIHZvaWQgc2VsZWN0
b3JfdG9fY2VydG5hbWUoc2VsZWN0b3JfdHlwZSB0eSwKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgc3RyaW5nICYgcykKewogIHN3aXRjaCAodHkpCiAgICB7CiAgICBjYXNl
IGNvbW1hbmRzOjpzZWxfYXV0aG9yOgogICAgICBzID0gYXV0aG9yX2NlcnRfbmFtZTsKICAg
ICAgYnJlYWs7CiAgICBjYXNlIGNvbW1hbmRzOjpzZWxfYnJhbmNoOgogICAgICBzID0gYnJh
bmNoX2NlcnRfbmFtZTsKICAgICAgYnJlYWs7CiAgICBjYXNlIGNvbW1hbmRzOjpzZWxfZGF0
ZToKICAgICAgcyA9IGRhdGVfY2VydF9uYW1lOwogICAgICBicmVhazsKICAgIGNhc2UgY29t
bWFuZHM6OnNlbF90YWc6CiAgICAgIHMgPSB0YWdfY2VydF9uYW1lOwogICAgICBicmVhazsK
ICAgIGNhc2UgY29tbWFuZHM6OnNlbF9pZGVudDoKICAgIGNhc2UgY29tbWFuZHM6OnNlbF91
bmtub3duOgogICAgICBJKGZhbHNlKTsgLy8gZG9uJ3QgZG8gdGhpcy4KICAgICAgYnJlYWs7
CiAgICB9Cn0KCnZvaWQgZGF0YWJhc2U6OmNvbXBsZXRlKHNlbGVjdG9yX3R5cGUgdHksCiAg
ICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjb25zdCAmIHBhcnRpYWwsCiAgICAgICAg
ICAgICAgICAgICAgICAgIHZlY3RvcjxwYWlyPHNlbGVjdG9yX3R5cGUsIHN0cmluZz4gPiBj
b25zdCAmIGxpbWl0LAogICAgICAgICAgICAgICAgICAgICAgICBzZXQ8c3RyaW5nPiAmIGNv
bXBsZXRpb25zKQp7CiAgY29tcGxldGlvbnMuY2xlYXIoKTsKCiAgLy8gc3RlcCAxOiB0aGUg
bGltaXQgaXMgdHJhbnNmb3JtZWQgaW50byBhbiBTUUwgc2VsZWN0IHN0YXRlbWVudCB3aGlj
aAogIC8vIHNlbGVjdHMgYSBzZXQgb2YgSURzIGZyb20gdGhlIG1hbmlmZXN0X2NlcnRzIHRh
YmxlIHdoaWNoIG1hdGNoIHRoZQogIC8vIGxpbWl0LiAgdGhpcyBpcyBkb25lIGJ5IGJ1aWxk
aW5nIGFuIFNRTCBzZWxlY3Qgc3RhdGVtZW50IGZvciBlYWNoIHRlcm0KICAvLyBpbiB0aGUg
bGltaXQgYW5kIHRoZW4gSU5URVJTRUNUaW5nIHRoZW0gYWxsLgoKICBzdHJpbmcgbGltID0g
IigiOwogIGJvb2wgZmlyc3RfbGltaXQgPSB0cnVlOwogIGZvciAodmVjdG9yPHBhaXI8c2Vs
ZWN0b3JfdHlwZSwgc3RyaW5nPiA+Ojpjb25zdF9pdGVyYXRvciBpID0gbGltaXQuYmVnaW4o
KTsKICAgICAgIGkgIT0gbGltaXQuZW5kKCk7ICsraSkKICAgIHsKICAgICAgaWYgKGZpcnN0
X2xpbWl0KQogICAgICAgIGZpcnN0X2xpbWl0ID0gZmFsc2U7CiAgICAgIGVsc2UKICAgICAg
ICBsaW0gKz0gIiBJTlRFUlNFQ1QgIjsKICAgICAgCiAgICAgIGlmIChpLT5maXJzdCA9PSBj
b21tYW5kczo6c2VsX2lkZW50KQogICAgICAgIHsKICAgICAgICAgIGxpbSArPSAiU0VMRUNU
IGlkIEZST00gcmV2aXNpb25fY2VydHMgIjsKICAgICAgICAgIGxpbSArPSAoRigiV0hFUkUg
aWQgR0xPQiAnJXMqJyIpIAogICAgICAgICAgICAgICAgICAlIGktPnNlY29uZCkuc3RyKCk7
CiAgICAgICAgfQogICAgICBlbHNlIGlmIChpLT5maXJzdCA9PSBjb21tYW5kczo6c2VsX3Vu
a25vd24pCiAgICAgICAgewogICAgICAgICAgbGltICs9ICJTRUxFQ1QgaWQgRlJPTSByZXZp
c2lvbl9jZXJ0cyAiOwogICAgICAgICAgbGltICs9IChGKCIgV0hFUkUgKG5hbWU9JyVzJyBP
UiBuYW1lPSclcycgT1IgbmFtZT0nJXMnKSIpCiAgICAgICAgICAgICAgICAgICUgYXV0aG9y
X2NlcnRfbmFtZSAKICAgICAgICAgICAgICAgICAgJSB0YWdfY2VydF9uYW1lIAogICAgICAg
ICAgICAgICAgICAlIGJyYW5jaF9jZXJ0X25hbWUpLnN0cigpOwogICAgICAgICAgbGltICs9
IChGKCIgQU5EIHVuYmFzZTY0KHZhbHVlKSBnbG9iICcqJXMqJyIpCiAgICAgICAgICAgICAg
ICAgICUgaS0+c2Vjb25kKS5zdHIoKTsgICAgIAogICAgICAgIH0KICAgICAgZWxzZQogICAg
ICAgIHsKICAgICAgICAgIHN0cmluZyBjZXJ0bmFtZTsKICAgICAgICAgIHNlbGVjdG9yX3Rv
X2NlcnRuYW1lKGktPmZpcnN0LCBjZXJ0bmFtZSk7CiAgICAgICAgICBsaW0gKz0gIlNFTEVD
VCBpZCBGUk9NIHJldmlzaW9uX2NlcnRzICI7CiAgICAgICAgICBsaW0gKz0gKEYoIldIRVJF
IG5hbWU9JyVzJyBBTkQgdW5iYXNlNjQodmFsdWUpIGdsb2IgJyolcyonIikKICAgICAgICAg
ICAgICAgICAgJSBjZXJ0bmFtZSAlIGktPnNlY29uZCkuc3RyKCk7CiAgICAgICAgfQogICAg
fQogIGxpbSArPSAiKSI7CiAgCiAgLy8gc3RlcCAyOiBkZXBlbmRpbmcgb24gd2hhdCB3ZSd2
ZSBiZWVuIGFza2VkIHRvIGRpc2FtYmlndWF0ZSwgd2UKICAvLyB3aWxsIGNvbXBsZXRlIGVp
dGhlciBzb21lIGlkZW50cywgb3IgY2VydCB2YWx1ZXMsIG9yICJ1bmtub3duIgogIC8vIHdo
aWNoIGdlbmVyYWxseSBtZWFucyAiYXV0aG9yLCB0YWcgb3IgYnJhbmNoIgoKICBzdHJpbmcg
cXVlcnk7CiAgaWYgKHR5ID09IGNvbW1hbmRzOjpzZWxfaWRlbnQpCiAgICB7CiAgICAgIHF1
ZXJ5ID0gKEYoIlNFTEVDVCBpZCBGUk9NICVzIikgJSBsaW0pLnN0cigpOwogICAgfQogIGVs
c2UgCiAgICB7CiAgICAgIHF1ZXJ5ID0gIlNFTEVDVCB2YWx1ZSBGUk9NIHJldmlzaW9uX2Nl
cnRzIFdIRVJFIjsKICAgICAgaWYgKHR5ID09IGNvbW1hbmRzOjpzZWxfdW5rbm93bikKICAg
ICAgICB7ICAgICAgICAgICAgICAgCiAgICAgICAgICBxdWVyeSArPSAKICAgICAgICAgICAg
KEYoIiAobmFtZT0nJXMnIE9SIG5hbWU9JyVzJyBPUiBuYW1lPSclcycpIikKICAgICAgICAg
ICAgICUgYXV0aG9yX2NlcnRfbmFtZSAKICAgICAgICAgICAgICUgdGFnX2NlcnRfbmFtZSAK
ICAgICAgICAgICAgICUgYnJhbmNoX2NlcnRfbmFtZSkuc3RyKCk7CiAgICAgICAgfQogICAg
ICBlbHNlCiAgICAgICAgewogICAgICAgICAgc3RyaW5nIGNlcnRuYW1lOwogICAgICAgICAg
c2VsZWN0b3JfdG9fY2VydG5hbWUodHksIGNlcnRuYW1lKTsKICAgICAgICAgIHF1ZXJ5ICs9
IAogICAgICAgICAgICAoRigiIChuYW1lPSclcycpIikgJSBjZXJ0bmFtZSkuc3RyKCk7CiAg
ICAgICAgfQogICAgICAgIAogICAgICBxdWVyeSArPSAoRigiIEFORCAodW5iYXNlNjQodmFs
dWUpIEdMT0IgJyolcyonKSIpICUgcGFydGlhbCkuc3RyKCk7CiAgICAgIHF1ZXJ5ICs9IChG
KCIgQU5EIChpZCBJTiAlcykiKSAlIGxpbSkuc3RyKCk7CiAgICB9CgogIHJlc3VsdHMgcmVz
OwogIGZldGNoKHJlcywgb25lX2NvbCwgYW55X3Jvd3MsIHF1ZXJ5LmNfc3RyKCkpOwogIGZv
ciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzLnNpemUoKTsgKytpKQogICAgewogICAgICBpZiAo
dHkgPT0gY29tbWFuZHM6OnNlbF9pZGVudCkKICAgICAgICBjb21wbGV0aW9ucy5pbnNlcnQo
cmVzW2ldWzBdKTsKICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgIGJhc2U2NDxkYXRh
PiByb3dfZW5jb2RlZChyZXNbaV1bMF0pOwogICAgICAgICAgZGF0YSByb3dfZGVjb2RlZDsK
ICAgICAgICAgIGRlY29kZV9iYXNlNjQocm93X2VuY29kZWQsIHJvd19kZWNvZGVkKTsKICAg
ICAgICAgIGNvbXBsZXRpb25zLmluc2VydChyb3dfZGVjb2RlZCgpKTsKICAgICAgICB9CiAg
ICB9Cn0KCgovLyBtZXJrbGUgbm9kZXMKCmJvb2wgCmRhdGFiYXNlOjptZXJrbGVfbm9kZV9l
eGlzdHMoc3RyaW5nIGNvbnN0ICYgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB1dGY4IGNvbnN0ICYgY29sbGVjdGlvbiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgc2l6ZV90IGxldmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhleGVuYzxw
cmVmaXg+IGNvbnN0ICYgcHJlZml4KQp7CiAgcmVzdWx0cyByZXM7CiAgZmV0Y2gocmVzLCBv
bmVfY29sLCBvbmVfcm93LCAKICAgICAgICAiU0VMRUNUIENPVU5UKCopICIKICAgICAgICAi
RlJPTSBtZXJrbGVfbm9kZXMgIgogICAgICAgICJXSEVSRSB0eXBlID0gJyVxJyAiCiAgICAg
ICAgIkFORCBjb2xsZWN0aW9uID0gJyVxJyAiCiAgICAgICAgIkFORCBsZXZlbCA9ICVkICIK
ICAgICAgICAiQU5EIHByZWZpeCA9ICclcScgIiwKICAgICAgICB0eXBlLmNfc3RyKCksIGNv
bGxlY3Rpb24oKS5jX3N0cigpLCBsZXZlbCwgcHJlZml4KCkuY19zdHIoKSk7CiAgc2l6ZV90
IG5fbm9kZXMgPSBsZXhpY2FsX2Nhc3Q8c2l6ZV90PihyZXNbMF1bMF0pOwogIEkobl9ub2Rl
cyA9PSAwIHx8IG5fbm9kZXMgPT0gMSk7CiAgcmV0dXJuIG5fbm9kZXMgPT0gMTsKfQoKdm9p
ZCAKZGF0YWJhc2U6OmdldF9tZXJrbGVfbm9kZShzdHJpbmcgY29uc3QgJiB0eXBlLAogICAg
ICAgICAgICAgICAgICAgICAgICAgIHV0ZjggY29uc3QgJiBjb2xsZWN0aW9uLCAKICAgICAg
ICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGV2ZWwsCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgaGV4ZW5jPHByZWZpeD4gY29uc3QgJiBwcmVmaXgsCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgYmFzZTY0PG1lcmtsZT4gJiBub2RlKQp7CiAgcmVzdWx0cyByZXM7CiAgZmV0
Y2gocmVzLCBvbmVfY29sLCBvbmVfcm93LCAKICAgICAgICAiU0VMRUNUIGJvZHkgIgogICAg
ICAgICJGUk9NIG1lcmtsZV9ub2RlcyAiCiAgICAgICAgIldIRVJFIHR5cGUgPSAnJXEnICIK
ICAgICAgICAiQU5EIGNvbGxlY3Rpb24gPSAnJXEnICIKICAgICAgICAiQU5EIGxldmVsID0g
JWQgIgogICAgICAgICJBTkQgcHJlZml4ID0gJyVxJyIsCiAgICAgICAgdHlwZS5jX3N0cigp
LCBjb2xsZWN0aW9uKCkuY19zdHIoKSwgbGV2ZWwsIHByZWZpeCgpLmNfc3RyKCkpOwogIG5v
ZGUgPSByZXNbMF1bMF07Cn0KCnZvaWQgCmRhdGFiYXNlOjpwdXRfbWVya2xlX25vZGUoc3Ry
aW5nIGNvbnN0ICYgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICB1dGY4IGNvbnN0
ICYgY29sbGVjdGlvbiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxldmVs
LAogICAgICAgICAgICAgICAgICAgICAgICAgIGhleGVuYzxwcmVmaXg+IGNvbnN0ICYgcHJl
Zml4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAg
ICAgICAgICAgICAgICAgIGJhc2U2NDxtZXJrbGU+IGNvbnN0ICYgbm9kZSkKewogIGV4ZWN1
dGUoIklOU0VSVCBPUiBSRVBMQUNFICIKICAgICAgICAgICJJTlRPIG1lcmtsZV9ub2RlcyAi
CiAgICAgICAgICAiVkFMVUVTICgnJXEnLCAnJXEnLCAlZCwgJyVxJywgJyVxJykiLAogICAg
ICAgICAgdHlwZS5jX3N0cigpLCBjb2xsZWN0aW9uKCkuY19zdHIoKSwgbGV2ZWwsIHByZWZp
eCgpLmNfc3RyKCksIG5vZGUoKS5jX3N0cigpKTsKfQoKdm9pZCAKZGF0YWJhc2U6OmVyYXNl
X21lcmtsZV9ub2RlcyhzdHJpbmcgY29uc3QgJiB0eXBlLAogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHV0ZjggY29uc3QgJiBjb2xsZWN0aW9uKQp7CiAgZXhlY3V0ZSgiREVMRVRF
IEZST00gbWVya2xlX25vZGVzICIKICAgICAgICAgICJXSEVSRSB0eXBlID0gJyVxJyAiCiAg
ICAgICAgICAiQU5EIGNvbGxlY3Rpb24gPSAnJXEnIiwKICAgICAgICAgIHR5cGUuY19zdHIo
KSwgY29sbGVjdGlvbigpLmNfc3RyKCkpOwp9CgovLyB0cmFuc2FjdGlvbiBndWFyZHMKCnRy
YW5zYWN0aW9uX2d1YXJkOjp0cmFuc2FjdGlvbl9ndWFyZChkYXRhYmFzZSAmIGQpIDogY29t
bWl0dGVkKGZhbHNlKSwgZGIoZCkgCnsKICBkYi5iZWdpbl90cmFuc2FjdGlvbigpOwp9CnRy
YW5zYWN0aW9uX2d1YXJkOjp+dHJhbnNhY3Rpb25fZ3VhcmQoKQp7CiAgaWYgKGNvbW1pdHRl
ZCkKICAgIGRiLmNvbW1pdF90cmFuc2FjdGlvbigpOwogIGVsc2UKICAgIGRiLnJvbGxiYWNr
X3RyYW5zYWN0aW9uKCk7Cn0KCnZvaWQgCnRyYW5zYWN0aW9uX2d1YXJkOjpjb21taXQoKQp7
CiAgY29tbWl0dGVkID0gdHJ1ZTsKfQoK
_ATEOF


$at_traceoff
echo "t_merge_1.at:4069: if test \"\$OSTYPE\" == \"msys\"; then
  mimencode -u -o parent parent.b64
else
  eval \$UNB64_COMMAND <parent.b64 >parent
fi
"
echo t_merge_1.at:4069 >$at_check_line_file
( $at_traceon; if test "$OSTYPE" == "msys"; then
  mimencode -u -o parent parent.b64
else
  eval $UNB64_COMMAND <parent.b64 >parent
fi
 ) >$at_stdout 2>$at_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_1.at:4069: exit code was $at_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_1.at:4070: if test \"\$OSTYPE\" == \"msys\"; then
  mimencode -u -o left left.b64
else
  eval \$UNB64_COMMAND <left.b64 >left
fi
"
echo t_merge_1.at:4070 >$at_check_line_file
( $at_traceon; if test "$OSTYPE" == "msys"; then
  mimencode -u -o left left.b64
else
  eval $UNB64_COMMAND <left.b64 >left
fi
 ) >$at_stdout 2>$at_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_1.at:4070: exit code was $at_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_1.at:4071: if test \"\$OSTYPE\" == \"msys\"; then
  mimencode -u -o right right.b64
else
  eval \$UNB64_COMMAND <right.b64 >right
fi
"
echo t_merge_1.at:4071 >$at_check_line_file
( $at_traceon; if test "$OSTYPE" == "msys"; then
  mimencode -u -o right right.b64
else
  eval $UNB64_COMMAND <right.b64 >right
fi
 ) >$at_stdout 2>$at_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_1.at:4071: exit code was $at_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_1.at:4072: if test \"\$OSTYPE\" == \"msys\"; then
  mimencode -u -o correct correct.b64
else
  eval \$UNB64_COMMAND <correct.b64 >correct
fi
"
echo t_merge_1.at:4072 >$at_check_line_file
( $at_traceon; if test "$OSTYPE" == "msys"; then
  mimencode -u -o correct correct.b64
else
  eval $UNB64_COMMAND <correct.b64 >correct
fi
 ) >$at_stdout 2>$at_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_1.at:4072: exit code was $at_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_1.at:4074: cp -f parent testfile"
echo t_merge_1.at:4074 >$at_check_line_file
( $at_traceon; cp -f parent 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_1.at:4074: exit code was $at_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_1.at:4075: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_merge_1.at:4075 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_1.at:4075: exit code was $at_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_1.at:4076: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_merge_1.at:4076 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_1.at:4076: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


PARENT_SHA=`cat MT/revision`

$at_traceoff
echo "t_merge_1.at:4079: cp -f left testfile"
echo t_merge_1.at:4079 >$at_check_line_file
( $at_traceon; cp -f left 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_1.at:4079: exit code was $at_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_1.at:4080: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_merge_1.at:4080 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_1.at:4080: exit code was $at_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_1.at:4082: rm -rf MT.old"
echo t_merge_1.at:4082 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_1.at:4082: exit code was $at_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_1.at:4082: mv  MT MT.old"
echo t_merge_1.at:4082 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_1.at:4082: exit code was $at_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_1.at:4082: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$PARENT_SHA ."
echo t_merge_1.at:4082 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $PARENT_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_1.at:4082: exit code was $at_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_1.at:4082: mv MT.old/options MT"
echo t_merge_1.at:4082 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_1.at:4082: 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_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_merge_1.at:4082: test \$PROBE_R_SHA = \$PARENT_SHA"
echo t_merge_1.at:4082 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $PARENT_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_1.at:4082: exit code was $at_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_1.at:4084: cp -f right testfile"
echo t_merge_1.at:4084 >$at_check_line_file
( $at_traceon; cp -f right 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_1.at:4084: exit code was $at_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_1.at:4085: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_merge_1.at:4085 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_1.at:4085: exit code was $at_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_1.at:4087: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch merge"
echo t_merge_1.at:4087 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --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_1.at:4087: exit code was $at_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_1.at:4089: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update"
echo t_merge_1.at:4089 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_1.at:4089: exit code was $at_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_1.at:4090: cmp testfile correct"
echo t_merge_1.at:4090 >$at_check_line_file
( $at_traceon; cmp testfile correct ) >$at_stdout 2>$at_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_1.at:4090: exit code 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`
    ;;

  51 ) # 51. t_merge_2.at:1: test a merge 2
    at_setup_line='t_merge_2.at:1'
    at_desc='test a merge 2'
    $at_quiet $ECHO_N " 51: test a merge 2                               $ECHO_C"
    at_xfail=no
    (
      echo "51. t_merge_2.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_2.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_merge_2.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_2.at:2: exit code was $at_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_2.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_merge_2.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_2.at:2: exit code was $at_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_2.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_merge_2.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_2.at:2: exit code was $at_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_2.at:2: rm test_keys"
echo t_merge_2.at:2 >$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_2.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon




if which mimencode 2>/dev/null; then
  UNB64_COMMAND="mimencode -u"
elif which recode 2>/dev/null; then
  UNB64_COMMAND="recode /Base64"
elif perl -MMIME::Base64 -e 1 2>/dev/null; then
  UNB64_COMMAND="perl -MMIME::Base64 -ne 'print decode_base64(\$_)'"
elif python -c 'import sys;sys.exit(not hasattr("", "decode"))' 2>/dev/null; then
  UNB64_COMMAND="python -c 'import sys;sys.stdout.write(sys.stdin.read().decode("'"'"base64"'"'"))'"
else
  # This is lame!  We should XFAIL the test so the user knows that
  # they're not, you know, actually testing the software.  But
  # Autotest runs XFAIL conditions in a completely different shell, so
  # we can't without duplicating the whole test here.
  exit 77
fi
# Poor man's logging:
$at_traceoff
echo "t_merge_2.at:4: echo \$UNB64_COMMAND"
echo t_merge_2.at:4 >$at_check_line_file
( $at_traceon; echo $UNB64_COMMAND ) >$at_stdout 2>$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_2.at:4: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



# Another real merge error. This is the diff between the correct
# result and the file produced by the merge:
#
# --- correct
# +++ testfile
# @@ -336,10 +336,10 @@
#          {
#            L(F("found node %d, ancestor of left %s and right %s\n")
#              % anc % left % right);
# -          return true;
#          }
#      }
#  //      dump_bitset_map("ancestors", ancestors);
# +//      dump_bitset_map("dominators", dominators);
#  //      dump_bitset_map("parents", parents);
#    return false;
#  }

cat >parent.b64 <<'_ATEOF'
Ly8gY29weXJpZ2h0IChDKSAyMDA0IGdyYXlkb24gaG9hcmUgPGdyYXlkb25AcG9ib3guY29tPgov
LyBhbGwgcmlnaHRzIHJlc2VydmVkLgovLyBsaWNlbnNlZCB0byB0aGUgcHVibGljIHVuZGVyIHRo
ZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCAoPj0gMikKLy8gc2VlIHRoZSBmaWxlIENPUFlJTkcgZm9y
IGRldGFpbHMKCiNpbmNsdWRlIDxjY3R5cGU+CiNpbmNsdWRlIDxjc3RkbGliPgojaW5jbHVkZSA8
aW9zdHJlYW0+CiNpbmNsdWRlIDxtYXA+CiNpbmNsdWRlIDxzZXQ+CiNpbmNsdWRlIDxzc3RyZWFt
PgojaW5jbHVkZSA8c3RyaW5nPgoKI2luY2x1ZGUgPGJvb3N0L2xleGljYWxfY2FzdC5ocHA+CiNp
bmNsdWRlIDxib29zdC9keW5hbWljX2JpdHNldC5ocHA+CiNpbmNsdWRlIDxib29zdC9zaGFyZWRf
cHRyLmhwcD4KCiNpbmNsdWRlICJiYXNpY19pby5oaCIKI2luY2x1ZGUgImNoYW5nZV9zZXQuaGgi
CiNpbmNsdWRlICJjb25zdGFudHMuaGgiCiNpbmNsdWRlICJyZXZpc2lvbi5oaCIKI2luY2x1ZGUg
InNhbml0eS5oaCIKI2luY2x1ZGUgInRyYW5zZm9ybXMuaGgiCiNpbmNsdWRlICJ2b2NhYi5oaCIK
CgovLyBjYWxjdWxhdGluZyBsZWFzdCBjb21tb24gYW5jZXN0b3JzIGlzIGEgZGVsaWNhdGUgdGhp
bmcuCi8vIAovLyBpdCB0dXJucyBvdXQgdGhhdCB3ZSBjYW5ub3QgY2hvb3NlIHRoZSBzaW1wbGUg
ImxlYXN0IGNvbW1vbiBhbmNlc3RvciIKLy8gZm9yIHB1cnBvc2VzIG9mIGEgbWVyZ2UsIGJlY2F1
c2UgaXQgaXMgcG9zc2libGUgdGhhdCB0aGVyZSBhcmUgdHdvCi8vIGVxdWFsbHkgcmVhY2hhYmxl
IGNvbW1vbiBhbmNlc3RvcnMsIGFuZCB0aGlzIHByb2R1Y2VzIGFtYmlndWl0eSBpbiB0aGUKLy8g
bWVyZ2UuIHRoZSByZXN1bHQgLS0gaW4gYSBwYXRob2xvZ2ljYWwgY2FzZSAtLSBpcyBzaWxlbnRs
eSBhY2NlcHRpbmcgb25lCi8vIHNldCBvZiBlZGl0cyB3aGlsZSBkaXNjYXJkaW5nIGFub3RoZXI7
IG5vdCBleGFjdGx5IHdoYXQgeW91IHdhbnQgYQovLyB2ZXJzaW9uIGNvbnRyb2wgdG9vbCB0byBk
by4KLy8KLy8gYSBjb25zZXJ2YXRpdmUgYXBwcm94aW1hdGlvbiBpcyB3aGF0IHdlJ2xsIGNhbGwg
YSAic3ViZ3JhcGggcmVjdXJyaW5nIgovLyBMQ0EgYWxnb3JpdGhtLiB0aGlzIGlzIHNvbWV3aGF0
IGxpa2UgbG9jYXRpbmcgdGhlIGxlYXN0IGNvbW1vbiBkb21pbmF0b3IKLy8gbm9kZSwgYnV0IG5v
dCBxdWl0ZS4gaXQgaXMgYWN0dWFsbHkganVzdCBhIHZhbmlsbGEgTENBIHNlYXJjaCwgZXhjZXB0
Ci8vIHRoYXQgYW55IHRpbWUgdGhlcmUncyBhIGZvcmsgKGEgaGlzdG9yaWNhbCBtZXJnZSBsb29r
cyBsaWtlIGEgZm9yayBmcm9tCi8vIG91ciBwZXJzcGVjdGl2ZSwgd29ya2luZyBiYWNrd2FyZHMg
ZnJvbSBjaGlsZHJlbiB0byBwYXJlbnRzKSBpdCByZWR1Y2VzCi8vIHRoZSBmb3JrIHRvIGEgY29t
bW9uIHBhcmVudCB2aWEgYSBzZXF1ZW5jZSBvZiBwYWlyd2lzZSByZWN1cnNpdmUgY2FsbHMKLy8g
dG8gaXRzZWxmIGJlZm9yZSBwcm9jZWVkaW5nLiB0aGlzIHdpbGwgYWx3YXlzIHJlc29sdmUgdG8g
YSBjb21tb24gcGFyZW50Ci8vIHdpdGggbm8gYW1iaWd1aXR5LCB1bmxlc3MgaXQgZmFsbHMgb2Zm
IHRoZSByb290IG9mIHRoZSBncmFwaC4KLy8KLy8gdW5mb3J0dW5hdGVseSB0aGUgc3ViZ3JhcGgg
cmVjdXJyaW5nIGFsZ29yaXRobSBzb21ldGltZXMgZ29lcyB0b28gZmFyCi8vIGJhY2sgaW4gaGlz
dG9yeSAtLSBmb3IgZXhhbXBsZSBpZiB0aGVyZSBpcyBhbiB1bmFtYmlndW91cyBwcm9wYWdhdGUg
ZnJvbQovLyBvbmUgYnJhbmNoIHRvIGFub3RoZXIsIHRoZSBlbnRpcmUgc3ViZ3JhcGggcHJlY2Vl
ZGluZyB0aGUgcHJvcGFnYXRlIG9uCi8vIHRoZSByZWNpcGllbnQgYnJhbmNoIGlzIGVsaWRlZCwg
c2luY2UgaXQgaXMgYSBtZXJnZS4KLy8KLy8gb3VyIGN1cnJlbnQgaHlwb3RoZXNpcyBpcyB0aGF0
IHRoZSAqZXhhY3QqIGNvbmRpdGlvbiB3ZSdyZSBsb29raW5nIGZvciwKLy8gd2hlbiBkb2luZyBh
IG1lcmdlLCBpcyB0aGUgbGVhc3Qgbm9kZSB3aGljaCBkb21pbmF0ZXMgb25lIHNpZGUgb2YgdGhl
Ci8vIG1lcmdlIGFuZCBpcyBhbiBhbmNlc3RvciBvZiB0aGUgb3RoZXIuCgp0eXBlZGVmIHVuc2ln
bmVkIGxvbmcgY3R4Owp0eXBlZGVmIGJvb3N0OjpkeW5hbWljX2JpdHNldDw+IGJpdG1hcDsKdHlw
ZWRlZiBib29zdDo6c2hhcmVkX3B0cjxiaXRtYXA+IHNoYXJlZF9iaXRtYXA7CgpzdGF0aWMgdm9p
ZCAKZW5zdXJlX3BhcmVudHNfbG9hZGVkKGN0eCBjaGlsZCwKICAgICAgICAgICAgICAgICAgICAg
IHN0ZDo6bWFwPGN0eCwgc2hhcmVkX2JpdG1hcD4gJiBwYXJlbnRzLAogICAgICAgICAgICAgICAg
ICAgICAgaW50ZXJuZXI8Y3R4PiAmIGludGVybiwKICAgICAgICAgICAgICAgICAgICAgIGFwcF9z
dGF0ZSAmIGFwcCkKewogIGlmIChwYXJlbnRzLmZpbmQoY2hpbGQpICE9IHBhcmVudHMuZW5kKCkp
CiAgICByZXR1cm47CgogIEwoRigibG9hZGluZyBwYXJlbnRzIGZvciBub2RlICVkXG4iKSAlIGNo
aWxkKTsKCiAgc3RkOjpzZXQ8cmV2aXNpb25faWQ+IGltbV9wYXJlbnRzOwogIGFwcC5kYi5nZXRf
cmV2aXNpb25fcGFyZW50cyhyZXZpc2lvbl9pZChpbnRlcm4ubG9va3VwKGNoaWxkKSksIGltbV9w
YXJlbnRzKTsKCiAgLy8gVGhlIG51bGwgcmV2aXNpb24gaXMgbm90IGEgcGFyZW50IGZvciBwdXJw
b3NlcyBvZiBmaW5kaW5nIGNvbW1vbgogIC8vIGFuY2VzdG9ycy4KICBmb3IgKHN0ZDo6c2V0PHJl
dmlzaW9uX2lkPjo6aXRlcmF0b3IgcCA9IGltbV9wYXJlbnRzLmJlZ2luKCk7CiAgICAgICBwICE9
IGltbV9wYXJlbnRzLmVuZCgpOyArK3ApCiAgICB7CiAgICAgIGlmIChudWxsX2lkKCpwKSkKICAg
ICAgICBpbW1fcGFyZW50cy5lcmFzZShwKTsKICAgIH0KICAgICAgICAgICAgICAKICBzaGFyZWRf
Yml0bWFwIGJpdHMgPSBzaGFyZWRfYml0bWFwKG5ldyBiaXRtYXAocGFyZW50cy5zaXplKCkpKTsK
ICAKICBmb3IgKHN0ZDo6c2V0PHJldmlzaW9uX2lkPjo6Y29uc3RfaXRlcmF0b3IgcCA9IGltbV9w
YXJlbnRzLmJlZ2luKCk7CiAgICAgICBwICE9IGltbV9wYXJlbnRzLmVuZCgpOyArK3ApCiAgICB7
CiAgICAgIGN0eCBwbiA9IGludGVybi5pbnRlcm4ocC0+aW5uZXIoKSgpKTsKICAgICAgTChGKCJw
YXJlbnQgJXMgLT4gbm9kZSAlZFxuIikgJSAqcCAlIHBuKTsKICAgICAgaWYgKHBuID49IGJpdHMt
PnNpemUoKSkgCiAgICAgICAgYml0cy0+cmVzaXplKHBuKzEpOwogICAgICBiaXRzLT5zZXQocG4p
OwogICAgfQogICAgCiAgcGFyZW50cy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY2hpbGQsIGJpdHMp
KTsKfQoKc3RhdGljIGJvb2wgCmV4cGFuZF9kb21pbmF0b3JzKHN0ZDo6bWFwPGN0eCwgc2hhcmVk
X2JpdG1hcD4gJiBwYXJlbnRzLAogICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxjdHgsIHNoYXJl
ZF9iaXRtYXA+ICYgZG9taW5hdG9ycywKICAgICAgICAgICAgICAgICAgaW50ZXJuZXI8Y3R4PiAm
IGludGVybiwKICAgICAgICAgICAgICAgICAgYXBwX3N0YXRlICYgYXBwKQp7CiAgYm9vbCBzb21l
dGhpbmdfY2hhbmdlZCA9IGZhbHNlOwogIHN0ZDo6dmVjdG9yPGN0eD4gbm9kZXM7CgogIG5vZGVz
LnJlc2VydmUoZG9taW5hdG9ycy5zaXplKCkpOwoKICAvLyBwYXNzIDEsIHB1bGwgb3V0IGFsbCB0
aGUgbm9kZSBudW1iZXJzIHdlJ3JlIGdvaW5nIHRvIHNjYW4gdGhpcyB0aW1lIGFyb3VuZAogIGZv
ciAoc3RkOjptYXA8Y3R4LCBzaGFyZWRfYml0bWFwPjo6Y29uc3RfaXRlcmF0b3IgZSA9IGRvbWlu
YXRvcnMuYmVnaW4oKTsgCiAgICAgICBlICE9IGRvbWluYXRvcnMuZW5kKCk7ICsrZSkKICAgIG5v
ZGVzLnB1c2hfYmFjayhlLT5maXJzdCk7CiAgCiAgLy8gcGFzcyAyLCB1cGRhdGUgYW55IG9mIHRo
ZSBkb21pbmF0b3IgZW50cmllcyB3ZSBjYW4KICBmb3IgKHN0ZDo6dmVjdG9yPGN0eD46OmNvbnN0
X2l0ZXJhdG9yIG4gPSBub2Rlcy5iZWdpbigpOyAKICAgICAgIG4gIT0gbm9kZXMuZW5kKCk7ICsr
bikKICAgIHsKICAgICAgc2hhcmVkX2JpdG1hcCBiaXRzID0gZG9taW5hdG9yc1sqbl07CiAgICAg
IGJpdG1hcCBzYXZlZCgqYml0cyk7CiAgICAgIGlmIChiaXRzLT5zaXplKCkgPD0gKm4pCiAgICAg
ICAgYml0cy0+cmVzaXplKCpuICsgMSk7CiAgICAgIGJpdHMtPnNldCgqbik7CiAgICAgIAogICAg
ICBlbnN1cmVfcGFyZW50c19sb2FkZWQoKm4sIHBhcmVudHMsIGludGVybiwgYXBwKTsKICAgICAg
c2hhcmVkX2JpdG1hcCBuX3BhcmVudHMgPSBwYXJlbnRzWypuXTsKICAgICAgCiAgICAgIGJpdG1h
cCBpbnRlcnNlY3Rpb24oYml0cy0+c2l6ZSgpKTsKICAgICAgCiAgICAgIGJvb2wgZmlyc3QgPSB0
cnVlOwogICAgICBmb3IgKHVuc2lnbmVkIGxvbmcgcGFyZW50ID0gMDsgCiAgICAgICAgICAgcGFy
ZW50ICE9IG5fcGFyZW50cy0+c2l6ZSgpOyArK3BhcmVudCkKICAgICAgICB7CiAgICAgICAgICBp
ZiAoISBuX3BhcmVudHMtPnRlc3QocGFyZW50KSkKICAgICAgICAgICAgY29udGludWU7CgogICAg
ICAgICAgaWYgKGRvbWluYXRvcnMuZmluZChwYXJlbnQpID09IGRvbWluYXRvcnMuZW5kKCkpCiAg
ICAgICAgICAgIGRvbWluYXRvcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHBhcmVudCwgCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9iaXRtYXAobmV3
IGJpdG1hcCgpKSkpOwogICAgICAgICAgc2hhcmVkX2JpdG1hcCBwYml0cyA9IGRvbWluYXRvcnNb
cGFyZW50XTsKCiAgICAgICAgICBpZiAoYml0cy0+c2l6ZSgpID4gcGJpdHMtPnNpemUoKSkKICAg
ICAgICAgICAgcGJpdHMtPnJlc2l6ZShiaXRzLT5zaXplKCkpOwoKICAgICAgICAgIGlmIChwYml0
cy0+c2l6ZSgpID4gYml0cy0+c2l6ZSgpKQogICAgICAgICAgICBiaXRzLT5yZXNpemUocGJpdHMt
PnNpemUoKSk7CgogICAgICAgICAgaWYgKGZpcnN0KQogICAgICAgICAgICB7CiAgICAgICAgICAg
ICAgaW50ZXJzZWN0aW9uID0gKCpwYml0cyk7CiAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsK
ICAgICAgICAgICAgfQogICAgICAgICAgZWxzZQogICAgICAgICAgICBpbnRlcnNlY3Rpb24gJj0g
KCpwYml0cyk7CiAgICAgICAgfQoKICAgICAgKCpiaXRzKSB8PSBpbnRlcnNlY3Rpb247CiAgICAg
IGlmICgqYml0cyAhPSBzYXZlZCkKICAgICAgICBzb21ldGhpbmdfY2hhbmdlZCA9IHRydWU7CiAg
ICB9CiAgcmV0dXJuIHNvbWV0aGluZ19jaGFuZ2VkOwp9CgoKc3RhdGljIGJvb2wgCmV4cGFuZF9h
bmNlc3RvcnMoc3RkOjptYXA8Y3R4LCBzaGFyZWRfYml0bWFwPiAmIHBhcmVudHMsCiAgICAgICAg
ICAgICAgICAgc3RkOjptYXA8Y3R4LCBzaGFyZWRfYml0bWFwPiAmIGFuY2VzdG9ycywKICAgICAg
ICAgICAgICAgICBpbnRlcm5lcjxjdHg+ICYgaW50ZXJuLAogICAgICAgICAgICAgICAgIGFwcF9z
dGF0ZSAmIGFwcCkKewogIGJvb2wgc29tZXRoaW5nX2NoYW5nZWQgPSBmYWxzZTsKICBzdGQ6OnZl
Y3RvcjxjdHg+IG5vZGVzOwoKICBub2Rlcy5yZXNlcnZlKGFuY2VzdG9ycy5zaXplKCkpOwoKICAv
LyBwYXNzIDEsIHB1bGwgb3V0IGFsbCB0aGUgbm9kZSBudW1iZXJzIHdlJ3JlIGdvaW5nIHRvIHNj
YW4gdGhpcyB0aW1lIGFyb3VuZAogIGZvciAoc3RkOjptYXA8Y3R4LCBzaGFyZWRfYml0bWFwPjo6
Y29uc3RfaXRlcmF0b3IgZSA9IGFuY2VzdG9ycy5iZWdpbigpOyAKICAgICAgIGUgIT0gYW5jZXN0
b3JzLmVuZCgpOyArK2UpCiAgICBub2Rlcy5wdXNoX2JhY2soZS0+Zmlyc3QpOwogIAogIC8vIHBh
c3MgMiwgdXBkYXRlIGFueSBvZiB0aGUgYW5jZXN0b3IgZW50cmllcyB3ZSBjYW4KICBmb3IgKHN0
ZDo6dmVjdG9yPGN0eD46OmNvbnN0X2l0ZXJhdG9yIG4gPSBub2Rlcy5iZWdpbigpOyBuICE9IG5v
ZGVzLmVuZCgpOyArK24pCiAgICB7CiAgICAgIHNoYXJlZF9iaXRtYXAgYml0cyA9IGFuY2VzdG9y
c1sqbl07CiAgICAgIGJpdG1hcCBzYXZlZCgqYml0cyk7CiAgICAgIGlmIChiaXRzLT5zaXplKCkg
PD0gKm4pCiAgICAgICAgYml0cy0+cmVzaXplKCpuICsgMSk7CiAgICAgIGJpdHMtPnNldCgqbik7
CgogICAgICBlbnN1cmVfcGFyZW50c19sb2FkZWQoKm4sIHBhcmVudHMsIGludGVybiwgYXBwKTsK
ICAgICAgc2hhcmVkX2JpdG1hcCBuX3BhcmVudHMgPSBwYXJlbnRzWypuXTsKICAgICAgZm9yIChj
dHggcGFyZW50ID0gMDsgcGFyZW50ICE9IG5fcGFyZW50cy0+c2l6ZSgpOyArK3BhcmVudCkKICAg
ICAgICB7CiAgICAgICAgICBpZiAoISBuX3BhcmVudHMtPnRlc3QocGFyZW50KSkKICAgICAgICAg
ICAgY29udGludWU7CgogICAgICAgICAgaWYgKGJpdHMtPnNpemUoKSA8PSBwYXJlbnQpCiAgICAg
ICAgICAgIGJpdHMtPnJlc2l6ZShwYXJlbnQgKyAxKTsKICAgICAgICAgIGJpdHMtPnNldChwYXJl
bnQpOwoKICAgICAgICAgIGlmIChhbmNlc3RvcnMuZmluZChwYXJlbnQpID09IGFuY2VzdG9ycy5l
bmQoKSkKICAgICAgICAgICAgYW5jZXN0b3JzLmluc2VydChtYWtlX3BhaXIocGFyZW50LCAKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9iaXRtYXAobmV3IGJp
dG1hcCgpKSkpOwogICAgICAgICAgc2hhcmVkX2JpdG1hcCBwYml0cyA9IGFuY2VzdG9yc1twYXJl
bnRdOwoKICAgICAgICAgIGlmIChiaXRzLT5zaXplKCkgPiBwYml0cy0+c2l6ZSgpKQogICAgICAg
ICAgICBwYml0cy0+cmVzaXplKGJpdHMtPnNpemUoKSk7CgogICAgICAgICAgaWYgKHBiaXRzLT5z
aXplKCkgPiBiaXRzLT5zaXplKCkpCiAgICAgICAgICAgIGJpdHMtPnJlc2l6ZShwYml0cy0+c2l6
ZSgpKTsKCiAgICAgICAgICAoKmJpdHMpIHw9ICgqcGJpdHMpOwogICAgICAgIH0KICAgICAgaWYg
KCpiaXRzICE9IHNhdmVkKQogICAgICAgIHNvbWV0aGluZ19jaGFuZ2VkID0gdHJ1ZTsKICAgIH0K
ICByZXR1cm4gc29tZXRoaW5nX2NoYW5nZWQ7Cn0KCnN0YXRpYyBib29sIApmaW5kX2ludGVyc2Vj
dGluZ19ub2RlKGJpdG1hcCAmIGZzdCwgCiAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwICYg
c25kLCAKICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5lcjxjdHg+IGNvbnN0ICYgaW50ZXJu
LCAKICAgICAgICAgICAgICAgICAgICAgICByZXZpc2lvbl9pZCAmIGFuYykKewogIAogIGlmIChm
c3Quc2l6ZSgpID4gc25kLnNpemUoKSkKICAgIHNuZC5yZXNpemUoZnN0LnNpemUoKSk7CiAgZWxz
ZSBpZiAoc25kLnNpemUoKSA+IGZzdC5zaXplKCkpCiAgICBmc3QucmVzaXplKHNuZC5zaXplKCkp
OwogIAogIGJpdG1hcCBpbnRlcnNlY3Rpb24gPSBmc3QgJiBzbmQ7CiAgaWYgKGludGVyc2VjdGlv
bi5hbnkoKSkKICAgIHsKICAgICAgTChGKCJmb3VuZCAlZCBpbnRlcnNlY3Rpbmcgbm9kZXNcbiIp
ICUgaW50ZXJzZWN0aW9uLmNvdW50KCkpOwogICAgICBmb3IgKGN0eCBpID0gMDsgaSA8IGludGVy
c2VjdGlvbi5zaXplKCk7ICsraSkKICAgICAgICB7CiAgICAgICAgICBpZiAoaW50ZXJzZWN0aW9u
LnRlc3QoaSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBhbmMgPSByZXZpc2lvbl9pZChp
bnRlcm4ubG9va3VwKGkpKTsKICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAg
fQogICAgICAgIH0KICAgIH0KICByZXR1cm4gZmFsc2U7Cn0KCi8vICBzdGF0aWMgdm9pZAovLyAg
ZHVtcF9iaXRzZXRfbWFwKHN0cmluZyBjb25zdCAmIGhkciwKLy8gICAgICAgICAgICAgIHN0ZDo6
bWFwPCBjdHgsIHNoYXJlZF9iaXRtYXAgPiBjb25zdCAmIG1tKQovLyAgewovLyAgICBMKEYoImR1
bXBpbmcgWyVzXSAoJWQgZW50cmllcylcbiIpICUgaGRyICUgbW0uc2l6ZSgpKTsKLy8gICAgZm9y
IChzdGQ6Om1hcDwgY3R4LCBzaGFyZWRfYml0bWFwID46OmNvbnN0X2l0ZXJhdG9yIGkgPSBtbS5i
ZWdpbigpOwovLyAgICAgICAgIGkgIT0gbW0uZW5kKCk7ICsraSkKLy8gICAgICB7Ci8vICAgICAg
ICBMKEYoImR1bXAgWyVzXTogJWQgLT4gJXNcbiIpICUgaGRyICUgaS0+Zmlyc3QgJSAoKihpLT5z
ZWNvbmQpKSk7Ci8vICAgICAgfQovLyAgfQoKYm9vbCAKZmluZF9jb21tb25fYW5jZXN0b3IocmV2
aXNpb25faWQgY29uc3QgJiBsZWZ0LAogICAgICAgICAgICAgICAgICAgICByZXZpc2lvbl9pZCBj
b25zdCAmIHJpZ2h0LAogICAgICAgICAgICAgICAgICAgICByZXZpc2lvbl9pZCAmIGFuYywKICAg
ICAgICAgICAgICAgICAgICAgYXBwX3N0YXRlICYgYXBwKQp7CiAgaW50ZXJuZXI8Y3R4PiBpbnRl
cm47CiAgc3RkOjptYXA8IGN0eCwgc2hhcmVkX2JpdG1hcCA+IAogICAgcGFyZW50cywgYW5jZXN0
b3JzLCBkb21pbmF0b3JzOwogIAogIGN0eCBsbiA9IGludGVybi5pbnRlcm4obGVmdC5pbm5lcigp
KCkpOwogIGN0eCBybiA9IGludGVybi5pbnRlcm4ocmlnaHQuaW5uZXIoKSgpKTsKICAKICBzaGFy
ZWRfYml0bWFwIGxhbmMgPSBzaGFyZWRfYml0bWFwKG5ldyBiaXRtYXAoKSk7CiAgc2hhcmVkX2Jp
dG1hcCByYW5jID0gc2hhcmVkX2JpdG1hcChuZXcgYml0bWFwKCkpOwogIHNoYXJlZF9iaXRtYXAg
bGRvbSA9IHNoYXJlZF9iaXRtYXAobmV3IGJpdG1hcCgpKTsKICBzaGFyZWRfYml0bWFwIHJkb20g
PSBzaGFyZWRfYml0bWFwKG5ldyBiaXRtYXAoKSk7CgogIGFuY2VzdG9ycy5pbnNlcnQobWFrZV9w
YWlyKGxuLCBsYW5jKSk7CiAgYW5jZXN0b3JzLmluc2VydChtYWtlX3BhaXIocm4sIHJhbmMpKTsK
ICBkb21pbmF0b3JzLmluc2VydChtYWtlX3BhaXIobG4sIGxkb20pKTsKICBkb21pbmF0b3JzLmlu
c2VydChtYWtlX3BhaXIocm4sIHJkb20pKTsKICAKICBMKEYoInNlYXJjaGluZyBmb3IgY29tbW9u
IGFuY2VzdG9yLCBsZWZ0PSVzIHJpZ2h0PSVzXG4iKSAlIGxlZnQgJSByaWdodCk7CiAgCiAgd2hp
bGUgKGV4cGFuZF9hbmNlc3RvcnMocGFyZW50cywgYW5jZXN0b3JzLCBpbnRlcm4sIGFwcCkgfHwK
ICAgICAgICAgZXhwYW5kX2RvbWluYXRvcnMocGFyZW50cywgZG9taW5hdG9ycywgaW50ZXJuLCBh
cHApKQogICAgewogICAgICBMKEYoImNvbW1vbiBhbmNlc3RvciBzY2FuIFtwYXI9JWQsYW5jPSVk
LGRvbT0lZF1cbiIpICUgCiAgICAgICAgcGFyZW50cy5zaXplKCkgJSBhbmNlc3RvcnMuc2l6ZSgp
ICUgZG9taW5hdG9ycy5zaXplKCkpOwoKICAgICAgaWYgKGZpbmRfaW50ZXJzZWN0aW5nX25vZGUo
KmxhbmMsICpyZG9tLCBpbnRlcm4sIGFuYykpCiAgICAgICAgewogICAgICAgICAgTChGKCJmb3Vu
ZCBub2RlICVkLCBhbmNlc3RvciBvZiBsZWZ0ICVzIGFuZCBkb21pbmF0aW5nIHJpZ2h0ICVzXG4i
KQogICAgICAgICAgICAlIGFuYyAlIGxlZnQgJSByaWdodCk7CiAgICAgICAgICByZXR1cm4gdHJ1
ZTsKICAgICAgICB9CiAgICAgIAogICAgICBlbHNlIGlmIChmaW5kX2ludGVyc2VjdGluZ19ub2Rl
KCpyYW5jLCAqbGRvbSwgaW50ZXJuLCBhbmMpKQogICAgICAgIHsKICAgICAgICAgIEwoRigiZm91
bmQgbm9kZSAlZCwgYW5jZXN0b3Igb2YgcmlnaHQgJXMgYW5kIGRvbWluYXRpbmcgbGVmdCAlc1xu
IikKICAgICAgICAgICAgJSBhbmMgJSByaWdodCAlIGxlZnQpOwogICAgICAgICAgcmV0dXJuIHRy
dWU7CiAgICAgICAgfQogICAgfQovLyAgICAgIGR1bXBfYml0c2V0X21hcCgiYW5jZXN0b3JzIiwg
YW5jZXN0b3JzKTsKLy8gICAgICBkdW1wX2JpdHNldF9tYXAoImRvbWluYXRvcnMiLCBkb21pbmF0
b3JzKTsKLy8gICAgICBkdW1wX2JpdHNldF9tYXAoInBhcmVudHMiLCBwYXJlbnRzKTsKICByZXR1
cm4gZmFsc2U7Cn0KCgovLyAKLy8gVGhlIGlkZWEgd2l0aCB0aGlzIGFsZ29yaXRobSBpcyB0byB3
YWxrIGZyb20gY2hpbGQgdXAgdG8gYW5jZXN0b3IsCi8vIHJlY3Vyc2l2ZWx5LCBhY2N1bXVsYXRp
bmcgYWxsIHRoZSBjaGFuZ2Vfc2V0cyBhc3NvY2lhdGVkIHdpdGgKLy8gaW50ZXJtZWRpYXRlIG5v
ZGVzIGludG8gKm9uZSBiaWcgY2hhbmdlX3NldCouCi8vCi8vIGNsZXZlciByZWFkZXJzIHdpbGwg
cmVhbGl6ZSB0aGlzIGlzIGFuIG92ZXJsYXBwaW5nLXN1YnByb2JsZW0gdHlwZQovLyBzaXR1YXRp
b24gYW5kIHRodXMgbmVlZHMgdG8ga2VlcCBhIGR5bmFtaWMgcHJvZ3JhbW1pbmcgbWFwIHRvIGtl
ZXAKLy8gaXRzZWxmIGluIGxpbmVhciBjb21wbGV4aXR5LgovLwovLyBpbiBmYWN0LCB3ZSBrZWVw
IHR3bzogb25lIHdoaWNoIG1hcHMgdG8gY29tcHV0ZWQgcmVzdWx0cyAocGFydGlhbF9jc2V0cykK
Ly8gYW5kIG9uZSB3aGljaCBqdXN0IGtlZXBzIGEgc2V0IG9mIGFsbCBub2RlcyB3ZSB0cmF2ZXJz
ZWQKLy8gKHZpc2l0ZWRfbm9kZXMpLiBpbiB0aGVvcnkgaXQgY291bGQgYmUgb25lIG1hcCB3aXRo
IGFuIGV4dHJhIGJvb2wgc3R1Y2sKLy8gb24gZWFjaCBlbnRyeSwgYnV0IEkgdGhpbmsgdGhhdCB3
b3VsZCBtYWtlIGl0IGV2ZW4gbGVzcyByZWFkYWJsZS4gaXQncwovLyBhbHJlYWR5IHF1aXRlIHVn
bHkuCi8vCgpzdGF0aWMgYm9vbCAKY2FsY3VsYXRlX2NoYW5nZV9zZXRzX3JlY3Vyc2l2ZShyZXZp
c2lvbl9pZCBjb25zdCAmIGFuY2VzdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHJldmlzaW9uX2lkIGNvbnN0ICYgY2hpbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgYXBwX3N0YXRlICYgYXBwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5n
ZV9zZXQgJiBjdW11bGF0aXZlX2NzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
c3RkOjptYXA8cmV2aXNpb25faWQsIGJvb3N0OjpzaGFyZWRfcHRyPGNoYW5nZV9zZXQ+ID4gJiBw
YXJ0aWFsX2NzZXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PHJl
dmlzaW9uX2lkPiAmIHZpc2l0ZWRfbm9kZXMpCnsKCiAgaWYgKGFuY2VzdG9yID09IGNoaWxkKQog
ICAgcmV0dXJuIHRydWU7CgogIHZpc2l0ZWRfbm9kZXMuaW5zZXJ0KGNoaWxkKTsKCiAgYm9vbCBy
ZWxldmFudF9jaGlsZCA9IGZhbHNlOwoKICByZXZpc2lvbl9zZXQgcmV2OwogIGFwcC5kYi5nZXRf
cmV2aXNpb24oY2hpbGQsIHJldik7CgogIEwoRigiZXhwbG9yaW5nIGNoYW5nZXNldHMgZnJvbSBw
YXJlbnRzIG9mICVzLCBzZWVraW5nIHRvd2FyZHMgJXNcbiIpIAogICAgJSBjaGlsZCAlIGFuY2Vz
dG9yKTsKCiAgZm9yKGVkZ2VfbWFwOjpjb25zdF9pdGVyYXRvciBpID0gcmV2LmVkZ2VzLmJlZ2lu
KCk7IGkgIT0gcmV2LmVkZ2VzLmVuZCgpOyArK2kpCiAgICB7CiAgICAgIGJvb2wgcmVsZXZhbnRf
cGFyZW50ID0gZmFsc2U7CiAgICAgIHJldmlzaW9uX2lkIGN1cnJfcGFyZW50ID0gZWRnZV9vbGRf
cmV2aXNpb24oaSk7CgogICAgICBpZiAoY3Vycl9wYXJlbnQuaW5uZXIoKSgpLmVtcHR5KCkpCiAg
ICAgICAgY29udGludWU7CgogICAgICBjaGFuZ2Vfc2V0IGNzZXRfdG9fY3Vycl9wYXJlbnQ7Cgog
ICAgICBMKEYoImNvbnNpZGVyaW5nIHBhcmVudCAlcyBvZiAlc1xuIikgJSBjdXJyX3BhcmVudCAl
IGNoaWxkKTsKCiAgICAgIHN0ZDo6bWFwPHJldmlzaW9uX2lkLCBib29zdDo6c2hhcmVkX3B0cjxj
aGFuZ2Vfc2V0PiA+Ojpjb25zdF9pdGVyYXRvciBqID0gCiAgICAgICAgcGFydGlhbF9jc2V0cy5m
aW5kKGN1cnJfcGFyZW50KTsKICAgICAgaWYgKGogIT0gcGFydGlhbF9jc2V0cy5lbmQoKSkgCiAg
ICAgICAgewogICAgICAgICAgLy8gYSByZWN1cnNpdmUgY2FsbCBoYXMgdHJhdmVyc2VkIHRoaXMg
cGFyZW50IGJlZm9yZSBhbmQgYnVpbHQgYW4KICAgICAgICAgIC8vIGV4aXN0aW5nIGNzZXQuIGp1
c3QgcmV1c2UgdGhhdCByYXRoZXIgdGhhbiByZS10cmF2ZXJzaW5nCiAgICAgICAgICBjc2V0X3Rv
X2N1cnJfcGFyZW50ID0gKihqLT5zZWNvbmQpOwogICAgICAgICAgcmVsZXZhbnRfcGFyZW50ID0g
dHJ1ZTsKICAgICAgICB9CiAgICAgIGVsc2UgaWYgKHZpc2l0ZWRfbm9kZXMuZmluZChjdXJyX3Bh
cmVudCkgIT0gdmlzaXRlZF9ub2Rlcy5lbmQoKSkKICAgICAgICB7CiAgICAgICAgICAvLyBhIHJl
Y3Vyc2l2ZSBjYWxsIGhhcyB0cmF2ZXJzZWQgdGhpcyBwYXJlbnQsIGJ1dCB0aGVyZSB3YXMgbm8K
ICAgICAgICAgIC8vIHBhdGggZnJvbSBpdCB0byB0aGUgcm9vdCwgc28gdGhlIHBhcmVudCBpcyBp
cnJlbGV2YW50LiBza2lwLgogICAgICAgICAgcmVsZXZhbnRfcGFyZW50ID0gZmFsc2U7CiAgICAg
ICAgfQogICAgICBlbHNlCiAgICAgICAgcmVsZXZhbnRfcGFyZW50ID0gY2FsY3VsYXRlX2NoYW5n
ZV9zZXRzX3JlY3Vyc2l2ZShhbmNlc3RvciwgY3Vycl9wYXJlbnQsIGFwcCwgCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc2V0X3RvX2N1
cnJfcGFyZW50LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHBhcnRpYWxfY3NldHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXNpdGVkX25vZGVzKTsKCiAgICAgIGlmIChy
ZWxldmFudF9wYXJlbnQpCiAgICAgICAgewogICAgICAgICAgTChGKCJyZXZpc2lvbiAlcyBpcyBy
ZWxldmFudCwgY29tcG9zaW5nIHdpdGggZWRnZSB0byAlc1xuIikgCiAgICAgICAgICAgICUgY3Vy
cl9wYXJlbnQgJSBjaGlsZCk7CiAgICAgICAgICBjb25jYXRlbmF0ZV9jaGFuZ2Vfc2V0cyhjc2V0
X3RvX2N1cnJfcGFyZW50LCBlZGdlX2NoYW5nZXMoaSksIGN1bXVsYXRpdmVfY3NldCk7CiAgICAg
ICAgICByZWxldmFudF9jaGlsZCA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAg
ICAgIGVsc2UKICAgICAgICBMKEYoInBhcmVudCAlcyBvZiAlcyBpcyBub3QgcmVsZXZhbnRcbiIp
ICUgY3Vycl9wYXJlbnQgJSBjaGlsZCk7CiAgICB9CgogIC8vIHN0b3JlIHRoZSBwYXJ0aWFsIGVk
Z2UgZnJvbSBhbmNlc3RvciAtPiBjaGlsZCwgc28gdGhhdCBpZiBhbnlvbmUKICAvLyByZS10cmF2
ZXJzZXMgdGhpcyBlZGdlIHRoZXknbGwganVzdCBmZXRjaCBmcm9tIHRoZSBwYXJ0aWFsX2VkZ2Vz
CiAgLy8gY2FjaGUuCiAgaWYgKHJlbGV2YW50X2NoaWxkKQogICAgcGFydGlhbF9jc2V0cy5pbnNl
cnQoc3RkOjptYWtlX3BhaXIoY2hpbGQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8Y2hhbmdlX3NldD4KICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIChuZXcgY2hhbmdlX3NldChjdW11bGF0aXZlX2NzZXQpKSkp
OwogIAogIHJldHVybiByZWxldmFudF9jaGlsZDsKfQoKdm9pZCAKY2FsY3VsYXRlX2NvbXBvc2l0
ZV9jaGFuZ2Vfc2V0KHJldmlzaW9uX2lkIGNvbnN0ICYgYW5jZXN0b3IsCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICByZXZpc2lvbl9pZCBjb25zdCAmIGNoaWxkLAogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgYXBwX3N0YXRlICYgYXBwLAogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgY2hhbmdlX3NldCAmIGNvbXBvc2VkKQp7CiAgTChGKCJjYWxjdWxhdGluZyBjb21w
b3NpdGUgY2hhbmdlc2V0IGJldHdlZW4gJXMgYW5kICVzXG4iKQogICAgJSBhbmNlc3RvciAlIGNo
aWxkKTsKICBzdGQ6OnNldDxyZXZpc2lvbl9pZD4gdmlzaXRlZDsKICBzdGQ6Om1hcDxyZXZpc2lv
bl9pZCwgYm9vc3Q6OnNoYXJlZF9wdHI8Y2hhbmdlX3NldD4gPiBwYXJ0aWFsOwogIGNhbGN1bGF0
ZV9jaGFuZ2Vfc2V0c19yZWN1cnNpdmUoYW5jZXN0b3IsIGNoaWxkLCBhcHAsIGNvbXBvc2VkLCBw
YXJ0aWFsLCB2aXNpdGVkKTsKfQoKLy8gbWlncmF0aW9uIHN0dWZmCi8vCi8vIEZJWE1FOiB0aGVz
ZSBhcmUgdGVtcG9yYXJ5IGZ1bmN0aW9ucywgb25jZSB3ZSd2ZSBkb25lIHRoZSBtaWdyYXRpb24g
dG8KLy8gcmV2aXNpb25zIC8gY2hhbmdlc2V0cywgd2UgY2FuIHJlbW92ZSB0aGVtLgoKc3RhdGlj
IHZvaWQgCmFuYWx5emVfbWFuaWZlc3RfY2hhbmdlcyhhcHBfc3RhdGUgJiBhcHAsCiAgICAgICAg
ICAgICAgICAgICAgICAgICBtYW5pZmVzdF9pZCBjb25zdCAmIHBhcmVudCwgCiAgICAgICAgICAg
ICAgICAgICAgICAgICBtYW5pZmVzdF9pZCBjb25zdCAmIGNoaWxkLCAKICAgICAgICAgICAgICAg
ICAgICAgICAgIGNoYW5nZV9zZXQgJiBjcykKewogIG1hbmlmZXN0X21hcCBtX3BhcmVudCwgbV9j
aGlsZDsKICBhcHAuZGIuZ2V0X21hbmlmZXN0KHBhcmVudCwgbV9wYXJlbnQpOwogIGFwcC5kYi5n
ZXRfbWFuaWZlc3QoY2hpbGQsIG1fY2hpbGQpOwoKICBmb3IgKG1hbmlmZXN0X21hcDo6Y29uc3Rf
aXRlcmF0b3IgaSA9IG1fcGFyZW50LmJlZ2luKCk7IAogICAgICAgaSAhPSBtX3BhcmVudC5lbmQo
KTsgKytpKQogICAgewogICAgICBtYW5pZmVzdF9tYXA6OmNvbnN0X2l0ZXJhdG9yIGogPSBtX2No
aWxkLmZpbmQobWFuaWZlc3RfZW50cnlfcGF0aChpKSk7CiAgICAgIGlmIChqID09IG1fY2hpbGQu
ZW5kKCkpCiAgICAgICAgY3MuZGVsZXRlX2ZpbGUobWFuaWZlc3RfZW50cnlfcGF0aChpKSk7CiAg
ICAgIGVsc2UgaWYgKCEgKG1hbmlmZXN0X2VudHJ5X2lkKGkpID09IG1hbmlmZXN0X2VudHJ5X2lk
KGopKSkKICAgICAgICB7CiAgICAgICAgICBjcy5hcHBseV9kZWx0YShtYW5pZmVzdF9lbnRyeV9w
YXRoKGkpLAogICAgICAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RfZW50cnlfaWQoaSksIAog
ICAgICAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RfZW50cnlfaWQoaikpOwogICAgICAgIH0g
ICAgICAgCiAgICB9CiAgZm9yIChtYW5pZmVzdF9tYXA6OmNvbnN0X2l0ZXJhdG9yIGkgPSBtX2No
aWxkLmJlZ2luKCk7IAogICAgICAgaSAhPSBtX2NoaWxkLmVuZCgpOyArK2kpCiAgICB7CiAgICAg
IG1hbmlmZXN0X21hcDo6Y29uc3RfaXRlcmF0b3IgaiA9IG1fcGFyZW50LmZpbmQobWFuaWZlc3Rf
ZW50cnlfcGF0aChpKSk7CiAgICAgIGlmIChqID09IG1fcGFyZW50LmVuZCgpKQogICAgICAgIGNz
LmFkZF9maWxlKG1hbmlmZXN0X2VudHJ5X3BhdGgoaSksCiAgICAgICAgICAgICAgICAgICAgbWFu
aWZlc3RfZW50cnlfaWQoaSkpOwogICAgfQp9CgpzdGF0aWMgcmV2aXNpb25faWQKY29uc3RydWN0
X3JldmlzaW9ucyhhcHBfc3RhdGUgJiBhcHAsCiAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3Rf
aWQgY29uc3QgJiBjaGlsZCwKICAgICAgICAgICAgICAgICAgICBzdGQ6Om11bHRpbWFwPCBtYW5p
ZmVzdF9pZCwgbWFuaWZlc3RfaWQgPiBjb25zdCAmIGFuY2VzdHJ5LAogICAgICAgICAgICAgICAg
ICAgIHN0ZDo6bWFwPG1hbmlmZXN0X2lkLCByZXZpc2lvbl9pZD4gJiBtYXBwZWQpCnsKICByZXZp
c2lvbl9zZXQgcmV2OwogIHR5cGVkZWYgc3RkOjptdWx0aW1hcDwgbWFuaWZlc3RfaWQsIG1hbmlm
ZXN0X2lkID46OmNvbnN0X2l0ZXJhdG9yIGNpOwogIHN0ZDo6cGFpcjxjaSxjaT4gcmFuZ2UgPSBh
bmNlc3RyeS5lcXVhbF9yYW5nZShjaGlsZCk7CiAgZm9yIChjaSBpID0gcmFuZ2UuZmlyc3Q7IGkg
IT0gcmFuZ2Uuc2Vjb25kOyArK2kpCiAgICB7CiAgICAgIG1hbmlmZXN0X2lkIHBhcmVudChpLT5z
ZWNvbmQpOwogICAgICByZXZpc2lvbl9pZCBwYXJlbnRfcmlkOwogICAgICBzdGQ6Om1hcDxtYW5p
ZmVzdF9pZCwgcmV2aXNpb25faWQ+Ojpjb25zdF9pdGVyYXRvciBqID0gbWFwcGVkLmZpbmQocGFy
ZW50KTsKCiAgICAgIGlmIChqICE9IG1hcHBlZC5lbmQoKSkKICAgICAgICBwYXJlbnRfcmlkID0g
ai0+c2Vjb25kOwogICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgcGFyZW50X3JpZCA9IGNv
bnN0cnVjdF9yZXZpc2lvbnMoYXBwLCBwYXJlbnQsIGFuY2VzdHJ5LCBtYXBwZWQpOwogICAgICAg
ICAgUChGKCJpbnNlcnRpbmcgbWFwcGluZyAlZCA6ICVzIC0+ICVzXG4iKSAlIG1hcHBlZC5zaXpl
KCkgJSBwYXJlbnQgJSBwYXJlbnRfcmlkKTs7CiAgICAgICAgICBtYXBwZWQuaW5zZXJ0KHN0ZDo6
bWFrZV9wYWlyKHBhcmVudCwgcGFyZW50X3JpZCkpOwogICAgICAgIH0KICAgICAgCiAgICAgIGNo
YW5nZV9zZXQgY3M7CiAgICAgIGFuYWx5emVfbWFuaWZlc3RfY2hhbmdlcyhhcHAsIHBhcmVudCwg
Y2hpbGQsIGNzKTsKICAgICAgcmV2LmVkZ2VzLmluc2VydChzdGQ6Om1ha2VfcGFpcihwYXJlbnRf
cmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWly
KHBhcmVudCwgY3MpKSk7CiAgICB9IAoKICByZXZpc2lvbl9pZCByaWQ7CiAgaWYgKHJldi5lZGdl
cy5lbXB0eSgpKQogICAgewogICAgICBQKEYoImlnbm9yaW5nIGVtcHR5IHJldmlzaW9uIGZvciBt
YW5pZmVzdCAlc1xuIikgJSBjaGlsZCk7ICAKICAgICAgcmV0dXJuIHJpZDsKICAgIH0KCiAgcmV2
Lm5ld19tYW5pZmVzdCA9IGNoaWxkOwogIGNhbGN1bGF0ZV9pZGVudChyZXYsIHJpZCk7CgogIGlm
ICghYXBwLmRiLnJldmlzaW9uX2V4aXN0cyAocmlkKSkKICAgIHsKICAgICAgUChGKCJtYXBwaW5n
IG1hbmlmZXN0ICVzIHRvIHJldmlzaW9uICVzXG4iKSAlIGNoaWxkICUgcmlkKTsKICAgICAgYXBw
LmRiLnB1dF9yZXZpc2lvbihyaWQsIHJldik7CiAgICB9CiAgZWxzZQogICAgewogICAgICBQKEYo
InNraXBwaW5nIGFkZGl0aW9uYWwgcGF0aCB0byByZXZpc2lvbiAlc1xuIikgJSByaWQpOwogICAg
fQoKICAvLyBub3cgaG9pc3QgYWxsIHRoZSBpbnRlcmVzdGluZyBjZXJ0cyB1cCB0byB0aGUgcmV2
aXNpb24KICBzdGQ6OnNldDxjZXJ0X25hbWU+IGNuYW1lczsKICBjbmFtZXMuaW5zZXJ0KGNlcnRf
bmFtZShicmFuY2hfY2VydF9uYW1lKSk7CiAgY25hbWVzLmluc2VydChjZXJ0X25hbWUoZGF0ZV9j
ZXJ0X25hbWUpKTsKICBjbmFtZXMuaW5zZXJ0KGNlcnRfbmFtZShhdXRob3JfY2VydF9uYW1lKSk7
CiAgY25hbWVzLmluc2VydChjZXJ0X25hbWUodGFnX2NlcnRfbmFtZSkpOwogIGNuYW1lcy5pbnNl
cnQoY2VydF9uYW1lKGNoYW5nZWxvZ19jZXJ0X25hbWUpKTsKICBjbmFtZXMuaW5zZXJ0KGNlcnRf
bmFtZShjb21tZW50X2NlcnRfbmFtZSkpOwogIGNuYW1lcy5pbnNlcnQoY2VydF9uYW1lKHRlc3Ry
ZXN1bHRfY2VydF9uYW1lKSk7CgogIHN0ZDo6dmVjdG9yPCBtYW5pZmVzdDxjZXJ0PiA+IHRtcDsK
ICBhcHAuZGIuZ2V0X21hbmlmZXN0X2NlcnRzKGNoaWxkLCB0bXApOwogIGVyYXNlX2JvZ3VzX2Nl
cnRzKHRtcCwgYXBwKTsgICAgICAKICBmb3IgKHN0ZDo6dmVjdG9yPCBtYW5pZmVzdDxjZXJ0PiA+
Ojpjb25zdF9pdGVyYXRvciBpID0gdG1wLmJlZ2luKCk7CiAgICAgICBpICE9IHRtcC5lbmQoKTsg
KytpKQogICAgewogICAgICBpZiAoY25hbWVzLmZpbmQoaS0+aW5uZXIoKS5uYW1lKSA9PSBjbmFt
ZXMuZW5kKCkpCiAgICAgICAgY29udGludWU7CiAgICAgIGNlcnQgbmV3X2NlcnQ7CiAgICAgIGNl
cnRfdmFsdWUgdHY7CiAgICAgIGRlY29kZV9iYXNlNjQoaS0+aW5uZXIoKS52YWx1ZSwgdHYpOwog
ICAgICBtYWtlX3NpbXBsZV9jZXJ0KHJpZC5pbm5lcigpLCBpLT5pbm5lcigpLm5hbWUsIHR2LCBh
cHAsIG5ld19jZXJ0KTsKICAgICAgaWYgKCEgYXBwLmRiLnJldmlzaW9uX2NlcnRfZXhpc3RzKHJl
dmlzaW9uPGNlcnQ+KG5ld19jZXJ0KSkpCiAgICAgICAgYXBwLmRiLnB1dF9yZXZpc2lvbl9jZXJ0
KHJldmlzaW9uPGNlcnQ+KG5ld19jZXJ0KSk7CiAgICB9CiAgcmV0dXJuIHJpZDsgIAp9CgoKdm9p
ZCAKYnVpbGRfY2hhbmdlc2V0cyhhcHBfc3RhdGUgJiBhcHApCnsKICBzdGQ6OnZlY3RvcjwgbWFu
aWZlc3Q8Y2VydD4gPiB0bXA7CiAgYXBwLmRiLmdldF9tYW5pZmVzdF9jZXJ0cyhjZXJ0X25hbWUo
ImFuY2VzdG9yIiksIHRtcCk7CiAgZXJhc2VfYm9ndXNfY2VydHModG1wLCBhcHApOwoKICBzdGQ6
Om11bHRpbWFwPCBtYW5pZmVzdF9pZCwgbWFuaWZlc3RfaWQgPiBhbmNlc3RyeTsKICBzdGQ6OnNl
dDxtYW5pZmVzdF9pZD4gaGVhZHM7CiAgc3RkOjpzZXQ8bWFuaWZlc3RfaWQ+IHRvdGFsOwogIAog
IGZvciAoc3RkOjp2ZWN0b3I8IG1hbmlmZXN0PGNlcnQ+ID46OmNvbnN0X2l0ZXJhdG9yIGkgPSB0
bXAuYmVnaW4oKTsKICAgICAgIGkgIT0gdG1wLmVuZCgpOyArK2kpCiAgICB7CiAgICAgIGNlcnRf
dmFsdWUgdHY7CiAgICAgIGRlY29kZV9iYXNlNjQoaS0+aW5uZXIoKS52YWx1ZSwgdHYpOwogICAg
ICBtYW5pZmVzdF9pZCBjaGlsZCwgcGFyZW50OwogICAgICBjaGlsZCA9IGktPmlubmVyKCkuaWRl
bnQ7CiAgICAgIHBhcmVudCA9IGhleGVuYzxpZD4odHYoKSk7CiAgICAgIGhlYWRzLmluc2VydChj
aGlsZCk7CiAgICAgIGhlYWRzLmVyYXNlKHBhcmVudCk7CiAgICAgIHRvdGFsLmluc2VydChjaGls
ZCk7CiAgICAgIHRvdGFsLmluc2VydChwYXJlbnQpOwogICAgICBhbmNlc3RyeS5pbnNlcnQoc3Rk
OjptYWtlX3BhaXIoY2hpbGQsIHBhcmVudCkpOwogICAgfQogIAogIFAoRigiZm91bmQgYSB0b3Rh
bCBvZiAlZCBtYW5pZmVzdHNcbiIpICUgdG90YWwuc2l6ZSgpKTsKCiAgdHJhbnNhY3Rpb25fZ3Vh
cmQgZ3VhcmQoYXBwLmRiKTsKICBzdGQ6Om1hcDxtYW5pZmVzdF9pZCwgcmV2aXNpb25faWQ+IG1h
cHBlZDsKICBmb3IgKHN0ZDo6c2V0PG1hbmlmZXN0X2lkPjo6Y29uc3RfaXRlcmF0b3IgaSA9IGhl
YWRzLmJlZ2luKCk7CiAgICAgICBpICE9IGhlYWRzLmVuZCgpOyArK2kpCiAgICB7CiAgICAgIGNv
bnN0cnVjdF9yZXZpc2lvbnMoYXBwLCAqaSwgYW5jZXN0cnksIG1hcHBlZCk7CiAgICB9CiAgZ3Vh
cmQuY29tbWl0KCk7Cn0KCgovLyBpL28gc3R1ZmYKCnN0ZDo6c3RyaW5nIHJldmlzaW9uX2ZpbGVf
bmFtZSgicmV2aXNpb24iKTsKCm5hbWVzcGFjZSAKewogIG5hbWVzcGFjZSBzeW1zCiAgewogICAg
c3RkOjpzdHJpbmcgY29uc3Qgb2xkX3JldmlzaW9uKCJvbGRfcmV2aXNpb24iKTsKICAgIHN0ZDo6
c3RyaW5nIGNvbnN0IG5ld19tYW5pZmVzdCgibmV3X21hbmlmZXN0Iik7CiAgICBzdGQ6OnN0cmlu
ZyBjb25zdCBvbGRfbWFuaWZlc3QoIm9sZF9tYW5pZmVzdCIpOwogIH0KfQoKCnZvaWQgCnByaW50
X2VkZ2UoYmFzaWNfaW86OnByaW50ZXIgJiBwcmludGVyLAogICAgICAgICAgIGVkZ2VfZW50cnkg
Y29uc3QgJiBlKQp7ICAgICAgIAogIGJhc2ljX2lvOjpzdGFuemEgc3Q7CiAgc3QucHVzaF9oZXhf
cGFpcihzeW1zOjpvbGRfcmV2aXNpb24sIGVkZ2Vfb2xkX3JldmlzaW9uKGUpLmlubmVyKCkoKSk7
CiAgc3QucHVzaF9oZXhfcGFpcihzeW1zOjpvbGRfbWFuaWZlc3QsIGVkZ2Vfb2xkX21hbmlmZXN0
KGUpLmlubmVyKCkoKSk7CiAgcHJpbnRlci5wcmludF9zdGFuemEoc3QpOwogIHByaW50X2NoYW5n
ZV9zZXQocHJpbnRlciwgZWRnZV9jaGFuZ2VzKGUpKTsgCn0KCgp2b2lkIApwcmludF9yZXZpc2lv
bihiYXNpY19pbzo6cHJpbnRlciAmIHByaW50ZXIsCiAgICAgICAgICAgICAgIHJldmlzaW9uX3Nl
dCBjb25zdCAmIHJldikKewogIGJhc2ljX2lvOjpzdGFuemEgc3Q7IAogIHN0LnB1c2hfaGV4X3Bh
aXIoc3ltczo6bmV3X21hbmlmZXN0LCByZXYubmV3X21hbmlmZXN0LmlubmVyKCkoKSk7CiAgcHJp
bnRlci5wcmludF9zdGFuemEoc3QpOwogIGZvciAoZWRnZV9tYXA6OmNvbnN0X2l0ZXJhdG9yIGVk
Z2UgPSByZXYuZWRnZXMuYmVnaW4oKTsKICAgICAgIGVkZ2UgIT0gcmV2LmVkZ2VzLmVuZCgpOyAr
K2VkZ2UpCiAgICBwcmludF9lZGdlKHByaW50ZXIsICplZGdlKTsKfQoKCnZvaWQgCnBhcnNlX2Vk
Z2UoYmFzaWNfaW86OnBhcnNlciAmIHBhcnNlciwKICAgICAgICAgICBlZGdlX21hcCAmIGVzKQp7
CiAgY2hhbmdlX3NldCBjczsKICBtYW5pZmVzdF9pZCBvbGRfbWFuOwogIHJldmlzaW9uX2lkIG9s
ZF9yZXY7CiAgc3RkOjpzdHJpbmcgdG1wOwogIAogIHBhcnNlci5lc3ltKHN5bXM6Om9sZF9yZXZp
c2lvbik7CiAgcGFyc2VyLmhleCh0bXApOwogIG9sZF9yZXYgPSByZXZpc2lvbl9pZCh0bXApOwog
IAogIHBhcnNlci5lc3ltKHN5bXM6Om9sZF9tYW5pZmVzdCk7CiAgcGFyc2VyLmhleCh0bXApOwog
IG9sZF9tYW4gPSBtYW5pZmVzdF9pZCh0bXApOwogIAogIHBhcnNlX2NoYW5nZV9zZXQocGFyc2Vy
LCBjcyk7CgogIGVzLmluc2VydChzdGQ6Om1ha2VfcGFpcihvbGRfcmV2LCBzdGQ6Om1ha2VfcGFp
cihvbGRfbWFuLCBjcykpKTsKfQoKCnZvaWQgCnBhcnNlX3JldmlzaW9uKGJhc2ljX2lvOjpwYXJz
ZXIgJiBwYXJzZXIsCiAgICAgICAgICAgICAgIHJldmlzaW9uX3NldCAmIHJldikKewogIHJldi5l
ZGdlcy5jbGVhcigpOwogIHN0ZDo6c3RyaW5nIHRtcDsKICBwYXJzZXIuZXN5bShzeW1zOjpuZXdf
bWFuaWZlc3QpOwogIHBhcnNlci5oZXgodG1wKTsKICByZXYubmV3X21hbmlmZXN0ID0gbWFuaWZl
c3RfaWQodG1wKTsKICB3aGlsZSAocGFyc2VyLnN5bXAoc3ltczo6b2xkX3JldmlzaW9uKSkKICAg
IHBhcnNlX2VkZ2UocGFyc2VyLCByZXYuZWRnZXMpOwp9Cgp2b2lkIApyZWFkX3JldmlzaW9uX3Nl
dChkYXRhIGNvbnN0ICYgZGF0LAogICAgICAgICAgICAgICAgICByZXZpc2lvbl9zZXQgJiByZXYp
CnsKICBzdGQ6OmlzdHJpbmdzdHJlYW0gaXNzKGRhdCgpKTsKICBiYXNpY19pbzo6aW5wdXRfc291
cmNlIHNyYyhpc3MsICJyZXZpc2lvbiIpOwogIGJhc2ljX2lvOjp0b2tlbml6ZXIgdG9rKHNyYyk7
CiAgYmFzaWNfaW86OnBhcnNlciBwYXJzKHRvayk7CiAgcGFyc2VfcmV2aXNpb24ocGFycywgcmV2
KTsKfQoKdm9pZCAKcmVhZF9yZXZpc2lvbl9zZXQocmV2aXNpb25fZGF0YSBjb25zdCAmIGRhdCwK
ICAgICAgICAgICAgICAgICAgcmV2aXNpb25fc2V0ICYgcmV2KQp7CiAgZGF0YSB1bnBhY2tlZDsK
ICB1bnBhY2soZGF0LmlubmVyKCksIHVucGFja2VkKTsKICByZWFkX3JldmlzaW9uX3NldCh1bnBh
Y2tlZCwgcmV2KTsKfQoKdm9pZAp3cml0ZV9yZXZpc2lvbl9zZXQocmV2aXNpb25fc2V0IGNvbnN0
ICYgcmV2LAogICAgICAgICAgICAgICAgICAgZGF0YSAmIGRhdCkKewogIHN0ZDo6b3N0cmluZ3N0
cmVhbSBvc3M7CiAgYmFzaWNfaW86OnByaW50ZXIgcHIob3NzKTsKICBwcmludF9yZXZpc2lvbihw
ciwgcmV2KTsKICBkYXQgPSBkYXRhKG9zcy5zdHIoKSk7Cn0KCnZvaWQKd3JpdGVfcmV2aXNpb25f
c2V0KHJldmlzaW9uX3NldCBjb25zdCAmIHJldiwKICAgICAgICAgICAgICAgICAgIHJldmlzaW9u
X2RhdGEgJiBkYXQpCnsKICBkYXRhIGQ7CiAgd3JpdGVfcmV2aXNpb25fc2V0KHJldiwgZCk7CiAg
YmFzZTY0PCBnemlwPGRhdGE+ID4gcGFja2VkOwogIHBhY2soZCwgcGFja2VkKTsKICBkYXQgPSBy
ZXZpc2lvbl9kYXRhKHBhY2tlZCk7Cn0KCiNpZmRlZiBCVUlMRF9VTklUX1RFU1RTCiNpbmNsdWRl
ICJ1bml0X3Rlc3RzLmhoIgojaW5jbHVkZSAic2FuaXR5LmhoIgoKc3RhdGljIHZvaWQgCnJldmlz
aW9uX3Rlc3QoKQp7Cn0KCnZvaWQgCmFkZF9yZXZpc2lvbl90ZXN0cyh0ZXN0X3N1aXRlICogc3Vp
dGUpCnsKICBJKHN1aXRlKTsKICBzdWl0ZS0+YWRkKEJPT1NUX1RFU1RfQ0FTRSgmcmV2aXNpb25f
dGVzdCkpOwp9CgoKI2VuZGlmIC8vIEJVSUxEX1VOSVRfVEVTVFMK
_ATEOF


cat >left.b64 <<'_ATEOF'
Ly8gY29weXJpZ2h0IChDKSAyMDA0IGdyYXlkb24gaG9hcmUgPGdyYXlkb25AcG9ib3guY29tPgov
LyBhbGwgcmlnaHRzIHJlc2VydmVkLgovLyBsaWNlbnNlZCB0byB0aGUgcHVibGljIHVuZGVyIHRo
ZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCAoPj0gMikKLy8gc2VlIHRoZSBmaWxlIENPUFlJTkcgZm9y
IGRldGFpbHMKCiNpbmNsdWRlIDxjY3R5cGU+CiNpbmNsdWRlIDxjc3RkbGliPgojaW5jbHVkZSA8
aW9zdHJlYW0+CiNpbmNsdWRlIDxtYXA+CiNpbmNsdWRlIDxzZXQ+CiNpbmNsdWRlIDxzc3RyZWFt
PgojaW5jbHVkZSA8c3RyaW5nPgoKI2luY2x1ZGUgPGJvb3N0L2xleGljYWxfY2FzdC5ocHA+CiNp
bmNsdWRlIDxib29zdC9keW5hbWljX2JpdHNldC5ocHA+CiNpbmNsdWRlIDxib29zdC9zaGFyZWRf
cHRyLmhwcD4KCiNpbmNsdWRlICJiYXNpY19pby5oaCIKI2luY2x1ZGUgImNoYW5nZV9zZXQuaGgi
CiNpbmNsdWRlICJjb25zdGFudHMuaGgiCiNpbmNsdWRlICJyZXZpc2lvbi5oaCIKI2luY2x1ZGUg
InNhbml0eS5oaCIKI2luY2x1ZGUgInRyYW5zZm9ybXMuaGgiCiNpbmNsdWRlICJ2b2NhYi5oaCIK
CgovLyBjYWxjdWxhdGluZyBsZWFzdCBjb21tb24gYW5jZXN0b3JzIGlzIGEgZGVsaWNhdGUgdGhp
bmcuCi8vIAovLyBpdCB0dXJucyBvdXQgdGhhdCB3ZSBjYW5ub3QgY2hvb3NlIHRoZSBzaW1wbGUg
ImxlYXN0IGNvbW1vbiBhbmNlc3RvciIKLy8gZm9yIHB1cnBvc2VzIG9mIGEgbWVyZ2UsIGJlY2F1
c2UgaXQgaXMgcG9zc2libGUgdGhhdCB0aGVyZSBhcmUgdHdvCi8vIGVxdWFsbHkgcmVhY2hhYmxl
IGNvbW1vbiBhbmNlc3RvcnMsIGFuZCB0aGlzIHByb2R1Y2VzIGFtYmlndWl0eSBpbiB0aGUKLy8g
bWVyZ2UuIHRoZSByZXN1bHQgLS0gaW4gYSBwYXRob2xvZ2ljYWwgY2FzZSAtLSBpcyBzaWxlbnRs
eSBhY2NlcHRpbmcgb25lCi8vIHNldCBvZiBlZGl0cyB3aGlsZSBkaXNjYXJkaW5nIGFub3RoZXI7
IG5vdCBleGFjdGx5IHdoYXQgeW91IHdhbnQgYQovLyB2ZXJzaW9uIGNvbnRyb2wgdG9vbCB0byBk
by4KLy8KLy8gYSBjb25zZXJ2YXRpdmUgYXBwcm94aW1hdGlvbiBpcyB3aGF0IHdlJ2xsIGNhbGwg
YSAic3ViZ3JhcGggcmVjdXJyaW5nIgovLyBMQ0EgYWxnb3JpdGhtLiB0aGlzIGlzIHNvbWV3aGF0
IGxpa2UgbG9jYXRpbmcgdGhlIGxlYXN0IGNvbW1vbiBkb21pbmF0b3IKLy8gbm9kZSwgYnV0IG5v
dCBxdWl0ZS4gaXQgaXMgYWN0dWFsbHkganVzdCBhIHZhbmlsbGEgTENBIHNlYXJjaCwgZXhjZXB0
Ci8vIHRoYXQgYW55IHRpbWUgdGhlcmUncyBhIGZvcmsgKGEgaGlzdG9yaWNhbCBtZXJnZSBsb29r
cyBsaWtlIGEgZm9yayBmcm9tCi8vIG91ciBwZXJzcGVjdGl2ZSwgd29ya2luZyBiYWNrd2FyZHMg
ZnJvbSBjaGlsZHJlbiB0byBwYXJlbnRzKSBpdCByZWR1Y2VzCi8vIHRoZSBmb3JrIHRvIGEgY29t
bW9uIHBhcmVudCB2aWEgYSBzZXF1ZW5jZSBvZiBwYWlyd2lzZSByZWN1cnNpdmUgY2FsbHMKLy8g
dG8gaXRzZWxmIGJlZm9yZSBwcm9jZWVkaW5nLiB0aGlzIHdpbGwgYWx3YXlzIHJlc29sdmUgdG8g
YSBjb21tb24gcGFyZW50Ci8vIHdpdGggbm8gYW1iaWd1aXR5LCB1bmxlc3MgaXQgZmFsbHMgb2Zm
IHRoZSByb290IG9mIHRoZSBncmFwaC4KLy8KLy8gdW5mb3J0dW5hdGVseSB0aGUgc3ViZ3JhcGgg
cmVjdXJyaW5nIGFsZ29yaXRobSBzb21ldGltZXMgZ29lcyB0b28gZmFyCi8vIGJhY2sgaW4gaGlz
dG9yeSAtLSBmb3IgZXhhbXBsZSBpZiB0aGVyZSBpcyBhbiB1bmFtYmlndW91cyBwcm9wYWdhdGUg
ZnJvbQovLyBvbmUgYnJhbmNoIHRvIGFub3RoZXIsIHRoZSBlbnRpcmUgc3ViZ3JhcGggcHJlY2Vl
ZGluZyB0aGUgcHJvcGFnYXRlIG9uCi8vIHRoZSByZWNpcGllbnQgYnJhbmNoIGlzIGVsaWRlZCwg
c2luY2UgaXQgaXMgYSBtZXJnZS4KLy8KLy8gb3VyIGN1cnJlbnQgaHlwb3RoZXNpcyBpcyB0aGF0
IHRoZSAqZXhhY3QqIGNvbmRpdGlvbiB3ZSdyZSBsb29raW5nIGZvciwKLy8gd2hlbiBkb2luZyBh
IG1lcmdlLCBpcyB0aGUgbGVhc3Qgbm9kZSB3aGljaCBkb21pbmF0ZXMgb25lIHNpZGUgb2YgdGhl
Ci8vIG1lcmdlIGFuZCBpcyBhbiBhbmNlc3RvciBvZiB0aGUgb3RoZXIuCgp0eXBlZGVmIHVuc2ln
bmVkIGxvbmcgY3R4Owp0eXBlZGVmIGJvb3N0OjpkeW5hbWljX2JpdHNldDw+IGJpdG1hcDsKdHlw
ZWRlZiBib29zdDo6c2hhcmVkX3B0cjxiaXRtYXA+IHNoYXJlZF9iaXRtYXA7CgpzdGF0aWMgdm9p
ZCAKZW5zdXJlX3BhcmVudHNfbG9hZGVkKGN0eCBjaGlsZCwKICAgICAgICAgICAgICAgICAgICAg
IHN0ZDo6bWFwPGN0eCwgc2hhcmVkX2JpdG1hcD4gJiBwYXJlbnRzLAogICAgICAgICAgICAgICAg
ICAgICAgaW50ZXJuZXI8Y3R4PiAmIGludGVybiwKICAgICAgICAgICAgICAgICAgICAgIGFwcF9z
dGF0ZSAmIGFwcCkKewogIGlmIChwYXJlbnRzLmZpbmQoY2hpbGQpICE9IHBhcmVudHMuZW5kKCkp
CiAgICByZXR1cm47CgogIEwoRigibG9hZGluZyBwYXJlbnRzIGZvciBub2RlICVkXG4iKSAlIGNo
aWxkKTsKCiAgc3RkOjpzZXQ8cmV2aXNpb25faWQ+IGltbV9wYXJlbnRzOwogIGFwcC5kYi5nZXRf
cmV2aXNpb25fcGFyZW50cyhyZXZpc2lvbl9pZChpbnRlcm4ubG9va3VwKGNoaWxkKSksIGltbV9w
YXJlbnRzKTsKCiAgLy8gVGhlIG51bGwgcmV2aXNpb24gaXMgbm90IGEgcGFyZW50IGZvciBwdXJw
b3NlcyBvZiBmaW5kaW5nIGNvbW1vbgogIC8vIGFuY2VzdG9ycy4KICBmb3IgKHN0ZDo6c2V0PHJl
dmlzaW9uX2lkPjo6aXRlcmF0b3IgcCA9IGltbV9wYXJlbnRzLmJlZ2luKCk7CiAgICAgICBwICE9
IGltbV9wYXJlbnRzLmVuZCgpOyArK3ApCiAgICB7CiAgICAgIGlmIChudWxsX2lkKCpwKSkKICAg
ICAgICBpbW1fcGFyZW50cy5lcmFzZShwKTsKICAgIH0KICAgICAgICAgICAgICAKICBzaGFyZWRf
Yml0bWFwIGJpdHMgPSBzaGFyZWRfYml0bWFwKG5ldyBiaXRtYXAocGFyZW50cy5zaXplKCkpKTsK
ICAKICBmb3IgKHN0ZDo6c2V0PHJldmlzaW9uX2lkPjo6Y29uc3RfaXRlcmF0b3IgcCA9IGltbV9w
YXJlbnRzLmJlZ2luKCk7CiAgICAgICBwICE9IGltbV9wYXJlbnRzLmVuZCgpOyArK3ApCiAgICB7
CiAgICAgIGN0eCBwbiA9IGludGVybi5pbnRlcm4ocC0+aW5uZXIoKSgpKTsKICAgICAgTChGKCJw
YXJlbnQgJXMgLT4gbm9kZSAlZFxuIikgJSAqcCAlIHBuKTsKICAgICAgaWYgKHBuID49IGJpdHMt
PnNpemUoKSkgCiAgICAgICAgYml0cy0+cmVzaXplKHBuKzEpOwogICAgICBiaXRzLT5zZXQocG4p
OwogICAgfQogICAgCiAgcGFyZW50cy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY2hpbGQsIGJpdHMp
KTsKfQoKc3RhdGljIGJvb2wgCmV4cGFuZF9kb21pbmF0b3JzKHN0ZDo6bWFwPGN0eCwgc2hhcmVk
X2JpdG1hcD4gJiBwYXJlbnRzLAogICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxjdHgsIHNoYXJl
ZF9iaXRtYXA+ICYgZG9taW5hdG9ycywKICAgICAgICAgICAgICAgICAgaW50ZXJuZXI8Y3R4PiAm
IGludGVybiwKICAgICAgICAgICAgICAgICAgYXBwX3N0YXRlICYgYXBwKQp7CiAgYm9vbCBzb21l
dGhpbmdfY2hhbmdlZCA9IGZhbHNlOwogIHN0ZDo6dmVjdG9yPGN0eD4gbm9kZXM7CgogIG5vZGVz
LnJlc2VydmUoZG9taW5hdG9ycy5zaXplKCkpOwoKICAvLyBwYXNzIDEsIHB1bGwgb3V0IGFsbCB0
aGUgbm9kZSBudW1iZXJzIHdlJ3JlIGdvaW5nIHRvIHNjYW4gdGhpcyB0aW1lIGFyb3VuZAogIGZv
ciAoc3RkOjptYXA8Y3R4LCBzaGFyZWRfYml0bWFwPjo6Y29uc3RfaXRlcmF0b3IgZSA9IGRvbWlu
YXRvcnMuYmVnaW4oKTsgCiAgICAgICBlICE9IGRvbWluYXRvcnMuZW5kKCk7ICsrZSkKICAgIG5v
ZGVzLnB1c2hfYmFjayhlLT5maXJzdCk7CiAgCiAgLy8gcGFzcyAyLCB1cGRhdGUgYW55IG9mIHRo
ZSBkb21pbmF0b3IgZW50cmllcyB3ZSBjYW4KICBmb3IgKHN0ZDo6dmVjdG9yPGN0eD46OmNvbnN0
X2l0ZXJhdG9yIG4gPSBub2Rlcy5iZWdpbigpOyAKICAgICAgIG4gIT0gbm9kZXMuZW5kKCk7ICsr
bikKICAgIHsKICAgICAgc2hhcmVkX2JpdG1hcCBiaXRzID0gZG9taW5hdG9yc1sqbl07CiAgICAg
IGJpdG1hcCBzYXZlZCgqYml0cyk7CiAgICAgIGlmIChiaXRzLT5zaXplKCkgPD0gKm4pCiAgICAg
ICAgYml0cy0+cmVzaXplKCpuICsgMSk7CiAgICAgIGJpdHMtPnNldCgqbik7CiAgICAgIAogICAg
ICBlbnN1cmVfcGFyZW50c19sb2FkZWQoKm4sIHBhcmVudHMsIGludGVybiwgYXBwKTsKICAgICAg
c2hhcmVkX2JpdG1hcCBuX3BhcmVudHMgPSBwYXJlbnRzWypuXTsKICAgICAgCiAgICAgIGJpdG1h
cCBpbnRlcnNlY3Rpb24oYml0cy0+c2l6ZSgpKTsKICAgICAgCiAgICAgIGJvb2wgZmlyc3QgPSB0
cnVlOwogICAgICBmb3IgKHVuc2lnbmVkIGxvbmcgcGFyZW50ID0gMDsgCiAgICAgICAgICAgcGFy
ZW50ICE9IG5fcGFyZW50cy0+c2l6ZSgpOyArK3BhcmVudCkKICAgICAgICB7CiAgICAgICAgICBp
ZiAoISBuX3BhcmVudHMtPnRlc3QocGFyZW50KSkKICAgICAgICAgICAgY29udGludWU7CgogICAg
ICAgICAgaWYgKGRvbWluYXRvcnMuZmluZChwYXJlbnQpID09IGRvbWluYXRvcnMuZW5kKCkpCiAg
ICAgICAgICAgIGRvbWluYXRvcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHBhcmVudCwgCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9iaXRtYXAobmV3
IGJpdG1hcCgpKSkpOwogICAgICAgICAgc2hhcmVkX2JpdG1hcCBwYml0cyA9IGRvbWluYXRvcnNb
cGFyZW50XTsKCiAgICAgICAgICBpZiAoYml0cy0+c2l6ZSgpID4gcGJpdHMtPnNpemUoKSkKICAg
ICAgICAgICAgcGJpdHMtPnJlc2l6ZShiaXRzLT5zaXplKCkpOwoKICAgICAgICAgIGlmIChwYml0
cy0+c2l6ZSgpID4gYml0cy0+c2l6ZSgpKQogICAgICAgICAgICBiaXRzLT5yZXNpemUocGJpdHMt
PnNpemUoKSk7CgogICAgICAgICAgaWYgKGZpcnN0KQogICAgICAgICAgICB7CiAgICAgICAgICAg
ICAgaW50ZXJzZWN0aW9uID0gKCpwYml0cyk7CiAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsK
ICAgICAgICAgICAgfQogICAgICAgICAgZWxzZQogICAgICAgICAgICBpbnRlcnNlY3Rpb24gJj0g
KCpwYml0cyk7CiAgICAgICAgfQoKICAgICAgKCpiaXRzKSB8PSBpbnRlcnNlY3Rpb247CiAgICAg
IGlmICgqYml0cyAhPSBzYXZlZCkKICAgICAgICBzb21ldGhpbmdfY2hhbmdlZCA9IHRydWU7CiAg
ICB9CiAgcmV0dXJuIHNvbWV0aGluZ19jaGFuZ2VkOwp9CgoKc3RhdGljIGJvb2wgCmV4cGFuZF9h
bmNlc3RvcnMoc3RkOjptYXA8Y3R4LCBzaGFyZWRfYml0bWFwPiAmIHBhcmVudHMsCiAgICAgICAg
ICAgICAgICAgc3RkOjptYXA8Y3R4LCBzaGFyZWRfYml0bWFwPiAmIGFuY2VzdG9ycywKICAgICAg
ICAgICAgICAgICBpbnRlcm5lcjxjdHg+ICYgaW50ZXJuLAogICAgICAgICAgICAgICAgIGFwcF9z
dGF0ZSAmIGFwcCkKewogIGJvb2wgc29tZXRoaW5nX2NoYW5nZWQgPSBmYWxzZTsKICBzdGQ6OnZl
Y3RvcjxjdHg+IG5vZGVzOwoKICBub2Rlcy5yZXNlcnZlKGFuY2VzdG9ycy5zaXplKCkpOwoKICAv
LyBwYXNzIDEsIHB1bGwgb3V0IGFsbCB0aGUgbm9kZSBudW1iZXJzIHdlJ3JlIGdvaW5nIHRvIHNj
YW4gdGhpcyB0aW1lIGFyb3VuZAogIGZvciAoc3RkOjptYXA8Y3R4LCBzaGFyZWRfYml0bWFwPjo6
Y29uc3RfaXRlcmF0b3IgZSA9IGFuY2VzdG9ycy5iZWdpbigpOyAKICAgICAgIGUgIT0gYW5jZXN0
b3JzLmVuZCgpOyArK2UpCiAgICBub2Rlcy5wdXNoX2JhY2soZS0+Zmlyc3QpOwogIAogIC8vIHBh
c3MgMiwgdXBkYXRlIGFueSBvZiB0aGUgYW5jZXN0b3IgZW50cmllcyB3ZSBjYW4KICBmb3IgKHN0
ZDo6dmVjdG9yPGN0eD46OmNvbnN0X2l0ZXJhdG9yIG4gPSBub2Rlcy5iZWdpbigpOyBuICE9IG5v
ZGVzLmVuZCgpOyArK24pCiAgICB7CiAgICAgIHNoYXJlZF9iaXRtYXAgYml0cyA9IGFuY2VzdG9y
c1sqbl07CiAgICAgIGJpdG1hcCBzYXZlZCgqYml0cyk7CiAgICAgIGlmIChiaXRzLT5zaXplKCkg
PD0gKm4pCiAgICAgICAgYml0cy0+cmVzaXplKCpuICsgMSk7CiAgICAgIGJpdHMtPnNldCgqbik7
CgogICAgICBlbnN1cmVfcGFyZW50c19sb2FkZWQoKm4sIHBhcmVudHMsIGludGVybiwgYXBwKTsK
ICAgICAgc2hhcmVkX2JpdG1hcCBuX3BhcmVudHMgPSBwYXJlbnRzWypuXTsKICAgICAgZm9yIChj
dHggcGFyZW50ID0gMDsgcGFyZW50ICE9IG5fcGFyZW50cy0+c2l6ZSgpOyArK3BhcmVudCkKICAg
ICAgICB7CiAgICAgICAgICBpZiAoISBuX3BhcmVudHMtPnRlc3QocGFyZW50KSkKICAgICAgICAg
ICAgY29udGludWU7CgogICAgICAgICAgaWYgKGJpdHMtPnNpemUoKSA8PSBwYXJlbnQpCiAgICAg
ICAgICAgIGJpdHMtPnJlc2l6ZShwYXJlbnQgKyAxKTsKICAgICAgICAgIGJpdHMtPnNldChwYXJl
bnQpOwoKICAgICAgICAgIGlmIChhbmNlc3RvcnMuZmluZChwYXJlbnQpID09IGFuY2VzdG9ycy5l
bmQoKSkKICAgICAgICAgICAgYW5jZXN0b3JzLmluc2VydChtYWtlX3BhaXIocGFyZW50LCAKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9iaXRtYXAobmV3IGJp
dG1hcCgpKSkpOwogICAgICAgICAgc2hhcmVkX2JpdG1hcCBwYml0cyA9IGFuY2VzdG9yc1twYXJl
bnRdOwoKICAgICAgICAgIGlmIChiaXRzLT5zaXplKCkgPiBwYml0cy0+c2l6ZSgpKQogICAgICAg
ICAgICBwYml0cy0+cmVzaXplKGJpdHMtPnNpemUoKSk7CgogICAgICAgICAgaWYgKHBiaXRzLT5z
aXplKCkgPiBiaXRzLT5zaXplKCkpCiAgICAgICAgICAgIGJpdHMtPnJlc2l6ZShwYml0cy0+c2l6
ZSgpKTsKCiAgICAgICAgICAoKmJpdHMpIHw9ICgqcGJpdHMpOwogICAgICAgIH0KICAgICAgaWYg
KCpiaXRzICE9IHNhdmVkKQogICAgICAgIHNvbWV0aGluZ19jaGFuZ2VkID0gdHJ1ZTsKICAgIH0K
ICByZXR1cm4gc29tZXRoaW5nX2NoYW5nZWQ7Cn0KCnN0YXRpYyBib29sIApmaW5kX2ludGVyc2Vj
dGluZ19ub2RlKGJpdG1hcCAmIGZzdCwgCiAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwICYg
c25kLCAKICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5lcjxjdHg+IGNvbnN0ICYgaW50ZXJu
LCAKICAgICAgICAgICAgICAgICAgICAgICByZXZpc2lvbl9pZCAmIGFuYykKewogIAogIGlmIChm
c3Quc2l6ZSgpID4gc25kLnNpemUoKSkKICAgIHNuZC5yZXNpemUoZnN0LnNpemUoKSk7CiAgZWxz
ZSBpZiAoc25kLnNpemUoKSA+IGZzdC5zaXplKCkpCiAgICBmc3QucmVzaXplKHNuZC5zaXplKCkp
OwogIAogIGJpdG1hcCBpbnRlcnNlY3Rpb24gPSBmc3QgJiBzbmQ7CiAgaWYgKGludGVyc2VjdGlv
bi5hbnkoKSkKICAgIHsKICAgICAgTChGKCJmb3VuZCAlZCBpbnRlcnNlY3Rpbmcgbm9kZXNcbiIp
ICUgaW50ZXJzZWN0aW9uLmNvdW50KCkpOwogICAgICBmb3IgKGN0eCBpID0gMDsgaSA8IGludGVy
c2VjdGlvbi5zaXplKCk7ICsraSkKICAgICAgICB7CiAgICAgICAgICBpZiAoaW50ZXJzZWN0aW9u
LnRlc3QoaSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBhbmMgPSByZXZpc2lvbl9pZChp
bnRlcm4ubG9va3VwKGkpKTsKICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAg
fQogICAgICAgIH0KICAgIH0KICByZXR1cm4gZmFsc2U7Cn0KCi8vICBzdGF0aWMgdm9pZAovLyAg
ZHVtcF9iaXRzZXRfbWFwKHN0cmluZyBjb25zdCAmIGhkciwKLy8gICAgICAgICAgICAgIHN0ZDo6
bWFwPCBjdHgsIHNoYXJlZF9iaXRtYXAgPiBjb25zdCAmIG1tKQovLyAgewovLyAgICBMKEYoImR1
bXBpbmcgWyVzXSAoJWQgZW50cmllcylcbiIpICUgaGRyICUgbW0uc2l6ZSgpKTsKLy8gICAgZm9y
IChzdGQ6Om1hcDwgY3R4LCBzaGFyZWRfYml0bWFwID46OmNvbnN0X2l0ZXJhdG9yIGkgPSBtbS5i
ZWdpbigpOwovLyAgICAgICAgIGkgIT0gbW0uZW5kKCk7ICsraSkKLy8gICAgICB7Ci8vICAgICAg
ICBMKEYoImR1bXAgWyVzXTogJWQgLT4gJXNcbiIpICUgaGRyICUgaS0+Zmlyc3QgJSAoKihpLT5z
ZWNvbmQpKSk7Ci8vICAgICAgfQovLyAgfQoKYm9vbCAKZmluZF9jb21tb25fYW5jZXN0b3IocmV2
aXNpb25faWQgY29uc3QgJiBsZWZ0LAogICAgICAgICAgICAgICAgICAgICByZXZpc2lvbl9pZCBj
b25zdCAmIHJpZ2h0LAogICAgICAgICAgICAgICAgICAgICByZXZpc2lvbl9pZCAmIGFuYywKICAg
ICAgICAgICAgICAgICAgICAgYXBwX3N0YXRlICYgYXBwKQp7CiAgaW50ZXJuZXI8Y3R4PiBpbnRl
cm47CiAgc3RkOjptYXA8IGN0eCwgc2hhcmVkX2JpdG1hcCA+IAogICAgcGFyZW50cywgYW5jZXN0
b3JzLCBkb21pbmF0b3JzOwogIAogIGN0eCBsbiA9IGludGVybi5pbnRlcm4obGVmdC5pbm5lcigp
KCkpOwogIGN0eCBybiA9IGludGVybi5pbnRlcm4ocmlnaHQuaW5uZXIoKSgpKTsKICAKICBzaGFy
ZWRfYml0bWFwIGxhbmMgPSBzaGFyZWRfYml0bWFwKG5ldyBiaXRtYXAoKSk7CiAgc2hhcmVkX2Jp
dG1hcCByYW5jID0gc2hhcmVkX2JpdG1hcChuZXcgYml0bWFwKCkpOwogIHNoYXJlZF9iaXRtYXAg
bGRvbSA9IHNoYXJlZF9iaXRtYXAobmV3IGJpdG1hcCgpKTsKICBzaGFyZWRfYml0bWFwIHJkb20g
PSBzaGFyZWRfYml0bWFwKG5ldyBiaXRtYXAoKSk7CgogIGFuY2VzdG9ycy5pbnNlcnQobWFrZV9w
YWlyKGxuLCBsYW5jKSk7CiAgYW5jZXN0b3JzLmluc2VydChtYWtlX3BhaXIocm4sIHJhbmMpKTsK
ICBkb21pbmF0b3JzLmluc2VydChtYWtlX3BhaXIobG4sIGxkb20pKTsKICBkb21pbmF0b3JzLmlu
c2VydChtYWtlX3BhaXIocm4sIHJkb20pKTsKICAKICBMKEYoInNlYXJjaGluZyBmb3IgY29tbW9u
IGFuY2VzdG9yLCBsZWZ0PSVzIHJpZ2h0PSVzXG4iKSAlIGxlZnQgJSByaWdodCk7CiAgCiAgd2hp
bGUgKGV4cGFuZF9hbmNlc3RvcnMocGFyZW50cywgYW5jZXN0b3JzLCBpbnRlcm4sIGFwcCkgfHwK
ICAgICAgICAgZXhwYW5kX2RvbWluYXRvcnMocGFyZW50cywgZG9taW5hdG9ycywgaW50ZXJuLCBh
cHApKQogICAgewogICAgICBMKEYoImNvbW1vbiBhbmNlc3RvciBzY2FuIFtwYXI9JWQsYW5jPSVk
LGRvbT0lZF1cbiIpICUgCiAgICAgICAgcGFyZW50cy5zaXplKCkgJSBhbmNlc3RvcnMuc2l6ZSgp
ICUgZG9taW5hdG9ycy5zaXplKCkpOwoKICAgICAgaWYgKGZpbmRfaW50ZXJzZWN0aW5nX25vZGUo
KmxhbmMsICpyZG9tLCBpbnRlcm4sIGFuYykpCiAgICAgICAgewogICAgICAgICAgTChGKCJmb3Vu
ZCBub2RlICVkLCBhbmNlc3RvciBvZiBsZWZ0ICVzIGFuZCBkb21pbmF0aW5nIHJpZ2h0ICVzXG4i
KQogICAgICAgICAgICAlIGFuYyAlIGxlZnQgJSByaWdodCk7CiAgICAgICAgICByZXR1cm4gdHJ1
ZTsKICAgICAgICB9CiAgICAgIAogICAgICBlbHNlIGlmIChmaW5kX2ludGVyc2VjdGluZ19ub2Rl
KCpyYW5jLCAqbGRvbSwgaW50ZXJuLCBhbmMpKQogICAgICAgIHsKICAgICAgICAgIEwoRigiZm91
bmQgbm9kZSAlZCwgYW5jZXN0b3Igb2YgcmlnaHQgJXMgYW5kIGRvbWluYXRpbmcgbGVmdCAlc1xu
IikKICAgICAgICAgICAgJSBhbmMgJSByaWdodCAlIGxlZnQpOwogICAgICAgICAgcmV0dXJuIHRy
dWU7CiAgICAgICAgfQogICAgfQovLyAgICAgIGR1bXBfYml0c2V0X21hcCgiYW5jZXN0b3JzIiwg
YW5jZXN0b3JzKTsKLy8gICAgICBkdW1wX2JpdHNldF9tYXAoImRvbWluYXRvcnMiLCBkb21pbmF0
b3JzKTsKLy8gICAgICBkdW1wX2JpdHNldF9tYXAoInBhcmVudHMiLCBwYXJlbnRzKTsKICByZXR1
cm4gZmFsc2U7Cn0KCgovLyAKLy8gVGhlIGlkZWEgd2l0aCB0aGlzIGFsZ29yaXRobSBpcyB0byB3
YWxrIGZyb20gY2hpbGQgdXAgdG8gYW5jZXN0b3IsCi8vIHJlY3Vyc2l2ZWx5LCBhY2N1bXVsYXRp
bmcgYWxsIHRoZSBjaGFuZ2Vfc2V0cyBhc3NvY2lhdGVkIHdpdGgKLy8gaW50ZXJtZWRpYXRlIG5v
ZGVzIGludG8gKm9uZSBiaWcgY2hhbmdlX3NldCouCi8vCi8vIGNsZXZlciByZWFkZXJzIHdpbGwg
cmVhbGl6ZSB0aGlzIGlzIGFuIG92ZXJsYXBwaW5nLXN1YnByb2JsZW0gdHlwZQovLyBzaXR1YXRp
b24gYW5kIHRodXMgbmVlZHMgdG8ga2VlcCBhIGR5bmFtaWMgcHJvZ3JhbW1pbmcgbWFwIHRvIGtl
ZXAKLy8gaXRzZWxmIGluIGxpbmVhciBjb21wbGV4aXR5LgovLwovLyBpbiBmYWN0LCB3ZSBrZWVw
IHR3bzogb25lIHdoaWNoIG1hcHMgdG8gY29tcHV0ZWQgcmVzdWx0cyAocGFydGlhbF9jc2V0cykK
Ly8gYW5kIG9uZSB3aGljaCBqdXN0IGtlZXBzIGEgc2V0IG9mIGFsbCBub2RlcyB3ZSB0cmF2ZXJz
ZWQKLy8gKHZpc2l0ZWRfbm9kZXMpLiBpbiB0aGVvcnkgaXQgY291bGQgYmUgb25lIG1hcCB3aXRo
IGFuIGV4dHJhIGJvb2wgc3R1Y2sKLy8gb24gZWFjaCBlbnRyeSwgYnV0IEkgdGhpbmsgdGhhdCB3
b3VsZCBtYWtlIGl0IGV2ZW4gbGVzcyByZWFkYWJsZS4gaXQncwovLyBhbHJlYWR5IHF1aXRlIHVn
bHkuCi8vCgpzdGF0aWMgYm9vbCAKY2FsY3VsYXRlX2NoYW5nZV9zZXRzX3JlY3Vyc2l2ZShyZXZp
c2lvbl9pZCBjb25zdCAmIGFuY2VzdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHJldmlzaW9uX2lkIGNvbnN0ICYgY2hpbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgYXBwX3N0YXRlICYgYXBwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5n
ZV9zZXQgJiBjdW11bGF0aXZlX2NzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
c3RkOjptYXA8cmV2aXNpb25faWQsIGJvb3N0OjpzaGFyZWRfcHRyPGNoYW5nZV9zZXQ+ID4gJiBw
YXJ0aWFsX2NzZXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PHJl
dmlzaW9uX2lkPiAmIHZpc2l0ZWRfbm9kZXMpCnsKCiAgaWYgKGFuY2VzdG9yID09IGNoaWxkKQog
ICAgcmV0dXJuIHRydWU7CgogIHZpc2l0ZWRfbm9kZXMuaW5zZXJ0KGNoaWxkKTsKCiAgYm9vbCBy
ZWxldmFudF9jaGlsZCA9IGZhbHNlOwoKICByZXZpc2lvbl9zZXQgcmV2OwogIGFwcC5kYi5nZXRf
cmV2aXNpb24oY2hpbGQsIHJldik7CgogIEwoRigiZXhwbG9yaW5nIGNoYW5nZXNldHMgZnJvbSBw
YXJlbnRzIG9mICVzLCBzZWVraW5nIHRvd2FyZHMgJXNcbiIpIAogICAgJSBjaGlsZCAlIGFuY2Vz
dG9yKTsKCiAgZm9yKGVkZ2VfbWFwOjpjb25zdF9pdGVyYXRvciBpID0gcmV2LmVkZ2VzLmJlZ2lu
KCk7IGkgIT0gcmV2LmVkZ2VzLmVuZCgpOyArK2kpCiAgICB7CiAgICAgIGJvb2wgcmVsZXZhbnRf
cGFyZW50ID0gZmFsc2U7CiAgICAgIHJldmlzaW9uX2lkIGN1cnJfcGFyZW50ID0gZWRnZV9vbGRf
cmV2aXNpb24oaSk7CgogICAgICBpZiAoY3Vycl9wYXJlbnQuaW5uZXIoKSgpLmVtcHR5KCkpCiAg
ICAgICAgY29udGludWU7CgogICAgICBjaGFuZ2Vfc2V0IGNzZXRfdG9fY3Vycl9wYXJlbnQ7Cgog
ICAgICBMKEYoImNvbnNpZGVyaW5nIHBhcmVudCAlcyBvZiAlc1xuIikgJSBjdXJyX3BhcmVudCAl
IGNoaWxkKTsKCiAgICAgIHN0ZDo6bWFwPHJldmlzaW9uX2lkLCBib29zdDo6c2hhcmVkX3B0cjxj
aGFuZ2Vfc2V0PiA+Ojpjb25zdF9pdGVyYXRvciBqID0gCiAgICAgICAgcGFydGlhbF9jc2V0cy5m
aW5kKGN1cnJfcGFyZW50KTsKICAgICAgaWYgKGogIT0gcGFydGlhbF9jc2V0cy5lbmQoKSkgCiAg
ICAgICAgewogICAgICAgICAgLy8gYSByZWN1cnNpdmUgY2FsbCBoYXMgdHJhdmVyc2VkIHRoaXMg
cGFyZW50IGJlZm9yZSBhbmQgYnVpbHQgYW4KICAgICAgICAgIC8vIGV4aXN0aW5nIGNzZXQuIGp1
c3QgcmV1c2UgdGhhdCByYXRoZXIgdGhhbiByZS10cmF2ZXJzaW5nCiAgICAgICAgICBjc2V0X3Rv
X2N1cnJfcGFyZW50ID0gKihqLT5zZWNvbmQpOwogICAgICAgICAgcmVsZXZhbnRfcGFyZW50ID0g
dHJ1ZTsKICAgICAgICB9CiAgICAgIGVsc2UgaWYgKHZpc2l0ZWRfbm9kZXMuZmluZChjdXJyX3Bh
cmVudCkgIT0gdmlzaXRlZF9ub2Rlcy5lbmQoKSkKICAgICAgICB7CiAgICAgICAgICAvLyBhIHJl
Y3Vyc2l2ZSBjYWxsIGhhcyB0cmF2ZXJzZWQgdGhpcyBwYXJlbnQsIGJ1dCB0aGVyZSB3YXMgbm8K
ICAgICAgICAgIC8vIHBhdGggZnJvbSBpdCB0byB0aGUgcm9vdCwgc28gdGhlIHBhcmVudCBpcyBp
cnJlbGV2YW50LiBza2lwLgogICAgICAgICAgcmVsZXZhbnRfcGFyZW50ID0gZmFsc2U7CiAgICAg
ICAgfQogICAgICBlbHNlCiAgICAgICAgcmVsZXZhbnRfcGFyZW50ID0gY2FsY3VsYXRlX2NoYW5n
ZV9zZXRzX3JlY3Vyc2l2ZShhbmNlc3RvciwgY3Vycl9wYXJlbnQsIGFwcCwgCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc2V0X3RvX2N1
cnJfcGFyZW50LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHBhcnRpYWxfY3NldHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXNpdGVkX25vZGVzKTsKCiAgICAgIGlmIChy
ZWxldmFudF9wYXJlbnQpCiAgICAgICAgewogICAgICAgICAgTChGKCJyZXZpc2lvbiAlcyBpcyBy
ZWxldmFudCwgY29tcG9zaW5nIHdpdGggZWRnZSB0byAlc1xuIikgCiAgICAgICAgICAgICUgY3Vy
cl9wYXJlbnQgJSBjaGlsZCk7CiAgICAgICAgICBjb25jYXRlbmF0ZV9jaGFuZ2Vfc2V0cyhjc2V0
X3RvX2N1cnJfcGFyZW50LCBlZGdlX2NoYW5nZXMoaSksIGN1bXVsYXRpdmVfY3NldCk7CiAgICAg
ICAgICByZWxldmFudF9jaGlsZCA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAg
ICAgIGVsc2UKICAgICAgICBMKEYoInBhcmVudCAlcyBvZiAlcyBpcyBub3QgcmVsZXZhbnRcbiIp
ICUgY3Vycl9wYXJlbnQgJSBjaGlsZCk7CiAgICB9CgogIC8vIHN0b3JlIHRoZSBwYXJ0aWFsIGVk
Z2UgZnJvbSBhbmNlc3RvciAtPiBjaGlsZCwgc28gdGhhdCBpZiBhbnlvbmUKICAvLyByZS10cmF2
ZXJzZXMgdGhpcyBlZGdlIHRoZXknbGwganVzdCBmZXRjaCBmcm9tIHRoZSBwYXJ0aWFsX2VkZ2Vz
CiAgLy8gY2FjaGUuCiAgaWYgKHJlbGV2YW50X2NoaWxkKQogICAgcGFydGlhbF9jc2V0cy5pbnNl
cnQoc3RkOjptYWtlX3BhaXIoY2hpbGQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8Y2hhbmdlX3NldD4KICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIChuZXcgY2hhbmdlX3NldChjdW11bGF0aXZlX2NzZXQpKSkp
OwogIAogIHJldHVybiByZWxldmFudF9jaGlsZDsKfQoKdm9pZCAKY2FsY3VsYXRlX2NvbXBvc2l0
ZV9jaGFuZ2Vfc2V0KHJldmlzaW9uX2lkIGNvbnN0ICYgYW5jZXN0b3IsCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICByZXZpc2lvbl9pZCBjb25zdCAmIGNoaWxkLAogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgYXBwX3N0YXRlICYgYXBwLAogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgY2hhbmdlX3NldCAmIGNvbXBvc2VkKQp7CiAgTChGKCJjYWxjdWxhdGluZyBjb21w
b3NpdGUgY2hhbmdlc2V0IGJldHdlZW4gJXMgYW5kICVzXG4iKQogICAgJSBhbmNlc3RvciAlIGNo
aWxkKTsKICBzdGQ6OnNldDxyZXZpc2lvbl9pZD4gdmlzaXRlZDsKICBzdGQ6Om1hcDxyZXZpc2lv
bl9pZCwgYm9vc3Q6OnNoYXJlZF9wdHI8Y2hhbmdlX3NldD4gPiBwYXJ0aWFsOwogIGNhbGN1bGF0
ZV9jaGFuZ2Vfc2V0c19yZWN1cnNpdmUoYW5jZXN0b3IsIGNoaWxkLCBhcHAsIGNvbXBvc2VkLCBw
YXJ0aWFsLCB2aXNpdGVkKTsKfQoKLy8gbWlncmF0aW9uIHN0dWZmCi8vCi8vIEZJWE1FOiB0aGVz
ZSBhcmUgdGVtcG9yYXJ5IGZ1bmN0aW9ucywgb25jZSB3ZSd2ZSBkb25lIHRoZSBtaWdyYXRpb24g
dG8KLy8gcmV2aXNpb25zIC8gY2hhbmdlc2V0cywgd2UgY2FuIHJlbW92ZSB0aGVtLgoKc3RhdGlj
IHZvaWQgCmFuYWx5emVfbWFuaWZlc3RfY2hhbmdlcyhhcHBfc3RhdGUgJiBhcHAsCiAgICAgICAg
ICAgICAgICAgICAgICAgICBtYW5pZmVzdF9pZCBjb25zdCAmIHBhcmVudCwgCiAgICAgICAgICAg
ICAgICAgICAgICAgICBtYW5pZmVzdF9pZCBjb25zdCAmIGNoaWxkLCAKICAgICAgICAgICAgICAg
ICAgICAgICAgIGNoYW5nZV9zZXQgJiBjcykKewogIG1hbmlmZXN0X21hcCBtX3BhcmVudCwgbV9j
aGlsZDsKICBhcHAuZGIuZ2V0X21hbmlmZXN0KHBhcmVudCwgbV9wYXJlbnQpOwogIGFwcC5kYi5n
ZXRfbWFuaWZlc3QoY2hpbGQsIG1fY2hpbGQpOwoKICBmb3IgKG1hbmlmZXN0X21hcDo6Y29uc3Rf
aXRlcmF0b3IgaSA9IG1fcGFyZW50LmJlZ2luKCk7IAogICAgICAgaSAhPSBtX3BhcmVudC5lbmQo
KTsgKytpKQogICAgewogICAgICBtYW5pZmVzdF9tYXA6OmNvbnN0X2l0ZXJhdG9yIGogPSBtX2No
aWxkLmZpbmQobWFuaWZlc3RfZW50cnlfcGF0aChpKSk7CiAgICAgIGlmIChqID09IG1fY2hpbGQu
ZW5kKCkpCiAgICAgICAgY3MuZGVsZXRlX2ZpbGUobWFuaWZlc3RfZW50cnlfcGF0aChpKSk7CiAg
ICAgIGVsc2UgaWYgKCEgKG1hbmlmZXN0X2VudHJ5X2lkKGkpID09IG1hbmlmZXN0X2VudHJ5X2lk
KGopKSkKICAgICAgICB7CiAgICAgICAgICBjcy5hcHBseV9kZWx0YShtYW5pZmVzdF9lbnRyeV9w
YXRoKGkpLAogICAgICAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RfZW50cnlfaWQoaSksIAog
ICAgICAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RfZW50cnlfaWQoaikpOwogICAgICAgIH0g
ICAgICAgCiAgICB9CiAgZm9yIChtYW5pZmVzdF9tYXA6OmNvbnN0X2l0ZXJhdG9yIGkgPSBtX2No
aWxkLmJlZ2luKCk7IAogICAgICAgaSAhPSBtX2NoaWxkLmVuZCgpOyArK2kpCiAgICB7CiAgICAg
IG1hbmlmZXN0X21hcDo6Y29uc3RfaXRlcmF0b3IgaiA9IG1fcGFyZW50LmZpbmQobWFuaWZlc3Rf
ZW50cnlfcGF0aChpKSk7CiAgICAgIGlmIChqID09IG1fcGFyZW50LmVuZCgpKQogICAgICAgIGNz
LmFkZF9maWxlKG1hbmlmZXN0X2VudHJ5X3BhdGgoaSksCiAgICAgICAgICAgICAgICAgICAgbWFu
aWZlc3RfZW50cnlfaWQoaSkpOwogICAgfQp9CgpzdGF0aWMgcmV2aXNpb25faWQKY29uc3RydWN0
X3JldmlzaW9ucyhhcHBfc3RhdGUgJiBhcHAsCiAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3Rf
aWQgY29uc3QgJiBjaGlsZCwKICAgICAgICAgICAgICAgICAgICBzdGQ6Om11bHRpbWFwPCBtYW5p
ZmVzdF9pZCwgbWFuaWZlc3RfaWQgPiBjb25zdCAmIGFuY2VzdHJ5LAogICAgICAgICAgICAgICAg
ICAgIHN0ZDo6bWFwPG1hbmlmZXN0X2lkLCByZXZpc2lvbl9pZD4gJiBtYXBwZWQpCnsKICByZXZp
c2lvbl9zZXQgcmV2OwogIHR5cGVkZWYgc3RkOjptdWx0aW1hcDwgbWFuaWZlc3RfaWQsIG1hbmlm
ZXN0X2lkID46OmNvbnN0X2l0ZXJhdG9yIGNpOwogIHN0ZDo6cGFpcjxjaSxjaT4gcmFuZ2UgPSBh
bmNlc3RyeS5lcXVhbF9yYW5nZShjaGlsZCk7CiAgZm9yIChjaSBpID0gcmFuZ2UuZmlyc3Q7IGkg
IT0gcmFuZ2Uuc2Vjb25kOyArK2kpCiAgICB7CiAgICAgIG1hbmlmZXN0X2lkIHBhcmVudChpLT5z
ZWNvbmQpOwogICAgICByZXZpc2lvbl9pZCBwYXJlbnRfcmlkOwogICAgICBzdGQ6Om1hcDxtYW5p
ZmVzdF9pZCwgcmV2aXNpb25faWQ+Ojpjb25zdF9pdGVyYXRvciBqID0gbWFwcGVkLmZpbmQocGFy
ZW50KTsKCiAgICAgIGlmIChqICE9IG1hcHBlZC5lbmQoKSkKICAgICAgICBwYXJlbnRfcmlkID0g
ai0+c2Vjb25kOwogICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgcGFyZW50X3JpZCA9IGNv
bnN0cnVjdF9yZXZpc2lvbnMoYXBwLCBwYXJlbnQsIGFuY2VzdHJ5LCBtYXBwZWQpOwogICAgICAg
ICAgUChGKCJpbnNlcnRpbmcgbWFwcGluZyAlZCA6ICVzIC0+ICVzXG4iKSAlIG1hcHBlZC5zaXpl
KCkgJSBwYXJlbnQgJSBwYXJlbnRfcmlkKTs7CiAgICAgICAgICBtYXBwZWQuaW5zZXJ0KHN0ZDo6
bWFrZV9wYWlyKHBhcmVudCwgcGFyZW50X3JpZCkpOwogICAgICAgIH0KICAgICAgCiAgICAgIGNo
YW5nZV9zZXQgY3M7CiAgICAgIGFuYWx5emVfbWFuaWZlc3RfY2hhbmdlcyhhcHAsIHBhcmVudCwg
Y2hpbGQsIGNzKTsKICAgICAgcmV2LmVkZ2VzLmluc2VydChzdGQ6Om1ha2VfcGFpcihwYXJlbnRf
cmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWly
KHBhcmVudCwgY3MpKSk7CiAgICB9IAoKICByZXZpc2lvbl9pZCByaWQ7CiAgaWYgKHJldi5lZGdl
cy5lbXB0eSgpKQogICAgewogICAgICBQKEYoImlnbm9yaW5nIGVtcHR5IHJldmlzaW9uIGZvciBt
YW5pZmVzdCAlc1xuIikgJSBjaGlsZCk7ICAKICAgICAgcmV0dXJuIHJpZDsKICAgIH0KCiAgcmV2
Lm5ld19tYW5pZmVzdCA9IGNoaWxkOwogIGNhbGN1bGF0ZV9pZGVudChyZXYsIHJpZCk7CgogIGlm
ICghYXBwLmRiLnJldmlzaW9uX2V4aXN0cyAocmlkKSkKICAgIHsKICAgICAgUChGKCJtYXBwaW5n
IG1hbmlmZXN0ICVzIHRvIHJldmlzaW9uICVzXG4iKSAlIGNoaWxkICUgcmlkKTsKICAgICAgYXBw
LmRiLnB1dF9yZXZpc2lvbihyaWQsIHJldik7CiAgICB9CiAgZWxzZQogICAgewogICAgICBQKEYo
InNraXBwaW5nIGFkZGl0aW9uYWwgcGF0aCB0byByZXZpc2lvbiAlc1xuIikgJSByaWQpOwogICAg
fQoKICAvLyBub3cgaG9pc3QgYWxsIHRoZSBpbnRlcmVzdGluZyBjZXJ0cyB1cCB0byB0aGUgcmV2
aXNpb24KICBzdGQ6OnNldDxjZXJ0X25hbWU+IGNuYW1lczsKICBjbmFtZXMuaW5zZXJ0KGNlcnRf
bmFtZShicmFuY2hfY2VydF9uYW1lKSk7CiAgY25hbWVzLmluc2VydChjZXJ0X25hbWUoZGF0ZV9j
ZXJ0X25hbWUpKTsKICBjbmFtZXMuaW5zZXJ0KGNlcnRfbmFtZShhdXRob3JfY2VydF9uYW1lKSk7
CiAgY25hbWVzLmluc2VydChjZXJ0X25hbWUodGFnX2NlcnRfbmFtZSkpOwogIGNuYW1lcy5pbnNl
cnQoY2VydF9uYW1lKGNoYW5nZWxvZ19jZXJ0X25hbWUpKTsKICBjbmFtZXMuaW5zZXJ0KGNlcnRf
bmFtZShjb21tZW50X2NlcnRfbmFtZSkpOwogIGNuYW1lcy5pbnNlcnQoY2VydF9uYW1lKHRlc3Ry
ZXN1bHRfY2VydF9uYW1lKSk7CgogIHN0ZDo6dmVjdG9yPCBtYW5pZmVzdDxjZXJ0PiA+IHRtcDsK
ICBhcHAuZGIuZ2V0X21hbmlmZXN0X2NlcnRzKGNoaWxkLCB0bXApOwogIGVyYXNlX2JvZ3VzX2Nl
cnRzKHRtcCwgYXBwKTsgICAgICAKICBmb3IgKHN0ZDo6dmVjdG9yPCBtYW5pZmVzdDxjZXJ0PiA+
Ojpjb25zdF9pdGVyYXRvciBpID0gdG1wLmJlZ2luKCk7CiAgICAgICBpICE9IHRtcC5lbmQoKTsg
KytpKQogICAgewogICAgICBpZiAoY25hbWVzLmZpbmQoaS0+aW5uZXIoKS5uYW1lKSA9PSBjbmFt
ZXMuZW5kKCkpCiAgICAgICAgY29udGludWU7CiAgICAgIGNlcnQgbmV3X2NlcnQ7CiAgICAgIGNl
cnRfdmFsdWUgdHY7CiAgICAgIGRlY29kZV9iYXNlNjQoaS0+aW5uZXIoKS52YWx1ZSwgdHYpOwog
ICAgICBtYWtlX3NpbXBsZV9jZXJ0KHJpZC5pbm5lcigpLCBpLT5pbm5lcigpLm5hbWUsIHR2LCBh
cHAsIG5ld19jZXJ0KTsKICAgICAgaWYgKCEgYXBwLmRiLnJldmlzaW9uX2NlcnRfZXhpc3RzKHJl
dmlzaW9uPGNlcnQ+KG5ld19jZXJ0KSkpCiAgICAgICAgYXBwLmRiLnB1dF9yZXZpc2lvbl9jZXJ0
KHJldmlzaW9uPGNlcnQ+KG5ld19jZXJ0KSk7CiAgICB9CiAgcmV0dXJuIHJpZDsgIAp9CgoKdm9p
ZCAKYnVpbGRfY2hhbmdlc2V0cyhhcHBfc3RhdGUgJiBhcHApCnsKICBzdGQ6OnZlY3RvcjwgbWFu
aWZlc3Q8Y2VydD4gPiB0bXA7CiAgYXBwLmRiLmdldF9tYW5pZmVzdF9jZXJ0cyhjZXJ0X25hbWUo
ImFuY2VzdG9yIiksIHRtcCk7CiAgZXJhc2VfYm9ndXNfY2VydHModG1wLCBhcHApOwoKICBzdGQ6
Om11bHRpbWFwPCBtYW5pZmVzdF9pZCwgbWFuaWZlc3RfaWQgPiBhbmNlc3RyeTsKICBzdGQ6OnNl
dDxtYW5pZmVzdF9pZD4gaGVhZHM7CiAgc3RkOjpzZXQ8bWFuaWZlc3RfaWQ+IHRvdGFsOwogIAog
IGZvciAoc3RkOjp2ZWN0b3I8IG1hbmlmZXN0PGNlcnQ+ID46OmNvbnN0X2l0ZXJhdG9yIGkgPSB0
bXAuYmVnaW4oKTsKICAgICAgIGkgIT0gdG1wLmVuZCgpOyArK2kpCiAgICB7CiAgICAgIGNlcnRf
dmFsdWUgdHY7CiAgICAgIGRlY29kZV9iYXNlNjQoaS0+aW5uZXIoKS52YWx1ZSwgdHYpOwogICAg
ICBtYW5pZmVzdF9pZCBjaGlsZCwgcGFyZW50OwogICAgICBjaGlsZCA9IGktPmlubmVyKCkuaWRl
bnQ7CiAgICAgIHBhcmVudCA9IGhleGVuYzxpZD4odHYoKSk7CiAgICAgIGhlYWRzLmluc2VydChj
aGlsZCk7CiAgICAgIGhlYWRzLmVyYXNlKHBhcmVudCk7CiAgICAgIHRvdGFsLmluc2VydChjaGls
ZCk7CiAgICAgIHRvdGFsLmluc2VydChwYXJlbnQpOwogICAgICBhbmNlc3RyeS5pbnNlcnQoc3Rk
OjptYWtlX3BhaXIoY2hpbGQsIHBhcmVudCkpOwogICAgfQogIAogIFAoRigiZm91bmQgYSB0b3Rh
bCBvZiAlZCBtYW5pZmVzdHNcbiIpICUgdG90YWwuc2l6ZSgpKTsKCiAgdHJhbnNhY3Rpb25fZ3Vh
cmQgZ3VhcmQoYXBwLmRiKTsKICBzdGQ6Om1hcDxtYW5pZmVzdF9pZCwgcmV2aXNpb25faWQ+IG1h
cHBlZDsKICBmb3IgKHN0ZDo6c2V0PG1hbmlmZXN0X2lkPjo6Y29uc3RfaXRlcmF0b3IgaSA9IGhl
YWRzLmJlZ2luKCk7CiAgICAgICBpICE9IGhlYWRzLmVuZCgpOyArK2kpCiAgICB7CiAgICAgIGNv
bnN0cnVjdF9yZXZpc2lvbnMoYXBwLCAqaSwgYW5jZXN0cnksIG1hcHBlZCk7CiAgICB9CiAgZ3Vh
cmQuY29tbWl0KCk7Cn0KCgovLyBpL28gc3R1ZmYKCnN0ZDo6c3RyaW5nIHJldmlzaW9uX2ZpbGVf
bmFtZSgicmV2aXNpb24iKTsKCm5hbWVzcGFjZSAKewogIG5hbWVzcGFjZSBzeW1zCiAgewogICAg
c3RkOjpzdHJpbmcgY29uc3Qgb2xkX3JldmlzaW9uKCJvbGRfcmV2aXNpb24iKTsKICAgIHN0ZDo6
c3RyaW5nIGNvbnN0IG5ld19tYW5pZmVzdCgibmV3X21hbmlmZXN0Iik7CiAgICBzdGQ6OnN0cmlu
ZyBjb25zdCBvbGRfbWFuaWZlc3QoIm9sZF9tYW5pZmVzdCIpOwogIH0KfQoKCnZvaWQgCnByaW50
X2VkZ2UoYmFzaWNfaW86OnByaW50ZXIgJiBwcmludGVyLAogICAgICAgICAgIGVkZ2VfZW50cnkg
Y29uc3QgJiBlKQp7ICAgICAgIAogIGJhc2ljX2lvOjpzdGFuemEgc3Q7CiAgc3QucHVzaF9oZXhf
cGFpcihzeW1zOjpvbGRfcmV2aXNpb24sIGVkZ2Vfb2xkX3JldmlzaW9uKGUpLmlubmVyKCkoKSk7
CiAgc3QucHVzaF9oZXhfcGFpcihzeW1zOjpvbGRfbWFuaWZlc3QsIGVkZ2Vfb2xkX21hbmlmZXN0
KGUpLmlubmVyKCkoKSk7CiAgcHJpbnRlci5wcmludF9zdGFuemEoc3QpOwogIHByaW50X2NoYW5n
ZV9zZXQocHJpbnRlciwgZWRnZV9jaGFuZ2VzKGUpKTsgCn0KCgp2b2lkIApwcmludF9yZXZpc2lv
bihiYXNpY19pbzo6cHJpbnRlciAmIHByaW50ZXIsCiAgICAgICAgICAgICAgIHJldmlzaW9uX3Nl
dCBjb25zdCAmIHJldikKewogIGJhc2ljX2lvOjpzdGFuemEgc3Q7IAogIHN0LnB1c2hfaGV4X3Bh
aXIoc3ltczo6bmV3X21hbmlmZXN0LCByZXYubmV3X21hbmlmZXN0LmlubmVyKCkoKSk7CiAgcHJp
bnRlci5wcmludF9zdGFuemEoc3QpOwogIGZvciAoZWRnZV9tYXA6OmNvbnN0X2l0ZXJhdG9yIGVk
Z2UgPSByZXYuZWRnZXMuYmVnaW4oKTsKICAgICAgIGVkZ2UgIT0gcmV2LmVkZ2VzLmVuZCgpOyAr
K2VkZ2UpCiAgICBwcmludF9lZGdlKHByaW50ZXIsICplZGdlKTsKfQoKCnZvaWQgCnBhcnNlX2Vk
Z2UoYmFzaWNfaW86OnBhcnNlciAmIHBhcnNlciwKICAgICAgICAgICBlZGdlX21hcCAmIGVzKQp7
CiAgY2hhbmdlX3NldCBjczsKICBtYW5pZmVzdF9pZCBvbGRfbWFuOwogIHJldmlzaW9uX2lkIG9s
ZF9yZXY7CiAgc3RkOjpzdHJpbmcgdG1wOwogIAogIHBhcnNlci5lc3ltKHN5bXM6Om9sZF9yZXZp
c2lvbik7CiAgcGFyc2VyLmhleCh0bXApOwogIG9sZF9yZXYgPSByZXZpc2lvbl9pZCh0bXApOwog
IAogIHBhcnNlci5lc3ltKHN5bXM6Om9sZF9tYW5pZmVzdCk7CiAgcGFyc2VyLmhleCh0bXApOwog
IG9sZF9tYW4gPSBtYW5pZmVzdF9pZCh0bXApOwogIAogIHBhcnNlX2NoYW5nZV9zZXQocGFyc2Vy
LCBjcyk7CgogIGVzLmluc2VydChzdGQ6Om1ha2VfcGFpcihvbGRfcmV2LCBzdGQ6Om1ha2VfcGFp
cihvbGRfbWFuLCBjcykpKTsKfQoKCnZvaWQgCnBhcnNlX3JldmlzaW9uKGJhc2ljX2lvOjpwYXJz
ZXIgJiBwYXJzZXIsCiAgICAgICAgICAgICAgIHJldmlzaW9uX3NldCAmIHJldikKewogIHJldi5l
ZGdlcy5jbGVhcigpOwogIHN0ZDo6c3RyaW5nIHRtcDsKICBwYXJzZXIuZXN5bShzeW1zOjpuZXdf
bWFuaWZlc3QpOwogIHBhcnNlci5oZXgodG1wKTsKICByZXYubmV3X21hbmlmZXN0ID0gbWFuaWZl
c3RfaWQodG1wKTsKICB3aGlsZSAocGFyc2VyLnN5bXAoc3ltczo6b2xkX3JldmlzaW9uKSkKICAg
IHBhcnNlX2VkZ2UocGFyc2VyLCByZXYuZWRnZXMpOwp9Cgp2b2lkIApyZWFkX3JldmlzaW9uX3Nl
dChkYXRhIGNvbnN0ICYgZGF0LAogICAgICAgICAgICAgICAgICByZXZpc2lvbl9zZXQgJiByZXYp
CnsKICBzdGQ6OmlzdHJpbmdzdHJlYW0gaXNzKGRhdCgpKTsKICBiYXNpY19pbzo6aW5wdXRfc291
cmNlIHNyYyhpc3MsICJyZXZpc2lvbiIpOwogIGJhc2ljX2lvOjp0b2tlbml6ZXIgdG9rKHNyYyk7
CiAgYmFzaWNfaW86OnBhcnNlciBwYXJzKHRvayk7CiAgcGFyc2VfcmV2aXNpb24ocGFycywgcmV2
KTsKICBJKHNyYy5sb29rYWhlYWQgPT0gRU9GKTsKfQoKdm9pZCAKcmVhZF9yZXZpc2lvbl9zZXQo
cmV2aXNpb25fZGF0YSBjb25zdCAmIGRhdCwKICAgICAgICAgICAgICAgICAgcmV2aXNpb25fc2V0
ICYgcmV2KQp7CiAgZGF0YSB1bnBhY2tlZDsKICB1bnBhY2soZGF0LmlubmVyKCksIHVucGFja2Vk
KTsKICByZWFkX3JldmlzaW9uX3NldCh1bnBhY2tlZCwgcmV2KTsKfQoKdm9pZAp3cml0ZV9yZXZp
c2lvbl9zZXQocmV2aXNpb25fc2V0IGNvbnN0ICYgcmV2LAogICAgICAgICAgICAgICAgICAgZGF0
YSAmIGRhdCkKewogIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CiAgYmFzaWNfaW86OnByaW50ZXIg
cHIob3NzKTsKICBwcmludF9yZXZpc2lvbihwciwgcmV2KTsKICBkYXQgPSBkYXRhKG9zcy5zdHIo
KSk7Cn0KCnZvaWQKd3JpdGVfcmV2aXNpb25fc2V0KHJldmlzaW9uX3NldCBjb25zdCAmIHJldiwK
ICAgICAgICAgICAgICAgICAgIHJldmlzaW9uX2RhdGEgJiBkYXQpCnsKICBkYXRhIGQ7CiAgd3Jp
dGVfcmV2aXNpb25fc2V0KHJldiwgZCk7CiAgYmFzZTY0PCBnemlwPGRhdGE+ID4gcGFja2VkOwog
IHBhY2soZCwgcGFja2VkKTsKICBkYXQgPSByZXZpc2lvbl9kYXRhKHBhY2tlZCk7Cn0KCiNpZmRl
ZiBCVUlMRF9VTklUX1RFU1RTCiNpbmNsdWRlICJ1bml0X3Rlc3RzLmhoIgojaW5jbHVkZSAic2Fu
aXR5LmhoIgoKc3RhdGljIHZvaWQgCnJldmlzaW9uX3Rlc3QoKQp7Cn0KCnZvaWQgCmFkZF9yZXZp
c2lvbl90ZXN0cyh0ZXN0X3N1aXRlICogc3VpdGUpCnsKICBJKHN1aXRlKTsKICBzdWl0ZS0+YWRk
KEJPT1NUX1RFU1RfQ0FTRSgmcmV2aXNpb25fdGVzdCkpOwp9CgoKI2VuZGlmIC8vIEJVSUxEX1VO
SVRfVEVTVFMK
_ATEOF


cat >right.b64 <<'_ATEOF'
Ly8gY29weXJpZ2h0IChDKSAyMDA0IGdyYXlkb24gaG9hcmUgPGdyYXlkb25AcG9ib3guY29tPgov
LyBhbGwgcmlnaHRzIHJlc2VydmVkLgovLyBsaWNlbnNlZCB0byB0aGUgcHVibGljIHVuZGVyIHRo
ZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCAoPj0gMikKLy8gc2VlIHRoZSBmaWxlIENPUFlJTkcgZm9y
IGRldGFpbHMKCiNpbmNsdWRlIDxjY3R5cGU+CiNpbmNsdWRlIDxjc3RkbGliPgojaW5jbHVkZSA8
aW9zdHJlYW0+CiNpbmNsdWRlIDxtYXA+CiNpbmNsdWRlIDxzZXQ+CiNpbmNsdWRlIDxzc3RyZWFt
PgojaW5jbHVkZSA8c3RyaW5nPgoKI2luY2x1ZGUgPGJvb3N0L2xleGljYWxfY2FzdC5ocHA+CiNp
bmNsdWRlIDxib29zdC9keW5hbWljX2JpdHNldC5ocHA+CiNpbmNsdWRlIDxib29zdC9zaGFyZWRf
cHRyLmhwcD4KCiNpbmNsdWRlICJiYXNpY19pby5oaCIKI2luY2x1ZGUgImNoYW5nZV9zZXQuaGgi
CiNpbmNsdWRlICJjb25zdGFudHMuaGgiCiNpbmNsdWRlICJyZXZpc2lvbi5oaCIKI2luY2x1ZGUg
InNhbml0eS5oaCIKI2luY2x1ZGUgInRyYW5zZm9ybXMuaGgiCiNpbmNsdWRlICJ2b2NhYi5oaCIK
CgovLyBjYWxjdWxhdGluZyBsZWFzdCBjb21tb24gYW5jZXN0b3JzIGlzIGEgZGVsaWNhdGUgdGhp
bmcuCi8vIAovLyBpdCB0dXJucyBvdXQgdGhhdCB3ZSBjYW5ub3QgY2hvb3NlIHRoZSBzaW1wbGUg
ImxlYXN0IGNvbW1vbiBhbmNlc3RvciIKLy8gZm9yIHB1cnBvc2VzIG9mIGEgbWVyZ2UsIGJlY2F1
c2UgaXQgaXMgcG9zc2libGUgdGhhdCB0aGVyZSBhcmUgdHdvCi8vIGVxdWFsbHkgcmVhY2hhYmxl
IGNvbW1vbiBhbmNlc3RvcnMsIGFuZCB0aGlzIHByb2R1Y2VzIGFtYmlndWl0eSBpbiB0aGUKLy8g
bWVyZ2UuIHRoZSByZXN1bHQgLS0gaW4gYSBwYXRob2xvZ2ljYWwgY2FzZSAtLSBpcyBzaWxlbnRs
eSBhY2NlcHRpbmcgb25lCi8vIHNldCBvZiBlZGl0cyB3aGlsZSBkaXNjYXJkaW5nIGFub3RoZXI7
IG5vdCBleGFjdGx5IHdoYXQgeW91IHdhbnQgYQovLyB2ZXJzaW9uIGNvbnRyb2wgdG9vbCB0byBk
by4KLy8KLy8gYSBjb25zZXJ2YXRpdmUgYXBwcm94aW1hdGlvbiBpcyB3aGF0IHdlJ2xsIGNhbGwg
YSAic3ViZ3JhcGggcmVjdXJyaW5nIgovLyBMQ0EgYWxnb3JpdGhtLiB0aGlzIGlzIHNvbWV3aGF0
IGxpa2UgbG9jYXRpbmcgdGhlIGxlYXN0IGNvbW1vbiBkb21pbmF0b3IKLy8gbm9kZSwgYnV0IG5v
dCBxdWl0ZS4gaXQgaXMgYWN0dWFsbHkganVzdCBhIHZhbmlsbGEgTENBIHNlYXJjaCwgZXhjZXB0
Ci8vIHRoYXQgYW55IHRpbWUgdGhlcmUncyBhIGZvcmsgKGEgaGlzdG9yaWNhbCBtZXJnZSBsb29r
cyBsaWtlIGEgZm9yayBmcm9tCi8vIG91ciBwZXJzcGVjdGl2ZSwgd29ya2luZyBiYWNrd2FyZHMg
ZnJvbSBjaGlsZHJlbiB0byBwYXJlbnRzKSBpdCByZWR1Y2VzCi8vIHRoZSBmb3JrIHRvIGEgY29t
bW9uIHBhcmVudCB2aWEgYSBzZXF1ZW5jZSBvZiBwYWlyd2lzZSByZWN1cnNpdmUgY2FsbHMKLy8g
dG8gaXRzZWxmIGJlZm9yZSBwcm9jZWVkaW5nLiB0aGlzIHdpbGwgYWx3YXlzIHJlc29sdmUgdG8g
YSBjb21tb24gcGFyZW50Ci8vIHdpdGggbm8gYW1iaWd1aXR5LCB1bmxlc3MgaXQgZmFsbHMgb2Zm
IHRoZSByb290IG9mIHRoZSBncmFwaC4KLy8KLy8gdW5mb3J0dW5hdGVseSB0aGUgc3ViZ3JhcGgg
cmVjdXJyaW5nIGFsZ29yaXRobSBzb21ldGltZXMgZ29lcyB0b28gZmFyCi8vIGJhY2sgaW4gaGlz
dG9yeSAtLSBmb3IgZXhhbXBsZSBpZiB0aGVyZSBpcyBhbiB1bmFtYmlndW91cyBwcm9wYWdhdGUg
ZnJvbQovLyBvbmUgYnJhbmNoIHRvIGFub3RoZXIsIHRoZSBlbnRpcmUgc3ViZ3JhcGggcHJlY2Vl
ZGluZyB0aGUgcHJvcGFnYXRlIG9uCi8vIHRoZSByZWNpcGllbnQgYnJhbmNoIGlzIGVsaWRlZCwg
c2luY2UgaXQgaXMgYSBtZXJnZS4KLy8KLy8gb3VyIGN1cnJlbnQgaHlwb3RoZXNpcyBpcyB0aGF0
IHRoZSAqZXhhY3QqIGNvbmRpdGlvbiB3ZSdyZSBsb29raW5nIGZvciwKLy8gd2hlbiBkb2luZyBh
IG1lcmdlLCBpcyB0aGUgbGVhc3Qgbm9kZSB3aGljaCBkb21pbmF0ZXMgb25lIHNpZGUgb2YgdGhl
Ci8vIG1lcmdlIGFuZCBpcyBhbiBhbmNlc3RvciBvZiB0aGUgb3RoZXIuCgp0eXBlZGVmIHVuc2ln
bmVkIGxvbmcgY3R4Owp0eXBlZGVmIGJvb3N0OjpkeW5hbWljX2JpdHNldDw+IGJpdG1hcDsKdHlw
ZWRlZiBib29zdDo6c2hhcmVkX3B0cjxiaXRtYXA+IHNoYXJlZF9iaXRtYXA7CgpzdGF0aWMgdm9p
ZCAKZW5zdXJlX3BhcmVudHNfbG9hZGVkKGN0eCBjaGlsZCwKICAgICAgICAgICAgICAgICAgICAg
IHN0ZDo6bWFwPGN0eCwgc2hhcmVkX2JpdG1hcD4gJiBwYXJlbnRzLAogICAgICAgICAgICAgICAg
ICAgICAgaW50ZXJuZXI8Y3R4PiAmIGludGVybiwKICAgICAgICAgICAgICAgICAgICAgIGFwcF9z
dGF0ZSAmIGFwcCkKewogIGlmIChwYXJlbnRzLmZpbmQoY2hpbGQpICE9IHBhcmVudHMuZW5kKCkp
CiAgICByZXR1cm47CgogIEwoRigibG9hZGluZyBwYXJlbnRzIGZvciBub2RlICVkXG4iKSAlIGNo
aWxkKTsKCiAgc3RkOjpzZXQ8cmV2aXNpb25faWQ+IGltbV9wYXJlbnRzOwogIGFwcC5kYi5nZXRf
cmV2aXNpb25fcGFyZW50cyhyZXZpc2lvbl9pZChpbnRlcm4ubG9va3VwKGNoaWxkKSksIGltbV9w
YXJlbnRzKTsKCiAgLy8gVGhlIG51bGwgcmV2aXNpb24gaXMgbm90IGEgcGFyZW50IGZvciBwdXJw
b3NlcyBvZiBmaW5kaW5nIGNvbW1vbgogIC8vIGFuY2VzdG9ycy4KICBmb3IgKHN0ZDo6c2V0PHJl
dmlzaW9uX2lkPjo6aXRlcmF0b3IgcCA9IGltbV9wYXJlbnRzLmJlZ2luKCk7CiAgICAgICBwICE9
IGltbV9wYXJlbnRzLmVuZCgpOyArK3ApCiAgICB7CiAgICAgIGlmIChudWxsX2lkKCpwKSkKICAg
ICAgICBpbW1fcGFyZW50cy5lcmFzZShwKTsKICAgIH0KICAgICAgICAgICAgICAKICBzaGFyZWRf
Yml0bWFwIGJpdHMgPSBzaGFyZWRfYml0bWFwKG5ldyBiaXRtYXAocGFyZW50cy5zaXplKCkpKTsK
ICAKICBmb3IgKHN0ZDo6c2V0PHJldmlzaW9uX2lkPjo6Y29uc3RfaXRlcmF0b3IgcCA9IGltbV9w
YXJlbnRzLmJlZ2luKCk7CiAgICAgICBwICE9IGltbV9wYXJlbnRzLmVuZCgpOyArK3ApCiAgICB7
CiAgICAgIGN0eCBwbiA9IGludGVybi5pbnRlcm4ocC0+aW5uZXIoKSgpKTsKICAgICAgTChGKCJw
YXJlbnQgJXMgLT4gbm9kZSAlZFxuIikgJSAqcCAlIHBuKTsKICAgICAgaWYgKHBuID49IGJpdHMt
PnNpemUoKSkgCiAgICAgICAgYml0cy0+cmVzaXplKHBuKzEpOwogICAgICBiaXRzLT5zZXQocG4p
OwogICAgfQogICAgCiAgcGFyZW50cy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY2hpbGQsIGJpdHMp
KTsKfQoKc3RhdGljIGJvb2wgCmV4cGFuZF9kb21pbmF0b3JzKHN0ZDo6bWFwPGN0eCwgc2hhcmVk
X2JpdG1hcD4gJiBwYXJlbnRzLAogICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxjdHgsIHNoYXJl
ZF9iaXRtYXA+ICYgZG9taW5hdG9ycywKICAgICAgICAgICAgICAgICAgaW50ZXJuZXI8Y3R4PiAm
IGludGVybiwKICAgICAgICAgICAgICAgICAgYXBwX3N0YXRlICYgYXBwKQp7CiAgYm9vbCBzb21l
dGhpbmdfY2hhbmdlZCA9IGZhbHNlOwogIHN0ZDo6dmVjdG9yPGN0eD4gbm9kZXM7CgogIG5vZGVz
LnJlc2VydmUoZG9taW5hdG9ycy5zaXplKCkpOwoKICAvLyBwYXNzIDEsIHB1bGwgb3V0IGFsbCB0
aGUgbm9kZSBudW1iZXJzIHdlJ3JlIGdvaW5nIHRvIHNjYW4gdGhpcyB0aW1lIGFyb3VuZAogIGZv
ciAoc3RkOjptYXA8Y3R4LCBzaGFyZWRfYml0bWFwPjo6Y29uc3RfaXRlcmF0b3IgZSA9IGRvbWlu
YXRvcnMuYmVnaW4oKTsgCiAgICAgICBlICE9IGRvbWluYXRvcnMuZW5kKCk7ICsrZSkKICAgIG5v
ZGVzLnB1c2hfYmFjayhlLT5maXJzdCk7CiAgCiAgLy8gcGFzcyAyLCB1cGRhdGUgYW55IG9mIHRo
ZSBkb21pbmF0b3IgZW50cmllcyB3ZSBjYW4KICBmb3IgKHN0ZDo6dmVjdG9yPGN0eD46OmNvbnN0
X2l0ZXJhdG9yIG4gPSBub2Rlcy5iZWdpbigpOyAKICAgICAgIG4gIT0gbm9kZXMuZW5kKCk7ICsr
bikKICAgIHsKICAgICAgc2hhcmVkX2JpdG1hcCBiaXRzID0gZG9taW5hdG9yc1sqbl07CiAgICAg
IGJpdG1hcCBzYXZlZCgqYml0cyk7CiAgICAgIGlmIChiaXRzLT5zaXplKCkgPD0gKm4pCiAgICAg
ICAgYml0cy0+cmVzaXplKCpuICsgMSk7CiAgICAgIGJpdHMtPnNldCgqbik7CiAgICAgIAogICAg
ICBlbnN1cmVfcGFyZW50c19sb2FkZWQoKm4sIHBhcmVudHMsIGludGVybiwgYXBwKTsKICAgICAg
c2hhcmVkX2JpdG1hcCBuX3BhcmVudHMgPSBwYXJlbnRzWypuXTsKICAgICAgCiAgICAgIGJpdG1h
cCBpbnRlcnNlY3Rpb24oYml0cy0+c2l6ZSgpKTsKICAgICAgCiAgICAgIGJvb2wgZmlyc3QgPSB0
cnVlOwogICAgICBmb3IgKHVuc2lnbmVkIGxvbmcgcGFyZW50ID0gMDsgCiAgICAgICAgICAgcGFy
ZW50ICE9IG5fcGFyZW50cy0+c2l6ZSgpOyArK3BhcmVudCkKICAgICAgICB7CiAgICAgICAgICBp
ZiAoISBuX3BhcmVudHMtPnRlc3QocGFyZW50KSkKICAgICAgICAgICAgY29udGludWU7CgogICAg
ICAgICAgaWYgKGRvbWluYXRvcnMuZmluZChwYXJlbnQpID09IGRvbWluYXRvcnMuZW5kKCkpCiAg
ICAgICAgICAgIGRvbWluYXRvcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHBhcmVudCwgCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9iaXRtYXAobmV3
IGJpdG1hcCgpKSkpOwogICAgICAgICAgc2hhcmVkX2JpdG1hcCBwYml0cyA9IGRvbWluYXRvcnNb
cGFyZW50XTsKCiAgICAgICAgICBpZiAoYml0cy0+c2l6ZSgpID4gcGJpdHMtPnNpemUoKSkKICAg
ICAgICAgICAgcGJpdHMtPnJlc2l6ZShiaXRzLT5zaXplKCkpOwoKICAgICAgICAgIGlmIChwYml0
cy0+c2l6ZSgpID4gYml0cy0+c2l6ZSgpKQogICAgICAgICAgICBiaXRzLT5yZXNpemUocGJpdHMt
PnNpemUoKSk7CgogICAgICAgICAgaWYgKGZpcnN0KQogICAgICAgICAgICB7CiAgICAgICAgICAg
ICAgaW50ZXJzZWN0aW9uID0gKCpwYml0cyk7CiAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsK
ICAgICAgICAgICAgfQogICAgICAgICAgZWxzZQogICAgICAgICAgICBpbnRlcnNlY3Rpb24gJj0g
KCpwYml0cyk7CiAgICAgICAgfQoKICAgICAgKCpiaXRzKSB8PSBpbnRlcnNlY3Rpb247CiAgICAg
IGlmICgqYml0cyAhPSBzYXZlZCkKICAgICAgICBzb21ldGhpbmdfY2hhbmdlZCA9IHRydWU7CiAg
ICB9CiAgcmV0dXJuIHNvbWV0aGluZ19jaGFuZ2VkOwp9CgoKc3RhdGljIGJvb2wgCmV4cGFuZF9h
bmNlc3RvcnMoc3RkOjptYXA8Y3R4LCBzaGFyZWRfYml0bWFwPiAmIHBhcmVudHMsCiAgICAgICAg
ICAgICAgICAgc3RkOjptYXA8Y3R4LCBzaGFyZWRfYml0bWFwPiAmIGFuY2VzdG9ycywKICAgICAg
ICAgICAgICAgICBpbnRlcm5lcjxjdHg+ICYgaW50ZXJuLAogICAgICAgICAgICAgICAgIGFwcF9z
dGF0ZSAmIGFwcCkKewogIGJvb2wgc29tZXRoaW5nX2NoYW5nZWQgPSBmYWxzZTsKICBzdGQ6OnZl
Y3RvcjxjdHg+IG5vZGVzOwoKICBub2Rlcy5yZXNlcnZlKGFuY2VzdG9ycy5zaXplKCkpOwoKICAv
LyBwYXNzIDEsIHB1bGwgb3V0IGFsbCB0aGUgbm9kZSBudW1iZXJzIHdlJ3JlIGdvaW5nIHRvIHNj
YW4gdGhpcyB0aW1lIGFyb3VuZAogIGZvciAoc3RkOjptYXA8Y3R4LCBzaGFyZWRfYml0bWFwPjo6
Y29uc3RfaXRlcmF0b3IgZSA9IGFuY2VzdG9ycy5iZWdpbigpOyAKICAgICAgIGUgIT0gYW5jZXN0
b3JzLmVuZCgpOyArK2UpCiAgICBub2Rlcy5wdXNoX2JhY2soZS0+Zmlyc3QpOwogIAogIC8vIHBh
c3MgMiwgdXBkYXRlIGFueSBvZiB0aGUgYW5jZXN0b3IgZW50cmllcyB3ZSBjYW4KICBmb3IgKHN0
ZDo6dmVjdG9yPGN0eD46OmNvbnN0X2l0ZXJhdG9yIG4gPSBub2Rlcy5iZWdpbigpOyBuICE9IG5v
ZGVzLmVuZCgpOyArK24pCiAgICB7CiAgICAgIHNoYXJlZF9iaXRtYXAgYml0cyA9IGFuY2VzdG9y
c1sqbl07CiAgICAgIGJpdG1hcCBzYXZlZCgqYml0cyk7CiAgICAgIGlmIChiaXRzLT5zaXplKCkg
PD0gKm4pCiAgICAgICAgYml0cy0+cmVzaXplKCpuICsgMSk7CiAgICAgIGJpdHMtPnNldCgqbik7
CgogICAgICBlbnN1cmVfcGFyZW50c19sb2FkZWQoKm4sIHBhcmVudHMsIGludGVybiwgYXBwKTsK
ICAgICAgc2hhcmVkX2JpdG1hcCBuX3BhcmVudHMgPSBwYXJlbnRzWypuXTsKICAgICAgZm9yIChj
dHggcGFyZW50ID0gMDsgcGFyZW50ICE9IG5fcGFyZW50cy0+c2l6ZSgpOyArK3BhcmVudCkKICAg
ICAgICB7CiAgICAgICAgICBpZiAoISBuX3BhcmVudHMtPnRlc3QocGFyZW50KSkKICAgICAgICAg
ICAgY29udGludWU7CgogICAgICAgICAgaWYgKGJpdHMtPnNpemUoKSA8PSBwYXJlbnQpCiAgICAg
ICAgICAgIGJpdHMtPnJlc2l6ZShwYXJlbnQgKyAxKTsKICAgICAgICAgIGJpdHMtPnNldChwYXJl
bnQpOwoKICAgICAgICAgIGlmIChhbmNlc3RvcnMuZmluZChwYXJlbnQpID09IGFuY2VzdG9ycy5l
bmQoKSkKICAgICAgICAgICAgYW5jZXN0b3JzLmluc2VydChtYWtlX3BhaXIocGFyZW50LCAKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9iaXRtYXAobmV3IGJp
dG1hcCgpKSkpOwogICAgICAgICAgc2hhcmVkX2JpdG1hcCBwYml0cyA9IGFuY2VzdG9yc1twYXJl
bnRdOwoKICAgICAgICAgIGlmIChiaXRzLT5zaXplKCkgPiBwYml0cy0+c2l6ZSgpKQogICAgICAg
ICAgICBwYml0cy0+cmVzaXplKGJpdHMtPnNpemUoKSk7CgogICAgICAgICAgaWYgKHBiaXRzLT5z
aXplKCkgPiBiaXRzLT5zaXplKCkpCiAgICAgICAgICAgIGJpdHMtPnJlc2l6ZShwYml0cy0+c2l6
ZSgpKTsKCiAgICAgICAgICAoKmJpdHMpIHw9ICgqcGJpdHMpOwogICAgICAgIH0KICAgICAgaWYg
KCpiaXRzICE9IHNhdmVkKQogICAgICAgIHNvbWV0aGluZ19jaGFuZ2VkID0gdHJ1ZTsKICAgIH0K
ICByZXR1cm4gc29tZXRoaW5nX2NoYW5nZWQ7Cn0KCnN0YXRpYyBib29sIApmaW5kX2ludGVyc2Vj
dGluZ19ub2RlKGJpdG1hcCAmIGZzdCwgCiAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwICYg
c25kLCAKICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5lcjxjdHg+IGNvbnN0ICYgaW50ZXJu
LCAKICAgICAgICAgICAgICAgICAgICAgICByZXZpc2lvbl9pZCAmIGFuYykKewogIAogIGlmIChm
c3Quc2l6ZSgpID4gc25kLnNpemUoKSkKICAgIHNuZC5yZXNpemUoZnN0LnNpemUoKSk7CiAgZWxz
ZSBpZiAoc25kLnNpemUoKSA+IGZzdC5zaXplKCkpCiAgICBmc3QucmVzaXplKHNuZC5zaXplKCkp
OwogIAogIGJpdG1hcCBpbnRlcnNlY3Rpb24gPSBmc3QgJiBzbmQ7CiAgaWYgKGludGVyc2VjdGlv
bi5hbnkoKSkKICAgIHsKICAgICAgTChGKCJmb3VuZCAlZCBpbnRlcnNlY3Rpbmcgbm9kZXNcbiIp
ICUgaW50ZXJzZWN0aW9uLmNvdW50KCkpOwogICAgICBmb3IgKGN0eCBpID0gMDsgaSA8IGludGVy
c2VjdGlvbi5zaXplKCk7ICsraSkKICAgICAgICB7CiAgICAgICAgICBpZiAoaW50ZXJzZWN0aW9u
LnRlc3QoaSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBhbmMgPSByZXZpc2lvbl9pZChp
bnRlcm4ubG9va3VwKGkpKTsKICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAg
fQogICAgICAgIH0KICAgIH0KICByZXR1cm4gZmFsc2U7Cn0KCi8vICBzdGF0aWMgdm9pZAovLyAg
ZHVtcF9iaXRzZXRfbWFwKHN0ZDo6c3RyaW5nIGNvbnN0ICYgaGRyLAovLyAgICAgICAgICAgICAg
c3RkOjptYXA8IGN0eCwgc2hhcmVkX2JpdG1hcCA+IGNvbnN0ICYgbW0pCi8vICB7Ci8vICAgIEwo
RigiZHVtcGluZyBbJXNdICglZCBlbnRyaWVzKVxuIikgJSBoZHIgJSBtbS5zaXplKCkpOwovLyAg
ICBmb3IgKHN0ZDo6bWFwPCBjdHgsIHNoYXJlZF9iaXRtYXAgPjo6Y29uc3RfaXRlcmF0b3IgaSA9
IG1tLmJlZ2luKCk7Ci8vICAgICAgICAgaSAhPSBtbS5lbmQoKTsgKytpKQovLyAgICAgIHsKLy8g
ICAgICAgIEwoRigiZHVtcCBbJXNdOiAlZCAtPiAlc1xuIikgJSBoZHIgJSBpLT5maXJzdCAlICgq
KGktPnNlY29uZCkpKTsKLy8gICAgICB9Ci8vICB9Cgpib29sIApmaW5kX2NvbW1vbl9hbmNlc3Rv
cl9mb3JfbWVyZ2UocmV2aXNpb25faWQgY29uc3QgJiBsZWZ0LAogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgcmV2aXNpb25faWQgY29uc3QgJiByaWdodCwKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHJldmlzaW9uX2lkICYgYW5jLAogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgYXBwX3N0YXRlICYgYXBwKQp7CiAgaW50ZXJuZXI8Y3R4PiBpbnRlcm47CiAgc3RkOjpt
YXA8IGN0eCwgc2hhcmVkX2JpdG1hcCA+IAogICAgcGFyZW50cywgYW5jZXN0b3JzLCBkb21pbmF0
b3JzOwogIAogIGN0eCBsbiA9IGludGVybi5pbnRlcm4obGVmdC5pbm5lcigpKCkpOwogIGN0eCBy
biA9IGludGVybi5pbnRlcm4ocmlnaHQuaW5uZXIoKSgpKTsKICAKICBzaGFyZWRfYml0bWFwIGxh
bmMgPSBzaGFyZWRfYml0bWFwKG5ldyBiaXRtYXAoKSk7CiAgc2hhcmVkX2JpdG1hcCByYW5jID0g
c2hhcmVkX2JpdG1hcChuZXcgYml0bWFwKCkpOwogIHNoYXJlZF9iaXRtYXAgbGRvbSA9IHNoYXJl
ZF9iaXRtYXAobmV3IGJpdG1hcCgpKTsKICBzaGFyZWRfYml0bWFwIHJkb20gPSBzaGFyZWRfYml0
bWFwKG5ldyBiaXRtYXAoKSk7CgogIGFuY2VzdG9ycy5pbnNlcnQobWFrZV9wYWlyKGxuLCBsYW5j
KSk7CiAgYW5jZXN0b3JzLmluc2VydChtYWtlX3BhaXIocm4sIHJhbmMpKTsKICBkb21pbmF0b3Jz
Lmluc2VydChtYWtlX3BhaXIobG4sIGxkb20pKTsKICBkb21pbmF0b3JzLmluc2VydChtYWtlX3Bh
aXIocm4sIHJkb20pKTsKICAKICBMKEYoInNlYXJjaGluZyBmb3IgY29tbW9uIGFuY2VzdG9yLCBs
ZWZ0PSVzIHJpZ2h0PSVzXG4iKSAlIGxlZnQgJSByaWdodCk7CiAgCiAgd2hpbGUgKGV4cGFuZF9h
bmNlc3RvcnMocGFyZW50cywgYW5jZXN0b3JzLCBpbnRlcm4sIGFwcCkgfHwKICAgICAgICAgZXhw
YW5kX2RvbWluYXRvcnMocGFyZW50cywgZG9taW5hdG9ycywgaW50ZXJuLCBhcHApKQogICAgewog
ICAgICBMKEYoImNvbW1vbiBhbmNlc3RvciBzY2FuIFtwYXI9JWQsYW5jPSVkLGRvbT0lZF1cbiIp
ICUgCiAgICAgICAgcGFyZW50cy5zaXplKCkgJSBhbmNlc3RvcnMuc2l6ZSgpICUgZG9taW5hdG9y
cy5zaXplKCkpOwoKICAgICAgaWYgKGZpbmRfaW50ZXJzZWN0aW5nX25vZGUoKmxhbmMsICpyZG9t
LCBpbnRlcm4sIGFuYykpCiAgICAgICAgewogICAgICAgICAgTChGKCJmb3VuZCBub2RlICVkLCBh
bmNlc3RvciBvZiBsZWZ0ICVzIGFuZCBkb21pbmF0aW5nIHJpZ2h0ICVzXG4iKQogICAgICAgICAg
ICAlIGFuYyAlIGxlZnQgJSByaWdodCk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9
CiAgICAgIAogICAgICBlbHNlIGlmIChmaW5kX2ludGVyc2VjdGluZ19ub2RlKCpyYW5jLCAqbGRv
bSwgaW50ZXJuLCBhbmMpKQogICAgICAgIHsKICAgICAgICAgIEwoRigiZm91bmQgbm9kZSAlZCwg
YW5jZXN0b3Igb2YgcmlnaHQgJXMgYW5kIGRvbWluYXRpbmcgbGVmdCAlc1xuIikKICAgICAgICAg
ICAgJSBhbmMgJSByaWdodCAlIGxlZnQpOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAg
fQogICAgfQovLyAgICAgIGR1bXBfYml0c2V0X21hcCgiYW5jZXN0b3JzIiwgYW5jZXN0b3JzKTsK
Ly8gICAgICBkdW1wX2JpdHNldF9tYXAoImRvbWluYXRvcnMiLCBkb21pbmF0b3JzKTsKLy8gICAg
ICBkdW1wX2JpdHNldF9tYXAoInBhcmVudHMiLCBwYXJlbnRzKTsKICByZXR1cm4gZmFsc2U7Cn0K
Cgpib29sCmZpbmRfbGVhc3RfY29tbW9uX2FuY2VzdG9yKHJldmlzaW9uX2lkIGNvbnN0ICYgbGVm
dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2aXNpb25faWQgY29uc3QgJiByaWdodCwK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2aXNpb25faWQgJiBhbmMsCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGFwcF9zdGF0ZSAmIGFwcCkKewogIGludGVybmVyPGN0eD4gaW50ZXJu
OwogIHN0ZDo6bWFwPCBjdHgsIHNoYXJlZF9iaXRtYXAgPgogICAgcGFyZW50cywgYW5jZXN0b3Jz
LCBkb21pbmF0b3JzOwoKICBjdHggbG4gPSBpbnRlcm4uaW50ZXJuKGxlZnQuaW5uZXIoKSgpKTsK
ICBjdHggcm4gPSBpbnRlcm4uaW50ZXJuKHJpZ2h0LmlubmVyKCkoKSk7CgogIHNoYXJlZF9iaXRt
YXAgbGFuYyA9IHNoYXJlZF9iaXRtYXAobmV3IGJpdG1hcCgpKTsKICBzaGFyZWRfYml0bWFwIHJh
bmMgPSBzaGFyZWRfYml0bWFwKG5ldyBiaXRtYXAoKSk7CgogIGFuY2VzdG9ycy5pbnNlcnQobWFr
ZV9wYWlyKGxuLCBsYW5jKSk7CiAgYW5jZXN0b3JzLmluc2VydChtYWtlX3BhaXIocm4sIHJhbmMp
KTsKCiAgTChGKCJzZWFyY2hpbmcgZm9yIGxlYXN0IGNvbW1vbiBhbmNlc3RvciwgbGVmdD0lcyBy
aWdodD0lc1xuIikgJSBsZWZ0ICUgcmlnaHQpOwoKICB3aGlsZSAoZXhwYW5kX2FuY2VzdG9ycyhw
YXJlbnRzLCBhbmNlc3RvcnMsIGludGVybiwgYXBwKSkKICAgIHsKICAgICAgTChGKCJsZWFzdCBj
b21tb24gYW5jZXN0b3Igc2NhbiBbcGFyPSVkLGFuYz0lZF1cbiIpICUKICAgICAgICBwYXJlbnRz
LnNpemUoKSAlIGFuY2VzdG9ycy5zaXplKCkpOwoKICAgICAgaWYgKGZpbmRfaW50ZXJzZWN0aW5n
X25vZGUoKmxhbmMsICpyYW5jLCBpbnRlcm4sIGFuYykpCiAgICAgICAgewogICAgICAgICAgTChG
KCJmb3VuZCBub2RlICVkLCBhbmNlc3RvciBvZiBsZWZ0ICVzIGFuZCByaWdodCAlc1xuIikKICAg
ICAgICAgICAgJSBhbmMgJSBsZWZ0ICUgcmlnaHQpOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAg
ICAgICAgfQogICAgfQovLyAgICAgIGR1bXBfYml0c2V0X21hcCgiYW5jZXN0b3JzIiwgYW5jZXN0
b3JzKTsKLy8gICAgICBkdW1wX2JpdHNldF9tYXAoInBhcmVudHMiLCBwYXJlbnRzKTsKICByZXR1
cm4gZmFsc2U7Cn0KCgovLyAKLy8gVGhlIGlkZWEgd2l0aCB0aGlzIGFsZ29yaXRobSBpcyB0byB3
YWxrIGZyb20gY2hpbGQgdXAgdG8gYW5jZXN0b3IsCi8vIHJlY3Vyc2l2ZWx5LCBhY2N1bXVsYXRp
bmcgYWxsIHRoZSBjaGFuZ2Vfc2V0cyBhc3NvY2lhdGVkIHdpdGgKLy8gaW50ZXJtZWRpYXRlIG5v
ZGVzIGludG8gKm9uZSBiaWcgY2hhbmdlX3NldCouCi8vCi8vIGNsZXZlciByZWFkZXJzIHdpbGwg
cmVhbGl6ZSB0aGlzIGlzIGFuIG92ZXJsYXBwaW5nLXN1YnByb2JsZW0gdHlwZQovLyBzaXR1YXRp
b24gYW5kIHRodXMgbmVlZHMgdG8ga2VlcCBhIGR5bmFtaWMgcHJvZ3JhbW1pbmcgbWFwIHRvIGtl
ZXAKLy8gaXRzZWxmIGluIGxpbmVhciBjb21wbGV4aXR5LgovLwovLyBpbiBmYWN0LCB3ZSBrZWVw
IHR3bzogb25lIHdoaWNoIG1hcHMgdG8gY29tcHV0ZWQgcmVzdWx0cyAocGFydGlhbF9jc2V0cykK
Ly8gYW5kIG9uZSB3aGljaCBqdXN0IGtlZXBzIGEgc2V0IG9mIGFsbCBub2RlcyB3ZSB0cmF2ZXJz
ZWQKLy8gKHZpc2l0ZWRfbm9kZXMpLiBpbiB0aGVvcnkgaXQgY291bGQgYmUgb25lIG1hcCB3aXRo
IGFuIGV4dHJhIGJvb2wgc3R1Y2sKLy8gb24gZWFjaCBlbnRyeSwgYnV0IEkgdGhpbmsgdGhhdCB3
b3VsZCBtYWtlIGl0IGV2ZW4gbGVzcyByZWFkYWJsZS4gaXQncwovLyBhbHJlYWR5IHF1aXRlIHVn
bHkuCi8vCgpzdGF0aWMgYm9vbCAKY2FsY3VsYXRlX2NoYW5nZV9zZXRzX3JlY3Vyc2l2ZShyZXZp
c2lvbl9pZCBjb25zdCAmIGFuY2VzdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHJldmlzaW9uX2lkIGNvbnN0ICYgY2hpbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgYXBwX3N0YXRlICYgYXBwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5n
ZV9zZXQgJiBjdW11bGF0aXZlX2NzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
c3RkOjptYXA8cmV2aXNpb25faWQsIGJvb3N0OjpzaGFyZWRfcHRyPGNoYW5nZV9zZXQ+ID4gJiBw
YXJ0aWFsX2NzZXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PHJl
dmlzaW9uX2lkPiAmIHZpc2l0ZWRfbm9kZXMpCnsKCiAgaWYgKGFuY2VzdG9yID09IGNoaWxkKQog
ICAgcmV0dXJuIHRydWU7CgogIHZpc2l0ZWRfbm9kZXMuaW5zZXJ0KGNoaWxkKTsKCiAgYm9vbCBy
ZWxldmFudF9jaGlsZCA9IGZhbHNlOwoKICByZXZpc2lvbl9zZXQgcmV2OwogIGFwcC5kYi5nZXRf
cmV2aXNpb24oY2hpbGQsIHJldik7CgogIEwoRigiZXhwbG9yaW5nIGNoYW5nZXNldHMgZnJvbSBw
YXJlbnRzIG9mICVzLCBzZWVraW5nIHRvd2FyZHMgJXNcbiIpIAogICAgJSBjaGlsZCAlIGFuY2Vz
dG9yKTsKCiAgZm9yKGVkZ2VfbWFwOjpjb25zdF9pdGVyYXRvciBpID0gcmV2LmVkZ2VzLmJlZ2lu
KCk7IGkgIT0gcmV2LmVkZ2VzLmVuZCgpOyArK2kpCiAgICB7CiAgICAgIGJvb2wgcmVsZXZhbnRf
cGFyZW50ID0gZmFsc2U7CiAgICAgIHJldmlzaW9uX2lkIGN1cnJfcGFyZW50ID0gZWRnZV9vbGRf
cmV2aXNpb24oaSk7CgogICAgICBpZiAoY3Vycl9wYXJlbnQuaW5uZXIoKSgpLmVtcHR5KCkpCiAg
ICAgICAgY29udGludWU7CgogICAgICBjaGFuZ2Vfc2V0IGNzZXRfdG9fY3Vycl9wYXJlbnQ7Cgog
ICAgICBMKEYoImNvbnNpZGVyaW5nIHBhcmVudCAlcyBvZiAlc1xuIikgJSBjdXJyX3BhcmVudCAl
IGNoaWxkKTsKCiAgICAgIHN0ZDo6bWFwPHJldmlzaW9uX2lkLCBib29zdDo6c2hhcmVkX3B0cjxj
aGFuZ2Vfc2V0PiA+Ojpjb25zdF9pdGVyYXRvciBqID0gCiAgICAgICAgcGFydGlhbF9jc2V0cy5m
aW5kKGN1cnJfcGFyZW50KTsKICAgICAgaWYgKGogIT0gcGFydGlhbF9jc2V0cy5lbmQoKSkgCiAg
ICAgICAgewogICAgICAgICAgLy8gYSByZWN1cnNpdmUgY2FsbCBoYXMgdHJhdmVyc2VkIHRoaXMg
cGFyZW50IGJlZm9yZSBhbmQgYnVpbHQgYW4KICAgICAgICAgIC8vIGV4aXN0aW5nIGNzZXQuIGp1
c3QgcmV1c2UgdGhhdCByYXRoZXIgdGhhbiByZS10cmF2ZXJzaW5nCiAgICAgICAgICBjc2V0X3Rv
X2N1cnJfcGFyZW50ID0gKihqLT5zZWNvbmQpOwogICAgICAgICAgcmVsZXZhbnRfcGFyZW50ID0g
dHJ1ZTsKICAgICAgICB9CiAgICAgIGVsc2UgaWYgKHZpc2l0ZWRfbm9kZXMuZmluZChjdXJyX3Bh
cmVudCkgIT0gdmlzaXRlZF9ub2Rlcy5lbmQoKSkKICAgICAgICB7CiAgICAgICAgICAvLyBhIHJl
Y3Vyc2l2ZSBjYWxsIGhhcyB0cmF2ZXJzZWQgdGhpcyBwYXJlbnQsIGJ1dCB0aGVyZSB3YXMgbm8K
ICAgICAgICAgIC8vIHBhdGggZnJvbSBpdCB0byB0aGUgcm9vdCwgc28gdGhlIHBhcmVudCBpcyBp
cnJlbGV2YW50LiBza2lwLgogICAgICAgICAgcmVsZXZhbnRfcGFyZW50ID0gZmFsc2U7CiAgICAg
ICAgfQogICAgICBlbHNlCiAgICAgICAgcmVsZXZhbnRfcGFyZW50ID0gY2FsY3VsYXRlX2NoYW5n
ZV9zZXRzX3JlY3Vyc2l2ZShhbmNlc3RvciwgY3Vycl9wYXJlbnQsIGFwcCwgCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc2V0X3RvX2N1
cnJfcGFyZW50LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHBhcnRpYWxfY3NldHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXNpdGVkX25vZGVzKTsKCiAgICAgIGlmIChy
ZWxldmFudF9wYXJlbnQpCiAgICAgICAgewogICAgICAgICAgTChGKCJyZXZpc2lvbiAlcyBpcyBy
ZWxldmFudCwgY29tcG9zaW5nIHdpdGggZWRnZSB0byAlc1xuIikgCiAgICAgICAgICAgICUgY3Vy
cl9wYXJlbnQgJSBjaGlsZCk7CiAgICAgICAgICBjb25jYXRlbmF0ZV9jaGFuZ2Vfc2V0cyhjc2V0
X3RvX2N1cnJfcGFyZW50LCBlZGdlX2NoYW5nZXMoaSksIGN1bXVsYXRpdmVfY3NldCk7CiAgICAg
ICAgICByZWxldmFudF9jaGlsZCA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAg
ICAgIGVsc2UKICAgICAgICBMKEYoInBhcmVudCAlcyBvZiAlcyBpcyBub3QgcmVsZXZhbnRcbiIp
ICUgY3Vycl9wYXJlbnQgJSBjaGlsZCk7CiAgICB9CgogIC8vIHN0b3JlIHRoZSBwYXJ0aWFsIGVk
Z2UgZnJvbSBhbmNlc3RvciAtPiBjaGlsZCwgc28gdGhhdCBpZiBhbnlvbmUKICAvLyByZS10cmF2
ZXJzZXMgdGhpcyBlZGdlIHRoZXknbGwganVzdCBmZXRjaCBmcm9tIHRoZSBwYXJ0aWFsX2VkZ2Vz
CiAgLy8gY2FjaGUuCiAgaWYgKHJlbGV2YW50X2NoaWxkKQogICAgcGFydGlhbF9jc2V0cy5pbnNl
cnQoc3RkOjptYWtlX3BhaXIoY2hpbGQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8Y2hhbmdlX3NldD4KICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIChuZXcgY2hhbmdlX3NldChjdW11bGF0aXZlX2NzZXQpKSkp
OwogIAogIHJldHVybiByZWxldmFudF9jaGlsZDsKfQoKdm9pZCAKY2FsY3VsYXRlX2NvbXBvc2l0
ZV9jaGFuZ2Vfc2V0KHJldmlzaW9uX2lkIGNvbnN0ICYgYW5jZXN0b3IsCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICByZXZpc2lvbl9pZCBjb25zdCAmIGNoaWxkLAogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgYXBwX3N0YXRlICYgYXBwLAogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgY2hhbmdlX3NldCAmIGNvbXBvc2VkKQp7CiAgTChGKCJjYWxjdWxhdGluZyBjb21w
b3NpdGUgY2hhbmdlc2V0IGJldHdlZW4gJXMgYW5kICVzXG4iKQogICAgJSBhbmNlc3RvciAlIGNo
aWxkKTsKICBzdGQ6OnNldDxyZXZpc2lvbl9pZD4gdmlzaXRlZDsKICBzdGQ6Om1hcDxyZXZpc2lv
bl9pZCwgYm9vc3Q6OnNoYXJlZF9wdHI8Y2hhbmdlX3NldD4gPiBwYXJ0aWFsOwogIGNhbGN1bGF0
ZV9jaGFuZ2Vfc2V0c19yZWN1cnNpdmUoYW5jZXN0b3IsIGNoaWxkLCBhcHAsIGNvbXBvc2VkLCBw
YXJ0aWFsLCB2aXNpdGVkKTsKfQoKLy8gbWlncmF0aW9uIHN0dWZmCi8vCi8vIEZJWE1FOiB0aGVz
ZSBhcmUgdGVtcG9yYXJ5IGZ1bmN0aW9ucywgb25jZSB3ZSd2ZSBkb25lIHRoZSBtaWdyYXRpb24g
dG8KLy8gcmV2aXNpb25zIC8gY2hhbmdlc2V0cywgd2UgY2FuIHJlbW92ZSB0aGVtLgoKc3RhdGlj
IHZvaWQgCmFuYWx5emVfbWFuaWZlc3RfY2hhbmdlcyhhcHBfc3RhdGUgJiBhcHAsCiAgICAgICAg
ICAgICAgICAgICAgICAgICBtYW5pZmVzdF9pZCBjb25zdCAmIHBhcmVudCwgCiAgICAgICAgICAg
ICAgICAgICAgICAgICBtYW5pZmVzdF9pZCBjb25zdCAmIGNoaWxkLCAKICAgICAgICAgICAgICAg
ICAgICAgICAgIGNoYW5nZV9zZXQgJiBjcykKewogIG1hbmlmZXN0X21hcCBtX3BhcmVudCwgbV9j
aGlsZDsKICBhcHAuZGIuZ2V0X21hbmlmZXN0KHBhcmVudCwgbV9wYXJlbnQpOwogIGFwcC5kYi5n
ZXRfbWFuaWZlc3QoY2hpbGQsIG1fY2hpbGQpOwoKICBmb3IgKG1hbmlmZXN0X21hcDo6Y29uc3Rf
aXRlcmF0b3IgaSA9IG1fcGFyZW50LmJlZ2luKCk7IAogICAgICAgaSAhPSBtX3BhcmVudC5lbmQo
KTsgKytpKQogICAgewogICAgICBtYW5pZmVzdF9tYXA6OmNvbnN0X2l0ZXJhdG9yIGogPSBtX2No
aWxkLmZpbmQobWFuaWZlc3RfZW50cnlfcGF0aChpKSk7CiAgICAgIGlmIChqID09IG1fY2hpbGQu
ZW5kKCkpCiAgICAgICAgY3MuZGVsZXRlX2ZpbGUobWFuaWZlc3RfZW50cnlfcGF0aChpKSk7CiAg
ICAgIGVsc2UgaWYgKCEgKG1hbmlmZXN0X2VudHJ5X2lkKGkpID09IG1hbmlmZXN0X2VudHJ5X2lk
KGopKSkKICAgICAgICB7CiAgICAgICAgICBjcy5hcHBseV9kZWx0YShtYW5pZmVzdF9lbnRyeV9w
YXRoKGkpLAogICAgICAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RfZW50cnlfaWQoaSksIAog
ICAgICAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RfZW50cnlfaWQoaikpOwogICAgICAgIH0g
ICAgICAgCiAgICB9CiAgZm9yIChtYW5pZmVzdF9tYXA6OmNvbnN0X2l0ZXJhdG9yIGkgPSBtX2No
aWxkLmJlZ2luKCk7IAogICAgICAgaSAhPSBtX2NoaWxkLmVuZCgpOyArK2kpCiAgICB7CiAgICAg
IG1hbmlmZXN0X21hcDo6Y29uc3RfaXRlcmF0b3IgaiA9IG1fcGFyZW50LmZpbmQobWFuaWZlc3Rf
ZW50cnlfcGF0aChpKSk7CiAgICAgIGlmIChqID09IG1fcGFyZW50LmVuZCgpKQogICAgICAgIGNz
LmFkZF9maWxlKG1hbmlmZXN0X2VudHJ5X3BhdGgoaSksCiAgICAgICAgICAgICAgICAgICAgbWFu
aWZlc3RfZW50cnlfaWQoaSkpOwogICAgfQp9CgpzdGF0aWMgcmV2aXNpb25faWQKY29uc3RydWN0
X3JldmlzaW9ucyhhcHBfc3RhdGUgJiBhcHAsCiAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3Rf
aWQgY29uc3QgJiBjaGlsZCwKICAgICAgICAgICAgICAgICAgICBzdGQ6Om11bHRpbWFwPCBtYW5p
ZmVzdF9pZCwgbWFuaWZlc3RfaWQgPiBjb25zdCAmIGFuY2VzdHJ5LAogICAgICAgICAgICAgICAg
ICAgIHN0ZDo6bWFwPG1hbmlmZXN0X2lkLCByZXZpc2lvbl9pZD4gJiBtYXBwZWQpCnsKICByZXZp
c2lvbl9zZXQgcmV2OwogIHR5cGVkZWYgc3RkOjptdWx0aW1hcDwgbWFuaWZlc3RfaWQsIG1hbmlm
ZXN0X2lkID46OmNvbnN0X2l0ZXJhdG9yIGNpOwogIHN0ZDo6cGFpcjxjaSxjaT4gcmFuZ2UgPSBh
bmNlc3RyeS5lcXVhbF9yYW5nZShjaGlsZCk7CiAgZm9yIChjaSBpID0gcmFuZ2UuZmlyc3Q7IGkg
IT0gcmFuZ2Uuc2Vjb25kOyArK2kpCiAgICB7CiAgICAgIG1hbmlmZXN0X2lkIHBhcmVudChpLT5z
ZWNvbmQpOwogICAgICByZXZpc2lvbl9pZCBwYXJlbnRfcmlkOwogICAgICBzdGQ6Om1hcDxtYW5p
ZmVzdF9pZCwgcmV2aXNpb25faWQ+Ojpjb25zdF9pdGVyYXRvciBqID0gbWFwcGVkLmZpbmQocGFy
ZW50KTsKCiAgICAgIGlmIChqICE9IG1hcHBlZC5lbmQoKSkKICAgICAgICBwYXJlbnRfcmlkID0g
ai0+c2Vjb25kOwogICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgcGFyZW50X3JpZCA9IGNv
bnN0cnVjdF9yZXZpc2lvbnMoYXBwLCBwYXJlbnQsIGFuY2VzdHJ5LCBtYXBwZWQpOwogICAgICAg
ICAgUChGKCJpbnNlcnRpbmcgbWFwcGluZyAlZCA6ICVzIC0+ICVzXG4iKSAlIG1hcHBlZC5zaXpl
KCkgJSBwYXJlbnQgJSBwYXJlbnRfcmlkKTs7CiAgICAgICAgICBtYXBwZWQuaW5zZXJ0KHN0ZDo6
bWFrZV9wYWlyKHBhcmVudCwgcGFyZW50X3JpZCkpOwogICAgICAgIH0KICAgICAgCiAgICAgIGNo
YW5nZV9zZXQgY3M7CiAgICAgIGFuYWx5emVfbWFuaWZlc3RfY2hhbmdlcyhhcHAsIHBhcmVudCwg
Y2hpbGQsIGNzKTsKICAgICAgcmV2LmVkZ2VzLmluc2VydChzdGQ6Om1ha2VfcGFpcihwYXJlbnRf
cmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWly
KHBhcmVudCwgY3MpKSk7CiAgICB9IAoKICByZXZpc2lvbl9pZCByaWQ7CiAgaWYgKHJldi5lZGdl
cy5lbXB0eSgpKQogICAgewogICAgICBQKEYoImlnbm9yaW5nIGVtcHR5IHJldmlzaW9uIGZvciBt
YW5pZmVzdCAlc1xuIikgJSBjaGlsZCk7ICAKICAgICAgcmV0dXJuIHJpZDsKICAgIH0KCiAgcmV2
Lm5ld19tYW5pZmVzdCA9IGNoaWxkOwogIGNhbGN1bGF0ZV9pZGVudChyZXYsIHJpZCk7CgogIGlm
ICghYXBwLmRiLnJldmlzaW9uX2V4aXN0cyAocmlkKSkKICAgIHsKICAgICAgUChGKCJtYXBwaW5n
IG1hbmlmZXN0ICVzIHRvIHJldmlzaW9uICVzXG4iKSAlIGNoaWxkICUgcmlkKTsKICAgICAgYXBw
LmRiLnB1dF9yZXZpc2lvbihyaWQsIHJldik7CiAgICB9CiAgZWxzZQogICAgewogICAgICBQKEYo
InNraXBwaW5nIGFkZGl0aW9uYWwgcGF0aCB0byByZXZpc2lvbiAlc1xuIikgJSByaWQpOwogICAg
fQoKICAvLyBub3cgaG9pc3QgYWxsIHRoZSBpbnRlcmVzdGluZyBjZXJ0cyB1cCB0byB0aGUgcmV2
aXNpb24KICBzdGQ6OnNldDxjZXJ0X25hbWU+IGNuYW1lczsKICBjbmFtZXMuaW5zZXJ0KGNlcnRf
bmFtZShicmFuY2hfY2VydF9uYW1lKSk7CiAgY25hbWVzLmluc2VydChjZXJ0X25hbWUoZGF0ZV9j
ZXJ0X25hbWUpKTsKICBjbmFtZXMuaW5zZXJ0KGNlcnRfbmFtZShhdXRob3JfY2VydF9uYW1lKSk7
CiAgY25hbWVzLmluc2VydChjZXJ0X25hbWUodGFnX2NlcnRfbmFtZSkpOwogIGNuYW1lcy5pbnNl
cnQoY2VydF9uYW1lKGNoYW5nZWxvZ19jZXJ0X25hbWUpKTsKICBjbmFtZXMuaW5zZXJ0KGNlcnRf
bmFtZShjb21tZW50X2NlcnRfbmFtZSkpOwogIGNuYW1lcy5pbnNlcnQoY2VydF9uYW1lKHRlc3Ry
ZXN1bHRfY2VydF9uYW1lKSk7CgogIHN0ZDo6dmVjdG9yPCBtYW5pZmVzdDxjZXJ0PiA+IHRtcDsK
ICBhcHAuZGIuZ2V0X21hbmlmZXN0X2NlcnRzKGNoaWxkLCB0bXApOwogIGVyYXNlX2JvZ3VzX2Nl
cnRzKHRtcCwgYXBwKTsgICAgICAKICBmb3IgKHN0ZDo6dmVjdG9yPCBtYW5pZmVzdDxjZXJ0PiA+
Ojpjb25zdF9pdGVyYXRvciBpID0gdG1wLmJlZ2luKCk7CiAgICAgICBpICE9IHRtcC5lbmQoKTsg
KytpKQogICAgewogICAgICBpZiAoY25hbWVzLmZpbmQoaS0+aW5uZXIoKS5uYW1lKSA9PSBjbmFt
ZXMuZW5kKCkpCiAgICAgICAgY29udGludWU7CiAgICAgIGNlcnQgbmV3X2NlcnQ7CiAgICAgIGNl
cnRfdmFsdWUgdHY7CiAgICAgIGRlY29kZV9iYXNlNjQoaS0+aW5uZXIoKS52YWx1ZSwgdHYpOwog
ICAgICBtYWtlX3NpbXBsZV9jZXJ0KHJpZC5pbm5lcigpLCBpLT5pbm5lcigpLm5hbWUsIHR2LCBh
cHAsIG5ld19jZXJ0KTsKICAgICAgaWYgKCEgYXBwLmRiLnJldmlzaW9uX2NlcnRfZXhpc3RzKHJl
dmlzaW9uPGNlcnQ+KG5ld19jZXJ0KSkpCiAgICAgICAgYXBwLmRiLnB1dF9yZXZpc2lvbl9jZXJ0
KHJldmlzaW9uPGNlcnQ+KG5ld19jZXJ0KSk7CiAgICB9CiAgcmV0dXJuIHJpZDsgIAp9CgoKdm9p
ZCAKYnVpbGRfY2hhbmdlc2V0cyhhcHBfc3RhdGUgJiBhcHApCnsKICBzdGQ6OnZlY3RvcjwgbWFu
aWZlc3Q8Y2VydD4gPiB0bXA7CiAgYXBwLmRiLmdldF9tYW5pZmVzdF9jZXJ0cyhjZXJ0X25hbWUo
ImFuY2VzdG9yIiksIHRtcCk7CiAgZXJhc2VfYm9ndXNfY2VydHModG1wLCBhcHApOwoKICBzdGQ6
Om11bHRpbWFwPCBtYW5pZmVzdF9pZCwgbWFuaWZlc3RfaWQgPiBhbmNlc3RyeTsKICBzdGQ6OnNl
dDxtYW5pZmVzdF9pZD4gaGVhZHM7CiAgc3RkOjpzZXQ8bWFuaWZlc3RfaWQ+IHRvdGFsOwogIAog
IGZvciAoc3RkOjp2ZWN0b3I8IG1hbmlmZXN0PGNlcnQ+ID46OmNvbnN0X2l0ZXJhdG9yIGkgPSB0
bXAuYmVnaW4oKTsKICAgICAgIGkgIT0gdG1wLmVuZCgpOyArK2kpCiAgICB7CiAgICAgIGNlcnRf
dmFsdWUgdHY7CiAgICAgIGRlY29kZV9iYXNlNjQoaS0+aW5uZXIoKS52YWx1ZSwgdHYpOwogICAg
ICBtYW5pZmVzdF9pZCBjaGlsZCwgcGFyZW50OwogICAgICBjaGlsZCA9IGktPmlubmVyKCkuaWRl
bnQ7CiAgICAgIHBhcmVudCA9IGhleGVuYzxpZD4odHYoKSk7CiAgICAgIGhlYWRzLmluc2VydChj
aGlsZCk7CiAgICAgIGhlYWRzLmVyYXNlKHBhcmVudCk7CiAgICAgIHRvdGFsLmluc2VydChjaGls
ZCk7CiAgICAgIHRvdGFsLmluc2VydChwYXJlbnQpOwogICAgICBhbmNlc3RyeS5pbnNlcnQoc3Rk
OjptYWtlX3BhaXIoY2hpbGQsIHBhcmVudCkpOwogICAgfQogIAogIFAoRigiZm91bmQgYSB0b3Rh
bCBvZiAlZCBtYW5pZmVzdHNcbiIpICUgdG90YWwuc2l6ZSgpKTsKCiAgdHJhbnNhY3Rpb25fZ3Vh
cmQgZ3VhcmQoYXBwLmRiKTsKICBzdGQ6Om1hcDxtYW5pZmVzdF9pZCwgcmV2aXNpb25faWQ+IG1h
cHBlZDsKICBmb3IgKHN0ZDo6c2V0PG1hbmlmZXN0X2lkPjo6Y29uc3RfaXRlcmF0b3IgaSA9IGhl
YWRzLmJlZ2luKCk7CiAgICAgICBpICE9IGhlYWRzLmVuZCgpOyArK2kpCiAgICB7CiAgICAgIGNv
bnN0cnVjdF9yZXZpc2lvbnMoYXBwLCAqaSwgYW5jZXN0cnksIG1hcHBlZCk7CiAgICB9CiAgZ3Vh
cmQuY29tbWl0KCk7Cn0KCgovLyBpL28gc3R1ZmYKCnN0ZDo6c3RyaW5nIHJldmlzaW9uX2ZpbGVf
bmFtZSgicmV2aXNpb24iKTsKCm5hbWVzcGFjZSAKewogIG5hbWVzcGFjZSBzeW1zCiAgewogICAg
c3RkOjpzdHJpbmcgY29uc3Qgb2xkX3JldmlzaW9uKCJvbGRfcmV2aXNpb24iKTsKICAgIHN0ZDo6
c3RyaW5nIGNvbnN0IG5ld19tYW5pZmVzdCgibmV3X21hbmlmZXN0Iik7CiAgICBzdGQ6OnN0cmlu
ZyBjb25zdCBvbGRfbWFuaWZlc3QoIm9sZF9tYW5pZmVzdCIpOwogIH0KfQoKCnZvaWQgCnByaW50
X2VkZ2UoYmFzaWNfaW86OnByaW50ZXIgJiBwcmludGVyLAogICAgICAgICAgIGVkZ2VfZW50cnkg
Y29uc3QgJiBlKQp7ICAgICAgIAogIGJhc2ljX2lvOjpzdGFuemEgc3Q7CiAgc3QucHVzaF9oZXhf
cGFpcihzeW1zOjpvbGRfcmV2aXNpb24sIGVkZ2Vfb2xkX3JldmlzaW9uKGUpLmlubmVyKCkoKSk7
CiAgc3QucHVzaF9oZXhfcGFpcihzeW1zOjpvbGRfbWFuaWZlc3QsIGVkZ2Vfb2xkX21hbmlmZXN0
KGUpLmlubmVyKCkoKSk7CiAgcHJpbnRlci5wcmludF9zdGFuemEoc3QpOwogIHByaW50X2NoYW5n
ZV9zZXQocHJpbnRlciwgZWRnZV9jaGFuZ2VzKGUpKTsgCn0KCgp2b2lkIApwcmludF9yZXZpc2lv
bihiYXNpY19pbzo6cHJpbnRlciAmIHByaW50ZXIsCiAgICAgICAgICAgICAgIHJldmlzaW9uX3Nl
dCBjb25zdCAmIHJldikKewogIGJhc2ljX2lvOjpzdGFuemEgc3Q7IAogIHN0LnB1c2hfaGV4X3Bh
aXIoc3ltczo6bmV3X21hbmlmZXN0LCByZXYubmV3X21hbmlmZXN0LmlubmVyKCkoKSk7CiAgcHJp
bnRlci5wcmludF9zdGFuemEoc3QpOwogIGZvciAoZWRnZV9tYXA6OmNvbnN0X2l0ZXJhdG9yIGVk
Z2UgPSByZXYuZWRnZXMuYmVnaW4oKTsKICAgICAgIGVkZ2UgIT0gcmV2LmVkZ2VzLmVuZCgpOyAr
K2VkZ2UpCiAgICBwcmludF9lZGdlKHByaW50ZXIsICplZGdlKTsKfQoKCnZvaWQgCnBhcnNlX2Vk
Z2UoYmFzaWNfaW86OnBhcnNlciAmIHBhcnNlciwKICAgICAgICAgICBlZGdlX21hcCAmIGVzKQp7
CiAgY2hhbmdlX3NldCBjczsKICBtYW5pZmVzdF9pZCBvbGRfbWFuOwogIHJldmlzaW9uX2lkIG9s
ZF9yZXY7CiAgc3RkOjpzdHJpbmcgdG1wOwogIAogIHBhcnNlci5lc3ltKHN5bXM6Om9sZF9yZXZp
c2lvbik7CiAgcGFyc2VyLmhleCh0bXApOwogIG9sZF9yZXYgPSByZXZpc2lvbl9pZCh0bXApOwog
IAogIHBhcnNlci5lc3ltKHN5bXM6Om9sZF9tYW5pZmVzdCk7CiAgcGFyc2VyLmhleCh0bXApOwog
IG9sZF9tYW4gPSBtYW5pZmVzdF9pZCh0bXApOwogIAogIHBhcnNlX2NoYW5nZV9zZXQocGFyc2Vy
LCBjcyk7CgogIGVzLmluc2VydChzdGQ6Om1ha2VfcGFpcihvbGRfcmV2LCBzdGQ6Om1ha2VfcGFp
cihvbGRfbWFuLCBjcykpKTsKfQoKCnZvaWQgCnBhcnNlX3JldmlzaW9uKGJhc2ljX2lvOjpwYXJz
ZXIgJiBwYXJzZXIsCiAgICAgICAgICAgICAgIHJldmlzaW9uX3NldCAmIHJldikKewogIHJldi5l
ZGdlcy5jbGVhcigpOwogIHN0ZDo6c3RyaW5nIHRtcDsKICBwYXJzZXIuZXN5bShzeW1zOjpuZXdf
bWFuaWZlc3QpOwogIHBhcnNlci5oZXgodG1wKTsKICByZXYubmV3X21hbmlmZXN0ID0gbWFuaWZl
c3RfaWQodG1wKTsKICB3aGlsZSAocGFyc2VyLnN5bXAoc3ltczo6b2xkX3JldmlzaW9uKSkKICAg
IHBhcnNlX2VkZ2UocGFyc2VyLCByZXYuZWRnZXMpOwp9Cgp2b2lkIApyZWFkX3JldmlzaW9uX3Nl
dChkYXRhIGNvbnN0ICYgZGF0LAogICAgICAgICAgICAgICAgICByZXZpc2lvbl9zZXQgJiByZXYp
CnsKICBzdGQ6OmlzdHJpbmdzdHJlYW0gaXNzKGRhdCgpKTsKICBiYXNpY19pbzo6aW5wdXRfc291
cmNlIHNyYyhpc3MsICJyZXZpc2lvbiIpOwogIGJhc2ljX2lvOjp0b2tlbml6ZXIgdG9rKHNyYyk7
CiAgYmFzaWNfaW86OnBhcnNlciBwYXJzKHRvayk7CiAgcGFyc2VfcmV2aXNpb24ocGFycywgcmV2
KTsKfQoKdm9pZCAKcmVhZF9yZXZpc2lvbl9zZXQocmV2aXNpb25fZGF0YSBjb25zdCAmIGRhdCwK
ICAgICAgICAgICAgICAgICAgcmV2aXNpb25fc2V0ICYgcmV2KQp7CiAgZGF0YSB1bnBhY2tlZDsK
ICB1bnBhY2soZGF0LmlubmVyKCksIHVucGFja2VkKTsKICByZWFkX3JldmlzaW9uX3NldCh1bnBh
Y2tlZCwgcmV2KTsKfQoKdm9pZAp3cml0ZV9yZXZpc2lvbl9zZXQocmV2aXNpb25fc2V0IGNvbnN0
ICYgcmV2LAogICAgICAgICAgICAgICAgICAgZGF0YSAmIGRhdCkKewogIHN0ZDo6b3N0cmluZ3N0
cmVhbSBvc3M7CiAgYmFzaWNfaW86OnByaW50ZXIgcHIob3NzKTsKICBwcmludF9yZXZpc2lvbihw
ciwgcmV2KTsKICBkYXQgPSBkYXRhKG9zcy5zdHIoKSk7Cn0KCnZvaWQKd3JpdGVfcmV2aXNpb25f
c2V0KHJldmlzaW9uX3NldCBjb25zdCAmIHJldiwKICAgICAgICAgICAgICAgICAgIHJldmlzaW9u
X2RhdGEgJiBkYXQpCnsKICBkYXRhIGQ7CiAgd3JpdGVfcmV2aXNpb25fc2V0KHJldiwgZCk7CiAg
YmFzZTY0PCBnemlwPGRhdGE+ID4gcGFja2VkOwogIHBhY2soZCwgcGFja2VkKTsKICBkYXQgPSBy
ZXZpc2lvbl9kYXRhKHBhY2tlZCk7Cn0KCiNpZmRlZiBCVUlMRF9VTklUX1RFU1RTCiNpbmNsdWRl
ICJ1bml0X3Rlc3RzLmhoIgojaW5jbHVkZSAic2FuaXR5LmhoIgoKc3RhdGljIHZvaWQgCnJldmlz
aW9uX3Rlc3QoKQp7Cn0KCnZvaWQgCmFkZF9yZXZpc2lvbl90ZXN0cyh0ZXN0X3N1aXRlICogc3Vp
dGUpCnsKICBJKHN1aXRlKTsKICBzdWl0ZS0+YWRkKEJPT1NUX1RFU1RfQ0FTRSgmcmV2aXNpb25f
dGVzdCkpOwp9CgoKI2VuZGlmIC8vIEJVSUxEX1VOSVRfVEVTVFMK
_ATEOF


cat >correct.b64 <<'_ATEOF'
Ly8gY29weXJpZ2h0IChDKSAyMDA0IGdyYXlkb24gaG9hcmUgPGdyYXlkb25AcG9ib3guY29tPgov
LyBhbGwgcmlnaHRzIHJlc2VydmVkLgovLyBsaWNlbnNlZCB0byB0aGUgcHVibGljIHVuZGVyIHRo
ZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCAoPj0gMikKLy8gc2VlIHRoZSBmaWxlIENPUFlJTkcgZm9y
IGRldGFpbHMKCiNpbmNsdWRlIDxjY3R5cGU+CiNpbmNsdWRlIDxjc3RkbGliPgojaW5jbHVkZSA8
aW9zdHJlYW0+CiNpbmNsdWRlIDxtYXA+CiNpbmNsdWRlIDxzZXQ+CiNpbmNsdWRlIDxzc3RyZWFt
PgojaW5jbHVkZSA8c3RyaW5nPgoKI2luY2x1ZGUgPGJvb3N0L2xleGljYWxfY2FzdC5ocHA+CiNp
bmNsdWRlIDxib29zdC9keW5hbWljX2JpdHNldC5ocHA+CiNpbmNsdWRlIDxib29zdC9zaGFyZWRf
cHRyLmhwcD4KCiNpbmNsdWRlICJiYXNpY19pby5oaCIKI2luY2x1ZGUgImNoYW5nZV9zZXQuaGgi
CiNpbmNsdWRlICJjb25zdGFudHMuaGgiCiNpbmNsdWRlICJyZXZpc2lvbi5oaCIKI2luY2x1ZGUg
InNhbml0eS5oaCIKI2luY2x1ZGUgInRyYW5zZm9ybXMuaGgiCiNpbmNsdWRlICJ2b2NhYi5oaCIK
CgovLyBjYWxjdWxhdGluZyBsZWFzdCBjb21tb24gYW5jZXN0b3JzIGlzIGEgZGVsaWNhdGUgdGhp
bmcuCi8vIAovLyBpdCB0dXJucyBvdXQgdGhhdCB3ZSBjYW5ub3QgY2hvb3NlIHRoZSBzaW1wbGUg
ImxlYXN0IGNvbW1vbiBhbmNlc3RvciIKLy8gZm9yIHB1cnBvc2VzIG9mIGEgbWVyZ2UsIGJlY2F1
c2UgaXQgaXMgcG9zc2libGUgdGhhdCB0aGVyZSBhcmUgdHdvCi8vIGVxdWFsbHkgcmVhY2hhYmxl
IGNvbW1vbiBhbmNlc3RvcnMsIGFuZCB0aGlzIHByb2R1Y2VzIGFtYmlndWl0eSBpbiB0aGUKLy8g
bWVyZ2UuIHRoZSByZXN1bHQgLS0gaW4gYSBwYXRob2xvZ2ljYWwgY2FzZSAtLSBpcyBzaWxlbnRs
eSBhY2NlcHRpbmcgb25lCi8vIHNldCBvZiBlZGl0cyB3aGlsZSBkaXNjYXJkaW5nIGFub3RoZXI7
IG5vdCBleGFjdGx5IHdoYXQgeW91IHdhbnQgYQovLyB2ZXJzaW9uIGNvbnRyb2wgdG9vbCB0byBk
by4KLy8KLy8gYSBjb25zZXJ2YXRpdmUgYXBwcm94aW1hdGlvbiBpcyB3aGF0IHdlJ2xsIGNhbGwg
YSAic3ViZ3JhcGggcmVjdXJyaW5nIgovLyBMQ0EgYWxnb3JpdGhtLiB0aGlzIGlzIHNvbWV3aGF0
IGxpa2UgbG9jYXRpbmcgdGhlIGxlYXN0IGNvbW1vbiBkb21pbmF0b3IKLy8gbm9kZSwgYnV0IG5v
dCBxdWl0ZS4gaXQgaXMgYWN0dWFsbHkganVzdCBhIHZhbmlsbGEgTENBIHNlYXJjaCwgZXhjZXB0
Ci8vIHRoYXQgYW55IHRpbWUgdGhlcmUncyBhIGZvcmsgKGEgaGlzdG9yaWNhbCBtZXJnZSBsb29r
cyBsaWtlIGEgZm9yayBmcm9tCi8vIG91ciBwZXJzcGVjdGl2ZSwgd29ya2luZyBiYWNrd2FyZHMg
ZnJvbSBjaGlsZHJlbiB0byBwYXJlbnRzKSBpdCByZWR1Y2VzCi8vIHRoZSBmb3JrIHRvIGEgY29t
bW9uIHBhcmVudCB2aWEgYSBzZXF1ZW5jZSBvZiBwYWlyd2lzZSByZWN1cnNpdmUgY2FsbHMKLy8g
dG8gaXRzZWxmIGJlZm9yZSBwcm9jZWVkaW5nLiB0aGlzIHdpbGwgYWx3YXlzIHJlc29sdmUgdG8g
YSBjb21tb24gcGFyZW50Ci8vIHdpdGggbm8gYW1iaWd1aXR5LCB1bmxlc3MgaXQgZmFsbHMgb2Zm
IHRoZSByb290IG9mIHRoZSBncmFwaC4KLy8KLy8gdW5mb3J0dW5hdGVseSB0aGUgc3ViZ3JhcGgg
cmVjdXJyaW5nIGFsZ29yaXRobSBzb21ldGltZXMgZ29lcyB0b28gZmFyCi8vIGJhY2sgaW4gaGlz
dG9yeSAtLSBmb3IgZXhhbXBsZSBpZiB0aGVyZSBpcyBhbiB1bmFtYmlndW91cyBwcm9wYWdhdGUg
ZnJvbQovLyBvbmUgYnJhbmNoIHRvIGFub3RoZXIsIHRoZSBlbnRpcmUgc3ViZ3JhcGggcHJlY2Vl
ZGluZyB0aGUgcHJvcGFnYXRlIG9uCi8vIHRoZSByZWNpcGllbnQgYnJhbmNoIGlzIGVsaWRlZCwg
c2luY2UgaXQgaXMgYSBtZXJnZS4KLy8KLy8gb3VyIGN1cnJlbnQgaHlwb3RoZXNpcyBpcyB0aGF0
IHRoZSAqZXhhY3QqIGNvbmRpdGlvbiB3ZSdyZSBsb29raW5nIGZvciwKLy8gd2hlbiBkb2luZyBh
IG1lcmdlLCBpcyB0aGUgbGVhc3Qgbm9kZSB3aGljaCBkb21pbmF0ZXMgb25lIHNpZGUgb2YgdGhl
Ci8vIG1lcmdlIGFuZCBpcyBhbiBhbmNlc3RvciBvZiB0aGUgb3RoZXIuCgp0eXBlZGVmIHVuc2ln
bmVkIGxvbmcgY3R4Owp0eXBlZGVmIGJvb3N0OjpkeW5hbWljX2JpdHNldDw+IGJpdG1hcDsKdHlw
ZWRlZiBib29zdDo6c2hhcmVkX3B0cjxiaXRtYXA+IHNoYXJlZF9iaXRtYXA7CgpzdGF0aWMgdm9p
ZCAKZW5zdXJlX3BhcmVudHNfbG9hZGVkKGN0eCBjaGlsZCwKICAgICAgICAgICAgICAgICAgICAg
IHN0ZDo6bWFwPGN0eCwgc2hhcmVkX2JpdG1hcD4gJiBwYXJlbnRzLAogICAgICAgICAgICAgICAg
ICAgICAgaW50ZXJuZXI8Y3R4PiAmIGludGVybiwKICAgICAgICAgICAgICAgICAgICAgIGFwcF9z
dGF0ZSAmIGFwcCkKewogIGlmIChwYXJlbnRzLmZpbmQoY2hpbGQpICE9IHBhcmVudHMuZW5kKCkp
CiAgICByZXR1cm47CgogIEwoRigibG9hZGluZyBwYXJlbnRzIGZvciBub2RlICVkXG4iKSAlIGNo
aWxkKTsKCiAgc3RkOjpzZXQ8cmV2aXNpb25faWQ+IGltbV9wYXJlbnRzOwogIGFwcC5kYi5nZXRf
cmV2aXNpb25fcGFyZW50cyhyZXZpc2lvbl9pZChpbnRlcm4ubG9va3VwKGNoaWxkKSksIGltbV9w
YXJlbnRzKTsKCiAgLy8gVGhlIG51bGwgcmV2aXNpb24gaXMgbm90IGEgcGFyZW50IGZvciBwdXJw
b3NlcyBvZiBmaW5kaW5nIGNvbW1vbgogIC8vIGFuY2VzdG9ycy4KICBmb3IgKHN0ZDo6c2V0PHJl
dmlzaW9uX2lkPjo6aXRlcmF0b3IgcCA9IGltbV9wYXJlbnRzLmJlZ2luKCk7CiAgICAgICBwICE9
IGltbV9wYXJlbnRzLmVuZCgpOyArK3ApCiAgICB7CiAgICAgIGlmIChudWxsX2lkKCpwKSkKICAg
ICAgICBpbW1fcGFyZW50cy5lcmFzZShwKTsKICAgIH0KICAgICAgICAgICAgICAKICBzaGFyZWRf
Yml0bWFwIGJpdHMgPSBzaGFyZWRfYml0bWFwKG5ldyBiaXRtYXAocGFyZW50cy5zaXplKCkpKTsK
ICAKICBmb3IgKHN0ZDo6c2V0PHJldmlzaW9uX2lkPjo6Y29uc3RfaXRlcmF0b3IgcCA9IGltbV9w
YXJlbnRzLmJlZ2luKCk7CiAgICAgICBwICE9IGltbV9wYXJlbnRzLmVuZCgpOyArK3ApCiAgICB7
CiAgICAgIGN0eCBwbiA9IGludGVybi5pbnRlcm4ocC0+aW5uZXIoKSgpKTsKICAgICAgTChGKCJw
YXJlbnQgJXMgLT4gbm9kZSAlZFxuIikgJSAqcCAlIHBuKTsKICAgICAgaWYgKHBuID49IGJpdHMt
PnNpemUoKSkgCiAgICAgICAgYml0cy0+cmVzaXplKHBuKzEpOwogICAgICBiaXRzLT5zZXQocG4p
OwogICAgfQogICAgCiAgcGFyZW50cy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY2hpbGQsIGJpdHMp
KTsKfQoKc3RhdGljIGJvb2wgCmV4cGFuZF9kb21pbmF0b3JzKHN0ZDo6bWFwPGN0eCwgc2hhcmVk
X2JpdG1hcD4gJiBwYXJlbnRzLAogICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxjdHgsIHNoYXJl
ZF9iaXRtYXA+ICYgZG9taW5hdG9ycywKICAgICAgICAgICAgICAgICAgaW50ZXJuZXI8Y3R4PiAm
IGludGVybiwKICAgICAgICAgICAgICAgICAgYXBwX3N0YXRlICYgYXBwKQp7CiAgYm9vbCBzb21l
dGhpbmdfY2hhbmdlZCA9IGZhbHNlOwogIHN0ZDo6dmVjdG9yPGN0eD4gbm9kZXM7CgogIG5vZGVz
LnJlc2VydmUoZG9taW5hdG9ycy5zaXplKCkpOwoKICAvLyBwYXNzIDEsIHB1bGwgb3V0IGFsbCB0
aGUgbm9kZSBudW1iZXJzIHdlJ3JlIGdvaW5nIHRvIHNjYW4gdGhpcyB0aW1lIGFyb3VuZAogIGZv
ciAoc3RkOjptYXA8Y3R4LCBzaGFyZWRfYml0bWFwPjo6Y29uc3RfaXRlcmF0b3IgZSA9IGRvbWlu
YXRvcnMuYmVnaW4oKTsgCiAgICAgICBlICE9IGRvbWluYXRvcnMuZW5kKCk7ICsrZSkKICAgIG5v
ZGVzLnB1c2hfYmFjayhlLT5maXJzdCk7CiAgCiAgLy8gcGFzcyAyLCB1cGRhdGUgYW55IG9mIHRo
ZSBkb21pbmF0b3IgZW50cmllcyB3ZSBjYW4KICBmb3IgKHN0ZDo6dmVjdG9yPGN0eD46OmNvbnN0
X2l0ZXJhdG9yIG4gPSBub2Rlcy5iZWdpbigpOyAKICAgICAgIG4gIT0gbm9kZXMuZW5kKCk7ICsr
bikKICAgIHsKICAgICAgc2hhcmVkX2JpdG1hcCBiaXRzID0gZG9taW5hdG9yc1sqbl07CiAgICAg
IGJpdG1hcCBzYXZlZCgqYml0cyk7CiAgICAgIGlmIChiaXRzLT5zaXplKCkgPD0gKm4pCiAgICAg
ICAgYml0cy0+cmVzaXplKCpuICsgMSk7CiAgICAgIGJpdHMtPnNldCgqbik7CiAgICAgIAogICAg
ICBlbnN1cmVfcGFyZW50c19sb2FkZWQoKm4sIHBhcmVudHMsIGludGVybiwgYXBwKTsKICAgICAg
c2hhcmVkX2JpdG1hcCBuX3BhcmVudHMgPSBwYXJlbnRzWypuXTsKICAgICAgCiAgICAgIGJpdG1h
cCBpbnRlcnNlY3Rpb24oYml0cy0+c2l6ZSgpKTsKICAgICAgCiAgICAgIGJvb2wgZmlyc3QgPSB0
cnVlOwogICAgICBmb3IgKHVuc2lnbmVkIGxvbmcgcGFyZW50ID0gMDsgCiAgICAgICAgICAgcGFy
ZW50ICE9IG5fcGFyZW50cy0+c2l6ZSgpOyArK3BhcmVudCkKICAgICAgICB7CiAgICAgICAgICBp
ZiAoISBuX3BhcmVudHMtPnRlc3QocGFyZW50KSkKICAgICAgICAgICAgY29udGludWU7CgogICAg
ICAgICAgaWYgKGRvbWluYXRvcnMuZmluZChwYXJlbnQpID09IGRvbWluYXRvcnMuZW5kKCkpCiAg
ICAgICAgICAgIGRvbWluYXRvcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHBhcmVudCwgCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9iaXRtYXAobmV3
IGJpdG1hcCgpKSkpOwogICAgICAgICAgc2hhcmVkX2JpdG1hcCBwYml0cyA9IGRvbWluYXRvcnNb
cGFyZW50XTsKCiAgICAgICAgICBpZiAoYml0cy0+c2l6ZSgpID4gcGJpdHMtPnNpemUoKSkKICAg
ICAgICAgICAgcGJpdHMtPnJlc2l6ZShiaXRzLT5zaXplKCkpOwoKICAgICAgICAgIGlmIChwYml0
cy0+c2l6ZSgpID4gYml0cy0+c2l6ZSgpKQogICAgICAgICAgICBiaXRzLT5yZXNpemUocGJpdHMt
PnNpemUoKSk7CgogICAgICAgICAgaWYgKGZpcnN0KQogICAgICAgICAgICB7CiAgICAgICAgICAg
ICAgaW50ZXJzZWN0aW9uID0gKCpwYml0cyk7CiAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsK
ICAgICAgICAgICAgfQogICAgICAgICAgZWxzZQogICAgICAgICAgICBpbnRlcnNlY3Rpb24gJj0g
KCpwYml0cyk7CiAgICAgICAgfQoKICAgICAgKCpiaXRzKSB8PSBpbnRlcnNlY3Rpb247CiAgICAg
IGlmICgqYml0cyAhPSBzYXZlZCkKICAgICAgICBzb21ldGhpbmdfY2hhbmdlZCA9IHRydWU7CiAg
ICB9CiAgcmV0dXJuIHNvbWV0aGluZ19jaGFuZ2VkOwp9CgoKc3RhdGljIGJvb2wgCmV4cGFuZF9h
bmNlc3RvcnMoc3RkOjptYXA8Y3R4LCBzaGFyZWRfYml0bWFwPiAmIHBhcmVudHMsCiAgICAgICAg
ICAgICAgICAgc3RkOjptYXA8Y3R4LCBzaGFyZWRfYml0bWFwPiAmIGFuY2VzdG9ycywKICAgICAg
ICAgICAgICAgICBpbnRlcm5lcjxjdHg+ICYgaW50ZXJuLAogICAgICAgICAgICAgICAgIGFwcF9z
dGF0ZSAmIGFwcCkKewogIGJvb2wgc29tZXRoaW5nX2NoYW5nZWQgPSBmYWxzZTsKICBzdGQ6OnZl
Y3RvcjxjdHg+IG5vZGVzOwoKICBub2Rlcy5yZXNlcnZlKGFuY2VzdG9ycy5zaXplKCkpOwoKICAv
LyBwYXNzIDEsIHB1bGwgb3V0IGFsbCB0aGUgbm9kZSBudW1iZXJzIHdlJ3JlIGdvaW5nIHRvIHNj
YW4gdGhpcyB0aW1lIGFyb3VuZAogIGZvciAoc3RkOjptYXA8Y3R4LCBzaGFyZWRfYml0bWFwPjo6
Y29uc3RfaXRlcmF0b3IgZSA9IGFuY2VzdG9ycy5iZWdpbigpOyAKICAgICAgIGUgIT0gYW5jZXN0
b3JzLmVuZCgpOyArK2UpCiAgICBub2Rlcy5wdXNoX2JhY2soZS0+Zmlyc3QpOwogIAogIC8vIHBh
c3MgMiwgdXBkYXRlIGFueSBvZiB0aGUgYW5jZXN0b3IgZW50cmllcyB3ZSBjYW4KICBmb3IgKHN0
ZDo6dmVjdG9yPGN0eD46OmNvbnN0X2l0ZXJhdG9yIG4gPSBub2Rlcy5iZWdpbigpOyBuICE9IG5v
ZGVzLmVuZCgpOyArK24pCiAgICB7CiAgICAgIHNoYXJlZF9iaXRtYXAgYml0cyA9IGFuY2VzdG9y
c1sqbl07CiAgICAgIGJpdG1hcCBzYXZlZCgqYml0cyk7CiAgICAgIGlmIChiaXRzLT5zaXplKCkg
PD0gKm4pCiAgICAgICAgYml0cy0+cmVzaXplKCpuICsgMSk7CiAgICAgIGJpdHMtPnNldCgqbik7
CgogICAgICBlbnN1cmVfcGFyZW50c19sb2FkZWQoKm4sIHBhcmVudHMsIGludGVybiwgYXBwKTsK
ICAgICAgc2hhcmVkX2JpdG1hcCBuX3BhcmVudHMgPSBwYXJlbnRzWypuXTsKICAgICAgZm9yIChj
dHggcGFyZW50ID0gMDsgcGFyZW50ICE9IG5fcGFyZW50cy0+c2l6ZSgpOyArK3BhcmVudCkKICAg
ICAgICB7CiAgICAgICAgICBpZiAoISBuX3BhcmVudHMtPnRlc3QocGFyZW50KSkKICAgICAgICAg
ICAgY29udGludWU7CgogICAgICAgICAgaWYgKGJpdHMtPnNpemUoKSA8PSBwYXJlbnQpCiAgICAg
ICAgICAgIGJpdHMtPnJlc2l6ZShwYXJlbnQgKyAxKTsKICAgICAgICAgIGJpdHMtPnNldChwYXJl
bnQpOwoKICAgICAgICAgIGlmIChhbmNlc3RvcnMuZmluZChwYXJlbnQpID09IGFuY2VzdG9ycy5l
bmQoKSkKICAgICAgICAgICAgYW5jZXN0b3JzLmluc2VydChtYWtlX3BhaXIocGFyZW50LCAKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9iaXRtYXAobmV3IGJp
dG1hcCgpKSkpOwogICAgICAgICAgc2hhcmVkX2JpdG1hcCBwYml0cyA9IGFuY2VzdG9yc1twYXJl
bnRdOwoKICAgICAgICAgIGlmIChiaXRzLT5zaXplKCkgPiBwYml0cy0+c2l6ZSgpKQogICAgICAg
ICAgICBwYml0cy0+cmVzaXplKGJpdHMtPnNpemUoKSk7CgogICAgICAgICAgaWYgKHBiaXRzLT5z
aXplKCkgPiBiaXRzLT5zaXplKCkpCiAgICAgICAgICAgIGJpdHMtPnJlc2l6ZShwYml0cy0+c2l6
ZSgpKTsKCiAgICAgICAgICAoKmJpdHMpIHw9ICgqcGJpdHMpOwogICAgICAgIH0KICAgICAgaWYg
KCpiaXRzICE9IHNhdmVkKQogICAgICAgIHNvbWV0aGluZ19jaGFuZ2VkID0gdHJ1ZTsKICAgIH0K
ICByZXR1cm4gc29tZXRoaW5nX2NoYW5nZWQ7Cn0KCnN0YXRpYyBib29sIApmaW5kX2ludGVyc2Vj
dGluZ19ub2RlKGJpdG1hcCAmIGZzdCwgCiAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwICYg
c25kLCAKICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5lcjxjdHg+IGNvbnN0ICYgaW50ZXJu
LCAKICAgICAgICAgICAgICAgICAgICAgICByZXZpc2lvbl9pZCAmIGFuYykKewogIAogIGlmIChm
c3Quc2l6ZSgpID4gc25kLnNpemUoKSkKICAgIHNuZC5yZXNpemUoZnN0LnNpemUoKSk7CiAgZWxz
ZSBpZiAoc25kLnNpemUoKSA+IGZzdC5zaXplKCkpCiAgICBmc3QucmVzaXplKHNuZC5zaXplKCkp
OwogIAogIGJpdG1hcCBpbnRlcnNlY3Rpb24gPSBmc3QgJiBzbmQ7CiAgaWYgKGludGVyc2VjdGlv
bi5hbnkoKSkKICAgIHsKICAgICAgTChGKCJmb3VuZCAlZCBpbnRlcnNlY3Rpbmcgbm9kZXNcbiIp
ICUgaW50ZXJzZWN0aW9uLmNvdW50KCkpOwogICAgICBmb3IgKGN0eCBpID0gMDsgaSA8IGludGVy
c2VjdGlvbi5zaXplKCk7ICsraSkKICAgICAgICB7CiAgICAgICAgICBpZiAoaW50ZXJzZWN0aW9u
LnRlc3QoaSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBhbmMgPSByZXZpc2lvbl9pZChp
bnRlcm4ubG9va3VwKGkpKTsKICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAg
fQogICAgICAgIH0KICAgIH0KICByZXR1cm4gZmFsc2U7Cn0KCi8vICBzdGF0aWMgdm9pZAovLyAg
ZHVtcF9iaXRzZXRfbWFwKHN0ZDo6c3RyaW5nIGNvbnN0ICYgaGRyLAovLyAgICAgICAgICAgICAg
c3RkOjptYXA8IGN0eCwgc2hhcmVkX2JpdG1hcCA+IGNvbnN0ICYgbW0pCi8vICB7Ci8vICAgIEwo
RigiZHVtcGluZyBbJXNdICglZCBlbnRyaWVzKVxuIikgJSBoZHIgJSBtbS5zaXplKCkpOwovLyAg
ICBmb3IgKHN0ZDo6bWFwPCBjdHgsIHNoYXJlZF9iaXRtYXAgPjo6Y29uc3RfaXRlcmF0b3IgaSA9
IG1tLmJlZ2luKCk7Ci8vICAgICAgICAgaSAhPSBtbS5lbmQoKTsgKytpKQovLyAgICAgIHsKLy8g
ICAgICAgIEwoRigiZHVtcCBbJXNdOiAlZCAtPiAlc1xuIikgJSBoZHIgJSBpLT5maXJzdCAlICgq
KGktPnNlY29uZCkpKTsKLy8gICAgICB9Ci8vICB9Cgpib29sIApmaW5kX2NvbW1vbl9hbmNlc3Rv
cl9mb3JfbWVyZ2UocmV2aXNpb25faWQgY29uc3QgJiBsZWZ0LAogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgcmV2aXNpb25faWQgY29uc3QgJiByaWdodCwKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHJldmlzaW9uX2lkICYgYW5jLAogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgYXBwX3N0YXRlICYgYXBwKQp7CiAgaW50ZXJuZXI8Y3R4PiBpbnRlcm47CiAgc3RkOjpt
YXA8IGN0eCwgc2hhcmVkX2JpdG1hcCA+IAogICAgcGFyZW50cywgYW5jZXN0b3JzLCBkb21pbmF0
b3JzOwogIAogIGN0eCBsbiA9IGludGVybi5pbnRlcm4obGVmdC5pbm5lcigpKCkpOwogIGN0eCBy
biA9IGludGVybi5pbnRlcm4ocmlnaHQuaW5uZXIoKSgpKTsKICAKICBzaGFyZWRfYml0bWFwIGxh
bmMgPSBzaGFyZWRfYml0bWFwKG5ldyBiaXRtYXAoKSk7CiAgc2hhcmVkX2JpdG1hcCByYW5jID0g
c2hhcmVkX2JpdG1hcChuZXcgYml0bWFwKCkpOwogIHNoYXJlZF9iaXRtYXAgbGRvbSA9IHNoYXJl
ZF9iaXRtYXAobmV3IGJpdG1hcCgpKTsKICBzaGFyZWRfYml0bWFwIHJkb20gPSBzaGFyZWRfYml0
bWFwKG5ldyBiaXRtYXAoKSk7CgogIGFuY2VzdG9ycy5pbnNlcnQobWFrZV9wYWlyKGxuLCBsYW5j
KSk7CiAgYW5jZXN0b3JzLmluc2VydChtYWtlX3BhaXIocm4sIHJhbmMpKTsKICBkb21pbmF0b3Jz
Lmluc2VydChtYWtlX3BhaXIobG4sIGxkb20pKTsKICBkb21pbmF0b3JzLmluc2VydChtYWtlX3Bh
aXIocm4sIHJkb20pKTsKICAKICBMKEYoInNlYXJjaGluZyBmb3IgY29tbW9uIGFuY2VzdG9yLCBs
ZWZ0PSVzIHJpZ2h0PSVzXG4iKSAlIGxlZnQgJSByaWdodCk7CiAgCiAgd2hpbGUgKGV4cGFuZF9h
bmNlc3RvcnMocGFyZW50cywgYW5jZXN0b3JzLCBpbnRlcm4sIGFwcCkgfHwKICAgICAgICAgZXhw
YW5kX2RvbWluYXRvcnMocGFyZW50cywgZG9taW5hdG9ycywgaW50ZXJuLCBhcHApKQogICAgewog
ICAgICBMKEYoImNvbW1vbiBhbmNlc3RvciBzY2FuIFtwYXI9JWQsYW5jPSVkLGRvbT0lZF1cbiIp
ICUgCiAgICAgICAgcGFyZW50cy5zaXplKCkgJSBhbmNlc3RvcnMuc2l6ZSgpICUgZG9taW5hdG9y
cy5zaXplKCkpOwoKICAgICAgaWYgKGZpbmRfaW50ZXJzZWN0aW5nX25vZGUoKmxhbmMsICpyZG9t
LCBpbnRlcm4sIGFuYykpCiAgICAgICAgewogICAgICAgICAgTChGKCJmb3VuZCBub2RlICVkLCBh
bmNlc3RvciBvZiBsZWZ0ICVzIGFuZCBkb21pbmF0aW5nIHJpZ2h0ICVzXG4iKQogICAgICAgICAg
ICAlIGFuYyAlIGxlZnQgJSByaWdodCk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9
CiAgICAgIAogICAgICBlbHNlIGlmIChmaW5kX2ludGVyc2VjdGluZ19ub2RlKCpyYW5jLCAqbGRv
bSwgaW50ZXJuLCBhbmMpKQogICAgICAgIHsKICAgICAgICAgIEwoRigiZm91bmQgbm9kZSAlZCwg
YW5jZXN0b3Igb2YgcmlnaHQgJXMgYW5kIGRvbWluYXRpbmcgbGVmdCAlc1xuIikKICAgICAgICAg
ICAgJSBhbmMgJSByaWdodCAlIGxlZnQpOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAg
fQogICAgfQovLyAgICAgIGR1bXBfYml0c2V0X21hcCgiYW5jZXN0b3JzIiwgYW5jZXN0b3JzKTsK
Ly8gICAgICBkdW1wX2JpdHNldF9tYXAoImRvbWluYXRvcnMiLCBkb21pbmF0b3JzKTsKLy8gICAg
ICBkdW1wX2JpdHNldF9tYXAoInBhcmVudHMiLCBwYXJlbnRzKTsKICByZXR1cm4gZmFsc2U7Cn0K
Cgpib29sCmZpbmRfbGVhc3RfY29tbW9uX2FuY2VzdG9yKHJldmlzaW9uX2lkIGNvbnN0ICYgbGVm
dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2aXNpb25faWQgY29uc3QgJiByaWdodCwK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2aXNpb25faWQgJiBhbmMsCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGFwcF9zdGF0ZSAmIGFwcCkKewogIGludGVybmVyPGN0eD4gaW50ZXJu
OwogIHN0ZDo6bWFwPCBjdHgsIHNoYXJlZF9iaXRtYXAgPgogICAgcGFyZW50cywgYW5jZXN0b3Jz
LCBkb21pbmF0b3JzOwoKICBjdHggbG4gPSBpbnRlcm4uaW50ZXJuKGxlZnQuaW5uZXIoKSgpKTsK
ICBjdHggcm4gPSBpbnRlcm4uaW50ZXJuKHJpZ2h0LmlubmVyKCkoKSk7CgogIHNoYXJlZF9iaXRt
YXAgbGFuYyA9IHNoYXJlZF9iaXRtYXAobmV3IGJpdG1hcCgpKTsKICBzaGFyZWRfYml0bWFwIHJh
bmMgPSBzaGFyZWRfYml0bWFwKG5ldyBiaXRtYXAoKSk7CgogIGFuY2VzdG9ycy5pbnNlcnQobWFr
ZV9wYWlyKGxuLCBsYW5jKSk7CiAgYW5jZXN0b3JzLmluc2VydChtYWtlX3BhaXIocm4sIHJhbmMp
KTsKCiAgTChGKCJzZWFyY2hpbmcgZm9yIGxlYXN0IGNvbW1vbiBhbmNlc3RvciwgbGVmdD0lcyBy
aWdodD0lc1xuIikgJSBsZWZ0ICUgcmlnaHQpOwoKICB3aGlsZSAoZXhwYW5kX2FuY2VzdG9ycyhw
YXJlbnRzLCBhbmNlc3RvcnMsIGludGVybiwgYXBwKSkKICAgIHsKICAgICAgTChGKCJsZWFzdCBj
b21tb24gYW5jZXN0b3Igc2NhbiBbcGFyPSVkLGFuYz0lZF1cbiIpICUKICAgICAgICBwYXJlbnRz
LnNpemUoKSAlIGFuY2VzdG9ycy5zaXplKCkpOwoKICAgICAgaWYgKGZpbmRfaW50ZXJzZWN0aW5n
X25vZGUoKmxhbmMsICpyYW5jLCBpbnRlcm4sIGFuYykpCiAgICAgICAgewogICAgICAgICAgTChG
KCJmb3VuZCBub2RlICVkLCBhbmNlc3RvciBvZiBsZWZ0ICVzIGFuZCByaWdodCAlc1xuIikKICAg
ICAgICAgICAgJSBhbmMgJSBsZWZ0ICUgcmlnaHQpOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAg
ICAgICAgfQogICAgfQovLyAgICAgIGR1bXBfYml0c2V0X21hcCgiYW5jZXN0b3JzIiwgYW5jZXN0
b3JzKTsKLy8gICAgICBkdW1wX2JpdHNldF9tYXAoInBhcmVudHMiLCBwYXJlbnRzKTsKICByZXR1
cm4gZmFsc2U7Cn0KCgovLyAKLy8gVGhlIGlkZWEgd2l0aCB0aGlzIGFsZ29yaXRobSBpcyB0byB3
YWxrIGZyb20gY2hpbGQgdXAgdG8gYW5jZXN0b3IsCi8vIHJlY3Vyc2l2ZWx5LCBhY2N1bXVsYXRp
bmcgYWxsIHRoZSBjaGFuZ2Vfc2V0cyBhc3NvY2lhdGVkIHdpdGgKLy8gaW50ZXJtZWRpYXRlIG5v
ZGVzIGludG8gKm9uZSBiaWcgY2hhbmdlX3NldCouCi8vCi8vIGNsZXZlciByZWFkZXJzIHdpbGwg
cmVhbGl6ZSB0aGlzIGlzIGFuIG92ZXJsYXBwaW5nLXN1YnByb2JsZW0gdHlwZQovLyBzaXR1YXRp
b24gYW5kIHRodXMgbmVlZHMgdG8ga2VlcCBhIGR5bmFtaWMgcHJvZ3JhbW1pbmcgbWFwIHRvIGtl
ZXAKLy8gaXRzZWxmIGluIGxpbmVhciBjb21wbGV4aXR5LgovLwovLyBpbiBmYWN0LCB3ZSBrZWVw
IHR3bzogb25lIHdoaWNoIG1hcHMgdG8gY29tcHV0ZWQgcmVzdWx0cyAocGFydGlhbF9jc2V0cykK
Ly8gYW5kIG9uZSB3aGljaCBqdXN0IGtlZXBzIGEgc2V0IG9mIGFsbCBub2RlcyB3ZSB0cmF2ZXJz
ZWQKLy8gKHZpc2l0ZWRfbm9kZXMpLiBpbiB0aGVvcnkgaXQgY291bGQgYmUgb25lIG1hcCB3aXRo
IGFuIGV4dHJhIGJvb2wgc3R1Y2sKLy8gb24gZWFjaCBlbnRyeSwgYnV0IEkgdGhpbmsgdGhhdCB3
b3VsZCBtYWtlIGl0IGV2ZW4gbGVzcyByZWFkYWJsZS4gaXQncwovLyBhbHJlYWR5IHF1aXRlIHVn
bHkuCi8vCgpzdGF0aWMgYm9vbCAKY2FsY3VsYXRlX2NoYW5nZV9zZXRzX3JlY3Vyc2l2ZShyZXZp
c2lvbl9pZCBjb25zdCAmIGFuY2VzdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHJldmlzaW9uX2lkIGNvbnN0ICYgY2hpbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgYXBwX3N0YXRlICYgYXBwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5n
ZV9zZXQgJiBjdW11bGF0aXZlX2NzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
c3RkOjptYXA8cmV2aXNpb25faWQsIGJvb3N0OjpzaGFyZWRfcHRyPGNoYW5nZV9zZXQ+ID4gJiBw
YXJ0aWFsX2NzZXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PHJl
dmlzaW9uX2lkPiAmIHZpc2l0ZWRfbm9kZXMpCnsKCiAgaWYgKGFuY2VzdG9yID09IGNoaWxkKQog
ICAgcmV0dXJuIHRydWU7CgogIHZpc2l0ZWRfbm9kZXMuaW5zZXJ0KGNoaWxkKTsKCiAgYm9vbCBy
ZWxldmFudF9jaGlsZCA9IGZhbHNlOwoKICByZXZpc2lvbl9zZXQgcmV2OwogIGFwcC5kYi5nZXRf
cmV2aXNpb24oY2hpbGQsIHJldik7CgogIEwoRigiZXhwbG9yaW5nIGNoYW5nZXNldHMgZnJvbSBw
YXJlbnRzIG9mICVzLCBzZWVraW5nIHRvd2FyZHMgJXNcbiIpIAogICAgJSBjaGlsZCAlIGFuY2Vz
dG9yKTsKCiAgZm9yKGVkZ2VfbWFwOjpjb25zdF9pdGVyYXRvciBpID0gcmV2LmVkZ2VzLmJlZ2lu
KCk7IGkgIT0gcmV2LmVkZ2VzLmVuZCgpOyArK2kpCiAgICB7CiAgICAgIGJvb2wgcmVsZXZhbnRf
cGFyZW50ID0gZmFsc2U7CiAgICAgIHJldmlzaW9uX2lkIGN1cnJfcGFyZW50ID0gZWRnZV9vbGRf
cmV2aXNpb24oaSk7CgogICAgICBpZiAoY3Vycl9wYXJlbnQuaW5uZXIoKSgpLmVtcHR5KCkpCiAg
ICAgICAgY29udGludWU7CgogICAgICBjaGFuZ2Vfc2V0IGNzZXRfdG9fY3Vycl9wYXJlbnQ7Cgog
ICAgICBMKEYoImNvbnNpZGVyaW5nIHBhcmVudCAlcyBvZiAlc1xuIikgJSBjdXJyX3BhcmVudCAl
IGNoaWxkKTsKCiAgICAgIHN0ZDo6bWFwPHJldmlzaW9uX2lkLCBib29zdDo6c2hhcmVkX3B0cjxj
aGFuZ2Vfc2V0PiA+Ojpjb25zdF9pdGVyYXRvciBqID0gCiAgICAgICAgcGFydGlhbF9jc2V0cy5m
aW5kKGN1cnJfcGFyZW50KTsKICAgICAgaWYgKGogIT0gcGFydGlhbF9jc2V0cy5lbmQoKSkgCiAg
ICAgICAgewogICAgICAgICAgLy8gYSByZWN1cnNpdmUgY2FsbCBoYXMgdHJhdmVyc2VkIHRoaXMg
cGFyZW50IGJlZm9yZSBhbmQgYnVpbHQgYW4KICAgICAgICAgIC8vIGV4aXN0aW5nIGNzZXQuIGp1
c3QgcmV1c2UgdGhhdCByYXRoZXIgdGhhbiByZS10cmF2ZXJzaW5nCiAgICAgICAgICBjc2V0X3Rv
X2N1cnJfcGFyZW50ID0gKihqLT5zZWNvbmQpOwogICAgICAgICAgcmVsZXZhbnRfcGFyZW50ID0g
dHJ1ZTsKICAgICAgICB9CiAgICAgIGVsc2UgaWYgKHZpc2l0ZWRfbm9kZXMuZmluZChjdXJyX3Bh
cmVudCkgIT0gdmlzaXRlZF9ub2Rlcy5lbmQoKSkKICAgICAgICB7CiAgICAgICAgICAvLyBhIHJl
Y3Vyc2l2ZSBjYWxsIGhhcyB0cmF2ZXJzZWQgdGhpcyBwYXJlbnQsIGJ1dCB0aGVyZSB3YXMgbm8K
ICAgICAgICAgIC8vIHBhdGggZnJvbSBpdCB0byB0aGUgcm9vdCwgc28gdGhlIHBhcmVudCBpcyBp
cnJlbGV2YW50LiBza2lwLgogICAgICAgICAgcmVsZXZhbnRfcGFyZW50ID0gZmFsc2U7CiAgICAg
ICAgfQogICAgICBlbHNlCiAgICAgICAgcmVsZXZhbnRfcGFyZW50ID0gY2FsY3VsYXRlX2NoYW5n
ZV9zZXRzX3JlY3Vyc2l2ZShhbmNlc3RvciwgY3Vycl9wYXJlbnQsIGFwcCwgCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc2V0X3RvX2N1
cnJfcGFyZW50LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHBhcnRpYWxfY3NldHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXNpdGVkX25vZGVzKTsKCiAgICAgIGlmIChy
ZWxldmFudF9wYXJlbnQpCiAgICAgICAgewogICAgICAgICAgTChGKCJyZXZpc2lvbiAlcyBpcyBy
ZWxldmFudCwgY29tcG9zaW5nIHdpdGggZWRnZSB0byAlc1xuIikgCiAgICAgICAgICAgICUgY3Vy
cl9wYXJlbnQgJSBjaGlsZCk7CiAgICAgICAgICBjb25jYXRlbmF0ZV9jaGFuZ2Vfc2V0cyhjc2V0
X3RvX2N1cnJfcGFyZW50LCBlZGdlX2NoYW5nZXMoaSksIGN1bXVsYXRpdmVfY3NldCk7CiAgICAg
ICAgICByZWxldmFudF9jaGlsZCA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAg
ICAgIGVsc2UKICAgICAgICBMKEYoInBhcmVudCAlcyBvZiAlcyBpcyBub3QgcmVsZXZhbnRcbiIp
ICUgY3Vycl9wYXJlbnQgJSBjaGlsZCk7CiAgICB9CgogIC8vIHN0b3JlIHRoZSBwYXJ0aWFsIGVk
Z2UgZnJvbSBhbmNlc3RvciAtPiBjaGlsZCwgc28gdGhhdCBpZiBhbnlvbmUKICAvLyByZS10cmF2
ZXJzZXMgdGhpcyBlZGdlIHRoZXknbGwganVzdCBmZXRjaCBmcm9tIHRoZSBwYXJ0aWFsX2VkZ2Vz
CiAgLy8gY2FjaGUuCiAgaWYgKHJlbGV2YW50X2NoaWxkKQogICAgcGFydGlhbF9jc2V0cy5pbnNl
cnQoc3RkOjptYWtlX3BhaXIoY2hpbGQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8Y2hhbmdlX3NldD4KICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIChuZXcgY2hhbmdlX3NldChjdW11bGF0aXZlX2NzZXQpKSkp
OwogIAogIHJldHVybiByZWxldmFudF9jaGlsZDsKfQoKdm9pZCAKY2FsY3VsYXRlX2NvbXBvc2l0
ZV9jaGFuZ2Vfc2V0KHJldmlzaW9uX2lkIGNvbnN0ICYgYW5jZXN0b3IsCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICByZXZpc2lvbl9pZCBjb25zdCAmIGNoaWxkLAogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgYXBwX3N0YXRlICYgYXBwLAogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgY2hhbmdlX3NldCAmIGNvbXBvc2VkKQp7CiAgTChGKCJjYWxjdWxhdGluZyBjb21w
b3NpdGUgY2hhbmdlc2V0IGJldHdlZW4gJXMgYW5kICVzXG4iKQogICAgJSBhbmNlc3RvciAlIGNo
aWxkKTsKICBzdGQ6OnNldDxyZXZpc2lvbl9pZD4gdmlzaXRlZDsKICBzdGQ6Om1hcDxyZXZpc2lv
bl9pZCwgYm9vc3Q6OnNoYXJlZF9wdHI8Y2hhbmdlX3NldD4gPiBwYXJ0aWFsOwogIGNhbGN1bGF0
ZV9jaGFuZ2Vfc2V0c19yZWN1cnNpdmUoYW5jZXN0b3IsIGNoaWxkLCBhcHAsIGNvbXBvc2VkLCBw
YXJ0aWFsLCB2aXNpdGVkKTsKfQoKLy8gbWlncmF0aW9uIHN0dWZmCi8vCi8vIEZJWE1FOiB0aGVz
ZSBhcmUgdGVtcG9yYXJ5IGZ1bmN0aW9ucywgb25jZSB3ZSd2ZSBkb25lIHRoZSBtaWdyYXRpb24g
dG8KLy8gcmV2aXNpb25zIC8gY2hhbmdlc2V0cywgd2UgY2FuIHJlbW92ZSB0aGVtLgoKc3RhdGlj
IHZvaWQgCmFuYWx5emVfbWFuaWZlc3RfY2hhbmdlcyhhcHBfc3RhdGUgJiBhcHAsCiAgICAgICAg
ICAgICAgICAgICAgICAgICBtYW5pZmVzdF9pZCBjb25zdCAmIHBhcmVudCwgCiAgICAgICAgICAg
ICAgICAgICAgICAgICBtYW5pZmVzdF9pZCBjb25zdCAmIGNoaWxkLCAKICAgICAgICAgICAgICAg
ICAgICAgICAgIGNoYW5nZV9zZXQgJiBjcykKewogIG1hbmlmZXN0X21hcCBtX3BhcmVudCwgbV9j
aGlsZDsKICBhcHAuZGIuZ2V0X21hbmlmZXN0KHBhcmVudCwgbV9wYXJlbnQpOwogIGFwcC5kYi5n
ZXRfbWFuaWZlc3QoY2hpbGQsIG1fY2hpbGQpOwoKICBmb3IgKG1hbmlmZXN0X21hcDo6Y29uc3Rf
aXRlcmF0b3IgaSA9IG1fcGFyZW50LmJlZ2luKCk7IAogICAgICAgaSAhPSBtX3BhcmVudC5lbmQo
KTsgKytpKQogICAgewogICAgICBtYW5pZmVzdF9tYXA6OmNvbnN0X2l0ZXJhdG9yIGogPSBtX2No
aWxkLmZpbmQobWFuaWZlc3RfZW50cnlfcGF0aChpKSk7CiAgICAgIGlmIChqID09IG1fY2hpbGQu
ZW5kKCkpCiAgICAgICAgY3MuZGVsZXRlX2ZpbGUobWFuaWZlc3RfZW50cnlfcGF0aChpKSk7CiAg
ICAgIGVsc2UgaWYgKCEgKG1hbmlmZXN0X2VudHJ5X2lkKGkpID09IG1hbmlmZXN0X2VudHJ5X2lk
KGopKSkKICAgICAgICB7CiAgICAgICAgICBjcy5hcHBseV9kZWx0YShtYW5pZmVzdF9lbnRyeV9w
YXRoKGkpLAogICAgICAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RfZW50cnlfaWQoaSksIAog
ICAgICAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RfZW50cnlfaWQoaikpOwogICAgICAgIH0g
ICAgICAgCiAgICB9CiAgZm9yIChtYW5pZmVzdF9tYXA6OmNvbnN0X2l0ZXJhdG9yIGkgPSBtX2No
aWxkLmJlZ2luKCk7IAogICAgICAgaSAhPSBtX2NoaWxkLmVuZCgpOyArK2kpCiAgICB7CiAgICAg
IG1hbmlmZXN0X21hcDo6Y29uc3RfaXRlcmF0b3IgaiA9IG1fcGFyZW50LmZpbmQobWFuaWZlc3Rf
ZW50cnlfcGF0aChpKSk7CiAgICAgIGlmIChqID09IG1fcGFyZW50LmVuZCgpKQogICAgICAgIGNz
LmFkZF9maWxlKG1hbmlmZXN0X2VudHJ5X3BhdGgoaSksCiAgICAgICAgICAgICAgICAgICAgbWFu
aWZlc3RfZW50cnlfaWQoaSkpOwogICAgfQp9CgpzdGF0aWMgcmV2aXNpb25faWQKY29uc3RydWN0
X3JldmlzaW9ucyhhcHBfc3RhdGUgJiBhcHAsCiAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3Rf
aWQgY29uc3QgJiBjaGlsZCwKICAgICAgICAgICAgICAgICAgICBzdGQ6Om11bHRpbWFwPCBtYW5p
ZmVzdF9pZCwgbWFuaWZlc3RfaWQgPiBjb25zdCAmIGFuY2VzdHJ5LAogICAgICAgICAgICAgICAg
ICAgIHN0ZDo6bWFwPG1hbmlmZXN0X2lkLCByZXZpc2lvbl9pZD4gJiBtYXBwZWQpCnsKICByZXZp
c2lvbl9zZXQgcmV2OwogIHR5cGVkZWYgc3RkOjptdWx0aW1hcDwgbWFuaWZlc3RfaWQsIG1hbmlm
ZXN0X2lkID46OmNvbnN0X2l0ZXJhdG9yIGNpOwogIHN0ZDo6cGFpcjxjaSxjaT4gcmFuZ2UgPSBh
bmNlc3RyeS5lcXVhbF9yYW5nZShjaGlsZCk7CiAgZm9yIChjaSBpID0gcmFuZ2UuZmlyc3Q7IGkg
IT0gcmFuZ2Uuc2Vjb25kOyArK2kpCiAgICB7CiAgICAgIG1hbmlmZXN0X2lkIHBhcmVudChpLT5z
ZWNvbmQpOwogICAgICByZXZpc2lvbl9pZCBwYXJlbnRfcmlkOwogICAgICBzdGQ6Om1hcDxtYW5p
ZmVzdF9pZCwgcmV2aXNpb25faWQ+Ojpjb25zdF9pdGVyYXRvciBqID0gbWFwcGVkLmZpbmQocGFy
ZW50KTsKCiAgICAgIGlmIChqICE9IG1hcHBlZC5lbmQoKSkKICAgICAgICBwYXJlbnRfcmlkID0g
ai0+c2Vjb25kOwogICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgcGFyZW50X3JpZCA9IGNv
bnN0cnVjdF9yZXZpc2lvbnMoYXBwLCBwYXJlbnQsIGFuY2VzdHJ5LCBtYXBwZWQpOwogICAgICAg
ICAgUChGKCJpbnNlcnRpbmcgbWFwcGluZyAlZCA6ICVzIC0+ICVzXG4iKSAlIG1hcHBlZC5zaXpl
KCkgJSBwYXJlbnQgJSBwYXJlbnRfcmlkKTs7CiAgICAgICAgICBtYXBwZWQuaW5zZXJ0KHN0ZDo6
bWFrZV9wYWlyKHBhcmVudCwgcGFyZW50X3JpZCkpOwogICAgICAgIH0KICAgICAgCiAgICAgIGNo
YW5nZV9zZXQgY3M7CiAgICAgIGFuYWx5emVfbWFuaWZlc3RfY2hhbmdlcyhhcHAsIHBhcmVudCwg
Y2hpbGQsIGNzKTsKICAgICAgcmV2LmVkZ2VzLmluc2VydChzdGQ6Om1ha2VfcGFpcihwYXJlbnRf
cmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWly
KHBhcmVudCwgY3MpKSk7CiAgICB9IAoKICByZXZpc2lvbl9pZCByaWQ7CiAgaWYgKHJldi5lZGdl
cy5lbXB0eSgpKQogICAgewogICAgICBQKEYoImlnbm9yaW5nIGVtcHR5IHJldmlzaW9uIGZvciBt
YW5pZmVzdCAlc1xuIikgJSBjaGlsZCk7ICAKICAgICAgcmV0dXJuIHJpZDsKICAgIH0KCiAgcmV2
Lm5ld19tYW5pZmVzdCA9IGNoaWxkOwogIGNhbGN1bGF0ZV9pZGVudChyZXYsIHJpZCk7CgogIGlm
ICghYXBwLmRiLnJldmlzaW9uX2V4aXN0cyAocmlkKSkKICAgIHsKICAgICAgUChGKCJtYXBwaW5n
IG1hbmlmZXN0ICVzIHRvIHJldmlzaW9uICVzXG4iKSAlIGNoaWxkICUgcmlkKTsKICAgICAgYXBw
LmRiLnB1dF9yZXZpc2lvbihyaWQsIHJldik7CiAgICB9CiAgZWxzZQogICAgewogICAgICBQKEYo
InNraXBwaW5nIGFkZGl0aW9uYWwgcGF0aCB0byByZXZpc2lvbiAlc1xuIikgJSByaWQpOwogICAg
fQoKICAvLyBub3cgaG9pc3QgYWxsIHRoZSBpbnRlcmVzdGluZyBjZXJ0cyB1cCB0byB0aGUgcmV2
aXNpb24KICBzdGQ6OnNldDxjZXJ0X25hbWU+IGNuYW1lczsKICBjbmFtZXMuaW5zZXJ0KGNlcnRf
bmFtZShicmFuY2hfY2VydF9uYW1lKSk7CiAgY25hbWVzLmluc2VydChjZXJ0X25hbWUoZGF0ZV9j
ZXJ0X25hbWUpKTsKICBjbmFtZXMuaW5zZXJ0KGNlcnRfbmFtZShhdXRob3JfY2VydF9uYW1lKSk7
CiAgY25hbWVzLmluc2VydChjZXJ0X25hbWUodGFnX2NlcnRfbmFtZSkpOwogIGNuYW1lcy5pbnNl
cnQoY2VydF9uYW1lKGNoYW5nZWxvZ19jZXJ0X25hbWUpKTsKICBjbmFtZXMuaW5zZXJ0KGNlcnRf
bmFtZShjb21tZW50X2NlcnRfbmFtZSkpOwogIGNuYW1lcy5pbnNlcnQoY2VydF9uYW1lKHRlc3Ry
ZXN1bHRfY2VydF9uYW1lKSk7CgogIHN0ZDo6dmVjdG9yPCBtYW5pZmVzdDxjZXJ0PiA+IHRtcDsK
ICBhcHAuZGIuZ2V0X21hbmlmZXN0X2NlcnRzKGNoaWxkLCB0bXApOwogIGVyYXNlX2JvZ3VzX2Nl
cnRzKHRtcCwgYXBwKTsgICAgICAKICBmb3IgKHN0ZDo6dmVjdG9yPCBtYW5pZmVzdDxjZXJ0PiA+
Ojpjb25zdF9pdGVyYXRvciBpID0gdG1wLmJlZ2luKCk7CiAgICAgICBpICE9IHRtcC5lbmQoKTsg
KytpKQogICAgewogICAgICBpZiAoY25hbWVzLmZpbmQoaS0+aW5uZXIoKS5uYW1lKSA9PSBjbmFt
ZXMuZW5kKCkpCiAgICAgICAgY29udGludWU7CiAgICAgIGNlcnQgbmV3X2NlcnQ7CiAgICAgIGNl
cnRfdmFsdWUgdHY7CiAgICAgIGRlY29kZV9iYXNlNjQoaS0+aW5uZXIoKS52YWx1ZSwgdHYpOwog
ICAgICBtYWtlX3NpbXBsZV9jZXJ0KHJpZC5pbm5lcigpLCBpLT5pbm5lcigpLm5hbWUsIHR2LCBh
cHAsIG5ld19jZXJ0KTsKICAgICAgaWYgKCEgYXBwLmRiLnJldmlzaW9uX2NlcnRfZXhpc3RzKHJl
dmlzaW9uPGNlcnQ+KG5ld19jZXJ0KSkpCiAgICAgICAgYXBwLmRiLnB1dF9yZXZpc2lvbl9jZXJ0
KHJldmlzaW9uPGNlcnQ+KG5ld19jZXJ0KSk7CiAgICB9CiAgcmV0dXJuIHJpZDsgIAp9CgoKdm9p
ZCAKYnVpbGRfY2hhbmdlc2V0cyhhcHBfc3RhdGUgJiBhcHApCnsKICBzdGQ6OnZlY3RvcjwgbWFu
aWZlc3Q8Y2VydD4gPiB0bXA7CiAgYXBwLmRiLmdldF9tYW5pZmVzdF9jZXJ0cyhjZXJ0X25hbWUo
ImFuY2VzdG9yIiksIHRtcCk7CiAgZXJhc2VfYm9ndXNfY2VydHModG1wLCBhcHApOwoKICBzdGQ6
Om11bHRpbWFwPCBtYW5pZmVzdF9pZCwgbWFuaWZlc3RfaWQgPiBhbmNlc3RyeTsKICBzdGQ6OnNl
dDxtYW5pZmVzdF9pZD4gaGVhZHM7CiAgc3RkOjpzZXQ8bWFuaWZlc3RfaWQ+IHRvdGFsOwogIAog
IGZvciAoc3RkOjp2ZWN0b3I8IG1hbmlmZXN0PGNlcnQ+ID46OmNvbnN0X2l0ZXJhdG9yIGkgPSB0
bXAuYmVnaW4oKTsKICAgICAgIGkgIT0gdG1wLmVuZCgpOyArK2kpCiAgICB7CiAgICAgIGNlcnRf
dmFsdWUgdHY7CiAgICAgIGRlY29kZV9iYXNlNjQoaS0+aW5uZXIoKS52YWx1ZSwgdHYpOwogICAg
ICBtYW5pZmVzdF9pZCBjaGlsZCwgcGFyZW50OwogICAgICBjaGlsZCA9IGktPmlubmVyKCkuaWRl
bnQ7CiAgICAgIHBhcmVudCA9IGhleGVuYzxpZD4odHYoKSk7CiAgICAgIGhlYWRzLmluc2VydChj
aGlsZCk7CiAgICAgIGhlYWRzLmVyYXNlKHBhcmVudCk7CiAgICAgIHRvdGFsLmluc2VydChjaGls
ZCk7CiAgICAgIHRvdGFsLmluc2VydChwYXJlbnQpOwogICAgICBhbmNlc3RyeS5pbnNlcnQoc3Rk
OjptYWtlX3BhaXIoY2hpbGQsIHBhcmVudCkpOwogICAgfQogIAogIFAoRigiZm91bmQgYSB0b3Rh
bCBvZiAlZCBtYW5pZmVzdHNcbiIpICUgdG90YWwuc2l6ZSgpKTsKCiAgdHJhbnNhY3Rpb25fZ3Vh
cmQgZ3VhcmQoYXBwLmRiKTsKICBzdGQ6Om1hcDxtYW5pZmVzdF9pZCwgcmV2aXNpb25faWQ+IG1h
cHBlZDsKICBmb3IgKHN0ZDo6c2V0PG1hbmlmZXN0X2lkPjo6Y29uc3RfaXRlcmF0b3IgaSA9IGhl
YWRzLmJlZ2luKCk7CiAgICAgICBpICE9IGhlYWRzLmVuZCgpOyArK2kpCiAgICB7CiAgICAgIGNv
bnN0cnVjdF9yZXZpc2lvbnMoYXBwLCAqaSwgYW5jZXN0cnksIG1hcHBlZCk7CiAgICB9CiAgZ3Vh
cmQuY29tbWl0KCk7Cn0KCgovLyBpL28gc3R1ZmYKCnN0ZDo6c3RyaW5nIHJldmlzaW9uX2ZpbGVf
bmFtZSgicmV2aXNpb24iKTsKCm5hbWVzcGFjZSAKewogIG5hbWVzcGFjZSBzeW1zCiAgewogICAg
c3RkOjpzdHJpbmcgY29uc3Qgb2xkX3JldmlzaW9uKCJvbGRfcmV2aXNpb24iKTsKICAgIHN0ZDo6
c3RyaW5nIGNvbnN0IG5ld19tYW5pZmVzdCgibmV3X21hbmlmZXN0Iik7CiAgICBzdGQ6OnN0cmlu
ZyBjb25zdCBvbGRfbWFuaWZlc3QoIm9sZF9tYW5pZmVzdCIpOwogIH0KfQoKCnZvaWQgCnByaW50
X2VkZ2UoYmFzaWNfaW86OnByaW50ZXIgJiBwcmludGVyLAogICAgICAgICAgIGVkZ2VfZW50cnkg
Y29uc3QgJiBlKQp7ICAgICAgIAogIGJhc2ljX2lvOjpzdGFuemEgc3Q7CiAgc3QucHVzaF9oZXhf
cGFpcihzeW1zOjpvbGRfcmV2aXNpb24sIGVkZ2Vfb2xkX3JldmlzaW9uKGUpLmlubmVyKCkoKSk7
CiAgc3QucHVzaF9oZXhfcGFpcihzeW1zOjpvbGRfbWFuaWZlc3QsIGVkZ2Vfb2xkX21hbmlmZXN0
KGUpLmlubmVyKCkoKSk7CiAgcHJpbnRlci5wcmludF9zdGFuemEoc3QpOwogIHByaW50X2NoYW5n
ZV9zZXQocHJpbnRlciwgZWRnZV9jaGFuZ2VzKGUpKTsgCn0KCgp2b2lkIApwcmludF9yZXZpc2lv
bihiYXNpY19pbzo6cHJpbnRlciAmIHByaW50ZXIsCiAgICAgICAgICAgICAgIHJldmlzaW9uX3Nl
dCBjb25zdCAmIHJldikKewogIGJhc2ljX2lvOjpzdGFuemEgc3Q7IAogIHN0LnB1c2hfaGV4X3Bh
aXIoc3ltczo6bmV3X21hbmlmZXN0LCByZXYubmV3X21hbmlmZXN0LmlubmVyKCkoKSk7CiAgcHJp
bnRlci5wcmludF9zdGFuemEoc3QpOwogIGZvciAoZWRnZV9tYXA6OmNvbnN0X2l0ZXJhdG9yIGVk
Z2UgPSByZXYuZWRnZXMuYmVnaW4oKTsKICAgICAgIGVkZ2UgIT0gcmV2LmVkZ2VzLmVuZCgpOyAr
K2VkZ2UpCiAgICBwcmludF9lZGdlKHByaW50ZXIsICplZGdlKTsKfQoKCnZvaWQgCnBhcnNlX2Vk
Z2UoYmFzaWNfaW86OnBhcnNlciAmIHBhcnNlciwKICAgICAgICAgICBlZGdlX21hcCAmIGVzKQp7
CiAgY2hhbmdlX3NldCBjczsKICBtYW5pZmVzdF9pZCBvbGRfbWFuOwogIHJldmlzaW9uX2lkIG9s
ZF9yZXY7CiAgc3RkOjpzdHJpbmcgdG1wOwogIAogIHBhcnNlci5lc3ltKHN5bXM6Om9sZF9yZXZp
c2lvbik7CiAgcGFyc2VyLmhleCh0bXApOwogIG9sZF9yZXYgPSByZXZpc2lvbl9pZCh0bXApOwog
IAogIHBhcnNlci5lc3ltKHN5bXM6Om9sZF9tYW5pZmVzdCk7CiAgcGFyc2VyLmhleCh0bXApOwog
IG9sZF9tYW4gPSBtYW5pZmVzdF9pZCh0bXApOwogIAogIHBhcnNlX2NoYW5nZV9zZXQocGFyc2Vy
LCBjcyk7CgogIGVzLmluc2VydChzdGQ6Om1ha2VfcGFpcihvbGRfcmV2LCBzdGQ6Om1ha2VfcGFp
cihvbGRfbWFuLCBjcykpKTsKfQoKCnZvaWQgCnBhcnNlX3JldmlzaW9uKGJhc2ljX2lvOjpwYXJz
ZXIgJiBwYXJzZXIsCiAgICAgICAgICAgICAgIHJldmlzaW9uX3NldCAmIHJldikKewogIHJldi5l
ZGdlcy5jbGVhcigpOwogIHN0ZDo6c3RyaW5nIHRtcDsKICBwYXJzZXIuZXN5bShzeW1zOjpuZXdf
bWFuaWZlc3QpOwogIHBhcnNlci5oZXgodG1wKTsKICByZXYubmV3X21hbmlmZXN0ID0gbWFuaWZl
c3RfaWQodG1wKTsKICB3aGlsZSAocGFyc2VyLnN5bXAoc3ltczo6b2xkX3JldmlzaW9uKSkKICAg
IHBhcnNlX2VkZ2UocGFyc2VyLCByZXYuZWRnZXMpOwp9Cgp2b2lkIApyZWFkX3JldmlzaW9uX3Nl
dChkYXRhIGNvbnN0ICYgZGF0LAogICAgICAgICAgICAgICAgICByZXZpc2lvbl9zZXQgJiByZXYp
CnsKICBzdGQ6OmlzdHJpbmdzdHJlYW0gaXNzKGRhdCgpKTsKICBiYXNpY19pbzo6aW5wdXRfc291
cmNlIHNyYyhpc3MsICJyZXZpc2lvbiIpOwogIGJhc2ljX2lvOjp0b2tlbml6ZXIgdG9rKHNyYyk7
CiAgYmFzaWNfaW86OnBhcnNlciBwYXJzKHRvayk7CiAgcGFyc2VfcmV2aXNpb24ocGFycywgcmV2
KTsKICBJKHNyYy5sb29rYWhlYWQgPT0gRU9GKTsKfQoKdm9pZCAKcmVhZF9yZXZpc2lvbl9zZXQo
cmV2aXNpb25fZGF0YSBjb25zdCAmIGRhdCwKICAgICAgICAgICAgICAgICAgcmV2aXNpb25fc2V0
ICYgcmV2KQp7CiAgZGF0YSB1bnBhY2tlZDsKICB1bnBhY2soZGF0LmlubmVyKCksIHVucGFja2Vk
KTsKICByZWFkX3JldmlzaW9uX3NldCh1bnBhY2tlZCwgcmV2KTsKfQoKdm9pZAp3cml0ZV9yZXZp
c2lvbl9zZXQocmV2aXNpb25fc2V0IGNvbnN0ICYgcmV2LAogICAgICAgICAgICAgICAgICAgZGF0
YSAmIGRhdCkKewogIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CiAgYmFzaWNfaW86OnByaW50ZXIg
cHIob3NzKTsKICBwcmludF9yZXZpc2lvbihwciwgcmV2KTsKICBkYXQgPSBkYXRhKG9zcy5zdHIo
KSk7Cn0KCnZvaWQKd3JpdGVfcmV2aXNpb25fc2V0KHJldmlzaW9uX3NldCBjb25zdCAmIHJldiwK
ICAgICAgICAgICAgICAgICAgIHJldmlzaW9uX2RhdGEgJiBkYXQpCnsKICBkYXRhIGQ7CiAgd3Jp
dGVfcmV2aXNpb25fc2V0KHJldiwgZCk7CiAgYmFzZTY0PCBnemlwPGRhdGE+ID4gcGFja2VkOwog
IHBhY2soZCwgcGFja2VkKTsKICBkYXQgPSByZXZpc2lvbl9kYXRhKHBhY2tlZCk7Cn0KCiNpZmRl
ZiBCVUlMRF9VTklUX1RFU1RTCiNpbmNsdWRlICJ1bml0X3Rlc3RzLmhoIgojaW5jbHVkZSAic2Fu
aXR5LmhoIgoKc3RhdGljIHZvaWQgCnJldmlzaW9uX3Rlc3QoKQp7Cn0KCnZvaWQgCmFkZF9yZXZp
c2lvbl90ZXN0cyh0ZXN0X3N1aXRlICogc3VpdGUpCnsKICBJKHN1aXRlKTsKICBzdWl0ZS0+YWRk
KEJPT1NUX1RFU1RfQ0FTRSgmcmV2aXNpb25fdGVzdCkpOwp9CgoKI2VuZGlmIC8vIEJVSUxEX1VO
SVRfVEVTVFMK
_ATEOF


$at_traceoff
echo "t_merge_2.at:1576: if test \"\$OSTYPE\" == \"msys\"; then
  mimencode -u -o parent parent.b64
else
  eval \$UNB64_COMMAND <parent.b64 >parent
fi
"
echo t_merge_2.at:1576 >$at_check_line_file
( $at_traceon; if test "$OSTYPE" == "msys"; then
  mimencode -u -o parent parent.b64
else
  eval $UNB64_COMMAND <parent.b64 >parent
fi
 ) >$at_stdout 2>$at_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_2.at:1576: exit code was $at_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_2.at:1577: if test \"\$OSTYPE\" == \"msys\"; then
  mimencode -u -o left left.b64
else
  eval \$UNB64_COMMAND <left.b64 >left
fi
"
echo t_merge_2.at:1577 >$at_check_line_file
( $at_traceon; if test "$OSTYPE" == "msys"; then
  mimencode -u -o left left.b64
else
  eval $UNB64_COMMAND <left.b64 >left
fi
 ) >$at_stdout 2>$at_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_2.at:1577: exit code was $at_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_2.at:1578: if test \"\$OSTYPE\" == \"msys\"; then
  mimencode -u -o right right.b64
else
  eval \$UNB64_COMMAND <right.b64 >right
fi
"
echo t_merge_2.at:1578 >$at_check_line_file
( $at_traceon; if test "$OSTYPE" == "msys"; then
  mimencode -u -o right right.b64
else
  eval $UNB64_COMMAND <right.b64 >right
fi
 ) >$at_stdout 2>$at_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_2.at:1578: exit code was $at_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_2.at:1579: if test \"\$OSTYPE\" == \"msys\"; then
  mimencode -u -o correct correct.b64
else
  eval \$UNB64_COMMAND <correct.b64 >correct
fi
"
echo t_merge_2.at:1579 >$at_check_line_file
( $at_traceon; if test "$OSTYPE" == "msys"; then
  mimencode -u -o correct correct.b64
else
  eval $UNB64_COMMAND <correct.b64 >correct
fi
 ) >$at_stdout 2>$at_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_2.at:1579: exit code was $at_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_2.at:1581: cp -f parent testfile"
echo t_merge_2.at:1581 >$at_check_line_file
( $at_traceon; cp -f parent 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_2.at:1581: exit code was $at_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_2.at:1582: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_merge_2.at:1582 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_2.at:1582: exit code was $at_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_2.at:1583: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_merge_2.at:1583 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_2.at:1583: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


PARENT_SHA=`cat MT/revision`

$at_traceoff
echo "t_merge_2.at:1586: cp -f left testfile"
echo t_merge_2.at:1586 >$at_check_line_file
( $at_traceon; cp -f left 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_2.at:1586: exit code was $at_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_2.at:1587: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_merge_2.at:1587 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_2.at:1587: exit code was $at_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_2.at:1589: rm -rf MT.old"
echo t_merge_2.at:1589 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_2.at:1589: exit code was $at_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_2.at:1589: mv  MT MT.old"
echo t_merge_2.at:1589 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_2.at:1589: exit code was $at_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_2.at:1589: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$PARENT_SHA ."
echo t_merge_2.at:1589 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $PARENT_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_2.at:1589: exit code was $at_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_2.at:1589: mv MT.old/options MT"
echo t_merge_2.at:1589 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_2.at:1589: 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_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_merge_2.at:1589: test \$PROBE_R_SHA = \$PARENT_SHA"
echo t_merge_2.at:1589 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $PARENT_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_2.at:1589: exit code was $at_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_2.at:1591: cp -f right testfile"
echo t_merge_2.at:1591 >$at_check_line_file
( $at_traceon; cp -f right 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_2.at:1591: exit code was $at_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_2.at:1592: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_merge_2.at:1592 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_2.at:1592: exit code was $at_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_2.at:1594: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch merge"
echo t_merge_2.at:1594 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --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_2.at:1594: exit code was $at_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_2.at:1596: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update"
echo t_merge_2.at:1596 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_2.at:1596: exit code was $at_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_2.at:1597: cmp testfile correct"
echo t_merge_2.at:1597 >$at_check_line_file
( $at_traceon; cmp testfile correct ) >$at_stdout 2>$at_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_2.at:1597: exit code 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`
    ;;

  52 ) # 52. t_tags.at:3: tags and tagging of revisions
    at_setup_line='t_tags.at:3'
    at_desc='tags and tagging of revisions'
    $at_quiet $ECHO_N " 52: tags and tagging of revisions                $ECHO_C"
    at_xfail=no
    (
      echo "52. t_tags.at:3: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_tags.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_tags.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_tags.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_tags.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_tags.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_tags.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_tags.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_tags.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_tags.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_tags.at:5: rm test_keys"
echo t_tags.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_tags.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 >file1 <<'_ATEOF'
file 1
_ATEOF

cat >file2 <<'_ATEOF'
file 2
_ATEOF

cat >file3 <<'_ATEOF'
file 3
_ATEOF


# make and tag revision 1

$at_traceoff
echo "t_tags.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add file1"
echo t_tags.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add file1 ) >$at_stdout 2>$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_tags.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_tags.at:17: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message 'add file1'"
echo t_tags.at:17 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 'add file1' ) >$at_stdout 2>$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_tags.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

REV1=`cat MT/revision`
$at_traceoff
echo "t_tags.at:19: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR tag \$REV1 tag1"
echo t_tags.at:19 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR tag $REV1 tag1 ) >$at_stdout 2>$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_tags.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


# make and tag revision 2

$at_traceoff
echo "t_tags.at:23: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add file2"
echo t_tags.at:23 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add file2 ) >$at_stdout 2>$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_tags.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_tags.at:24: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message 'add file2'"
echo t_tags.at:24 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 'add file2' ) >$at_stdout 2>$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_tags.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

REV2=`cat MT/revision`
$at_traceoff
echo "t_tags.at:26: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR tag \$REV2 tag2"
echo t_tags.at:26 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR tag $REV2 tag2 ) >$at_stdout 2>$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_tags.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


# make and tag revision 3

$at_traceoff
echo "t_tags.at:30: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add file3"
echo t_tags.at:30 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add file3 ) >$at_stdout 2>$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_tags.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_tags.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message 'add file3'"
echo t_tags.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 'add file3' ) >$at_stdout 2>$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_tags.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

REV3=`cat MT/revision`
$at_traceoff
echo "t_tags.at:33: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR tag \$REV3 tag3"
echo t_tags.at:33 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR tag $REV3 tag3 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; tee stderr <$at_stderr
echo stdout:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_tags.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


# check tags created above

$at_traceoff
echo "t_tags.at:37: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls tags"
echo t_tags.at:37 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR ls tags ) >$at_stdout 2>$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_tags.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_tags.at:38: grep tag1 stdout"
echo t_tags.at:38 >$at_check_line_file
( $at_traceon; grep tag1 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_tags.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_tags.at:39: grep tag2 stdout"
echo t_tags.at:39 >$at_check_line_file
( $at_traceon; grep tag2 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_tags.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_tags.at:40: grep tag3 stdout"
echo t_tags.at:40 >$at_check_line_file
( $at_traceon; grep tag3 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_tags.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_tags.at:42: rm -rf MT file1 file2 file3"
echo t_tags.at:42 >$at_check_line_file
( $at_traceon; rm -rf MT file1 file2 file3 ) >$at_stdout 2>$at_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_tags.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_tags.at:44: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR co tag1 ."
echo t_tags.at:44 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR co tag1 . ) >$at_stdout 2>$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_tags.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

TAG1=`cat MT/revision`
$at_traceoff
echo "t_tags.at:46: test \$TAG1 = \$REV1"
echo t_tags.at:46 >$at_check_line_file
( $at_traceon; test $TAG1 = $REV1 ) >$at_stdout 2>$at_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_tags.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_tags.at:47: test -e file1"
echo t_tags.at:47 >$at_check_line_file
( $at_traceon; test -e file1 ) >$at_stdout 2>$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_tags.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_tags.at:48: test -e file2"
echo t_tags.at:48 >$at_check_line_file
( $at_traceon; test -e file2 ) >$at_stdout 2>$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_tags.at:48: 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_tags.at:49: test -e file3"
echo t_tags.at:49 >$at_check_line_file
( $at_traceon; test -e file3 ) >$at_stdout 2>$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_tags.at:49: 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_tags.at:51: rm -rf MT file1 file2 file3"
echo t_tags.at:51 >$at_check_line_file
( $at_traceon; rm -rf MT file1 file2 file3 ) >$at_stdout 2>$at_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_tags.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_tags.at:53: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR co tag2 ."
echo t_tags.at:53 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR co tag2 . ) >$at_stdout 2>$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_tags.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

TAG2=`cat MT/revision`
$at_traceoff
echo "t_tags.at:55: test \$TAG2 = \$REV2"
echo t_tags.at:55 >$at_check_line_file
( $at_traceon; test $TAG2 = $REV2 ) >$at_stdout 2>$at_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_tags.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_tags.at:56: test -e file1"
echo t_tags.at:56 >$at_check_line_file
( $at_traceon; test -e file1 ) >$at_stdout 2>$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_tags.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_tags.at:57: test -e file2"
echo t_tags.at:57 >$at_check_line_file
( $at_traceon; test -e file2 ) >$at_stdout 2>$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_tags.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_tags.at:58: test -e file3"
echo t_tags.at:58 >$at_check_line_file
( $at_traceon; test -e file3 ) >$at_stdout 2>$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_tags.at:58: 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_tags.at:60: rm -rf MT file1 file2 file3"
echo t_tags.at:60 >$at_check_line_file
( $at_traceon; rm -rf MT file1 file2 file3 ) >$at_stdout 2>$at_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_tags.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_tags.at:62: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR co tag3 ."
echo t_tags.at:62 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR co tag3 . ) >$at_stdout 2>$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_tags.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

TAG3=`cat MT/revision`
$at_traceoff
echo "t_tags.at:64: test \$TAG1 = \$REV1"
echo t_tags.at:64 >$at_check_line_file
( $at_traceon; test $TAG1 = $REV1 ) >$at_stdout 2>$at_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_tags.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
echo "t_tags.at:65: test -e file1"
echo t_tags.at:65 >$at_check_line_file
( $at_traceon; test -e file1 ) >$at_stdout 2>$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_tags.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

$at_traceoff
echo "t_tags.at:66: test -e file2"
echo t_tags.at:66 >$at_check_line_file
( $at_traceon; test -e file2 ) >$at_stdout 2>$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_tags.at:66: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_tags.at:67: test -e file3"
echo t_tags.at:67 >$at_check_line_file
( $at_traceon; test -e file3 ) >$at_stdout 2>$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_tags.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  53 ) # 53. t_add_dot.at:1: monotone add .
    at_setup_line='t_add_dot.at:1'
    at_desc='monotone add .'
    $at_quiet $ECHO_N " 53: monotone add .                               $ECHO_C"
    at_xfail=no
    (
      echo "53. t_add_dot.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_add_dot.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_add_dot.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_add_dot.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_add_dot.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_add_dot.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_add_dot.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_add_dot.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_add_dot.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_add_dot.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_add_dot.at:2: rm test_keys"
echo t_add_dot.at:2 >$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_add_dot.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_add_dot.at:4: mkdir subdir"
echo t_add_dot.at:4 >$at_check_line_file
( $at_traceon; mkdir subdir ) >$at_stdout 2>$at_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_add_dot.at:4: 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 >subdir/testfile1 <<'_ATEOF'
foo
_ATEOF

cat >subdir/testfile2 <<'_ATEOF'
bar
_ATEOF

$at_traceoff
echo "t_add_dot.at:10: mkdir subdir/testdir1"
echo t_add_dot.at:10 >$at_check_line_file
( $at_traceon; mkdir subdir/testdir1 ) >$at_stdout 2>$at_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_add_dot.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 >subdir/testdir1/subfile1 <<'_ATEOF'
baz
_ATEOF

cat >subdir/testdir1/subfile2 <<'_ATEOF'
quux
_ATEOF


$at_traceoff
echo "t_add_dot.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup subdir"
echo t_add_dot.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup subdir ) >$at_stdout 2>$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_add_dot.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


# Make sure that "add ." works, even at the root of the tree
$at_traceoff
echo "t_add_dot.at:19: cd subdir && \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add ."
echo t_add_dot.at:19 >$at_check_line_file
( $at_traceon; cd subdir && $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add . ) >$at_stdout 2>$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_add_dot.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


# Make sure that it took
$at_traceoff
echo "t_add_dot.at:22: cd subdir && \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message=\"foo\" --branch=testbranch"
echo t_add_dot.at:22 >$at_check_line_file
( $at_traceon; cd subdir && $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message="foo" --branch=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_add_dot.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_add_dot.at:24: rm subdir/testfile1"
echo t_add_dot.at:24 >$at_check_line_file
( $at_traceon; rm subdir/testfile1 ) >$at_stdout 2>$at_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_add_dot.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_add_dot.at:25: rm subdir/testfile2"
echo t_add_dot.at:25 >$at_check_line_file
( $at_traceon; rm subdir/testfile2 ) >$at_stdout 2>$at_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_add_dot.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_add_dot.at:26: rm -r subdir/testdir1"
echo t_add_dot.at:26 >$at_check_line_file
( $at_traceon; rm -r subdir/testdir1 ) >$at_stdout 2>$at_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_add_dot.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_add_dot.at:27: cd subdir && \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR revert"
echo t_add_dot.at:27 >$at_check_line_file
( $at_traceon; cd subdir && $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_add_dot.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_add_dot.at:29: test -f subdir/testfile1"
echo t_add_dot.at:29 >$at_check_line_file
( $at_traceon; test -f subdir/testfile1 ) >$at_stdout 2>$at_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_add_dot.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_add_dot.at:30: test -f subdir/testfile2"
echo t_add_dot.at:30 >$at_check_line_file
( $at_traceon; test -f subdir/testfile2 ) >$at_stdout 2>$at_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_add_dot.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_add_dot.at:31: test -f subdir/testdir1/subfile1"
echo t_add_dot.at:31 >$at_check_line_file
( $at_traceon; test -f subdir/testdir1/subfile1 ) >$at_stdout 2>$at_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_add_dot.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_add_dot.at:32: test -f subdir/testdir1/subfile2"
echo t_add_dot.at:32 >$at_check_line_file
( $at_traceon; test -f subdir/testdir1/subfile2 ) >$at_stdout 2>$at_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_add_dot.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`
    ;;

  54 ) # 54. t_cleanup_empty_dir.at:1: (minor) update cleans emptied directories
    at_setup_line='t_cleanup_empty_dir.at:1'
    at_desc='(minor) update cleans emptied directories'
    $at_quiet $ECHO_N " 54: (minor) update cleans emptied directories    $ECHO_C"
    at_xfail=yes
    (
      echo "54. t_cleanup_empty_dir.at:1: testing ..."
      $at_traceon


# This test is a bug report.




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_cleanup_empty_dir.at:6: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_cleanup_empty_dir.at:6 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_cleanup_empty_dir.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_cleanup_empty_dir.at:6: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_cleanup_empty_dir.at:6 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_cleanup_empty_dir.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_cleanup_empty_dir.at:6: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_cleanup_empty_dir.at:6 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_cleanup_empty_dir.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_cleanup_empty_dir.at:6: rm test_keys"
echo t_cleanup_empty_dir.at:6 >$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_cleanup_empty_dir.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_cleanup_empty_dir.at:8: mkdir testdir"
echo t_cleanup_empty_dir.at:8 >$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_cleanup_empty_dir.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 >testdir/foo <<'_ATEOF'
blah blah blah
_ATEOF

$at_traceoff
echo "t_cleanup_empty_dir.at:10: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testdir/foo"
echo t_cleanup_empty_dir.at:10 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add testdir/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_cleanup_empty_dir.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_cleanup_empty_dir.at:11: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_cleanup_empty_dir.at:11 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_cleanup_empty_dir.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


BASE_R=`cat MT/revision`

$at_traceoff
echo "t_cleanup_empty_dir.at:14: rm -r testdir"
echo t_cleanup_empty_dir.at:14 >$at_check_line_file
( $at_traceon; rm -r 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_cleanup_empty_dir.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_cleanup_empty_dir.at:15: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR drop testdir/foo"
echo t_cleanup_empty_dir.at:15 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR drop testdir/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_cleanup_empty_dir.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_cleanup_empty_dir.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_cleanup_empty_dir.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_cleanup_empty_dir.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_cleanup_empty_dir.at:18: rm -rf MT.old"
echo t_cleanup_empty_dir.at:18 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_cleanup_empty_dir.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_cleanup_empty_dir.at:18: mv  MT MT.old"
echo t_cleanup_empty_dir.at:18 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_cleanup_empty_dir.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_cleanup_empty_dir.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$BASE_R ."
echo t_cleanup_empty_dir.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $BASE_R . ) >$at_stdout 2>$at_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_cleanup_empty_dir.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_cleanup_empty_dir.at:18: mv MT.old/options MT"
echo t_cleanup_empty_dir.at:18 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_cleanup_empty_dir.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_cleanup_empty_dir.at:18: test \$PROBE_R_SHA = \$BASE_R"
echo t_cleanup_empty_dir.at:18 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $BASE_R ) >$at_stdout 2>$at_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_cleanup_empty_dir.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_cleanup_empty_dir.at:20: test -d testdir"
echo t_cleanup_empty_dir.at:20 >$at_check_line_file
( $at_traceon; test -d 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_cleanup_empty_dir.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_cleanup_empty_dir.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update"
echo t_cleanup_empty_dir.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_cleanup_empty_dir.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_cleanup_empty_dir.at:23: test \$BASE_R != \`cat MT/revision\`"
echo t_cleanup_empty_dir.at:23 >$at_check_line_file
( $at_traceon; test $BASE_R != `cat MT/revision` ) >$at_stdout 2>$at_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_cleanup_empty_dir.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_cleanup_empty_dir.at:25: test -d testdir"
echo t_cleanup_empty_dir.at:25 >$at_check_line_file
( $at_traceon; test -d 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;;
   1) ;;
   *) echo "t_cleanup_empty_dir.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  55 ) # 55. t_merge_add_del.at:3: (imp) merging <add a> with <add a, drop a>
    at_setup_line='t_merge_add_del.at:3'
    at_desc='(imp) merging <add a> with <add a, drop a>'
    $at_quiet $ECHO_N " 55: (imp) merging <add a> with <add a, drop a>   $ECHO_C"
    at_xfail=yes
    (
      echo "55. t_merge_add_del.at:3: testing ..."
      $at_traceon


# This test is a bug report.




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_add_del.at:8: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_merge_add_del.at:8 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_add_del.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_merge_add_del.at:8: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_merge_add_del.at:8 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_add_del.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_merge_add_del.at:8: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_merge_add_del.at:8 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_add_del.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_merge_add_del.at:8: rm test_keys"
echo t_merge_add_del.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_merge_add_del.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



# We want a graph which looks like:
#              A
#            / | \
#           F  C  G
#           |/ |  |
#           D  E  |
#              \ /
#               B

# B and D are heads of branch.main and branch.fork respectively, we want to
# "propagate branch.main branch.fork".

# The revs F, C, and D are members of branch.fork.
# A, C, E, G, and B are members of branch.main (C is shared)

# C is "add bar", E is "drop bar", other revisions involve non-conflicting
# file additions or merges.

cat >foo <<'_ATEOF'
extra blah blah foo
_ATEOF

cat >bar <<'_ATEOF'
extra blah blah bar
_ATEOF

cat >quux <<'_ATEOF'
extra blah blah quux
_ATEOF

cat >iced <<'_ATEOF'
stuff here
_ATEOF


# produce state A
$at_traceoff
echo "t_merge_add_del.at:38: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add foo"
echo t_merge_add_del.at:38 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_merge_add_del.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_merge_add_del.at:39: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch.main commit --message 'state A - add foo'"
echo t_merge_add_del.at:39 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch.main commit --message 'state A - 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_merge_add_del.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

A_REVISION_SHA=`cat MT/revision`

# produce state C
$at_traceoff
echo "t_merge_add_del.at:43: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add bar"
echo t_merge_add_del.at:43 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add 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_merge_add_del.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_add_del.at:44: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch.main commit --message 'state C - add bar'"
echo t_merge_add_del.at:44 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch.main commit --message 'state C - add 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_merge_add_del.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

C_REVISION_SHA=`cat MT/revision`
$at_traceoff
echo "t_merge_add_del.at:46: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR cert \$C_REVISION_SHA branch branch.fork"
echo t_merge_add_del.at:46 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR cert $C_REVISION_SHA branch branch.fork ) >$at_stdout 2>$at_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_add_del.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


# produce state F

$at_traceoff
echo "t_merge_add_del.at:49: rm -rf MT.old"
echo t_merge_add_del.at:49 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_add_del.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_add_del.at:49: mv  MT MT.old"
echo t_merge_add_del.at:49 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_add_del.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_add_del.at:49: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$A_REVISION_SHA ."
echo t_merge_add_del.at:49 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $A_REVISION_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_add_del.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_add_del.at:49: mv MT.old/options MT"
echo t_merge_add_del.at:49 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_add_del.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_merge_add_del.at:49: test \$PROBE_R_SHA = \$A_REVISION_SHA"
echo t_merge_add_del.at:49 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $A_REVISION_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_add_del.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_add_del.at:50: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add iced"
echo t_merge_add_del.at:50 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add iced ) >$at_stdout 2>$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_add_del.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_add_del.at:51: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch.fork commit --message 'state F - add iced'"
echo t_merge_add_del.at:51 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch.fork commit --message 'state F - add iced' ) >$at_stdout 2>$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_add_del.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

F_REVISION_SHA=`cat MT/revision`

# merge heads of branch.fork to make D
$at_traceoff
echo "t_merge_add_del.at:55: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch.fork merge"
echo t_merge_add_del.at:55 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch.fork 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_add_del.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


# produce state E

$at_traceoff
echo "t_merge_add_del.at:58: rm -rf MT.old"
echo t_merge_add_del.at:58 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_add_del.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_merge_add_del.at:58: mv  MT MT.old"
echo t_merge_add_del.at:58 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_add_del.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_merge_add_del.at:58: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$C_REVISION_SHA ."
echo t_merge_add_del.at:58 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $C_REVISION_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_add_del.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_merge_add_del.at:58: mv MT.old/options MT"
echo t_merge_add_del.at:58 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_add_del.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_merge_add_del.at:58: test \$PROBE_R_SHA = \$C_REVISION_SHA"
echo t_merge_add_del.at:58 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $C_REVISION_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_add_del.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_merge_add_del.at:59: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch.main drop bar"
echo t_merge_add_del.at:59 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch.main 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_merge_add_del.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_merge_add_del.at:60: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch.main commit --message 'state E - drop bar'"
echo t_merge_add_del.at:60 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch.main commit --message 'state E - 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_merge_add_del.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

E_REVISION_SHA=`cat MT/revision`

# state G

$at_traceoff
echo "t_merge_add_del.at:64: rm -rf MT.old"
echo t_merge_add_del.at:64 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_add_del.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
echo "t_merge_add_del.at:64: mv  MT MT.old"
echo t_merge_add_del.at:64 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_add_del.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
echo "t_merge_add_del.at:64: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$A_REVISION_SHA ."
echo t_merge_add_del.at:64 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $A_REVISION_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_add_del.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
echo "t_merge_add_del.at:64: mv MT.old/options MT"
echo t_merge_add_del.at:64 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_add_del.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_merge_add_del.at:64: test \$PROBE_R_SHA = \$A_REVISION_SHA"
echo t_merge_add_del.at:64 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $A_REVISION_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_add_del.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
echo "t_merge_add_del.at:65: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add quux"
echo t_merge_add_del.at:65 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add quux ) >$at_stdout 2>$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_add_del.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

$at_traceoff
echo "t_merge_add_del.at:66: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch.main commit --message 'state G - add quux'"
echo t_merge_add_del.at:66 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch.main commit --message 'state G - add quux' ) >$at_stdout 2>$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_add_del.at:66: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

G_REVISION_SHA=`cat MT/revision`

# merge to get state B
$at_traceoff
echo "t_merge_add_del.at:70: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch.main merge"
echo t_merge_add_del.at:70 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch.main 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_add_del.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


# now try the propagate
$at_traceoff
echo "t_merge_add_del.at:73: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR propagate branch.main branch.fork"
echo t_merge_add_del.at:73 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR propagate branch.main branch.fork ) >$at_stdout 2>$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_add_del.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


# check
$at_traceoff
echo "t_merge_add_del.at:76: rm -rf MT"
echo t_merge_add_del.at:76 >$at_check_line_file
( $at_traceon; rm -rf MT ) >$at_stdout 2>$at_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_add_del.at:76: exit code was $at_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_add_del.at:77: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch.fork checkout ."
echo t_merge_add_del.at:77 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch.fork checkout . ) >$at_stdout 2>$at_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_add_del.at:77: exit code was $at_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_add_del.at:79: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR cat manifest"
echo t_merge_add_del.at:79 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_merge_add_del.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_merge_add_del.at:80: mv stdout manifest"
echo t_merge_add_del.at:80 >$at_check_line_file
( $at_traceon; mv stdout 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_add_del.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_merge_add_del.at:81: grep bar manifest"
echo t_merge_add_del.at:81 >$at_check_line_file
( $at_traceon; grep bar 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_merge_add_del.at:81: 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_merge_add_del.at:82: grep quux manifest"
echo t_merge_add_del.at:82 >$at_check_line_file
( $at_traceon; grep quux 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_merge_add_del.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_merge_add_del.at:83: grep foo manifest"
echo t_merge_add_del.at:83 >$at_check_line_file
( $at_traceon; grep foo 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_merge_add_del.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

$at_traceoff
echo "t_merge_add_del.at:84: grep iced manifest"
echo t_merge_add_del.at:84 >$at_check_line_file
( $at_traceon; grep iced 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_merge_add_del.at:84: exit code 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`
    ;;

  56 ) # 56. t_add_edge.at:1: merging an add edge
    at_setup_line='t_add_edge.at:1'
    at_desc='merging an add edge'
    $at_quiet $ECHO_N " 56: merging an add edge                          $ECHO_C"
    at_xfail=no
    (
      echo "56. t_add_edge.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_add_edge.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_add_edge.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_add_edge.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_add_edge.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_add_edge.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_add_edge.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_add_edge.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_add_edge.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_add_edge.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_add_edge.at:2: rm test_keys"
echo t_add_edge.at:2 >$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_add_edge.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



mkdir zz


cat >ancfile <<'_ATEOF'
ancestral file
_ATEOF

$at_traceoff
echo "t_add_edge.at:7: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add ancfile"
echo t_add_edge.at:7 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add ancfile ) >$at_stdout 2>$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_add_edge.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 >zz/testfile0 <<'_ATEOF'
added file
_ATEOF

$at_traceoff
echo "t_add_edge.at:9: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add zz/testfile0"
echo t_add_edge.at:9 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add zz/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_add_edge.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_add_edge.at:10: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_add_edge.at:10 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_add_edge.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


ANC=`cat MT/revision`



cat >zz/testfile1 <<'_ATEOF'
added file
_ATEOF

$at_traceoff
echo "t_add_edge.at:15: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add zz/testfile1"
echo t_add_edge.at:15 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add zz/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_add_edge.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_add_edge.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_add_edge.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_add_edge.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_add_edge.at:18: rm -rf MT.old"
echo t_add_edge.at:18 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_add_edge.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_add_edge.at:18: mv  MT MT.old"
echo t_add_edge.at:18 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_add_edge.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_add_edge.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$ANC ."
echo t_add_edge.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $ANC . ) >$at_stdout 2>$at_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_add_edge.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_add_edge.at:18: mv MT.old/options MT"
echo t_add_edge.at:18 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_add_edge.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_add_edge.at:18: test \$PROBE_R_SHA = \$ANC"
echo t_add_edge.at:18 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $ANC ) >$at_stdout 2>$at_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_add_edge.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 >changed_anc <<'_ATEOF'
changed anc
_ATEOF


$at_traceoff
echo "t_add_edge.at:23: cp changed_anc ancfile"
echo t_add_edge.at:23 >$at_check_line_file
( $at_traceon; cp changed_anc ancfile ) >$at_stdout 2>$at_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_add_edge.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



cat >zz/testfile1 <<'_ATEOF'
added file
_ATEOF

$at_traceoff
echo "t_add_edge.at:26: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add zz/testfile1"
echo t_add_edge.at:26 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add zz/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_add_edge.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_add_edge.at:28: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_add_edge.at:28 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_add_edge.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_add_edge.at:30: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch merge"
echo t_add_edge.at:30 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --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_add_edge.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_add_edge.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update"
echo t_add_edge.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_add_edge.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


MERGED=`cat MT/revision`

$at_traceoff
echo "t_add_edge.at:35: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR cat revision \$MERGED"
echo t_add_edge.at:35 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR cat revision $MERGED ) >$at_stdout 2>$at_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_add_edge.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_add_edge.at:36: mv stdout rev"
echo t_add_edge.at:36 >$at_check_line_file
( $at_traceon; mv stdout rev ) >$at_stdout 2>$at_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_add_edge.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_add_edge.at:37: grep add_file rev"
echo t_add_edge.at:37 >$at_check_line_file
( $at_traceon; grep add_file rev ) >$at_stdout 2>$at_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_add_edge.at:37: 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`
    ;;

  57 ) # 57. t_patch_drop_add.at:1: merge(<>, <patch a, drop a, add a>)
    at_setup_line='t_patch_drop_add.at:1'
    at_desc='merge(<>, <patch a, drop a, add a>)'
    $at_quiet $ECHO_N " 57: merge(<>, <patch a, drop a, add a>)          $ECHO_C"
    at_xfail=no
    (
      echo "57. t_patch_drop_add.at:1: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_patch_drop_add.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_patch_drop_add.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_patch_drop_add.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_patch_drop_add.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_patch_drop_add.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_patch_drop_add.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_patch_drop_add.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_patch_drop_add.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_patch_drop_add.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_patch_drop_add.at:3: rm test_keys"
echo t_patch_drop_add.at:3 >$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_patch_drop_add.at:3: 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 >v1a <<'_ATEOF'
foo blah
_ATEOF

cat >v1b <<'_ATEOF'
bar blah
_ATEOF

cat >v2a <<'_ATEOF'
baz blah
_ATEOF


$at_traceoff
echo "t_patch_drop_add.at:12: cp v1a testfile"
echo t_patch_drop_add.at:12 >$at_check_line_file
( $at_traceon; cp v1a 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_patch_drop_add.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_patch_drop_add.at:13: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_patch_drop_add.at:13 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_patch_drop_add.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_patch_drop_add.at:14: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_patch_drop_add.at:14 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_patch_drop_add.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


BASE_R_SHA=`cat MT/revision`

$at_traceoff
echo "t_patch_drop_add.at:17: cp v1b testfile"
echo t_patch_drop_add.at:17 >$at_check_line_file
( $at_traceon; cp v1b 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_patch_drop_add.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_patch_drop_add.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_patch_drop_add.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_patch_drop_add.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_patch_drop_add.at:20: rm -f testfile"
echo t_patch_drop_add.at:20 >$at_check_line_file
( $at_traceon; rm -f 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_patch_drop_add.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_patch_drop_add.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR drop testfile"
echo t_patch_drop_add.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR drop 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_patch_drop_add.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_patch_drop_add.at:22: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_patch_drop_add.at:22 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_patch_drop_add.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_patch_drop_add.at:24: cp v2a testfile"
echo t_patch_drop_add.at:24 >$at_check_line_file
( $at_traceon; cp v2a 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_patch_drop_add.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_patch_drop_add.at:25: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_patch_drop_add.at:25 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_patch_drop_add.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_patch_drop_add.at:26: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_patch_drop_add.at:26 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_patch_drop_add.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_patch_drop_add.at:28: rm -rf MT.old"
echo t_patch_drop_add.at:28 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_patch_drop_add.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_patch_drop_add.at:28: mv  MT MT.old"
echo t_patch_drop_add.at:28 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_patch_drop_add.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_patch_drop_add.at:28: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$BASE_R_SHA ."
echo t_patch_drop_add.at:28 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $BASE_R_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_patch_drop_add.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_patch_drop_add.at:28: mv MT.old/options MT"
echo t_patch_drop_add.at:28 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_patch_drop_add.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_patch_drop_add.at:28: test \$PROBE_R_SHA = \$BASE_R_SHA"
echo t_patch_drop_add.at:28 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $BASE_R_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_patch_drop_add.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




cat >otherfile <<'_ATEOF'
this space for rent
_ATEOF

$at_traceoff
echo "t_patch_drop_add.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add otherfile"
echo t_patch_drop_add.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add otherfile ) >$at_stdout 2>$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_patch_drop_add.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_patch_drop_add.at:32: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_patch_drop_add.at:32 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_patch_drop_add.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_patch_drop_add.at:34: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR merge"
echo t_patch_drop_add.at:34 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_patch_drop_add.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_patch_drop_add.at:35: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update"
echo t_patch_drop_add.at:35 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_patch_drop_add.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_patch_drop_add.at:36: cmp testfile v2a"
echo t_patch_drop_add.at:36 >$at_check_line_file
( $at_traceon; cmp testfile v2a ) >$at_stdout 2>$at_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_patch_drop_add.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  58 ) # 58. t_add_drop_add.at:1: merge(<>, <add a, drop a, add a>)
    at_setup_line='t_add_drop_add.at:1'
    at_desc='merge(<>, <add a, drop a, add a>)'
    $at_quiet $ECHO_N " 58: merge(<>, <add a, drop a, add a>)            $ECHO_C"
    at_xfail=no
    (
      echo "58. t_add_drop_add.at:1: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_add_drop_add.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_add_drop_add.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_add_drop_add.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_add_drop_add.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_add_drop_add.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_add_drop_add.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_add_drop_add.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_add_drop_add.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_add_drop_add.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_add_drop_add.at:3: rm test_keys"
echo t_add_drop_add.at:3 >$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_add_drop_add.at:3: 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 >v1 <<'_ATEOF'
foo blah
_ATEOF

cat >v2 <<'_ATEOF'
baz blah
_ATEOF



cat >randomfile <<'_ATEOF'
blah blah blah
_ATEOF

$at_traceoff
echo "t_add_drop_add.at:11: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add randomfile"
echo t_add_drop_add.at:11 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add randomfile ) >$at_stdout 2>$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_add_drop_add.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_add_drop_add.at:12: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_add_drop_add.at:12 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_add_drop_add.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


BASE_R_SHA=`cat MT/revision`

$at_traceoff
echo "t_add_drop_add.at:15: cp v1 testfile"
echo t_add_drop_add.at:15 >$at_check_line_file
( $at_traceon; cp v1 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_add_drop_add.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_add_drop_add.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_add_drop_add.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_add_drop_add.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_add_drop_add.at:17: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_add_drop_add.at:17 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_add_drop_add.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_add_drop_add.at:19: rm -f testfile"
echo t_add_drop_add.at:19 >$at_check_line_file
( $at_traceon; rm -f 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_add_drop_add.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_add_drop_add.at:20: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR drop testfile"
echo t_add_drop_add.at:20 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR drop 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_add_drop_add.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_add_drop_add.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_add_drop_add.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_add_drop_add.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_add_drop_add.at:23: cp v2 testfile"
echo t_add_drop_add.at:23 >$at_check_line_file
( $at_traceon; cp v2 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_add_drop_add.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_add_drop_add.at:24: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_add_drop_add.at:24 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_add_drop_add.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_add_drop_add.at:25: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_add_drop_add.at:25 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_add_drop_add.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_add_drop_add.at:27: rm -rf MT.old"
echo t_add_drop_add.at:27 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_add_drop_add.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_add_drop_add.at:27: mv  MT MT.old"
echo t_add_drop_add.at:27 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_add_drop_add.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_add_drop_add.at:27: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$BASE_R_SHA ."
echo t_add_drop_add.at:27 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $BASE_R_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_add_drop_add.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_add_drop_add.at:27: mv MT.old/options MT"
echo t_add_drop_add.at:27 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_add_drop_add.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_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_add_drop_add.at:27: test \$PROBE_R_SHA = \$BASE_R_SHA"
echo t_add_drop_add.at:27 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $BASE_R_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_add_drop_add.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 >otherfile <<'_ATEOF'
this space for rent
_ATEOF

$at_traceoff
echo "t_add_drop_add.at:30: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add otherfile"
echo t_add_drop_add.at:30 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add otherfile ) >$at_stdout 2>$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_add_drop_add.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_add_drop_add.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_add_drop_add.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_add_drop_add.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_add_drop_add.at:33: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR merge"
echo t_add_drop_add.at:33 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_add_drop_add.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_add_drop_add.at:34: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update"
echo t_add_drop_add.at:34 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_add_drop_add.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_add_drop_add.at:35: cmp testfile v2"
echo t_add_drop_add.at:35 >$at_check_line_file
( $at_traceon; cmp testfile 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=:
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_add_drop_add.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`
    ;;

  59 ) # 59. t_merge2_add_drop_add.at:1: merge(<add a>, <add a, drop a, add a>)
    at_setup_line='t_merge2_add_drop_add.at:1'
    at_desc='merge(<add a>, <add a, drop a, add a>)'
    $at_quiet $ECHO_N " 59: merge(<add a>, <add a, drop a, add a>)       $ECHO_C"
    at_xfail=no
    (
      echo "59. t_merge2_add_drop_add.at:1: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_merge2_add_drop_add.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_merge2_add_drop_add.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_merge2_add_drop_add.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_merge2_add_drop_add.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_merge2_add_drop_add.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_merge2_add_drop_add.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_merge2_add_drop_add.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_merge2_add_drop_add.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_merge2_add_drop_add.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_merge2_add_drop_add.at:3: rm test_keys"
echo t_merge2_add_drop_add.at:3 >$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_merge2_add_drop_add.at:3: 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 >right_1_a <<'_ATEOF'
foo blah
_ATEOF

cat >right_1_b <<'_ATEOF'
bar blah
_ATEOF

cat >right_2_a <<'_ATEOF'
baz blah
_ATEOF


cat >left <<'_ATEOF'
quux blah
_ATEOF



cat >otherfile <<'_ATEOF'
this space for rent
_ATEOF

$at_traceoff
echo "t_merge2_add_drop_add.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add otherfile"
echo t_merge2_add_drop_add.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add otherfile ) >$at_stdout 2>$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_merge2_add_drop_add.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_merge2_add_drop_add.at:17: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_merge2_add_drop_add.at:17 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_merge2_add_drop_add.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


BASE_R_SHA=`cat MT/revision`

$at_traceoff
echo "t_merge2_add_drop_add.at:20: cp right_1_a testfile"
echo t_merge2_add_drop_add.at:20 >$at_check_line_file
( $at_traceon; cp right_1_a 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_merge2_add_drop_add.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_merge2_add_drop_add.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_merge2_add_drop_add.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_merge2_add_drop_add.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_merge2_add_drop_add.at:22: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_merge2_add_drop_add.at:22 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_merge2_add_drop_add.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_merge2_add_drop_add.at:24: cp right_1_b testfile"
echo t_merge2_add_drop_add.at:24 >$at_check_line_file
( $at_traceon; cp right_1_b 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_merge2_add_drop_add.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_merge2_add_drop_add.at:25: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_merge2_add_drop_add.at:25 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_merge2_add_drop_add.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_merge2_add_drop_add.at:27: rm -f testfile"
echo t_merge2_add_drop_add.at:27 >$at_check_line_file
( $at_traceon; rm -f 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_merge2_add_drop_add.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_merge2_add_drop_add.at:28: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR drop testfile"
echo t_merge2_add_drop_add.at:28 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR drop 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_merge2_add_drop_add.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_merge2_add_drop_add.at:29: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_merge2_add_drop_add.at:29 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_merge2_add_drop_add.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_merge2_add_drop_add.at:31: cp right_2_a testfile"
echo t_merge2_add_drop_add.at:31 >$at_check_line_file
( $at_traceon; cp right_2_a 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_merge2_add_drop_add.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_merge2_add_drop_add.at:32: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_merge2_add_drop_add.at:32 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_merge2_add_drop_add.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_merge2_add_drop_add.at:33: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_merge2_add_drop_add.at:33 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_merge2_add_drop_add.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_merge2_add_drop_add.at:35: rm -rf MT.old"
echo t_merge2_add_drop_add.at:35 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_merge2_add_drop_add.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_merge2_add_drop_add.at:35: mv  MT MT.old"
echo t_merge2_add_drop_add.at:35 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_merge2_add_drop_add.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_merge2_add_drop_add.at:35: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$BASE_R_SHA ."
echo t_merge2_add_drop_add.at:35 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $BASE_R_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_merge2_add_drop_add.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_merge2_add_drop_add.at:35: mv MT.old/options MT"
echo t_merge2_add_drop_add.at:35 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_merge2_add_drop_add.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_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_merge2_add_drop_add.at:35: test \$PROBE_R_SHA = \$BASE_R_SHA"
echo t_merge2_add_drop_add.at:35 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $BASE_R_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_merge2_add_drop_add.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_merge2_add_drop_add.at:37: cp left testfile"
echo t_merge2_add_drop_add.at:37 >$at_check_line_file
( $at_traceon; cp left 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_merge2_add_drop_add.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_merge2_add_drop_add.at:38: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_merge2_add_drop_add.at:38 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_merge2_add_drop_add.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_merge2_add_drop_add.at:39: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_merge2_add_drop_add.at:39 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_merge2_add_drop_add.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_merge2_add_drop_add.at:41: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR merge"
echo t_merge2_add_drop_add.at:41 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_merge2_add_drop_add.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_merge2_add_drop_add.at:42: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update"
echo t_merge2_add_drop_add.at:42 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_merge2_add_drop_add.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_merge2_add_drop_add.at:43: cmp testfile right_2_a || cmp testfile left"
echo t_merge2_add_drop_add.at:43 >$at_check_line_file
( $at_traceon; cmp testfile right_2_a || cmp testfile left ) >$at_stdout 2>$at_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_merge2_add_drop_add.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`
    ;;

  60 ) # 60. t_add_patch_drop_add.at:1: merge(<>, <add a, patch a, drop a, add a>)
    at_setup_line='t_add_patch_drop_add.at:1'
    at_desc='merge(<>, <add a, patch a, drop a, add a>)'
    $at_quiet $ECHO_N " 60: merge(<>, <add a, patch a, drop a, add a>)   $ECHO_C"
    at_xfail=no
    (
      echo "60. t_add_patch_drop_add.at:1: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_add_patch_drop_add.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_add_patch_drop_add.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_add_patch_drop_add.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_add_patch_drop_add.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_add_patch_drop_add.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_add_patch_drop_add.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_add_patch_drop_add.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_add_patch_drop_add.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_add_patch_drop_add.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_add_patch_drop_add.at:3: rm test_keys"
echo t_add_patch_drop_add.at:3 >$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_add_patch_drop_add.at:3: 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 >v1a <<'_ATEOF'
foo blah
_ATEOF

cat >v1b <<'_ATEOF'
bar blah
_ATEOF

cat >v2a <<'_ATEOF'
baz blah
_ATEOF



cat >randomfile <<'_ATEOF'
blah blah blah
_ATEOF

$at_traceoff
echo "t_add_patch_drop_add.at:13: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add randomfile"
echo t_add_patch_drop_add.at:13 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add randomfile ) >$at_stdout 2>$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_add_patch_drop_add.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_add_patch_drop_add.at:14: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_add_patch_drop_add.at:14 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_add_patch_drop_add.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


BASE_R_SHA=`cat MT/revision`

$at_traceoff
echo "t_add_patch_drop_add.at:17: cp v1a testfile"
echo t_add_patch_drop_add.at:17 >$at_check_line_file
( $at_traceon; cp v1a 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_add_patch_drop_add.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_add_patch_drop_add.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_add_patch_drop_add.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_add_patch_drop_add.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_add_patch_drop_add.at:19: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_add_patch_drop_add.at:19 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_add_patch_drop_add.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_add_patch_drop_add.at:21: cp v1b testfile"
echo t_add_patch_drop_add.at:21 >$at_check_line_file
( $at_traceon; cp v1b 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_add_patch_drop_add.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_add_patch_drop_add.at:22: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_add_patch_drop_add.at:22 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_add_patch_drop_add.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_add_patch_drop_add.at:24: rm -f testfile"
echo t_add_patch_drop_add.at:24 >$at_check_line_file
( $at_traceon; rm -f 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_add_patch_drop_add.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_add_patch_drop_add.at:25: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR drop testfile"
echo t_add_patch_drop_add.at:25 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR drop 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_add_patch_drop_add.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_add_patch_drop_add.at:26: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_add_patch_drop_add.at:26 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_add_patch_drop_add.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_add_patch_drop_add.at:28: cp v2a testfile"
echo t_add_patch_drop_add.at:28 >$at_check_line_file
( $at_traceon; cp v2a 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_add_patch_drop_add.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_add_patch_drop_add.at:29: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_add_patch_drop_add.at:29 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_add_patch_drop_add.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_add_patch_drop_add.at:30: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_add_patch_drop_add.at:30 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_add_patch_drop_add.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_add_patch_drop_add.at:32: rm -rf MT.old"
echo t_add_patch_drop_add.at:32 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_add_patch_drop_add.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_add_patch_drop_add.at:32: mv  MT MT.old"
echo t_add_patch_drop_add.at:32 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_add_patch_drop_add.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_add_patch_drop_add.at:32: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$BASE_R_SHA ."
echo t_add_patch_drop_add.at:32 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $BASE_R_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_add_patch_drop_add.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_add_patch_drop_add.at:32: mv MT.old/options MT"
echo t_add_patch_drop_add.at:32 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_add_patch_drop_add.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_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_add_patch_drop_add.at:32: test \$PROBE_R_SHA = \$BASE_R_SHA"
echo t_add_patch_drop_add.at:32 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $BASE_R_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_add_patch_drop_add.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 >otherfile <<'_ATEOF'
this space for rent
_ATEOF

$at_traceoff
echo "t_add_patch_drop_add.at:35: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add otherfile"
echo t_add_patch_drop_add.at:35 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add otherfile ) >$at_stdout 2>$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_add_patch_drop_add.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_add_patch_drop_add.at:36: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_add_patch_drop_add.at:36 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_add_patch_drop_add.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_add_patch_drop_add.at:38: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR merge"
echo t_add_patch_drop_add.at:38 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_add_patch_drop_add.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_add_patch_drop_add.at:39: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update"
echo t_add_patch_drop_add.at:39 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_add_patch_drop_add.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_add_patch_drop_add.at:40: cmp testfile v2a"
echo t_add_patch_drop_add.at:40 >$at_check_line_file
( $at_traceon; cmp testfile v2a ) >$at_stdout 2>$at_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_add_patch_drop_add.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  61 ) # 61. t_patch_vs_drop_add.at:1: merge(<patch a>, <drop a, add a>)
    at_setup_line='t_patch_vs_drop_add.at:1'
    at_desc='merge(<patch a>, <drop a, add a>)'
    $at_quiet $ECHO_N " 61: merge(<patch a>, <drop a, add a>)            $ECHO_C"
    at_xfail=no
    (
      echo "61. t_patch_vs_drop_add.at:1: testing ..."
      $at_traceon


# In this case, the patch should be completely ignored; we shouldn't
# even try to do a merge.



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_patch_vs_drop_add.at:6: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_patch_vs_drop_add.at:6 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_patch_vs_drop_add.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_patch_vs_drop_add.at:6: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_patch_vs_drop_add.at:6 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_patch_vs_drop_add.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_patch_vs_drop_add.at:6: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_patch_vs_drop_add.at:6 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_patch_vs_drop_add.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_patch_vs_drop_add.at:6: rm test_keys"
echo t_patch_vs_drop_add.at:6 >$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_patch_vs_drop_add.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 >base <<'_ATEOF'
foo blah
_ATEOF

cat >left <<'_ATEOF'
bar blah
_ATEOF

cat >new_right <<'_ATEOF'
baz blah
_ATEOF


$at_traceoff
echo "t_patch_vs_drop_add.at:15: cp base testfile"
echo t_patch_vs_drop_add.at:15 >$at_check_line_file
( $at_traceon; cp base 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_patch_vs_drop_add.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_patch_vs_drop_add.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_patch_vs_drop_add.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_patch_vs_drop_add.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_patch_vs_drop_add.at:17: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_patch_vs_drop_add.at:17 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_patch_vs_drop_add.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


BASE_R_SHA=`cat MT/revision`

$at_traceoff
echo "t_patch_vs_drop_add.at:20: cp left testfile"
echo t_patch_vs_drop_add.at:20 >$at_check_line_file
( $at_traceon; cp left 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_patch_vs_drop_add.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_patch_vs_drop_add.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_patch_vs_drop_add.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_patch_vs_drop_add.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_patch_vs_drop_add.at:23: rm -rf MT.old"
echo t_patch_vs_drop_add.at:23 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_patch_vs_drop_add.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_patch_vs_drop_add.at:23: mv  MT MT.old"
echo t_patch_vs_drop_add.at:23 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_patch_vs_drop_add.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_patch_vs_drop_add.at:23: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$BASE_R_SHA ."
echo t_patch_vs_drop_add.at:23 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $BASE_R_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_patch_vs_drop_add.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_patch_vs_drop_add.at:23: mv MT.old/options MT"
echo t_patch_vs_drop_add.at:23 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_patch_vs_drop_add.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_patch_vs_drop_add.at:23: test \$PROBE_R_SHA = \$BASE_R_SHA"
echo t_patch_vs_drop_add.at:23 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $BASE_R_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_patch_vs_drop_add.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_patch_vs_drop_add.at:25: rm -f testfile"
echo t_patch_vs_drop_add.at:25 >$at_check_line_file
( $at_traceon; rm -f 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_patch_vs_drop_add.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_patch_vs_drop_add.at:26: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR drop testfile"
echo t_patch_vs_drop_add.at:26 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR drop 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_patch_vs_drop_add.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_patch_vs_drop_add.at:27: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_patch_vs_drop_add.at:27 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_patch_vs_drop_add.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_patch_vs_drop_add.at:29: cp new_right testfile"
echo t_patch_vs_drop_add.at:29 >$at_check_line_file
( $at_traceon; cp new_right 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_patch_vs_drop_add.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_patch_vs_drop_add.at:30: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_patch_vs_drop_add.at:30 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_patch_vs_drop_add.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_patch_vs_drop_add.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_patch_vs_drop_add.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_patch_vs_drop_add.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_patch_vs_drop_add.at:33: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR merge"
echo t_patch_vs_drop_add.at:33 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_patch_vs_drop_add.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_patch_vs_drop_add.at:34: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update"
echo t_patch_vs_drop_add.at:34 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_patch_vs_drop_add.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_patch_vs_drop_add.at:35: cmp testfile new_right"
echo t_patch_vs_drop_add.at:35 >$at_check_line_file
( $at_traceon; cmp testfile new_right ) >$at_stdout 2>$at_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_patch_vs_drop_add.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`
    ;;

  62 ) # 62. t_explicit_merge.at:1: explicit_merge
    at_setup_line='t_explicit_merge.at:1'
    at_desc='explicit_merge'
    $at_quiet $ECHO_N " 62: explicit_merge                               $ECHO_C"
    at_xfail=no
    (
      echo "62. t_explicit_merge.at:1: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_explicit_merge.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_explicit_merge.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_explicit_merge.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_explicit_merge.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_explicit_merge.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_explicit_merge.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_explicit_merge.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_explicit_merge.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_explicit_merge.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_explicit_merge.at:3: rm test_keys"
echo t_explicit_merge.at:3 >$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_explicit_merge.at:3: 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'
1 blah
2 blah
3 blah
4 blah
5 blah
_ATEOF

$at_traceoff
echo "t_explicit_merge.at:10: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_explicit_merge.at:10 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_explicit_merge.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_explicit_merge.at:11: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_explicit_merge.at:11 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_explicit_merge.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


ANC=`cat MT/revision`

cat >dont_merge <<'_ATEOF'
1 blah
2 change not to merge
3 blah
4 change not to merge
5 blah
_ATEOF

cat >left <<'_ATEOF'
1 blah
2 left change
3 blah
4 blah
5 blah
_ATEOF

cat >right <<'_ATEOF'
1 blah
2 blah
3 blah
4 right change
5 blah
_ATEOF

cat >merged <<'_ATEOF'
1 blah
2 left change
3 blah
4 right change
5 blah
_ATEOF


$at_traceoff
echo "t_explicit_merge.at:39: cp dont_merge testfile"
echo t_explicit_merge.at:39 >$at_check_line_file
( $at_traceon; cp dont_merge 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_explicit_merge.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_explicit_merge.at:40: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_explicit_merge.at:40 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_explicit_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




$at_traceoff
echo "t_explicit_merge.at:42: rm -rf MT.old"
echo t_explicit_merge.at:42 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_explicit_merge.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_explicit_merge.at:42: mv  MT MT.old"
echo t_explicit_merge.at:42 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_explicit_merge.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_explicit_merge.at:42: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$ANC ."
echo t_explicit_merge.at:42 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $ANC . ) >$at_stdout 2>$at_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_explicit_merge.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_explicit_merge.at:42: mv MT.old/options MT"
echo t_explicit_merge.at:42 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_explicit_merge.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_explicit_merge.at:42: test \$PROBE_R_SHA = \$ANC"
echo t_explicit_merge.at:42 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $ANC ) >$at_stdout 2>$at_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_explicit_merge.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_explicit_merge.at:43: cp left testfile"
echo t_explicit_merge.at:43 >$at_check_line_file
( $at_traceon; cp left 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_explicit_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_explicit_merge.at:44: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_explicit_merge.at:44 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_explicit_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


LEFT=`cat MT/revision`


$at_traceoff
echo "t_explicit_merge.at:47: rm -rf MT.old"
echo t_explicit_merge.at:47 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_explicit_merge.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_explicit_merge.at:47: mv  MT MT.old"
echo t_explicit_merge.at:47 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_explicit_merge.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_explicit_merge.at:47: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$ANC ."
echo t_explicit_merge.at:47 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $ANC . ) >$at_stdout 2>$at_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_explicit_merge.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_explicit_merge.at:47: mv MT.old/options MT"
echo t_explicit_merge.at:47 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_explicit_merge.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_explicit_merge.at:47: test \$PROBE_R_SHA = \$ANC"
echo t_explicit_merge.at:47 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $ANC ) >$at_stdout 2>$at_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_explicit_merge.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_explicit_merge.at:48: cp right testfile"
echo t_explicit_merge.at:48 >$at_check_line_file
( $at_traceon; cp right 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_explicit_merge.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_explicit_merge.at:49: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_explicit_merge.at:49 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_explicit_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


RIGHT=`cat MT/revision`

$at_traceoff
echo "t_explicit_merge.at:52: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR explicit_merge \$LEFT \$RIGHT otherbranch"
echo t_explicit_merge.at:52 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR explicit_merge $LEFT $RIGHT otherbranch ) >$at_stdout 2>$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_explicit_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


# Check that it didn't end up on our current branch, i.e. update doesn't do anything
$at_traceoff
echo "t_explicit_merge.at:55: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update"
echo t_explicit_merge.at:55 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_explicit_merge.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_explicit_merge.at:56: cmp right testfile"
echo t_explicit_merge.at:56 >$at_check_line_file
( $at_traceon; cmp right 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_explicit_merge.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_explicit_merge.at:58: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout --branch=otherbranch otherbranch_co"
echo t_explicit_merge.at:58 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout --branch=otherbranch otherbranch_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_explicit_merge.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_explicit_merge.at:59: cmp merged otherbranch_co/testfile"
echo t_explicit_merge.at:59 >$at_check_line_file
( $at_traceon; cmp merged otherbranch_co/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_explicit_merge.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  63 ) # 63. t_ambig_update.at:1: update with multiple candidates
    at_setup_line='t_ambig_update.at:1'
    at_desc='update with multiple candidates'
    $at_quiet $ECHO_N " 63: update with multiple candidates              $ECHO_C"
    at_xfail=no
    (
      echo "63. t_ambig_update.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_ambig_update.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_ambig_update.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_ambig_update.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_ambig_update.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_ambig_update.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_ambig_update.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_ambig_update.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_ambig_update.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_ambig_update.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_ambig_update.at:2: rm test_keys"
echo t_ambig_update.at:2 >$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_ambig_update.at:2: 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 sure that when there are multiple plausible heads, update
# fails, and prints some informative message listing the heads.


cat >testfile <<'_ATEOF'
foo
_ATEOF

$at_traceoff
echo "t_ambig_update.at:8: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_ambig_update.at:8 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_ambig_update.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_ambig_update.at:9: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_ambig_update.at:9 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_ambig_update.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


ANC=`cat MT/revision`


cat >file1 <<'_ATEOF'
bar
_ATEOF

$at_traceoff
echo "t_ambig_update.at:13: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add file1"
echo t_ambig_update.at:13 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add file1 ) >$at_stdout 2>$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_ambig_update.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_ambig_update.at:14: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_ambig_update.at:14 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_ambig_update.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


LEFT=`cat MT/revision`


$at_traceoff
echo "t_ambig_update.at:17: rm -rf MT.old"
echo t_ambig_update.at:17 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_ambig_update.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_ambig_update.at:17: mv  MT MT.old"
echo t_ambig_update.at:17 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_ambig_update.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_ambig_update.at:17: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$ANC ."
echo t_ambig_update.at:17 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $ANC . ) >$at_stdout 2>$at_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_ambig_update.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_ambig_update.at:17: mv MT.old/options MT"
echo t_ambig_update.at:17 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_ambig_update.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_ambig_update.at:17: test \$PROBE_R_SHA = \$ANC"
echo t_ambig_update.at:17 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $ANC ) >$at_stdout 2>$at_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_ambig_update.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




cat >file1 <<'_ATEOF'
baz
_ATEOF

$at_traceoff
echo "t_ambig_update.at:20: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add file1"
echo t_ambig_update.at:20 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add file1 ) >$at_stdout 2>$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_ambig_update.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_ambig_update.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_ambig_update.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_ambig_update.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


RIGHT=`cat MT/revision`


$at_traceoff
echo "t_ambig_update.at:24: rm -rf MT.old"
echo t_ambig_update.at:24 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_ambig_update.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_ambig_update.at:24: mv  MT MT.old"
echo t_ambig_update.at:24 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_ambig_update.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_ambig_update.at:24: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$ANC ."
echo t_ambig_update.at:24 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $ANC . ) >$at_stdout 2>$at_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_ambig_update.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_ambig_update.at:24: mv MT.old/options MT"
echo t_ambig_update.at:24 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_ambig_update.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_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_ambig_update.at:24: test \$PROBE_R_SHA = \$ANC"
echo t_ambig_update.at:24 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $ANC ) >$at_stdout 2>$at_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_ambig_update.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



# There are two possible candidates, so our update should fail.
$at_traceoff
echo "t_ambig_update.at:27: rm -f file1"
echo t_ambig_update.at:27 >$at_check_line_file
( $at_traceon; rm -f file1 ) >$at_stdout 2>$at_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_ambig_update.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_ambig_update.at:28: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update"
echo t_ambig_update.at:28 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR update ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; tee stderr <$at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   1) ;;
   *) echo "t_ambig_update.at:28: 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_ambig_update.at:29: test ! -e file1"
echo t_ambig_update.at:29 >$at_check_line_file
( $at_traceon; test ! -e file1 ) >$at_stdout 2>$at_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_ambig_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

# Make sure that the failure message listed the possibilities
$at_traceoff
echo "t_ambig_update.at:31: grep -q \$LEFT stderr"
echo t_ambig_update.at:31 >$at_check_line_file
( $at_traceon; grep -q $LEFT stderr ) >$at_stdout 2>$at_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_ambig_update.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_ambig_update.at:32: grep -q \$RIGHT stderr"
echo t_ambig_update.at:32 >$at_check_line_file
( $at_traceon; grep -q $RIGHT stderr ) >$at_stdout 2>$at_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_ambig_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_ambig_update.at:33: grep -q \$ANC stderr"
echo t_ambig_update.at:33 >$at_check_line_file
( $at_traceon; grep -q $ANC stderr ) >$at_stdout 2>$at_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_ambig_update.at:33: 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 also when one side is deeper than the other...

$at_traceoff
echo "t_ambig_update.at:36: rm -rf MT.old"
echo t_ambig_update.at:36 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_ambig_update.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_ambig_update.at:36: mv  MT MT.old"
echo t_ambig_update.at:36 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_ambig_update.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_ambig_update.at:36: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$LEFT ."
echo t_ambig_update.at:36 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $LEFT . ) >$at_stdout 2>$at_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_ambig_update.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_ambig_update.at:36: mv MT.old/options MT"
echo t_ambig_update.at:36 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_ambig_update.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_ambig_update.at:36: test \$PROBE_R_SHA = \$LEFT"
echo t_ambig_update.at:36 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $LEFT ) >$at_stdout 2>$at_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_ambig_update.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



cat >file2 <<'_ATEOF'
blah blah blah
_ATEOF

$at_traceoff
echo "t_ambig_update.at:38: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add file2"
echo t_ambig_update.at:38 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add file2 ) >$at_stdout 2>$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_ambig_update.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_ambig_update.at:39: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_ambig_update.at:39 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_ambig_update.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


LEFT2=`cat MT/revision`


$at_traceoff
echo "t_ambig_update.at:42: rm -rf MT.old"
echo t_ambig_update.at:42 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_ambig_update.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_ambig_update.at:42: mv  MT MT.old"
echo t_ambig_update.at:42 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_ambig_update.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_ambig_update.at:42: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$ANC ."
echo t_ambig_update.at:42 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $ANC . ) >$at_stdout 2>$at_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_ambig_update.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_ambig_update.at:42: mv MT.old/options MT"
echo t_ambig_update.at:42 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_ambig_update.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_ambig_update.at:42: test \$PROBE_R_SHA = \$ANC"
echo t_ambig_update.at:42 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $ANC ) >$at_stdout 2>$at_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_ambig_update.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_ambig_update.at:43: rm -f file1"
echo t_ambig_update.at:43 >$at_check_line_file
( $at_traceon; rm -f file1 ) >$at_stdout 2>$at_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_ambig_update.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_ambig_update.at:44: rm -f file2"
echo t_ambig_update.at:44 >$at_check_line_file
( $at_traceon; rm -f file2 ) >$at_stdout 2>$at_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_ambig_update.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_ambig_update.at:45: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update"
echo t_ambig_update.at:45 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR update ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; tee stderr <$at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   1) ;;
   *) echo "t_ambig_update.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_ambig_update.at:46: test ! -e file1"
echo t_ambig_update.at:46 >$at_check_line_file
( $at_traceon; test ! -e file1 ) >$at_stdout 2>$at_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_ambig_update.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_ambig_update.at:47: test ! -e file2"
echo t_ambig_update.at:47 >$at_check_line_file
( $at_traceon; test ! -e file2 ) >$at_stdout 2>$at_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_ambig_update.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

# Make sure that the failure message listed the possibilities
$at_traceoff
echo "t_ambig_update.at:49: grep -q \$LEFT stderr"
echo t_ambig_update.at:49 >$at_check_line_file
( $at_traceon; grep -q $LEFT stderr ) >$at_stdout 2>$at_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_ambig_update.at:49: 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_ambig_update.at:50: grep -q \$LEFT2 stderr"
echo t_ambig_update.at:50 >$at_check_line_file
( $at_traceon; grep -q $LEFT2 stderr ) >$at_stdout 2>$at_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_ambig_update.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_ambig_update.at:51: grep -q \$RIGHT stderr"
echo t_ambig_update.at:51 >$at_check_line_file
( $at_traceon; grep -q $RIGHT stderr ) >$at_stdout 2>$at_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_ambig_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
echo "t_ambig_update.at:52: grep -q \$ANC stderr"
echo t_ambig_update.at:52 >$at_check_line_file
( $at_traceon; grep -q $ANC stderr ) >$at_stdout 2>$at_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_ambig_update.at:52: 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`
    ;;

  64 ) # 64. t_checkout_dir.at:1: checkout validates target directory
    at_setup_line='t_checkout_dir.at:1'
    at_desc='checkout validates target directory'
    $at_quiet $ECHO_N " 64: checkout validates target directory          $ECHO_C"
    at_xfail=no
      test -O / && at_xfail=yes
    (
      echo "64. t_checkout_dir.at:1: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_checkout_dir.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_checkout_dir.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_checkout_dir.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_checkout_dir.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_checkout_dir.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_checkout_dir.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_checkout_dir.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_checkout_dir.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_checkout_dir.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_checkout_dir.at:3: rm test_keys"
echo t_checkout_dir.at:3 >$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_checkout_dir.at:3: 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'
foo
_ATEOF

$at_traceoff
echo "t_checkout_dir.at:6: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_checkout_dir.at:6 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_checkout_dir.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_checkout_dir.at:7: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_checkout_dir.at:7 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_checkout_dir.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_checkout_dir.at:10: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch checkout test_dir1"
echo t_checkout_dir.at:10 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch checkout test_dir1 ) >$at_stdout 2>$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_checkout_dir.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


echo >test_dir2
$at_traceoff
echo "t_checkout_dir.at:14: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch checkout test_dir2"
echo t_checkout_dir.at:14 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch checkout test_dir2 ) >$at_stdout 2>$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_checkout_dir.at:14: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


mkdir test_dir3
chmod 444 test_dir3
# XFAIL if run as root (hi Gentoo!)

$at_traceoff
echo "t_checkout_dir.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch checkout test_dir3"
echo t_checkout_dir.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch checkout test_dir3 ) >$at_stdout 2>$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_checkout_dir.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

$at_traceoff
echo "t_checkout_dir.at:23: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch checkout test_dir3/subdir"
echo t_checkout_dir.at:23 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch checkout test_dir3/subdir ) >$at_stdout 2>$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_checkout_dir.at:23: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

# Reset the permissions so Autotest can correctly clean up our
# temporary directory.
chmod 700 test_dir3

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

  65 ) # 65. t_checkout_options.at:1: checkout creates right MT/options
    at_setup_line='t_checkout_options.at:1'
    at_desc='checkout creates right MT/options'
    $at_quiet $ECHO_N " 65: checkout creates right MT/options            $ECHO_C"
    at_xfail=no
    (
      echo "65. t_checkout_options.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_checkout_options.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_checkout_options.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_checkout_options.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_checkout_options.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_checkout_options.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_checkout_options.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_checkout_options.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_checkout_options.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_checkout_options.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_checkout_options.at:2: rm test_keys"
echo t_checkout_options.at:2 >$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_checkout_options.at:2: 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'
foo
_ATEOF

$at_traceoff
echo "t_checkout_options.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_checkout_options.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_checkout_options.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_checkout_options.at:6: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_checkout_options.at:6 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_checkout_options.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


REV=`cat MT/revision`

# We use RAW_MONOTONE because it used to be that passing --db= (as
# MONOTONE does) would hide a bug in this functionality...

# all of these inherit options settings from the current MT dir
# unless they override them on the command line

$at_traceoff
echo "t_checkout_options.at:15: \$PREEXECUTE monotone --norc checkout test_dir1"
echo t_checkout_options.at:15 >$at_check_line_file
( $at_traceon; $PREEXECUTE monotone --norc checkout test_dir1 ) >$at_stdout 2>$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_checkout_options.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_checkout_options.at:16: \$PREEXECUTE monotone --norc --db=test.db checkout test_dir2"
echo t_checkout_options.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE monotone --norc --db=test.db checkout test_dir2 ) >$at_stdout 2>$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_checkout_options.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_checkout_options.at:17: \$PREEXECUTE monotone --norc --db=test.db --branch=testbranch checkout test_dir3"
echo t_checkout_options.at:17 >$at_check_line_file
( $at_traceon; $PREEXECUTE monotone --norc --db=test.db --branch=testbranch checkout test_dir3 ) >$at_stdout 2>$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_checkout_options.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_checkout_options.at:18: \$PREEXECUTE monotone --norc --branch=testbranch checkout test_dir4"
echo t_checkout_options.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE monotone --norc --branch=testbranch checkout test_dir4 ) >$at_stdout 2>$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_checkout_options.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_checkout_options.at:19: \$PREEXECUTE monotone --norc --db=test.db --branch=testbranch checkout \$REV test_dir5"
echo t_checkout_options.at:19 >$at_check_line_file
( $at_traceon; $PREEXECUTE monotone --norc --db=test.db --branch=testbranch checkout $REV test_dir5 ) >$at_stdout 2>$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_checkout_options.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_checkout_options.at:20: \$PREEXECUTE monotone --norc --branch=testbranch checkout \$REV test_dir6"
echo t_checkout_options.at:20 >$at_check_line_file
( $at_traceon; $PREEXECUTE monotone --norc --branch=testbranch checkout $REV test_dir6 ) >$at_stdout 2>$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_checkout_options.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_checkout_options.at:21: \$PREEXECUTE monotone --norc --db=test.db checkout \$REV test_dir7"
echo t_checkout_options.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE monotone --norc --db=test.db checkout $REV test_dir7 ) >$at_stdout 2>$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_checkout_options.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_checkout_options.at:22: \$PREEXECUTE monotone --norc checkout \$REV test_dir8"
echo t_checkout_options.at:22 >$at_check_line_file
( $at_traceon; $PREEXECUTE monotone --norc checkout $REV test_dir8 ) >$at_stdout 2>$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_checkout_options.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


# checkout fails if the specified revision is not a member of the specified branch
$at_traceoff
echo "t_checkout_options.at:25: \$PREEXECUTE monotone --norc --branch=foobar checkout \$REV test_dir9"
echo t_checkout_options.at:25 >$at_check_line_file
( $at_traceon; $PREEXECUTE monotone --norc --branch=foobar checkout $REV test_dir9 ) >$at_stdout 2>$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_checkout_options.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_checkout_options.at:26: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR cert \$REV branch foobar"
echo t_checkout_options.at:26 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR cert $REV branch foobar ) >$at_stdout 2>$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_checkout_options.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_checkout_options.at:27: \$PREEXECUTE monotone --norc --branch=foobar checkout \$REV test_dir10"
echo t_checkout_options.at:27 >$at_check_line_file
( $at_traceon; $PREEXECUTE monotone --norc --branch=foobar checkout $REV test_dir10 ) >$at_stdout 2>$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_checkout_options.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



for DIR in test_dir{1,2,3,4,5,6,7,8}; do
  $at_traceoff
echo "t_checkout_options.at:31: echo DIR=\$DIR"
echo t_checkout_options.at:31 >$at_check_line_file
( $at_traceon; echo DIR=$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:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_checkout_options.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_checkout_options.at:32: test -f \$DIR/MT/options"
echo t_checkout_options.at:32 >$at_check_line_file
( $at_traceon; test -f $DIR/MT/options ) >$at_stdout 2>$at_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_checkout_options.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_checkout_options.at:33: grep -q test.db \$DIR/MT/options"
echo t_checkout_options.at:33 >$at_check_line_file
( $at_traceon; grep -q test.db $DIR/MT/options ) >$at_stdout 2>$at_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_checkout_options.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_checkout_options.at:34: grep -q testbranch \$DIR/MT/options"
echo t_checkout_options.at:34 >$at_check_line_file
( $at_traceon; grep -q testbranch $DIR/MT/options ) >$at_stdout 2>$at_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_checkout_options.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

done

$at_traceoff
echo "t_checkout_options.at:37: grep -q foobar test_dir10/MT/options"
echo t_checkout_options.at:37 >$at_check_line_file
( $at_traceon; grep -q foobar test_dir10/MT/options ) >$at_stdout 2>$at_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_checkout_options.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`
    ;;

  66 ) # 66. t_trusted.at:1: trust hooks and 'trusted' command
    at_setup_line='t_trusted.at:1'
    at_desc='trust hooks and 'trusted' command'
    $at_quiet $ECHO_N " 66: trust hooks and 'trusted' command            $ECHO_C"
    at_xfail=no
    (
      echo "66. t_trusted.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_trusted.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_trusted.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_trusted.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_trusted.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_trusted.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_trusted.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_trusted.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_trusted.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_trusted.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_trusted.at:2: rm test_keys"
echo t_trusted.at:2 >$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_trusted.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



# run as CHECK_TRUSTED(rev, name, value, signers)

# run as CHECK_UNTRUSTED(rev, name, value, signers)


GOOD=1111111111111111111111111111111111111111
BAD=0000000000000000000000000000000000000000

# Idea here is to check a bunch of combinations, to make sure that
# trust hooks get all information correctly

$at_traceoff
echo "t_trusted.at:20: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR trusted \$GOOD foo bar foo@bar.com"
echo t_trusted.at:20 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR trusted $GOOD foo bar foo@bar.com ) >$at_stdout 2>$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_trusted.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_trusted.at:20: grep -qi ' trusted' stdout"
echo t_trusted.at:20 >$at_check_line_file
( $at_traceon; grep -qi ' trusted' 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;;
   0) ;;
   *) echo "t_trusted.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_trusted.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR trusted \$GOOD foo bar alice@trusted.com"
echo t_trusted.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR trusted $GOOD foo bar alice@trusted.com ) >$at_stdout 2>$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_trusted.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_trusted.at:21: grep -qi ' trusted' stdout"
echo t_trusted.at:21 >$at_check_line_file
( $at_traceon; grep -qi ' trusted' 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;;
   0) ;;
   *) echo "t_trusted.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_trusted.at:22: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR trusted \$GOOD foo bar mallory@evil.com"
echo t_trusted.at:22 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR trusted $GOOD foo bar mallory@evil.com ) >$at_stdout 2>$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_trusted.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_trusted.at:22: grep -qi ' untrusted' stdout"
echo t_trusted.at:22 >$at_check_line_file
( $at_traceon; grep -qi ' untrusted' 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;;
   0) ;;
   *) echo "t_trusted.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_trusted.at:23: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR trusted \$GOOD bad-cert bad-val foo@bar.com"
echo t_trusted.at:23 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR trusted $GOOD bad-cert bad-val foo@bar.com ) >$at_stdout 2>$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_trusted.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_trusted.at:23: grep -qi ' trusted' stdout"
echo t_trusted.at:23 >$at_check_line_file
( $at_traceon; grep -qi ' trusted' 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;;
   0) ;;
   *) echo "t_trusted.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_trusted.at:24: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR trusted \$BAD good-cert bad-val foo@bar.com"
echo t_trusted.at:24 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR trusted $BAD good-cert bad-val foo@bar.com ) >$at_stdout 2>$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_trusted.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_trusted.at:24: grep -qi ' trusted' stdout"
echo t_trusted.at:24 >$at_check_line_file
( $at_traceon; grep -qi ' trusted' 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;;
   0) ;;
   *) echo "t_trusted.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_trusted.at:25: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR trusted \$BAD bad-cert good-val foo@bar.com"
echo t_trusted.at:25 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR trusted $BAD bad-cert good-val foo@bar.com ) >$at_stdout 2>$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_trusted.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_trusted.at:25: grep -qi ' trusted' stdout"
echo t_trusted.at:25 >$at_check_line_file
( $at_traceon; grep -qi ' trusted' 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;;
   0) ;;
   *) echo "t_trusted.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_trusted.at:26: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR trusted \$BAD bad-cert bad-val foo@bar.com"
echo t_trusted.at:26 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR trusted $BAD bad-cert bad-val foo@bar.com ) >$at_stdout 2>$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_trusted.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_trusted.at:26: grep -qi ' untrusted' stdout"
echo t_trusted.at:26 >$at_check_line_file
( $at_traceon; grep -qi ' untrusted' 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;;
   0) ;;
   *) echo "t_trusted.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_trusted.at:27: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR trusted \$BAD bad-cert bad-val alice@trusted.com"
echo t_trusted.at:27 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR trusted $BAD bad-cert bad-val alice@trusted.com ) >$at_stdout 2>$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_trusted.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_trusted.at:27: grep -qi ' trusted' stdout"
echo t_trusted.at:27 >$at_check_line_file
( $at_traceon; grep -qi ' trusted' 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;;
   0) ;;
   *) echo "t_trusted.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_trusted.at:29: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR trusted \$GOOD foo bar foo@bar.com alice@trusted.com"
echo t_trusted.at:29 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR trusted $GOOD foo bar foo@bar.com alice@trusted.com ) >$at_stdout 2>$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_trusted.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_trusted.at:29: grep -qi ' trusted' stdout"
echo t_trusted.at:29 >$at_check_line_file
( $at_traceon; grep -qi ' trusted' 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;;
   0) ;;
   *) echo "t_trusted.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_trusted.at:30: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR trusted \$GOOD foo bar alice@trusted.com foo@bar.com"
echo t_trusted.at:30 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR trusted $GOOD foo bar alice@trusted.com foo@bar.com ) >$at_stdout 2>$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_trusted.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_trusted.at:30: grep -qi ' trusted' stdout"
echo t_trusted.at:30 >$at_check_line_file
( $at_traceon; grep -qi ' trusted' 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;;
   0) ;;
   *) echo "t_trusted.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_trusted.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR trusted \$GOOD foo bar foo@bar.com mallory@evil.com"
echo t_trusted.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR trusted $GOOD foo bar foo@bar.com mallory@evil.com ) >$at_stdout 2>$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_trusted.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_trusted.at:31: grep -qi ' untrusted' stdout"
echo t_trusted.at:31 >$at_check_line_file
( $at_traceon; grep -qi ' untrusted' 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;;
   0) ;;
   *) echo "t_trusted.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_trusted.at:32: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR trusted \$GOOD foo bar mallory@evil.com foo@bar.com"
echo t_trusted.at:32 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR trusted $GOOD foo bar mallory@evil.com foo@bar.com ) >$at_stdout 2>$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_trusted.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_trusted.at:32: grep -qi ' untrusted' stdout"
echo t_trusted.at:32 >$at_check_line_file
( $at_traceon; grep -qi ' untrusted' 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;;
   0) ;;
   *) echo "t_trusted.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_trusted.at:33: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR trusted \$BAD bad-cert bad-val foo@bar.com alice@trusted.com"
echo t_trusted.at:33 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR trusted $BAD bad-cert bad-val foo@bar.com alice@trusted.com ) >$at_stdout 2>$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_trusted.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_trusted.at:33: grep -qi ' trusted' stdout"
echo t_trusted.at:33 >$at_check_line_file
( $at_traceon; grep -qi ' trusted' 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;;
   0) ;;
   *) echo "t_trusted.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_trusted.at:34: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR trusted \$BAD bad-cert bad-val alice@trusted.com foo@bar.com"
echo t_trusted.at:34 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR trusted $BAD bad-cert bad-val alice@trusted.com foo@bar.com ) >$at_stdout 2>$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_trusted.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_trusted.at:34: grep -qi ' trusted' stdout"
echo t_trusted.at:34 >$at_check_line_file
( $at_traceon; grep -qi ' trusted' 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;;
   0) ;;
   *) echo "t_trusted.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`
    ;;

  67 ) # 67. t_attr.at:1: attr set adds .mt-attrs
    at_setup_line='t_attr.at:1'
    at_desc='attr set adds .mt-attrs'
    $at_quiet $ECHO_N " 67: attr set adds .mt-attrs                      $ECHO_C"
    at_xfail=no
    (
      echo "67. t_attr.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_attr.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_attr.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_attr.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_attr.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_attr.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_attr.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_attr.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_attr.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_attr.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_attr.at:2: rm test_keys"
echo t_attr.at:2 >$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_attr.at:2: 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'
foo bar
_ATEOF

$at_traceoff
echo "t_attr.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_attr.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_attr.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_attr.at:6: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR attr set testfile unique_key unique_value"
echo t_attr.at:6 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR attr set testfile unique_key unique_value ) >$at_stdout 2>$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_attr.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_attr.at:7: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR attr get testfile"
echo t_attr.at:7 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR attr get 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_attr.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_attr.at:8: grep -q unique_key stdout"
echo t_attr.at:8 >$at_check_line_file
( $at_traceon; grep -q unique_key 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;;
   0) ;;
   *) echo "t_attr.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_attr.at:9: grep -q unique_value stdout"
echo t_attr.at:9 >$at_check_line_file
( $at_traceon; grep -q unique_value 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;;
   0) ;;
   *) echo "t_attr.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_attr.at:10: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR attr get testfile unique_key"
echo t_attr.at:10 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR attr get testfile unique_key ) >$at_stdout 2>$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_attr.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_attr.at:11: grep -q unique_value stdout"
echo t_attr.at:11 >$at_check_line_file
( $at_traceon; grep -q unique_value 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;;
   0) ;;
   *) echo "t_attr.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_attr.at:13: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_attr.at:13 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_attr.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


REV=`cat MT/revision`

# Make sure that 'attr set' automatically did an 'add .mt-attrs' if necessary.
$at_traceoff
echo "t_attr.at:17: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$REV testdir"
echo t_attr.at:17 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $REV 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_attr.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_attr.at:18: test -f testdir/.mt-attrs"
echo t_attr.at:18 >$at_check_line_file
( $at_traceon; test -f testdir/.mt-attrs ) >$at_stdout 2>$at_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_attr.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`
    ;;

  68 ) # 68. t_rcfile_required.at:1: --rcfile requires extant file
    at_setup_line='t_rcfile_required.at:1'
    at_desc='--rcfile requires extant file'
    $at_quiet $ECHO_N " 68: --rcfile requires extant file                $ECHO_C"
    at_xfail=no
    (
      echo "68. t_rcfile_required.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_rcfile_required.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_rcfile_required.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_rcfile_required.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_rcfile_required.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_rcfile_required.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_rcfile_required.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_rcfile_required.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_rcfile_required.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_rcfile_required.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_rcfile_required.at:2: rm test_keys"
echo t_rcfile_required.at:2 >$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_rcfile_required.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



# rcfiles may contain security settings.  So make it a hard error if
# the user typoes or somesuch.
$at_traceoff
echo "t_rcfile_required.at:6: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --rcfile=no-such-file status"
echo t_rcfile_required.at:6 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --rcfile=no-such-file status ) >$at_stdout 2>$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_rcfile_required.at:6: 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`
    ;;

  69 ) # 69. t_persistent_server_revision.at:1: persistent netsync server - revs & certs
    at_setup_line='t_persistent_server_revision.at:1'
    at_desc='persistent netsync server - revs & certs'
    $at_quiet $ECHO_N " 69: persistent netsync server - revs & certs     $ECHO_C"
    at_xfail=no
    (
      echo "69. t_persistent_server_revision.at:1: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_persistent_server_revision.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_persistent_server_revision.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_persistent_server_revision.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_persistent_server_revision.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_persistent_server_revision.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_persistent_server_revision.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_persistent_server_revision.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_persistent_server_revision.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_persistent_server_revision.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_persistent_server_revision.at:3: rm test_keys"
echo t_persistent_server_revision.at:3 >$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_persistent_server_revision.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon




$at_traceoff
echo "t_persistent_server_revision.at:4: cp test.db test2.db"
echo t_persistent_server_revision.at:4 >$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_persistent_server_revision.at:4: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_persistent_server_revision.at:4: cp test.db test3.db"
echo t_persistent_server_revision.at:4 >$at_check_line_file
( $at_traceon; cp test.db test3.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_persistent_server_revision.at:4: 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'
blah balh
balh
_ATEOF

$at_traceoff
echo "t_persistent_server_revision.at:9: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db add testfile"
echo t_persistent_server_revision.at:9 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db 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_persistent_server_revision.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_persistent_server_revision.at:10: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db commit --branch=testbranch --message foo"
echo t_persistent_server_revision.at:10 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db commit --branch=testbranch --message 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_persistent_server_revision.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

REV1=`cat MT/revision`

$at_traceoff
echo "t_persistent_server_revision.at:13: rm -rf MT"
echo t_persistent_server_revision.at:13 >$at_check_line_file
( $at_traceon; rm -rf MT ) >$at_stdout 2>$at_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_persistent_server_revision.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


cat >otherfile <<'_ATEOF'
stuff stuff
nonsense
_ATEOF

$at_traceoff
echo "t_persistent_server_revision.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test3.db setup ."
echo t_persistent_server_revision.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test3.db setup . ) >$at_stdout 2>$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_persistent_server_revision.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_persistent_server_revision.at:19: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test3.db add otherfile"
echo t_persistent_server_revision.at:19 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test3.db add otherfile ) >$at_stdout 2>$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_persistent_server_revision.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_persistent_server_revision.at:20: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test3.db commit --branch=testbranch --message foo"
echo t_persistent_server_revision.at:20 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test3.db commit --branch=testbranch --message 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_persistent_server_revision.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

REV2=`cat MT/revision`



if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi

$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --rcfile=netsync.lua serve localhost:5555 testbranch &
sleep 4



$at_traceoff
echo "t_persistent_server_revision.at:25: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db --rcfile=netsync.lua sync localhost:5555 testbranch"
echo t_persistent_server_revision.at:25 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db --rcfile=netsync.lua sync localhost: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_persistent_server_revision.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_persistent_server_revision.at:26: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test3.db --rcfile=netsync.lua sync localhost:5555 testbranch"
echo t_persistent_server_revision.at:26 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test3.db --rcfile=netsync.lua sync localhost: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_persistent_server_revision.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_persistent_server_revision.at:28: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db cat revision \$REV1"
echo t_persistent_server_revision.at:28 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db cat revision $REV1 ) >$at_stdout 2>$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_persistent_server_revision.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_persistent_server_revision.at:28: mv stdout expout"
echo t_persistent_server_revision.at:28 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_persistent_server_revision.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_persistent_server_revision.at:28: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test3.db cat revision \$REV1"
echo t_persistent_server_revision.at:28 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test3.db cat revision $REV1 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_persistent_server_revision.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_persistent_server_revision.at:29: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db ls certs \$REV1"
echo t_persistent_server_revision.at:29 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db ls certs $REV1 ) >$at_stdout 2>$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_persistent_server_revision.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_persistent_server_revision.at:29: mv stdout expout"
echo t_persistent_server_revision.at:29 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_persistent_server_revision.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_persistent_server_revision.at:29: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test3.db ls certs \$REV1"
echo t_persistent_server_revision.at:29 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test3.db ls certs $REV1 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_persistent_server_revision.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


# Also exercise files and manifest
$at_traceoff
echo "t_persistent_server_revision.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test3.db checkout \$REV1 somedir"
echo t_persistent_server_revision.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test3.db checkout $REV1 somedir ) >$at_stdout 2>$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_persistent_server_revision.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_persistent_server_revision.at:33: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db --rcfile=netsync.lua sync localhost:5555 testbranch"
echo t_persistent_server_revision.at:33 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db --rcfile=netsync.lua sync localhost: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_persistent_server_revision.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_persistent_server_revision.at:34: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db cat revision \$REV2"
echo t_persistent_server_revision.at:34 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db cat revision $REV2 ) >$at_stdout 2>$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_persistent_server_revision.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_persistent_server_revision.at:34: mv stdout expout"
echo t_persistent_server_revision.at:34 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_persistent_server_revision.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_persistent_server_revision.at:34: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test3.db cat revision \$REV2"
echo t_persistent_server_revision.at:34 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test3.db cat revision $REV2 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_persistent_server_revision.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_persistent_server_revision.at:35: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db ls certs \$REV2"
echo t_persistent_server_revision.at:35 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db ls certs $REV2 ) >$at_stdout 2>$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_persistent_server_revision.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_persistent_server_revision.at:35: mv stdout expout"
echo t_persistent_server_revision.at:35 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_persistent_server_revision.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_persistent_server_revision.at:35: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test3.db ls certs \$REV2"
echo t_persistent_server_revision.at:35 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test3.db ls certs $REV2 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_persistent_server_revision.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


# Also exercise files and manifest
$at_traceoff
echo "t_persistent_server_revision.at:37: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db checkout \$REV2 otherdir"
echo t_persistent_server_revision.at:37 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db checkout $REV2 otherdir ) >$at_stdout 2>$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_persistent_server_revision.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


# And now make sure it works for children, where there are diffs and all

cat >otherfile <<'_ATEOF'
foo bar, baz, also quux (on off days)
_ATEOF

$at_traceoff
echo "t_persistent_server_revision.at:43: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test3.db commit --branch=testbranch --message foo"
echo t_persistent_server_revision.at:43 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test3.db commit --branch=testbranch --message 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_persistent_server_revision.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

REV3=`cat MT/revision`

$at_traceoff
echo "t_persistent_server_revision.at:46: rm -rf MT"
echo t_persistent_server_revision.at:46 >$at_check_line_file
( $at_traceon; rm -rf MT ) >$at_stdout 2>$at_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_persistent_server_revision.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_persistent_server_revision.at:47: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db checkout \$REV1 ."
echo t_persistent_server_revision.at:47 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db checkout $REV1 . ) >$at_stdout 2>$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_persistent_server_revision.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

cat >testfile <<'_ATEOF'
ptang
_ATEOF

$at_traceoff
echo "t_persistent_server_revision.at:50: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db commit --branch=testbranch --message foo"
echo t_persistent_server_revision.at:50 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db commit --branch=testbranch --message 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_persistent_server_revision.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

REV4=`cat MT/revision`

# And add a cert on an old revision
$at_traceoff
echo "t_persistent_server_revision.at:54: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test3.db comment \$REV1 'sorry dave'"
echo t_persistent_server_revision.at:54 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test3.db comment $REV1 'sorry dave' ) >$at_stdout 2>$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_persistent_server_revision.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_persistent_server_revision.at:56: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test3.db --rcfile=netsync.lua sync localhost:5555 testbranch"
echo t_persistent_server_revision.at:56 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test3.db --rcfile=netsync.lua sync localhost: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_persistent_server_revision.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_persistent_server_revision.at:57: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db --rcfile=netsync.lua sync localhost:5555 testbranch"
echo t_persistent_server_revision.at:57 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db --rcfile=netsync.lua sync localhost: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_persistent_server_revision.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_persistent_server_revision.at:59: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db cat revision \$REV3"
echo t_persistent_server_revision.at:59 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db cat revision $REV3 ) >$at_stdout 2>$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_persistent_server_revision.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_persistent_server_revision.at:59: mv stdout expout"
echo t_persistent_server_revision.at:59 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_persistent_server_revision.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_persistent_server_revision.at:59: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test3.db cat revision \$REV3"
echo t_persistent_server_revision.at:59 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test3.db cat revision $REV3 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_persistent_server_revision.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_persistent_server_revision.at:60: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db ls certs \$REV3"
echo t_persistent_server_revision.at:60 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db ls certs $REV3 ) >$at_stdout 2>$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_persistent_server_revision.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_persistent_server_revision.at:60: mv stdout expout"
echo t_persistent_server_revision.at:60 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_persistent_server_revision.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_persistent_server_revision.at:60: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test3.db ls certs \$REV3"
echo t_persistent_server_revision.at:60 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test3.db ls certs $REV3 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_persistent_server_revision.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


# Also exercise files and manifest
$at_traceoff
echo "t_persistent_server_revision.at:62: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db checkout \$REV3 somedir2"
echo t_persistent_server_revision.at:62 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db checkout $REV3 somedir2 ) >$at_stdout 2>$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_persistent_server_revision.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


# And check for that extra cert

$at_traceoff
echo "t_persistent_server_revision.at:65: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db ls certs \$REV1"
echo t_persistent_server_revision.at:65 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db ls certs $REV1 ) >$at_stdout 2>$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_persistent_server_revision.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

$at_traceoff
echo "t_persistent_server_revision.at:65: mv stdout expout"
echo t_persistent_server_revision.at:65 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_persistent_server_revision.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

$at_traceoff
echo "t_persistent_server_revision.at:65: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test3.db ls certs \$REV1"
echo t_persistent_server_revision.at:65 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test3.db ls certs $REV1 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_persistent_server_revision.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




$at_traceoff
echo "t_persistent_server_revision.at:67: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test3.db --rcfile=netsync.lua sync localhost:5555 testbranch"
echo t_persistent_server_revision.at:67 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test3.db --rcfile=netsync.lua sync localhost: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_persistent_server_revision.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_persistent_server_revision.at:69: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db cat revision \$REV4"
echo t_persistent_server_revision.at:69 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db cat revision $REV4 ) >$at_stdout 2>$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_persistent_server_revision.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_persistent_server_revision.at:69: mv stdout expout"
echo t_persistent_server_revision.at:69 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_persistent_server_revision.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_persistent_server_revision.at:69: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test3.db cat revision \$REV4"
echo t_persistent_server_revision.at:69 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test3.db cat revision $REV4 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_persistent_server_revision.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_persistent_server_revision.at:70: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db ls certs \$REV4"
echo t_persistent_server_revision.at:70 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db ls certs $REV4 ) >$at_stdout 2>$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_persistent_server_revision.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_persistent_server_revision.at:70: mv stdout expout"
echo t_persistent_server_revision.at:70 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_persistent_server_revision.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_persistent_server_revision.at:70: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test3.db ls certs \$REV4"
echo t_persistent_server_revision.at:70 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test3.db ls certs $REV4 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_persistent_server_revision.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


# Also exercise files and manifest
$at_traceoff
echo "t_persistent_server_revision.at:72: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test3.db checkout \$REV4 somedir3"
echo t_persistent_server_revision.at:72 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test3.db checkout $REV4 somedir3 ) >$at_stdout 2>$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_persistent_server_revision.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




if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill " $a);}'
  # MinGW has no killall.  The weird a=1 thing is to avoid autotest treating  as its own parameter
else
  killall monotone 2>/dev/null
fi

sleep 1

if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi



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

  70 ) # 70. t_persistent_server_keys.at:1: persistent netsync server - keys
    at_setup_line='t_persistent_server_keys.at:1'
    at_desc='persistent netsync server - keys'
    $at_quiet $ECHO_N " 70: persistent netsync server - keys             $ECHO_C"
    at_xfail=no
    (
      echo "70. t_persistent_server_keys.at:1: testing ..."
      $at_traceon





# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_persistent_server_keys.at:4: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_persistent_server_keys.at:4 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_persistent_server_keys.at:4: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_persistent_server_keys.at:4: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_persistent_server_keys.at:4 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_persistent_server_keys.at:4: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_persistent_server_keys.at:4: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_persistent_server_keys.at:4 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_persistent_server_keys.at:4: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_persistent_server_keys.at:4: rm test_keys"
echo t_persistent_server_keys.at:4 >$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_persistent_server_keys.at:4: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon




$at_traceoff
echo "t_persistent_server_keys.at:5: cp test.db test2.db"
echo t_persistent_server_keys.at:5 >$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_persistent_server_keys.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_persistent_server_keys.at:5: cp test.db test3.db"
echo t_persistent_server_keys.at:5 >$at_check_line_file
( $at_traceon; cp test.db test3.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_persistent_server_keys.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 >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'
blah balh
balh
_ATEOF

$at_traceoff
echo "t_persistent_server_keys.at:10: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db add testfile"
echo t_persistent_server_keys.at:10 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db 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_persistent_server_keys.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_persistent_server_keys.at:11: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db commit --branch=testbranch --message foo"
echo t_persistent_server_keys.at:11 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db commit --branch=testbranch --message 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_persistent_server_keys.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_persistent_server_keys.at:13: (echo foo@foo ; echo foo@foo) | \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db genkey foo@foo"
echo t_persistent_server_keys.at:13 >$at_check_line_file
( $at_traceon; (echo foo@foo ; echo foo@foo) | $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db genkey foo@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_persistent_server_keys.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




if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi

$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --rcfile=netsync.lua serve localhost:5555 testbranch &
sleep 4



$at_traceoff
echo "t_persistent_server_keys.at:17: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db --rcfile=netsync.lua push localhost:5555 testbranch"
echo t_persistent_server_keys.at:17 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db --rcfile=netsync.lua push localhost: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_persistent_server_keys.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_persistent_server_keys.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test3.db --rcfile=netsync.lua pull localhost:5555 testbranch"
echo t_persistent_server_keys.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test3.db --rcfile=netsync.lua pull localhost: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_persistent_server_keys.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_persistent_server_keys.at:20: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test3.db ls keys"
echo t_persistent_server_keys.at:20 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test3.db ls 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_persistent_server_keys.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_persistent_server_keys.at:21: grep -q foo@foo stdout"
echo t_persistent_server_keys.at:21 >$at_check_line_file
( $at_traceon; grep -q foo@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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   1) ;;
   *) echo "t_persistent_server_keys.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


cat >testfile <<'_ATEOF'
stuffty stuffty
_ATEOF

$at_traceoff
echo "t_persistent_server_keys.at:25: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db commit --branch=testbranch --message foo --key=foo@foo"
echo t_persistent_server_keys.at:25 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db commit --branch=testbranch --message foo --key=foo@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_persistent_server_keys.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_persistent_server_keys.at:27: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db --rcfile=netsync.lua push localhost:5555 testbranch"
echo t_persistent_server_keys.at:27 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db --rcfile=netsync.lua push localhost: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_persistent_server_keys.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_persistent_server_keys.at:28: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test3.db --rcfile=netsync.lua pull localhost:5555 testbranch"
echo t_persistent_server_keys.at:28 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test3.db --rcfile=netsync.lua pull localhost: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_persistent_server_keys.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





if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill " $a);}'
  # MinGW has no killall.  The weird a=1 thing is to avoid autotest treating  as its own parameter
else
  killall monotone 2>/dev/null
fi

sleep 1

if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi



$at_traceoff
echo "t_persistent_server_keys.at:32: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test3.db ls keys"
echo t_persistent_server_keys.at:32 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test3.db ls 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_persistent_server_keys.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_persistent_server_keys.at:33: grep -q foo@foo stdout"
echo t_persistent_server_keys.at:33 >$at_check_line_file
( $at_traceon; grep -q foo@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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_persistent_server_keys.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`
    ;;

  71 ) # 71. t_fmerge_normalize.at:1: first extent normalization pass
    at_setup_line='t_fmerge_normalize.at:1'
    at_desc='first extent normalization pass'
    $at_quiet $ECHO_N " 71: first extent normalization pass              $ECHO_C"
    at_xfail=no
    (
      echo "71. t_fmerge_normalize.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_normalize.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_fmerge_normalize.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_normalize.at:2: exit code was $at_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_normalize.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_fmerge_normalize.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_normalize.at:2: exit code was $at_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_normalize.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_fmerge_normalize.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_normalize.at:2: exit code was $at_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_normalize.at:2: rm test_keys"
echo t_fmerge_normalize.at:2 >$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_normalize.at:2: 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 <<'_ATEOF'
A
B
B
_ATEOF


cat >right <<'_ATEOF'
A
B
A
B
_ATEOF


$at_traceoff
echo "t_fmerge_normalize.at:15: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR fload <left"
echo t_fmerge_normalize.at:15 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_normalize.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_fmerge_normalize.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR fload <right"
echo t_fmerge_normalize.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_normalize.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

LEFT_SHA=`monotone --norc identify left`
RIGHT_SHA=`monotone --norc identify right`
$at_traceoff
echo "t_fmerge_normalize.at:19: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR fmerge \$LEFT_SHA \$LEFT_SHA \$RIGHT_SHA"
echo t_fmerge_normalize.at:19 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR fmerge $LEFT_SHA $LEFT_SHA $RIGHT_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_fmerge_normalize.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_fmerge_normalize.at:20:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_fmerge_normalize.at:20 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_normalize.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_fmerge_normalize.at:21: cmp right stdout"
echo t_fmerge_normalize.at:21 >$at_check_line_file
( $at_traceon; cmp right 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;;
   0) ;;
   *) echo "t_fmerge_normalize.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`
    ;;

  72 ) # 72. t_delete_dir.at:1: (imp) deleting directories
    at_setup_line='t_delete_dir.at:1'
    at_desc='(imp) deleting directories'
    $at_quiet $ECHO_N " 72: (imp) deleting directories                   $ECHO_C"
    at_xfail=yes
    (
      echo "72. t_delete_dir.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_delete_dir.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_delete_dir.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_delete_dir.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_delete_dir.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_delete_dir.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_delete_dir.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_delete_dir.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_delete_dir.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_delete_dir.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_delete_dir.at:2: rm test_keys"
echo t_delete_dir.at:2 >$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_delete_dir.at:2: 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 a bug report


# Directory deletion is currently completely broken.

# Question: what _should_ happen to rename-out here?  I have it
# supposed to survive, but I don't think it's actually possible to
# express that with changesets -- we have no way to say "file
# revived", and so we have no way to come up with a changeset from
# $DIR_DELETE_R to the merged revision that preserves rename-out.
# This might be a problem...
#
# I guess that unless we come up with a way to extend the model with
# file-reviving support (which would be useful in and of itself, aside
# from its utility in this case, but would be a significant addition),
# we should declare that <delete_dir foo> implies <delete_file
# foo/**>.

# After fixing this; t_subdir_drop.at should start passing.
# So should t_delete_dir_patch.at (hopefully).

$at_traceoff
echo "t_delete_dir.at:25: mkdir groundzero"
echo t_delete_dir.at:25 >$at_check_line_file
( $at_traceon; mkdir groundzero ) >$at_stdout 2>$at_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_delete_dir.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


cat >groundzero/preexisting <<'_ATEOF'
1
_ATEOF

$at_traceoff
echo "t_delete_dir.at:27: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add groundzero/preexisting"
echo t_delete_dir.at:27 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add groundzero/preexisting ) >$at_stdout 2>$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_delete_dir.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 >groundzero/rename-out <<'_ATEOF'
2
_ATEOF

$at_traceoff
echo "t_delete_dir.at:29: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add groundzero/rename-out"
echo t_delete_dir.at:29 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add groundzero/rename-out ) >$at_stdout 2>$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_delete_dir.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



cat >rename-in <<'_ATEOF'
3
_ATEOF

$at_traceoff
echo "t_delete_dir.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add rename-in"
echo t_delete_dir.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add rename-in ) >$at_stdout 2>$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_delete_dir.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



cat >groundzero/double-kill <<'_ATEOF'
4
_ATEOF

$at_traceoff
echo "t_delete_dir.at:33: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add groundzero/double-kill"
echo t_delete_dir.at:33 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add groundzero/double-kill ) >$at_stdout 2>$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_delete_dir.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 >bystander1 <<'_ATEOF'
5
_ATEOF

$at_traceoff
echo "t_delete_dir.at:35: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add bystander1"
echo t_delete_dir.at:35 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add bystander1 ) >$at_stdout 2>$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_delete_dir.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_delete_dir.at:36: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_delete_dir.at:36 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_delete_dir.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


BASE_R=`cat MT/revision`


cat >bystander2 <<'_ATEOF'
6
_ATEOF

$at_traceoff
echo "t_delete_dir.at:40: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add bystander2"
echo t_delete_dir.at:40 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add bystander2 ) >$at_stdout 2>$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_delete_dir.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



cat >groundzero/new-file <<'_ATEOF'
7
_ATEOF

$at_traceoff
echo "t_delete_dir.at:42: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add groundzero/new-file"
echo t_delete_dir.at:42 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add groundzero/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_delete_dir.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_delete_dir.at:43: mv rename-in groundzero/rename-in"
echo t_delete_dir.at:43 >$at_check_line_file
( $at_traceon; mv rename-in groundzero/rename-in ) >$at_stdout 2>$at_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_delete_dir.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_delete_dir.at:44: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename rename-in groundzero/rename-in"
echo t_delete_dir.at:44 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename rename-in groundzero/rename-in ) >$at_stdout 2>$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_delete_dir.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_delete_dir.at:45: mv  groundzero/rename-out rename-out"
echo t_delete_dir.at:45 >$at_check_line_file
( $at_traceon; mv  groundzero/rename-out rename-out ) >$at_stdout 2>$at_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_delete_dir.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_delete_dir.at:46: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename groundzero/rename-out rename-out"
echo t_delete_dir.at:46 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename groundzero/rename-out rename-out ) >$at_stdout 2>$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_delete_dir.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_delete_dir.at:47: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR drop groundzero/double-kill"
echo t_delete_dir.at:47 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR drop groundzero/double-kill ) >$at_stdout 2>$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_delete_dir.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_delete_dir.at:48: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_delete_dir.at:48 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_delete_dir.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


OTHER_OPS_R=`cat MT/revision`


$at_traceoff
echo "t_delete_dir.at:51: rm -rf MT.old"
echo t_delete_dir.at:51 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_delete_dir.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_delete_dir.at:51: mv  MT MT.old"
echo t_delete_dir.at:51 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_delete_dir.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_delete_dir.at:51: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$BASE_R ."
echo t_delete_dir.at:51 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $BASE_R . ) >$at_stdout 2>$at_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_delete_dir.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_delete_dir.at:51: mv MT.old/options MT"
echo t_delete_dir.at:51 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_delete_dir.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_delete_dir.at:51: test \$PROBE_R_SHA = \$BASE_R"
echo t_delete_dir.at:51 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $BASE_R ) >$at_stdout 2>$at_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_delete_dir.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



# Boom.
$at_traceoff
echo "t_delete_dir.at:54: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR drop groundzero"
echo t_delete_dir.at:54 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR drop groundzero ) >$at_stdout 2>$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_delete_dir.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_delete_dir.at:55: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_delete_dir.at:55 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_delete_dir.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


DIR_DELETE_R=`cat MT/revision`

$at_traceoff
echo "t_delete_dir.at:58: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR merge"
echo t_delete_dir.at:58 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_delete_dir.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_delete_dir.at:60: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$BASE_R clean"
echo t_delete_dir.at:60 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $BASE_R clean ) >$at_stdout 2>$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_delete_dir.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_delete_dir.at:61: cd clean && \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch update"
echo t_delete_dir.at:61 >$at_check_line_file
( $at_traceon; cd clean && $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch 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_delete_dir.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_delete_dir.at:63: test -f clean/rename-out"
echo t_delete_dir.at:63 >$at_check_line_file
( $at_traceon; test -f clean/rename-out ) >$at_stdout 2>$at_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_delete_dir.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_delete_dir.at:64: test -f clean/bystander1"
echo t_delete_dir.at:64 >$at_check_line_file
( $at_traceon; test -f clean/bystander1 ) >$at_stdout 2>$at_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_delete_dir.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
echo "t_delete_dir.at:65: test -f clean/bystander2"
echo t_delete_dir.at:65 >$at_check_line_file
( $at_traceon; test -f clean/bystander2 ) >$at_stdout 2>$at_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_delete_dir.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

$at_traceoff
echo "t_delete_dir.at:66: test -f clean/groundzero/rename-in"
echo t_delete_dir.at:66 >$at_check_line_file
( $at_traceon; test -f clean/groundzero/rename-in ) >$at_stdout 2>$at_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_delete_dir.at:66: 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_delete_dir.at:67: test -f clean/groundzero/preexisting"
echo t_delete_dir.at:67 >$at_check_line_file
( $at_traceon; test -f clean/groundzero/preexisting ) >$at_stdout 2>$at_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_delete_dir.at:67: 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_delete_dir.at:68: test -f clean/groundzero/double-kill"
echo t_delete_dir.at:68 >$at_check_line_file
( $at_traceon; test -f clean/groundzero/double-kill ) >$at_stdout 2>$at_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_delete_dir.at:68: 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_delete_dir.at:69: test -f clean/groundzero/new-file"
echo t_delete_dir.at:69 >$at_check_line_file
( $at_traceon; test -f clean/groundzero/new-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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   1) ;;
   *) echo "t_delete_dir.at:69: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

# Just in case:
$at_traceoff
echo "t_delete_dir.at:71: test -f clean/rename-in"
echo t_delete_dir.at:71 >$at_check_line_file
( $at_traceon; test -f clean/rename-in ) >$at_stdout 2>$at_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_delete_dir.at:71: 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_delete_dir.at:72: test -f clean/groundzero/rename-out"
echo t_delete_dir.at:72 >$at_check_line_file
( $at_traceon; test -f clean/groundzero/rename-out ) >$at_stdout 2>$at_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_delete_dir.at:72: 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`
    ;;

  73 ) # 73. t_migrate_schema.at:1: schema migration
    at_setup_line='t_migrate_schema.at:1'
    at_desc='schema migration'
    $at_quiet $ECHO_N " 73: schema migration                             $ECHO_C"
    at_xfail=no
    (
      echo "73. t_migrate_schema.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_migrate_schema.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_migrate_schema.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_migrate_schema.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_migrate_schema.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_migrate_schema.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_migrate_schema.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_migrate_schema.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:2: rm test_keys"
echo t_migrate_schema.at:2 >$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_migrate_schema.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon




if which mimencode 2>/dev/null; then
  UNB64_COMMAND="mimencode -u"
elif which recode 2>/dev/null; then
  UNB64_COMMAND="recode /Base64"
elif perl -MMIME::Base64 -e 1 2>/dev/null; then
  UNB64_COMMAND="perl -MMIME::Base64 -ne 'print decode_base64(\$_)'"
elif python -c 'import sys;sys.exit(not hasattr("", "decode"))' 2>/dev/null; then
  UNB64_COMMAND="python -c 'import sys;sys.stdout.write(sys.stdin.read().decode("'"'"base64"'"'"))'"
else
  # This is lame!  We should XFAIL the test so the user knows that
  # they're not, you know, actually testing the software.  But
  # Autotest runs XFAIL conditions in a completely different shell, so
  # we can't without duplicating the whole test here.
  exit 77
fi
# Poor man's logging:
$at_traceoff
echo "t_migrate_schema.at:3: echo \$UNB64_COMMAND"
echo t_migrate_schema.at:3 >$at_check_line_file
( $at_traceon; echo $UNB64_COMMAND ) >$at_stdout 2>$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_migrate_schema.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



if which gunzip 2>/dev/null; then
  # This is lame!  We should XFAIL the test so the user knows that
  # they're not, you know, actually testing the software.  But
  # Autotest runs XFAIL conditions in a completely different shell, so
  # we can't without duplicating the whole test here.
  UNGZ_COMMAND="gunzip -c"
fi
# Poor man's logging:
$at_traceoff
echo "t_migrate_schema.at:3: echo \$UNGZ_COMMAND"
echo t_migrate_schema.at:3 >$at_check_line_file
( $at_traceon; echo $UNGZ_COMMAND ) >$at_stdout 2>$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_migrate_schema.at:3: 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 ensures that 'monotone migrate' can take any old-format
# database and bring it forward to the current time; it is basically a
# compatibility test.  We actually don't test against old-format
# databases directly, because some old-format databases can't be read
# at all by a modern monotone -- you have to do a dump/load first.  So
# instead we store pre-dumped old-format databases.  So technically
# we're not checking that 'db migrate' can handle things, we're just
# checking that 'dump | load; db migrate' can handle things.  But that
# should be good enough.

# This means that every time the database schema is changed, you need
# to add a new piece to this test.  The way you do this is to run this
# test with the -d option, like so:
#   $ ./testsuite AUTOTEST_PATH=. -d 73
# this will cause autotest to leave behind the temporary files the
# test generates.  You want 'testsuite.dir/073/latest.db.dump'.  Gzip
# it, base64 it, and stick it in this file with the id of its schema.
# (E.g., gzip -c latest.db | mimencode > foo, then copy the contents
# of foo into this file.  Make sure when you do that that you put a
# newline between the end of the base64'd text and the closing ], or
# autotest will get very weirdly confused.)

######################################################################
## Do not touch this code; you'll have to regenerate all the test
## databases if you do!
######################################################################

# We don't want the standard db, we want full control ourselves
$at_traceoff
echo "t_migrate_schema.at:33: rm -f test.db"
echo t_migrate_schema.at:33 >$at_check_line_file
( $at_traceon; rm -f test.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_migrate_schema.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_migrate_schema.at:34: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_migrate_schema.at:34 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR db 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_migrate_schema.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


# Put some random keys in, with and without corresponding private keys
cat >migrate_keys <<'_ATEOF'
[pubkey tester@test.net]
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCfN/cAMabgb6T7m8ksGnpQ7LO6hOdnc/7V
yivrRGtmpwSItljht1bmgLQF37KiSPoMEDUb1stfKxaMsYiy8iTyoQ+M2EVFP37n2rtnNZ0H
oVcQd2sRsCerQFh9nslRPymlkQXUlOiNFN6RlFNcdjkucqNe+YorFX21EYw7XuT5XwIBEQ==
[end]
[pubkey njs@pobox.com]
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQC54vVjrrqYoTfPTgWm6JpuL+kOERcN2OSc
BsWq6cb4Wm3nlymwVqJJywq6cbfygUYwmqyiRLPxRosfLGu228AhEzaM4JbAH1pgg7CwvvVd
fHRXNAXEMgO89gBjkkecxLi4U/T67DrLjkRPAilCgWLZNv8YeOG9XAPegWyr7hNA9wIBEQ==
[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

$at_traceoff
echo "t_migrate_schema.at:62: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read < migrate_keys"
echo t_migrate_schema.at:62 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR read < migrate_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_migrate_schema.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



cat >testfile1 <<'_ATEOF'
f1v1
_ATEOF

$at_traceoff
echo "t_migrate_schema.at:65: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile1"
echo t_migrate_schema.at:65 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_migrate_schema.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



cat >testfile2 <<'_ATEOF'
f2v1
_ATEOF

$at_traceoff
echo "t_migrate_schema.at:67: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile2"
echo t_migrate_schema.at:67 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add 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_migrate_schema.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_migrate_schema.at:68: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch1 commit --message blah-blah"
echo t_migrate_schema.at:68 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch1 commit --message 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_migrate_schema.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


REV=`cat MT/revision`

$at_traceoff
echo "t_migrate_schema.at:71: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR cert \$REV somekey somevalue"
echo t_migrate_schema.at:71 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR cert $REV somekey somevalue ) >$at_stdout 2>$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_migrate_schema.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



cat >testfile1 <<'_ATEOF'
f1v2
_ATEOF



cat >testfile3 <<'_ATEOF'
f3v1
_ATEOF

$at_traceoff
echo "t_migrate_schema.at:76: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile3"
echo t_migrate_schema.at:76 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add testfile3 ) >$at_stdout 2>$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_migrate_schema.at:76: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_migrate_schema.at:77: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch2 commit --message blah-blah"
echo t_migrate_schema.at:77 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch2 commit --message 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_migrate_schema.at:77: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon




$at_traceoff
echo "t_migrate_schema.at:79: rm -rf MT.old"
echo t_migrate_schema.at:79 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_migrate_schema.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_migrate_schema.at:79: mv  MT MT.old"
echo t_migrate_schema.at:79 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_migrate_schema.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_migrate_schema.at:79: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$REV ."
echo t_migrate_schema.at:79 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $REV . ) >$at_stdout 2>$at_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_migrate_schema.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_migrate_schema.at:79: mv MT.old/options MT"
echo t_migrate_schema.at:79 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_migrate_schema.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_migrate_schema.at:79: test \$PROBE_R_SHA = \$REV"
echo t_migrate_schema.at:79 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $REV ) >$at_stdout 2>$at_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_migrate_schema.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 >testfile2 <<'_ATEOF'
f2v2
_ATEOF



cat >testfile4 <<'_ATEOF'
f4v1
_ATEOF

$at_traceoff
echo "t_migrate_schema.at:84: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile4"
echo t_migrate_schema.at:84 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add testfile4 ) >$at_stdout 2>$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_migrate_schema.at:84: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_migrate_schema.at:85: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch1 commit --message blah-blah"
echo t_migrate_schema.at:85 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch1 commit --message 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_migrate_schema.at:85: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_migrate_schema.at:87: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR propagate testbranch2 testbranch1"
echo t_migrate_schema.at:87 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR propagate testbranch2 testbranch1 ) >$at_stdout 2>$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_migrate_schema.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_migrate_schema.at:88: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update"
echo t_migrate_schema.at:88 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_migrate_schema.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_migrate_schema.at:90: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR drop testfile1"
echo t_migrate_schema.at:90 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR drop 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_migrate_schema.at:90: 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 >testfile4 <<'_ATEOF'
f4v2
_ATEOF



$at_traceoff
echo "t_migrate_schema.at:93: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch3 commit --message blah-blah"
echo t_migrate_schema.at:93 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch3 commit --message 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_migrate_schema.at:93: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



# Exception to this code being untouchable:
# This line may have to be modified at a later date; this won't cause
# any problem, as long as it's replaced by code with the same effect.
$at_traceoff
echo "t_migrate_schema.at:98: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db execute \"DELETE FROM revision_certs WHERE name = 'date'\""
echo t_migrate_schema.at:98 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR db execute "DELETE FROM revision_certs WHERE name = 'date'" ) >$at_stdout 2>$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_migrate_schema.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_migrate_schema.at:100: cp test.db latest.db"
echo t_migrate_schema.at:100 >$at_check_line_file
( $at_traceon; cp test.db latest.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_migrate_schema.at:100: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:101: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=latest.db db dump"
echo t_migrate_schema.at:101 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=latest.db db dump ) >$at_stdout 2>$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_migrate_schema.at:101: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:102: cp stdout latest.db.dump"
echo t_migrate_schema.at:102 >$at_check_line_file
( $at_traceon; cp stdout latest.db.dump ) >$at_stdout 2>$at_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_migrate_schema.at:102: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


######################################################################
## End untouchable code
######################################################################

# Usage: CHECK_MIGRATE_FROM(<schema id>, <encoded dumped db with this schema>)




cat >c1e86588e11ad07fa53e5d294edc043ce1d4005a.db.dumped.gz.b64 <<'_ATEOF'
H4sICAaI5EECA2xhdGVzdC5kYi5kdW1wAO172Y7jSJblc+orHPmSVWB0i/vShQKaFEmRFBdR
osRlMChwM4r7KnH5+qE8MmPp8Ci451TPAIPxgEfI5TS7xmPnnnuuicEJe1l/sU6sfmZ3lmzo
f9vsTgJrCS8Wy6nCC0iL+B9RXAx+v/nlL79sfkmjl6oeXqp7UXx6ef36t3976YeurpKXm9/f
XmrwOuglrKshroZ1WOD38feD1iFZnVb9y5gOt9fL+39fJ667b+Ot72x+eX353eB1bBelALwM
9TPGGvoeDi/hvevWaC+gq8uXZ8DNL/cqbe/xX9Lo0+sbf9388te/bWT9LJysF1m3jG9jvVxZ
9SKc//Kbz4Q+BSMkQ/mRH8MkGTBkBFO+HwQYDOCIRHGCZNDwt0+/RTiDMgDFyQjFfAKJA5+k
GIakiRilAeMHMEUFOI3566US3svsH19H/aIZ14M2jwthyDvW6OS6yA/PX21+e8cSMRIwKI3D
UQiAj6IwiQdoFDExTON0hOAYsa6TConnEgETEQjt4zGCwXQYxDQBY0EU0YCg6AAhoxjHYQpn
kJ8usf68RL6d2Rv+/iXCzLqWECcxxEdhP0RIEsNxQNA+ioE4hnGfDEmc9PE1LhKHMQmvsDEg
YHASjWKUoBASQWCKZAI/QnwajumI/ukS889LVBrJbISvS/yBxU/+vtK36dLS7+aXPJ4/vYe+
kf8NA/9gfFiXTRf3fbyyK67COoqjL0Oec/ivs7xJua8w/VkGCf2i8seUTXaEOVEiZz7f/Pvf
39yar9GCIPYjQMcYgaN0yMQEhmExhYQ+QAmaQHCGxmAyDsi3omXHnE34CeUb4Z3R/iz11miH
7HlvnEMdHs47o/1ZFj2jWa9Iqj3Nz99F+45BpV+lIO6Hf4RxN3ym0itdvvDis9r8Tqg/mNTF
pZ9W6cotkMZF1L/0ceN3/rCSJZhffv2PX9/S0y+q+o1E/hH+D5n8spxvpLLyy/itudaZ6sZf
F/fk+XMt4a3u4+q5gnsfd5tfHn5xf2vk14FBUQebX9aEafy0++HK75fa3IMiDf+xXvx5WX2a
VP5w7/5rhHXU6cxuzxKLvHy9ZgXt1//xvJP/TKP/WBf2P3/9IuTPdz+9POX8dcGfXn5fz6ev
wz9r/Nsb96WI/QTzH3XAX7d1uMVrfq+4rWRLqzWt/5jvrbL2Axbx+lf8dbf+yeb9WOf+paXu
v4T8RqgxGIMZigkDJoRpFEfo2A8iCo8ZBCZpP46J2MeQpyaEOAgQyg99IvTpVZcYhIRxGEFp
lKJomkF8hqYJH36z3PHmiF9a2BJwWF9YuF9OR0soNN1ilzMlw+dFGC140s6ZjJ55XdYsbdYs
e9noQmNfdjdFPRPKTE+KHpuznt8XXZVH7XJTrHxQdV6eNV5XtLxR+suI9PxuOvMCrFmu6Gen
o547541LW6tM8uRSo2Uw/kRS/gUgURFOAIb2kdUtoGjI+KQPI4QfRcEqtwgBE3QE+1QY/78H
0gfoQUVIDPs+ePoqBocxFEViah0MU3CE0AQgAU1QgER/EGtHnUeM19iEhdV7NbMJeqQ1WTI1
7axcSX/rOdmtSoBPiVoja50s5KyHOLewRzcCdNkFwHDjMWygyomYYEtBZI9c9Ib146CJarYR
Fa7RvQssztKxejzG2ES19Kj0qm3ujldfS1XH2dCmZzvl+XCZu1y3sj07FQ+tg7I3vdHPwPoA
AhGxlmosin0U4KuvWwkFgmitcTASxBjuh9jqAgOGJt5klJOes/2kq4qmLfK0Mmi2MhOxBOSg
8wY28OdFE2Ckz9PFEsaVINFR64RxYxUn8yCstMkrdRFyhDCU+Zpx5itFgSyUNpf4tpjm9pR6
5ez6+7NZ7qfaK73ebZTSb8TaU2Z7U5ZNkpepHey9tCjTnabthXTsWc2p+kf1mWI/r7U/c2x/
Rqx/NHHv9XFf5/jJ5n67rX8u+1dij+YrsUVYuper104AtuUN/Za0V+WxAKrVTIOmOcQqeDyr
8VO4NKbXX31nI9Pl3rS31KPZkscYLGqAGgTCqoXkT4+w3TPKtfHgKZjTiVWKCcAzMSUoOvrL
WelsU1o6rt5eTWWTNEOC8za+zb1t5sbhPyX0Nx72T/LzazLv8d/vWaq9aTWawzVuB/RKM17N
PzzuIV06zqQE2T07jtSfKnGDFbuiDStsG/NYpdEOTnY78qaZ8CRQ7vmwm5175Nr7fn85GPQA
5Cm6jeeapou4zTR7njXmCHe6TW+SGxt1jNTxW1oFrBG+3T2UcZevPU61kuMzJYe5id92bb+z
6teVqb9+evm1fLrF5wvwx4vu9cXml7Auijgc0rr6iWV7dXP/1akV8SMufhp5HTV0cfzy+arh
lvZr5sQgnX5n9rr433/+yQzrBIUfrGPTaOV/CuanW3ze9jObnlOvpqeO5n9660Faran62YeQ
+G9x9HmCr+3U717lieGnl68wfPq87E+/L/kNJ7eqwGO1zq/O8l9rwH/Ul8+z+K8y8o2hfflL
/9yW3+FJ467/9LwC+OHw11d//DOZWTegm5tn2NXz/nEnL8+llP0PwvLtjX7JMxKPsZDBAz9E
URTHkRCPfAQJwzXvgrXzxwC19j8x/SwZw5qgcfefz3/+vYqH9Z2qmeFsbgMvmgsx17LoxBiP
oi156c7tnWYvHgcGvzGkv4fUBjIiblfaE72/x1JOi4c8nsZjeztx2uZ4rJtLfB/b6X52oFmo
I60gZIkr0wqu1CowYi5bC10Wl5wolJFebLMjL27ZtZTa0s2vOApDorMZbh6LapjgwLolyAny
eLyoKVMrin6Z/F3+6O3h4cuQdJG8LpvnKxWx+LUPSeUxoS5AIC3iWWGfb0/jxhuOsFre63R+
nHix5UTat8p1B+YAz0+H+lYp1FWEZvLmPspBazTMOlTNiRKCOuMW/dge7gZVHS/LZi2ULCXS
uIHi1wCsxuWon2XikeFpP9QjSvrHrELp9piBU5dfMdhW1W3kAFfJQW61SeFWteA8xO1m8urr
NOkx6xB0mcwwiwjddXrQF8oa78e1y95LQqOOM5YE6RFi/JxVdh3d0SjGS6XZtoTJC2oaHDfh
3fGAMQwNuJ7yMNBuWSzCGhkuIS7Vh0Sy2ApsEfq2RN64d7a2/TjJnCSXwUWBSj5oUG7mLXAA
G6HbO+eHh0nTruV4ep6Qc+XcrrTMSz5XXplxdEMdktBwMuy9l1MJNSlnhIF87GJyWIj1Z8e8
ruZoQ5rNzkvmfsq9cbk7/LKo3tFizqq34Ae0oSCKG7WgmRlvCmd2KVNhaFgUvxxhMhsyUafs
0GGjabsRiH1Zx0yACKljR6dYyi77JiRzWDXh49Fhx7YL99HoBobKe8TUmwTbC+5ZHGbrTMI8
UklcGOmlvdHg2LgoYqSA7V2Pt6jANiHm09Ys5N5wbVN3MK5XrOU5Ri8veHA1cr5dCkSkFmVk
LTso/f4c5Rq2IYuJz8OFA7tOyCSiIVyav0BJjMe4ehryymVqzlAowTTgYXSVBMvhv/9QKb6R
iv8zCrX+/I0a/VAv/okiverQ63J/KkPf6N4Xl89ENIwScMzgOAXTvh9QIGZIOEQQjAwIhAIR
BlPU2yqkyftIY+H97tzuz3KA8abAseaFZfG9yvI77jYeuMTcAX0bspofJAFpUSWd9/uqMSnV
IG9GVIVb6rqZ00d32g9lM57lochuAxKUiWqKGHVIz8daE/hLgPQDOEy+1rvpTKfWXJuQhgpX
8YhRFdoNle7B0qa+hmaE9qd+F3emeGOqvjgd57LITedSGKku6uSpEPUwyvJ72Oox5Nad6KCI
4I6Uc7cIZ5Q5wfz73397B3RRTOMBQREREeMUSuAYg8WBjzNRGK/f+OqZ6DjC0egp11n/n00d
1NO/r/b0/cAR+OOadV3r1hY4WoldkkpzV6HcEE6hjhrncMP1dkuGAW6XWFXM5XhtFWUen2+B
Obm4Y9nO6Uk9Tqe6B+r+jqI0exMWX8OVgJWQJkmo3fh4XKMNkE6OzjqClhg0k3BZnsfhpKb4
ZWuRFN+pWX46smmxS2zV0x+0Gxt7xmGPcWLPHXXTWeYb4L7LoC5+pP1qB/7hV+HKnG5+zaOV
oc8Tjx8OkL45avlj4OfjlPCWFm99UPHTAb+7ks+BVl/yHP/jMcoPq/uyu+sukWv9DGAUQ2kc
8eMwRtE4QFcDDK+dcPj8E9MU4+Pkb++e9N0zfvotJGEyjgiEiXEaECgZBAgGg4jEQQwoBAUU
QwCYRIn/luDwGoWJI5LE0QCNUYJGSBQwOM1gK9NJH4PpJ+cx8P7g757x028UQTMkFdIBGZJk
yBBBCGjgRwx4WiKUohEGD5/NyPuDvxvL/47g757x028MQiKhD8doQEcAXwetfWboA4xgAAwI
kqLx1SpSBPHzJPu/c5j9feb9/2Pr+J8IzesOfSFHvPpSAqdWQsIRTVGIT1Ekgvt+SMQMwGGG
RIMQp5jwI2r06begW1l4e5417a9LtFdm1yYynxf+vnmzjO8rgU47n4Piy5DworOFL6VvIY4G
Z03vIN6gu/4shfF9fkRXFZT4LZBqrKBpSpEtdnXPpErVxyTfmIVeCeTF9Z2wRjxEVh837roT
QcjlpXRVLqFqB0l0Px9BIJjuwlncse+5OwCI7+01Gb3dQ50+LuWmPPSPU5HLRr528YKrWTLU
gFJWL63w4wHmT6BlAOXTNI1TIYpTJI2FBGBW/cGQGIepgEIDcu2y0JD6GLT+fbjV3Rdor7Mp
nYoQM+9BeYXfhre4CZdtDi/LmZ0Jktwre3GpnYXrrWvLTReQhBdSSelkuY6ZFUKDF1JnL9oP
hwNUrQXWWECgNNGIby7L3omyMyOMPR5RTmXN+VYm246InCXsRSW9C56pUK7Zc03db6GJT9ut
EgnFxNlNRQGXrmdSJ+iNhrErZLrhcNHjNlsGKg+BcsPhaMzfDS8G+yRAcT/GqIgK8ABfNerp
dxiEYiKEwAASBCGMoh+DN1xbyiQu6mR97ZbTzd8habAX67eRdedBIlfXpXPYaC/eTAz3hw6J
D0YmpHLHGybE+nFmUbbEo/GV0QbqcOFu27ral83lvi3jDKq83cRtqAt1C12tO5OjdYVzJVJ1
WAbh3pE9PnpIWGcBhomdQDiLUJ0wkSTZdYrIITufoeSqs+e7yaNCEG2Y5kj09RnlwyCj/TEs
gvNMUPpi5/K7kcV9BI0IEDEBRRGrLKyFAsFDOqIiABMMTsDhajvpEPkYsn1dxqtQPTFGmcFz
vDWJr8XbuNoN6SXTGSnu8ElZ7V0PFIvCjvQVEeOwPTUXbdQnDBMVl8DqeN6peQZrj9ETVDp8
MMzAcD1p5GW7cb0HJGX1mYtx+e6WSh24kI/KsL/dsVtvVLGYSsOrJA4n3Fo7+wtV24POFzAx
ZpR15qniWF9dk9luLPlRWGjQY53EireZtL1lgS/ojofZd+NKhYTPAJLxfTQgYGTFlvLJiEAj
BkUCEmOeDgT4KPYR8/VTrZV/orVK1TjJGaEGslKsc2/wiXVEibnnuYlLhHOWErK59MCOb/Yx
z5tLyXEWdH6ELblvbg+nXbdfZ44ssrHv+16BwWHfxBS968dbsUMtR0GQy9m2lJicWVyzHimH
aEPRRPLq8nl+f5KXFgKKcXk8AC1wnopSGwpv74EdIOQULHeX8BjKq4bsfF8m/N3QIjQdRqhP
BYDxQ4aK/DUrkYhCGJSIAzJiKPL5WAIdfwzaP6G1qe5Z4vWWJwTt1NSJhrVFtiPsIt+g2hcZ
j2bEUat2mJ61Vk6ibdFm8aPTSz9P1X2ES+gtmHrQthtqe6O2UFm2p+DhL9cmP9RxZIFZPiN+
crqpBKgLBrFOc40GXdMsKq4mvlbvHx3UmIFDauKNf2QJtaHtHEW0PWwDjA79B91Tl1DmdwAz
31/K4JWwoR9FMPn8TI4g/JCMQxx/Hsb7zPMDJiyO/YDxPwbvx7RWP01n0zzBghrJth71dXi4
TMCd5d18s6eIMBn1QCqXWiHH87E3bjZPIPskj3bKlp/UixZdDNEoKWSTELGcwtVhWzRn6hDD
24plTLERza2hJlAB8nFqIXdRqZNNiKcr8KmBlk+GLvEzbZxhp+V5b0wf4kZxh/JSjg6m0b3R
cleSPqoGlfZ+ob0b2TgCaxkjY3Rt22mGpkjcx8PVk+MojKEE5q/m3Qc4ID7SE33Yfx05T0zW
qnXZ+832RBiXiM+53cHOHfkIb2EBSr17Wg9FR7dUgC3ovN83ZhJ5ZsOmN4clL6IM9SQzbHh3
D1tHbAC19OC5fMd5V6gWyMKYl60bENPckncDnRES2wfQVqylZIuLxV6MZ4izleTAXalsjHF1
U8Og54rb6WjLKbk13axEIi4DxrW6vBtagqAYPMIAifoRHPjMChuMMmC1sxTqM2s3tFa0AGbi
j0H7JzRBYSaWIAgTsxDofu2ThqRVJSrUNDCXbTxCO7wTPdsKrkMDoXSk6YhktI/iYKskrqSW
qvVhap5qdENTdjdUh1TqDuLSJHtIxXduGCYHlsOuoQ1kX3NM0RQ0th3zq5g1qcmz84PaE1SV
2mqsd2t+kI26CWO2Z+bbvsOcskD2ldnqw9xfAoag3w3vmvNkDIcUsRqvGFu9uI/Rz0cHIx8P
1vzH6cCnSCJGPgbvxzQhu3neqnK5hhl5fbo9spma2Wo4IKsRACIdjf5DEqjD5FieVidTZy9u
MpF49WiE1GMgMz67EGyJ0CYXcHoZO4PCTl61vytLsytg3L1zWg4R+tFlBWgCM91HS9Cr/VGA
ME9Zvdn2qOATJLF0Zo5HN6rYjWbxO+xyq6H6FgndoxW8nWJO1lj2/ft9AhlgMOyH4crPgAxW
caDogAJYyAAao9dWHVn9F/j84MP7e/s/Qdxoxk+YkB2iLgAHBZtKB3YyzJEQYleYhriwd51M
OQemnNKzuBweRWQPtamq1K5DC+XVGGhAjoK/GVHnkmiBpFEt76KygoPyooJEhtLVPigXqD0x
eOcbY3+Hmtw/etsKIpcyIScMPcZtvbdqItEbrN+YhifB6QSG7obscPgx36URt+1ke3w/vPBq
VRGfWcWWjgiYJEGIMSuyRBBjIbI2DVgAsAiloo/B+0HJ5cEwOv2BZGGpTikqP2TyfW0iTjKj
58BD4UdCmBdWCQNKxuD45HkQeR4DoUTreyc9QuROCqtUZsbGxznafBilO+wP937X8Q5ycJpd
68FNpdjVlNCP6yknqsYg2luRLoje20eh0dnDldxGF9LG+CUBhLKZCsxnjwTkdLXaS47KbMVF
5yvw0JJ3QxsxMB0AELxWrZh5+tlgZeya3AQIVyeAxAwSYRT5MWi/1YRQUh7hXqxc51TIe28O
UDhxK+UWlHot7yLYc3T4j5+1dJXG/a1wbTNxF3fUy2uuWwLhWSa+8bLLrJdKqlna6JUmqu+9
wsvCSStdzLCupca7s37OD/KOTb79jvb0dwE330U8f42o8ac1K4rCWxmv82ugcg1oJZOeKaWx
rsCwNFhfZNRdF2Dwayek8+HipfnhbcLsctYBGFqEIw4pUrvHiIjvLp7HSVAeazfJwV2m2gMj
ieyrjxiAvPdtIbKK1+XamHHGtnUxZYnGDRJNOOXT6r3lVdalxosWiORppiTh6ohC7CvdiRNZ
nqU0c/+IBga6yJ5mMjwhTiXvkYIgB7Szm8sNNEGOzgpFBwS5TqpdbCUm5m8xpu0/0GquVYRa
GQFCdM07H0Zjn6EZBiNDmMJIjCQiGkNA+JGzyZ/movaTXLxoLOpN8wIfAIu5W0reSZ2Fh8ve
S7jFnDMxVNvdwT84U38fgWB4d+mR94e4IQjdu3Y+5EjLypfzZqpz/ZbecoSzWP+E7CRUsZKD
rRA7ALusC9EG5mF2oN73tY3N22WeMyYyBEUD6dkZI67pO8cyH9pmtqZr3o1RIrbhdOUNAnOG
hsH8Enp/fY6JVeiwEPURhkLh5ynU63PhMUVQeIgjNBUGcbT25x+D9k9UEf4xQmhL9rPERd6E
7sJtpq/tezYYGcgR+dFRvpcUkVHZIXM5Ha9Fgru7ye2kSDzhlVgL+B2X8UnfjFzYB3K8V8KR
2hk3cvQeftIVq2QHcX/gwW7fSNs7TyOlRGvLVSnXAmPsES6u1o53f8zk1tLCfhI20v3sMI2T
RowzXciMy2M0ZJnHQVXMd8O7tuwwAp6PUKxqh4SrhcF8mkBRAo4IKozX+owzK8jox+D9mP3Z
BTPeZj0iHtcmEdDoRcmMy4GvNcVUORkY81aU7cP1SAgPkaQS9NTZhrZnV/HAtoXj0vrKOjFg
zE1k5az0GPeP+nDg7LGuqwscaUGJ76M63LncrenBffRQwr2doaOCHpyshG4Vhe1ORpNpBjKE
RFFezE3YKmcOv2phd8d29/0ozKOCpLOmC/Qbj+V9Obb/p4/lPQ/G/zLE0/D5I4PPQ/76v/MA
3h+T/PSQvP8zn1l99zDaHtPgsNtp7LzHHeNRV4noR22xBLamRXJJnLa1knUw06LxVk5j5UyD
BW2P0HnpNvB9Ru+TgJssZzjs4MzcjdFXYOpOkOZSRkv2dISh/Vg5ZwitUEKNHu10r5gtrDPy
oVlsmCqzajhuOroHAHF65qxQW9C79yqIlnQrGUH0CG7ne96zloIIk7xrtF1e5gXL6gXPGpOY
Vuo4b/vLTtcuwNygTZ2wvb1ry9l0EReMDC9e5dg4msKg8FIhjcLbz/b+COgHzge+A1RETdOu
ec2cRAbTDvl0lPMUUb2p2OV71OPTs5cny8DEA5xf1NMpyWKALdEWDPOm3/boViqFwb+eXEos
797at2fmrMhJbcutfCqMU7DnKy8qH1ugjh2EEhSIx75TrqagKHAwEnURw5tTxvJoOYRp0aX0
vMWU0SxkfZd268rGkyV2wD87O2MspQGtl5SYnHabGViLOyeNUZ2Tf80hyk7ABpARbvcKTqnx
WGZudyG34j3Lxyt0MSZ/spNkH2n21Q6MsLhJfO/GiHIxw5LKU7tGQFb37VmynXoTiKA08VOM
AUYhzwhzY5wWqUOccK0zwmun2K10rgwUzc/NXgceOUbiI3CGxHz3jn2ge/s+BWzjy44tpDib
eW4TQdHj5m1WFY0jFO3sBijUIHB+pg4YNgoWtAWvOwZve3IbVFI4IRfvdhSrVCh8uj7Y0lmj
0muWnGV+UOqHbC9O6FQ4sm3CAevpED0OuSSfzcpZCnWsNoO5yO4BwpFDIMzPHcPPtnwxusWp
l1ww665CLnQdsPWdEvX4yN3so+j5hJORgDFFSLdSkSZL/HXH4F0lQEPR0x5BDTZ75InhfEkO
ZaV5LZ+zc+7sud1gK2rKS3d7WY560h7yUtv3MXGWj+HkKW67kZwcF66n9n6cLbh4kCAJBpi7
TaccTW797PlccCoOIZWr8tRH8hkk/KE+M8QHduwD3vr7HUNPF3vV83XHtgzdSkW5qvR9HhTX
TMpJ1XW2bEw0olyaWl3nWFr02nqTzMQAfBM51ELOTkZTOEDnkaOy8nY/iZeJOwzF6OpeIRrn
eG3V2mi4U5hBwxHtWPhjgAaI09qx3B0EydS9TYqyfnu9tgeR4Aw/ux6PmAdNg1wdvDhOHME9
48bNwQypGFUW6oVg1uyQxY6xU+pbhwMtAz3iIUU3EQUdC4I5GfZEgWGJmfYY0KwndscKZhXx
TheYCsFyYQliqp3mVRu3GITCWys7wCfloCBBIURoUW76+pA1VSkhWdMwkWYNPJlkqMHc6O2l
FeZ6RHzPbo0rHlRhuJOs3U2Jqtw0bHBUJleG976D9XfF2NgOuYjhVFY7Xt7idVgYdwD45IhM
ziVNOM4MHft6QPE2OPBbJMyP7kM4kWHr+4kQoiYpJzek0rXdppBMu+2mfuiFrTzoNqjsQ3Gd
JB61axAS1wbNH1qtyWjS4apyiE+uPCy7XTOdRFpUxENxmA39bLAbR/ZNQ0HRNfmSh4Id2OSN
R7R/JNgHHM33j2jbx4vbCRo78VvMOMDcUUhjDffmsjDkShezbtAKHe0oKNp6+Vb2dnFkZA+o
4bKNhiERuJHEFUZ45dT4B0FJg+B8YL26LBSStP17KELAAP503EZFjGIVfrfP9ytfY2S+JtDg
69bFRzaefE1dP3Ox2VEBhK9dkAaneoq7VlhO5s3fNydzTHjj1PvEXrsEhmQ5ZwSsNdOxIh+A
XRpUj7vTbpyJVhUIDLFF0dKuziLSFIRah2WhlYuiSLVVJMKaEYViDpktTm7NxS8uctE9IrXh
E5hIZEFgu+tGSQwh2arJBGBucWL8sYTc1//IYGiabP1t878AuMrZ/Vg9AAA=
_ATEOF


$at_traceoff
echo "t_migrate_schema.at:266: if test \"\$OSTYPE\" == \"msys\"; then
  mimencode -u -o c1e86588e11ad07fa53e5d294edc043ce1d4005a.db.dumped.gz c1e86588e11ad07fa53e5d294edc043ce1d4005a.db.dumped.gz.b64
else
  eval \$UNB64_COMMAND <c1e86588e11ad07fa53e5d294edc043ce1d4005a.db.dumped.gz.b64 >c1e86588e11ad07fa53e5d294edc043ce1d4005a.db.dumped.gz
fi
"
echo t_migrate_schema.at:266 >$at_check_line_file
( $at_traceon; if test "$OSTYPE" == "msys"; then
  mimencode -u -o c1e86588e11ad07fa53e5d294edc043ce1d4005a.db.dumped.gz c1e86588e11ad07fa53e5d294edc043ce1d4005a.db.dumped.gz.b64
else
  eval $UNB64_COMMAND <c1e86588e11ad07fa53e5d294edc043ce1d4005a.db.dumped.gz.b64 >c1e86588e11ad07fa53e5d294edc043ce1d4005a.db.dumped.gz
fi
 ) >$at_stdout 2>$at_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_migrate_schema.at:266: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:266: eval \$UNGZ_COMMAND <c1e86588e11ad07fa53e5d294edc043ce1d4005a.db.dumped.gz >c1e86588e11ad07fa53e5d294edc043ce1d4005a.db.dumped
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o c1e86588e11ad07fa53e5d294edc043ce1d4005a.db.dumped
fi
"
echo t_migrate_schema.at:266 >$at_check_line_file
( $at_traceon; eval $UNGZ_COMMAND <c1e86588e11ad07fa53e5d294edc043ce1d4005a.db.dumped.gz >c1e86588e11ad07fa53e5d294edc043ce1d4005a.db.dumped
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o c1e86588e11ad07fa53e5d294edc043ce1d4005a.db.dumped
fi
 ) >$at_stdout 2>$at_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_migrate_schema.at:266: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_migrate_schema.at:266: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=c1e86588e11ad07fa53e5d294edc043ce1d4005a.db db load < c1e86588e11ad07fa53e5d294edc043ce1d4005a.db.dumped"
echo t_migrate_schema.at:266 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=c1e86588e11ad07fa53e5d294edc043ce1d4005a.db db load < c1e86588e11ad07fa53e5d294edc043ce1d4005a.db.dumped ) >$at_stdout 2>$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_migrate_schema.at:266: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

# verify that the db actually has the claimed schema
$at_traceoff
echo "t_migrate_schema.at:266: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=c1e86588e11ad07fa53e5d294edc043ce1d4005a.db db version"
echo t_migrate_schema.at:266 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=c1e86588e11ad07fa53e5d294edc043ce1d4005a.db db version ) >$at_stdout 2>$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_migrate_schema.at:266: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:266: grep -q c1e86588e11ad07fa53e5d294edc043ce1d4005a stdout"
echo t_migrate_schema.at:266 >$at_check_line_file
( $at_traceon; grep -q c1e86588e11ad07fa53e5d294edc043ce1d4005a 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;;
   0) ;;
   *) echo "t_migrate_schema.at:266: 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 do the actual migration
$at_traceoff
echo "t_migrate_schema.at:266: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=c1e86588e11ad07fa53e5d294edc043ce1d4005a.db db migrate"
echo t_migrate_schema.at:266 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=c1e86588e11ad07fa53e5d294edc043ce1d4005a.db db migrate ) >$at_stdout 2>$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_migrate_schema.at:266: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_migrate_schema.at:266: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=c1e86588e11ad07fa53e5d294edc043ce1d4005a.db ls keys"
echo t_migrate_schema.at:266 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=c1e86588e11ad07fa53e5d294edc043ce1d4005a.db ls 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_migrate_schema.at:266: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:266: mv stdout expout"
echo t_migrate_schema.at:266 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_migrate_schema.at:266: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:266: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=latest.db ls keys"
echo t_migrate_schema.at:266 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=latest.db ls 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
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_migrate_schema.at:266: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon




$at_traceoff
echo "t_migrate_schema.at:266: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=c1e86588e11ad07fa53e5d294edc043ce1d4005a.db agraph"
echo t_migrate_schema.at:266 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=c1e86588e11ad07fa53e5d294edc043ce1d4005a.db agraph ) >$at_stdout 2>$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_migrate_schema.at:266: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:266: mv stdout expout"
echo t_migrate_schema.at:266 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_migrate_schema.at:266: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:266: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=latest.db agraph"
echo t_migrate_schema.at:266 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=latest.db agraph ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_migrate_schema.at:266: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


REVS=`$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=c1e86588e11ad07fa53e5d294edc043ce1d4005a.db complete revision ""`
for R in $REVS; do

$at_traceoff
echo "t_migrate_schema.at:266: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=c1e86588e11ad07fa53e5d294edc043ce1d4005a.db ls certs \$R"
echo t_migrate_schema.at:266 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=c1e86588e11ad07fa53e5d294edc043ce1d4005a.db ls certs $R ) >$at_stdout 2>$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_migrate_schema.at:266: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:266: mv stdout expout"
echo t_migrate_schema.at:266 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_migrate_schema.at:266: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:266: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=latest.db ls certs \$R"
echo t_migrate_schema.at:266 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=latest.db ls certs $R ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_migrate_schema.at:266: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_migrate_schema.at:266: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=c1e86588e11ad07fa53e5d294edc043ce1d4005a.db cat revision \$R"
echo t_migrate_schema.at:266 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=c1e86588e11ad07fa53e5d294edc043ce1d4005a.db cat revision $R ) >$at_stdout 2>$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_migrate_schema.at:266: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:266: mv stdout expout"
echo t_migrate_schema.at:266 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_migrate_schema.at:266: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:266: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=latest.db cat revision \$R"
echo t_migrate_schema.at:266 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=latest.db cat revision $R ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_migrate_schema.at:266: 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
echo "t_migrate_schema.at:266: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=c1e86588e11ad07fa53e5d294edc043ce1d4005a.db complete manifest \"\""
echo t_migrate_schema.at:266 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=c1e86588e11ad07fa53e5d294edc043ce1d4005a.db complete 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_migrate_schema.at:266: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:266: mv stdout expout"
echo t_migrate_schema.at:266 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_migrate_schema.at:266: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:266: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=latest.db complete manifest \"\""
echo t_migrate_schema.at:266 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=latest.db complete 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
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_migrate_schema.at:266: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


MANIFESTS=`$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=c1e86588e11ad07fa53e5d294edc043ce1d4005a.db complete manifest ""`
for M in $MANIFESTS; do

$at_traceoff
echo "t_migrate_schema.at:266: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=c1e86588e11ad07fa53e5d294edc043ce1d4005a.db cat manifest \$M"
echo t_migrate_schema.at:266 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=c1e86588e11ad07fa53e5d294edc043ce1d4005a.db cat manifest $M ) >$at_stdout 2>$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_migrate_schema.at:266: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:266: mv stdout expout"
echo t_migrate_schema.at:266 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_migrate_schema.at:266: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:266: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=latest.db cat manifest \$M"
echo t_migrate_schema.at:266 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=latest.db cat manifest $M ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_migrate_schema.at:266: 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
echo "t_migrate_schema.at:266: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=c1e86588e11ad07fa53e5d294edc043ce1d4005a.db complete file \"\""
echo t_migrate_schema.at:266 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=c1e86588e11ad07fa53e5d294edc043ce1d4005a.db complete 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_migrate_schema.at:266: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:266: mv stdout expout"
echo t_migrate_schema.at:266 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_migrate_schema.at:266: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:266: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=latest.db complete file \"\""
echo t_migrate_schema.at:266 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=latest.db complete 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
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_migrate_schema.at:266: 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=`$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=c1e86588e11ad07fa53e5d294edc043ce1d4005a.db complete file ""`
for F in $FILES; do

$at_traceoff
echo "t_migrate_schema.at:266: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=c1e86588e11ad07fa53e5d294edc043ce1d4005a.db cat file \$F"
echo t_migrate_schema.at:266 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=c1e86588e11ad07fa53e5d294edc043ce1d4005a.db cat file $F ) >$at_stdout 2>$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_migrate_schema.at:266: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:266: mv stdout expout"
echo t_migrate_schema.at:266 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_migrate_schema.at:266: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:266: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=latest.db cat file \$F"
echo t_migrate_schema.at:266 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=latest.db cat file $F ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_migrate_schema.at:266: 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




cat >40369a7bda66463c5785d160819ab6398b9d44f4.db.dumped.gz.b64 <<'_ATEOF'
H4sICDMaKEIAA2xhdGVzdC5kYi5kdW1wAO16aY/bSLbl59KvSPSX6gbdLe7Le2jgkSIpkuIi
ipS4DAaN4Cruq8Tl1w/Tbpftst3IrOk3AwwmjbQzZUbcyxMnzj03SE44yvqLfWF1iz3YsqH/
5+5wEVhbeLFZThVegh7U4f0fcduE92H3y593v9zBcH+pm/GlfpTly6POukf84eXz11//+vLx
giZ56eMKZHVWpy9JFpfR8DLELejBGEcvwfLyp//40+6XT7P/bLZtrrzJ6uFlysb7Nt0zG7Km
/kcY9+PwtycoH/Hul4+JfZngd1/bDFuEqKle7vH817gOm2iLnkW7X/7yu/tMsjL+RxSXI3i9
y192v2TRb7N++G2yYeyb7X4+3+HroJewqce4HrdhARjibwd9ewevlw9/2yZu+q/j/e01n48/
fjP4NfcoS5KXsXmNsYV+hONL+Oj7LdpL0m839Rpw98sn0P6cRR8+fvCXjzcn65ZwsV9k3Ta+
jvVyY9WrYP35V8CEgIIRkqFABGKYJAOGjGAKgCDA4ASOSBQnSAYNf/3wa4QzKJOgOBmhGCCQ
OAAkxTAkTcQonTAggCkqwGkMbJdK+CCzn7/O+lUzbidtmVbCkA+s0ctNWZxe/2v36xtSxMiE
QWkcjsIkASgKk3iARhETwzRORwiOEVueVEi8ppgwEYHQAI8RDKbDIKYJGAuiiE4Iig4QMopx
HKZwBvlpis2nFPluYe/421OEmS2XECcxBKAwCBGSxHA8IWiAYkkcwzggQxInAb7FReIwJuEN
NiYJGJxEoxglKIREEJgimQBECKDhmI7on6ZYfEpRaSWzFb6k+B2LP+3SjWVtn1WgX16KePnw
FvpG4CsGfmZ82FRtHw9DvLHr8/75POR1DvBxlh9S7gtMf5RBwrCq/Dlj0wNhzpTIma8f/v3v
P1yaL9GCIAZRQscYgaN0yMQEhmExhYQgQQmaQHCGxmAyDsgfRcvPBZvyM8q3whuj/VHqbdFO
+eu9cS51erpvjPZHWfQazf6IpDrQ/PJNtG8YVIE6S+Jh/KSy/1Lw3yf13+vpj0T+c/jPMvlb
Ol9JZQ2q+EdzbTM1LdiSe+X5ay7hvRni+jWDxxD3u18+lowfjPwyMCibYPfLtmFakPXfXflt
qu0jKLPwH9vFn9IasrQG46P/fYRt1MVi95bEIi9frtlA+9P/eL2T/8qi/9gS+59/+k3IXz/9
8PIq5x8T/vDyz3w+fBn+l+8L2O+Q+iwCP7zb3+kA2JZ1vMfb/t5w28iW1du2/jzfj8rad1jE
21/xl9X6F4v3fZ37t5a634X8SqgxGIMZigkDJoRpFEfoGAQRhccMApM0iGMiBhjyqgkhngQI
BUJAhIDedIlBSBiHEZRGKYqmGQQwNE0A+Ifljjcn/NrBtoDD+srCw3o520Kp6Ta7WpQMW6sw
2fCsWbmMWrwua7a2aLaz7nShda6Hu6JahLLQs6LH5qIXj1VX5Um73hW7GFWdlxeN1xWtaJXh
OiEDf5gtXoA12xNBfjnrhWvtPNreZJIn1watguknkvJvAImKcCJhaIBsbgFFQwaQAEYIEEXB
JrcIARN0BAMqjP/fA+kd9KAiJIYBSF59FYPDGIoiMbUNhik4QmgiIROaoBIS/U6sXXWZMF5j
UxZWH/XCpuiZ1mTJ1DRLuZFg77v5vU4TQIlaK2u9LBSsj7j3cEB3AnQ9BInhxVPYQrUbMcGe
gsgBueotC+KgjRq2FRWu1f0rLC7SuX4+p9hEteysDKpjHs43oGWq6+5o03fcyjpdl77Q7fzI
zuVT66H8h97oZ2C9A4GI2Eo1FsUATfDN122ESoJoq3EwEsQYDkJsc4EBQxM/ZJSbWflx1lVF
01Z53hi02LmJ2AJy0nkDG3lr1QQYGYpstYVpI0h01nph2tnlxTwJG22KWl2FAiEMZbnlnPmR
ooksVA6XAkfMCmfO/GrxwNEyq+Pc+JU/eK1SgVZsfGVxdlXVpkWVOcHRz8oqO2jaUcimgdXc
enjWnyj281r7M8f2R8T6exP3Vh/3ZY6fLO7Xy/rHdv9G7Mn8SGwRlh7V5rXTBNvzhn5Pu5vy
XBOq00yDpjnELnk8b/BLuLamP9yAu5Pp6mg6e+rZ7slznKxqgBoEwqqlBOZn2B0Z5db68Bws
2cwq5ZzACzGnKDqB1VJ6x5TWnmv2N1PZpe2Y4ryD7wt/n3tx+C8J/ZWH/YP8/LKZj/g/71lq
/HkzmuMt7kb0RjN+wz997ilde86kBNmzXFcaLrW4w8pD2YU1to95rNZoFyf7A3nXTHgWKM86
HRb3EXnOcTheTwY9JvIc3Seroeky7nLNWRaNOcO97tC79M5GPSP1/J5WE9b4cs/f8HGj33Pz
bB8tzb/X+X1P7E+zgI/8/cpJvfx5eHV3WbTxMttm7IcPr1ckIBz/8tGY/YzfG6f7pX0Nu5mt
z3fy8ppKNXzH6K9v9LcFJvEYCxk8ACGKojiOhHgEECQMtwUPtpYTS6jNeMf0q1aNGzPi/r9e
//lbHY/bJ3W7wPnSBX60lGKh5dGFMZ5lV/HSgzu67VE8jwx+Z0hwhNQWMiLuUDkzfXzEUkGL
pyKep3N3v3Da7nxu2mv8mLr5YbnQIjSRVhKyxFVZDddqHRgxl28Km8cVJwpVpJf7/MyLe3bT
cEe6g5qjMCSyzHD3XFXDTE6sVyUFQZ7PVzVjGkXRrzM4FM/BGZ9AhqSr5Pf5styoiMVvQ0gq
zxn1EgTSIp4VjsX+Mu388Qyr1aPJlueFFztOpIFdbSuwBHhxOTX3WqFuIrSQd+9ZjVqrYfap
bi+UEDQ5t+rn7vQwqPp8XXebQrOUSOMGit+CZKuYZ92SiWeOZ8PYTCgJznmN0t05Ty59ccNg
R1X3kZt4SpEUdpeWXt0I7lPc72a/uc2zHrMuQVfpArOI0N/mJ32l7Olx3tq7oyS06rRgaZCd
IQYUrHLo6Z5GMV6qzK4jTF5Qs+C8Cx+unxjj2Ca3SxEG2j2PRVgjwzXEpeaUSjZbJ3uEvq+R
Px3dveM8LzInyVVwVaCKD1qUW3g7OSU7oT+61tPHpPnQcTy9zIhVu/cbLfMS4KobM01eqEMS
Gs6Gc/QLKqVmxUIYCGBXk8NCbLBc87ZV5R1ptgc/XYa58Kf14fLrqvpnm7FUf8VPaEtBFDdp
Qbsw/hwu7FplwtiyKH49w2Q+5qJOOaHLRvN+JxDHqomZABEy14kusZRfj21IFrBqwuezy05d
Hx6jyQsMlfeJeTAJdhA8SxwX2yJhHqklLoz0ytlpcGxcFTFSkv1Dj/eowLYhBmh7EQp/vHWZ
Nxq3G9bxHKNXVzy4GQXfrSUiUqsysbYTVGCwokLDdmQ580W4csmhF3KJaAmP5q9QGuMxrl7G
ovaYhjMUSjANeJw8JcUK+O/fS9QXqfg/o1Db71+p0Xct5b9QpI869DHdn8rQV7r3m71kIhpG
CThmcJyCaQACKokZEg4RBCMDAqGSCIMp6scqpMnHSGPh48HqjpYcYLwpcKx5ZVn8qLL8gbtP
Jy41D4m+D1kNBGlA2lRFF8Oxbk1KNci7EdXhnrrtluzZX45j1U6WPJb5fUSCKlVNEaNOmXVu
NIG/BsgwJqcZaIOXLXRmL40JaahwE88YVaP9WOs+LO2aW2hG6HAZDnFvinemHsrLeanKwnSv
pZHpok5eSlEPo7x4hJ0eQ17Tiy6KCN5EuQ+bcCeZE8y///339flH0EUxjQcERUREjFMogWMM
FgcAZ6Iw3r7xrVjTcYSj0atc58N/tU3QzH/bfNHbgSPw5y3v+85r7ORsp05FKu1DhQpDuIQ6
aljhjhucjgwD3Kmwulyq6dYpyjK9fpQs6dWbqm7JLup5vjRDoh4fKEqzd2EFGq4ErIS0aUod
pufzFu0S6eLqrCtoqUEzKZcXRRzOaoZf9zZJ8b2aF5czm5WH1FF9/Ul7sXFkXPYcp87SU3ed
Zb4C7psd9NsxOqjDjTn98nEfbQx9bbW/O7n4wfn7pz4+vGflj07Ifzrgn637p0AfXj6O/75/
/y6731Z3WyVyq58BjGIojSMgDmMUjQN0c17w1oKFr39immIATv6eLD+f9M0zfvg1JGEyjgiE
iXE6IVAyCBAMTiIST+KEQtCEYogEJlHivyU4vEVh4ogkcTRAY5SgERJNGJxmsI3pJMBg+pXz
WPL24G+ecWtjCZohqZAOyJAkQ4YIwoROQMQkr5YIpWiEwcNXF/z24G/G8r8j+Jtn/PDr1tsj
IYBjNKCjBN8GbQ1OCBKMYBI4IUiKxjerSBHEzzfZ/51T1G933v8/L/3BQeG3K/QbOeLNlxI4
tRESjmiKQgBFkQgOQEjETILDDIkGIU4x4XvU6MOvnx5zvh5yHG9rdFQWzyFywAt/3/2wjB9r
gc56wEHxdUx50d3D1wrYiKvBeTu4iD/qHlikMH4sz+imJhV+D6QGK2maUmSb3dwzqVLNOS12
ZqnXAnn1gBs2iI/I6vPO3Q5iEnJFJd2Ua6g6QRo9rHMSCKa3cjZ3HgbukSQI8I+ajN4foU6f
12pXnYbnpSxko9jaR8HTbBlqk0pWr53w/cnZT6BlEgrQNI1TIYpTJI2FRMJs+oMhMQ5TAYUG
5NZloSH1PmjBY7w3/W/Q3hZTupQhZj6C6gb/GN7yLlz3BbyuFrsQJHlUjuLauCs32LeOm69J
Gl5JJaPT9TbldgiNfkhZfnQcTyeo3gqssSaB0kYTvruuRzfKLUaYBjyi3Npeir1Mdj0RuWs4
iEr2EHxToTxz4Npm2EMzn3V7JRLKmXPamko8ullInaB3GsZukOmGy0XP+2IbqDwGyh2Ho6l4
M7wYDMgExUGMUREV4AG+adSr32EQiokQAkuQIAhhFH0fvOHWUqZx2aTbz14138EByYKj2PwY
WW8ZJXJzXTqHTc7qL8T4eOqQ+GRkQqoOvGFCLIhzm3IkHo1vjDZSpyt33zf1sWqvj30V51Dt
H2ZuR12pe+hpvUVO9g0ulEjVYTkJj67s89FTwno7YZjYDQRLhJqUiSTJaTJEDtnFgtKbzloP
k0eFINox7ZkYGgvlwyCnwRSWgbUQlL46hfxmZHGAoBGRRExAUcQmC1uhQPCQjqgogQkGJ+Bw
s510iLwP2aGp4k2oXjFGmdF3/W0T38of4+q0pJ/OFlI+4Iuy2bshUWwKO9M3RIzD7tJetUmf
MUxUPAJr4uWgFjmsPSdfUOnwyTAjww2kUVTdzvOfkJQ3Fhfj8sOrlCbwIIDKMNgf2L0/qVhM
ZeFNEscLbm+d/ZVqnFHnS5iYcsq2eKo8NzfPZPY7W36WNhoMWC+x4n0hHX9d4St64GH2zbhS
IQGYhGQAQAMCRjZsKUBGBBoxKBKQGPPqQBKAYu8xXz/VWvknWqvUrZtaCDWStWJbg8Gn9hkl
loHnZi4VrDwjZHMdEie+O+eiaK8Vx9mQ9Qw78tjen263Lb/OnFlk5zyOgwInp2MbU/RhmO7l
AbVdBUGulmMrMbmwuGY/Mw7RxrKN5M3l8/zxIq8dlCjG9flMaIHzVZTaUXj3CJwAIedgfXiE
z1B+PebWY53xN0OL0HQYoYAKEgaEDBWBbVciEYUwKBEHZMRQ5OvzcDp+H7R/QGsz3bfF271I
CdptqAsNa6vsRNhVvkMNEBmfZsRJqw+Ynnd2QaJd2eXxs9crUGTqMcIl9B7MQ9J1O2p/p/ZQ
VXWX4AnWW1ucmjiyk0W2EJBe7iqRNCWD2JelQYO+bVcVV1OgNcdnD7Vm4JKaeOefeUrtaKdA
Ee0IOwlGh+BJD9Q1lPlDgplvL2XwRtgQRBFMvj4MIggQknGI46+nwIB5fbKBxTEIGPA+eN+n
tfpltkzzAgtqJDt6NDTh6Ton3iIflrszR4TJqCdSuTYKOVnnwbg7PIEc0yI6KHt+Vq9adDVE
o6KQXUrEcgbXp33ZWtQphvc1y5hiK5p7Q02hMimmuYO8VaUuDiFebgmgRlq+GLrEL7RhwW7H
8/6UPcWd4o3VtZpcTKMHo+NuJH1WDSobQKm9Gdk4SrYyRsbo1rbTDE2ROMDDzZPjKIyhBAY2
8w4SPCHe0xO923+dOV9Mt6p1PYJ2fyGMa8QX3OHkFK58hvewAGX+I2vGsqc7KsBWdDkeWzON
fLNls7vLkldRhgaSGXe8d4TtMzYmjfTkueLA+TeoEcjSWNa9FxDz0pEPA10QEjsG0F5spHSP
i+VRjBeIc5T0xN2ofIpxddfAycCV98vZkTNyb3p5hURcnhi3+vpmaAmCYvAIS0gURHAAmA02
GGWSzc5SKGC2bmiraAHMxO+D9g9ogsLMLEEQJmYj0OM2pC1Jq0pUqllgrvt4gg54L/qOHdzG
FkLpSNMRyeie5clRSVzJbFUbwsy8NOiOppx+rE+Z1J/EtU2PkIofvDBMTyyH3UInkYHmmqIp
aGw3FTcxbzOTZ5cndSSoOnPUWO+3/UG26i6M2YFZ7scec6sSOdZmp4/LcA0Ygn4zvNueJ2M4
pIjNeMXY5sUBRr++sxYBPNj2P04HgCKJGHkfvO/ThPzu+5vKFRpmFM3l/swXamHr8YRsRiAR
6WgCT0mgTrNr+1qTzr2zeulM4vWzFTKfgczY8iDYFqFdIeD0OvUGhV38+vhQ1vZQwrj34LQC
IvSzxwrQnCz0EK3BoA5nAcJ8ZfNm+7OCz5DE0rk5nb2oZneazR+w672Bmnsk9M9O8A+KOdtT
NQxv9wlkgMEwCMONnwEZbOJA0QGVYCGT0Bi9terI5r+ST0/c397b/wHiRgt+wYT8FPVBclKw
uXJhN8dcCSEOpWmIK/vQyYxzYcqtfJsr4ElEjlCXqUrjubRQ3YyRTshJALsJda+pFkga1fEe
Kit4Ul3VJJWhbLMPyhXqLgzeA2MaHlBbgLO/ryFyrVJyxtBz3DVHuyFSvcWGnWn4EpzNydjf
kQMOP5eHNOGOk+7Pb4cX3qwqAphNbOmIgEkyCTFmQ5YIYixEtqYBCxIsQqnoffC+U3L5ZJzc
4USysNRkFFWccvmxNREXmdGLxEfhZ0qYV1YJA0rG4Pji+xBpTYFQoc2jl54h8iCFTSpzYwdw
jjafRuWNx9NjOPS8i5zc9tD5cFsrTj2n9PN2KYi6NYjuXmYrog/OWWh19nQj99GVdDB+TRNC
2c0lBtgzAbl9ow6SqzJ7cdX5Onlq6ZuhjRiYDpIk+Fi1YubVzwYbY7fNTSTh5gSQmEEijCLf
B+3XmhBKyjM8irXnXkr56C8BCqderdyDSm/kQwT7rg5//l3LNmk83kvPMVNv9Sa9uhW6LRC+
beI7P78ueqVkmq1NfmWi+tEv/TyctcrDDPtWaby36FZxkg9s+vV3dKS/Cbj7JqL1JaLGX7Zd
UZb+xnid3wJVW0A7nfVcqYwtA8PWYH2VUW9LwOC3Tkjnw9XPitOPCXMoWDfB0DKccEiRuiNG
RHx/9X1OgopYu0su7jH1MTHSyLkBxEjIx9CVIqv4faFNOWfsOw9T1mjaIdGMU4BWHx2vsh41
XbVAJC8LJQk3VxRioPQXTmR5ltLM4zMaGegq+5rJ8IQ4V7xPCoIc0O5hqXbQDLk6K5R9IshN
Wh9iOzUxsMeY7u17EQdbFaE2RiQhuu07AKMxYGiGwcgQpjASI4mIxpAkfM/Z5E/3ovaTvXjV
WNSflxU+JSzm7Sn5IPU2Hq5HP+VWc8nFUO0OJ3By5+ExJYLhP6RnMZziliB0/9YDyJXWjS/W
bm4K/Z7dC4SzWXBBDhKq2OnJUYhDAnusB9EG5mNOoD6OjYMt+3VZciYyBEVLMsudIq4detc2
n9pusedb0U9RKnbhfOMNAnPHlsFABb29PsfEJnRYiAKEoVD49RTq4wvJMUVQeIgjNBUGcbT1
5++D9g9UEf45QWhHDovERf6MHsJ9rm/tez4aeVIg8rOngJ+WkVE7IXO9nG9linuH2eulSLzg
tdgI+AOX8VnfTVw4BHJ8VMKJOhh3cvKfIO3LTbKDeDjxyeHYSvsHTyOVRGvrTam2AmMcES6u
t473eM7lztbCYRZ20sNymdbNIsadr2TOFTEasszzpCrmm+HdWnYYSV5fodjUDgk3C4MBmkBR
Ao4IKoy3+owzG8jo++B9n/05BAve5QMinrcmMaHRq5Ib1xPfaIqpcnJiLHtRdk63MyE8RZJK
0UvvGNqR3cQD25euR+sb68SAMXeRXbDSczo+m9OJc6amqa9wpAUVfoya8OBx93ZIHpOPEt7d
gs4KenLzCrrXFHa4GG2uGcgYEmV1NXdhp1gcftPC/oEdHsdJWCYFyRZNF+gfvA/227H9v3wf
7PVg/M9jPI+fHhl8GvKX/503vz5P8tND8uGPPLP65i2oI6bBYX/Q2OWIu8azqVMRRF25Bo6m
RXJFXPaNkvcw06HxXs5ixaKTFe3OkLX2O/ixoI9ZwE2WM1x2dBfuzugbME0vSEsloxV7OcPQ
capdC0JrlFCjZzc/amYP64x8alcHpqq8Hs+7nh6SBHEHxlKofTJ4jzqI1mwvGUH0DO7WoxhY
W0GEWT602qGoipJl9ZJnjVnManVa9sP1oGvXxNyhbZOyg3PoqsX0EC+ZGF68ybFxNoVR4aVS
moQfv1T6PaDvOB/4BlARNU2n4TVzFhlMOxXzWS4yRPXn8lAcUZ/PLL9I15GJR7i4qpdLmscJ
tkb7ZFx2w35A91IljOB28Sixevhb356biyKnjSN38qU0LsGRr/2oeu4TdeohlKCSeBp65WYK
igIHE9GUMby75CyPVmOYlX1GL3tMmcxS1g9Zv2U2XWyxT4DlHoypkka0WTNidrt9bmAd7l40
RnUv4FZAlJMmu4SMcGdQcEqNpyr3+iu5Fx95Md2gqzGD2UnTY6Q5NycwwvIu8YMXI8rVDCuq
yJwGSfJm6CzJcZtdICaViV9iLGEU0kKYO+N2SBPihGdbCK9dYq/WuSpQNFCYg5745BSJz8Ad
U/PNK/aO7u3bLeAYv63YSoqLWRQOEZQDbt4XVdE4QtEsL0ChFoELizph2CTY0D75uGLwfiD3
QS2FM3L172exzoQS0M3JkSyNym55asn8qDRP2Vnd0K1xZN+GIzbQIXoeC0m2zNpdS3Wqd6O5
yt4JwpFTICyvK4Zbjnw1+tVt1kIwm75GrnQTsM2DEvX4zN2ds+gDws3JhDFFSLczkSYr/OOK
wYdagMZyoH2CGh32zBOjdU1PVa35HV+wS+EeucPoKGrGSw9nXc962p2KSjsOMWHJ53D2Fa/b
SW6BC7dL9zgvNlw+ySQNRpi7z5cCTe/D4gMuuJSnkCpUeR4i2UpS/tRYDPGOFXuHt/52xdDL
1dn0fFuxPUN3UlltKv1YRsUz02pWdZ2tWhONKI+mNtc5VTa9td4kMzMJvotcaiUXN6cpPEGX
iaPy6v64iNeZO43l5Ol+KRpWvLVqXTQ+KMyg4Yh2bfw5QiPEad1UHU6CZOr+LkNZ0N1u3Ukk
OAPkt/MZ86F5lOuTH8epK3gWbtxdzJDKSWWhQQgWzQlZ7By7lb53uaRjoGc8ZuguoqBzSTAX
w5mpZFxjpjsHNOuL/bmGWUV80CWmQrBc2oKYaZdl08Y9BqHw3s5P8EU5KUhQChFaVruhOeVt
XUlI3rZMpNkjT6Y5ajB3en/thKWZEOA7nXHDgzoMD5J9uCtRXZiGk5yV2ZPhI3Cx4aEYO8cl
VzGcq/rAy3u8CUvjkSR8ekZm95qlHGeGrnM7oXgXnPg9EhZn7ylcyLADIBVC1CTl9I7UunbY
lZLpdP08jIOwl0fdSWrnVN5miUedJgmJW4sWT63RZDTtcVU5xRdPHtfDoZ0vIi0q4qk8LYZu
GezOlYFpKCi6bb70qWAnNv3Bu8HfE+wdjubbd4Od89XrBY2d+T1mnGDuLGSxhvtLVRpyrYt5
P2qljvYUFO39Yi/7hzgy8ifUcvlOw5AouZPEDUZ45dKCk6BkQWCdWL+pSoUkHfAIRSgxEjCf
91EZo1iNPxzrceMbjCy2DTQC3b4CZOfLt8wDuYctrppA+NYFaXCmZ7hnh9Vs3sGxvZhTyhuX
ARBH7RoYku1aSLLVTNeOQJIcsqB+Ptxu5860qkDJGNsULR2aPCJNQWh0WBY6uSzLTNtEImwY
USiXkNnj5N5cQXmVy/4ZqS2fwkQqCwLb33ZKagjpXk3nBOZWN8afa8h9eYPe0DTZ/s/d/wIp
/8/fuTwAAA==
_ATEOF


$at_traceoff
echo "t_migrate_schema.at:411: if test \"\$OSTYPE\" == \"msys\"; then
  mimencode -u -o 40369a7bda66463c5785d160819ab6398b9d44f4.db.dumped.gz 40369a7bda66463c5785d160819ab6398b9d44f4.db.dumped.gz.b64
else
  eval \$UNB64_COMMAND <40369a7bda66463c5785d160819ab6398b9d44f4.db.dumped.gz.b64 >40369a7bda66463c5785d160819ab6398b9d44f4.db.dumped.gz
fi
"
echo t_migrate_schema.at:411 >$at_check_line_file
( $at_traceon; if test "$OSTYPE" == "msys"; then
  mimencode -u -o 40369a7bda66463c5785d160819ab6398b9d44f4.db.dumped.gz 40369a7bda66463c5785d160819ab6398b9d44f4.db.dumped.gz.b64
else
  eval $UNB64_COMMAND <40369a7bda66463c5785d160819ab6398b9d44f4.db.dumped.gz.b64 >40369a7bda66463c5785d160819ab6398b9d44f4.db.dumped.gz
fi
 ) >$at_stdout 2>$at_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_migrate_schema.at:411: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:411: eval \$UNGZ_COMMAND <40369a7bda66463c5785d160819ab6398b9d44f4.db.dumped.gz >40369a7bda66463c5785d160819ab6398b9d44f4.db.dumped
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o 40369a7bda66463c5785d160819ab6398b9d44f4.db.dumped
fi
"
echo t_migrate_schema.at:411 >$at_check_line_file
( $at_traceon; eval $UNGZ_COMMAND <40369a7bda66463c5785d160819ab6398b9d44f4.db.dumped.gz >40369a7bda66463c5785d160819ab6398b9d44f4.db.dumped
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o 40369a7bda66463c5785d160819ab6398b9d44f4.db.dumped
fi
 ) >$at_stdout 2>$at_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_migrate_schema.at:411: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_migrate_schema.at:411: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=40369a7bda66463c5785d160819ab6398b9d44f4.db db load < 40369a7bda66463c5785d160819ab6398b9d44f4.db.dumped"
echo t_migrate_schema.at:411 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=40369a7bda66463c5785d160819ab6398b9d44f4.db db load < 40369a7bda66463c5785d160819ab6398b9d44f4.db.dumped ) >$at_stdout 2>$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_migrate_schema.at:411: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

# verify that the db actually has the claimed schema
$at_traceoff
echo "t_migrate_schema.at:411: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=40369a7bda66463c5785d160819ab6398b9d44f4.db db version"
echo t_migrate_schema.at:411 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=40369a7bda66463c5785d160819ab6398b9d44f4.db db version ) >$at_stdout 2>$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_migrate_schema.at:411: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:411: grep -q 40369a7bda66463c5785d160819ab6398b9d44f4 stdout"
echo t_migrate_schema.at:411 >$at_check_line_file
( $at_traceon; grep -q 40369a7bda66463c5785d160819ab6398b9d44f4 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;;
   0) ;;
   *) echo "t_migrate_schema.at:411: 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 do the actual migration
$at_traceoff
echo "t_migrate_schema.at:411: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=40369a7bda66463c5785d160819ab6398b9d44f4.db db migrate"
echo t_migrate_schema.at:411 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=40369a7bda66463c5785d160819ab6398b9d44f4.db db migrate ) >$at_stdout 2>$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_migrate_schema.at:411: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_migrate_schema.at:411: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=40369a7bda66463c5785d160819ab6398b9d44f4.db ls keys"
echo t_migrate_schema.at:411 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=40369a7bda66463c5785d160819ab6398b9d44f4.db ls 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_migrate_schema.at:411: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:411: mv stdout expout"
echo t_migrate_schema.at:411 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_migrate_schema.at:411: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:411: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=latest.db ls keys"
echo t_migrate_schema.at:411 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=latest.db ls 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
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_migrate_schema.at:411: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon




$at_traceoff
echo "t_migrate_schema.at:411: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=40369a7bda66463c5785d160819ab6398b9d44f4.db agraph"
echo t_migrate_schema.at:411 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=40369a7bda66463c5785d160819ab6398b9d44f4.db agraph ) >$at_stdout 2>$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_migrate_schema.at:411: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:411: mv stdout expout"
echo t_migrate_schema.at:411 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_migrate_schema.at:411: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:411: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=latest.db agraph"
echo t_migrate_schema.at:411 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=latest.db agraph ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_migrate_schema.at:411: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


REVS=`$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=40369a7bda66463c5785d160819ab6398b9d44f4.db complete revision ""`
for R in $REVS; do

$at_traceoff
echo "t_migrate_schema.at:411: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=40369a7bda66463c5785d160819ab6398b9d44f4.db ls certs \$R"
echo t_migrate_schema.at:411 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=40369a7bda66463c5785d160819ab6398b9d44f4.db ls certs $R ) >$at_stdout 2>$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_migrate_schema.at:411: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:411: mv stdout expout"
echo t_migrate_schema.at:411 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_migrate_schema.at:411: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:411: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=latest.db ls certs \$R"
echo t_migrate_schema.at:411 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=latest.db ls certs $R ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_migrate_schema.at:411: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_migrate_schema.at:411: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=40369a7bda66463c5785d160819ab6398b9d44f4.db cat revision \$R"
echo t_migrate_schema.at:411 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=40369a7bda66463c5785d160819ab6398b9d44f4.db cat revision $R ) >$at_stdout 2>$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_migrate_schema.at:411: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:411: mv stdout expout"
echo t_migrate_schema.at:411 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_migrate_schema.at:411: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:411: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=latest.db cat revision \$R"
echo t_migrate_schema.at:411 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=latest.db cat revision $R ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_migrate_schema.at:411: 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
echo "t_migrate_schema.at:411: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=40369a7bda66463c5785d160819ab6398b9d44f4.db complete manifest \"\""
echo t_migrate_schema.at:411 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=40369a7bda66463c5785d160819ab6398b9d44f4.db complete 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_migrate_schema.at:411: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:411: mv stdout expout"
echo t_migrate_schema.at:411 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_migrate_schema.at:411: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:411: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=latest.db complete manifest \"\""
echo t_migrate_schema.at:411 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=latest.db complete 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
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_migrate_schema.at:411: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


MANIFESTS=`$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=40369a7bda66463c5785d160819ab6398b9d44f4.db complete manifest ""`
for M in $MANIFESTS; do

$at_traceoff
echo "t_migrate_schema.at:411: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=40369a7bda66463c5785d160819ab6398b9d44f4.db cat manifest \$M"
echo t_migrate_schema.at:411 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=40369a7bda66463c5785d160819ab6398b9d44f4.db cat manifest $M ) >$at_stdout 2>$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_migrate_schema.at:411: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:411: mv stdout expout"
echo t_migrate_schema.at:411 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_migrate_schema.at:411: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:411: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=latest.db cat manifest \$M"
echo t_migrate_schema.at:411 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=latest.db cat manifest $M ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_migrate_schema.at:411: 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
echo "t_migrate_schema.at:411: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=40369a7bda66463c5785d160819ab6398b9d44f4.db complete file \"\""
echo t_migrate_schema.at:411 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=40369a7bda66463c5785d160819ab6398b9d44f4.db complete 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_migrate_schema.at:411: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:411: mv stdout expout"
echo t_migrate_schema.at:411 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_migrate_schema.at:411: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:411: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=latest.db complete file \"\""
echo t_migrate_schema.at:411 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=latest.db complete 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
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_migrate_schema.at:411: 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=`$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=40369a7bda66463c5785d160819ab6398b9d44f4.db complete file ""`
for F in $FILES; do

$at_traceoff
echo "t_migrate_schema.at:411: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=40369a7bda66463c5785d160819ab6398b9d44f4.db cat file \$F"
echo t_migrate_schema.at:411 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=40369a7bda66463c5785d160819ab6398b9d44f4.db cat file $F ) >$at_stdout 2>$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_migrate_schema.at:411: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:411: mv stdout expout"
echo t_migrate_schema.at:411 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_migrate_schema.at:411: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:411: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=latest.db cat file \$F"
echo t_migrate_schema.at:411 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=latest.db cat file $F ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_migrate_schema.at:411: 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




cat >e372b508bea9b991816d1c74680f7ae10d2a6d94.db.dumped.gz.b64 <<'_ATEOF'
H4sICPo+PkICA2xhdGVzdC5kYi5kdW1wAO16aY/bSrLl56tfUegvtxt0t7gv76GBR4qkSIqL
KFHiMhg0kqu4rxKXXz9Uue1rX5cbVXf6zQCDkVFlScXMiDwReeJEkpywl/UX68TqZ3ZnyYb+
n5vdSWAt4cViOVV48TtQBbd/RE0d3PrNL3/e/HID/e2lqoeX6l4UL/cqbe/Rp5cvr7/+9eX1
gjp+6aISpFVaJS9xGhVh/9JHDejAEIUv/vzyp//40+aXz7P/bLZ1rqxOq/5lTIfbOt0j7dO6
+kcQdUP/twco7tHml1fHfpvgd691htVCWJcvt2j6a1QFdbhaT8PNL3/53TpD/x8P0PWbLyP/
/PXdOnpdxlcTn77O3Ad1Ez0XCpqmSAMwrM69fnxZZ/o6vAJl9PvBr8PXi17yaP564euCfrjy
nxd+Xu2XSz/D9OfPnn16NfGXr3/8/critIj+EUbFAJ7x+2XzSxq+tZihq9dIfYndc9BLUFdD
VA3rMB/0v3Pt+9g8L+//tk5cd9/a+9sT6de33w1+RiVM4/hlqJ82VtP3YHgJ7l23WnuJuzVc
T4ObX/65zjT89PrFX17DJutn4WS9yLplfGvr5cqqF+H8518BEwAKRkiGAiGIYJL0GTKEKQB8
H4NjOCRRnCAZNPj1068hzqBMjOJkiGKAQCIfkBTDkDQRoXTMAB+mKB+nMbBeKuG9zH55HfWL
ZlwP2jwuhCHvWKOT6yI/PP+0+fUdLmJkzKA0DodBHAMUhUncR8OQiWAap0MEx4jVTyogni7G
TEggNMAjBIPpwI9oAsb8MKRjgqJ9hAwjHIcpnEF+6mL92UW+ndkb/n4XYWb1JcBJDAEoDAKE
JDEcjwkaoFgcRTAOyIDESYCvdpEoiEh4hY2JfQYn0TBCCQohEQSmSMYHIQJoOKJD+qcu5p9d
VBrJbITfXPwhiz/zz5plTZeWoJuf2+fTe9I3BN9k4JeMD+qy6aK+j9bs+sIMX4Z83sbPWd5M
ud9g+qMZJPSLyh9TNtkR5kSJnPn88u9/fzM0v1nz/QiEMR1hBI7SARMRGIZFFBKAGCVoAsEZ
GoPJyCffspYdczbhJ5RvhHda+6Opt1o7ZM+1cQ51eDjvtPZHs+hpzXpFUu1pfv7O2ncZVIIq
jaN++Fw//mUp+1gR+5FP3ypfX8x/ocmv7nxDlW/XiteZ6gaszj3z/OlLcKv7qHp6cO+jbvPL
27Xj24F+UfubX9YN04C0e6vKfONqc/fXevaP9eLPbvVpUoHh3v3ewjrqdGa3Z4lFXn67ZgXt
T//juZL/SsP/WB37n3/6SuTPbz+9POn81eFPL//059Nvw//yY2n+HVJfSODN1f6OB8Aa1uEW
rft7xW1NtrWOg6/zvVXWfsAiWn9Fv0XrXwTvxzr3by11vzP5DVFjMAYzFBP4TADTKI7QEfBD
Co8YBCZpEEVEBDDkyQkBHvsIBQJABIBeeYlBSBiHEZRGKYqmGQQwNE0A+M1yx5sjfmlhS8Bh
fWHhfjkdLaHQdItdzpQMnxdhtOBJO2cyeuZ1WbO0WbPsZaMLjX3Z3RT1TCgzPSl6ZM56fl90
VR61y02x8kHVeXnWeF3R8kbpLyPS87vpzAuwZrkiyE5HPXfOG5e2VprkyaVGS3/8CaX8G0Ci
QpyIGRogq1pA0YABJIARAoShv9ItQsAEHcKACqL/90D6QHpQIRLBAMRPXcXgMIaiSEStg2EK
DhGaiMmYJqiYRH8ga0edR4zX2ISF1Xs1swl6pDVZMjXtrFxJsPWc7FYlMaBErZG1ThZy1kOc
W9CjGwG67PzYcKMxaKDKCRl/S0Fkj1z0hgWR34Q124gK1+jeBRZn6Vg9HmNkolp6VHrVNnfH
K9BS1XE2tOnZTnk+XOYu161sz07FQ+ug7E1t9DOwPoBASKylGgsjgMb4quvWhIr9cK1xMOJH
GA4CbFWBPkMTb2aUk56z/aSriqYt8rRm0GxlJmIJyEHnDWzgz4smwEifp4sljGuChEetE8aN
VZzMg7CmTV6pi5AjhKHM14wzX1M0loXS5hJgi2luT6lXzi7Yn81yP9Ve6fVuo5SgEWtPme1N
WTZJXqa2v/fSokx3mrYX0rFnNafqH9XnFPt5rf2ZYvsjZP2jiHuvjvttjp8E99uw/rHdvyb2
aL4mtghL93LV2kmMbXlDvyXtVXksMdVqpkHTHGIVPJ7V+ClYGtPrr8DZyHS5N+0t9Wi25DGK
F9VHDQJh1UIC0yNo94xybTx48ud0YpViiuGZmBIUHcFyVjrblJaOq7dXU9kkzZDgvI1vc2+b
uVHwLxP6Gw37B/Pzt828x/+5Zqn2plVoDteoHdArzXg1//C4h3TpOJMSZPfsOFJ/qsQNVuyK
NqiwbcRjlUY7ONntyJtmwpNAuefDbnbuoWvv+/3lYNBDLE/hbTzXNF1EbabZ86wxR7jTbXqT
3NiwY6SO39JqzBrB293Dmn6PVbO9Spp/r/L7MbE/zwJe8/cbJfXy5/6p7tJwzct0nbHrPz2v
iEEw/OVVmP0sv9ec7ubmaXYVW19W8vJ0pex/yOhvF/o1wCQeYQGD+yBAURTHkQAPAYIEwRpw
f205sZhahXdEP7lqWDMj6v7r+d/fqmhYv6maGc7m1vfCuRBzLQtPjPEo2pKX7tzeafbicWDw
G0OCPaQ2kBFyu9Ke6P09knJaPOTRNB7b24nTNsdj3Vyi+9hO97MDzUIdagUhS1yZVnClVr4R
cdnKsFlUcqJQhnqxzY68uGVXDrelG6g4CkPCsxlsHotqmPGBdcs4J8jj8aKmTK0o+mUCu/zR
28MDyJB0kbwum+crFbL4tQ9I5TGhboxAWsizwj7fnsaNNxxhtbzX6fw48WLLiTSwyjUCs4/n
p0N9qxTqKkIzeXMf5aA1GmYdquZECX6dcYt+bA93g6qOl2WzMjRLiTRuoPjVj9eKedTPMvHI
8LQf6hElwTGrULo9ZvGpy68YbKvqNnRiV8nj3GqTwq1qwXmI283k1ddp0iPWIegymWEWEbrr
9KAvlDXej2t7t5eERh1nLPHTI8SAnFV2Hd3RKMZLpdm2hMkLauofN8Hd8WJjGJr4esoDX7tl
kQhrZLAEuFQfEsliq3iL0Lcl9Ma9s7Xtx0nmJLn0LwpU8n6DcjNvxYd4I3R75/zwMGnatRxP
zxNyrpzblZZ5CXDllRlHN9AhCQ0mw957OZVQk3JGGAhgF5PDAqw/O+Z1rcob0mx2XjL3U+6N
y93hl0X1jhZzVr0FP6ANBVHcqPnNzHhTMLNLmQpDw6L45QiT2ZCJOmUHDhtO241A7Ms6YnxE
SB07PEVSdtk3AZnDqgkfjw47tl2wD0fXN1TeI6beJNhecM/iMFtnEuaRSuKCUC/tjQZHxkUR
QyXe3vVoiwpsE2CAtmYh94Zrm7qDcb1iLc8xennB/auR8+1SICK1KCNr2X4J+nOYa9iGLCY+
DxYu3nVCJhEN4dL8BUoiPMLV05BXLlNzhkIJpgEPo6skWA7//UeK+o0q/s8w1Pr5Gzb6oaX8
F4z0ykOv7v6Uhr7hva/ykglpGCXgiMFxCqYB8Kk4Ykg4QBCM9AmEikMMpqi3WUiT96HGwvvd
ud2fZR/jTYFjzQvL4nuV5XfcbTxwibmL9W3AasBPfNKiSjrv91VjUqpB3oywCrbUdTOnj+60
H8pmPMtDkd0GxC8T1RQx6pCej7Um8Bcf6Yf4MAGtd9OZTq25NiENFa7iEaMqtBsq3YOlTX0N
zBDtT/0u6kzxxlR9cTrOZZGbzqUwUl3UyVMh6kGY5feg1SPIrTvRQRHBHSnnbhHOKHOC+fe/
//oO6MKIxn2CIkIiwimUwDEGi3yAM2EQrT/4WqzpKMTR8EnXWf9fTe3X099WXfR+4Aj8cc26
rnVrKz5aiV2SSnNXodwQToGOGudgw/V2SwY+bpdYVczleG0VZR6fX8VzcnHHsp3Tk3qcTnUf
q/s7itLsTViAhis+KyFNklC78fG4hptYOjk66whaYtBMwmV5HgWTmuKXrUVSfKdm+enIpsUu
sVVPf9BuZOwZhz1GiT131E1nmW+A+24Hfb1BAKpgzZxuft1Ha4Y+W+0fTi7euLPwuY8Pbmnx
1gn5Twf8s3X/bOjTy+v4H/v3H7z7Gt01SuRaP30YxVAaR0AURCga+eiqvOC1BQue/yKaYgBO
/vruSd8946dfAxImo5BAmAinYwIlfR/B4Dgk8TiKKQSNKYaIYRIl/luMw6sVJgpJEkd9NEIJ
GiHRmMFpBlsznQQYTD9zHovfb/zdM65tLEEzJBXQPhmQZMAQfhDTMQiZ+CmJUIpGGDx4quD3
G383lv8dxt8946df194eCQAcoT4dxvg6aG1wAhBjBBPDMUFSNL5KRYogfr7J/u+con6/8/7/
eWn0L4jmNUJfkyNadSmBU2tCwiFNUQigKBLBAQiIiIlxmCFRP8ApJvgIG3369fMN3Ochx/66
hHtldm0iA7zw982bZXxfCXTaAQ6KLkPCi84WvpTAQhwNzpreQbxBd8EsBdF9foRXNS7xmy/V
WEHTlCJb7KqeSZWqj0m+MQu9EsiLC5ygRjxEVh837roT44DLS+mqXALV9pPwfj7GvmC6C2dx
x77n7nGMAG+vyejtHuj0cSk35aF/nIpcNvK1fRRczZKhJi5l9dIKP56c/QRaJqYATdM4FaA4
RdJYQMTMyj8YEuEw5VOoT65dFhpQH4MW3Idb3X2F9jqb0qkIMPPul1f4bXiLm3DZ5vCynNmZ
IMm9sheX2lm43rq23HSJk+BCKimdLNcxswJo8ALq7IX74XCAqrXAGkvsK0044pvLsnfC7MwI
Y4+HlFNZc76VybYjQmcJelFJ74JnKpRr9lxT91to4tN2q4RCMXF2U1GxS9czqRP0RsPYFTLd
cLjwcZstA5UHX7nhcDjm74YXgwEZoziIMCqkfNzHV4566h0GoZgQIbAY8f0ARtGPwRusLWUS
FXWyvnfL6QZ2SOrvxfptZN15kMhVdekcNtqLNxPD/aFD4oORCanc8YYJsSDKLMqWeDS6MtpA
HS7cbVtX+7K53LdllEGVt5u4DXWhboGrdWdytK5wroSqDstxsHdkjw8fEtZZMcNEji+cRahO
mFCS7DpF5ICdz1By1dnz3eRRwQ83THMk+vqM8oGf0WAMCv88E5S+2Ln8bmRxgKAhEYeMT1HE
SgtroUDwgA6pMIYJBifgYJWddIB8DNm+LqOVqJ4Yo8zgOd66ia/F27jaDekl0xkp7vBJWeVd
HysWhR3pKyJGQXtqLtqoTxgmKi6B1dG8U/MM1h6jJ6h08GCYgeF60sjLduN6D0jK6jMX4fLd
LZXadyGAyjDY7titN6pYRKXBVRKHE26tnf2Fqu1B5wuYGDPKOvNUcayvrslsN5b8KCzU77FO
YsXbTNressAXdMfD7LtxpQICMDHJAID6BIys2FKADAk0ZFDEJzHmqUBigGIfEV8/5Vr5J1yr
VI2TnBFqICvFOvcGn1hHlJh7npu4RDhnKSGbSx/b0c0+5nlzKTnOgs6PoCX3ze3htGv4debI
Ihv7vu8VOD7sm4iid/14K3ao5SgIcjnblhKRM4tr1iPlEG0omlBeVT7P70/y0kKxYlwej5gW
OE9FqQ2Ft3ff9hFy8pe7S3gM5VVDdr4vE/5uaBGaDkIUUH7MgIChQrDuSiSkEAYlIp8MGYp8
3g+no49B+we4NtU9S7ze8oSgnZo60bC2yHaIXeQbVAOR8WhGHLVqh+lZa+Uk2hZtFj06vQR5
qu5DXEJv/tTHbbuhtjdqC5Vle/IfYLk2+aGOQiue5TMCktNNJeK6YBDrNNeo3zXNouJqArR6
/+igxvQdUhNv/CNLqA1t5yii7WE7xugAPOieugQyv4sx8/2lDF4TNgBhCJPPm0EEAQIyCnD8
eQoMmOedDSyKgM+Aj8H7Ma7VT9PZNE+woIayrYd9HRwuU+zO8m6+2VNImIx6IJVLrZDj+dgb
N5snkH2Shztly0/qRQsvhmiUFLJJiEhO4eqwLZozdYjgbcUyptiI5tZQE6iI83FqIXdRqZNN
iKdrDKiBlk+GLvEzbZxhp+V5b0wf4kZxh/JSjg6m0b3RcleSPqoGlfag0N6NbBTGaxkjI3Rt
22mGpkgc4MGqyXEUxlACA6t4BzEeEx/piT6sv46cJyZr1brsQbM9EcYl5HNud7BzRz7CW1iA
Uu+e1kPR0S3lYws67/eNmYSe2bDpzWHJiyhDPckMG97dw9YRG+JaevBcvuO8K1QLZGHMy9b1
iWluybuBzgiJ7X1oK9ZSssXFYi9GM8TZSnLgrlQ2Rri6qeG454rb6WjLKbk13axEQi6LjWt1
eTe0BEExeIjFJApC2AfMChuMMvEqZykUMGs3tFY0H2aij0H7BzhBYSaWIAgTsxDofu2ThqRV
JSzU1DeXbTRCO7wTPdvyr0MDoXSo6YhktI/iYKskrqSWqvVBap5qdENTdjdUh1TqDuLSJHtI
xXduECQHlsOugR3LQHNM0RQ0th3zq5g1qcmz84PaE1SV2mqkd+v+IBt1E0Rsz8y3fYc5ZYHs
K7PVh7m/+AxBvxvedc+TERxQxCq8ImzV4gCjn8+shQD31/2P0z6gSCJCPgbvxzghu3neynK5
hhl5fbo9spma2Wo4IKsQiEU6HMFDEqjD5FieVidTZy9uMpF49WiE1GMgMzq7EGyJ0CYXcHoZ
O4PCTl61vytLsytg3L1zWg4R+tFlBWiKZ7oPF79X+6MAYZ6yarPtUcEnSGLpzByPblixG83i
d9jlVkP1LRS6Ryt4O8WcrLHs+/frBNLHYBgEwZqfPumv5EDRPhVjARPTGL226siqv+LPd9zf
39v/gcQNZ/yECdkh7Pz4oGBT6cBOhjkSQuwK0xAX9q6TKefAlFN6FpfDo4jsoTZVldp1aKG8
GgMdk6MANiPqXBLNlzSq5V1UVvC4vKhxIkPpKh+UC9SeGLwDxtjfoSYHR29bQeRSJuSEoceo
rfdWTSR6g/Ub0/AkOJ3iobshOxx+zHdpxG072R7fDy+8SlUEMCvZ0iEBk2QcYMyKLOFHWICs
TQPmx1iIUuHH4P0g5fLxMDr9gWRhqU4pKj9k8n1tIk4yo+exh8KPhDAvrBL4lIzB0cnzIPI8
+kKJ1vdOegTInRRWqsyMDcA52nwYpTvsD/d+1/EOcnCaXevBTaXY1ZTQj+spJ6rGINpbkS6I
3ttHodHZw5XchhfSxvgliQllMxUYYI8E5HS12kuOymzFReer+KEl74Y2ZGDaj2P/tWpFzFPP
+mvGrpubiINVCSARg4QYRX4M2m85IZCUR7AXK9c5FfLem30UTtxKufmlXsu7EPYcHf7yWUtX
atzfCtc2E3dxR7285rolEJ5l4hsvu8x6qaSapY1eaaL63iu8LJi00sUM61pqvDvr5/wg79jk
259wT39ncPOdxfNvFjX+tO6KovDWjNf51VC5GrSSSc+U0lg9MCwN1hcZdVcHDH7thHQ+WLw0
P7ydMLucdWIMLYIRhxSp3WNEyHcXz+MkKI+0m+TgLlPtYyMJ7StAjJi8920hsorX5dqYcca2
dTFlCccNEk44BWj13vIq61LjRfNF8jRTknB1RCECSnfiRJZnKc3cP8KBgS6yp5kMT4hTyXuk
IMg+7ezmcgNNkKOzQtHFglwn1S6yEhMDW4xp+w+0mmsVodaMiAN03XcARiPA0AyDkQFMYSRG
EiGNIXHwkbPJn+5F7Sd78aKxqDfNC3yIWczdUvJO6iw8WPZewi3mnImB2u4O4OBM/X2MBcO7
S4+8P0QNQejetQOQIy1rvpw3U53rt/SWI5zFghOyk1DFSg62Quxi2GVdiDYwD7N99b6vbWze
LvOcMaEhKFqcnp0x5Jq+cyzzoW1ma7rm3RgmYhtMV94gMGdoGAyU0Pvrc0SsRIcFKEAYCoWf
p1CvDyRHFEHhAY7QVOBH4dqffwzaP1BF+McIoS3ZzxIXehO6C7aZvrbv2WBkcY7Ij44CXlKE
RmUHzOV0vBYJ7u4mt5NC8YRXYi3gd1zGJ30zckHvy9FeCUZqZ9zI0XuApCtWyvaj/sDHu30j
be88jZQSrS1XpVwLjLFHuKhaO979MZNbSwv6SdhI97PDNE4aMs50ITMuj9CAZR4HVTHfDe/a
ssNI/HyEYmU7JFglDAZoAkUJOCSoIFrrM86sIKMfg/dj8mfnz3ib9Yh4XJvEmEYvSmZcDnyt
KabKybExb0XZPlyPhPAQSSpBT51taHt2JQ9sWzgura9ZJ/qMuQmtnJUe4/5RHw6cPdZ1dYFD
zS/xfVgHO5e7NX18Hz2UcG9n6KigBycroVtFYbuT0WSagQwBUZQXcxO0ypnDr1rQ3bHdfT8K
86gg6azpAv3G82Bfj+3/5fNgz4PxPw/RNHy+ZfB5yF/+d578+jLJTw/J+z9yz+q7p6D2mAYH
3U5j5z3uGI+6SkQQtsXi25oWyiVx2tZK1sFMi0ZbOY2UMx0vaHuEzku3ge8zep8E3GQ5w2EH
Z+ZujL4CU3eCNJcyWrKnIwztx8o5Q2iFEmr4aKd7xWxhnZEPzWLDVJlVw3HT0X0cI07PnBVq
G/fuvfLDJd1Khh8+/Nv5nvespSDCJO8abZeXecGyesGzxiSmlTrO2/6y07VLbG7Qpk7Y3t61
5Wy6iBuPDC9e5cg4msKg8FIhjcLbD5X+COgHzge+A1RETdOuec2cRAbTDvl0lPMUUb2p2OV7
1OPTs5cny8BEA5xf1NMpyaIYW8JtPMybftujW6kUBnA9uZRY3r21b8/MWZGT2pZb+VQYJ3/P
V15YPraxOnYQSlBxNPadcjUFRYH9kaiLCN6cMpZHyyFIiy6l5y2mjGYh67u0Wz0bT5bYxeDs
7IyxlAa0XlJictptZmAt7pw0RnVO4JpDlJ3Em5gMcbtXcEqNxjJzuwu5Fe9ZPl6hizGByU6S
fajZV9s3guIm8b0bIcrFDEoqT+0aibO6b8+S7dQbX4xLEz9FWMwo5BlhbozTInWAE651Rnjt
FLmVzpW+ooHc7PXYI8dQfPjOkJjvjtgHurfvt4BtfI3YQoqzmec24Rc9bt5mVdE4QtHOro9C
DQLnZ+qAYaNgQdv4NWLwtie3fiUFE3LxbkexSoUC0PXBls4alV6z5Czzg1I/ZHtxAqfCkW0T
DFhPB+hxyCX5bFbOUqhjtRnMRXYPEI4cfGF+Rgw/2/LF6BanXnLBrLsKudC1z9Z3StSjI3ez
j6IHCCcjY8YUId1KRZos8deIwbtKgIaipz2CGmz2yBPD+ZIcykrzWj5n59zZc7vBVtSUl+72
shz1pD3kpbbvI+IsH4PJU9x2Izk5LlxP7f04W3DxIOPEH2DuNp1yNLn1swc4/1QcAipX5akP
5XOc8If6zBAfiNgHtPX3EUNPF3vl8zViW4ZupaJcWfo+D4prJuWk6jpbNiYaUi5NrapzLC16
bb1JZmJifBM61ELOTkZTeIzOI0dl5e1+Ei8TdxiK0dW9QjTO0dqqteFwpzCDhkPasfDHAA0Q
p7VjuTsIkql7mxRlQXu9tgeR4AyQXY9HzIOmQa4OXhQljuCecePmYIZUjCoL9YI/a3bAYsfI
KfWtw8UtAz2iIUU3IQUdC4I5GfZExcMSMe3Rp1lP7I4VzCrinS4wFYLlwhLEVDvNKzduMQiF
t1Z2gE/KQUH8QgjRotz09SFrqlJCsqZhQs0aeDLJUIO50dtLK8z1iADPbo0r7ldBsJOs3U0J
q9w07PioTK4M74GD9XfF2NgOuYjBVFY7Xt7idVAY9zjmkyMyOZc04TgzcOzrAcVb/8BvkSA/
ug/hRAYtAIkQoCYpJzek0rXdppBMu+2mfuiFrTzodlzZh+I6STxq13FAXBs0f2i1JqNJh6vK
ITq58rDsds10EmlREQ/FYTb0s8FuHBmYhoKi6+ZLHgp2YJM3ng3+McE+oGi+fzbYPl7cTtDY
id9ixgHmjkIaabg3l4UhV7qYdYNW6GhHQeHWy7eyt4tCI3tADZdtNAwJ4xtJXGGEV04NOAhK
6vvnA+vVZaGQpA3ugQjFRgym4zYsIhSr8Lt9vl/5GiPzdQMNQLcuANl48jV1QeZis6PGEL52
QRqc6inuWkE5mTewb07mmPDGqQfEXrv4hmQ5ZyRea6ZjhSCOd6lfPe5Ou3EmWlWgeIgsipZ2
dRaSpiDUOiwLrVwURaqtJBHUjCgUc8BscXJrLqC4yEX3CNWGT2AikQWB7a4bJTGEZKsmUwxz
ixPhjyXgfnuC3tA02frPzf8CKk8cw5M9AAA=
_ATEOF


$at_traceoff
echo "t_migrate_schema.at:557: if test \"\$OSTYPE\" == \"msys\"; then
  mimencode -u -o e372b508bea9b991816d1c74680f7ae10d2a6d94.db.dumped.gz e372b508bea9b991816d1c74680f7ae10d2a6d94.db.dumped.gz.b64
else
  eval \$UNB64_COMMAND <e372b508bea9b991816d1c74680f7ae10d2a6d94.db.dumped.gz.b64 >e372b508bea9b991816d1c74680f7ae10d2a6d94.db.dumped.gz
fi
"
echo t_migrate_schema.at:557 >$at_check_line_file
( $at_traceon; if test "$OSTYPE" == "msys"; then
  mimencode -u -o e372b508bea9b991816d1c74680f7ae10d2a6d94.db.dumped.gz e372b508bea9b991816d1c74680f7ae10d2a6d94.db.dumped.gz.b64
else
  eval $UNB64_COMMAND <e372b508bea9b991816d1c74680f7ae10d2a6d94.db.dumped.gz.b64 >e372b508bea9b991816d1c74680f7ae10d2a6d94.db.dumped.gz
fi
 ) >$at_stdout 2>$at_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_migrate_schema.at:557: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:557: eval \$UNGZ_COMMAND <e372b508bea9b991816d1c74680f7ae10d2a6d94.db.dumped.gz >e372b508bea9b991816d1c74680f7ae10d2a6d94.db.dumped
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o e372b508bea9b991816d1c74680f7ae10d2a6d94.db.dumped
fi
"
echo t_migrate_schema.at:557 >$at_check_line_file
( $at_traceon; eval $UNGZ_COMMAND <e372b508bea9b991816d1c74680f7ae10d2a6d94.db.dumped.gz >e372b508bea9b991816d1c74680f7ae10d2a6d94.db.dumped
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o e372b508bea9b991816d1c74680f7ae10d2a6d94.db.dumped
fi
 ) >$at_stdout 2>$at_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_migrate_schema.at:557: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_migrate_schema.at:557: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=e372b508bea9b991816d1c74680f7ae10d2a6d94.db db load < e372b508bea9b991816d1c74680f7ae10d2a6d94.db.dumped"
echo t_migrate_schema.at:557 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=e372b508bea9b991816d1c74680f7ae10d2a6d94.db db load < e372b508bea9b991816d1c74680f7ae10d2a6d94.db.dumped ) >$at_stdout 2>$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_migrate_schema.at:557: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

# verify that the db actually has the claimed schema
$at_traceoff
echo "t_migrate_schema.at:557: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=e372b508bea9b991816d1c74680f7ae10d2a6d94.db db version"
echo t_migrate_schema.at:557 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=e372b508bea9b991816d1c74680f7ae10d2a6d94.db db version ) >$at_stdout 2>$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_migrate_schema.at:557: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:557: grep -q e372b508bea9b991816d1c74680f7ae10d2a6d94 stdout"
echo t_migrate_schema.at:557 >$at_check_line_file
( $at_traceon; grep -q e372b508bea9b991816d1c74680f7ae10d2a6d94 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;;
   0) ;;
   *) echo "t_migrate_schema.at:557: 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 do the actual migration
$at_traceoff
echo "t_migrate_schema.at:557: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=e372b508bea9b991816d1c74680f7ae10d2a6d94.db db migrate"
echo t_migrate_schema.at:557 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=e372b508bea9b991816d1c74680f7ae10d2a6d94.db db migrate ) >$at_stdout 2>$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_migrate_schema.at:557: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_migrate_schema.at:557: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=e372b508bea9b991816d1c74680f7ae10d2a6d94.db ls keys"
echo t_migrate_schema.at:557 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=e372b508bea9b991816d1c74680f7ae10d2a6d94.db ls 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_migrate_schema.at:557: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:557: mv stdout expout"
echo t_migrate_schema.at:557 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_migrate_schema.at:557: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:557: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=latest.db ls keys"
echo t_migrate_schema.at:557 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=latest.db ls 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
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_migrate_schema.at:557: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon




$at_traceoff
echo "t_migrate_schema.at:557: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=e372b508bea9b991816d1c74680f7ae10d2a6d94.db agraph"
echo t_migrate_schema.at:557 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=e372b508bea9b991816d1c74680f7ae10d2a6d94.db agraph ) >$at_stdout 2>$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_migrate_schema.at:557: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:557: mv stdout expout"
echo t_migrate_schema.at:557 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_migrate_schema.at:557: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:557: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=latest.db agraph"
echo t_migrate_schema.at:557 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=latest.db agraph ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_migrate_schema.at:557: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


REVS=`$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=e372b508bea9b991816d1c74680f7ae10d2a6d94.db complete revision ""`
for R in $REVS; do

$at_traceoff
echo "t_migrate_schema.at:557: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=e372b508bea9b991816d1c74680f7ae10d2a6d94.db ls certs \$R"
echo t_migrate_schema.at:557 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=e372b508bea9b991816d1c74680f7ae10d2a6d94.db ls certs $R ) >$at_stdout 2>$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_migrate_schema.at:557: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:557: mv stdout expout"
echo t_migrate_schema.at:557 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_migrate_schema.at:557: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:557: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=latest.db ls certs \$R"
echo t_migrate_schema.at:557 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=latest.db ls certs $R ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_migrate_schema.at:557: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_migrate_schema.at:557: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=e372b508bea9b991816d1c74680f7ae10d2a6d94.db cat revision \$R"
echo t_migrate_schema.at:557 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=e372b508bea9b991816d1c74680f7ae10d2a6d94.db cat revision $R ) >$at_stdout 2>$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_migrate_schema.at:557: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:557: mv stdout expout"
echo t_migrate_schema.at:557 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_migrate_schema.at:557: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:557: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=latest.db cat revision \$R"
echo t_migrate_schema.at:557 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=latest.db cat revision $R ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_migrate_schema.at:557: 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
echo "t_migrate_schema.at:557: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=e372b508bea9b991816d1c74680f7ae10d2a6d94.db complete manifest \"\""
echo t_migrate_schema.at:557 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=e372b508bea9b991816d1c74680f7ae10d2a6d94.db complete 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_migrate_schema.at:557: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:557: mv stdout expout"
echo t_migrate_schema.at:557 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_migrate_schema.at:557: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:557: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=latest.db complete manifest \"\""
echo t_migrate_schema.at:557 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=latest.db complete 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
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_migrate_schema.at:557: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


MANIFESTS=`$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=e372b508bea9b991816d1c74680f7ae10d2a6d94.db complete manifest ""`
for M in $MANIFESTS; do

$at_traceoff
echo "t_migrate_schema.at:557: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=e372b508bea9b991816d1c74680f7ae10d2a6d94.db cat manifest \$M"
echo t_migrate_schema.at:557 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=e372b508bea9b991816d1c74680f7ae10d2a6d94.db cat manifest $M ) >$at_stdout 2>$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_migrate_schema.at:557: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:557: mv stdout expout"
echo t_migrate_schema.at:557 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_migrate_schema.at:557: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:557: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=latest.db cat manifest \$M"
echo t_migrate_schema.at:557 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=latest.db cat manifest $M ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_migrate_schema.at:557: 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
echo "t_migrate_schema.at:557: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=e372b508bea9b991816d1c74680f7ae10d2a6d94.db complete file \"\""
echo t_migrate_schema.at:557 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=e372b508bea9b991816d1c74680f7ae10d2a6d94.db complete 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_migrate_schema.at:557: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:557: mv stdout expout"
echo t_migrate_schema.at:557 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_migrate_schema.at:557: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:557: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=latest.db complete file \"\""
echo t_migrate_schema.at:557 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=latest.db complete 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
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_migrate_schema.at:557: 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=`$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=e372b508bea9b991816d1c74680f7ae10d2a6d94.db complete file ""`
for F in $FILES; do

$at_traceoff
echo "t_migrate_schema.at:557: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=e372b508bea9b991816d1c74680f7ae10d2a6d94.db cat file \$F"
echo t_migrate_schema.at:557 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=e372b508bea9b991816d1c74680f7ae10d2a6d94.db cat file $F ) >$at_stdout 2>$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_migrate_schema.at:557: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:557: mv stdout expout"
echo t_migrate_schema.at:557 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_migrate_schema.at:557: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_migrate_schema.at:557: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=latest.db cat file \$F"
echo t_migrate_schema.at:557 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=latest.db cat file $F ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_migrate_schema.at:557: 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`
    ;;

  74 ) # 74. t_dump_load.at:1: database dump/load
    at_setup_line='t_dump_load.at:1'
    at_desc='database dump/load'
    $at_quiet $ECHO_N " 74: database dump/load                           $ECHO_C"
    at_xfail=no
    (
      echo "74. t_dump_load.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_dump_load.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_dump_load.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_dump_load.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_dump_load.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_dump_load.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_dump_load.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_dump_load.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_dump_load.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_dump_load.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_dump_load.at:2: rm test_keys"
echo t_dump_load.at:2 >$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_dump_load.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_dump_load.at:4: (echo foo; echo foo) | \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR genkey foo"
echo t_dump_load.at:4 >$at_check_line_file
( $at_traceon; (echo foo; echo foo) | $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR genkey 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_dump_load.at:4: 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 >testfile1 <<'_ATEOF'
blah balh
_ATEOF

$at_traceoff
echo "t_dump_load.at:6: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile1"
echo t_dump_load.at:6 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_dump_load.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_dump_load.at:7: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch1 commit --message blah-blah"
echo t_dump_load.at:7 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch1 commit --message 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_dump_load.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 >testfile1 <<'_ATEOF'
stuff stuff
_ATEOF



cat >testfile2 <<'_ATEOF'
foo foo
_ATEOF

$at_traceoff
echo "t_dump_load.at:11: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile2"
echo t_dump_load.at:11 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add 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_dump_load.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_dump_load.at:12: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=branch2 commit --message blah-blah"
echo t_dump_load.at:12 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=branch2 commit --message 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_dump_load.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_dump_load.at:14: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db dump"
echo t_dump_load.at:14 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR db dump ) >$at_stdout 2>$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_dump_load.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_dump_load.at:15:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_dump_load.at:15 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_dump_load.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_dump_load.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db load <stdout --db=test2.db"
echo t_dump_load.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR db load <stdout --db=test2.db ) >$at_stdout 2>$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_dump_load.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_dump_load.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test.db ls keys"
echo t_dump_load.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db ls 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_dump_load.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_dump_load.at:18: mv stdout expout"
echo t_dump_load.at:18 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_dump_load.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_dump_load.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db ls keys"
echo t_dump_load.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db ls 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
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_dump_load.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_dump_load.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test.db agraph"
echo t_dump_load.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db agraph ) >$at_stdout 2>$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_dump_load.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_dump_load.at:18: mv stdout expout"
echo t_dump_load.at:18 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_dump_load.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_dump_load.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db agraph"
echo t_dump_load.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db agraph ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_dump_load.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


REVS=`$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db complete revision ""`
for R in $REVS; do

$at_traceoff
echo "t_dump_load.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test.db ls certs \$R"
echo t_dump_load.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db ls certs $R ) >$at_stdout 2>$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_dump_load.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_dump_load.at:18: mv stdout expout"
echo t_dump_load.at:18 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_dump_load.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_dump_load.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db ls certs \$R"
echo t_dump_load.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db ls certs $R ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_dump_load.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_dump_load.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test.db cat revision \$R"
echo t_dump_load.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db cat revision $R ) >$at_stdout 2>$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_dump_load.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_dump_load.at:18: mv stdout expout"
echo t_dump_load.at:18 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_dump_load.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_dump_load.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db cat revision \$R"
echo t_dump_load.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db cat revision $R ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_dump_load.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


done


$at_traceoff
echo "t_dump_load.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test.db complete manifest \"\""
echo t_dump_load.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db complete 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_dump_load.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_dump_load.at:18: mv stdout expout"
echo t_dump_load.at:18 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_dump_load.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_dump_load.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db complete manifest \"\""
echo t_dump_load.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db complete 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
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_dump_load.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


MANIFESTS=`$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db complete manifest ""`
for M in $MANIFESTS; do

$at_traceoff
echo "t_dump_load.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test.db cat manifest \$M"
echo t_dump_load.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db cat manifest $M ) >$at_stdout 2>$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_dump_load.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_dump_load.at:18: mv stdout expout"
echo t_dump_load.at:18 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_dump_load.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_dump_load.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db cat manifest \$M"
echo t_dump_load.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db cat manifest $M ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_dump_load.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


done


$at_traceoff
echo "t_dump_load.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test.db complete file \"\""
echo t_dump_load.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db complete 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_dump_load.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_dump_load.at:18: mv stdout expout"
echo t_dump_load.at:18 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_dump_load.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_dump_load.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db complete file \"\""
echo t_dump_load.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db complete 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
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_dump_load.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


FILES=`$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db complete file ""`
for F in $FILES; do

$at_traceoff
echo "t_dump_load.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test.db cat file \$F"
echo t_dump_load.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db cat file $F ) >$at_stdout 2>$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_dump_load.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_dump_load.at:18: mv stdout expout"
echo t_dump_load.at:18 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_dump_load.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_dump_load.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db cat file \$F"
echo t_dump_load.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db cat file $F ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_dump_load.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


done


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

  75 ) # 75. t_no_change_deltas.at:1: no-change deltas disappear
    at_setup_line='t_no_change_deltas.at:1'
    at_desc='no-change deltas disappear'
    $at_quiet $ECHO_N " 75: no-change deltas disappear                   $ECHO_C"
    at_xfail=no
    (
      echo "75. t_no_change_deltas.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_no_change_deltas.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_no_change_deltas.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_no_change_deltas.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_no_change_deltas.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_no_change_deltas.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_no_change_deltas.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_no_change_deltas.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_no_change_deltas.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_no_change_deltas.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_no_change_deltas.at:2: rm test_keys"
echo t_no_change_deltas.at:2 >$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_no_change_deltas.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon




# If we have a changeset representing a reversion, like
#    changeset_1:   patch "a" [id1] -> [id2]
#    changeset_2:   patch "a" [id2] -> [id1]
# then concatenating these revisions should _not_ create a changeset
# like
#    changeset_c:   patch "a" [id1] -> [id1]


cat >testfile <<'_ATEOF'
version 1
_ATEOF

$at_traceoff
echo "t_no_change_deltas.at:13: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_no_change_deltas.at:13 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_no_change_deltas.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



cat >start_file <<'_ATEOF'
start file
_ATEOF

$at_traceoff
echo "t_no_change_deltas.at:15: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add start_file"
echo t_no_change_deltas.at:15 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add start_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_no_change_deltas.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_no_change_deltas.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_no_change_deltas.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_no_change_deltas.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


BASE=`cat MT/revision`
BASE_F_SHA=`monotone --norc identify testfile`
BASE_OTHER_SHA=`monotone --norc identify start_file`


cat >testfile <<'_ATEOF'
version 2
_ATEOF



$at_traceoff
echo "t_no_change_deltas.at:23: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_no_change_deltas.at:23 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_no_change_deltas.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




cat >testfile <<'_ATEOF'
version 1
_ATEOF



cat >end_file <<'_ATEOF'
end file
_ATEOF

$at_traceoff
echo "t_no_change_deltas.at:28: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add end_file"
echo t_no_change_deltas.at:28 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add end_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_no_change_deltas.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_no_change_deltas.at:29: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR drop start_file"
echo t_no_change_deltas.at:29 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR drop start_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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_no_change_deltas.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_no_change_deltas.at:30: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_no_change_deltas.at:30 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_no_change_deltas.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


NEW=`cat MT/revision`
NEW_F_SHA=`monotone --norc identify testfile`
NEW_OTHER_SHA=`monotone --norc identify end_file`

$at_traceoff
echo "t_no_change_deltas.at:35: test \$BASE_F_SHA = \$NEW_F_SHA"
echo t_no_change_deltas.at:35 >$at_check_line_file
( $at_traceon; test $BASE_F_SHA = $NEW_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_no_change_deltas.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_no_change_deltas.at:37: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR diff --revision \$BASE --revision \$NEW"
echo t_no_change_deltas.at:37 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR diff --revision $BASE --revision $NEW ) >$at_stdout 2>$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_no_change_deltas.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_no_change_deltas.at:38: grep -q \$NEW_OTHER_SHA stdout"
echo t_no_change_deltas.at:38 >$at_check_line_file
( $at_traceon; grep -q $NEW_OTHER_SHA 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;;
   0) ;;
   *) echo "t_no_change_deltas.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_no_change_deltas.at:39: grep -q \$BASE_F_SHA stdout"
echo t_no_change_deltas.at:39 >$at_check_line_file
( $at_traceon; grep -q $BASE_F_SHA 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_no_change_deltas.at:39: 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_no_change_deltas.at:40: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR diff --revision \$NEW --revision \$BASE"
echo t_no_change_deltas.at:40 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR diff --revision $NEW --revision $BASE ) >$at_stdout 2>$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_no_change_deltas.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_no_change_deltas.at:41: grep -q \$BASE_OTHER_SHA stdout"
echo t_no_change_deltas.at:41 >$at_check_line_file
( $at_traceon; grep -q $BASE_OTHER_SHA 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;;
   0) ;;
   *) echo "t_no_change_deltas.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_no_change_deltas.at:42: grep -q \$BASE_F_SHA stdout"
echo t_no_change_deltas.at:42 >$at_check_line_file
( $at_traceon; grep -q $BASE_F_SHA 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_no_change_deltas.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  76 ) # 76. t_drop_rename_patch.at:1: merge(<>, <drop a, rename b a, patch a>)
    at_setup_line='t_drop_rename_patch.at:1'
    at_desc='merge(<>, <drop a, rename b a, patch a>)'
    $at_quiet $ECHO_N " 76: merge(<>, <drop a, rename b a, patch a>)     $ECHO_C"
    at_xfail=no
    (
      echo "76. t_drop_rename_patch.at:1: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_rename_patch.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_drop_rename_patch.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_rename_patch.at:3: exit code was $at_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_rename_patch.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_drop_rename_patch.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_rename_patch.at:3: exit code was $at_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_rename_patch.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_drop_rename_patch.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_rename_patch.at:3: exit code was $at_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_rename_patch.at:3: rm test_keys"
echo t_drop_rename_patch.at:3 >$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_rename_patch.at:3: 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 >v1a <<'_ATEOF'
foo blah
_ATEOF

cat >v1b <<'_ATEOF'
bar blah
_ATEOF

cat >v2a <<'_ATEOF'
baz blah
_ATEOF


$at_traceoff
echo "t_drop_rename_patch.at:12: cp v1a testfile"
echo t_drop_rename_patch.at:12 >$at_check_line_file
( $at_traceon; cp v1a 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_drop_rename_patch.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_drop_rename_patch.at:13: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_drop_rename_patch.at:13 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_drop_rename_patch.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


cat >renamefile <<'_ATEOF'
this will be overwritten
_ATEOF

$at_traceoff
echo "t_drop_rename_patch.at:15: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add renamefile"
echo t_drop_rename_patch.at:15 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add renamefile ) >$at_stdout 2>$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_rename_patch.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_drop_rename_patch.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add renamefile"
echo t_drop_rename_patch.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add renamefile ) >$at_stdout 2>$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_rename_patch.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_rename_patch.at:17: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_drop_rename_patch.at:17 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_drop_rename_patch.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


BASE_R_SHA=`cat MT/revision`

$at_traceoff
echo "t_drop_rename_patch.at:20: rm -f testfile"
echo t_drop_rename_patch.at:20 >$at_check_line_file
( $at_traceon; rm -f 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_drop_rename_patch.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_drop_rename_patch.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR drop testfile"
echo t_drop_rename_patch.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR drop 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_drop_rename_patch.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_rename_patch.at:22: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename renamefile testfile"
echo t_drop_rename_patch.at:22 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename renamefile 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_drop_rename_patch.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_rename_patch.at:23: mv renamefile testfile"
echo t_drop_rename_patch.at:23 >$at_check_line_file
( $at_traceon; mv renamefile 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_drop_rename_patch.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_rename_patch.at:24: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_drop_rename_patch.at:24 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_drop_rename_patch.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_drop_rename_patch.at:26: cp v2a testfile"
echo t_drop_rename_patch.at:26 >$at_check_line_file
( $at_traceon; cp v2a 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_drop_rename_patch.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_drop_rename_patch.at:27: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_drop_rename_patch.at:27 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_drop_rename_patch.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_drop_rename_patch.at:29: rm -rf MT.old"
echo t_drop_rename_patch.at:29 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_rename_patch.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_drop_rename_patch.at:29: mv  MT MT.old"
echo t_drop_rename_patch.at:29 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_rename_patch.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_drop_rename_patch.at:29: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$BASE_R_SHA ."
echo t_drop_rename_patch.at:29 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $BASE_R_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_drop_rename_patch.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_drop_rename_patch.at:29: mv MT.old/options MT"
echo t_drop_rename_patch.at:29 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_rename_patch.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_drop_rename_patch.at:29: test \$PROBE_R_SHA = \$BASE_R_SHA"
echo t_drop_rename_patch.at:29 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $BASE_R_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_drop_rename_patch.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




cat >otherfile <<'_ATEOF'
this space for rent
_ATEOF

$at_traceoff
echo "t_drop_rename_patch.at:32: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add otherfile"
echo t_drop_rename_patch.at:32 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add otherfile ) >$at_stdout 2>$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_rename_patch.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_drop_rename_patch.at:33: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_drop_rename_patch.at:33 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_drop_rename_patch.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_drop_rename_patch.at:35: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR merge"
echo t_drop_rename_patch.at:35 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_drop_rename_patch.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_drop_rename_patch.at:36: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update"
echo t_drop_rename_patch.at:36 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_drop_rename_patch.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_drop_rename_patch.at:37: cmp testfile v2a"
echo t_drop_rename_patch.at:37 >$at_check_line_file
( $at_traceon; cmp testfile v2a ) >$at_stdout 2>$at_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_rename_patch.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`
    ;;

  77 ) # 77. t_cmdline_options.at:1: verification of command line options
    at_setup_line='t_cmdline_options.at:1'
    at_desc='verification of command line options'
    $at_quiet $ECHO_N " 77: verification of command line options         $ECHO_C"
    at_xfail=no
    (
      echo "77. t_cmdline_options.at:1: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_cmdline_options.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_cmdline_options.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_cmdline_options.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cmdline_options.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_cmdline_options.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_cmdline_options.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cmdline_options.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_cmdline_options.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_cmdline_options.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cmdline_options.at:3: rm test_keys"
echo t_cmdline_options.at:3 >$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_cmdline_options.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_cmdline_options.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR"
echo t_cmdline_options.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_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_cmdline_options.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_cmdline_options.at:6: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --norc"
echo t_cmdline_options.at:6 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --norc ) >$at_stdout 2>$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_cmdline_options.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_cmdline_options.at:7: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --rcfile=test_hooks.lua"
echo t_cmdline_options.at:7 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --rcfile=test_hooks.lua ) >$at_stdout 2>$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_cmdline_options.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_cmdline_options.at:9: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --unknown-option"
echo t_cmdline_options.at:9 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --unknown-option ) >$at_stdout 2>$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_cmdline_options.at:9: 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_cmdline_options.at:10: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --rcfile"
echo t_cmdline_options.at:10 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --rcfile ) >$at_stdout 2>$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_cmdline_options.at:10: 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`
    ;;

  78 ) # 78. t_log_nonexistent.at:1: log hides deleted/renamed files
    at_setup_line='t_log_nonexistent.at:1'
    at_desc='log hides deleted/renamed files'
    $at_quiet $ECHO_N " 78: log hides deleted/renamed files              $ECHO_C"
    at_xfail=no
    (
      echo "78. t_log_nonexistent.at:1: testing ..."
      $at_traceon


# This test checks that 'monotone log' of deleted and renamed files shows
# nothing in a further revision, as they are not applicable any more.



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_log_nonexistent.at:6: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_log_nonexistent.at:6 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_log_nonexistent.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_log_nonexistent.at:6: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_log_nonexistent.at:6 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_log_nonexistent.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_log_nonexistent.at:6: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_log_nonexistent.at:6 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_log_nonexistent.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_log_nonexistent.at:6: rm test_keys"
echo t_log_nonexistent.at:6 >$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_log_nonexistent.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 >foo <<'_ATEOF'
foo
_ATEOF

$at_traceoff
echo "t_log_nonexistent.at:9: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add foo"
echo t_log_nonexistent.at:9 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_log_nonexistent.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_log_nonexistent.at:11: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message \"Addition of foo.\""
echo t_log_nonexistent.at:11 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message "Addition of 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_log_nonexistent.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



cat >bar <<'_ATEOF'
bar
_ATEOF

$at_traceoff
echo "t_log_nonexistent.at:14: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add bar"
echo t_log_nonexistent.at:14 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add 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_log_nonexistent.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_log_nonexistent.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message \"Addition of bar.\""
echo t_log_nonexistent.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message "Addition of 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_log_nonexistent.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



cat >baz <<'_ATEOF'
baz
_ATEOF

$at_traceoff
echo "t_log_nonexistent.at:19: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add baz"
echo t_log_nonexistent.at:19 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add baz ) >$at_stdout 2>$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_log_nonexistent.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_log_nonexistent.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message \"Addition of baz.\""
echo t_log_nonexistent.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message "Addition of baz." ) >$at_stdout 2>$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_log_nonexistent.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_log_nonexistent.at:23: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR drop bar baz"
echo t_log_nonexistent.at:23 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR drop bar baz ) >$at_stdout 2>$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_log_nonexistent.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_log_nonexistent.at:24: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_log_nonexistent.at:24 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_log_nonexistent.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


rm -f bar baz

mv foo bar
$at_traceoff
echo "t_log_nonexistent.at:28: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename foo bar"
echo t_log_nonexistent.at:28 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_log_nonexistent.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_log_nonexistent.at:29: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_log_nonexistent.at:29 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_log_nonexistent.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_log_nonexistent.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR log foo"
echo t_log_nonexistent.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR log 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
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_log_nonexistent.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_log_nonexistent.at:33: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR log baz"
echo t_log_nonexistent.at:33 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR log baz ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_log_nonexistent.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_log_nonexistent.at:37: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR log bar | grep \"^Addition of [a-z][a-z][a-z].\$\""
echo t_log_nonexistent.at:37 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR log bar | grep "^Addition of [a-z][a-z][a-z].$" ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo >>$at_stdout; echo "Addition of foo.
" | $at_diff - $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_log_nonexistent.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_log_nonexistent.at:44: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR log | grep \"^Addition of [a-z][a-z][a-z].\$\""
echo t_log_nonexistent.at:44 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR log | grep "^Addition of [a-z][a-z][a-z].$" ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
echo >>$at_stdout; echo "Addition of baz.
Addition of bar.
Addition of foo.
" | $at_diff - $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_log_nonexistent.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  79 ) # 79. t_crlf.at:1: CRLF line normalization
    at_setup_line='t_crlf.at:1'
    at_desc='CRLF line normalization'
    $at_quiet $ECHO_N " 79: CRLF line normalization                      $ECHO_C"
    at_xfail=no
    (
      echo "79. t_crlf.at:1: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_crlf.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_crlf.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_crlf.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_crlf.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_crlf.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_crlf.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_crlf.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_crlf.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_crlf.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_crlf.at:3: rm test_keys"
echo t_crlf.at:3 >$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_crlf.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_crlf.at:5: printf \"a\\r\\nb\\r\\nc\\r\\nd\\r\\n\""
echo t_crlf.at:5 >$at_check_line_file
( $at_traceon; printf "a\r\nb\r\nc\r\nd\r\n" ) >$at_stdout 2>$at_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_crlf.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_crlf.at:6: cp stdout test.crlf"
echo t_crlf.at:6 >$at_check_line_file
( $at_traceon; cp stdout test.crlf ) >$at_stdout 2>$at_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_crlf.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_crlf.at:7: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add test.crlf"
echo t_crlf.at:7 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add test.crlf ) >$at_stdout 2>$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_crlf.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_crlf.at:8: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_crlf.at:8 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_crlf.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_crlf.at:10: printf \"a\\r\\nb\\r\\nnew line!\\r\\nc\\r\\nd\\r\\n\""
echo t_crlf.at:10 >$at_check_line_file
( $at_traceon; printf "a\r\nb\r\nnew line!\r\nc\r\nd\r\n" ) >$at_stdout 2>$at_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_crlf.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_crlf.at:11: cp stdout test.crlf"
echo t_crlf.at:11 >$at_check_line_file
( $at_traceon; cp stdout test.crlf ) >$at_stdout 2>$at_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_crlf.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_crlf.at:13: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR diff"
echo t_crlf.at:13 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR diff ) >$at_stdout 2>$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_crlf.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

LINES=`wc -l <stdout`
$at_traceoff
echo "t_crlf.at:15: test \$LINES -eq 13"
echo t_crlf.at:15 >$at_check_line_file
( $at_traceon; test $LINES -eq 13 ) >$at_stdout 2>$at_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_crlf.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`
    ;;

  80 ) # 80. t_netsync_diffbranch.at:1: (normal) pull a netsync branch which has a parent from another branch
    at_setup_line='t_netsync_diffbranch.at:1'
    at_desc='(normal) pull a netsync branch which has a parent from another branch'
    $at_quiet $ECHO_N " 80: (normal) pull a netsync branch which has a parent from another branch$ECHO_C"
    at_xfail=yes
    (
      echo "80. t_netsync_diffbranch.at:1: testing ..."
      $at_traceon



# This test is a bug report.

# The problem here is this: we have a -> b, where a is in branch A and
# b is in branch B.  If we pull branch B, we will get b, but not a.
# Monotone detects this case (in
# packet_db_writer::consume_revision_data; a is noted to be a
# prerequisite of b, a never arrives, so b eventually gets dropped on
# the floor), but doesn't handle it terribly gracefully.
# A short term solution would be, when this is going to happen,
# request the prerequisite revision explicitly.  (This is suboptimal
# because this is a really inefficient way to fetch revisions, but it
# is probably relatively easy to implement.)
#
# A better way to solve this would be to change the merkle trie
# building logic to include all ancestors of included revisions.
# Probably it is not worth touching this logic immediately, because
# the merkle trie logic needs to be rewritten anyway, as so:
#   - don't store merkle tries in the database at all
#   - when someone requests a glob, find all the certs which match the
#     glob, including all certs on ancestors of revisions that match
#     the glob, and stick them in a big bucket on the fly
#   - build a merkle trie on that big bucket on the fly, hashing just
#     once from the leaves upwards (instead of rehashing recursively
#     as we do now)
#
# These two ways may well be complementary; the "short term solution"
# is always correct, and protects us a little against buggy servers,
# and also protects us against cases where there is a revision
# mentioned in the ancestry graph that has no certs on it (quite
# abnormal, but not actually impossible, and it's nice to get edge
# cases right).



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_diffbranch.at:36: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_netsync_diffbranch.at:36 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_diffbranch.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_diffbranch.at:36: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_netsync_diffbranch.at:36 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_diffbranch.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_diffbranch.at:36: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_netsync_diffbranch.at:36 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_diffbranch.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_diffbranch.at:36: rm test_keys"
echo t_netsync_diffbranch.at:36 >$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_diffbranch.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_diffbranch.at:37: cp test.db test2.db"
echo t_netsync_diffbranch.at:37 >$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_diffbranch.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_diffbranch.at:37: cp test.db test3.db"
echo t_netsync_diffbranch.at:37 >$at_check_line_file
( $at_traceon; cp test.db test3.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_diffbranch.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

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'
blah stuff
_ATEOF

$at_traceoff
echo "t_netsync_diffbranch.at:40: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_netsync_diffbranch.at:40 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_diffbranch.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_diffbranch.at:41: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_netsync_diffbranch.at:41 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_diffbranch.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


VER0=`cat MT/revision`


cat >testfile2 <<'_ATEOF'
some more data
_ATEOF

$at_traceoff
echo "t_netsync_diffbranch.at:45: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile2"
echo t_netsync_diffbranch.at:45 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add 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_netsync_diffbranch.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_diffbranch.at:46: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=otherbranch commit --message blah-blah"
echo t_netsync_diffbranch.at:46 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=otherbranch commit --message 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_diffbranch.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


VER1=`cat MT/revision`




if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi

$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --rcfile=netsync.lua serve localhost:5555 otherbranch &
sleep 4



$at_traceoff
echo "t_netsync_diffbranch.at:49: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost:5555 otherbranch"
echo t_netsync_diffbranch.at:49 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost:5555 otherbranch ) >$at_stdout 2>$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_diffbranch.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





if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill " $a);}'
  # MinGW has no killall.  The weird a=1 thing is to avoid autotest treating  as its own parameter
else
  killall monotone 2>/dev/null
fi

sleep 1

if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi





$at_traceoff
echo "t_netsync_diffbranch.at:51: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls certs \$VER1"
echo t_netsync_diffbranch.at:51 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR ls certs $VER1 ) >$at_stdout 2>$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_netsync_diffbranch.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_netsync_diffbranch.at:51: mv stdout expout"
echo t_netsync_diffbranch.at:51 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_diffbranch.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_netsync_diffbranch.at:51: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db ls certs \$VER1"
echo t_netsync_diffbranch.at:51 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --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
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync_diffbranch.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`
    ;;

  81 ) # 81. t_netsync_nocerts.at:1: (normal) netsync revision with no certs
    at_setup_line='t_netsync_nocerts.at:1'
    at_desc='(normal) netsync revision with no certs'
    $at_quiet $ECHO_N " 81: (normal) netsync revision with no certs      $ECHO_C"
    at_xfail=yes
    (
      echo "81. t_netsync_nocerts.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_nocerts.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_netsync_nocerts.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_nocerts.at:2: exit code was $at_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_nocerts.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_netsync_nocerts.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_nocerts.at:2: exit code was $at_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_nocerts.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_netsync_nocerts.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_nocerts.at:2: exit code was $at_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_nocerts.at:2: rm test_keys"
echo t_netsync_nocerts.at:2 >$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_nocerts.at:2: exit code was $at_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_nocerts.at:3: cp test.db test2.db"
echo t_netsync_nocerts.at:3 >$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_nocerts.at:3: exit code was $at_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_nocerts.at:3: cp test.db test3.db"
echo t_netsync_nocerts.at:3 >$at_check_line_file
( $at_traceon; cp test.db test3.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_nocerts.at:3: 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




# This test is a bug report.



cat >testfile <<'_ATEOF'
blah stuff
_ATEOF

$at_traceoff
echo "t_netsync_nocerts.at:9: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_netsync_nocerts.at:9 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_nocerts.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_netsync_nocerts.at:10: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_netsync_nocerts.at:10 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_nocerts.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


VER0=`cat MT/revision`

$at_traceoff
echo "t_netsync_nocerts.at:13: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db execute 'delete from revision_certs'"
echo t_netsync_nocerts.at:13 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR db execute 'delete from revision_certs' ) >$at_stdout 2>$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_nocerts.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



cat >testfile <<'_ATEOF'
other stuff
_ATEOF



$at_traceoff
echo "t_netsync_nocerts.at:17: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_netsync_nocerts.at:17 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_nocerts.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


VER1=`cat MT/revision`




if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi

$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --rcfile=netsync.lua serve localhost:5555 testbranch &
sleep 4



$at_traceoff
echo "t_netsync_nocerts.at:20: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost:5555 testbranch"
echo t_netsync_nocerts.at:20 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost: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_nocerts.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





if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill " $a);}'
  # MinGW has no killall.  The weird a=1 thing is to avoid autotest treating  as its own parameter
else
  killall monotone 2>/dev/null
fi

sleep 1

if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi





$at_traceoff
echo "t_netsync_nocerts.at:22: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR cat revision \$VER0"
echo t_netsync_nocerts.at:22 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR cat revision $VER0 ) >$at_stdout 2>$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_netsync_nocerts.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_netsync_nocerts.at:22: mv stdout expout"
echo t_netsync_nocerts.at:22 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_nocerts.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_netsync_nocerts.at:22: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db cat revision \$VER0"
echo t_netsync_nocerts.at:22 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db cat revision $VER0 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync_nocerts.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_netsync_nocerts.at:23: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls certs \$VER0"
echo t_netsync_nocerts.at:23 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR ls certs $VER0 ) >$at_stdout 2>$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_netsync_nocerts.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_netsync_nocerts.at:23: mv stdout expout"
echo t_netsync_nocerts.at:23 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_nocerts.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_netsync_nocerts.at:23: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db ls certs \$VER0"
echo t_netsync_nocerts.at:23 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --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
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync_nocerts.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_netsync_nocerts.at:24: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR cat revision \$VER1"
echo t_netsync_nocerts.at:24 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR cat revision $VER1 ) >$at_stdout 2>$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_netsync_nocerts.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_netsync_nocerts.at:24: mv stdout expout"
echo t_netsync_nocerts.at:24 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_nocerts.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_netsync_nocerts.at:24: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db cat revision \$VER1"
echo t_netsync_nocerts.at:24 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db cat revision $VER1 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync_nocerts.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_netsync_nocerts.at:25: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls certs \$VER1"
echo t_netsync_nocerts.at:25 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR ls certs $VER1 ) >$at_stdout 2>$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_netsync_nocerts.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_netsync_nocerts.at:25: mv stdout expout"
echo t_netsync_nocerts.at:25 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_nocerts.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_netsync_nocerts.at:25: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db ls certs \$VER1"
echo t_netsync_nocerts.at:25 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --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
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync_nocerts.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  82 ) # 82. t_check_same_db_contents.at:1: check_same_db_contents macro
    at_setup_line='t_check_same_db_contents.at:1'
    at_desc='check_same_db_contents macro'
    $at_quiet $ECHO_N " 82: check_same_db_contents macro                 $ECHO_C"
    at_xfail=no
    (
      echo "82. t_check_same_db_contents.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_check_same_db_contents.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_check_same_db_contents.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_check_same_db_contents.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_check_same_db_contents.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_check_same_db_contents.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_check_same_db_contents.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_check_same_db_contents.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_check_same_db_contents.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_check_same_db_contents.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_check_same_db_contents.at:2: rm test_keys"
echo t_check_same_db_contents.at:2 >$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_check_same_db_contents.at:2: 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 just tests that the testsuite macro CHECK_SAME_DB_CONTENTS works,
# because other tests depend on that.


cat >testfile <<'_ATEOF'
blah
_ATEOF

$at_traceoff
echo "t_check_same_db_contents.at:8: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_check_same_db_contents.at:8 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_check_same_db_contents.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_check_same_db_contents.at:9: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch1 commit --message blah-blah"
echo t_check_same_db_contents.at:9 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch1 commit --message 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_check_same_db_contents.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




cat >testfile2 <<'_ATEOF'
foo
_ATEOF

$at_traceoff
echo "t_check_same_db_contents.at:12: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile2"
echo t_check_same_db_contents.at:12 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add 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_check_same_db_contents.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_check_same_db_contents.at:13: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch2 commit --message blah-blah"
echo t_check_same_db_contents.at:13 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch2 commit --message 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_check_same_db_contents.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_check_same_db_contents.at:15: cp test.db test2.db"
echo t_check_same_db_contents.at:15 >$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_check_same_db_contents.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_check_same_db_contents.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test.db ls keys"
echo t_check_same_db_contents.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db ls 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_check_same_db_contents.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_check_same_db_contents.at:16: mv stdout expout"
echo t_check_same_db_contents.at:16 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_check_same_db_contents.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_check_same_db_contents.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db ls keys"
echo t_check_same_db_contents.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db ls 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
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_check_same_db_contents.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_check_same_db_contents.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test.db agraph"
echo t_check_same_db_contents.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db agraph ) >$at_stdout 2>$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_check_same_db_contents.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_check_same_db_contents.at:16: mv stdout expout"
echo t_check_same_db_contents.at:16 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_check_same_db_contents.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_check_same_db_contents.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db agraph"
echo t_check_same_db_contents.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db agraph ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_check_same_db_contents.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


REVS=`$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db complete revision ""`
for R in $REVS; do

$at_traceoff
echo "t_check_same_db_contents.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test.db ls certs \$R"
echo t_check_same_db_contents.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db ls certs $R ) >$at_stdout 2>$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_check_same_db_contents.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_check_same_db_contents.at:16: mv stdout expout"
echo t_check_same_db_contents.at:16 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_check_same_db_contents.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_check_same_db_contents.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db ls certs \$R"
echo t_check_same_db_contents.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db ls certs $R ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_check_same_db_contents.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_check_same_db_contents.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test.db cat revision \$R"
echo t_check_same_db_contents.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db cat revision $R ) >$at_stdout 2>$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_check_same_db_contents.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_check_same_db_contents.at:16: mv stdout expout"
echo t_check_same_db_contents.at:16 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_check_same_db_contents.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_check_same_db_contents.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db cat revision \$R"
echo t_check_same_db_contents.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db cat revision $R ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_check_same_db_contents.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


done


$at_traceoff
echo "t_check_same_db_contents.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test.db complete manifest \"\""
echo t_check_same_db_contents.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db complete 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_check_same_db_contents.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_check_same_db_contents.at:16: mv stdout expout"
echo t_check_same_db_contents.at:16 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_check_same_db_contents.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_check_same_db_contents.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db complete manifest \"\""
echo t_check_same_db_contents.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db complete 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
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_check_same_db_contents.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


MANIFESTS=`$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db complete manifest ""`
for M in $MANIFESTS; do

$at_traceoff
echo "t_check_same_db_contents.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test.db cat manifest \$M"
echo t_check_same_db_contents.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db cat manifest $M ) >$at_stdout 2>$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_check_same_db_contents.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_check_same_db_contents.at:16: mv stdout expout"
echo t_check_same_db_contents.at:16 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_check_same_db_contents.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_check_same_db_contents.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db cat manifest \$M"
echo t_check_same_db_contents.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db cat manifest $M ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_check_same_db_contents.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


done


$at_traceoff
echo "t_check_same_db_contents.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test.db complete file \"\""
echo t_check_same_db_contents.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db complete 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_check_same_db_contents.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_check_same_db_contents.at:16: mv stdout expout"
echo t_check_same_db_contents.at:16 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_check_same_db_contents.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_check_same_db_contents.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db complete file \"\""
echo t_check_same_db_contents.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db complete 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
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_check_same_db_contents.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


FILES=`$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db complete file ""`
for F in $FILES; do

$at_traceoff
echo "t_check_same_db_contents.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test.db cat file \$F"
echo t_check_same_db_contents.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db cat file $F ) >$at_stdout 2>$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_check_same_db_contents.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_check_same_db_contents.at:16: mv stdout expout"
echo t_check_same_db_contents.at:16 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_check_same_db_contents.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_check_same_db_contents.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db cat file \$F"
echo t_check_same_db_contents.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db cat file $F ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_check_same_db_contents.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


done


# Really really should have a test that after modifying one of the dbs, the
# macro detects the difference, but I can't figure out how to write that in
# autotest.

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

  83 ) # 83. t_merge_ancestor.at:1: merge rev with ancestor
    at_setup_line='t_merge_ancestor.at:1'
    at_desc='merge rev with ancestor'
    $at_quiet $ECHO_N " 83: merge rev with ancestor                      $ECHO_C"
    at_xfail=no
    (
      echo "83. t_merge_ancestor.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_ancestor.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_merge_ancestor.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_ancestor.at:2: exit code was $at_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_ancestor.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_merge_ancestor.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_ancestor.at:2: exit code was $at_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_ancestor.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_merge_ancestor.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_ancestor.at:2: exit code was $at_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_ancestor.at:2: rm test_keys"
echo t_merge_ancestor.at:2 >$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_ancestor.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



# The idea here is that if we have, say, A -> B -> C, then merging A
# and C should not be possible, because it creates a weird graph with
# no clear meaning.


cat >testfile <<'_ATEOF'
0
_ATEOF

$at_traceoff
echo "t_merge_ancestor.at:9: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_merge_ancestor.at:9 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_ancestor.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_merge_ancestor.at:10: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_merge_ancestor.at:10 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_ancestor.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


REV0=`cat MT/revision`


cat >testfile <<'_ATEOF'
1
_ATEOF



$at_traceoff
echo "t_merge_ancestor.at:15: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_merge_ancestor.at:15 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_ancestor.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


REV1=`cat MT/revision`


cat >testfile <<'_ATEOF'
2
_ATEOF



$at_traceoff
echo "t_merge_ancestor.at:20: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_merge_ancestor.at:20 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_ancestor.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


REV2=`cat MT/revision`

$at_traceoff
echo "t_merge_ancestor.at:23: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR explicit_merge \$REV0 \$REV1 testbranch"
echo t_merge_ancestor.at:23 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR explicit_merge $REV0 $REV1 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;;
   1) ;;
   *) echo "t_merge_ancestor.at:23: 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_merge_ancestor.at:24: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR explicit_merge \$REV1 \$REV0 testbranch"
echo t_merge_ancestor.at:24 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR explicit_merge $REV1 $REV0 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;;
   1) ;;
   *) echo "t_merge_ancestor.at:24: 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`
    ;;

  84 ) # 84. t_propagate_desc.at:1: propagate a descendent
    at_setup_line='t_propagate_desc.at:1'
    at_desc='propagate a descendent'
    $at_quiet $ECHO_N " 84: propagate a descendent                       $ECHO_C"
    at_xfail=no
    (
      echo "84. t_propagate_desc.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_propagate_desc.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_propagate_desc.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_propagate_desc.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_propagate_desc.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_propagate_desc.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_propagate_desc.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_propagate_desc.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_propagate_desc.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_propagate_desc.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_propagate_desc.at:2: rm test_keys"
echo t_propagate_desc.at:2 >$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_propagate_desc.at:2: 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 tests the case where we have something like A1 -> A2 -> B1 ->
# B2, where A and B are different branches, and the user propagates B
# to A.  The result should be B2 being certed into branch A, with no
# merge performed.


cat >testfile <<'_ATEOF'
foo
_ATEOF

$at_traceoff
echo "t_propagate_desc.at:10: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_propagate_desc.at:10 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_propagate_desc.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_propagate_desc.at:11: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=a commit --message blah-blah"
echo t_propagate_desc.at:11 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=a commit --message 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_propagate_desc.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




cat >testfile <<'_ATEOF'
bar
_ATEOF



$at_traceoff
echo "t_propagate_desc.at:15: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=a commit --message blah-blah"
echo t_propagate_desc.at:15 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=a commit --message 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_propagate_desc.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


A_HEAD_REV=`cat MT/revision`


cat >testfile <<'_ATEOF'
baz
_ATEOF



$at_traceoff
echo "t_propagate_desc.at:20: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=b commit --message blah-blah"
echo t_propagate_desc.at:20 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=b commit --message 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_propagate_desc.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




cat >testfile <<'_ATEOF'
quux
_ATEOF



$at_traceoff
echo "t_propagate_desc.at:24: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=b commit --message blah-blah"
echo t_propagate_desc.at:24 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=b commit --message 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_propagate_desc.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


B_HEAD_REV=`cat MT/revision`

$at_traceoff
echo "t_propagate_desc.at:27: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR propagate b a"
echo t_propagate_desc.at:27 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR propagate b 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_propagate_desc.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_propagate_desc.at:28: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR heads --branch=b"
echo t_propagate_desc.at:28 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR heads --branch=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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_propagate_desc.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_propagate_desc.at:29: grep -q \$B_HEAD_REV stdout"
echo t_propagate_desc.at:29 >$at_check_line_file
( $at_traceon; grep -q $B_HEAD_REV 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;;
   0) ;;
   *) echo "t_propagate_desc.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_propagate_desc.at:30: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR heads --branch=a"
echo t_propagate_desc.at:30 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR heads --branch=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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_propagate_desc.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_propagate_desc.at:31: grep -q \$B_HEAD_REV stdout"
echo t_propagate_desc.at:31 >$at_check_line_file
( $at_traceon; grep -q $B_HEAD_REV 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;;
   0) ;;
   *) echo "t_propagate_desc.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  85 ) # 85. t_propagate_anc.at:1: propagate an ancestor
    at_setup_line='t_propagate_anc.at:1'
    at_desc='propagate an ancestor'
    $at_quiet $ECHO_N " 85: propagate an ancestor                        $ECHO_C"
    at_xfail=no
    (
      echo "85. t_propagate_anc.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_propagate_anc.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_propagate_anc.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_propagate_anc.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_propagate_anc.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_propagate_anc.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_propagate_anc.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_propagate_anc.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_propagate_anc.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_propagate_anc.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_propagate_anc.at:2: rm test_keys"
echo t_propagate_anc.at:2 >$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_propagate_anc.at:2: 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 tests the case where we have something like A1 -> A2 -> B1 ->
# B2, where A and B are different branches, and the user propagates A
# to B.  This should be a no-op; no merge should be performed.

# The same applies when the heads of A and B are actually equal.


cat >testfile <<'_ATEOF'
foo
_ATEOF

$at_traceoff
echo "t_propagate_anc.at:11: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_propagate_anc.at:11 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_propagate_anc.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_propagate_anc.at:12: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=a commit --message blah-blah"
echo t_propagate_anc.at:12 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=a commit --message 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_propagate_anc.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




cat >testfile <<'_ATEOF'
bar
_ATEOF



$at_traceoff
echo "t_propagate_anc.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=a commit --message blah-blah"
echo t_propagate_anc.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=a commit --message 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_propagate_anc.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


A_HEAD_REV=`cat MT/revision`


cat >testfile <<'_ATEOF'
baz
_ATEOF



$at_traceoff
echo "t_propagate_anc.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=b commit --message blah-blah"
echo t_propagate_anc.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=b commit --message 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_propagate_anc.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 >testfile <<'_ATEOF'
quux
_ATEOF



$at_traceoff
echo "t_propagate_anc.at:25: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=b commit --message blah-blah"
echo t_propagate_anc.at:25 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=b commit --message 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_propagate_anc.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


B_HEAD_REV=`cat MT/revision`

$at_traceoff
echo "t_propagate_anc.at:28: cp test.db test2.db"
echo t_propagate_anc.at:28 >$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_propagate_anc.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_propagate_anc.at:29: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR propagate a b"
echo t_propagate_anc.at:29 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR propagate 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_propagate_anc.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_propagate_anc.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test.db ls keys"
echo t_propagate_anc.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db ls 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_propagate_anc.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_propagate_anc.at:31: mv stdout expout"
echo t_propagate_anc.at:31 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_propagate_anc.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_propagate_anc.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db ls keys"
echo t_propagate_anc.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db ls 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
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_propagate_anc.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_propagate_anc.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test.db agraph"
echo t_propagate_anc.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db agraph ) >$at_stdout 2>$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_propagate_anc.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_propagate_anc.at:31: mv stdout expout"
echo t_propagate_anc.at:31 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_propagate_anc.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_propagate_anc.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db agraph"
echo t_propagate_anc.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db agraph ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_propagate_anc.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


REVS=`$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db complete revision ""`
for R in $REVS; do

$at_traceoff
echo "t_propagate_anc.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test.db ls certs \$R"
echo t_propagate_anc.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db ls certs $R ) >$at_stdout 2>$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_propagate_anc.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_propagate_anc.at:31: mv stdout expout"
echo t_propagate_anc.at:31 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_propagate_anc.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_propagate_anc.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db ls certs \$R"
echo t_propagate_anc.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db ls certs $R ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_propagate_anc.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_propagate_anc.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test.db cat revision \$R"
echo t_propagate_anc.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db cat revision $R ) >$at_stdout 2>$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_propagate_anc.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_propagate_anc.at:31: mv stdout expout"
echo t_propagate_anc.at:31 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_propagate_anc.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_propagate_anc.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db cat revision \$R"
echo t_propagate_anc.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db cat revision $R ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_propagate_anc.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


done


$at_traceoff
echo "t_propagate_anc.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test.db complete manifest \"\""
echo t_propagate_anc.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db complete 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_propagate_anc.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_propagate_anc.at:31: mv stdout expout"
echo t_propagate_anc.at:31 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_propagate_anc.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_propagate_anc.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db complete manifest \"\""
echo t_propagate_anc.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db complete 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
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_propagate_anc.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


MANIFESTS=`$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db complete manifest ""`
for M in $MANIFESTS; do

$at_traceoff
echo "t_propagate_anc.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test.db cat manifest \$M"
echo t_propagate_anc.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db cat manifest $M ) >$at_stdout 2>$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_propagate_anc.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_propagate_anc.at:31: mv stdout expout"
echo t_propagate_anc.at:31 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_propagate_anc.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_propagate_anc.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db cat manifest \$M"
echo t_propagate_anc.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db cat manifest $M ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_propagate_anc.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


done


$at_traceoff
echo "t_propagate_anc.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test.db complete file \"\""
echo t_propagate_anc.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db complete 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_propagate_anc.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_propagate_anc.at:31: mv stdout expout"
echo t_propagate_anc.at:31 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_propagate_anc.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_propagate_anc.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db complete file \"\""
echo t_propagate_anc.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db complete 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
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_propagate_anc.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


FILES=`$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db complete file ""`
for F in $FILES; do

$at_traceoff
echo "t_propagate_anc.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test.db cat file \$F"
echo t_propagate_anc.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db cat file $F ) >$at_stdout 2>$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_propagate_anc.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_propagate_anc.at:31: mv stdout expout"
echo t_propagate_anc.at:31 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_propagate_anc.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_propagate_anc.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db cat file \$F"
echo t_propagate_anc.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db cat file $F ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_propagate_anc.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


done


$at_traceoff
echo "t_propagate_anc.at:33: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR cert \$B_HEAD_REV branch c"
echo t_propagate_anc.at:33 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR cert $B_HEAD_REV branch c ) >$at_stdout 2>$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_propagate_anc.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_propagate_anc.at:34: cp test.db test3.db"
echo t_propagate_anc.at:34 >$at_check_line_file
( $at_traceon; cp test.db test3.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_propagate_anc.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_propagate_anc.at:35: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR propagate b c"
echo t_propagate_anc.at:35 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR propagate b c ) >$at_stdout 2>$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_propagate_anc.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_propagate_anc.at:37: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test.db ls keys"
echo t_propagate_anc.at:37 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db ls 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_propagate_anc.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_propagate_anc.at:37: mv stdout expout"
echo t_propagate_anc.at:37 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_propagate_anc.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_propagate_anc.at:37: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test3.db ls keys"
echo t_propagate_anc.at:37 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test3.db ls 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
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_propagate_anc.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_propagate_anc.at:37: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test.db agraph"
echo t_propagate_anc.at:37 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db agraph ) >$at_stdout 2>$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_propagate_anc.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_propagate_anc.at:37: mv stdout expout"
echo t_propagate_anc.at:37 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_propagate_anc.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_propagate_anc.at:37: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test3.db agraph"
echo t_propagate_anc.at:37 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test3.db agraph ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_propagate_anc.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


REVS=`$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db complete revision ""`
for R in $REVS; do

$at_traceoff
echo "t_propagate_anc.at:37: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test.db ls certs \$R"
echo t_propagate_anc.at:37 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db ls certs $R ) >$at_stdout 2>$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_propagate_anc.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_propagate_anc.at:37: mv stdout expout"
echo t_propagate_anc.at:37 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_propagate_anc.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_propagate_anc.at:37: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test3.db ls certs \$R"
echo t_propagate_anc.at:37 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test3.db ls certs $R ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_propagate_anc.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_propagate_anc.at:37: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test.db cat revision \$R"
echo t_propagate_anc.at:37 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db cat revision $R ) >$at_stdout 2>$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_propagate_anc.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_propagate_anc.at:37: mv stdout expout"
echo t_propagate_anc.at:37 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_propagate_anc.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_propagate_anc.at:37: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test3.db cat revision \$R"
echo t_propagate_anc.at:37 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test3.db cat revision $R ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_propagate_anc.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


done


$at_traceoff
echo "t_propagate_anc.at:37: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test.db complete manifest \"\""
echo t_propagate_anc.at:37 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db complete 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_propagate_anc.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_propagate_anc.at:37: mv stdout expout"
echo t_propagate_anc.at:37 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_propagate_anc.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_propagate_anc.at:37: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test3.db complete manifest \"\""
echo t_propagate_anc.at:37 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test3.db complete 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
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_propagate_anc.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


MANIFESTS=`$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db complete manifest ""`
for M in $MANIFESTS; do

$at_traceoff
echo "t_propagate_anc.at:37: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test.db cat manifest \$M"
echo t_propagate_anc.at:37 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db cat manifest $M ) >$at_stdout 2>$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_propagate_anc.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_propagate_anc.at:37: mv stdout expout"
echo t_propagate_anc.at:37 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_propagate_anc.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_propagate_anc.at:37: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test3.db cat manifest \$M"
echo t_propagate_anc.at:37 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test3.db cat manifest $M ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_propagate_anc.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


done


$at_traceoff
echo "t_propagate_anc.at:37: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test.db complete file \"\""
echo t_propagate_anc.at:37 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db complete 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_propagate_anc.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_propagate_anc.at:37: mv stdout expout"
echo t_propagate_anc.at:37 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_propagate_anc.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_propagate_anc.at:37: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test3.db complete file \"\""
echo t_propagate_anc.at:37 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test3.db complete 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
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_propagate_anc.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


FILES=`$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db complete file ""`
for F in $FILES; do

$at_traceoff
echo "t_propagate_anc.at:37: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test.db cat file \$F"
echo t_propagate_anc.at:37 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test.db cat file $F ) >$at_stdout 2>$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_propagate_anc.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_propagate_anc.at:37: mv stdout expout"
echo t_propagate_anc.at:37 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_propagate_anc.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_propagate_anc.at:37: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test3.db cat file \$F"
echo t_propagate_anc.at:37 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test3.db cat file $F ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_propagate_anc.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


done


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

  86 ) # 86. t_status_missing.at:1: (normal) status with missing files
    at_setup_line='t_status_missing.at:1'
    at_desc='(normal) status with missing files'
    $at_quiet $ECHO_N " 86: (normal) status with missing files           $ECHO_C"
    at_xfail=yes
    (
      echo "86. t_status_missing.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_status_missing.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_status_missing.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_status_missing.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_status_missing.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_status_missing.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_status_missing.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_status_missing.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_status_missing.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_status_missing.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_status_missing.at:2: rm test_keys"
echo t_status_missing.at:2 >$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_status_missing.at:2: 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 a bug report.



cat >testfile <<'_ATEOF'
foo
_ATEOF

$at_traceoff
echo "t_status_missing.at:8: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_status_missing.at:8 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_status_missing.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_status_missing.at:9: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_status_missing.at:9 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_status_missing.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_status_missing.at:11: rm -f testfile"
echo t_status_missing.at:11 >$at_check_line_file
( $at_traceon; rm -f 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_status_missing.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


# status should successfully report on the status of things regardless
# of the status of those things -- i.e. it should report missing files
# as such rather than failing on them.

$at_traceoff
echo "t_status_missing.at:17: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_status_missing.at:17 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR status ) >$at_stdout 2>$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_status_missing.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  87 ) # 87. t_persistent_server_keys_2.at:1: (imp) persistent netsync server - keys 2
    at_setup_line='t_persistent_server_keys_2.at:1'
    at_desc='(imp) persistent netsync server - keys 2'
    $at_quiet $ECHO_N " 87: (imp) persistent netsync server - keys 2     $ECHO_C"
    at_xfail=yes
    (
      echo "87. t_persistent_server_keys_2.at:1: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_persistent_server_keys_2.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_persistent_server_keys_2.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_persistent_server_keys_2.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_persistent_server_keys_2.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_persistent_server_keys_2.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_persistent_server_keys_2.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_persistent_server_keys_2.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_persistent_server_keys_2.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_persistent_server_keys_2.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_persistent_server_keys_2.at:3: rm test_keys"
echo t_persistent_server_keys_2.at:3 >$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_persistent_server_keys_2.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon




$at_traceoff
echo "t_persistent_server_keys_2.at:4: cp test.db test2.db"
echo t_persistent_server_keys_2.at:4 >$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_persistent_server_keys_2.at:4: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_persistent_server_keys_2.at:4: cp test.db test3.db"
echo t_persistent_server_keys_2.at:4 >$at_check_line_file
( $at_traceon; cp test.db test3.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_persistent_server_keys_2.at:4: 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




# This test is a bug report

# Probably this one should not be fixed directly, but by implementing
# the changes described in t_netsync_diffbranch.at, which would solve
# it automatically.  OTOH, a fix for this wouldn't be a _bad_ thing.

# This tests a somewhat subtle version of how public keys are handled
# with netsync.  The rule is, we serve a key if we're serving any cert
# signed by that key.  The question is, if when we boot up the server
# we already have the key in question, but it isn't signing any such
# certs, but _then we get pushed such a cert_, do we push out the key
# on further netsyncs?

# We create a key in database 2, read the public key into database 1,
# then start database 1 serving.  Then we push a cert into database 1
# signed by the key, and we pull into database 3.

$at_traceoff
echo "t_persistent_server_keys_2.at:23: (echo foo@bar; echo foo@bar) | \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db genkey foo@bar"
echo t_persistent_server_keys_2.at:23 >$at_check_line_file
( $at_traceon; (echo foo@bar; echo foo@bar) | $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db genkey 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_persistent_server_keys_2.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_persistent_server_keys_2.at:24: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db pubkey foo@bar | \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read"
echo t_persistent_server_keys_2.at:24 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db pubkey foo@bar | $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR read ) >$at_stdout 2>$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_persistent_server_keys_2.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



cat >foo <<'_ATEOF'
data data blah
_ATEOF

$at_traceoff
echo "t_persistent_server_keys_2.at:27: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add foo"
echo t_persistent_server_keys_2.at:27 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_persistent_server_keys_2.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_persistent_server_keys_2.at:28: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db commit --key=foo@bar --branch=testbranch blah"
echo t_persistent_server_keys_2.at:28 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db commit --key=foo@bar --branch=testbranch 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_persistent_server_keys_2.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




if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi

$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --rcfile=netsync.lua serve localhost:5555 testbranch &
sleep 4


$at_traceoff
echo "t_persistent_server_keys_2.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db --rcfile=netsync.lua push localhost:5555 testbranch"
echo t_persistent_server_keys_2.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db --rcfile=netsync.lua push localhost: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_persistent_server_keys_2.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_persistent_server_keys_2.at:32: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test3.db --rcfile=netsync.lua pull localhost:5555 testbranch"
echo t_persistent_server_keys_2.at:32 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test3.db --rcfile=netsync.lua pull localhost: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_persistent_server_keys_2.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




if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill " $a);}'
  # MinGW has no killall.  The weird a=1 thing is to avoid autotest treating  as its own parameter
else
  killall monotone 2>/dev/null
fi

sleep 1

if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi



$at_traceoff
echo "t_persistent_server_keys_2.at:35: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test3.db ls keys"
echo t_persistent_server_keys_2.at:35 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test3.db ls 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_persistent_server_keys_2.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_persistent_server_keys_2.at:36: grep -q foo@bar stdout"
echo t_persistent_server_keys_2.at:36 >$at_check_line_file
( $at_traceon; grep -q foo@bar 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;;
   0) ;;
   *) echo "t_persistent_server_keys_2.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  88 ) # 88. t_update_1.at:1: update 1
    at_setup_line='t_update_1.at:1'
    at_desc='update 1'
    $at_quiet $ECHO_N " 88: update 1                                     $ECHO_C"
    at_xfail=no
    (
      echo "88. t_update_1.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_1.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_update_1.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_1.at:2: exit code was $at_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_1.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_update_1.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_1.at:2: exit code was $at_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_1.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_update_1.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_1.at:2: exit code was $at_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_1.at:2: rm test_keys"
echo t_update_1.at:2 >$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_1.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



# We have A1 -> B1, A and B different branches.  Update from A1
# shouldn't take us to B1.  Then propagate B -> A, and update from A1;
# now this should take us to B1.


cat >testfile <<'_ATEOF'
stuff stuff
_ATEOF

$at_traceoff
echo "t_update_1.at:9: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_update_1.at:9 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_1.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_update_1.at:10: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=a commit --message blah-blah"
echo t_update_1.at:10 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=a commit --message 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_1.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


A1_SHA=`cat MT/revision`


cat >testfile <<'_ATEOF'
nonsense nonsense
_ATEOF



$at_traceoff
echo "t_update_1.at:15: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=b commit --message blah-blah"
echo t_update_1.at:15 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=b commit --message 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_1.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


B1_SHA=`cat MT/revision`


$at_traceoff
echo "t_update_1.at:18: rm -rf MT.old"
echo t_update_1.at:18 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_1.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_update_1.at:18: mv  MT MT.old"
echo t_update_1.at:18 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_1.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_update_1.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$A1_SHA ."
echo t_update_1.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $A1_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_1.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_update_1.at:18: mv MT.old/options MT"
echo t_update_1.at:18 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_1.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_update_1.at:18: test \$PROBE_R_SHA = \$A1_SHA"
echo t_update_1.at:18 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $A1_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_1.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


# Put in an explicit --branch, because REVERT_TO is not smart about
# such things.
$at_traceoff
echo "t_update_1.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=a update"
echo t_update_1.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=a 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_1.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_update_1.at:22: test \$A1_SHA == \`cat MT/revision\`"
echo t_update_1.at:22 >$at_check_line_file
( $at_traceon; test $A1_SHA == `cat MT/revision` ) >$at_stdout 2>$at_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_1.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_update_1.at:24: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR propagate b a"
echo t_update_1.at:24 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR propagate b 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_update_1.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_update_1.at:26: rm -rf MT.old"
echo t_update_1.at:26 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_1.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_update_1.at:26: mv  MT MT.old"
echo t_update_1.at:26 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_1.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_update_1.at:26: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$A1_SHA ."
echo t_update_1.at:26 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $A1_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_1.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_update_1.at:26: mv MT.old/options MT"
echo t_update_1.at:26 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_1.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_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_update_1.at:26: test \$PROBE_R_SHA = \$A1_SHA"
echo t_update_1.at:26 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $A1_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_1.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


# Put in an explicit --branch, because REVERT_TO is not smart about
# such things.
$at_traceoff
echo "t_update_1.at:29: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=a update"
echo t_update_1.at:29 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=a 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_1.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_1.at:30: test \$B1_SHA == \`cat MT/revision\`"
echo t_update_1.at:30 >$at_check_line_file
( $at_traceon; test $B1_SHA == `cat MT/revision` ) >$at_stdout 2>$at_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_1.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  89 ) # 89. t_vcheck.at:1: (todo) vcheck
    at_setup_line='t_vcheck.at:1'
    at_desc='(todo) vcheck'
    $at_quiet $ECHO_N " 89: (todo) vcheck                                $ECHO_C"
    at_xfail=yes
    (
      echo "89. t_vcheck.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_vcheck.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_vcheck.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_vcheck.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_vcheck.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_vcheck.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_vcheck.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_vcheck.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_vcheck.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_vcheck.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_vcheck.at:2: rm test_keys"
echo t_vcheck.at:2 >$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_vcheck.at:2: 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 a bug report.


# There used to be a command 'vcheck', that defended against the
# chance of (accidental or malicious) SHA1 collision.  The way it did
# this was by putting certs named "vcheck" on manifests, and these
# certs contained a re-hash of that manifest with a nonce attached.
# (So a MAC, basically.)  The idea being that even if two manifests
# had the same SHA1, they wouldn't have the same salted SHA1.

# This functionality is mostly useful for reassuring people's
# irrational fears, but hey, that's a useful thing to do.  (This does,
# though, probably mean that any replacement should have 0 overhead
# for people who _aren't_ worried about SHA1 collision.)

# The original 'vcheck' was ripped out when manifest and file certs
# were removed, and never quite did the right thing anyway.  (It only
# applied to manifests, in particular.)  It may be useful to reference
# the code, though: see, say,
# 727d28b35f1fcbc91c0183fca2a6cabbe7cf21d7, or t:monotone-0.16.  In
# particular, mac.hh should be useful.  Note also the section
# "Accidental collision" in monotone.texi.

# There are a few ways to re-add this.  The simplest is probably to
# have a cert on revisions that contains
#   - a salt/nonce
#   - a MAC of the revision
#   - a MAC of the revision's manifest
#   - a MAC of each file within that revision.
# possibly the last should just be "a MAC of every file mentioned in
# that revision's list of diff's", so people creating multiple vcheck
# certs aren't checking the same unchanging files over and over again.
# This reduces space overhead, too, since certs's space usage adds up,
# and does so for project members who aren't worried about SHA1
# collisions too...

$at_traceoff
echo "t_vcheck.at:40: false"
echo t_vcheck.at:40 >$at_check_line_file
( $at_traceon; false ) >$at_stdout 2>$at_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_vcheck.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  90 ) # 90. t_db_with_dots.at:1: --db with ..
    at_setup_line='t_db_with_dots.at:1'
    at_desc='--db with ..'
    $at_quiet $ECHO_N " 90: --db with ..                                 $ECHO_C"
    at_xfail=no
    (
      echo "90. t_db_with_dots.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_db_with_dots.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_db_with_dots.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_db_with_dots.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_db_with_dots.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_db_with_dots.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_db_with_dots.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_db_with_dots.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_db_with_dots.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_db_with_dots.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_db_with_dots.at:2: rm test_keys"
echo t_db_with_dots.at:2 >$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_db_with_dots.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_db_with_dots.at:4: mkdir foo"
echo t_db_with_dots.at:4 >$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_db_with_dots.at:4: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_db_with_dots.at:5: (cd foo && \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=../new.db db init)"
echo t_db_with_dots.at:5 >$at_check_line_file
( $at_traceon; (cd foo && $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=../new.db 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_db_with_dots.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_db_with_dots.at:6: (cd foo && \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=../new.db ls branches)"
echo t_db_with_dots.at:6 >$at_check_line_file
( $at_traceon; (cd foo && $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=../new.db ls branches) ) >$at_stdout 2>$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_db_with_dots.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


# paths in MT/options should be absolute and not contain ..

$at_traceoff
echo "t_db_with_dots.at:10: mkdir bar"
echo t_db_with_dots.at:10 >$at_check_line_file
( $at_traceon; mkdir 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_db_with_dots.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_db_with_dots.at:11: (cd bar && \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=../new.db setup .)"
echo t_db_with_dots.at:11 >$at_check_line_file
( $at_traceon; (cd bar && $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=../new.db setup .) ) >$at_stdout 2>$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_db_with_dots.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_db_with_dots.at:12: grep new.db bar/MT/options"
echo t_db_with_dots.at:12 >$at_check_line_file
( $at_traceon; grep new.db bar/MT/options ) >$at_stdout 2>$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_db_with_dots.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_db_with_dots.at:13: grep new.db bar/MT/options | grep -v '\\.\\.'"
echo t_db_with_dots.at:13 >$at_check_line_file
( $at_traceon; grep new.db bar/MT/options | grep -v '\.\.' ) >$at_stdout 2>$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_db_with_dots.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  91 ) # 91. t_subdir_add.at:1: add in subdir
    at_setup_line='t_subdir_add.at:1'
    at_desc='add in subdir'
    $at_quiet $ECHO_N " 91: add in subdir                                $ECHO_C"
    at_xfail=no
    (
      echo "91. t_subdir_add.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_subdir_add.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_subdir_add.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_subdir_add.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_subdir_add.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_subdir_add.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_subdir_add.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_subdir_add.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_subdir_add.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_subdir_add.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_subdir_add.at:2: rm test_keys"
echo t_subdir_add.at:2 >$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_subdir_add.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_subdir_add.at:4: mkdir subdir"
echo t_subdir_add.at:4 >$at_check_line_file
( $at_traceon; mkdir subdir ) >$at_stdout 2>$at_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_subdir_add.at:4: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_subdir_add.at:5: mkdir subdir/anotherdir"
echo t_subdir_add.at:5 >$at_check_line_file
( $at_traceon; mkdir subdir/anotherdir ) >$at_stdout 2>$at_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_subdir_add.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 >subdir/foo <<'_ATEOF'
data data
_ATEOF

cat >subdir/anotherdir/bar <<'_ATEOF'
more data
_ATEOF


# Add a file
$at_traceoff
echo "t_subdir_add.at:12: (cd subdir; \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add foo)"
echo t_subdir_add.at:12 >$at_check_line_file
( $at_traceon; (cd subdir; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_subdir_add.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

# Add a directory
$at_traceoff
echo "t_subdir_add.at:14: (cd subdir; \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add anotherdir)"
echo t_subdir_add.at:14 >$at_check_line_file
( $at_traceon; (cd subdir; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add anotherdir) ) >$at_stdout 2>$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_subdir_add.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_subdir_add.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_subdir_add.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_subdir_add.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


REV=`cat MT/revision`

$at_traceoff
echo "t_subdir_add.at:19: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$REV codir"
echo t_subdir_add.at:19 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $REV codir ) >$at_stdout 2>$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_subdir_add.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_subdir_add.at:20: cmp subdir/foo codir/subdir/foo"
echo t_subdir_add.at:20 >$at_check_line_file
( $at_traceon; cmp subdir/foo codir/subdir/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_subdir_add.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_subdir_add.at:21: cmp subdir/anotherdir/bar codir/subdir/anotherdir/bar"
echo t_subdir_add.at:21 >$at_check_line_file
( $at_traceon; cmp subdir/anotherdir/bar codir/subdir/anotherdir/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_subdir_add.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`
    ;;

  92 ) # 92. t_subdir_drop.at:1: (minor) drop in subdir
    at_setup_line='t_subdir_drop.at:1'
    at_desc='(minor) drop in subdir'
    $at_quiet $ECHO_N " 92: (minor) drop in subdir                       $ECHO_C"
    at_xfail=yes
    (
      echo "92. t_subdir_drop.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_subdir_drop.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_subdir_drop.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_subdir_drop.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_subdir_drop.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_subdir_drop.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_subdir_drop.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_subdir_drop.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_subdir_drop.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_subdir_drop.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_subdir_drop.at:2: rm test_keys"
echo t_subdir_drop.at:2 >$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_subdir_drop.at:2: 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 a bug report.


# This test _should_ start working once t_delete_dir.at starts
# working.  If not, reinvestigate.

$at_traceoff
echo "t_subdir_drop.at:10: mkdir subdir"
echo t_subdir_drop.at:10 >$at_check_line_file
( $at_traceon; mkdir subdir ) >$at_stdout 2>$at_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_subdir_drop.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_subdir_drop.at:11: mkdir subdir/anotherdir"
echo t_subdir_drop.at:11 >$at_check_line_file
( $at_traceon; mkdir subdir/anotherdir ) >$at_stdout 2>$at_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_subdir_drop.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

cat >subdir/foo <<'_ATEOF'
data data
_ATEOF

cat >subdir/anotherdir/bar <<'_ATEOF'
more data
_ATEOF

$at_traceoff
echo "t_subdir_drop.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add ."
echo t_subdir_drop.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add . ) >$at_stdout 2>$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_subdir_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_subdir_drop.at:17: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_subdir_drop.at:17 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_subdir_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


REV=`cat MT/revision`

# Create a checkout we can update
$at_traceoff
echo "t_subdir_drop.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$REV codir"
echo t_subdir_drop.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $REV codir ) >$at_stdout 2>$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_subdir_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_subdir_drop.at:23: (cd subdir && \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR drop foo)"
echo t_subdir_drop.at:23 >$at_check_line_file
( $at_traceon; (cd subdir && $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_subdir_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_subdir_drop.at:24: (cd subdir && \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR drop anotherdir)"
echo t_subdir_drop.at:24 >$at_check_line_file
( $at_traceon; (cd subdir && $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR drop anotherdir) ) >$at_stdout 2>$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_subdir_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
echo "t_subdir_drop.at:25: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_subdir_drop.at:25 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_subdir_drop.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_subdir_drop.at:27: (cd codir && \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update)"
echo t_subdir_drop.at:27 >$at_check_line_file
( $at_traceon; (cd codir && $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_subdir_drop.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_subdir_drop.at:28: test -f codir/subdir/foo"
echo t_subdir_drop.at:28 >$at_check_line_file
( $at_traceon; test -f codir/subdir/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;;
   1) ;;
   *) echo "t_subdir_drop.at:28: 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_subdir_drop.at:29: test -f codir/subdir/anotherdir/bar"
echo t_subdir_drop.at:29 >$at_check_line_file
( $at_traceon; test -f codir/subdir/anotherdir/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;;
   1) ;;
   *) echo "t_subdir_drop.at:29: 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`
    ;;

  93 ) # 93. t_subdir_revert.at:1: revert in subdirs
    at_setup_line='t_subdir_revert.at:1'
    at_desc='revert in subdirs'
    $at_quiet $ECHO_N " 93: revert in subdirs                            $ECHO_C"
    at_xfail=no
    (
      echo "93. t_subdir_revert.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_subdir_revert.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_subdir_revert.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_subdir_revert.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_subdir_revert.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_subdir_revert.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_subdir_revert.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_subdir_revert.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_subdir_revert.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_subdir_revert.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_subdir_revert.at:2: rm test_keys"
echo t_subdir_revert.at:2 >$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_subdir_revert.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_subdir_revert.at:4: mkdir subdir"
echo t_subdir_revert.at:4 >$at_check_line_file
( $at_traceon; mkdir subdir ) >$at_stdout 2>$at_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_subdir_revert.at:4: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_subdir_revert.at:5: mkdir subdir/anotherdir"
echo t_subdir_revert.at:5 >$at_check_line_file
( $at_traceon; mkdir subdir/anotherdir ) >$at_stdout 2>$at_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_subdir_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 >subdir/foo <<'_ATEOF'
data data
_ATEOF

cat >subdir/anotherdir/bar <<'_ATEOF'
more data
_ATEOF

$at_traceoff
echo "t_subdir_revert.at:10: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add ."
echo t_subdir_revert.at:10 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add . ) >$at_stdout 2>$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_subdir_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


$at_traceoff
echo "t_subdir_revert.at:11: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_subdir_revert.at:11 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_subdir_revert.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


REV=`cat MT/revision`

# Create a checkout we can play with
$at_traceoff
echo "t_subdir_revert.at:15: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$REV codir"
echo t_subdir_revert.at:15 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $REV codir ) >$at_stdout 2>$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_subdir_revert.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


# Write to the checked out files
cat >codir/subdir/foo <<'_ATEOF'
other data
_ATEOF

cat >codir/subdir/anotherdir/bar <<'_ATEOF'
more other data
_ATEOF


# Revert them
$at_traceoff
echo "t_subdir_revert.at:24: (cd codir/subdir && \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR revert foo)"
echo t_subdir_revert.at:24 >$at_check_line_file
( $at_traceon; (cd codir/subdir && $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR revert 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_subdir_revert.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_subdir_revert.at:25: (cd codir/subdir && \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR revert anotherdir)"
echo t_subdir_revert.at:25 >$at_check_line_file
( $at_traceon; (cd codir/subdir && $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR revert anotherdir) ) >$at_stdout 2>$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_subdir_revert.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


# Check them
$at_traceoff
echo "t_subdir_revert.at:28: cmp subdir/foo codir/subdir/foo"
echo t_subdir_revert.at:28 >$at_check_line_file
( $at_traceon; cmp subdir/foo codir/subdir/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_subdir_revert.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_subdir_revert.at:29: cmp subdir/anotherdir/bar codir/subdir/anotherdir/bar"
echo t_subdir_revert.at:29 >$at_check_line_file
( $at_traceon; cmp subdir/anotherdir/bar codir/subdir/anotherdir/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_subdir_revert.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  94 ) # 94. t_subdir_rename.at:1: rename in subdir
    at_setup_line='t_subdir_rename.at:1'
    at_desc='rename in subdir'
    $at_quiet $ECHO_N " 94: rename in subdir                             $ECHO_C"
    at_xfail=no
    (
      echo "94. t_subdir_rename.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_subdir_rename.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_subdir_rename.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_subdir_rename.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_subdir_rename.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_subdir_rename.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_subdir_rename.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_subdir_rename.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_subdir_rename.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_subdir_rename.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_subdir_rename.at:2: rm test_keys"
echo t_subdir_rename.at:2 >$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_subdir_rename.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_subdir_rename.at:4: mkdir subdir"
echo t_subdir_rename.at:4 >$at_check_line_file
( $at_traceon; mkdir subdir ) >$at_stdout 2>$at_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_subdir_rename.at:4: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_subdir_rename.at:5: mkdir subdir/anotherdir"
echo t_subdir_rename.at:5 >$at_check_line_file
( $at_traceon; mkdir subdir/anotherdir ) >$at_stdout 2>$at_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_subdir_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 >subdir/foo <<'_ATEOF'
data data
_ATEOF

cat >subdir/anotherdir/bar <<'_ATEOF'
more data
_ATEOF

$at_traceoff
echo "t_subdir_rename.at:10: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add ."
echo t_subdir_rename.at:10 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add . ) >$at_stdout 2>$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_subdir_rename.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_subdir_rename.at:11: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_subdir_rename.at:11 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_subdir_rename.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


REV=`cat MT/revision`

$at_traceoff
echo "t_subdir_rename.at:14: mv subdir/foo subdir/foo-renamed"
echo t_subdir_rename.at:14 >$at_check_line_file
( $at_traceon; mv subdir/foo subdir/foo-renamed ) >$at_stdout 2>$at_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_subdir_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

$at_traceoff
echo "t_subdir_rename.at:15: (cd subdir && \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename foo foo-renamed)"
echo t_subdir_rename.at:15 >$at_check_line_file
( $at_traceon; (cd subdir && $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename foo foo-renamed) ) >$at_stdout 2>$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_subdir_rename.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_subdir_rename.at:16: mv subdir/anotherdir anotherdir-renamed"
echo t_subdir_rename.at:16 >$at_check_line_file
( $at_traceon; mv subdir/anotherdir anotherdir-renamed ) >$at_stdout 2>$at_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_subdir_rename.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_subdir_rename.at:17: (cd subdir && \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename anotherdir ../anotherdir-renamed)"
echo t_subdir_rename.at:17 >$at_check_line_file
( $at_traceon; (cd subdir && $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename anotherdir ../anotherdir-renamed) ) >$at_stdout 2>$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_subdir_rename.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_subdir_rename.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_subdir_rename.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_subdir_rename.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_subdir_rename.at:20: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$REV codir"
echo t_subdir_rename.at:20 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $REV codir ) >$at_stdout 2>$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_subdir_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_subdir_rename.at:21: (cd codir && \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update --branch=testbranch)"
echo t_subdir_rename.at:21 >$at_check_line_file
( $at_traceon; (cd codir && $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR update --branch=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_subdir_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

$at_traceoff
echo "t_subdir_rename.at:22: test -f codir/subdir/foo"
echo t_subdir_rename.at:22 >$at_check_line_file
( $at_traceon; test -f codir/subdir/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;;
   1) ;;
   *) echo "t_subdir_rename.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

$at_traceoff
echo "t_subdir_rename.at:23: test -f codir/subdir/anotherdir/bar"
echo t_subdir_rename.at:23 >$at_check_line_file
( $at_traceon; test -f codir/subdir/anotherdir/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;;
   1) ;;
   *) echo "t_subdir_rename.at:23: 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_subdir_rename.at:24: cmp subdir/foo-renamed codir/subdir/foo-renamed"
echo t_subdir_rename.at:24 >$at_check_line_file
( $at_traceon; cmp subdir/foo-renamed codir/subdir/foo-renamed ) >$at_stdout 2>$at_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_subdir_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_subdir_rename.at:25: cmp anotherdir-renamed/bar codir/anotherdir-renamed/bar"
echo t_subdir_rename.at:25 >$at_check_line_file
( $at_traceon; cmp anotherdir-renamed/bar codir/anotherdir-renamed/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_subdir_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


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

  95 ) # 95. t_subdir_attr.at:3: attr command in subdirs
    at_setup_line='t_subdir_attr.at:3'
    at_desc='attr command in subdirs'
    $at_quiet $ECHO_N " 95: attr command in subdirs                      $ECHO_C"
    at_xfail=no
    (
      echo "95. t_subdir_attr.at:3: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_subdir_attr.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_subdir_attr.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_subdir_attr.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_subdir_attr.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_subdir_attr.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_subdir_attr.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_subdir_attr.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_subdir_attr.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_subdir_attr.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_subdir_attr.at:5: rm test_keys"
echo t_subdir_attr.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_subdir_attr.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_subdir_attr.at:7: mkdir -p foo/bar"
echo t_subdir_attr.at:7 >$at_check_line_file
( $at_traceon; mkdir -p 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_subdir_attr.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 >top <<'_ATEOF'
top data
_ATEOF

cat >foo/foodata <<'_ATEOF'
foo data
_ATEOF

cat >foo/bar/bardata <<'_ATEOF'
foobar data
_ATEOF


$at_traceoff
echo "t_subdir_attr.at:15: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add top foo"
echo t_subdir_attr.at:15 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add top 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_subdir_attr.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


# set attributes in directories

$at_traceoff
echo "t_subdir_attr.at:19: (cd foo; \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR attr set foodata test_attr true)"
echo t_subdir_attr.at:19 >$at_check_line_file
( $at_traceon; (cd foo; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR attr set foodata test_attr true) ) >$at_stdout 2>$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_subdir_attr.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_subdir_attr.at:20: (cd foo/bar; \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR attr set bardata test_attr false)"
echo t_subdir_attr.at:20 >$at_check_line_file
( $at_traceon; (cd foo/bar; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR attr set bardata test_attr false) ) >$at_stdout 2>$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_subdir_attr.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_subdir_attr.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message=blah-blah"
echo t_subdir_attr.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message=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_subdir_attr.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

REV=`cat MT/revision`

# see if they're right

$at_traceoff
echo "t_subdir_attr.at:26: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$REV co-dir"
echo t_subdir_attr.at:26 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $REV 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_subdir_attr.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_subdir_attr.at:27: grep \"test_attr:foo/foodata:true\" stdout"
echo t_subdir_attr.at:27 >$at_check_line_file
( $at_traceon; grep "test_attr:foo/foodata: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_subdir_attr.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_subdir_attr.at:28: grep \"test_attr:foo/bar/bardata:false\" stdout"
echo t_subdir_attr.at:28 >$at_check_line_file
( $at_traceon; grep "test_attr:foo/bar/bardata:false" 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_subdir_attr.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  96 ) # 96. t_lca_1.at:1: (minor) an lca
    at_setup_line='t_lca_1.at:1'
    at_desc='(minor) an lca'
    $at_quiet $ECHO_N " 96: (minor) an lca                               $ECHO_C"
    at_xfail=yes
    (
      echo "96. t_lca_1.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_lca_1.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_lca_1.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_lca_1.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_lca_1.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_lca_1.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_lca_1.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_lca_1.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_lca_1.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_lca_1.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_lca_1.at:2: rm test_keys"
echo t_lca_1.at:2 >$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_lca_1.at:2: 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 a bug report.


# Actually, we don't have a reduced test case for this, but this test
# can serve as a marker until someone tracks this down and makes one.

# The bug is that if, on the main monotone repo, you run
#   $ monotone lca e3623ca77d2a8b45817ecaa5b67018c453652830 7d5918d0181f7bb9adba2ee63234146d23bcf83e
# (note that one is in branch net.venge.monotone, one in
# net.venge.monotone.cvssync, for finding them in monotone-viz) the
# output is ce860bae312c4bb8483d5b3b2a8cd3bebe2323d5, even though the
# real lca is 0b17415d7aa112060e8ead9ae7a486510dc61a9d.

$at_traceoff
echo "t_lca_1.at:17: false"
echo t_lca_1.at:17 >$at_check_line_file
( $at_traceon; false ) >$at_stdout 2>$at_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_lca_1.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  97 ) # 97. t_update_2.at:1: (normal) update 2
    at_setup_line='t_update_2.at:1'
    at_desc='(normal) update 2'
    $at_quiet $ECHO_N " 97: (normal) update 2                            $ECHO_C"
    at_xfail=no
    (
      echo "97. t_update_2.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_2.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_update_2.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_2.at:2: exit code was $at_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_2.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_update_2.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_2.at:2: exit code was $at_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_2.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_update_2.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_2.at:2: exit code was $at_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_2.at:2: rm test_keys"
echo t_update_2.at:2 >$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_2.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



# testing that update is able to jump over discontinuities in
# branches.  If we have A1 -> B1 -> A2, then updating branch A from A1
# should get to A2.


cat >testfile <<'_ATEOF'
main branch data
_ATEOF

$at_traceoff
echo "t_update_2.at:9: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_update_2.at:9 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_2.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_update_2.at:10: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=mainbranch commit --message blah-blah"
echo t_update_2.at:10 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=mainbranch commit --message 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_2.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


A1_R=`cat MT/revision`


cat >testfile <<'_ATEOF'
first branch data 1
_ATEOF



$at_traceoff
echo "t_update_2.at:15: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=firstbranch commit --message blah-blah"
echo t_update_2.at:15 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=firstbranch commit --message 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_2.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


B1_R=`cat MT/revision`


cat >testfile <<'_ATEOF'
first branch data 2
_ATEOF



$at_traceoff
echo "t_update_2.at:20: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=mainbranch commit --message blah-blah"
echo t_update_2.at:20 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=mainbranch commit --message 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_2.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


A2_R=`cat MT/revision`



$at_traceoff
echo "t_update_2.at:24: rm -rf MT.old"
echo t_update_2.at:24 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_2.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_update_2.at:24: mv  MT MT.old"
echo t_update_2.at:24 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_2.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_update_2.at:24: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$A1_R ."
echo t_update_2.at:24 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $A1_R . ) >$at_stdout 2>$at_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_2.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_update_2.at:24: mv MT.old/options MT"
echo t_update_2.at:24 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_2.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_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_update_2.at:24: test \$PROBE_R_SHA = \$A1_R"
echo t_update_2.at:24 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $A1_R ) >$at_stdout 2>$at_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_2.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_update_2.at:26: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update --branch=mainbranch"
echo t_update_2.at:26 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR update --branch=mainbranch ) >$at_stdout 2>$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_2.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

GOT_R=`cat MT/revision`

$at_traceoff
echo "t_update_2.at:29: test \$GOT_R != \$A1_R"
echo t_update_2.at:29 >$at_check_line_file
( $at_traceon; test $GOT_R != $A1_R ) >$at_stdout 2>$at_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_2.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_2.at:30: test \$GOT_R == \$A2_R"
echo t_update_2.at:30 >$at_check_line_file
( $at_traceon; test $GOT_R == $A2_R ) >$at_stdout 2>$at_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_2.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  98 ) # 98. t_rename_dir_cross_level.at:1: rename_dir to non-sibling
    at_setup_line='t_rename_dir_cross_level.at:1'
    at_desc='rename_dir to non-sibling'
    $at_quiet $ECHO_N " 98: rename_dir to non-sibling                    $ECHO_C"
    at_xfail=no
    (
      echo "98. t_rename_dir_cross_level.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_dir_cross_level.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_rename_dir_cross_level.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_dir_cross_level.at:2: exit code was $at_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_dir_cross_level.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_rename_dir_cross_level.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_dir_cross_level.at:2: exit code was $at_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_dir_cross_level.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_rename_dir_cross_level.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_dir_cross_level.at:2: exit code was $at_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_dir_cross_level.at:2: rm test_keys"
echo t_rename_dir_cross_level.at:2 >$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_dir_cross_level.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



# Pretty rigorous test of rename_dir, in particular when the target
# and source of the rename are not sibling directories.

OLD_DIR=subdir1/the_dir
NEW_DIR=subdir2/target_dir/the_dir

$at_traceoff
echo "t_rename_dir_cross_level.at:10: mkdir subdir1"
echo t_rename_dir_cross_level.at:10 >$at_check_line_file
( $at_traceon; mkdir subdir1 ) >$at_stdout 2>$at_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_dir_cross_level.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_rename_dir_cross_level.at:11: mkdir \$OLD_DIR"
echo t_rename_dir_cross_level.at:11 >$at_check_line_file
( $at_traceon; mkdir $OLD_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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename_dir_cross_level.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_rename_dir_cross_level.at:12: mkdir subdir2"
echo t_rename_dir_cross_level.at:12 >$at_check_line_file
( $at_traceon; mkdir subdir2 ) >$at_stdout 2>$at_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_dir_cross_level.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_rename_dir_cross_level.at:13: mkdir subdir2/target_dir"
echo t_rename_dir_cross_level.at:13 >$at_check_line_file
( $at_traceon; mkdir subdir2/target_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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename_dir_cross_level.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



cat >$OLD_DIR/preexisting <<'_ATEOF'
foo bar blah
_ATEOF

$at_traceoff
echo "t_rename_dir_cross_level.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add \$OLD_DIR/preexisting"
echo t_rename_dir_cross_level.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add $OLD_DIR/preexisting ) >$at_stdout 2>$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_dir_cross_level.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



cat >$OLD_DIR/rename-out-file <<'_ATEOF'
asdfasdf
_ATEOF

$at_traceoff
echo "t_rename_dir_cross_level.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add \$OLD_DIR/rename-out-file"
echo t_rename_dir_cross_level.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add $OLD_DIR/rename-out-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_rename_dir_cross_level.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_rename_dir_cross_level.at:19: mkdir \$OLD_DIR/rename-out-dir"
echo t_rename_dir_cross_level.at:19 >$at_check_line_file
( $at_traceon; mkdir $OLD_DIR/rename-out-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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename_dir_cross_level.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


cat >$OLD_DIR/rename-out-dir/subfile <<'_ATEOF'
9
_ATEOF

$at_traceoff
echo "t_rename_dir_cross_level.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add \$OLD_DIR/rename-out-dir/subfile"
echo t_rename_dir_cross_level.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add $OLD_DIR/rename-out-dir/subfile ) >$at_stdout 2>$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_dir_cross_level.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 >rename-in-file <<'_ATEOF'
badlsakl
_ATEOF

$at_traceoff
echo "t_rename_dir_cross_level.at:23: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add rename-in-file"
echo t_rename_dir_cross_level.at:23 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add rename-in-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_rename_dir_cross_level.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_rename_dir_cross_level.at:24: mkdir rename-in-dir"
echo t_rename_dir_cross_level.at:24 >$at_check_line_file
( $at_traceon; mkdir rename-in-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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename_dir_cross_level.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


cat >rename-in-dir/subfile <<'_ATEOF'
10
_ATEOF

$at_traceoff
echo "t_rename_dir_cross_level.at:26: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add rename-in-dir/subfile"
echo t_rename_dir_cross_level.at:26 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add rename-in-dir/subfile ) >$at_stdout 2>$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_dir_cross_level.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 >$OLD_DIR/doomed <<'_ATEOF'
badfsda
_ATEOF

$at_traceoff
echo "t_rename_dir_cross_level.at:28: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add \$OLD_DIR/doomed"
echo t_rename_dir_cross_level.at:28 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add $OLD_DIR/doomed ) >$at_stdout 2>$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_dir_cross_level.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



cat >subdir1/bystander1 <<'_ATEOF'
stuff stuff
_ATEOF

$at_traceoff
echo "t_rename_dir_cross_level.at:30: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add subdir1/bystander1"
echo t_rename_dir_cross_level.at:30 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add subdir1/bystander1 ) >$at_stdout 2>$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_dir_cross_level.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_rename_dir_cross_level.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_rename_dir_cross_level.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_dir_cross_level.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


BASE_R=`cat MT/revision`


cat >subdir1/bystander2 <<'_ATEOF'
asdfasknb
_ATEOF

$at_traceoff
echo "t_rename_dir_cross_level.at:35: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add subdir1/bystander2"
echo t_rename_dir_cross_level.at:35 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add subdir1/bystander2 ) >$at_stdout 2>$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_dir_cross_level.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 >$OLD_DIR/new-file <<'_ATEOF'
foo ping
_ATEOF

$at_traceoff
echo "t_rename_dir_cross_level.at:37: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add \$OLD_DIR/new-file"
echo t_rename_dir_cross_level.at:37 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add $OLD_DIR/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_rename_dir_cross_level.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_rename_dir_cross_level.at:38: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename \$OLD_DIR/rename-out-file rename-out-file"
echo t_rename_dir_cross_level.at:38 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename $OLD_DIR/rename-out-file rename-out-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_rename_dir_cross_level.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_rename_dir_cross_level.at:39: mv \$OLD_DIR/rename-out-file rename-out-file"
echo t_rename_dir_cross_level.at:39 >$at_check_line_file
( $at_traceon; mv $OLD_DIR/rename-out-file rename-out-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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename_dir_cross_level.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_rename_dir_cross_level.at:40: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename \$OLD_DIR/rename-out-dir rename-out-dir"
echo t_rename_dir_cross_level.at:40 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename $OLD_DIR/rename-out-dir rename-out-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_rename_dir_cross_level.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_dir_cross_level.at:41: mv \$OLD_DIR/rename-out-dir rename-out-dir"
echo t_rename_dir_cross_level.at:41 >$at_check_line_file
( $at_traceon; mv $OLD_DIR/rename-out-dir rename-out-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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename_dir_cross_level.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_dir_cross_level.at:42: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename rename-in-dir \$OLD_DIR/rename-in-dir"
echo t_rename_dir_cross_level.at:42 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename rename-in-dir $OLD_DIR/rename-in-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_rename_dir_cross_level.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_dir_cross_level.at:43: mv rename-in-dir \$OLD_DIR/rename-in-dir"
echo t_rename_dir_cross_level.at:43 >$at_check_line_file
( $at_traceon; mv rename-in-dir $OLD_DIR/rename-in-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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename_dir_cross_level.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_dir_cross_level.at:44: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename rename-in-file \$OLD_DIR/rename-in-file"
echo t_rename_dir_cross_level.at:44 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename rename-in-file $OLD_DIR/rename-in-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_rename_dir_cross_level.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_dir_cross_level.at:45: mv rename-in-file \$OLD_DIR/rename-in-file"
echo t_rename_dir_cross_level.at:45 >$at_check_line_file
( $at_traceon; mv rename-in-file $OLD_DIR/rename-in-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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename_dir_cross_level.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_rename_dir_cross_level.at:46: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR drop \$OLD_DIR/doomed"
echo t_rename_dir_cross_level.at:46 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR drop $OLD_DIR/doomed ) >$at_stdout 2>$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_dir_cross_level.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_rename_dir_cross_level.at:47: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_rename_dir_cross_level.at:47 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_dir_cross_level.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


LEFT_R=`cat MT/revision`


$at_traceoff
echo "t_rename_dir_cross_level.at:50: rm -rf MT.old"
echo t_rename_dir_cross_level.at:50 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_dir_cross_level.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_rename_dir_cross_level.at:50: mv  MT MT.old"
echo t_rename_dir_cross_level.at:50 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_dir_cross_level.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_rename_dir_cross_level.at:50: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$BASE_R ."
echo t_rename_dir_cross_level.at:50 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $BASE_R . ) >$at_stdout 2>$at_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_dir_cross_level.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_rename_dir_cross_level.at:50: mv MT.old/options MT"
echo t_rename_dir_cross_level.at:50 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_dir_cross_level.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_rename_dir_cross_level.at:50: test \$PROBE_R_SHA = \$BASE_R"
echo t_rename_dir_cross_level.at:50 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $BASE_R ) >$at_stdout 2>$at_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_dir_cross_level.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_rename_dir_cross_level.at:52: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename \$OLD_DIR/ \$NEW_DIR/"
echo t_rename_dir_cross_level.at:52 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename $OLD_DIR/ $NEW_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_rename_dir_cross_level.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_rename_dir_cross_level.at:53: mv \$OLD_DIR/ \$NEW_DIR/"
echo t_rename_dir_cross_level.at:53 >$at_check_line_file
( $at_traceon; mv $OLD_DIR/ $NEW_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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename_dir_cross_level.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_rename_dir_cross_level.at:54: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_rename_dir_cross_level.at:54 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_dir_cross_level.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


RIGHT_R=`cat MT/revision`

$at_traceoff
echo "t_rename_dir_cross_level.at:57: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR merge --branch=testbranch"
echo t_rename_dir_cross_level.at:57 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR merge --branch=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_rename_dir_cross_level.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_rename_dir_cross_level.at:59: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$BASE_R test_dir"
echo t_rename_dir_cross_level.at:59 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $BASE_R test_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_rename_dir_cross_level.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_rename_dir_cross_level.at:60: (cd test_dir && \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch update)"
echo t_rename_dir_cross_level.at:60 >$at_check_line_file
( $at_traceon; (cd test_dir && $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch 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_dir_cross_level.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

MERGED_R=`cd test_dir && cat MT/revision`
$at_traceoff
echo "t_rename_dir_cross_level.at:62: test \$BASE_R != \$MERGED_R"
echo t_rename_dir_cross_level.at:62 >$at_check_line_file
( $at_traceon; test $BASE_R != $MERGED_R ) >$at_stdout 2>$at_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_dir_cross_level.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_rename_dir_cross_level.at:63: test \$LEFT_R != \$MERGED_R"
echo t_rename_dir_cross_level.at:63 >$at_check_line_file
( $at_traceon; test $LEFT_R != $MERGED_R ) >$at_stdout 2>$at_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_dir_cross_level.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_rename_dir_cross_level.at:64: test \$RIGHT_R != \$MERGED_R"
echo t_rename_dir_cross_level.at:64 >$at_check_line_file
( $at_traceon; test $RIGHT_R != $MERGED_R ) >$at_stdout 2>$at_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_dir_cross_level.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


T_NEW_DIR=test_dir/$NEW_DIR
$at_traceoff
echo "t_rename_dir_cross_level.at:67: cmp \$NEW_DIR/preexisting \$T_NEW_DIR/preexisting"
echo t_rename_dir_cross_level.at:67 >$at_check_line_file
( $at_traceon; cmp $NEW_DIR/preexisting $T_NEW_DIR/preexisting ) >$at_stdout 2>$at_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_dir_cross_level.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_rename_dir_cross_level.at:68: cmp \$NEW_DIR/new-file \$T_NEW_DIR/new-file"
echo t_rename_dir_cross_level.at:68 >$at_check_line_file
( $at_traceon; cmp $NEW_DIR/new-file $T_NEW_DIR/new-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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename_dir_cross_level.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_rename_dir_cross_level.at:69: cmp rename-out-file test_dir/rename-out-file"
echo t_rename_dir_cross_level.at:69 >$at_check_line_file
( $at_traceon; cmp rename-out-file test_dir/rename-out-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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename_dir_cross_level.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_rename_dir_cross_level.at:70: test ! -f \$T_NEW_DIR/rename-out-file"
echo t_rename_dir_cross_level.at:70 >$at_check_line_file
( $at_traceon; test ! -f $T_NEW_DIR/rename-out-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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename_dir_cross_level.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_rename_dir_cross_level.at:71: cmp rename-out-dir/subfile test_dir/rename-out-dir/subfile"
echo t_rename_dir_cross_level.at:71 >$at_check_line_file
( $at_traceon; cmp rename-out-dir/subfile test_dir/rename-out-dir/subfile ) >$at_stdout 2>$at_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_dir_cross_level.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_rename_dir_cross_level.at:72: test ! -f \$T_NEW_DIR/rename-out-dir/subfile"
echo t_rename_dir_cross_level.at:72 >$at_check_line_file
( $at_traceon; test ! -f $T_NEW_DIR/rename-out-dir/subfile ) >$at_stdout 2>$at_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_dir_cross_level.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_rename_dir_cross_level.at:73: cmp \$NEW_DIR/rename-in-file \$T_NEW_DIR/rename-in-file"
echo t_rename_dir_cross_level.at:73 >$at_check_line_file
( $at_traceon; cmp $NEW_DIR/rename-in-file $T_NEW_DIR/rename-in-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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename_dir_cross_level.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_rename_dir_cross_level.at:74: test ! -f test_dir/rename-in-file"
echo t_rename_dir_cross_level.at:74 >$at_check_line_file
( $at_traceon; test ! -f test_dir/rename-in-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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename_dir_cross_level.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_rename_dir_cross_level.at:75: cmp \$NEW_DIR/rename-in-dir/subfile \$T_NEW_DIR/rename-in-dir/subfile"
echo t_rename_dir_cross_level.at:75 >$at_check_line_file
( $at_traceon; cmp $NEW_DIR/rename-in-dir/subfile $T_NEW_DIR/rename-in-dir/subfile ) >$at_stdout 2>$at_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_dir_cross_level.at:75: exit code was $at_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_dir_cross_level.at:76: test ! -f test_dir/rename-in-dir/subfile"
echo t_rename_dir_cross_level.at:76 >$at_check_line_file
( $at_traceon; test ! -f test_dir/rename-in-dir/subfile ) >$at_stdout 2>$at_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_dir_cross_level.at:76: exit code was $at_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_dir_cross_level.at:77: test ! -f \$T_NEW_DIR/doomed"
echo t_rename_dir_cross_level.at:77 >$at_check_line_file
( $at_traceon; test ! -f $T_NEW_DIR/doomed ) >$at_stdout 2>$at_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_dir_cross_level.at:77: exit code was $at_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_dir_cross_level.at:78: cmp subdir1/bystander1 test_dir/subdir1/bystander1"
echo t_rename_dir_cross_level.at:78 >$at_check_line_file
( $at_traceon; cmp subdir1/bystander1 test_dir/subdir1/bystander1 ) >$at_stdout 2>$at_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_dir_cross_level.at:78: exit code was $at_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_dir_cross_level.at:79: cmp subdir1/bystander2 test_dir/subdir1/bystander2"
echo t_rename_dir_cross_level.at:79 >$at_check_line_file
( $at_traceon; cmp subdir1/bystander2 test_dir/subdir1/bystander2 ) >$at_stdout 2>$at_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_dir_cross_level.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  99 ) # 99. t_rename_added_in_rename.at:1: merge with add, rename file, and rename dir
    at_setup_line='t_rename_added_in_rename.at:1'
    at_desc='merge with add, rename file, and rename dir'
    $at_quiet $ECHO_N " 99: merge with add, rename file, and rename dir  $ECHO_C"
    at_xfail=no
    (
      echo "99. t_rename_added_in_rename.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_added_in_rename.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_rename_added_in_rename.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_added_in_rename.at:2: exit code was $at_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_added_in_rename.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_rename_added_in_rename.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_added_in_rename.at:2: exit code was $at_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_added_in_rename.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_rename_added_in_rename.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_added_in_rename.at:2: exit code was $at_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_added_in_rename.at:2: rm test_keys"
echo t_rename_added_in_rename.at:2 >$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_added_in_rename.at:2: 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 one's kind of complicated.
#
#    BASE_R                 - contains directory foo
#     |    \
#     |     \
#     |      RENAME_DIR_R   - rename_dir foo bar
#     |            |
#     ADDED_R      |        - add_file foo/a
#     |      \     |
#     |       \    |
#     |        \   |
#     |         merge 1
#     |             |
#     RENAME_FILE_R |       - rename_file foo/a bar/a
#               \   |
#                \  |
#                 TEST_R
#
# we want to make sure that both merges happen without tree conflicts
# being triggered

$at_traceoff
echo "t_rename_added_in_rename.at:25: mkdir foo"
echo t_rename_added_in_rename.at:25 >$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_rename_added_in_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


cat >foo/bystander <<'_ATEOF'
data data
_ATEOF

$at_traceoff
echo "t_rename_added_in_rename.at:27: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add foo/bystander"
echo t_rename_added_in_rename.at:27 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add foo/bystander ) >$at_stdout 2>$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_added_in_rename.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_rename_added_in_rename.at:28: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_rename_added_in_rename.at:28 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_added_in_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


BASE_R=`cat MT/revision`

$at_traceoff
echo "t_rename_added_in_rename.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename foo/ bar/"
echo t_rename_added_in_rename.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_added_in_rename.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_rename_added_in_rename.at:32: mv foo bar"
echo t_rename_added_in_rename.at:32 >$at_check_line_file
( $at_traceon; mv 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_added_in_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_added_in_rename.at:33: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_rename_added_in_rename.at:33 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_added_in_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


RENAME_DIR_R=`cat MT/revision`

$at_traceoff
echo "t_rename_added_in_rename.at:36: mv bar foo"
echo t_rename_added_in_rename.at:36 >$at_check_line_file
( $at_traceon; mv 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_rename_added_in_rename.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_rename_added_in_rename.at:37: rm -rf MT.old"
echo t_rename_added_in_rename.at:37 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_added_in_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

$at_traceoff
echo "t_rename_added_in_rename.at:37: mv  MT MT.old"
echo t_rename_added_in_rename.at:37 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_added_in_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

$at_traceoff
echo "t_rename_added_in_rename.at:37: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$BASE_R ."
echo t_rename_added_in_rename.at:37 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $BASE_R . ) >$at_stdout 2>$at_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_added_in_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

$at_traceoff
echo "t_rename_added_in_rename.at:37: mv MT.old/options MT"
echo t_rename_added_in_rename.at:37 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_added_in_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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_rename_added_in_rename.at:37: test \$PROBE_R_SHA = \$BASE_R"
echo t_rename_added_in_rename.at:37 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $BASE_R ) >$at_stdout 2>$at_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_added_in_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




cat >foo/a <<'_ATEOF'
more data
_ATEOF

$at_traceoff
echo "t_rename_added_in_rename.at:40: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add foo/a"
echo t_rename_added_in_rename.at:40 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add foo/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_rename_added_in_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_added_in_rename.at:41: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_rename_added_in_rename.at:41 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_added_in_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


ADDED_R=`cat MT/revision`

$at_traceoff
echo "t_rename_added_in_rename.at:44: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR merge"
echo t_rename_added_in_rename.at:44 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_added_in_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_added_in_rename.at:46: mv foo/a foo/b"
echo t_rename_added_in_rename.at:46 >$at_check_line_file
( $at_traceon; mv foo/a foo/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_rename_added_in_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

$at_traceoff
echo "t_rename_added_in_rename.at:47: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename foo/a foo/b"
echo t_rename_added_in_rename.at:47 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename foo/a foo/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_rename_added_in_rename.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_rename_added_in_rename.at:48: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_rename_added_in_rename.at:48 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_added_in_rename.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


RENAME_FILE_R=`cat MT/revision`

$at_traceoff
echo "t_rename_added_in_rename.at:51: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR merge"
echo t_rename_added_in_rename.at:51 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_added_in_rename.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_rename_added_in_rename.at:53: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$BASE_R test_dir"
echo t_rename_added_in_rename.at:53 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $BASE_R test_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_rename_added_in_rename.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_rename_added_in_rename.at:54: (cd test_dir && \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update --branch=testbranch)"
echo t_rename_added_in_rename.at:54 >$at_check_line_file
( $at_traceon; (cd test_dir && $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR update --branch=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_rename_added_in_rename.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

TEST_R=`cd test_dir; cat MT/revision`

$at_traceoff
echo "t_rename_added_in_rename.at:57: test \$TEST_R != \$BASE_R"
echo t_rename_added_in_rename.at:57 >$at_check_line_file
( $at_traceon; test $TEST_R != $BASE_R ) >$at_stdout 2>$at_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_added_in_rename.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_rename_added_in_rename.at:58: test \$TEST_R != \$RENAME_DIR_R"
echo t_rename_added_in_rename.at:58 >$at_check_line_file
( $at_traceon; test $TEST_R != $RENAME_DIR_R ) >$at_stdout 2>$at_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_added_in_rename.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_rename_added_in_rename.at:59: test \$TEST_R != \$ADDED_R"
echo t_rename_added_in_rename.at:59 >$at_check_line_file
( $at_traceon; test $TEST_R != $ADDED_R ) >$at_stdout 2>$at_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_added_in_rename.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_rename_added_in_rename.at:60: test \$TEST_R != \$RENAME_FILE_R"
echo t_rename_added_in_rename.at:60 >$at_check_line_file
( $at_traceon; test $TEST_R != $RENAME_FILE_R ) >$at_stdout 2>$at_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_added_in_rename.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_rename_added_in_rename.at:62: test ! -f test_dir/foo/bystander"
echo t_rename_added_in_rename.at:62 >$at_check_line_file
( $at_traceon; test ! -f test_dir/foo/bystander ) >$at_stdout 2>$at_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_added_in_rename.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_rename_added_in_rename.at:63: test -f test_dir/bar/bystander"
echo t_rename_added_in_rename.at:63 >$at_check_line_file
( $at_traceon; test -f test_dir/bar/bystander ) >$at_stdout 2>$at_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_added_in_rename.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_rename_added_in_rename.at:64: test ! -f test_dir/foo/a"
echo t_rename_added_in_rename.at:64 >$at_check_line_file
( $at_traceon; test ! -f test_dir/foo/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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename_added_in_rename.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
echo "t_rename_added_in_rename.at:65: test ! -f test_dir/bar/a"
echo t_rename_added_in_rename.at:65 >$at_check_line_file
( $at_traceon; test ! -f test_dir/bar/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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename_added_in_rename.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

$at_traceoff
echo "t_rename_added_in_rename.at:66: test ! -f test_dir/foo/b"
echo t_rename_added_in_rename.at:66 >$at_check_line_file
( $at_traceon; test ! -f test_dir/foo/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_rename_added_in_rename.at:66: exit code was $at_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_added_in_rename.at:67: test -f test_dir/bar/b"
echo t_rename_added_in_rename.at:67 >$at_check_line_file
( $at_traceon; test -f test_dir/bar/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_rename_added_in_rename.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  100 ) # 100. t_rename_conflict.at:1: merge(<rename a b>, <rename a c>)
    at_setup_line='t_rename_conflict.at:1'
    at_desc='merge(<rename a b>, <rename a c>)'
    $at_quiet $ECHO_N "100: merge(<rename a b>, <rename a c>)            $ECHO_C"
    at_xfail=no
    (
      echo "100. t_rename_conflict.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_conflict.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_rename_conflict.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_conflict.at:2: exit code was $at_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_conflict.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_rename_conflict.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_conflict.at:2: exit code was $at_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_conflict.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_rename_conflict.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_conflict.at:2: exit code was $at_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_conflict.at:2: rm test_keys"
echo t_rename_conflict.at:2 >$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_conflict.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



# Should cause a merge conflict.


cat >a <<'_ATEOF'
blah blah
_ATEOF

$at_traceoff
echo "t_rename_conflict.at:7: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add a"
echo t_rename_conflict.at:7 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_rename_conflict.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_rename_conflict.at:8: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_rename_conflict.at:8 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_conflict.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


BASE_R=`cat MT/revision`

$at_traceoff
echo "t_rename_conflict.at:11: mv a b"
echo t_rename_conflict.at:11 >$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_rename_conflict.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_rename_conflict.at:12: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename a b"
echo t_rename_conflict.at:12 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_rename_conflict.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_rename_conflict.at:13: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_rename_conflict.at:13 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_conflict.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_conflict.at:15: mv b a"
echo t_rename_conflict.at:15 >$at_check_line_file
( $at_traceon; mv b 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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename_conflict.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_rename_conflict.at:16: rm -rf MT.old"
echo t_rename_conflict.at:16 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_conflict.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_rename_conflict.at:16: mv  MT MT.old"
echo t_rename_conflict.at:16 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_conflict.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_rename_conflict.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$BASE_R ."
echo t_rename_conflict.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $BASE_R . ) >$at_stdout 2>$at_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_conflict.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_rename_conflict.at:16: mv MT.old/options MT"
echo t_rename_conflict.at:16 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_conflict.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_rename_conflict.at:16: test \$PROBE_R_SHA = \$BASE_R"
echo t_rename_conflict.at:16 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $BASE_R ) >$at_stdout 2>$at_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_conflict.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_rename_conflict.at:18: mv a c"
echo t_rename_conflict.at:18 >$at_check_line_file
( $at_traceon; mv a c ) >$at_stdout 2>$at_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_conflict.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_rename_conflict.at:19: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename a c"
echo t_rename_conflict.at:19 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename a c ) >$at_stdout 2>$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_conflict.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_conflict.at:20: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_rename_conflict.at:20 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_conflict.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_conflict.at:22: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR merge --branch=testbranch"
echo t_rename_conflict.at:22 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR merge --branch=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;;
   1) ;;
   *) echo "t_rename_conflict.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


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

  101 ) # 101. t_rename_dir_patch.at:1: merge(<patch foo/a>, <rename foo/ bar/>)
    at_setup_line='t_rename_dir_patch.at:1'
    at_desc='merge(<patch foo/a>, <rename foo/ bar/>)'
    $at_quiet $ECHO_N "101: merge(<patch foo/a>, <rename foo/ bar/>)     $ECHO_C"
    at_xfail=no
    (
      echo "101. t_rename_dir_patch.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_dir_patch.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_rename_dir_patch.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_dir_patch.at:2: exit code was $at_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_dir_patch.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_rename_dir_patch.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_dir_patch.at:2: exit code was $at_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_dir_patch.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_rename_dir_patch.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_dir_patch.at:2: exit code was $at_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_dir_patch.at:2: rm test_keys"
echo t_rename_dir_patch.at:2 >$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_dir_patch.at:2: exit code was $at_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_dir_patch.at:4: mkdir foo"
echo t_rename_dir_patch.at:4 >$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_rename_dir_patch.at:4: 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/a <<'_ATEOF'
blah blah
_ATEOF

$at_traceoff
echo "t_rename_dir_patch.at:6: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add foo/a"
echo t_rename_dir_patch.at:6 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add foo/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_rename_dir_patch.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_rename_dir_patch.at:7: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_rename_dir_patch.at:7 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_dir_patch.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


BASE_R=`cat MT/revision`

$at_traceoff
echo "t_rename_dir_patch.at:10: mv foo bar"
echo t_rename_dir_patch.at:10 >$at_check_line_file
( $at_traceon; mv 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_dir_patch.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_rename_dir_patch.at:11: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename foo bar"
echo t_rename_dir_patch.at:11 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_dir_patch.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_rename_dir_patch.at:12: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_rename_dir_patch.at:12 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_dir_patch.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_rename_dir_patch.at:14: mv bar foo"
echo t_rename_dir_patch.at:14 >$at_check_line_file
( $at_traceon; mv 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_rename_dir_patch.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_rename_dir_patch.at:15: rm -rf MT.old"
echo t_rename_dir_patch.at:15 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_dir_patch.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_rename_dir_patch.at:15: mv  MT MT.old"
echo t_rename_dir_patch.at:15 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_dir_patch.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_rename_dir_patch.at:15: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$BASE_R ."
echo t_rename_dir_patch.at:15 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $BASE_R . ) >$at_stdout 2>$at_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_dir_patch.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_rename_dir_patch.at:15: mv MT.old/options MT"
echo t_rename_dir_patch.at:15 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_dir_patch.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_rename_dir_patch.at:15: test \$PROBE_R_SHA = \$BASE_R"
echo t_rename_dir_patch.at:15 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $BASE_R ) >$at_stdout 2>$at_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_dir_patch.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




cat >foo/a <<'_ATEOF'
some other stuff
_ATEOF



$at_traceoff
echo "t_rename_dir_patch.at:19: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_rename_dir_patch.at:19 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_dir_patch.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_dir_patch.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch merge"
echo t_rename_dir_patch.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --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_rename_dir_patch.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_rename_dir_patch.at:23: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$BASE_R test_dir"
echo t_rename_dir_patch.at:23 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $BASE_R test_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_rename_dir_patch.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_rename_dir_patch.at:24: (cd test_dir && \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update --branch=testbranch)"
echo t_rename_dir_patch.at:24 >$at_check_line_file
( $at_traceon; (cd test_dir && $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR update --branch=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_rename_dir_patch.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_dir_patch.at:26: test ! -f test_dir/foo/a"
echo t_rename_dir_patch.at:26 >$at_check_line_file
( $at_traceon; test ! -f test_dir/foo/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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename_dir_patch.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_rename_dir_patch.at:27: test -f test_dir/bar/a"
echo t_rename_dir_patch.at:27 >$at_check_line_file
( $at_traceon; test -f test_dir/bar/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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename_dir_patch.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_rename_dir_patch.at:28: cmp foo/a test_dir/bar/a"
echo t_rename_dir_patch.at:28 >$at_check_line_file
( $at_traceon; cmp foo/a test_dir/bar/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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename_dir_patch.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  102 ) # 102. t_delete_dir_patch.at:1: (imp) merge(<patch foo/a>, <delete foo/>)
    at_setup_line='t_delete_dir_patch.at:1'
    at_desc='(imp) merge(<patch foo/a>, <delete foo/>)'
    $at_quiet $ECHO_N "102: (imp) merge(<patch foo/a>, <delete foo/>)    $ECHO_C"
    at_xfail=yes
    (
      echo "102. t_delete_dir_patch.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_delete_dir_patch.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_delete_dir_patch.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_delete_dir_patch.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_delete_dir_patch.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_delete_dir_patch.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_delete_dir_patch.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_delete_dir_patch.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_delete_dir_patch.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_delete_dir_patch.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_delete_dir_patch.at:2: rm test_keys"
echo t_delete_dir_patch.at:2 >$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_delete_dir_patch.at:2: 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 a bug report.


# The problem is the delete_dir is broken generally; see t_delete_dir.at.

$at_traceoff
echo "t_delete_dir_patch.at:9: mkdir foo"
echo t_delete_dir_patch.at:9 >$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_delete_dir_patch.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


cat >foo/a <<'_ATEOF'
blah blah
_ATEOF

$at_traceoff
echo "t_delete_dir_patch.at:11: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add foo/a"
echo t_delete_dir_patch.at:11 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add foo/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_delete_dir_patch.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_delete_dir_patch.at:12: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_delete_dir_patch.at:12 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_delete_dir_patch.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


BASE_R=`cat MT/revision`

$at_traceoff
echo "t_delete_dir_patch.at:15: mv foo bar"
echo t_delete_dir_patch.at:15 >$at_check_line_file
( $at_traceon; mv 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_delete_dir_patch.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_delete_dir_patch.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR drop foo"
echo t_delete_dir_patch.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_delete_dir_patch.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_delete_dir_patch.at:17: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_delete_dir_patch.at:17 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_delete_dir_patch.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_delete_dir_patch.at:19: mv bar foo"
echo t_delete_dir_patch.at:19 >$at_check_line_file
( $at_traceon; mv 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_delete_dir_patch.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_delete_dir_patch.at:20: rm -rf MT.old"
echo t_delete_dir_patch.at:20 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_delete_dir_patch.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_delete_dir_patch.at:20: mv  MT MT.old"
echo t_delete_dir_patch.at:20 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_delete_dir_patch.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_delete_dir_patch.at:20: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$BASE_R ."
echo t_delete_dir_patch.at:20 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $BASE_R . ) >$at_stdout 2>$at_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_delete_dir_patch.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_delete_dir_patch.at:20: mv MT.old/options MT"
echo t_delete_dir_patch.at:20 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_delete_dir_patch.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_delete_dir_patch.at:20: test \$PROBE_R_SHA = \$BASE_R"
echo t_delete_dir_patch.at:20 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $BASE_R ) >$at_stdout 2>$at_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_delete_dir_patch.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




cat >foo/a <<'_ATEOF'
some other stuff
_ATEOF



$at_traceoff
echo "t_delete_dir_patch.at:24: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_delete_dir_patch.at:24 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_delete_dir_patch.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_delete_dir_patch.at:26: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch merge"
echo t_delete_dir_patch.at:26 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --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_delete_dir_patch.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_delete_dir_patch.at:28: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$BASE_R test_dir"
echo t_delete_dir_patch.at:28 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $BASE_R test_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_delete_dir_patch.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_delete_dir_patch.at:29: (cd test_dir && \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update --branch=testbranch)"
echo t_delete_dir_patch.at:29 >$at_check_line_file
( $at_traceon; (cd test_dir && $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR update --branch=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_delete_dir_patch.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_delete_dir_patch.at:31: test ! -f test_dir/foo/a"
echo t_delete_dir_patch.at:31 >$at_check_line_file
( $at_traceon; test ! -f test_dir/foo/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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_delete_dir_patch.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_delete_dir_patch.at:32: test ! -f test_dir/bar/a"
echo t_delete_dir_patch.at:32 >$at_check_line_file
( $at_traceon; test ! -f test_dir/bar/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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_delete_dir_patch.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`
    ;;

  103 ) # 103. t_revert_dirs.at:1: revert directories
    at_setup_line='t_revert_dirs.at:1'
    at_desc='revert directories'
    $at_quiet $ECHO_N "103: revert directories                           $ECHO_C"
    at_xfail=no
    (
      echo "103. t_revert_dirs.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_dirs.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_revert_dirs.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_dirs.at:2: exit code was $at_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_dirs.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_revert_dirs.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_dirs.at:2: exit code was $at_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_dirs.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_revert_dirs.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_dirs.at:2: exit code was $at_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_dirs.at:2: rm test_keys"
echo t_revert_dirs.at:2 >$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_dirs.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



# reverting files deeper in the directory tree with only some leading
# components of their relative path specified

$at_traceoff
echo "t_revert_dirs.at:7: mkdir -p abc/def/ghi"
echo t_revert_dirs.at:7 >$at_check_line_file
( $at_traceon; mkdir -p abc/def/ghi ) >$at_stdout 2>$at_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_dirs.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 >abc/def/ghi/file <<'_ATEOF'
deep deep snow
_ATEOF

$at_traceoff
echo "t_revert_dirs.at:10: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add abc/def/ghi/file"
echo t_revert_dirs.at:10 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add abc/def/ghi/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_dirs.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_revert_dirs.at:11: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message='deep file' --branch=test"
echo t_revert_dirs.at:11 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message='deep file' --branch=test ) >$at_stdout 2>$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_dirs.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

cat >abc/def/ghi/file <<'_ATEOF'
deep deep mud
_ATEOF

$at_traceoff
echo "t_revert_dirs.at:14: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_revert_dirs.at:14 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_dirs.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_revert_dirs.at:15: grep abc/def/ghi/file stdout"
echo t_revert_dirs.at:15 >$at_check_line_file
( $at_traceon; grep abc/def/ghi/file 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_dirs.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_revert_dirs.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR revert abc/def"
echo t_revert_dirs.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR revert abc/def ) >$at_stdout 2>$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_dirs.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_revert_dirs.at:17: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_revert_dirs.at:17 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_dirs.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_revert_dirs.at:18: grep abc/def/ghi/file stdout"
echo t_revert_dirs.at:18 >$at_check_line_file
( $at_traceon; grep abc/def/ghi/file 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_dirs.at:18: 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`
    ;;

  104 ) # 104. t_revert_rename.at:1: revert renames
    at_setup_line='t_revert_rename.at:1'
    at_desc='revert renames'
    $at_quiet $ECHO_N "104: revert renames                               $ECHO_C"
    at_xfail=no
    (
      echo "104. t_revert_rename.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_rename.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_revert_rename.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_rename.at:2: exit code was $at_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_rename.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_revert_rename.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_rename.at:2: exit code was $at_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_rename.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_revert_rename.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_rename.at:2: exit code was $at_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_rename.at:2: rm test_keys"
echo t_revert_rename.at:2 >$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_rename.at:2: 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_rename.at:7: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile0"
echo t_revert_rename.at:7 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_rename.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

V1=`monotone --norc identify testfile0`
$at_traceoff
echo "t_revert_rename.at:9: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message='blah blah'"
echo t_revert_rename.at:9 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message='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_rename.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


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

$at_traceoff
echo "t_revert_rename.at:13: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename testfile0 foofile0"
echo t_revert_rename.at:13 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename testfile0 foofile0 ) >$at_stdout 2>$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_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_revert_rename.at:14: grep testfile0 MT/work"
echo t_revert_rename.at:14 >$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_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

$at_traceoff
echo "t_revert_rename.at:15: grep foofile0 MT/work"
echo t_revert_rename.at:15 >$at_check_line_file
( $at_traceon; grep foofile0 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_rename.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_revert_rename.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_revert_rename.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_rename.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_revert_rename.at:17: grep testfile0 stdout"
echo t_revert_rename.at:17 >$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_rename.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_revert_rename.at:18: grep foofile0 stdout"
echo t_revert_rename.at:18 >$at_check_line_file
( $at_traceon; grep foofile0 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_rename.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_revert_rename.at:19: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR revert foofile0"
echo t_revert_rename.at:19 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR revert foofile0 ) >$at_stdout 2>$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_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_revert_rename.at:20: test ! -e MT/work"
echo t_revert_rename.at:20 >$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_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_revert_rename.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_revert_rename.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_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

$at_traceoff
echo "t_revert_rename.at:22: grep testfile0 stdout"
echo t_revert_rename.at:22 >$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_rename.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

$at_traceoff
echo "t_revert_rename.at:23: grep foofile0 stdout"
echo t_revert_rename.at:23 >$at_check_line_file
( $at_traceon; grep foofile0 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_rename.at:23: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


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

$at_traceoff
echo "t_revert_rename.at:27: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename testfile0 foofile0"
echo t_revert_rename.at:27 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename testfile0 foofile0 ) >$at_stdout 2>$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_rename.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_revert_rename.at:28: grep testfile0 MT/work"
echo t_revert_rename.at:28 >$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_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_revert_rename.at:29: grep foofile0 MT/work"
echo t_revert_rename.at:29 >$at_check_line_file
( $at_traceon; grep foofile0 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_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

$at_traceoff
echo "t_revert_rename.at:30: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_revert_rename.at:30 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_rename.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_rename.at:31: grep testfile0 stdout"
echo t_revert_rename.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_rename.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_rename.at:32: grep foofile0 stdout"
echo t_revert_rename.at:32 >$at_check_line_file
( $at_traceon; grep foofile0 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_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_revert_rename.at:33: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR revert testfile0"
echo t_revert_rename.at:33 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_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_revert_rename.at:34: test ! -e MT/work"
echo t_revert_rename.at:34 >$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_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_revert_rename.at:35: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_revert_rename.at:35 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_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_revert_rename.at:36: grep testfile0 stdout"
echo t_revert_rename.at:36 >$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_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_revert_rename.at:37: grep foofile0 stdout"
echo t_revert_rename.at:37 >$at_check_line_file
( $at_traceon; grep foofile0 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_rename.at:37: 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`
    ;;

  105 ) # 105. t_revert_unchanged.at:3: revert unchanged file preserves mtime
    at_setup_line='t_revert_unchanged.at:3'
    at_desc='revert unchanged file preserves mtime'
    $at_quiet $ECHO_N "105: revert unchanged file preserves mtime        $ECHO_C"
    at_xfail=no
    (
      echo "105. t_revert_unchanged.at:3: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_unchanged.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_revert_unchanged.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_unchanged.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_unchanged.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_revert_unchanged.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_unchanged.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_unchanged.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_revert_unchanged.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_unchanged.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_unchanged.at:5: rm test_keys"
echo t_revert_unchanged.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_unchanged.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 >file1 <<'_ATEOF'
file 1 version 1
_ATEOF

cat >time1 <<'_ATEOF'
time point 1
_ATEOF


$at_traceoff
echo "t_revert_unchanged.at:12: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add file1"
echo t_revert_unchanged.at:12 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add file1 ) >$at_stdout 2>$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_unchanged.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_revert_unchanged.at:13: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message='blah blah'"
echo t_revert_unchanged.at:13 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message='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_unchanged.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


# ensure file modification time changes are detected

$at_traceoff
echo "t_revert_unchanged.at:17: sleep 2"
echo t_revert_unchanged.at:17 >$at_check_line_file
( $at_traceon; sleep 2 ) >$at_stdout 2>$at_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_unchanged.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

cat >file1 <<'_ATEOF'
file 1 version 2
_ATEOF


$at_traceoff
echo "t_revert_unchanged.at:21: ls -l"
echo t_revert_unchanged.at:21 >$at_check_line_file
( $at_traceon; ls -l ) >$at_stdout 2>$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_unchanged.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_revert_unchanged.at:22: find . -newer time1"
echo t_revert_unchanged.at:22 >$at_check_line_file
( $at_traceon; find . -newer time1 ) >$at_stdout 2>$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_revert_unchanged.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_revert_unchanged.at:23: grep file1 stdout"
echo t_revert_unchanged.at:23 >$at_check_line_file
( $at_traceon; grep file1 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_revert_unchanged.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 the file and ensure that its modification time changes

cat >time2 <<'_ATEOF'
time point 2
_ATEOF


$at_traceoff
echo "t_revert_unchanged.at:30: sleep 2"
echo t_revert_unchanged.at:30 >$at_check_line_file
( $at_traceon; sleep 2 ) >$at_stdout 2>$at_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_unchanged.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_unchanged.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR revert file1"
echo t_revert_unchanged.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR revert file1 ) >$at_stdout 2>$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_unchanged.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_unchanged.at:33: ls -l"
echo t_revert_unchanged.at:33 >$at_check_line_file
( $at_traceon; ls -l ) >$at_stdout 2>$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_unchanged.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_unchanged.at:34: find . -newer time2"
echo t_revert_unchanged.at:34 >$at_check_line_file
( $at_traceon; find . -newer time2 ) >$at_stdout 2>$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_revert_unchanged.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_unchanged.at:35: grep file1 stdout"
echo t_revert_unchanged.at:35 >$at_check_line_file
( $at_traceon; grep file1 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_revert_unchanged.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


# revert the file again and ensure that its modification time does NOT change

cat >time3 <<'_ATEOF'
time point 3
_ATEOF


$at_traceoff
echo "t_revert_unchanged.at:42: sleep 1"
echo t_revert_unchanged.at:42 >$at_check_line_file
( $at_traceon; sleep 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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_revert_unchanged.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_unchanged.at:43: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR revert file1"
echo t_revert_unchanged.at:43 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR revert file1 ) >$at_stdout 2>$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_unchanged.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_unchanged.at:45: ls -l"
echo t_revert_unchanged.at:45 >$at_check_line_file
( $at_traceon; ls -l ) >$at_stdout 2>$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_unchanged.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_unchanged.at:46: find . -newer time3"
echo t_revert_unchanged.at:46 >$at_check_line_file
( $at_traceon; find . -newer time3 ) >$at_stdout 2>$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_revert_unchanged.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_unchanged.at:47: grep file1 stdout"
echo t_revert_unchanged.at:47 >$at_check_line_file
( $at_traceon; grep file1 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;;
   1) ;;
   *) echo "t_revert_unchanged.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


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

  106 ) # 106. t_cdiff.at:1: (minor) context diff
    at_setup_line='t_cdiff.at:1'
    at_desc='(minor) context diff'
    $at_quiet $ECHO_N "106: (minor) context diff                         $ECHO_C"
    at_xfail=yes
    (
      echo "106. t_cdiff.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_cdiff.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_cdiff.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_cdiff.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cdiff.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_cdiff.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_cdiff.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cdiff.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_cdiff.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_cdiff.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cdiff.at:2: rm test_keys"
echo t_cdiff.at:2 >$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_cdiff.at:2: 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 a bug report.



# There is a new cdiff command, but  not tests for it at all.  We need
# at least one test for it, probably more, to make sure it gives valid
# output in all cases.

$at_traceoff
echo "t_cdiff.at:12: false"
echo t_cdiff.at:12 >$at_check_line_file
( $at_traceon; false ) >$at_stdout 2>$at_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_cdiff.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  107 ) # 107. t_no_rename_overwrite.at:1: rename cannot overwrite files
    at_setup_line='t_no_rename_overwrite.at:1'
    at_desc='rename cannot overwrite files'
    $at_quiet $ECHO_N "107: rename cannot overwrite files                $ECHO_C"
    at_xfail=yes
    (
      echo "107. t_no_rename_overwrite.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_no_rename_overwrite.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_no_rename_overwrite.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_no_rename_overwrite.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_no_rename_overwrite.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_no_rename_overwrite.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_no_rename_overwrite.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_no_rename_overwrite.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_no_rename_overwrite.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_no_rename_overwrite.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_no_rename_overwrite.at:2: rm test_keys"
echo t_no_rename_overwrite.at:2 >$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_no_rename_overwrite.at:2: 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 a bug report.


# "rename" needs to check that it isn't overwriting existing
# files/directories.


cat >"target_file" <<'_ATEOF'
blah blah
_ATEOF

$at_traceoff
echo "t_no_rename_overwrite.at:11: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add \"target_file\""
echo t_no_rename_overwrite.at:11 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add "target_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_no_rename_overwrite.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_no_rename_overwrite.at:12: mkdir target_dir"
echo t_no_rename_overwrite.at:12 >$at_check_line_file
( $at_traceon; mkdir target_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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_no_rename_overwrite.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


cat >"target_dir/subfile" <<'_ATEOF'
stuff stuff
_ATEOF

$at_traceoff
echo "t_no_rename_overwrite.at:14: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add \"target_dir/subfile\""
echo t_no_rename_overwrite.at:14 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add "target_dir/subfile" ) >$at_stdout 2>$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_no_rename_overwrite.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




cat >"rename_file" <<'_ATEOF'
foo foo
_ATEOF

$at_traceoff
echo "t_no_rename_overwrite.at:17: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add \"rename_file\""
echo t_no_rename_overwrite.at:17 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add "rename_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_no_rename_overwrite.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_no_rename_overwrite.at:18: mkdir rename_dir"
echo t_no_rename_overwrite.at:18 >$at_check_line_file
( $at_traceon; mkdir rename_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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_no_rename_overwrite.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 >"rename_dir/file" <<'_ATEOF'
bar bar
_ATEOF

$at_traceoff
echo "t_no_rename_overwrite.at:20: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add \"rename_dir/file\""
echo t_no_rename_overwrite.at:20 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add "rename_dir/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_no_rename_overwrite.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_no_rename_overwrite.at:22: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename rename_file target_file"
echo t_no_rename_overwrite.at:22 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename rename_file target_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;;
   3) ;;
   *) echo "t_no_rename_overwrite.at:22: exit code was $at_status, expected 3"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_no_rename_overwrite.at:23: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename rename_file target_dir"
echo t_no_rename_overwrite.at:23 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename rename_file target_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;;
   3) ;;
   *) echo "t_no_rename_overwrite.at:23: exit code was $at_status, expected 3"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_no_rename_overwrite.at:24: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename rename_dir target_file"
echo t_no_rename_overwrite.at:24 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename rename_dir target_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;;
   3) ;;
   *) echo "t_no_rename_overwrite.at:24: exit code was $at_status, expected 3"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_no_rename_overwrite.at:25: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename rename_dir target_dir"
echo t_no_rename_overwrite.at:25 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename rename_dir target_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;;
   3) ;;
   *) echo "t_no_rename_overwrite.at:25: exit code was $at_status, expected 3"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_no_rename_overwrite.at:27: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_no_rename_overwrite.at:27 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_no_rename_overwrite.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_no_rename_overwrite.at:29: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename rename_file target_file"
echo t_no_rename_overwrite.at:29 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename rename_file target_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_no_rename_overwrite.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_no_rename_overwrite.at:30: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename rename_file target_dir"
echo t_no_rename_overwrite.at:30 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename rename_file target_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_no_rename_overwrite.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_no_rename_overwrite.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename rename_dir target_file"
echo t_no_rename_overwrite.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename rename_dir target_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_no_rename_overwrite.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_no_rename_overwrite.at:32: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename rename_dir target_dir"
echo t_no_rename_overwrite.at:32 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename rename_dir target_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_no_rename_overwrite.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


# this should fail

$at_traceoff
echo "t_no_rename_overwrite.at:35: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_no_rename_overwrite.at:35 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_no_rename_overwrite.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`
    ;;

  108 ) # 108. t_checkout_noop_on_fail.at:1: failed checkout is a no-op
    at_setup_line='t_checkout_noop_on_fail.at:1'
    at_desc='failed checkout is a no-op'
    $at_quiet $ECHO_N "108: failed checkout is a no-op                   $ECHO_C"
    at_xfail=no
    (
      echo "108. t_checkout_noop_on_fail.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_checkout_noop_on_fail.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_checkout_noop_on_fail.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_checkout_noop_on_fail.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_checkout_noop_on_fail.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_checkout_noop_on_fail.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_checkout_noop_on_fail.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_checkout_noop_on_fail.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_checkout_noop_on_fail.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_checkout_noop_on_fail.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_checkout_noop_on_fail.at:2: rm test_keys"
echo t_checkout_noop_on_fail.at:2 >$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_checkout_noop_on_fail.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



# If a checkout fails, no target directory should be created, and if
# the checkout directory already exists, no MT/ directory should be
# created.

$at_traceoff
echo "t_checkout_noop_on_fail.at:8: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout bogus-id outdir"
echo t_checkout_noop_on_fail.at:8 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout bogus-id outdir ) >$at_stdout 2>$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_checkout_noop_on_fail.at:8: 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_checkout_noop_on_fail.at:9: test ! -e outdir"
echo t_checkout_noop_on_fail.at:9 >$at_check_line_file
( $at_traceon; test ! -e outdir ) >$at_stdout 2>$at_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_checkout_noop_on_fail.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_checkout_noop_on_fail.at:10: mkdir outdir"
echo t_checkout_noop_on_fail.at:10 >$at_check_line_file
( $at_traceon; mkdir outdir ) >$at_stdout 2>$at_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_checkout_noop_on_fail.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_checkout_noop_on_fail.at:11: (cd outdir && \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout bogus-id .)"
echo t_checkout_noop_on_fail.at:11 >$at_check_line_file
( $at_traceon; (cd outdir && $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout bogus-id .) ) >$at_stdout 2>$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_checkout_noop_on_fail.at:11: 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_checkout_noop_on_fail.at:12: test ! -e outdir/MT"
echo t_checkout_noop_on_fail.at:12 >$at_check_line_file
( $at_traceon; test ! -e outdir/MT ) >$at_stdout 2>$at_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_checkout_noop_on_fail.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  109 ) # 109. t_monotone_agent.at:1: (todo) write monotone-agent
    at_setup_line='t_monotone_agent.at:1'
    at_desc='(todo) write monotone-agent'
    $at_quiet $ECHO_N "109: (todo) write monotone-agent                  $ECHO_C"
    at_xfail=yes
    (
      echo "109. t_monotone_agent.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_monotone_agent.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_monotone_agent.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_monotone_agent.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_monotone_agent.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_monotone_agent.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_monotone_agent.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_monotone_agent.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_monotone_agent.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_monotone_agent.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_monotone_agent.at:2: rm test_keys"
echo t_monotone_agent.at:2 >$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_monotone_agent.at:2: 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 a bug report.


# Todo:
# 1) Write monotone-agent
# 2) Write tests for it here
#
# Desired user experience:
#   - start the agent at login time
#     (it would be nice if we could spawn it automatically the first
#     time monotone is run, but then how would we communicate the
#     agent's address to independent processes?  and cause it to exit
#     when the session ends?)
#   - first time monotone needs to sign something, it prompts for a
#     passphrase
#   - second and later times monotone needs to sign something, no
#     passphrase is necessary (even if the second time is in a
#     different monotone process entirely)
#   - probably have some command that does nothing except prompt for a
#     passphrase, so people who want to type it once at the beginning
#     of a session can do that.
#
# Internal design:
#   - agent opens an access controlled unix-domain socket (what's the
#     windows equivalent?  cf. pageant below)
#   - an environment variable saves the socket (and pid, I suppose,
#     for cleanup), like ssh-agent (again, what's the windows
#     equivalent?)
#   - when monotone wants to sign something, it checks to see if the
#     agent has the private key.
#     - if it does, then monotone sends the agent the data to be
#       signed, and waits for the response
#     - if it doesn't, then monotone requests the passphrase, decrypts
#       the key, sends the key to the agent, and then either goes to
#       the above step (maybe simpler) or just signs the data itself
#       (maybe faster)
#   - so the agent needs protocol packets:
#     - do you have key <hash>?
#       - response
#     - sign data <data> (or just hash of data <hash>) with key <hash>
#       - response
#     - add key <hash> <key pieces>
#       - response
#     - for debugging, might want 'list keys' and 'remove key'; 'list
#       keys' probably means agent should store key ids too?  depends
#       on how debuggish it is, I guess.
#   - note that this design assumes that monotone will have
#     independent access to the list of keys, and so doesn't need to
#     get the ids and hashes from the agent.  this seems reasonable,
#     at least for a first pass; it should be simpler to code, and the
#     cases where it fails (e.g., agent forwarding) don't seem very
#     compelling to me.
#
# Other similar projects to steal ideas from:
#   - ssh-agent in openssh
#     their protocol is documented in
#     draft-ylonen-ssh-protocol-00.txt.  It's simple enough that this
#     isn't that useful, though.  (Unfortunately, ssh-agent provides
#     challenge-responses, not signatures, so we can't use it
#     directly.  Using it directly would have been much nicer.  I
#     suppose in the long run we could try and convince the ssh-agent
#     people that providing signing services for some keys might be
#     generally useful...)
#     It's not clear that signing services are something you
#     want to forward to other machines, though, even if
#     challenge-response services are...
#   - "pageant" in putty is a ssh-agent that works on Windows
#     - how does this work in windows, with no SSH_AUTH_SOCK and no
#       unix-domain sockets?
#   - codeville has an agent implementation too

$at_traceoff
echo "t_monotone_agent.at:75: false"
echo t_monotone_agent.at:75 >$at_check_line_file
( $at_traceon; false ) >$at_stdout 2>$at_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_monotone_agent.at:75: exit code 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`
    ;;

  110 ) # 110. t_approval_semantics.at:1: (todo) design approval semantics
    at_setup_line='t_approval_semantics.at:1'
    at_desc='(todo) design approval semantics'
    $at_quiet $ECHO_N "110: (todo) design approval semantics             $ECHO_C"
    at_xfail=yes
    (
      echo "110. t_approval_semantics.at:1: testing ..."
      $at_traceon


# This test is a bug report.


# There's a somewhat subtle issue about approval, branch membership,
# etc.  The way I (njs) had been thinking about things originally, a
# revision R is in a branch B iff there's a valid trusted cert cert(R,
# "branch", B).  So, currently e.g. 'propagate' will skip performing a
# merge in some cases and instead just stick a new branch cert on the
# head that's being propagated, and 'update' will skip past non-branch
# nodes to reach branch nodes.
#
# graydon points out, though, that 'update's original semantics, of
# _not_ skipping past non-branch revisions, was intentional.  because
# branch certs show approval, and in real life people always look at
# and approve diffs, not tree-states.  so update should only follow
# continuous paths of approval.
#
# currently, 'update' still will skip past non-branch revisions, since
# other parts of the code assume that this is how branches work, and I
# (njs again) figured it would be better to let things be consistent
# while we figure out what should really happen.  but, that approval
# inherently happens on edges is a critical point, and we should
# address it somehow.
#
# there are some subtleties to it, though.  some things came up on IRC:

# #monotone, Jan 23:
# <njs>     graydon: here's a question about branch-as-approval
# <njs>     graydon: should 'heads' be changed to be 'greatest descendent of a privileged root'?
# <njs>     (s/descendent/descendent with a continuous chain of branch certs from that root/)
# <graydon> possibly.
# <graydon> possibly once we know what "priviledged" means :)
# <graydon> or privileged, depending on whether I learn to spell
# <njs>     one could do it with the lookaside trust branch model, have a table for each branch specifying which revision is considered the root

# <njs> if we have A -> B -> C, B -> D -> E, where everything except D has appropriate approval, should "monotone merge" cherrypick D -> E onto C? :-)
# <njs> (on the theory that merge is supposed to gather up all approved revisions into one head)
# <njs> hmm, and if someone does say "disapprove D", they have to also say "approve D" for it to work!
# <graydon> heh
# <graydon> both interesting issues
# <graydon> don't know. I'm not sure about either.


# TODO: figure out how all this should work.
# solution should support projects with different sorts of
# workflows/approval requirements...

$at_traceoff
echo "t_approval_semantics.at:50: false"
echo t_approval_semantics.at:50 >$at_check_line_file
( $at_traceon; false ) >$at_stdout 2>$at_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_approval_semantics.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`
    ;;

  111 ) # 111. t_rebuild.at:1: db rebuild
    at_setup_line='t_rebuild.at:1'
    at_desc='db rebuild'
    $at_quiet $ECHO_N "111: db rebuild                                   $ECHO_C"
    at_xfail=no
    (
      echo "111. t_rebuild.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_rebuild.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_rebuild.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_rebuild.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_rebuild.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_rebuild.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_rebuild.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_rebuild.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_rebuild.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_rebuild.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_rebuild.at:2: rm test_keys"
echo t_rebuild.at:2 >$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_rebuild.at:2: 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 sure 'db rebuild' does something reasonable.


cat >foo <<'_ATEOF'
blha blah
_ATEOF

$at_traceoff
echo "t_rebuild.at:7: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add foo"
echo t_rebuild.at:7 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_rebuild.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 >bar <<'_ATEOF'
asdfasd
_ATEOF

$at_traceoff
echo "t_rebuild.at:9: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add bar"
echo t_rebuild.at:9 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add 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_rebuild.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



cat >baz <<'_ATEOF'
8303
_ATEOF

$at_traceoff
echo "t_rebuild.at:11: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add baz"
echo t_rebuild.at:11 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add baz ) >$at_stdout 2>$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_rebuild.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



cat >quux <<'_ATEOF'
booga booga
_ATEOF

$at_traceoff
echo "t_rebuild.at:13: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add quux"
echo t_rebuild.at:13 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add quux ) >$at_stdout 2>$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_rebuild.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_rebuild.at:14: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_rebuild.at:14 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_rebuild.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


BASE_R=`cat MT/revision`

$at_traceoff
echo "t_rebuild.at:17: mv quux renamed-quux"
echo t_rebuild.at:17 >$at_check_line_file
( $at_traceon; mv quux renamed-quux ) >$at_stdout 2>$at_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_rebuild.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_rebuild.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename quux renamed-quux"
echo t_rebuild.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename quux renamed-quux ) >$at_stdout 2>$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_rebuild.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 >otherthingie <<'_ATEOF'
basdf
_ATEOF

$at_traceoff
echo "t_rebuild.at:20: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add otherthingie"
echo t_rebuild.at:20 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add otherthingie ) >$at_stdout 2>$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_rebuild.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_rebuild.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR drop bar"
echo t_rebuild.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_rebuild.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_rebuild.at:22: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_rebuild.at:22 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_rebuild.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_rebuild.at:24: cp baz baz.original"
echo t_rebuild.at:24 >$at_check_line_file
( $at_traceon; cp baz baz.original ) >$at_stdout 2>$at_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_rebuild.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


cat >baz <<'_ATEOF'
otherstuff
_ATEOF


$at_traceoff
echo "t_rebuild.at:27: cp baz baz.otherbranch"
echo t_rebuild.at:27 >$at_check_line_file
( $at_traceon; cp baz baz.otherbranch ) >$at_stdout 2>$at_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_rebuild.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_rebuild.at:28: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=otherbranch commit --message blah-blah"
echo t_rebuild.at:28 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=otherbranch commit --message 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_rebuild.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_rebuild.at:30: rm -rf MT.old"
echo t_rebuild.at:30 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_rebuild.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_rebuild.at:30: mv  MT MT.old"
echo t_rebuild.at:30 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_rebuild.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_rebuild.at:30: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$BASE_R ."
echo t_rebuild.at:30 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $BASE_R . ) >$at_stdout 2>$at_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_rebuild.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_rebuild.at:30: mv MT.old/options MT"
echo t_rebuild.at:30 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_rebuild.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_rebuild.at:30: test \$PROBE_R_SHA = \$BASE_R"
echo t_rebuild.at:30 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $BASE_R ) >$at_stdout 2>$at_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_rebuild.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




cat >stuffstuff <<'_ATEOF'
lalalalala
_ATEOF

$at_traceoff
echo "t_rebuild.at:33: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add stuffstuff"
echo t_rebuild.at:33 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add stuffstuff ) >$at_stdout 2>$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_rebuild.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_rebuild.at:34: cp foo foo.original"
echo t_rebuild.at:34 >$at_check_line_file
( $at_traceon; cp foo foo.original ) >$at_stdout 2>$at_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_rebuild.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


cat >foo <<'_ATEOF'
thingiethingie
_ATEOF



$at_traceoff
echo "t_rebuild.at:37: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_rebuild.at:37 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_rebuild.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


NEW_BASE_R=`cat MT/revision`

$at_traceoff
echo "t_rebuild.at:40: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR merge --branch=testbranch"
echo t_rebuild.at:40 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR merge --branch=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_rebuild.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

# get renamed-quux out of the way for update
$at_traceoff
echo "t_rebuild.at:42: mv renamed-quux orig-renamed-quux"
echo t_rebuild.at:42 >$at_check_line_file
( $at_traceon; mv renamed-quux orig-renamed-quux ) >$at_stdout 2>$at_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_rebuild.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_rebuild.at:43: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update"
echo t_rebuild.at:43 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_rebuild.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_rebuild.at:44: test \$NEW_BASE_R != \`cat MT/revision\`"
echo t_rebuild.at:44 >$at_check_line_file
( $at_traceon; test $NEW_BASE_R != `cat MT/revision` ) >$at_stdout 2>$at_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_rebuild.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_rebuild.at:46: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR complete manifest \"\""
echo t_rebuild.at:46 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR complete 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rebuild.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_rebuild.at:47: mv stdout old.manifests"
echo t_rebuild.at:47 >$at_check_line_file
( $at_traceon; mv stdout old.manifests ) >$at_stdout 2>$at_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_rebuild.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_rebuild.at:48: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR complete revision \"\""
echo t_rebuild.at:48 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR complete revision "" ) >$at_stdout 2>$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_rebuild.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_rebuild.at:49: mv stdout old.revisions"
echo t_rebuild.at:49 >$at_check_line_file
( $at_traceon; mv stdout old.revisions ) >$at_stdout 2>$at_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_rebuild.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


# Rebuild
$at_traceoff
echo "t_rebuild.at:52: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db rebuild"
echo t_rebuild.at:52 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR db rebuild ) >$at_stdout 2>$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_rebuild.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


# Verify stuff is the same
$at_traceoff
echo "t_rebuild.at:55: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR complete manifest \"\""
echo t_rebuild.at:55 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR complete 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rebuild.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_rebuild.at:56: cmp stdout old.manifests"
echo t_rebuild.at:56 >$at_check_line_file
( $at_traceon; cmp stdout old.manifests ) >$at_stdout 2>$at_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_rebuild.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_rebuild.at:57: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR complete revision \"\""
echo t_rebuild.at:57 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR complete revision "" ) >$at_stdout 2>$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_rebuild.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_rebuild.at:58: test \`wc -l <stdout\` = \`wc -l <old.revisions\`"
echo t_rebuild.at:58 >$at_check_line_file
( $at_traceon; test `wc -l <stdout` = `wc -l <old.revisions` ) >$at_stdout 2>$at_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_rebuild.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_rebuild.at:60: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout --branch=testbranch tb"
echo t_rebuild.at:60 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout --branch=testbranch tb ) >$at_stdout 2>$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_rebuild.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_rebuild.at:62: cmp foo tb/foo"
echo t_rebuild.at:62 >$at_check_line_file
( $at_traceon; cmp foo tb/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_rebuild.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_rebuild.at:63: test ! -e tb/bar"
echo t_rebuild.at:63 >$at_check_line_file
( $at_traceon; test ! -e tb/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_rebuild.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_rebuild.at:64: cmp baz.original tb/baz"
echo t_rebuild.at:64 >$at_check_line_file
( $at_traceon; cmp baz.original tb/baz ) >$at_stdout 2>$at_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_rebuild.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
echo "t_rebuild.at:65: cmp renamed-quux tb/renamed-quux"
echo t_rebuild.at:65 >$at_check_line_file
( $at_traceon; cmp renamed-quux tb/renamed-quux ) >$at_stdout 2>$at_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_rebuild.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

$at_traceoff
echo "t_rebuild.at:66: cmp otherthingie tb/otherthingie"
echo t_rebuild.at:66 >$at_check_line_file
( $at_traceon; cmp otherthingie tb/otherthingie ) >$at_stdout 2>$at_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_rebuild.at:66: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_rebuild.at:68: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout --branch=otherbranch ob"
echo t_rebuild.at:68 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout --branch=otherbranch ob ) >$at_stdout 2>$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_rebuild.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_rebuild.at:70: cmp foo.original ob/foo"
echo t_rebuild.at:70 >$at_check_line_file
( $at_traceon; cmp foo.original ob/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_rebuild.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_rebuild.at:71: test ! -e ob/bar"
echo t_rebuild.at:71 >$at_check_line_file
( $at_traceon; test ! -e ob/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_rebuild.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_rebuild.at:72: cmp baz.otherbranch ob/baz"
echo t_rebuild.at:72 >$at_check_line_file
( $at_traceon; cmp baz.otherbranch ob/baz ) >$at_stdout 2>$at_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_rebuild.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_rebuild.at:73: cmp renamed-quux ob/renamed-quux"
echo t_rebuild.at:73 >$at_check_line_file
( $at_traceon; cmp renamed-quux ob/renamed-quux ) >$at_stdout 2>$at_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_rebuild.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_rebuild.at:74: cmp otherthingie ob/otherthingie"
echo t_rebuild.at:74 >$at_check_line_file
( $at_traceon; cmp otherthingie ob/otherthingie ) >$at_stdout 2>$at_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_rebuild.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  112 ) # 112. t_lua_privkey.at:1: reading private keys from lua hooks
    at_setup_line='t_lua_privkey.at:1'
    at_desc='reading private keys from lua hooks'
    $at_quiet $ECHO_N "112: reading private keys from lua hooks          $ECHO_C"
    at_xfail=no
    (
      echo "112. t_lua_privkey.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_lua_privkey.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_lua_privkey.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_lua_privkey.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_lua_privkey.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_lua_privkey.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_lua_privkey.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_lua_privkey.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_lua_privkey.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_lua_privkey.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_lua_privkey.at:2: rm test_keys"
echo t_lua_privkey.at:2 >$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_lua_privkey.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_lua_privkey.at:4: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR privkey tester@test.net > privkey"
echo t_lua_privkey.at:4 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR privkey tester@test.net > privkey ) >$at_stdout 2>$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_lua_privkey.at:4: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


KEY=tester@test.net


# check it works originally


cat >testfile <<'_ATEOF'
acc murphy woz 'ere
_ATEOF

$at_traceoff
echo "t_lua_privkey.at:12: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_lua_privkey.at:12 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_lua_privkey.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_lua_privkey.at:13: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=a commit --message blah-blah"
echo t_lua_privkey.at:13 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=a commit --message 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_lua_privkey.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


SOMEREV=`cat MT/revision`

# check that it works with just the rcfile key

# m4 note: [ is equiv to [, ] is equiv to ]
$at_traceoff
echo "t_lua_privkey.at:19: cp \$_ROOT_DIR/test_hooks.lua test_key_hooks.lua"
echo t_lua_privkey.at:19 >$at_check_line_file
( $at_traceon; cp $_ROOT_DIR/test_hooks.lua test_key_hooks.lua ) >$at_stdout 2>$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_lua_privkey.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_lua_privkey.at:20: echo \"function get_priv_key(keyid)\" >> test_key_hooks.lua"
echo t_lua_privkey.at:20 >$at_check_line_file
( $at_traceon; echo "function get_priv_key(keyid)" >> test_key_hooks.lua ) >$at_stdout 2>$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_lua_privkey.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_lua_privkey.at:21: echo 'return [[ ' >> test_key_hooks.lua"
echo t_lua_privkey.at:21 >$at_check_line_file
( $at_traceon; echo 'return [[ ' >> test_key_hooks.lua ) >$at_stdout 2>$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_lua_privkey.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_lua_privkey.at:22: grep -v '\\[' privkey >> test_key_hooks.lua"
echo t_lua_privkey.at:22 >$at_check_line_file
( $at_traceon; grep -v '\[' privkey >> test_key_hooks.lua ) >$at_stdout 2>$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_lua_privkey.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_lua_privkey.at:23: echo '	]] end' >> test_key_hooks.lua"
echo t_lua_privkey.at:23 >$at_check_line_file
( $at_traceon; echo '	]] end' >> test_key_hooks.lua ) >$at_stdout 2>$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_lua_privkey.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_lua_privkey.at:25: monotone --rcfile=test_key_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net db execute \"delete from private_keys\""
echo t_lua_privkey.at:25 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_key_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net db execute "delete from private_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_lua_privkey.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_lua_privkey.at:27: monotone --rcfile=test_key_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net comment \$SOMEREV boing"
echo t_lua_privkey.at:27 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_key_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net comment $SOMEREV boing ) >$at_stdout 2>$at_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_lua_privkey.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


# check it works if both keys exist and match (after base64 decoding)
$at_traceoff
echo "t_lua_privkey.at:30: monotone --rcfile=test_key_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net read < privkey"
echo t_lua_privkey.at:30 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_key_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net read < privkey ) >$at_stdout 2>$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_lua_privkey.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_lua_privkey.at:32: monotone --rcfile=test_key_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net comment \$SOMEREV matching"
echo t_lua_privkey.at:32 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_key_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net comment $SOMEREV matching ) >$at_stdout 2>$at_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_lua_privkey.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


# check that it fails if the keys differ
$at_traceoff
echo "t_lua_privkey.at:35: monotone --rcfile=test_key_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net db execute \"delete from private_keys\""
echo t_lua_privkey.at:35 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_key_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net db execute "delete from private_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_lua_privkey.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_lua_privkey.at:36: monotone --rcfile=test_key_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net db execute \"delete from public_keys\""
echo t_lua_privkey.at:36 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_key_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net db execute "delete from public_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_lua_privkey.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_lua_privkey.at:37: (echo \$KEY; echo \$KEY) | monotone --rcfile=test_key_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net genkey \$KEY"
echo t_lua_privkey.at:37 >$at_check_line_file
( $at_traceon; (echo $KEY; echo $KEY) | monotone --rcfile=test_key_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net genkey $KEY ) >$at_stdout 2>$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_lua_privkey.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_lua_privkey.at:39: monotone --rcfile=test_key_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net comment \$SOMEREV aintworking"
echo t_lua_privkey.at:39 >$at_check_line_file
( $at_traceon; monotone --rcfile=test_key_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net comment $SOMEREV aintworking ) >$at_stdout 2>$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_lua_privkey.at:39: 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`
    ;;

  113 ) # 113. t_i18n_changelog.at:3: committing with a non-english message
    at_setup_line='t_i18n_changelog.at:3'
    at_desc='committing with a non-english message'
    $at_quiet $ECHO_N "113: committing with a non-english message        $ECHO_C"
    at_xfail=no
    (
      echo "113. t_i18n_changelog.at:3: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_changelog.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_i18n_changelog.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_changelog.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_changelog.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_i18n_changelog.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_changelog.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_changelog.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_i18n_changelog.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_changelog.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_changelog.at:5: rm test_keys"
echo t_i18n_changelog.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_changelog.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"`

export CHARSET=utf-8

cat >a <<'_ATEOF'
hello there
_ATEOF

$at_traceoff
echo "t_i18n_changelog.at:14: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add a"
echo t_i18n_changelog.at:14 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_i18n_changelog.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_changelog.at:15: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --debug --branch=testbranch commit --message \$EUROPEAN_UTF8"
echo t_i18n_changelog.at:15 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --debug --branch=testbranch commit --message $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_changelog.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



export CHARSET=iso-8859-1

cat >b <<'_ATEOF'
hello there
_ATEOF

$at_traceoff
echo "t_i18n_changelog.at:20: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add b"
echo t_i18n_changelog.at:20 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add 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_i18n_changelog.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_i18n_changelog.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --debug --branch=testbranch commit --message \$EUROPEAN_8859_1"
echo t_i18n_changelog.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --debug --branch=testbranch commit --message $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_changelog.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



export CHARSET=utf-8

cat >c <<'_ATEOF'
hello there
_ATEOF

$at_traceoff
echo "t_i18n_changelog.at:26: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add c"
echo t_i18n_changelog.at:26 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add c ) >$at_stdout 2>$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_changelog.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_i18n_changelog.at:27: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --debug --branch=testbranch commit --message \$JAPANESE_UTF8"
echo t_i18n_changelog.at:27 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --debug --branch=testbranch commit --message $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_changelog.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



export CHARSET=euc-jp

cat >d <<'_ATEOF'
hello there
_ATEOF

$at_traceoff
echo "t_i18n_changelog.at:32: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add d"
echo t_i18n_changelog.at:32 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add d ) >$at_stdout 2>$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_changelog.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_i18n_changelog.at:33: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --debug --branch=testbranch commit --message \$JAPANESE_EUC_JP"
echo t_i18n_changelog.at:33 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --debug --branch=testbranch commit --message $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_changelog.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`
    ;;

  114 ) # 114. t_restrictions_warn_on_unknown.at:1: warn on bad restriction
    at_setup_line='t_restrictions_warn_on_unknown.at:1'
    at_desc='warn on bad restriction'
    $at_quiet $ECHO_N "114: warn on bad restriction                      $ECHO_C"
    at_xfail=no
    (
      echo "114. t_restrictions_warn_on_unknown.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_restrictions_warn_on_unknown.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_restrictions_warn_on_unknown.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_restrictions_warn_on_unknown.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_restrictions_warn_on_unknown.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_restrictions_warn_on_unknown.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_restrictions_warn_on_unknown.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_restrictions_warn_on_unknown.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_restrictions_warn_on_unknown.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_restrictions_warn_on_unknown.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_restrictions_warn_on_unknown.at:2: rm test_keys"
echo t_restrictions_warn_on_unknown.at:2 >$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_restrictions_warn_on_unknown.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_restrictions_warn_on_unknown.at:4: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR diff bogusdir1 bogusdir2"
echo t_restrictions_warn_on_unknown.at:4 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR diff bogusdir1 bogusdir2 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; tee stderr <$at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   1) ;;
   *) echo "t_restrictions_warn_on_unknown.at:4: 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`
    ;;

  115 ) # 115. t_need_mt_revision.at:1: MT/revision is required
    at_setup_line='t_need_mt_revision.at:1'
    at_desc='MT/revision is required'
    $at_quiet $ECHO_N "115: MT/revision is required                      $ECHO_C"
    at_xfail=no
    (
      echo "115. t_need_mt_revision.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_need_mt_revision.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_need_mt_revision.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_need_mt_revision.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_need_mt_revision.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_need_mt_revision.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_need_mt_revision.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_need_mt_revision.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_need_mt_revision.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_need_mt_revision.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_need_mt_revision.at:2: rm test_keys"
echo t_need_mt_revision.at:2 >$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_need_mt_revision.at:2: 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'
blah blah
_ATEOF

$at_traceoff
echo "t_need_mt_revision.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add foo"
echo t_need_mt_revision.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_need_mt_revision.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 >bar <<'_ATEOF'
blah blah
_ATEOF

$at_traceoff
echo "t_need_mt_revision.at:7: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add bar"
echo t_need_mt_revision.at:7 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add 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_need_mt_revision.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_need_mt_revision.at:8: rm -f foo"
echo t_need_mt_revision.at:8 >$at_check_line_file
( $at_traceon; rm -f 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_need_mt_revision.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_need_mt_revision.at:9: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls missing"
echo t_need_mt_revision.at:9 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR ls missing ) >$at_stdout 2>$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_need_mt_revision.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_need_mt_revision.at:10: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR drop foo"
echo t_need_mt_revision.at:10 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_need_mt_revision.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_need_mt_revision.at:11: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls missing"
echo t_need_mt_revision.at:11 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR ls missing ) >$at_stdout 2>$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_need_mt_revision.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_need_mt_revision.at:12: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_need_mt_revision.at:12 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_need_mt_revision.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_need_mt_revision.at:14: rm -f bar"
echo t_need_mt_revision.at:14 >$at_check_line_file
( $at_traceon; rm -f 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_need_mt_revision.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_need_mt_revision.at:15: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls missing"
echo t_need_mt_revision.at:15 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR ls missing ) >$at_stdout 2>$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_need_mt_revision.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_need_mt_revision.at:17: rm -f MT/revision"
echo t_need_mt_revision.at:17 >$at_check_line_file
( $at_traceon; rm -f MT/revision ) >$at_stdout 2>$at_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_need_mt_revision.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_need_mt_revision.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls missing"
echo t_need_mt_revision.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR ls missing ) >$at_stdout 2>$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_need_mt_revision.at:18: 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`
    ;;

  116 ) # 116. t_update_null_revision.at:1: update no-ops when no parent revision
    at_setup_line='t_update_null_revision.at:1'
    at_desc='update no-ops when no parent revision'
    $at_quiet $ECHO_N "116: update no-ops when no parent revision        $ECHO_C"
    at_xfail=no
    (
      echo "116. t_update_null_revision.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_null_revision.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_update_null_revision.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_null_revision.at:2: exit code was $at_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_null_revision.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_update_null_revision.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_null_revision.at:2: exit code was $at_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_null_revision.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_update_null_revision.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_null_revision.at:2: exit code was $at_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_null_revision.at:2: rm test_keys"
echo t_update_null_revision.at:2 >$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_null_revision.at:2: 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'
blah balh
_ATEOF

$at_traceoff
echo "t_update_null_revision.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add foo"
echo t_update_null_revision.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_update_null_revision.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_null_revision.at:7: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update --branch=testbranch"
echo t_update_null_revision.at:7 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR update --branch=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;;
   1) ;;
   *) echo "t_update_null_revision.at:7: 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`
    ;;

  117 ) # 117. t_branch_checkout.at:1: branch-based checkout
    at_setup_line='t_branch_checkout.at:1'
    at_desc='branch-based checkout'
    $at_quiet $ECHO_N "117: branch-based checkout                        $ECHO_C"
    at_xfail=no
    (
      echo "117. t_branch_checkout.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_branch_checkout.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_branch_checkout.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_branch_checkout.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_branch_checkout.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_branch_checkout.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_branch_checkout.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_branch_checkout.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_branch_checkout.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_branch_checkout.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_branch_checkout.at:2: rm test_keys"
echo t_branch_checkout.at:2 >$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_branch_checkout.at:2: 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.testbranch <<'_ATEOF'
this is the testbranch version
_ATEOF

cat >foo.otherbranch <<'_ATEOF'
this version goes in otherbranch
_ATEOF


$at_traceoff
echo "t_branch_checkout.at:9: cp foo.testbranch foo"
echo t_branch_checkout.at:9 >$at_check_line_file
( $at_traceon; cp foo.testbranch 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_branch_checkout.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_branch_checkout.at:10: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add foo"
echo t_branch_checkout.at:10 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_branch_checkout.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_branch_checkout.at:11: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_branch_checkout.at:11 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_branch_checkout.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_branch_checkout.at:13: cp -f foo.otherbranch foo"
echo t_branch_checkout.at:13 >$at_check_line_file
( $at_traceon; cp -f foo.otherbranch 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_branch_checkout.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_branch_checkout.at:14: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=otherbranch commit --message blah-blah"
echo t_branch_checkout.at:14 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=otherbranch commit --message 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_branch_checkout.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_branch_checkout.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch checkout"
echo t_branch_checkout.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch checkout ) >$at_stdout 2>$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_branch_checkout.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_branch_checkout.at:17: cmp testbranch/foo foo.testbranch"
echo t_branch_checkout.at:17 >$at_check_line_file
( $at_traceon; cmp testbranch/foo foo.testbranch ) >$at_stdout 2>$at_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_branch_checkout.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  118 ) # 118. t_load_into_existing.at:1: db load must create a new db
    at_setup_line='t_load_into_existing.at:1'
    at_desc='db load must create a new db'
    $at_quiet $ECHO_N "118: db load must create a new db                 $ECHO_C"
    at_xfail=no
    (
      echo "118. t_load_into_existing.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_load_into_existing.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_load_into_existing.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_load_into_existing.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_load_into_existing.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_load_into_existing.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_load_into_existing.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_load_into_existing.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_load_into_existing.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_load_into_existing.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_load_into_existing.at:2: rm test_keys"
echo t_load_into_existing.at:2 >$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_load_into_existing.at:2: 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'
stuff
_ATEOF

$at_traceoff
echo "t_load_into_existing.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add foo"
echo t_load_into_existing.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_load_into_existing.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_load_into_existing.at:6: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_load_into_existing.at:6 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_load_into_existing.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_load_into_existing.at:8: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db dump"
echo t_load_into_existing.at:8 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR db dump ) >$at_stdout 2>$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_load_into_existing.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_load_into_existing.at:9:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_load_into_existing.at:9 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_load_into_existing.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_load_into_existing.at:10: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db db load <stdout"
echo t_load_into_existing.at:10 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db db load <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_load_into_existing.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_load_into_existing.at:11: mkdir test3.db"
echo t_load_into_existing.at:11 >$at_check_line_file
( $at_traceon; mkdir test3.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_load_into_existing.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_load_into_existing.at:12: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test3.db db load <stdout"
echo t_load_into_existing.at:12 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test3.db db load <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;;
   1) ;;
   *) echo "t_load_into_existing.at:12: 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_load_into_existing.at:13: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test4.db db init"
echo t_load_into_existing.at:13 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test4.db 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_load_into_existing.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_load_into_existing.at:14: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test4.db db load <stdout"
echo t_load_into_existing.at:14 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test4.db db load <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;;
   1) ;;
   *) echo "t_load_into_existing.at:14: 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`
    ;;

  119 ) # 119. t_automate_version.at:1: automate automate_version
    at_setup_line='t_automate_version.at:1'
    at_desc='automate automate_version'
    $at_quiet $ECHO_N "119: automate automate_version                    $ECHO_C"
    at_xfail=no
    (
      echo "119. t_automate_version.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_automate_version.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_automate_version.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_automate_version.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_version.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_automate_version.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_automate_version.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_version.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_automate_version.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_automate_version.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_version.at:2: rm test_keys"
echo t_automate_version.at:2 >$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_automate_version.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_automate_version.at:4: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate interface_version"
echo t_automate_version.at:4 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate interface_version ) >$at_stdout 2>$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_automate_version.at:4: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_version.at:5: mv stdout a_v"
echo t_automate_version.at:5 >$at_check_line_file
( $at_traceon; mv stdout a_v ) >$at_stdout 2>$at_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_automate_version.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


# MinGW's wc produces "      1" as output.  Arithmetic comparison works, string comparison doesn't
$at_traceoff
echo "t_automate_version.at:8: test 1 -eq \"\`wc -l <a_v\`\""
echo t_automate_version.at:8 >$at_check_line_file
( $at_traceon; test 1 -eq "`wc -l <a_v`" ) >$at_stdout 2>$at_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_automate_version.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

# This is really ^[0-9]+\.[0-9]+$, but m4 is obfuscatory.
$at_traceoff
echo "t_automate_version.at:10: egrep -q '^[0-9]+\\.[0-9]+\$' a_v"
echo t_automate_version.at:10 >$at_check_line_file
( $at_traceon; egrep -q '^[0-9]+\.[0-9]+$' a_v ) >$at_stdout 2>$at_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_automate_version.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  120 ) # 120. t_automate_heads.at:1: automate heads
    at_setup_line='t_automate_heads.at:1'
    at_desc='automate heads'
    $at_quiet $ECHO_N "120: automate heads                               $ECHO_C"
    at_xfail=no
    (
      echo "120. t_automate_heads.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_automate_heads.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_automate_heads.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_automate_heads.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_heads.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_automate_heads.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_automate_heads.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_heads.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_automate_heads.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_automate_heads.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_heads.at:2: rm test_keys"
echo t_automate_heads.at:2 >$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_automate_heads.at:2: 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'
blah
_ATEOF

$at_traceoff
echo "t_automate_heads.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add foo"
echo t_automate_heads.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_automate_heads.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_automate_heads.at:6: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_automate_heads.at:6 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_automate_heads.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


BASE_R=`cat MT/revision`


cat >1 <<'_ATEOF'
1
_ATEOF

$at_traceoff
echo "t_automate_heads.at:10: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add 1"
echo t_automate_heads.at:10 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add 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_automate_heads.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_automate_heads.at:11: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_automate_heads.at:11 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_automate_heads.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


ONE_R=`cat MT/revision`


$at_traceoff
echo "t_automate_heads.at:14: rm -rf MT.old"
echo t_automate_heads.at:14 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_automate_heads.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_automate_heads.at:14: mv  MT MT.old"
echo t_automate_heads.at:14 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_automate_heads.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_automate_heads.at:14: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$BASE_R ."
echo t_automate_heads.at:14 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $BASE_R . ) >$at_stdout 2>$at_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_automate_heads.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_automate_heads.at:14: mv MT.old/options MT"
echo t_automate_heads.at:14 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_automate_heads.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_automate_heads.at:14: test \$PROBE_R_SHA = \$BASE_R"
echo t_automate_heads.at:14 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $BASE_R ) >$at_stdout 2>$at_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_automate_heads.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



cat >2 <<'_ATEOF'
2
_ATEOF

$at_traceoff
echo "t_automate_heads.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add 2"
echo t_automate_heads.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add 2 ) >$at_stdout 2>$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_automate_heads.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_automate_heads.at:17: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_automate_heads.at:17 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_automate_heads.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


TWO_R=`cat MT/revision`


$at_traceoff
echo "t_automate_heads.at:20: rm -rf MT.old"
echo t_automate_heads.at:20 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_automate_heads.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_automate_heads.at:20: mv  MT MT.old"
echo t_automate_heads.at:20 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_automate_heads.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_automate_heads.at:20: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$BASE_R ."
echo t_automate_heads.at:20 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $BASE_R . ) >$at_stdout 2>$at_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_automate_heads.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_automate_heads.at:20: mv MT.old/options MT"
echo t_automate_heads.at:20 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_automate_heads.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_automate_heads.at:20: test \$PROBE_R_SHA = \$BASE_R"
echo t_automate_heads.at:20 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $BASE_R ) >$at_stdout 2>$at_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_automate_heads.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



cat >3 <<'_ATEOF'
3
_ATEOF

$at_traceoff
echo "t_automate_heads.at:22: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add 3"
echo t_automate_heads.at:22 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add 3 ) >$at_stdout 2>$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_automate_heads.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_automate_heads.at:23: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_automate_heads.at:23 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_automate_heads.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


THREE_R=`cat MT/revision`


$at_traceoff
echo "t_automate_heads.at:26: rm -rf MT.old"
echo t_automate_heads.at:26 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_automate_heads.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_automate_heads.at:26: mv  MT MT.old"
echo t_automate_heads.at:26 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_automate_heads.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_automate_heads.at:26: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$BASE_R ."
echo t_automate_heads.at:26 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $BASE_R . ) >$at_stdout 2>$at_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_automate_heads.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_automate_heads.at:26: mv MT.old/options MT"
echo t_automate_heads.at:26 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_automate_heads.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_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_automate_heads.at:26: test \$PROBE_R_SHA = \$BASE_R"
echo t_automate_heads.at:26 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $BASE_R ) >$at_stdout 2>$at_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_automate_heads.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 >4 <<'_ATEOF'
4
_ATEOF

$at_traceoff
echo "t_automate_heads.at:28: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add 4"
echo t_automate_heads.at:28 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add 4 ) >$at_stdout 2>$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_automate_heads.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_automate_heads.at:29: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_automate_heads.at:29 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_automate_heads.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


FOUR_R=`cat MT/revision`

$at_traceoff
echo "t_automate_heads.at:32: echo \$ONE_R >wanted_heads_unsorted"
echo t_automate_heads.at:32 >$at_check_line_file
( $at_traceon; echo $ONE_R >wanted_heads_unsorted ) >$at_stdout 2>$at_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_automate_heads.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_automate_heads.at:33: echo \$TWO_R >>wanted_heads_unsorted"
echo t_automate_heads.at:33 >$at_check_line_file
( $at_traceon; echo $TWO_R >>wanted_heads_unsorted ) >$at_stdout 2>$at_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_automate_heads.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_automate_heads.at:34: echo \$THREE_R >>wanted_heads_unsorted"
echo t_automate_heads.at:34 >$at_check_line_file
( $at_traceon; echo $THREE_R >>wanted_heads_unsorted ) >$at_stdout 2>$at_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_automate_heads.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_automate_heads.at:35: echo \$FOUR_R >>wanted_heads_unsorted"
echo t_automate_heads.at:35 >$at_check_line_file
( $at_traceon; echo $FOUR_R >>wanted_heads_unsorted ) >$at_stdout 2>$at_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_automate_heads.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_automate_heads.at:37: sort wanted_heads_unsorted >wanted_heads"
echo t_automate_heads.at:37 >$at_check_line_file
( $at_traceon; sort wanted_heads_unsorted >wanted_heads ) >$at_stdout 2>$at_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_automate_heads.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_automate_heads.at:39: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=otherbranch automate heads testbranch"
echo t_automate_heads.at:39 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=otherbranch automate heads 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_heads.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_automate_heads.at:40:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_heads.at:40 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_heads.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_automate_heads.at:41: cmp wanted_heads stdout"
echo t_automate_heads.at:41 >$at_check_line_file
( $at_traceon; cmp wanted_heads 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;;
   0) ;;
   *) echo "t_automate_heads.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_automate_heads.at:43: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate heads nosuchbranch"
echo t_automate_heads.at:43 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate heads nosuchbranch ) >$at_stdout 2>$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_automate_heads.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

cat >empty <<'_ATEOF'
_ATEOF

$at_traceoff
echo "t_automate_heads.at:45: cmp empty stdout"
echo t_automate_heads.at:45 >$at_check_line_file
( $at_traceon; cmp 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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_heads.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`
    ;;

  121 ) # 121. t_merge_normalization_edge_case.at:1: merge normalization edge case
    at_setup_line='t_merge_normalization_edge_case.at:1'
    at_desc='merge normalization edge case'
    $at_quiet $ECHO_N "121: merge normalization edge case                $ECHO_C"
    at_xfail=no
    (
      echo "121. t_merge_normalization_edge_case.at:1: testing ..."
      $at_traceon


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



if which mimencode 2>/dev/null; then
  UNB64_COMMAND="mimencode -u"
elif which recode 2>/dev/null; then
  UNB64_COMMAND="recode /Base64"
elif perl -MMIME::Base64 -e 1 2>/dev/null; then
  UNB64_COMMAND="perl -MMIME::Base64 -ne 'print decode_base64(\$_)'"
elif python -c 'import sys;sys.exit(not hasattr("", "decode"))' 2>/dev/null; then
  UNB64_COMMAND="python -c 'import sys;sys.stdout.write(sys.stdin.read().decode("'"'"base64"'"'"))'"
else
  # This is lame!  We should XFAIL the test so the user knows that
  # they're not, you know, actually testing the software.  But
  # Autotest runs XFAIL conditions in a completely different shell, so
  # we can't without duplicating the whole test here.
  exit 77
fi
# Poor man's logging:
$at_traceoff
echo "t_merge_normalization_edge_case.at:8: echo \$UNB64_COMMAND"
echo t_merge_normalization_edge_case.at:8 >$at_check_line_file
( $at_traceon; echo $UNB64_COMMAND ) >$at_stdout 2>$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_normalization_edge_case.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



if which gunzip 2>/dev/null; then
  # This is lame!  We should XFAIL the test so the user knows that
  # they're not, you know, actually testing the software.  But
  # Autotest runs XFAIL conditions in a completely different shell, so
  # we can't without duplicating the whole test here.
  UNGZ_COMMAND="gunzip -c"
fi
# Poor man's logging:
$at_traceoff
echo "t_merge_normalization_edge_case.at:8: echo \$UNGZ_COMMAND"
echo t_merge_normalization_edge_case.at:8 >$at_check_line_file
( $at_traceon; echo $UNGZ_COMMAND ) >$at_stdout 2>$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_normalization_edge_case.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






# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_normalization_edge_case.at:10: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_merge_normalization_edge_case.at:10 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_normalization_edge_case.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_merge_normalization_edge_case.at:10: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_merge_normalization_edge_case.at:10 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_normalization_edge_case.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_merge_normalization_edge_case.at:10: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_merge_normalization_edge_case.at:10 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_normalization_edge_case.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_merge_normalization_edge_case.at:10: rm test_keys"
echo t_merge_normalization_edge_case.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_merge_normalization_edge_case.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 >parent.gz.b64 <<'_ATEOF'
H4sICK2WEUIAA3AA3Vr/b9u4Ff85/it4wgWVGttNk1vXtQi2ItcbCvS6oe26DWlq0BZt8yKR
GknZDg7r3773SEqi5C9x3Ba7zU1tieT79uHje4+UeoMBMXOuCfyZOSPaUJFSlRLNDJFTkpWU
zKW80WQqFcmlkEYK9rwHZKVmalAoueApS8mUZ0yTCRVELphS0EY4cFCEpikxEm6Gvd60FBPD
pSCG5cUISeKkRwjJ5IRmxKRc4R3+kgsi9XDGDBOLOHr/819/fPU2smP51A+4IIJnqLTYTBEl
hIn0HiQv96SJHpm8iKqBiplSCZLfaDQq1kZxMRsCWjk1cXSsH+Vm+A/7ifqWQ5L0kLQBg63Y
pDQsLqiZ98lwOEyAbQNLwVMQWkjNV8j2JoQMhEPf4LHX2A69IKdWXWyDjyNEGV5AKQo6uYmp
miWWE8s082OBXb8lb0m5iaHBDWwZDD/Ojh46AzVg9xis0IQqRgqmNAdAhCE5MzSlhhI6lqXx
fhLrcjInVFe2I4sxB+EvLl/rPllQxWWpiS7YhIOZ04zOdEKWcw5US0aWFBiDU83pgllPBadF
FooN3N0tMTxn1qOdQFQqlymfcpYObXugMdzmmmULpq0pCpeBVODUXBBqGZBhbgZIAcpBI9Iv
YSpgpslEFrck9grkVPAp0yYZEkZB13jav+kvEgKiCuCC/ODPC3acEUxYfgLMocgCpjVD21Da
qPIRfXVzDbyAE7CANQlrCaY7bo/xvprUs9/tJr/+209Zh3nkpyG6hkFIWXXFqKKgOcM5yUqW
EO8pKN22oNDIqJJFSeh1teNN5gB7wCYqT1ZuITce5XSq1wOfCUDfhQckqpZ9vba4SGPP7XhI
v48SJ7ryTNQmWMabybQ8jO5AsuxANbMD5dFydRjhmN4cCIzis8MoFfvlIMLPh1A9moBvHUL4
6fLDu0eHCDyQ7hP46EIcJPFgyk/vLi8PM/JOQt80pZBtnvc6K56l3IwmMs8hYcRjCjGcrUyQ
5iA8Yd5d8KhpW3Bdwk8rhX949e5vL17XdULsx3wO4qLn5Xu8cl4KaCE7RcHLH1+9/0tTecR+
zAaOvsda1pQ0eQFJH0GCEZ2iB9lBfytqVzBhyeF1q+BAAH5+/4xEUCEQPwUzXY5rvGAaPorI
fttxCQ7EJltT5cWzpeJQZbTg5XI4yaRmqEjSq430BQn8eu0TtPi0FeEBJMVyKPZiUwfpZp7B
gDqyO/GgP0iTBROOABRV0XYguuyfb4CmqoEwtUWBa2RcWLzBZsVo6uCG4gGQt13V7KUyTGdQ
2pLQtXEorgkAs3LsJrk5ofgNIFumAdhNZkOVNilTraYW/FtArest3V02QorRGEzGOmSk4L/0
xWGw/ro0vjIbFXMFjrCdAvcFqtSGMEzz1NLajUCYqIUBbsxVCrQ/DlasvoBao1kG/g73EFAP
YRFTUK50TO0k6KsFFh6PK1jWho3tMJgkO/JzWJLTccaGXMBexMQGCyTg0Yk5plNvw9oeKQYR
AG5GEyAcWUtjDYUHsxVe2id10bMZnhazqur7KswwQHwxIzqZsAI4gFLgN2UGqs2pmLFYZunI
tQBHwZbVTVLhjiR99Osa/IDEjkpls2jsMrhwgR5K4JDjFXKyk2X1cyTdRdTkhPWKcItX5kzN
mCK6LAqpTGCz7Tgb5Qz0neSwfhHJPlH4E8LVqm87YauKfBFygVi6xgO1aENtxZ6viaVfT/oa
q1qJNeNZTifaqmGv2gb0CWzAaiY+52VcY2iOMLNNpwPLZ+D2TB9h9/oxqn5wybnLJLqnPV6X
aCDkgAtuLH/MVAMMLnDROzqydO3Ns9Vtmwm7Z2MbDvRwOAZLbuYDKiYMN4cdcLZg5JiCGqNp
bhP4sSYtEIhFwOV0K/suZO8BKdkXUro/smej1QqBcZ7OppBH7JkC1P7z6toOTP3Ndv+7z3pw
QgNHiQYDw03GHuMqqdXo9p5FLc2q7rZOAZHTfFBtVqO2wludbTMk4Cl3gdNEwvXPnQ7738Ov
6j6P2vZ08KU7YY4OQB4uG/BtNTsycoRltVRU3braGs+aEl9z9knFcc/ye62IJV7+83YRXQtZ
q+CqnObldjwGK0DY6Ag8GdMjOXX6VIMrtYNSOTg42VEtb6296xhkT+CCKjR6SKOdBiBBR/lC
yZmi+YitoIDUIy7stMe+OSSuHc+e2MFsVmPs6eTGwLJfNIExvjsI2tbfyEVlt98VbGr0TtVt
9uC02mw+d5ZClytRepVzQ8s290MVHRR3DGysaLTaNjaK6s2Zk+9LYFrvMtTm5oq177D+Ffh5
nZ8a652ULVPtCpPuXqgNVVDtOfdyK6ZzLv5R/P3F2zev3vz5GXmA9A/IkmoygR2Gxqpe4j4F
x4IrwR5DgJZngyW9de4whH0WZkwIIEdH0T9lSfRcllnqegkeoLpyVyOnh69f/vT+oTtsTaFO
haaM59y4PY2sjXVMLU8MSlTNSjyP0CANupKkMcoBtrPerBDGw/UdePrA3EW0JeCeGXdXUiFh
fN6QU+5W2NYdu/Vtai8/elcVsAdE9xO52k+mP5dw3o68PocroC1qmw+7KIfPADY5KcHzLFiJ
674D+ecIxYbrpi0RPj4mbU4YWWgLaT3C2YO6g4WHw6rkLYSc41Kce5oEfS5qHAW8Ea2j4Jyj
rUONWSTkTnhg01k6kDbuANuHIo3dTZva0FZbuDuhufotbiq1fdZXtQPYlo3opgzz20xR9I6B
lam/nXxG/+/T3PnBae7y5Zv3L99+q0S3xwkH+Qrp7hvtprwf3LWnutuCO5PR+Y789yWC706D
57vS4G7R9UL6FjnxfM+c2PD+ktRI/0dT4waUvklqpBvaQqs3Zkw8d2WrggrtI4l99K/xFSD7
koRmGZvgqRhoXmQM403r/RagTEfVIHQZF/6Bq+ZIgKIYAUdHMLTPDOGzGLjGRzGP/3Ccwr8B
fteogNgNQ89Ou0PXN8pxlD6rHqfVBw2VYjJnZo6O7N46yexLUBm/wYNuAqsLE1CaKqa363t1
vDwejK5P/lRdbFeEHqQIGSsIjHP7WGC3Ftcnx0N/sV2J8VYlKEzxv0oG9QDOvpBOoXFpyJyt
SMpn3OyYtuPVyffbpfKtUqNbKD+YSuktvjqFb6fJUjkVMPlh7sOXzQLJ9m2Uhqoj0j+Mck94
8QWhGH7R9eIH3z00D+qQ5FWrOsFLjn9CDciAPH3yw+lp+AivUvXywztQ4DZjEZBnkHIXzqs1
qV51is7JkjGYOzqTwemwgSm07+ZUwTfnAl8OuiBPTp9XbZD38cH0+ZPTpg0MhCarUN2GAizl
D0+D1hzC3Byaz578/mk4+pZRy/Xx75DxqW0OntoVEg/OmegT+DO3Beq0PrvxcXqSkPjKqT2X
CPzy5vok0X+0ltYv7aGdV8jmOkgsX3d2YkEehoKSlkcFx2PY9B/DHYp5+ygAAA==
_ATEOF


cat >left.gz.b64 <<'_ATEOF'
H4sICLiWEUIAA2wA3Rptb9u4+bt/BSdcUKmx3TS5dV2LYCtyvaFArxvartuQpgZt0TYvEqmR
lO3gcP3tex6SerVkO752u12axhb1vL+T0mA0ImbJNYFfs2REGypiqmKimSFyTpKckqWUt5rM
pSKpFNJIwZ4PAC3XTI0yJVc8ZjGZ84RpMqOCyBVTCtYIBwqK0DgmRsLFeDCY52JmuBTEsDSb
IEoYDQghiZzRhJiYK7zCT3JJpB4vmGFiFQbvf/jbd6/eBhaWzz3AJRE8QaFFN0YQESbie6C8
PBAneGTSLCgAFTO5EiS91ahUqI3iYjEGa6XUhMGJfpSa8T/tTzC0FKJogKiVMdiGzXLDwoya
5ZCMx+MIyFZmyXgMTDOp+QbJ3tZNBszh3uixl9iCXpIzKy6uwY9DRB6eQS4yOrsNqVpElhJL
NPOwQG7Y4Lem3ISw4AAbCsOH02OAwUAN6D0FLTShipGMKc3BIMKQlBkaU0MJncrc+DgJdT5b
EqoL3ZHElAPzF1ev9ZCsqOIy10RnbMZBzXlCFzoi6yUHrDUjawqEIaiWdMVspELQIgnFRu7q
jhieMhvRjiEKlcqYzzmLx3a9JjFcppolK6atKgrTQCoIai4ItQTIODUjxADhYBHx1+AK8DSZ
yeyOhF6AlAo+Z9pEY8IoyBrOh7fDVUSAVQZUkB78esaOMhoT0k+AOhRJgFsT1A25TYoY0de3
N0ALKAEJyEnIJXB32ITxsRqV3m/fJj/97F3WIh54NwQ3AISYxa0QRRQ0ZeiTJGcR8ZGC3O0K
Mg2MylkQ1aOuDLzZEsxeIxPkpxuXyFVEOZnKfOALAdZ35QGRirQvc4uLOPTUTsb0myByrIvI
RGlqadyNpuVxeEeiJUeKmRzJj+ab4xCn9PZIwyi+OA5TsR+PQvx8DNajGcTWMYifrj68e3QM
wyPxPkGMrsRRHI/G/PTu6uo4Jfci+qU5hW7zfNDKeBZzM5nJNIWGEU4p1HC2MbU2B+UJ++6K
B9XaiuscPhot/MOrd39/8bqcE0IP87lWFz0tf8cL57mAFLI1FLz87tX7v1aTR+hhOij6O1az
aqRJM2j6aCSAaA09SA7uN6p2YSYcObxshTnQAD+8f0YCmBCId8FC59PSXuCGjyKwfy1chIC4
ZGeqNHu2VhymjIZ5uRzPEqkZChINSiX9QAKfXvoINT5rVHgwkmIpDHuhKYt05WdQoKzsjj3I
D9xkxoRDAEFV0G+INvnnHaYpZiBsbUEtNBIurL1BZ8Vo7MwNwwNY3t4qvBfLejuD0ZbUQxtB
MSfAmEVgV83NMcW/YGRLtGbsqrOhSF3CFNnUMH+PUct5S7fTRkgxmYLKOIdMFPyXfjis5V8b
x09mk2ypIBD6MXBfoHJtCMM2Ty2u3QjUG7UwQI25SYEOp7WM1Zcwa1Rp4K9wDwHzEA4xGeVK
h9Q6QV+vcPB4XJhlC2xqwcBJFvJzfSSn04SNuYC9iAkNDkhAo1VzTGvehtyeKAYVAC4mM0Cc
WE1DDYMHsxNePCTl0NNtngaxYur7IsSwQPxiQnQ2YxlQAKEgbvIERFtSsWChTOKJWwGKgq2L
i6iwO6IMMa5L49dQLFQsq6SxaXDpCj2MwHWK10jJOsvK51DaSVT1hO2JsCcqU6YWTBGdZ5lU
pqazvXE+SRnIO0shf9GSQ6Lwo26uxnzbKltF5QuQCtTSLRooRdPUlu3FFlv65bhvkSqF2FKe
pXSmrRj2W1OBIYENWEnE97yEayzNAXa2+Xxk6Yzcnukj7F4/BsUHppz7GgX31MfLEoyEHHHB
jaWPnWqExQW+VCFR/2lupa2kfQrt9k2fVejxxhmtuVmOqJgx3Cq2TNVjMUcUxJjMU9vOTzRp
mIRYe7gOb3nvs/OxBj7AsvRwA59PNhu0jwt/NofmYg8aYEOwLL5bwNhf9AflfZLEMe2NnmA0
Mtwk7DEmUinUbtjzoCF1N3BT+l6CTuNRsfMNmor2xmq3KSHQ9hm1W5CGyP3x/v9g9wL4Imhq
vtNL9B7O2qXSYd6Er5VD7bg9MXKCc79UVN254R8PwyI/FA9JQfHA/cHWlE08/+fNKb9ksjVi
Fk3X821FIY6osBMTeHSnJ3Lu5CmAC7Frs3ztZGfHON+7OSBFWbRHhLUxOXhIg50KIEJL+EzJ
haLphG1gwtUTLmyAhH65jlwGsz1SBG8WMPb4tLPIHVbZAMbfrvURG4vkstDbb1u6Fn1QtZe9
cRprduBwmsItN0MNisCHlb7wQxGdKfYAVlpUUvXBBkG5e3T8/YxOy22Q6l4uSPsbNr5qcV62
zEp7x6XH1W5yam/WmqaqjaMuvFzGtA7uP4p/vHj75tWbvzwjDxD/AVlTTWawBdK47ZC4kUJY
CCXYBAmQ8ny0pncuHMawEcQmvqsmu8ryL5kTvZR5EjtMgqe/blbXyOXh65ffv3/oTopjGLJh
KeEpN25DJktDOIZ7+SFLqhY5HrRokBLQoqjCcobeOUgXOuFTgx1+8E2i7YkGg3tODfuV658r
9gtsR6jd8lZjpIfeNckcYKL7sdwcxtMfuBCbJUjrcz1zmqz6Yt9VR3y40RXcBA/qIIO3Yyes
XQL3eto1GcOPL2nd/Sapq0Qaj6gOwG6ZhNRPY5xkXl/oXK5RuodmFUi9BDUYVpZsUG3KV5o1
EHKnBWHDnTs7du5+mwdClU2qNdWxVmq/u1e6cTOsBstDUrDY7/Q1OtrVvH6d3Y/uASxU/fW0
Svqb76AXX6WDXr188/7l2/9FDz3gVIh8gU76lTaN7mfv1nG/Bnv73MWO1vpLGO/vsBe7Ouxu
1mUCfo12e/Ffbbf0N9huOyz4Vdot7VirW6SzC+M5NttkVGhfgeyrFBpfqbIvnWiWsBmeK4Lk
WcKwTjXeFwLMeFIAYTi5lgJUNUcEZMUIJAEaQw8aXrDPtuA7Ptp6/MeTGP6N8G9pFWDbAXp+
1gbd3teHQfyseDxZnosUgsmUmSUGuXuLJ7EvlSX8Fh8cEMg8bGpxrJjul/f6ZH0ymtyc/rn4
0i8IPUoQMlVQNJf2MctuKW5OT8b+S78Q014hKLj43zmDGQO9L6QTaJobsmQbEvMFNzvcdrI5
/aafK+/lGtzBSMNUTO/wVTR820/myomATRN7Jr68V+Ns3+6psFos/cM998QcX7gK4RNDL3zw
u4fmQVmuvGjFTYiSk+9RAjIiT598e3ZWfyRaiHr14R0IcJewANATaNUrF9WaFK+OBRdkzRj4
ji5k7XzdgAvtu05FRUm5wJetLsmTs+fFGswL+KD/4slZtQYKwpIVqFxDBhbz26e11RRK4BKW
z5/84Wkd+o5RS/Xx75Gwq3C1p6CZxEcPTAwJ/Jq7DGXa9m54Ep9GJLx2Yi8lGn59e3Ma6T9Z
TcuXIFHPayRzU2s6X9Y7oSAP64yiRkTVTvNw6T9jvncoSyoAAA==
_ATEOF


cat >right.gz.b64 <<'_ATEOF'
H4sICLyWEUIAA3IA3Vr/b9u4Ff89fwUnnFGpsd00uXVdi2ArcrmhQK8b2q7bkKYGbdE2F0nU
SMp2MKx/+94jKYmSJdt12604N7Usiu8rHx8/j+LJaET0kisCf3rJiNI0i6mMiWKaiDlJCkqW
QtwpMheSpCITWmTs+QmQFYrJUS7FiscsJnOeMEVmNCNixaSENsKBgyQ0jokWcDM+OZkX2Uxz
kRHN0nyCJGF0QghJxIwmRMdc4h1eySURarxgmmWrMHj3y19+evkmMH353HW4JBlPUOmsmyKI
CMvizyC5PpAmeKTTPCg7SqYLmZH0TqFRodKSZ4sxeCulOgwG6lGqx383n2BoOETRCZLWzmAb
Nis0C3Oql0MyHo8jYFu7JecxCM2F4htke+e7DITDs9Fjp7HpeknOjLrYBh9LiDKcgCLL6ewu
pHIRGU4sUcz1BXbDhrw15TqEBtuxYTBcrB0nGAxUg91TsEIRKhnJmVQcHJJpkjJNY6opoVNR
aBcnoSpmS0JVaTuymHIQ/uLqlRqSFZVcFIqonM04mDlP6EJFZL3kQLVmZE2BMQTVkq6YiVQI
WmQh2cje3RPNU2Yi2gpEpVIR8zln8di0exrDbapYsmLKmCJxGggJQc0zQg0DMk71CClAOWhE
+jUMBYw0mYn8noROgZRmfM6UjsaEUdA1nA/vhquIgKgcuCA/+HOCLWd0Jky/DMyhyAKGNUHb
UNqkjBF1c3cLvIATsIA5CXMJhjts9nGxGlWj335M/v0fN2Qt5oEbhuAWOiFl+ShEFTOaMhyT
pGARcZGC0k0LCg20LFgQ+VFXBd5sCW732ATF6cZO5DqirE7VfOCLDLxv0wMSldO+mls8i0PH
bTCmPwSRFV1GJmrjTeNuMiWOozuSLDlSzeRIebTYHEc4pXdHOkbyxXGUkv3zKMJPx1A9mkFs
HUP48er920fHCDyS7iPE6Co7SuLRlB/fXl0dZ+ReQtc0p7DaPD9pzXgWcz2ZiTSFBSOcUsjh
bKO9ZQ7SE667Kx7UbSuuCrg0lvD3L9/+9cWrCieErs8nLy86Xu6JU85JAS1ECxRc//Ty3Z9r
5BG6Ph0c3RNjWQ1p0hwWfXQS9GiBHmQHzxtZu3QTQg6nW+kOdMAv756RABACcUOwUMW08hcM
w4csMN+mX4QdsclgqjR/tpYcUEbDvVyMZ4lQDBWJTiojHSCBq9M+QovPGhkenCRZCmAv1FWS
rscZDKgyuxUP+oM0kbPMEoCiMuh3RJv98w7XlBgIl7bAC42EZ8bfYLNkNLbuBvAAnjePytGL
hb+cAbQlfmhjV5wT4MwysOvFzQrFb3CyYeo5u17ZUKUuZcrZ1HB/j1MrvKXa0yYT2WQKJiMO
mUj4Lxw49OZfm8Yhs0m+lBAI/RRYF8hCacJwmaeG1hQC/kKdaeDGLFKgw6k3Y9UlYI16Grg7
rCEADyGIySmXKqRmENTNCoHH49ItW92mphsMkun5yYfkdJqwMc+gFtGhRoAEPFo5R7fwNszt
iWSQAeBmMgPCibE0VAA8mEF48ZBUoKfbPQ1mJer7KswwQXwxIzqbsRw4gFIQN0UCqi1ptmCh
SOKJbQGOGVuXN1HpdyQZYlxXzvdITK9Y1JPGTINLm+gBAvscb5CTGSyjnyVpT6J6TdhGhD1R
mTK5YJKoIs+F1J7N5sH5JGWg7yyF+YueHBKJF99dDXzbSltl5guQC+TSLR6oRdPVRuzFllj6
9aRvsaqU2DJ+xVOjBFybyg8JFF8tXQ5RxTAKRnNcV0ax+Z7Bd6vKNYXMQAW1lGE9yv7ncH92
WUK/W4P6h6g9QiylM2UsM792jZJDJQlXuHgGiD3m85HhM7JV7YdgoD4E5QWTov0ZBZ8ZcU6X
YJSJEc+4NvyNczD9w49u65teM5r2GbR7tPu80j/ie50zWnO9HNFsxrCYb7mqx2OWKagxmacG
cA0UabiEGH9YDGZk7/PzsQ4+wLP0cAefTzYb9I9NUGwOy7/ZCoKSbVn+Nh1jd7MvdRyWxqzQ
3ugJRiPNdcIeY6qrlNrd9zxoaL0/y+wQbi0elXsTQdPQ3ljtdiUE2j6ndivSUHlfhvu+/V52
vgialh+cOvcN1i6TDhtN+FkPqCmIJlpMsDITksp7W57hdmXkypYhKTkeWMFt1UHEyX/erMMq
IVtFQAmLnNxWFGIRAbVyhpuraiLmVp+yc6m2V215e287Cq7e8o2UadFs4nqFTPCQBjsNQIKW
8rkUC0nTCdtADaImPDMBErpmn7gKZrPpC6NZ9jEb3J1J7rDMBn3cY28dMbFILku7XWHZ1eiC
qt3snNNoM5DQWgqPLMo9KQMfWvrCD1W0rtjTsbai1qqvbxBU9b2V76ooWhWqsru5ZO0emPjy
4rxaMmvrrZSeobbYtl1ON13lFQw2vOyMaWG0D9nfXrx5/fL1n56RB0j/gKypIjMoUhUWhgJL
XewLoQRlagZano/W9N6GwxhKdVzEd+Vkm1n+IQqilqJIYktJcH/eVlMKpTx8df3zu4d2Lz+G
MgiaEp5ybUtmUTnCCtwrD0VSuShwK0yBlkAWRTWVdfTOUqe0Cd/r7BgHt0i0R6Ih4DNRw37j
+nHFfoUNhNqtbw0jXe9dSOYAF32eyM3XkLmAAmW3xLIysl2/TNrhwg6R5Tb7iJn/yOaTnxOa
Uvpmtc37+GKta9oS3CSG3LQ9K0LvFqT7CaUpGD4uWXevpIlvEmm8Hj2AuuUS4u8EWs2cvbAm
WwhgX9jWXfzk2hBYe7LBtalf5dYgEzs9SOaisH7s3Hkxi0q1GVn7pG6THW2V9btRgAXSYQ2Z
D0kuZSXXt4TTrmX5+1zX6Z6OpanfDwigv3pscPFNsMHV9et312/+H+jggB1J8hUwwjcqh+1n
b1G834K9K/jFDtDwJYL3Y4eLXdjhS0TvgxAXfRDiS4QeLvMzRFaJ5lvAiov/Kaygv0JY0eHB
bwIraEeb75FOtIHvitgmp5lymdYcV1J4bNEc7FIsYTPcGQbN84RhPm6cyQPKeFJ2wnCySydw
VRwJUBQjEPzoDHXSGAXz/hh+4+vjx78fxPBvhN+VV0BsR9fzs3bX7Z2ZMIiflUcAqp2tUjGR
Mr3EILcn5RJzcDPhd/hyjkCGwcU7jiVT/freDNaD0eT29I/lj35F6FGKkKmExWFpXmXu1uL2
dDB2P/qVmPYqQWGI/1UwwFI4+pmwCk0LTZZsQ2K+4HrHsA02pz/0S+W9UoN7gG5MxvQej3vi
iVpRSKsCggPEBnhA1pNsTtDVVC2R7gW6PZWChxpDuGLohQ9+81A/qNKVU618CFEy+Bk1ICPy
9MmPZ2f+sYNS1av3b0GB+4QFQJ4AJFnZqFakPJ4ZXJA1YzB2dCG8NyQahtCcJywzSsozPNB4
SZ6cPS/bABfhYZqLJ2d1GxgITUahqg0FGMofn3qtKaTAJTSfP/ndU7/3PaOG6+PfImOb4byT
BrnAl0csGxL40/c56rQ9uuEgPo1IeGPVXgp0/Pru9jRSfzCWVgeN0c4bZHPrLTpfd3TCjDz0
BUWNiPL2Y7Hpv1y7w1GvLQAA
_ATEOF



$at_traceoff
echo "t_merge_normalization_edge_case.at:164: if test \"\$OSTYPE\" == \"msys\"; then
  mimencode -u -o parent.gz parent.gz.b64
else
  eval \$UNB64_COMMAND <parent.gz.b64 >parent.gz
fi
"
echo t_merge_normalization_edge_case.at:164 >$at_check_line_file
( $at_traceon; if test "$OSTYPE" == "msys"; then
  mimencode -u -o parent.gz parent.gz.b64
else
  eval $UNB64_COMMAND <parent.gz.b64 >parent.gz
fi
 ) >$at_stdout 2>$at_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_normalization_edge_case.at:164: exit code was $at_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_normalization_edge_case.at:164: eval \$UNGZ_COMMAND <parent.gz >parent
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o parent
fi
"
echo t_merge_normalization_edge_case.at:164 >$at_check_line_file
( $at_traceon; eval $UNGZ_COMMAND <parent.gz >parent
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o parent
fi
 ) >$at_stdout 2>$at_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_normalization_edge_case.at:164: exit code was $at_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_normalization_edge_case.at:165: if test \"\$OSTYPE\" == \"msys\"; then
  mimencode -u -o left.gz left.gz.b64
else
  eval \$UNB64_COMMAND <left.gz.b64 >left.gz
fi
"
echo t_merge_normalization_edge_case.at:165 >$at_check_line_file
( $at_traceon; if test "$OSTYPE" == "msys"; then
  mimencode -u -o left.gz left.gz.b64
else
  eval $UNB64_COMMAND <left.gz.b64 >left.gz
fi
 ) >$at_stdout 2>$at_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_normalization_edge_case.at:165: exit code was $at_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_normalization_edge_case.at:165: eval \$UNGZ_COMMAND <left.gz >left
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o left
fi
"
echo t_merge_normalization_edge_case.at:165 >$at_check_line_file
( $at_traceon; eval $UNGZ_COMMAND <left.gz >left
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o left
fi
 ) >$at_stdout 2>$at_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_normalization_edge_case.at:165: exit code was $at_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_normalization_edge_case.at:166: if test \"\$OSTYPE\" == \"msys\"; then
  mimencode -u -o right.gz right.gz.b64
else
  eval \$UNB64_COMMAND <right.gz.b64 >right.gz
fi
"
echo t_merge_normalization_edge_case.at:166 >$at_check_line_file
( $at_traceon; if test "$OSTYPE" == "msys"; then
  mimencode -u -o right.gz right.gz.b64
else
  eval $UNB64_COMMAND <right.gz.b64 >right.gz
fi
 ) >$at_stdout 2>$at_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_normalization_edge_case.at:166: exit code was $at_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_normalization_edge_case.at:166: eval \$UNGZ_COMMAND <right.gz >right
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o right
fi
"
echo t_merge_normalization_edge_case.at:166 >$at_check_line_file
( $at_traceon; eval $UNGZ_COMMAND <right.gz >right
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o right
fi
 ) >$at_stdout 2>$at_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_normalization_edge_case.at:166: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



PARENT=fe24df7edf04cb06161defc10b252c5fa32bf1f7
LEFT=f4657ce998dd0e39465a3f345f3540b689fd60ad
RIGHT=1836ed24710f5b8943bed224cf296689c6a106c2

PVER=`monotone --norc identify parent`
LVER=`monotone --norc identify left`
RVER=`monotone --norc identify right`

$at_traceoff
echo "t_merge_normalization_edge_case.at:176: test \$PVER = \$PARENT"
echo t_merge_normalization_edge_case.at:176 >$at_check_line_file
( $at_traceon; test $PVER = $PARENT ) >$at_stdout 2>$at_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_normalization_edge_case.at:176: exit code was $at_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_normalization_edge_case.at:177: test \$LVER = \$LEFT"
echo t_merge_normalization_edge_case.at:177 >$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
$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_normalization_edge_case.at:177: exit code was $at_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_normalization_edge_case.at:178: test \$RVER = \$RIGHT"
echo t_merge_normalization_edge_case.at:178 >$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
$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_normalization_edge_case.at:178: exit code was $at_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_normalization_edge_case.at:180: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR fload <parent"
echo t_merge_normalization_edge_case.at:180 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR fload <parent ) >$at_stdout 2>$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_normalization_edge_case.at:180: exit code was $at_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_normalization_edge_case.at:181: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR fload <left"
echo t_merge_normalization_edge_case.at:181 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_merge_normalization_edge_case.at:181: exit code was $at_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_normalization_edge_case.at:182: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR fload <right"
echo t_merge_normalization_edge_case.at:182 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_merge_normalization_edge_case.at:182: exit code was $at_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_normalization_edge_case.at:184: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR fmerge \$PARENT \$LEFT \$RIGHT"
echo t_merge_normalization_edge_case.at:184 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR fmerge $PARENT $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_merge_normalization_edge_case.at:184: exit code was $at_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_normalization_edge_case.at:185:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_merge_normalization_edge_case.at:185 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_normalization_edge_case.at:185: exit code was $at_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_normalization_edge_case.at:186: mv stdout merge.monotone"
echo t_merge_normalization_edge_case.at:186 >$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_merge_normalization_edge_case.at:186: exit code was $at_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_normalization_edge_case.at:188: diff3 -E --merge left parent right"
echo t_merge_normalization_edge_case.at:188 >$at_check_line_file
( $at_traceon; diff3 -E --merge left parent 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_merge_normalization_edge_case.at:188: exit code was $at_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_normalization_edge_case.at:189: mv stdout merge.diff3"
echo t_merge_normalization_edge_case.at:189 >$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_merge_normalization_edge_case.at:189: exit code was $at_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_normalization_edge_case.at:191: cmp merge.monotone merge.diff3"
echo t_merge_normalization_edge_case.at:191 >$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_merge_normalization_edge_case.at:191: exit code 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`
    ;;

  122 ) # 122. t_undo_update.at:1: (todo) undo_update command
    at_setup_line='t_undo_update.at:1'
    at_desc='(todo) undo_update command'
    $at_quiet $ECHO_N "122: (todo) undo_update command                   $ECHO_C"
    at_xfail=yes
    (
      echo "122. t_undo_update.at:1: testing ..."
      $at_traceon


# This test is a bug report.


# "update" is the only command that modifies the working copy, i.e.,
# it is the only command that may destroy data that cannot be easily
# recovered from the database.  So it should be undo-able.
#
# This wouldn't be that hard to do -- before starting an update, make
# a note of all file modifications being applied, and save copies of
# them somewhere under MT/.  The only tricky part is making sure we
# can undo tree rearrangements.
#
# For bonus points, use this to implement "working copy rollback" --
# right now, we can't modify the working copy atomically.  But if we
# always saved this information before touching any files, then we
# could also save a marker file when we start munging the filesystem,
# that we delete when finished.  When monotone starts up, it can check
# for this marker file, and either rollback automatically or demand
# the user do so or whatever.
#
# Making this work requires some careful thought, of course -- one has
# to make sure that rollback is idempotent, it'd be nice if rollback
# information didn't immediately overwrite undo information (so an
# interrupted update didn't kill undo information after a rollback),
# etc.
#
# It'd also be nice if there was a "redo_update" to un-undo an update,
# I suppose...

# Are there any other operations that mutate the working copy?  They
# should all be reversible somehow...

$at_traceoff
echo "t_undo_update.at:35: false"
echo t_undo_update.at:35 >$at_check_line_file
( $at_traceon; false ) >$at_stdout 2>$at_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_undo_update.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`
    ;;

  123 ) # 123. t_change_empty_file.at:3: modification of an empty file
    at_setup_line='t_change_empty_file.at:3'
    at_desc='modification of an empty file'
    $at_quiet $ECHO_N "123: modification of an empty file                $ECHO_C"
    at_xfail=no
    (
      echo "123. t_change_empty_file.at:3: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_change_empty_file.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_change_empty_file.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_change_empty_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_change_empty_file.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_change_empty_file.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_change_empty_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_change_empty_file.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_change_empty_file.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_change_empty_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_change_empty_file.at:5: rm test_keys"
echo t_change_empty_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_change_empty_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



# First of all, add an empty file.
cat >foo1 <<'_ATEOF'
_ATEOF

$at_traceoff
echo "t_change_empty_file.at:9: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add foo1"
echo t_change_empty_file.at:9 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add foo1 ) >$at_stdout 2>$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_change_empty_file.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_change_empty_file.at:11: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah"
echo t_change_empty_file.at:11 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_change_empty_file.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


# Add some contents to the previously added file.
cat >foo1 <<'_ATEOF'
Some contents.
_ATEOF

$at_traceoff
echo "t_change_empty_file.at:17: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah"
echo t_change_empty_file.at:17 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_change_empty_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


# Verify that the latest revision contains a patch, rather than a delete/add
# sequence (as reported in bug #9964).
cat >expout <<'_ATEOF'
new_manifest [1f13fdc7b3bdef2f32f6e349a95a96dfd9fd6e82]

old_revision [a227ca00ce56a54c36ca51b0e35ed4d0979da3b9]
old_manifest [1a4470129e06e1786a59ab846e49881afde32c8f]

patch "foo1"
 from [da39a3ee5e6b4b0d3255bfef95601890afd80709]
   to [b0d699dae7df285e64265ec6b46538b0ce785da0]
_ATEOF

$at_traceoff
echo "t_change_empty_file.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR cat revision c1dc9e4d249ac7a5f6143a87a1e90246d8be0ee5"
echo t_change_empty_file.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR cat revision c1dc9e4d249ac7a5f6143a87a1e90246d8be0ee5 ) >$at_stdout 2>$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_change_empty_file.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_change_empty_file.at:32:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_change_empty_file.at:32 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_change_empty_file.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_change_empty_file.at:33: cmp stdout expout"
echo t_change_empty_file.at:33 >$at_check_line_file
( $at_traceon; cmp stdout expout ) >$at_stdout 2>$at_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_change_empty_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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  124 ) # 124. t_largish_file.at:1: largish file
    at_setup_line='t_largish_file.at:1'
    at_desc='largish file'
    $at_quiet $ECHO_N "124: largish file                                 $ECHO_C"
    at_xfail=no
    (
      echo "124. t_largish_file.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_largish_file.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_largish_file.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_largish_file.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_largish_file.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_largish_file.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_largish_file.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_largish_file.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_largish_file.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_largish_file.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_largish_file.at:2: rm test_keys"
echo t_largish_file.at:2 >$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_largish_file.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon




if which mimencode 2>/dev/null; then
  UNB64_COMMAND="mimencode -u"
elif which recode 2>/dev/null; then
  UNB64_COMMAND="recode /Base64"
elif perl -MMIME::Base64 -e 1 2>/dev/null; then
  UNB64_COMMAND="perl -MMIME::Base64 -ne 'print decode_base64(\$_)'"
elif python -c 'import sys;sys.exit(not hasattr("", "decode"))' 2>/dev/null; then
  UNB64_COMMAND="python -c 'import sys;sys.stdout.write(sys.stdin.read().decode("'"'"base64"'"'"))'"
else
  # This is lame!  We should XFAIL the test so the user knows that
  # they're not, you know, actually testing the software.  But
  # Autotest runs XFAIL conditions in a completely different shell, so
  # we can't without duplicating the whole test here.
  exit 77
fi
# Poor man's logging:
$at_traceoff
echo "t_largish_file.at:3: echo \$UNB64_COMMAND"
echo t_largish_file.at:3 >$at_check_line_file
( $at_traceon; echo $UNB64_COMMAND ) >$at_stdout 2>$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_largish_file.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



if which gunzip 2>/dev/null; then
  # This is lame!  We should XFAIL the test so the user knows that
  # they're not, you know, actually testing the software.  But
  # Autotest runs XFAIL conditions in a completely different shell, so
  # we can't without duplicating the whole test here.
  UNGZ_COMMAND="gunzip -c"
fi
# Poor man's logging:
$at_traceoff
echo "t_largish_file.at:3: echo \$UNGZ_COMMAND"
echo t_largish_file.at:3 >$at_check_line_file
( $at_traceon; echo $UNGZ_COMMAND ) >$at_stdout 2>$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_largish_file.at:3: 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 that we can handle a 15 meg file in the database

# This is only 'largish" -- we should check for >4 gigabytes too, for
# a real "large file", but that would be kind of rude from the test
# suite.

# We used to use dd here to generate the file, but MinGW has no dd

cat >largish.gz.enc <<'_ATEOF'
H4sICOSeIUICA2xhcmdpc2gA7MEBAQAAAICQ/q/uCAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACA24NDAgAAAABB/197wwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
wEXMQfjCwOHkAA==
_ATEOF



$at_traceoff
echo "t_largish_file.at:286: if test \"\$OSTYPE\" == \"msys\"; then
  mimencode -u -o largish.gz largish.gz.enc
else
  eval \$UNB64_COMMAND <largish.gz.enc >largish.gz
fi
"
echo t_largish_file.at:286 >$at_check_line_file
( $at_traceon; if test "$OSTYPE" == "msys"; then
  mimencode -u -o largish.gz largish.gz.enc
else
  eval $UNB64_COMMAND <largish.gz.enc >largish.gz
fi
 ) >$at_stdout 2>$at_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_largish_file.at:286: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_largish_file.at:286: eval \$UNGZ_COMMAND <largish.gz >largish
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o largish
fi
"
echo t_largish_file.at:286 >$at_check_line_file
( $at_traceon; eval $UNGZ_COMMAND <largish.gz >largish
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o largish
fi
 ) >$at_stdout 2>$at_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_largish_file.at:286: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_largish_file.at:288: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add largish"
echo t_largish_file.at:288 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add largish ) >$at_stdout 2>$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_largish_file.at:288: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_largish_file.at:289: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_largish_file.at:289 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_largish_file.at:289: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


BASE_R=`cat MT/revision`

$at_traceoff
echo "t_largish_file.at:292: mv largish largish.orig"
echo t_largish_file.at:292 >$at_check_line_file
( $at_traceon; mv largish largish.orig ) >$at_stdout 2>$at_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_largish_file.at:292: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_largish_file.at:294: echo foo > largish"
echo t_largish_file.at:294 >$at_check_line_file
( $at_traceon; echo foo > largish ) >$at_stdout 2>$at_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_largish_file.at:294: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_largish_file.at:295: cat largish.orig >>largish"
echo t_largish_file.at:295 >$at_check_line_file
( $at_traceon; cat largish.orig >>largish ) >$at_stdout 2>$at_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_largish_file.at:295: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_largish_file.at:296: echo bar >>largish"
echo t_largish_file.at:296 >$at_check_line_file
( $at_traceon; echo bar >>largish ) >$at_stdout 2>$at_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_largish_file.at:296: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_largish_file.at:297: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_largish_file.at:297 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_largish_file.at:297: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


MOD_R=`cat MT/revision`

$at_traceoff
echo "t_largish_file.at:300: mv largish largish.modified"
echo t_largish_file.at:300 >$at_check_line_file
( $at_traceon; mv largish largish.modified ) >$at_stdout 2>$at_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_largish_file.at:300: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_largish_file.at:302: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$BASE_R base"
echo t_largish_file.at:302 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $BASE_R base ) >$at_stdout 2>$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_largish_file.at:302: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_largish_file.at:303: cmp largish.orig base/largish"
echo t_largish_file.at:303 >$at_check_line_file
( $at_traceon; cmp largish.orig base/largish ) >$at_stdout 2>$at_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_largish_file.at:303: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_largish_file.at:304: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$MOD_R modified"
echo t_largish_file.at:304 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $MOD_R modified ) >$at_stdout 2>$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_largish_file.at:304: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_largish_file.at:305: cmp largish.modified modified/largish"
echo t_largish_file.at:305 >$at_check_line_file
( $at_traceon; cmp largish.modified modified/largish ) >$at_stdout 2>$at_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_largish_file.at:305: exit code 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`
    ;;

  125 ) # 125. t_add_intermediate_MT_path.at:3: files with intermediate MT path elements
    at_setup_line='t_add_intermediate_MT_path.at:3'
    at_desc='files with intermediate MT path elements'
    $at_quiet $ECHO_N "125: files with intermediate MT path elements     $ECHO_C"
    at_xfail=no
    (
      echo "125. t_add_intermediate_MT_path.at:3: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_add_intermediate_MT_path.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_add_intermediate_MT_path.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_add_intermediate_MT_path.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_add_intermediate_MT_path.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_add_intermediate_MT_path.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_add_intermediate_MT_path.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_add_intermediate_MT_path.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_add_intermediate_MT_path.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_add_intermediate_MT_path.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_add_intermediate_MT_path.at:5: rm test_keys"
echo t_add_intermediate_MT_path.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_add_intermediate_MT_path.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_add_intermediate_MT_path.at:7: mkdir -p dir1/MT"
echo t_add_intermediate_MT_path.at:7 >$at_check_line_file
( $at_traceon; mkdir -p dir1/MT ) >$at_stdout 2>$at_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_add_intermediate_MT_path.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_add_intermediate_MT_path.at:8: mkdir -p dir2"
echo t_add_intermediate_MT_path.at:8 >$at_check_line_file
( $at_traceon; mkdir -p dir2 ) >$at_stdout 2>$at_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_add_intermediate_MT_path.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_add_intermediate_MT_path.at:9: mkdir -p dir3"
echo t_add_intermediate_MT_path.at:9 >$at_check_line_file
( $at_traceon; mkdir -p dir3 ) >$at_stdout 2>$at_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_add_intermediate_MT_path.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


# Check both implicit recursive add...
cat >dir1/MT/testfile1 <<'_ATEOF'
testfile 1
_ATEOF

cat >dir2/MT <<'_ATEOF'
MT file 1
_ATEOF

$at_traceoff
echo "t_add_intermediate_MT_path.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add dir1"
echo t_add_intermediate_MT_path.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add dir1 ) >$at_stdout 2>$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_add_intermediate_MT_path.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_add_intermediate_MT_path.at:17: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add dir2"
echo t_add_intermediate_MT_path.at:17 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add dir2 ) >$at_stdout 2>$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_add_intermediate_MT_path.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_add_intermediate_MT_path.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_add_intermediate_MT_path.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_add_intermediate_MT_path.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



# ...and explicit add.
cat >dir1/MT/testfile2 <<'_ATEOF'
testfile 2
_ATEOF

cat >dir3/MT <<'_ATEOF'
MT file 2
_ATEOF

$at_traceoff
echo "t_add_intermediate_MT_path.at:25: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add dir1/MT/testfile2"
echo t_add_intermediate_MT_path.at:25 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add dir1/MT/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_add_intermediate_MT_path.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_add_intermediate_MT_path.at:26: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add dir3/MT"
echo t_add_intermediate_MT_path.at:26 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add dir3/MT ) >$at_stdout 2>$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_add_intermediate_MT_path.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_add_intermediate_MT_path.at:27: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_add_intermediate_MT_path.at:27 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_add_intermediate_MT_path.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_add_intermediate_MT_path.at:29: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout outdir1"
echo t_add_intermediate_MT_path.at:29 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout outdir1 ) >$at_stdout 2>$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_add_intermediate_MT_path.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_add_intermediate_MT_path.at:30: cmp dir1/MT/testfile1 outdir1/dir1/MT/testfile1"
echo t_add_intermediate_MT_path.at:30 >$at_check_line_file
( $at_traceon; cmp dir1/MT/testfile1 outdir1/dir1/MT/testfile1 ) >$at_stdout 2>$at_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_add_intermediate_MT_path.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_add_intermediate_MT_path.at:31: cmp dir1/MT/testfile2 outdir1/dir1/MT/testfile2"
echo t_add_intermediate_MT_path.at:31 >$at_check_line_file
( $at_traceon; cmp dir1/MT/testfile2 outdir1/dir1/MT/testfile2 ) >$at_stdout 2>$at_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_add_intermediate_MT_path.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_add_intermediate_MT_path.at:32: cmp dir2/MT outdir1/dir2/MT"
echo t_add_intermediate_MT_path.at:32 >$at_check_line_file
( $at_traceon; cmp dir2/MT outdir1/dir2/MT ) >$at_stdout 2>$at_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_add_intermediate_MT_path.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_add_intermediate_MT_path.at:33: cmp dir3/MT outdir1/dir3/MT"
echo t_add_intermediate_MT_path.at:33 >$at_check_line_file
( $at_traceon; cmp dir3/MT outdir1/dir3/MT ) >$at_stdout 2>$at_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_add_intermediate_MT_path.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


# renames

$at_traceoff
echo "t_add_intermediate_MT_path.at:37: mv dir1/MT/testfile1 dir1/MT/testfile1x"
echo t_add_intermediate_MT_path.at:37 >$at_check_line_file
( $at_traceon; mv dir1/MT/testfile1 dir1/MT/testfile1x ) >$at_stdout 2>$at_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_add_intermediate_MT_path.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_add_intermediate_MT_path.at:38: mv dir2/MT dir2/TM"
echo t_add_intermediate_MT_path.at:38 >$at_check_line_file
( $at_traceon; mv dir2/MT dir2/TM ) >$at_stdout 2>$at_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_add_intermediate_MT_path.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_add_intermediate_MT_path.at:39: mv dir3 dir3x"
echo t_add_intermediate_MT_path.at:39 >$at_check_line_file
( $at_traceon; mv dir3 dir3x ) >$at_stdout 2>$at_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_add_intermediate_MT_path.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_add_intermediate_MT_path.at:41: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename dir1/MT/testfile1 dir1/MT/testfile1x"
echo t_add_intermediate_MT_path.at:41 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename dir1/MT/testfile1 dir1/MT/testfile1x ) >$at_stdout 2>$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_add_intermediate_MT_path.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_add_intermediate_MT_path.at:42: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename dir2/MT dir2/TM"
echo t_add_intermediate_MT_path.at:42 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename dir2/MT dir2/TM ) >$at_stdout 2>$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_add_intermediate_MT_path.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_add_intermediate_MT_path.at:43: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename dir3 dir3x"
echo t_add_intermediate_MT_path.at:43 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename dir3 dir3x ) >$at_stdout 2>$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_add_intermediate_MT_path.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_add_intermediate_MT_path.at:44: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_add_intermediate_MT_path.at:44 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_add_intermediate_MT_path.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_add_intermediate_MT_path.at:46: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout outdir2"
echo t_add_intermediate_MT_path.at:46 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout outdir2 ) >$at_stdout 2>$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_add_intermediate_MT_path.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_add_intermediate_MT_path.at:47: cmp dir1/MT/testfile1x outdir2/dir1/MT/testfile1x"
echo t_add_intermediate_MT_path.at:47 >$at_check_line_file
( $at_traceon; cmp dir1/MT/testfile1x outdir2/dir1/MT/testfile1x ) >$at_stdout 2>$at_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_add_intermediate_MT_path.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_add_intermediate_MT_path.at:48: cmp dir1/MT/testfile2 outdir2/dir1/MT/testfile2"
echo t_add_intermediate_MT_path.at:48 >$at_check_line_file
( $at_traceon; cmp dir1/MT/testfile2 outdir2/dir1/MT/testfile2 ) >$at_stdout 2>$at_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_add_intermediate_MT_path.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_add_intermediate_MT_path.at:49: cmp dir2/TM outdir2/dir2/TM"
echo t_add_intermediate_MT_path.at:49 >$at_check_line_file
( $at_traceon; cmp dir2/TM outdir2/dir2/TM ) >$at_stdout 2>$at_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_add_intermediate_MT_path.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_add_intermediate_MT_path.at:50: cmp dir3x/MT outdir2/dir3x/MT"
echo t_add_intermediate_MT_path.at:50 >$at_check_line_file
( $at_traceon; cmp dir3x/MT outdir2/dir3x/MT ) >$at_stdout 2>$at_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_add_intermediate_MT_path.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


# explicit drop

$at_traceoff
echo "t_add_intermediate_MT_path.at:54: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR drop dir1/MT/testfile2"
echo t_add_intermediate_MT_path.at:54 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR drop dir1/MT/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_add_intermediate_MT_path.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_add_intermediate_MT_path.at:55: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_add_intermediate_MT_path.at:55 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_add_intermediate_MT_path.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_add_intermediate_MT_path.at:57: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout outdir3"
echo t_add_intermediate_MT_path.at:57 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout outdir3 ) >$at_stdout 2>$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_add_intermediate_MT_path.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_add_intermediate_MT_path.at:58: cmp dir1/MT/testfile1x outdir2/dir1/MT/testfile1x"
echo t_add_intermediate_MT_path.at:58 >$at_check_line_file
( $at_traceon; cmp dir1/MT/testfile1x outdir2/dir1/MT/testfile1x ) >$at_stdout 2>$at_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_add_intermediate_MT_path.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_add_intermediate_MT_path.at:59: test ! -e outdir3/dir1/MT/testfile2"
echo t_add_intermediate_MT_path.at:59 >$at_check_line_file
( $at_traceon; test ! -e outdir3/dir1/MT/testfile2 ) >$at_stdout 2>$at_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_add_intermediate_MT_path.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


# recursive drop

$at_traceoff
echo "t_add_intermediate_MT_path.at:63: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR drop dir1"
echo t_add_intermediate_MT_path.at:63 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR drop dir1 ) >$at_stdout 2>$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_add_intermediate_MT_path.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


# we expect a non-zero exist status here because directory deletion is
# broken once that's fixed this should fail and can be changed to
# expect commit to work

$at_traceoff
echo "t_add_intermediate_MT_path.at:69: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit"
echo t_add_intermediate_MT_path.at:69 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit ) >$at_stdout 2>$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;;
   3) ;;
   *) echo "t_add_intermediate_MT_path.at:69: exit code was $at_status, expected 3"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_add_intermediate_MT_path.at:71: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout outdir4"
echo t_add_intermediate_MT_path.at:71 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout outdir4 ) >$at_stdout 2>$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_add_intermediate_MT_path.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

# and these will need updating to all be ! -e too
$at_traceoff
echo "t_add_intermediate_MT_path.at:73: test -e outdir4/dir1/MT/testfile1x"
echo t_add_intermediate_MT_path.at:73 >$at_check_line_file
( $at_traceon; test -e outdir4/dir1/MT/testfile1x ) >$at_stdout 2>$at_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_add_intermediate_MT_path.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_add_intermediate_MT_path.at:74: test ! -e outdir4/dir1/MT/testfile2"
echo t_add_intermediate_MT_path.at:74 >$at_check_line_file
( $at_traceon; test ! -e outdir4/dir1/MT/testfile2 ) >$at_stdout 2>$at_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_add_intermediate_MT_path.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_add_intermediate_MT_path.at:75: test -e outdir4/dir1/MT"
echo t_add_intermediate_MT_path.at:75 >$at_check_line_file
( $at_traceon; test -e outdir4/dir1/MT ) >$at_stdout 2>$at_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_add_intermediate_MT_path.at:75: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_add_intermediate_MT_path.at:76: test -e outdir4/dir1"
echo t_add_intermediate_MT_path.at:76 >$at_check_line_file
( $at_traceon; test -e outdir4/dir1 ) >$at_stdout 2>$at_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_add_intermediate_MT_path.at:76: exit code 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`
    ;;

  126 ) # 126. t_merge_3.at:1: (minor) test a merge 3
    at_setup_line='t_merge_3.at:1'
    at_desc='(minor) test a merge 3'
    $at_quiet $ECHO_N "126: (minor) test a merge 3                       $ECHO_C"
    at_xfail=yes
    (
      echo "126. t_merge_3.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_3.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_merge_3.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_3.at:2: exit code was $at_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_3.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_merge_3.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_3.at:2: exit code was $at_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_3.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_merge_3.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_3.at:2: exit code was $at_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_3.at:2: rm test_keys"
echo t_merge_3.at:2 >$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_3.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon




if which mimencode 2>/dev/null; then
  UNB64_COMMAND="mimencode -u"
elif which recode 2>/dev/null; then
  UNB64_COMMAND="recode /Base64"
elif perl -MMIME::Base64 -e 1 2>/dev/null; then
  UNB64_COMMAND="perl -MMIME::Base64 -ne 'print decode_base64(\$_)'"
elif python -c 'import sys;sys.exit(not hasattr("", "decode"))' 2>/dev/null; then
  UNB64_COMMAND="python -c 'import sys;sys.stdout.write(sys.stdin.read().decode("'"'"base64"'"'"))'"
else
  # This is lame!  We should XFAIL the test so the user knows that
  # they're not, you know, actually testing the software.  But
  # Autotest runs XFAIL conditions in a completely different shell, so
  # we can't without duplicating the whole test here.
  exit 77
fi
# Poor man's logging:
$at_traceoff
echo "t_merge_3.at:3: echo \$UNB64_COMMAND"
echo t_merge_3.at:3 >$at_check_line_file
( $at_traceon; echo $UNB64_COMMAND ) >$at_stdout 2>$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_3.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



if which gunzip 2>/dev/null; then
  # This is lame!  We should XFAIL the test so the user knows that
  # they're not, you know, actually testing the software.  But
  # Autotest runs XFAIL conditions in a completely different shell, so
  # we can't without duplicating the whole test here.
  UNGZ_COMMAND="gunzip -c"
fi
# Poor man's logging:
$at_traceoff
echo "t_merge_3.at:3: echo \$UNGZ_COMMAND"
echo t_merge_3.at:3 >$at_check_line_file
( $at_traceon; echo $UNGZ_COMMAND ) >$at_stdout 2>$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_3.at:3: 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 a bug report.


# This is a real merge error -- it should be a clean merge, but it
# produces a conflict.

cat >ancestor.gz.b64 <<'_ATEOF'
H4sICLwJGEICA3AA7b1rcxtHkij6Hb+ihAnJgAxCJv0UafEc22PPKs6sZmKtuXtOeB2IfkFs
CejGdDdI0V6d334rM+v96G6AlOS7dxkSCXTXIysrKysrMyvzyROW1bvbpnx11bHZD3N29tln
X7BXTXKb1xW7qpOmYN+Kr/9zV6f122VWby8nT56wZLNhWK9lTdEWzXWRL+H5psyKqi1y1tWs
uyrYbp/yR2xf5UWDD7qi2basXuOXv7z4B/vL3//KZpfP2Nkc6rdFgW/W5aZgP/zt7//n+Yu/
sHXdsLzoknLTTqBQd1W2jP+7qm/Ybb1n06R9A4WmWPWHp0/5sKq2S6qOPjT7rONNbJOsqdsl
Y4+TKn8MDUHlq+S6AGjzmrU1SwveTsGS6pbVvLEGAWlZkmVlXlQdH/YtK6tss88LBLfLy6pb
Xi1ZclO09bZYTv6UF+uyKthq9fPLP/+w+uFvL35++d2Ll6t//e6Hf/vbz5PJn0R19m2yeVU3
ZXfFMaoflhxBCYfWelbzMRSJVW5Ttp35/brInFrF2+7JVdJerbbJ7tLsN615e09wYLdtV2yf
7JLuanm12116hdorTgP5atc14feb4m2ZJZtVlrQdldBFpmnSltmqrJdXV1PjcXaVVK+KVVt0
7gsxaa3zPC/X6xWHMbtyXsAQ/Pb5hBRNVTTO42q/LRoOz3WdJanzrk2qsrvFhzCr9b7hFJBs
bls+9WVF9IYUeZXsdkXFavhXIBXf1GydbMtNWQBVQ+2m2CQdXwFEd3u+PM5ZwgDHK2qUN8ap
MWF52eCk3cIMwerBheWUzOqGt7Crq7xlxdsk6zgBcmpNWFU322RT/sZ7gnpYixNJ0wB2t5xW
L2A13DJYxADlTXKL6+6Gk1xZvYKXSMHJtuBjXENrXVlXAgxcuxYgLYeUjxGawhd8qrqCr6Yi
ya6MJ7AuE77Udmzd1FtsikPUlhwghkuoXJdF07JZV+btHIbCKX4r24HPHIE74CmcEHhLbbHl
JFFm0FKxwYHBKBKm6ZfdXJW8Lqd1/ri73RVshpMFXEOieL4AlPGxLhDJVY6IbqC1TVm9YbOk
ovXOwZov4Tcf8VW93+ScJXD2Vf5zz7kC8A/eicK3RM5yMoF++cpnBacz9jvbwfeV6n4hHiBc
7+jLhaqz/+oL6PFiAhjk3JJ/Zk1ddyv48Ix9djGZEDFN+INVy8kzKya/TxgWzLrmgj6KN7M5
O4enM9XEp+x0zn5/JypUnDHwMr+z5zNeij14xv7x/MXLr75Y/TD77O3a+ZnPL/h8cCquoMlP
P71g7ybvLvRw93xqX1WcBjc1pylECt8iOLkCASqw7eec3N8UDQ7AfsHgxYzz1PNzXhGIFFkC
e8TaOS8MFRjjjGfDiWxVFTcX+MBpY5dxlBEPWNKfWbsQFeZUA8keVjzLrorsDcfIDaznFl+W
azYTpfE79YqVtnsODCeHhF3zlZcjCQJjuhJF1HfWbXcr/e2ZfjNrBQy6QT5GvrVVanV/BoR7
ytSIWtl6e36uG29l09s3TrvPZ9V+s1kBsfOn7D//k3366cyos0yLV2U1m8/Zs2dmW8uiyvlT
auYd/hYzv8vgITwy52ZT12/2u5mH/jnNmpow0YiYElkrm1Obu6a85mzjnH+RjPtbu8lL8eIC
CU8skRBFAdNahV7Eqk3g7QqxpZ7N5kiYwfIMiyKBxbpaIglPpzg6MXJRi8Ov4AAinuhp8nGI
QCj0w0wFYRVt6kUGDFSxBmJwAAkyHM4bL/w1BwBcEOXIl9DITHAM/QBbXMimFl478wuruPqk
FjEyWLuUfrcjsedZbz1c+6povCx9JYKZ8Nc72JG/BcBhtOzlpdicxY7EGQFNOt9NV53qYDaf
vVQNX4tGAUm/M5OwaUpRBPqWWricXQvqNlnlavWq2q+yt2/Pz6VY9i3H6UJjY6HggReX7NLY
Vy+G28FfbgtYmQsGfFtKC1i3uiFczLukFAsOSy6MLi/tTe4CZSOgwBY3UL77c94kKZpksZyI
HYGg8o6YI8QDkLGnJMFM9X6PAgjt7qoSFx8K2rRplweRPUsqkCquuRxRUFt8aq6LCoQMzkBB
8MD9Ew8h5U6INPADNHxyydgvSPbwcYb0jMibL2Qx/TOy2HK5ZN7Prx+v415isRfugk1Yz49B
JAgIkNWit4aiQJeNXxqkUNV5MWZt4DGDbznqHPKt3cZYWMRqsGgxui3oUvwbdAQ82u73/By5
wUoe1xSfKC3WXZ5crssGWZHuDAbt9QEPj+6jLfirfOl1xUftd1Tmd+2H/mBH1zUn7Ik+0p2f
J3mOos9Myz+yvYTaez6zzilLXqOgOi0fAhdCEhRN4oW0oBIvU1Zt0XS8qSPAXChupjABdHTv
0D+f5cWmS6x64smBQ2SynniGqxYlBli6Mz4i54lm02LLmM+jmNrtNrcrbD+ALPjSw0JcRLZN
dkDpvFVINzEFfYaR1YsFAtV5iABBP9Hx8zaLrogRSx6mCqpk0UUeoAu7WGzS7VJicPkAvHyN
Hw4urzQCWiw1BCwWGoK1QYFsaCFaD9PwCKilwYVoF4uNwS4VW1PpfGBY4Sk4ZlR6XvoG1Tsv
VqGhIU1Q0rbG5CuYzs9dUdx6HZTJzQ3FImsYFRa0qZ09eoTcwqQqvyg+FSWtudNF7cdOWbtV
66koafBdXdB4iFgbhzR+HOluZ0P4WMpiAQS47xyiDr8MVbS2JXqlBjI4Di6orXQDAUKHJ4Fh
ehsmlXvwjHm75GHAmPgbD06AUyuAAuz5MJDMmVnxXWYEWFzE/+n5//7XH8+VmaOsivW6zErc
rNM9P7Vud019jd207AaVlE3xz30JhgsG2vICzv3UltJCoxXFXgUz/oSv4KtkR5pWkOp4EXGu
SnbzJfuJF6nqG2rrpvhks2FJ2+63YKVJOrYuboSF5Kbkr9JC9gDtMsIQKPp5feheMpzdtwoP
C/Xp0pNDmzV75hC30F1JXRcUeeCWoXlin37arOdKpdespfgK6xeRLtoQdMDxVBhKm3WyaYs7
TDaXK8bTYGDzUjQYGluY2fQxFhST1OJ3tgZ36dvNGkxePx5k7vZWYPBW87HmbRw+i63z76iU
ws0IyJjT/AY08FnRtnXTTiZltQEzW2eIi1oFtiLVV0BBtJuzCepvpHJtKbRk2JVolHRcgWbx
lDam0e7WbtA+YOoGtfpvoEFS0xlNwtlO62rwWKe/ekup51hqgmgCYbauNXojmzeOiDR/ig3l
++0O1MeTJ4/VORUkqAm8MBVVYUNA4LzvqbhU6YbA+uvsp9n0+x//8vyF6t0s/cnD9pP/qKZz
9pCRFl2wKqdVf9DAnTyOVOKi1UyotM0ICMtDVAY9zEWvcjroI6HO0MNjlR9f/HkM8O8COMWR
jMCmYcRTBbooBqlgGHd9lMKR1nZhrPHnvWjTXZ7jun+IylM04sFHXLQP2wXpzh62AJcaH4fP
+OwsnHLO3JceFzEWQjk3252F2INdGlibYxFk/wMM282UnZMd2wI1al0wbS4O/7B7nPfRT3Dq
QpQjVb/jlqJruKZicQoCza5PQCbJsk/ZlOHSmPLpJf1WuBAtGixlrB9v5KEu+cAfPyEuZZkF
kUmZOIFtkT+H7Y8Lm2X7ui4rcYbij7RIc2kc9SZRnWqkSirtT36Rko8MrTny5QoNY/C0rKtZ
IhfVgiW0juK60VSXTYfKYm90YCyaGQKxIFiUJRGRDVLWg1ebOk02K+FQAa4Qb4vcXsrPqQ0p
dShC5fMwJGX5z4bPnYhOkivE9CVVMZPaIvMAGjp/msXolBg4epLYaB07Q6dOs5jVlvkQClmH
zchZsx9Vag8ffYL//ycilcjyGA5bHhMs3nZNknWoHeGH3Spf2YoT8xzDAou5rHrME6El/oi4
XXtwNWJ6LU1S7KjFes5aJXpNhPdl/jy2LxO4Up8kBRlVX4BlvHekm3faPsu0gfY72szx8/eX
wSnBfvQgeY3vNd63C42m7y7JfwS56jLbcAqfaUlFdWO3FETPNoydbRQ5Mby8i9HZG36ILoQc
722k/mYSJgVqZA6mb7MPWrNVTZr8dlVXojtaC5FOd0m/gQ1+HOVzl6ChV2mci018SyMILiJv
qTH4DMZnxjw0LfRg9VuiDF53YTaARUL7N7Xgln0XQh4VATNaWbQclZ0S58o7IXAUEgEqoWrG
Tn4rnJ1w3I7Adk0MIHsAfaBrZzMQ8BRkE9r2V4Qtq7kYdho9qqGtytx0DH2DRhb/hJ5wnJOf
XBqlgQIjivqBfoITwReP2b+Bi65Vzi1qpLsEN6LgjOGmA0eYBSFRyp8hBMIxY46rYHghLySY
muaHSNeoYukg+aIqwNcDVJFJi94XWw7Sq4IcvMF1sl6TD0ZZXSdNmZDDmvLXAPdTDgJHYVHV
+1dXUI+87pKOmt0U18VmGWEBckdvm4xjSu3vLaE6uj9b4sKip5X5qGZAnhhoRWANRY0sqTiG
QRva7jZlB666DJhNkbP0VlRsl8LcY2r3wH2IE/enttJePH32zIJAPBaG5OPaAdh1OxEGaYlx
C0uIizJVp44J92AdH9lx2AxhzpsRR0jWn+NqzB4R19FnhtSZ2gDNHE2mDYvsNKhk/QjABYRg
n1NGuO/H4BSeadOAjZi/ycu0MGyzlrA6L+psIUU/Zuv5+r08AjKh2lK8/l8z5dCAFoDHpRI0
h47WZgd0xH4tzFe2e4R+L/w/ZnpfuEWTxeu5W/JBqCiYsuyi74RkKzEeH2epxxlGqgl2AIOH
I+OB9rQ1B4F+0+X4AQeKevgrtV9KT00YQmwGoKwldg06HIXG5AhuD8Y5JDlT6QjBvnAScfTd
oTnAFaHrikvm29WuAV63Ak3cLKBx3rXOaQE990RlOio8n+3EyOUNB1KwmiMZo4beGQSIhLeL
Ex2amfZNA6dkZTwxxGYcP/56Zpo/nHMajiWpspZTvHjHed+mYDM1QBoYdIWD0s9pbJrCrfk1
pjsyS/DLoV4AxOkOH/n8Ah8LmQjLusTsqcyxOxQ15BRZFJlyanxjNsLPN4VV4neHggXywx1d
hDTR4Yl/TROvh+3WFbzToCanAN+w+JBvik/4fgWLeIH3xYQdAm90JBu8SYhvncpq5SM3AuDR
suctWPsah6vgfz0XtTzgBAn6FfxhOmYLNWOOocKp+W7ifkLqhnukRFBaCa1oKeDxp/TJisAX
Bq1rvbJB3u9w6TsLxeIA7mK5iPEgus+ljkNl5R/kA1wJ4VBr2fCMBk9l39lZtP4+uJFNRY41
SCvZ5rEN0V9Fqo61Zs2ph2tKZUU+Ei4pKAbUj5Md2v48n8wIJAOO6T0/cYToO1JidoRDKQ5b
PrL5n3wq2N8upsPz+S7Zp3r2uOCWKA5I4yhVnHPUgIVGY9x9HcDvOZM2zjnoXGfdnMynM3j9
+yS6neBRoafz6M0cs086htAX6p6edLcSCvqOvO5gcCwXZQHg8DUjcS2xMQ9S+h5Vd6se0mUq
1B3LR+ijMQxk4LyFXjchOIfuOJluF3T2kbDbwEtXGyoDw9DjsN/RiOwhvQvqkukG8Cp5FRPl
ToP6w1DJs7m+DuqoznYJ2X2BRZ6KB9KRi1e8oCOkba6eIkwg6E6B7sdLhKcuDz6N8uAhGeOM
WItnEpHyxZnDZ/wN2eLJzsvXPk9Td4P4uWTc9uBWhB9BC87TaGsGHJYl92h1cGSVC17aGD4A
PYUMI1OIVEUrnDRGFKUCWFb2LXzSVGwJuLV2VWz4mm3NG579F5cmVXGzyuHjzHKeGqw4g+vK
9jNH1hnum/q1b+Y9gkbxopn02Rhsh9E1Lmbfq/LWA7xFdso/0KrolMeAfEcvjUPO75ZgAR3x
BgycSbKHamF3dj7BUNR0hVHHDNEe9W6e1+SdXRyYmOiXGP9hX9FMd7wD8JeliBug1BIunvK+
Nt6OBP1kC448W7i+XFPQgLasXm0KbYZdMvb/4E3ystrt4fr7LV0vp3InMt6B6Onmqm4L1tab
wgyGUGIvDL0pHEgYXkQm3ZkRVAGKw4Kmuzv6auVNwfYtqutUYY6H6qR4W7YdfCF1AWPfbeA+
Nie162Jzu7CApyuf2/2mKx3woZzoKEt4NxBBRpRQ8WDEQDm5USAN9GnGWDJwmuKgANgcgJcQ
IabebOobcNIBxeG1RmPLZjclRwO5K7XU0m6TZKR+5/2UjbxrnjNwduazugAQMn6Qa4v5ubhm
ecJ+mU5/Nb6s69r7voA4Jw099sGq6s5oLVDXak83ZnsdwXy2Mn4A0DjhybtgKdko2hecvVf7
IpNARCu8a24Di62nj+C2SfYMxzj+fIY7KL2ztzoVyWCn4xcMubw9LnV9vhebmlHqQlg3Ltnp
PKb8M9tAcYCJbd4A0tjpexWJZlsoDrAnR41FH6O8UBG7JZGwFZQhgzg4QqHd7PmRbMtPB03D
R/OocFRWV019o0O7XBerdVJu9k0xK5Y3V0lnu16Z4t2rolutMWgBghFyC4Wr4hPPKMyPGZOA
i0KEXDkhSjrsK9ZtdwAnKspmHaoyLZ3SCIGMnE75G3P3MYiU3tlEyrtd7vbt1SpNsjez4SNl
F9ROBdx5+aBNNxStPoEeG6U+wW9CfaK0JTvw4tkZMTx8Hcc9Tp7FMw6YKhsEEVegwyHNhbyO
npmvanDcPUHNNZE/rEry7BUOmoAFsbL5F3E0Ntghf48ICeh6AMWHuUhoAXTneK+ZE7azfdac
V7YhNvwuUM3Ux6s3wRGF7ZiPWCaVCqFxt7YxkPDYCgtgrEO98wRcLg9wdBmN9RDo5CEy8vgm
jophPy311jvRWZuf1PTPPB/x+cXw/sjqTY4sYoGyqtQI2KsJypBDHpSBT6LMyKOlPAAHtNjy
dKmK2ExNKxMABudWh3Ie90sDnMHSrw0dNB6JkGBoQzXtddEDpIQjpqx02Zk8usGoFwrbjqbS
YBB6PiTWra13FIxy9BxGx9zSC6k8ORKokhzioMoSmixioMqhwLFJlQ0CRfcm3pQ7dH/fyViN
7GHLeSw7V77w1tL17zSoWYrfZKAvofsM1CQacB6GZqFPt2xe/yAnKhiHCT3cpPFGcc8j8KDn
H705GqObH6J2jE0HbsslHjVndF7ScccALjjVdmaIHEfeZWPo+GLSYwpS5ZCV9JiDnI1LHMOD
1KvNfP0YMmCMYoh8kCBY4ciBG2g3wW/5ORGE6djw5z0WSTzDOrg5d82QTTAaQnAJBK2iVjeA
454erCk4pIt3Nkszpyo+A6+KCqJpCp+rD4vTEZEM/B12fj/YHhMZ4sjO33kOGHh5kjEVkhNU
PUL5RHIEaU3ggCdDTU13v3z265PdL6e/Plkul/xDdXIK36tfpzLAaIWBCzcY2dTVYpnxRvG+
VM2gQQwzRW1R/EyM9ohaFrg3zg87cMCYcvGNmpmiuCb1P9D7EkdhS5foHElbXyCujCVN9h8j
tepN2tXkd8vf34ifqPUOO9NhRBY5P7fkSjiE2HYBeOKKkUav+tzYHyeQFAHv3hde+Ha/Lt/6
dzy1gvARgzlbaYWQ0TccrLAB4WJKX7Se5TN8ruqDYEolcODiYIMPdvVuJR86MRBJIzJetQUH
YGvV2Dps5aZdOl7uINWru4hwVJc6hAvLRfAApZdxCnfOGTKUZsj77yg9uRQrxPsHnq7cZaXj
FPdB/beP12CIMDqzP8N2wMJl+ytKgEUpWcyB2Ai+IKItGPMlgHMjl+GniGAxiTf6buLEeegh
w8Cauw+i66Nu/vjCWXywffDHprnYBJK/Wgh7zdyN+FZU7b4hn4Fb38bD/zgHdUNHJLVDMecy
MSjeKMyG2w56GshwdqFONOPBUotJ760SERHJlOto+unIKVYERjg+RimojPyGZlC0Z/kdAQyy
sKcrnJg+YYYfGN+qyTfshsu7Wy4xlLzWBiwkHAfC/NLV9YJCUXcdBL/uat0a7OsYwhIXKj8H
FA2ZTLCmcAeB0PtlrgKZ9MrVfjCHhqK+hTkIBYq+ERGo+ZZGUaMt6RkRERaBRFUjtqny1Fpo
CgnHtHWEdGmQoxaNlW+RJx6Px7M9Mn/CUmBqyieDTA8ergKcTzIlQZRGsQcB1qfvQeuCdghH
6YwESFK4MAyTTh2TeVtGTtN5tWcyD5xIufiNeRTLUrVIYw63SCufhZ5iW6JHo7UQBbwL8zyA
rayQ1fWKEx5HDzL2ILeM8szJiItyKjSzZFx3FER2EUFk5wkiO08QEf3buwUuCbEHqInu98Pz
Qt0/3qn7bNbOK9q7GJ66SJjJjzZj/ZKpFPvdLRyPgMbZxNjKvTHPdLkFs2aha2MbPEXLPBxl
43E2FmmHY41OBhc65rgWDdSJIohPcaYxzi1QzBMU9Ov5hbfkfOzLVn3Mu1PWt0605sCAz5tB
uvGtWwO/TnSxYEFrXbFZr3ow788mOu6t4nPqzCoV7+0hOLujAv0o4CNXfYwCfb7OBow6Aqxt
m4HWzGLOWUNrmI8RlkpLTvLa0msP9P+SCTtWUD2PfvShBVbUG3JYhxaCKiC8DWnRfOpf0y0G
TTcWUWhebqmuJiOUZj6jOq6vkGLMXE0UotiL2DXriQymn8Xv5/vcr989kYoYTI3qdtudfDWR
0pbSS41cSeNUUL/HriT5pHNhyIadXYJoUs3wcCC01xSmUb4PqS5ei1CGqoyzPgGE11oPIZ4H
G8ZLM+L4ckgXRr1gZ31iMEQ8Qu21FmoGiMBl+O+TRK2YDUSise7MRpVFHEc1tobyZ3kXBWoS
VldjJi0KNMj39YTvJpQqDd3y0HUPmBKeiJsi3ZebvOVYh7Z6a9b7Dqri84VIzob+d9WtjEAK
R2vM2dSgt6HZ3IyTMOZ94iXFVkoZtlQJ1Gqj5XbJBDxQgxLFPU42kFjrMWv3WVYUeXvBIA0c
uGUB8Cyv+V9ILQUQlWuq+Qk8Qj36es37K2SmForuCjenqVXYQjjyCBmdhUQaNCFjaVNaUyjH
5JhCC5EdIKqwXktNTaBGQGKx5mMSjvEunIqo6Hj9WE8RgSQZiAENxgYmSpGdikzGlI5QLhsZ
hRGGKaVJQ+4kZAll3ERzTPPgdtCZDXXlvLB5ahPXQOHdA3rpuUIfpkJWk9ajSH5mFnO4pbXz
Tu5FrXyESnlnmDCHFcq2ZKIlInBMwUACfFlDgklchxRbGdZSuYUoBZB2RgSnxsxxZFYlqMyW
ZuWyWJIarqLcedZiBG+9NWSS5Isfcl2WFVwnANWg2UjLd//sajkZcWEVdn9zSSlFZUQ3bshP
wrvRqu1e7r2DHOyab+WyI39wXG3SBIirTuhEXYyBGnAnojPuqwxyJ4oVaU1/xG4qdyH+d2KD
0RRtvbmWUyhAgMDE5r2NUE+ffrpTHlmDhghnVXkpXahcyJEitNQMtxf7+GBvct1C8jvJr8g7
NsI+HMSAsymiOyk3ByNH9GuYOGO4Q5Ws5eAk6i4k378I82rcDyWrTlozXieR1kPdgHsSQLFh
ZfHI0T6wEeVI2YyS+kl9bBqc5dAQJkC4djjC/Jh8cT/MpS5fBiRFIdQI7TMunq51wnZdmvvD
GQQE/6MOEUqy7r+iH8g+Z9VR9+J1DZG7bmcX1JfWLwLGKnV7jTzHcsQ/0frDls3QgQyzj+o5
wb1LOB57d+AeiqDCFDFwVDxf7TXmHFbU5SsZvXge05WjN6B7FMF0YOj0aRugIOoAmVQYnLox
S2xO00w3eXLc+cruk9b0Hluw4rqo+BvL+ATWJry/omxNnDuUncHtInjQbM0YJrmoOgYbWLp/
0Hh2FFjOYgR4UFqR2g+lGsogFoo+biXbc6N/5AlIGxBhbCU8WY0nxolUeSubfuLKq9dTH4wJ
cLRGFw3HYcy1HGA+Ba+U4iNrn4+81RpVU9HzeL0wkaY9dw0Vjx5QmP7fhg2Ipp51yITo4lv2
9HZ+4UQsGoPC3EYheqC5GMwdDOqsPIDAvBeBhlLucf6e8WdwgHtG4mEJPjyvunCOD6+Yl+bD
xGkSJkrIAiLQOIRbaCWNtyKduzUzMLQjVkPPZ54KSyZxcnVVWsjSb8Izmy6S4elJQiVsgknv
OoO5PYPBFdHkzgTaS6LJe+fPWBNNfuz0OY381569ASaW0JSFotvJGUvEhAUj2iXj94BkDIrV
VvchNgEbgRYDwwxHkO2IXSXXBWa6p2AA4tryrqnTJN3c0uuE0SyD4kDLSBN5DWZbV0to7g20
l2y47JLfCh0D3j0uWtRJwd0towEueYnm7abO0fcHnYIkD6yVaLYkb1twIWr3/JdRBFO6UUPC
7+IGMjtxSTCphDiMp/EmIMYY3sUsPblE4Ynuim8Kps40UISwtJyEQ3GQcJfrSByyjKllnsos
D8bD49TSjIXPgEuXcfSV9fmDMAXrlW0f9JxBy4KgS6qyQo99IgTshE97xUmJn/Jbtm/5nG/W
7CbhE9RdQfDLcyxIpU9AQuczVaevOZTysj4/GBdvd5syK0Fhva1B0zHrrnhbHFm3/EuyKa+L
OW+5ZWlRCHLSYyhyOvDLYCr8uEBkDxMKZx1kw60ohFgbA9OWtwzwQN7duqqol13SQkgDdnLC
m77lyCrI2Q0BSgvS1tO6EK5yxrkM3dRRIcCrg3EAuoErMDhmsMJD6jHZGgyXUqAhdZa5NQJh
XJBjhgRoN3XTIgu5xRmR7eChiBZ6xR7jUnmMa6UqxMrYzg18INao0R1EpmV4hCqBdfCpBrZS
UCAD9K/PunM4Q4lh5WVefSLStcGYFjBC/oTlnEk09S0MUowbniJPxoV8k4CnYedNnQCpzJdo
UABqwzMfhMmkoA2cW7S3cIQSF41kqNULiGvHW9IE86YodoJRYZgGyYdo4lsVOgIyOxGX5SgS
zKjMAVcSQRwZ6Z6TQdFChIxbMHAsJ4JnAIGwP50iI2/F8RUQJ3szDqHUNGpzHqPbxGO8iCD5
JcKGFh1hURanW4O1QpGbBm4w0EpoMbZ8xCFDso3+bSxaW5aLiysmAs5Ewuo1jJU4P9tXJxKx
KlwGZjg/O7k8RbqgvUzE0jVYVHvAvVmxLYa9NJzbpBF9Eg0R92aBLMNfUz/pUzmFHSkowKSQ
EVAC063N/Zu9IUeNgRuauj3HEwPVup7wEILBLzUAzL04oEgZ1fJfRw8Lg+DUxBwioloocRt4
N4lt4yoP0z3s473bavIqKSu5rxq7anuF+TBTscyv6g0Yi5PNBQXtZHkNPBT5AKwEWLitDDAt
liLyb14UC+XA8NGkiyZc5BvLMZH6ZRCsCsJvbMrfxD2gAwMSQO1QbDQRacFJPhDNNADNYPwF
xbFCd+2xMzPEgv0aq4sy/uhicQnECFD06cUFvAyFKQgmxqA7XFhFhzFHXhcsP+hTY/G7Ptca
5Ahjgz6rFWsAuuQQtOFA1IZrM3gHIGx8G9uv17R1SwkCjWQQf6munKtjnDEVb+U2FDd8sFCU
FidXEGorKWNpe0gFzAsw3kOwzzmw14QR3isOMFoEo5TEXfNGhV4VQQLiroIR1z7naux4Z76e
O7C0D/ieksc68/VdeT2kL8eZj3K82g5DdLaY7U4X3elcn1NTEHcWJA/wV2dzEH5R1qLLrAtG
zkIoDvHDkChTGQdnkGOXKMejjMiF/7wF3y4dzA8P4RNbkiKBCw7B9nKjnAfmfraCkiLmJ4py
HSzE6HIZSBQYzf/V11Z6SFvuod9yOxvIJga9Bhd1GmaraXQt277bKmSmHXBlTO/gMJhEAm+S
jyAEOR8SzQI6PydA8h10f6XWPnpBPEOJwYDAopGE+e7j8mbLaTWXCVxH8eImi+RlbbL+/VDK
5QG3bNgYfck819o+dW30XcRHHs7wOuNLLDda5JJKuHg6Him9IYWiEYUUIaXmsSWMntQ6vFwo
rjgOvrQPvnQQvmQYviQC3wfIYTfBaaIvpsJtlGk2ot07QBEY0QOqFCe9nnglxvITXYSnR7/u
O1freytu5ol+AF7jBQwJt3O/1Q4XZRTzL7YKLdXfeXN/fv5vT/7643c/gWJrStMyBRfcxFln
5Rr1LboNx8sC9dPQmnLFrdvuRLG2LoHYqdRRZTe0a4oTIaqB6kO618paZiWj0cloB0aaEuHG
6CXyGK4vMCka8J3MHcIJOkLuFOWQl6NLO+qCn1nIvejnuuc5fjeiKnnfuI5rJNrODwgH8E9N
a4b7pu7EiwzwT+AsVo1AcIDf/cwb63oPF6YFT3C8M4djYohEeWZYNt8vWRQy4rJFYnxp/qCu
gBkdeDFfjHeG+1wESV50MKP2wgQx0o3cXuMlg/Fm/nBJLwOuOLnwvBmw3eSStR+oFoBuw/wa
3/SyamzYUHsCqZu6ucCpX146VHXnPQt4dFBA3dqFnxcsFh0wGAwsEPFPu33BoplfDBKS0lgU
SpATRBMloUEKikh2Q9V607UL4eWwrh8ZGhmQWdRlhtAhLRHaYZmzUH2XKaujNVPyDpAV5VdZ
z4aJT/2Wyy+Q3h0/pfNRrmrahMJXe/ZGGbHIFiOtZrDxCsmStfsdsKh8A3kt13CPphYbNni5
U2Jl3ulJvT7hj0/4eXsD4lSNlh3DLJbXvB/b6ClSoFDnaQ2xpgTJCM2soCQ08slKvIM34B0s
7FLS/pdCH8K2ckuBq+SrRFaVuGCpA8buVsrAEGvQnGzDLMpLEsf1AptLVGHUPuEIwPuNt4M9
phLbbpf0eKBPNVd9nYqWtPnKPmkhDQkCEsEtLO0ivlfctpewKdq/VRublaJ4D21Tz8QIQ2tX
LFWre+DyNgT0REpxRm/0wugQHhBDw192UunoIGVTghdGalFmUxeuYJ0IRnr7MdHmjWluDErf
h7lCy4fj7Xt7gr6927LdQrBxEcg1mH7Vx3q4297Kan4Co4zBi1foMF0Bp3ZDGCx7oZW5vg8B
0q1jTcE7kZZ8lBbQpR5njl2L2cHNevPuNSqdGxyzGh28vpsuaN+QxrdIue+nmimY5Sw7oGWk
ONYcaLAen1uCbkbzkAu3jEoRlBps6sKYLtKpWWzI78ScCKpgc71AlwRvT+obS1rQljRTSLKs
YO1YT/h+kWlkI+ldGgmJQomXrTj1npi1+JT19zKTjlQDmdcT9REoSX82O1OPe2ynycJqSthP
w2VTuyvp4BHauCRnMROQC92Z2Z0s5i2DgCRt1hs8fxlwDpYdKxizMHIl7CGjcrBCD/jO6nGX
vU1ZobWliasN5druWUSB0umo0sctiwmT1/UUK4XoANgsumPBTSV1JfmDrATbPH/IunBr/vcq
+WCrxPOpoF0b/JJ3TZ2BOx6c+Mg7wVtQbooIVxmTgK8DKd9TcIaQ16ICpPuQjo4PhZ6kVRHb
H/LVIPpRuT5S+0lcR6/QYRxF8gHFvp5VfQIRsCv8kJAhrMYJlzcJHhE7gCzK5t4HJ73DlE38
DRqYnGTo6h4Rf/3AeK+vEBWbmCsEBpzWakucBDHJeAEVWgL/zIfyvqmnkILGLfW/OlFj2jBA
hvBXJ5O8OrqS9dMJPRFs3sC2yQjU/IlBzK1RGKBDvzQ7IrxHIecJVQkPWycVQBAIGcEf+zG0
dQ6nWl4l7cq8CxcekqGzEwoUgld7ozUFuWiXwqsenOg5a35VizDbaSFDDkys3A2cf2VJk+vZ
++Vh++vJJfxGWpNxCrDBQDYHe/jgrSRG77orBR6bBBEIsxviE/EokrGQi+PcHWRLocEsjs0T
bJg3AsiYu96OEDWTreHMCaFlBDso89OTyzI/I0/c/Ay+fE7aJnzx+TE8IR3gCWkfT/CYAn+3
oqAjwcmVjY8DEN1tgBqfsV5CkFrolRfCQzbw4FmwYk9Ya1wQ671mZa1gCOfw6+QSfuMOI74E
EpsIiPynFlVJGOespyDQiSo40KCannhT1jojTXy0N9fdUHbhxOeVubjpShY68uKHS6Ti3M/G
HcXDHZdYeKxedOkgOUhvydXOTxozkv2o6gsa+HwogLhHdM7uI5QLevvJ6l0JTLhubjiz1nur
BzQFs8LsGclGOCPjNQ5NzyZHb5fsqr4Bdzi8L2I3hCxfXu9R1fjuAvddTsQ1EfyaiL2DbziY
KNNuZ1Z2qI/BC2gU+Ioz7M0tNYHdzB3z7YMx2yQO3iGc//xPFqqq7xkeWNG8EixJC6vb9Xto
5bHJA7UJy/FXNr2b7RNo7wEUWyG2VVZle8XRaWnG6AgnPSA56xt09+1xDN4WDX/+ahJ0ITPV
iNdlYmC8PdSnapwdblTlkAOiZDqrUQHwDvVmdE8vdjCHfi8gs7Sc3GN8tNhBTloHuDTTTRnf
s9g22LJHj9iQC/MxJujUskDH0+cZlug0bogORQUOR4vpy0l3Z5O24HduaGH01+j3VsH7k7jK
KMqLefnJDI8TBH+Asv17+JzLPwsuHXFn3QHE6wJGCY08iLQScM9BnYc/QP4xlFDkgNh15jo7
AHydHsVqIAL57wGWcg95U47Pn6LpKtSejn5n5xSAxdwXeMym6yAb/T3CXANu0GEP0bg7tPsz
7B4duIBxtOzZEyQvAqEf0/TdaJ8pTCQDWKJlTBl1QwEyd7bmTvP3RxRkVl/36rmy2ZpxHYE4
Spxq6/zk5sHp3T/60uOoUbXWsEJ+X8zLNiWGJhRt5iNhMMPxwhAM5JnXZMVlAMdz2S1su+rO
DRdXh/tTc4gt+4Vb08JINLnG89mDsaCE8hK9c4O3YtDCFTi/bMqsU/gWQdBiIVh96Y28N8YW
T3uLi/mSERX748DqcmoUIeU5P3GoCvzzKKr3G9arYGLCmuAf0C7CX3QCNOfIdV1R8easUqlV
KpWlJqZuJamyBUjKKZi4Wz/5dWLal6HnilI6hUqpO+W8WKBQ6hZKpQxKy/9BED+BOJAqMGZc
lJSU3n/dTSAO9iBzfnsScaZWbs/fHQUvPz2CcpmfsfNaBk4VCnil1wVjQZWBgcBYVmo8iZpv
84WBjmh4b1l2fhAG0oMxkNwfBpIQBtJ7x4AFqLy/2N3OWf91Rff64IsZX+XLzT5ZXtX1m5Vk
dLiUFLezl5OjduIo2ldJukFciPqkBJH1rYTA7Lpd4gcTZRbhBC4lDt23jIwCHInuMAgIe35/
Y1Cpol/MuATX4h0e0J+Iz6kpUkG43s2meJVsNAAI1R7jgkDXC1RQceJCgDgnNuKxQpMaool5
lKB+50Yw4h4W7NKeo49z6qYDde+D+EVL4StpVS0UT6tsU6cQQuQoHUrv5TQVhxMM+KzdFVnJ
J6mqqxPQ8yAFAfDALmSUexmLBb1qRROG2yu0ds4M51Y6o5bsnL0FgruFuaukh8F3ZpnXvMxv
UOatVeZ7o7GaLt1w/KwhQH/ZYb7Clm3KN/gNohp1wtIlR8BFpLLKCjVQaZnWtCiu8oBn6pIf
TLNi16HKBaIyQDyuTbE9Z9+zAgPpY2gbETaL5gUMbuTu+3qp0Snj8UOk/QyCfu92BUVAkuNS
4Yma4roUIWOEyx1G8Sov0AiZZBSuvynbN+CUjEH+0QTxWkdyETPBVwUUxXBaZEqFhgETha3j
Y99/t0RnWQxuhPj5DtskbJMrtOF3zemzUYjSLtdcJKgERZSszrL9DvS7uJW8nYtYXiUs9mSz
uRWzA97CNEO88bYUXApB/v4CwRcGTYqjI3CUZKCmAZsYbw+RDfEy+K8GreIIDZrIk1TakdcJ
bXTl0qCgBDMm8OIV3Mm+KT7hs6Xso+tkvwGv7qICAoco7nBffEkRbRnI1RBkvTMigUg/0YQR
f7tJcOqslAAYL00snwXFdtrhHEhahIjxtxVvCtwQZOZxAh1QzrFStC1MNGIR/KzZ9LeTy7dT
GE0iYhKVW4rTxeQW/1bYrwl4fYNd31ibmogRJoAFUj4th20h4mbJQPaJwFBaZAmYKG+gwKYs
iHjFqtDm6Fd8fSDIivsLRoZR3GwlqfQolU4eQxpTJm+9Lsyq857SWsZ2FKyoQ6ObVSndqzny
2i476N6uJd+LSxhKp2TeC0uGIhq5F8YEXsSYZOv23vnAyvSqIXDmIX5VSIOfhoAOemrEuvHn
xgaY5AwbZKuoPasScFsoAukXEPkwh9Dcc4N7G089ay5IHYj/hzZwzC2ViFIK3QF7j7vT880F
ApyttiW6zggDUHSfjx2fjzt0R+4ZpSvcLvKhKgedw+PHceEHJWNLUt6TJH+9bzsK65ecSxnh
BP1aDE6WqlfyJWdbYncFGyNdynkmfX1F+I72Tbkz6+EBTArJchATIy47Nm0LrtcE2zq5hrCW
cBdmYWzwhECviXDN1IZIwDOrJPxzdf2GbzPO4ERHY9mVVhNEIg0YBfpuIHbjIvonYo2TlkSx
NvPoqAunVuE0VNgQ0Fsl3S/6uplbRiu7dipvHkX7jTC+5zOzRzzsGN89q44FEJU2++i17uCJ
HahjRzm7MFafoAHyE5gR75qbCQVMruQpBgxI+esuel3XUEy4w02OHUBV7DvwSJAjWGuPmjuN
Y0z5KMhUvjMSPAxjJPUI4DCMcL6/S15ZvtY0nUchIz0QGekIZExcD2ViNb0xlDtv/USb6Q0o
30VXcXhKhq7zGzw9rHSWjNkF19eTL1x1vkWIiiUN7bl2+4Z6wdhEcYN0IQraU6Varndlxmxw
0oWaNrecHxwgN87C2qy+4zsPbVjiNkDIhf1eCOT+iCRkaPOI5S5I+X4IKf1GvR5nMKWUoRjE
VmgyuoVLRzS4M13i/bDdrU6bcshsWNRra/vuPAnvbLfW+oblDWk5GtADKKGfo/G6LG5kJHAd
xIUODvsG8y2izlScL2tMiGaEcU5PMMy1ETICDqE3fJ72OwrS0hSYf61VkYK/O6G5I18pobgL
39vTZxMTqf6lPfv9wkWhn61T5J/Ul/bCAjyE35oMiu15G8q1GEmZPXxDf2wor74DsH7vCpNH
Wej5BIFz9ExmJMrxeibvZPRVz7zt/FnASbqPiBEHx4pwpzBZ6dCziwPOa8fUSuQp7/BzYbSG
Q2wHHQNlYgQRDD07uUxQHYkfU4pMLmKRk7sicQeWnFwSWFBEqC7lI8yPngvVHgb4vuasdM8F
UKVlNbwqZ8lCIgXs9jIxgn6fLiQKIEfrRCdgvltAjPGREeCcjOq3moLVN5yG95ukYdkGAntz
BrpNNiegSC0Mt+FWdxCwKDi99BVN5XHLBCgxQt7LGBRmjI5YeI6laSJANSJ4m6a3uElgqH4/
KLvsi2OnVp1Bx9dlJvaGaw5ostTBHFxHTEu3pb7QphW++GVY1hNHzxi79hWIOaGrhIK42924
GjjDtN/2NZJGYF2wJNCIkYwEvbdpcwb9utiIK74nJw1/mmws7EPGN+3VIBcdGGBuyhbPMWkc
/7aOzlby9s1A1Dm2bw6iCt8xs2DD6vhOjJ8HTy3pN+POBIYwWSiL2kKkkxBxY+S6KLdC+uGC
D+ehScNZo87BYqUx4C0tnfgm4ahBVqSIxIn9c3zUoHBMF4dQA73OQ5XHh3Qxw6uMjHERDYcS
iJxxeLvDoTM0MUBCF3nfUNANu4EUJLhB0i0/sMaUDUshsPCmbonnCoauMlVwKRm3BjJuKusk
5TPBsPOUHAhHKXdgzACSZfW+6qQek28rC2kjOhel6eoGpk4h/m9SmbvpJfu3K0fODKLQvTdg
H6ktec5pUkyLCCU85MyMGlG7AV+OlYpRp5wrz5rnt3BcX+0P2OfHGpCLH2vN6juDPkzMwtlK
BbRM2GMwlIIF8DFzMi0ZCZbaGua6wXtFiGGaQbHFmwyHaE9eSJYmyza7KrYF38UnTNTnWELj
m/iSHhOAxZSApcKaGrWep/RcnyzJjEsBqKT+nc1oGLZev51bDoABxQtGNojYZWxa1JaSPvVN
rC1TnFpoebynLbW4xKjxFtA57gY0Ynl2WZAJ2wp4QuHIroqymegop3kBl7ZrYETCagsSsyW6
UaiAsnNuopNlzgoJISfLk4qrbJVQkBo1Tv2VMgJFqqWyXGpXS81qA+FigKYWSEHCnOgdu5OF
DSMNRSw7r3S6sEHrL63n1Rn5QCeqWhqpFo1VRkORAaUIVB3ewg9wYc2OUXceLZ6axVMrKMZg
WIw+WrABp8cyatZgqzFSMWFUhKNaDYXBMOBrit6SRp+qJFiHmoKMAuKhb/cVOge8IjjThnSl
ZFBm8kkkeqwsuSnW3ciiTfnqamxZkmCqiCU4JAeqS7+PiBfxzZvPDhhqF4HOytwc60AJGONA
ERxbpAxcCiBQ3HEQoJw/X5ewuQnIm3hwTTnIoCzhDNu4yqIQaVyjeOBXCDhRi6T1dBmdeLzj
N8nOLVdOJyiF3b1y7tR5BnROLILCj0cddNBV7solcoSIofTFjBC6xGsx9UoOGKQ6g3BNwnQJ
D+deTK8C0nd2JdRwCcdEifRqRVu6sJ1yYIuWz9gcRGcILO5emPcwBhCADyqAcMiN7r7B6/U9
Eg0jLyehT/BdUKYdgumvRBIbwhLRVRRXJjmP6lgZWrgoojyBJwcBwP+q0StHInfN9SifDfSr
dmJJJFwZT3D2gyJ/HRT4K+YgpKM2hX8Oay+95/akMBRvdgRyRmiiI4w9Wv6wDW3oirejwVOD
ttSNo6NMOaqrsYGmRuSdcCdDa2RcgI10FOMjnHshp1zvSDe6TNQ90l2O8juyO/lFKtqsqFLS
ngCwvyEncTjCnqsi/geTLj494Xzpl+TsV/vtL8nps2fp6a89dVKjjpHkgqwYAiaKlkExMZDR
JSJgE9+mzpaGuWNiBON4BVlLKfR0QqYQUgiWInTYJy0l0gBl+tmSXmyLpGp1I4ZXJrqSoycZ
DWkhA3u4JR5jJsTHEzO+CG9/YoIGymEjMjY5RytopPpY56Ih9+dxEb3KuauRnUTj47n0bJCL
FXNsCGIVHDsOp0WJ1qqfDIb6U2vcpWALSJyPOIxi/zsYk+4K78OnyyZcuJVsq6FW2gl0bS8K
4ZspXBoSHSIOxqLwjNcGAPEHxYp6bYaysoRuH6EqO1c6IhAUXaeo6k54WNT7pmU1RMkheVzp
XQhyN5oPyTm4++1udWS1iNA+KGEF0kE+DGWDtONfhBGjrZwuIlznxcEIPE6TtjhNGFSR6GDu
ZQAhMfeUIA+5szA7YUPEh9y2VGJVaQaGtNEG71tO4q6HGvknl3TFrBqMaheLsxVBvTdrFjY9
3yPlHkJKUmzPkzz9rhf9k26eS1gPWbf1ghUlYH+5JC2uFYlkRPZRePp6PpxM56W6OwKGCnCV
hvTkFZ92vAZ5Q4HhNYWQUYFskppY6qrwmxYkA+TDz3ovQWXZZOr+Cm+I8o4jeaHxJC2YOLYu
RNJyrBLKANS49CkbwKbFMRKh/gTi8y0nfiPAPQjHFqScxV3T4UaMWgFKRCpP1sg7ZU7gud88
okgnDU4TuDEFPuicpiZukA15WvfndQ63NmOvX8+dMDfu6T/Q3ji/Qz4AoDy4RaQjWWIGzE+S
T8Ll+QvzIFBW2WafIxpF0EoIWckb/XXBykKhlmOD/bsrS3nTvdnwLQtZCU52W4PU8wrS0Qt6
JJW4XLTavSLmPWi6+IIpPTTTI3Q4fbtCpJA/h2xESclJek5i74dj9Tlr9pLa6wNJrXxV1Y1B
bREiS+9AZLQ9iYuxgcZByM9zvEsYoyd5G1NF/wSJCChf8J9wwzS2nM04A4URCLDFfssprp0v
Y5RquOcPkul7IVIgidd9pPdu2CM/sB0HsmW/Ht6ugFKStK2bVHhgZBBCkcJWj7iccYCQd4+C
nqFji2JlXA7x8Zc4XNow46GyASlKnETYOGFrcgfONQ4vr4+iFo/P76td0XT7Ji3yQQ7/x0HR
EYydsLM4gizHLD+MNOddx/MwLyJRxpecsgDc99qL8K9QrscyV9pjT46yrICmKmEyMsqtOtCD
A560JBxU+TVV1raHyVAQzpFWiX4jYBwqKTKgtiwbW4umReHhkGomBvrqaSOisBJehGhS2S3o
9C+sF2MEvLHU6Ns0/NO2f1fVPEqIQ03HJQ4j7a3RigqebSTMpYuqILwkKCfQnRQhxciwwmu/
rZRRTFqpMHldp8vAceIB3s4UJsggJ/YxdjTXMlA4GHZvYtjrj0nqMtaqYxk4+pzzR1tCDjCC
BP3xx+eOkYz4mKwxE1tna+dsES+N+w32bQdZwLMqpe6jj5dvJna9JDLmHhbUg4jeWsPY6WXl
lv9ZzGNmfIOybChhTMzLZnzraU/rvVY+Z7+iSH9hqy4F3Zrc7zwdgsIRV3HkYvdsl30DSxf9
oaTstTfuttJhxJbccWDKPVKkdaVQR21X7BxPQZYEXQmFKQ8zDRrB2KfJdKEC4UXLCNin2r4y
UCOdLlSMtWgZ3WpqtxpLN5aYzqRxLzqzSmr6stoucvHRYqmp20V8HLK83f5z6W5HHnP6FZ4c
gqHxLewGS6SWTUpxHG8/C7/wguljKRFEvzeKvoqND0IDm5TVNT8OWlH9A1LDWVAe2CZVuS7I
OGf6TyS7YaHgLBE7+JmfBHEoiduZuYfxlkbtoGfeTmi3I5cnopWwYssL6ga12aPOwHnmWU29
sioTp1XYyNoZ3FnOEnu0oW0DHrv5ySa2nCzkX8huW1ZsmrJ2l2TFdMQ12hSMl96YvegsKYax
98sp34k0EM0/3GPi9tgTTj81AxwnHgzBqPqB7ABu/Nd0Ho0YHgswtaPgWDs7vpQTuvYsYvs3
B7SgxuzTU2/01QD0biTW/mCsbgPJfITVDK5qcNaygxsakG4bAgjmeNdmmmjyMn96kGFZ7DU2
krnAqXeWNblPJJSQjpofbOH5TEQU0sHxvWAgemGF3fASmvZDI7M7rQgRb3aXGO8OVug4SaHp
52FFAMcZsDkIaCrC8YECAPQBeIZu8WsJl/3gymoRUQkgBkKaqyAoI0L5HECmYTrHn/dM6piA
DE2BJisdSevDC793tmB2HmKGIjFt9hxhFDiYk7uEpLlH6O9z0R+UT/LM9iwJQydU7RiZ5izm
cqO6ryu+mcoo+L4aFZI5BqyAmOULQzu4b4P5ztwp1wpkFX1JZa4MrDsCAnRz2J8kh3AXgm6Y
9E8Z14VqWfUVnq6x7NPNvobNL0Tr8/mgEswIuiLknG0pw7iiJyMmBlNXVcUVUbxqShFCIZQf
raFO6Bt5e+SLWqJnx1EJTc+G0he6FBdMagpHRemnBjiCyMKFDHcKtly6ap2Qx7rYhGfg3iaj
tM4nw04RTvJOl9IHgcCQsaTaTTZ4y/GEbgBbdkn019JEIXMjBhJtCkkusiBd8AYJLZx/dXLc
dh1awccmBgzPgxF5Pnx6PEvkWSSc6ZtNAPt0lwOudnT8rJvWXVdvV/udyKXRC/GmzpKNfeOK
75a7ukk4oE1dD1QPZHvBb/21bId1WTEH927foT2eNilXgp/OCqNzIuVOLiS5zo7NeaRMlcgg
Dkp35LIFitfg5zYCvkD5eoKnEJjO7Krc5AK4cKqfi+C5xY2HaydZ64ntpgPRY9cLMb9MJwcZ
dXRx06zZq9v2CeQj2zctBjfH8AIYaKLdpyci8ILTZ38COIUou+++ZSMG6qwDOfBc3UIISz6i
mGhEBA8OotZYe8ASsLa9CRolgAHNtm+wkA0Zr9N3nHjCRC1B+JviLTiSrLKk7b6lW7sd3H6/
pHHzSVrSAwcW4+Pf0dRSY3Acy9cCJQUSHOzUrCKLRmiq+oTynvQacvaRxCkO74x3HpDm1FTD
+4UHG/IEO6GE03UwMYYSKvVCHASClz0IhqAZ0GP7GOgDKLird6u8vqnG8P27Mv4jOf9/s/7/
Zv1R1n9PfPSjckmHYwd4+h+FLYbcU03Gju6Xo7i7Vkq9ocxAfJnMvAk7gB37Hrjvn0EPoQNS
Fr0vbPTuC6OQ8e7jilD+FjRKhoo6uZAbjWUBATENO7ttiSP1RlpR0RiKMQe2wb2Q9qamONiG
pSxW7s4nAm/hfTdxlzDH+7hR0xaEjvG8QYK3aR0Nnu5quIqdyXGlZV0Mvu5YfLacPOzUm+Rm
0iNaAzIpFchBwgbrHdNkgBaP7ZQNoIXMr3hrNpPm/f16bdGwT5tCM23YXWs+H7s+f5uRxL5r
etpQvT4Cpznen0hA2Xg0PRTECH1OKNLt0oiOxiUTGoiTIt6ujk4BHFBGaSEJFF41M5tS6o0J
EesOIhvKmwCmfiRomuYPB2fWslJnAhco3Q3am3gBfY+coqfwJ+7V8ayFAdE+51hIlKts1HLC
K3vaHrxlBXeC9hUpKzu+v7SoiLPnpy07uipd8XbwnvdURmFrp6j1RCWfuOMBcU45kBtRQ4Z0
FNo8cdiQ9YdRv+IkEEZ+pDwngHD54AxxxNiXQD8iP3Zh+ZjcORR8C363IjI4hs2SHGBGWKcC
RjyFQCPBBeBNgrFyw8lcemvEgi70LkS4aY3DoEOgEZnw+ew1rkl8aVt7ORi9yuPH5VjtrlNR
KNuBCI5TD/uc4LVpzsWZWvKht4Ue6ruDJ46aCc6Q6GEw/gVyeOM86V3y5zg0yXPh7dyyBQXA
iHnmdWieD6v8ZphIoGWbSJ7P3sToh64jh+YKZGX/+RvL0jJMfC5ZhXpa3MVxIAyiSU/uzoMH
VkcsH9oEYJLCe3DA5ywLyT1WsySv8EdqC4gLLCicaDYalRskiMKTssd/MWsXMtUr3zafy0sN
6MKVmz1TFNurROYvbhkZCOnKI9ruOxVLgK5M31J48kbe6eV7cEupHG+KBgPfiiSXdVO+Au9S
hRiKi6pDoJpwUPDMCiyfhlHUiO1CgVhES7ILXJ3U2G6TZAXcjHjuxVww4y206gBwESwrzLCB
sryPn/YN3PzY1niq2chrjUbCRrBuKpvigfF+YvZYZHXpULSf3hvqBp9Ieza1sMXTvN2IkAzs
iubKFItAO/4dyPzTQzft9Ig9e6TZ3AuTYrHm3J8l9VZiIc5DPaPt3AqVxmnvn/sSvK0h8ekW
vCYzXEx5IaIM8RUDvhIiWgPb1K/YTbJ5UzQThWGPEa6Ef8VsLIfztbSyOPmYVDJeTIznHS3o
WsKtCYDsWDiqvje5NyzEBkQJGxMDYoUFvWgPNBLusI4hgYafo0pQHHACjmyER+5sfbsaSBue
4BxkqlKl/OgRi1aAEO+yfE9xyeDN4p6byjrhAySa4dhpIdsvPzE29e4J5xFPRPgM0B7XO1jx
sP+Z9pOjzxn27hOyrIRPG86u5QVMt5W/eJq3RW1TCXvgVqTFvkBAdw1wZEtyYUMJNLQ7iRvP
joI2qX4J7EG/stC9e18bGwi2ipMPsR8SchHCoDUQruQmuQ1I5EyF4Zbx123ZkcQrHXsaa3Po
VDVSCcNt0ie1VK6hcAWemLhw1DfW3m5bO7MEGWjEguSDz65mU/wznV9ESoHycDaF3/EyXT2b
dnX8vdL7TOWneFkiTVHc+DJYA0wGU/05Xl6kzqEejC+DNbAH/XkqrsLY4UbZZJfwfS+k5kyT
tsxWZQ1KxKbFa5/0YZSi01D63FwBL5lR5SWf5p3Lk8wxdBA58My+AqArApGcn8t5MU2CvzPL
RCqr2AxGPu+aWXdqvTH1fYqvQaFYQKwwZAYJ3C9wJqHdHT5OD+8FvFw6yR8HnUHe9wieeFNA
Feqnq6NVz9yRmevPGtoYqRDaOwoF9ztB94IBb27jCBgz/knAGvpuWEUsdRmccTVwCbqfcTWY
2xFNK/jpPmw0ItN4wPBymDKvGZCHSK/XDEg/yjVGDZpz9+q3hNFlNeKuy92+BWefho5ZHqta
MJCVjGOaQNeScEwtzpRt+wjNZWNLpkNjJfH1vofKW73bSO0b38NjtqX92KCdM8G9jdrgXAsm
8wYZQ49U6+qFDtz/oTHVSx32Wei+8YTU8YHRNG7pDKp6nDL3hxopEh28bJSfI4mXpkv8AWJl
2IYICjTr7C5DEcQkWdE+tEAK8bBQSkPGA0aPfErBHqS3j7bw+HuysalaNg9/N4bzivv6qniL
nk7xWsYebtQxXZCGbBZ6n0YAj7SeyVuRAO2R5g3ZBABv3aoIWdLN7T9MWCO2/aDCJ6rLicoa
sgNPbJmbyY/vom6YjNM0HL/GkeB7OR8nK7MCUKvB+1Ri8KpoZvPh6hbj1DnB3dojOcwE7jCF
ZiZPukT7Jyc9lt0ByQ+c0Iw8PiXxAf67SLasbFvoScCtkV9Wu30nFbxoemjbBZv6zU+dil39
pqjK3zAB4xvFADymCX9mvIRrP8uELrmHExIfRAVrQElHtiBIt72p6zfJFeRwe/aM/fi3n0Sd
8HqkaTBW4zD6g8z97ijWzd4Har3ty8JgD6JijGty05S2I85Y1TNiFHEZZVOIvdrCXt22zigF
c9w1M/7O4G7mIBs1RN4dqBt531AcNzMVu8QYT4DW7sPD0x1zwIPzTmMOcnTImzg49j+V67xY
s+//8fyvf17948Xzl6uXP/788mf+nMLlsum+KrtVV0BqoKurqfGCw152t/jQUsW5gW58zR6n
jO5t/xbbs68hMoVq1qdCQ5GLN45/oTTa2tHsYfur8JvmQOhyD1t8ZteFkDbxmk7Go3ZXVoML
wh7Cqcf2TvtGRdoQL5CQurIJIZEUU7T5GNSGl6f6hM8JB/fqz8B98Fv2ZWAXlnAqPaYFq3oa
gPcUAdY6mO//9refX65++Jcff/hfCAvwGKtAAOAzADjcBO/A5vfQHi8cEF5CVYWVX9Shb4a0
eYobytmFcVHCy2+lwtdR1C1YIEFKT1IQVMLEHiyfQXnBGg2HEohEBhlVuMiSbcksqkIU8k86
mBDSe0VXBTwQdRDC0EY3I2AhHEIapCIqlMlCInmMZWrh1Lm9NcL8qWiLFKVsxmFdUCH7D/bn
B5W0x71Qsc5U+D0/DBfEEBPw+y+zqYA7FJBrC7G4tuGXGbzMxH0jk57SrU+JSRYgRIsIQ5XS
UKwlO+5WfEqHybOdyatt3iukTsssw/5juq7r/5jy1ol0p/oOWM1fpkmDLxfiwodTF6xsRbx2
jYPE92IWx8P0JFl2b7teyJ6kqkgEPiiUDbXz25NcFRkCE08fAkDow2sbg7f8kn2VfJF8dfr0
qzT9Ivn6iy/OPvu6OE2+Kp5+dvb1559/9TT9Jjsrnp59+asFFYfnl3Vx+k2RfZZ9+WWWZl+f
FV8UX55mX36TZ6efJ+svT79MztafJ988Pfs1PugobNa4EcUwfWPHHieA/o52nNjdEvqTgdCP
jEvjtpyP0EFaHB5hGFU0xkMgtcf4xedfFt+cfpV9/tnZV59nT0+/+WL99Ivi6+yL/MukyL7+
pki+zj47+yZBkUYIg5ZBlcROw7cItzhiIV1za8kJIenAVt4EjH7Tfds82ZTpk9/qbVoWU8tB
OmDExPJpWT3JEn4mCu2oUv3CT+pFlX1b5pdg+86++Tw9fVp8/fTzL56epqfZV0Xy2Tr/Jv3i
qyx/uv78rPjy6dk6m85H9Y9XtBCKvH713qEIG+2CgLAAovDNyPY0Ylm0p+yqzPjZc9xMwczy
/9myrcfjaSzVhvFkm/YkFNEh4TtrKEbU7GEkxIKnhcY1lldxeBbjWx3LHUxseaeU1lRTIkvi
J4N1jZFi4TJbUm4g9s4jVrytAqmYjbJMlD3XV1N5nSVk6PP7QNm32VddySeuaJq6iXYhSjEs
FWh8FktCyyYiM4cRzuZALoaHJjyIJMb5oJfoJTsLTuT9MYfTXu7A4cB9ZRpVZQdqkFg2DfYS
XltPtnXdxjsJVGj/uS+bpthMjSxa/olWTRvrEi5tdFN5dlWAnR2xq5wNoUwi4ACcCSyHeomg
TGNgPNYEmkehrJna5+aJCnUQvFxg0fioDkjNYJT1nIDVRc+gI7C60hrw6U0GnHoDB/rIdeCL
vqIyTqtV9r8mB6yrFWoN1wXoGe6XDR6+BE8/yBI8/ThLsK5OJKoLSFj2XYht/QG2jkE+CEez
u+4cg2xwd3v0vmER6vA8fK844n3xQreHDCau+oNzxpbz7hneEfxmFHf0y/8X45DC11olpcpX
4NN+EX0NeuHgKuQ/n3/z+WnxZZF+/UXBV96Xn6VP+dGlePq0+Co5/SJ/+k3+9WdnSLuxxs8i
jaf8586Nfx5pPOM/oxufQBQWsBZBkgv2O4PUXAv4nbJ34IiSXa06AAHurkDu1VVgmaHayNVt
O1aQ1LWKiMXlPYbW0UJW1xuW1ytRUJnThGodb0STJS0KE1hrGoG3x8LVrOrYhjc3Z+fEanQP
s3WyaQvBvbD5GdmQzh/mU0pJBUGLqLowuMGdAMW1kGa///Evz1+8eP7iLwY/wogKcB9SUTA2
r/M//N++QczVxQPs4KfnL57//C8HdmDZs7noXXYzMbc0x7oP8PzFR8AigBjmypaDV56EqCC+
pdQDXt74AS5vSFzOoaHbeq9yWJsBX0Vyd/NSKuQUgMy+N+oOq4GOHF/z2alVGYo51O3xqggf
EGT64nNbswTyir7aFObdVT5suHKKspMG8Hdj7uFeSLMvLnAsWE7t6BaeFkHzjpVjB1YmLsz8
VGPVQPk8JCyQixNUEhwNg0sp8OZqi6NFM6IJPRBD/zF2LD2SCuowed95byGMp5THxh/UyEj4
ZfOyjXH4OLhJhR9T3B2Jn8i4woIzVhg3iqEGXJhBCLsXkHPf3+4giGP1FcCmaGpDPBlpQoVG
T+PjO4sMMCwTY2OWBpHaGDfoI9p0EeHP3ORDoMGfpztj4YAmNRL2lbur/ds/aNPs2QhDm5s+
6Jp3GXvzWg2mqJJXQUx5dVO/KjMhrSpU6A6dFMl6s0VPHv5sQbHNGy7VdFe4m0FYeXAU+g9T
804dG+L76uW//Nvf/n3WE0MCwmXh2+jJzh2ARhxsgZ5JHBubqlYvBrHBW5GZBnghK6k4hKbQ
gxQthenKQeYP4Ekl8k0jvYWyKHk6DVT9rMCxRlZbaYHSOxsNIFc2cYzbsALkiLoO6L1uy5G5
7Z1fq/Wphyo1T2Nn3aodmXMibZMBQNy+K4MLIE+4OJQhsORVUlZ4ZfgmafIQg/gQq4mfPy/w
KvG/CzE1B0GUsgZCRgNMDTEF2VVT8RQl9pZxyZWfSzZFgpFAKQUCBWQrtkRHFzJHAkuLLNm3
vMS+4QI1HzicRaADfoArKv4C0dHiQW1ihW6BJaGcE1e8OYidsOBwFrxhDkUm11t6yx9CcjdL
BIdr9nzXqXnZT1oq4LyVsWWUwJ8KcR+6gMbIs1B1tLQ8W3pmWXq4QGAXuEHyRIZ+KDnoWQKR
bFKKEMDPsZBxpKt3gJIi4ZSLKYDPbT+dv//t+YuXsymVJD9cIsE+Uutmq9VPz//642q1YKvV
X5+/4J8kI9XSOB2ep8K8EXyfBt4r2n93d1jU+UY1bkgrAr51XU9DYNglAdI0aaYfCWAQLEbB
Kwp+ZHDH43cUvII9vi+ghyg2QAqxQf1RYDXQ+gcD9Um7T82oCKMYwh8E0o9ICAeCeMz88z3l
/9R72EX4xrG5lbnQjBTyVVYEdw9REt7fyxZiHv0jdO4U+eAbyXgQjal471Rid3k0UCGa+KTz
CQKkHC4BwekNRAsucVW3EGiuj0iSNdzvIDK9F2I5ZmoCC1l5YeCC+YDMZ3jO/j8JrU9hHw3Y
w/bL0dD2y+DtblNSzMebOrgesEAn8z9gK+29LIiADBYbUx9hgTj2XnipL9L2gxecm/cG3QgJ
/D6wGaElio5n0BNox/JyjVb4LkhHFBL+AWaraT/ICe7APeQDST4fWCK4g8wY5zD3vcZGnMM+
7GT6ordhq3KXF1gN8ffZx5SpRp/AP7ZIOhpQB+fpAM4/wPnrMCI4ZF94L7RwlHrjo+ys45Vb
Y8Dju9SfQ7IO3vOBPMCwe9EXUxupquTL5TK4h1FZui4E2xgYh67LjILDJu/nmDBaPdG/WtCh
isj0j6hbuetShykXCaBBbZ9SDsKy7WLiiH4tgorfj0hyGIcYGPbn/ny9Z7lg6vQ4AOAZgRld
hT/gesGY82BZAe8fcsEsc7AolvJUTrmrg/OEtUq0EYCvJy/2ISYqslpigwNDBvtUJFK/Kbsr
DqsY0Uc4Kx6+mAYmDcJgl8JjDTxyIJPAgsbJGSD8rfedSjqOsIXnsvbaaz+UIm7UysRpfz/L
7Y7du/NCexBOASQdfPYMYod9IDCDS4LCqP/0/H//64/n7KXhJGglcIDNN+W0ojbdrimvy2Sz
uVVmUkiDgVnUWggwxrq6ZkXSbG7P4SE4Zd+SUq8pdgW6GZ6ccJ6/6UqIOc67aBf6K9GF8wQS
SGBTFD8F2vqWBA2O13TB1OfsEvQiYNxVHokLDNiB/iBr8xyMLc52TZ0mKR+LGPNujwpHCM0K
meAwoAwJH3ntm7h/Fpk3oCmKHPQ/5iZS0UZdFZCyA23QAAl4ZJbVddKUSdVhThGaQZXMYwa9
cZxhyGxd0JkZ0orCxCSYZmQBttiMs+q2mMvwaLBhOHeQ2xn8XrX7sivYY4Z/ye77fEZf0AEY
Pp1c8vozGjPEtVn98N3PP84eBa82zwerhS8TjqgXv4IzXDkUyGE+YoRxI7mIFjH5U1HlfDvk
U+RF//l/AV051PehqAEA
_ATEOF


cat >left.gz.b64 <<'_ATEOF'
H4sICMUJGEICA2wA7X1rcxtHkuB3/IoSJiQDMgiJlF8iLe3ZHntWcbOaibHmdi+8DkS/ILYE
dmO6G6RoDe+3X2VmvR/dDZCSfHvLkEigux5ZWVlZWZlZmY8esazeXjfl6/OOzX6Ys5PHj79g
r5vkOq8rdl4nTcG+FV//x7ZO63fLrL54Pnn0iCWbDcN6LWuKtmgui3wJzzdlVlRtkbOuZt15
wba7lD9iuyovGnzQFc1Fy+o1fvnTy7+zP/31z2z2/Bk7mUP9tijwzbrcFOyHv/z1f794+Se2
rhuWF11SbtoJFOrOy5bxf+f1Fbuud2yatG+h0BSr/vD0KR9W1XZJ1dGHZpd1vImLJGvqdsnY
w6TKH0JDUPk8uSwA2rxmbc3SgrdTsKS6ZjVvrEFAWpZkWZkXVceHfc3KKtvs8gLB7fKy6pbn
S5ZcFW19USwnf8iLdVkVbLX6+dUff1j98JeXP7/67uWr1b9998Pf/vLzZPIHUZ19m2xe103Z
nXOM6oclR1DCobWe1XwMRWKV25RtZ36/LDKsZTxKa17vEQ7guu2Ki0fbpDtfnm+3z71C7Tmf
63y17Zrw+03xrsySzSpL2o5K6CLTNGnLbFXWy/PzqfE4O0+q18WqLTr3hZic1nmel+v1isOY
nTsvYAh++xzxRVMVjfO42l0UDYfnss6S1HnXJlXZXbsPL5ItPoIJrXcNn/xkc93yWS8rIjUk
xvNkuy0qVsO/Agn4qmbr5KLclAUQNNRuik3SceInktvxlXHKEgZoX1GjvDFOiAnLywbn63oF
nfOquKacklnd8Ba2dZW3rHiXZB2nPU6oCavq5iLZlL/xnqAe1uL00TSA8AtOpmewEK4ZrF+A
8iq5xiV3xamtrF7DSyTe5KLgY1xDa11ZVwIMXLYWIC2HlI8RmsIXfPa6gi+kIsnOjSewJBO+
yrZs3dQX2BSHqC05QAxXT7kui6Zls67M2zkMhRP7hWwHPnMEboGdcNrgLbXFBaeSMoOWig0O
DEaRME3S7Oq85HXPEyjfXW8LNsPJAoYhUTxfAMr4WBeI5CpHRDfQ2qas3rJZUtFS52DNl/Cb
j/i83m1yzg045yr/seMMAVgH70ThWyJnOZlAv3zRs4KTHnvPtvB9pbpfiAcI1w19OVN1dk9O
oMezCWCQM0r+mTV13a3gwzP2+GwyIWKa8AerlpNnVkzeTxgWzLrmjD6KN7M5O4WnM9XE5+x4
zt7fiApV8a7jZd6zFzNeit17xv7+4uWrJyerH2aP363Fz3x+xueBU28FTX3++Rm7mdycTSyQ
EQV8L+DECeSmgLSfc+J+WzQIrv2CwYsZZ56np7wikCTyBPaAtXNeGCowxjnPhpPUqiquzvCB
08Y24wgiJrCkP7N2ISrMqQYSOSx5lp0X2Vs+/itYvS2+LNdsJkrjd+oVK13sODB88hN2yddZ
jgQHnOlcFFHfWXexXelvz/SbWStg0A3yMfI9rFJr+TGQ6TFTI2pl6+3pqW68lU1fvHXafTGr
dpvNCkibP2X//Cf7/POZUWeZFq/Lajafs2fPzLaWRZXzp9TMDf4W873N4CE8MudmU9dvd9uZ
h/45zZqaMNGImBJZK5tTm9umvORM4pR/kZz7W7vJ5+LFGZKbWBAhigIWtQq9iFWbwNsVYks9
m82RMIPlGRZFAot1tUQSnk5xdGLkohaHX8EBRDzR0+TjEIFQ6IeZCsIq2tSLDNilYgTEzgAS
ZC+cE575aw4AOCPKkS+hkZngD/oBtriQTS28duZnVnH1SS1iZKd2Kf1uS/LNs956uPZV0XhZ
+koEM+Gvt7D/fguAw2jZq+diKxb7D2cENOl871x1qoPZfPZKNXwpGgUkvWcmYdOUogz0LbXw
fHYpqNtkkCBQfMuRuNDDf25sk2eBgvzXc2y/4Bs530bSAlaeURKW4zYpxZLBkgujzef2pnSG
sgzQUIsbHt+tOXeRNEniVE7kioih8o5YIrZzEIenJHFM9f6MAgPtxqoS3+4L2mRpVwbpOksq
kAIu+b5fUFscuZdFBUIBZ4EgKOB+h+eFcitEEPgBKjx6ztgvSLjwcYYUiciaL2Qx/TOy2HK5
ZN7Pr5+uY5sanMW2MGceW0dKeW7MVFXnQZJCwZ3zcCXZf2vXsVvh1aLMU5fi36A2cDK7sdNT
XDMreXpRq6m0GFx59HxdNrhgdWcAutcHPDy4j7bgr/Kl1xXHi99Rmd+2H/qDHV3WnHgm+uRz
eprkOQoIMy0lyPYSau/FzJLdl7xGQXVaPgS+VSe4gccL6e08Xqbkh/Km400dAOZCcQyFCWAa
dw79i1lebLrEqiee7DlEJuuJZ7iIcF+FlTRLxLLSTzQrXIjBzaOY2m431ytsP4As+LJgExb5
cRHZNtkepfNWId3EFPQZRlYvFghU5yECBP1Ex8/bLLoiRix5mCqokkUXeYAu7GKxSbdLicHl
A/DyNb4/uLzSCGix1BCwWGgI1gbFlqGFaD1MwyOglgYXol0sNga7VGxNpfOBYYWn4JBR6Xnp
G1TvvFiFhoY0QXnUGpOvdDk9dQVW63VQcjU3FIusYVRY0KZ29uABcguTqvyi+FSUtOZOF7Uf
O2XtVq2noqTBd3VB4yFibRzSuNDeXc+G8LGUxQIIcN85RB1+GapobUv0Sg1kcBznSbvSDQQI
HZ4EhultmFTu3jPm7ZL7AWPibzw4AU6tAAqw5/1AMmdmxXeZEWBxMfqnF//xbz+eKq1/WRXr
dZmVuFmnO362u9g29SV207IrVNw1xT92JejxGSiVCzgdU1tKM4tGBXsVzPgTvoLPky1pH0Gq
40XE2SXZzpfsJ16kqq+oravis82GJW27uwCjRdKxdXElDAZXJX+VFrIHaJcRhkAfzutD95Lh
bL9VeFioT889ObRZs2cOcQsNj9QIQZF7bhmaJ/b55816rhRfzVqKr7B+EemiDUEHHE+FodpY
J5u2uMVkc7liPA0GNi9Fg6GxhZlNH2NBMUktfmdrcJe+3azB5PXjQeZubwUGbzUfa97G4bPY
Ov+OqhvcjICMOc1vQCudFW1bN/xsX1YbsDp1hrioFUUrUhAF1CjbOZuglkOqoJZCl4RdiUZJ
ExRoFk9pYxrtru0G7QOmblAryQYaJGWW0SSc7bQ+BI91+qu3lHqOpSaIJhBm61rvNbJ544hI
86fYUL672IKSdfLooTqnggQ1gRemMiisLl/4hwdPjaRKNwTWn2c/zabf//inFy9V72bpz+63
n/1nNZ2z+4x0zYJVOa36gwbu5HGkEhetZkKlrWxHWO6jwuV+LnqV00EfCXWGthqr/Pjyj2OA
vwngFEcyApuGYUsV6KIYpIJh3PVRCkda24Wxxp/3ok13eYrr/j5qHNGwBR9x0d5vF6Sfut8C
XGp8HD7js7NwyjlzX3pcxFgI5dxsdxZiD3ZpYG2OlYz9C9h/myk7JXOvBWpUB29aJhz+Yfc4
76Of4NSFKEeqV8ctRdeYS8XiFATaU5+ATJJln7Mpw6Ux5dNL+q1wIVo0WMpYP97IQ13ygT98
RFzKMp4hkzJxAtsifw7bHxc2y/ZNXVbiDMUfaZHmuXHUC6o6+qqk0krjFyn5yNDmIV+u0HwE
T8u6miVyUS1YQutoEVW0pLpsOlQWe6MDY9HMEIgFwaLsbYhskLLuvd7UabJZCb8DcA94V+T2
Un5BbUipQxEqn4chKct/NnzuRHSSXCGmL6mKmdQWmQfQ0PnTLEanxMDRk8RG69gZOnWaxay2
zIdQyDpsRs6a/ahSe/joE/z/n4hUIstDOGx5TLB41zVJ1qF2hB92q3xlK07McwwLLOayii+r
4BJ/QNyu3bsaMb2WJil21GI9Z60SfQvC+zJ/HtuXCVypT5KCjKovwDLeO9LNjbZiMm3G/I42
c/z8/fPglGA/epC8xvca7xcLjabvnpOXBXLVZbbhFD7Tkorqxm4piJ6LMHYuosiJ4eUmRmdv
+SG6EHK8t5H6m0mYFKiRORiIzT5ozVY1afLbVV2J7mgtRDrdJj2kKH4c5XOXoDFVaZyLTXxL
IwjOIm+pMfgMBl7GPDQt9GD1W6IMXndhNoBFQvs3teCWvQkhj4qAGa0sWo7KTolz5a0QOAqJ
AJVQNWMnvxXOTjhuR2DbJgaQPYA+0LUDFgh4CrIJbfsrwpbVXAw7jR7V0FZlbjqGvkEji39C
7zDOyY+eG6WBAiOK+oF+ghPBF4/Zv4GLrlUuIGqk2wQ3ouCM4aYDR5gFIVHKnyEEwjFjjqtg
eCEvJJia5odI16hi6SD5oirAnwJUkUmLHg4XHKTXBfk7gzthvSY/h7K6TJoyIbcu5RMBLpkc
BI7Coqp3r8+hHvmmJR01uykui80ywgLkjt42GceU2t9bQnV0f7bEhUVPK/NRzYA8MdCKwBqK
GllScQyDNrTdbsoO3FcZMJsiZ+m1qNguhbnH1O6Bkw0n7s9tpb14+uyZBYF4LAzJh7UDsOt2
IgzSEuMWlhAXZapOHRPuwTo+suOwGcKcNyOOkKw/x9WYPSKuo88MqTO1AZo5mkwbFtlpUMn6
CYALCME+p4xw30/BKTzTpgEbMX+Tl2lh2GYtYXVe1NlCin7M1vP1e3kEZEK1pXj9v2HKoQEt
AA9LJWgOHa3NDuiI/UaYr2z3CP1e+H/M9L5wjSaLN3O35L1QUTBl2UVvhGQrMR4fZ6nHGUaq
CXYAg/sj4572RzUHgd7F5fgBB4p6+Cu1X0pPTRhCbAagrCV2DTochcbkCG73xjkkOVPpCMG+
cBJxh92iOcAVoeuKS+YXq20DvG4FmrhZQOO8lUc16dcHBik82UFtOiu8mG3F0KXbP2lYzaGM
0UNvDQpEytvGqQ7tTLumgWOysp4YcjMiAH89M+0f4qBmDyapspbTvHjJud+mYDM1QhoZ9IWj
0s9pcJrGrRk2JjwyT/DLoV8AxOkOH/kcAx+HvUag6gKspz6Ne5p0hAElEDlxFqGmnEjfmo3w
Y09hlXjvELaYknBHZyEFdZgc3hA5aFy4dQVLNWjMKcD3MT7kq+Izvo3B2l7g1SphnsDrEMkG
79vhW6eyYgjIpAB4NPh569i+A+Hq/d/MRS0POEGYfgV/mI41Q82YY79wat5M3E9IJXDbkqhM
66YVgQUcAZWaWVH9wlgAWt1s0PwNMgRn9Vh8wV1BZzHWRFef1CmprPzzfYBZIRy4wrXrMqx1
564HOijzxS9a/xA8yqYix0ikdW/z2D7pryJVx1qz5tTDHZ+yItcJlxQUV+pFDNuiSdBz1YxA
0uM+OvATR4i+YCRmR/iZ4rDlI5spyqcRV1OLId4M76Rky+rZD4PbpzhMjSNfcSZSWBDaj3E3
YADpp0zaQ+egn511czK1zuD1+0l048FjRU/n0bsuZp90ZKEv1D096a4lFPQdGeDe4FjuzALA
4Ys74qJfYx669M2k7lo9pOtJqGeWj9CfYxjIwNkMPXRCcA7dGjJdNOicJGG3gZduOVQGhqHH
Yb+jEdlDugnqnekG7Sp5HRP7joO6xlDJk7m+YOmo2bYJ2YiBbx6LB9Lpi1c8o+OmbdqeIkwg
FE+B7scLj8cuYz6OMuYhweOE+I1nPpFCx4nDfPxd2mLUzss3PqNTd3X4GWbcnuFWhB9BC87T
aGsGHBZnPFh1HFnlgpc2hr9ATyHDIBUiVdEKJ40RRakAlpV9C/81FZYBbpGdFxu+ZlvzzmT/
zaVJVVytcvg4sxytBivO4AKw/cwRgIb7pn7tm3IPoFG8+CX9O4ZvX9G9LWbfwfLWA7xFdso/
0KrolHeBfEcvjePQe0vagI54AwbOJNlDtfCGzScYippuM+rsIdqj3s2jnbwFiwMTE/0K4yfs
KprpjncAvrUUrAIUYMIdVN6AxtuKoMtswennAi4E13Tpvi2r15tCm2yXjP0vvJtdVtsdXCi/
pgvbVO5IxgsQPV2d123B2npTmMEESuyFoeeFAwnDq72kZzOCEkBxWNB0z0dfdbwq2K5F1Z4q
zPFQHRXvyraDL6RaYOy7Ddxw5qR2WWyuFxbwdAXzYrfpSgd8KCc6yhLeDQRfESVUKBUxUE5u
FIgC/Z8xDAscsTgoADYH4BUEV6k3m/oKHHpAyXip0diy2VXJ0UCuTS21tN0kGanqeT9lI29v
5wwco/msLgCEjJ/u2mJ+Kq49HrFfptNfjS/ruva+LyB0SEOPfbCqujNaC9S12tON2R5KMJ+t
vJEPNE548m6eSzaKtghn79V+yyQQ0QrvmuvAYuvpI7htku3DMaS/mOEOSu/srU7FBtjqiABD
7nEPS12f78WmFpW6EJaQ5+x4HlMUmm2gOMDENm8Aaez0vUpHsy0UB9ijg8aiz1Ze8IXtkkjY
CnOQQWgZofxudvycdsFPB03DR/OgcLRb5019pUOjXBardVJudk0xK5ZX50k3ix5lXhfdao1h
ABCMkAspXN2eeAZkfsyYBNwZIuTKCVHSYV+x7mILcKJKbdah2tNSNI0QyMhBlb8xdx+DSOmd
TaS82+V2156v0iR7Oxs+Z3ZBlVXA9ZcP2nRZ0ToV6LFROhX8JnQqSoWyBY+frREVw1d83OHk
WTxjj6myQRD3/Dsc0lzI6+jF+boGJ98j1HIT+cOqJC9g4cwJWBArm38RR2ODHfL3iJCAAghQ
vJ87hRZAt46nmzlhW9u/zXllG23D7wLVTN29ehMcUdjm+YBlUqkQGndrGw4Jj62wFsY61DtP
wD1zD6eY0VgPgU7eJCOPb+KoGPbpUm+9E521+UmjwMzzJ9cecD1LoN7kyCIWKKtKjYC9mqAM
Oe9BGfgkyow8WsoDcEC1LU+XqojN1LQyAWBwboAoR3O/NMAZLP3GUEzjkQgJhjZU07YXPUBK
OGIaTJedyaMbWigUth31pcEg9HxIrFtb7ygY5eg5jI5hphdSeXIkUCU5xEGVJTRZxECVQ4Fj
kyobBIruWLwtt+gqv5VhDtn9lvNYdqr85q2l699/ULMUv/VAX0J3H6hJtOrcD81Cn8LZvCpC
DlcwDhN6uHXjjeKOR+BBzz96czRGYT9E7RjbDVycSzxqzui8pCN5AVxwqu3MkDWOvMvG0PHZ
pMc+pMohK+mxETkblziGB6lX2/76MWTAGMUQ+StBsL+RAzfQboLf8nMiCNOx4c97zJR4hnVw
c+raJptg5ITgEgiaSq1uAMc9PVhTsE8XNzZLM6cqPgOviwoCVAr/rI+L0xFRD/wddn432B4T
ReLAzm88Zw28aMmYCmkJqh6hfCI5grQmcMCToZ+m218e//po+8vxr4+WyyX/UB0dw/fq16kM
0FlhKMANRgZ1tVhmvE68W1UzaBDDPlFbFH9yU/OXqGWBO+b8sAMHjCkX36iZKYprUv8DvS9x
FLZ0iY6UtPUFYtBY0mT/MVKr3qRdTX637gYYEQm13mFr+pbIIqenllwJhxDbLgBPXDHS6FWf
G/sj75Ei4OZD4YVv9+vynX8fVCsIHzCYs5VWCBl9w8EKGxDuqPRF61ke43NVHwRTKoEDFwcb
fLCttyv50IkqSBqR8aotOABbq8bWYSuX7tLxiAepXt1bhKO61CGcWe6Eeyi9jFO4c86QwSlD
noIH6cmlWCHe3/N05S4rHae4D+q/fbwGw4nRmf0ZtgMWLtu3UQIsSsliDsRGoAYRmcGYLwGc
G+UMP0UEi0m80ZuJExOihwwDa+4uiK6PuvnjM2fxwfbBH5vmYhNI/moh7DVzNzpcUbW7hnwG
rn0bD//jHNQNHZHUDsXc0MSgeKMwG2476GkgQ9+FOtGMB0stJr03UET0JFOuo+mnI6dYERgh
+BCloDLyG5pB0Z7ljAQwyMKernBiOooZzmF8qyaHsSsu715wiaHktTZgIeE4EOaXrq4XFMq5
6yB4dFfr1mBfx5CSuFD5OaBoyGSCNYU7CEStL3MV9KRXrvYDPzQUIS7MQSjQ8pWI4My3NIq6
bEnPiIiwCCSqGsFDlfvWQlNIOEqsI6RLgxy1aKx8izzxeDye7ZH5E5YCU1M+GWR68HAV4HyS
KQmiNIrdC7A+fWdaF7TDPUoPJUCSwoVhmHTqmMzbMnKafq49k7nnRMrFb8yjWJaqRRpzuEVa
+Sz0FNsSPRqthSjgJszzALayQlbXK054HD3I2IPcMsozJyMu1algx5Jx3VIQ2UYEka0niGw9
QUT0b+8WuCTEHqAmut85zwsV/3Cr7r5ZO69o72x46iIhKT/ZjPVLplLsd7dwPAIaZxNjK/fG
PNPlFsyaha6NbfAUWXN/lI3H2Vik7Y81Ohmc6SjeWjRQJ4ogPsWZxji3QDFPUNCv52fekvOx
L1v1Me9OWd860ZoDAz5vBul2uG4N/DrRxYIFrXXFZr3qwbw/m+i4t4rPqTOrVLy3h+DsjgoK
pICPXAsyCvQ5QBsw6mixtm0GWjOLOWcNrWE+RFgqLTnJa0uvPdD/SybsWEH1PPqRihZYUW/I
YR1aCKqA8DakRfOpf01XGzTdWEShebmlupqMUJr5jOqwvkKKMXM1UThjL7rXrCeKmH4Wv8vv
c79+90QqYjA1qttdbOWriZS2lF5q5Eoap4J6H7u95JPOmSEbdnYJokk1w8NB095QSEf5PqS6
eCPCHqoyzvoEEN5oPYR4HmwYb9KI48s+XRj1gp31icEQHQm111qoGSACl+F/SBK14jsQica6
MxtVFnEc1dgayp/lJgrUJKyuxkxUFJSQ7+sJ300oyxi65aHrHjAlPBE3RborN3nLsQ5t9das
dx1UxecLkdcM/e+qaxmtFI7WmPOoQW9Ds7kZJ2HMm8RLiq2UMlSpEqjVRsvtkgl4oAblWHuY
bCAx1UPW7rKsKPL2jEEGNXDLAuBZXvO/kJoJICrXVPMzeIR69PWa91fI3CcUCRZuWVOrsIVw
5BEyOguJNGhCxtKmtKZQjskxhRYiO0BUYb2WmppAjYDEYs3HJBwPXjgVUdHx+rGeIgJJMmgD
GowNTKD1GzpFkzFl8pPLRkZshGFKadKQOwlZQhk30RzTPLjtdWZDXTkvbJ7axIVReHePXnqu
0PupkNWk9SiSn5nFHG5p7byTO1ErH6BS3homzGGFsi2ZaIkIHFMw6ABf1pCbEdchxWGGtVRe
QEQDSAMjAllj5jUyqxJUZkuzclksSQ1XUe45azGCt94akjDyxQ9pIssKrhOAatBspOW7f3a+
nIy4xQq7v7mklKIyohs35Cfh3WjVdq8B30IOds23ctmRPziuNmkCxFUndKIuxkANuBWRHHdV
BrkHxYq0pj9iN5W7EP87scFoirbeXMopFCBAEGPz3kaop88/3yqPrEFDhLOqvPQvVC7kSBFa
aobbi318sDe5biH5neRX5B0bYR8OYsDZFNGdlJu9kSP6NUycMdyhStZycBJ1F5Lvn4V5Ne6H
klUnrRnbk0jrvm7APQmg2LCyeORoH9iIcqRsRkn9pD42Dc5yaAgTIFw7HGF+Sb647+dSly+D
l6IQaoQBGhd71zphuy7N/ZEPAoL/QYcIJVn339sP5HOz6qjL8rqGyAa3tQvqm+xnAWOVur1G
nmM54p9o/X7LZuhAhtk79Zzg3iUcj707cPdFAGKKLjgq9q/2GnMOK+rylYx0PI/pytEb0D2K
YHoudPq0DVAQioBMKgxO3ZhlNadppps8Oe58ZfdZa3qPLVhxWVT8jWV8AmsT3l9RtibOHcrO
4HYRPGi2ZgyTXFQdgw0s3d9p7DsKQmcxAjworUjth1INZRsLRSq3kt8ZIdAw61megLQB0chW
wpPVeGKcSJW3suknrrx6PfXBmGBIa3TRcBzGXMsB5l7wSik+svb5yDutUTUVPQ/XCxNp2nPX
UPHoAYXp/13YgGjqWYdMiC6+ZU/v5mdOdKMxKMxtFKIHmovB3MGgzuADCMx7EWgo5R7mHxh/
Bge4YyTulwzE86oL5wPxinkpQUycJmGihIwhAo1DuIVW0ngr0rlbMwNDO2I19GLmqbBkwidX
V6WFLP0mPLPpIhmeniRUwiaY9LYzmNszGFwRTe5MoL0kmrx3/ow10eSHTp/TyH/t2RtgYglN
WSgSnpyxRExYMPpdMn4PSMagWG11H2MTsBFoMTDMhgSZkdh5cklJ5ykYgLi2vG3qNEk31/Q6
YTTLoDjQMtJEXoO5qKslNPcW2ks2XHbJr4WOAe8eFy3qpODultEAZrzH5u2mTtH3B52CJA+s
lWi2JG9bcCFqd/yXUQTTv1FDwu/iCrJAcUkwqYQ4jKfxJiDGGN7FLD16jsIT3RXfFEydaaAI
YWk5CYfiIOEu15E4ZBlTyzyVGSGMh4eppRkLnwGXLuPoK+vzB2EK1ivbPug5g5YFQZdUZYUe
+0QI2Amf9oqTEj/lt2zX8jnfrNlVwieoO4dAmadYkEofgYTOZ6pO33Ao5WV9fjAu3m03ZVaC
wvqiBk3HrDvnbXFkXfMvyaa8LOa85ZalRSHISY+hyOnAL4Op8OMCkT1MKJx1kA23ohBibQxM
F7xlgAcyVddVRb1skxZCGrCjI970NUdWQc5uCFBakLae1oVwlTPOZeimjgoBXh2MA9ANXIHB
MYMVHtKUydZguJQuDamzzK0RCOOCHDMkS7uqmxZZyDXOiGwHD0W00Cv2EJfKQ1wrVSFWxsXc
wAdijRrdQhRbhkeoElgHn2pgKwUFMkD/+qw7hTOUGFZe5tVnIrUbjGkBI+RPWM6ZRFNfwyDF
uOEp8mRcyFcJeBp23tQJkMp8iQYFoDY880FITQrawLlFew1HKHHRSIZlPYNgd7wlTTBvi2Ir
GBWGaZB8iCa+VaEjIAsUcVmOIsGMyhxwJRHEkZHuOBkULUTIuAYDx3IieAYQCPvDMTLyVhxf
AXGyN+MQSk2jNuchuk08xIsIkl8ibGjRERZlcbo1WCsUuWrgBgOthBbj0EccMiTb6N/GorVl
ubi4YiLgRKR4X8NYifOzXXUkEavCZWDG8ZOj58dIF7SXibi7Botq97g3K7bFsJeGc5s0ok+i
IeLeLJBl+GvqJ30qp7AjBUWdFDICSmC6tbl/szfkqDFwQ1O353hioFrXEx5CMPilBoC5EwcU
KaNa/uvoYWEQnJqYfURUCyVuAzeT2DaucjbdwT7eu60mr5Oykvuqsau255g7MxXL/LzegLE4
2ZxRJE+W18BDkQ/ASoCF28pg1GIpIv/mRbFQDgwfTbpowkW+sRwT1V8Gwaog/Mam/E3cA9oz
IAHUDsVGE5EWnEQF0awE0AzGX1AcK3TXHjszQyzYr7G6KOOPLhaXQIwARZ9eXMDLUJiCYBIN
usOFVXTIc+R1wfKDPjUWv+tzrUGOMDZAtFqxBqBLDkEbDlptuDaDdwDCxrex3XpNW7eUINBI
BvGX6sq5OsYZU/FObkNxwwcLRWlx8gqhtpKym7b7VMAcAuM9BPucA3tNGOG9Yg+jRTBKSdw1
b1Q8VhEkIO4qGHHtc67Gjnfm67kDS/uA7yl5qDNf35XXffpynPkoH6ztMERni9n2eNEdz/U5
NQVxZ0HyAH91MgfhF2Utusy6YOQshOIQPwyJMpVxcAY5dolyPMqIXPjPW/Dt0sH88BA+sSUp
ErjgEGwvN8qPYO5nKygpYn6iKNfBQowul4GkgtFcYX1tpfu05R76Lbezgcxj0GtwUadhtppG
17Ltu61CZtoBV8b0Dg6DSSTwJvkIQjj0IdEsoPNzoibfQvdXau2jF8QzlEQMCCwaSZjvPi5v
tpxWc5nsdRQvbrJIDtcm698PpVwecMuGjdGXzHOt7VPXRm8iPvJwhtfZYWJ51CKXVMLF0/FI
6Q0pFI0opAgpNY8tYfSk1uHlTHHFcfClffClg/Alw/AlEfg+Qr67CU4TfTEVbqNMsxHt3h6K
wIgeUKVD6fXEKzGWn+giPD36dd+5Wt9bcZNU9APwBi9gSLid+612uCijmH+xVWip/sqb++OL
vz3684/f/QSKrSlNyxRccBNnnZVr1LfoNhwvC9RPQ2vKFbduuyPF2roEYqdSR5Xd0LYpjoSo
BqoP6V4ra5mVjEYnox0YaUqEG6OX82O4vsCkaMB3MncIJ+gIuVWUQ16OLu2oC35mIfein+ue
5/jdiKrkfeM6rpFoO98jHMA/NK0Z7pu6Ey8ywD+As1g1AsEB3vvpONb1Di5MC57geGcOx8QQ
SfXMsGy+X7IoZMRli8T40vxBXQEzOvBivhjvDPe5CJK86GBG7YUJYqQbub3GSwbjzfzuEmQG
XHFy4XkzYLvJJWvfUy0A3Yb5Nb7pZdXYsKH2BFI3dXOBU7+8dKjqznsW8OiggLq1Mz+HWCw6
YDAYWCDin3b7gkUzPxskJKWxKJQgJ4gmSkKDFBSR7Iaq9aZ2F8LLfl0/MDQyILOoywyhQ1oi
tMMyv6H6LtNbR2um5B0gK8qvsp4NE5/6Cy6/QCp4/JTOR7mqaRMKX+3ZW2XEIluMtJrBxisk
S9butsCi8g3kwFzDPZpabNjg5U5JmHmnR/X6iD8+4uftDYhTNVp2DLNYXvN+bKOnSIFCnac1
xJoSJCM0s4KS0MgnK/EO3oJ3sLBLSftfCn0I28o1Ba6SrxJZVeKCpQ4Y22spA0OsQXOyDbMo
L0kc1wtsLlGFUfuEIwDvN94O9phKbLtd0uOBPtVc9XUqWtLmK/ukhTQkCEgEt7C0i/hecdte
wqZo/1ZtbFaK4j20TT0TIwytXbFUre6By9sQ0BMpxRm90QujQ3hADA1/2Qmoo4OUTQleGKlF
WVBduIJ1Ihjp7cdEmzemuTEofR/mHC0fjrfv9RH69l6U7QUEGxeBXIOpWn2sh7vtrazmJzDK
GLx4hQ7TFXBqN4TBshdamRd8HyDdOtYU3IgU5qO0gC71OHPsWsz2btabd69R6dzgmNXo4PXd
dEH7hjS+Rcp9P9VMwSxn2QEtI8Wh5kCD9fjcEnQzmoecuWVUiqDUYFNnxnSRTs1iQ34n5kRQ
BZvrBbokeHtS31jSgrakmUKSZQVrx3rC94tMIxtJb9NISBRKvMzGqffErMWnrL+XmXSkGsjS
nqiPQEn6s9mZetxjO00WVlPCfhoum9pdSQeP0MYlOYuZrFzozszuZDFvGQQkabPe4PnLgHOw
7FjBmIWRK2EPGZWDFXrAd1aPu+xtygqtLU1cbSgvd88iCpROR5U+bFlMmLyup1gpRAfAZtEd
C24qqSvJH2Ul2Ob5fdaFW/O/V8lHWyWeTwXt2uCXvG3qDNzx4MRH3gnegnJTRLjKmAR8HUj5
noIzhLwWFSDd+3R0vC/0JK2K2H6frwbRj8r1kdpP4jp6hQ7jKJIPKPb1rOoTiIBd4YeEDGE1
Tri8SfCI2AFkUTb3Pjjp7ads4m/QwOQkTlf3iPjre8Z7fYWo2MRcITDgtFZb4iSIScYLqNAS
+Gfel/dNPYUUNG6p/9WJGtOGATKEvzqZ5NXRlayfTuiJYPMGtk1GoOZPDGJujcIAHfql2RHh
PQo5T6hKuN86qQCCQMgI/tiPoa1zONXyPGlX5l248JAMnZ1QoBC82hutKchFuxRe9eBEz1nz
61qE2U4LGXJgYuVu4PwrS5pcz94v99tfj57Db6Q1GacAGwxkc7CHD95KYvSuu1LgsUkQgTC7
IT4RjyIZC7k4zt1BthQazOLQ5MGGeSOAjLnr7QhRM9kazpwQWkawgzI/Pnpe5ifkiZufwJcn
pG3CF08O4QnpAE9I+3iCxxT4uxUFHQlOrmx8HIDobgPU+Iz1EoLUQq+8EB6ygXvPghV7wlrj
gljvNCtrBUM4hV9Hz+E37jDiSyCxiYDIf2pRlYRxznoKAp2oggMNqumJN2WtM9LER3tz3Q1l
F058Xpmgm65koSMvfniOVJz7KbqjeLjlEguP1YsuHSQH6S252vpJY0ayH1V9QQOfDwUQ94jO
2X2EckFvP1m9LYEJ180VZ9Z6b/WApmBWmD0j2QhnZLzGoenZ5Ojtkp3XV+AOh/dF7IaQ5cvr
Paoa313gvsuRuCaCXxOxd/ANBxNl2u3Myg71MXgBjQJfcYa9uaYmsJu5Y769N2abxME7hPPP
f7JQVX3PcM+K5pVgSVpY3a7fQysPTR6oTViOv7Lp3WyfQHsPoNgKsa2yKttzjk5LM0ZHOOkB
yVnfoLtvj2PwRdHw568nQRcyU414WSYGxtt9farG2eFGVQ45IEqmsxoVAG9fb0b39GIHc+j3
AjJLy8k9xEeL7eWktYdLM92U8T2LbYMte/CADbkwH2KCTi0LdDx9nmGJTuOG6FBU4HC0mL6c
dLc2aQt+54YWRn+Nfm8VvD+Jq4yivJiXn8zwOEHwByjbv4fPufyz4NIRd9YdQLwuYJTQyL1I
KwH3HNR5+APkH0MJRfaIXWeusz3A1+lRrAYikL8PsJQ7yJtyeP4UTVeh9nT0OzunACzmvsBj
Nl0H2ej7CHMNuEGHPUTj7tDuz7B7dOACxsGyZ0+QvAiEfkzTm9E+U5hIBrBEy5gy6oYCZG5t
zZ3m7w8oyKy+7tVzZbM14zoCcZQ41db5yc2D07t/9KXHUaNqrWGF/L6Yl21KDE0o2sxHwmCG
44UhGMgzr8mKywCO57Jb2HbVnRsurg73p+YQW/YLt6aFkWhyjReze2NBCeUlunGDt2LQwhU4
v2zKrFP4FkHQYiFYfemNvDfGFk97i4v5khEV++PA6nJqFCHlOT9xqAr88yiq9xvWq2Biwprg
H9Auwl90AjTnyHVdUfHmrFKpVSqVpSambiWpsgVIyimYuFs/+XVi2peh54pSOoVKqTvlvFig
UOoWSqUMSsv/XhA/gTiQKjBmXJSUlN5/3U0gDvYgc357EnGmVm7P946Cl58eQbnMz9h5LQOn
CgW80uuCsaDKwEBgLCs1nkTNt/nCQEc0vLcsO98LA+neGEjuDgNJCAPpnWPAAlTeX+yu56z/
uqJ7ffDljK/y5WaXLM/r+u1KMjpcSorb2cvJUTtxFO2qJN0gLkR9UoLI+lZCYHbZLvGDiTKL
cAKXEofuW0ZGAY5EtxgEhD2/uzGoVNEvZ1yCa/EOD+hPxOfUFKkgXO9mU7xONhoAhGqHcUGg
6wUqqDhxIUCcExvxWKFJDdHEPEpQv3MjGHEPC3Zpz9HHOXXTgbp3QfyipfCVtKoWiqdVtqlT
CCFykA6l93KaisMJBnzWbous5JNU1dUR6HmQggB4YBcyyr2MxYJetaIJw+0VWjtlhnMrnVFL
dsreAcFdw9xV0sPgO7PMG17mNyjzzirzvdFYTZduOH7WEKC/7DBfYcs25Vv8BlGNOmHpkiPg
IlJZZYUaqLRMa1oUV3nAM3XJD6ZZse1Q5QJRGSAe16a4OGXfswID6WNoGxE2i+YFDG7k7vtm
qdEp4/FDpP0Mgn5vtwVFQJLjUuGJmuKyFCFjhMsdRvEqz9AImWQUrr8p27fglIxB/tEE8UZH
chEzwVcFFMVwWmRKhYYBE4Wt42Pff7dEZ1kMboT4+Q7bJGyTK7Thd83ps1GI0i7XXCSoBEWU
rM6y3Rb0u7iVvJuLWF4lLPZks7kWswPewjRDvPG2FFwKQf7+DMEXBk2KoyNwlGSgpgGbGG8P
kQ3xMvivBq3iCA2ayJNU2pHXCW105dKgoAQzJvDiFdzJvio+47Ol7KPrZLcBr+6iAgKHKO5w
X3xJEW0ZyNUQZL0zIoFIP9GEEX+7SnDqrJQAGC9NLJ8FxXba4hxIWoSI8dcVbwrcEGTmcQId
UM6xUrQtTDRiEfys2fS3o+fvpjCaRMQkKi8oTheTW/w7Yb8m4PUNdn1jbWoiRpgAFkj5tBwu
ChE3SwayTwSG0iJLwER5BQU2ZUHEK1aFNke/5usDQVbcXzAyjOJmK0mlR6l08hjSmDJ563Vh
Vp33lNYytqNgRR0a3axK6V7Ngdd22V73di35XlzCUDol815YMhTRyL0wJvAixiRbt/fOe1am
Vw2BMw/xq0Ia/DQEdNBTI9aNPzc2wCRn2CBbRe1ZlYDbQhFIv4DI+zmE5p4b3Nt46llzQepA
/N+3gWNuqUSUUugO2HvcnZ5vLhDgbHVRouuMMABF9/nY8fmwQ3fknlG6wu0iH6qy1zk8fhwX
flAytiTlPUnyN7u2o7B+yamUEY7Qr8XgZKl6JV9ytiV2V7Ax0qWcZ9LXV4TvaN+WW7MeHsCk
kCwHMTHismPTtuB6SbCtk0sIawl3YRbGBk8I9JoI10xtiAQ8s0rCP1fXb/g24wxOdDSWXWk1
QSTSgFGg7wZiNy6ifyLWOGlJFGszj466cGoVTkOFDQG9VdL9oq+buWW0smun8uZRtN8I43sx
M3vEw47x3bPqWABRabOPXusOntiBOraUswtj9QkaID+BGfGuuZlQwORKnmLAgJS/7qLXdQ3F
hDvc5NABVMWuA48EOYK19qi51TjGlI+CTOU7I8HDMEZSjwD2wwjn+9vkteVrTdN5EDLSPZGR
jkDGxPVQJlbTG0O589ZPtJnegPJddBWHp2ToOr/B08NKZ8mYXXB9PfnCVedbhKhY0tCea7dv
qBeMTRQ3SBeioD1VquV6V2bMBiddqGlzy/nBAXLjLKzN6ju+89CGJW4DhFzY74RA7o5IQoY2
j1hug5Tvh5DSb9TrcQZTShmKQWyFJqNbuHREgzvTJd4P217rtCn7zIZFvba279aTcGO7tdZX
LG9Iy9GAHkAJ/RyNl2VxJSOB6yAudHDYNZhvEXWm4nxZY0I0I4xzeoRhro2QEXAIveLztNtS
kJamwPxrrYoU/N0RzR35SgnFXfjenj6bmEj1L+3Z7xcuCv1snSL/pL60FxbgIfzWZFBsz9tQ
rsVIyuzhG/pjQ3n1HYD1e1eYPMhCzycInKNnMiNRjtczeSejr3rmbefPAk7SXUSM2DtWhDuF
yUqHnl3scV47pFYiT3n7nwujNRxi2+sYKBMjiGDo2dHzBNWR+DGlyOQiFjm5KxJ3YMnRcwIL
igjVpXyE+dFzodrDAN+XnJXuuACqtKyGV+UsWUikgN1eJkbQ79OFRAHkaJ3oBMy3C4gxPjIC
nJNR/VZTsPqG0/BukzQs20Bgb85AL5LNEShSC8NtuNUdBCwKTi99RVN53DIBSoyQ9zIGhRmj
IxaeY2maCFCNCN6m6TVuEhiq3w/KLvvi2KlVZ9DxZZmJveGSA5osdTAH1xHT0m2pL7RphS9+
GZb1xNEzxq59BWJO6CqhIO52N64GzjDtt32NpBFYFywJNGIkI0HvbdqcQb8uNuKK78lJw58m
Gwv7kPFNezXIRQcGmKuyxXNMGse/raOzlbx9MxB1ju2bg6jCd8ws2LA6vhPj58FTS/rNuDOB
IUwWyqK2EOkkRNwYuS7KCyH9cMGH89Ck4axR52Cx0hjwlpZOfJNw1CArUkTixP45PGpQOKaL
Q6iBXuehyuNDupjhVUbGuIiGQwlEzti/3eHQGZoYIKGLvG8o6IZdQQoS3CDplh9YY8qGpRBY
eFO3xHMFQ1eZKriUjFsDGTeVdZLymWDYeUoOhKOUOzBmAMmyeld1Uo/Jt5WFtBGditJ0dQNT
pxD/N6nM3fSS3buVI2cGUejeG7CP1JY85zQppkWEEh5yZkaNqN2AL8dKxahTzpVnzfNbOK6v
9gfs82MNyMUPtWb1xqAPE7NwtlIBLRP2EAylYAF8yJxMS0aCpbaGuW7wXhFimGZQbPEmwyHa
kxeSpcmyzc6Li4Lv4hMm6nMsofFNfEkPCcBiSsBSYU2NWs9Teq5PlmTGpQBUUv/OZjQMW6/f
zi0HwIDiBSMbROwyNi1qS0mf+ibWlilOLbQ83tOWWlxi1HgL6BR3AxqxPLssyIRtBTyhcGTn
RdlMdJTTvIBL2zUwImG1BYnZEt0oVEDZOTfRyTJnhYSQk+VJxVW2SihIjRqn/koZgSLVUlku
taulZrWBcDFAUwukIGFO9I7dycKGkYYilp1XOl3YoPWX1vPqjHygE1UtjVSLxiqjociAUgSq
Dm/hB7iwZseoO48WT83iqRUUYzAsRh8t2IDTYxk1a7DVGKmYMCrCUa2GwmAY8DVFb0mjT1US
rENNQUYB8dC3+wqdA14RnGlDulIyKDP5JBI9VpbcFOtuZNGmfH0+tixJMFXEEhySA9Wl3wfE
i/jmzWcHDLWLQGdlbo51oASMcaAIji1SBi4FECjuOAhQzp8vS9jcBORNPLimHGRQlnCGbVxl
UYg0rlHc8ysEnKhF0nq6jE483vGbZKeWK6cTlMLuXjl36jwDOicWQeHHow466Cp35RI5QsRQ
+nJGCF3itZh6JQcMUp1BuCZhuoSHcy+mVwHpO7sSariEY6JEerWiLV3YTjmwRctnbA6iMwQW
dy/MexgDCMAHFUDY50Z33+D1+h6JhpGXk9An+DYo0w7B9FciiQ1hiegqiiuTnEd1rAwtXBRR
nsCTvQDgf9XolSORu+Z6lM8G+lU7sSQSrownOPtekb/2CvwVcxDSUZvCP/u1l95xe1IYijc7
AjkjNNERxh4tv9+GNnTF29HgqUFb6sbRUaYc1dXYQFMj8k64k6E1Mi7ARjqK8RHOvZBTrnek
G10m6h7pLkf5Hdmd/CIVbVZUKWlPANjfkpM4HGFPVRH/g0kXnx9xvvRLcvKr/faX5PjZs/T4
1546qVHHSHJBVgwBE0XLoJgYyOgSEbCJb1MnS8PcMTGCcbyGrKUUejohUwgpBEsROuyzlhJp
gDL9ZEkvLoqkanUjhlcmupKjJxkNaSEDe7glHmImxIcTM74Ib39iggbKYSMyNjlHK2ik+ljn
oiH353ERvcq5q5GdROPjufRskIsVc2wIYhUcOw6nRYnWqp8MhvpTa9ylYAtInI84jGL/2xuT
7grvw6fLJly4lWyroVbaCXRtLwrhmylcGhIdIg7GovCM1wYA8XvFinpjhrKyhG4foSo7Vzoi
EBRdp6jqTnhY1LumZTVEySF5XOldCHI3mg/JObj7ba91ZLWI0D4oYQXSQd4PZYO041+EEaOt
nC4iXOfFwQg8TpO2OE0YVJHoYO5lACEx95QgD7mzMDthQ8SH3LZUYlVpBoa00QbvW07iroca
+UfP6YpZNRjVLhZnK4J6b9YsbHq+R8o9hJSk2J4nefpdL/on3TyXsB6ybusFK0rA/nJJWlwr
EsmI7KPw9M18OJnOK3V3BAwV4CoN6ckrPu14DfKKAsNrCiGjAtkkNbHUVeE3LUgGyIef9V6B
yrLJ1P0V3hDlHUfyQuNJWjBxbF2IpOVYJZQBqHHpUzaATYtjJEL9GcTnW078RoB7EI4tSDmL
u6TDjRi1ApSIVJ6skXfKnMBzv3lEkU4anCZwYwp80DlNTdwgG/K07s/rHG5txl6/mTthbtzT
f6C9cX6HfABAeXCLSEeyxAyYnyWfhcvzF+ZBoKyyzS5HNIqglRCykjf664KVhUItxwb7d1eW
8qZ7s+FbFrISnOy2BqnnNaSjF/RIKnG5aLV7Rcx70HTxBVN6aKZH6HD6doVIIX8O2YiSkpP0
nMQ+DMfqc9bsJbU3e5Ja+bqqG4PaIkSW3oLIaHsSF2MDjYOQn+d4lzBGT/I2por+CRIRUL7g
P+GGaWw5m3EGCiMQYIv9llNcO1/GKNVwzx8k0w9CpEASb/pI72bYIz+wHQeyZb8Z3q6AUpK0
rZtUeGBkEEKRwlaPuJyxh5B3h4KeoWOLYmVcDvHxlzhc2jDjobIBKUqcRNg4YWtyC841Di9v
DqIWj8/vqm3RdLsmLfJBDv/7QdEBjJ2wsziALMcsP4w0513H8zAvIlHGl5yyANz12ovwr1Cu
xzJX2mNPjrKsgKYqYTIyyq060IMDnrQk7FX5DVXWtofJUBDOkVaJfiNgHCopMqC2LBtbi6ZF
4WGfaiYG+uppI6KwEp6FaFLZLej0L6wXYwS8sdTo2zT807Z/V9U8SohDTcclDiPtrdGKCp5t
JMyli6ogvCQoJ9CdFCHFyLDCa7+tlFFMWqkweVOny8Bx4h7ezhQmyCAn9jF2MNcyUDgYdm9i
2OsPSeoy1qpjGTj6nPNHW0L2MIIE/fHH546RjPiQrDETW2dr52wRL437DfZtB1nAsyql7qNP
l28mdr0kMuYeFtSDiN5aw9jpZeWW/1nMY2Z8g7JsKGFMzMtmfOtpT+u9Vj5nv6JIf2GrLgXd
mtztPO2DwhFXceRi92yXfQNLF/2hpOy1N+620n7EltxyYMo9UqR1pVBHbVdsHU9BlgRdCYUp
DzMNGsHYp8l0oQLhRcsI2KfavjJQI50uVIy1aBndamq3Gks3lpjOpHEvOrNKavqy2i5y8dFi
qanbRXwcsrzd/gvpbkcec/oVnhyCofEt7AZLpJZNSnEcbz8Lv/CC6WMpEUS/N4q+io0PQgOb
lNUlPw5aUf0DUsNJUB64SKpyXZBxzvSfSLbDQsFJInbwEz8J4lAStxNzD+MtjdpBT7yd0G5H
Lk9EK2HFlhfUDWqzR52B88SzmnplVSZOq7CRtTO4s5wk9mhD2wY8dvOTTWw5Wci/kN22rNg0
Ze02yYrpiGu0KRgvvTF70VlSDGPvl1O+E2kgmn+4x8TtsSecfmoGOE48GIJR9QPZAdz4r+k8
GjE8FmBqS8GxtnZ8KSd07UnE9m8OaEGN2aen3uirAejdSKz9wVjdBpL5CKsZXNXgrGULNzQg
3TYEEMzxrs000eRl/vQgw7LYa2wkc4FT7yxrcp9IKCEdNT/YwouZiCikg+N7wUD0wgq74SU0
7ftGZndaESLe7DYx3h2s0HGSQtPPw4oAjjNgcxDQVITjAwUA6APwDN3i1xIu+8GV1SKiEkAM
hDRXQVBGhPLZg0zDdI4/H5jUMQEZmgJNVjqS1ocXfu9swezcxwxFYtrsOcIocDAntwlJc4fQ
3+Wi3yuf5IntWRKGTqjaMTLNSczlRnVfV3wzlVHwfTUqJHMMWAExyxeGdnDfBvOduVOuFcgq
+pLKXBlYdwQE6OawP0kO4S4E3TDpnzKuC9Wy6is8XWPZp5t9DZtfiNbn80ElmBF0Rcg5F6UM
44qejJgYTF1VFVdE8aopRQiFUH60hjqhb+TtkS9qiZ4dByU0PRlKX+hSXDCpKRwVpZ8a4Agi
Cxcy3CnYcumqdUIe62ITnoF7m4zSOp8MO0U4yTtdSh8EAkPGkmo32eAtxyO6AWzZJdFfSxOF
zI0YSLQpJLnIgnTBGyS0cP7VyWHbdWgFH5oYMDwPRuT58OnxJJFnkXCmbzYB7NNdDrja0fGz
blp3XX2x2m1FLo1eiDd1lmzsG1d8t9zWTcIBbep6oHog2wt+669lO6zLijm4d/sO7fG0SbkS
/HRWGJ0TKXdyIcl1dmjOI2WqRAaxV7ojly1QvAY/txHwBcrXEzyFwHRm5+UmF8CFU/2cBc8t
bjxcO8laT2w3HYgeu16I+WU6Ocioo4ubZs1e3bZPIB/ZrmkxuDmGF8BAE+0uPRKBF5w++xPA
KUTZffctGzFQZx3IgefqFkJY8hHFRCMieHAQtcbaA5aAte1N0CgBDGh28RYL2ZDxOn3HiUdM
1BKEvynegSPJKkva7lu6tdvB7ffnNG4+SUt64MBifPwrmlpqDI5j+VqgpECCg52aVWTRCE1V
n1Dek15Dzj6SOMXhnfHOA9Kcmmp4v/BgQ55gJ5Rwug4mxlBCpV6Ig0DwsnvBEDQDemwfA30A
BXf1dpXXV9UYvn9bxn8g5/9v1v/frD/K+u+Ij35SLulw7ABP/72wxZB7qsnY0f1yFHfXSqm3
lBmIL5OZN2F7sGPfA/fDM+ghdEDKog+Fjd59YRQybj6tCOVvQaNkqKiTC7nRWBYQENOws+uW
OFJvpBUVjaEYc2Ab3Atpb2qKvW1YymLl7nwi8BbedxN3CXO8jxs1bUHoGM8bJHib1tHg6a6G
q9iZHFda1sXg647F54KTh516k9xMekRrQCalAtlL2GC9Y5oM0OKhnbIBtJD5FW/NZtK8v1uv
LRr2aVNopg27a83nY9vnbzOS2LdNTxuq1wfgNMf7EwkoG4+mh4IYoc8JRbpdGtHRuGRCA3FS
xNvV0SmAA8ooLSSBwqtmZlNKvTEhYt1CZEN5E8DUjwRN0/zh4MxaVupM4AKlu0F7Ey+g75FT
9BT+xL06nrUwINrnHAuJcpWNWk54ZU/bg7es4E7QriJlZcf3lxYVcfb8tGVHV6Ur3g7e857K
KGztFLWeqOQTdzwgzikHciNqyJCOQpsnDhuy/jDqV5wEwsiPlOcEEC4fnCGOGPsS6Cfkxy4s
n5I7h4Jvwe9WRAbHsFmSA8wI61TAiKcQaCS4ALxJMFZuOJlLb41Y0IXehQg3rXEYdAg0IhO+
mL3BNYkvbWsvB6NXefywHKvddSoKZTsQwWHqYZ8TvDHNuThTSz70ttBDvdl74qiZ4AyJHgbj
XyCHN86T3iV/jkOTPBfezi1bUACMmGdeh+Z5v8pvh4kEWraJ5MXsbYx+6DpyaK5AVvafv7Us
LcPE55JVqKfFbRwHwiCa9OTuPHhgdcTyoU0AJim8Bwd8zrKQ3GM1S/IKf6S2gLjAgsKJZqNR
uUGCKDwpe/wXs3YhU73ybfOFvNSALly52TNFsT1PZP7ilpGBkK48ou2+U7EE6Mr0NYUnb+Sd
Xr4Ht5TK8apoMPCtSHJZN+Vr8C5ViKG4qDoEqgkHBc+swPJpGEWN2C4UiEW0JLvA1UmNbTdJ
VsDNiBdezAUz3kKrDgBnwbLCDBsoy/v4adfAzY+LGk81G3mt0UjYCNZNZVPcM95PzB6LrC4d
ivbTe0Pd4BNpz6YWtniatxsRkoFd0VyZYhFox789mX+676adHrBnjzSbe2FSLNac+7Ok3kos
xHmoZ7SdW6HSOO39Y1eCtzUkPr0Ar8kMF1NeiChDfMWArwRftQPnuDs+lfWcyFBF04RXlNQn
PoCeVBGI6C1LWAXkCjYLeH4I64RDjvs9kFgL6Vz5kaCpt49gVaJisN7CZAJrM1XjoyWRxmEl
ITU5CSZuST/eta2723qCkqlC2xfK0CphISD7VkcARD+ittaCBYJc4pzAnfuEXDMwWAiEibhK
ricOJanQxzLmdUgF0dIhXIf9Baj4kFXl/ReLQqYnJqyE99Fs7P7v2zBkcfLAqmQ0pZhEcPAx
0Dr6mQDIjoUb9wc7FYaPeAFB28bEgNBtQS/aA32dO6w955xFxMID5bw+GQ9YoHeMHGKI0Qph
9ugVvz2zfCSCydyeZUaBG2CgA/WGeBXqtgb46XjBTB+C4sxUlxmCDc9jIVlN3P93zBVJ9UtA
IvuVhaJQ3BVXtijc48z2SYoOGyZL5g89ngwLtHxUS1UzHjXALxkXjvrG2uuL1s6zQuZKsSD5
4LPz2RT/TOdnkVKgSp9N4Xe8TFfPpl0df6+0oFP5KV6WSFMUN74M1gAD2lR/jpcXiaSoB+PL
YA3sQX+eiothdvBdNtkmfJ8L7bhp0pbZqqxBVGxavARNH0ap/Q0V6NU58JIZVV7yad66PMkc
QwdxNE/sCzG6IhDJ6amcF9NA/p5ZDgOyis1g5POumXXH1htT+634GhSKhYcLQ2aQwN0CZxLa
7eHj9PBBwMvllZHDoDPI+w7BE28KqEL9dHW06ok7MnP9WUMbIwVCeweh4G4n6E4w4M1tHAFj
xj8J+AbcDBtMpGaPM64GQgL0M64GM53ikRY/3YXFEpha+NB7twfKcYdJ5SimBs25e/Vbwujq
JnHX5XbXgutbQ0oHj1UtGMhKhtJCoGtJOKYWZ8rT4wA9vnOMHxoria93PVTe6u1Gasc/GB6z
Le3HBu2cCe5s1AbnWjCZRcsYeqRaVy90GouPjale6rDPQneNJ6SOj4ymw1U6kz20OYejRopE
ey8b5fVL4qV5QWQPsTJsUQd1snV2l4E5YpKsaB9aIPNQWCilIeMBo0c+pdAn0vdN2zv9PdnY
VC0LoL8bw3nFfX1evEO/v3gtYw836pgOeUMWPL1PI4AH2pLlHWGA9kBjn2wCgLfuGIX8Sszt
P0xYI7b9oMInqsuJyhqyA09smZupwG+jbpiM0zQcvsaR4Hs5HycrswJQq8H7hG9dWVVFM5sP
V7cYpwyD4NceyWEmcKMvNDN50iXaWz/p8XMYkPzAJdPIalUSH+C/i+SClW0LPQm4NfLLarvr
pEIXDXFtu2BTv/mpU7Gr3xZV+RumI32rGIDHNOHPjJdwrcmZ0B33cELig6hQDSjpyDIKyec3
df02OYeMhs+esR//8pOoE16PNA3GahxGf5C53x7Futm7QK23fVkY7EFUjHFNrprSdksbq3pG
jCIuo2wKsVdb2Kvb1hmlYI7bZsbfGdzNHGSjhsi7A3Uj7xuK42amIvkY4znc2Njr7+yOOeDP
fKsxBzk6ZBEdHPsfynVerNn3f3/x5z+u/v7yxavVqx9/fvUzf07Bo9l0V5XdqisgUdb5+dR4
wWEvu2t8aKni3LBPvmaPU0b3rn+L7dnXEJlCNetToaHIxfv3v1BSee12eb/9Vdwi4EDocvdb
fGbXhQBP8ZpO/q92W1aDC8IewrHH9o77RkXaEC+slrrADAHCFFO0+RjUhpfH+oTPCQf36sfg
TPst+zKwC0s4lR7TglU9DcB7jABrHcz3f/nLz69WP/zrjz/8T4QFeIxVIADwCQAcboJ3YPN7
aI8XDggvoarC50XUoW+GtHmMG8rJmXFtyMv2poI5Ugw6WCBBSk9SEFTCxB4sn0F5wRoN9yqI
ywf5hbjIkl2QGVQF7OSfdGgtpPeKLs54IOqQnKGNbkbAQnCQNEhFVCiThUQqJcvUwqnz4toI
eqlij1LMvhmHdUGF7D/Ynx9i1R73QkX+U8Eo/aB0EFFPwO+/zKYC7lB4uguITHcRfpnBy0zc
vjPpKb3wKTHJAoRoEWGoUhqKPGZHoYtP6TB5tjN50dN7hdRpmWXYf07Xdf2fU946ke5U34is
+cs0afDlQlx/cuqCla2I165xkPhezOJ4mB4ly+5d1wvZo1QVicAHhbKhdn57lKsiQ2Di6UMA
CH14bWMoo1+yr5Ivkq+On36Vpl8kX3/xxcnjr4vj5Kvi6eOTr588+epp+k12Ujw9+fJXCyoO
zy/r4vibInucfflllmZfnxRfFF8eZ19+k2fHT5L1l8dfJifrJ8k3T09+jQ86Cps1bkQxTN/Y
sccJoL+jLSd2t4T+ZCD0E+PSuDvqI3SQFodHGEYVjXEfSO0xfvHky+Kb46+yJ49PvnqSPT3+
5ov10y+Kr7Mv8i+TIvv6myL5Ont88k2CIo0QBi2DKomdhi8RbnHEQrrm2pITQtKBrbwJGP2m
u7Z5tCnTR7/VF2lZTK3rAgEjJpZPy+pRlvAzUWhHleoXflIvquzbMn8Otu/smyfp8dPi66dP
vnh6nB5nXxXJ43X+TfrFV1n+dP3kpPjy6ck6m85H9Y8XFhGKvH79waEIG+2CgLAAovDNyPY0
Ylm0p+y8zPjZc9xMwczy/9myrcfjaSzVhvFkm/YkFNEh4TtrKEYM+WEkxEIJhsY1lldxeBbj
Wx3LHUxseaeU1lRTIkviJ4N1jXGT4WpnUm4gEtUDVryrAonJjbJMlD3VF7V5nSXkq/T7QNm3
2VVdySeuaJq6iXYhSjEsFWh8FkvJzCYiT40R3GlPLoaHJjyIJMb5oJfoJTsLTuTdMYfjXu7A
4cB9ZRpVZQdqkFg2DfYSXluPLuq6jXcSqND+Y1c2TbGZGjnl/BOtmjbWJVza6Kby7KoAOzlg
VzkZQplEwB44E1gO9RJBmcbAeKwJNI9CWTO1z80TFfgjeNXGovFRHZCawSjrOf0qt+ig46+6
4B3w4U0GnHgDB/rI5fizvqIyarFV9r8mB6yrFWoN1wXoGe6WDe6/BI8/yhI8/jRLsK6OJKoL
SN/3XYht/Q62jkE+CEez2+4cg2xwe33wvmER6vA8fK844l3xQreHDCau+p1zxpbz7hnemP1m
FHf0y/8X45DC11qlaMtX4NN+Fn0NeuHgKuQ/T755clx8WaRff1Hwlffl4/QpP7oUT58WXyXH
X+RPv8m/fnyCtBtr/CTSeMp/bt34k0jjGf8Z3fgEYhKBtQhSvrD3DBLVLeB3ym7AESU7X3UA
AtxVgUzEq8AyQ7WRq9t2rCCpaxURi8t7DK2jhayuNyyvV6KgMqcJ1TrGByBLWhQmsNY0Am8P
hatZ1bENb27OTonV6B5m62TTFoJ7YfMzsiGd3s+nlKANQnhRdWFwgzsBimshzX7/459evHz5
4uWfDH6E8UXgdrCiYGxeZ0P5P32DmKuLB9jBTy9evvj5X/fswLJnc9G77GZibmmOdR/g+YuP
gEUAMcyVLQevOAlRQXxLqQe8vPEDXN6QuJxDQ9f1TmV0N8MfJxR92byiDRk2IM/1lbrRbaAj
x9d8dmpVhiJwdTu8KsIHBHnv+NzWLIEsu683hXmTmw8bLmCj7KQBfG/MPdwLaXbFGY4Fy6kd
3cLTImjesTJOwcrEhZkfa6waKJ+HhAVycYJKgqNhqDUF3lxtcbRoRjShB2LoP8aOpUdSQR0m
7zvvLYTRxfLY+IMaGQm/bF62MQ4fezep8GOKuyPxExlXWHDGCuNGMdSACzMIYXcCcu772+0F
cay+AtgUTW2IJyNNqNDocXx8J5EBhmVibMzSIFIb4wZ9QJsuIvyZm3wMNPjzdGss7NGkRsKu
cne1v/2dNs2ejTC0uemDrnmXsTfL22DCNnkVxJRXN/XrMhPSqkKF7tBJGK43W/Tk4c8WFOm/
4VJNd467GSRZAEeh/zQ179SxIb6vXv3r3/7y77OeiCoQPA7fRk927gA04mAL9Ezi2NhUtXo2
iA3eisy7wQuZo4c0B5UepGgpTFcOMn8ATyqRfR3pLZRTzNNpoOpnBY41stpKC5Te2WgAubKJ
Q9yGFSAH1HVA73Vbjsxt7/xarU89VKl5GjvrVu3InBNpmwwAolieG1wAecLZvgyBJa+TssIr
w1dJk4cYxMdYTfz8eYZXif9diKk5CKKUQxPye2CilCnIrpqKpyixt4xLrvxcsikSjItLCUEo
PGFxQXR0JjOGsLTIkl3LS+waLlDzgcNZBDrgB7ii4i8QHS0e1CZWICNYEso5ccWbg1gJCw5n
wRvmUGRyvaXX/CGkOrREcLhmz3edmpf9rKUCzlsZaUkJ/KkQ96ELaIw8C1VHS8uzpWeWpYcL
hDmCGySPZKiHkoOeJRDXKaUIAfwcC/l3unoLKCkSTrmYEPvU9tP5619evHw1m1JJ8sMlEuwj
tW62Wv304s8/rlYLtlr9+cVL/kkyUi2N0+F5Kswbwfdp4L2i/Zvbw6LON6pxQ1oR8K3rehoC
wy4JkKZJM/1EAINgMQpeUfATgzsev6PgFezxQwE9RLEBUogN6vcCq4HW3xmoj9pdakZFGMUQ
fieQfkJC2BPEQ+af7yn/u97BLsI3js21zAwIKdFQOcWfZkVw9xAl4f2dbCHm0T9C506Rj76R
jAfRmIoPTiV2lwcDFaKJzzqfIEDK4RIQnN5AtOASV3UNYRf7iCRZw/0OItM7IZZDpiawkJUX
Bi6Yj8h8hufs/0lofQr7ZMDut1+OhrZfBm+3m5IioF7VwfWABTqZDQVbae9kQQRksNiY+ggL
xLEPwkt9kbYfvODcfDDoRkjgd4HNCC1RNDyDnkA7lpdrtMJ3QTqiBAn3MHdT+1FOcHvuIR9J
8vnIEsEtZMY4h7nrNTbiHPZxJ9MXvQ1blbu8wGqIv08+pUw1+gT+qUXS0YA6OE8HcP4Rzl/7
EcE++8IHoYWD1BufZGcdr9waAx7fpf4YknXwng9kxYbdi76Y2khVJV8ul8E9jMrSdSHYxsA4
dFlmFAw2+TDHhNHqif7Vgg5VRKa/R93KbZc6TLlIhw5q+5QycpZtFxNH9GsRYv9uRJL9OMTA
sJ/48/WB5YKp0+MAgCcEZnQV/oDrBTMwgGUFvH/IBbPMwaJYylM5ZXIPzhPWKtFGAL6evNjH
mKjIaokNDgwZ7HMiJHZVduccVjGiT3BW3H8xDUwahL0uhccaeORAXo0FjZMzQPhb7/gkml45
4bmsvfbaj6WIG7Uycdo/zHK7ZffuvNAehFMAKTifPYPYYR8JzOCSoLDpP734j3/78ZS9MpwE
rXQmsPmmnFbUpts15WWZbDbXykwKSWEwp2ALAcZYV9esSJrN9Sk8BKfsa1LqNcW2QDfDoyPO
8zddCTHHeRftQn8lunCeQDoVbIrip0Bb35KgwfGaLpj6nD0HvQgYd5VH4gIDdqA/yNo8B2OL
s21Tp0nKxyLGvN2hwhFCs0JeRAwoQ8JHXvsm7p9FHhpoiiIH/cvcRCraqKsCEtigDRogAY/M
srpMmjKpOsywQzOoUtvMoDeOMwyZrQs6M0NaUZiYBJPuLMAWm3FW3RZzGR4NNgznDnI7g9+r
dld2BXvI8C/ZfV/M6As6AMOno+e8/ozGDHFtVj989/OPswfBq83zwWrhy4Qj6sWv4AxXDgVy
mI8YYdxILqJFTP5QVDnfDvkUedF//i+kOkdL6qoBAA==
_ATEOF


cat >right.gz.b64 <<'_ATEOF'
H4sICMoJGEICA3IA7X1rcxtHkuB3/IoSJiQDMgiJlF8iLe3ZHntWcbOaibHmdi+8DkS/ILYE
dmO6G6RoDe+3X2VmvR/dDZCSfHvLkEigux5ZWVlZWZlZmY8esazeXjfl6/OOzX6Ys5PHj79g
r5vkOq8rdl4nTcG+FV//x7ZO63fLrL54Pnn0iCWbDcN6LWuKtmgui3wJzzdlVlRtkbOuZt15
wba7lD9iuyovGnzQFc1Fy+o1fvnTy7+zP/31z2z2/Bk7mUP9tijwzbrcFOyHv/z1f794+Se2
rhuWF11SbtoJFOrOy5bxf+f1Fbuud2yatG+h0BSr/vD0KR9W1XZJ1dGHZpd1vImLJGvqdsnY
w6TKH0JDUPk8uSwA2rxmbc3SgrdTsKS6ZjVvrEFAWpZkWZkXVceHfc3KKtvs8gLB7fKy6pbn
S5ZcFW19USwnf8iLdVkVbLX6+dUff1j98JeXP7/67uWr1b9998Pf/vLzZPIHUZ19m2xe103Z
nXOM6oclR1DCobWe1XwMRWKV25RtZ36/LDKsZTxKa17vEQ7guu2Ki0fbpDtfnm+3z71C7Tmf
63y17Zrw+03xrsySzSpL2o5K6CLTNGnLbFXWy/PzqfE4O0+q18WqLTr3hZic1nmel+v1isOY
nTsvYAh++xzxRVMVjfO42l0UDYfnss6S1HnXJlXZXbsPL5ItPoIJrXcNn/xkc93yWS8rIjUk
xvNkuy0qVsO/Agn4qmbr5KLclAUQNNRuik3SceInktvxlXHKEgZoX1GjvDFOiAnLywbn63oF
nfOquKacklnd8Ba2dZW3rHiXZB2nPU6oCavq5iLZlL/xnqAe1uL00TSA8AtOpmewEK4ZrF+A
8iq5xiV3xamtrF7DSyTe5KLgY1xDa11ZVwIMXLYWIC2HlI8RmsIXfPa6gi+kIsnOjSewJBO+
yrZs3dQX2BSHqC05QAxXT7kui6Zls67M2zkMhRP7hWwHPnMEboGdcNrgLbXFBaeSMoOWig0O
DEaRME3S7Oq85HXPEyjfXW8LNsPJAoYhUTxfAMr4WBeI5CpHRDfQ2qas3rJZUtFS52DNl/Cb
j/i83m1yzg045yr/seMMAVgH70ThWyJnOZlAv3zRs4KTHnvPtvB9pbpfiAcI1w19OVN1dk9O
oMezCWCQM0r+mTV13a3gwzP2+GwyIWKa8AerlpNnVkzeTxgWzLrmjD6KN7M5O4WnM9XE5+x4
zt7fiApV8a7jZd6zFzNeit17xv7+4uWrJyerH2aP363Fz3x+xueBU28FTX3++Rm7mdycTSyQ
EQV8L+DECeSmgLSfc+J+WzQIrv2CwYsZZ56np7wikCTyBPaAtXNeGCowxjnPhpPUqiquzvCB
08Y24wgiJrCkP7N2ISrMqQYSOSx5lp0X2Vs+/itYvS2+LNdsJkrjd+oVK13sODB88hN2yddZ
jgQHnOlcFFHfWXexXelvz/SbWStg0A3yMfI9rFJr+TGQ6TFTI2pl6+3pqW68lU1fvHXafTGr
dpvNCkibP2X//Cf7/POZUWeZFq/Lajafs2fPzLaWRZXzp9TMDf4W873N4CE8MudmU9dvd9uZ
h/45zZqaMNGImBJZK5tTm9umvORM4pR/kZz7W7vJ5+LFGZKbWBAhigIWtQq9iFWbwNsVYks9
m82RMIPlGRZFAot1tUQSnk5xdGLkohaHX8EBRDzR0+TjEIFQ6IeZCsIq2tSLDNilYgTEzgAS
ZC+cE575aw4AOCPKkS+hkZngD/oBtriQTS28duZnVnH1SS1iZKd2Kf1uS/LNs956uPZV0XhZ
+koEM+Gvt7D/fguAw2jZq+diKxb7D2cENOl871x1qoPZfPZKNXwpGgUkvWcmYdOUogz0LbXw
fHYpqNtkkCBQfMuRuNDDf25sk2eBgvzXc2y/4Bs530bSAlaeURKW4zYpxZLBkgujzef2pnSG
sgzQUIsbHt+tOXeRNEniVE7kioih8o5YIrZzEIenJHFM9f6MAgPtxqoS3+4L2mRpVwbpOksq
kAIu+b5fUFscuZdFBUIBZ4EgKOB+h+eFcitEEPgBKjx6ztgvSLjwcYYUiciaL2Qx/TOy2HK5
ZN7Pr5+uY5sanMW2MGceW0dKeW7MVFXnQZJCwZ3zcCXZf2vXsVvh1aLMU5fi36A2cDK7sdNT
XDMreXpRq6m0GFx59HxdNrhgdWcAutcHPDy4j7bgr/Kl1xXHi99Rmd+2H/qDHV3WnHgm+uRz
eprkOQoIMy0lyPYSau/FzJLdl7xGQXVaPgS+VSe4gccL6e08Xqbkh/Km400dAOZCcQyFCWAa
dw79i1lebLrEqiee7DlEJuuJZ7iIcF+FlTRLxLLSTzQrXIjBzaOY2m431ytsP4As+LJgExb5
cRHZNtkepfNWId3EFPQZRlYvFghU5yECBP1Ex8/bLLoiRix5mCqokkUXeYAu7GKxSbdLicHl
A/DyNb4/uLzSCGix1BCwWGgI1gbFlqGFaD1MwyOglgYXol0sNga7VGxNpfOBYYWn4JBR6Xnp
G1TvvFiFhoY0QXnUGpOvdDk9dQVW63VQcjU3FIusYVRY0KZ29uABcguTqvyi+FSUtOZOF7Uf
O2XtVq2noqTBd3VB4yFibRzSuNDeXc+G8LGUxQIIcN85RB1+GapobUv0Sg1kcBznSbvSDQQI
HZ4EhultmFTu3jPm7ZL7AWPibzw4AU6tAAqw5/1AMmdmxXeZEWBxMfqnF//xbz+eKq1/WRXr
dZmVuFmnO362u9g29SV207IrVNw1xT92JejxGSiVCzgdU1tKM4tGBXsVzPgTvoLPky1pH0Gq
40XE2SXZzpfsJ16kqq+oravis82GJW27uwCjRdKxdXElDAZXJX+VFrIHaJcRhkAfzutD95Lh
bL9VeFioT889ObRZs2cOcQsNj9QIQZF7bhmaJ/b55816rhRfzVqKr7B+EemiDUEHHE+FodpY
J5u2uMVkc7liPA0GNi9Fg6GxhZlNH2NBMUktfmdrcJe+3azB5PXjQeZubwUGbzUfa97G4bPY
Ov+OqhvcjICMOc1vQCudFW1bN/xsX1YbsDp1hrioFUUrUhAF1CjbOZuglkOqoJZCl4RdiUZJ
ExRoFk9pYxrtru0G7QOmblAryQYaJGWW0SSc7bQ+BI91+qu3lHqOpSaIJhBm61rvNbJ544hI
86fYUL672IKSdfLooTqnggQ1gRemMiisLl/4hwdPjaRKNwTWn2c/zabf//inFy9V72bpz+63
n/1nNZ2z+4x0zYJVOa36gwbu5HGkEhetZkKlrWxHWO6jwuV+LnqV00EfCXWGthqr/Pjyj2OA
vwngFEcyApuGYUsV6KIYpIJh3PVRCkda24Wxxp/3ok13eYrr/j5qHNGwBR9x0d5vF6Sfut8C
XGp8HD7js7NwyjlzX3pcxFgI5dxsdxZiD3ZpYG2OlYz9C9h/myk7JXOvBWpUB29aJhz+Yfc4
76Of4NSFKEeqV8ctRdeYS8XiFATaU5+ATJJln7Mpw6Ux5dNL+q1wIVo0WMpYP97IQ13ygT98
RFzKMp4hkzJxAtsifw7bHxc2y/ZNXVbiDMUfaZHmuXHUC6o6+qqk0krjFyn5yNDmIV+u0HwE
T8u6miVyUS1YQutoEVW0pLpsOlQWe6MDY9HMEIgFwaLsbYhskLLuvd7UabJZCb8DcA94V+T2
Un5BbUipQxEqn4chKct/NnzuRHSSXCGmL6mKmdQWmQfQ0PnTLEanxMDRk8RG69gZOnWaxay2
zIdQyDpsRs6a/ahSe/joE/z/n4hUIstDOGx5TLB41zVJ1qF2hB92q3xlK07McwwLLOayii+r
4BJ/QNyu3bsaMb2WJil21GI9Z60SfQvC+zJ/HtuXCVypT5KCjKovwDLeO9LNjbZiMm3G/I42
c/z8/fPglGA/epC8xvca7xcLjabvnpOXBXLVZbbhFD7Tkorqxm4piJ6LMHYuosiJ4eUmRmdv
+SG6EHK8t5H6m0mYFKiRORiIzT5ozVY1afLbVV2J7mgtRDrdJj2kKH4c5XOXoDFVaZyLTXxL
IwjOIm+pMfgMBl7GPDQt9GD1W6IMXndhNoBFQvs3teCWvQkhj4qAGa0sWo7KTolz5a0QOAqJ
AJVQNWMnvxXOTjhuR2DbJgaQPYA+0LUDFgh4CrIJbfsrwpbVXAw7jR7V0FZlbjqGvkEji39C
7zDOyY+eG6WBAiOK+oF+ghPBF4/Zv4GLrlUuIGqk2wQ3ouCM4aYDR5gFIVHKnyEEwjFjjqtg
eCEvJJia5odI16hi6SD5oirAnwJUkUmLHg4XHKTXBfk7gzthvSY/h7K6TJoyIbcu5RMBLpkc
BI7Coqp3r8+hHvmmJR01uykui80ywgLkjt42GceU2t9bQnV0f7bEhUVPK/NRzYA8MdCKwBqK
GllScQyDNrTdbsoO3FcZMJsiZ+m1qNguhbnH1O6Bkw0n7s9tpb14+uyZBYF4LAzJh7UDsOt2
IgzSEuMWlhAXZapOHRPuwTo+suOwGcKcNyOOkKw/x9WYPSKuo88MqTO1AZo5mkwbFtlpUMn6
CYALCME+p4xw30/BKTzTpgEbMX+Tl2lh2GYtYXVe1NlCin7M1vP1e3kEZEK1pXj9v2HKoQEt
AA9LJWgOHa3NDuiI/UaYr2z3CP1e+H/M9L5wjSaLN3O35L1QUTBl2UVvhGQrMR4fZ6nHGUaq
CXYAg/sj4572RzUHgd7F5fgBB4p6+Cu1X0pPTRhCbAagrCV2DTochcbkCG73xjkkOVPpCMG+
cBJxh92iOcAVoeuKS+YXq20DvG4FmrhZQOO8lUc16dcHBik82UFtOiu8mG3F0KXbP2lYzaGM
0UNvDQpEytvGqQ7tTLumgWOysp4YcjMiAH89M+0f4qBmDyapspbTvHjJud+mYDM1QhoZ9IWj
0s9pcJrGrRk2JjwyT/DLoV8AxOkOH/kcAx+HvUag6gKspz6Ne5p0hAElEDlxFqGmnEjfmo3w
Y09hlXjvELaYknBHZyEFdZgc3hA5aFy4dQVLNWjMKcD3MT7kq+Izvo3B2l7g1SphnsDrEMkG
79vhW6eyYgjIpAB4NPh569i+A+Hq/d/MRS0POEGYfgV/mI41Q82YY79wat5M3E9IJXDbkqhM
66YVgQUcAZWaWVH9wlgAWt1s0PwNMgRn9Vh8wV1BZzHWRFef1CmprPzzfYBZIRy4wrXrMqx1
564HOijzxS9a/xA8yqYix0ikdW/z2D7pryJVx1qz5tTDHZ+yItcJlxQUV+pFDNuiSdBz1YxA
0uM+OvATR4i+YCRmR/iZ4rDlI5spyqcRV1OLId4M76Rky+rZD4PbpzhMjSNfcSZSWBDaj3E3
YADpp0zaQ+egn511czK1zuD1+0l048FjRU/n0bsuZp90ZKEv1D096a4lFPQdGeDe4FjuzALA
4Ys74qJfYx669M2k7lo9pOtJqGeWj9CfYxjIwNkMPXRCcA7dGjJdNOicJGG3gZduOVQGhqHH
Yb+jEdlDugnqnekG7Sp5HRP7joO6xlDJk7m+YOmo2bYJ2YiBbx6LB9Lpi1c8o+OmbdqeIkwg
FE+B7scLj8cuYz6OMuYhweOE+I1nPpFCx4nDfPxd2mLUzss3PqNTd3X4GWbcnuFWhB9BC87T
aGsGHBZnPFh1HFnlgpc2hr9ATyHDIBUiVdEKJ40RRakAlpV9C/81FZYBbpGdFxu+ZlvzzmT/
zaVJVVytcvg4sxytBivO4AKw/cwRgIb7pn7tm3IPoFG8+CX9O4ZvX9G9LWbfwfLWA7xFdso/
0KrolHeBfEcvjePQe0vagI54AwbOJNlDtfCGzScYippuM+rsIdqj3s2jnbwFiwMTE/0K4yfs
KprpjncAvrUUrAIUYMIdVN6AxtuKoMtswennAi4E13Tpvi2r15tCm2yXjP0vvJtdVtsdXCi/
pgvbVO5IxgsQPV2d123B2npTmMEESuyFoeeFAwnDq72kZzOCEkBxWNB0z0dfdbwq2K5F1Z4q
zPFQHRXvyraDL6RaYOy7Ddxw5qR2WWyuFxbwdAXzYrfpSgd8KCc6yhLeDQRfESVUKBUxUE5u
FIgC/Z8xDAscsTgoADYH4BUEV6k3m/oKHHpAyXip0diy2VXJ0UCuTS21tN0kGanqeT9lI29v
5wwco/msLgCEjJ/u2mJ+Kq49HrFfptNfjS/ruva+LyB0SEOPfbCqujNaC9S12tON2R5KMJ+t
vJEPNE548m6eSzaKtghn79V+yyQQ0QrvmuvAYuvpI7htku3DMaS/mOEOSu/srU7FBtjqiABD
7nEPS12f78WmFpW6EJaQ5+x4HlMUmm2gOMDENm8Aaez0vUpHsy0UB9ijg8aiz1Ze8IXtkkjY
CnOQQWgZofxudvycdsFPB03DR/OgcLRb5019pUOjXBardVJudk0xK5ZX50k3ix5lXhfdao1h
ABCMkAspXN2eeAZkfsyYBNwZIuTKCVHSYV+x7mILcKJKbdah2tNSNI0QyMhBlb8xdx+DSOmd
TaS82+V2156v0iR7Oxs+Z3ZBlVXA9ZcP2nRZ0ToV6LFROhX8JnQqSoWyBY+frREVw1d83OHk
WTxjj6myQRD3/Dsc0lzI6+jF+boGJ98j1HIT+cOqJC9g4cwJWBArm38RR2ODHfL3iJCAAghQ
vJ87hRZAt46nmzlhW9u/zXllG23D7wLVTN29ehMcUdjm+YBlUqkQGndrGw4Jj62wFsY61DtP
wD1zD6eY0VgPgU7eJCOPb+KoGPbpUm+9E521+UmjwMzzJ9cecD1LoN7kyCIWKKtKjYC9mqAM
Oe9BGfgkyow8WsoDcEC1LU+XqojN1LQyAWBwboAoR3O/NMAZLP3GUEzjkQgJhjZU07YXPUBK
OGIaTJedyaMbWigUth31pcEg9HxIrFtb7ygY5eg5jI5hphdSeXIkUCU5xEGVJTRZxECVQ4Fj
kyobBIruWLwtt+gqv5VhDtn9lvNYdqr85q2l699/ULMUv/VAX0J3H6hJtOrcD81Cn8LZvCpC
DlcwDhN6uHXjjeKOR+BBzz96czRGYT9E7RjbDVycSzxqzui8pCN5AVxwqu3MkDWOvMvG0PHZ
pMc+pMohK+mxETkblziGB6lX2/76MWTAGMUQ+StBsL+RAzfQboLf8nMiCNOx4c97zJR4hnVw
c+raJptg5ITgEgiaSq1uAMc9PVhTsE8XNzZLM6cqPgOviwoCVAr/rI+L0xFRD/wddn432B4T
ReLAzm88Zw28aMmYCmkJqh6hfCI5grQmcMCToZ+m218e//po+8vxr4+WyyX/UB0dw/fq16kM
0FlhKMANRgZ1tVhmvE68W1UzaBDDPlFbFH9yU/OXqGWBO+b8sAMHjCkX36iZKYprUv8DvS9x
FLZ0iY6UtPUFYtBY0mT/MVKr3qRdTX637gYYEQm13mFr+pbIIqenllwJhxDbLgBPXDHS6FWf
G/sj75Ei4OZD4YVv9+vynX8fVCsIHzCYs5VWCBl9w8EKGxDuqPRF61ke43NVHwRTKoEDFwcb
fLCttyv50IkqSBqR8aotOABbq8bWYSuX7tLxiAepXt1bhKO61CGcWe6Eeyi9jFO4c86QwSlD
noIH6cmlWCHe3/N05S4rHae4D+q/fbwGw4nRmf0ZtgMWLtu3UQIsSsliDsRGoAYRmcGYLwGc
G+UMP0UEi0m80ZuJExOihwwDa+4uiK6PuvnjM2fxwfbBH5vmYhNI/moh7DVzNzpcUbW7hnwG
rn0bD//jHNQNHZHUDsXc0MSgeKMwG2476GkgQ9+FOtGMB0stJr03UET0JFOuo+mnI6dYERgh
+BCloDLyG5pB0Z7ljAQwyMKernBiOooZzmF8qyaHsSsu715wiaHktTZgIeE4EOaXrq4XFMq5
6yB4dFfr1mBfx5CSuFD5OaBoyGSCNYU7CEStL3MV9KRXrvYDPzQUIS7MQSjQ8pWI4My3NIq6
bEnPiIiwCCSqGsFDlfvWQlNIOEqsI6RLgxy1aKx8izzxeDye7ZH5E5YCU1M+GWR68HAV4HyS
KQmiNIrdC7A+fWdaF7TDPUoPJUCSwoVhmHTqmMzbMnKafq49k7nnRMrFb8yjWJaqRRpzuEVa
+Sz0FNsSPRqthSjgJszzALayQlbXK054HD3I2IPcMsozJyMu1algx5Jx3VIQ2UYEka0niGw9
QUT0b+8WuCTEHqAmut85zwsV/3Cr7r5ZO69o72x46iIhKT/ZjPVLplLsd7dwPAIaZxNjK/fG
PNPlFsyaha6NbfAUWXN/lI3H2Vik7Y81Ohmc6SjeWjRQJ4ogPsWZxji3QDFPUNCv52fekvOx
L1v1Me9OWd860ZoDAz5vBul2uG4N/DrRxYIFrXXFZr3qwbw/m+i4t4rPqTOrVLy3h+DsjgoK
pICPXAsyCvQ5QBsw6mixtm0GWjOLOWcNrWE+RFgqLTnJa0uvPdD/SybsWEH1PPqRihZYUW/I
YR1aCKqA8DakRfOpf01XGzTdWEShebmlupqMUJr5jOqwvkKKMXM1UThjL7rXrCeKmH4Wv8vv
c79+90QqYjA1qttdbOWriZS2lF5q5Eoap4J6H7u95JPOmSEbdnYJokk1w8NB095QSEf5PqS6
eCPCHqoyzvoEEN5oPYR4HmwYb9KI48s+XRj1gp31icEQHQm111qoGSACl+F/SBK14jsQica6
MxtVFnEc1dgayp/lJgrUJKyuxkxUFJSQ7+sJ300oyxi65aHrHjAlPBE3RborN3nLsQ5t9das
dx1UxecLkdcM/e+qaxmtFI7WmPOoQW9Ds7kZJ2HMm8RLiq2UMlSpEqjVRsvtkgl4oAblWHuY
bCAx1UPW7rKsKPL2jEEGNXDLAuBZXvO/kJoJICrXVPMzeIR69PWa91fI3CcUCRZuWVOrsIVw
5BEyOguJNGhCxtKmtKZQjskxhRYiO0BUYb2WmppAjYDEYs3HJBwPXjgVUdHx+rGeIgJJMmgD
GowNTKD1GzpFkzFl8pPLRkZshGFKadKQOwlZQhk30RzTPLjtdWZDXTkvbJ7axIVReHePXnqu
0PupkNWk9SiSn5nFHG5p7byTO1ErH6BS3homzGGFsi2ZaIkIHFMw6ABf1pCbEdchxWGGtVRe
QEQDSAMjAllj5jUyqxJUZkuzclksSQ1XUe45azGCt94akjDyxQ9pIssKrhOAatBspOW7f3a+
nIy4xQq7v7mklKIyohs35Cfh3WjVdq8B30IOds23ctmRPziuNmkCxFUndKIuxkANuBWRHHdV
BrkHxYq0pj9iN5W7EP87scFoirbeXMopFCBAEGPz3kaop88/3yqPrEFDhLOqvPQvVC7kSBFa
aobbi318sDe5biH5neRX5B0bYR8OYsDZFNGdlJu9kSP6NUycMdyhStZycBJ1F5Lvn4V5Ne6H
klUnrRnbk0jrvm7APQmg2LCyeORoH9iIcqRsRkn9pD42Dc5yaAgTIFw7HGF+Sb647+dSly+D
l6IQaoQBGhd71zphuy7N/ZEPAoL/QYcIJVn339sP5HOz6qjL8rqGyAa3tQvqm+xnAWOVur1G
nmM54p9o/X7LZuhAhtk79Zzg3iUcj707cPdFAGKKLjgq9q/2GnMOK+rylYx0PI/pytEb0D2K
YHoudPq0DVAQioBMKgxO3ZhlNadppps8Oe58ZfdZa3qPLVhxWVT8jWV8AmsT3l9RtibOHcrO
4HYRPGi2ZgyTXFQdgw0s3d9p7DsKQmcxAjworUjth1INZRsLRSq3kt8ZIdAw61megLQB0chW
wpPVeGKcSJW3suknrrx6PfXBmGBIa3TRcBzGXMsB5l7wSik+svb5yDutUTUVPQ/XCxNp2nPX
UPHoAYXp/13YgGjqWYdMiC6+ZU/v5mdOdKMxKMxtFKIHmovB3MGgzuADCMx7EWgo5R7mHxh/
Bge4YyTulwzE86oL5wPxinkpQUycJmGihIwhAo1DuIVW0ngr0rlbMwNDO2I19GLmqbBkwidX
V6WFLP0mPLPpIhmeniRUwiaY9LYzmNszGFwRTe5MoL0kmrx3/ow10eSHTp/TyH/t2RtgYglN
WSgSnpyxRExYMPpdMn4PSMagWG11H2MTsBFoMTDMhgSZkdh5cklJ5ykYgLi2vG3qNEk31/Q6
YTTLoDjQMtJEXoO5qKslNPcW2ks2XHbJr4WOAe8eFy3qpODultEAZrzH5u2mTtH3B52CJA+s
lWi2JG9bcCFqd/yXUQTTv1FDwu/iCrJAcUkwqYQ4jKfxJiDGGN7FLD16jsIT3RXfFEydaaAI
YWk5CYfiIOEu15E4ZBlTyzyVGSGMh4eppRkLnwGXLuPoK+vzB2EK1ivbPug5g5YFQZdUZYUe
+0QI2Amf9oqTEj/lt2zX8jnfrNlVwieoO4dAmadYkEofgYTOZ6pO33Ao5WV9fjAu3m03ZVaC
wvqiBk3HrDvnbXFkXfMvyaa8LOa85ZalRSHISY+hyOnAL4Op8OMCkT1MKJx1kA23ohBibQxM
F7xlgAcyVddVRb1skxZCGrCjI970NUdWQc5uCFBakLae1oVwlTPOZeimjgoBXh2MA9ANXIHB
MYMVHtKUydZguJQuDamzzK0RCOOCHDMkS7uqmxZZyDXOiGwHD0W00Cv2EJfKQ1wrVSFWxsXc
wAdijRrdQhRbhkeoElgHn2pgKwUFMkD/+qw7hTOUGFZe5tVnIrUbjGkBI+RPWM6ZRFNfwyDF
uOEp8mRcyFcJeBp23tQJkMp8iQYFoDY880FITQrawLlFew1HKHHRSIZlPYNgd7wlTTBvi2Ir
GBWGaZB8iCa+VaEjIAsUcVmOIsGMyhxwJRHEkZHuOBkULUTIuAYDx3IieAYQCPvDMTLyVhxf
AXGyN+MQSk2jNuchuk08xIsIkl8ibGjRERZlcbo1WCsUuWrgBgOthBbj0EccMiTb6N/GorVl
ubi4YiLgRKR4X8NYifOzXXUkEavCZWDG8ZOj58dIF7SXibi7Botq97g3K7bFsJeGc5s0ok+i
IeLeLJBl+GvqJ30qp7AjBUWdFDICSmC6tbl/szfkqDFwQ1O353hioFrXEx5CMPilBoC5EwcU
KaNa/uvoYWEQnJqYfURUCyVuAzeT2DaucjbdwT7eu60mr5Oykvuqsau255g7MxXL/LzegLE4
2ZxRJE+W18BDkQ/ASoCF28pg1GIpIv/mRbFQDgwfTbpowkW+sRwT1V8Gwaog/Mam/E3cA9oz
IAHUDsVGE5EWnEQF0awE0AzGX1AcK3TXHjszQyzYr7G6KOOPLhaXQIwARZ9eXMDLUJiCYBIN
usOFVXTIc+R1wfKDPjUWv+tzrUGOMDZAtFqxBqBLDkEbDlptuDaDdwDCxrex3XpNW7eUINBI
BvGX6sq5OsYZU/FObkNxwwcLRWlx8gqhtpKym7b7VMAcAuM9BPucA3tNGOG9Yg+jRTBKSdw1
b1Q8VhEkIO4qGHHtc67Gjnfm67kDS/uA7yl5qDNf35XXffpynPkoH6ztMERni9n2eNEdz/U5
NQVxZ0HyAH91MgfhF2Utusy6YOQshOIQPwyJMpVxcAY5dolyPMqIXPjPW/Dt0sH88BA+sSUp
ErjgEGwvN8qPYO5nKygpYn6iKNfBQowul4GkgtFcYX1tpfu05R76Lbezgcxj0GtwUadhtppG
17Ltu61CZtoBV8b0Dg6DSSTwJvkIQjj0IdEsoPNzoibfQvdXau2jF8QzlEQMCCwaSZjvPi5v
tpxWc5nsdRQvbrJIDtcm698PpVwecMuGjdGXzHOt7VPXRm8iPvJwhtfZYWJ51CKXVMLF0/FI
6Q0pFI0opAgpNY8tYfSk1uHlTHHFcfClffClg/Alw/AlEfg+Qr67CU4TfTEVbqNMsxHt3h6K
wIgeUKVD6fXEKzGWn+giPD36dd+5Wt9bcZNU9APwBi9gSLid+612uCijmH+xVWip/sqb++OL
vz3684/f/QSKrSlNyxRccBNnnZVr1LfoNhwvC9RPQ2vKFbduuyPF2roEYqdSR5Xd0LYpjoSo
BqoP6V4ra5mVjEYnox0YaUqEG6OX82O4vsCkaMB3MncIJ+gIuVWUQ16OLu2oC35mIfein+ue
5/jdiKrkfeM6rpFoO98jHMA/NK0Z7pu6Ey8ywD+As1g1AsEB3vvpONb1Di5MC57geGcOx8QQ
SfXMsGy+X7IoZMRli8T40vxBXQEzOvBivhjvDPe5CJK86GBG7YUJYqQbub3GSwbjzfzuEmQG
XHFy4XkzYLvJJWvfUy0A3Yb5Nb7pZdXYsKH2BFI3dXOBU7+8dKjqznsW8OiggLq1Mz+HWCw6
YDAYWCDin3b7gkUzPxskJKWxKJQgJ4gmSkKDFBSR7Iaq9aZ2F8LLfl0/MDQyILOoywyhQ1oi
tMMyv6H6LtNbR2um5B0gK8qvsp4NE5/6Cy6/QCp4/JTOR7mqaRMKX+3ZW2XEIluMtJrBxisk
S9butsCi8g3kwFzDPZpabNjg5U5JmHmnR/X6iD8+4uftDYhTNVp2DLNYXvN+bKOnSIFCnac1
xJoSJCM0s4KS0MgnK/EO3oJ3sLBLSftfCn0I28o1Ba6SrxJZVeKCpQ4Y22spA0OsQXOyDbMo
L0kc1wtsLlGFUfuEIwDvN94O9phKbLtd0uOBPtVc9XUqWtLmK/ukhTQkCEgEt7C0i/hecdte
wqZo/1ZtbFaK4j20TT0TIwytXbFUre6By9sQ0BMpxRm90QujQ3hADA1/2Qmoo4OUTQleGKlF
WVBduIJ1Ihjp7cdEmzemuTEofR/mHC0fjrfv9RH69l6U7QUEGxeBXIOpWn2sh7vtrazmJzDK
GLx4hQ7TFXBqN4TBshdamRd8HyDdOtYU3IgU5qO0gC71OHPsWsz2btabd69R6dzgmNXo4PXd
dEH7hjS+Rcp9P9VMwSxn2QEtI8Wh5kCD9fjcEnQzmoecuWVUiqDUYFNnxnSRTs1iQ34n5kRQ
BZvrBbokeHtS31jSgrakmUKSZQVrx3rC94tMIxtJb9NISBRKvMzGqffErMWnrL+XmXSkGsjS
nqiPQEn6s9mZetxjO00WVlPCfhoum9pdSQeP0MYlOYuZrFzozszuZDFvGQQkabPe4PnLgHOw
7FjBmIWRK2EPGZWDFXrAd1aPu+xtygqtLU1cbSgvd88iCpROR5U+bFlMmLyup1gpRAfAZtEd
C24qqSvJH2Ul2Ob5fdaFW/O/V8lHWyWeTwXt2uCXvG3qDNzx4MRH3gnegnJTRLjKmAR8HUj5
noIzhLwWFSDd+3R0vC/0JK2K2H6frwbRj8r1kdpP4jp6hQ7jKJIPKPb1rOoTiIBd4YeEDGE1
Tri8SfCI2AFkUTb3Pjjp7ads4m/QwOQkTlf3iPjre8Z7fYWo2MRcITDgtFZb4iSIScYLqNAS
+Gfel/dNPYUUNG6p/9WJGtOGATKEvzqZ5NXRlayfTuiJYPMGtk1GoOZPDGJujcIAHfql2RHh
PQo5T6hKuN86qQCCQMgI/tiPoa1zONXyPGlX5l248JAMnZ1QoBC82hutKchFuxRe9eBEz1nz
61qE2U4LGXJgYuVu4PwrS5pcz94v99tfj57Db6Q1GacAGwxkc7CHD95KYvSuu1LgsUkQgTC7
IT4RjyIZC7k4zt1BthQazOLQ5MGGeSOAjLnr7QhRM9kazpwQWkawgzI/Pnpe5ifkiZufwJcn
pG3CF08O4QnpAE9I+3iCxxT4uxUFHQlOrmx8HIDobgPU+Iz1EoLUQq+8EB6ygXvPghV7wlrj
gljvNCtrBUM4hV9Hz+E37jDiSyCxiYDIf2pRlYRxznoKAp2oggMNqumJN2WtM9LER3tz3Q1l
F058Xpmgm65koSMvfniOVJz7KbqjeLjlEguP1YsuHSQH6S252vpJY0ayH1V9QQOfDwUQ94jO
2X2EckFvP1m9LYEJ180VZ9Z6b/WApmBWmD0j2QhnZLzGoenZ5Ojtkp3XV+AOh/dF7IaQ5cvr
Paoa313gvsuRuCaCXxOxd/ANBxNl2u3Myg71MXgBjQJfcYa9uaYmsJu5Y769N2abxME7hPPP
f7JQVX3PcM+K5pVgSVpY3a7fQysPTR6oTViOv7Lp3WyfQHsPoNgKsa2yKttzjk5LM0ZHOOkB
yVnfoLtvj2PwRdHw568nQRcyU414WSYGxtt9farG2eFGVQ45IEqmsxoVAG9fb0b39GIHc+j3
AjJLy8k9xEeL7eWktYdLM92U8T2LbYMte/CADbkwH2KCTi0LdDx9nmGJTuOG6FBU4HC0mL6c
dLc2aQt+54YWRn+Nfm8VvD+Jq4yivJiXn8zwOEHwByjbv4fPufyz4NIRd9YdQLwuYJTQyL1I
KwH3HNR5+APkH0MJRfaIXWeusz3A1+lRrAYikL8PsJQ7yJtyeP4UTVeh9nT0OzunACzmvsBj
Nl0H2ej7CHMNuEGHPUTj7tDuz7B7dOACxsGyZ0+QvAiEfkzTm9E+U5hIBrBEy5gy6oYCZG5t
zZ3m7w8oyKy+7tVzZbM14zoCcZQ41db5yc2D07t/9KXHUaNqrWGF/L6Yl21KDE0o2sxHwmCG
44UhGMgzr8mKywCO57Jb2HbVnRsurg73p+YQW/YLt6aFkWhyjReze2NBCeUlunGDt2LQwhU4
v2zKrFP4FkHQYiFYfemNvDfGFk97i4v5khEV++PA6nJqFCHlOT9xqAr88yiq9xvWq2Biwprg
H9Auwl90AjTnyHVdUfHmrFKpVSqVpSambiWpsgVIyimYuFs/+XVi2peh54pSOoVKqTvlvFig
UOoWSqUMSsv/XhA/gTiQKjBmXJSUlN5/3U0gDvYgc357EnGmVm7P946Cl58eQbnMz9h5LQOn
CgW80uuCsaDKwEBgLCs1nkTNt/nCQEc0vLcsO98LA+neGEjuDgNJCAPpnWPAAlTeX+yu56z/
uqJ7ffDljK/y5WaXLM/r+u1KMjpcSorb2cvJUTtxFO2qJN0gLkR9UoLI+lZCYHbZLvGDiTKL
cAKXEofuW0ZGAY5EtxgEhD2/uzGoVNEvZ1yCa/EOD+hPxOfUFKkgXO9mU7xONhoAhGqHcUGg
6wUqqDhxIUCcExvxWKFJDdHEPEpQv3MjGHEPC3Zpz9HHOXXTgbp3QfyipfCVtKoWiqdVtqlT
CCFykA6l93KaisMJBnzWbous5JNU1dUR6HmQggB4YBcyyr2MxYJetaIJw+0VWjtlhnMrnVFL
dsreAcFdw9xV0sPgO7PMG17mNyjzzirzvdFYTZduOH7WEKC/7DBfYcs25Vv8BlGNOmHpkiPg
IlJZZYUaqLRMa1oUV3nAM3XJD6ZZse1Q5QJRGSAe16a4OGXfswID6WNoGxE2i+YFDG7k7vtm
qdEp4/FDpP0Mgn5vtwVFQJLjUuGJmuKyFCFjhMsdRvEqz9AImWQUrr8p27fglIxB/tEE8UZH
chEzwVcFFMVwWmRKhYYBE4Wt42Pff7dEZ1kMboT4+Q7bJGyTK7Thd83ps1GI0i7XXCSoBEWU
rM6y3Rb0u7iVvJuLWF4lLPZks7kWswPewjRDvPG2FFwKQf7+DMEXBk2KoyNwlGSgpgGbGG8P
kQ3xMvivBq3iCA2ayJNU2pHXCW105dKgoAQzJvDiFdzJvio+47Ol7KPrZLcBr+6iAgKHKO5w
X3xJEW0ZyNUQZL0zIoFIP9GEEX+7SnDqrJQAGC9NLJ8FxXba4hxIWoSI8dcVbwrcEGTmcQId
UM6xUrQtTDRiEfys2fS3o+fvpjCaRMQkKi8oTheTW/w7Yb8m4PUNdn1jbWoiRpgAFkj5tBwu
ChE3SwayTwSG0iJLwER5BQU2ZUHEK1aFNke/5usDQVbcXzAyjOJmK0mlR6l08hjSmDJ563Vh
Vp33lNYytqNgRR0a3axK6V7Ngdd22V73di35XlzCUDol815YMhTRyL0wJvAixiRbt/fOe1am
Vw2BMw/xq0Ia/DQEdNBTI9aNPzc2wCRn2CBbRe1ZlYDbQhFIv4DI+zmE5p4b3Nt46llzQepA
/N+3gWNuqUSUUugO2HvcnZ5vLhDgbHVRouuMMABF9/nY8fmwQ3fknlG6wu0iH6qy1zk8fhwX
flAytiTlPUnyN7u2o7B+yamUEY7Qr8XgZKl6JV9ytiV2V7Ax0qWcZ9LXV4TvaN+WW7MeHsCk
kCwHMTHismPTtuB6SbCtk0sIawl3YRbGBk8I9JoI10xtiAQ8s0rCP1fXb/g24wxOdDSWXWk1
QSTSgFGg7wZiNy6ifyLWOGlJFGszj466cGoVTkOFDQG9VdL9oq+buWW0smun8uZRtN8I43sx
M3vEw47x3bPqWABRabOPXusOntiBOraUswtj9QkaID+BGfGuuZlQwORKnmLAgJS/7qLXdQ3F
hDvc5NABVMWuA48EOYK19qi51TjGlI+CTOU7I8HDMEZSjwD2wwjn+9vkteVrTdN5EDLSPZGR
jkDGxPVQJlbTG0O589ZPtJnegPJddBWHp2ToOr/B08NKZ8mYXXB9PfnCVedbhKhY0tCea7dv
qBeMTRQ3SBeioD1VquV6V2bMBiddqGlzy/nBAXLjLKzN6ju+89CGJW4DhFzY74RA7o5IQoY2
j1hug5Tvh5DSb9TrcQZTShmKQWyFJqNbuHREgzvTJd4P217rtCn7zIZFvba279aTcGO7tdZX
LG9Iy9GAHkAJ/RyNl2VxJSOB6yAudHDYNZhvEXWm4nxZY0I0I4xzeoRhro2QEXAIveLztNtS
kJamwPxrrYoU/N0RzR35SgnFXfjenj6bmEj1L+3Z7xcuCv1snSL/pL60FxbgIfzWZFBsz9tQ
rsVIyuzhG/pjQ3n1HYD1e1eYPMhCzycInKNnMiNRjtczeSejr3rmbefPAk7SXUSM2DtWhDuF
yUqHnl3scV47pFYiT3n7nwujNRxi2+sYKBMjiGDo2dHzBNWR+DGlyOQiFjm5KxJ3YMnRcwIL
igjVpXyE+dFzodrDAN+XnJXuuACqtKyGV+UsWUikgN1eJkbQ79OFRAHkaJ3oBMy3C4gxPjIC
nJNR/VZTsPqG0/BukzQs20Bgb85AL5LNEShSC8NtuNUdBCwKTi99RVN53DIBSoyQ9zIGhRmj
IxaeY2maCFCNCN6m6TVuEhiq3w/KLvvi2KlVZ9DxZZmJveGSA5osdTAH1xHT0m2pL7RphS9+
GZb1xNEzxq59BWJO6CqhIO52N64GzjDtt32NpBFYFywJNGIkI0HvbdqcQb8uNuKK78lJw58m
Gwv7kPFNezXIRQcGmKuyxXNMGse/raOzlbx9MxB1ju2bg6jCd8ws2LA6vhPj58FTS/rNuDOB
IUwWyqK2EOkkRNwYuS7KCyH9cMGH89Ck4axR52Cx0hjwlpZOfJNw1CArUkTixP45PGpQOKaL
Q6iBXuehyuNDupjhVUbGuIiGQwlEzti/3eHQGZoYIKGLvG8o6IZdQQoS3CDplh9YY8qGpRBY
eFO3xHMFQ1eZKriUjFsDGTeVdZLymWDYeUoOhKOUOzBmAMmyeld1Uo/Jt5WFtBGditJ0dQNT
pxD/N6nM3fSS3buVI2cGUejeG7CP1JY85zQppkWEEh5yZkaNqN2AL8dKxahTzpVnzfNbOK6v
9gfs82MNyMUPtWb1xqAPE7NwtlIBLRP2EAylYAF8yJxMS0aCpbaGuW7wXhFimGZQbPEmwyHa
kxeSpcmyzc6Li4Lv4hMm6nMsofFNfEkPCcBiSsBSYU2NWs9Teq5PlmTGpQBUUv/OZjQMW6/f
zi0HwIDiBSMbROwyNi1qS0mf+ibWlilOLbQ83tOWWlxi1HgL6BR3AxqxPLssyIRtBTyhcGTn
RdlMdJTTvIBL2zUwImG1BYnZEt0oVEDZOTfRyTJnhYSQk+VJxVW2SihIjRqn/koZgSLVUlku
taulZrWBcDFAUwukIGFO9I7dycKGkYYilp1XOl3YoPWX1vPqjHygE1UtjVSLxiqjociAUgSq
Dm/hB7iwZseoO48WT83iqRUUYzAsRh8t2IDTYxk1a7DVGKmYMCrCUa2GwmAY8DVFb0mjT1US
rENNQUYB8dC3+wqdA14RnGlDulIyKDP5JBI9VpbcFOtuZNGmfH0+tixJMFXEEhySA9Wl3wfE
i/jmzWcHDLWLQGdlbo51oASMcaAIji1SBi4FECjuOAhQzp8vS9jcBORNPLimHGRQlnCGbVxl
UYg0rlHc8ysEnKhF0nq6jE483vGbZKeWK6cTlMLuXjl36jwDOicWQeHHow466Cp35RI5QsRQ
+nJGCF3itZh6JQcMUp1BuCZhuoSHcy+mVwHpO7sSariEY6JEerWiLV3YTjmwRctnbA6iMwQW
dy/MexgDCMAHFUDY50Z33+D1+h6JhpGXk9An+DYo0w7B9FciiQ1hiegqiiuTnEd1rAwtXBRR
nsCTvQDgf9XolSORu+Z6lM8G+lU7sSQSrownOPtekb/2CvwVcxDSUZvCP/u1l95xe1IYijc7
AjkjNNERxh4tv9+GNnTF29HgqUFb6sbRUaYc1dXYQFMj8k64k6E1Mi7ARjqK8RHOvZBTrnek
G10m6h7pLkf5Hdmd/CIVbVZUKWlPANjfkpM4HGFPVRH/g0kXnx9xvvRLcvKr/faX5PjZs/T4
1546qVHHSHJBVgwBE0XLoJgYyOgSEbCJb1MnS8PcMTGCcbyGrKUUejohUwgpBEsROuyzlhJp
gDL9ZEkvLoqkanUjhlcmupKjJxkNaSEDe7glHmImxIcTM74Ib39iggbKYSMyNjlHK2ik+ljn
oiH353ERvcq5q5GdROPjufRskIsVc2wIYhUcOw6nRYnWqp8MhvpTa9ylYAtInI84jGL/2xuT
7grvw6fLJly4lWyroVbaCXRtLwrhmylcGhIdIg7GovCM1wYA8XvFinpjhrKyhG4foSo7Vzoi
EBRdp6jqTnhY1LumZTVEySF5XOldCHI3mg/JObj7ba91ZLWI0D4oYQXSQd4PZYO041+EEaOt
nC4iXOfFwQg8TpO2OE0YVJHoYO5lACEx95QgD7mzMDthQ8SH3LZUYlVpBoa00QbvW07iroca
+UfP6YpZNRjVLhZnK4J6b9YsbHq+R8o9hJSk2J4nefpdL/on3TyXsB6ybusFK0rA/nJJWlwr
EsmI7KPw9M18OJnOK3V3BAwV4CoN6ckrPu14DfKKAsNrCiGjAtkkNbHUVeE3LUgGyIef9V6B
yrLJ1P0V3hDlHUfyQuNJWjBxbF2IpOVYJZQBqHHpUzaATYtjJEL9GcTnW078RoB7EI4tSDmL
u6TDjRi1ApSIVJ6skXfKnMBzv3lEkU4anCZwYwp80DlNTdwgG/K07s/rHG5txl6/mTthbtzT
f6C9cX6HfABAeXCLSEeyxAyYnyWfhcvzF+ZBoKyyzS5HNIqglRCykjf664KVhUItxwb7d1eW
8qZ7s+FbFrISnOy2BqnnNaSjF/RIKnG5aLV7Rcx70HTxBVN6aKZH6HD6doVIIX8O2YiSkpP0
nMQ+DMfqc9bsJbU3e5Ja+bqqG4PaIkSW3oLIaHsSF2MDjYOQn+d4lzBGT/I2por+CRIRUL7g
P+GGaWw5m3EGCiMQYIv9llNcO1/GKNVwzx8k0w9CpEASb/pI72bYIz+wHQeyZb8Z3q6AUpK0
rZtUeGBkEEKRwlaPuJyxh5B3h4KeoWOLYmVcDvHxlzhc2jDjobIBKUqcRNg4YWtyC841Di9v
DqIWj8/vqm3RdLsmLfJBDv/7QdEBjJ2wsziALMcsP4w0513H8zAvIlHGl5yyANz12ovwr1Cu
xzJX2mNPjrKsgKYqYTIyyq060IMDnrQk7FX5DVXWtofJUBDOkVaJfiNgHCopMqC2LBtbi6ZF
4WGfaiYG+uppI6KwEp6FaFLZLej0L6wXYwS8sdTo2zT807Z/V9U8SohDTcclDiPtrdGKCp5t
JMyli6ogvCQoJ9CdFCHFyLDCa7+tlFFMWqkweVOny8Bx4h7ezhQmyCAn9jF2MNcyUDgYdm9i
2OsPSeoy1qpjGTj6nPNHW0L2MIIE/fHH546RjPiQrDETW2dr52wRL437DfZtB1nAsyql7qNP
l28mdr0kMuYeFtSDiN5aw9jpZeWW/1nMY2Z8g7JsKGFMzMtmfOtpT+u9Vj5nv6JIf2GrLgXd
mtztPO2DwhFXceRi92yXfQNLF/2hpOy1N+620n7EltxyYMo9UqR1pVBHbVdsHU9BlgRdCYUp
DzMNGsHYp8l0oQLhRcsI2KfavjJQI50uVIy1aBndamq3Gks3lpjOpHEvOrNKavqy2i5y8dFi
qanbRXwcsrzd/gvpbkcec/oVnhyCofEt7AZLpJZNSnEcbz8Lv/CC6WMpEUS/N4q+io0PQgOb
lNUlPw5aUf0DUsNJUB64SKpyXZBxzvSfSLbDQsFJInbwEz8J4lAStxNzD+MtjdpBT7yd0G5H
Lk9EK2HFlhfUDWqzR52B88SzmnplVSZOq7CRtTO4s5wk9mhD2wY8dvOTTWw5Wci/kN22rNg0
Ze02yYrpiGu0KRgvvTF70VlSDGPvl1O+E2kgmn+4x8TtsSecfmoGOE48GIJR9QPZAdz4r+k8
GjE8FmBqS8GxtnZ8KSd07UnE9m8OaEGN2aen3uirAejdSKz9wVjdBpL5CKsZXNXgrGULNzQg
3TYEEMzxrs000eRl/vQgw7LYa2wkc4FT7yxrcp9IKCEdNT/YwouZiCikg+N7wUD0wgq74SU0
7ftGZndaESLe7DYx3h2s0HGSQtPPw4oAjjNgcxDQVITjAwUA6APwDN3i1xIu+8GV1SKiEkAM
hDRXQVBGhPLZg0zDdI4/H5jUMQEZmgJNVjqS1ocXfu9swezcxwxFYtrsOcIocDAntwlJc4fQ
3+Wi3yuf5IntWRKGTqjaMTLNSczlRnVfV3wzlVHwfTUqJHMMWAExyxeGdnDfBvOduVOuFcgq
+pLKXBlYdwQE6OawP0kO4S4E3TDpnzKuC9Wy6is8XWPZp5t9DZtfiNbn80ElmBF0Rcg5F6UM
44qejJgYTF1VFVdE8aopRQiFUH60hjqhb+TtkS9qiZ4dByU0PRlKX+hSXDCpKRwVpZ8a4Agi
Cxcy3CnYcumqdUIe62ITnoF7m4zSOp8MO0U4yTtdSh8EAkPGkmo32eAtxyO6AWzZJdFfSxOF
zI0YSLQpJLnIgnTBGyS0cP7VyWHbdWgFH5oYMDwPRuT58OnxJJFnkXCmbzYB7NNdDrja0fGz
blp3XX2x2m1FLo1eiDd1lmzsG1d8t9zWTcIBbep6oHog2wt+669lO6zLijm4d/sO7fG0SbkS
/HRWGJ0TKXdyIcl1dmjOI2WqRAaxV7ojly1QvAY/txHwBcrXEzyFwHRm5+UmF8CFU/2cBc8t
bjxcO8laT2w3HYgeu16I+WU6Ocioo4ubZs1e3bZPIB/ZrmkxuDmGF8BAE+0uPRKBF5w++xPA
KUTZffctGzFQZx3IgefqFkJY8hHFRCMieHAQtcbaA5aAte1N0CgBDGh28RYL2ZDxOn3HiUdM
1BKEvynegSPJKkva7lu6tdvB7ffnNG4+SUt64MBifPwrmlpqDI5j+VqgpECCg52aVWTRCE1V
n1Dek15Dzj6SOMXhnfHOA9Kcmmp4v/BgQ55gJ5Rwug4mxlBCpV6Ig0DwsnvBEDQDemwfA30A
BXf1dpXXV9UYvn9bxn8g5/9v1v/frD/K+u+Ij35SLulw7ABP/72wxZB7qsnY0f1yFHfXSqm3
lBmIL5OZN2F7sGPfA/fDM+ghdEDKog+Fjd59YRQybj6tCOVvQaNkqKiTC7nRWBYQENOws+uW
OFJvpBUVjaEYc2Ab3Atpb2qKvW1YymLl7nwi8BbedxN3CXO8jxs1bUHoGM8bJHib1tHg6a6G
q9iZHFda1sXg647F54KTh516k9xMekRrQCalAtlL2GC9Y5oM0OKhnbIBtJD5FW/NZtK8v1uv
LRr2aVNopg27a83nY9vnbzOS2LdNTxuq1wfgNMf7EwkoG4+mh4IYoc8JRbpdGtHRuGRCA3FS
xNvV0SmAA8ooLSSBwqtmZlNKvTEhYt1CZEN5E8DUjwRN0/zh4MxaVupM4AKlu0F7Ey+g75FT
9BT+xL06nrUwINrnHAuJcpWNWk54ZU/bg7es4E7QriJlZcf3lxYVcfb8tGVHV6Ur3g7e857K
KGztFLWeqOQTdzwgzikHciNqyJCOQpsnDhuy/jDqV5wEwsiPlOcEEC4fnCGOGPsS6Cfkxy4s
n5I7h4Jvwe9WRAbHsFmSA8wI61TAiKcQaCS4ALxJMFZuOJlLb41Y0IXehQg3rXEYdAg0IhO+
mL3BNYkvbWsvB6NXefywHKvddSoKZTsQwWHqYZ8TvDHNuThTSz70ttBDvdl74qiZ4AyJHgbj
XyCHN86T3iV/jkOTPBfezi1bUACMmGdeh+Z5v8pvh4kEWraJ5MXsbYx+6DpyaK5AVvafv7Us
LcPE55JVqKfFbRwHwiCa9OTuPHhgdcTyoU0AJim8Bwd8zrKQ3GM1S/IKf6S2gLjAgsKJZqNR
uUGCKDwpe/wXs3YhU73ybfOFvNSALly52TNFsT1PZP7ilpGBkK48ou2+U7EE6Mr0NYUnb+Sd
Xr4Ht5TK8apoMPCtSHJZN+Vr8C5ViKG4qDoEqgkHBc+swPJpGEWN2C4UiEW0JLvA1UmNbTdJ
VsDNiBdezAUz3kKrDgBnwbLCDBsoy/v4adfAzY+LGk81G3mt0UjYCNZNZVPcM95PzB6LrC4d
ivbTe0Pd4BNpz6YWtniatxsRkoFd0VyZYhFox789mX+676adHrBnjzSbe2FSLNac+7Ok3kos
xHmoZ7SdW6HSOO39Y1eCtzUkPr0Ar8kMF1NeiChDfMWAr4SI1sA29Wt2lWzeFs1EYdhjhCvh
XzEby+F8La0sTj4mlYwXE+N5Bwu6lnBrAiA7Fo6qH0zuDQuxAVHCxsSAWGFBL9oDjYQ7rENI
oOHnqBIUB5yAIxvhgTtb364G0oYnOAeZqlQpP3jAohUgxLss31NcMnizuOemsk74AIlmOHZa
yPbLT4xNvX3EecQjET4DtMf1FlY87H+m/eTgc4a9+4QsK+HThrNreQHTbeUvnuZtUdtUwu65
FWmxLxDQXQMc2ZJc2FACDe1O4sazo6BNql8Ce9CvLHTv3tfGBoKt4uRD7IeEXIQwaA2EK7lK
rgMSOVNhuGX8dVt2JPFKx57G2hw6VY1UwnCb9FEtlWsoXIEnJi4c9Y211xetnVmCDDRiQfLB
Z+ezKf6Zzs8ipUB5OJvC73iZrp5Nuzr+Xul9pvJTvCyRpihufBmsASaDqf4cLy9S51APxpfB
GtiD/jwVV2HscKNssk34vhdSc6ZJW2arsgYlYtPitU/6MErRaSh9rs6Bl8yo8pJP89blSeYY
OogceGJfAdAVgUhOT+W8mCbB98wykcoqNoORz7tm1h1bb0x9n+JrUCgWECsMmUECdwucSWi3
h4/TwwcBL5dO8odBZ5D3HYIn3hRQhfrp6mjVE3dk5vqzhjZGKoT2DkLB3U7QnWDAm9s4AsaM
fxKwht4Mq4ilLoMzrgYuQfczrgZzO6JpBT/dhY1GZBoPGF72U+Y1A/IQ6fWaAelHucaoQXPu
Xv2WMLqsRtx1ud214OzT0DHLY1ULBrKScUwT6FoSjqnFmbJtH6C5bGzJdGisJL7e9VB5q7cb
qX3je3jMtrQfG7RzJrizURuca8Fk3iBj6JFqXb3Qgfs/NqZ6qcM+C901npA6PjKaxi2dQVWP
U+buUCNFor2XjfJzJPHSdInfQ6wM2xBBgWad3WUogpgkK9qHFkghHhZKach4wOiRTynYg/T2
0RYef082NlXL5uHvxnBecV+fF+/Q0yley9jDjTqmC9KQzULv0wjggdYzeSsSoD3QvCGbAOCt
WxUhS7q5/YcJa8S2H1T4RHU5UVlDduCJLXMz+fFt1A2TcZqGw9c4Enwv5+NkZVYAajV4n0oM
XhXNbD5c3WKcOie4W3skh5nAHabQzORJl2j/5KTHsjsg+YETmpHHpyQ+wH8XyQUr2xZ6EnBr
5JfVdtdJBS+aHtp2waZ+81OnYle/LaryN0zA+FYxAI9pwp8ZL+HazzKhS+7hhMQHUcEaUNKR
LQjSbW/q+m1yDjncnj1jP/7lJ1EnvB5pGozVOIz+IHO/PYp1s3eBWm/7sjDYg6gY45pcNaXt
iDNW9YwYRVxG2RRir7awV7etM0rBHLfNjL8zuJs5yEYNkXcH6kbeNxTHzUzFLjHGE6C1u/Dw
dMcc8OC81ZiDHB3yJg6O/Q/lOi/W7Pu/v/jzH1d/f/ni1erVjz+/+pk/p3C5bLqrym7VFZAa
6Px8arzgsJfdNT60VHFuoBtfs8cpo3vXv8X27GuITKGa9anQUOTijeNfKI22djS73/4q/KY5
ELrc/Raf2XUhpE28ppPxqN2W1eCCsIdw7LG9475RkTbECySkrmxCSCTFFG0+BrXh5bE+4XPC
wb36MbgPfsu+DOzCEk6lx7RgVU8D8B4jwFoH8/1f/vLzq9UP//rjD/8TYQEeYxUIAHwCAIeb
4B3Y/B7a44UDwkuoqrDyizr0zZA2j3FDOTkzLkp4+a1U+DqKugULJEjpSQqCSpjYg+UzKC9Y
o+FQApHIIKMKF1myCzKLqhCF/JMOJoT0XtFVAQ9EHYQwtNHNCFgIh5AGqYgKZbKQSB5jmVo4
dV5cG2H+VLRFilI247AuqJD9B/vzg0ra416oWGcq/J4fhgtiiAn4/ZfZVMAdCsh1AbG4LsIv
M3iZiftGJj2lFz4lJlmAEC0iDFVKQ7GW7Lhb8SkdJs92Jq+2ea+QOi2zDPvP6bqu/3PKWyfS
neo7YDV/mSYNvlyICx9OXbCyFfHaNQ4S34tZHA/To2TZvet6IXuUqiIR+KBQNtTOb49yVWQI
TDx9CAChD69tDN7yS/ZV8kXy1fHTr9L0i+TrL744efx1cZx8VTx9fPL1kydfPU2/yU6Kpydf
/mpBxeH5ZV0cf1Nkj7Mvv8zS7OuT4oviy+Psy2/y7PhJsv7y+MvkZP0k+ebpya/xQUdhs8aN
KIbpGzv2OAH0d7TlxO6W0J8MhH5iXBq35XyEDtLi8AjDqKIx7gOpPcYvnnxZfHP8Vfbk8clX
T7Knx998sX76RfF19kX+ZVJkX39TJF9nj0++SVCkEcKgZVAlsdPwLcItjlhI11xbckJIOrCV
NwGj33TXNo82Zfrot/oiLYup5SAdMGJi+bSsHmUJPxOFdlSpfuEn9aLKvi3z52D7zr55kh4/
Lb5++uSLp8fpcfZVkTxe59+kX3yV5U/XT06KL5+erLPpfFT/eEULocjr1x8cirDRLggICyAK
34xsTyOWRXvKzsuMnz3HzRTMLP+fLdt6PJ7GUm0YT7ZpT0IRHRK+s4ZiRM0eRkIseFpoXGN5
FYdnMb7VsdzBxJZ3SmlNNSWyJH4yWNcYKRYusyXlBmLvPGDFuyqQitkoy0TZU301lddZQoY+
vw+UfZtd1ZV84oqmqZtoF6IUw1KBxmexJLRsIjJzGOFs9uRieGjCg0hinA96iV6ys+BE3h1z
OO7lDhwO3FemUVV2oAaJZdNgL+G19eiirtt4J4EK7T92ZdMUm6mRRcs/0appY13CpY1uKs+u
CrCTA3aVkyGUSQTsgTOB5VAvEZRpDIzHmkDzKJQ1U/vcPFGhDoKXCywaH9UBqRmMsp4TsLro
GXQEVldaAz69yYBTb+BAH7kOfNZXVMZptcr+1+SAdbVCreG6AD3D3bLB/Zfg8UdZgsefZgnW
1ZFEdQEJy74Lsa3fwdYxyAfhaHbbnWOQDW6vD943LEIdnofvFUe8K17o9pDBxFW/c87Yct49
wzuC34zijn75/2IcUvhaq6RU+Qp82s+ir0EvHFyF/OfJN0+Oiy+L9OsvCr7yvnycPuVHl+Lp
0+Kr5PiL/Ok3+dePT5B2Y42fRBpP+c+tG38SaTzjP6Mbn0AUFrAWQZIL9p5Baq4F/E7ZDTii
ZOerDkCAuyuQe3UVWGaoNnJ1244VJHWtImJxeY+hdbSQ1fWG5fVKFFTmNKFaxxvRZEmLwgTW
mkbg7aFwNas6tuHNzdkpsRrdw2ydbNpCcC9sfkY2pNP7+ZRSUkHQIqouDG5wJ0BxLaTZ73/8
04uXL1+8/JPBjzCiAtyHVBSMzev8D/+nbxBzdfEAO/jpxcsXP//rnh1Y9mwuepfdTMwtzbHu
Azx/8RGwCCCGubLl4JUnISqIbyn1gJc3foDLGxKXc2jout6pHNZmwFeR3N28lAo5BSCz75W6
w2qgI8fXfHZqVYZiDnU7vCrCBwSZvvjc1iyBvKKvN4V5d5UPG66couykAXxvzD3cC2l2xRmO
BcupHd3C0yJo3rFy7MDKxIWZH2usGiifh4QFcnGCSoKjYXApBd5cbXG0aEY0oQdi6D/GjqVH
UkEdJu877y2E8ZTy2PiDGhkJv2xetjEOH3s3qfBjirsj8RMZV1hwxgrjRjHUgAszCGF3AnLu
+9vtBXGsvgLYFE1tiCcjTajQ6HF8fCeRAYZlYmzM0iBSG+MGfUCbLiL8mZt8DDT483RrLOzR
pEbCrnJ3tb/9nTbNno0wtLnpg655l7E3r9Vgiip5FcSUVzf16zIT0qpChe7QSZGsN1v05OHP
FhTbvOFSTXeOuxmElQdHof80Ne/UsSG+r17969/+8u+znhgSEC4L30ZPdu4ANOJgC/RM4tjY
VLV6NogN3orMNMALWUnFITSFHqRoKUxXDjJ/AE8qkW8a6S2URcnTaaDqZwWONbLaSguU3tlo
ALmyiUPchhUgB9R1QO91W47Mbe/8Wq1PPVSpeRo761btyJwTaZsMAOL2nRtcAHnC2b4MgSWv
k7LCK8NXSZOHGMTHWE38/HmGV4n/XYipOQiilDUQMhpgaogpyK6aiqcosbeMS678XLIpEowE
SikQKCBbcUF0dCZzJLC0yJJdy0vsGi5Q84HDWQQ64Ae4ouIvEB0tHtQmVugWWBLKOXHFm4PY
CQsOZ8Eb5lBkcr2l1/whJHezRHC4Zs93nZqX/aylAs5bGVtGCfypEPehC2iMPAtVR0vLs6Vn
lqWHCwR2gRskj2Toh5KDniUQySalCAH8HAsZR7p6CygpEk65mAL41PbT+etfXrx8NZtSSfLD
JRLsI7Vutlr99OLPP65WC7Za/fnFS/5JMlItjdPheSrMG8H3aeC9ov2b28OizjeqcUNaEfCt
63oaAsMuCZCmSTP9RACDYDEKXlHwE4M7Hr+j4BXs8UMBPUSxAVKIDer3AquB1t8ZqI/aXWpG
RRjFEH4nkH5CQtgTxEPmn+8p/7vewS7CN47NtcyFZqSQr7IiuHuIkvD+TrYQ8+gfoXOnyEff
SMaDaEzFB6cSu8uDgQrRxGedTxAg5XAJCE5vIFpwiau6hkBzfUSSrOF+B5HpnRDLIVMTWMjK
CwMXzEdkPsNz9v8ktD6FfTJg99svR0PbL4O3201JMR+v6uB6wAKdzP+ArbR3siACMlhsTH2E
BeLYB+GlvkjbD15wbj4YdCMk8LvAZoSWKDqeQU+gHcvLNVrhuyAdUUj4e5itpv0oJ7g995CP
JPl8ZIngFjJjnMPc9RobcQ77uJPpi96GrcpdXmA1xN8nn1KmGn0C/9Qi6WhAHZynAzj/COev
/Yhgn33hg9DCQeqNT7KzjldujQGP71J/DMk6eM8H8gDD7kVfTG2kqpIvl8vgHkZl6boQbGNg
HLosMwoOm3yYY8Jo9UT/akGHKiLT36Nu5bZLHaZcJIAGtX1KOQjLtouJI/q1CCp+NyLJfhxi
YNhP/Pn6wHLB1OlxAMATAjO6Cn/A9YIx58GyAt4/5IJZ5mBRLOWpnHJXB+cJa5VoIwBfT17s
Y0xUZLXEBgeGDPa5SKR+VXbnHFYxok9wVtx/MQ1MGoTBLoXHGnjkQCaBBY2TM0D4W+86lXQc
YQvPZe21134sRdyolYnT/mGW2y27d+eF9iCcAkg6+OwZxA77SGAGlwSFUf/pxX/824+n7JXh
JGglcIDNN+W0ojbdrikvy2SzuVZmUkiDgVnUWggwxrq6ZkXSbK5P4SE4ZV+TUq8ptgW6GR4d
cZ6/6UqIOc67aBf6K9GF8wQSSGBTFD8F2vqWBA2O13TB1OfsOehFwLirPBIXGLAD/UHW5jkY
W5xtmzpNUj4WMebtDhWOEJoVMsFhQBkSPvLaN3H/LDJvQFMUOehf5iZS0UZdFZCyA23QAAl4
ZJbVZdKUSdVhThGaQZXMYwa9cZxhyGxd0JkZ0orCxCSYZmQBttiMs+q2mMvwaLBhOHeQ2xn8
XrW7sivYQ4Z/ye77YkZf0AEYPh095/VnNGaIa7P64buff5w9CF5tng9WC18mHFEvfgVnuHIo
kMN8xAjjRnIRLWLyh6LK+XbIp8iL/vN/AQMhiUPcpwEA
_ATEOF



$at_traceoff
echo "t_merge_3.at:1198: if test \"\$OSTYPE\" == \"msys\"; then
  mimencode -u -o ancestor.gz ancestor.gz.b64
else
  eval \$UNB64_COMMAND <ancestor.gz.b64 >ancestor.gz
fi
"
echo t_merge_3.at:1198 >$at_check_line_file
( $at_traceon; if test "$OSTYPE" == "msys"; then
  mimencode -u -o ancestor.gz ancestor.gz.b64
else
  eval $UNB64_COMMAND <ancestor.gz.b64 >ancestor.gz
fi
 ) >$at_stdout 2>$at_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_3.at:1198: exit code was $at_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_3.at:1198: eval \$UNGZ_COMMAND <ancestor.gz >ancestor
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o ancestor
fi
"
echo t_merge_3.at:1198 >$at_check_line_file
( $at_traceon; eval $UNGZ_COMMAND <ancestor.gz >ancestor
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o ancestor
fi
 ) >$at_stdout 2>$at_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_3.at:1198: exit code was $at_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_3.at:1199: if test \"\$OSTYPE\" == \"msys\"; then
  mimencode -u -o left.gz left.gz.b64
else
  eval \$UNB64_COMMAND <left.gz.b64 >left.gz
fi
"
echo t_merge_3.at:1199 >$at_check_line_file
( $at_traceon; if test "$OSTYPE" == "msys"; then
  mimencode -u -o left.gz left.gz.b64
else
  eval $UNB64_COMMAND <left.gz.b64 >left.gz
fi
 ) >$at_stdout 2>$at_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_3.at:1199: exit code was $at_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_3.at:1199: eval \$UNGZ_COMMAND <left.gz >left
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o left
fi
"
echo t_merge_3.at:1199 >$at_check_line_file
( $at_traceon; eval $UNGZ_COMMAND <left.gz >left
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o left
fi
 ) >$at_stdout 2>$at_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_3.at:1199: exit code was $at_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_3.at:1200: if test \"\$OSTYPE\" == \"msys\"; then
  mimencode -u -o right.gz right.gz.b64
else
  eval \$UNB64_COMMAND <right.gz.b64 >right.gz
fi
"
echo t_merge_3.at:1200 >$at_check_line_file
( $at_traceon; if test "$OSTYPE" == "msys"; then
  mimencode -u -o right.gz right.gz.b64
else
  eval $UNB64_COMMAND <right.gz.b64 >right.gz
fi
 ) >$at_stdout 2>$at_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_3.at:1200: exit code was $at_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_3.at:1200: eval \$UNGZ_COMMAND <right.gz >right
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o right
fi
"
echo t_merge_3.at:1200 >$at_check_line_file
( $at_traceon; eval $UNGZ_COMMAND <right.gz >right
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o right
fi
 ) >$at_stdout 2>$at_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_3.at:1200: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



ANC=4f7cfb26927467e9f2a37070edbb19785cbb2f2d
LEFT=adc1ca256e9313dd387448ffcd5cf7572eb58d8e
RIGHT=63ad35cd3955bfa681b76b31d7f2fd745e84f654

AVER=`monotone --norc identify ancestor`
LVER=`monotone --norc identify left`
RVER=`monotone --norc identify right`

$at_traceoff
echo "t_merge_3.at:1210: test \$AVER = \$ANC"
echo t_merge_3.at:1210 >$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_merge_3.at:1210: exit code was $at_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_3.at:1211: test \$LVER = \$LEFT"
echo t_merge_3.at:1211 >$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_merge_3.at:1211: exit code was $at_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_3.at:1212: test \$RVER = \$RIGHT"
echo t_merge_3.at:1212 >$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_merge_3.at:1212: exit code was $at_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_3.at:1214: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR fload <ancestor"
echo t_merge_3.at:1214 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_merge_3.at:1214: exit code was $at_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_3.at:1215: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR fload <left"
echo t_merge_3.at:1215 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_merge_3.at:1215: exit code was $at_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_3.at:1216: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR fload <right"
echo t_merge_3.at:1216 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_merge_3.at:1216: exit code was $at_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_3.at:1218: diff3 -E --merge left ancestor right"
echo t_merge_3.at:1218 >$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_merge_3.at:1218: exit code was $at_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_3.at:1219: mv stdout merge.diff3"
echo t_merge_3.at:1219 >$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_merge_3.at:1219: exit code was $at_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_3.at:1221: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR fmerge \$ANC \$LEFT \$RIGHT"
echo t_merge_3.at:1221 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_merge_3.at:1221: exit code was $at_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_3.at:1222: mv stdout merge.monotone"
echo t_merge_3.at:1222 >$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_merge_3.at:1222: exit code was $at_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_3.at:1224: cmp merge.diff3 merge.monotone"
echo t_merge_3.at:1224 >$at_check_line_file
( $at_traceon; cmp merge.diff3 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_merge_3.at:1224: exit code 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`
    ;;

  127 ) # 127. t_merge_4.at:1: (minor) test a merge 4
    at_setup_line='t_merge_4.at:1'
    at_desc='(minor) test a merge 4'
    $at_quiet $ECHO_N "127: (minor) test a merge 4                       $ECHO_C"
    at_xfail=yes
    (
      echo "127. t_merge_4.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_4.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_merge_4.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_4.at:2: exit code was $at_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_4.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_merge_4.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_4.at:2: exit code was $at_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_4.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_merge_4.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_4.at:2: exit code was $at_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_4.at:2: rm test_keys"
echo t_merge_4.at:2 >$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_4.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon




if which mimencode 2>/dev/null; then
  UNB64_COMMAND="mimencode -u"
elif which recode 2>/dev/null; then
  UNB64_COMMAND="recode /Base64"
elif perl -MMIME::Base64 -e 1 2>/dev/null; then
  UNB64_COMMAND="perl -MMIME::Base64 -ne 'print decode_base64(\$_)'"
elif python -c 'import sys;sys.exit(not hasattr("", "decode"))' 2>/dev/null; then
  UNB64_COMMAND="python -c 'import sys;sys.stdout.write(sys.stdin.read().decode("'"'"base64"'"'"))'"
else
  # This is lame!  We should XFAIL the test so the user knows that
  # they're not, you know, actually testing the software.  But
  # Autotest runs XFAIL conditions in a completely different shell, so
  # we can't without duplicating the whole test here.
  exit 77
fi
# Poor man's logging:
$at_traceoff
echo "t_merge_4.at:3: echo \$UNB64_COMMAND"
echo t_merge_4.at:3 >$at_check_line_file
( $at_traceon; echo $UNB64_COMMAND ) >$at_stdout 2>$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_4.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



if which gunzip 2>/dev/null; then
  # This is lame!  We should XFAIL the test so the user knows that
  # they're not, you know, actually testing the software.  But
  # Autotest runs XFAIL conditions in a completely different shell, so
  # we can't without duplicating the whole test here.
  UNGZ_COMMAND="gunzip -c"
fi
# Poor man's logging:
$at_traceoff
echo "t_merge_4.at:3: echo \$UNGZ_COMMAND"
echo t_merge_4.at:3 >$at_check_line_file
( $at_traceon; echo $UNGZ_COMMAND ) >$at_stdout 2>$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_4.at:3: 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 a bug report.


# This is a real merge error -- it should be a clean merge, but it
# produces a conflict.

cat >ancestor.gz.b64 <<'_ATEOF'
H4sIAM8MGEICA+19a2/kNrLo9/4VjBcz0+30dLKLxflgj31vkpNdDLBns0Cy54G9QUOWaLds
tdSrhz1O4v9+6sFHkaK6255Jzr3ADZBxSySLZLFYLxZLX3yh8mb32JY3m17Nv1moP3z55R/V
TZs9Fk2tNk3WavXOPP7vXXPVfFjlzfZy9sUXKqsqRe061epOt/e6WOH7qsx13elC9Y3qN1rt
hit4pYa60C296HW77VRzTQ9//uvf1Z//9hc1v7xQf1hg+05rKrkuK62++e5v//X+r39W102r
Ct1nZdXNZr8r67waChhZnvePO30p33R9UZVX8lXZdH2rs618t8128vGfgx4CMJ3ug8cxhK7P
8rvwRVvWN0HHMNOsb1r57nqo875s6qy6lBO5amCQX1T6Q5ln1TrPun612QVD5BrFY51ty3x9
VfYwxHSdbgOrVqx3fcvlvsLJVdZB47JZbTYn4nW+yeobvSaIYUFTwzzrvove18NWtwDpvsmz
q6is1fdlBzOMXndZXfaP0cu+zeoO1nYbdzCU0Qvf0+y+KQtle8FBn53lG53fraELPV8oGvTs
55lS7+ef1UNVrctiXuuH9RaGcK27frE4n0GpfYT3O3XdZjdbXffnUIDENtcFYARKADjCW9vF
VKW6UFjYra70TVnPF+fw6jP7TtcFvvn883IBkJT6mf5VyqOYx6deq7wzkNZc2M3Lxbmt3q3k
nOzr8lrNP7upmisgEoPQVlfZB10sTA3fI/4H2wkRoJrKY6yDAWy1eij7jS+0uOhEY4E9GiXU
W1sgMNSF+uUXNapgAWEFN2ylnswvQq3HxdlZoas+S+L5FrADaKAKAte3iGv/3uH7No0Bucij
Lu6gC7vwq+sSQPFw4LF9XO+yfjO/lbPgBYBWohkNYCGqKF9WAh9s+zmwpLOzbXanAWTZpvpY
Bu0P/CfbF4Dp20U4Rl11OoD3cwT9GCpybcf9J8b6fj4eFGLJYZ8LgFDuwrGG1BE/8a+n2dNs
Fu53+TSXD25zNSBC2gVxAfo52k6SIQAZcCX5EivRnnal9HQej8Z1GY2x2TGVXfzmA1Sw1/uh
rdVpvyl5wChYf2izHCrDKxjVo7oC+aXeFHrXb96oSt8D2QDlNlv1Jt+UsJPL4s1SgSQfUKyB
RM56BMKtUUqpskbOnaE0U2VHE4NCWGniLWWtsHfVDVegP+w2pBv8AHKdoKvtALO60oqqaVVk
fQbCSYNWAYK2eMTa2ODkGwf1ROVD28KP6lFtNcgNGpN60MjPdg20dUwMoDQwZpgTzBO3mJo3
16Sz1I8w1fqm3yy4NeoiZZ31gBd8ssNbQs2CmJXO8o1qanwPy8ONEGKH4Oip2zQDTOiKtZYu
29KkrrO8V6g92ZcMkjvFbrIqHyrouEBAzBFB9YGx51mNwLLdriq9FhUwaXyZA556Bg9EgUBs
scXdX78+U/+xQS2KFsJqHmqTwao0NMz7rC1RvOOIy16hUlFdw0hV1fSoocELhLQbWkIwQLnF
dYPu9Qfd5iUtWEWDCIB1ZaGFyFvl+Uqp7xuEBYrkmx4IdNvc48AIrGsKteZfdcigHpsB5qUL
wEBWE3VDm6wDtWK1WpAKMPMbZm1o2u800BCcmDXUnOSxJVArbYFkqaPK16q44r36l/mf5if/
DsrP9SNuC9uhetUxXmE0bofNAU8EXL0qF/+nPmHu+sqNCH5SMasjqMkW+lqREnd25rW4dx6R
l8q8zmmbAzrnWQ2bGrpbShWD9rEtIWrBLrF/I4t27wSqlh7qpYGClIg9SDUJBrxd27FjYXG1
utG90wm87HcoFw2IpwUqlykTkBwA38yBYCTR8GFwcviXON26L3VLypv5bYVv0D9N6IH2xJxQ
//atulRfhqpauo9af+jXsiMhCkmrSTZLao9uiFapkbRHuqSrweqNLHeaZSzZA9pnTok/L9Rp
eZ6qRsKI68nyaFHnHtTSVg8GRFy1YEsvw9LuTRdyKixK6ZeipSfdN66JgWYfPV0KEPs1ddIg
ecirUGOPNzsrlUHVMeYZ+7eLvbqVXIWGd7lR8gP1+XYEOtxm46Zub4ybio2PNftmbRfNIC22
M8YgSCW0yjx3vhgrg8EesBuskdtrUkskvvntBzBea+SbwC7fXsK/yBWBDTaWH4rdGgEAarka
UHMI6WVcC6YSvXTczaGHejHYWO8APa4KGooCfBJRcndd+CGP0HU62V16meK+Rop8iuDCCVqI
417Pk2q731Vs//ipLWhL+GK2c1JQpvtUAYS4g7eXnYYdWyRhNnUO6g1qZmu/Gt08jbjnmE+n
08N9Fpj02iaNmzGNgtK6ye51RMvnqm4elqhlgS6GOueDfnOPWqFGjRB4nf5fKWqMMGz2Y3L5
jqImGN/7a1IHuyWOsFZou4Iib7RZUn9VdtNqUEtJfU8Dcb2vkqR3OjFwSxa4t56D5RfuHZ4t
qJhLVpPLzngfW1R0y22wClhjlQbyfaNQ2dKEuNoIvR1JKFTzUX291kB4uT5L0bvHRdpp0Bht
aAIhyY1pBKywXGBsD017153NEtUj5aypkjvzOEkhNAmh1DVOpWuqYmrIaCOSX8rp1qhY6+2u
f3RDXKISB4YZL1YaDujS2VAliS+YKRk3LRhia6GQxv+hNfYoOBFPZjlFoEdxklHHizSPHtUj
z8pkk/3OFK8gA3NO6LTobDECnAxTY6aizK7A/kL/xXYLa2KNC9owGfqkypztUahKtj7+D/SG
jggQvEPvzfWshu0GZNmg8Uf2cbndgUp+kuzhBAHhNjJWKB0dZGqr2xswqq90ng0d77pOQXlX
XpHFy3Y27Ecywh/I9tT/HMBcfURLEpYK68WzsVY6wmqbYkCHSba9Km+GEsiP9zXZ2tj7igbf
6g7ITIElAcUZccemam7IRZKj8YglYBmC0UG+iyzPwfJAhAKL5wMPsrV1Ada2MU6KssuztsBK
xvpF2dCD1Z3lCOMBp4cm8gNYzSpDKPe6pc0CrLNvG7DJG/oH7G3rD8jIJNbtPSznPTkY2uZD
6R04D7w+byocN/yTqRPrvIFJotiE8dBq/OWbr8Duv2nast9sV45volOBgFQlyIuqyZluEEnB
yhYN+VyaFmHVTYHLCPSBE/wn4BnwyqsJc+X1IqdDpu5h21ZVRt13OmvzzRIwgth0zhh08BDT
prV/g6QJpHMHZrL0XNHqwQCbu47Hamqh2YygmgGoDfC50zmiaklME6eCPrMHWBjjKaMt2KJc
aKy5ssCxgzKGlMOj0gwbqmQWAVxX3ZcZvOuAKlEsIA0gq39Arwrhu8NlwqVgSI3xzxhdAAk0
1xqJxCzBQ4mrVj1kj3Qk11SoYYy6RVjs/G88aS/VUFe6I83jGnuE0fABXduwKwh/O0cewhjQ
/dcPqKLBEtE2HlGLpxIiDlyZTt00Gq26BjoiCiBHJOwd6zaB/UKeNzAWkCuU12YjI0XU0C0P
uhloi+6yG2Q7buVAa7pqYTtvaOa8d0iLUTD1shWD3MEoGX2s1ThYTW0XDmqUuxKXysCEIQCj
KzS6TEpcM0Oohh8YzCD5GC1TbR53OIbOahbG/XdKO/kUdyRse9yAsPFapkkcESBgSQuF6lfR
ECotyzMaCm8p3D5GGJpthQyyRp5aaLNujmERc2M0OueQWVp2IM9m1gs11F15U+tCkSc17z+c
zyIHVXgU+e5SwQ+Qp6N6wpHFNZwTyzaYdT1wilzRwd6MXM6o9dB+WldNBviewwiMa3ZCtDrH
FtRchj1cqtd2e061LmtQ0WrdYmuszs9TtYF1rnHM6BiE3+wZRMXI9GJMHRLQqIfb10IJZw89
WblkGuM0cZWt1wN3AK3tq8LYyAe9YOV2a7GGshwGtoo9dKZY+knnPNUVUt6wM4NeLCU07jSp
mgExIdvOLEuL5TQiAqfFHGhmdFIjbFez/a4z58hBQ1KMZ+TG2SGSZQV3KrgLXXu4RlZ3Pd0J
vTVo3ILUnlsj42ns1wiIC8m+8x4EfkleBPPTgu3Kn/TcHNXNnuUz/GTTx020qxEarzn/me/e
XpY1EP98ISx8okqzquytCcnxdAf/7OrgaBpgX14QQsCI4+l6Xwy/BrmEBbv689+7pqYBaNUO
3pN11toppa0ic1iDAHDkT46VXKH2M9MfdsDx1k7f6OYv5xIHWvo+Uo2PZy9J1kKzIQGK2rUx
M9A7CKK60+eWI9yDutKYPnCxOtq39GtlQnTmfpyWIO3m3mUg/n+/hO2LMQGgj9mTHVr3ethe
gUZkxNQNSSSQsB2eVpHyQVpX1jZDXQTUPYGyEZFrmI4YnDvvtzjSSOSigqNxzTTO09wN3WaN
CsVcv70kG97uNzvDP4CqsysQwagrGunn4KKW0Ja6M3ZKMBOB3tHocVPxCEYDr3HgXObGXEcn
DimG4uf6j9P6R7FXsE6X3YNQPCXClztQ7j317kKd1ov0Bjyt1ecqtQVP/ZY2f9IC+bReuu1i
6Zko9jw5KSd7lBOHclrh7Ahcp+m4MphSPDTaGOyquVB9O+hzeSIT6jCGl12oL88DB7F5j4tk
x2i7IxZKr9JHLuQLkc169HOYFqFTBM2yssYBRu0FSZPWYFqjjR9TewhRlKaZI0NaqufElqhp
ObaIwkzC9d2NqZb7/3E044BGL7mlW+BgsLuAZCNCiKDuIrDTUENBtB8qs5D90TSCWAEBoFcE
u9IdVRkqdSw77bEZ+S0D8K9T8J2D2fAD9ctF0EryB6qBtE4MxE8sJVz8fnryISWjihxekhK7
Ts97udQ90NC7bWYvF7m/tsT16u7/fQLXjy0tb335JxW3zvj8dNL2pVLWzfC3F7K/oXjlsEvU
/oUQ/B8WfDEW4/7GrJrHKzEaWQ+ZiU6IevJUHEvYiL7Dzn2hka8fIVo/Uqp6Kv1/XagKGZWS
ZL+6pAoEFZLD2otKqIocZG6Q/1pdd3vW2NXq6mK6ViiGbEya3dBTrWQUCYk5lkrGywTDWrkl
gd5XckHw2SyDr0c4RtWC2vsm0F5Uovb4bNoL0IarJ/RzlIk0p45P8rEDWb4Cvm9h/yx9C9co
udSrQskFYBZuXAwBmByq98ICcCytZG5WqndhA8/JymkmFrToTdz6XnUPFgM6nHagleOzWEOQ
0j6ZinR2lY2e8USncEo4SOm5GLY743jFM0zjR6ILKI7GNgW7kNMKlRqrCMrT53ZLV3Fg8gyA
Fgw7xQ7+8ar7Uc1h4Yz0Xpjlgg7h3+3W0ww3DlWTZMfJMDmA5DxdYh4UIAdl8qaFLf5ZVHRj
pgGfIaXJkCMebWnUFvg5P52XNvZgsRB9PtEvWAnBNNif6VTcNcxxTS72ZAhqpa/7g0fCqYZ0
v+pZLYlbHGyRdmAHrIqfzmcHaWbmjWg6PnUnqd4UNNwDd2s1dj8idlahAxJrtuOahI6o6sgf
W/EO3SNxz0dt2he0qWB+z+7niDazvZpHBVIDZ8jQ91RE8dK6imNnQQQSKhyuSTBdTXt0wUex
5tQqPlFfEvFfvOqYli/c/sPX8IfeWnAmMndkP6aoS+rE6pdfPMWPnb6uuXDSBu0T0imaBttd
qH1dvCqW8Bb/ADj486OZ0Cx0KFlzD0piCxDjvtNuWO92SComp7jyS3WKayBmgIuclHBCzhrn
/TI4+OM16OhY0IyIgtrpNiivVMBJaCqptdsr6Z4id6JVQ6Ym2fIkq080STubeJZm8pOTNO2o
3rGTfHJCI5bQJ44ITgQZCykzauBJ5ERS7r4mhvJOnOm4OE9pFCTIWI7RIXIszV4mw14mv54n
uz6h3JoQW7QNfwVB9ZuJqV9BfKQZfTJY61h2/xHMPsGsk0NJsWzDq49n1c9jy/Tn07LlX4UX
f0o2dSzPAQB/ev+f//btGXsvfWAQRsbUORB0eVVhiJ2+vi5zDLoBmw6vg3w3rxcYB9NqVduA
T4yag/Wx/kQT2uOiEkyckjT2Z2W3n785VT6+KZaqDDZqDvaHuRczG1tYQ9WXo1tWQbSGBUVj
RUY2GdeBP3tdOJZGyQrCKvSKSJV+kV92LmYU7LjPuA5F1MaW+eQlIm5DsaI+8sB01uzm4T4J
L0gEyPJEnKDP4PBD7hgbUnQkckfm5E1wBYqgIJd7d1MuoezSB/JdGNqhSNF1i34jeWXhPL57
dFOSqWrbr8iYNAkB3EtzzSH0RExdzDarza5Kb5AiIm3RM2L5BTl4WKkwYwvbCIJ9lZ+e58MA
xc/Yzr/ZHkyqCazWYyw8SjBgKHSp9FWXCIhzUksMiC5rSkL2kVhH7HaiqqmoLO6lfZwzLxD8
UyJMIieavLINxVEcB9NlRWG5dd+shxoP1EOdomsnVK6wWoHHoDbMDR6EUxgghD5hemF8iKLq
wroHRQNoLmtQc3phXZACNjY/hUL0HZ9CQWK67la11ycwvn27JgTNnxflt5f6yro87JhJ83Ov
Ud9k1eEzhBcJlGPBTnp19h+u7qOU16pvemCeRGxMM5+GfRsnZ5bf8fp1/Z3Zg3eGwwU6OK6Q
UMFDEUiNkhIQNfqBAvqgRs+ibUwG8Hu+0R90nb+DAUcu4KFbCMUxkDYobPxJ3VjWAFx/XIju
RpyYPHieufst7Lf0V7Pw9NiCxjsPBV4vGIsqH6LqJZVTg1OCSoqV4AgxQreVGKtxLOFHHsTF
gs0tuDvwiy/WGJyNPe6A1VZnd9Nu+Jm8R/qgLaysfqSzJHwF49zhTb2VvSyBuRQoiJ0velHM
NqyGByWvM9ulWcm4SerET3p0ZhodXR9hA/7PLnt4yxsvuODpvwHhrm5hRDsGOVg1nlKEVY/s
nAHeqML7vYgpej/SjWAuXHAE8dBh6aFzZyKUQwfPplJw8jx58RNvH9XJfcoH/ojWJgyOgNUM
sjFN7J5xmMZoAYgVI/Atd4MXFELozzyeuQ1iR+RwzoMh36ZHJzS1hH5yaxd2qa5SYU6pNlfL
QOrYViMHRxQiN3TYh4+pQMbiWf6TOX77IUifwteG8K6RvbnlMmuJtDEm9UzZqq+W6mu+OcYZ
dLBRN+AFFbwM8lVC/fx6ifdKKAy9U1+tOOPZjJ7joKqRcvE6GE1KD/6Ewvg5iu+xDcoab7Lp
tWl4vMosuR0L1jA/mxG2UX62oLsJKik9QdrzQrPHXnhkFnobw9LhCOb+zHwjjiJGNwcIMb54
lLwucNwfpVwv1Wm5lDR4XIhMsAyB629wm3HSQdJvd+e/JVaEpki+kZFEHGtApMttMm/OrUvO
wHKBIN6pwUmk16/xgUMRijDxX6K9F1uABEu+p6W4RTFTIvPfBeOK2ZpNyFUWOuMbgWPPHAiL
h6y6E9cd1bDjq3XG4YtQ3G3F6nGJ91uHrb0zbEMaRQ4HlXVdk5eY+op6pXvCiLqtLvAth4Cw
oDql+3zljWh/am/Z5ZizjLJCFRQnWdK9pKxCv6C9kQqMtYFKFbAQGM3bbrjatc1VBXIQuSC7
EfuBb8DyxV9Q/THtFM38Tusd3m3mi254QxDIc7vFeeFONTX4njNdzAQuX5W1zugUdIfZPHuX
yczkBFuiBkmA+4fmjLM8kD4EEDmvF7QcEDd8r7ijS2V9iVlBEXuLmbnV71vS7VgE2XmRhHhn
PEJ3fZvR7qLYEetgItd1t1iZS8148bJEH7rJZYbgcZJEF4BG/QGgmLDYfsjv+LIlp0ej5H58
h/c9XQA32QYeCBhZKCjP7kEtpjumuGR4+3pFDl7OJUtZ3/j6rxpuKkZbGK3l+Y+gprWjvb0e
pcMX8idThx1uGonZww1Ewh7oxOyWe00rfLh1OoXX/rRhJsza09GR3ST0i4B+XgrGYtjexjUO
cGkkutw68sKkMemsI8nmFpT3LaGZez+6cCnM6GAeQbYwFrJEdK0GLpNRphlKvCDaB4m04GHC
u2fvqLFlb/2Q+sOuajhcy2X+YCZrTQNyQy4x7cgdh37zvXPjmpSZ5ISf0qkH+9PXwlhWqRS2
/v2UzAuR4mzC4FJDfIbgq6XSyI4ODkx1b0+GfpqkfSyz6xq7QIBy1UxkB6UnbP1tW3QCS6+v
HHRw7/bFuy9pQMlTSL8xfZqkdWRSIYJujd0u6jONq6n8v1mUS4CyqTiJYFJd8FxNXgGULphq
C432yIL9UHYk1rHnFQueVg+dybcBU9tQjm+QF61+azqB+tKVMF4eTFHnjb7oDDOmtHRoiYsp
CTf1CJWIvbBK5DF4MfJY/HGigocMb0WHkCgLKW3wsrcp7TC1Auxwme6OTkNbO+2V6u7K3Wov
QqL7RE+po7Rxq0OyVGSV9Ogjg/K598lCwTde/Y+C90yRNv3fM4XaHnFnBVrA16IF2BMWIBOK
lp1buaVJcksuSFTJkJUiHUl54EMD0hzscHq15PpEKcqXscaS3rFWYMY+2Mj/mqTX6O458Wab
asB2sJdXO4MRNXzKymW2GFIL4y5Mkfr20ib+pe2IqbKu0WfJPnQycSw/w+QluO95BTb6EX3A
xAqvdZ+bTS66W5NEZSg5qMvk+Q2IQmg5IWvfe+n9aCLdK5uOhhIlRpzHROAzGxhNK5yeNTo5
FTHwZTBsrh6JGop+85YPMzjAaMHJZNiQYSPmsRneEPeljDaUGAWtUrTt0H45wM3QNyiTR/JO
6vUsSFLn0781mBvmHinKJIExEsBbxrTGfCfvIXtMJbEhgxKT6oCt9KhuBrR7KMEP6TbBsSVH
4lnGQaHkbohrRslH2jYfZ968xMLZYz9Ilf/FCX05OM6q+aMSe8zn8+imjvqOSfT7m+b5PSK5
rzA2xOKMjA7jhAu6JK6aFUGaGWateK/U4NJm9yiDpmHYy/6Muwnj4nbCuHhGLt1DhkQ6pa3N
9SJ1wPFJjzcn0rLc0VdCKY/zwrox+nOP4yJ1RFDgMVZJtEBhUNUL02OOCcQQB24JR6vj4SRG
kswUPN3kJVkKZ3HIh2eaQkx9FON8OdN8LsMMPUL8PYNCxi2JPIxunl54genWP2CCUhM1KuJF
vXMg0I+OCzUcVbBb4nz2Uj+U0XCIsx+WezK7PX+XAS0QoWSr55gyAoTF8dIO6CiFyuAnGIEJ
bv2+H67xKJC+6YCbptWkctj8clFwqvp7lD7POKzZnY5Kat0MN6Dnty1eqsmsjf2gyT8NA9hh
UlCYR0EJBsGsXI2Cv+qsevxJuwysTok/njplVnK7Aw7bbalWB7XWcAt0TPxRTlrbtcvUOosS
0gY8XghGl4TWQ5C3xcWnjkwCtMibF37aIPooAfNNQjafDZiPttjs6/xVlVfdGzQz8K9hoSkX
E6kYez9aRFcjrZNslLaBb0fa4ik33t4ObpVLL8selOgrPvTNInHNlf1SPidt7FPhjzVp2KD4
SbdD0Jwr5zM1H38+qJz4rBB+AykdutKtOHcvfaBoovNjNoAYwlGkL4cmzF2pUD09Y70Zs1PL
LfD+stU29PLM5ZZUFqw3hmjsWew0vlOolpEYwNzaAb+qU+d8Tkwcwj3NyTdtXZRR8MNCnTHO
bLlpYx/NkKDNPLPru80+8P2OL+2bmv1D8xP6c7JUJzX883vTuF7noOV0a1ihE/oF9iDWyYM6
IAe6dTP05OqhxMhYp03AoUoMyNT6hmpBpZ/NyW4w5bUMMpb8HV8N//JHNyH+3EyZ34F6ZaZ0
Lt/YaQQv7bgTNemtVAigs6WQAZwbB/1K5kMWgfYgKi6h4aUylbC+G20AOjTXBGhjGCUVEwca
Xj4TNH50KwBto1iwhYjvRGysa/rWE/28z6pBo85DaJpoTuOy4SzGg0LiG/cQjcDFuuAaGvmD
P60A800eWtJ+sTe2Ns2nEkkR8XB8EYo26sPJNwTMKZmlEH+NTwtLR25kqLIF3yZJCf69LZ39
lrw9iAZsksvOEro58gYfIESBKWPMob4Gq862g2MdZ2fHIttr5HXDAQ6mvoyQ4EwDVroH+Vud
1Bf379rH/Y4+q9OcO6NHDPx5K+hdLqltmhQ90dZlEYEvaQbv56VNvCQr+UA/eMIYF/+tj8Qc
ArINvUJuS8Emwj+0i/iXsyptlTknaV67F+aK5kTtIjOdHlE3G/oNmifH1e6zm2OrsopYNcc3
aLZb+vLJkUNB+qJAkrDFZBzgkSxtRCp56b6vFeb7iLnqXiIznDYdkRVXmlJ34jh9eZdpFJOf
l8u8vFQUfY/nYkiEQUR+KRObjb2BeclOL6xrg6vZ3UVvfGj1xPdJHYIVrZc7Bl3FnSqxAAr+
FVXj2Tl/FBMF71hceAqp4JeJSOlkpi7slD5FiT/Ogw+rApviDzdQGXJwe2a/VEwy92hWk7lt
ISxSnyIjKoM1IDDJmmwPGHvMrS8hhLSfbk6ND4R+f/55oLGMPDYIfDcIIcLzGo0m8FcFREFP
lsXNBIsby2Dic3/jIz/nKHhVBAmQrMJGvfNs6IvJGUUir2+GrAUZjv/OefhmmIiuUCu0iDGz
NPaYq0PKHV7DFrqDmZJjxaSouMvZ9nLjUm10VphPV4mdP9JxkvveCcCxh7z0oeNQPvaP+8V1
9yz93cV480RZpMe3G3lB8fSzKK/Nd3rmDrAZnZ81jydpxkRJupdh8vdkE8IYDw12D+HToNVC
cSH9/ha1+exo0dDXV3buDM2cUmaVwliEpcKL8DYTGn3sYmkBQY89dIJO5ivNH7M0PrPVbHza
MbmGwUDjBeTCvat3SHcTnm5epZGWq3gP4Jfpt6W5nkwWI6mcCSXvaL3VfkU82kxWnaXb+5h9
zLihIsvFmdPEeONCwYEtNgw8u+0//9xOHDmXs9Ocq94kD1DeIeJPC7jMKd/4XzyAtNIJNZbU
2lv8sXaXbuh0zlGWZqA1vOTCwlVKYJPj0w3fCIJLtXUW04Qfzyw/DZYrewcS3ZO4am6Gztai
PyZ9ZizC53tHkvbGsJaQONVjd4xRIg4c6bnPPuiCnYPeb4gy138AwqXDc4HlK1IYeJGnVIQ+
OCMsNDqK1/gx23/5owhRX1HlJdQO4HhJWdYx/G7v+h8ZTzC+YSGnRuMZfz7+aSYOrqI9ExH3
P+D3j6OUkGzzH8EYDpqlhjEk+IJwJWPFvbxCuCKYV2ALyytk4UfxitnYKW98MBOnx54vwptl
wEPS7EcGLe1hRlAtwZLkPNOURaOYZkmseE6TpFuGF/KyY7lYpM4ahbbbh2jmTzS/9hAXa4/n
YvFI0kHA+7lY+0Iu5mjh/3Oxl3ExsR/+Ab9/FNFsMRuLcupQvKANVnr7VtFdefMF8pu2ecCr
N95hxe+hGh4Y4+0ZutIBuuN11TxwCBa1xyuPGX48ynxADYzHmWCL0sp5hh/OO9LoM2ZdZ5O/
Jj94RLEckfkffWMp6R1I5IqyXMteOTHd06HuXUn3hKL+g3Q1e0YRfs+WFizQK+kTkYbzjt12
xtnnai0mLxlgt9i947MXEvZ+z05Si8/9jc6UT8QbYTIpjkMOhTJ69weKL+n72LMEdAWcvi+H
byaw7uUvidW2dN/nlMilsq0vCy4E+NvA0+fhSwdCrMESz6HFUEz80gTnMMNbvox5iO67xUJc
4BvxCut3KmO/U5nyO03w7fdz9ynRhL2shM97IhdQvHd9UO2znOATH7Dncrnawd0LouV9XsVg
DW4THsbwznrkaro9wFBCWx9HCT3cpr5nPYqzin1SAYiD/HMi3ioe6v7vwfguF/syFsgg7KSq
F0cxCLjno7BBuVlNRaGEkg0/YonRgKXiOLnHD+9zD21qpx+z2/1kn3NbIA3E9h8GCkixLxza
vCN80FOJSaCMCmkuDB9HDvZeGpOBDaSJfazsXgUO7z7zHLBy2Iwgaxx9UNhTTCB2z7fiPnPC
24pdhEGrqL/JY+cJfsi5KY3sdnLd3VUaD8gPRGpViFnvvFUzdtj663m8FQOX6TyZYOGmaq5A
TnZAff3jqiN9v8o+6GKOdyHswR/rTBwNRgX28x4Jt3AYO8Zc1s3Phe0unpNmIQ4aOJRnIWHp
Jry9x2eRQOEVwkwf+kR1ps58giAwn6QhKfq8aFsbtZthT3sBJiUk84/joSTkaNTKIdyDXsrR
JsyJvSRH18OoEXeUCgZ4mu2necdHXaMk3cdETV0/k6oDH1gXUvWkt9Dkf5h2E/rzUJff9GSx
xHb8YYyRrQ0lYuCjjxId5ybEjAxJmsaCyaQSKdv3GXbvyOKw1OM1Y76XJaCQCLHlLsZepDfr
72VSoaP3TyTI3RiP3TmhbeSav2zHmIip/bsAT0W+aDDDwfU1xpv5r2p4haystKEl++4EcUPH
qrss14o2g3/sHredO74bf6gjYBEn8unEjHzcRlp/YE6Jp+k2AUJP5NOJPzAxbGAH7Xq6tzYH
mivzddmAadhSlg4MAOZfgeJDNzIocM/5STWwBX846gEB46h/ymCIvLP5I2JAbayWILrOziQe
lonrHnoRpZnbA8fOU8BxiBjBMXNbMQp4qHPD+fmduFxgERFekUQ3pRph0w39WIyOrv2M/M+o
21FCU2T8mrlMCs1qGj+SdpYjz8IzcEM8cvJeEBmHqatBM0E+E5eE8NFcjvRk6TB/SsVShsHW
B24eEy++bDl4vUuRLmeu1CbsfGRaSLYqghilZh4HIJrdZ4QTf8q4w6tegPkElTOGuQos0twK
J1Mn+uaQLZ0Eawe8DyzHZompjcAGxM6YY0MJpeaUaWRGvFSJ99LUiZcstUP2LNtof0Q7g8ko
r3TWzhcTqzLGnST/KdwlHHApJJpLiAYAgN+llt3d+7VEa/Hs5uD6DPe6M1TQ3llLTGBoW+bz
JGfJnDJTqONgBEYTxo5lmAeqQ5CGC/jVKWu037pmaFHMtfkcKmIscyC/fPW+udN1+RNmiGju
MLNvVG4WG//MoYbHvqcMfPQ24nsEQklXM4wzQF/Wt9/96fnocg8fgzdqO9Qg8u/4AhX/RsT5
sChbbsYYD8QW+ylOzmPGURDpeUTSIumhoPHSLKeFCdFCE9BC03XRqhkhtoMN3nVCTvpFa/18
oDv8SDD0jbVXAHS++ISTClfywOyoDi1VutulKiyFgtr9Tt38VO7eYSO+xmbXmVd5qcTK8iyD
wcxdMcz1d+U1+ue//vv7v/zr+u9/ff/D+odvv//he3hf59UAKvHJAIbcGoM3u9VmcyIKjImH
L8PLXq43Sh2Hs3YUj6pyUNxRXOi6o2xbp4r+2iNtfuDr1fDr7SW0nn/93Xff8yDX33z1/bfz
1wE4y8x/BzIbDHFQokcz+2+6B5HmaKIAAA==
_ATEOF


cat >left.gz.b64 <<'_ATEOF'
H4sIAOYMGEICA+09a2/kNpLf+1cwXsyM2tPTyS4W+8Ee+y7JZRcD5JIFktwDuaAhS7Jbtlrq
1cMeJ/F/v3rwUaSofngmuTvgAmTcEskiWSzWi8XSp5+qrNk+tuXNulfJl3P1p88++7O6adPH
vKnVuknbQr3Vj/+8ba6a98us2VzOPv1UpVWlqF2n2qIr2vsiX+L7qsyKuity1TeqXxdqO1zB
KzXUedHSi75oN51qrunhb9/8oP72969Vcnmh/jTH9l1RUMl1WRXqy2///p/vvvmbum5alRd9
WlbdbPaHss6qIYeRZVn/uC0u5Zuuz6vySr4qm65vi3Qj323SrXz8x1AMHpiu6L3HMYSuT7M7
/0Vb1jdexzDTtG9a+e56qLO+bOq0upQTuWpgkJ9WxfsyS6tVlnb9cr31hsg18sc63ZTZ6qrs
YYjxOt0aVi1fbfuWy12Fk6u0g8Zls1yvT8TrbJ3WN8WKIPoFTQ3zrPsueF8Pm6IFSPdNll4F
ZW1xX3Yww+B1l9Zl/xi87Nu07mBtN2EHQxm8cD3N7psyV6YXHPTZWbYusrsVdFEkc0WDnv0y
U+pd8kk9VNWqzJO6eFhtYAjXRdfP5+czKDWP8H6rrtv0ZlPU/TkUILElRQ4YgRIAjvBWZjFV
qS4UFnbLq+KmrJP5Obz6xLwr6hzfvH5dzgGSUr/Qv0o5FPP41EuVdRrSigu7pJyfm+rdUs7J
vC6vVfLJTdVcAZFohLZFlb4v8rmu4XrE/2A7IQJUUzmMdTCATaEeyn7tCg0uOtFYYI9GCfVW
BggMda5+/VWNKhhAWMEOW6kn/YtQ63BxdpYXVZ9G8XwL2AE0UAWB61vEtXtv8X0bx4Bc5FEX
d9CFWfjldQmgeDjw2D6utmm/Tm7lLHgBoJVoRgOYiyrKlZXAB9s+AZZ0drZJ7woAWbaxPhZe
+z3/yfY5YPp27o+xqLrCg/dLAP0QKrJtx/1HxvouGQ8KsWSxzwVAKHf+WH3qCJ/419PsaTbz
97t8SuSD3VwNiJB2TlyAfo62k2QIQAZcSb7ESrSnbSk9nYejsV0GY2y2TGUXv/sAFez1fmhr
ddqvSx4wCtbv2zSDyvAKRvWorkB+qVd5se3Xr1RV3APZAOU2G/UqW5ewk8v81UKBJB9QrIFE
TnsEwq1RSqmyRs6dojRTZUcTg0JYaeItZa2wd9UNV6A/bNekG3wPcp2gq80As7oqFFUrVJ72
KQinArQKELT5I9bGBidfWqgnKhvaFn5Uj2pTgNygMamHAvnZtoG2lokBlAbGDHOCeeIWU0lz
TTpL/QhTrW/69Zxboy5S1mkPeMEnM7wF1MyJWRVptlZNje9hebgRQuwQHD1162aACV2x1tKl
G5rUdZr1CrUn85JBcqfYTVplQwUd5wiIOSKoPjD2LK0RWLrdVqXTojwmjS8zwFPP4IEoEIgp
Nrj75osz9e9r1KJoIYzmodYprEpDw7xP2xLFO4647BUqFdU1jFRVTY8aGrxASNuhJQQDlFtc
N+i+eF+0WUkLVtEgPGBdmRdC5C2zbKnUdw3CAkXyVQ8EumnucWAE1jaFWsnnHTKox2aAeRU5
YCCtibqhTdqBWrFczkkFmLkNs9I07XYaaAhWzGpqjvLYEqiVtkC01FLlS5Vf8V79OvlrcvJv
oPxcP+K2MB2qFx3jFUZjd1gCeCLg6kU5/6/6hLnrCzsi+EnFrI6gJpsX14qUuLMzp8W9dYi8
VPp1Rtsc0JmkNWxq6G4hVQzax6aEqAW7xP61LNq+FahaOKiXGgpSIvYg1SQY8GZlxo6F+dXy
puitTuBkv0W5aEA8zVO5dJmAZAG4ZhYEI4mGD4OTw7/E6dZ9WbSkvOnfRvh6/dOEHmhPJIT6
N2/UpfrMV9XifdTF+34lOxKikLSaaLOo9miHaJQaSXukS9oarN7IcqtZhpLdo33mlPjzQp2W
57FqJIy4niwPFjVxoBamujcg4qo5W3oplnavOp9TYVFMvxQtHem+sk00NPPo6FKA2K2pkwbJ
Q176Gnu42Vmp9KqOMc/Yv53v1K3kKjS8y7WS76nPtyPQ/jYbN7V7Y9xUbHys2Tcrs2gaaaGd
MQZBKqFR5rnz+VgZ9PaA2WCN3F6TWiLxza/eg/FaI98EdvnmEv5FrghssDH8UOzWAABQy9WA
moNPL+NaMJXgpeVuFj3Ui8bGagvosVXQUBTgo4iSu+vCDXmErtPJ7uLLFPY1UuRjBOdP0EAc
93oeVdvdrmL7x01tTlvCFbOdE4My3afyIIQdvLnsCtixeRRmU2eg3qBmtnKr0SVxxB1jPp1O
D/coMPG1jRo3YxoFpXWd3hcBLZ+runlYoJYFuhjqnA/Fq3vUCgvUCIHXFf8Uo8YAw3o/Rpfv
IGqC8b27JnWwW+AIa4W2KyjyWpsl9VelN20Baimp73EgtvdllPROJwZuyAL31jFYfube4dmC
irlgNbnstPexRUW33HirgDWWcSDfNQqVrYIQV2uhtyUJhWo+qq/XBRBeVpzF6N3hIu40aLQ2
NIGQ6MbUAlZYLjC2h6a9685mkeqeckYqfwvmyUqoaZEO0KIjL5LVhFENLjbb/tECXKDKBWYU
ozYOBzTfdKiipHKYbBK6i1AjDdpG04kiDG2uR8Fvkgn6OxTeu2RUj7wik012O0KccguMNaKP
oqNEC18yKrWJifK2AtsJfQ+bDayQMQyI2FP0J5UZ25JQlex0/B9oBZ0IIDSH3pnaaQ1bBUiq
QcONbNtyswV1+iTawwkCwi2gLUhy+6dgvrc3YBBfFVk6dLxjOgXlXXlF1irbyLCXyIB+ILux
+McApuYjWoGwDlgvnI2xsBFW2+QDOjvSzVV5M5RAjLwnyU7G3pc0+LbogOgUWAFQnBJna6rm
htwbGRp+WAJWHRgM5HdIswysBkQosGc+rCA7ucjBUtaGRV52WdrmWElbrsjXe7CY0wxhPOD0
0Lx9AItXpQjlvmhp6wDb69sG7OmG/gFb2djyKZmzRXsPy3lPzoG2eV8658sDr8+rCscN/6Tq
xDheYJIo8mA8tBpff/k52Ow3TVv2683S8jx0CBCQqgReXzUZ0w0iyVvZvCF/SdMirLrJcRmB
PnCC/wA8A155NWGuvF7kMEjVPezJqkqp+65I22y9AIwgNq0jBZ0zxHBp7V8haQLp3IGJK71O
tHowwOau47HqWmjyIqhmAGoDfG6LDFG1IIaHU0F/1wMsjPZy0RZskac3xtSY49hBkULK4VEV
DBuqpAYBXFfdlym864AqkaUjDSCbfkCPCOG7w2XCpWBIjfataDmOBJoVBRKJXoKHEletekgf
6TitqVA7GHWLsNhx3zjSXqihroqOtIZr7BFGw4drbcNuHPxtnXAIY0DXXT+gegVLRNt4RC2O
Sog4cGU6ddMUaJE10BFRADkRYe8YlwfsF/KagaKPXKG81hsZKaKGbnnQzUBbdJveINuxKwca
z1UL23lNM+e9QxqIgqmXrRjkFkbJ6GONxMJqarNwUKPclrhUGiYMARhdXqC7o8Q104Sq+YHG
DJKP1hDV+nGLY+iMVqBdd6e0k09xR8K2xw0IG69lmsQRAQIWtFCoOuUNodKwPK1d8JbC7aNF
o95WyCBr5Kl5odfNMixiboxG69jRS8vO39nMeJCGuitv6iJX5AXN+vfns8C55B8jvr1U8AOk
/qiecEJxDeuAMg1mXQ+cIlN0KDcjdzFqLLSfVlWTAr4TGIF2q04o2NYpBTUXfg+X6qXZnlOt
yxrUq7posTVW5+ep2sA6VzhmdOrBb/bqoYqhe9FmCglo1KHNa6FAs3edLFQya3GauMrGY4E7
gNb2Ra7t270erHKzMVhDWQ4DW4beNV0sfZwJT3WJlDds9aDnCwmNO40qakBMyLZTw9JCOY2I
wGkxB5ppfVIL2+Vst9vLOmHQCBTjGblgtohkWcGe6G19txyukdECT7dCA/QatyC1E2MgPI19
Eh5xIdl3zvrnl+QB0D8N2K78uUj0MdvsKH/fR5s+bqJtjdB4zflPsn1zWdZA/MlcWOdElXpV
2dPik+PpFv7Z1t6xMsC+vCCEgAHG03V+FH4NcgkLtvXrP9qmugHoyhbek3G0minFLRp90IIA
cORPlpVcofYzK95vgeOtrL7RJc/nEntauj5ijQ9nL1HWQrMhAYratbYh0LMHororzg1HuAd1
pdF94GJ1tG/p11KH1yRunIYgzebepiD+/4hmCZ7ngz5mTmVo3ethcwUakRZTNySRQMJ2eNJE
ygdpXWnbDHXuUfcEykZEXsB0xODsWb3BUYFELipYGi+Yxnma26Fbr1ChSIo3l2R/m/1mZvgn
UHW2OSIYdUUt/Sxc1BLasui0neLNRKB3NHrcVDyC0cBrHDiX2THXwWlBjKG4uf54Wv8k9grW
6dJ7EIqnRPhyB8q9p95eqNN6Ht+Ap7V6rWJb8NRtaf0nLpBP64XdLoaeiWLPo5OyskdZcSin
5c+OwHUFHTV6UwqHRhuD3SwXqm+H4lyepvg6jOZlF+qzc8+5q9/jIpkxmu6IhdKr+HEJeRVk
sx49BrqF715As6yscYBBe0HSpDXo1mjjh9TuQxSlcebIkBbqmLgQNS3H5kGIiL++2zHVcv8/
jWbs0eglt7QL7A1265FsQAgB1G0AdhqqL4h2Q2UWsjsSRhArIAD0Cm9X2mMmTaWWZcc9NiOf
owf+ZQy+dQ5rfqB+vfBaSf5ANZDWiYG4icWEi9tPTy4cZFSRQ0NiYtfqec+XunsaOrfN7Pki
97eWuE7d/d8ncN3Y4vLWlX9UcWuNz48nbZ8rZe0Mf38h+zuKVw6ZRO1fCMH/YcEXYjHsb8yq
ebwSo4H1kOrIgqAnR8WhhA3o2+/cFWr5+gGi9QOlqqPS/+tCVciomCT7zSWVJ6iQHFZOVEJV
5CCJRv5Ldd3tWGNbq6vz6Vq+GDLxZGZDT7WSESAk5lgqaS8TDGtplwR6X8oFwWe9DK4e4RhV
C2rvmkB7UYna47NuL0Brrh7Rz1Em0pw6PoXHDmT5Evi+gf2L9C1co+RSL3IlF4BZuHYxeGAy
qN4LC8CytJK5Wane+g0cJyunmZjXotcx5zvVPVgM6HDagVaOz1E1QUr7ZCpK2VbWesYTncIp
4SCl53zYbLXjFU9atR+JLo9YGlvn7EKOK1RqrCIoR5+bDV2jgckzAFow7BQ7+PFF95NKYOG0
9J7r5YIO4d/NxtEMN/ZVk2jH0RA3gGQ9XWIeFNwGZfKWhCn+RVS0Y6YBnyGlyXAhHm2p1Rb4
mZwmpYkbmM9Fn0/0C1ZCMA32Z1oVdwVzXJGLPRo+WhXX/d7AkFhDuht1VEviFntbxB3YHqvi
p/PZXpqZOSOajk/tSaozBTX3wN1ajd2PiJ2l74DEmu24JqEjqDryx1a8Q3dI3PNRm/YZbSqY
39H9HNBmtlPzqEBq4AwZ+o6KKF5aW3HsLAhAQoX9NQmmrWmOLvgoVp9ahSfqCyL+ixcd0/KF
3X/4Gv7QWwNOR9WO7McYdUmdWP36q6P4sdPXNhdOWq99RDoF02C7C7Wvixf5At7iHwAHf37S
E5r5DiVj7kFJaAFizHbcDevcDlHF5BRXfqFOcQ3EDHCRoxJOyFntvF94B3+8Bh0dC+oRUUA6
3eTklfI4CU0ltnY7Jd1T4E40asjUJFueZPWRJmlmE85ST35ykrod1Tt0kk9WaIQS+sQSwYkg
YyFlRg0ciZxIyt3VRFPeiTUd5+cxjYIEGcsxOkQOpdnzZNjz5Ndxsusjyq0JsUXb8DcQVL+b
mPoNxEec0UeDtQ5l9x/A7CPMOjqUGMvWvPpwVn0cW6Y/H5ct/ya8+GOyqUN5DgD467v/+Nev
zth76QKDMDKmzoCgy6sKQ+yK6+syw6AbsOnwKse3ST3HOJi2ULUJ/8SoOVgf40/UoT02KkHH
KUljf1Z2u/mbVeXDW16xymCjZmB/6Dsts7GFNVR9Oboh5UVrGFA0VmRkk3Ed+LMvcsvSKNGA
X4VeEanSL/LLJmJG3o77hOtQfG1omU9eAOI2FCvqIg90Z8028feJf7nBQ5Yj4gh9eocfcseY
kKIDkTsyJ2+860sEBbnc25tyAWWXLpDvQtMORYquWvQbyesG5+G9oZuSTFXTfknGpL7Mb1/q
Kwq+J2LqUrVebXZVOoMUEWmKjojDF+TgYMXCjA1sLQh2VX46zocBip+2nX+3PRhVE1itxzh2
lGDAUOhC6IsuEhBnpZYYEF20lITsIrEO2O1EVVNRWdxL+5gwLxD8UyJMIieYvDINxVEcB9Ol
eW64dd+shhoP1H2domsnVC6/Wo7HoCbMDR6EUxgg+D5heqF9iKLq3LgHRQNoLmtQc3phXJAC
NjY/hUL0HZ9CQWS69ka00ycwvn2zIgQlx0X57aS+si73O2bi/Nxp1Ddptf8M4VkC5VCwk16d
3YeruyjlpeqbHpgnERvTzMdh39rJmWZ3vH5df6f34J3mcJ4OjiskVHBfBFKjqAREjX6ggD6o
0bNoG5MB/E7Wxfuizt7CgAMX8NDNheLoSRsUNu6kbixrAK47LkR3I05MHjzP7G0X9lu6a1V4
emxA452HHK8XjEWVC1F1ksqqwTFBJcWKd4QYoNtIjOU4lvADD+JCwWYX3B74+eUWZ2OPO2C1
LdK7aTf8TN4BfSgMrLR+pLMkfAXj3OItu6W5LIF5ECiInS9pUcw2rIYDJa8im6VZyrhJ6sRN
enRmGhxdH2AD/s8uu39DGy+44Om/BmEvcmFEOwY5GDWe0ntVj+ycAd6o/Lu5iCl6P9KNYC5c
cADx0GHpvnNnIpR9B8+6knfyPHlpE28f1dF9ygf+iNbGD46A1fQyKU3snnGYxmgBiBUj8A13
gxcUfOhHHs/cerEjcjjn3pBv46MTmlpEP7k1C7tQV7Ewp1ibq4UndUyrkYMjCJEbOuzDxVQg
Y3Es/0kfv33vpT7ha0N418jc3LJZsUTKF502pmzV5wv1Bd8c4+w32Kgb8IIKXgb5PKJ+frHA
eyUUht6pz5ecrWxGz2FQ1Ui5eOmNJqYHf0RhfIzie2iDssabbMVKNzxcZZbcjgWrn1tNC9sg
t5rX3QSVlI4gzXmh3mPPPDLzvY1+6XAAcz8yV4iliNHNAUKMKx4lnvMc9wcp1wt1Wi4kDR4W
IuMtg+f6G+xmnHSQ9Jvt+e+JFaEpkm9kJBHHGhDpcuvUmXOrkrOnXCCIt2qwEunlS3zgUITc
T9oXae/EFiDBkO9pKW5RzJTI2nfBuGK2ZpJplXmR8o3AsWcOhMVDWt2J645q2PLVOu3wRSj2
tmL1uMD7rcPG3Bk2IY0i/4JKu67JSkxbRb3SPWFE3abI8S2HgLCgOqX7fOWNaH9qbtllmG+M
MjrlFCdZ0r2ktEK/oLmRCoy1gUoVsBAYzZtuuNq2zVUFchC5ILsR+4FvwPLFX1D9MWUUzfyu
KLZ4t5kvuuENQSDPzQbnhTtV1+B7znQxE7h8VdZFSqegW8zE2dssZDqf1wI1SALcPzRnnKGB
9CGAyDm5oOWAuOF7xR1dKutLzOiJ2JvP9I1815JuxyLIzokkxDvjEbrr25R2F8WOGAcTua67
+VJfasaLlyX60HUeMgSPkyS6ADQW7wGKDovth+yOL1tyajNKzMd3eN/RBXCdKeCBgJGFgvLs
HtRiumOKS4a3r5fk4OU8sJSxja//quGmYrT50VqO/whqWlna2+lR2p+WYzLt1/6mgZjd30Ak
24FO9G65L2iF97eOp9/anfJLh1k7Ojqwm4h+4dHPc8EYDJvbuNoBLo1EmxdHXpjUJp1xJJm8
gPK+JTSz70cXLoUZ7c3Dy/TFQpaIri2Ay6SUJYYSL4j2XhIseJjw7pk7amzZGz9k8X5bNRyu
ZbN2MJM1pgG5IReYMuSOQ7/53rl2TcoscMJPadWD3alnYSzLWPpZ935K5vlIsTahd6khPENw
1WIpYEcHB7q6syd9P03UPpaZcbVdIEDZajqyg1ILtu62LTqBpddXDtq7d/vs3Rc1oOQppNuY
LsXRKjCpEEG32m4X9ZnG1VTu3jTIJUC5VaxE0KkueK46rwBKF0yThUZ7YMG+LzsS69jzkgVP
WwydzrcBU1tTfm6QF23xRncC9aUrYbw8mF7OGX3BGWZIafHQEhtT4m/qESoRe36VwGPwbOSx
+ONEBQ8p3or2IVEGUdrgZW/S0WFqBdjhMlUdnYa2ZtpL1d2V2+VOhAT3iZ5iR2njVvtkqcgI
6dBHBuWx98l8wTde/Q+Cd6RIm/7vSKG2Q9wZgebxtWABdoQFyGSgZWdXbqET1JILElUyZKVI
R1IeuNCAOAfbnxotuj5BevFFqLHEd6wRmKEPNvC/Ruk1uHtOvNmkGjAd7OTV1mBEDZ8yaukt
htTCuPPTm765NEl7aTtimqtr9FmyD51MHMPPMHkJ7ntegXXxiD5gYoXXRZ/pTS66W5FEZSgZ
qMvk+fWIQmg5Pmvfeen9YCLdKZsOhhIkNUxCInCZDbSm5U/PGJ2cRhj4Mhg2V49EDXm/fsOH
GRxgNOdkMmzIsBHz2AyviPtSRhtKjIJWKdp2aL/s4WboG5SJH3kn9cXMSzDnUrc1mBvmHilK
J4HREsBZxrTGfCfvIX2MJbEhgxKT6oCt9KhuBrR7KMEP6TbesSVH4hnGQaHkdogrRskH2jYf
Zt48x8LZYT9Ilf/ZyXg5OM6o+aMSc8zncuDGjvoOSdL7u+boPSAxrzA2xOKMjA7thPO6JK6a
5l6aGWateK9U49Jk9yi9pn7Yy+5suRHj4nbCuDgiD+4+QyKejtbkepE64Pikx5kTcVlu6Sui
lIc5Xe0Y3bnHYZE6IijwEKskWCA/qOqZqS3HBKKJA7eEpdXxcCIjiWb5nW7ynCyFszDkwzFN
IaY+iHE+n2keyzB9jxB/iyCXcUsiD6OdpxNeYLr1D5hcVEeNinhR5xzw9KPDQg1HFcyWOJ89
1w+lNRzi7PvlnsxMz99UQAtEKNnqGFNGgDA4XpgBHaRQafx4I9DBrd/1wzUeBdL3GHDTtAWp
HCa/XBCcqn4I0udphzW701FJrZvhBvT8tsVLNamxsR8K8k/DALaYFBTmkVOCQTArl6Pgrzqt
Hn8ubC5Tq8QfTp0yo7jZAfvttlirvVqrvwU6Jv4g2b/p2uaTnQWpXT0eLwSjTefqIMjb4uIz
RToBWuDN8z9LEHxQgPkmIZvPBvQHV0zmdP4iyovuFZoZ+Fez0JiLiVSMnR8coquRxkk2StvA
tyNN8ZQbb2cHt8qml2UPSvAFHvrekLjmyn4pl5M29Knwh5YK2KD4ObZ90Kwr5xOVjD/9U058
Egi/XxQPXemWnJGXPi400fkhG0AM4SDSl0MT5q5UqJ6OWG/G7NRyC7w/b7U1vRy53JLKvPXG
EI0dix3HdwzVMhIDmFs74Bdx6ozPiYlD2KeEfNPGRRkEP8zVGePMlOs25lEPCdokqVnfTfqe
73d8Zt7U7B9KTujPyUKd1PDPH3XjepWBltOtYIVO6BfYg1gn8+qAHOhWzdCTq4cSI2OdNgKH
KjEgXetLqgWVftEnu96UVzLIWPJ3fDX85c92QvypmDK7A/VKT+lcvjHT8F6acUdq0lupEEBn
CyEDODcO+pX0Ryg87UFUXEDDS6UrYX07Wg+0b64J0NowiiomFjS8PBI0fjDLA22iWLCFiO9E
bKxq+k4T/bxPq6FAnYfQNNGcxmXCWbQHhcQ37iEagY11wTXU8gd/GgHmmjy0pP1ib2xt6s8c
kiLi4LgiFG3Uh5VvCJhTMksh/hKf5oaO7MhQZfO+KxIT/DtbWvstensQDdgol51FdHPkDS5A
iAJTxphDfQ1WnW0HyzrOzg5FttPI64YDHHR9GSHBmQaMdPfyt1qpL+7ftY+7HX1Gpzm3Ro8Y
+HEr6FwusW0aFT3B1mURgS9pBu+S0iRekpVcoB88YYyL+05HZA4e2fpeIbulYBPhH9pF/Mta
laZKwkmaV/aFvqI5UTtPdacH1E2Hfo3myWG1+/Tm0KqsIlbN4Q2azYa+WnLgUJC+KJDEbzEZ
B3ggSxuRSlbab2P5+T5CrrqTyDSnjUdkhZWm1J0wTl/eZRrF5GflIisvFUXf47kYEqEXkV/K
xGZjb2BWstML65rganZ30RsXWj3xbVGLYEXrZY9Bl2GnSiyAgn9F1XB21h/FRME7FheeQir4
ZSRSOpqpCzulz0jij3Pvo6jApvjDDVSGHNyc2S8Uk8w9mtVkbhsI89hnxIjKYA0ITLQm2wPa
HrPrSwgh7adLqPGe0O/Xrz2NZeSxQeDbQQgRntdoNJ6/yiMKejIsbiZY3FgGE5/7Ox/5WUfB
i9xLgGQUNuqdZ0NfO04pEnl1M6QtyHD8N+Hh62Eiunyt0CBGz1LbY7YOKXd4DVvoDnpKlhWT
omIvZ5vLjQu1LtJcf3ZK7PyRjhPd91YAjj3kpQsdh/Kxf9wtrr1n6e4uhpsnyCI9vt3IC4qn
n3l5rb+xk1jAenRu1jyeqBkTJOle+Mnfo00IYzw02D2ET41WA8WG9Ltb1PqToXlDX1/Z2jM0
fUqZVgpjERYKL8KbTGj0sYuFAQQ99tAJOpmvCv4QpfaZLWfj047JNfQGGi4gF+5cvX26m/B0
8yqNtFzFewC/Kr8p9fVkshhJ5YwoeQfrreYL4MFmMuos3d7H7GPaDRVYLtacJsYbFgoObLCh
4Zlt//q1mThyLmunWVe9Th6gnEPEnRZwmVW+8b9wAHGlE2osqLWz+EPtLt7Q6pyjLM1Aa3jJ
hYWrlMA6x6cdvhYEl2pjLaYJP55efhosV3YOJLoncdXcDJ2pRX90+sxQhCc7RxL3xrCWEDnV
Y3eMViL2HOnZzz4UOTsHnd8QZa77AIRNh2cDy5ekMPAiT6kIvXdGmBfoKF7hh2j/8mcRor6k
yguo7cFxkrKsQ/jdzvU/MJ5gfMNCTo3GM/70+9NMHFwFeyYg7h/h90+jlJBs8x/AGPaapZox
RPiCcCVjxZ28QrgimFdgC8MrZOEH8YrZ2CmvfTATp8eOL8KbhcdD4uxHBi3tYEZQLcKS5Dzj
lEWjmGZJrHhOk6RdhmfyskO5WKDOaoW224Vo5k80v3YfF2sP52LhSOJBwLu5WPtMLmZp4f+5
2PO4mNgPP8Lvn0Q0W8jGgpw6FC9ogpXevFF0V15/PfymbR7w6o1zWPF7qIYHxnh7hq50gO54
XTUPHIJF7fHKY4ofj9IfUAPjcSbYorRyjvDDOUcafcas60zy1+gHjyiWIzD/g28sRb0DkVxR
hmuZKye6ezrUvSvpnlDQv5euZsco/G/R0oJ5eiV9/1Fz3rHbTjv7bK355CUD7Ba7t3z2QsLe
7dmJavGZu9EZ84k4I0wmxbHIoVBG5/5A8SV9HzuWgK6A0/fl8M0E1p38JbHalvYrohK5VLZx
ZbujEEafaBY39XYdmi9sP2KhFuo06+SAdZTTBH/Rk1g8j8WI/rv5XFzzG3EU450qQ+9UGfNO
TXD3d4n94GjEqlbCMz6RMSjc4S709ihX+cQn6rlc0oR3Q4Mofpfv0VuD24gf0r/ZHjikbvew
Hd8jgKOEHm5jX6weRWOFnisPxF4uOxGVFQ5191djXJfzXXkNZKh2VCEMYx0E3PNRcKHc0rqi
UFXJ0h8xzmDAUr38ME6wnxu4Lif5wSE8waHkmJsHcSA8ls7XO5RUIYRznPeNC6AqMaGUVkf1
5ePDiMbccWNiMUE5ob+WXbUgLezHlz2xAFsW5JalIgqhCsnIcIZW3I2OeG6xCz8AFnVBeYQ9
wTU5z6XWA6yOYO89jQfkBiI1NMSscwSrGTt/3VU/3rCe+zWJJmu4qZorkLkdkF//uOzIdqjS
90We4L0Kc4jI+hdHllGB+VRIxMXsx6ExL7bzsyHA82NSNoQBCPtyNkSs5ojn+PCMFCjifJjx
A6SgztT5kRdQ5hI+RAWkE4ArrcIz7GmPwqQcZQZyOJSItA1aWYQ70As52ohpspPk6KoZNeKO
YoEFT7PdNG8ZqW0UpfuQqKnrI6na86d1PlVPeh51Lolpl6M7W7W5Uk/mC2zHH9kY2e1QIgY+
+sDRYS5HzO4QpWksmExQEbOjj7ChR9aLoZ7zmTh54eN9A4VEiCm38foiVVp/LxMUHbx/AnFv
x3jozvHtLNv8eTtGR1/t3gV4wvJpg9kSrq8xds19ocOpbWVVaFoy704QN3REu02zQtFmcI/d
46azR4Hjj354LOJEPp3okY/bSEsSTDPxNN3GQ+iJfDpxhy+aDWyhXU934BKguTJblQ2YmS1l
/MBgYv7lKT50u4OCAK3PtQC24A5aHSBgHPXPKQyRdzZ/kAyojdUSRNfZmcTDInJ1pJgHKet2
wDHzFHAsIkZw9NyWjAIeaqI5P78TeqdBhH/dEl2eaoRNO/RDMTq6QjTyZaNuR8lRkfEXzGVi
aFbT+JG0sxh5KY7ADfHIyTtGZELGrhnNBPlMXDjCR33R0pGlxfwpFUsZBlsfuHlIvPiy5UD4
Lka6nAWz6OynBJ9hgEjeK6ImpfoeRjzqLaolGH87ucO7ZbA8ka3Ay8BVYCUTI8F0neAjR6Z0
EqwZ8C6wHAwmpjYC6+0IRq82p1C2ThlQesgLFXkvDaJwYWP7aMfijnZRsH+Y2LKqSNtkPrEs
Y+TJTTKFvIjLL4ZFfe1RAwDw29i625vGhrQNou0cbJ8+R7DmDFpFK4kJDKZLXWbmNJrFZgp1
HP7AaMJotRQzT3UIUu8FtzpljVZe1wwtCsM2S6AiRk97Us5V75u7oi5/xpwUzR3mEg7K9WLj
nwRqOOw7ysBHZ0m+QyCU5jXFyAb0i3317V+PR5d9+BC8UduhBsXgjq9s8W9EnAvEMuV6jOFA
TLGb4uQ8Zhx3EZ9HIFOifgwaL81yWuQQLTQeLTRdF6yaFnVb2OBdJ6SpW7TWzQe6w88SQ99Y
ewlAk/lHnJS/kntmR3VoqeLdLlRuKBSU87fq5udy+xYb8cU5s868ygslVpZn6Q0mscUw1z+U
13gi8MUP777+l9UP37z7fvX9V999/x28r7NqAMX5ZABzb4Xhot1yvT4RBdoQxJf+9TLbGyWr
w1lbikeF2ivuKBJ11VF+r1NFf80hOj/whW749eYSWidffPvtdzzI1Zeff/dV8tIDZ5j5H0Cy
g7kOqvZoZv8NiqQjkZaiAAA=
_ATEOF


cat >right.gz.b64 <<'_ATEOF'
H4sIAPcMGEICA+19a2/kNrLo9/4VjBcz0+30dLKLxflgj31vkpNdDLBns0Cy54G9QUOWaLds
tdSrhz1O4v9+6sFHkaK6255Jzr3ADZBxSyKLZLFYLxaLX3yh8mb32JY3m17Nv1moP3z55R/V
TZs9Fk2tNk3WavXOPP7vXXPVfFjlzfZy9sUXKqsqRfU61epOt/e6WOH7qsx13elC9Y3qN1rt
hit4pYa60C296HW77VRzTQ9//uvf1Z//9hc1v7xQf1hg/U5r+nJdVlp9893f/uv9X/+srptW
FbrPyqqbzX5X1nk1FNCzPO8fd/pSvun6oiqv5Kuy6fpWZ1v5bpvt5OM/Bz0EYDrdB49jCF2f
5Xfhi7asb4KGYaRZ37Ty3fVQ533Z1Fl1KQdy1UAnv6j0hzLPqnWedf1qswu6yCWKxzrblvn6
quyhi+ky3QZmrVjv+pa/+wInV1kHlctmtdmciNf5Jqtv9Joghh+aGsZZ9130vh62ugVI902e
XUXfWn1fdjDC6HWX1WX/GL3s26zuYG63cQNDGb3wLc3um7JQthXs9NlZvtH53Rqa0POFok7P
fp4p9X7+WT1U1bos5rV+WG+hC9e66xeL8xl8tY/wfqeu2+xmq+v+HD4gsc11ARiBLwAc4a3t
ZKpSXSj82K2u9E1Zzxfn8Ooz+07XBb75/PNyAZCU+pn+VcqjmPunXqu8M5DW/LGbl4tzW7xb
yTHZ1+W1mn92UzVXQCQGoa2usg+6WJgSvkX8D5YTIkA1lcdYBx3YavVQ9hv/0eKiE5UF9qiX
UG5tgUBXF+qXX9SogAWEBVy3lXoyvwi1HhdnZ4Wu+iyJ51vADqCBCghc3yKu/XuH79s0BuQk
j5q4gybsxK+uSwDF3YHH9nG9y/rN/FaOgicAaolq1IGFKKL8txL4YNvPgSWdnW2zOw0gyzbV
xjKof+A/Wb8ATN8uwj7qqtMBvJ8j6MdQkas7bj/R1/fzcacQSw77/AEI5S7sa0gd8RP/epo9
zWbhepdPc/ngFlcDIqRdEBegn6PlJBkCkAEXki+xEK1p95WezuPeuCajPjY7prKL37yDCtZ6
P7S1Ou03JXcYBesPbZZDYXgFvXpUVyC/1JtC7/rNG1XpeyAboNxmq97kmxJWclm8WSqQ5AOK
NZDIWY9AuDZKKVXWyLkzlGaq7Ghg8BFmmnhLWStsXXXDFegPuw3pBj+AXCfoajvAqK60omJa
FVmfgXDSoFWAoC0esTRWOPnGQT1R+dC28KN6VFsNcoP6pB408rNdA3UdEwMoDfQZxgTjxCWm
5s016Sz1Iwy1vuk3C66NukhZZz3gBZ9s95ZQsiBmpbN8o5oa38P0cCWE2CE4euo2zQADumKt
pcu2NKjrLO8Vak/2JYPkRrGZrMqHChouEBBzRFB9oO95ViOwbLerSq9FBUwaX+aAp57BA1Eg
EPvZ4u6vX5+p/9igFkUTYTUPtclgVhrq5n3Wlijescdlr1CpqK6hp6pqetTQ4AVC2g0tIRig
3OK8QfP6g27zkiasok4EwLqy0ELkrfJ8pdT3DcICRfJNDwS6be6xYwTWVYVS8686ZFCPzQDj
0gVgIKuJuqFO1oFasVotSAWY+QWzNjTtVxpoCE7MGmpO8tgSqJWWQPKro8rXqrjitfqX+Z/m
J/8Oys/1Iy4L26B61TFeoTduhc0BTwRcvSoX/6c+Ye76yvUIftJnVkdQky30tSIl7uzMa3Hv
PCIvlXmd0zIHdM6zGhY1NLeUKgatY/uFqAWbxPaNLNq9E6haeqiXBgpSIrYg1STo8HZt+44f
i6vVje6dTuBlv0O5qEA8LVC5zDcByQHw1RwIRhJ1Hzonu3+Jw637UrekvJnfVvgG7dOAHmhN
zAn1b9+qS/VlqKql26j1h34tGxKikLSaZLWk9ui6aJUaSXukS7oSrN7I706zjCV7QPvMKfHn
hTotz1PFSBhxOfk9mtS5B7W0xYMOEVct2NLL8Gv3pgs5FX5K6ZeipifdN66KgWYfPV0KEPs1
ddIgucurUGOPFzsrlUHRMeYZ+7eLvbqVnIWGV7lR8gP1+XYEOlxm46pubYyrioWPJftmbSfN
IC22M8YgSCW0yjw3vhgrg8EasAuskctrUkskvvntBzBea+SbwC7fXsK/yBWBDTaWH4rVGgEA
arkaUHMI6WVcCoYSvXTczaGHWjHYWO8APa4IGooCfBJRcnVd+C6P0HU62Vx6muK2Rop8iuDC
AVqI41bPk2q7X1Vs//ihLWhJ+M9s56SgTLepAghxA28vOw0rtkjCbOoc1BvUzNZ+Nrp5GnHP
MZ9Op7v7LDDpuU0aN2MaBaV1k93riJbPVd08LFHLAl0Mdc4H/eYetUKNGiHwOv2/UtQYYdis
x+T0HUVN0L/316QOdkvsYa3QdgVF3mizpP6q7KbVoJaS+p4G4lpfJUnvdKLjlixwbT0Hyy9c
OzxaUDGXrCaXnfE+tqjolttgFrDEKg3k+0ahsqUJcbURejuSUKjmo/p6rYHwcn2WonePi7TT
oDHa0ARCkgvTCFhhuUDfHpr2rjubJYpHyllTJVfmcZJCaBJCqWucStdUxVSX0UYkv5TTrVGx
1ttd/+i6uEQlDgwznqw0HNCls6FKEl8wUjJuWjDE1kIhjf9Da+xRcCIezHKKQI/iJKOGF2ke
PSpHnpXJKvudKV5BBuac0GnR2WIEOBmmxkxFmV2B/YX+i+0W5sQaF7RgMvRJlTnbo1CUbH38
H+gNHREgeIfem+tZDcsNyLJB44/s43K7A5X8JNnCCQLCZWSsUNo6yNRWtzdgVF/pPBs6XnWd
gu9deUUWL9vZsB7JCH8g21P/cwBz9REtSZgqLBePxlrpCKttigEdJtn2qrwZSiA/Xtdka2Pr
K+p8qzsgMwWWBHzOiDs2VXNDLpIcjUf8ApYhGB3ku8jyHCwPRCiweN7wIFtbF2BtG+OkKLs8
awssZKxflA09WN1ZjjAecHhoIj+A1awyhHKvW1oswDr7tgGbvKF/wN62/oCMTGLd3sN03pOD
oW0+lN6B88Dz86bCfsM/mTqxzhsYJIpN6A/Nxl+++Qrs/pumLfvNduX4JjoVCEhVgryompzp
BpEUzGzRkM+laRFW3RQ4jUAfOMB/Ap4BrzybMFaeL3I6ZOoelm1VZdR8p7M23ywBI4hN54xB
Bw8xbZr7N0iaQDp3YCZLzxXNHnSwueu4r6YUms0IqhmA2gCfO50jqpbENHEo6DN7gIkxnjJa
gi3KhcaaKwvsOyhjSDncK82woUhmEcBl1X2ZwbsOqBLFAtIAsvoH9KoQvjucJpwKhtQY/4zR
BZBAc62RSMwUPJQ4a9VD9khbck2FGsaoWYTFzv/Gk/ZSDXWlO9I8rrFF6A1v0LUNu4Lwt3Pk
IYwB3X/9gCoaTBEt4xG1eCoh4sCZ6dRNo9Gqa6AhogByRMLasW4TWC/keQNjAblCeW0WMlJE
Dc1yp5uBluguu0G242YOtKarFpbzhkbOa4e0GAVDL1vRyR30ktHHWo2D1dR24qBEuStxqgxM
6AIwukKjy6TEOTOEaviBwQySj9Ey1eZxh33orGZh3H+ntJJPcUXCsscFCAuvZZrEHgECljRR
qH4VDaHSsjyjofCSwuVjhKFZVsgga+SphTbz5hgWMTdGo3MOmallB/JsZr1QQ92VN7UuFHlS
8/7D+SxyUIVbke8uFfwAeToqJxxZXMI5sWyFWdcDp8gVbezNyOWMWg+tp3XVZIDvOfTAuGYn
RKtzbEHJZdjCpXptl+dU7bIGFa3WLdbG4vw8VRpY5xr7jI5B+M2eQVSMTCvG1CEBjXq4fS2U
cPbQk5VLpjEOE2fZej1wBdDcviqMjXzQC1ZutxZrKMuhY6vYQ2c+Sz/pnIe6QsobdqbTi6WE
xo0mVTMgJmTbmWVpsZxGROCwmAPNjE5qhO1qtt915hw5aEiK/ozcODtEsizgdgV3oWsP58jq
rqc7obcGlVuQ2nNrZDyN/RoBcSHZd96DwC/Ji2B+WrBd+ZOem6262bN8hp9s+LiIdjVC4znn
P/Pd28uyBuKfL4SFT1RpZpW9NSE5nu7gn10dbE0D7MsLQggYcTxc74vh1yCX8MOu/vz3rqqp
AFq1g/dknbV2SGmryGzWIADs+ZNjJVeo/cz0hx1wvLXTN7r5y7nEgZq+jVTl49lLkrXQaEiA
onZtzAz0DoKo7vS55Qj3oK40pg2crI7WLf1amRCdue+nJUi7uHcZiP/fL2H5YkwA6GN2Z4fm
vR62V6ARGTF1QxIJJGyHu1WkfJDWlbXNUBcBdU+gbETkGoYjOuf2+y2ONBK5KOBoXDON8zB3
Q7dZo0Ix128vyYa3682O8A+g6uwKRDDqikb6ObioJbSl7oydEoxEoHfUe1xU3INRx2vsOH9z
fa6jHYcUQ/Fj/cdp/aNYK1imy+5BKJ4S4csVKNeeenehTutFegGe1upzlVqCp35Jmz9pgXxa
L91ysfRMFHueHJSTPcqJQzmscHQErtO0XRkMKe4aLQx21Vyovh30udyRCXUYw8su1JfngYPY
vMdJsn20zRELpVfpLRfyhchqPfo5TI3QKYJmWVljB6P6gqRJazC10caPqT2EKL6mmSNDWqrn
xJaoaTm2iMJMwvndjamW2/9xNOKARi+5ppvgoLO7gGQjQoig7iKw01BDQbQfKrOQ/dE0glgB
AaBXBKvSbVUZKnUsO+2xGfktA/CvU/Cdg9nwA/XLRVBL8gcqgbRODMQPLCVc/Hp68iElo4Ic
XpISu07Pe7nUPVDRu21mLxe5v7bE9eru/30C1/ctLW/9908qbp3x+emk7UulrBvhby9kf0Px
ymGXqP0LIfg/LPhiLMbtjVk191diNLIeMhOdELXkqTiWsBF9h437j0a+foRo/Uip6qn0/3Wh
KmRUSpL96pIqEFRIDmsvKqEocpC5Qf5rdd3tmWNXqquL6VKhGLIxaXZBT9WSUSQk5lgqGS8T
dGvlpgRaX8kJwWczDb4c4RhVC6rvq0B9UYjq47OpL0Abrp7Qz1Em0pg63snHBuT3FfB9C/tn
6Vu4RsmlXhVKTgCzcONiCMDkULwXFoBjaSVzs1K9Cyt4TlZOM7GgRm/i1veqezAZ0OC0A60c
78UagpT2yVSksyts9Iwn2oVTwkFKz8Ww3RnHK+5hGj8SHUBxNLYp2IWcVqjUWEVQnj63WzqK
A4NnADRh2Cg28I9X3Y9qDhNnpPfCTBc0CP9ut55muHKomiQbTobJASTn6RLjoAA5+CZPWtjP
P4uCrs/U4TOkNBlyxL0tjdoCP+en89LGHiwWos0n+gUzIZgG+zOdiruGMa7JxZ4MQa30dX9w
SzhVkc5XPasmcYuDNdIO7IBV8dP57CDNzLwRTdunbifVm4KGe+BqrcbuR8TOKnRAYsl2XJLQ
ERUd+WMrXqF7JO75qE77gjoVjO/Z7RxRZ7ZX86hAauAIGfqegiheWldw7CyIQEKBwyUJpitp
ty54K9bsWsU76ksi/otXHdPyhVt/+Br+0FsLzkTmjuzHFHVJnVj98oun+LHT11UXTtqgfkI6
RcNguwu1r4tXxRLe4h8AB39+NAOahQ4la+7Bl9gCxLjvtBvWux2SiskpzvxSneIciBHgJCcl
nJCzxnm/DDb+eA462hY0PaKgdjoNyjMVcBIaSmru9kq6p8idaNWQqUG2PMjqEw3SjiYepRn8
5CBNPSp37CCfnNCIJfSJI4ITQcZCyowqeBI5kZS7r4qhvBNnOi7OUxoFCTKWY7SJHEuzl8mw
l8mv58muTyi3JsQWLcNfQVD9ZmLqVxAfaUafDNY6lt1/BLNPMOtkV1Is2/Dq41n189gy/fm0
bPlX4cWfkk0dy3MAwJ/e/+e/fXvG3ksfGISRMXUOBF1eVRhip6+vyxyDbsCmw+Mg383rBcbB
tFrVNuATo+Zgfqw/0YT2uKgEE6ckjf1Z2e3nb06Vj0+KpQqDjZqD/WHOxczGFtZQ9eXolFUQ
rWFBUV+RkU3GdeDPXheOpVGygrAIvSJSpV/kl52LEQUr7jMuQxG1sWU+eYiI61CsqI88MI01
u3m4TsIDEgGyPBEn6DPY/JArxoYUHYnckTl5ExyBIijI5d7dlEv4dukD+S4M7VCk6LpFv5E8
snAenz26KclUtfVXZEyahADupTnmEHoipg5mm9lmV6U3SBGR9tMzYvkFOXhYqTBjC9sIgn2F
n57nwwDFz9jOv9kaTKoJrNZjLDxKMGAodKj0VZcIiHNSS3SIDmtKQvaRWEesdqKqqagsbqV9
nDMvEPxTIkwiJxq8shXFVhwH02VFYbl136yHGjfUQ52iaydUrrBYgdugNswNHoRTGCCEPmF6
YXyIoujCugdFBaguS1B1emFdkAI2Vj+Fj+g7PoUPieG6U9Ven8D49u2aEDR/XpTfXuor6/Kw
YybNz71GfZNVh/cQXiRQjgU76dXZv7m6j1Jeq77pgXkSsTHNfBr2bZycWX7H89f1d2YN3hkO
F+jgOENCBQ9FIFVKSkDU6AcK6IMSPYu2MRnA7/lGf9B1/g46HLmAh24hFMdA2qCw8Tt1Y1kD
cP12IbobcWBy43nmzrew39IfzcLdYwsazzwUeLxgLKp8iKqXVE4NTgkqKVaCLcQI3VZirMax
hB+5ERcLNjfhbsMvPlhjcDb2uANWW53dTbvhZ/Ic6YO2sLL6kfaS8BX0c4cn9Vb2sATmUqAg
dj7oRTHbMBselDzObKdmJeMmqRE/6NGeabR1fYQN+D877eEpbzzggrv/BoQ7uoUR7RjkYNV4
ShFWPbJzBnijCs/3Iqbo/Ug3grHwhyOIhzZLD+07E6Ec2ng2hYKd58mDn3j6qE6uU97wR7Q2
YXAEzGaQjWli9YzDNEYTQKwYgW+5GTygEEJ/5vbMbRA7IrtzHnT5Nt07oakl9JNbO7FLdZUK
c0rVuVoGUsfWGjk4ohC5ocM2fEwFMhbP8p/M9tsPQfoUPjaEZ43syS2XWUukjTGpZ8pWfbVU
X/PJMc6gg5W6AQ+o4GGQrxLq59dLPFdCYeid+mrFGc9m9BwHVY2Ui9dBb1J68CcUxs9RfI+t
UNZ4kk2vTcXjVWbJ7ViwhvnZjLCN8rMFzU1QSekJ0u4XmjX2wi2z0NsYfh2OYO7PzDfiKGJ0
coAQ4z+PktcFjvujlOulOi2XkgaPC5EJpiFw/Q1uMU46SPrt7vy3xIrQFMk3MpKIYw2IdLlN
5s25dckZWC4QxDs1OIn0+jU+cChCESb+S9T3YguQYMn3tBSnKGZKZP67YFwxW7MJucpCZ3wi
cOyZA2HxkFV34rijGnZ8tM44fBGKO61YPS7xfOuwtWeGbUijyOGgsq5r8hJTX1GrdE4YUbfV
Bb7lEBAWVKd0nq+8EfVP7Sm7HHOWUVaoguIkSzqXlFXoF7QnUoGxNlCoAhYCvXnbDVe7trmq
QA4iF2Q3Yj/wCVg++AuqP6adopHfab3Ds8180A1PCAJ5brc4LlyppgSfc6aDmcDlq7LWGe2C
7jCbZ+8ymZmcYEvUIAlw/9CccZYH0ocAIuf1gpoD4obPFXd0qKwvMSsoYm8xM6f6fU06HYsg
Oy+SEO+MR2iubzNaXRQ7Yh1M5LruFitzqBkPXpboQze5zBA8DpLoAtCoPwAUExbbD/kdH7bk
9GiU3I/P8L6nA+Am28ADASMLBeXZPajFdMYUpwxPX6/Iwcu5ZCnrGx//VcNNxWgLo7U8/xHU
tHa0t9ejdPhA/mTqsMNVIzF7uIJI2AONmNVyr2mGD9dOp/DanzbMhFl7OjqymYR+EdDPS8FY
DNvTuMYBLo1El1tHHpg0Jp11JNncgvK8JVRz70cHLoUZHYwjyBbGQpaIrtXAZTLKNEOJF0T9
IJEWPEx49+wZNbbsrR9Sf9hVDYdrucwfzGStaUBuyCWmHbnj0G8+d25ckzKTnPBTOvVgf/pa
6MsqlcLWv5+SeSFSnE0YHGqI9xB8sVQa2dHGgSnu7cnQT5O0j2V2XWMXCFCumInsoPSErT9t
i05g6fWVnQ7O3b549SUNKLkL6RemT5O0jkwqRNCtsdtFeaZxNZX/N4tyCVA2FScRTKoLHqvJ
K4DSBVNtodEeWbAfyo7EOra8YsHT6qEz+TZgaBvK8Q3yotVvTSNQXroSxtODKeq80RftYcaU
lg4tcTEl4aIeoRKxFxaJPAYvRh6LP05U8JDhqegQEmUhpQVe9jalHaZWgBUu093Rbmhrh71S
3V25W+1FSHSe6Cm1lTaudUiWiqySHn1kUD73PFko+Maz/1HwninSpv97plDbI+6sQAv4WjQB
e8ICZELRsnMztzRJbskFiSoZslKkIykPfGhAmoMdTq+WnJ8oRfky1ljSK9YKzNgHG/lfk/Qa
nT0n3mxTDdgG9vJqZzCihk9ZucwSQ2ph3IUpUt9e2sS/tBwxVdY1+izZh04mjuVnmLwE1z3P
wEY/og+YWOG17nOzyEVza5KoDCUHdZk8vwFRCC0nZO17D70fTaR7ZdPRUKLEiPOYCHxmA6Np
hcOzRienIga+DIbN1SNRQ9Fv3vJmBgcYLTiZDBsybMQ8NsMb4r6U0YYSo6BVirYd2i8HuBn6
BmXySF5JvZ4FSep8+rcGc8PcI0WZJDBGAnjLmOaYz+Q9ZI+pJDZkUGJSHbCVHtXNgHYPJfgh
3SbYtuRIPMs4KJTcdXHNKPlI2+bjzJuXWDh77Aep8r84oS8Hx1k1f/TFbvP5PLqprb5jEv3+
pnl+j0juK4wNMTkjo8M44YImiatmRZBmhlkrnis1uLTZPcqgahj2sj/jbsK4uJ0wLp6RS/eQ
IZFOaWtzvUgdcLzT482JtCx39JVQyuO8sK6Pft/juEgdERR4jFUSTVAYVPXC9JhjAjHEgUvC
0eq4O4meJDMFT1d5SZbCWRzy4ZmmEFMfxThfzjSfyzBDjxDfZ1DIuCWRh9GN0wsvMN36B0xQ
aqJGRbyodw4E+tFxoYajAnZJnM9e6ocyGg5x9sNyT2a353sZ0AIRSrZ6jikjQFgcL22HjlKo
DH6CHpjg1u/74Rq3AulOB1w0rSaVw+aXi4JT1d+j9HnGYc3udFRS62a4AT2/bfFQTWZt7AdN
/mnowA6TgsI4CkowCGblahT8VWfV40/aZWB1Svzx1CmzktsVcNhuS9U6qLWGS6Bj4o9y0tqm
XabWWZSQNuDxQjC6JLQegjwtLq46MgnQIm9eeLVBdCkB801CNu8NmEtbbPZ1vlXlVfcGzQz8
a1hoysVEKsbeS4voaKR1ko3SNvDpSPt5yo23t4Fb5dLLsgclusWH7iwSx1zZL+Vz0sY+Fb6s
ScMCxSvdDkFzrpzP1Hx8fVA5ca0Q3oGUDl3pVpy7ly4ommj8mAUgunAU6cuuCXNXKlRPz5hv
xuzUdAu8v2y2Db08c7ollQXzjSEaeyY7je8UqmUkBjC3dsBbdeqc94mJQ7inOfmmrYsyCn5Y
qDPGmf1u6thH0yWoM8/s/G6zD3y+40v7pmb/0PyE/pws1UkN//zeVK7XOWg53Rpm6IR+gT2I
ZfKgDMiBbt0MPbl6KDEylmkTcKgQAzKlvqFSUOhns7MbDHktg4wlf8dXw7/80Q2Ir5sp8ztQ
r8yQzuUbO4zgpe13oiS9lQoBNLYUMoBz46BfyVxkEWgPouASKl4qUwjLu94GoENzTYA2hlFS
MXGg4eUzQeOlWwFoG8WCNUR8J2JjXdNdT/TzPqsGjToPoWmiOvXLhrMYDwqJb1xD1AMX64Jz
aOQP/rQCzFd5aEn7xdbY2jRXJZIi4uH4TyjaqA0n3xAwp2SWQvw1Pi0sHbmeocoW3E2SEvx7
azr7LXl6EA3YJJedJXRz5A0+QIgCU8aYQ30NZp1tB8c6zs6ORbbXyOuGAxxMeRkhwZkGrHQP
8rc6qS/O37WP+x19Vqc5d0aP6PjzZtC7XFLLNCl6oqXLIgJf0gjez0ubeEkW8oF+8IQxLv6u
j8QYArINvUJuScEiwj+0iviXsyptkTknaV67F+aI5kTpIjONHlE2G/oNmifHle6zm2OLsopY
NcdXaLZbuvnkyK4gfVEgSVhjMg7wSJY2IpW8dPdrhfk+Yq66l8gMp01HZMWFptSdOE5fnmUa
xeTn5TIvLxVF3+O+GBJhEJFfysRmY29gXrLTC8va4Gp2d9EbH1o9cT+pQ7Ci+XLboKu4USUm
QMG/omg8OuePYqLgFYsTTyEV/DIRKZ3M1IWN0lWU+OM8uFgV2BRf3EDfkIPbPfulYpK5R7Oa
zG0LYZG6ioyoDOaAwCRLsj1g7DE3v4QQ0n66OVU+EPr9+eeBxjLy2CDw3SCECI9r1JvAXxUQ
BT1ZFjcTLG4sg4nP/Y23/Jyj4FURJECyChu1zqOhG5MzikRe3wxZCzIc/51z9003EV2hVmgR
Y0Zp7DFXhpQ7PIYtdAczJMeKSVFxh7Pt4cal2uisMFdXiZU/0nGS694JwLGHvPSh4/B97B/3
k+vOWfqzi/HiibJIj0838oTi7mdRXpt7euYOsOmdHzX3J2nGREm6l2Hy92QVwhh3DVYP4dOg
1UJxIf3+FLW5drRo6PaVndtDM7uUWaUwFmGp8CC8zYRGl10sLSBosYdG0Ml8pfkyS+MzW83G
ux2Tcxh0NJ5A/rh39g7pbsLTzbM00nIVrwG8mX5bmuPJZDGSyplQ8o7WW+0t4tFisuosnd7H
7GPGDRVZLs6cJsYbfxQc2GLDwLPL/vPP7cCRczk7zbnqTfIA5R0ifreAvznlG/+LO5BWOqHE
kmp7iz/W7tIVnc45ytIMtIaHXFi4Sglscny67htBcKm2zmKa8OOZ6afOcmHvQKJzElfNzdDZ
UvTHpM+MRfh8b0/S3hjWEhK7euyOMUrEgS09d+2DLtg56P2GKHP9BRAuHZ4LLF+RwsCTPKUi
9MEeYaHRUbzGy2z/5Y8iRH1FhZdQOoDjJWVZx/C7vfN/ZDzB+ISFHBr1Z3x9/NNMbFxFayYi
7n/A7x9HKSHZ5j+CMRw0Sw1jSPAF4UrGgnt5hXBFMK/AGpZXyI8fxStmY6e88cFM7B57vghv
lgEPSbMfGbS0hxlBsQRLkuNMUxb1YpolseI5TZJuGl7Iy47lYpE6axTabh+imT/R+NpDXKw9
novFPUkHAe/nYu0LuZijhf/PxV7GxcR6+Af8/lFEs8VsLMqpQ/GCNljp7VtFZ+XNDeQ3bfOA
R2+8w4rfQzHcMMbTM3SkA3TH66p54BAsqo9HHjO8PMpcoAbG40ywRWnlPMMP5x1pdI1Z19nk
r8kLjyiWIzL/ozuWkt6BRK4oy7XskRPTPG3q3pV0TihqP0hXs6cX4X22NGGBXklXRBrOO3bb
GWefK7WYPGSAzWLzjs9eSNj7PTtJLT73JzpTPhFvhMmkOA45FMro3R8ovqTvY88U0BFwul8O
30xg3ctfEqtt6e7nlMilb1v/bX8UwuiaZ3FSb9+m+dK1IyZqqU7zTnbYRDlN8BcziOXLWIxo
v1ssxDG/EUex3qky9k6VKe/UBHd/P3cXjiasaiU84xMZg+IV7kNvn+Uqn7jmnr9LmghOaBDF
7/M9BnNwm/BDhifbI4fU7QG2E3oEsJfQwm3q1utRNFbsuQpAHOSyE1FZcVf33xrjm1zsy2sg
Q7WTCmEc6yDgno+CC+WSNgWFqkqW/ohxRh2W6uXHcYLD3MA3OckPjuEJHiXPOXmQBsJ96UK9
Q0kVQjjHed34AKoSE0oZddQcPj6OaOwZNyYWG5QT+2vZVQvSwl0ZHYgFWLIgtxwVUQhVTEaW
M7TibHTCc4tNhAGwqAvKLewJrsl5Lo0e4HQEd+5p3CHfEamhIWa9I1jN2Pnrj/rxgg3cr/Nk
soabqrkCmdsB+fWPq45shyr7oIs5nquwm4isf3FkGX2wV4UkXMxhHBrzYjc+FwK8eE7KhjgA
4VDOhoTVnPAcH5+RAkVcCDO9gRSVmdo/CgLKfMKHpID0AnBtVHiGPe1RmJSjzECOh5KQtlEt
h3APeil7mzBN9pIcHTWjStxQKrDgabaf5h0jdZWSdB8TNTX9TKoO/GldSNWTnkeTS2La5ej3
Vl2u1JPFEuvxJRsjux2+iI6PLjg6zuWI2R2SNI0fJhNUpOzoZ9jQI+vFUs/5TOy88Pa+hUIi
xH538foiVVp/LxMUHb1+InHv+njsygntLFf9ZSvGRF/tXwW4w/JFg9kSrq8xds3f0OHVtrLS
hpbsuxPEDW3R7rJcK1oM/rF73HZuK3B86UfAIk7k04np+biOtCTBNBNP03UChJ7IpxO/+WLY
wA7q9XQGbg40V+brsgEzs6WMHxhMzL8CxYdOd1AQoPO5amALfqPVAwLGUf+UQRd5ZfOFZEBt
rJYgus7OJB6WiaMjehGlrNsDx45TwHGIGMExY1sxCrirc8P5+Z3QOy0iwuOW6PJUI2y6rh+L
0dERopEvG3U7So6KjF8zl0mhWU3jR9LOcuSleAZuiEdOnjEiEzJ1zGgmyGfiwBE+moOWniwd
5k/ps5RhsPSBm8fEiy9bDoTvUqTLWTB1564SfIEBInmviJqU6nsc8WiWqJFgfHdyh2fLYHoS
S4GngYvATM6tBDNlokuO7NdJsLbD+8ByMJgY2ghssCIYvcacQtk6ZUCZLi9V4r00iOKJTa2j
PZM7WkXR+mFiyyudtfPFxLSMkScXyRTyEi6/FBbNsUcDAMDvUvPuThpb0raIdmNwbYYcwZkz
aBWtJSYwmC7zmZmzZBabKdRx+AOjCaPVMsw81SFIsxb87JQ1WnldM7QoDNt8DgUxejqQcr54
39zpuvwJc1I0d5hLOPpuJhv/zKGEx76nDHz0luR7BEJpXjOMbEC/2Lff/en56HIPH4M3qjvU
oBjc8ZEt/o2I84FY9rvpY9wR+9kPcXIcM467SI8jkilJPwb1l0Y5LXKIFpqAFpqui2bNiLod
LPCuE9LUT1rrxwPN4bXE0DaWXgHQ+eITDiqcyQOjozI0Velml6qwFArK+Tt181O5e4eV+OCc
nWee5aUSM8ujDDozd59hrL8rr3FH4Ou/v//Lv67//tf3P6x/+Pb7H76H93VeDaA4nwxg7q0x
XLRbbTYn4oMxBPFleLzMtUbJ6nDUjuJRoQ4+dxSJuu4ov9epor92E50f+EA3/Hp7CbXnX3/3
3ffcyfU3X33/7fx1AM4y89+BZAdzHVTt0cj+G9MlJMfaogAA
_ATEOF



$at_traceoff
echo "t_merge_4.at:566: if test \"\$OSTYPE\" == \"msys\"; then
  mimencode -u -o ancestor.gz ancestor.gz.b64
else
  eval \$UNB64_COMMAND <ancestor.gz.b64 >ancestor.gz
fi
"
echo t_merge_4.at:566 >$at_check_line_file
( $at_traceon; if test "$OSTYPE" == "msys"; then
  mimencode -u -o ancestor.gz ancestor.gz.b64
else
  eval $UNB64_COMMAND <ancestor.gz.b64 >ancestor.gz
fi
 ) >$at_stdout 2>$at_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_4.at:566: exit code was $at_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_4.at:566: eval \$UNGZ_COMMAND <ancestor.gz >ancestor
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o ancestor
fi
"
echo t_merge_4.at:566 >$at_check_line_file
( $at_traceon; eval $UNGZ_COMMAND <ancestor.gz >ancestor
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o ancestor
fi
 ) >$at_stdout 2>$at_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_4.at:566: exit code was $at_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_4.at:567: if test \"\$OSTYPE\" == \"msys\"; then
  mimencode -u -o left.gz left.gz.b64
else
  eval \$UNB64_COMMAND <left.gz.b64 >left.gz
fi
"
echo t_merge_4.at:567 >$at_check_line_file
( $at_traceon; if test "$OSTYPE" == "msys"; then
  mimencode -u -o left.gz left.gz.b64
else
  eval $UNB64_COMMAND <left.gz.b64 >left.gz
fi
 ) >$at_stdout 2>$at_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_4.at:567: exit code was $at_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_4.at:567: eval \$UNGZ_COMMAND <left.gz >left
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o left
fi
"
echo t_merge_4.at:567 >$at_check_line_file
( $at_traceon; eval $UNGZ_COMMAND <left.gz >left
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o left
fi
 ) >$at_stdout 2>$at_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_4.at:567: exit code was $at_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_4.at:568: if test \"\$OSTYPE\" == \"msys\"; then
  mimencode -u -o right.gz right.gz.b64
else
  eval \$UNB64_COMMAND <right.gz.b64 >right.gz
fi
"
echo t_merge_4.at:568 >$at_check_line_file
( $at_traceon; if test "$OSTYPE" == "msys"; then
  mimencode -u -o right.gz right.gz.b64
else
  eval $UNB64_COMMAND <right.gz.b64 >right.gz
fi
 ) >$at_stdout 2>$at_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_4.at:568: exit code was $at_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_4.at:568: eval \$UNGZ_COMMAND <right.gz >right
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o right
fi
"
echo t_merge_4.at:568 >$at_check_line_file
( $at_traceon; eval $UNGZ_COMMAND <right.gz >right
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o right
fi
 ) >$at_stdout 2>$at_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_4.at:568: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



ANC=a2c50da63f01b242d8aaeb34d65e48edf0fef21b
LEFT=8d5a2273e0e3da4aa55ff731e7152a673b63f08a
RIGHT=6745b398ffecec36bc4fc45598e678b3391d91b2

AVER=`monotone --norc identify ancestor`
LVER=`monotone --norc identify left`
RVER=`monotone --norc identify right`

$at_traceoff
echo "t_merge_4.at:578: test \$AVER = \$ANC"
echo t_merge_4.at:578 >$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_merge_4.at:578: exit code was $at_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_4.at:579: test \$LVER = \$LEFT"
echo t_merge_4.at:579 >$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_merge_4.at:579: exit code was $at_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_4.at:580: test \$RVER = \$RIGHT"
echo t_merge_4.at:580 >$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_merge_4.at:580: exit code was $at_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_4.at:582: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR fload <ancestor"
echo t_merge_4.at:582 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_merge_4.at:582: exit code was $at_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_4.at:583: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR fload <left"
echo t_merge_4.at:583 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_merge_4.at:583: exit code was $at_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_4.at:584: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR fload <right"
echo t_merge_4.at:584 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_merge_4.at:584: exit code was $at_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_4.at:586: diff3 -E --merge left ancestor right"
echo t_merge_4.at:586 >$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_merge_4.at:586: exit code was $at_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_4.at:587: mv stdout merge.diff3"
echo t_merge_4.at:587 >$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_merge_4.at:587: exit code was $at_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_4.at:589: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR fmerge \$ANC \$LEFT \$RIGHT"
echo t_merge_4.at:589 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_merge_4.at:589: exit code was $at_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_4.at:590: mv stdout merge.monotone"
echo t_merge_4.at:590 >$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_merge_4.at:590: exit code was $at_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_4.at:592: cmp merge.diff3 merge.monotone"
echo t_merge_4.at:592 >$at_check_line_file
( $at_traceon; cmp merge.diff3 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_merge_4.at:592: exit code 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`
    ;;

  128 ) # 128. t_db_missing.at:1: db missing
    at_setup_line='t_db_missing.at:1'
    at_desc='db missing'
    $at_quiet $ECHO_N "128: db missing                                   $ECHO_C"
    at_xfail=no
    (
      echo "128. t_db_missing.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_db_missing.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_db_missing.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_db_missing.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_db_missing.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_db_missing.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_db_missing.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_db_missing.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_db_missing.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_db_missing.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_db_missing.at:2: rm test_keys"
echo t_db_missing.at:2 >$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_db_missing.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_db_missing.at:4: mkdir foo"
echo t_db_missing.at:4 >$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_db_missing.at:4: 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.db <<'_ATEOF'
foo file
_ATEOF


$at_traceoff
echo "t_db_missing.at:9: (cd foo && \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db= ls keys)"
echo t_db_missing.at:9 >$at_check_line_file
( $at_traceon; (cd foo && $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db= ls 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;;
   1) ;;
   *) echo "t_db_missing.at:9: 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_db_missing.at:10: (cd foo && \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=foo.db ls keys)"
echo t_db_missing.at:10 >$at_check_line_file
( $at_traceon; (cd foo && $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=foo.db ls 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;;
   1) ;;
   *) echo "t_db_missing.at:10: 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_db_missing.at:11: (cd foo && \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=missing.db ls keys)"
echo t_db_missing.at:11 >$at_check_line_file
( $at_traceon; (cd foo && $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=missing.db ls 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;;
   1) ;;
   *) echo "t_db_missing.at:11: 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`
    ;;

  129 ) # 129. t_database_check.at:3: database check
    at_setup_line='t_database_check.at:3'
    at_desc='database check'
    $at_quiet $ECHO_N "129: database check                               $ECHO_C"
    at_xfail=no
    (
      echo "129. t_database_check.at:3: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_database_check.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_database_check.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_database_check.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_database_check.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_database_check.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_database_check.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_database_check.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_database_check.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_database_check.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_database_check.at:5: rm test_keys"
echo t_database_check.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_database_check.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 >file1 <<'_ATEOF'
file 1
_ATEOF

cat >file2 <<'_ATEOF'
file 2
_ATEOF

cat >file3 <<'_ATEOF'
file 3
_ATEOF


# fileX is not referenced by any manifest we have

cat >fileX <<'_ATEOF'
[fdata ff43181b2988e27db1d63605bb3e39d4f06148cb]
H4sIAAAAAAAAAFNQUEjLzElVUEpJTcpMzNMvKs1JLVbiSq1ITS4tAQqXFJWmKnEBADUsgmsm
AAAA
[end]
_ATEOF


# manifestX below contains the following 6 files, none of which are
# present in the database
#
# bb724c73e9f7f0dda411aa83131c648519dc0413  AUTHORS
# 3e9d284b3c48a939e82407d5c3fa6c9e0bf5efcb  COPYING
# 74772a499b672e55cb8367ef580a484709189513  ChangeLog
# a9891352474f767c8d2eeba834a121e46f725cb2  INSTALL
# 6909265d83b02ab3c0abd887f0a6ac96db42323b  Makefile.am
# 80536d31e18d514e52983a5dbac8e19d66b564dd  NEWS

cat >manifestX <<'_ATEOF'
[mdata 1845ba581ec220b33fd14c7ca389576c5b97e959]
H4sICDSlGkIAA2FzZGYAFY/LTkMxDAX39yvyBSjxI7aXFUJQqbSIFiGWTuIUxOv/d4T90ZyZ
1gSoC4ZNmXkMp1LcFQuWXkm52OiZCqa0e7k8nJ7P25oOUGrYSd3QQoGyDO44vXaL3CbH7C2l
29PT2/54vwmJgJNZqwLB3JtilZis2UlJshU1/v+4ffefaxx+r5ubWkEGEppSpeuAiLbEyAuU
oDoFFghS2h/Pl93hsFXLBpWHYsvgSy97G6qryqt3q6MRIODyevTPmB9fcePfm2bGOrBE0cGF
gsEUnUfzrrHia21caYyUjnev5+0P6L2WtS8BAAA=
[end]
_ATEOF


$at_traceoff
echo "t_database_check.at:41: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add file1"
echo t_database_check.at:41 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add file1 ) >$at_stdout 2>$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_database_check.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_database_check.at:42: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --branch=test --message='add file1'"
echo t_database_check.at:42 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --branch=test --message='add file1' ) >$at_stdout 2>$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_database_check.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

REV1=`cat MT/revision`
MAN1=`monotone --norc cat manifest | monotone --norc identify`

$at_traceoff
echo "t_database_check.at:46: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add file2"
echo t_database_check.at:46 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add file2 ) >$at_stdout 2>$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_database_check.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_database_check.at:47: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --branch=test --message='add file2'"
echo t_database_check.at:47 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --branch=test --message='add file2' ) >$at_stdout 2>$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_database_check.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

REV2=`cat MT/revision`
FILE2=`monotone --norc identify file2`

$at_traceoff
echo "t_database_check.at:51: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add file3"
echo t_database_check.at:51 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add file3 ) >$at_stdout 2>$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_database_check.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_database_check.at:52: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --branch=test --message='add file3'"
echo t_database_check.at:52 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --branch=test --message='add file3' ) >$at_stdout 2>$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_database_check.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

REV3=`cat MT/revision`

$at_traceoff
echo "t_database_check.at:55: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db check --ticker=dot"
echo t_database_check.at:55 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR db check --ticker=dot ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; tee stderr <$at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_database_check.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_database_check.at:56: grep 'database is good' stderr"
echo t_database_check.at:56 >$at_check_line_file
( $at_traceon; grep 'database is good' stderr ) >$at_stdout 2>$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_database_check.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


# remove file2 from the database invalidating manifest2 and manifest3
# both of which include this file

$at_traceoff
echo "t_database_check.at:61: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db execute \"delete from files where id='\$FILE2'\""
echo t_database_check.at:61 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR db execute "delete from files where id='$FILE2'" ) >$at_stdout 2>$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_database_check.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_database_check.at:63: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db check --ticker=dot"
echo t_database_check.at:63 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR db check --ticker=dot ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; tee stderr <$at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_database_check.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_database_check.at:64: grep 'database is good' stderr"
echo t_database_check.at:64 >$at_check_line_file
( $at_traceon; grep 'database is good' stderr ) >$at_stdout 2>$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_database_check.at:64: 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_database_check.at:65: grep 'problems detected' stderr"
echo t_database_check.at:65 >$at_check_line_file
( $at_traceon; grep 'problems detected' stderr ) >$at_stdout 2>$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_database_check.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

$at_traceoff
echo "t_database_check.at:66: grep '1 missing file' stderr"
echo t_database_check.at:66 >$at_check_line_file
( $at_traceon; grep '1 missing file' stderr ) >$at_stdout 2>$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_database_check.at:66: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_database_check.at:67: grep '2 incomplete manifest' stderr"
echo t_database_check.at:67 >$at_check_line_file
( $at_traceon; grep '2 incomplete manifest' stderr ) >$at_stdout 2>$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_database_check.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_database_check.at:68: grep '2 incomplete revision' stderr"
echo t_database_check.at:68 >$at_check_line_file
( $at_traceon; grep '2 incomplete revision' stderr ) >$at_stdout 2>$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_database_check.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_database_check.at:69: grep '5 problems' stderr"
echo t_database_check.at:69 >$at_check_line_file
( $at_traceon; grep '5 problems' stderr ) >$at_stdout 2>$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_database_check.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


# add an unreferenced file, and an unreferenced manifest that
# references several files, none of which exist in the db

$at_traceoff
echo "t_database_check.at:74: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read < fileX"
echo t_database_check.at:74 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR read < fileX ) >$at_stdout 2>$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_database_check.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_database_check.at:75: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read < manifestX"
echo t_database_check.at:75 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR read < manifestX ) >$at_stdout 2>$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_database_check.at:75: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


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

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_database_check.at:78: grep '1 unreferenced file' stderr"
echo t_database_check.at:78 >$at_check_line_file
( $at_traceon; grep '1 unreferenced file' stderr ) >$at_stdout 2>$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_database_check.at:78: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_database_check.at:79: grep '1 unreferenced manifest' stderr"
echo t_database_check.at:79 >$at_check_line_file
( $at_traceon; grep '1 unreferenced manifest' stderr ) >$at_stdout 2>$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_database_check.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_database_check.at:80: grep '7 missing files' stderr"
echo t_database_check.at:80 >$at_check_line_file
( $at_traceon; grep '7 missing files' stderr ) >$at_stdout 2>$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_database_check.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_database_check.at:82: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db execute \"delete from revision_ancestry\""
echo t_database_check.at:82 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR db execute "delete from revision_ancestry" ) >$at_stdout 2>$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_database_check.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_database_check.at:83: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db check --ticker=dot"
echo t_database_check.at:83 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR db check --ticker=dot ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; tee stderr <$at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_database_check.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

$at_traceoff
echo "t_database_check.at:84: grep '2 mismatched parent' stderr"
echo t_database_check.at:84 >$at_check_line_file
( $at_traceon; grep '2 mismatched parent' stderr ) >$at_stdout 2>$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_database_check.at:84: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_database_check.at:85: grep '2 mismatched child' stderr"
echo t_database_check.at:85 >$at_check_line_file
( $at_traceon; grep '2 mismatched child' stderr ) >$at_stdout 2>$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_database_check.at:85: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# bogus revision ancestry entries

XDELTA_CC="877cfe29db0f60dec63439857fe78673b9d55346"
XDELTA_HH="68d15dc01398c7bb375b1a90fbb420bebef1bac7"

$at_traceoff
echo "t_database_check.at:92: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db execute \"insert into revision_ancestry values('\$XDELTA_CC', '\$XDELTA_HH')\""
echo t_database_check.at:92 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR db execute "insert into revision_ancestry values('$XDELTA_CC', '$XDELTA_HH')" ) >$at_stdout 2>$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_database_check.at:92: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_database_check.at:93: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db check --ticker=dot"
echo t_database_check.at:93 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR db check --ticker=dot ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; tee stderr <$at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_database_check.at:93: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_database_check.at:94: grep '3 mismatched parent' stderr"
echo t_database_check.at:94 >$at_check_line_file
( $at_traceon; grep '3 mismatched parent' stderr ) >$at_stdout 2>$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_database_check.at:94: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_database_check.at:95: grep '3 mismatched child' stderr"
echo t_database_check.at:95 >$at_check_line_file
( $at_traceon; grep '3 mismatched child' stderr ) >$at_stdout 2>$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_database_check.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_database_check.at:96: grep '2 missing revision' stderr"
echo t_database_check.at:96 >$at_check_line_file
( $at_traceon; grep '2 missing revision' stderr ) >$at_stdout 2>$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_database_check.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_database_check.at:98: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db execute \"delete from manifest_deltas where id='\$MAN1'\""
echo t_database_check.at:98 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR db execute "delete from manifest_deltas where id='$MAN1'" ) >$at_stdout 2>$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_database_check.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_database_check.at:99: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db check --ticker=dot"
echo t_database_check.at:99 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR db check --ticker=dot ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; tee stderr <$at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_database_check.at:99: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_database_check.at:100: grep '1 missing manifest' stderr"
echo t_database_check.at:100 >$at_check_line_file
( $at_traceon; grep '1 missing manifest' stderr ) >$at_stdout 2>$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_database_check.at:100: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_database_check.at:101: grep '3 revisions with bad history' stderr"
echo t_database_check.at:101 >$at_check_line_file
( $at_traceon; grep '3 revisions with bad history' stderr ) >$at_stdout 2>$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_database_check.at:101: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_database_check.at:103: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db execute \"delete from revisions where id='\$REV1'\""
echo t_database_check.at:103 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR db execute "delete from revisions where id='$REV1'" ) >$at_stdout 2>$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_database_check.at:103: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_database_check.at:104: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db check --ticker=dot"
echo t_database_check.at:104 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR db check --ticker=dot ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; tee stderr <$at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_database_check.at:104: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_database_check.at:105: grep '3 missing revision' stderr"
echo t_database_check.at:105 >$at_check_line_file
( $at_traceon; grep '3 missing revision' stderr ) >$at_stdout 2>$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_database_check.at:105: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_database_check.at:106: grep '2 revisions with bad history' stderr"
echo t_database_check.at:106 >$at_check_line_file
( $at_traceon; grep '2 revisions with bad history' stderr ) >$at_stdout 2>$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_database_check.at:106: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


echo "$REV2:comment:this is a test:tester@test.net:bogus sig" | sha1sum | read HASH

$at_traceoff
echo "t_database_check.at:110: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db execute \"insert into revision_certs values ('\$HASH', '\$REV2', 'comment', 'this is a test', 'tester@test.net', 'bogus sig')\""
echo t_database_check.at:110 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR db execute "insert into revision_certs values ('$HASH', '$REV2', 'comment', 'this is a test', 'tester@test.net', 'bogus sig')" ) >$at_stdout 2>$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_database_check.at:110: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_database_check.at:111: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db check --ticker=dot"
echo t_database_check.at:111 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR db check --ticker=dot ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; tee stderr <$at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_database_check.at:111: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_database_check.at:112: grep '1 bad sig' stderr"
echo t_database_check.at:112 >$at_check_line_file
( $at_traceon; grep '1 bad sig' stderr ) >$at_stdout 2>$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_database_check.at:112: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_database_check.at:114: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db execute \"delete from revision_certs where name = 'date'\""
echo t_database_check.at:114 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR db execute "delete from revision_certs where name = 'date'" ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; tee stderr <$at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_database_check.at:114: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_database_check.at:115: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db check --ticker=dot"
echo t_database_check.at:115 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR db check --ticker=dot ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; tee stderr <$at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_database_check.at:115: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_database_check.at:116: grep '2 missing certs' stderr"
echo t_database_check.at:116 >$at_check_line_file
( $at_traceon; grep '2 missing certs' stderr ) >$at_stdout 2>$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_database_check.at:116: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_database_check.at:117: grep '2 mismatched certs' stderr"
echo t_database_check.at:117 >$at_check_line_file
( $at_traceon; grep '2 mismatched certs' stderr ) >$at_stdout 2>$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_database_check.at:117: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_database_check.at:119: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db execute \"delete from public_keys\""
echo t_database_check.at:119 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR db execute "delete from public_keys" ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; tee stderr <$at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_database_check.at:119: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_database_check.at:120: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db check --ticker=dot"
echo t_database_check.at:120 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR db check --ticker=dot ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; tee stderr <$at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_database_check.at:120: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_database_check.at:121: grep '1 missing key' stderr"
echo t_database_check.at:121 >$at_check_line_file
( $at_traceon; grep '1 missing key' stderr ) >$at_stdout 2>$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_database_check.at:121: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_database_check.at:122: grep '10 unchecked signatures' stderr"
echo t_database_check.at:122 >$at_check_line_file
( $at_traceon; grep '10 unchecked signatures' stderr ) >$at_stdout 2>$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_database_check.at:122: exit code 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`
    ;;

  130 ) # 130. t_add_owndb.at:1: (minor) add own db
    at_setup_line='t_add_owndb.at:1'
    at_desc='(minor) add own db'
    $at_quiet $ECHO_N "130: (minor) add own db                           $ECHO_C"
    at_xfail=yes
    (
      echo "130. t_add_owndb.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_add_owndb.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_add_owndb.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_add_owndb.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_add_owndb.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_add_owndb.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_add_owndb.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_add_owndb.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_add_owndb.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_add_owndb.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_add_owndb.at:2: rm test_keys"
echo t_add_owndb.at:2 >$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_add_owndb.at:2: 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 a bug report


#Adding the current in-use DB should fail
# <Sircus> ...It *really* seems like adding the db to the db is something that should be caught and an error message thrown...
# <Sircus> (What's revert supposed to do when you revert the db? :-)
# ...
# <njs> and add a note in a comment that "revert" is the case that really moves this
# from being "stupid user tricks" to "something we should protect users from" :-)
$at_traceoff
echo "t_add_owndb.at:13: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add test.db"
echo t_add_owndb.at:13 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add test.db ) >$at_stdout 2>$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_add_owndb.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_add_owndb.at:14: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls unknown"
echo t_add_owndb.at:14 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR ls unknown ) >$at_stdout 2>$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_add_owndb.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_add_owndb.at:15: grep 'test.db' stdout"
echo t_add_owndb.at:15 >$at_check_line_file
( $at_traceon; grep 'test.db' 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_add_owndb.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_add_owndb.at:17: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add ."
echo t_add_owndb.at:17 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add . ) >$at_stdout 2>$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_add_owndb.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_add_owndb.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls unknown"
echo t_add_owndb.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR ls unknown ) >$at_stdout 2>$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_add_owndb.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_add_owndb.at:19: grep 'test.db' stdout"
echo t_add_owndb.at:19 >$at_check_line_file
( $at_traceon; grep 'test.db' 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_add_owndb.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_add_owndb.at:21: mkdir subdir"
echo t_add_owndb.at:21 >$at_check_line_file
( $at_traceon; mkdir subdir ) >$at_stdout 2>$at_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_add_owndb.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_add_owndb.at:22: cp test.db subdir"
echo t_add_owndb.at:22 >$at_check_line_file
( $at_traceon; cp test.db subdir ) >$at_stdout 2>$at_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_add_owndb.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_add_owndb.at:24: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=subdir/test.db add subdir/test.db"
echo t_add_owndb.at:24 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=subdir/test.db add subdir/test.db ) >$at_stdout 2>$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_add_owndb.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_add_owndb.at:25: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=subdir/test.db ls unknown"
echo t_add_owndb.at:25 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=subdir/test.db ls unknown ) >$at_stdout 2>$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_add_owndb.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_add_owndb.at:26: grep 'subdir/test.db' stdout"
echo t_add_owndb.at:26 >$at_check_line_file
( $at_traceon; grep 'subdir/test.db' 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_add_owndb.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


# If it's not an in-use DB, it should work, though
$at_traceoff
echo "t_add_owndb.at:29: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add subdir/test.db"
echo t_add_owndb.at:29 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add subdir/test.db ) >$at_stdout 2>$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_add_owndb.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_add_owndb.at:30: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls unknown"
echo t_add_owndb.at:30 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR ls unknown ) >$at_stdout 2>$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_add_owndb.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_add_owndb.at:31: grep 'subdir/test.db' stdout"
echo t_add_owndb.at:31 >$at_check_line_file
( $at_traceon; grep 'subdir/test.db' 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_add_owndb.at:31: 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`
    ;;

  131 ) # 131. t_can_execute.at:1: can execute things
    at_setup_line='t_can_execute.at:1'
    at_desc='can execute things'
    $at_quiet $ECHO_N "131: can execute things                           $ECHO_C"
    at_xfail=no
    (
      echo "131. t_can_execute.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_can_execute.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_can_execute.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_can_execute.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_can_execute.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_can_execute.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_can_execute.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_can_execute.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_can_execute.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_can_execute.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_can_execute.at:2: rm test_keys"
echo t_can_execute.at:2 >$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_can_execute.at:2: 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'
blah blah
_ATEOF


cat >cphook.lua <<'_ATEOF'
function note_commit(new_id, certs)
	local pid
	local ret = -1
	pid = spawn("cp", "testfile", "testfile.copied")
	if (pid == -1) then
		return nil
	end
	ret, pid = wait(pid)
end
_ATEOF

$at_traceoff
echo "t_can_execute.at:17: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add cphook.lua"
echo t_can_execute.at:17 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add cphook.lua ) >$at_stdout 2>$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_can_execute.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_can_execute.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch --rcfile=cphook.lua commit --message 'test'"
echo t_can_execute.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch --rcfile=cphook.lua commit --message 'test' ) >$at_stdout 2>$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_can_execute.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_can_execute.at:19: test -f testfile.copied"
echo t_can_execute.at:19 >$at_check_line_file
( $at_traceon; test -f testfile.copied ) >$at_stdout 2>$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_can_execute.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  132 ) # 132. t_diff_binary.at:1: diff a binary file
    at_setup_line='t_diff_binary.at:1'
    at_desc='diff a binary file'
    $at_quiet $ECHO_N "132: diff a binary file                           $ECHO_C"
    at_xfail=yes
    (
      echo "132. t_diff_binary.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_diff_binary.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_diff_binary.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_diff_binary.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_diff_binary.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_diff_binary.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_diff_binary.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_diff_binary.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_diff_binary.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_diff_binary.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_diff_binary.at:2: rm test_keys"
echo t_diff_binary.at:2 >$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_diff_binary.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon




if which mimencode 2>/dev/null; then
  UNB64_COMMAND="mimencode -u"
elif which recode 2>/dev/null; then
  UNB64_COMMAND="recode /Base64"
elif perl -MMIME::Base64 -e 1 2>/dev/null; then
  UNB64_COMMAND="perl -MMIME::Base64 -ne 'print decode_base64(\$_)'"
elif python -c 'import sys;sys.exit(not hasattr("", "decode"))' 2>/dev/null; then
  UNB64_COMMAND="python -c 'import sys;sys.stdout.write(sys.stdin.read().decode("'"'"base64"'"'"))'"
else
  # This is lame!  We should XFAIL the test so the user knows that
  # they're not, you know, actually testing the software.  But
  # Autotest runs XFAIL conditions in a completely different shell, so
  # we can't without duplicating the whole test here.
  exit 77
fi
# Poor man's logging:
$at_traceoff
echo "t_diff_binary.at:3: echo \$UNB64_COMMAND"
echo t_diff_binary.at:3 >$at_check_line_file
( $at_traceon; echo $UNB64_COMMAND ) >$at_stdout 2>$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_diff_binary.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



if which gunzip 2>/dev/null; then
  # This is lame!  We should XFAIL the test so the user knows that
  # they're not, you know, actually testing the software.  But
  # Autotest runs XFAIL conditions in a completely different shell, so
  # we can't without duplicating the whole test here.
  UNGZ_COMMAND="gunzip -c"
fi
# Poor man's logging:
$at_traceoff
echo "t_diff_binary.at:3: echo \$UNGZ_COMMAND"
echo t_diff_binary.at:3 >$at_check_line_file
( $at_traceon; echo $UNGZ_COMMAND ) >$at_stdout 2>$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_diff_binary.at:3: 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 a bug report.


# diff should probably not display the contents of binary files

cat >binary.gz.b64 <<'_ATEOF'
H4sICIXmI0IAA2JpbmFyeQCdk9suA1EUhte0U6Y0lGpRwQgapIeEJgQRQZ1Vm4zzuUrapOEC
iTv1EC68gCfxEH0Bb9EL/5pZTSejLljJl3+v9e+9V/fe05fU9qqiKFQLF7mJs8V3VUtCfRHL
S5JOXhqjPgpTk5mDMuYAHVMYD2oqcAMDufGqakwAeUA8RTADa5nPkEIMrye/5Zu1D4/G5LFh
tJnMvuy7IBX4FXgmnJPlq0IBmxTQm9GR6zYv8/WYrwYVqr55NCaKWtTmZ+FTg6jtXw6qN418
XI/pJ0rFXKKUj5WKd0/P8Yf7+KRV98vZ19J7ctf1uAK3Mp4DsyDu2N4AC2BC8n6wLmvnpcbn
GAKD3AdwpxnxYo79dsEKOJX8ELSBE3ABNkELOAJnIFQ/phmjol5wLOMdcAB6ybqv2ltPifLF
8rezZfsd+7bxkuilaFr0HGRARPKw4yxZgGumYTAAUvQzcqL8eNPgWnJ8WrQMNkBPg3X/Cf4P
8Ht32mquX+ZyBES7/tinXXTEUddBt4x9YFzGHaKt0ucbE4RMjAAEAAA=
_ATEOF



$at_traceoff
echo "t_diff_binary.at:21: if test \"\$OSTYPE\" == \"msys\"; then
  mimencode -u -o binary.gz binary.gz.b64
else
  eval \$UNB64_COMMAND <binary.gz.b64 >binary.gz
fi
"
echo t_diff_binary.at:21 >$at_check_line_file
( $at_traceon; if test "$OSTYPE" == "msys"; then
  mimencode -u -o binary.gz binary.gz.b64
else
  eval $UNB64_COMMAND <binary.gz.b64 >binary.gz
fi
 ) >$at_stdout 2>$at_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_diff_binary.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_diff_binary.at:21: eval \$UNGZ_COMMAND <binary.gz >binary
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o binary
fi
"
echo t_diff_binary.at:21 >$at_check_line_file
( $at_traceon; eval $UNGZ_COMMAND <binary.gz >binary
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o binary
fi
 ) >$at_stdout 2>$at_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_diff_binary.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_diff_binary.at:23: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add binary"
echo t_diff_binary.at:23 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add binary ) >$at_stdout 2>$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_diff_binary.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_diff_binary.at:24: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_diff_binary.at:24 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR status ) >$at_stdout 2>$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_diff_binary.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_diff_binary.at:25: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR diff"
echo t_diff_binary.at:25 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR diff ) >$at_stdout 2>$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_diff_binary.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_diff_binary.at:26: grep [^[:print:]] stdout"
echo t_diff_binary.at:26 >$at_check_line_file
( $at_traceon; grep [^[:print:]] 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;;
   1) ;;
   *) echo "t_diff_binary.at:26: 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`
    ;;

  133 ) # 133. t_command_completion.at:1: command completion
    at_setup_line='t_command_completion.at:1'
    at_desc='command completion'
    $at_quiet $ECHO_N "133: command completion                           $ECHO_C"
    at_xfail=no
    (
      echo "133. t_command_completion.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_command_completion.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_command_completion.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_command_completion.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_command_completion.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_command_completion.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_command_completion.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_command_completion.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_command_completion.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_command_completion.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_command_completion.at:2: rm test_keys"
echo t_command_completion.at:2 >$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_command_completion.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_command_completion.at:4: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR status"
echo t_command_completion.at:4 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR status ) >$at_stdout 2>$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_command_completion.at:4: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_command_completion.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR st"
echo t_command_completion.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR st ) >$at_stdout 2>$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_command_completion.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_command_completion.at:6: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR s"
echo t_command_completion.at:6 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR s ) >$at_stdout 2>$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_command_completion.at:6: 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_command_completion.at:8: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR diff"
echo t_command_completion.at:8 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR diff ) >$at_stdout 2>$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_command_completion.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_command_completion.at:9: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR dif"
echo t_command_completion.at:9 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR dif ) >$at_stdout 2>$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_command_completion.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_command_completion.at:10: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR di"
echo t_command_completion.at:10 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR di ) >$at_stdout 2>$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_command_completion.at:10: 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`
    ;;

  134 ) # 134. t_merge_rename_file_and_rename_dir.at:3: merge rename file and rename dir
    at_setup_line='t_merge_rename_file_and_rename_dir.at:3'
    at_desc='merge rename file and rename dir'
    $at_quiet $ECHO_N "134: merge rename file and rename dir             $ECHO_C"
    at_xfail=no
    (
      echo "134. t_merge_rename_file_and_rename_dir.at:3: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_rename_file_and_rename_dir.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_merge_rename_file_and_rename_dir.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_rename_file_and_rename_dir.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_rename_file_and_rename_dir.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_merge_rename_file_and_rename_dir.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_rename_file_and_rename_dir.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_rename_file_and_rename_dir.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_merge_rename_file_and_rename_dir.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_rename_file_and_rename_dir.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_rename_file_and_rename_dir.at:5: rm test_keys"
echo t_merge_rename_file_and_rename_dir.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_rename_file_and_rename_dir.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_rename_file_and_rename_dir.at:7: mkdir foo"
echo t_merge_rename_file_and_rename_dir.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_merge_rename_file_and_rename_dir.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/bar <<'_ATEOF'
foo bar file
_ATEOF


# common ancestor

$at_traceoff
echo "t_merge_rename_file_and_rename_dir.at:13: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add foo"
echo t_merge_rename_file_and_rename_dir.at:13 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_merge_rename_file_and_rename_dir.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_merge_rename_file_and_rename_dir.at:14: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_merge_rename_file_and_rename_dir.at:14 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_rename_file_and_rename_dir.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


BASE=`cat MT/revision`

# rename directory

$at_traceoff
echo "t_merge_rename_file_and_rename_dir.at:19: mv foo foof"
echo t_merge_rename_file_and_rename_dir.at:19 >$at_check_line_file
( $at_traceon; mv foo foof ) >$at_stdout 2>$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_rename_file_and_rename_dir.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_merge_rename_file_and_rename_dir.at:20: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename foo foof"
echo t_merge_rename_file_and_rename_dir.at:20 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename foo foof ) >$at_stdout 2>$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_rename_file_and_rename_dir.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_merge_rename_file_and_rename_dir.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_merge_rename_file_and_rename_dir.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_rename_file_and_rename_dir.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



# rename file in directory


$at_traceoff
echo "t_merge_rename_file_and_rename_dir.at:25: rm -rf MT.old"
echo t_merge_rename_file_and_rename_dir.at:25 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_rename_file_and_rename_dir.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_merge_rename_file_and_rename_dir.at:25: mv  MT MT.old"
echo t_merge_rename_file_and_rename_dir.at:25 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_rename_file_and_rename_dir.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_merge_rename_file_and_rename_dir.at:25: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$BASE ."
echo t_merge_rename_file_and_rename_dir.at:25 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $BASE . ) >$at_stdout 2>$at_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_rename_file_and_rename_dir.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_merge_rename_file_and_rename_dir.at:25: mv MT.old/options MT"
echo t_merge_rename_file_and_rename_dir.at:25 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_rename_file_and_rename_dir.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_merge_rename_file_and_rename_dir.at:25: test \$PROBE_R_SHA = \$BASE"
echo t_merge_rename_file_and_rename_dir.at:25 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $BASE ) >$at_stdout 2>$at_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_rename_file_and_rename_dir.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_merge_rename_file_and_rename_dir.at:26: mv foo/bar foo/barf"
echo t_merge_rename_file_and_rename_dir.at:26 >$at_check_line_file
( $at_traceon; mv foo/bar foo/barf ) >$at_stdout 2>$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_rename_file_and_rename_dir.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_merge_rename_file_and_rename_dir.at:27: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename foo/bar foo/barf"
echo t_merge_rename_file_and_rename_dir.at:27 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename foo/bar foo/barf ) >$at_stdout 2>$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_rename_file_and_rename_dir.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_merge_rename_file_and_rename_dir.at:28: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_merge_rename_file_and_rename_dir.at:28 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_rename_file_and_rename_dir.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



# merge heads to arrive at foof/barf

$at_traceoff
echo "t_merge_rename_file_and_rename_dir.at:32: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR merge"
echo t_merge_rename_file_and_rename_dir.at:32 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_rename_file_and_rename_dir.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_merge_rename_file_and_rename_dir.at:33: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR co dir"
echo t_merge_rename_file_and_rename_dir.at:33 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR co 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_merge_rename_file_and_rename_dir.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_rename_file_and_rename_dir.at:34: test -d dir/foof"
echo t_merge_rename_file_and_rename_dir.at:34 >$at_check_line_file
( $at_traceon; test -d dir/foof ) >$at_stdout 2>$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_rename_file_and_rename_dir.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_merge_rename_file_and_rename_dir.at:35: test -f dir/foof/barf"
echo t_merge_rename_file_and_rename_dir.at:35 >$at_check_line_file
( $at_traceon; test -f dir/foof/barf ) >$at_stdout 2>$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_rename_file_and_rename_dir.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


find dir

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

  135 ) # 135. t_diff_restrict.at:1: diff respects restrictions
    at_setup_line='t_diff_restrict.at:1'
    at_desc='diff respects restrictions'
    $at_quiet $ECHO_N "135: diff respects restrictions                   $ECHO_C"
    at_xfail=no
    (
      echo "135. t_diff_restrict.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_diff_restrict.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_diff_restrict.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_diff_restrict.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_diff_restrict.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_diff_restrict.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_diff_restrict.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_diff_restrict.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_diff_restrict.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_diff_restrict.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_diff_restrict.at:2: rm test_keys"
echo t_diff_restrict.at:2 >$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_diff_restrict.at:2: 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 >file1 <<'_ATEOF'
1: data 1
_ATEOF

$at_traceoff
echo "t_diff_restrict.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add file1"
echo t_diff_restrict.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add file1 ) >$at_stdout 2>$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_diff_restrict.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 >file2 <<'_ATEOF'
2: data 1
_ATEOF

$at_traceoff
echo "t_diff_restrict.at:7: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add file2"
echo t_diff_restrict.at:7 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add file2 ) >$at_stdout 2>$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_diff_restrict.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_diff_restrict.at:8: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_diff_restrict.at:8 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_diff_restrict.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


REV0=`cat MT/revision`

cat >file1 <<'_ATEOF'
1: data 2
_ATEOF

cat >file2 <<'_ATEOF'
2: data 2
_ATEOF


$at_traceoff
echo "t_diff_restrict.at:15: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_diff_restrict.at:15 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_diff_restrict.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


REV1=`cat MT/revision`

cat >file1 <<'_ATEOF'
1: data 3
_ATEOF

cat >file2 <<'_ATEOF'
2: data 3
_ATEOF


$at_traceoff
echo "t_diff_restrict.at:23: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR diff file1"
echo t_diff_restrict.at:23 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR diff file1 ) >$at_stdout 2>$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_diff_restrict.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_diff_restrict.at:24: grep file1 stdout"
echo t_diff_restrict.at:24 >$at_check_line_file
( $at_traceon; grep file1 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_diff_restrict.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_diff_restrict.at:25: grep -q file2 stdout"
echo t_diff_restrict.at:25 >$at_check_line_file
( $at_traceon; grep -q file2 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;;
   1) ;;
   *) echo "t_diff_restrict.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_diff_restrict.at:27: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR diff --revision=\$REV0 file1"
echo t_diff_restrict.at:27 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR diff --revision=$REV0 file1 ) >$at_stdout 2>$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_diff_restrict.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_diff_restrict.at:28: grep file1 stdout"
echo t_diff_restrict.at:28 >$at_check_line_file
( $at_traceon; grep file1 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_diff_restrict.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_diff_restrict.at:29: grep -q file2 stdout"
echo t_diff_restrict.at:29 >$at_check_line_file
( $at_traceon; grep -q file2 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;;
   1) ;;
   *) echo "t_diff_restrict.at:29: 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_diff_restrict.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR diff --revision=\$REV0 --revision=\$REV1 file1"
echo t_diff_restrict.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR diff --revision=$REV0 --revision=$REV1 file1 ) >$at_stdout 2>$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_diff_restrict.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_diff_restrict.at:32: grep file1 stdout"
echo t_diff_restrict.at:32 >$at_check_line_file
( $at_traceon; grep file1 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_diff_restrict.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_diff_restrict.at:33: grep -q file2 stdout"
echo t_diff_restrict.at:33 >$at_check_line_file
( $at_traceon; grep -q file2 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;;
   1) ;;
   *) echo "t_diff_restrict.at:33: 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_diff_restrict.at:35: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR diff --revision=\$REV1 --revision=\$REV0 file1"
echo t_diff_restrict.at:35 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR diff --revision=$REV1 --revision=$REV0 file1 ) >$at_stdout 2>$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_diff_restrict.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_diff_restrict.at:36: grep file1 stdout"
echo t_diff_restrict.at:36 >$at_check_line_file
( $at_traceon; grep file1 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_diff_restrict.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_diff_restrict.at:37: grep -q file2 stdout"
echo t_diff_restrict.at:37 >$at_check_line_file
( $at_traceon; grep -q file2 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;;
   1) ;;
   *) echo "t_diff_restrict.at:37: 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`
    ;;

  136 ) # 136. t_cat_file_by_name.at:1: cat file REV PATH
    at_setup_line='t_cat_file_by_name.at:1'
    at_desc='cat file REV PATH'
    $at_quiet $ECHO_N "136: cat file REV PATH                            $ECHO_C"
    at_xfail=no
    (
      echo "136. t_cat_file_by_name.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_cat_file_by_name.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_cat_file_by_name.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_cat_file_by_name.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cat_file_by_name.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_cat_file_by_name.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_cat_file_by_name.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cat_file_by_name.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_cat_file_by_name.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_cat_file_by_name.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_cat_file_by_name.at:2: rm test_keys"
echo t_cat_file_by_name.at:2 >$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_cat_file_by_name.at:2: 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 >r0testfile <<'_ATEOF'
r0 test file
_ATEOF

cat >r0otherfile <<'_ATEOF'
r0 other file
_ATEOF

cat >r1testfile <<'_ATEOF'
r1 test file
_ATEOF


$at_traceoff
echo "t_cat_file_by_name.at:11: cp r0testfile testfile"
echo t_cat_file_by_name.at:11 >$at_check_line_file
( $at_traceon; cp r0testfile 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_cat_file_by_name.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_cat_file_by_name.at:12: cp r0otherfile otherfile"
echo t_cat_file_by_name.at:12 >$at_check_line_file
( $at_traceon; cp r0otherfile otherfile ) >$at_stdout 2>$at_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_cat_file_by_name.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_cat_file_by_name.at:13: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile otherfile"
echo t_cat_file_by_name.at:13 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add testfile otherfile ) >$at_stdout 2>$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_cat_file_by_name.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_cat_file_by_name.at:14: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_cat_file_by_name.at:14 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_cat_file_by_name.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


R0=`cat MT/revision`

$at_traceoff
echo "t_cat_file_by_name.at:17: cp r1testfile testfile"
echo t_cat_file_by_name.at:17 >$at_check_line_file
( $at_traceon; cp r1testfile 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_cat_file_by_name.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_cat_file_by_name.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_cat_file_by_name.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_cat_file_by_name.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


R1=`cat MT/revision`

$at_traceoff
echo "t_cat_file_by_name.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR cat file \$R0 testfile"
echo t_cat_file_by_name.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR cat file $R0 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cat_file_by_name.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_cat_file_by_name.at:22:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_cat_file_by_name.at:22 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_cat_file_by_name.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_cat_file_by_name.at:23: cmp stdout r0testfile"
echo t_cat_file_by_name.at:23 >$at_check_line_file
( $at_traceon; cmp stdout r0testfile ) >$at_stdout 2>$at_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_cat_file_by_name.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_cat_file_by_name.at:25: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR cat file \$R0 otherfile"
echo t_cat_file_by_name.at:25 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR cat file $R0 otherfile ) >$at_stdout 2>$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_cat_file_by_name.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_cat_file_by_name.at:26:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_cat_file_by_name.at:26 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_cat_file_by_name.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_cat_file_by_name.at:27: cmp stdout r0otherfile"
echo t_cat_file_by_name.at:27 >$at_check_line_file
( $at_traceon; cmp stdout r0otherfile ) >$at_stdout 2>$at_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_cat_file_by_name.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_cat_file_by_name.at:29: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR cat file \$R1 testfile"
echo t_cat_file_by_name.at:29 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR cat file $R1 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_cat_file_by_name.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_cat_file_by_name.at:30:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_cat_file_by_name.at:30 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_cat_file_by_name.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_cat_file_by_name.at:31: cmp stdout r1testfile"
echo t_cat_file_by_name.at:31 >$at_check_line_file
( $at_traceon; cmp stdout r1testfile ) >$at_stdout 2>$at_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_cat_file_by_name.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_cat_file_by_name.at:33: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR cat file \$R0 no_such_file"
echo t_cat_file_by_name.at:33 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR cat file $R0 no_such_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;;
   1) ;;
   *) echo "t_cat_file_by_name.at:33: 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_cat_file_by_name.at:34: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR cat file \$R0 \"\""
echo t_cat_file_by_name.at:34 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR cat file $R0 "" ) >$at_stdout 2>$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_cat_file_by_name.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  137 ) # 137. t_epoch.at:1: client absorbs and checks epochs
    at_setup_line='t_epoch.at:1'
    at_desc='client absorbs and checks epochs'
    $at_quiet $ECHO_N "137: client absorbs and checks epochs             $ECHO_C"
    at_xfail=no
    (
      echo "137. t_epoch.at:1: testing ..."
      $at_traceon





# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_epoch.at:4: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_epoch.at:4 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_epoch.at:4: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_epoch.at:4: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_epoch.at:4 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_epoch.at:4: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_epoch.at:4: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_epoch.at:4 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_epoch.at:4: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_epoch.at:4: rm test_keys"
echo t_epoch.at:4 >$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_epoch.at:4: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon




$at_traceoff
echo "t_epoch.at:5: cp test.db test2.db"
echo t_epoch.at:5 >$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_epoch.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_epoch.at:5: cp test.db test3.db"
echo t_epoch.at:5 >$at_check_line_file
( $at_traceon; cp test.db test3.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_epoch.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 >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 data
_ATEOF

$at_traceoff
echo "t_epoch.at:8: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_epoch.at:8 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_epoch.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_epoch.at:9: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_epoch.at:9 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_epoch.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


VER0=`cat MT/revision`




if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi

$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --rcfile=netsync.lua serve localhost:5555 testbranch &
sleep 4



$at_traceoff
echo "t_epoch.at:12: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost:5555 testbranch"
echo t_epoch.at:12 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost: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_epoch.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





if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill " $a);}'
  # MinGW has no killall.  The weird a=1 thing is to avoid autotest treating  as its own parameter
else
  killall monotone 2>/dev/null
fi

sleep 1

if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi




# check that the second db got our epoch

$at_traceoff
echo "t_epoch.at:15: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR list epochs"
echo t_epoch.at:15 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR list epochs ) >$at_stdout 2>$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_epoch.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_epoch.at:15: mv stdout expout"
echo t_epoch.at:15 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_epoch.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_epoch.at:15: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db list epochs"
echo t_epoch.at:15 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db list epochs ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_epoch.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



# check that epochs are only sent for netsync'ed branches
$at_traceoff
echo "t_epoch.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db list epochs"
echo t_epoch.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db list epochs ) >$at_stdout 2>$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_epoch.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_epoch.at:19: mv stdout orig-epochs"
echo t_epoch.at:19 >$at_check_line_file
( $at_traceon; mv stdout orig-epochs ) >$at_stdout 2>$at_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_epoch.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


cat >testfile2 <<'_ATEOF'
other data
_ATEOF

$at_traceoff
echo "t_epoch.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile2"
echo t_epoch.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add 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_epoch.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_epoch.at:22: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=otherbranch commit --message blah-blah"
echo t_epoch.at:22 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=otherbranch commit --message 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_epoch.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


# Run an irrelevant netsync, just to force epochs to be regenerated


if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi

$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --rcfile=netsync.lua serve localhost:5555 otherbranch &
sleep 4


$at_traceoff
echo "t_epoch.at:25: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test3.db --rcfile=netsync.lua sync localhost:5555 otherbranch"
echo t_epoch.at:25 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test3.db --rcfile=netsync.lua sync localhost:5555 otherbranch ) >$at_stdout 2>$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_epoch.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




if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill " $a);}'
  # MinGW has no killall.  The weird a=1 thing is to avoid autotest treating  as its own parameter
else
  killall monotone 2>/dev/null
fi

sleep 1

if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi


# Run the real netsync



if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi

$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --rcfile=netsync.lua serve localhost:5555 testbranch &
sleep 4



$at_traceoff
echo "t_epoch.at:28: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost:5555 testbranch"
echo t_epoch.at:28 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost: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_epoch.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





if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill " $a);}'
  # MinGW has no killall.  The weird a=1 thing is to avoid autotest treating  as its own parameter
else
  killall monotone 2>/dev/null
fi

sleep 1

if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi



$at_traceoff
echo "t_epoch.at:29: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db list epochs"
echo t_epoch.at:29 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db list epochs ) >$at_stdout 2>$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_epoch.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_epoch.at:30: mv stdout new-epochs"
echo t_epoch.at:30 >$at_check_line_file
( $at_traceon; mv stdout new-epochs ) >$at_stdout 2>$at_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_epoch.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_epoch.at:31: cmp orig-epochs new-epochs"
echo t_epoch.at:31 >$at_check_line_file
( $at_traceon; cmp orig-epochs new-epochs ) >$at_stdout 2>$at_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_epoch.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_epoch.at:32: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR list epochs"
echo t_epoch.at:32 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR list epochs ) >$at_stdout 2>$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_epoch.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_epoch.at:32: mv stdout firstout"
echo t_epoch.at:32 >$at_check_line_file
( $at_traceon; mv stdout firstout ) >$at_stdout 2>$at_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_epoch.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_epoch.at:32: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db list epochs"
echo t_epoch.at:32 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db list epochs ) >$at_stdout 2>$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_epoch.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_epoch.at:32: mv stdout secondout"
echo t_epoch.at:32 >$at_check_line_file
( $at_traceon; mv stdout secondout ) >$at_stdout 2>$at_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_epoch.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_epoch.at:32: cmp firstout secondout"
echo t_epoch.at:32 >$at_check_line_file
( $at_traceon; cmp firstout secondout ) >$at_stdout 2>$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_epoch.at:32: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon




cat >testfile3 <<'_ATEOF'
some data
_ATEOF

$at_traceoff
echo "t_epoch.at:35: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile3"
echo t_epoch.at:35 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add testfile3 ) >$at_stdout 2>$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_epoch.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_epoch.at:36: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_epoch.at:36 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_epoch.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


VER1=`cat MT/revision`

# change the epochs in the first db
$at_traceoff
echo "t_epoch.at:40: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db rebuild"
echo t_epoch.at:40 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR db rebuild ) >$at_stdout 2>$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_epoch.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


# this should *fail* to sync


if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi

$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --rcfile=netsync.lua serve localhost:5555 testbranch &
sleep 4

# This should probably expect an exit value of 1, but ATM the netsync
# client doesn't report errors in its exit value.
#NETSYNC_CLIENT_RUN(pull, testbranch, 1)


$at_traceoff
echo "t_epoch.at:47: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost:5555 testbranch"
echo t_epoch.at:47 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost: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_epoch.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





if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill " $a);}'
  # MinGW has no killall.  The weird a=1 thing is to avoid autotest treating  as its own parameter
else
  killall monotone 2>/dev/null
fi

sleep 1

if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi



$at_traceoff
echo "t_epoch.at:50: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR list epochs"
echo t_epoch.at:50 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR list epochs ) >$at_stdout 2>$at_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_epoch.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_epoch.at:51: grep testbranch stdout"
echo t_epoch.at:51 >$at_check_line_file
( $at_traceon; grep testbranch 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_epoch.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_epoch.at:52: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db list epochs"
echo t_epoch.at:52 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db list epochs ) >$at_stdout 2>$at_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_epoch.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_epoch.at:53: grep testbranch stdout"
echo t_epoch.at:53 >$at_check_line_file
( $at_traceon; grep testbranch 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_epoch.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_epoch.at:54: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR list epochs"
echo t_epoch.at:54 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR list epochs ) >$at_stdout 2>$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_epoch.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_epoch.at:54: mv stdout firstout"
echo t_epoch.at:54 >$at_check_line_file
( $at_traceon; mv stdout firstout ) >$at_stdout 2>$at_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_epoch.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_epoch.at:54: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db list epochs"
echo t_epoch.at:54 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db list epochs ) >$at_stdout 2>$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_epoch.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_epoch.at:54: mv stdout secondout"
echo t_epoch.at:54 >$at_check_line_file
( $at_traceon; mv stdout secondout ) >$at_stdout 2>$at_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_epoch.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_epoch.at:54: cmp firstout secondout"
echo t_epoch.at:54 >$at_check_line_file
( $at_traceon; cmp firstout secondout ) >$at_stdout 2>$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_epoch.at:54: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



# double-check that the revisions didn't change (because otherwise our
# next test is unreliable):
$at_traceoff
echo "t_epoch.at:58: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR cat revision \$VER1"
echo t_epoch.at:58 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR cat revision $VER1 ) >$at_stdout 2>$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_epoch.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

# confirm, we did not get the new revision
$at_traceoff
echo "t_epoch.at:60: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db cat revision \$VER1"
echo t_epoch.at:60 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db cat revision $VER1 ) >$at_stdout 2>$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_epoch.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


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

  138 ) # 138. t_epoch_server.at:1: server aborbs and checks epochs
    at_setup_line='t_epoch_server.at:1'
    at_desc='server aborbs and checks epochs'
    $at_quiet $ECHO_N "138: server aborbs and checks epochs              $ECHO_C"
    at_xfail=no
    (
      echo "138. t_epoch_server.at:1: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_epoch_server.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_epoch_server.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_epoch_server.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_epoch_server.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_epoch_server.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_epoch_server.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_epoch_server.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_epoch_server.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_epoch_server.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_epoch_server.at:3: rm test_keys"
echo t_epoch_server.at:3 >$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_epoch_server.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon




$at_traceoff
echo "t_epoch_server.at:4: cp test.db test2.db"
echo t_epoch_server.at:4 >$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_epoch_server.at:4: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_epoch_server.at:4: cp test.db test3.db"
echo t_epoch_server.at:4 >$at_check_line_file
( $at_traceon; cp test.db test3.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_epoch_server.at:4: 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'
some data
_ATEOF

$at_traceoff
echo "t_epoch_server.at:8: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db add testfile"
echo t_epoch_server.at:8 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db 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_epoch_server.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_epoch_server.at:9: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db commit --message=foo --branch=testbranch"
echo t_epoch_server.at:9 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db commit --message=foo --branch=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_epoch_server.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

VER0=`cat MT/revision`




if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi

$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --rcfile=netsync.lua serve localhost:5555 testbranch &
sleep 4



$at_traceoff
echo "t_epoch_server.at:12: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db --rcfile=netsync.lua push localhost:5555 testbranch"
echo t_epoch_server.at:12 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db --rcfile=netsync.lua push localhost: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_epoch_server.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





if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill " $a);}'
  # MinGW has no killall.  The weird a=1 thing is to avoid autotest treating  as its own parameter
else
  killall monotone 2>/dev/null
fi

sleep 1

if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi




# check that the first db got our epoch

$at_traceoff
echo "t_epoch_server.at:15: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR list epochs"
echo t_epoch_server.at:15 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR list epochs ) >$at_stdout 2>$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_epoch_server.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_epoch_server.at:15: mv stdout expout"
echo t_epoch_server.at:15 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_epoch_server.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_epoch_server.at:15: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db list epochs"
echo t_epoch_server.at:15 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db list epochs ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_epoch_server.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



# check that epochs are only sent for netsync'ed branches
$at_traceoff
echo "t_epoch_server.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR list epochs"
echo t_epoch_server.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR list epochs ) >$at_stdout 2>$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_epoch_server.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_epoch_server.at:19: mv stdout orig-epochs"
echo t_epoch_server.at:19 >$at_check_line_file
( $at_traceon; mv stdout orig-epochs ) >$at_stdout 2>$at_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_epoch_server.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

cat >otherfile <<'_ATEOF'
other data
_ATEOF

$at_traceoff
echo "t_epoch_server.at:22: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db add otherfile"
echo t_epoch_server.at:22 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db add otherfile ) >$at_stdout 2>$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_epoch_server.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_epoch_server.at:23: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db commit --message=foo --branch=otherbranch"
echo t_epoch_server.at:23 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db commit --message=foo --branch=otherbranch ) >$at_stdout 2>$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_epoch_server.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

# Run an irrelevant netsync, just to force epochs to be regenerated


if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi

$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db --rcfile=netsync.lua serve localhost:5555 otherbranch &
sleep 4


$at_traceoff
echo "t_epoch_server.at:26: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test3.db --rcfile=netsync.lua sync localhost:5555 otherbranch"
echo t_epoch_server.at:26 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test3.db --rcfile=netsync.lua sync localhost:5555 otherbranch ) >$at_stdout 2>$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_epoch_server.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




if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill " $a);}'
  # MinGW has no killall.  The weird a=1 thing is to avoid autotest treating  as its own parameter
else
  killall monotone 2>/dev/null
fi

sleep 1

if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi


# Run the real netsync



if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi

$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --rcfile=netsync.lua serve localhost:5555 testbranch &
sleep 4



$at_traceoff
echo "t_epoch_server.at:29: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db --rcfile=netsync.lua push localhost:5555 testbranch"
echo t_epoch_server.at:29 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db --rcfile=netsync.lua push localhost: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_epoch_server.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





if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill " $a);}'
  # MinGW has no killall.  The weird a=1 thing is to avoid autotest treating  as its own parameter
else
  killall monotone 2>/dev/null
fi

sleep 1

if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi



$at_traceoff
echo "t_epoch_server.at:30: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR list epochs"
echo t_epoch_server.at:30 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR list epochs ) >$at_stdout 2>$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_epoch_server.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_epoch_server.at:31: mv stdout new-epochs"
echo t_epoch_server.at:31 >$at_check_line_file
( $at_traceon; mv stdout new-epochs ) >$at_stdout 2>$at_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_epoch_server.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_epoch_server.at:32: cmp orig-epochs new-epochs"
echo t_epoch_server.at:32 >$at_check_line_file
( $at_traceon; cmp orig-epochs new-epochs ) >$at_stdout 2>$at_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_epoch_server.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_epoch_server.at:33: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR list epochs"
echo t_epoch_server.at:33 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR list epochs ) >$at_stdout 2>$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_epoch_server.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_epoch_server.at:33: mv stdout firstout"
echo t_epoch_server.at:33 >$at_check_line_file
( $at_traceon; mv stdout firstout ) >$at_stdout 2>$at_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_epoch_server.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_epoch_server.at:33: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db list epochs"
echo t_epoch_server.at:33 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db list epochs ) >$at_stdout 2>$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_epoch_server.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_epoch_server.at:33: mv stdout secondout"
echo t_epoch_server.at:33 >$at_check_line_file
( $at_traceon; mv stdout secondout ) >$at_stdout 2>$at_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_epoch_server.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_epoch_server.at:33: cmp firstout secondout"
echo t_epoch_server.at:33 >$at_check_line_file
( $at_traceon; cmp firstout secondout ) >$at_stdout 2>$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_epoch_server.at:33: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



cat >testfile <<'_ATEOF'
new version of data
_ATEOF

$at_traceoff
echo "t_epoch_server.at:37: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db commit --message=foo --branch=testbranch"
echo t_epoch_server.at:37 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db commit --message=foo --branch=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_epoch_server.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

VER1=`cat MT/revision`

# change the epochs in the second db
$at_traceoff
echo "t_epoch_server.at:41: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db db rebuild"
echo t_epoch_server.at:41 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db db rebuild ) >$at_stdout 2>$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_epoch_server.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


# this should *fail* to sync


if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi

$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --rcfile=netsync.lua serve localhost:5555 testbranch &
sleep 4

# This should probably expect an exit value of 1, but ATM the netsync
# client doesn't report errors in its exit value.
#NETSYNC_CLIENT_RUN(pull, testbranch, 1)


$at_traceoff
echo "t_epoch_server.at:48: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost:5555 testbranch"
echo t_epoch_server.at:48 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost: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_epoch_server.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





if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill " $a);}'
  # MinGW has no killall.  The weird a=1 thing is to avoid autotest treating  as its own parameter
else
  killall monotone 2>/dev/null
fi

sleep 1

if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi



$at_traceoff
echo "t_epoch_server.at:51: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR list epochs"
echo t_epoch_server.at:51 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR list epochs ) >$at_stdout 2>$at_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_epoch_server.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_epoch_server.at:52: grep testbranch stdout"
echo t_epoch_server.at:52 >$at_check_line_file
( $at_traceon; grep testbranch 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_epoch_server.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_epoch_server.at:53: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db list epochs"
echo t_epoch_server.at:53 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db list epochs ) >$at_stdout 2>$at_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_epoch_server.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_epoch_server.at:54: grep testbranch stdout"
echo t_epoch_server.at:54 >$at_check_line_file
( $at_traceon; grep testbranch 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_epoch_server.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_epoch_server.at:55: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR list epochs"
echo t_epoch_server.at:55 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR list epochs ) >$at_stdout 2>$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_epoch_server.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_epoch_server.at:55: mv stdout firstout"
echo t_epoch_server.at:55 >$at_check_line_file
( $at_traceon; mv stdout firstout ) >$at_stdout 2>$at_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_epoch_server.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_epoch_server.at:55: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db list epochs"
echo t_epoch_server.at:55 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db list epochs ) >$at_stdout 2>$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_epoch_server.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_epoch_server.at:55: mv stdout secondout"
echo t_epoch_server.at:55 >$at_check_line_file
( $at_traceon; mv stdout secondout ) >$at_stdout 2>$at_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_epoch_server.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_epoch_server.at:55: cmp firstout secondout"
echo t_epoch_server.at:55 >$at_check_line_file
( $at_traceon; cmp firstout secondout ) >$at_stdout 2>$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_epoch_server.at:55: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



# double-check that the revisions didn't change (because otherwise our
# next test is unreliable):
$at_traceoff
echo "t_epoch_server.at:59: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db cat revision \$VER1"
echo t_epoch_server.at:59 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db cat revision $VER1 ) >$at_stdout 2>$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_epoch_server.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

# confirm, we did not get the new revision
$at_traceoff
echo "t_epoch_server.at:61: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR cat revision \$VER1"
echo t_epoch_server.at:61 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR cat revision $VER1 ) >$at_stdout 2>$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_epoch_server.at:61: 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`
    ;;

  139 ) # 139. t_epoch_unidirectional.at:1: epochs are not sent upstream by pull
    at_setup_line='t_epoch_unidirectional.at:1'
    at_desc='epochs are not sent upstream by pull'
    $at_quiet $ECHO_N "139: epochs are not sent upstream by pull         $ECHO_C"
    at_xfail=no
    (
      echo "139. t_epoch_unidirectional.at:1: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_epoch_unidirectional.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_epoch_unidirectional.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_epoch_unidirectional.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_epoch_unidirectional.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_epoch_unidirectional.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_epoch_unidirectional.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_epoch_unidirectional.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_epoch_unidirectional.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_epoch_unidirectional.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_epoch_unidirectional.at:3: rm test_keys"
echo t_epoch_unidirectional.at:3 >$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_epoch_unidirectional.at:3: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon




$at_traceoff
echo "t_epoch_unidirectional.at:4: cp test.db test2.db"
echo t_epoch_unidirectional.at:4 >$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_epoch_unidirectional.at:4: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_epoch_unidirectional.at:4: cp test.db test3.db"
echo t_epoch_unidirectional.at:4 >$at_check_line_file
( $at_traceon; cp test.db test3.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_epoch_unidirectional.at:4: 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




# This is important, because if I only have read-only access to your
# database, I shouldn't be able to clutter it with random epochs...


cat >testfile <<'_ATEOF'
some data
_ATEOF

$at_traceoff
echo "t_epoch_unidirectional.at:10: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_epoch_unidirectional.at:10 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_epoch_unidirectional.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_epoch_unidirectional.at:11: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_epoch_unidirectional.at:11 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_epoch_unidirectional.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_epoch_unidirectional.at:13: rm -rf MT"
echo t_epoch_unidirectional.at:13 >$at_check_line_file
( $at_traceon; rm -rf MT ) >$at_stdout 2>$at_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_epoch_unidirectional.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_epoch_unidirectional.at:14: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db setup ."
echo t_epoch_unidirectional.at:14 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db setup . ) >$at_stdout 2>$at_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_epoch_unidirectional.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

cat >otherfile <<'_ATEOF'
some data
_ATEOF

$at_traceoff
echo "t_epoch_unidirectional.at:17: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db add testfile"
echo t_epoch_unidirectional.at:17 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db 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_epoch_unidirectional.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_epoch_unidirectional.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db commit --message=foo --branch=testbranch.subbranch"
echo t_epoch_unidirectional.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db commit --message=foo --branch=testbranch.subbranch ) >$at_stdout 2>$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_epoch_unidirectional.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





if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi

$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --rcfile=netsync.lua serve localhost:5555 testbranch &
sleep 4



$at_traceoff
echo "t_epoch_unidirectional.at:20: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost:5555 testbranch"
echo t_epoch_unidirectional.at:20 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost: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_epoch_unidirectional.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





if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill " $a);}'
  # MinGW has no killall.  The weird a=1 thing is to avoid autotest treating  as its own parameter
else
  killall monotone 2>/dev/null
fi

sleep 1

if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi





$at_traceoff
echo "t_epoch_unidirectional.at:22: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR list epochs"
echo t_epoch_unidirectional.at:22 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR list epochs ) >$at_stdout 2>$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_epoch_unidirectional.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_epoch_unidirectional.at:22: mv stdout firstout"
echo t_epoch_unidirectional.at:22 >$at_check_line_file
( $at_traceon; mv stdout firstout ) >$at_stdout 2>$at_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_epoch_unidirectional.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_epoch_unidirectional.at:22: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db list epochs"
echo t_epoch_unidirectional.at:22 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db list epochs ) >$at_stdout 2>$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_epoch_unidirectional.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_epoch_unidirectional.at:22: mv stdout secondout"
echo t_epoch_unidirectional.at:22 >$at_check_line_file
( $at_traceon; mv stdout secondout ) >$at_stdout 2>$at_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_epoch_unidirectional.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_epoch_unidirectional.at:22: cmp firstout secondout"
echo t_epoch_unidirectional.at:22 >$at_check_line_file
( $at_traceon; cmp firstout secondout ) >$at_stdout 2>$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_epoch_unidirectional.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



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

  140 ) # 140. t_vars.at:1: vars
    at_setup_line='t_vars.at:1'
    at_desc='vars'
    $at_quiet $ECHO_N "140: vars                                         $ECHO_C"
    at_xfail=no
    (
      echo "140. t_vars.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_vars.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_vars.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_vars.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_vars.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_vars.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_vars.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_vars.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_vars.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_vars.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_vars.at:2: rm test_keys"
echo t_vars.at:2 >$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_vars.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_vars.at:4: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR set domain1 key1 orig_value"
echo t_vars.at:4 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR set domain1 key1 orig_value ) >$at_stdout 2>$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_vars.at:4: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_vars.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR set domain1 key1 overwritten_value"
echo t_vars.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR set domain1 key1 overwritten_value ) >$at_stdout 2>$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_vars.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_vars.at:6: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR set domain1 key2 other_value"
echo t_vars.at:6 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR set domain1 key2 other_value ) >$at_stdout 2>$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_vars.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_vars.at:7: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR set domain2 key1 other_domain_value"
echo t_vars.at:7 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR set domain2 key1 other_domain_value ) >$at_stdout 2>$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_vars.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_vars.at:8: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR set domain2 key2 yet_another_value"
echo t_vars.at:8 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR set domain2 key2 yet_another_value ) >$at_stdout 2>$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_vars.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_vars.at:9: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR unset domain2 key2"
echo t_vars.at:9 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR unset domain2 key2 ) >$at_stdout 2>$at_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_vars.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_vars.at:10: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR unset domain2 key2"
echo t_vars.at:10 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR unset domain2 key2 ) >$at_stdout 2>$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_vars.at:10: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# FIXME: use a less lame output format
cat >domain1_vars <<'_ATEOF'
domain1: key1 overwritten_value
domain1: key2 other_value
_ATEOF

cat >domain2_vars <<'_ATEOF'
domain2: key1 other_domain_value
_ATEOF

$at_traceoff
echo "t_vars.at:18: cat domain1_vars domain2_vars > all_vars"
echo t_vars.at:18 >$at_check_line_file
( $at_traceon; cat domain1_vars domain2_vars > all_vars ) >$at_stdout 2>$at_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_vars.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_vars.at:20: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls vars"
echo t_vars.at:20 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR ls vars ) >$at_stdout 2>$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_vars.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_vars.at:21:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_vars.at:21 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_vars.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_vars.at:22: cmp all_vars stdout"
echo t_vars.at:22 >$at_check_line_file
( $at_traceon; cmp all_vars 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;;
   0) ;;
   *) echo "t_vars.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_vars.at:23: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls vars domain1"
echo t_vars.at:23 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR ls vars domain1 ) >$at_stdout 2>$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_vars.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_vars.at:24:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_vars.at:24 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_vars.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_vars.at:25: cmp domain1_vars stdout"
echo t_vars.at:25 >$at_check_line_file
( $at_traceon; cmp domain1_vars 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;;
   0) ;;
   *) echo "t_vars.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_vars.at:26: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls vars domain2"
echo t_vars.at:26 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR ls vars domain2 ) >$at_stdout 2>$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_vars.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_vars.at:27:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_vars.at:27 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_vars.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_vars.at:28: cmp domain2_vars stdout"
echo t_vars.at:28 >$at_check_line_file
( $at_traceon; cmp domain2_vars 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;;
   0) ;;
   *) echo "t_vars.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  141 ) # 141. t_netsync_defaults.at:1: default server/collection
    at_setup_line='t_netsync_defaults.at:1'
    at_desc='default server/collection'
    $at_quiet $ECHO_N "141: default server/collection                    $ECHO_C"
    at_xfail=no
    (
      echo "141. t_netsync_defaults.at:1: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_defaults.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_netsync_defaults.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_defaults.at:3: exit code was $at_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_defaults.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_netsync_defaults.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_defaults.at:3: exit code was $at_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_defaults.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_netsync_defaults.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_defaults.at:3: exit code was $at_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_defaults.at:3: rm test_keys"
echo t_netsync_defaults.at:3 >$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_defaults.at:3: exit code was $at_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_defaults.at:4: cp test.db test2.db"
echo t_netsync_defaults.at:4 >$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_defaults.at:4: exit code was $at_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_defaults.at:4: cp test.db test3.db"
echo t_netsync_defaults.at:4 >$at_check_line_file
( $at_traceon; cp test.db test3.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_defaults.at:4: 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'
blah blah
_ATEOF

$at_traceoff
echo "t_netsync_defaults.at:7: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_netsync_defaults.at:7 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_defaults.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_netsync_defaults.at:8: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_netsync_defaults.at:8 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_defaults.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


TESTBRANCH_R=`cat MT/revision`


cat >testfile <<'_ATEOF'
stuff stuff
_ATEOF



$at_traceoff
echo "t_netsync_defaults.at:13: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=otherbranch commit --message blah-blah"
echo t_netsync_defaults.at:13 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=otherbranch commit --message 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_defaults.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


OTHERBRANCH_R=`cat MT/revision`


cat >testfile <<'_ATEOF'
nonsense nonsense
_ATEOF



$at_traceoff
echo "t_netsync_defaults.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=thirdbranch commit --message blah-blah"
echo t_netsync_defaults.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=thirdbranch commit --message 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_defaults.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


THIRDBRANCH_R=`cat MT/revision`



if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi

$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --rcfile=netsync.lua serve localhost:5555 testbranch otherbranch thirdbranch &
sleep 4


# First make sure netsync with explicit server/collection override defaults
$at_traceoff
echo "t_netsync_defaults.at:24: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db set database default-server nonsense"
echo t_netsync_defaults.at:24 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db set database default-server nonsense ) >$at_stdout 2>$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_defaults.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_netsync_defaults.at:25: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db set database default-collection nonsense"
echo t_netsync_defaults.at:25 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db set database default-collection nonsense ) >$at_stdout 2>$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_defaults.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_netsync_defaults.at:26: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost:5555 testbranch"
echo t_netsync_defaults.at:26 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost: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_defaults.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_netsync_defaults.at:27: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db checkout --branch=testbranch \$TESTBRANCH_R testdir1"
echo t_netsync_defaults.at:27 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db checkout --branch=testbranch $TESTBRANCH_R testdir1 ) >$at_stdout 2>$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_defaults.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_netsync_defaults.at:28: test -f testdir1/testfile"
echo t_netsync_defaults.at:28 >$at_check_line_file
( $at_traceon; test -f testdir1/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_netsync_defaults.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


# Now make sure explicit server with default collection works...
$at_traceoff
echo "t_netsync_defaults.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db set database default-server nonsense"
echo t_netsync_defaults.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db set database default-server nonsense ) >$at_stdout 2>$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_defaults.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_netsync_defaults.at:32: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db set database default-collection otherbranch"
echo t_netsync_defaults.at:32 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db set database default-collection otherbranch ) >$at_stdout 2>$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_defaults.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_netsync_defaults.at:33: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost:5555 "
echo t_netsync_defaults.at:33 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost:5555  ) >$at_stdout 2>$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_defaults.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_netsync_defaults.at:34: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db checkout --branch=otherbranch \$OTHERBRANCH_R testdir2"
echo t_netsync_defaults.at:34 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db checkout --branch=otherbranch $OTHERBRANCH_R testdir2 ) >$at_stdout 2>$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_defaults.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_netsync_defaults.at:35: test -f testdir2/testfile"
echo t_netsync_defaults.at:35 >$at_check_line_file
( $at_traceon; test -f testdir2/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_netsync_defaults.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


# And finally,
$at_traceoff
echo "t_netsync_defaults.at:38: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db set database default-server 127.0.0.1:5555"
echo t_netsync_defaults.at:38 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db set database default-server 127.0.0.1:5555 ) >$at_stdout 2>$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_defaults.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_defaults.at:39: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db set database default-collection thirdbranch"
echo t_netsync_defaults.at:39 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db set database default-collection thirdbranch ) >$at_stdout 2>$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_defaults.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_defaults.at:40: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db sync"
echo t_netsync_defaults.at:40 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db sync ) >$at_stdout 2>$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_defaults.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_defaults.at:41: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db checkout --branch=thirdbranch \$THIRDBRANCH_R testdir3"
echo t_netsync_defaults.at:41 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db checkout --branch=thirdbranch $THIRDBRANCH_R testdir3 ) >$at_stdout 2>$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_defaults.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_defaults.at:42: test -f testdir3/testfile"
echo t_netsync_defaults.at:42 >$at_check_line_file
( $at_traceon; test -f testdir3/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_netsync_defaults.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




if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill " $a);}'
  # MinGW has no killall.  The weird a=1 thing is to avoid autotest treating  as its own parameter
else
  killall monotone 2>/dev/null
fi

sleep 1

if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi



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

  142 ) # 142. t_netsync_set_defaults.at:1: default server/collection setting
    at_setup_line='t_netsync_set_defaults.at:1'
    at_desc='default server/collection setting'
    $at_quiet $ECHO_N "142: default server/collection setting            $ECHO_C"
    at_xfail=no
    (
      echo "142. t_netsync_set_defaults.at:1: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_set_defaults.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_netsync_set_defaults.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_set_defaults.at:3: exit code was $at_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_set_defaults.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_netsync_set_defaults.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_set_defaults.at:3: exit code was $at_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_set_defaults.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_netsync_set_defaults.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_set_defaults.at:3: exit code was $at_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_set_defaults.at:3: rm test_keys"
echo t_netsync_set_defaults.at:3 >$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_set_defaults.at:3: exit code was $at_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_set_defaults.at:4: cp test.db test2.db"
echo t_netsync_set_defaults.at:4 >$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_set_defaults.at:4: exit code was $at_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_set_defaults.at:4: cp test.db test3.db"
echo t_netsync_set_defaults.at:4 >$at_check_line_file
( $at_traceon; cp test.db test3.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_set_defaults.at:4: 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'
blah blah
_ATEOF

$at_traceoff
echo "t_netsync_set_defaults.at:7: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_netsync_set_defaults.at:7 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_set_defaults.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_netsync_set_defaults.at:8: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_netsync_set_defaults.at:8 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_set_defaults.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






if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi

$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --rcfile=netsync.lua serve localhost:5555 testbranch &
sleep 4



$at_traceoff
echo "t_netsync_set_defaults.at:10: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost:5555 testbranch"
echo t_netsync_set_defaults.at:10 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost: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_set_defaults.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





if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill " $a);}'
  # MinGW has no killall.  The weird a=1 thing is to avoid autotest treating  as its own parameter
else
  killall monotone 2>/dev/null
fi

sleep 1

if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi





cat >testfile <<'_ATEOF'
other stuff
_ATEOF



$at_traceoff
echo "t_netsync_set_defaults.at:14: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_netsync_set_defaults.at:14 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_set_defaults.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


NEW_R=`cat MT/revision`



if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi

$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --rcfile=netsync.lua serve localhost:5555 testbranch &
sleep 4

# Having done an explicit pull once, future ones should default to the
# same
$at_traceoff
echo "t_netsync_set_defaults.at:20: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db pull"
echo t_netsync_set_defaults.at:20 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db pull ) >$at_stdout 2>$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_set_defaults.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



if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill " $a);}'
  # MinGW has no killall.  The weird a=1 thing is to avoid autotest treating  as its own parameter
else
  killall monotone 2>/dev/null
fi

sleep 1

if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi



$at_traceoff
echo "t_netsync_set_defaults.at:23: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db checkout \$NEW_R testdir"
echo t_netsync_set_defaults.at:23 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db checkout $NEW_R 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_netsync_set_defaults.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_netsync_set_defaults.at:24: cmp testfile testdir/testfile"
echo t_netsync_set_defaults.at:24 >$at_check_line_file
( $at_traceon; cmp testfile testdir/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_netsync_set_defaults.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`
    ;;

  143 ) # 143. t_netsync_absorbs.at:1: client absorbs server key
    at_setup_line='t_netsync_absorbs.at:1'
    at_desc='client absorbs server key'
    $at_quiet $ECHO_N "143: client absorbs server key                    $ECHO_C"
    at_xfail=no
    (
      echo "143. t_netsync_absorbs.at:1: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_absorbs.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_netsync_absorbs.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_absorbs.at:3: exit code was $at_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_absorbs.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_netsync_absorbs.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_absorbs.at:3: exit code was $at_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_absorbs.at:3: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_netsync_absorbs.at:3 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_absorbs.at:3: exit code was $at_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_absorbs.at:3: rm test_keys"
echo t_netsync_absorbs.at:3 >$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_absorbs.at:3: exit code was $at_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_absorbs.at:4: cp test.db test2.db"
echo t_netsync_absorbs.at:4 >$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_absorbs.at:4: exit code was $at_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_absorbs.at:4: cp test.db test3.db"
echo t_netsync_absorbs.at:4 >$at_check_line_file
( $at_traceon; cp test.db test3.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_absorbs.at:4: 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'
foo bar
_ATEOF

$at_traceoff
echo "t_netsync_absorbs.at:7: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_netsync_absorbs.at:7 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_absorbs.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_netsync_absorbs.at:8: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_netsync_absorbs.at:8 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_absorbs.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 >foo_public <<'_ATEOF'
[pubkey foo@bar]
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDXdNcDvz8ARAxEw7ESs2y60RgT9HdpoPHA
AXvhjWtojgoW8t7RLp+62RUm+c9H2tWFAVMBRtLzd9kFl58f+muDAiQVEJo4rgPy2jjrHO6Z
UtfQv7Fh2d/euba9cbtNPaNjWu7RsnVOo4iEQhb3czeObhE0n+hJ3/dGj9d1IClbCwIBEQ==
[end]
_ATEOF

cat >foo_private <<'_ATEOF'
[privkey foo@bar]
gWGUHfbvsqKRQZ7inK1NQUO1cAuNcKENJNvoxhBtQKv6iIZp23ZBSrpBGuKoSnQSPXresXLD
tYc4Ztecez0hBTjGsTmUm1EQLGf2dTJ4dG2nBJGbI2R6QvX9/KJbF1dIc9DCoJGB3XTpVg4R
kMc9IFKM5tzwpNYRx+vpjf5GTamIyj1O5qmQmg7VFWx8uC3hzgW/FnaP9Qh2lnjiaEVDNzjA
7FzTQAPUIcZJNOSQM/Tck0wharmaMzBaM1QZCoTXRgydARVW4eunxdFfK88U/5IICkcEYYII
ssoz73Ukyvz8QQfJSnmbxK6b2x4RSoqOmjt8yC7rMrZOm05ZtaG+OzgFL19M+oZ9Aj3xVO7y
DcEK2gNfBH7deHPcgJCLy42UkciCgstcAwBmrv6KkuRx7R/BqP/Oo+xCQJE0yeFNwmDvNTxV
e0G7STVEoJYBdthevS55RUwrEwnW30q8wsI8FjzRkd5AiO61/WgMxhMsBpyp3ya2qzt5QEAf
qTbOZaFedhQl+m6RsfJSBwjM/PQpLij5FnF/2etlyk9YtaUXyTqu8g4g83uzXfomCZXukbIG
uS34HCqjEqP4zCxyezoKQydn4aiNluijDhvVx8GQGZ1n5coUdpOLWgF9aewIgFGalYGhZ70h
zjBS/xmDvW09W+kcFtr5L7eopALvkpBVzc7PuSwXE+ev0lyxxXoC0fZ2u8dLmPfClSZ8kVf4
ko05lS/Cu/Zrn4jDRSksYmBk+4nAirNSn7LLNNTtCVymcthokx90xDS2CNVHM7or49cih1lC
756VX7YoqIDTYt7C3tBUSYs5rCW1/LotC43A4/Ai2kiqcRmaggr/
[end]
_ATEOF


$at_traceoff
echo "t_netsync_absorbs.at:32: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <foo_public"
echo t_netsync_absorbs.at:32 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR read <foo_public ) >$at_stdout 2>$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_absorbs.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_netsync_absorbs.at:33: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <foo_private"
echo t_netsync_absorbs.at:33 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR read <foo_private ) >$at_stdout 2>$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_absorbs.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




if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi

$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --rcfile=netsync.lua serve localhost:5555 --key=foo@bar testbranch &
sleep 4



$at_traceoff
echo "t_netsync_absorbs.at:36: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost:5555 testbranch"
echo t_netsync_absorbs.at:36 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost: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_absorbs.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





if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill " $a);}'
  # MinGW has no killall.  The weird a=1 thing is to avoid autotest treating  as its own parameter
else
  killall monotone 2>/dev/null
fi

sleep 1

if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi



$at_traceoff
echo "t_netsync_absorbs.at:39: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db pubkey foo@bar"
echo t_netsync_absorbs.at:39 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db pubkey 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_netsync_absorbs.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_absorbs.at:40:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_netsync_absorbs.at:40 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_absorbs.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_absorbs.at:41: cmp foo_public stdout"
echo t_netsync_absorbs.at:41 >$at_check_line_file
( $at_traceon; cmp foo_public 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;;
   0) ;;
   *) echo "t_netsync_absorbs.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  144 ) # 144. t_netsync_checks_server_key.at:1: netsync verifies server keys
    at_setup_line='t_netsync_checks_server_key.at:1'
    at_desc='netsync verifies server keys'
    $at_quiet $ECHO_N "144: netsync verifies server keys                 $ECHO_C"
    at_xfail=no
    (
      echo "144. t_netsync_checks_server_key.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_checks_server_key.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_netsync_checks_server_key.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_checks_server_key.at:2: exit code was $at_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_checks_server_key.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_netsync_checks_server_key.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_checks_server_key.at:2: exit code was $at_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_checks_server_key.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_netsync_checks_server_key.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_checks_server_key.at:2: exit code was $at_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_checks_server_key.at:2: rm test_keys"
echo t_netsync_checks_server_key.at:2 >$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_checks_server_key.at:2: exit code was $at_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_checks_server_key.at:3: cp test.db test2.db"
echo t_netsync_checks_server_key.at:3 >$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_checks_server_key.at:3: exit code was $at_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_checks_server_key.at:3: cp test.db test3.db"
echo t_netsync_checks_server_key.at:3 >$at_check_line_file
( $at_traceon; cp test.db test3.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_checks_server_key.at:3: 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 >foo <<'_ATEOF'
[pubkey foo@bar]
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDXdNcDvz8ARAxEw7ESs2y60RgT9HdpoPHA
AXvhjWtojgoW8t7RLp+62RUm+c9H2tWFAVMBRtLzd9kFl58f+muDAiQVEJo4rgPy2jjrHO6Z
UtfQv7Fh2d/euba9cbtNPaNjWu7RsnVOo4iEQhb3czeObhE0n+hJ3/dGj9d1IClbCwIBEQ==
[end]
[privkey foo@bar]
gWGUHfbvsqKRQZ7inK1NQUO1cAuNcKENJNvoxhBtQKv6iIZp23ZBSrpBGuKoSnQSPXresXLD
tYc4Ztecez0hBTjGsTmUm1EQLGf2dTJ4dG2nBJGbI2R6QvX9/KJbF1dIc9DCoJGB3XTpVg4R
kMc9IFKM5tzwpNYRx+vpjf5GTamIyj1O5qmQmg7VFWx8uC3hzgW/FnaP9Qh2lnjiaEVDNzjA
7FzTQAPUIcZJNOSQM/Tck0wharmaMzBaM1QZCoTXRgydARVW4eunxdFfK88U/5IICkcEYYII
ssoz73Ukyvz8QQfJSnmbxK6b2x4RSoqOmjt8yC7rMrZOm05ZtaG+OzgFL19M+oZ9Aj3xVO7y
DcEK2gNfBH7deHPcgJCLy42UkciCgstcAwBmrv6KkuRx7R/BqP/Oo+xCQJE0yeFNwmDvNTxV
e0G7STVEoJYBdthevS55RUwrEwnW30q8wsI8FjzRkd5AiO61/WgMxhMsBpyp3ya2qzt5QEAf
qTbOZaFedhQl+m6RsfJSBwjM/PQpLij5FnF/2etlyk9YtaUXyTqu8g4g83uzXfomCZXukbIG
uS34HCqjEqP4zCxyezoKQydn4aiNluijDhvVx8GQGZ1n5coUdpOLWgF9aewIgFGalYGhZ70h
zjBS/xmDvW09W+kcFtr5L7eopALvkpBVzc7PuSwXE+ev0lyxxXoC0fZ2u8dLmPfClSZ8kVf4
ko05lS/Cu/Zrn4jDRSksYmBk+4nAirNSn7LLNNTtCVymcthokx90xDS2CNVHM7or49cih1lC
756VX7YoqIDTYt7C3tBUSYs5rCW1/LotC43A4/Ai2kiqcRmaggr/
[end]
_ATEOF


$at_traceoff
echo "t_netsync_checks_server_key.at:26: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <foo"
echo t_netsync_checks_server_key.at:26 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR read <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_netsync_checks_server_key.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


# Once to let the client note down the key...



if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi

$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --rcfile=netsync.lua serve localhost:5555 testbranch &
sleep 4



$at_traceoff
echo "t_netsync_checks_server_key.at:29: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost:5555 testbranch"
echo t_netsync_checks_server_key.at:29 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost: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_checks_server_key.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





if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill " $a);}'
  # MinGW has no killall.  The weird a=1 thing is to avoid autotest treating  as its own parameter
else
  killall monotone 2>/dev/null
fi

sleep 1

if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi




# Then again with a different key; should fail.


if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi

$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --rcfile=netsync.lua serve localhost:5555 --key=foo@bar testbranch &
sleep 4



$at_traceoff
echo "t_netsync_checks_server_key.at:33: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost:5555 testbranch"
echo t_netsync_checks_server_key.at:33 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost: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;;
   1) ;;
   *) echo "t_netsync_checks_server_key.at:33: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon





if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill " $a);}'
  # MinGW has no killall.  The weird a=1 thing is to avoid autotest treating  as its own parameter
else
  killall monotone 2>/dev/null
fi

sleep 1

if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi



# It shouldn't have absorbed the key, either.
$at_traceoff
echo "t_netsync_checks_server_key.at:37: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db pubkey foo@bar"
echo t_netsync_checks_server_key.at:37 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db pubkey 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   1) ;;
   *) echo "t_netsync_checks_server_key.at:37: 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`
    ;;

  145 ) # 145. t_merge_5.at:1: test a merge 5
    at_setup_line='t_merge_5.at:1'
    at_desc='test a merge 5'
    $at_quiet $ECHO_N "145: test a merge 5                               $ECHO_C"
    at_xfail=yes
    (
      echo "145. t_merge_5.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_5.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_merge_5.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_5.at:2: exit code was $at_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_5.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_merge_5.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_5.at:2: exit code was $at_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_5.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_merge_5.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_5.at:2: exit code was $at_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_5.at:2: rm test_keys"
echo t_merge_5.at:2 >$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_5.at:2: 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 a bug report.



if which mimencode 2>/dev/null; then
  UNB64_COMMAND="mimencode -u"
elif which recode 2>/dev/null; then
  UNB64_COMMAND="recode /Base64"
elif perl -MMIME::Base64 -e 1 2>/dev/null; then
  UNB64_COMMAND="perl -MMIME::Base64 -ne 'print decode_base64(\$_)'"
elif python -c 'import sys;sys.exit(not hasattr("", "decode"))' 2>/dev/null; then
  UNB64_COMMAND="python -c 'import sys;sys.stdout.write(sys.stdin.read().decode("'"'"base64"'"'"))'"
else
  # This is lame!  We should XFAIL the test so the user knows that
  # they're not, you know, actually testing the software.  But
  # Autotest runs XFAIL conditions in a completely different shell, so
  # we can't without duplicating the whole test here.
  exit 77
fi
# Poor man's logging:
$at_traceoff
echo "t_merge_5.at:7: echo \$UNB64_COMMAND"
echo t_merge_5.at:7 >$at_check_line_file
( $at_traceon; echo $UNB64_COMMAND ) >$at_stdout 2>$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_5.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



# Another real merge error. This is the diff between the correct
# result and the file produced by the merge:
#
# --- correct
# +++ testfile
# @@ -99,6 +99,8 @@
#
#    void get_ids(std::string const & table, std::set< hexenc<id> > & ids);
#
# +  void get_ids(std::string const & table, std::set< hexenc<id> > & ids);
# +
#    void get(hexenc<id> const & new_id,
#             base64< gzip<data> > & dat,
#             std::string const & table);

# This seems to be a really nasty testcase somehow.  monotone and
# merge(1) give identical, incorrect output.  diff3(1) reports a
# conflict.  xxdiff merges cleanly, and, AFAICT, correctly.

cat >parent.b64 <<'_ATEOF'

I2lmbmRlZiBfX0RBVEFCQVNFX0hIX18KI2RlZmluZSBfX0RBVEFCQVNFX0hIX18KCi8vIGNvcHly
aWdodCAoQykgMjAwMiwgMjAwMyBncmF5ZG9uIGhvYXJlIDxncmF5ZG9uQHBvYm94LmNvbT4KLy8g
YWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gbGljZW5zZWQgdG8gdGhlIHB1YmxpYyB1bmRlciB0aGUg
dGVybXMgb2YgdGhlIEdOVSBHUEwgKD49IDIpCi8vIHNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBk
ZXRhaWxzCgpzdHJ1Y3Qgc3FsaXRlMzsKc3RydWN0IGNlcnQ7CgojaW5jbHVkZSA8dmVjdG9yPgoj
aW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8c3RyaW5nPgoKI2luY2x1ZGUgPGJvb3N0L2ZpbGVzeXN0
ZW0vcGF0aC5ocHA+CgojaW5jbHVkZSAiY29tbWFuZHMuaGgiCiNpbmNsdWRlICJtYW5pZmVzdC5o
aCIKI2luY2x1ZGUgIm51bWVyaWNfdm9jYWIuaGgiCiNpbmNsdWRlICJ2b2NhYi5oaCIKCnN0cnVj
dCByZXZpc2lvbl9zZXQ7CgovLyB0aGlzIGZpbGUgZGVmaW5lcyBhIHB1YmxpYywgdHlwZWQgaW50
ZXJmYWNlIHRvIHRoZSBkYXRhYmFzZS4KLy8gdGhlIGRhdGFiYXNlIGNsYXNzIGVuY2Fwc3VsYXRl
cyBhbGwga25vd2xlZGdlIGFib3V0IHNxbGl0ZSwKLy8gdGhlIHNjaGVtYSwgYW5kIGFsbCBTUUwg
c3RhdGVtZW50cyB1c2VkIHRvIGFjY2VzcyB0aGUgc2NoZW1hLgovLwovLyBvbmUgdGhpbmcgd2hp
Y2ggaXMgcmF0aGVyIGltcG9ydGFudCB0byBub3RlIGlzIHRoYXQgdGhpcyBmaWxlCi8vIGRlYWxz
IHdpdGggdHdvIHNvcnRzIG9mIHZlcnNpb24gcmVsYXRpb25zaGlwcy4gdGhlIHZlcnNpb25zCi8v
IHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UgYXJlIGFsbCAqYmFja3dhcmRzKiBmcm9tIHRob3NlIHRo
ZSBwcm9ncmFtCi8vIHNlZXMuIHNvIGZvciBleGFtcGxlIGlmIHlvdSBoYXZlIHR3byB2ZXJzaW9u
cyBvZiBhIGZpbGUKLy8gCi8vIGZpbGUuMSwgZmlsZS4yCi8vCi8vIHdoZXJlIGZpbGUuMiB3YXMg
YSBtb2RpZmljYXRpb24gb2YgZmlsZS4xLCB0aGVuIGFzIGZhciBhcyB0aGUgcmVzdCBvZgovLyB0
aGUgYXBwbGljYXRpb24gaXMgY29uY2VybmVkIC0tIGFuZCB0aGUgYW5jZXN0cnkgZ3JhcGggLS0g
ZmlsZS4xIGlzIHRoZQovLyAib2xkIiB2ZXJzaW9uIGFuZCBmaWxlLjIgaXMgdGhlICJuZXciIHZl
cnNpb24uIG5vdGUgdGhlIHVzZSBvZiB0ZXJtcwovLyB3aGljaCBkZXNjcmliZSB0aW1lLCBhbmQg
dGhlIHNlcXVlbmNlIG9mIGVkaXRzIGEgdXNlciBtYWtlcyB0byBhCi8vIGZpbGUuIHRob3NlIGFy
ZSBhbmNlc3RyeSB0ZXJtcy4gd2hlbiB0aGUgYXBwbGljYXRpb24gY29tcG9zZXMgYQovLyBwYXRj
aHNldCwgZm9yIGV4YW1wbGUsIGl0J2xsIGNvbnRhaW4gdGhlIGRpZmYgZGVsdGEoZmlsZS4xLCBm
aWxlLjIpCi8vCi8vIGZyb20gdGhlIGRhdGFiYXNlJ3MgcGVyc3BlY3RpdmUsIGhvd2V2ZXIsIGZp
bGUuMSBpcyB0aGUgZGVyaXZlZCB2ZXJzaW9uLAovLyBhbmQgZmlsZS4yIGlzIHRoZSBiYXNlIHZl
cnNpb24uIHRoZSBiYXNlIHZlcnNpb24gaXMgc3RvcmVkIGluIHRoZQovLyAiZmlsZXMiIHRhYmxl
LCBhbmQgdGhlICpyZXZlcnNlKiBkaWZmIGRlbHRhKGZpbGUuMiwgZmlsZS4xKSBpcyBzdG9yZWQg
aW4KLy8gdGhlICJmaWxlX2RlbHRhcyIgdGFibGUsIHVuZGVyIHRoZSBpZCBvZiBmaWxlLjEsIHdp
dGggdGhlIGlkIG9mIGZpbGUuMgovLyBsaXN0ZWQgYXMgaXRzIGJhc2UuIG5vdGUgdGhlIHVzZSBv
ZiB0aGUgdGVybXMgd2hpY2ggZGVzY3JpYmUKLy8gcmVjb25zdHJ1Y3Rpb247IHRob3NlIGFyZSBz
dG9yYWdlLXN5c3RlbSB0ZXJtcy4KLy8KLy8gdGhlIGludGVyZmFjZSAqdG8qIHRoZSBkYXRhYmFz
ZSwgYW5kIHRoZSBhbmNlc3RyeSB2ZXJzaW9uIGdyYXBocywgdXNlCi8vIHRoZSBvbGQgLyBuZXcg
bWV0YXBob3Igb2YgYW5jZXN0cnksIGJ1dCB3aXRoaW4gdGhlIGRhdGFiYXNlIChpbmNsdWRpbmcK
Ly8gdGhlIHByaXZhdGUgaGVscGVyIG1ldGhvZHMsIGFuZCB0aGUgc3RvcmFnZSB2ZXJzaW9uIGdy
YXBocykgdGhlCi8vIGJhc2UvZGVyaXZlZCBzdG9yYWdlIG1ldGFwaG9yIGlzIHVzZWQuIHRoZSBv
bmx5IHJlYWwgd2F5IHRvIHRlbGwgd2hpY2gKLy8gaXMgd2hpY2ggaXMgdG8gbG9vayBhdCB0aGUg
cGFyYW1ldGVyIG5hbWVzIGFuZCBjb2RlLiBJIG1pZ2h0IHRyeSB0bwovLyBleHByZXNzIHRoaXMg
aW4gdGhlIHR5cGUgc3lzdGVtIHNvbWUgZGF5LCBidXQgbm90IHByZXNlbnRseS4KLy8KLy8gdGhl
IGtleSBwaHJhc2UgdG8ga2VlcCByZXBlYXRpbmcgd2hlbiB3b3JraW5nIG9uIHRoaXMgY29kZSBp
czoKLy8gCi8vICJiYXNlIGZpbGVzIGFyZSBuZXcsIGRlcml2ZWQgZmlsZXMgYXJlIG9sZCIKLy8K
Ly8gaXQgbWFrZXMgdGhlIGNvZGUgY29uZnVzaW5nLCBJIGtub3cuIHRoaXMgaXMgcG9zc2libHkg
dGhlIHdvcnN0IHBhcnQgb2YKLy8gdGhlIHByb2dyYW0uIEkgZG9uJ3Qga25vdyBpZiB0aGVyZSdz
IGFueSB3YXkgdG8gbWFrZSBpdCBjbGVhcmVyLgoKY2xhc3MgdHJhbnNhY3Rpb25fZ3VhcmQ7CnN0
cnVjdCBwb3N0aW5nOwpzdHJ1Y3QgYXBwX3N0YXRlOwoKY2xhc3MgZGF0YWJhc2UKewogIGZzOjpw
YXRoIGZpbGVuYW1lOwogIHN0ZDo6c3RyaW5nIGNvbnN0IHNjaGVtYTsKICB2b2lkIGNoZWNrX3Nj
aGVtYSgpOwoKICBzdHJ1Y3QgYXBwX3N0YXRlICogX19hcHA7CiAgc3RydWN0IHNxbGl0ZTMgKiBf
X3NxbDsKICBzdHJ1Y3Qgc3FsaXRlMyAqIHNxbChib29sIGluaXQgPSBmYWxzZSk7CiAgaW50IHRy
YW5zYWN0aW9uX2xldmVsOwoKICB2b2lkIGluc3RhbGxfZnVuY3Rpb25zKGFwcF9zdGF0ZSAqIGFw
cCk7CiAgdm9pZCBpbnN0YWxsX3ZpZXdzKCk7CgogIHR5cGVkZWYgc3RkOjp2ZWN0b3I8IHN0ZDo6
dmVjdG9yPHN0ZDo6c3RyaW5nPiA+IHJlc3VsdHM7CiAgdm9pZCBleGVjdXRlKGNoYXIgY29uc3Qg
KiBxdWVyeSwgLi4uKTsKICB2b2lkIGZldGNoKHJlc3VsdHMgJiByZXMsIAogICAgICAgICAgICAg
aW50IGNvbnN0IHdhbnRfY29scywgCiAgICAgICAgICAgICBpbnQgY29uc3Qgd2FudF9yb3dzLCAK
ICAgICAgICAgICAgIGNoYXIgY29uc3QgKiBxdWVyeSwgLi4uKTsKCiAgYm9vbCBleGlzdHMoaGV4
ZW5jPGlkPiBjb25zdCAmIGlkZW50LCAKICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCAm
IHRhYmxlKTsKICBib29sIGRlbHRhX2V4aXN0cyhoZXhlbmM8aWQ+IGNvbnN0ICYgaWRlbnQsCiAg
ICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QgJiB0YWJsZSk7CiAgYm9vbCBkZWx0
YV9leGlzdHMoaGV4ZW5jPGlkPiBjb25zdCAmIGlkZW50LAogICAgICAgICAgICAgICAgICAgIGhl
eGVuYzxpZD4gY29uc3QgJiBiYXNlLAogICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNv
bnN0ICYgdGFibGUpOwoKICBpbnQgY291bnQoc3RkOjpzdHJpbmcgY29uc3QgJiB0YWJsZSk7Cgog
IHZvaWQgZ2V0KGhleGVuYzxpZD4gY29uc3QgJiBuZXdfaWQsCiAgICAgICAgICAgYmFzZTY0PCBn
emlwPGRhdGE+ID4gJiBkYXQsCiAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QgJiB0YWJsZSk7
CiAgdm9pZCBnZXRfZGVsdGEoaGV4ZW5jPGlkPiBjb25zdCAmIGlkZW50LAogICAgICAgICAgICAg
ICAgIGhleGVuYzxpZD4gY29uc3QgJiBiYXNlLAogICAgICAgICAgICAgICAgIGJhc2U2NDwgZ3pp
cDxkZWx0YT4gPiAmIGRlbCwKICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCAmIHRh
YmxlKTsKICB2b2lkIGdldF92ZXJzaW9uKGhleGVuYzxpZD4gY29uc3QgJiBpZCwKICAgICAgICAg
ICAgICAgICAgIGJhc2U2NDwgZ3ppcDxkYXRhPiA+ICYgZGF0LAogICAgICAgICAgICAgICAgICAg
c3RkOjpzdHJpbmcgY29uc3QgJiBkYXRhX3RhYmxlLAogICAgICAgICAgICAgICAgICAgc3RkOjpz
dHJpbmcgY29uc3QgJiBkZWx0YV90YWJsZSk7CiAgCiAgdm9pZCBwdXQoaGV4ZW5jPGlkPiBjb25z
dCAmIG5ld19pZCwKICAgICAgICAgICBiYXNlNjQ8IGd6aXA8ZGF0YT4gPiBjb25zdCAmIGRhdCwK
ICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCAmIHRhYmxlKTsKICB2b2lkIGRyb3AoaGV4ZW5j
PGlkPiBjb25zdCAmIGJhc2UsCiAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0ICYgdGFibGUp
OwogIHZvaWQgcHV0X2RlbHRhKGhleGVuYzxpZD4gY29uc3QgJiBpZCwKICAgICAgICAgICAgICAg
ICBoZXhlbmM8aWQ+IGNvbnN0ICYgYmFzZSwKICAgICAgICAgICAgICAgICBiYXNlNjQ8IGd6aXA8
ZGVsdGE+ID4gY29uc3QgJiBkZWwsCiAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3Qg
JiB0YWJsZSk7CiAgdm9pZCBwdXRfdmVyc2lvbihoZXhlbmM8aWQ+IGNvbnN0ICYgb2xkX2lkLAog
ICAgICAgICAgICAgICAgICAgaGV4ZW5jPGlkPiBjb25zdCAmIG5ld19pZCwKICAgICAgICAgICAg
ICAgICAgIGJhc2U2NDwgZ3ppcDxkZWx0YT4gPiBjb25zdCAmIGRlbCwKICAgICAgICAgICAgICAg
ICAgIHN0ZDo6c3RyaW5nIGNvbnN0ICYgZGF0YV90YWJsZSwKICAgICAgICAgICAgICAgICAgIHN0
ZDo6c3RyaW5nIGNvbnN0ICYgZGVsdGFfdGFibGUpOwogIHZvaWQgcHV0X3JldmVyc2VfdmVyc2lv
bihoZXhlbmM8aWQ+IGNvbnN0ICYgbmV3X2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICBo
ZXhlbmM8aWQ+IGNvbnN0ICYgb2xkX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNl
NjQ8IGd6aXA8ZGVsdGE+ID4gY29uc3QgJiByZXZlcnNlX2RlbCwKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QgJiBkYXRhX3RhYmxlLAogICAgICAgICAgICAgICAg
ICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCAmIGRlbHRhX3RhYmxlKTsKCiAgYm9vbCBjZXJ0
X2V4aXN0cyhjZXJ0IGNvbnN0ICYgdCwKICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29u
c3QgJiB0YWJsZSk7CiAgdm9pZCBwdXRfY2VydChjZXJ0IGNvbnN0ICYgdCwgc3RkOjpzdHJpbmcg
Y29uc3QgJiB0YWJsZSk7ICAKICB2b2lkIHJlc3VsdHNfdG9fY2VydHMocmVzdWx0cyBjb25zdCAm
IHJlcywKICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxjZXJ0PiAmIGNlcnRzKTsK
CiAgdm9pZCBnZXRfY2VydHMoaGV4ZW5jPGlkPiBjb25zdCAmIGlkLCAKICAgICAgICAgICAgICAg
IHN0ZDo6dmVjdG9yPCBjZXJ0ID4gJiBjZXJ0cywKICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5n
IGNvbnN0ICYgdGFibGUpOyAgCgogIHZvaWQgZ2V0X2NlcnRzKGNlcnRfbmFtZSBjb25zdCAmIG5h
bWUsICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPCBjZXJ0ID4gJiBj
ZXJ0cywKICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0ICYgdGFibGUpOwoKICB2b2lk
IGdldF9jZXJ0cyhoZXhlbmM8aWQ+IGNvbnN0ICYgaWQsCiAgICAgICAgICAgICAgICBjZXJ0X25h
bWUgY29uc3QgJiBuYW1lLAogICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8IGNlcnQgPiAmIGNl
cnRzLAogICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QgJiB0YWJsZSk7ICAKCiAgdm9p
ZCBnZXRfY2VydHMoaGV4ZW5jPGlkPiBjb25zdCAmIGlkLAogICAgICAgICAgICAgICAgY2VydF9u
YW1lIGNvbnN0ICYgbmFtZSwKICAgICAgICAgICAgICAgIGJhc2U2NDxjZXJ0X3ZhbHVlPiBjb25z
dCAmIHZhbCwgCiAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjwgY2VydCA+ICYgY2VydHMsCiAg
ICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCAmIHRhYmxlKTsgIAoKICB2b2lkIGdldF9j
ZXJ0cyhjZXJ0X25hbWUgY29uc3QgJiBuYW1lLAogICAgICAgICAgICAgICAgYmFzZTY0PGNlcnRf
dmFsdWU+IGNvbnN0ICYgdmFsLCAKICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNlcnQ+ICYg
Y2VydHMsCiAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCAmIHRhYmxlKTsKCiAgdm9p
ZCBiZWdpbl90cmFuc2FjdGlvbigpOwogIHZvaWQgY29tbWl0X3RyYW5zYWN0aW9uKCk7CiAgdm9p
ZCByb2xsYmFja190cmFuc2FjdGlvbigpOwogIGZyaWVuZCBjbGFzcyB0cmFuc2FjdGlvbl9ndWFy
ZDsKICBmcmllbmQgdm9pZCByY3NfcHV0X3Jhd19maWxlX2VkZ2UoaGV4ZW5jPGlkPiBjb25zdCAm
IG9sZF9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGV4ZW5jPGlkPiBj
b25zdCAmIG5ld19pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0
PCBnemlwPGRlbHRhPiA+IGNvbnN0ICYgZGVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBkYXRhYmFzZSAmIGRiKTsKICBmcmllbmQgdm9pZCByY3NfcHV0X3Jhd19tYW5pZmVz
dF9lZGdlKGhleGVuYzxpZD4gY29uc3QgJiBvbGRfaWQsCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBoZXhlbmM8aWQ+IGNvbnN0ICYgbmV3X2lkLAogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0PCBnemlwPGRlbHRhPiA+IGNvbnN0ICYg
ZGVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2UgJiBk
Yik7CgpwdWJsaWM6CgogIGRhdGFiYXNlKGZzOjpwYXRoIGNvbnN0ICYgZmlsZSk7CgogIHVuc2ln
bmVkIGxvbmcgZ2V0X3N0YXRpc3RpYyhzdGQ6OnN0cmluZyBjb25zdCAmIHF1ZXJ5KTsKICB2b2lk
IHNldF9maWxlbmFtZShmczo6cGF0aCBjb25zdCAmIGZpbGUpOwogIHZvaWQgaW5pdGlhbGl6ZSgp
OwogIHZvaWQgZGVidWcoc3RkOjpzdHJpbmcgY29uc3QgJiBzcWwsIHN0ZDo6b3N0cmVhbSAmIG91
dCk7CiAgdm9pZCBkdW1wKHN0ZDo6b3N0cmVhbSAmKTsKICB2b2lkIGxvYWQoc3RkOjppc3RyZWFt
ICYpOwogIHZvaWQgaW5mbyhzdGQ6Om9zdHJlYW0gJik7CiAgdm9pZCB2ZXJzaW9uKHN0ZDo6b3N0
cmVhbSAmKTsKICB2b2lkIG1pZ3JhdGUoKTsKICB2b2lkIHJlaGFzaCgpOwogIHZvaWQgZW5zdXJl
X29wZW4oKTsKICAKICBib29sIGZpbGVfdmVyc2lvbl9leGlzdHMoZmlsZV9pZCBjb25zdCAmIGlk
KTsKICBib29sIG1hbmlmZXN0X3ZlcnNpb25fZXhpc3RzKG1hbmlmZXN0X2lkIGNvbnN0ICYgaWQp
OwogIGJvb2wgcmV2aXNpb25fZXhpc3RzKHJldmlzaW9uX2lkIGNvbnN0ICYgaWQpOwogIHZvaWQg
c2V0X2FwcChhcHBfc3RhdGUgKiBhcHApOwogIAogIC8vIGdldCBwbGFpbiB2ZXJzaW9uIGlmIGl0
IGV4aXN0cywgb3IgcmVjb25zdHJ1Y3QgdmVyc2lvbgogIC8vIGZyb20gZGVsdGFzIChpZiB0aGV5
IGV4aXN0KQogIHZvaWQgZ2V0X2ZpbGVfdmVyc2lvbihmaWxlX2lkIGNvbnN0ICYgaWQsCiAgICAg
ICAgICAgICAgICAgICAgICAgIGZpbGVfZGF0YSAmIGRhdCk7CgogIC8vIGdldCBmaWxlIGRlbHRh
IGlmIGl0IGV4aXN0cywgZWxzZSBjYWxjdWxhdGUgaXQuCiAgLy8gYm90aCBtYW5pZmVzdHMgbXVz
dCBleGlzdC4KICB2b2lkIGdldF9maWxlX2RlbHRhKGZpbGVfaWQgY29uc3QgJiBzcmMsCiAgICAg
ICAgICAgICAgICAgICAgICBmaWxlX2lkIGNvbnN0ICYgZHN0LAogICAgICAgICAgICAgICAgICAg
ICAgZmlsZV9kZWx0YSAmIGRlbCk7CgogIC8vIHB1dCBmaWxlIHcvbyBwcmVkZWNlc3NvciBpbnRv
IGRiCiAgdm9pZCBwdXRfZmlsZShmaWxlX2lkIGNvbnN0ICYgbmV3X2lkLAogICAgICAgICAgICAg
ICAgZmlsZV9kYXRhIGNvbnN0ICYgZGF0KTsKCiAgLy8gc3RvcmUgbmV3IHZlcnNpb24gYW5kIHVw
ZGF0ZSBvbGQgdmVyc2lvbiB0byBiZSBhIGRlbHRhCiAgdm9pZCBwdXRfZmlsZV92ZXJzaW9uKGZp
bGVfaWQgY29uc3QgJiBvbGRfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfaWQgY29u
c3QgJiBuZXdfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfZGVsdGEgY29uc3QgJiBk
ZWwpOwoKICAvLyBsb2FkIGluIGEgImRpcmVjdCIgbmV3IC0+IG9sZCByZXZlcnNlIGVkZ2UgKHVz
ZWQgZHVyaW5nCiAgLy8gbmV0c3luYyBhbmQgQ1ZTIGxvYWQtaW4pCiAgdm9pZCBwdXRfZmlsZV9y
ZXZlcnNlX3ZlcnNpb24oZmlsZV9pZCBjb25zdCAmIG9sZF9pZCwKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBmaWxlX2lkIGNvbnN0ICYgbmV3X2lkLAogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGZpbGVfZGVsdGEgY29uc3QgJiBkZWwpOwoKICAvLyBnZXQgcGxhaW4gdmVy
c2lvbiBpZiBpdCBleGlzdHMsIG9yIHJlY29uc3RydWN0IHZlcnNpb24KICAvLyBmcm9tIGRlbHRh
cyAoaWYgdGhleSBleGlzdCkuIAogIHZvaWQgZ2V0X21hbmlmZXN0X3ZlcnNpb24obWFuaWZlc3Rf
aWQgY29uc3QgJiBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0X2RhdGEg
JiBkYXQpOwoKICAvLyBnZXQgYSBjb25zdHJ1Y3RlZCBtYW5pZmVzdAogIHZvaWQgZ2V0X21hbmlm
ZXN0KG1hbmlmZXN0X2lkIGNvbnN0ICYgaWQsCiAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3Rf
bWFwICYgbW0pOwoKICAvLyBnZXQgbWFuaWZlc3QgZGVsdGEgaWYgaXQgZXhpc3RzLCBlbHNlIGNh
bGN1bGF0ZSBpdC4KICAvLyBib3RoIG1hbmlmZXN0cyBtdXN0IGV4aXN0LgogIHZvaWQgZ2V0X21h
bmlmZXN0X2RlbHRhKG1hbmlmZXN0X2lkIGNvbnN0ICYgc3JjLAogICAgICAgICAgICAgICAgICAg
ICAgICAgIG1hbmlmZXN0X2lkIGNvbnN0ICYgZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAg
IG1hbmlmZXN0X2RlbHRhICYgZGVsKTsKCiAgLy8gcHV0IG1hbmlmZXN0IHcvbyBwcmVkZWNlc3Nv
ciBpbnRvIGRiCiAgdm9pZCBwdXRfbWFuaWZlc3QobWFuaWZlc3RfaWQgY29uc3QgJiBuZXdfaWQs
CiAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RfZGF0YSBjb25zdCAmIGRhdCk7CgogIC8vIHN0
b3JlIG5ldyB2ZXJzaW9uIGFuZCB1cGRhdGUgb2xkIHZlcnNpb24gdG8gYmUgYSBkZWx0YQogIHZv
aWQgcHV0X21hbmlmZXN0X3ZlcnNpb24obWFuaWZlc3RfaWQgY29uc3QgJiBvbGRfaWQsCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBtYW5pZmVzdF9pZCBjb25zdCAmIG5ld19pZCwKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0X2RlbHRhIGNvbnN0ICYgZGVsKTsKCiAgLy8g
bG9hZCBpbiBhICJkaXJlY3QiIG5ldyAtPiBvbGQgcmV2ZXJzZSBlZGdlICh1c2VkIGR1cmluZwog
IC8vIG5ldHN5bmMgYW5kIENWUyBsb2FkLWluKQogIHZvaWQgcHV0X21hbmlmZXN0X3JldmVyc2Vf
dmVyc2lvbihtYW5pZmVzdF9pZCBjb25zdCAmIG9sZF9pZCwKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgbWFuaWZlc3RfaWQgY29uc3QgJiBuZXdfaWQsCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0X2RlbHRhIGNvbnN0ICYgZGVsKTsKCgogIHZv
aWQgZ2V0X3JldmlzaW9uX2FuY2VzdHJ5KHN0ZDo6bXVsdGltYXA8cmV2aXNpb25faWQsIHJldmlz
aW9uX2lkPiAmIGdyYXBoKTsKCiAgdm9pZCBnZXRfcmV2aXNpb25fcGFyZW50cyhyZXZpc2lvbl9p
ZCBjb25zdCAmIGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNldDxyZXZpc2lv
bl9pZD4gJiBwYXJlbnRzKTsKCiAgdm9pZCBnZXRfcmV2aXNpb25fY2hpbGRyZW4ocmV2aXNpb25f
aWQgY29uc3QgJiBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNldDxyZXZp
c2lvbl9pZD4gJiBjaGlsZHJlbik7CgogIHZvaWQgZ2V0X3JldmlzaW9uX21hbmlmZXN0KHJldmlz
aW9uX2lkIGNvbnN0ICYgY2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3Rf
aWQgJiBtaWQpOwoKICB2b2lkIGdldF9yZXZpc2lvbihyZXZpc2lvbl9pZCBjb25zdCAmIGlkLAog
ICAgICAgICAgICAgICAgICAgcmV2aXNpb25fc2V0ICYgY3MpOwoKICB2b2lkIGdldF9yZXZpc2lv
bihyZXZpc2lvbl9pZCBjb25zdCAmIGlkLAogICAgICAgICAgICAgICAgICAgcmV2aXNpb25fZGF0
YSAmIGRhdCk7CgogIHZvaWQgcHV0X3JldmlzaW9uKHJldmlzaW9uX2lkIGNvbnN0ICYgbmV3X2lk
LAogICAgICAgICAgICAgICAgICAgcmV2aXNpb25fc2V0IGNvbnN0ICYgY3MpOwoKICB2b2lkIHB1
dF9yZXZpc2lvbihyZXZpc2lvbl9pZCBjb25zdCAmIG5ld19pZCwKICAgICAgICAgICAgICAgICAg
ICByZXZpc2lvbl9kYXRhIGNvbnN0ICYgZGF0KTsKICAKICB2b2lkIGRlbGV0ZV9leGlzdGluZ19y
ZXZzX2FuZF9jZXJ0cygpOwoKICAvLyBjcnlwdG8ga2V5IC8gY2VydCBvcGVyYXRpb25zCgogIHZv
aWQgZ2V0X2tleV9pZHMoc3RkOjpzdHJpbmcgY29uc3QgJiBwYXR0ZXJuLAogICAgICAgICAgICAg
ICAgICAgc3RkOjp2ZWN0b3I8cnNhX2tleXBhaXJfaWQ+ICYgcHVia2V5cywKICAgICAgICAgICAg
ICAgICAgIHN0ZDo6dmVjdG9yPHJzYV9rZXlwYWlyX2lkPiAmIHByaXZrZXlzKTsKCiAgdm9pZCBn
ZXRfcHJpdmF0ZV9rZXlzKHN0ZDo6dmVjdG9yPHJzYV9rZXlwYWlyX2lkPiAmIHByaXZrZXlzKTsK
CiAgYm9vbCBrZXlfZXhpc3RzKHJzYV9rZXlwYWlyX2lkIGNvbnN0ICYgaWQpOwoKICBib29sIHB1
YmxpY19rZXlfZXhpc3RzKGhleGVuYzxpZD4gY29uc3QgJiBoYXNoKTsKICBib29sIHB1YmxpY19r
ZXlfZXhpc3RzKHJzYV9rZXlwYWlyX2lkIGNvbnN0ICYgaWQpOwogIGJvb2wgcHJpdmF0ZV9rZXlf
ZXhpc3RzKHJzYV9rZXlwYWlyX2lkIGNvbnN0ICYgaWQpOwogIAogIHZvaWQgZ2V0X3B1YmtleSho
ZXhlbmM8aWQ+IGNvbnN0ICYgaGFzaCwgCiAgICAgICAgICAgICAgICAgIHJzYV9rZXlwYWlyX2lk
ICYgaWQsCiAgICAgICAgICAgICAgICAgIGJhc2U2NDxyc2FfcHViX2tleT4gJiBwdWJfZW5jb2Rl
ZCk7CgogIHZvaWQgZ2V0X2tleShyc2Ffa2V5cGFpcl9pZCBjb25zdCAmIGlkLCAKICAgICAgICAg
ICAgICAgYmFzZTY0PHJzYV9wdWJfa2V5PiAmIHB1Yl9lbmNvZGVkKTsKCiAgdm9pZCBnZXRfa2V5
KHJzYV9rZXlwYWlyX2lkIGNvbnN0ICYgaWQsIAogICAgICAgICAgICAgICBiYXNlNjQ8IGFyYzQ8
cnNhX3ByaXZfa2V5PiA+ICYgcHJpdl9lbmNvZGVkKTsKCiAgdm9pZCBwdXRfa2V5KHJzYV9rZXlw
YWlyX2lkIGNvbnN0ICYgaWQsIAogICAgICAgICAgICAgICBiYXNlNjQ8cnNhX3B1Yl9rZXk+IGNv
bnN0ICYgcHViX2VuY29kZWQpOwogIAogIHZvaWQgcHV0X2tleShyc2Ffa2V5cGFpcl9pZCBjb25z
dCAmIGlkLCAKICAgICAgICAgICAgICAgYmFzZTY0PCBhcmM0PHJzYV9wcml2X2tleT4gPiBjb25z
dCAmIHByaXZfZW5jb2RlZCk7CiAgCiAgdm9pZCBwdXRfa2V5X3BhaXIocnNhX2tleXBhaXJfaWQg
Y29uc3QgJiBwdWJfaWQsIAogICAgICAgICAgICAgICAgICAgIGJhc2U2NDxyc2FfcHViX2tleT4g
Y29uc3QgJiBwdWJfZW5jb2RlZCwKICAgICAgICAgICAgICAgICAgICBiYXNlNjQ8IGFyYzQ8cnNh
X3ByaXZfa2V5PiA+IGNvbnN0ICYgcHJpdl9lbmNvZGVkKTsKCiAgdm9pZCBkZWxldGVfcHJpdmF0
ZV9rZXkocnNhX2tleXBhaXJfaWQgY29uc3QgJiBwdWJfaWQpOwoKICAvLyBub3RlOiB0aGlzIHNl
Y3Rpb24gaXMgcmlkaWN1bG91cy4gcGxlYXNlIGRvIHNvbWV0aGluZyBhYm91dCBpdC4KCiAgYm9v
bCBtYW5pZmVzdF9jZXJ0X2V4aXN0cyhtYW5pZmVzdDxjZXJ0PiBjb25zdCAmIGNlcnQpOwogIGJv
b2wgbWFuaWZlc3RfY2VydF9leGlzdHMoaGV4ZW5jPGlkPiBjb25zdCAmIGhhc2gpOwogIHZvaWQg
cHV0X21hbmlmZXN0X2NlcnQobWFuaWZlc3Q8Y2VydD4gY29uc3QgJiBjZXJ0KTsKCiAgYm9vbCBy
ZXZpc2lvbl9jZXJ0X2V4aXN0cyhyZXZpc2lvbjxjZXJ0PiBjb25zdCAmIGNlcnQpOwogIGJvb2wg
cmV2aXNpb25fY2VydF9leGlzdHMoaGV4ZW5jPGlkPiBjb25zdCAmIGhhc2gpOwoKICB2b2lkIHB1
dF9yZXZpc2lvbl9jZXJ0KHJldmlzaW9uPGNlcnQ+IGNvbnN0ICYgY2VydCk7CgogIC8vIHRoaXMg
dmFyaWFudCBoYXMgdG8gYmUgcmF0aGVyIGNvYXJzZSBhbmQgZmFzdCwgZm9yIG5ldHN5bmMncyB1
c2UKICB2b2lkIGdldF9yZXZpc2lvbl9jZXJ0X2luZGV4KHN0ZDo6dmVjdG9yPCBzdGQ6OnBhaXI8
aGV4ZW5jPGlkPiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjxyZXZp
c2lvbl9pZCwgcnNhX2tleXBhaXJfaWQ+ID4gPiAmIGlkeCk7CgogIHZvaWQgZ2V0X3JldmlzaW9u
X2NlcnRzKGNlcnRfbmFtZSBjb25zdCAmIG5hbWUsIAogICAgICAgICAgICAgICAgICAgICAgICAg
c3RkOjp2ZWN0b3I8IHJldmlzaW9uPGNlcnQ+ID4gJiBjZXJ0cyk7CgogIHZvaWQgZ2V0X3Jldmlz
aW9uX2NlcnRzKHJldmlzaW9uX2lkIGNvbnN0ICYgaWQsIAogICAgICAgICAgICAgICAgICAgICAg
ICAgY2VydF9uYW1lIGNvbnN0ICYgbmFtZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6
OnZlY3RvcjwgcmV2aXNpb248Y2VydD4gPiAmIGNlcnRzKTsKCiAgdm9pZCBnZXRfcmV2aXNpb25f
Y2VydHMoY2VydF9uYW1lIGNvbnN0ICYgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGJh
c2U2NDxjZXJ0X3ZhbHVlPiBjb25zdCAmIHZhbCwgCiAgICAgICAgICAgICAgICAgICAgICAgICBz
dGQ6OnZlY3RvcjwgcmV2aXNpb248Y2VydD4gPiAmIGNlcnRzKTsKCiAgdm9pZCBnZXRfcmV2aXNp
b25fY2VydHMocmV2aXNpb25faWQgY29uc3QgJiBpZCwgCiAgICAgICAgICAgICAgICAgICAgICAg
ICBjZXJ0X25hbWUgY29uc3QgJiBuYW1lLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U2
NDxjZXJ0X3ZhbHVlPiBjb25zdCAmIHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgc3Rk
Ojp2ZWN0b3I8IHJldmlzaW9uPGNlcnQ+ID4gJiBjZXJ0cyk7CgogIHZvaWQgZ2V0X3JldmlzaW9u
X2NlcnRzKHJldmlzaW9uX2lkIGNvbnN0ICYgaWQsIAogICAgICAgICAgICAgICAgICAgICAgICAg
c3RkOjp2ZWN0b3I8IHJldmlzaW9uPGNlcnQ+ID4gJiBjZXJ0cyk7CgogIHZvaWQgZ2V0X3Jldmlz
aW9uX2NlcnQoaGV4ZW5jPGlkPiBjb25zdCAmIGhhc2gsCiAgICAgICAgICAgICAgICAgICAgICAg
ICByZXZpc2lvbjxjZXJ0PiAmIGNlcnQpOwogIAogIHZvaWQgZ2V0X21hbmlmZXN0X2NlcnRzKG1h
bmlmZXN0X2lkIGNvbnN0ICYgaWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVj
dG9yPCBtYW5pZmVzdDxjZXJ0PiA+ICYgY2VydHMpOwoKICB2b2lkIGdldF9tYW5pZmVzdF9jZXJ0
cyhjZXJ0X25hbWUgY29uc3QgJiBuYW1lLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6
OnZlY3RvcjwgbWFuaWZlc3Q8Y2VydD4gPiAmIGNlcnRzKTsKCiAgdm9pZCBnZXRfbWFuaWZlc3Rf
Y2VydHMobWFuaWZlc3RfaWQgY29uc3QgJiBpZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAg
Y2VydF9uYW1lIGNvbnN0ICYgbmFtZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2
ZWN0b3I8IG1hbmlmZXN0PGNlcnQ+ID4gJiBjZXJ0cyk7CiAgCiAgdm9pZCBnZXRfbWFuaWZlc3Rf
Y2VydChoZXhlbmM8aWQ+IGNvbnN0ICYgaGFzaCwKICAgICAgICAgICAgICAgICAgICAgICAgIG1h
bmlmZXN0PGNlcnQ+ICYgY2VydCk7CgogIAogIC8vIG1lcmtsZSB0cmVlIHN0dWZmCgogIGJvb2wg
bWVya2xlX25vZGVfZXhpc3RzKHN0ZDo6c3RyaW5nIGNvbnN0ICYgdHlwZSwKICAgICAgICAgICAg
ICAgICAgICAgICAgICB1dGY4IGNvbnN0ICYgY29sbGVjdGlvbiwgCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgc2l6ZV90IGxldmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgIGhleGVuYzxw
cmVmaXg+IGNvbnN0ICYgcHJlZml4KTsKICAKICB2b2lkIGdldF9tZXJrbGVfbm9kZShzdGQ6OnN0
cmluZyBjb25zdCAmIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgdXRmOCBjb25zdCAmIGNv
bGxlY3Rpb24sIAogICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZXZlbCwKICAgICAgICAg
ICAgICAgICAgICAgICBoZXhlbmM8cHJlZml4PiBjb25zdCAmIHByZWZpeCwKICAgICAgICAgICAg
ICAgICAgICAgICBiYXNlNjQ8bWVya2xlPiAmIG5vZGUpOwoKICB2b2lkIHB1dF9tZXJrbGVfbm9k
ZShzdGQ6OnN0cmluZyBjb25zdCAmIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgdXRmOCBj
b25zdCAmIGNvbGxlY3Rpb24sIAogICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZXZlbCwK
ICAgICAgICAgICAgICAgICAgICAgICBoZXhlbmM8cHJlZml4PiBjb25zdCAmIHByZWZpeCwKICAg
ICAgICAgICAgICAgICAgICAgICBiYXNlNjQ8bWVya2xlPiBjb25zdCAmIG5vZGUpOwoKICB2b2lk
IGVyYXNlX21lcmtsZV9ub2RlcyhzdGQ6OnN0cmluZyBjb25zdCAmIHR5cGUsCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgdXRmOCBjb25zdCAmIGNvbGxlY3Rpb24pOwoKICAvLyBjb21wbGV0aW9u
IHN0dWZmCgogIHZvaWQgY29tcGxldGUoc3RkOjpzdHJpbmcgY29uc3QgJiBwYXJ0aWFsLAogICAg
ICAgICAgICAgICAgc3RkOjpzZXQ8cmV2aXNpb25faWQ+ICYgY29tcGxldGlvbnMpOwoKICB2b2lk
IGNvbXBsZXRlKHN0ZDo6c3RyaW5nIGNvbnN0ICYgcGFydGlhbCwKICAgICAgICAgICAgICAgIHN0
ZDo6c2V0PG1hbmlmZXN0X2lkPiAmIGNvbXBsZXRpb25zKTsKICAKICB2b2lkIGNvbXBsZXRlKHN0
ZDo6c3RyaW5nIGNvbnN0ICYgcGFydGlhbCwKICAgICAgICAgICAgICAgIHN0ZDo6c2V0PGZpbGVf
aWQ+ICYgY29tcGxldGlvbnMpOwoKICB2b2lkIGNvbXBsZXRlKGNvbW1hbmRzOjpzZWxlY3Rvcl90
eXBlIHR5LAogICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QgJiBwYXJ0aWFsLAogICAg
ICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGNvbW1hbmRzOjpzZWxlY3Rvcl90eXBl
LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZz4gPiBj
b25zdCAmIGxpbWl0LAogICAgICAgICAgICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+ICYgY29t
cGxldGlvbnMpOwogIAogIH5kYXRhYmFzZSgpOwoKfTsKCi8vIHRyYW5zYWN0aW9uIGd1YXJkcyBu
ZXN0LiBhY3F1aXJlIG9uZSBpbiBhbnkgc2NvcGUgeW91J2QgbGlrZQovLyB0cmFuc2FjdGlvbi1w
cm90ZWN0ZWQsIGFuZCBpdCdsbCBtYWtlIHN1cmUgdGhlIGRiIGFib3J0cyBhCi8vIHR4biBpZiB0
aGVyZSdzIGFueSBleGNlcHRpb24gYmVmb3JlIHlvdSBjYWxsIGNvbW1pdCgpCgpjbGFzcyB0cmFu
c2FjdGlvbl9ndWFyZAp7CiAgYm9vbCBjb21taXR0ZWQ7CiAgZGF0YWJhc2UgJiBkYjsKcHVibGlj
OgogIHRyYW5zYWN0aW9uX2d1YXJkKGRhdGFiYXNlICYgZCk7CiAgfnRyYW5zYWN0aW9uX2d1YXJk
KCk7CiAgdm9pZCBjb21taXQoKTsKfTsKCgoKI2VuZGlmIC8vIF9fREFUQUJBU0VfSEhfXwo=
_ATEOF


cat >left.b64 <<'_ATEOF'

I2lmbmRlZiBfX0RBVEFCQVNFX0hIX18KI2RlZmluZSBfX0RBVEFCQVNFX0hIX18KCi8vIGNvcHly
aWdodCAoQykgMjAwMiwgMjAwMyBncmF5ZG9uIGhvYXJlIDxncmF5ZG9uQHBvYm94LmNvbT4KLy8g
YWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gbGljZW5zZWQgdG8gdGhlIHB1YmxpYyB1bmRlciB0aGUg
dGVybXMgb2YgdGhlIEdOVSBHUEwgKD49IDIpCi8vIHNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBk
ZXRhaWxzCgpzdHJ1Y3Qgc3FsaXRlMzsKc3RydWN0IGNlcnQ7CgojaW5jbHVkZSA8dmVjdG9yPgoj
aW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8c3RyaW5nPgoKI2luY2x1ZGUg
PGJvb3N0L2ZpbGVzeXN0ZW0vcGF0aC5ocHA+CgojaW5jbHVkZSAiY29tbWFuZHMuaGgiCiNpbmNs
dWRlICJtYW5pZmVzdC5oaCIKI2luY2x1ZGUgIm51bWVyaWNfdm9jYWIuaGgiCiNpbmNsdWRlICJ2
b2NhYi5oaCIKCnN0cnVjdCByZXZpc2lvbl9zZXQ7CgovLyB0aGlzIGZpbGUgZGVmaW5lcyBhIHB1
YmxpYywgdHlwZWQgaW50ZXJmYWNlIHRvIHRoZSBkYXRhYmFzZS4KLy8gdGhlIGRhdGFiYXNlIGNs
YXNzIGVuY2Fwc3VsYXRlcyBhbGwga25vd2xlZGdlIGFib3V0IHNxbGl0ZSwKLy8gdGhlIHNjaGVt
YSwgYW5kIGFsbCBTUUwgc3RhdGVtZW50cyB1c2VkIHRvIGFjY2VzcyB0aGUgc2NoZW1hLgovLwov
LyBvbmUgdGhpbmcgd2hpY2ggaXMgcmF0aGVyIGltcG9ydGFudCB0byBub3RlIGlzIHRoYXQgdGhp
cyBmaWxlCi8vIGRlYWxzIHdpdGggdHdvIHNvcnRzIG9mIHZlcnNpb24gcmVsYXRpb25zaGlwcy4g
dGhlIHZlcnNpb25zCi8vIHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UgYXJlIGFsbCAqYmFja3dhcmRz
KiBmcm9tIHRob3NlIHRoZSBwcm9ncmFtCi8vIHNlZXMuIHNvIGZvciBleGFtcGxlIGlmIHlvdSBo
YXZlIHR3byB2ZXJzaW9ucyBvZiBhIGZpbGUKLy8gCi8vIGZpbGUuMSwgZmlsZS4yCi8vCi8vIHdo
ZXJlIGZpbGUuMiB3YXMgYSBtb2RpZmljYXRpb24gb2YgZmlsZS4xLCB0aGVuIGFzIGZhciBhcyB0
aGUgcmVzdCBvZgovLyB0aGUgYXBwbGljYXRpb24gaXMgY29uY2VybmVkIC0tIGFuZCB0aGUgYW5j
ZXN0cnkgZ3JhcGggLS0gZmlsZS4xIGlzIHRoZQovLyAib2xkIiB2ZXJzaW9uIGFuZCBmaWxlLjIg
aXMgdGhlICJuZXciIHZlcnNpb24uIG5vdGUgdGhlIHVzZSBvZiB0ZXJtcwovLyB3aGljaCBkZXNj
cmliZSB0aW1lLCBhbmQgdGhlIHNlcXVlbmNlIG9mIGVkaXRzIGEgdXNlciBtYWtlcyB0byBhCi8v
IGZpbGUuIHRob3NlIGFyZSBhbmNlc3RyeSB0ZXJtcy4gd2hlbiB0aGUgYXBwbGljYXRpb24gY29t
cG9zZXMgYQovLyBwYXRjaHNldCwgZm9yIGV4YW1wbGUsIGl0J2xsIGNvbnRhaW4gdGhlIGRpZmYg
ZGVsdGEoZmlsZS4xLCBmaWxlLjIpCi8vCi8vIGZyb20gdGhlIGRhdGFiYXNlJ3MgcGVyc3BlY3Rp
dmUsIGhvd2V2ZXIsIGZpbGUuMSBpcyB0aGUgZGVyaXZlZCB2ZXJzaW9uLAovLyBhbmQgZmlsZS4y
IGlzIHRoZSBiYXNlIHZlcnNpb24uIHRoZSBiYXNlIHZlcnNpb24gaXMgc3RvcmVkIGluIHRoZQov
LyAiZmlsZXMiIHRhYmxlLCBhbmQgdGhlICpyZXZlcnNlKiBkaWZmIGRlbHRhKGZpbGUuMiwgZmls
ZS4xKSBpcyBzdG9yZWQgaW4KLy8gdGhlICJmaWxlX2RlbHRhcyIgdGFibGUsIHVuZGVyIHRoZSBp
ZCBvZiBmaWxlLjEsIHdpdGggdGhlIGlkIG9mIGZpbGUuMgovLyBsaXN0ZWQgYXMgaXRzIGJhc2Uu
IG5vdGUgdGhlIHVzZSBvZiB0aGUgdGVybXMgd2hpY2ggZGVzY3JpYmUKLy8gcmVjb25zdHJ1Y3Rp
b247IHRob3NlIGFyZSBzdG9yYWdlLXN5c3RlbSB0ZXJtcy4KLy8KLy8gdGhlIGludGVyZmFjZSAq
dG8qIHRoZSBkYXRhYmFzZSwgYW5kIHRoZSBhbmNlc3RyeSB2ZXJzaW9uIGdyYXBocywgdXNlCi8v
IHRoZSBvbGQgLyBuZXcgbWV0YXBob3Igb2YgYW5jZXN0cnksIGJ1dCB3aXRoaW4gdGhlIGRhdGFi
YXNlIChpbmNsdWRpbmcKLy8gdGhlIHByaXZhdGUgaGVscGVyIG1ldGhvZHMsIGFuZCB0aGUgc3Rv
cmFnZSB2ZXJzaW9uIGdyYXBocykgdGhlCi8vIGJhc2UvZGVyaXZlZCBzdG9yYWdlIG1ldGFwaG9y
IGlzIHVzZWQuIHRoZSBvbmx5IHJlYWwgd2F5IHRvIHRlbGwgd2hpY2gKLy8gaXMgd2hpY2ggaXMg
dG8gbG9vayBhdCB0aGUgcGFyYW1ldGVyIG5hbWVzIGFuZCBjb2RlLiBJIG1pZ2h0IHRyeSB0bwov
LyBleHByZXNzIHRoaXMgaW4gdGhlIHR5cGUgc3lzdGVtIHNvbWUgZGF5LCBidXQgbm90IHByZXNl
bnRseS4KLy8KLy8gdGhlIGtleSBwaHJhc2UgdG8ga2VlcCByZXBlYXRpbmcgd2hlbiB3b3JraW5n
IG9uIHRoaXMgY29kZSBpczoKLy8gCi8vICJiYXNlIGZpbGVzIGFyZSBuZXcsIGRlcml2ZWQgZmls
ZXMgYXJlIG9sZCIKLy8KLy8gaXQgbWFrZXMgdGhlIGNvZGUgY29uZnVzaW5nLCBJIGtub3cuIHRo
aXMgaXMgcG9zc2libHkgdGhlIHdvcnN0IHBhcnQgb2YKLy8gdGhlIHByb2dyYW0uIEkgZG9uJ3Qg
a25vdyBpZiB0aGVyZSdzIGFueSB3YXkgdG8gbWFrZSBpdCBjbGVhcmVyLgoKY2xhc3MgdHJhbnNh
Y3Rpb25fZ3VhcmQ7CnN0cnVjdCBwb3N0aW5nOwpzdHJ1Y3QgYXBwX3N0YXRlOwoKY2xhc3MgZGF0
YWJhc2UKewogIGZzOjpwYXRoIGZpbGVuYW1lOwogIHN0ZDo6c3RyaW5nIGNvbnN0IHNjaGVtYTsK
ICB2b2lkIGNoZWNrX3NjaGVtYSgpOwoKICBzdHJ1Y3QgYXBwX3N0YXRlICogX19hcHA7CiAgc3Ry
dWN0IHNxbGl0ZTMgKiBfX3NxbDsKICBzdHJ1Y3Qgc3FsaXRlMyAqIHNxbChib29sIGluaXQgPSBm
YWxzZSk7CiAgaW50IHRyYW5zYWN0aW9uX2xldmVsOwoKICB2b2lkIGluc3RhbGxfZnVuY3Rpb25z
KGFwcF9zdGF0ZSAqIGFwcCk7CiAgdm9pZCBpbnN0YWxsX3ZpZXdzKCk7CgogIHR5cGVkZWYgc3Rk
Ojp2ZWN0b3I8IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiA+IHJlc3VsdHM7CiAgdm9pZCBleGVj
dXRlKGNoYXIgY29uc3QgKiBxdWVyeSwgLi4uKTsKICB2b2lkIGZldGNoKHJlc3VsdHMgJiByZXMs
IAogICAgICAgICAgICAgaW50IGNvbnN0IHdhbnRfY29scywgCiAgICAgICAgICAgICBpbnQgY29u
c3Qgd2FudF9yb3dzLCAKICAgICAgICAgICAgIGNoYXIgY29uc3QgKiBxdWVyeSwgLi4uKTsKCiAg
Ym9vbCBleGlzdHMoaGV4ZW5jPGlkPiBjb25zdCAmIGlkZW50LCAKICAgICAgICAgICAgICBzdGQ6
OnN0cmluZyBjb25zdCAmIHRhYmxlKTsKICBib29sIGRlbHRhX2V4aXN0cyhoZXhlbmM8aWQ+IGNv
bnN0ICYgaWRlbnQsCiAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QgJiB0YWJs
ZSk7CiAgYm9vbCBkZWx0YV9leGlzdHMoaGV4ZW5jPGlkPiBjb25zdCAmIGlkZW50LAogICAgICAg
ICAgICAgICAgICAgIGhleGVuYzxpZD4gY29uc3QgJiBiYXNlLAogICAgICAgICAgICAgICAgICAg
IHN0ZDo6c3RyaW5nIGNvbnN0ICYgdGFibGUpOwoKICB1bnNpZ25lZCBsb25nIGNvdW50KHN0ZDo6
c3RyaW5nIGNvbnN0ICYgdGFibGUpOwoKICB2b2lkIGdldF9pZHMoc3RkOjpzdHJpbmcgY29uc3Qg
JiB0YWJsZSwgc3RkOjpzZXQ8IGhleGVuYzxpZD4gPiAmIGlkcyk7IAoKICB2b2lkIGdldChoZXhl
bmM8aWQ+IGNvbnN0ICYgbmV3X2lkLAogICAgICAgICAgIGJhc2U2NDwgZ3ppcDxkYXRhPiA+ICYg
ZGF0LAogICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0ICYgdGFibGUpOwogIHZvaWQgZ2V0X2Rl
bHRhKGhleGVuYzxpZD4gY29uc3QgJiBpZGVudCwKICAgICAgICAgICAgICAgICBoZXhlbmM8aWQ+
IGNvbnN0ICYgYmFzZSwKICAgICAgICAgICAgICAgICBiYXNlNjQ8IGd6aXA8ZGVsdGE+ID4gJiBk
ZWwsCiAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QgJiB0YWJsZSk7CiAgdm9pZCBn
ZXRfdmVyc2lvbihoZXhlbmM8aWQ+IGNvbnN0ICYgaWQsCiAgICAgICAgICAgICAgICAgICBiYXNl
NjQ8IGd6aXA8ZGF0YT4gPiAmIGRhdCwKICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNv
bnN0ICYgZGF0YV90YWJsZSwKICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0ICYg
ZGVsdGFfdGFibGUpOwogIAogIHZvaWQgcHV0KGhleGVuYzxpZD4gY29uc3QgJiBuZXdfaWQsCiAg
ICAgICAgICAgYmFzZTY0PCBnemlwPGRhdGE+ID4gY29uc3QgJiBkYXQsCiAgICAgICAgICAgc3Rk
OjpzdHJpbmcgY29uc3QgJiB0YWJsZSk7CiAgdm9pZCBkcm9wKGhleGVuYzxpZD4gY29uc3QgJiBi
YXNlLAogICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCAmIHRhYmxlKTsKICB2b2lkIHB1dF9k
ZWx0YShoZXhlbmM8aWQ+IGNvbnN0ICYgaWQsCiAgICAgICAgICAgICAgICAgaGV4ZW5jPGlkPiBj
b25zdCAmIGJhc2UsCiAgICAgICAgICAgICAgICAgYmFzZTY0PCBnemlwPGRlbHRhPiA+IGNvbnN0
ICYgZGVsLAogICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0ICYgdGFibGUpOwogIHZv
aWQgcHV0X3ZlcnNpb24oaGV4ZW5jPGlkPiBjb25zdCAmIG9sZF9pZCwKICAgICAgICAgICAgICAg
ICAgIGhleGVuYzxpZD4gY29uc3QgJiBuZXdfaWQsCiAgICAgICAgICAgICAgICAgICBiYXNlNjQ8
IGd6aXA8ZGVsdGE+ID4gY29uc3QgJiBkZWwsCiAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmlu
ZyBjb25zdCAmIGRhdGFfdGFibGUsCiAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25z
dCAmIGRlbHRhX3RhYmxlKTsKICB2b2lkIHB1dF9yZXZlcnNlX3ZlcnNpb24oaGV4ZW5jPGlkPiBj
b25zdCAmIG5ld19pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaGV4ZW5jPGlkPiBjb25z
dCAmIG9sZF9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0PCBnemlwPGRlbHRh
PiA+IGNvbnN0ICYgcmV2ZXJzZV9kZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6
c3RyaW5nIGNvbnN0ICYgZGF0YV90YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rk
OjpzdHJpbmcgY29uc3QgJiBkZWx0YV90YWJsZSk7CgogIHZvaWQgZ2V0X2tleXMoc3RkOjpzdHJp
bmcgY29uc3QgJiB0YWJsZSwgc3RkOjp2ZWN0b3I8cnNhX2tleXBhaXJfaWQ+ICYga2V5cyk7Cgog
IGJvb2wgY2VydF9leGlzdHMoY2VydCBjb25zdCAmIHQsCiAgICAgICAgICAgICAgICAgIHN0ZDo6
c3RyaW5nIGNvbnN0ICYgdGFibGUpOwogIHZvaWQgcHV0X2NlcnQoY2VydCBjb25zdCAmIHQsIHN0
ZDo6c3RyaW5nIGNvbnN0ICYgdGFibGUpOyAgCiAgdm9pZCByZXN1bHRzX3RvX2NlcnRzKHJlc3Vs
dHMgY29uc3QgJiByZXMsCiAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y2VydD4g
JiBjZXJ0cyk7CgogIHZvaWQgZ2V0X2NlcnRzKHN0ZDo6dmVjdG9yPCBjZXJ0ID4gJiBjZXJ0cywK
ICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCAmIHRhYmxlKTsgIAoKICB2b2lkIGdl
dF9jZXJ0cyhoZXhlbmM8aWQ+IGNvbnN0ICYgaWQsIAogICAgICAgICAgICAgICAgIHN0ZDo6dmVj
dG9yPCBjZXJ0ID4gJiBjZXJ0cywKICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCAm
IHRhYmxlKTsgIAoKICB2b2lkIGdldF9jZXJ0cyhjZXJ0X25hbWUgY29uc3QgJiBuYW1lLCAgICAg
ICAgICAgICAgCiAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8IGNlcnQgPiAmIGNlcnRzLAog
ICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0ICYgdGFibGUpOwoKICB2b2lkIGdldF9j
ZXJ0cyhoZXhlbmM8aWQ+IGNvbnN0ICYgaWQsCiAgICAgICAgICAgICAgICAgY2VydF9uYW1lIGNv
bnN0ICYgbmFtZSwKICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjwgY2VydCA+ICYgY2VydHMs
CiAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QgJiB0YWJsZSk7ICAKCiAgdm9pZCBn
ZXRfY2VydHMoaGV4ZW5jPGlkPiBjb25zdCAmIGlkLAogICAgICAgICAgICAgICAgIGNlcnRfbmFt
ZSBjb25zdCAmIG5hbWUsCiAgICAgICAgICAgICAgICAgYmFzZTY0PGNlcnRfdmFsdWU+IGNvbnN0
ICYgdmFsLCAKICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjwgY2VydCA+ICYgY2VydHMsCiAg
ICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QgJiB0YWJsZSk7ICAKCiAgdm9pZCBnZXRf
Y2VydHMoY2VydF9uYW1lIGNvbnN0ICYgbmFtZSwKICAgICAgICAgICAgICAgICBiYXNlNjQ8Y2Vy
dF92YWx1ZT4gY29uc3QgJiB2YWwsIAogICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNlcnQ+
ICYgY2VydHMsCiAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QgJiB0YWJsZSk7Cgog
IHZvaWQgYmVnaW5fdHJhbnNhY3Rpb24oKTsKICB2b2lkIGNvbW1pdF90cmFuc2FjdGlvbigpOwog
IHZvaWQgcm9sbGJhY2tfdHJhbnNhY3Rpb24oKTsKICBmcmllbmQgY2xhc3MgdHJhbnNhY3Rpb25f
Z3VhcmQ7CiAgZnJpZW5kIHZvaWQgcmNzX3B1dF9yYXdfZmlsZV9lZGdlKGhleGVuYzxpZD4gY29u
c3QgJiBvbGRfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhleGVuYzxp
ZD4gY29uc3QgJiBuZXdfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJh
c2U2NDwgZ3ppcDxkZWx0YT4gPiBjb25zdCAmIGRlbCwKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgZGF0YWJhc2UgJiBkYik7CiAgZnJpZW5kIHZvaWQgcmNzX3B1dF9yYXdfbWFu
aWZlc3RfZWRnZShoZXhlbmM8aWQ+IGNvbnN0ICYgb2xkX2lkLAogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgaGV4ZW5jPGlkPiBjb25zdCAmIG5ld19pZCwKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U2NDwgZ3ppcDxkZWx0YT4gPiBjb25z
dCAmIGRlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNl
ICYgZGIpOwoKcHVibGljOgoKICBkYXRhYmFzZShmczo6cGF0aCBjb25zdCAmIGZpbGUpOwoKICB2
b2lkIHNldF9maWxlbmFtZShmczo6cGF0aCBjb25zdCAmIGZpbGUpOwogIHZvaWQgaW5pdGlhbGl6
ZSgpOwogIHZvaWQgZGVidWcoc3RkOjpzdHJpbmcgY29uc3QgJiBzcWwsIHN0ZDo6b3N0cmVhbSAm
IG91dCk7CiAgdm9pZCBkdW1wKHN0ZDo6b3N0cmVhbSAmKTsKICB2b2lkIGxvYWQoc3RkOjppc3Ry
ZWFtICYpOwogIHZvaWQgaW5mbyhzdGQ6Om9zdHJlYW0gJik7CiAgdm9pZCB2ZXJzaW9uKHN0ZDo6
b3N0cmVhbSAmKTsKICB2b2lkIG1pZ3JhdGUoKTsKICB2b2lkIHJlaGFzaCgpOwogIHZvaWQgZW5z
dXJlX29wZW4oKTsKICAKICBib29sIGZpbGVfdmVyc2lvbl9leGlzdHMoZmlsZV9pZCBjb25zdCAm
IGlkKTsKICBib29sIG1hbmlmZXN0X3ZlcnNpb25fZXhpc3RzKG1hbmlmZXN0X2lkIGNvbnN0ICYg
aWQpOwogIGJvb2wgcmV2aXNpb25fZXhpc3RzKHJldmlzaW9uX2lkIGNvbnN0ICYgaWQpOwoKICB2
b2lkIGdldF9maWxlX2lkcyhzdGQ6OnNldDxmaWxlX2lkPiAmIGlkcyk7CiAgdm9pZCBnZXRfbWFu
aWZlc3RfaWRzKHN0ZDo6c2V0PG1hbmlmZXN0X2lkPiAmIGlkcyk7CiAgdm9pZCBnZXRfcmV2aXNp
b25faWRzKHN0ZDo6c2V0PHJldmlzaW9uX2lkPiAmIGlkcyk7CgogIHZvaWQgc2V0X2FwcChhcHBf
c3RhdGUgKiBhcHApOwogIAogIC8vIGdldCBwbGFpbiB2ZXJzaW9uIGlmIGl0IGV4aXN0cywgb3Ig
cmVjb25zdHJ1Y3QgdmVyc2lvbgogIC8vIGZyb20gZGVsdGFzIChpZiB0aGV5IGV4aXN0KQogIHZv
aWQgZ2V0X2ZpbGVfdmVyc2lvbihmaWxlX2lkIGNvbnN0ICYgaWQsCiAgICAgICAgICAgICAgICAg
ICAgICAgIGZpbGVfZGF0YSAmIGRhdCk7CgogIC8vIGdldCBmaWxlIGRlbHRhIGlmIGl0IGV4aXN0
cywgZWxzZSBjYWxjdWxhdGUgaXQuCiAgLy8gYm90aCBtYW5pZmVzdHMgbXVzdCBleGlzdC4KICB2
b2lkIGdldF9maWxlX2RlbHRhKGZpbGVfaWQgY29uc3QgJiBzcmMsCiAgICAgICAgICAgICAgICAg
ICAgICBmaWxlX2lkIGNvbnN0ICYgZHN0LAogICAgICAgICAgICAgICAgICAgICAgZmlsZV9kZWx0
YSAmIGRlbCk7CgogIC8vIHB1dCBmaWxlIHcvbyBwcmVkZWNlc3NvciBpbnRvIGRiCiAgdm9pZCBw
dXRfZmlsZShmaWxlX2lkIGNvbnN0ICYgbmV3X2lkLAogICAgICAgICAgICAgICAgZmlsZV9kYXRh
IGNvbnN0ICYgZGF0KTsKCiAgLy8gc3RvcmUgbmV3IHZlcnNpb24gYW5kIHVwZGF0ZSBvbGQgdmVy
c2lvbiB0byBiZSBhIGRlbHRhCiAgdm9pZCBwdXRfZmlsZV92ZXJzaW9uKGZpbGVfaWQgY29uc3Qg
JiBvbGRfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfaWQgY29uc3QgJiBuZXdfaWQs
CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfZGVsdGEgY29uc3QgJiBkZWwpOwoKICAvLyBs
b2FkIGluIGEgImRpcmVjdCIgbmV3IC0+IG9sZCByZXZlcnNlIGVkZ2UgKHVzZWQgZHVyaW5nCiAg
Ly8gbmV0c3luYyBhbmQgQ1ZTIGxvYWQtaW4pCiAgdm9pZCBwdXRfZmlsZV9yZXZlcnNlX3ZlcnNp
b24oZmlsZV9pZCBjb25zdCAmIG9sZF9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBmaWxlX2lkIGNvbnN0ICYgbmV3X2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGZpbGVfZGVsdGEgY29uc3QgJiBkZWwpOwoKICAvLyBnZXQgcGxhaW4gdmVyc2lvbiBpZiBpdCBl
eGlzdHMsIG9yIHJlY29uc3RydWN0IHZlcnNpb24KICAvLyBmcm9tIGRlbHRhcyAoaWYgdGhleSBl
eGlzdCkuIAogIHZvaWQgZ2V0X21hbmlmZXN0X3ZlcnNpb24obWFuaWZlc3RfaWQgY29uc3QgJiBp
ZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0X2RhdGEgJiBkYXQpOwoKICAv
LyBnZXQgYSBjb25zdHJ1Y3RlZCBtYW5pZmVzdAogIHZvaWQgZ2V0X21hbmlmZXN0KG1hbmlmZXN0
X2lkIGNvbnN0ICYgaWQsCiAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RfbWFwICYgbW0pOwoK
ICAvLyBnZXQgbWFuaWZlc3QgZGVsdGEgaWYgaXQgZXhpc3RzLCBlbHNlIGNhbGN1bGF0ZSBpdC4K
ICAvLyBib3RoIG1hbmlmZXN0cyBtdXN0IGV4aXN0LgogIHZvaWQgZ2V0X21hbmlmZXN0X2RlbHRh
KG1hbmlmZXN0X2lkIGNvbnN0ICYgc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmlm
ZXN0X2lkIGNvbnN0ICYgZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0X2Rl
bHRhICYgZGVsKTsKCiAgLy8gcHV0IG1hbmlmZXN0IHcvbyBwcmVkZWNlc3NvciBpbnRvIGRiCiAg
dm9pZCBwdXRfbWFuaWZlc3QobWFuaWZlc3RfaWQgY29uc3QgJiBuZXdfaWQsCiAgICAgICAgICAg
ICAgICAgICAgbWFuaWZlc3RfZGF0YSBjb25zdCAmIGRhdCk7CgogIC8vIHN0b3JlIG5ldyB2ZXJz
aW9uIGFuZCB1cGRhdGUgb2xkIHZlcnNpb24gdG8gYmUgYSBkZWx0YQogIHZvaWQgcHV0X21hbmlm
ZXN0X3ZlcnNpb24obWFuaWZlc3RfaWQgY29uc3QgJiBvbGRfaWQsCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBtYW5pZmVzdF9pZCBjb25zdCAmIG5ld19pZCwKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIG1hbmlmZXN0X2RlbHRhIGNvbnN0ICYgZGVsKTsKCiAgLy8gbG9hZCBpbiBhICJk
aXJlY3QiIG5ldyAtPiBvbGQgcmV2ZXJzZSBlZGdlICh1c2VkIGR1cmluZwogIC8vIG5ldHN5bmMg
YW5kIENWUyBsb2FkLWluKQogIHZvaWQgcHV0X21hbmlmZXN0X3JldmVyc2VfdmVyc2lvbihtYW5p
ZmVzdF9pZCBjb25zdCAmIG9sZF9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgbWFuaWZlc3RfaWQgY29uc3QgJiBuZXdfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIG1hbmlmZXN0X2RlbHRhIGNvbnN0ICYgZGVsKTsKCgogIHZvaWQgZ2V0X3Jldmlz
aW9uX2FuY2VzdHJ5KHN0ZDo6bXVsdGltYXA8cmV2aXNpb25faWQsIHJldmlzaW9uX2lkPiAmIGdy
YXBoKTsKCiAgdm9pZCBnZXRfcmV2aXNpb25fcGFyZW50cyhyZXZpc2lvbl9pZCBjb25zdCAmIGlk
LAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNldDxyZXZpc2lvbl9pZD4gJiBwYXJl
bnRzKTsKCiAgdm9pZCBnZXRfcmV2aXNpb25fY2hpbGRyZW4ocmV2aXNpb25faWQgY29uc3QgJiBp
ZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNldDxyZXZpc2lvbl9pZD4gJiBj
aGlsZHJlbik7CgogIHZvaWQgZ2V0X3JldmlzaW9uX21hbmlmZXN0KHJldmlzaW9uX2lkIGNvbnN0
ICYgY2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RfaWQgJiBtaWQpOwoK
ICB2b2lkIGdldF9yZXZpc2lvbihyZXZpc2lvbl9pZCBjb25zdCAmIGlkLAogICAgICAgICAgICAg
ICAgICAgcmV2aXNpb25fc2V0ICYgY3MpOwoKICB2b2lkIGdldF9yZXZpc2lvbihyZXZpc2lvbl9p
ZCBjb25zdCAmIGlkLAogICAgICAgICAgICAgICAgICAgcmV2aXNpb25fZGF0YSAmIGRhdCk7Cgog
IHZvaWQgcHV0X3JldmlzaW9uKHJldmlzaW9uX2lkIGNvbnN0ICYgbmV3X2lkLAogICAgICAgICAg
ICAgICAgICAgcmV2aXNpb25fc2V0IGNvbnN0ICYgY3MpOwoKICB2b2lkIHB1dF9yZXZpc2lvbihy
ZXZpc2lvbl9pZCBjb25zdCAmIG5ld19pZCwKICAgICAgICAgICAgICAgICAgICByZXZpc2lvbl9k
YXRhIGNvbnN0ICYgZGF0KTsKICAKICB2b2lkIGRlbGV0ZV9leGlzdGluZ19yZXZzX2FuZF9jZXJ0
cygpOwoKICAvLyBjcnlwdG8ga2V5IC8gY2VydCBvcGVyYXRpb25zCgogIHZvaWQgZ2V0X2tleV9p
ZHMoc3RkOjpzdHJpbmcgY29uc3QgJiBwYXR0ZXJuLAogICAgICAgICAgICAgICAgICAgc3RkOjp2
ZWN0b3I8cnNhX2tleXBhaXJfaWQ+ICYgcHVia2V5cywKICAgICAgICAgICAgICAgICAgIHN0ZDo6
dmVjdG9yPHJzYV9rZXlwYWlyX2lkPiAmIHByaXZrZXlzKTsKCiAgdm9pZCBnZXRfcHJpdmF0ZV9r
ZXlzKHN0ZDo6dmVjdG9yPHJzYV9rZXlwYWlyX2lkPiAmIHByaXZrZXlzKTsKICB2b2lkIGdldF9w
dWJsaWNfa2V5cyhzdGQ6OnZlY3Rvcjxyc2Ffa2V5cGFpcl9pZD4gJiBwdWJrZXlzKTsKCiAgYm9v
bCBrZXlfZXhpc3RzKHJzYV9rZXlwYWlyX2lkIGNvbnN0ICYgaWQpOwoKICBib29sIHB1YmxpY19r
ZXlfZXhpc3RzKGhleGVuYzxpZD4gY29uc3QgJiBoYXNoKTsKICBib29sIHB1YmxpY19rZXlfZXhp
c3RzKHJzYV9rZXlwYWlyX2lkIGNvbnN0ICYgaWQpOwogIGJvb2wgcHJpdmF0ZV9rZXlfZXhpc3Rz
KHJzYV9rZXlwYWlyX2lkIGNvbnN0ICYgaWQpOwogIAogIHZvaWQgZ2V0X3B1YmtleShoZXhlbmM8
aWQ+IGNvbnN0ICYgaGFzaCwgCiAgICAgICAgICAgICAgICAgIHJzYV9rZXlwYWlyX2lkICYgaWQs
CiAgICAgICAgICAgICAgICAgIGJhc2U2NDxyc2FfcHViX2tleT4gJiBwdWJfZW5jb2RlZCk7Cgog
IHZvaWQgZ2V0X2tleShyc2Ffa2V5cGFpcl9pZCBjb25zdCAmIGlkLCAKICAgICAgICAgICAgICAg
YmFzZTY0PHJzYV9wdWJfa2V5PiAmIHB1Yl9lbmNvZGVkKTsKCiAgdm9pZCBnZXRfa2V5KHJzYV9r
ZXlwYWlyX2lkIGNvbnN0ICYgaWQsIAogICAgICAgICAgICAgICBiYXNlNjQ8IGFyYzQ8cnNhX3By
aXZfa2V5PiA+ICYgcHJpdl9lbmNvZGVkKTsKCiAgdm9pZCBwdXRfa2V5KHJzYV9rZXlwYWlyX2lk
IGNvbnN0ICYgaWQsIAogICAgICAgICAgICAgICBiYXNlNjQ8cnNhX3B1Yl9rZXk+IGNvbnN0ICYg
cHViX2VuY29kZWQpOwogIAogIHZvaWQgcHV0X2tleShyc2Ffa2V5cGFpcl9pZCBjb25zdCAmIGlk
LCAKICAgICAgICAgICAgICAgYmFzZTY0PCBhcmM0PHJzYV9wcml2X2tleT4gPiBjb25zdCAmIHBy
aXZfZW5jb2RlZCk7CiAgCiAgdm9pZCBwdXRfa2V5X3BhaXIocnNhX2tleXBhaXJfaWQgY29uc3Qg
JiBwdWJfaWQsIAogICAgICAgICAgICAgICAgICAgIGJhc2U2NDxyc2FfcHViX2tleT4gY29uc3Qg
JiBwdWJfZW5jb2RlZCwKICAgICAgICAgICAgICAgICAgICBiYXNlNjQ8IGFyYzQ8cnNhX3ByaXZf
a2V5PiA+IGNvbnN0ICYgcHJpdl9lbmNvZGVkKTsKCiAgdm9pZCBkZWxldGVfcHJpdmF0ZV9rZXko
cnNhX2tleXBhaXJfaWQgY29uc3QgJiBwdWJfaWQpOwoKICAvLyBub3RlOiB0aGlzIHNlY3Rpb24g
aXMgcmlkaWN1bG91cy4gcGxlYXNlIGRvIHNvbWV0aGluZyBhYm91dCBpdC4KCiAgYm9vbCBtYW5p
ZmVzdF9jZXJ0X2V4aXN0cyhtYW5pZmVzdDxjZXJ0PiBjb25zdCAmIGNlcnQpOwogIGJvb2wgbWFu
aWZlc3RfY2VydF9leGlzdHMoaGV4ZW5jPGlkPiBjb25zdCAmIGhhc2gpOwogIHZvaWQgcHV0X21h
bmlmZXN0X2NlcnQobWFuaWZlc3Q8Y2VydD4gY29uc3QgJiBjZXJ0KTsKCiAgYm9vbCByZXZpc2lv
bl9jZXJ0X2V4aXN0cyhyZXZpc2lvbjxjZXJ0PiBjb25zdCAmIGNlcnQpOwogIGJvb2wgcmV2aXNp
b25fY2VydF9leGlzdHMoaGV4ZW5jPGlkPiBjb25zdCAmIGhhc2gpOwoKICB2b2lkIHB1dF9yZXZp
c2lvbl9jZXJ0KHJldmlzaW9uPGNlcnQ+IGNvbnN0ICYgY2VydCk7CgogIC8vIHRoaXMgdmFyaWFu
dCBoYXMgdG8gYmUgcmF0aGVyIGNvYXJzZSBhbmQgZmFzdCwgZm9yIG5ldHN5bmMncyB1c2UKICB2
b2lkIGdldF9yZXZpc2lvbl9jZXJ0X2luZGV4KHN0ZDo6dmVjdG9yPCBzdGQ6OnBhaXI8aGV4ZW5j
PGlkPiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjxyZXZpc2lvbl9p
ZCwgcnNhX2tleXBhaXJfaWQ+ID4gPiAmIGlkeCk7CgogIHZvaWQgZ2V0X3JldmlzaW9uX2NlcnRz
KHN0ZDo6dmVjdG9yPCByZXZpc2lvbjxjZXJ0PiA+ICYgY2VydHMpOwoKICB2b2lkIGdldF9yZXZp
c2lvbl9jZXJ0cyhjZXJ0X25hbWUgY29uc3QgJiBuYW1lLCAKICAgICAgICAgICAgICAgICAgICAg
ICAgICBzdGQ6OnZlY3RvcjwgcmV2aXNpb248Y2VydD4gPiAmIGNlcnRzKTsKCiAgdm9pZCBnZXRf
cmV2aXNpb25fY2VydHMocmV2aXNpb25faWQgY29uc3QgJiBpZCwgCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgY2VydF9uYW1lIGNvbnN0ICYgbmFtZSwgCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgc3RkOjp2ZWN0b3I8IHJldmlzaW9uPGNlcnQ+ID4gJiBjZXJ0cyk7CgogIHZvaWQgZ2V0X3Jl
dmlzaW9uX2NlcnRzKGNlcnRfbmFtZSBjb25zdCAmIG5hbWUsCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgYmFzZTY0PGNlcnRfdmFsdWU+IGNvbnN0ICYgdmFsLCAKICAgICAgICAgICAgICAgICAg
ICAgICAgICBzdGQ6OnZlY3RvcjwgcmV2aXNpb248Y2VydD4gPiAmIGNlcnRzKTsKCiAgdm9pZCBn
ZXRfcmV2aXNpb25fY2VydHMocmV2aXNpb25faWQgY29uc3QgJiBpZCwgCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgY2VydF9uYW1lIGNvbnN0ICYgbmFtZSwgCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgYmFzZTY0PGNlcnRfdmFsdWU+IGNvbnN0ICYgdmFsdWUsCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgc3RkOjp2ZWN0b3I8IHJldmlzaW9uPGNlcnQ+ID4gJiBjZXJ0cyk7CgogIHZvaWQg
Z2V0X3JldmlzaW9uX2NlcnRzKHJldmlzaW9uX2lkIGNvbnN0ICYgaWQsIAogICAgICAgICAgICAg
ICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPCByZXZpc2lvbjxjZXJ0PiA+ICYgY2VydHMpOwoKICB2
b2lkIGdldF9yZXZpc2lvbl9jZXJ0KGhleGVuYzxpZD4gY29uc3QgJiBoYXNoLAogICAgICAgICAg
ICAgICAgICAgICAgICAgcmV2aXNpb248Y2VydD4gJiBjZXJ0KTsKICAKICB2b2lkIGdldF9tYW5p
ZmVzdF9jZXJ0cyhtYW5pZmVzdF9pZCBjb25zdCAmIGlkLCAKICAgICAgICAgICAgICAgICAgICAg
ICAgICBzdGQ6OnZlY3RvcjwgbWFuaWZlc3Q8Y2VydD4gPiAmIGNlcnRzKTsKCiAgdm9pZCBnZXRf
bWFuaWZlc3RfY2VydHMoY2VydF9uYW1lIGNvbnN0ICYgbmFtZSwgCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgc3RkOjp2ZWN0b3I8IG1hbmlmZXN0PGNlcnQ+ID4gJiBjZXJ0cyk7CgogIHZvaWQg
Z2V0X21hbmlmZXN0X2NlcnRzKG1hbmlmZXN0X2lkIGNvbnN0ICYgaWQsIAogICAgICAgICAgICAg
ICAgICAgICAgICAgIGNlcnRfbmFtZSBjb25zdCAmIG5hbWUsIAogICAgICAgICAgICAgICAgICAg
ICAgICAgIHN0ZDo6dmVjdG9yPCBtYW5pZmVzdDxjZXJ0PiA+ICYgY2VydHMpOwogIAogIHZvaWQg
Z2V0X21hbmlmZXN0X2NlcnQoaGV4ZW5jPGlkPiBjb25zdCAmIGhhc2gsCiAgICAgICAgICAgICAg
ICAgICAgICAgICBtYW5pZmVzdDxjZXJ0PiAmIGNlcnQpOwoKICAvLyBlcG9jaHMgCgogIHZvaWQg
Z2V0X2Vwb2NocyhzdGQ6Om1hcDxjZXJ0X3ZhbHVlLCBlcG9jaF9kYXRhPiAmIGVwb2Nocyk7Cgog
IHZvaWQgZ2V0X2Vwb2NoKGVwb2NoX2lkIGNvbnN0ICYgZWlkLCBjZXJ0X3ZhbHVlICYgYnJhbmNo
LCBlcG9jaF9kYXRhICYgZXBvKTsKICAKICBib29sIGVwb2NoX2V4aXN0cyhlcG9jaF9pZCBjb25z
dCAmIGVpZCk7CgogIHZvaWQgc2V0X2Vwb2NoKGNlcnRfdmFsdWUgY29uc3QgJiBicmFuY2gsIGVw
b2NoX2RhdGEgY29uc3QgJiBlcG8pOyAgCgogIHZvaWQgY2xlYXJfZXBvY2goY2VydF92YWx1ZSBj
b25zdCAmIGJyYW5jaCk7CiAKICAvLyBjb21wbGV0aW9uIHN0dWZmCgogIHZvaWQgY29tcGxldGUo
c3RkOjpzdHJpbmcgY29uc3QgJiBwYXJ0aWFsLAogICAgICAgICAgICAgICAgc3RkOjpzZXQ8cmV2
aXNpb25faWQ+ICYgY29tcGxldGlvbnMpOwoKICB2b2lkIGNvbXBsZXRlKHN0ZDo6c3RyaW5nIGNv
bnN0ICYgcGFydGlhbCwKICAgICAgICAgICAgICAgIHN0ZDo6c2V0PG1hbmlmZXN0X2lkPiAmIGNv
bXBsZXRpb25zKTsKICAKICB2b2lkIGNvbXBsZXRlKHN0ZDo6c3RyaW5nIGNvbnN0ICYgcGFydGlh
bCwKICAgICAgICAgICAgICAgIHN0ZDo6c2V0PGZpbGVfaWQ+ICYgY29tcGxldGlvbnMpOwoKICB2
b2lkIGNvbXBsZXRlKGNvbW1hbmRzOjpzZWxlY3Rvcl90eXBlIHR5LAogICAgICAgICAgICAgICAg
c3RkOjpzdHJpbmcgY29uc3QgJiBwYXJ0aWFsLAogICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8
c3RkOjpwYWlyPGNvbW1hbmRzOjpzZWxlY3Rvcl90eXBlLCAKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZz4gPiBjb25zdCAmIGxpbWl0LAogICAgICAgICAg
ICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+ICYgY29tcGxldGlvbnMpOwogIAogIH5kYXRhYmFz
ZSgpOwoKfTsKCi8vIHRyYW5zYWN0aW9uIGd1YXJkcyBuZXN0LiBhY3F1aXJlIG9uZSBpbiBhbnkg
c2NvcGUgeW91J2QgbGlrZQovLyB0cmFuc2FjdGlvbi1wcm90ZWN0ZWQsIGFuZCBpdCdsbCBtYWtl
IHN1cmUgdGhlIGRiIGFib3J0cyBhCi8vIHR4biBpZiB0aGVyZSdzIGFueSBleGNlcHRpb24gYmVm
b3JlIHlvdSBjYWxsIGNvbW1pdCgpCgpjbGFzcyB0cmFuc2FjdGlvbl9ndWFyZAp7CiAgYm9vbCBj
b21taXR0ZWQ7CiAgZGF0YWJhc2UgJiBkYjsKcHVibGljOgogIHRyYW5zYWN0aW9uX2d1YXJkKGRh
dGFiYXNlICYgZCk7CiAgfnRyYW5zYWN0aW9uX2d1YXJkKCk7CiAgdm9pZCBjb21taXQoKTsKfTsK
CgoKI2VuZGlmIC8vIF9fREFUQUJBU0VfSEhfXwo=
_ATEOF


cat >right.b64 <<'_ATEOF'

I2lmbmRlZiBfX0RBVEFCQVNFX0hIX18KI2RlZmluZSBfX0RBVEFCQVNFX0hIX18KCi8vIGNvcHly
aWdodCAoQykgMjAwMiwgMjAwMyBncmF5ZG9uIGhvYXJlIDxncmF5ZG9uQHBvYm94LmNvbT4KLy8g
YWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gbGljZW5zZWQgdG8gdGhlIHB1YmxpYyB1bmRlciB0aGUg
dGVybXMgb2YgdGhlIEdOVSBHUEwgKD49IDIpCi8vIHNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBk
ZXRhaWxzCgpzdHJ1Y3Qgc3FsaXRlMzsKc3RydWN0IGNlcnQ7CgojaW5jbHVkZSA8dmVjdG9yPgoj
aW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8c3RyaW5nPgoKI2luY2x1ZGUgPGJvb3N0L2ZpbGVzeXN0
ZW0vcGF0aC5ocHA+CgojaW5jbHVkZSAiY29tbWFuZHMuaGgiCiNpbmNsdWRlICJtYW5pZmVzdC5o
aCIKI2luY2x1ZGUgIm51bWVyaWNfdm9jYWIuaGgiCiNpbmNsdWRlICJ2b2NhYi5oaCIKCnN0cnVj
dCByZXZpc2lvbl9zZXQ7CgovLyB0aGlzIGZpbGUgZGVmaW5lcyBhIHB1YmxpYywgdHlwZWQgaW50
ZXJmYWNlIHRvIHRoZSBkYXRhYmFzZS4KLy8gdGhlIGRhdGFiYXNlIGNsYXNzIGVuY2Fwc3VsYXRl
cyBhbGwga25vd2xlZGdlIGFib3V0IHNxbGl0ZSwKLy8gdGhlIHNjaGVtYSwgYW5kIGFsbCBTUUwg
c3RhdGVtZW50cyB1c2VkIHRvIGFjY2VzcyB0aGUgc2NoZW1hLgovLwovLyBvbmUgdGhpbmcgd2hp
Y2ggaXMgcmF0aGVyIGltcG9ydGFudCB0byBub3RlIGlzIHRoYXQgdGhpcyBmaWxlCi8vIGRlYWxz
IHdpdGggdHdvIHNvcnRzIG9mIHZlcnNpb24gcmVsYXRpb25zaGlwcy4gdGhlIHZlcnNpb25zCi8v
IHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UgYXJlIGFsbCAqYmFja3dhcmRzKiBmcm9tIHRob3NlIHRo
ZSBwcm9ncmFtCi8vIHNlZXMuIHNvIGZvciBleGFtcGxlIGlmIHlvdSBoYXZlIHR3byB2ZXJzaW9u
cyBvZiBhIGZpbGUKLy8gCi8vIGZpbGUuMSwgZmlsZS4yCi8vCi8vIHdoZXJlIGZpbGUuMiB3YXMg
YSBtb2RpZmljYXRpb24gb2YgZmlsZS4xLCB0aGVuIGFzIGZhciBhcyB0aGUgcmVzdCBvZgovLyB0
aGUgYXBwbGljYXRpb24gaXMgY29uY2VybmVkIC0tIGFuZCB0aGUgYW5jZXN0cnkgZ3JhcGggLS0g
ZmlsZS4xIGlzIHRoZQovLyAib2xkIiB2ZXJzaW9uIGFuZCBmaWxlLjIgaXMgdGhlICJuZXciIHZl
cnNpb24uIG5vdGUgdGhlIHVzZSBvZiB0ZXJtcwovLyB3aGljaCBkZXNjcmliZSB0aW1lLCBhbmQg
dGhlIHNlcXVlbmNlIG9mIGVkaXRzIGEgdXNlciBtYWtlcyB0byBhCi8vIGZpbGUuIHRob3NlIGFy
ZSBhbmNlc3RyeSB0ZXJtcy4gd2hlbiB0aGUgYXBwbGljYXRpb24gY29tcG9zZXMgYQovLyBwYXRj
aHNldCwgZm9yIGV4YW1wbGUsIGl0J2xsIGNvbnRhaW4gdGhlIGRpZmYgZGVsdGEoZmlsZS4xLCBm
aWxlLjIpCi8vCi8vIGZyb20gdGhlIGRhdGFiYXNlJ3MgcGVyc3BlY3RpdmUsIGhvd2V2ZXIsIGZp
bGUuMSBpcyB0aGUgZGVyaXZlZCB2ZXJzaW9uLAovLyBhbmQgZmlsZS4yIGlzIHRoZSBiYXNlIHZl
cnNpb24uIHRoZSBiYXNlIHZlcnNpb24gaXMgc3RvcmVkIGluIHRoZQovLyAiZmlsZXMiIHRhYmxl
LCBhbmQgdGhlICpyZXZlcnNlKiBkaWZmIGRlbHRhKGZpbGUuMiwgZmlsZS4xKSBpcyBzdG9yZWQg
aW4KLy8gdGhlICJmaWxlX2RlbHRhcyIgdGFibGUsIHVuZGVyIHRoZSBpZCBvZiBmaWxlLjEsIHdp
dGggdGhlIGlkIG9mIGZpbGUuMgovLyBsaXN0ZWQgYXMgaXRzIGJhc2UuIG5vdGUgdGhlIHVzZSBv
ZiB0aGUgdGVybXMgd2hpY2ggZGVzY3JpYmUKLy8gcmVjb25zdHJ1Y3Rpb247IHRob3NlIGFyZSBz
dG9yYWdlLXN5c3RlbSB0ZXJtcy4KLy8KLy8gdGhlIGludGVyZmFjZSAqdG8qIHRoZSBkYXRhYmFz
ZSwgYW5kIHRoZSBhbmNlc3RyeSB2ZXJzaW9uIGdyYXBocywgdXNlCi8vIHRoZSBvbGQgLyBuZXcg
bWV0YXBob3Igb2YgYW5jZXN0cnksIGJ1dCB3aXRoaW4gdGhlIGRhdGFiYXNlIChpbmNsdWRpbmcK
Ly8gdGhlIHByaXZhdGUgaGVscGVyIG1ldGhvZHMsIGFuZCB0aGUgc3RvcmFnZSB2ZXJzaW9uIGdy
YXBocykgdGhlCi8vIGJhc2UvZGVyaXZlZCBzdG9yYWdlIG1ldGFwaG9yIGlzIHVzZWQuIHRoZSBv
bmx5IHJlYWwgd2F5IHRvIHRlbGwgd2hpY2gKLy8gaXMgd2hpY2ggaXMgdG8gbG9vayBhdCB0aGUg
cGFyYW1ldGVyIG5hbWVzIGFuZCBjb2RlLiBJIG1pZ2h0IHRyeSB0bwovLyBleHByZXNzIHRoaXMg
aW4gdGhlIHR5cGUgc3lzdGVtIHNvbWUgZGF5LCBidXQgbm90IHByZXNlbnRseS4KLy8KLy8gdGhl
IGtleSBwaHJhc2UgdG8ga2VlcCByZXBlYXRpbmcgd2hlbiB3b3JraW5nIG9uIHRoaXMgY29kZSBp
czoKLy8gCi8vICJiYXNlIGZpbGVzIGFyZSBuZXcsIGRlcml2ZWQgZmlsZXMgYXJlIG9sZCIKLy8K
Ly8gaXQgbWFrZXMgdGhlIGNvZGUgY29uZnVzaW5nLCBJIGtub3cuIHRoaXMgaXMgcG9zc2libHkg
dGhlIHdvcnN0IHBhcnQgb2YKLy8gdGhlIHByb2dyYW0uIEkgZG9uJ3Qga25vdyBpZiB0aGVyZSdz
IGFueSB3YXkgdG8gbWFrZSBpdCBjbGVhcmVyLgoKY2xhc3MgdHJhbnNhY3Rpb25fZ3VhcmQ7CnN0
cnVjdCBwb3N0aW5nOwpzdHJ1Y3QgYXBwX3N0YXRlOwoKY2xhc3MgZGF0YWJhc2UKewogIGZzOjpw
YXRoIGZpbGVuYW1lOwogIHN0ZDo6c3RyaW5nIGNvbnN0IHNjaGVtYTsKICB2b2lkIGNoZWNrX3Nj
aGVtYSgpOwoKICBzdHJ1Y3QgYXBwX3N0YXRlICogX19hcHA7CiAgc3RydWN0IHNxbGl0ZTMgKiBf
X3NxbDsKICBzdHJ1Y3Qgc3FsaXRlMyAqIHNxbChib29sIGluaXQgPSBmYWxzZSk7CiAgaW50IHRy
YW5zYWN0aW9uX2xldmVsOwoKICB2b2lkIGluc3RhbGxfZnVuY3Rpb25zKGFwcF9zdGF0ZSAqIGFw
cCk7CiAgdm9pZCBpbnN0YWxsX3ZpZXdzKCk7CgogIHR5cGVkZWYgc3RkOjp2ZWN0b3I8IHN0ZDo6
dmVjdG9yPHN0ZDo6c3RyaW5nPiA+IHJlc3VsdHM7CiAgdm9pZCBleGVjdXRlKGNoYXIgY29uc3Qg
KiBxdWVyeSwgLi4uKTsKICB2b2lkIGZldGNoKHJlc3VsdHMgJiByZXMsIAogICAgICAgICAgICAg
aW50IGNvbnN0IHdhbnRfY29scywgCiAgICAgICAgICAgICBpbnQgY29uc3Qgd2FudF9yb3dzLCAK
ICAgICAgICAgICAgIGNoYXIgY29uc3QgKiBxdWVyeSwgLi4uKTsKCiAgYm9vbCBleGlzdHMoaGV4
ZW5jPGlkPiBjb25zdCAmIGlkZW50LCAKICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCAm
IHRhYmxlKTsKICBib29sIGRlbHRhX2V4aXN0cyhoZXhlbmM8aWQ+IGNvbnN0ICYgaWRlbnQsCiAg
ICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QgJiB0YWJsZSk7CiAgYm9vbCBkZWx0
YV9leGlzdHMoaGV4ZW5jPGlkPiBjb25zdCAmIGlkZW50LAogICAgICAgICAgICAgICAgICAgIGhl
eGVuYzxpZD4gY29uc3QgJiBiYXNlLAogICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNv
bnN0ICYgdGFibGUpOwoKICBpbnQgY291bnQoc3RkOjpzdHJpbmcgY29uc3QgJiB0YWJsZSk7Cgog
IHZvaWQgZ2V0X2lkcyhzdGQ6OnN0cmluZyBjb25zdCAmIHRhYmxlLCBzdGQ6OnNldDwgaGV4ZW5j
PGlkPiA+ICYgaWRzKTsgCgogIHZvaWQgZ2V0KGhleGVuYzxpZD4gY29uc3QgJiBuZXdfaWQsCiAg
ICAgICAgICAgYmFzZTY0PCBnemlwPGRhdGE+ID4gJiBkYXQsCiAgICAgICAgICAgc3RkOjpzdHJp
bmcgY29uc3QgJiB0YWJsZSk7CiAgdm9pZCBnZXRfZGVsdGEoaGV4ZW5jPGlkPiBjb25zdCAmIGlk
ZW50LAogICAgICAgICAgICAgICAgIGhleGVuYzxpZD4gY29uc3QgJiBiYXNlLAogICAgICAgICAg
ICAgICAgIGJhc2U2NDwgZ3ppcDxkZWx0YT4gPiAmIGRlbCwKICAgICAgICAgICAgICAgICBzdGQ6
OnN0cmluZyBjb25zdCAmIHRhYmxlKTsKICB2b2lkIGdldF92ZXJzaW9uKGhleGVuYzxpZD4gY29u
c3QgJiBpZCwKICAgICAgICAgICAgICAgICAgIGJhc2U2NDwgZ3ppcDxkYXRhPiA+ICYgZGF0LAog
ICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QgJiBkYXRhX3RhYmxlLAogICAgICAg
ICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QgJiBkZWx0YV90YWJsZSk7CiAgCiAgdm9pZCBw
dXQoaGV4ZW5jPGlkPiBjb25zdCAmIG5ld19pZCwKICAgICAgICAgICBiYXNlNjQ8IGd6aXA8ZGF0
YT4gPiBjb25zdCAmIGRhdCwKICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCAmIHRhYmxlKTsK
ICB2b2lkIGRyb3AoaGV4ZW5jPGlkPiBjb25zdCAmIGJhc2UsCiAgICAgICAgICAgIHN0ZDo6c3Ry
aW5nIGNvbnN0ICYgdGFibGUpOwogIHZvaWQgcHV0X2RlbHRhKGhleGVuYzxpZD4gY29uc3QgJiBp
ZCwKICAgICAgICAgICAgICAgICBoZXhlbmM8aWQ+IGNvbnN0ICYgYmFzZSwKICAgICAgICAgICAg
ICAgICBiYXNlNjQ8IGd6aXA8ZGVsdGE+ID4gY29uc3QgJiBkZWwsCiAgICAgICAgICAgICAgICAg
c3RkOjpzdHJpbmcgY29uc3QgJiB0YWJsZSk7CiAgdm9pZCBwdXRfdmVyc2lvbihoZXhlbmM8aWQ+
IGNvbnN0ICYgb2xkX2lkLAogICAgICAgICAgICAgICAgICAgaGV4ZW5jPGlkPiBjb25zdCAmIG5l
d19pZCwKICAgICAgICAgICAgICAgICAgIGJhc2U2NDwgZ3ppcDxkZWx0YT4gPiBjb25zdCAmIGRl
bCwKICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0ICYgZGF0YV90YWJsZSwKICAg
ICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0ICYgZGVsdGFfdGFibGUpOwogIHZvaWQg
cHV0X3JldmVyc2VfdmVyc2lvbihoZXhlbmM8aWQ+IGNvbnN0ICYgbmV3X2lkLAogICAgICAgICAg
ICAgICAgICAgICAgICAgICBoZXhlbmM8aWQ+IGNvbnN0ICYgb2xkX2lkLAogICAgICAgICAgICAg
ICAgICAgICAgICAgICBiYXNlNjQ8IGd6aXA8ZGVsdGE+ID4gY29uc3QgJiByZXZlcnNlX2RlbCwK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QgJiBkYXRhX3RhYmxl
LAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCAmIGRlbHRhX3Rh
YmxlKTsKCiAgYm9vbCBjZXJ0X2V4aXN0cyhjZXJ0IGNvbnN0ICYgdCwKICAgICAgICAgICAgICAg
ICAgc3RkOjpzdHJpbmcgY29uc3QgJiB0YWJsZSk7CiAgdm9pZCBwdXRfY2VydChjZXJ0IGNvbnN0
ICYgdCwgc3RkOjpzdHJpbmcgY29uc3QgJiB0YWJsZSk7ICAKICB2b2lkIHJlc3VsdHNfdG9fY2Vy
dHMocmVzdWx0cyBjb25zdCAmIHJlcywKICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rv
cjxjZXJ0PiAmIGNlcnRzKTsKCiAgdm9pZCBnZXRfY2VydHMoaGV4ZW5jPGlkPiBjb25zdCAmIGlk
LCAKICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPCBjZXJ0ID4gJiBjZXJ0cywKICAgICAgICAg
ICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0ICYgdGFibGUpOyAgCgogIHZvaWQgZ2V0X2NlcnRzKGNl
cnRfbmFtZSBjb25zdCAmIG5hbWUsICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHN0ZDo6
dmVjdG9yPCBjZXJ0ID4gJiBjZXJ0cywKICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0
ICYgdGFibGUpOwoKICB2b2lkIGdldF9jZXJ0cyhoZXhlbmM8aWQ+IGNvbnN0ICYgaWQsCiAgICAg
ICAgICAgICAgICBjZXJ0X25hbWUgY29uc3QgJiBuYW1lLAogICAgICAgICAgICAgICAgc3RkOjp2
ZWN0b3I8IGNlcnQgPiAmIGNlcnRzLAogICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3Qg
JiB0YWJsZSk7ICAKCiAgdm9pZCBnZXRfY2VydHMoaGV4ZW5jPGlkPiBjb25zdCAmIGlkLAogICAg
ICAgICAgICAgICAgY2VydF9uYW1lIGNvbnN0ICYgbmFtZSwKICAgICAgICAgICAgICAgIGJhc2U2
NDxjZXJ0X3ZhbHVlPiBjb25zdCAmIHZhbCwgCiAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjwg
Y2VydCA+ICYgY2VydHMsCiAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCAmIHRhYmxl
KTsgIAoKICB2b2lkIGdldF9jZXJ0cyhjZXJ0X25hbWUgY29uc3QgJiBuYW1lLAogICAgICAgICAg
ICAgICAgYmFzZTY0PGNlcnRfdmFsdWU+IGNvbnN0ICYgdmFsLCAKICAgICAgICAgICAgICAgIHN0
ZDo6dmVjdG9yPGNlcnQ+ICYgY2VydHMsCiAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25z
dCAmIHRhYmxlKTsKCiAgdm9pZCBiZWdpbl90cmFuc2FjdGlvbigpOwogIHZvaWQgY29tbWl0X3Ry
YW5zYWN0aW9uKCk7CiAgdm9pZCByb2xsYmFja190cmFuc2FjdGlvbigpOwogIGZyaWVuZCBjbGFz
cyB0cmFuc2FjdGlvbl9ndWFyZDsKICBmcmllbmQgdm9pZCByY3NfcHV0X3Jhd19maWxlX2VkZ2Uo
aGV4ZW5jPGlkPiBjb25zdCAmIG9sZF9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgaGV4ZW5jPGlkPiBjb25zdCAmIG5ld19pZCwKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgYmFzZTY0PCBnemlwPGRlbHRhPiA+IGNvbnN0ICYgZGVsLAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZSAmIGRiKTsKICBmcmllbmQgdm9pZCBy
Y3NfcHV0X3Jhd19tYW5pZmVzdF9lZGdlKGhleGVuYzxpZD4gY29uc3QgJiBvbGRfaWQsCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXhlbmM8aWQ+IGNvbnN0ICYgbmV3
X2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0PCBnemlw
PGRlbHRhPiA+IGNvbnN0ICYgZGVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgZGF0YWJhc2UgJiBkYik7CgpwdWJsaWM6CgogIGRhdGFiYXNlKGZzOjpwYXRoIGNvbnN0
ICYgZmlsZSk7CgogIHVuc2lnbmVkIGxvbmcgZ2V0X3N0YXRpc3RpYyhzdGQ6OnN0cmluZyBjb25z
dCAmIHF1ZXJ5KTsKICB2b2lkIHNldF9maWxlbmFtZShmczo6cGF0aCBjb25zdCAmIGZpbGUpOwog
IHZvaWQgaW5pdGlhbGl6ZSgpOwogIHZvaWQgZGVidWcoc3RkOjpzdHJpbmcgY29uc3QgJiBzcWws
IHN0ZDo6b3N0cmVhbSAmIG91dCk7CiAgdm9pZCBkdW1wKHN0ZDo6b3N0cmVhbSAmKTsKICB2b2lk
IGxvYWQoc3RkOjppc3RyZWFtICYpOwogIHZvaWQgaW5mbyhzdGQ6Om9zdHJlYW0gJik7CiAgdm9p
ZCB2ZXJzaW9uKHN0ZDo6b3N0cmVhbSAmKTsKICB2b2lkIG1pZ3JhdGUoKTsKICB2b2lkIHJlaGFz
aCgpOwogIHZvaWQgZW5zdXJlX29wZW4oKTsKICAKICBib29sIGZpbGVfdmVyc2lvbl9leGlzdHMo
ZmlsZV9pZCBjb25zdCAmIGlkKTsKICBib29sIG1hbmlmZXN0X3ZlcnNpb25fZXhpc3RzKG1hbmlm
ZXN0X2lkIGNvbnN0ICYgaWQpOwogIGJvb2wgcmV2aXNpb25fZXhpc3RzKHJldmlzaW9uX2lkIGNv
bnN0ICYgaWQpOwoKICB2b2lkIGdldF9maWxlX2lkcyhzdGQ6OnNldDxmaWxlX2lkPiAmIGlkcyk7
CiAgdm9pZCBnZXRfbWFuaWZlc3RfaWRzKHN0ZDo6c2V0PG1hbmlmZXN0X2lkPiAmIGlkcyk7CiAg
dm9pZCBnZXRfcmV2aXNpb25faWRzKHN0ZDo6c2V0PHJldmlzaW9uX2lkPiAmIGlkcyk7CgogIHZv
aWQgc2V0X2FwcChhcHBfc3RhdGUgKiBhcHApOwogIAogIC8vIGdldCBwbGFpbiB2ZXJzaW9uIGlm
IGl0IGV4aXN0cywgb3IgcmVjb25zdHJ1Y3QgdmVyc2lvbgogIC8vIGZyb20gZGVsdGFzIChpZiB0
aGV5IGV4aXN0KQogIHZvaWQgZ2V0X2ZpbGVfdmVyc2lvbihmaWxlX2lkIGNvbnN0ICYgaWQsCiAg
ICAgICAgICAgICAgICAgICAgICAgIGZpbGVfZGF0YSAmIGRhdCk7CgogIC8vIGdldCBmaWxlIGRl
bHRhIGlmIGl0IGV4aXN0cywgZWxzZSBjYWxjdWxhdGUgaXQuCiAgLy8gYm90aCBtYW5pZmVzdHMg
bXVzdCBleGlzdC4KICB2b2lkIGdldF9maWxlX2RlbHRhKGZpbGVfaWQgY29uc3QgJiBzcmMsCiAg
ICAgICAgICAgICAgICAgICAgICBmaWxlX2lkIGNvbnN0ICYgZHN0LAogICAgICAgICAgICAgICAg
ICAgICAgZmlsZV9kZWx0YSAmIGRlbCk7CgogIC8vIHB1dCBmaWxlIHcvbyBwcmVkZWNlc3NvciBp
bnRvIGRiCiAgdm9pZCBwdXRfZmlsZShmaWxlX2lkIGNvbnN0ICYgbmV3X2lkLAogICAgICAgICAg
ICAgICAgZmlsZV9kYXRhIGNvbnN0ICYgZGF0KTsKCiAgLy8gc3RvcmUgbmV3IHZlcnNpb24gYW5k
IHVwZGF0ZSBvbGQgdmVyc2lvbiB0byBiZSBhIGRlbHRhCiAgdm9pZCBwdXRfZmlsZV92ZXJzaW9u
KGZpbGVfaWQgY29uc3QgJiBvbGRfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfaWQg
Y29uc3QgJiBuZXdfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfZGVsdGEgY29uc3Qg
JiBkZWwpOwoKICAvLyBsb2FkIGluIGEgImRpcmVjdCIgbmV3IC0+IG9sZCByZXZlcnNlIGVkZ2Ug
KHVzZWQgZHVyaW5nCiAgLy8gbmV0c3luYyBhbmQgQ1ZTIGxvYWQtaW4pCiAgdm9pZCBwdXRfZmls
ZV9yZXZlcnNlX3ZlcnNpb24oZmlsZV9pZCBjb25zdCAmIG9sZF9pZCwKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBmaWxlX2lkIGNvbnN0ICYgbmV3X2lkLAogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGZpbGVfZGVsdGEgY29uc3QgJiBkZWwpOwoKICAvLyBnZXQgcGxhaW4g
dmVyc2lvbiBpZiBpdCBleGlzdHMsIG9yIHJlY29uc3RydWN0IHZlcnNpb24KICAvLyBmcm9tIGRl
bHRhcyAoaWYgdGhleSBleGlzdCkuIAogIHZvaWQgZ2V0X21hbmlmZXN0X3ZlcnNpb24obWFuaWZl
c3RfaWQgY29uc3QgJiBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0X2Rh
dGEgJiBkYXQpOwoKICAvLyBnZXQgYSBjb25zdHJ1Y3RlZCBtYW5pZmVzdAogIHZvaWQgZ2V0X21h
bmlmZXN0KG1hbmlmZXN0X2lkIGNvbnN0ICYgaWQsCiAgICAgICAgICAgICAgICAgICAgbWFuaWZl
c3RfbWFwICYgbW0pOwoKICAvLyBnZXQgbWFuaWZlc3QgZGVsdGEgaWYgaXQgZXhpc3RzLCBlbHNl
IGNhbGN1bGF0ZSBpdC4KICAvLyBib3RoIG1hbmlmZXN0cyBtdXN0IGV4aXN0LgogIHZvaWQgZ2V0
X21hbmlmZXN0X2RlbHRhKG1hbmlmZXN0X2lkIGNvbnN0ICYgc3JjLAogICAgICAgICAgICAgICAg
ICAgICAgICAgIG1hbmlmZXN0X2lkIGNvbnN0ICYgZHN0LAogICAgICAgICAgICAgICAgICAgICAg
ICAgIG1hbmlmZXN0X2RlbHRhICYgZGVsKTsKCiAgLy8gcHV0IG1hbmlmZXN0IHcvbyBwcmVkZWNl
c3NvciBpbnRvIGRiCiAgdm9pZCBwdXRfbWFuaWZlc3QobWFuaWZlc3RfaWQgY29uc3QgJiBuZXdf
aWQsCiAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RfZGF0YSBjb25zdCAmIGRhdCk7CgogIC8v
IHN0b3JlIG5ldyB2ZXJzaW9uIGFuZCB1cGRhdGUgb2xkIHZlcnNpb24gdG8gYmUgYSBkZWx0YQog
IHZvaWQgcHV0X21hbmlmZXN0X3ZlcnNpb24obWFuaWZlc3RfaWQgY29uc3QgJiBvbGRfaWQsCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5pZmVzdF9pZCBjb25zdCAmIG5ld19pZCwKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0X2RlbHRhIGNvbnN0ICYgZGVsKTsKCiAg
Ly8gbG9hZCBpbiBhICJkaXJlY3QiIG5ldyAtPiBvbGQgcmV2ZXJzZSBlZGdlICh1c2VkIGR1cmlu
ZwogIC8vIG5ldHN5bmMgYW5kIENWUyBsb2FkLWluKQogIHZvaWQgcHV0X21hbmlmZXN0X3JldmVy
c2VfdmVyc2lvbihtYW5pZmVzdF9pZCBjb25zdCAmIG9sZF9pZCwKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgbWFuaWZlc3RfaWQgY29uc3QgJiBuZXdfaWQsCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0X2RlbHRhIGNvbnN0ICYgZGVsKTsKCgog
IHZvaWQgZ2V0X3JldmlzaW9uX2FuY2VzdHJ5KHN0ZDo6bXVsdGltYXA8cmV2aXNpb25faWQsIHJl
dmlzaW9uX2lkPiAmIGdyYXBoKTsKCiAgdm9pZCBnZXRfcmV2aXNpb25fcGFyZW50cyhyZXZpc2lv
bl9pZCBjb25zdCAmIGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNldDxyZXZp
c2lvbl9pZD4gJiBwYXJlbnRzKTsKCiAgdm9pZCBnZXRfcmV2aXNpb25fY2hpbGRyZW4ocmV2aXNp
b25faWQgY29uc3QgJiBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNldDxy
ZXZpc2lvbl9pZD4gJiBjaGlsZHJlbik7CgogIHZvaWQgZ2V0X3JldmlzaW9uX21hbmlmZXN0KHJl
dmlzaW9uX2lkIGNvbnN0ICYgY2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuaWZl
c3RfaWQgJiBtaWQpOwoKICB2b2lkIGdldF9yZXZpc2lvbihyZXZpc2lvbl9pZCBjb25zdCAmIGlk
LAogICAgICAgICAgICAgICAgICAgcmV2aXNpb25fc2V0ICYgY3MpOwoKICB2b2lkIGdldF9yZXZp
c2lvbihyZXZpc2lvbl9pZCBjb25zdCAmIGlkLAogICAgICAgICAgICAgICAgICAgcmV2aXNpb25f
ZGF0YSAmIGRhdCk7CgogIHZvaWQgcHV0X3JldmlzaW9uKHJldmlzaW9uX2lkIGNvbnN0ICYgbmV3
X2lkLAogICAgICAgICAgICAgICAgICAgcmV2aXNpb25fc2V0IGNvbnN0ICYgY3MpOwoKICB2b2lk
IHB1dF9yZXZpc2lvbihyZXZpc2lvbl9pZCBjb25zdCAmIG5ld19pZCwKICAgICAgICAgICAgICAg
ICAgICByZXZpc2lvbl9kYXRhIGNvbnN0ICYgZGF0KTsKICAKICB2b2lkIGRlbGV0ZV9leGlzdGlu
Z19yZXZzX2FuZF9jZXJ0cygpOwoKICAvLyBjcnlwdG8ga2V5IC8gY2VydCBvcGVyYXRpb25zCgog
IHZvaWQgZ2V0X2tleV9pZHMoc3RkOjpzdHJpbmcgY29uc3QgJiBwYXR0ZXJuLAogICAgICAgICAg
ICAgICAgICAgc3RkOjp2ZWN0b3I8cnNhX2tleXBhaXJfaWQ+ICYgcHVia2V5cywKICAgICAgICAg
ICAgICAgICAgIHN0ZDo6dmVjdG9yPHJzYV9rZXlwYWlyX2lkPiAmIHByaXZrZXlzKTsKCiAgdm9p
ZCBnZXRfcHJpdmF0ZV9rZXlzKHN0ZDo6dmVjdG9yPHJzYV9rZXlwYWlyX2lkPiAmIHByaXZrZXlz
KTsKCiAgYm9vbCBrZXlfZXhpc3RzKHJzYV9rZXlwYWlyX2lkIGNvbnN0ICYgaWQpOwoKICBib29s
IHB1YmxpY19rZXlfZXhpc3RzKGhleGVuYzxpZD4gY29uc3QgJiBoYXNoKTsKICBib29sIHB1Ymxp
Y19rZXlfZXhpc3RzKHJzYV9rZXlwYWlyX2lkIGNvbnN0ICYgaWQpOwogIGJvb2wgcHJpdmF0ZV9r
ZXlfZXhpc3RzKHJzYV9rZXlwYWlyX2lkIGNvbnN0ICYgaWQpOwogIAogIHZvaWQgZ2V0X3B1Ymtl
eShoZXhlbmM8aWQ+IGNvbnN0ICYgaGFzaCwgCiAgICAgICAgICAgICAgICAgIHJzYV9rZXlwYWly
X2lkICYgaWQsCiAgICAgICAgICAgICAgICAgIGJhc2U2NDxyc2FfcHViX2tleT4gJiBwdWJfZW5j
b2RlZCk7CgogIHZvaWQgZ2V0X2tleShyc2Ffa2V5cGFpcl9pZCBjb25zdCAmIGlkLCAKICAgICAg
ICAgICAgICAgYmFzZTY0PHJzYV9wdWJfa2V5PiAmIHB1Yl9lbmNvZGVkKTsKCiAgdm9pZCBnZXRf
a2V5KHJzYV9rZXlwYWlyX2lkIGNvbnN0ICYgaWQsIAogICAgICAgICAgICAgICBiYXNlNjQ8IGFy
YzQ8cnNhX3ByaXZfa2V5PiA+ICYgcHJpdl9lbmNvZGVkKTsKCiAgdm9pZCBwdXRfa2V5KHJzYV9r
ZXlwYWlyX2lkIGNvbnN0ICYgaWQsIAogICAgICAgICAgICAgICBiYXNlNjQ8cnNhX3B1Yl9rZXk+
IGNvbnN0ICYgcHViX2VuY29kZWQpOwogIAogIHZvaWQgcHV0X2tleShyc2Ffa2V5cGFpcl9pZCBj
b25zdCAmIGlkLCAKICAgICAgICAgICAgICAgYmFzZTY0PCBhcmM0PHJzYV9wcml2X2tleT4gPiBj
b25zdCAmIHByaXZfZW5jb2RlZCk7CiAgCiAgdm9pZCBwdXRfa2V5X3BhaXIocnNhX2tleXBhaXJf
aWQgY29uc3QgJiBwdWJfaWQsIAogICAgICAgICAgICAgICAgICAgIGJhc2U2NDxyc2FfcHViX2tl
eT4gY29uc3QgJiBwdWJfZW5jb2RlZCwKICAgICAgICAgICAgICAgICAgICBiYXNlNjQ8IGFyYzQ8
cnNhX3ByaXZfa2V5PiA+IGNvbnN0ICYgcHJpdl9lbmNvZGVkKTsKCiAgdm9pZCBkZWxldGVfcHJp
dmF0ZV9rZXkocnNhX2tleXBhaXJfaWQgY29uc3QgJiBwdWJfaWQpOwoKICAvLyBub3RlOiB0aGlz
IHNlY3Rpb24gaXMgcmlkaWN1bG91cy4gcGxlYXNlIGRvIHNvbWV0aGluZyBhYm91dCBpdC4KCiAg
Ym9vbCBtYW5pZmVzdF9jZXJ0X2V4aXN0cyhtYW5pZmVzdDxjZXJ0PiBjb25zdCAmIGNlcnQpOwog
IGJvb2wgbWFuaWZlc3RfY2VydF9leGlzdHMoaGV4ZW5jPGlkPiBjb25zdCAmIGhhc2gpOwogIHZv
aWQgcHV0X21hbmlmZXN0X2NlcnQobWFuaWZlc3Q8Y2VydD4gY29uc3QgJiBjZXJ0KTsKCiAgYm9v
bCByZXZpc2lvbl9jZXJ0X2V4aXN0cyhyZXZpc2lvbjxjZXJ0PiBjb25zdCAmIGNlcnQpOwogIGJv
b2wgcmV2aXNpb25fY2VydF9leGlzdHMoaGV4ZW5jPGlkPiBjb25zdCAmIGhhc2gpOwoKICB2b2lk
IHB1dF9yZXZpc2lvbl9jZXJ0KHJldmlzaW9uPGNlcnQ+IGNvbnN0ICYgY2VydCk7CgogIC8vIHRo
aXMgdmFyaWFudCBoYXMgdG8gYmUgcmF0aGVyIGNvYXJzZSBhbmQgZmFzdCwgZm9yIG5ldHN5bmMn
cyB1c2UKICB2b2lkIGdldF9yZXZpc2lvbl9jZXJ0X2luZGV4KHN0ZDo6dmVjdG9yPCBzdGQ6OnBh
aXI8aGV4ZW5jPGlkPiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjxy
ZXZpc2lvbl9pZCwgcnNhX2tleXBhaXJfaWQ+ID4gPiAmIGlkeCk7CgogIHZvaWQgZ2V0X3Jldmlz
aW9uX2NlcnRzKGNlcnRfbmFtZSBjb25zdCAmIG5hbWUsIAogICAgICAgICAgICAgICAgICAgICAg
ICAgc3RkOjp2ZWN0b3I8IHJldmlzaW9uPGNlcnQ+ID4gJiBjZXJ0cyk7CgogIHZvaWQgZ2V0X3Jl
dmlzaW9uX2NlcnRzKHJldmlzaW9uX2lkIGNvbnN0ICYgaWQsIAogICAgICAgICAgICAgICAgICAg
ICAgICAgY2VydF9uYW1lIGNvbnN0ICYgbmFtZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBz
dGQ6OnZlY3RvcjwgcmV2aXNpb248Y2VydD4gPiAmIGNlcnRzKTsKCiAgdm9pZCBnZXRfcmV2aXNp
b25fY2VydHMoY2VydF9uYW1lIGNvbnN0ICYgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAg
IGJhc2U2NDxjZXJ0X3ZhbHVlPiBjb25zdCAmIHZhbCwgCiAgICAgICAgICAgICAgICAgICAgICAg
ICBzdGQ6OnZlY3RvcjwgcmV2aXNpb248Y2VydD4gPiAmIGNlcnRzKTsKCiAgdm9pZCBnZXRfcmV2
aXNpb25fY2VydHMocmV2aXNpb25faWQgY29uc3QgJiBpZCwgCiAgICAgICAgICAgICAgICAgICAg
ICAgICBjZXJ0X25hbWUgY29uc3QgJiBuYW1lLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGJh
c2U2NDxjZXJ0X3ZhbHVlPiBjb25zdCAmIHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAg
c3RkOjp2ZWN0b3I8IHJldmlzaW9uPGNlcnQ+ID4gJiBjZXJ0cyk7CgogIHZvaWQgZ2V0X3Jldmlz
aW9uX2NlcnRzKHJldmlzaW9uX2lkIGNvbnN0ICYgaWQsIAogICAgICAgICAgICAgICAgICAgICAg
ICAgc3RkOjp2ZWN0b3I8IHJldmlzaW9uPGNlcnQ+ID4gJiBjZXJ0cyk7CgogIHZvaWQgZ2V0X3Jl
dmlzaW9uX2NlcnQoaGV4ZW5jPGlkPiBjb25zdCAmIGhhc2gsCiAgICAgICAgICAgICAgICAgICAg
ICAgICByZXZpc2lvbjxjZXJ0PiAmIGNlcnQpOwogIAogIHZvaWQgZ2V0X21hbmlmZXN0X2NlcnRz
KG1hbmlmZXN0X2lkIGNvbnN0ICYgaWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6
dmVjdG9yPCBtYW5pZmVzdDxjZXJ0PiA+ICYgY2VydHMpOwoKICB2b2lkIGdldF9tYW5pZmVzdF9j
ZXJ0cyhjZXJ0X25hbWUgY29uc3QgJiBuYW1lLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBz
dGQ6OnZlY3RvcjwgbWFuaWZlc3Q8Y2VydD4gPiAmIGNlcnRzKTsKCiAgdm9pZCBnZXRfbWFuaWZl
c3RfY2VydHMobWFuaWZlc3RfaWQgY29uc3QgJiBpZCwgCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgY2VydF9uYW1lIGNvbnN0ICYgbmFtZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rk
Ojp2ZWN0b3I8IG1hbmlmZXN0PGNlcnQ+ID4gJiBjZXJ0cyk7CiAgCiAgdm9pZCBnZXRfbWFuaWZl
c3RfY2VydChoZXhlbmM8aWQ+IGNvbnN0ICYgaGFzaCwKICAgICAgICAgICAgICAgICAgICAgICAg
IG1hbmlmZXN0PGNlcnQ+ICYgY2VydCk7CgogIAogIC8vIG1lcmtsZSB0cmVlIHN0dWZmCgogIGJv
b2wgbWVya2xlX25vZGVfZXhpc3RzKHN0ZDo6c3RyaW5nIGNvbnN0ICYgdHlwZSwKICAgICAgICAg
ICAgICAgICAgICAgICAgICB1dGY4IGNvbnN0ICYgY29sbGVjdGlvbiwgCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgc2l6ZV90IGxldmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgIGhleGVu
YzxwcmVmaXg+IGNvbnN0ICYgcHJlZml4KTsKICAKICB2b2lkIGdldF9tZXJrbGVfbm9kZShzdGQ6
OnN0cmluZyBjb25zdCAmIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgdXRmOCBjb25zdCAm
IGNvbGxlY3Rpb24sIAogICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZXZlbCwKICAgICAg
ICAgICAgICAgICAgICAgICBoZXhlbmM8cHJlZml4PiBjb25zdCAmIHByZWZpeCwKICAgICAgICAg
ICAgICAgICAgICAgICBiYXNlNjQ8bWVya2xlPiAmIG5vZGUpOwoKICB2b2lkIHB1dF9tZXJrbGVf
bm9kZShzdGQ6OnN0cmluZyBjb25zdCAmIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgdXRm
OCBjb25zdCAmIGNvbGxlY3Rpb24sIAogICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZXZl
bCwKICAgICAgICAgICAgICAgICAgICAgICBoZXhlbmM8cHJlZml4PiBjb25zdCAmIHByZWZpeCwK
ICAgICAgICAgICAgICAgICAgICAgICBiYXNlNjQ8bWVya2xlPiBjb25zdCAmIG5vZGUpOwoKICB2
b2lkIGVyYXNlX21lcmtsZV9ub2RlcyhzdGQ6OnN0cmluZyBjb25zdCAmIHR5cGUsCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgdXRmOCBjb25zdCAmIGNvbGxlY3Rpb24pOwoKICAvLyBjb21wbGV0
aW9uIHN0dWZmCgogIHZvaWQgY29tcGxldGUoc3RkOjpzdHJpbmcgY29uc3QgJiBwYXJ0aWFsLAog
ICAgICAgICAgICAgICAgc3RkOjpzZXQ8cmV2aXNpb25faWQ+ICYgY29tcGxldGlvbnMpOwoKICB2
b2lkIGNvbXBsZXRlKHN0ZDo6c3RyaW5nIGNvbnN0ICYgcGFydGlhbCwKICAgICAgICAgICAgICAg
IHN0ZDo6c2V0PG1hbmlmZXN0X2lkPiAmIGNvbXBsZXRpb25zKTsKICAKICB2b2lkIGNvbXBsZXRl
KHN0ZDo6c3RyaW5nIGNvbnN0ICYgcGFydGlhbCwKICAgICAgICAgICAgICAgIHN0ZDo6c2V0PGZp
bGVfaWQ+ICYgY29tcGxldGlvbnMpOwoKICB2b2lkIGNvbXBsZXRlKGNvbW1hbmRzOjpzZWxlY3Rv
cl90eXBlIHR5LAogICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QgJiBwYXJ0aWFsLAog
ICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGNvbW1hbmRzOjpzZWxlY3Rvcl90
eXBlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZz4g
PiBjb25zdCAmIGxpbWl0LAogICAgICAgICAgICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+ICYg
Y29tcGxldGlvbnMpOwogIAogIH5kYXRhYmFzZSgpOwoKfTsKCi8vIHRyYW5zYWN0aW9uIGd1YXJk
cyBuZXN0LiBhY3F1aXJlIG9uZSBpbiBhbnkgc2NvcGUgeW91J2QgbGlrZQovLyB0cmFuc2FjdGlv
bi1wcm90ZWN0ZWQsIGFuZCBpdCdsbCBtYWtlIHN1cmUgdGhlIGRiIGFib3J0cyBhCi8vIHR4biBp
ZiB0aGVyZSdzIGFueSBleGNlcHRpb24gYmVmb3JlIHlvdSBjYWxsIGNvbW1pdCgpCgpjbGFzcyB0
cmFuc2FjdGlvbl9ndWFyZAp7CiAgYm9vbCBjb21taXR0ZWQ7CiAgZGF0YWJhc2UgJiBkYjsKcHVi
bGljOgogIHRyYW5zYWN0aW9uX2d1YXJkKGRhdGFiYXNlICYgZCk7CiAgfnRyYW5zYWN0aW9uX2d1
YXJkKCk7CiAgdm9pZCBjb21taXQoKTsKfTsKCgoKI2VuZGlmIC8vIF9fREFUQUJBU0VfSEhfXwo=
_ATEOF


cat >correct.b64 <<'_ATEOF'

I2lmbmRlZiBfX0RBVEFCQVNFX0hIX18KI2RlZmluZSBfX0RBVEFCQVNFX0hIX18KCi8vIGNvcHly
aWdodCAoQykgMjAwMiwgMjAwMyBncmF5ZG9uIGhvYXJlIDxncmF5ZG9uQHBvYm94LmNvbT4KLy8g
YWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gbGljZW5zZWQgdG8gdGhlIHB1YmxpYyB1bmRlciB0aGUg
dGVybXMgb2YgdGhlIEdOVSBHUEwgKD49IDIpCi8vIHNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBk
ZXRhaWxzCgpzdHJ1Y3Qgc3FsaXRlMzsKc3RydWN0IGNlcnQ7CgojaW5jbHVkZSA8dmVjdG9yPgoj
aW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8c3RyaW5nPgoKI2luY2x1ZGUg
PGJvb3N0L2ZpbGVzeXN0ZW0vcGF0aC5ocHA+CgojaW5jbHVkZSAiY29tbWFuZHMuaGgiCiNpbmNs
dWRlICJtYW5pZmVzdC5oaCIKI2luY2x1ZGUgIm51bWVyaWNfdm9jYWIuaGgiCiNpbmNsdWRlICJ2
b2NhYi5oaCIKCnN0cnVjdCByZXZpc2lvbl9zZXQ7CgovLyB0aGlzIGZpbGUgZGVmaW5lcyBhIHB1
YmxpYywgdHlwZWQgaW50ZXJmYWNlIHRvIHRoZSBkYXRhYmFzZS4KLy8gdGhlIGRhdGFiYXNlIGNs
YXNzIGVuY2Fwc3VsYXRlcyBhbGwga25vd2xlZGdlIGFib3V0IHNxbGl0ZSwKLy8gdGhlIHNjaGVt
YSwgYW5kIGFsbCBTUUwgc3RhdGVtZW50cyB1c2VkIHRvIGFjY2VzcyB0aGUgc2NoZW1hLgovLwov
LyBvbmUgdGhpbmcgd2hpY2ggaXMgcmF0aGVyIGltcG9ydGFudCB0byBub3RlIGlzIHRoYXQgdGhp
cyBmaWxlCi8vIGRlYWxzIHdpdGggdHdvIHNvcnRzIG9mIHZlcnNpb24gcmVsYXRpb25zaGlwcy4g
dGhlIHZlcnNpb25zCi8vIHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UgYXJlIGFsbCAqYmFja3dhcmRz
KiBmcm9tIHRob3NlIHRoZSBwcm9ncmFtCi8vIHNlZXMuIHNvIGZvciBleGFtcGxlIGlmIHlvdSBo
YXZlIHR3byB2ZXJzaW9ucyBvZiBhIGZpbGUKLy8gCi8vIGZpbGUuMSwgZmlsZS4yCi8vCi8vIHdo
ZXJlIGZpbGUuMiB3YXMgYSBtb2RpZmljYXRpb24gb2YgZmlsZS4xLCB0aGVuIGFzIGZhciBhcyB0
aGUgcmVzdCBvZgovLyB0aGUgYXBwbGljYXRpb24gaXMgY29uY2VybmVkIC0tIGFuZCB0aGUgYW5j
ZXN0cnkgZ3JhcGggLS0gZmlsZS4xIGlzIHRoZQovLyAib2xkIiB2ZXJzaW9uIGFuZCBmaWxlLjIg
aXMgdGhlICJuZXciIHZlcnNpb24uIG5vdGUgdGhlIHVzZSBvZiB0ZXJtcwovLyB3aGljaCBkZXNj
cmliZSB0aW1lLCBhbmQgdGhlIHNlcXVlbmNlIG9mIGVkaXRzIGEgdXNlciBtYWtlcyB0byBhCi8v
IGZpbGUuIHRob3NlIGFyZSBhbmNlc3RyeSB0ZXJtcy4gd2hlbiB0aGUgYXBwbGljYXRpb24gY29t
cG9zZXMgYQovLyBwYXRjaHNldCwgZm9yIGV4YW1wbGUsIGl0J2xsIGNvbnRhaW4gdGhlIGRpZmYg
ZGVsdGEoZmlsZS4xLCBmaWxlLjIpCi8vCi8vIGZyb20gdGhlIGRhdGFiYXNlJ3MgcGVyc3BlY3Rp
dmUsIGhvd2V2ZXIsIGZpbGUuMSBpcyB0aGUgZGVyaXZlZCB2ZXJzaW9uLAovLyBhbmQgZmlsZS4y
IGlzIHRoZSBiYXNlIHZlcnNpb24uIHRoZSBiYXNlIHZlcnNpb24gaXMgc3RvcmVkIGluIHRoZQov
LyAiZmlsZXMiIHRhYmxlLCBhbmQgdGhlICpyZXZlcnNlKiBkaWZmIGRlbHRhKGZpbGUuMiwgZmls
ZS4xKSBpcyBzdG9yZWQgaW4KLy8gdGhlICJmaWxlX2RlbHRhcyIgdGFibGUsIHVuZGVyIHRoZSBp
ZCBvZiBmaWxlLjEsIHdpdGggdGhlIGlkIG9mIGZpbGUuMgovLyBsaXN0ZWQgYXMgaXRzIGJhc2Uu
IG5vdGUgdGhlIHVzZSBvZiB0aGUgdGVybXMgd2hpY2ggZGVzY3JpYmUKLy8gcmVjb25zdHJ1Y3Rp
b247IHRob3NlIGFyZSBzdG9yYWdlLXN5c3RlbSB0ZXJtcy4KLy8KLy8gdGhlIGludGVyZmFjZSAq
dG8qIHRoZSBkYXRhYmFzZSwgYW5kIHRoZSBhbmNlc3RyeSB2ZXJzaW9uIGdyYXBocywgdXNlCi8v
IHRoZSBvbGQgLyBuZXcgbWV0YXBob3Igb2YgYW5jZXN0cnksIGJ1dCB3aXRoaW4gdGhlIGRhdGFi
YXNlIChpbmNsdWRpbmcKLy8gdGhlIHByaXZhdGUgaGVscGVyIG1ldGhvZHMsIGFuZCB0aGUgc3Rv
cmFnZSB2ZXJzaW9uIGdyYXBocykgdGhlCi8vIGJhc2UvZGVyaXZlZCBzdG9yYWdlIG1ldGFwaG9y
IGlzIHVzZWQuIHRoZSBvbmx5IHJlYWwgd2F5IHRvIHRlbGwgd2hpY2gKLy8gaXMgd2hpY2ggaXMg
dG8gbG9vayBhdCB0aGUgcGFyYW1ldGVyIG5hbWVzIGFuZCBjb2RlLiBJIG1pZ2h0IHRyeSB0bwov
LyBleHByZXNzIHRoaXMgaW4gdGhlIHR5cGUgc3lzdGVtIHNvbWUgZGF5LCBidXQgbm90IHByZXNl
bnRseS4KLy8KLy8gdGhlIGtleSBwaHJhc2UgdG8ga2VlcCByZXBlYXRpbmcgd2hlbiB3b3JraW5n
IG9uIHRoaXMgY29kZSBpczoKLy8gCi8vICJiYXNlIGZpbGVzIGFyZSBuZXcsIGRlcml2ZWQgZmls
ZXMgYXJlIG9sZCIKLy8KLy8gaXQgbWFrZXMgdGhlIGNvZGUgY29uZnVzaW5nLCBJIGtub3cuIHRo
aXMgaXMgcG9zc2libHkgdGhlIHdvcnN0IHBhcnQgb2YKLy8gdGhlIHByb2dyYW0uIEkgZG9uJ3Qg
a25vdyBpZiB0aGVyZSdzIGFueSB3YXkgdG8gbWFrZSBpdCBjbGVhcmVyLgoKY2xhc3MgdHJhbnNh
Y3Rpb25fZ3VhcmQ7CnN0cnVjdCBwb3N0aW5nOwpzdHJ1Y3QgYXBwX3N0YXRlOwoKY2xhc3MgZGF0
YWJhc2UKewogIGZzOjpwYXRoIGZpbGVuYW1lOwogIHN0ZDo6c3RyaW5nIGNvbnN0IHNjaGVtYTsK
ICB2b2lkIGNoZWNrX3NjaGVtYSgpOwoKICBzdHJ1Y3QgYXBwX3N0YXRlICogX19hcHA7CiAgc3Ry
dWN0IHNxbGl0ZTMgKiBfX3NxbDsKICBzdHJ1Y3Qgc3FsaXRlMyAqIHNxbChib29sIGluaXQgPSBm
YWxzZSk7CiAgaW50IHRyYW5zYWN0aW9uX2xldmVsOwoKICB2b2lkIGluc3RhbGxfZnVuY3Rpb25z
KGFwcF9zdGF0ZSAqIGFwcCk7CiAgdm9pZCBpbnN0YWxsX3ZpZXdzKCk7CgogIHR5cGVkZWYgc3Rk
Ojp2ZWN0b3I8IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiA+IHJlc3VsdHM7CiAgdm9pZCBleGVj
dXRlKGNoYXIgY29uc3QgKiBxdWVyeSwgLi4uKTsKICB2b2lkIGZldGNoKHJlc3VsdHMgJiByZXMs
IAogICAgICAgICAgICAgaW50IGNvbnN0IHdhbnRfY29scywgCiAgICAgICAgICAgICBpbnQgY29u
c3Qgd2FudF9yb3dzLCAKICAgICAgICAgICAgIGNoYXIgY29uc3QgKiBxdWVyeSwgLi4uKTsKCiAg
Ym9vbCBleGlzdHMoaGV4ZW5jPGlkPiBjb25zdCAmIGlkZW50LCAKICAgICAgICAgICAgICBzdGQ6
OnN0cmluZyBjb25zdCAmIHRhYmxlKTsKICBib29sIGRlbHRhX2V4aXN0cyhoZXhlbmM8aWQ+IGNv
bnN0ICYgaWRlbnQsCiAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QgJiB0YWJs
ZSk7CiAgYm9vbCBkZWx0YV9leGlzdHMoaGV4ZW5jPGlkPiBjb25zdCAmIGlkZW50LAogICAgICAg
ICAgICAgICAgICAgIGhleGVuYzxpZD4gY29uc3QgJiBiYXNlLAogICAgICAgICAgICAgICAgICAg
IHN0ZDo6c3RyaW5nIGNvbnN0ICYgdGFibGUpOwoKICB1bnNpZ25lZCBsb25nIGNvdW50KHN0ZDo6
c3RyaW5nIGNvbnN0ICYgdGFibGUpOwoKICB2b2lkIGdldF9pZHMoc3RkOjpzdHJpbmcgY29uc3Qg
JiB0YWJsZSwgc3RkOjpzZXQ8IGhleGVuYzxpZD4gPiAmIGlkcyk7IAoKICB2b2lkIGdldChoZXhl
bmM8aWQ+IGNvbnN0ICYgbmV3X2lkLAogICAgICAgICAgIGJhc2U2NDwgZ3ppcDxkYXRhPiA+ICYg
ZGF0LAogICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0ICYgdGFibGUpOwogIHZvaWQgZ2V0X2Rl
bHRhKGhleGVuYzxpZD4gY29uc3QgJiBpZGVudCwKICAgICAgICAgICAgICAgICBoZXhlbmM8aWQ+
IGNvbnN0ICYgYmFzZSwKICAgICAgICAgICAgICAgICBiYXNlNjQ8IGd6aXA8ZGVsdGE+ID4gJiBk
ZWwsCiAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QgJiB0YWJsZSk7CiAgdm9pZCBn
ZXRfdmVyc2lvbihoZXhlbmM8aWQ+IGNvbnN0ICYgaWQsCiAgICAgICAgICAgICAgICAgICBiYXNl
NjQ8IGd6aXA8ZGF0YT4gPiAmIGRhdCwKICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNv
bnN0ICYgZGF0YV90YWJsZSwKICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0ICYg
ZGVsdGFfdGFibGUpOwogIAogIHZvaWQgcHV0KGhleGVuYzxpZD4gY29uc3QgJiBuZXdfaWQsCiAg
ICAgICAgICAgYmFzZTY0PCBnemlwPGRhdGE+ID4gY29uc3QgJiBkYXQsCiAgICAgICAgICAgc3Rk
OjpzdHJpbmcgY29uc3QgJiB0YWJsZSk7CiAgdm9pZCBkcm9wKGhleGVuYzxpZD4gY29uc3QgJiBi
YXNlLAogICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCAmIHRhYmxlKTsKICB2b2lkIHB1dF9k
ZWx0YShoZXhlbmM8aWQ+IGNvbnN0ICYgaWQsCiAgICAgICAgICAgICAgICAgaGV4ZW5jPGlkPiBj
b25zdCAmIGJhc2UsCiAgICAgICAgICAgICAgICAgYmFzZTY0PCBnemlwPGRlbHRhPiA+IGNvbnN0
ICYgZGVsLAogICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0ICYgdGFibGUpOwogIHZv
aWQgcHV0X3ZlcnNpb24oaGV4ZW5jPGlkPiBjb25zdCAmIG9sZF9pZCwKICAgICAgICAgICAgICAg
ICAgIGhleGVuYzxpZD4gY29uc3QgJiBuZXdfaWQsCiAgICAgICAgICAgICAgICAgICBiYXNlNjQ8
IGd6aXA8ZGVsdGE+ID4gY29uc3QgJiBkZWwsCiAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmlu
ZyBjb25zdCAmIGRhdGFfdGFibGUsCiAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25z
dCAmIGRlbHRhX3RhYmxlKTsKICB2b2lkIHB1dF9yZXZlcnNlX3ZlcnNpb24oaGV4ZW5jPGlkPiBj
b25zdCAmIG5ld19pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaGV4ZW5jPGlkPiBjb25z
dCAmIG9sZF9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0PCBnemlwPGRlbHRh
PiA+IGNvbnN0ICYgcmV2ZXJzZV9kZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6
c3RyaW5nIGNvbnN0ICYgZGF0YV90YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rk
OjpzdHJpbmcgY29uc3QgJiBkZWx0YV90YWJsZSk7CgogIHZvaWQgZ2V0X2tleXMoc3RkOjpzdHJp
bmcgY29uc3QgJiB0YWJsZSwgc3RkOjp2ZWN0b3I8cnNhX2tleXBhaXJfaWQ+ICYga2V5cyk7Cgog
IGJvb2wgY2VydF9leGlzdHMoY2VydCBjb25zdCAmIHQsCiAgICAgICAgICAgICAgICAgIHN0ZDo6
c3RyaW5nIGNvbnN0ICYgdGFibGUpOwogIHZvaWQgcHV0X2NlcnQoY2VydCBjb25zdCAmIHQsIHN0
ZDo6c3RyaW5nIGNvbnN0ICYgdGFibGUpOyAgCiAgdm9pZCByZXN1bHRzX3RvX2NlcnRzKHJlc3Vs
dHMgY29uc3QgJiByZXMsCiAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y2VydD4g
JiBjZXJ0cyk7CgogIHZvaWQgZ2V0X2NlcnRzKHN0ZDo6dmVjdG9yPCBjZXJ0ID4gJiBjZXJ0cywK
ICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCAmIHRhYmxlKTsgIAoKICB2b2lkIGdl
dF9jZXJ0cyhoZXhlbmM8aWQ+IGNvbnN0ICYgaWQsIAogICAgICAgICAgICAgICAgIHN0ZDo6dmVj
dG9yPCBjZXJ0ID4gJiBjZXJ0cywKICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCAm
IHRhYmxlKTsgIAoKICB2b2lkIGdldF9jZXJ0cyhjZXJ0X25hbWUgY29uc3QgJiBuYW1lLCAgICAg
ICAgICAgICAgCiAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8IGNlcnQgPiAmIGNlcnRzLAog
ICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0ICYgdGFibGUpOwoKICB2b2lkIGdldF9j
ZXJ0cyhoZXhlbmM8aWQ+IGNvbnN0ICYgaWQsCiAgICAgICAgICAgICAgICAgY2VydF9uYW1lIGNv
bnN0ICYgbmFtZSwKICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjwgY2VydCA+ICYgY2VydHMs
CiAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QgJiB0YWJsZSk7ICAKCiAgdm9pZCBn
ZXRfY2VydHMoaGV4ZW5jPGlkPiBjb25zdCAmIGlkLAogICAgICAgICAgICAgICAgIGNlcnRfbmFt
ZSBjb25zdCAmIG5hbWUsCiAgICAgICAgICAgICAgICAgYmFzZTY0PGNlcnRfdmFsdWU+IGNvbnN0
ICYgdmFsLCAKICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjwgY2VydCA+ICYgY2VydHMsCiAg
ICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QgJiB0YWJsZSk7ICAKCiAgdm9pZCBnZXRf
Y2VydHMoY2VydF9uYW1lIGNvbnN0ICYgbmFtZSwKICAgICAgICAgICAgICAgICBiYXNlNjQ8Y2Vy
dF92YWx1ZT4gY29uc3QgJiB2YWwsIAogICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNlcnQ+
ICYgY2VydHMsCiAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QgJiB0YWJsZSk7Cgog
IHZvaWQgYmVnaW5fdHJhbnNhY3Rpb24oKTsKICB2b2lkIGNvbW1pdF90cmFuc2FjdGlvbigpOwog
IHZvaWQgcm9sbGJhY2tfdHJhbnNhY3Rpb24oKTsKICBmcmllbmQgY2xhc3MgdHJhbnNhY3Rpb25f
Z3VhcmQ7CiAgZnJpZW5kIHZvaWQgcmNzX3B1dF9yYXdfZmlsZV9lZGdlKGhleGVuYzxpZD4gY29u
c3QgJiBvbGRfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhleGVuYzxp
ZD4gY29uc3QgJiBuZXdfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJh
c2U2NDwgZ3ppcDxkZWx0YT4gPiBjb25zdCAmIGRlbCwKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgZGF0YWJhc2UgJiBkYik7CiAgZnJpZW5kIHZvaWQgcmNzX3B1dF9yYXdfbWFu
aWZlc3RfZWRnZShoZXhlbmM8aWQ+IGNvbnN0ICYgb2xkX2lkLAogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgaGV4ZW5jPGlkPiBjb25zdCAmIG5ld19pZCwKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U2NDwgZ3ppcDxkZWx0YT4gPiBjb25z
dCAmIGRlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNl
ICYgZGIpOwoKcHVibGljOgoKICBkYXRhYmFzZShmczo6cGF0aCBjb25zdCAmIGZpbGUpOwoKICB2
b2lkIHNldF9maWxlbmFtZShmczo6cGF0aCBjb25zdCAmIGZpbGUpOwogIHZvaWQgaW5pdGlhbGl6
ZSgpOwogIHZvaWQgZGVidWcoc3RkOjpzdHJpbmcgY29uc3QgJiBzcWwsIHN0ZDo6b3N0cmVhbSAm
IG91dCk7CiAgdm9pZCBkdW1wKHN0ZDo6b3N0cmVhbSAmKTsKICB2b2lkIGxvYWQoc3RkOjppc3Ry
ZWFtICYpOwogIHZvaWQgaW5mbyhzdGQ6Om9zdHJlYW0gJik7CiAgdm9pZCB2ZXJzaW9uKHN0ZDo6
b3N0cmVhbSAmKTsKICB2b2lkIG1pZ3JhdGUoKTsKICB2b2lkIHJlaGFzaCgpOwogIHZvaWQgZW5z
dXJlX29wZW4oKTsKICAKICBib29sIGZpbGVfdmVyc2lvbl9leGlzdHMoZmlsZV9pZCBjb25zdCAm
IGlkKTsKICBib29sIG1hbmlmZXN0X3ZlcnNpb25fZXhpc3RzKG1hbmlmZXN0X2lkIGNvbnN0ICYg
aWQpOwogIGJvb2wgcmV2aXNpb25fZXhpc3RzKHJldmlzaW9uX2lkIGNvbnN0ICYgaWQpOwoKICB2
b2lkIGdldF9maWxlX2lkcyhzdGQ6OnNldDxmaWxlX2lkPiAmIGlkcyk7CiAgdm9pZCBnZXRfbWFu
aWZlc3RfaWRzKHN0ZDo6c2V0PG1hbmlmZXN0X2lkPiAmIGlkcyk7CiAgdm9pZCBnZXRfcmV2aXNp
b25faWRzKHN0ZDo6c2V0PHJldmlzaW9uX2lkPiAmIGlkcyk7CgogIHZvaWQgc2V0X2FwcChhcHBf
c3RhdGUgKiBhcHApOwogIAogIC8vIGdldCBwbGFpbiB2ZXJzaW9uIGlmIGl0IGV4aXN0cywgb3Ig
cmVjb25zdHJ1Y3QgdmVyc2lvbgogIC8vIGZyb20gZGVsdGFzIChpZiB0aGV5IGV4aXN0KQogIHZv
aWQgZ2V0X2ZpbGVfdmVyc2lvbihmaWxlX2lkIGNvbnN0ICYgaWQsCiAgICAgICAgICAgICAgICAg
ICAgICAgIGZpbGVfZGF0YSAmIGRhdCk7CgogIC8vIGdldCBmaWxlIGRlbHRhIGlmIGl0IGV4aXN0
cywgZWxzZSBjYWxjdWxhdGUgaXQuCiAgLy8gYm90aCBtYW5pZmVzdHMgbXVzdCBleGlzdC4KICB2
b2lkIGdldF9maWxlX2RlbHRhKGZpbGVfaWQgY29uc3QgJiBzcmMsCiAgICAgICAgICAgICAgICAg
ICAgICBmaWxlX2lkIGNvbnN0ICYgZHN0LAogICAgICAgICAgICAgICAgICAgICAgZmlsZV9kZWx0
YSAmIGRlbCk7CgogIC8vIHB1dCBmaWxlIHcvbyBwcmVkZWNlc3NvciBpbnRvIGRiCiAgdm9pZCBw
dXRfZmlsZShmaWxlX2lkIGNvbnN0ICYgbmV3X2lkLAogICAgICAgICAgICAgICAgZmlsZV9kYXRh
IGNvbnN0ICYgZGF0KTsKCiAgLy8gc3RvcmUgbmV3IHZlcnNpb24gYW5kIHVwZGF0ZSBvbGQgdmVy
c2lvbiB0byBiZSBhIGRlbHRhCiAgdm9pZCBwdXRfZmlsZV92ZXJzaW9uKGZpbGVfaWQgY29uc3Qg
JiBvbGRfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfaWQgY29uc3QgJiBuZXdfaWQs
CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfZGVsdGEgY29uc3QgJiBkZWwpOwoKICAvLyBs
b2FkIGluIGEgImRpcmVjdCIgbmV3IC0+IG9sZCByZXZlcnNlIGVkZ2UgKHVzZWQgZHVyaW5nCiAg
Ly8gbmV0c3luYyBhbmQgQ1ZTIGxvYWQtaW4pCiAgdm9pZCBwdXRfZmlsZV9yZXZlcnNlX3ZlcnNp
b24oZmlsZV9pZCBjb25zdCAmIG9sZF9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBmaWxlX2lkIGNvbnN0ICYgbmV3X2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGZpbGVfZGVsdGEgY29uc3QgJiBkZWwpOwoKICAvLyBnZXQgcGxhaW4gdmVyc2lvbiBpZiBpdCBl
eGlzdHMsIG9yIHJlY29uc3RydWN0IHZlcnNpb24KICAvLyBmcm9tIGRlbHRhcyAoaWYgdGhleSBl
eGlzdCkuIAogIHZvaWQgZ2V0X21hbmlmZXN0X3ZlcnNpb24obWFuaWZlc3RfaWQgY29uc3QgJiBp
ZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0X2RhdGEgJiBkYXQpOwoKICAv
LyBnZXQgYSBjb25zdHJ1Y3RlZCBtYW5pZmVzdAogIHZvaWQgZ2V0X21hbmlmZXN0KG1hbmlmZXN0
X2lkIGNvbnN0ICYgaWQsCiAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RfbWFwICYgbW0pOwoK
ICAvLyBnZXQgbWFuaWZlc3QgZGVsdGEgaWYgaXQgZXhpc3RzLCBlbHNlIGNhbGN1bGF0ZSBpdC4K
ICAvLyBib3RoIG1hbmlmZXN0cyBtdXN0IGV4aXN0LgogIHZvaWQgZ2V0X21hbmlmZXN0X2RlbHRh
KG1hbmlmZXN0X2lkIGNvbnN0ICYgc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmlm
ZXN0X2lkIGNvbnN0ICYgZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0X2Rl
bHRhICYgZGVsKTsKCiAgLy8gcHV0IG1hbmlmZXN0IHcvbyBwcmVkZWNlc3NvciBpbnRvIGRiCiAg
dm9pZCBwdXRfbWFuaWZlc3QobWFuaWZlc3RfaWQgY29uc3QgJiBuZXdfaWQsCiAgICAgICAgICAg
ICAgICAgICAgbWFuaWZlc3RfZGF0YSBjb25zdCAmIGRhdCk7CgogIC8vIHN0b3JlIG5ldyB2ZXJz
aW9uIGFuZCB1cGRhdGUgb2xkIHZlcnNpb24gdG8gYmUgYSBkZWx0YQogIHZvaWQgcHV0X21hbmlm
ZXN0X3ZlcnNpb24obWFuaWZlc3RfaWQgY29uc3QgJiBvbGRfaWQsCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBtYW5pZmVzdF9pZCBjb25zdCAmIG5ld19pZCwKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIG1hbmlmZXN0X2RlbHRhIGNvbnN0ICYgZGVsKTsKCiAgLy8gbG9hZCBpbiBhICJk
aXJlY3QiIG5ldyAtPiBvbGQgcmV2ZXJzZSBlZGdlICh1c2VkIGR1cmluZwogIC8vIG5ldHN5bmMg
YW5kIENWUyBsb2FkLWluKQogIHZvaWQgcHV0X21hbmlmZXN0X3JldmVyc2VfdmVyc2lvbihtYW5p
ZmVzdF9pZCBjb25zdCAmIG9sZF9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgbWFuaWZlc3RfaWQgY29uc3QgJiBuZXdfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIG1hbmlmZXN0X2RlbHRhIGNvbnN0ICYgZGVsKTsKCgogIHZvaWQgZ2V0X3Jldmlz
aW9uX2FuY2VzdHJ5KHN0ZDo6bXVsdGltYXA8cmV2aXNpb25faWQsIHJldmlzaW9uX2lkPiAmIGdy
YXBoKTsKCiAgdm9pZCBnZXRfcmV2aXNpb25fcGFyZW50cyhyZXZpc2lvbl9pZCBjb25zdCAmIGlk
LAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNldDxyZXZpc2lvbl9pZD4gJiBwYXJl
bnRzKTsKCiAgdm9pZCBnZXRfcmV2aXNpb25fY2hpbGRyZW4ocmV2aXNpb25faWQgY29uc3QgJiBp
ZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNldDxyZXZpc2lvbl9pZD4gJiBj
aGlsZHJlbik7CgogIHZvaWQgZ2V0X3JldmlzaW9uX21hbmlmZXN0KHJldmlzaW9uX2lkIGNvbnN0
ICYgY2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RfaWQgJiBtaWQpOwoK
ICB2b2lkIGdldF9yZXZpc2lvbihyZXZpc2lvbl9pZCBjb25zdCAmIGlkLAogICAgICAgICAgICAg
ICAgICAgcmV2aXNpb25fc2V0ICYgY3MpOwoKICB2b2lkIGdldF9yZXZpc2lvbihyZXZpc2lvbl9p
ZCBjb25zdCAmIGlkLAogICAgICAgICAgICAgICAgICAgcmV2aXNpb25fZGF0YSAmIGRhdCk7Cgog
IHZvaWQgcHV0X3JldmlzaW9uKHJldmlzaW9uX2lkIGNvbnN0ICYgbmV3X2lkLAogICAgICAgICAg
ICAgICAgICAgcmV2aXNpb25fc2V0IGNvbnN0ICYgY3MpOwoKICB2b2lkIHB1dF9yZXZpc2lvbihy
ZXZpc2lvbl9pZCBjb25zdCAmIG5ld19pZCwKICAgICAgICAgICAgICAgICAgICByZXZpc2lvbl9k
YXRhIGNvbnN0ICYgZGF0KTsKICAKICB2b2lkIGRlbGV0ZV9leGlzdGluZ19yZXZzX2FuZF9jZXJ0
cygpOwoKICAvLyBjcnlwdG8ga2V5IC8gY2VydCBvcGVyYXRpb25zCgogIHZvaWQgZ2V0X2tleV9p
ZHMoc3RkOjpzdHJpbmcgY29uc3QgJiBwYXR0ZXJuLAogICAgICAgICAgICAgICAgICAgc3RkOjp2
ZWN0b3I8cnNhX2tleXBhaXJfaWQ+ICYgcHVia2V5cywKICAgICAgICAgICAgICAgICAgIHN0ZDo6
dmVjdG9yPHJzYV9rZXlwYWlyX2lkPiAmIHByaXZrZXlzKTsKCiAgdm9pZCBnZXRfcHJpdmF0ZV9r
ZXlzKHN0ZDo6dmVjdG9yPHJzYV9rZXlwYWlyX2lkPiAmIHByaXZrZXlzKTsKICB2b2lkIGdldF9w
dWJsaWNfa2V5cyhzdGQ6OnZlY3Rvcjxyc2Ffa2V5cGFpcl9pZD4gJiBwdWJrZXlzKTsKCiAgYm9v
bCBrZXlfZXhpc3RzKHJzYV9rZXlwYWlyX2lkIGNvbnN0ICYgaWQpOwoKICBib29sIHB1YmxpY19r
ZXlfZXhpc3RzKGhleGVuYzxpZD4gY29uc3QgJiBoYXNoKTsKICBib29sIHB1YmxpY19rZXlfZXhp
c3RzKHJzYV9rZXlwYWlyX2lkIGNvbnN0ICYgaWQpOwogIGJvb2wgcHJpdmF0ZV9rZXlfZXhpc3Rz
KHJzYV9rZXlwYWlyX2lkIGNvbnN0ICYgaWQpOwogIAogIHZvaWQgZ2V0X3B1YmtleShoZXhlbmM8
aWQ+IGNvbnN0ICYgaGFzaCwgCiAgICAgICAgICAgICAgICAgIHJzYV9rZXlwYWlyX2lkICYgaWQs
CiAgICAgICAgICAgICAgICAgIGJhc2U2NDxyc2FfcHViX2tleT4gJiBwdWJfZW5jb2RlZCk7Cgog
IHZvaWQgZ2V0X2tleShyc2Ffa2V5cGFpcl9pZCBjb25zdCAmIGlkLCAKICAgICAgICAgICAgICAg
YmFzZTY0PHJzYV9wdWJfa2V5PiAmIHB1Yl9lbmNvZGVkKTsKCiAgdm9pZCBnZXRfa2V5KHJzYV9r
ZXlwYWlyX2lkIGNvbnN0ICYgaWQsIAogICAgICAgICAgICAgICBiYXNlNjQ8IGFyYzQ8cnNhX3By
aXZfa2V5PiA+ICYgcHJpdl9lbmNvZGVkKTsKCiAgdm9pZCBwdXRfa2V5KHJzYV9rZXlwYWlyX2lk
IGNvbnN0ICYgaWQsIAogICAgICAgICAgICAgICBiYXNlNjQ8cnNhX3B1Yl9rZXk+IGNvbnN0ICYg
cHViX2VuY29kZWQpOwogIAogIHZvaWQgcHV0X2tleShyc2Ffa2V5cGFpcl9pZCBjb25zdCAmIGlk
LCAKICAgICAgICAgICAgICAgYmFzZTY0PCBhcmM0PHJzYV9wcml2X2tleT4gPiBjb25zdCAmIHBy
aXZfZW5jb2RlZCk7CiAgCiAgdm9pZCBwdXRfa2V5X3BhaXIocnNhX2tleXBhaXJfaWQgY29uc3Qg
JiBwdWJfaWQsIAogICAgICAgICAgICAgICAgICAgIGJhc2U2NDxyc2FfcHViX2tleT4gY29uc3Qg
JiBwdWJfZW5jb2RlZCwKICAgICAgICAgICAgICAgICAgICBiYXNlNjQ8IGFyYzQ8cnNhX3ByaXZf
a2V5PiA+IGNvbnN0ICYgcHJpdl9lbmNvZGVkKTsKCiAgdm9pZCBkZWxldGVfcHJpdmF0ZV9rZXko
cnNhX2tleXBhaXJfaWQgY29uc3QgJiBwdWJfaWQpOwoKICAvLyBub3RlOiB0aGlzIHNlY3Rpb24g
aXMgcmlkaWN1bG91cy4gcGxlYXNlIGRvIHNvbWV0aGluZyBhYm91dCBpdC4KCiAgYm9vbCBtYW5p
ZmVzdF9jZXJ0X2V4aXN0cyhtYW5pZmVzdDxjZXJ0PiBjb25zdCAmIGNlcnQpOwogIGJvb2wgbWFu
aWZlc3RfY2VydF9leGlzdHMoaGV4ZW5jPGlkPiBjb25zdCAmIGhhc2gpOwogIHZvaWQgcHV0X21h
bmlmZXN0X2NlcnQobWFuaWZlc3Q8Y2VydD4gY29uc3QgJiBjZXJ0KTsKCiAgYm9vbCByZXZpc2lv
bl9jZXJ0X2V4aXN0cyhyZXZpc2lvbjxjZXJ0PiBjb25zdCAmIGNlcnQpOwogIGJvb2wgcmV2aXNp
b25fY2VydF9leGlzdHMoaGV4ZW5jPGlkPiBjb25zdCAmIGhhc2gpOwoKICB2b2lkIHB1dF9yZXZp
c2lvbl9jZXJ0KHJldmlzaW9uPGNlcnQ+IGNvbnN0ICYgY2VydCk7CgogIC8vIHRoaXMgdmFyaWFu
dCBoYXMgdG8gYmUgcmF0aGVyIGNvYXJzZSBhbmQgZmFzdCwgZm9yIG5ldHN5bmMncyB1c2UKICB2
b2lkIGdldF9yZXZpc2lvbl9jZXJ0X2luZGV4KHN0ZDo6dmVjdG9yPCBzdGQ6OnBhaXI8aGV4ZW5j
PGlkPiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjxyZXZpc2lvbl9p
ZCwgcnNhX2tleXBhaXJfaWQ+ID4gPiAmIGlkeCk7CgogIHZvaWQgZ2V0X3JldmlzaW9uX2NlcnRz
KHN0ZDo6dmVjdG9yPCByZXZpc2lvbjxjZXJ0PiA+ICYgY2VydHMpOwoKICB2b2lkIGdldF9yZXZp
c2lvbl9jZXJ0cyhjZXJ0X25hbWUgY29uc3QgJiBuYW1lLCAKICAgICAgICAgICAgICAgICAgICAg
ICAgICBzdGQ6OnZlY3RvcjwgcmV2aXNpb248Y2VydD4gPiAmIGNlcnRzKTsKCiAgdm9pZCBnZXRf
cmV2aXNpb25fY2VydHMocmV2aXNpb25faWQgY29uc3QgJiBpZCwgCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgY2VydF9uYW1lIGNvbnN0ICYgbmFtZSwgCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgc3RkOjp2ZWN0b3I8IHJldmlzaW9uPGNlcnQ+ID4gJiBjZXJ0cyk7CgogIHZvaWQgZ2V0X3Jl
dmlzaW9uX2NlcnRzKGNlcnRfbmFtZSBjb25zdCAmIG5hbWUsCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgYmFzZTY0PGNlcnRfdmFsdWU+IGNvbnN0ICYgdmFsLCAKICAgICAgICAgICAgICAgICAg
ICAgICAgICBzdGQ6OnZlY3RvcjwgcmV2aXNpb248Y2VydD4gPiAmIGNlcnRzKTsKCiAgdm9pZCBn
ZXRfcmV2aXNpb25fY2VydHMocmV2aXNpb25faWQgY29uc3QgJiBpZCwgCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgY2VydF9uYW1lIGNvbnN0ICYgbmFtZSwgCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgYmFzZTY0PGNlcnRfdmFsdWU+IGNvbnN0ICYgdmFsdWUsCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgc3RkOjp2ZWN0b3I8IHJldmlzaW9uPGNlcnQ+ID4gJiBjZXJ0cyk7CgogIHZvaWQg
Z2V0X3JldmlzaW9uX2NlcnRzKHJldmlzaW9uX2lkIGNvbnN0ICYgaWQsIAogICAgICAgICAgICAg
ICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPCByZXZpc2lvbjxjZXJ0PiA+ICYgY2VydHMpOwoKICB2
b2lkIGdldF9yZXZpc2lvbl9jZXJ0KGhleGVuYzxpZD4gY29uc3QgJiBoYXNoLAogICAgICAgICAg
ICAgICAgICAgICAgICAgcmV2aXNpb248Y2VydD4gJiBjZXJ0KTsKICAKICB2b2lkIGdldF9tYW5p
ZmVzdF9jZXJ0cyhtYW5pZmVzdF9pZCBjb25zdCAmIGlkLCAKICAgICAgICAgICAgICAgICAgICAg
ICAgICBzdGQ6OnZlY3RvcjwgbWFuaWZlc3Q8Y2VydD4gPiAmIGNlcnRzKTsKCiAgdm9pZCBnZXRf
bWFuaWZlc3RfY2VydHMoY2VydF9uYW1lIGNvbnN0ICYgbmFtZSwgCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgc3RkOjp2ZWN0b3I8IG1hbmlmZXN0PGNlcnQ+ID4gJiBjZXJ0cyk7CgogIHZvaWQg
Z2V0X21hbmlmZXN0X2NlcnRzKG1hbmlmZXN0X2lkIGNvbnN0ICYgaWQsIAogICAgICAgICAgICAg
ICAgICAgICAgICAgIGNlcnRfbmFtZSBjb25zdCAmIG5hbWUsIAogICAgICAgICAgICAgICAgICAg
ICAgICAgIHN0ZDo6dmVjdG9yPCBtYW5pZmVzdDxjZXJ0PiA+ICYgY2VydHMpOwogIAogIHZvaWQg
Z2V0X21hbmlmZXN0X2NlcnQoaGV4ZW5jPGlkPiBjb25zdCAmIGhhc2gsCiAgICAgICAgICAgICAg
ICAgICAgICAgICBtYW5pZmVzdDxjZXJ0PiAmIGNlcnQpOwoKICAvLyBlcG9jaHMgCgogIHZvaWQg
Z2V0X2Vwb2NocyhzdGQ6Om1hcDxjZXJ0X3ZhbHVlLCBlcG9jaF9kYXRhPiAmIGVwb2Nocyk7Cgog
IHZvaWQgZ2V0X2Vwb2NoKGVwb2NoX2lkIGNvbnN0ICYgZWlkLCBjZXJ0X3ZhbHVlICYgYnJhbmNo
LCBlcG9jaF9kYXRhICYgZXBvKTsKICAKICBib29sIGVwb2NoX2V4aXN0cyhlcG9jaF9pZCBjb25z
dCAmIGVpZCk7CgogIHZvaWQgc2V0X2Vwb2NoKGNlcnRfdmFsdWUgY29uc3QgJiBicmFuY2gsIGVw
b2NoX2RhdGEgY29uc3QgJiBlcG8pOyAgCgogIHZvaWQgY2xlYXJfZXBvY2goY2VydF92YWx1ZSBj
b25zdCAmIGJyYW5jaCk7CiAKICAvLyBjb21wbGV0aW9uIHN0dWZmCgogIHZvaWQgY29tcGxldGUo
c3RkOjpzdHJpbmcgY29uc3QgJiBwYXJ0aWFsLAogICAgICAgICAgICAgICAgc3RkOjpzZXQ8cmV2
aXNpb25faWQ+ICYgY29tcGxldGlvbnMpOwoKICB2b2lkIGNvbXBsZXRlKHN0ZDo6c3RyaW5nIGNv
bnN0ICYgcGFydGlhbCwKICAgICAgICAgICAgICAgIHN0ZDo6c2V0PG1hbmlmZXN0X2lkPiAmIGNv
bXBsZXRpb25zKTsKICAKICB2b2lkIGNvbXBsZXRlKHN0ZDo6c3RyaW5nIGNvbnN0ICYgcGFydGlh
bCwKICAgICAgICAgICAgICAgIHN0ZDo6c2V0PGZpbGVfaWQ+ICYgY29tcGxldGlvbnMpOwoKICB2
b2lkIGNvbXBsZXRlKGNvbW1hbmRzOjpzZWxlY3Rvcl90eXBlIHR5LAogICAgICAgICAgICAgICAg
c3RkOjpzdHJpbmcgY29uc3QgJiBwYXJ0aWFsLAogICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8
c3RkOjpwYWlyPGNvbW1hbmRzOjpzZWxlY3Rvcl90eXBlLCAKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZz4gPiBjb25zdCAmIGxpbWl0LAogICAgICAgICAg
ICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+ICYgY29tcGxldGlvbnMpOwogIAogIH5kYXRhYmFz
ZSgpOwoKfTsKCi8vIHRyYW5zYWN0aW9uIGd1YXJkcyBuZXN0LiBhY3F1aXJlIG9uZSBpbiBhbnkg
c2NvcGUgeW91J2QgbGlrZQovLyB0cmFuc2FjdGlvbi1wcm90ZWN0ZWQsIGFuZCBpdCdsbCBtYWtl
IHN1cmUgdGhlIGRiIGFib3J0cyBhCi8vIHR4biBpZiB0aGVyZSdzIGFueSBleGNlcHRpb24gYmVm
b3JlIHlvdSBjYWxsIGNvbW1pdCgpCgpjbGFzcyB0cmFuc2FjdGlvbl9ndWFyZAp7CiAgYm9vbCBj
b21taXR0ZWQ7CiAgZGF0YWJhc2UgJiBkYjsKcHVibGljOgogIHRyYW5zYWN0aW9uX2d1YXJkKGRh
dGFiYXNlICYgZCk7CiAgfnRyYW5zYWN0aW9uX2d1YXJkKCk7CiAgdm9pZCBjb21taXQoKTsKfTsK
CgoKI2VuZGlmIC8vIF9fREFUQUJBU0VfSEhfXwo=
_ATEOF


$at_traceoff
echo "t_merge_5.at:1118: if test \"\$OSTYPE\" == \"msys\"; then
  mimencode -u -o parent parent.b64
else
  eval \$UNB64_COMMAND <parent.b64 >parent
fi
"
echo t_merge_5.at:1118 >$at_check_line_file
( $at_traceon; if test "$OSTYPE" == "msys"; then
  mimencode -u -o parent parent.b64
else
  eval $UNB64_COMMAND <parent.b64 >parent
fi
 ) >$at_stdout 2>$at_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_5.at:1118: exit code was $at_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_5.at:1119: if test \"\$OSTYPE\" == \"msys\"; then
  mimencode -u -o left left.b64
else
  eval \$UNB64_COMMAND <left.b64 >left
fi
"
echo t_merge_5.at:1119 >$at_check_line_file
( $at_traceon; if test "$OSTYPE" == "msys"; then
  mimencode -u -o left left.b64
else
  eval $UNB64_COMMAND <left.b64 >left
fi
 ) >$at_stdout 2>$at_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_5.at:1119: exit code was $at_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_5.at:1120: if test \"\$OSTYPE\" == \"msys\"; then
  mimencode -u -o right right.b64
else
  eval \$UNB64_COMMAND <right.b64 >right
fi
"
echo t_merge_5.at:1120 >$at_check_line_file
( $at_traceon; if test "$OSTYPE" == "msys"; then
  mimencode -u -o right right.b64
else
  eval $UNB64_COMMAND <right.b64 >right
fi
 ) >$at_stdout 2>$at_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_5.at:1120: exit code was $at_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_5.at:1121: if test \"\$OSTYPE\" == \"msys\"; then
  mimencode -u -o correct correct.b64
else
  eval \$UNB64_COMMAND <correct.b64 >correct
fi
"
echo t_merge_5.at:1121 >$at_check_line_file
( $at_traceon; if test "$OSTYPE" == "msys"; then
  mimencode -u -o correct correct.b64
else
  eval $UNB64_COMMAND <correct.b64 >correct
fi
 ) >$at_stdout 2>$at_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_5.at:1121: exit code was $at_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_5.at:1123: cp -f parent testfile"
echo t_merge_5.at:1123 >$at_check_line_file
( $at_traceon; cp -f parent 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_5.at:1123: exit code was $at_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_5.at:1124: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_merge_5.at:1124 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_5.at:1124: exit code was $at_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_5.at:1125: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_merge_5.at:1125 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_5.at:1125: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


PARENT_SHA=`cat MT/revision`

$at_traceoff
echo "t_merge_5.at:1128: cp -f left testfile"
echo t_merge_5.at:1128 >$at_check_line_file
( $at_traceon; cp -f left 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_5.at:1128: exit code was $at_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_5.at:1129: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_merge_5.at:1129 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_5.at:1129: exit code was $at_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_5.at:1131: rm -rf MT.old"
echo t_merge_5.at:1131 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_5.at:1131: exit code was $at_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_5.at:1131: mv  MT MT.old"
echo t_merge_5.at:1131 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_5.at:1131: exit code was $at_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_5.at:1131: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$PARENT_SHA ."
echo t_merge_5.at:1131 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $PARENT_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_5.at:1131: exit code was $at_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_5.at:1131: mv MT.old/options MT"
echo t_merge_5.at:1131 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_5.at:1131: 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_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_merge_5.at:1131: test \$PROBE_R_SHA = \$PARENT_SHA"
echo t_merge_5.at:1131 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $PARENT_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_5.at:1131: exit code was $at_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_5.at:1133: cp -f right testfile"
echo t_merge_5.at:1133 >$at_check_line_file
( $at_traceon; cp -f right 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_5.at:1133: exit code was $at_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_5.at:1134: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_merge_5.at:1134 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_5.at:1134: exit code was $at_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_5.at:1136: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch merge"
echo t_merge_5.at:1136 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --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_5.at:1136: exit code was $at_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_5.at:1138: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update"
echo t_merge_5.at:1138 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_5.at:1138: exit code was $at_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_5.at:1139: cmp testfile correct"
echo t_merge_5.at:1139 >$at_check_line_file
( $at_traceon; cmp testfile correct ) >$at_stdout 2>$at_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_5.at:1139: exit code 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`
    ;;

  146 ) # 146. t_empty_id_completion.at:1: empty id completion
    at_setup_line='t_empty_id_completion.at:1'
    at_desc='empty id completion'
    $at_quiet $ECHO_N "146: empty id completion                          $ECHO_C"
    at_xfail=no
    (
      echo "146. t_empty_id_completion.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_empty_id_completion.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_empty_id_completion.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_empty_id_completion.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_empty_id_completion.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_empty_id_completion.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_empty_id_completion.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_empty_id_completion.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_empty_id_completion.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_empty_id_completion.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_empty_id_completion.at:2: rm test_keys"
echo t_empty_id_completion.at:2 >$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_empty_id_completion.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



# regression test: completing the revision "" doesn't crash
$at_traceoff
echo "t_empty_id_completion.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR cat revision \"\""
echo t_empty_id_completion.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR cat revision "" ) >$at_stdout 2>$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_empty_id_completion.at:5: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

# might as well check the others...
$at_traceoff
echo "t_empty_id_completion.at:7: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR cat manifest \"\""
echo t_empty_id_completion.at:7 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR cat 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_empty_id_completion.at:7: 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_empty_id_completion.at:8: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR cat file \"\""
echo t_empty_id_completion.at:8 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR cat 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;;
   1) ;;
   *) echo "t_empty_id_completion.at:8: 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`
    ;;

  147 ) # 147. t_empty_path.at:1: empty string as a path name
    at_setup_line='t_empty_path.at:1'
    at_desc='empty string as a path name'
    $at_quiet $ECHO_N "147: empty string as a path name                  $ECHO_C"
    at_xfail=no
    (
      echo "147. t_empty_path.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_empty_path.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_empty_path.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_empty_path.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_empty_path.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_empty_path.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_empty_path.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_empty_path.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_empty_path.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_empty_path.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_empty_path.at:2: rm test_keys"
echo t_empty_path.at:2 >$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_empty_path.at:2: 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'
blah blah
_ATEOF

$at_traceoff
echo "t_empty_path.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_empty_path.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_empty_path.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_empty_path.at:6: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_empty_path.at:6 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_empty_path.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


REV0=`cat MT/revision`

$at_traceoff
echo "t_empty_path.at:9: mkdir foo"
echo t_empty_path.at:9 >$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_empty_path.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_empty_path.at:10: cd foo && \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup \"\""
echo t_empty_path.at:10 >$at_check_line_file
( $at_traceon; cd foo && $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup "" ) >$at_stdout 2>$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_empty_path.at:10: 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_empty_path.at:11: cd foo && \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$REV0 \"\""
echo t_empty_path.at:11 >$at_check_line_file
( $at_traceon; cd foo && $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $REV0 "" ) >$at_stdout 2>$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_empty_path.at:11: 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_empty_path.at:12: cd foo && \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout --branch=testbranch \"\""
echo t_empty_path.at:12 >$at_check_line_file
( $at_traceon; cd foo && $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout --branch=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;;
   1) ;;
   *) echo "t_empty_path.at:12: 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_empty_path.at:14: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add \"\""
echo t_empty_path.at:14 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add "" ) >$at_stdout 2>$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_empty_path.at:14: 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_empty_path.at:15: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR drop \"\""
echo t_empty_path.at:15 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR drop "" ) >$at_stdout 2>$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_empty_path.at:15: 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_empty_path.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename testfile \"\""
echo t_empty_path.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename 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;;
   1) ;;
   *) echo "t_empty_path.at:16: 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_empty_path.at:17: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename \"\" otherfile"
echo t_empty_path.at:17 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename "" otherfile ) >$at_stdout 2>$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_empty_path.at:17: 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_empty_path.at:19: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR revert \"\""
echo t_empty_path.at:19 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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;;
   1) ;;
   *) echo "t_empty_path.at:19: 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`
    ;;

  148 ) # 148. t_empty_env.at:1: empty environment
    at_setup_line='t_empty_env.at:1'
    at_desc='empty environment'
    $at_quiet $ECHO_N "148: empty environment                            $ECHO_C"
    at_xfail=no
    (
      echo "148. t_empty_env.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_empty_env.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_empty_env.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_empty_env.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_empty_env.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_empty_env.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_empty_env.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_empty_env.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_empty_env.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_empty_env.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_empty_env.at:2: rm test_keys"
echo t_empty_env.at:2 >$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_empty_env.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_empty_env.at:6: if test \"\$OSTYPE\" == \"msys\"; then
  cp \$(which libiconv-2.dll) .
fi"
echo t_empty_env.at:6 >$at_check_line_file
( $at_traceon; if test "$OSTYPE" == "msys"; then
  cp $(which libiconv-2.dll) .
fi ) >$at_stdout 2>$at_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_empty_env.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_empty_env.at:8: env -i \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --help"
echo t_empty_env.at:8 >$at_check_line_file
( $at_traceon; env -i $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --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_empty_env.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 >testfile <<'_ATEOF'
blah blah
_ATEOF

$at_traceoff
echo "t_empty_env.at:11: env -i \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_empty_env.at:11 >$at_check_line_file
( $at_traceon; env -i $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_empty_env.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_empty_env.at:12: env -i \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --branch=testbranch --message=foo"
echo t_empty_env.at:12 >$at_check_line_file
( $at_traceon; env -i $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --branch=testbranch --message=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_empty_env.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  149 ) # 149. t_short_opts.at:5: short options work correctly
    at_setup_line='t_short_opts.at:5'
    at_desc='short options work correctly'
    $at_quiet $ECHO_N "149: short options work correctly                 $ECHO_C"
    at_xfail=no
    (
      echo "149. t_short_opts.at:5: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_short_opts.at:7: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_short_opts.at:7 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_short_opts.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_short_opts.at:7: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_short_opts.at:7 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_short_opts.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_short_opts.at:7: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_short_opts.at:7 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_short_opts.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_short_opts.at:7: rm test_keys"
echo t_short_opts.at:7 >$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_short_opts.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 >maude <<'_ATEOF'
the file maude
_ATEOF


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


# same as MONOTONE macro but without --db and --key


$at_traceoff
echo "t_short_opts.at:18: \$PREEXECUTE monotone --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --root=\$_ROOT_DIR add maude"
echo t_short_opts.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE monotone --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --root=$_ROOT_DIR 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_short_opts.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 it won't work with a bad key
$at_traceoff
echo "t_short_opts.at:21: \$PREEXECUTE monotone --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --root=\$_ROOT_DIR -k badkey@example.com -b test.branch commit -d test.db -m happy"
echo t_short_opts.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE monotone --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --root=$_ROOT_DIR -k badkey@example.com -b test.branch commit -d test.db -m happy ) >$at_stdout 2>$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_short_opts.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


# and it does work with a key
$at_traceoff
echo "t_short_opts.at:24: \$PREEXECUTE monotone --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --root=\$_ROOT_DIR -k tester@test.net -b test.branch commit -d test.db -m happy"
echo t_short_opts.at:24 >$at_check_line_file
( $at_traceon; $PREEXECUTE monotone --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --root=$_ROOT_DIR -k tester@test.net -b test.branch commit -d test.db -m happy ) >$at_stdout 2>$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_short_opts.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`
    ;;

  150 ) # 150. t_netsync_sigpipe.at:3: netsync is not interrupted by SIGPIPE
    at_setup_line='t_netsync_sigpipe.at:3'
    at_desc='netsync is not interrupted by SIGPIPE'
    $at_quiet $ECHO_N "150: netsync is not interrupted by SIGPIPE        $ECHO_C"
    at_xfail=no
    (
      echo "150. t_netsync_sigpipe.at:3: testing ..."
      $at_traceon







# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_sigpipe.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_netsync_sigpipe.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_sigpipe.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_netsync_sigpipe.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_netsync_sigpipe.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_sigpipe.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_netsync_sigpipe.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_netsync_sigpipe.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_sigpipe.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_netsync_sigpipe.at:18: rm test_keys"
echo t_netsync_sigpipe.at:18 >$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_sigpipe.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_netsync_sigpipe.at:19: cp test.db test2.db"
echo t_netsync_sigpipe.at:19 >$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_sigpipe.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_netsync_sigpipe.at:19: cp test.db test3.db"
echo t_netsync_sigpipe.at:19 >$at_check_line_file
( $at_traceon; cp test.db test3.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_sigpipe.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

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_sigpipe.at:23: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_netsync_sigpipe.at:23 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_sigpipe.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_netsync_sigpipe.at:24: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_netsync_sigpipe.at:24 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_sigpipe.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

F_VER0=`monotone --norc identify testfile`
VER0=`cat MT/revision`

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

$at_traceoff
echo "t_netsync_sigpipe.at:30: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit --message blah-blah"
echo t_netsync_sigpipe.at:30 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit --message 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_sigpipe.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

F_VER1=`monotone --norc identify testfile`
VER1=`cat MT/revision`



if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi

$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --rcfile=netsync.lua serve localhost:5555 testbranch &
sleep 4


# send the server a SIGPIPE signal (it should survive)

if test "$OSTYPE" == "msys"; then
  #ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[[pp]]=="monotone")system("kill -PIPE " $a);}'
  # If we really wanted to do this on Windows, the above is correct.  But
  # there is no SIGPIPE on Windows and hence we don't really need to test this
  # behaviour there.  Hence, we just do nothing.
  echo "No SIGPIPE on MinGW"
else
  killall -PIPE monotone 2>/dev/null
fi


# this will fail if the SIGPIPE terminated it


$at_traceoff
echo "t_netsync_sigpipe.at:40: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost:5555 testbranch"
echo t_netsync_sigpipe.at:40 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --db=test2.db --rcfile=netsync.lua pull localhost: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_sigpipe.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






if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill " $a);}'
  # MinGW has no killall.  The weird a=1 thing is to avoid autotest treating  as its own parameter
else
  killall monotone 2>/dev/null
fi

sleep 1

if test "$OSTYPE" == "msys"; then
  ps |awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[pp]=="monotone")system("kill -KILL " $a);}'
else
  killall -KILL monotone 2>/dev/null
fi



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

  151 ) # 151. t_setup_creates_log.at:3: setup creates MT/log
    at_setup_line='t_setup_creates_log.at:3'
    at_desc='setup creates MT/log'
    $at_quiet $ECHO_N "151: setup creates MT/log                         $ECHO_C"
    at_xfail=no
    (
      echo "151. t_setup_creates_log.at:3: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_setup_creates_log.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_setup_creates_log.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_setup_creates_log.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_setup_creates_log.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_setup_creates_log.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_setup_creates_log.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_setup_creates_log.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_setup_creates_log.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_setup_creates_log.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_setup_creates_log.at:5: rm test_keys"
echo t_setup_creates_log.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_setup_creates_log.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_setup_creates_log.at:7: test -f MT/log -a ! -s MT/log"
echo t_setup_creates_log.at:7 >$at_check_line_file
( $at_traceon; test -f MT/log -a ! -s MT/log ) >$at_stdout 2>$at_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_setup_creates_log.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  152 ) # 152. t_checkout_creates_log.at:3: checkout creates MT/log
    at_setup_line='t_checkout_creates_log.at:3'
    at_desc='checkout creates MT/log'
    $at_quiet $ECHO_N "152: checkout creates MT/log                      $ECHO_C"
    at_xfail=no
    (
      echo "152. t_checkout_creates_log.at:3: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_checkout_creates_log.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_checkout_creates_log.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_checkout_creates_log.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_checkout_creates_log.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_checkout_creates_log.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_checkout_creates_log.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_checkout_creates_log.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_checkout_creates_log.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_checkout_creates_log.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_checkout_creates_log.at:5: rm test_keys"
echo t_checkout_creates_log.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_checkout_creates_log.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 >commit_log.lua <<'_ATEOF'

function edit_comment(summary, user_log_file)
  return user_log_file
end
_ATEOF


cat >MT/log <<'_ATEOF'
Log entry
_ATEOF


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


$at_traceoff
echo "t_checkout_creates_log.at:19: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add input.txt"
echo t_checkout_creates_log.at:19 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_checkout_creates_log.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_checkout_creates_log.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch --rcfile=commit_log.lua commit"
echo t_checkout_creates_log.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch --rcfile=commit_log.lua commit ) >$at_stdout 2>$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_checkout_creates_log.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_checkout_creates_log.at:23: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch co testbranch"
echo t_checkout_creates_log.at:23 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch co testbranch ) >$at_stdout 2>$at_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_checkout_creates_log.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_checkout_creates_log.at:25: test -f testbranch/MT/log -a ! -s MT/log"
echo t_checkout_creates_log.at:25 >$at_check_line_file
( $at_traceon; test -f testbranch/MT/log -a ! -s MT/log ) >$at_stdout 2>$at_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_checkout_creates_log.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  153 ) # 153. t_commit_log_1.at:3: commit using MT/log
    at_setup_line='t_commit_log_1.at:3'
    at_desc='commit using MT/log'
    $at_quiet $ECHO_N "153: commit using MT/log                          $ECHO_C"
    at_xfail=no
    (
      echo "153. t_commit_log_1.at:3: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_commit_log_1.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_commit_log_1.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_commit_log_1.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_commit_log_1.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_commit_log_1.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_commit_log_1.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_commit_log_1.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_commit_log_1.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_commit_log_1.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_commit_log_1.at:5: rm test_keys"
echo t_commit_log_1.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_commit_log_1.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 >commit_log.lua <<'_ATEOF'

function edit_comment(summary, user_log_file)
  return user_log_file
end
_ATEOF


cat >MT/log <<'_ATEOF'
Log entry
_ATEOF


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


$at_traceoff
echo "t_commit_log_1.at:19: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add input.txt"
echo t_commit_log_1.at:19 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_commit_log_1.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_commit_log_1.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch --rcfile=commit_log.lua commit"
echo t_commit_log_1.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch --rcfile=commit_log.lua commit ) >$at_stdout 2>$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_commit_log_1.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


TSHA=`cat MT/revision`
$at_traceoff
echo "t_commit_log_1.at:24: test -f MT/log -a ! -s MT/log"
echo t_commit_log_1.at:24 >$at_check_line_file
( $at_traceon; test -f MT/log -a ! -s MT/log ) >$at_stdout 2>$at_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_commit_log_1.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_commit_log_1.at:25: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls certs \$TSHA"
echo t_commit_log_1.at:25 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_commit_log_1.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_commit_log_1.at:26: grep -q 'Log entry' stdout"
echo t_commit_log_1.at:26 >$at_check_line_file
( $at_traceon; grep -q 'Log entry' 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;;
   0) ;;
   *) echo "t_commit_log_1.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  154 ) # 154. t_commit_log_2.at:3: commit w/o MT/log being present
    at_setup_line='t_commit_log_2.at:3'
    at_desc='commit w/o MT/log being present'
    $at_quiet $ECHO_N "154: commit w/o MT/log being present              $ECHO_C"
    at_xfail=no
    (
      echo "154. t_commit_log_2.at:3: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_commit_log_2.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_commit_log_2.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_commit_log_2.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_commit_log_2.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_commit_log_2.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_commit_log_2.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_commit_log_2.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_commit_log_2.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_commit_log_2.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_commit_log_2.at:5: rm test_keys"
echo t_commit_log_2.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_commit_log_2.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_commit_log_2.at:7: rm -f MT/log"
echo t_commit_log_2.at:7 >$at_check_line_file
( $at_traceon; rm -f MT/log ) >$at_stdout 2>$at_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_commit_log_2.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 >input.txt <<'_ATEOF'
version 0 of the file
_ATEOF


$at_traceoff
echo "t_commit_log_2.at:12: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add input.txt"
echo t_commit_log_2.at:12 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_commit_log_2.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_commit_log_2.at:14: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message=\"Log entry\""
echo t_commit_log_2.at:14 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message="Log entry" ) >$at_stdout 2>$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_commit_log_2.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


TSHA=`cat MT/revision`
$at_traceoff
echo "t_commit_log_2.at:17: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls certs \$TSHA"
echo t_commit_log_2.at:17 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_commit_log_2.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_commit_log_2.at:18: grep -q 'Log entry' stdout"
echo t_commit_log_2.at:18 >$at_check_line_file
( $at_traceon; grep -q 'Log entry' 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;;
   0) ;;
   *) echo "t_commit_log_2.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`
    ;;

  155 ) # 155. t_dropkey_1.at:3: drop a public key
    at_setup_line='t_dropkey_1.at:3'
    at_desc='drop a public key'
    $at_quiet $ECHO_N "155: drop a public key                            $ECHO_C"
    at_xfail=no
    (
      echo "155. t_dropkey_1.at:3: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_dropkey_1.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_dropkey_1.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_dropkey_1.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_dropkey_1.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_dropkey_1.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_dropkey_1.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_dropkey_1.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_dropkey_1.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_dropkey_1.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_dropkey_1.at:5: rm test_keys"
echo t_dropkey_1.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_dropkey_1.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 >pubkey.txt <<'_ATEOF'
[pubkey john@doe.com]
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCPUdR/bM41m2KIpS0eXlTG91PSWvOUdwY4
6aKd+DXZFma8Hi00Wvwmr+0JJdWqPwyxR/Dr2a2Z7Db76lUiNlhvRw3yoKP2ip9Jjfe0LReG
5aJ5u1l5L5VPiZ5iZq9PjxNDAYASpb89yBT7BJZ6OAXuE9zHFR506Apg7UB4Em184wIBEQ==
[end]
_ATEOF


$at_traceoff
echo "t_dropkey_1.at:14: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read < pubkey.txt"
echo t_dropkey_1.at:14 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR read < pubkey.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_dropkey_1.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_dropkey_1.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR pubkey john@doe.com"
echo t_dropkey_1.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR pubkey john@doe.com ) >$at_stdout 2>$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_dropkey_1.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_dropkey_1.at:18: grep -q 'john@doe.com' stdout"
echo t_dropkey_1.at:18 >$at_check_line_file
( $at_traceon; grep -q 'john@doe.com' 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;;
   0) ;;
   *) echo "t_dropkey_1.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_dropkey_1.at:20: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR dropkey john@doe.com"
echo t_dropkey_1.at:20 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR dropkey john@doe.com ) >$at_stdout 2>$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_dropkey_1.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_dropkey_1.at:22: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR pubkey john@doe.com"
echo t_dropkey_1.at:22 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR pubkey john@doe.com ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; tee stderr <$at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   1) ;;
   *) echo "t_dropkey_1.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


$at_traceoff
echo "t_dropkey_1.at:24: grep -q 'does not exist' stderr"
echo t_dropkey_1.at:24 >$at_check_line_file
( $at_traceon; grep -q 'does not exist' stderr ) >$at_stdout 2>$at_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_dropkey_1.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`
    ;;

  156 ) # 156. t_dropkey_2.at:3: drop a public and private key
    at_setup_line='t_dropkey_2.at:3'
    at_desc='drop a public and private key'
    $at_quiet $ECHO_N "156: drop a public and private key                $ECHO_C"
    at_xfail=no
    (
      echo "156. t_dropkey_2.at:3: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_dropkey_2.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_dropkey_2.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_dropkey_2.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_dropkey_2.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_dropkey_2.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_dropkey_2.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_dropkey_2.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_dropkey_2.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_dropkey_2.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_dropkey_2.at:5: rm test_keys"
echo t_dropkey_2.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_dropkey_2.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 >key.txt <<'_ATEOF'
[pubkey john@doe.com]
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCPUdR/bM41m2KIpS0eXlTG91PSWvOUdwY4
6aKd+DXZFma8Hi00Wvwmr+0JJdWqPwyxR/Dr2a2Z7Db76lUiNlhvRw3yoKP2ip9Jjfe0LReG
5aJ5u1l5L5VPiZ5iZq9PjxNDAYASpb89yBT7BJZ6OAXuE9zHFR506Apg7UB4Em184wIBEQ==
[end]
[privkey john@doe.com]
ZOC+Y7Y9QGlMneYNH5zexwV6IlWb8Q9IhW2Jn+qVhlxpocqN6AI60NXgzVupUOyNvTPsc2kP
mwjaHGaIr3SZE6E3riS8BnMNnvvCo5FZE5R2Hm4O+MST2LOINFX1eNSNch6pXGnjmTA6MO2Z
9YuZ1AERPdy/T2DD3EBNMZM6uylc6IJlwW8JMe6DWaAaGmoAb35NCEgw6uw1UjIEXTJRrv15
cTMSjAP+KZCfuoRsF8aTB42cvaN+Zb5xti1UuIASiWOo8vwubkw36yg5De5mjmrMt35EQZz5
c0NmOdrPhM4lhCLFXdnmZYLb+fVQ5l1Jps8Suw+R9tLXBXZW0naW3CTHEEq5FNKq/gs08bPC
BwZVTkjwCca4U05TlBVw1EaKQ4p1vXMuKZ+KOuU/7mGkuGUoLiDsUdiMwE5gtdGxeDoV1xIC
NPWRfdF1Vq4J0+enYXtR1Hsf0b6XGTEm+ROXSZoJD9YLv5s2at0ZS5NzlF7YBEVn0Sr4xst8
J93peP//bJVR0+WvcCfkw/rxm5dJSOcmmOZDRybLxLvfaQimMcXziKBvTexBCxhMbBSZCZpm
D4RIX398204YEXTci7aEWBKSj+PxsGa0GKpZd6MjC3LrzcBv3+aL1v2665HOxLrAqolF8Dqs
B0ack2LFLIBVM1XSr8U5bHJfsbmfRo+ozMKW1zRbfiGxi3JU6NZdC43BXq2dtFuegsZBc4wp
ZFUYD1E/OkiAPJFkDT5fgjjnzDY/owEY/+1waEq6FOnfce3GQSO5MCVXkRm0p3PwTGv/kURi
I/vg5ZHwjfqj3GOWcTMO/PKumwX4hV4HSZOQHAIqgR8mTDA69yn9
[end]
_ATEOF


$at_traceoff
echo "t_dropkey_2.at:28: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read < key.txt"
echo t_dropkey_2.at:28 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR read < key.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_dropkey_2.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_dropkey_2.at:30: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR privkey john@doe.com"
echo t_dropkey_2.at:30 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR privkey john@doe.com ) >$at_stdout 2>$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_dropkey_2.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_dropkey_2.at:32: grep -q 'john@doe.com' stdout"
echo t_dropkey_2.at:32 >$at_check_line_file
( $at_traceon; grep -q 'john@doe.com' 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;;
   0) ;;
   *) echo "t_dropkey_2.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_dropkey_2.at:34: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR dropkey john@doe.com"
echo t_dropkey_2.at:34 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR dropkey john@doe.com ) >$at_stdout 2>$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_dropkey_2.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_dropkey_2.at:36: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR privkey john@doe.com"
echo t_dropkey_2.at:36 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR privkey john@doe.com ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; tee stderr <$at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   1) ;;
   *) echo "t_dropkey_2.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_dropkey_2.at:38: grep -q 'does not exist' stderr"
echo t_dropkey_2.at:38 >$at_check_line_file
( $at_traceon; grep -q 'does not exist' stderr ) >$at_stdout 2>$at_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_dropkey_2.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_dropkey_2.at:40: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR pubkey john@doe.com"
echo t_dropkey_2.at:40 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR pubkey john@doe.com ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; tee stderr <$at_stderr
echo stdout:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   1) ;;
   *) echo "t_dropkey_2.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_dropkey_2.at:42: grep -q 'does not exist' stderr"
echo t_dropkey_2.at:42 >$at_check_line_file
( $at_traceon; grep -q 'does not exist' stderr ) >$at_stdout 2>$at_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_dropkey_2.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`
    ;;

  157 ) # 157. t_rename_attr.at:1: rename moves attributes
    at_setup_line='t_rename_attr.at:1'
    at_desc='rename moves attributes'
    $at_quiet $ECHO_N "157: rename moves attributes                      $ECHO_C"
    at_xfail=yes
    (
      echo "157. t_rename_attr.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_attr.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_rename_attr.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_attr.at:2: exit code was $at_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_attr.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_rename_attr.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_attr.at:2: exit code was $at_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_attr.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_rename_attr.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_attr.at:2: exit code was $at_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_attr.at:2: rm test_keys"
echo t_rename_attr.at:2 >$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_attr.at:2: 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 a bug report.



cat >testfile <<'_ATEOF'
foo bar
_ATEOF

$at_traceoff
echo "t_rename_attr.at:8: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_rename_attr.at:8 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_rename_attr.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_rename_attr.at:9: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR attr set testfile some_key some_value"
echo t_rename_attr.at:9 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR attr set testfile some_key some_value ) >$at_stdout 2>$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_attr.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_rename_attr.at:10: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR attr get testfile"
echo t_rename_attr.at:10 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR attr get 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_rename_attr.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_rename_attr.at:11: grep -q some_key stdout"
echo t_rename_attr.at:11 >$at_check_line_file
( $at_traceon; grep -q some_key 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;;
   0) ;;
   *) echo "t_rename_attr.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_rename_attr.at:12: grep -q some_value stdout"
echo t_rename_attr.at:12 >$at_check_line_file
( $at_traceon; grep -q some_value 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;;
   0) ;;
   *) echo "t_rename_attr.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_rename_attr.at:14: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_rename_attr.at:14 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_attr.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_rename_attr.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename testfile otherfile"
echo t_rename_attr.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename testfile otherfile ) >$at_stdout 2>$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_attr.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_rename_attr.at:17: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR attr get testfile"
echo t_rename_attr.at:17 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR attr get 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;;
   1) ;;
   *) echo "t_rename_attr.at:17: 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_attr.at:18: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR attr get otherfile"
echo t_rename_attr.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR attr get otherfile ) >$at_stdout 2>$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_rename_attr.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_rename_attr.at:19: grep -q some_key stdout"
echo t_rename_attr.at:19 >$at_check_line_file
( $at_traceon; grep -q some_key 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;;
   0) ;;
   *) echo "t_rename_attr.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_attr.at:20: grep -q some_value stdout"
echo t_rename_attr.at:20 >$at_check_line_file
( $at_traceon; grep -q some_value 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;;
   0) ;;
   *) echo "t_rename_attr.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  158 ) # 158. t_automate_descendents.at:1: automate descendents
    at_setup_line='t_automate_descendents.at:1'
    at_desc='automate descendents'
    $at_quiet $ECHO_N "158: automate descendents                         $ECHO_C"
    at_xfail=no
    (
      echo "158. t_automate_descendents.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_automate_descendents.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_automate_descendents.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_automate_descendents.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_descendents.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_automate_descendents.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_automate_descendents.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_descendents.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_automate_descendents.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_automate_descendents.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_descendents.at:2: rm test_keys"
echo t_automate_descendents.at:2 >$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_automate_descendents.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_automate_descendents.at:4: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate descendents c7539264e83c5d6af4c792f079b5d46e9c128665"
echo t_automate_descendents.at:4 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate descendents c7539264e83c5d6af4c792f079b5d46e9c128665 ) >$at_stdout 2>$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_automate_descendents.at:4: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


#   A
#  / \
# B   C
#     |\
#     D E
#     \/
#      F


cat >testfile <<'_ATEOF'
A
_ATEOF

$at_traceoff
echo "t_automate_descendents.at:15: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_automate_descendents.at:15 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_automate_descendents.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_automate_descendents.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_automate_descendents.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_automate_descendents.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


REV_A=`cat MT/revision`


cat >testfile <<'_ATEOF'
B
_ATEOF



$at_traceoff
echo "t_automate_descendents.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_automate_descendents.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_automate_descendents.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


REV_B=`cat MT/revision`


$at_traceoff
echo "t_automate_descendents.at:24: rm -rf MT.old"
echo t_automate_descendents.at:24 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_automate_descendents.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_automate_descendents.at:24: mv  MT MT.old"
echo t_automate_descendents.at:24 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_automate_descendents.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_automate_descendents.at:24: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$REV_A ."
echo t_automate_descendents.at:24 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $REV_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_automate_descendents.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_automate_descendents.at:24: mv MT.old/options MT"
echo t_automate_descendents.at:24 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_automate_descendents.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_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_automate_descendents.at:24: test \$PROBE_R_SHA = \$REV_A"
echo t_automate_descendents.at:24 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $REV_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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_descendents.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




cat >testfile <<'_ATEOF'
C
_ATEOF



$at_traceoff
echo "t_automate_descendents.at:28: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_automate_descendents.at:28 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_automate_descendents.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


REV_C=`cat MT/revision`


cat >testfile <<'_ATEOF'
D
_ATEOF



$at_traceoff
echo "t_automate_descendents.at:33: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_automate_descendents.at:33 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_automate_descendents.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


REV_D=`cat MT/revision`


$at_traceoff
echo "t_automate_descendents.at:36: rm -rf MT.old"
echo t_automate_descendents.at:36 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_automate_descendents.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_automate_descendents.at:36: mv  MT MT.old"
echo t_automate_descendents.at:36 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_automate_descendents.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_automate_descendents.at:36: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$REV_C ."
echo t_automate_descendents.at:36 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $REV_C . ) >$at_stdout 2>$at_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_automate_descendents.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_automate_descendents.at:36: mv MT.old/options MT"
echo t_automate_descendents.at:36 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_automate_descendents.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_automate_descendents.at:36: test \$PROBE_R_SHA = \$REV_C"
echo t_automate_descendents.at:36 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $REV_C ) >$at_stdout 2>$at_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_automate_descendents.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




cat >otherfile <<'_ATEOF'
E
_ATEOF

$at_traceoff
echo "t_automate_descendents.at:39: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add otherfile"
echo t_automate_descendents.at:39 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add otherfile ) >$at_stdout 2>$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_automate_descendents.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_automate_descendents.at:40: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_automate_descendents.at:40 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_automate_descendents.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


REV_E=`cat MT/revision`

$at_traceoff
echo "t_automate_descendents.at:43: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR explicit_merge \$REV_D \$REV_E testbranch"
echo t_automate_descendents.at:43 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR explicit_merge $REV_D $REV_E 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_automate_descendents.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_automate_descendents.at:44: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update"
echo t_automate_descendents.at:44 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_automate_descendents.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

REV_F=`cat MT/revision`

$at_traceoff
echo "t_automate_descendents.at:47: test \$REV_F != \$REV_D"
echo t_automate_descendents.at:47 >$at_check_line_file
( $at_traceon; test $REV_F != $REV_D ) >$at_stdout 2>$at_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_automate_descendents.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_automate_descendents.at:48: test \$REV_F != \$REV_E"
echo t_automate_descendents.at:48 >$at_check_line_file
( $at_traceon; test $REV_F != $REV_E ) >$at_stdout 2>$at_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_automate_descendents.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


# Now do some checks

$at_traceoff
echo "t_automate_descendents.at:52: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate descendents \$REV_B"
echo t_automate_descendents.at:52 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate descendents $REV_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
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_descendents.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_automate_descendents.at:53: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate descendents \$REV_F"
echo t_automate_descendents.at:53 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate descendents $REV_F ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_descendents.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_automate_descendents.at:55: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate descendents \$REV_D"
echo t_automate_descendents.at:55 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate descendents $REV_D ) >$at_stdout 2>$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_automate_descendents.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_automate_descendents.at:56:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_descendents.at:56 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_descendents.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_automate_descendents.at:57: echo \$REV_F > d_descendents"
echo t_automate_descendents.at:57 >$at_check_line_file
( $at_traceon; echo $REV_F > d_descendents ) >$at_stdout 2>$at_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_automate_descendents.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_automate_descendents.at:58: cmp d_descendents stdout"
echo t_automate_descendents.at:58 >$at_check_line_file
( $at_traceon; cmp d_descendents 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;;
   0) ;;
   *) echo "t_automate_descendents.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_automate_descendents.at:60: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate descendents \$REV_E"
echo t_automate_descendents.at:60 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate descendents $REV_E ) >$at_stdout 2>$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_automate_descendents.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_automate_descendents.at:61:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_descendents.at:61 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_descendents.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_automate_descendents.at:62: echo \$REV_F > e_descendents"
echo t_automate_descendents.at:62 >$at_check_line_file
( $at_traceon; echo $REV_F > e_descendents ) >$at_stdout 2>$at_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_automate_descendents.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_automate_descendents.at:63: cmp e_descendents stdout"
echo t_automate_descendents.at:63 >$at_check_line_file
( $at_traceon; cmp e_descendents 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;;
   0) ;;
   *) echo "t_automate_descendents.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_automate_descendents.at:65: echo \$REV_D > c_descendents"
echo t_automate_descendents.at:65 >$at_check_line_file
( $at_traceon; echo $REV_D > c_descendents ) >$at_stdout 2>$at_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_automate_descendents.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

$at_traceoff
echo "t_automate_descendents.at:66: echo \$REV_E >> c_descendents"
echo t_automate_descendents.at:66 >$at_check_line_file
( $at_traceon; echo $REV_E >> c_descendents ) >$at_stdout 2>$at_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_automate_descendents.at:66: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_descendents.at:67: echo \$REV_F >> c_descendents"
echo t_automate_descendents.at:67 >$at_check_line_file
( $at_traceon; echo $REV_F >> c_descendents ) >$at_stdout 2>$at_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_automate_descendents.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_automate_descendents.at:68: sort c_descendents > cd"
echo t_automate_descendents.at:68 >$at_check_line_file
( $at_traceon; sort c_descendents > cd ) >$at_stdout 2>$at_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_automate_descendents.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_automate_descendents.at:69: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate descendents \$REV_C"
echo t_automate_descendents.at:69 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate descendents $REV_C ) >$at_stdout 2>$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_automate_descendents.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_automate_descendents.at:70:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_descendents.at:70 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_descendents.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_automate_descendents.at:71: cmp cd stdout"
echo t_automate_descendents.at:71 >$at_check_line_file
( $at_traceon; cmp cd 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;;
   0) ;;
   *) echo "t_automate_descendents.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_automate_descendents.at:73: echo \$REV_D > a_descendents"
echo t_automate_descendents.at:73 >$at_check_line_file
( $at_traceon; echo $REV_D > a_descendents ) >$at_stdout 2>$at_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_automate_descendents.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_automate_descendents.at:74: echo \$REV_E >> a_descendents"
echo t_automate_descendents.at:74 >$at_check_line_file
( $at_traceon; echo $REV_E >> a_descendents ) >$at_stdout 2>$at_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_automate_descendents.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_automate_descendents.at:75: echo \$REV_F >> a_descendents"
echo t_automate_descendents.at:75 >$at_check_line_file
( $at_traceon; echo $REV_F >> a_descendents ) >$at_stdout 2>$at_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_automate_descendents.at:75: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_descendents.at:76: echo \$REV_C >> a_descendents"
echo t_automate_descendents.at:76 >$at_check_line_file
( $at_traceon; echo $REV_C >> a_descendents ) >$at_stdout 2>$at_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_automate_descendents.at:76: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_descendents.at:77: echo \$REV_B >> a_descendents"
echo t_automate_descendents.at:77 >$at_check_line_file
( $at_traceon; echo $REV_B >> a_descendents ) >$at_stdout 2>$at_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_automate_descendents.at:77: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_descendents.at:78: sort a_descendents > ad"
echo t_automate_descendents.at:78 >$at_check_line_file
( $at_traceon; sort a_descendents > ad ) >$at_stdout 2>$at_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_automate_descendents.at:78: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_descendents.at:79: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate descendents \$REV_A"
echo t_automate_descendents.at:79 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate descendents $REV_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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_descendents.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_automate_descendents.at:80:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_descendents.at:80 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_descendents.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_automate_descendents.at:81: cmp ad stdout"
echo t_automate_descendents.at:81 >$at_check_line_file
( $at_traceon; cmp ad 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;;
   0) ;;
   *) echo "t_automate_descendents.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


$at_traceoff
echo "t_automate_descendents.at:83: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate descendents \$REV_D \$REV_F"
echo t_automate_descendents.at:83 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate descendents $REV_D $REV_F ) >$at_stdout 2>$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_automate_descendents.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

$at_traceoff
echo "t_automate_descendents.at:84:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_descendents.at:84 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_descendents.at:84: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_descendents.at:85: echo \$REV_F > d_f_descendents"
echo t_automate_descendents.at:85 >$at_check_line_file
( $at_traceon; echo $REV_F > d_f_descendents ) >$at_stdout 2>$at_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_automate_descendents.at:85: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_descendents.at:86: cmp d_f_descendents stdout"
echo t_automate_descendents.at:86 >$at_check_line_file
( $at_traceon; cmp d_f_descendents 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;;
   0) ;;
   *) echo "t_automate_descendents.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_automate_descendents.at:88: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate descendents \$REV_D \$REV_E \$REV_F"
echo t_automate_descendents.at:88 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate descendents $REV_D $REV_E $REV_F ) >$at_stdout 2>$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_automate_descendents.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_automate_descendents.at:89:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_descendents.at:89 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_descendents.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_automate_descendents.at:90: echo \$REV_F > d_e_f_descendents"
echo t_automate_descendents.at:90 >$at_check_line_file
( $at_traceon; echo $REV_F > d_e_f_descendents ) >$at_stdout 2>$at_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_automate_descendents.at:90: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_descendents.at:91: cmp d_e_f_descendents stdout"
echo t_automate_descendents.at:91 >$at_check_line_file
( $at_traceon; cmp d_e_f_descendents 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;;
   0) ;;
   *) echo "t_automate_descendents.at:91: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_automate_descendents.at:93: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate descendents \$REV_B \$REV_D \$REV_E \$REV_F"
echo t_automate_descendents.at:93 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate descendents $REV_B $REV_D $REV_E $REV_F ) >$at_stdout 2>$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_automate_descendents.at:93: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_descendents.at:94:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_descendents.at:94 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_descendents.at:94: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_descendents.at:95: echo \$REV_F > b_d_e_f_descendents"
echo t_automate_descendents.at:95 >$at_check_line_file
( $at_traceon; echo $REV_F > b_d_e_f_descendents ) >$at_stdout 2>$at_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_automate_descendents.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_automate_descendents.at:96: cmp b_d_e_f_descendents stdout"
echo t_automate_descendents.at:96 >$at_check_line_file
( $at_traceon; cmp b_d_e_f_descendents 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;;
   0) ;;
   *) echo "t_automate_descendents.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  159 ) # 159. t_automate_erase_ancestors.at:1: automate erase_ancestors
    at_setup_line='t_automate_erase_ancestors.at:1'
    at_desc='automate erase_ancestors'
    $at_quiet $ECHO_N "159: automate erase_ancestors                     $ECHO_C"
    at_xfail=no
    (
      echo "159. t_automate_erase_ancestors.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_automate_erase_ancestors.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_automate_erase_ancestors.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_automate_erase_ancestors.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_erase_ancestors.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_automate_erase_ancestors.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_automate_erase_ancestors.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_erase_ancestors.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_automate_erase_ancestors.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_automate_erase_ancestors.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_erase_ancestors.at:2: rm test_keys"
echo t_automate_erase_ancestors.at:2 >$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_automate_erase_ancestors.at:2: 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
#  / \
# B   C
#     |\
#     D E
#     \/
#      F


cat >testfile <<'_ATEOF'
A
_ATEOF

$at_traceoff
echo "t_automate_erase_ancestors.at:13: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_automate_erase_ancestors.at:13 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_automate_erase_ancestors.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_automate_erase_ancestors.at:14: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_automate_erase_ancestors.at:14 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_automate_erase_ancestors.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


REV_A=`cat MT/revision`


cat >testfile <<'_ATEOF'
B
_ATEOF



$at_traceoff
echo "t_automate_erase_ancestors.at:19: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_automate_erase_ancestors.at:19 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_automate_erase_ancestors.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


REV_B=`cat MT/revision`


$at_traceoff
echo "t_automate_erase_ancestors.at:22: rm -rf MT.old"
echo t_automate_erase_ancestors.at:22 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_automate_erase_ancestors.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_automate_erase_ancestors.at:22: mv  MT MT.old"
echo t_automate_erase_ancestors.at:22 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_automate_erase_ancestors.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_automate_erase_ancestors.at:22: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$REV_A ."
echo t_automate_erase_ancestors.at:22 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $REV_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_automate_erase_ancestors.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_automate_erase_ancestors.at:22: mv MT.old/options MT"
echo t_automate_erase_ancestors.at:22 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_automate_erase_ancestors.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_automate_erase_ancestors.at:22: test \$PROBE_R_SHA = \$REV_A"
echo t_automate_erase_ancestors.at:22 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $REV_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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_erase_ancestors.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




cat >testfile <<'_ATEOF'
C
_ATEOF



$at_traceoff
echo "t_automate_erase_ancestors.at:26: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_automate_erase_ancestors.at:26 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_automate_erase_ancestors.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


REV_C=`cat MT/revision`


cat >testfile <<'_ATEOF'
D
_ATEOF



$at_traceoff
echo "t_automate_erase_ancestors.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_automate_erase_ancestors.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_automate_erase_ancestors.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


REV_D=`cat MT/revision`


$at_traceoff
echo "t_automate_erase_ancestors.at:34: rm -rf MT.old"
echo t_automate_erase_ancestors.at:34 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_automate_erase_ancestors.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_automate_erase_ancestors.at:34: mv  MT MT.old"
echo t_automate_erase_ancestors.at:34 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_automate_erase_ancestors.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_automate_erase_ancestors.at:34: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$REV_C ."
echo t_automate_erase_ancestors.at:34 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $REV_C . ) >$at_stdout 2>$at_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_automate_erase_ancestors.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_automate_erase_ancestors.at:34: mv MT.old/options MT"
echo t_automate_erase_ancestors.at:34 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_automate_erase_ancestors.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_automate_erase_ancestors.at:34: test \$PROBE_R_SHA = \$REV_C"
echo t_automate_erase_ancestors.at:34 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $REV_C ) >$at_stdout 2>$at_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_automate_erase_ancestors.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




cat >otherfile <<'_ATEOF'
E
_ATEOF

$at_traceoff
echo "t_automate_erase_ancestors.at:37: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add otherfile"
echo t_automate_erase_ancestors.at:37 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add otherfile ) >$at_stdout 2>$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_automate_erase_ancestors.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_automate_erase_ancestors.at:38: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_automate_erase_ancestors.at:38 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_automate_erase_ancestors.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


REV_E=`cat MT/revision`

$at_traceoff
echo "t_automate_erase_ancestors.at:41: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR explicit_merge \$REV_D \$REV_E testbranch"
echo t_automate_erase_ancestors.at:41 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR explicit_merge $REV_D $REV_E 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_automate_erase_ancestors.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_automate_erase_ancestors.at:42: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update"
echo t_automate_erase_ancestors.at:42 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_automate_erase_ancestors.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

REV_F=`cat MT/revision`

$at_traceoff
echo "t_automate_erase_ancestors.at:45: test \$REV_F != \$REV_D"
echo t_automate_erase_ancestors.at:45 >$at_check_line_file
( $at_traceon; test $REV_F != $REV_D ) >$at_stdout 2>$at_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_automate_erase_ancestors.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_automate_erase_ancestors.at:46: test \$REV_F != \$REV_E"
echo t_automate_erase_ancestors.at:46 >$at_check_line_file
( $at_traceon; test $REV_F != $REV_E ) >$at_stdout 2>$at_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_automate_erase_ancestors.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 do some checks

$at_traceoff
echo "t_automate_erase_ancestors.at:50: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate erase_ancestors c7539264e83c5d6af4c792f079b5d46e9c128665"
echo t_automate_erase_ancestors.at:50 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate erase_ancestors c7539264e83c5d6af4c792f079b5d46e9c128665 ) >$at_stdout 2>$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_automate_erase_ancestors.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
echo "t_automate_erase_ancestors.at:52: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate erase_ancestors"
echo t_automate_erase_ancestors.at:52 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate erase_ancestors ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_erase_ancestors.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_automate_erase_ancestors.at:54: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate erase_ancestors \$REV_A"
echo t_automate_erase_ancestors.at:54 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate erase_ancestors $REV_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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_erase_ancestors.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_automate_erase_ancestors.at:55:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_erase_ancestors.at:55 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_erase_ancestors.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_automate_erase_ancestors.at:56: cat stdout"
echo t_automate_erase_ancestors.at:56 >$at_check_line_file
( $at_traceon; cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_erase_ancestors.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_automate_erase_ancestors.at:56: mv stdout expout"
echo t_automate_erase_ancestors.at:56 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_erase_ancestors.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_automate_erase_ancestors.at:56: echo \$REV_A"
echo t_automate_erase_ancestors.at:56 >$at_check_line_file
( $at_traceon; echo $REV_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
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_erase_ancestors.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_automate_erase_ancestors.at:57: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate erase_ancestors \$REV_B"
echo t_automate_erase_ancestors.at:57 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate erase_ancestors $REV_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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_erase_ancestors.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_automate_erase_ancestors.at:58:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_erase_ancestors.at:58 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_erase_ancestors.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_automate_erase_ancestors.at:59: cat stdout"
echo t_automate_erase_ancestors.at:59 >$at_check_line_file
( $at_traceon; cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_erase_ancestors.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_automate_erase_ancestors.at:59: mv stdout expout"
echo t_automate_erase_ancestors.at:59 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_erase_ancestors.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_automate_erase_ancestors.at:59: echo \$REV_B"
echo t_automate_erase_ancestors.at:59 >$at_check_line_file
( $at_traceon; echo $REV_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
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_erase_ancestors.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_automate_erase_ancestors.at:60: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate erase_ancestors \$REV_C"
echo t_automate_erase_ancestors.at:60 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate erase_ancestors $REV_C ) >$at_stdout 2>$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_automate_erase_ancestors.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_automate_erase_ancestors.at:61:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_erase_ancestors.at:61 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_erase_ancestors.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_automate_erase_ancestors.at:62: cat stdout"
echo t_automate_erase_ancestors.at:62 >$at_check_line_file
( $at_traceon; cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_erase_ancestors.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_automate_erase_ancestors.at:62: mv stdout expout"
echo t_automate_erase_ancestors.at:62 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_erase_ancestors.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_automate_erase_ancestors.at:62: echo \$REV_C"
echo t_automate_erase_ancestors.at:62 >$at_check_line_file
( $at_traceon; echo $REV_C ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_erase_ancestors.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_automate_erase_ancestors.at:63: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate erase_ancestors \$REV_D"
echo t_automate_erase_ancestors.at:63 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate erase_ancestors $REV_D ) >$at_stdout 2>$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_automate_erase_ancestors.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_automate_erase_ancestors.at:64:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_erase_ancestors.at:64 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_erase_ancestors.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
echo "t_automate_erase_ancestors.at:65: cat stdout"
echo t_automate_erase_ancestors.at:65 >$at_check_line_file
( $at_traceon; cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_erase_ancestors.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

$at_traceoff
echo "t_automate_erase_ancestors.at:65: mv stdout expout"
echo t_automate_erase_ancestors.at:65 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_erase_ancestors.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

$at_traceoff
echo "t_automate_erase_ancestors.at:65: echo \$REV_D"
echo t_automate_erase_ancestors.at:65 >$at_check_line_file
( $at_traceon; echo $REV_D ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_erase_ancestors.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


$at_traceoff
echo "t_automate_erase_ancestors.at:66: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate erase_ancestors \$REV_E"
echo t_automate_erase_ancestors.at:66 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate erase_ancestors $REV_E ) >$at_stdout 2>$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_automate_erase_ancestors.at:66: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_erase_ancestors.at:67:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_erase_ancestors.at:67 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_erase_ancestors.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_automate_erase_ancestors.at:68: cat stdout"
echo t_automate_erase_ancestors.at:68 >$at_check_line_file
( $at_traceon; cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_erase_ancestors.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_automate_erase_ancestors.at:68: mv stdout expout"
echo t_automate_erase_ancestors.at:68 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_erase_ancestors.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_automate_erase_ancestors.at:68: echo \$REV_E"
echo t_automate_erase_ancestors.at:68 >$at_check_line_file
( $at_traceon; echo $REV_E ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_erase_ancestors.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_automate_erase_ancestors.at:69: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate erase_ancestors \$REV_F"
echo t_automate_erase_ancestors.at:69 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate erase_ancestors $REV_F ) >$at_stdout 2>$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_automate_erase_ancestors.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_automate_erase_ancestors.at:70:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_erase_ancestors.at:70 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_erase_ancestors.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_automate_erase_ancestors.at:71: cat stdout"
echo t_automate_erase_ancestors.at:71 >$at_check_line_file
( $at_traceon; cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_erase_ancestors.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_automate_erase_ancestors.at:71: mv stdout expout"
echo t_automate_erase_ancestors.at:71 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_erase_ancestors.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_automate_erase_ancestors.at:71: echo \$REV_F"
echo t_automate_erase_ancestors.at:71 >$at_check_line_file
( $at_traceon; echo $REV_F ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_erase_ancestors.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_automate_erase_ancestors.at:74: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate erase_ancestors \$REV_A \$REV_B"
echo t_automate_erase_ancestors.at:74 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate erase_ancestors $REV_A $REV_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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_erase_ancestors.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_automate_erase_ancestors.at:75:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_erase_ancestors.at:75 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_erase_ancestors.at:75: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_automate_erase_ancestors.at:76: cat stdout"
echo t_automate_erase_ancestors.at:76 >$at_check_line_file
( $at_traceon; cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_erase_ancestors.at:76: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_erase_ancestors.at:76: mv stdout expout"
echo t_automate_erase_ancestors.at:76 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_erase_ancestors.at:76: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_erase_ancestors.at:76: echo \$REV_B"
echo t_automate_erase_ancestors.at:76 >$at_check_line_file
( $at_traceon; echo $REV_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
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_erase_ancestors.at:76: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_automate_erase_ancestors.at:77: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate erase_ancestors \$REV_A \$REV_C"
echo t_automate_erase_ancestors.at:77 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate erase_ancestors $REV_A $REV_C ) >$at_stdout 2>$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_automate_erase_ancestors.at:77: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_erase_ancestors.at:78:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_erase_ancestors.at:78 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_erase_ancestors.at:78: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_automate_erase_ancestors.at:79: cat stdout"
echo t_automate_erase_ancestors.at:79 >$at_check_line_file
( $at_traceon; cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_erase_ancestors.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_automate_erase_ancestors.at:79: mv stdout expout"
echo t_automate_erase_ancestors.at:79 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_erase_ancestors.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_automate_erase_ancestors.at:79: echo \$REV_C"
echo t_automate_erase_ancestors.at:79 >$at_check_line_file
( $at_traceon; echo $REV_C ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_erase_ancestors.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_automate_erase_ancestors.at:80: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate erase_ancestors \$REV_A \$REV_F"
echo t_automate_erase_ancestors.at:80 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate erase_ancestors $REV_A $REV_F ) >$at_stdout 2>$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_automate_erase_ancestors.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_automate_erase_ancestors.at:81:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_erase_ancestors.at:81 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_erase_ancestors.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


$at_traceoff
echo "t_automate_erase_ancestors.at:82: cat stdout"
echo t_automate_erase_ancestors.at:82 >$at_check_line_file
( $at_traceon; cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_erase_ancestors.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_automate_erase_ancestors.at:82: mv stdout expout"
echo t_automate_erase_ancestors.at:82 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_erase_ancestors.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_automate_erase_ancestors.at:82: echo \$REV_F"
echo t_automate_erase_ancestors.at:82 >$at_check_line_file
( $at_traceon; echo $REV_F ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_erase_ancestors.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_automate_erase_ancestors.at:84: echo \$REV_B > b_c"
echo t_automate_erase_ancestors.at:84 >$at_check_line_file
( $at_traceon; echo $REV_B > b_c ) >$at_stdout 2>$at_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_automate_erase_ancestors.at:84: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_erase_ancestors.at:85: echo \$REV_C >> b_c"
echo t_automate_erase_ancestors.at:85 >$at_check_line_file
( $at_traceon; echo $REV_C >> b_c ) >$at_stdout 2>$at_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_automate_erase_ancestors.at:85: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_erase_ancestors.at:86: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate erase_ancestors \$REV_B \$REV_C"
echo t_automate_erase_ancestors.at:86 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate erase_ancestors $REV_B $REV_C ) >$at_stdout 2>$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_automate_erase_ancestors.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_automate_erase_ancestors.at:87:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_erase_ancestors.at:87 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_erase_ancestors.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_automate_erase_ancestors.at:88: cat stdout"
echo t_automate_erase_ancestors.at:88 >$at_check_line_file
( $at_traceon; cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_erase_ancestors.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_automate_erase_ancestors.at:88: mv stdout expout"
echo t_automate_erase_ancestors.at:88 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_erase_ancestors.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_automate_erase_ancestors.at:88: sort < b_c"
echo t_automate_erase_ancestors.at:88 >$at_check_line_file
( $at_traceon; sort < b_c ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_erase_ancestors.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_automate_erase_ancestors.at:90: echo \$REV_B > a_b_c"
echo t_automate_erase_ancestors.at:90 >$at_check_line_file
( $at_traceon; echo $REV_B > a_b_c ) >$at_stdout 2>$at_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_automate_erase_ancestors.at:90: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_erase_ancestors.at:91: echo \$REV_C >> a_b_c"
echo t_automate_erase_ancestors.at:91 >$at_check_line_file
( $at_traceon; echo $REV_C >> a_b_c ) >$at_stdout 2>$at_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_automate_erase_ancestors.at:91: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_erase_ancestors.at:92: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate erase_ancestors \$REV_A \$REV_B \$REV_C"
echo t_automate_erase_ancestors.at:92 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate erase_ancestors $REV_A $REV_B $REV_C ) >$at_stdout 2>$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_automate_erase_ancestors.at:92: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_erase_ancestors.at:93:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_erase_ancestors.at:93 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_erase_ancestors.at:93: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_automate_erase_ancestors.at:94: cat stdout"
echo t_automate_erase_ancestors.at:94 >$at_check_line_file
( $at_traceon; cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_erase_ancestors.at:94: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_erase_ancestors.at:94: mv stdout expout"
echo t_automate_erase_ancestors.at:94 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_erase_ancestors.at:94: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_erase_ancestors.at:94: sort < a_b_c"
echo t_automate_erase_ancestors.at:94 >$at_check_line_file
( $at_traceon; sort < a_b_c ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_erase_ancestors.at:94: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_automate_erase_ancestors.at:96: echo \$REV_B > b_f"
echo t_automate_erase_ancestors.at:96 >$at_check_line_file
( $at_traceon; echo $REV_B > b_f ) >$at_stdout 2>$at_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_automate_erase_ancestors.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_automate_erase_ancestors.at:97: echo \$REV_F >> b_f"
echo t_automate_erase_ancestors.at:97 >$at_check_line_file
( $at_traceon; echo $REV_F >> b_f ) >$at_stdout 2>$at_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_automate_erase_ancestors.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_automate_erase_ancestors.at:98: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate erase_ancestors \$REV_B \$REV_F"
echo t_automate_erase_ancestors.at:98 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate erase_ancestors $REV_B $REV_F ) >$at_stdout 2>$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_automate_erase_ancestors.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_automate_erase_ancestors.at:99:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_erase_ancestors.at:99 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_erase_ancestors.at:99: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_automate_erase_ancestors.at:100: cat stdout"
echo t_automate_erase_ancestors.at:100 >$at_check_line_file
( $at_traceon; cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_erase_ancestors.at:100: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_erase_ancestors.at:100: mv stdout expout"
echo t_automate_erase_ancestors.at:100 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_erase_ancestors.at:100: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_erase_ancestors.at:100: sort < b_f"
echo t_automate_erase_ancestors.at:100 >$at_check_line_file
( $at_traceon; sort < b_f ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_erase_ancestors.at:100: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_automate_erase_ancestors.at:102: echo \$REV_B > a_b_f"
echo t_automate_erase_ancestors.at:102 >$at_check_line_file
( $at_traceon; echo $REV_B > a_b_f ) >$at_stdout 2>$at_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_automate_erase_ancestors.at:102: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_erase_ancestors.at:103: echo \$REV_F >> a_b_f"
echo t_automate_erase_ancestors.at:103 >$at_check_line_file
( $at_traceon; echo $REV_F >> a_b_f ) >$at_stdout 2>$at_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_automate_erase_ancestors.at:103: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_erase_ancestors.at:104: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate erase_ancestors \$REV_A \$REV_B \$REV_F"
echo t_automate_erase_ancestors.at:104 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate erase_ancestors $REV_A $REV_B $REV_F ) >$at_stdout 2>$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_automate_erase_ancestors.at:104: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_erase_ancestors.at:105:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_erase_ancestors.at:105 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_erase_ancestors.at:105: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_automate_erase_ancestors.at:106: cat stdout"
echo t_automate_erase_ancestors.at:106 >$at_check_line_file
( $at_traceon; cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_erase_ancestors.at:106: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_erase_ancestors.at:106: mv stdout expout"
echo t_automate_erase_ancestors.at:106 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_erase_ancestors.at:106: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_erase_ancestors.at:106: sort < a_b_f"
echo t_automate_erase_ancestors.at:106 >$at_check_line_file
( $at_traceon; sort < a_b_f ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_erase_ancestors.at:106: exit code 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`
    ;;

  160 ) # 160. t_automate_toposort.at:1: automate toposort
    at_setup_line='t_automate_toposort.at:1'
    at_desc='automate toposort'
    $at_quiet $ECHO_N "160: automate toposort                            $ECHO_C"
    at_xfail=no
    (
      echo "160. t_automate_toposort.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_automate_toposort.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_automate_toposort.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_automate_toposort.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_toposort.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_automate_toposort.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_automate_toposort.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_toposort.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_automate_toposort.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_automate_toposort.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_toposort.at:2: rm test_keys"
echo t_automate_toposort.at:2 >$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_automate_toposort.at:2: 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
#  / \
# B   C
#     |\
#     D E
#     \/
#      F


cat >testfile <<'_ATEOF'
A
_ATEOF

$at_traceoff
echo "t_automate_toposort.at:13: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_automate_toposort.at:13 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_automate_toposort.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_automate_toposort.at:14: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_automate_toposort.at:14 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_automate_toposort.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


REV_A=`cat MT/revision`


cat >testfile <<'_ATEOF'
B
_ATEOF



$at_traceoff
echo "t_automate_toposort.at:19: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_automate_toposort.at:19 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_automate_toposort.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


REV_B=`cat MT/revision`


$at_traceoff
echo "t_automate_toposort.at:22: rm -rf MT.old"
echo t_automate_toposort.at:22 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_automate_toposort.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_automate_toposort.at:22: mv  MT MT.old"
echo t_automate_toposort.at:22 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_automate_toposort.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_automate_toposort.at:22: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$REV_A ."
echo t_automate_toposort.at:22 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $REV_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_automate_toposort.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_automate_toposort.at:22: mv MT.old/options MT"
echo t_automate_toposort.at:22 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_automate_toposort.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_automate_toposort.at:22: test \$PROBE_R_SHA = \$REV_A"
echo t_automate_toposort.at:22 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $REV_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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_toposort.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




cat >testfile <<'_ATEOF'
C
_ATEOF



$at_traceoff
echo "t_automate_toposort.at:26: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_automate_toposort.at:26 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_automate_toposort.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


REV_C=`cat MT/revision`


cat >testfile <<'_ATEOF'
D
_ATEOF



$at_traceoff
echo "t_automate_toposort.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_automate_toposort.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_automate_toposort.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


REV_D=`cat MT/revision`


$at_traceoff
echo "t_automate_toposort.at:34: rm -rf MT.old"
echo t_automate_toposort.at:34 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_automate_toposort.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_automate_toposort.at:34: mv  MT MT.old"
echo t_automate_toposort.at:34 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_automate_toposort.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_automate_toposort.at:34: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$REV_C ."
echo t_automate_toposort.at:34 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $REV_C . ) >$at_stdout 2>$at_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_automate_toposort.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_automate_toposort.at:34: mv MT.old/options MT"
echo t_automate_toposort.at:34 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_automate_toposort.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_automate_toposort.at:34: test \$PROBE_R_SHA = \$REV_C"
echo t_automate_toposort.at:34 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $REV_C ) >$at_stdout 2>$at_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_automate_toposort.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




cat >otherfile <<'_ATEOF'
E
_ATEOF

$at_traceoff
echo "t_automate_toposort.at:37: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add otherfile"
echo t_automate_toposort.at:37 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add otherfile ) >$at_stdout 2>$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_automate_toposort.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_automate_toposort.at:38: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_automate_toposort.at:38 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_automate_toposort.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


REV_E=`cat MT/revision`

$at_traceoff
echo "t_automate_toposort.at:41: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR explicit_merge \$REV_D \$REV_E testbranch"
echo t_automate_toposort.at:41 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR explicit_merge $REV_D $REV_E 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_automate_toposort.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_automate_toposort.at:42: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update"
echo t_automate_toposort.at:42 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_automate_toposort.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

REV_F=`cat MT/revision`

$at_traceoff
echo "t_automate_toposort.at:45: test \$REV_F != \$REV_D"
echo t_automate_toposort.at:45 >$at_check_line_file
( $at_traceon; test $REV_F != $REV_D ) >$at_stdout 2>$at_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_automate_toposort.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_automate_toposort.at:46: test \$REV_F != \$REV_E"
echo t_automate_toposort.at:46 >$at_check_line_file
( $at_traceon; test $REV_F != $REV_E ) >$at_stdout 2>$at_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_automate_toposort.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 do some checks

$at_traceoff
echo "t_automate_toposort.at:50: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate toposort c7539264e83c5d6af4c792f079b5d46e9c128665"
echo t_automate_toposort.at:50 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate toposort c7539264e83c5d6af4c792f079b5d46e9c128665 ) >$at_stdout 2>$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_automate_toposort.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
echo "t_automate_toposort.at:52: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate toposort \"\""
echo t_automate_toposort.at:52 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate toposort "" ) >$at_stdout 2>$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_automate_toposort.at:52: 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_automate_toposort.at:54: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate toposort"
echo t_automate_toposort.at:54 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate toposort ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_toposort.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_automate_toposort.at:56: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate toposort \$REV_A"
echo t_automate_toposort.at:56 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate toposort $REV_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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_toposort.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_automate_toposort.at:57:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_toposort.at:57 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_toposort.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_automate_toposort.at:58: cat stdout"
echo t_automate_toposort.at:58 >$at_check_line_file
( $at_traceon; cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_toposort.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_automate_toposort.at:58: mv stdout expout"
echo t_automate_toposort.at:58 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_toposort.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_automate_toposort.at:58: echo \$REV_A"
echo t_automate_toposort.at:58 >$at_check_line_file
( $at_traceon; echo $REV_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
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_toposort.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_automate_toposort.at:59: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate toposort \$REV_B"
echo t_automate_toposort.at:59 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate toposort $REV_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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_toposort.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_automate_toposort.at:60:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_toposort.at:60 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_toposort.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_automate_toposort.at:61: cat stdout"
echo t_automate_toposort.at:61 >$at_check_line_file
( $at_traceon; cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_toposort.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_automate_toposort.at:61: mv stdout expout"
echo t_automate_toposort.at:61 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_toposort.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_automate_toposort.at:61: echo \$REV_B"
echo t_automate_toposort.at:61 >$at_check_line_file
( $at_traceon; echo $REV_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
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_toposort.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_automate_toposort.at:62: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate toposort \$REV_C"
echo t_automate_toposort.at:62 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate toposort $REV_C ) >$at_stdout 2>$at_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_automate_toposort.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_automate_toposort.at:63:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_toposort.at:63 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_toposort.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_automate_toposort.at:64: cat stdout"
echo t_automate_toposort.at:64 >$at_check_line_file
( $at_traceon; cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_toposort.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
echo "t_automate_toposort.at:64: mv stdout expout"
echo t_automate_toposort.at:64 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_toposort.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
echo "t_automate_toposort.at:64: echo \$REV_C"
echo t_automate_toposort.at:64 >$at_check_line_file
( $at_traceon; echo $REV_C ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_toposort.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
echo "t_automate_toposort.at:65: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate toposort \$REV_D"
echo t_automate_toposort.at:65 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate toposort $REV_D ) >$at_stdout 2>$at_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_automate_toposort.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

$at_traceoff
echo "t_automate_toposort.at:66:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_toposort.at:66 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_toposort.at:66: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_automate_toposort.at:67: cat stdout"
echo t_automate_toposort.at:67 >$at_check_line_file
( $at_traceon; cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_toposort.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_automate_toposort.at:67: mv stdout expout"
echo t_automate_toposort.at:67 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_toposort.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_automate_toposort.at:67: echo \$REV_D"
echo t_automate_toposort.at:67 >$at_check_line_file
( $at_traceon; echo $REV_D ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_toposort.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_automate_toposort.at:68: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate toposort \$REV_E"
echo t_automate_toposort.at:68 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate toposort $REV_E ) >$at_stdout 2>$at_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_automate_toposort.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_automate_toposort.at:69:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_toposort.at:69 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_toposort.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_automate_toposort.at:70: cat stdout"
echo t_automate_toposort.at:70 >$at_check_line_file
( $at_traceon; cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_toposort.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_automate_toposort.at:70: mv stdout expout"
echo t_automate_toposort.at:70 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_toposort.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_automate_toposort.at:70: echo \$REV_E"
echo t_automate_toposort.at:70 >$at_check_line_file
( $at_traceon; echo $REV_E ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_toposort.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_automate_toposort.at:71: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate toposort \$REV_F"
echo t_automate_toposort.at:71 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate toposort $REV_F ) >$at_stdout 2>$at_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_automate_toposort.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_automate_toposort.at:72:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_toposort.at:72 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_toposort.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_automate_toposort.at:73: cat stdout"
echo t_automate_toposort.at:73 >$at_check_line_file
( $at_traceon; cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_toposort.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_automate_toposort.at:73: mv stdout expout"
echo t_automate_toposort.at:73 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_toposort.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_automate_toposort.at:73: echo \$REV_F"
echo t_automate_toposort.at:73 >$at_check_line_file
( $at_traceon; echo $REV_F ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_toposort.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_automate_toposort.at:75: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate toposort \$REV_A \$REV_A"
echo t_automate_toposort.at:75 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate toposort $REV_A $REV_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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_toposort.at:75: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_toposort.at:76:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_toposort.at:76 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_toposort.at:76: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_automate_toposort.at:77: cat stdout"
echo t_automate_toposort.at:77 >$at_check_line_file
( $at_traceon; cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_toposort.at:77: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_toposort.at:77: mv stdout expout"
echo t_automate_toposort.at:77 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_toposort.at:77: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_toposort.at:77: echo \$REV_A"
echo t_automate_toposort.at:77 >$at_check_line_file
( $at_traceon; echo $REV_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
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_toposort.at:77: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_automate_toposort.at:79: echo \$REV_A > ab"
echo t_automate_toposort.at:79 >$at_check_line_file
( $at_traceon; echo $REV_A > ab ) >$at_stdout 2>$at_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_automate_toposort.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_automate_toposort.at:80: echo \$REV_B >> ab"
echo t_automate_toposort.at:80 >$at_check_line_file
( $at_traceon; echo $REV_B >> ab ) >$at_stdout 2>$at_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_automate_toposort.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_automate_toposort.at:81: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate toposort \$REV_A \$REV_B"
echo t_automate_toposort.at:81 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate toposort $REV_A $REV_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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_toposort.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

$at_traceoff
echo "t_automate_toposort.at:82:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_toposort.at:82 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_toposort.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_automate_toposort.at:83: cat stdout"
echo t_automate_toposort.at:83 >$at_check_line_file
( $at_traceon; cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_toposort.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

$at_traceoff
echo "t_automate_toposort.at:83: mv stdout expout"
echo t_automate_toposort.at:83 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_toposort.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

$at_traceoff
echo "t_automate_toposort.at:83: cat ab"
echo t_automate_toposort.at:83 >$at_check_line_file
( $at_traceon; cat ab ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_toposort.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


$at_traceoff
echo "t_automate_toposort.at:84: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate toposort \$REV_B \$REV_A"
echo t_automate_toposort.at:84 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate toposort $REV_B $REV_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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_toposort.at:84: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_toposort.at:85:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_toposort.at:85 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_toposort.at:85: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_automate_toposort.at:86: cat stdout"
echo t_automate_toposort.at:86 >$at_check_line_file
( $at_traceon; cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_toposort.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_automate_toposort.at:86: mv stdout expout"
echo t_automate_toposort.at:86 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_toposort.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_automate_toposort.at:86: cat ab"
echo t_automate_toposort.at:86 >$at_check_line_file
( $at_traceon; cat ab ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_toposort.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_automate_toposort.at:88: echo \$REV_A > af"
echo t_automate_toposort.at:88 >$at_check_line_file
( $at_traceon; echo $REV_A > af ) >$at_stdout 2>$at_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_automate_toposort.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_automate_toposort.at:89: echo \$REV_F >> af"
echo t_automate_toposort.at:89 >$at_check_line_file
( $at_traceon; echo $REV_F >> af ) >$at_stdout 2>$at_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_automate_toposort.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_automate_toposort.at:90: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate toposort \$REV_A \$REV_F"
echo t_automate_toposort.at:90 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate toposort $REV_A $REV_F ) >$at_stdout 2>$at_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_automate_toposort.at:90: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_toposort.at:91:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_toposort.at:91 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_toposort.at:91: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_automate_toposort.at:92: cat stdout"
echo t_automate_toposort.at:92 >$at_check_line_file
( $at_traceon; cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_toposort.at:92: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_toposort.at:92: mv stdout expout"
echo t_automate_toposort.at:92 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_toposort.at:92: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

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

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_automate_toposort.at:93: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate toposort \$REV_F \$REV_A"
echo t_automate_toposort.at:93 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate toposort $REV_F $REV_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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_toposort.at:93: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_toposort.at:94:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_toposort.at:94 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_toposort.at:94: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_automate_toposort.at:95: cat stdout"
echo t_automate_toposort.at:95 >$at_check_line_file
( $at_traceon; cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_toposort.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_automate_toposort.at:95: mv stdout expout"
echo t_automate_toposort.at:95 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_toposort.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_automate_toposort.at:95: cat af"
echo t_automate_toposort.at:95 >$at_check_line_file
( $at_traceon; cat af ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_toposort.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_automate_toposort.at:97: echo \$REV_A > acef"
echo t_automate_toposort.at:97 >$at_check_line_file
( $at_traceon; echo $REV_A > acef ) >$at_stdout 2>$at_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_automate_toposort.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_automate_toposort.at:98: echo \$REV_C >> acef"
echo t_automate_toposort.at:98 >$at_check_line_file
( $at_traceon; echo $REV_C >> acef ) >$at_stdout 2>$at_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_automate_toposort.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_automate_toposort.at:99: echo \$REV_E >> acef"
echo t_automate_toposort.at:99 >$at_check_line_file
( $at_traceon; echo $REV_E >> acef ) >$at_stdout 2>$at_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_automate_toposort.at:99: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_toposort.at:100: echo \$REV_F >> acef"
echo t_automate_toposort.at:100 >$at_check_line_file
( $at_traceon; echo $REV_F >> acef ) >$at_stdout 2>$at_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_automate_toposort.at:100: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_toposort.at:101: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate toposort \$REV_A \$REV_C \$REV_E \$REV_F"
echo t_automate_toposort.at:101 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate toposort $REV_A $REV_C $REV_E $REV_F ) >$at_stdout 2>$at_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_automate_toposort.at:101: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_toposort.at:102:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_toposort.at:102 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_toposort.at:102: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_automate_toposort.at:103: cat stdout"
echo t_automate_toposort.at:103 >$at_check_line_file
( $at_traceon; cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_toposort.at:103: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_toposort.at:103: mv stdout expout"
echo t_automate_toposort.at:103 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_toposort.at:103: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

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

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_automate_toposort.at:104: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate toposort \$REV_C \$REV_A \$REV_E \$REV_F"
echo t_automate_toposort.at:104 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate toposort $REV_C $REV_A $REV_E $REV_F ) >$at_stdout 2>$at_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_automate_toposort.at:104: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_toposort.at:105:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_toposort.at:105 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_toposort.at:105: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_automate_toposort.at:106: cat stdout"
echo t_automate_toposort.at:106 >$at_check_line_file
( $at_traceon; cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_toposort.at:106: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_toposort.at:106: mv stdout expout"
echo t_automate_toposort.at:106 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_toposort.at:106: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

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

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_automate_toposort.at:107: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate toposort \$REV_F \$REV_C \$REV_A \$REV_E"
echo t_automate_toposort.at:107 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate toposort $REV_F $REV_C $REV_A $REV_E ) >$at_stdout 2>$at_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_automate_toposort.at:107: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_toposort.at:108:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_toposort.at:108 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_toposort.at:108: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_automate_toposort.at:109: cat stdout"
echo t_automate_toposort.at:109 >$at_check_line_file
( $at_traceon; cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_toposort.at:109: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_toposort.at:109: mv stdout expout"
echo t_automate_toposort.at:109 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_toposort.at:109: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

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

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_automate_toposort.at:110: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate toposort \$REV_F \$REV_E \$REV_C \$REV_A"
echo t_automate_toposort.at:110 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate toposort $REV_F $REV_E $REV_C $REV_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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_toposort.at:110: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_toposort.at:111:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_toposort.at:111 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_toposort.at:111: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_automate_toposort.at:112: cat stdout"
echo t_automate_toposort.at:112 >$at_check_line_file
( $at_traceon; cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_toposort.at:112: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_toposort.at:112: mv stdout expout"
echo t_automate_toposort.at:112 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_toposort.at:112: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

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

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_automate_toposort.at:114: echo \$REV_C > cdef"
echo t_automate_toposort.at:114 >$at_check_line_file
( $at_traceon; echo $REV_C > cdef ) >$at_stdout 2>$at_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_automate_toposort.at:114: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_toposort.at:115: echo \$REV_D >> cdef"
echo t_automate_toposort.at:115 >$at_check_line_file
( $at_traceon; echo $REV_D >> cdef ) >$at_stdout 2>$at_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_automate_toposort.at:115: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_toposort.at:116: echo \$REV_E >> cdef"
echo t_automate_toposort.at:116 >$at_check_line_file
( $at_traceon; echo $REV_E >> cdef ) >$at_stdout 2>$at_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_automate_toposort.at:116: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_toposort.at:117: echo \$REV_F >> cdef"
echo t_automate_toposort.at:117 >$at_check_line_file
( $at_traceon; echo $REV_F >> cdef ) >$at_stdout 2>$at_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_automate_toposort.at:117: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_toposort.at:118: echo \$REV_C > cedf"
echo t_automate_toposort.at:118 >$at_check_line_file
( $at_traceon; echo $REV_C > cedf ) >$at_stdout 2>$at_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_automate_toposort.at:118: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_toposort.at:119: echo \$REV_E >> cedf"
echo t_automate_toposort.at:119 >$at_check_line_file
( $at_traceon; echo $REV_E >> cedf ) >$at_stdout 2>$at_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_automate_toposort.at:119: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_toposort.at:120: echo \$REV_D >> cedf"
echo t_automate_toposort.at:120 >$at_check_line_file
( $at_traceon; echo $REV_D >> cedf ) >$at_stdout 2>$at_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_automate_toposort.at:120: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_toposort.at:121: echo \$REV_F >> cedf"
echo t_automate_toposort.at:121 >$at_check_line_file
( $at_traceon; echo $REV_F >> cedf ) >$at_stdout 2>$at_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_automate_toposort.at:121: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_toposort.at:122: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate toposort \$REV_C \$REV_D \$REV_E \$REV_F"
echo t_automate_toposort.at:122 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate toposort $REV_C $REV_D $REV_E $REV_F ) >$at_stdout 2>$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_automate_toposort.at:122: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_toposort.at:123:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_toposort.at:123 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_toposort.at:123: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_toposort.at:124: cmp stdout cdef || cmp stdout cedf"
echo t_automate_toposort.at:124 >$at_check_line_file
( $at_traceon; cmp stdout cdef || cmp stdout cedf ) >$at_stdout 2>$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_automate_toposort.at:124: exit code 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`
    ;;

  161 ) # 161. t_diff_first_rev.at:1: diff in a never-committed project
    at_setup_line='t_diff_first_rev.at:1'
    at_desc='diff in a never-committed project'
    $at_quiet $ECHO_N "161: diff in a never-committed project            $ECHO_C"
    at_xfail=no
    (
      echo "161. t_diff_first_rev.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_diff_first_rev.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_diff_first_rev.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_diff_first_rev.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_diff_first_rev.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_diff_first_rev.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_diff_first_rev.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_diff_first_rev.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_diff_first_rev.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_diff_first_rev.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_diff_first_rev.at:2: rm test_keys"
echo t_diff_first_rev.at:2 >$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_diff_first_rev.at:2: 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'
flagella
_ATEOF

$at_traceoff
echo "t_diff_first_rev.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_diff_first_rev.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_diff_first_rev.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_diff_first_rev.at:6: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR diff"
echo t_diff_first_rev.at:6 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR diff ) >$at_stdout 2>$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_diff_first_rev.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_diff_first_rev.at:7: grep -q testfile stdout"
echo t_diff_first_rev.at:7 >$at_check_line_file
( $at_traceon; grep -q testfile 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;;
   0) ;;
   *) echo "t_diff_first_rev.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_diff_first_rev.at:8: grep -q flagella stdout"
echo t_diff_first_rev.at:8 >$at_check_line_file
( $at_traceon; grep -q flagella 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;;
   0) ;;
   *) echo "t_diff_first_rev.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  162 ) # 162. t_automate_ancestry_difference.at:1: automate ancestry_difference
    at_setup_line='t_automate_ancestry_difference.at:1'
    at_desc='automate ancestry_difference'
    $at_quiet $ECHO_N "162: automate ancestry_difference                 $ECHO_C"
    at_xfail=no
    (
      echo "162. t_automate_ancestry_difference.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_automate_ancestry_difference.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_automate_ancestry_difference.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_automate_ancestry_difference.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_ancestry_difference.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_automate_ancestry_difference.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_automate_ancestry_difference.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_ancestry_difference.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_automate_ancestry_difference.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_automate_ancestry_difference.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_ancestry_difference.at:2: rm test_keys"
echo t_automate_ancestry_difference.at:2 >$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_automate_ancestry_difference.at:2: 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
#  / \
# B   C
#     |\
#     D E
#     \/
#      F


cat >testfile <<'_ATEOF'
A
_ATEOF

$at_traceoff
echo "t_automate_ancestry_difference.at:13: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_automate_ancestry_difference.at:13 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_automate_ancestry_difference.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_automate_ancestry_difference.at:14: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_automate_ancestry_difference.at:14 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_automate_ancestry_difference.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


REV_A=`cat MT/revision`


cat >testfile <<'_ATEOF'
B
_ATEOF



$at_traceoff
echo "t_automate_ancestry_difference.at:19: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_automate_ancestry_difference.at:19 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_automate_ancestry_difference.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


REV_B=`cat MT/revision`


$at_traceoff
echo "t_automate_ancestry_difference.at:22: rm -rf MT.old"
echo t_automate_ancestry_difference.at:22 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_automate_ancestry_difference.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_automate_ancestry_difference.at:22: mv  MT MT.old"
echo t_automate_ancestry_difference.at:22 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_automate_ancestry_difference.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_automate_ancestry_difference.at:22: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$REV_A ."
echo t_automate_ancestry_difference.at:22 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $REV_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_automate_ancestry_difference.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_automate_ancestry_difference.at:22: mv MT.old/options MT"
echo t_automate_ancestry_difference.at:22 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_automate_ancestry_difference.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_automate_ancestry_difference.at:22: test \$PROBE_R_SHA = \$REV_A"
echo t_automate_ancestry_difference.at:22 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $REV_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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_ancestry_difference.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




cat >testfile <<'_ATEOF'
C
_ATEOF



$at_traceoff
echo "t_automate_ancestry_difference.at:26: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_automate_ancestry_difference.at:26 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_automate_ancestry_difference.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


REV_C=`cat MT/revision`


cat >testfile <<'_ATEOF'
D
_ATEOF



$at_traceoff
echo "t_automate_ancestry_difference.at:31: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_automate_ancestry_difference.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_automate_ancestry_difference.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


REV_D=`cat MT/revision`


$at_traceoff
echo "t_automate_ancestry_difference.at:34: rm -rf MT.old"
echo t_automate_ancestry_difference.at:34 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_automate_ancestry_difference.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_automate_ancestry_difference.at:34: mv  MT MT.old"
echo t_automate_ancestry_difference.at:34 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_automate_ancestry_difference.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_automate_ancestry_difference.at:34: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$REV_C ."
echo t_automate_ancestry_difference.at:34 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $REV_C . ) >$at_stdout 2>$at_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_automate_ancestry_difference.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_automate_ancestry_difference.at:34: mv MT.old/options MT"
echo t_automate_ancestry_difference.at:34 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_automate_ancestry_difference.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

PROBE_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_automate_ancestry_difference.at:34: test \$PROBE_R_SHA = \$REV_C"
echo t_automate_ancestry_difference.at:34 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $REV_C ) >$at_stdout 2>$at_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_automate_ancestry_difference.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




cat >otherfile <<'_ATEOF'
E
_ATEOF

$at_traceoff
echo "t_automate_ancestry_difference.at:37: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add otherfile"
echo t_automate_ancestry_difference.at:37 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add otherfile ) >$at_stdout 2>$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_automate_ancestry_difference.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_automate_ancestry_difference.at:38: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_automate_ancestry_difference.at:38 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_automate_ancestry_difference.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


REV_E=`cat MT/revision`

$at_traceoff
echo "t_automate_ancestry_difference.at:41: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR explicit_merge \$REV_D \$REV_E testbranch"
echo t_automate_ancestry_difference.at:41 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR explicit_merge $REV_D $REV_E 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_automate_ancestry_difference.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_automate_ancestry_difference.at:42: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update"
echo t_automate_ancestry_difference.at:42 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_automate_ancestry_difference.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

REV_F=`cat MT/revision`

$at_traceoff
echo "t_automate_ancestry_difference.at:45: test \$REV_F != \$REV_D"
echo t_automate_ancestry_difference.at:45 >$at_check_line_file
( $at_traceon; test $REV_F != $REV_D ) >$at_stdout 2>$at_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_automate_ancestry_difference.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_automate_ancestry_difference.at:46: test \$REV_F != \$REV_E"
echo t_automate_ancestry_difference.at:46 >$at_check_line_file
( $at_traceon; test $REV_F != $REV_E ) >$at_stdout 2>$at_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_automate_ancestry_difference.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 do some checks

$at_traceoff
echo "t_automate_ancestry_difference.at:50: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate ancestry_difference c7539264e83c5d6af4c792f079b5d46e9c128665"
echo t_automate_ancestry_difference.at:50 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate ancestry_difference c7539264e83c5d6af4c792f079b5d46e9c128665 ) >$at_stdout 2>$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_automate_ancestry_difference.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
echo "t_automate_ancestry_difference.at:51: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate ancestry_difference \$REV_A c7539264e83c5d6af4c792f079b5d46e9c128665"
echo t_automate_ancestry_difference.at:51 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate ancestry_difference $REV_A c7539264e83c5d6af4c792f079b5d46e9c128665 ) >$at_stdout 2>$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_automate_ancestry_difference.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_automate_ancestry_difference.at:53: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate ancestry_difference \$REV_A"
echo t_automate_ancestry_difference.at:53 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate ancestry_difference $REV_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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_ancestry_difference.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_automate_ancestry_difference.at:54:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_ancestry_difference.at:54 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_ancestry_difference.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_automate_ancestry_difference.at:55: cat stdout"
echo t_automate_ancestry_difference.at:55 >$at_check_line_file
( $at_traceon; cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_ancestry_difference.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_automate_ancestry_difference.at:55: mv stdout expout"
echo t_automate_ancestry_difference.at:55 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_ancestry_difference.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_automate_ancestry_difference.at:55: echo \$REV_A"
echo t_automate_ancestry_difference.at:55 >$at_check_line_file
( $at_traceon; echo $REV_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
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_ancestry_difference.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_automate_ancestry_difference.at:56: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate ancestry_difference \$REV_A \$REV_A"
echo t_automate_ancestry_difference.at:56 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate ancestry_difference $REV_A $REV_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
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_ancestry_difference.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_automate_ancestry_difference.at:57: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate ancestry_difference \$REV_A \$REV_B"
echo t_automate_ancestry_difference.at:57 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate ancestry_difference $REV_A $REV_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
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_ancestry_difference.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_automate_ancestry_difference.at:58: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate ancestry_difference \$REV_A \$REV_F"
echo t_automate_ancestry_difference.at:58 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate ancestry_difference $REV_A $REV_F ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_ancestry_difference.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_automate_ancestry_difference.at:59: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate ancestry_difference \$REV_F \$REV_F"
echo t_automate_ancestry_difference.at:59 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate ancestry_difference $REV_F $REV_F ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_ancestry_difference.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_automate_ancestry_difference.at:61: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate ancestry_difference \$REV_B \$REV_A"
echo t_automate_ancestry_difference.at:61 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate ancestry_difference $REV_B $REV_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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_ancestry_difference.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_automate_ancestry_difference.at:62:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_ancestry_difference.at:62 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_ancestry_difference.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_automate_ancestry_difference.at:63: cat stdout"
echo t_automate_ancestry_difference.at:63 >$at_check_line_file
( $at_traceon; cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_ancestry_difference.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_automate_ancestry_difference.at:63: mv stdout expout"
echo t_automate_ancestry_difference.at:63 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_ancestry_difference.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_automate_ancestry_difference.at:63: echo \$REV_B"
echo t_automate_ancestry_difference.at:63 >$at_check_line_file
( $at_traceon; echo $REV_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
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_ancestry_difference.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_automate_ancestry_difference.at:65: echo \$REV_A > ab"
echo t_automate_ancestry_difference.at:65 >$at_check_line_file
( $at_traceon; echo $REV_A > ab ) >$at_stdout 2>$at_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_automate_ancestry_difference.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

$at_traceoff
echo "t_automate_ancestry_difference.at:66: echo \$REV_B >> ab"
echo t_automate_ancestry_difference.at:66 >$at_check_line_file
( $at_traceon; echo $REV_B >> ab ) >$at_stdout 2>$at_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_automate_ancestry_difference.at:66: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_ancestry_difference.at:67: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate ancestry_difference \$REV_B"
echo t_automate_ancestry_difference.at:67 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate ancestry_difference $REV_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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_ancestry_difference.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_automate_ancestry_difference.at:68:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_ancestry_difference.at:68 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_ancestry_difference.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_automate_ancestry_difference.at:69: cat stdout"
echo t_automate_ancestry_difference.at:69 >$at_check_line_file
( $at_traceon; cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_ancestry_difference.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_automate_ancestry_difference.at:69: mv stdout expout"
echo t_automate_ancestry_difference.at:69 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_ancestry_difference.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_automate_ancestry_difference.at:69: cat ab"
echo t_automate_ancestry_difference.at:69 >$at_check_line_file
( $at_traceon; cat ab ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_ancestry_difference.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_automate_ancestry_difference.at:71: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate ancestry_difference \$REV_F \$REV_D \$REV_E"
echo t_automate_ancestry_difference.at:71 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate ancestry_difference $REV_F $REV_D $REV_E ) >$at_stdout 2>$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_automate_ancestry_difference.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_automate_ancestry_difference.at:72:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_ancestry_difference.at:72 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_ancestry_difference.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_automate_ancestry_difference.at:73: cat stdout"
echo t_automate_ancestry_difference.at:73 >$at_check_line_file
( $at_traceon; cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_ancestry_difference.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_automate_ancestry_difference.at:73: mv stdout expout"
echo t_automate_ancestry_difference.at:73 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_ancestry_difference.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_automate_ancestry_difference.at:73: echo \$REV_F"
echo t_automate_ancestry_difference.at:73 >$at_check_line_file
( $at_traceon; echo $REV_F ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_ancestry_difference.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_automate_ancestry_difference.at:75: echo \$REV_D > df"
echo t_automate_ancestry_difference.at:75 >$at_check_line_file
( $at_traceon; echo $REV_D > df ) >$at_stdout 2>$at_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_automate_ancestry_difference.at:75: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_ancestry_difference.at:76: echo \$REV_F >> df"
echo t_automate_ancestry_difference.at:76 >$at_check_line_file
( $at_traceon; echo $REV_F >> df ) >$at_stdout 2>$at_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_automate_ancestry_difference.at:76: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_ancestry_difference.at:77: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate ancestry_difference \$REV_F \$REV_E"
echo t_automate_ancestry_difference.at:77 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate ancestry_difference $REV_F $REV_E ) >$at_stdout 2>$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_automate_ancestry_difference.at:77: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_ancestry_difference.at:78:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_ancestry_difference.at:78 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_ancestry_difference.at:78: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_automate_ancestry_difference.at:79: cat stdout"
echo t_automate_ancestry_difference.at:79 >$at_check_line_file
( $at_traceon; cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_ancestry_difference.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_automate_ancestry_difference.at:79: mv stdout expout"
echo t_automate_ancestry_difference.at:79 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_ancestry_difference.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_automate_ancestry_difference.at:79: cat df"
echo t_automate_ancestry_difference.at:79 >$at_check_line_file
( $at_traceon; cat df ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_ancestry_difference.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_automate_ancestry_difference.at:81: echo \$REV_A > acdef"
echo t_automate_ancestry_difference.at:81 >$at_check_line_file
( $at_traceon; echo $REV_A > acdef ) >$at_stdout 2>$at_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_automate_ancestry_difference.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

$at_traceoff
echo "t_automate_ancestry_difference.at:82: echo \$REV_C >> acdef"
echo t_automate_ancestry_difference.at:82 >$at_check_line_file
( $at_traceon; echo $REV_C >> acdef ) >$at_stdout 2>$at_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_automate_ancestry_difference.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_automate_ancestry_difference.at:83: echo \$REV_D >> acdef"
echo t_automate_ancestry_difference.at:83 >$at_check_line_file
( $at_traceon; echo $REV_D >> acdef ) >$at_stdout 2>$at_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_automate_ancestry_difference.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

$at_traceoff
echo "t_automate_ancestry_difference.at:84: echo \$REV_E >> acdef"
echo t_automate_ancestry_difference.at:84 >$at_check_line_file
( $at_traceon; echo $REV_E >> acdef ) >$at_stdout 2>$at_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_automate_ancestry_difference.at:84: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_ancestry_difference.at:85: echo \$REV_F >> acdef"
echo t_automate_ancestry_difference.at:85 >$at_check_line_file
( $at_traceon; echo $REV_F >> acdef ) >$at_stdout 2>$at_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_automate_ancestry_difference.at:85: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_ancestry_difference.at:86: echo \$REV_A > acedf"
echo t_automate_ancestry_difference.at:86 >$at_check_line_file
( $at_traceon; echo $REV_A > acedf ) >$at_stdout 2>$at_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_automate_ancestry_difference.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_automate_ancestry_difference.at:87: echo \$REV_C >> acedf"
echo t_automate_ancestry_difference.at:87 >$at_check_line_file
( $at_traceon; echo $REV_C >> acedf ) >$at_stdout 2>$at_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_automate_ancestry_difference.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_automate_ancestry_difference.at:88: echo \$REV_E >> acedf"
echo t_automate_ancestry_difference.at:88 >$at_check_line_file
( $at_traceon; echo $REV_E >> acedf ) >$at_stdout 2>$at_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_automate_ancestry_difference.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_automate_ancestry_difference.at:89: echo \$REV_D >> acedf"
echo t_automate_ancestry_difference.at:89 >$at_check_line_file
( $at_traceon; echo $REV_D >> acedf ) >$at_stdout 2>$at_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_automate_ancestry_difference.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_automate_ancestry_difference.at:90: echo \$REV_F >> acedf"
echo t_automate_ancestry_difference.at:90 >$at_check_line_file
( $at_traceon; echo $REV_F >> acedf ) >$at_stdout 2>$at_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_automate_ancestry_difference.at:90: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_ancestry_difference.at:91: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate ancestry_difference \$REV_F"
echo t_automate_ancestry_difference.at:91 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate ancestry_difference $REV_F ) >$at_stdout 2>$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_automate_ancestry_difference.at:91: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_ancestry_difference.at:92:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_ancestry_difference.at:92 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_ancestry_difference.at:92: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_ancestry_difference.at:93: cmp stdout acdef || cmp stdout acedf"
echo t_automate_ancestry_difference.at:93 >$at_check_line_file
( $at_traceon; cmp stdout acdef || cmp stdout acedf ) >$at_stdout 2>$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_automate_ancestry_difference.at:93: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_automate_ancestry_difference.at:95: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate ancestry_difference \$REV_B \$REV_F"
echo t_automate_ancestry_difference.at:95 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate ancestry_difference $REV_B $REV_F ) >$at_stdout 2>$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_automate_ancestry_difference.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_automate_ancestry_difference.at:96:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_ancestry_difference.at:96 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_ancestry_difference.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_automate_ancestry_difference.at:97: cat stdout"
echo t_automate_ancestry_difference.at:97 >$at_check_line_file
( $at_traceon; cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_ancestry_difference.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_automate_ancestry_difference.at:97: mv stdout expout"
echo t_automate_ancestry_difference.at:97 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_ancestry_difference.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_automate_ancestry_difference.at:97: echo \$REV_B"
echo t_automate_ancestry_difference.at:97 >$at_check_line_file
( $at_traceon; echo $REV_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
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_ancestry_difference.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  163 ) # 163. t_automate_leaves.at:1: automate leaves
    at_setup_line='t_automate_leaves.at:1'
    at_desc='automate leaves'
    $at_quiet $ECHO_N "163: automate leaves                              $ECHO_C"
    at_xfail=no
    (
      echo "163. t_automate_leaves.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_automate_leaves.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_automate_leaves.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_automate_leaves.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_leaves.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_automate_leaves.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_automate_leaves.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_leaves.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_automate_leaves.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_automate_leaves.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_automate_leaves.at:2: rm test_keys"
echo t_automate_leaves.at:2 >$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_automate_leaves.at:2: 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
# |\
# B C
#  \|
#   D
# ^testbranch
#   ^otherbranch

$at_traceoff
echo "t_automate_leaves.at:12: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate leaves"
echo t_automate_leaves.at:12 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate leaves ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_leaves.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



cat >testfile <<'_ATEOF'
blah blah
_ATEOF

$at_traceoff
echo "t_automate_leaves.at:15: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_automate_leaves.at:15 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_automate_leaves.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_automate_leaves.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_automate_leaves.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_automate_leaves.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


REV_A=`cat MT/revision`

$at_traceoff
echo "t_automate_leaves.at:19: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate leaves"
echo t_automate_leaves.at:19 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate leaves ) >$at_stdout 2>$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_automate_leaves.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_automate_leaves.at:20:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_leaves.at:20 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_leaves.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_automate_leaves.at:21: cat stdout"
echo t_automate_leaves.at:21 >$at_check_line_file
( $at_traceon; cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_leaves.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_automate_leaves.at:21: mv stdout expout"
echo t_automate_leaves.at:21 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_leaves.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_automate_leaves.at:21: echo \$REV_A"
echo t_automate_leaves.at:21 >$at_check_line_file
( $at_traceon; echo $REV_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
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_leaves.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 >testfile <<'_ATEOF'
other stuff
_ATEOF



$at_traceoff
echo "t_automate_leaves.at:25: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_automate_leaves.at:25 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_automate_leaves.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


REV_B=`cat MT/revision`

$at_traceoff
echo "t_automate_leaves.at:28: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate leaves"
echo t_automate_leaves.at:28 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate leaves ) >$at_stdout 2>$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_automate_leaves.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_automate_leaves.at:29:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_leaves.at:29 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_leaves.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_automate_leaves.at:30: cat stdout"
echo t_automate_leaves.at:30 >$at_check_line_file
( $at_traceon; cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_leaves.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_automate_leaves.at:30: mv stdout expout"
echo t_automate_leaves.at:30 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_leaves.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_automate_leaves.at:30: echo \$REV_B"
echo t_automate_leaves.at:30 >$at_check_line_file
( $at_traceon; echo $REV_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
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_leaves.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_automate_leaves.at:32: rm -rf MT.old"
echo t_automate_leaves.at:32 >$at_check_line_file
( $at_traceon; rm -rf MT.old ) >$at_stdout 2>$at_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_automate_leaves.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_automate_leaves.at:32: mv  MT MT.old"
echo t_automate_leaves.at:32 >$at_check_line_file
( $at_traceon; mv  MT MT.old ) >$at_stdout 2>$at_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_automate_leaves.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_automate_leaves.at:32: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout \$REV_A ."
echo t_automate_leaves.at:32 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout $REV_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_automate_leaves.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_automate_leaves.at:32: mv MT.old/options MT"
echo t_automate_leaves.at:32 >$at_check_line_file
( $at_traceon; mv MT.old/options MT ) >$at_stdout 2>$at_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_automate_leaves.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_R_SHA=`cat MT/revision`
$at_traceoff
echo "t_automate_leaves.at:32: test \$PROBE_R_SHA = \$REV_A"
echo t_automate_leaves.at:32 >$at_check_line_file
( $at_traceon; test $PROBE_R_SHA = $REV_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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_leaves.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 >otherfile <<'_ATEOF'
other blah blah
_ATEOF

$at_traceoff
echo "t_automate_leaves.at:35: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add otherfile"
echo t_automate_leaves.at:35 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add otherfile ) >$at_stdout 2>$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_automate_leaves.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_automate_leaves.at:36: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=otherbranch commit --message blah-blah"
echo t_automate_leaves.at:36 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=otherbranch commit --message 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_automate_leaves.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


REV_C=`cat MT/revision`

$at_traceoff
echo "t_automate_leaves.at:39: echo \$REV_B > bc"
echo t_automate_leaves.at:39 >$at_check_line_file
( $at_traceon; echo $REV_B > bc ) >$at_stdout 2>$at_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_automate_leaves.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_automate_leaves.at:40: echo \$REV_C >> bc"
echo t_automate_leaves.at:40 >$at_check_line_file
( $at_traceon; echo $REV_C >> bc ) >$at_stdout 2>$at_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_automate_leaves.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_automate_leaves.at:41: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate leaves"
echo t_automate_leaves.at:41 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate leaves ) >$at_stdout 2>$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_automate_leaves.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_automate_leaves.at:42:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_automate_leaves.at:42 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_automate_leaves.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_automate_leaves.at:43: cat stdout"
echo t_automate_leaves.at:43 >$at_check_line_file
( $at_traceon; cat 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_leaves.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_automate_leaves.at:43: mv stdout expout"
echo t_automate_leaves.at:43 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_leaves.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_automate_leaves.at:43: sort < bc"
echo t_automate_leaves.at:43 >$at_check_line_file
( $at_traceon; sort < bc ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_leaves.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_automate_leaves.at:45: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR propagate testbranch otherbranch"
echo t_automate_leaves.at:45 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR propagate testbranch otherbranch ) >$at_stdout 2>$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_automate_leaves.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_automate_leaves.at:46: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update"
echo t_automate_leaves.at:46 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_automate_leaves.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

REV_D=`cat MT/revision`

$at_traceoff
echo "t_automate_leaves.at:49: test \$REV_D != \$REV_B"
echo t_automate_leaves.at:49 >$at_check_line_file
( $at_traceon; test $REV_D != $REV_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_automate_leaves.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_automate_leaves.at:50: test \$REV_D != \$REV_C"
echo t_automate_leaves.at:50 >$at_check_line_file
( $at_traceon; test $REV_D != $REV_C ) >$at_stdout 2>$at_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_automate_leaves.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_automate_leaves.at:52: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate leaves"
echo t_automate_leaves.at:52 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate leaves ) >$at_stdout 2>$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_automate_leaves.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_automate_leaves.at:52: mv stdout expout"
echo t_automate_leaves.at:52 >$at_check_line_file
( $at_traceon; mv stdout expout ) >$at_stdout 2>$at_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_automate_leaves.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_automate_leaves.at:52: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate heads otherbranch"
echo t_automate_leaves.at:52 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate heads otherbranch ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_leaves.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_automate_leaves.at:53: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate leaves"
echo t_automate_leaves.at:53 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate leaves ) >$at_stdout 2>$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_automate_leaves.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_automate_leaves.at:53: mv stdout firstout"
echo t_automate_leaves.at:53 >$at_check_line_file
( $at_traceon; mv stdout firstout ) >$at_stdout 2>$at_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_automate_leaves.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_automate_leaves.at:53: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR automate heads testbranch"
echo t_automate_leaves.at:53 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR automate heads 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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_automate_leaves.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_automate_leaves.at:53: mv stdout secondout"
echo t_automate_leaves.at:53 >$at_check_line_file
( $at_traceon; mv stdout secondout ) >$at_stdout 2>$at_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_automate_leaves.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_automate_leaves.at:53: cmp firstout secondout"
echo t_automate_leaves.at:53 >$at_check_line_file
( $at_traceon; cmp firstout secondout ) >$at_stdout 2>$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_automate_leaves.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



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

  164 ) # 164. t_log_depth.at:1: only log a few entries instead of the whole log
    at_setup_line='t_log_depth.at:1'
    at_desc='only log a few entries instead of the whole log'
    $at_quiet $ECHO_N "164: only log a few entries instead of the whole log$ECHO_C"
    at_xfail=no
    (
      echo "164. t_log_depth.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_log_depth.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_log_depth.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_log_depth.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_log_depth.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_log_depth.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_log_depth.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_log_depth.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_log_depth.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_log_depth.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_log_depth.at:2: rm test_keys"
echo t_log_depth.at:2 >$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_log_depth.at:2: 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
_ATEOF

$at_traceoff
echo "t_log_depth.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add foo"
echo t_log_depth.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_log_depth.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_log_depth.at:7: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message \"Addition of foo.\""
echo t_log_depth.at:7 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message "Addition of 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_log_depth.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 >bar <<'_ATEOF'
bar
_ATEOF

$at_traceoff
echo "t_log_depth.at:10: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add bar"
echo t_log_depth.at:10 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add 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_log_depth.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_log_depth.at:12: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message \"Addition of bar.\""
echo t_log_depth.at:12 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message "Addition of 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_log_depth.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



cat >baz <<'_ATEOF'
baz
_ATEOF

$at_traceoff
echo "t_log_depth.at:15: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add baz"
echo t_log_depth.at:15 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add baz ) >$at_stdout 2>$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_log_depth.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_log_depth.at:17: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message \"Addition of baz.\""
echo t_log_depth.at:17 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message "Addition of baz." ) >$at_stdout 2>$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_log_depth.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_log_depth.at:19: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR log --depth=0"
echo t_log_depth.at:19 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR log --depth=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
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   1) ;;
   *) echo "t_log_depth.at:19: 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_log_depth.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR log --depth=1 | grep '^Revision:'"
echo t_log_depth.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR log --depth=1 | grep '^Revision:' ) >$at_stdout 2>$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_log_depth.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_log_depth.at:22: test 1 -eq \"\`wc -l <stdout\`\""
echo t_log_depth.at:22 >$at_check_line_file
( $at_traceon; test 1 -eq "`wc -l <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;;
   0) ;;
   *) echo "t_log_depth.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_log_depth.at:24: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR log --depth=2 | grep '^Revision:'"
echo t_log_depth.at:24 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR log --depth=2 | grep '^Revision:' ) >$at_stdout 2>$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_log_depth.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_log_depth.at:25: test 2 -eq \"\`wc -l <stdout\`\""
echo t_log_depth.at:25 >$at_check_line_file
( $at_traceon; test 2 -eq "`wc -l <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;;
   0) ;;
   *) echo "t_log_depth.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  165 ) # 165. t_commit_log_3.at:3: commit using MT/log and --message
    at_setup_line='t_commit_log_3.at:3'
    at_desc='commit using MT/log and --message'
    $at_quiet $ECHO_N "165: commit using MT/log and --message            $ECHO_C"
    at_xfail=no
    (
      echo "165. t_commit_log_3.at:3: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_commit_log_3.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_commit_log_3.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_commit_log_3.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_commit_log_3.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_commit_log_3.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_commit_log_3.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_commit_log_3.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_commit_log_3.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_commit_log_3.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_commit_log_3.at:5: rm test_keys"
echo t_commit_log_3.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_commit_log_3.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 >commit_log.lua <<'_ATEOF'

function edit_comment(summary, user_log_file)
  return user_log_file
end
_ATEOF


cat >MT/log <<'_ATEOF'
Log entry
_ATEOF


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


$at_traceoff
echo "t_commit_log_3.at:19: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add input.txt"
echo t_commit_log_3.at:19 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_commit_log_3.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_commit_log_3.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch --rcfile=commit_log.lua commit --message=\"Cause me an error\""
echo t_commit_log_3.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch --rcfile=commit_log.lua commit --message="Cause me an error" ) >$at_stdout 2>$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_commit_log_3.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


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

  166 ) # 166. t_at_sign.at:1: check that --xargs / -@ behave correctly
    at_setup_line='t_at_sign.at:1'
    at_desc='check that --xargs / -@ behave correctly'
    $at_quiet $ECHO_N "166: check that --xargs / -@ behave correctly     $ECHO_C"
    at_xfail=no
    (
      echo "166. t_at_sign.at:1: testing ..."
      $at_traceon


# Generate the general expected output, as we're testing using the
# output of 'list --help'
$at_traceoff
echo "t_at_sign.at:5: \$PREEXECUTE monotone --norc list --help"
echo t_at_sign.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE monotone --norc list --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:; tee stdout <$at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_at_sign.at:5: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then
  :
  echo 1 > $at_status_file
  exit 1
else
  :
fi

$at_traceon

mv stdout expout

# Check that --xargs works at all
cat >at_test.input <<'_ATEOF'
--help
_ATEOF

$at_traceoff
echo "t_at_sign.at:11: \$PREEXECUTE monotone --norc list --xargs=at_test.input"
echo t_at_sign.at:11 >$at_check_line_file
( $at_traceon; $PREEXECUTE monotone --norc list --xargs=at_test.input ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_at_sign.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


# The rest of the checks use the short form, -@

# Check that -@ works at all
cat >at_test.input <<'_ATEOF'
--help
_ATEOF

$at_traceoff
echo "t_at_sign.at:18: \$PREEXECUTE monotone --norc list -@ at_test.input"
echo t_at_sign.at:18 >$at_check_line_file
( $at_traceon; $PREEXECUTE monotone --norc list -@ at_test.input ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_at_sign.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 that -@ works when injected in the middle of the arguments
# (i.e. that it's prepended correctly)
cat >at_test.input <<'_ATEOF'
list
_ATEOF

$at_traceoff
echo "t_at_sign.at:24: \$PREEXECUTE monotone --norc -@ at_test.input --help"
echo t_at_sign.at:24 >$at_check_line_file
( $at_traceon; $PREEXECUTE monotone --norc -@ at_test.input --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
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_at_sign.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


# Check that -@ works when used more than once
cat >at_test.input1 <<'_ATEOF'
list
_ATEOF

cat >at_test.input2 <<'_ATEOF'
--help
_ATEOF

$at_traceoff
echo "t_at_sign.at:31: \$PREEXECUTE monotone --norc -@ at_test.input1 -@ at_test.input2"
echo t_at_sign.at:31 >$at_check_line_file
( $at_traceon; $PREEXECUTE monotone --norc -@ at_test.input1 -@ at_test.input2 ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_at_sign.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


# Check that -@ works with an argument file with no content
$at_traceoff
echo "t_at_sign.at:34: \$PREEXECUTE monotone --norc list"
echo t_at_sign.at:34 >$at_check_line_file
( $at_traceon; $PREEXECUTE monotone --norc list ) >$at_stdout 2>$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_at_sign.at:34: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then
  :
  echo 1 > $at_status_file
  exit 1
else
  :
fi

$at_traceon

mv stdout expout
cat >at_test.input <<'_ATEOF'
_ATEOF

$at_traceoff
echo "t_at_sign.at:37: \$PREEXECUTE monotone --norc list -@ at_test.input"
echo t_at_sign.at:37 >$at_check_line_file
( $at_traceon; $PREEXECUTE monotone --norc list -@ at_test.input ) >$at_stdout 2>$at_stder1
at_status=$?
grep '^ *+' $at_stder1 >&2
grep -v '^ *+' $at_stder1 >$at_stderr
at_failed=false
echo stderr:; cat $at_stderr
$at_diff expout $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_at_sign.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`
    ;;

  167 ) # 167. t_db_execute.at:1: db execute
    at_setup_line='t_db_execute.at:1'
    at_desc='db execute'
    $at_quiet $ECHO_N "167: db execute                                   $ECHO_C"
    at_xfail=no
    (
      echo "167. t_db_execute.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_db_execute.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_db_execute.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_db_execute.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_db_execute.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_db_execute.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_db_execute.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_db_execute.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_db_execute.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_db_execute.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_db_execute.at:2: rm test_keys"
echo t_db_execute.at:2 >$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_db_execute.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



TWO_COL_TABLE=revisions
COL1=id

$at_traceoff
echo "t_db_execute.at:7: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db execute \"INSERT INTO \$TWO_COL_TABLE VALUES ('key1', 'value1')\""
echo t_db_execute.at:7 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR db execute "INSERT INTO $TWO_COL_TABLE VALUES ('key1', 'value1')" ) >$at_stdout 2>$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_db_execute.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_db_execute.at:9: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db execute \"SELECT * FROM \$TWO_COL_TABLE\""
echo t_db_execute.at:9 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR db execute "SELECT * FROM $TWO_COL_TABLE" ) >$at_stdout 2>$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_db_execute.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_db_execute.at:10: grep -q key1 stdout"
echo t_db_execute.at:10 >$at_check_line_file
( $at_traceon; grep -q key1 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;;
   0) ;;
   *) echo "t_db_execute.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_db_execute.at:11: grep -q value1 stdout"
echo t_db_execute.at:11 >$at_check_line_file
( $at_traceon; grep -q value1 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;;
   0) ;;
   *) echo "t_db_execute.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_db_execute.at:13: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db execute \"SELECT * FROM \$TWO_COL_TABLE WHERE \$COL1 = 'nonsense'\""
echo t_db_execute.at:13 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR db execute "SELECT * FROM $TWO_COL_TABLE WHERE $COL1 = 'nonsense'" ) >$at_stdout 2>$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_db_execute.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_db_execute.at:14: grep -q key1 stdout"
echo t_db_execute.at:14 >$at_check_line_file
( $at_traceon; grep -q key1 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_db_execute.at:14: 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_db_execute.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db execute \"SELECT * FROM \$TWO_COL_TABLE WHERE \$COL1 LIKE 'k%'\""
echo t_db_execute.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR db execute "SELECT * FROM $TWO_COL_TABLE WHERE $COL1 LIKE 'k%'" ) >$at_stdout 2>$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_db_execute.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_db_execute.at:17: grep -q key1 stdout"
echo t_db_execute.at:17 >$at_check_line_file
( $at_traceon; grep -q key1 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;;
   0) ;;
   *) echo "t_db_execute.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_db_execute.at:19: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db execute \"DELETE FROM \$TWO_COL_TABLE\""
echo t_db_execute.at:19 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR db execute "DELETE FROM $TWO_COL_TABLE" ) >$at_stdout 2>$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_db_execute.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_db_execute.at:21: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db execute \"SELECT * FROM \$TWO_COL_TABLE\""
echo t_db_execute.at:21 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR db execute "SELECT * FROM $TWO_COL_TABLE" ) >$at_stdout 2>$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_db_execute.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_db_execute.at:22: grep -q key1 stdout"
echo t_db_execute.at:22 >$at_check_line_file
( $at_traceon; grep -q key1 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_db_execute.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


# We used to have weird quoting bugs around "%"
# string is split into two so the grep doesn't trigger on monotone's
# chatter about what command it's going to execute...
$at_traceoff
echo "t_db_execute.at:27: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db execute \"SELECT '%s' || 'tuff'\""
echo t_db_execute.at:27 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR db execute "SELECT '%s' || 'tuff'" ) >$at_stdout 2>$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_db_execute.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_db_execute.at:28: grep -q '%stuff' stdout"
echo t_db_execute.at:28 >$at_check_line_file
( $at_traceon; grep -q '%stuff' 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;;
   0) ;;
   *) echo "t_db_execute.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  168 ) # 168. t_sql_unpack.at:1: sql functions unpack, unbase64
    at_setup_line='t_sql_unpack.at:1'
    at_desc='sql functions unpack, unbase64'
    $at_quiet $ECHO_N "168: sql functions unpack, unbase64               $ECHO_C"
    at_xfail=no
    (
      echo "168. t_sql_unpack.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_sql_unpack.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_sql_unpack.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_sql_unpack.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_sql_unpack.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_sql_unpack.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_sql_unpack.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_sql_unpack.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_sql_unpack.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_sql_unpack.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_sql_unpack.at:2: rm test_keys"
echo t_sql_unpack.at:2 >$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_sql_unpack.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



$at_traceoff
echo "t_sql_unpack.at:4: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db execute \"select unpack('H4sIAAAAAAAAAE2RQW4bMQwA7/uKRe5JJEoUyXOu/YFhGJREJgvEq8BetOjvq/bg9EyQMxju9uty1X1zux/riQSbM2lsiZxSzI6qhSVayh0KKSF51XJelvHZLzf7ud23sa8n65KtJSfOkUTcQyRVLMFRIPfgSt4C9vO/vW8gGJVMjiFxCIEqd0rgbowhZ6AOoQAUlQn80qN9rE8v1+NZj+N2f1pWv43rlK6F0MQ6ilnrUnWKZHMGjlLaPCEdVdJ5Wdf1GOvJpRbs4hGpWiVJUCFYVkabg8wkWbTbf9C3D93f7cd4f0Ch6kySCnTiktRQggALCSXClr2TYYnAD2ggDIXD1IyhUmIs3jqyxb9dHG3G6jXH/A1tYz9uW31tm9ZxXK5jH8fY7eXr98NiLnNjT1VxhgR2lQoxSw05okaKyQtJxIcFJ20cerbSySMDzq+CZbKoSVKtmDqgVjgvfwA6AWjaGQIAAA==')\""
echo t_sql_unpack.at:4 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR db execute "select unpack('H4sIAAAAAAAAAE2RQW4bMQwA7/uKRe5JJEoUyXOu/YFhGJREJgvEq8BetOjvq/bg9EyQMxju9uty1X1zux/riQSbM2lsiZxSzI6qhSVayh0KKSF51XJelvHZLzf7ud23sa8n65KtJSfOkUTcQyRVLMFRIPfgSt4C9vO/vW8gGJVMjiFxCIEqd0rgbowhZ6AOoQAUlQn80qN9rE8v1+NZj+N2f1pWv43rlK6F0MQ6ilnrUnWKZHMGjlLaPCEdVdJ5Wdf1GOvJpRbs4hGpWiVJUCFYVkabg8wkWbTbf9C3D93f7cd4f0Ch6kySCnTiktRQggALCSXClr2TYYnAD2ggDIXD1IyhUmIs3jqyxb9dHG3G6jXH/A1tYz9uW31tm9ZxXK5jH8fY7eXr98NiLnNjT1VxhgR2lQoxSw05okaKyQtJxIcFJ20cerbSySMDzq+CZbKoSVKtmDqgVjgvfwA6AWjaGQIAAA==')" ) >$at_stdout 2>$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_sql_unpack.at:4: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


$at_traceoff
echo "t_sql_unpack.at:6: grep -q 'new_manifest \\[795cf87a1c37f7314f5aa6891e34d267a757fba6\\]' stdout"
echo t_sql_unpack.at:6 >$at_check_line_file
( $at_traceon; grep -q 'new_manifest \[795cf87a1c37f7314f5aa6891e34d267a757fba6\]' 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;;
   0) ;;
   *) echo "t_sql_unpack.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_sql_unpack.at:7: grep -q 'from \\[7b675e9ed59eecd9bac3f4ef828196c2069d5a93\\]' stdout"
echo t_sql_unpack.at:7 >$at_check_line_file
( $at_traceon; grep -q 'from \[7b675e9ed59eecd9bac3f4ef828196c2069d5a93\]' 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;;
   0) ;;
   *) echo "t_sql_unpack.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_sql_unpack.at:9: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db execute \"select unbase64('aXQncyB0ZW4gcGFjZXMgbm9ydGh3ZXN0IG9mIHRoZSBwYWxtIHRyZWUuICBGT09CQVI=')\""
echo t_sql_unpack.at:9 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR db execute "select unbase64('aXQncyB0ZW4gcGFjZXMgbm9ydGh3ZXN0IG9mIHRoZSBwYWxtIHRyZWUuICBGT09CQVI=')" ) >$at_stdout 2>$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_sql_unpack.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_sql_unpack.at:11: grep -q FOOBAR stdout"
echo t_sql_unpack.at:11 >$at_check_line_file
( $at_traceon; grep -q FOOBAR 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;;
   0) ;;
   *) echo "t_sql_unpack.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  169 ) # 169. t_final_space.at:1: files with spaces at the end
    at_setup_line='t_final_space.at:1'
    at_desc='files with spaces at the end'
    $at_quiet $ECHO_N "169: files with spaces at the end                 $ECHO_C"
    at_xfail=no
    (
      echo "169. t_final_space.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_final_space.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_final_space.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_final_space.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_final_space.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_final_space.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_final_space.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_final_space.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_final_space.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_final_space.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_final_space.at:2: rm test_keys"
echo t_final_space.at:2 >$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_final_space.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



if test "$OSTYPE" == "msys"; then
  exit 77
fi

# On Win32, the files "foo bar" and "foo bar " are the same, obviating this test

$at_traceoff
echo "t_final_space.at:6: touch \"foo bar \""
echo t_final_space.at:6 >$at_check_line_file
( $at_traceon; touch "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_final_space.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_final_space.at:7: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add \"foo bar \""
echo t_final_space.at:7 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_final_space.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_final_space.at:8: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_final_space.at:8 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_final_space.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  170 ) # 170. t_inodeprints.at:1: inodeprints
    at_setup_line='t_inodeprints.at:1'
    at_desc='inodeprints'
    $at_quiet $ECHO_N "170: inodeprints                                  $ECHO_C"
    at_xfail=no
    (
      echo "170. t_inodeprints.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_inodeprints.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_inodeprints.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_inodeprints.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_inodeprints.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_inodeprints.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_inodeprints.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_inodeprints.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_inodeprints.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_inodeprints.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_inodeprints.at:2: rm test_keys"
echo t_inodeprints.at:2 >$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_inodeprints.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon



# Turn them on
$at_traceoff
echo "t_inodeprints.at:5: touch MT/inodeprints"
echo t_inodeprints.at:5 >$at_check_line_file
( $at_traceon; touch MT/inodeprints ) >$at_stdout 2>$at_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_inodeprints.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_inodeprints.at:7: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR diff"
echo t_inodeprints.at:7 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR diff ) >$at_stdout 2>$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_inodeprints.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_inodeprints.at:8: grep -q \"no changes\" stdout"
echo t_inodeprints.at:8 >$at_check_line_file
( $at_traceon; grep -q "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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_inodeprints.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 >testfile <<'_ATEOF'
blah blah
_ATEOF

$at_traceoff
echo "t_inodeprints.at:11: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_inodeprints.at:11 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_inodeprints.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_inodeprints.at:13: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR diff"
echo t_inodeprints.at:13 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR diff ) >$at_stdout 2>$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_inodeprints.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_inodeprints.at:14: grep -q \"blah blah\" stdout"
echo t_inodeprints.at:14 >$at_check_line_file
( $at_traceon; grep -q "blah blah" 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;;
   0) ;;
   *) echo "t_inodeprints.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_inodeprints.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_inodeprints.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_inodeprints.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



# Something should have been written to it
$at_traceoff
echo "t_inodeprints.at:19: test -s MT/inodeprints"
echo t_inodeprints.at:19 >$at_check_line_file
( $at_traceon; test -s MT/inodeprints ) >$at_stdout 2>$at_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_inodeprints.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_inodeprints.at:20: cp MT/inodeprints ip1"
echo t_inodeprints.at:20 >$at_check_line_file
( $at_traceon; cp MT/inodeprints ip1 ) >$at_stdout 2>$at_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_inodeprints.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


# And stuff should still work
$at_traceoff
echo "t_inodeprints.at:23: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR diff"
echo t_inodeprints.at:23 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR diff ) >$at_stdout 2>$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_inodeprints.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_inodeprints.at:24: grep -q \"no changes\" stdout"
echo t_inodeprints.at:24 >$at_check_line_file
( $at_traceon; grep -q "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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_inodeprints.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



cat >testfile <<'_ATEOF'
stuff stuff
_ATEOF



$at_traceoff
echo "t_inodeprints.at:29: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR diff"
echo t_inodeprints.at:29 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR diff ) >$at_stdout 2>$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_inodeprints.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_inodeprints.at:30: grep -q \"stuff stuff\" stdout"
echo t_inodeprints.at:30 >$at_check_line_file
( $at_traceon; grep -q "stuff stuff" 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;;
   0) ;;
   *) echo "t_inodeprints.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


# Make sure partial commit doesn't screw things up

cat >otherfile <<'_ATEOF'
other stuff
_ATEOF

$at_traceoff
echo "t_inodeprints.at:34: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add otherfile"
echo t_inodeprints.at:34 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add otherfile ) >$at_stdout 2>$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_inodeprints.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_inodeprints.at:35: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR commit otherfile --message=foo"
echo t_inodeprints.at:35 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR commit otherfile --message=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_inodeprints.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


# Should have changed the inodeprints file
$at_traceoff
echo "t_inodeprints.at:38: cmp MT/inodeprints ip1"
echo t_inodeprints.at:38 >$at_check_line_file
( $at_traceon; cmp MT/inodeprints ip1 ) >$at_stdout 2>$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_inodeprints.at:38: exit code was $at_status, expected 1"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon


# Still should think testfile is modified
$at_traceoff
echo "t_inodeprints.at:41: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR diff"
echo t_inodeprints.at:41 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR diff ) >$at_stdout 2>$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_inodeprints.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_inodeprints.at:42: grep -q \"stuff stuff\" stdout"
echo t_inodeprints.at:42 >$at_check_line_file
( $at_traceon; grep -q "stuff stuff" 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;;
   0) ;;
   *) echo "t_inodeprints.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`
    ;;

  171 ) # 171. t_inodeprints_update.at:1: update updates inodeprints
    at_setup_line='t_inodeprints_update.at:1'
    at_desc='update updates inodeprints'
    $at_quiet $ECHO_N "171: update updates inodeprints                   $ECHO_C"
    at_xfail=no
    (
      echo "171. t_inodeprints_update.at:1: testing ..."
      $at_traceon



# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_inodeprints_update.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_inodeprints_update.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_inodeprints_update.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_inodeprints_update.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_inodeprints_update.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_inodeprints_update.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_inodeprints_update.at:2: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_inodeprints_update.at:2 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_inodeprints_update.at:2: exit code was $at_status, expected 0"
      at_failed=:;;
esac
if $at_failed; then

  echo 1 > $at_status_file
  exit 1
fi

$at_traceon

$at_traceoff
echo "t_inodeprints_update.at:2: rm test_keys"
echo t_inodeprints_update.at:2 >$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_inodeprints_update.at:2: 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'
blah blah
_ATEOF

$at_traceoff
echo "t_inodeprints_update.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add testfile"
echo t_inodeprints_update.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_inodeprints_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_inodeprints_update.at:6: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_inodeprints_update.at:6 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_inodeprints_update.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


R0=`cat MT/revision`


cat >testfile <<'_ATEOF'
stuff stuff
_ATEOF



$at_traceoff
echo "t_inodeprints_update.at:11: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message blah-blah"
echo t_inodeprints_update.at:11 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message 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_inodeprints_update.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


R1=`cat MT/revision`

$at_traceoff
echo "t_inodeprints_update.at:14: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR checkout --branch=testbranch \$R0 td"
echo t_inodeprints_update.at:14 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR checkout --branch=testbranch $R0 td ) >$at_stdout 2>$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_inodeprints_update.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_inodeprints_update.at:15: touch td/MT/inodeprints"
echo t_inodeprints_update.at:15 >$at_check_line_file
( $at_traceon; touch td/MT/inodeprints ) >$at_stdout 2>$at_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_inodeprints_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_inodeprints_update.at:16: cd td && \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR update"
echo t_inodeprints_update.at:16 >$at_check_line_file
( $at_traceon; cd td && $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_inodeprints_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

$at_traceoff
echo "t_inodeprints_update.at:17: test -s td/MT/inodeprints"
echo t_inodeprints_update.at:17 >$at_check_line_file
( $at_traceon; test -s td/MT/inodeprints ) >$at_stdout 2>$at_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_inodeprints_update.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
      $at_times_p && times >$at_times_file
    ) 5>&1 2>&1 | eval $at_tee_pipe
    at_status=`cat $at_status_file`
    ;;

  172 ) # 172. t_ls_known.at:3: listing working copy manifests
    at_setup_line='t_ls_known.at:3'
    at_desc='listing working copy manifests'
    $at_quiet $ECHO_N "172: listing working copy manifests               $ECHO_C"
    at_xfail=no
    (
      echo "172. t_ls_known.at:3: testing ..."
      $at_traceon




# Absolutify monotone path
_MT_EXEC=`which monotone`

# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`

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

-- Everything alice signs is trusted, nothing mallory signs is
-- trusted.  For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
   for k, v in pairs(signers) do
      if v == "alice@trusted.com" then return true end
      if v == "mallory@evil.com" then return false end
   end
   if (id == "0000000000000000000000000000000000000000"
       and name == "bad-cert" and val == "bad-val")
   then return false end
   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 persist_phrase_ok()
	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

function merge2(left_path, right_path, merged_path, left, right)
	io.write("running merge2 hook\n")
	return left
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_known.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR setup ."
echo t_ls_known.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR setup . ) >$at_stdout 2>$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_known.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_known.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR db init"
echo t_ls_known.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_known.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_known.at:5: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR read <test_keys"
echo t_ls_known.at:5 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_known.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_known.at:5: rm test_keys"
echo t_ls_known.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_known.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_known.at:7: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls missing"
echo t_ls_known.at:7 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR ls missing ) >$at_stdout 2>$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_ls_known.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_ls_known.at:8: cmp /dev/null stdout"
echo t_ls_known.at:8 >$at_check_line_file
( $at_traceon; cmp /dev/null 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_ls_known.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 >foo <<'_ATEOF'
the foo file
_ATEOF

cat >bar <<'_ATEOF'
the bar file
_ATEOF

$at_traceoff
echo "t_ls_known.at:14: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add foo bar"
echo t_ls_known.at:14 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_known.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_ls_known.at:16: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls known | sort"
echo t_ls_known.at:16 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR ls known | sort ) >$at_stdout 2>$at_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_ls_known.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_known.at:17:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_ls_known.at:17 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_known.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

cat >ls_foobar <<'_ATEOF'
bar
foo
_ATEOF

$at_traceoff
echo "t_ls_known.at:21: cmp stdout ls_foobar"
echo t_ls_known.at:21 >$at_check_line_file
( $at_traceon; cmp stdout ls_foobar ) >$at_stdout 2>$at_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_ls_known.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_ls_known.at:23: mkdir dir"
echo t_ls_known.at:23 >$at_check_line_file
( $at_traceon; mkdir 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=:
$at_diff $at_devnull $at_stdout || at_failed=:
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_ls_known.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

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

cat >dir/bar <<'_ATEOF'
the bar file
_ATEOF

$at_traceoff
echo "t_ls_known.at:28: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR add dir/foo dir/bar"
echo t_ls_known.at:28 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR add dir/foo dir/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_known.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_known.at:30: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls known | sort"
echo t_ls_known.at:30 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR ls known | sort ) >$at_stdout 2>$at_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_ls_known.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_known.at:31:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_ls_known.at:31 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_known.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

cat >ls_foobar_dir <<'_ATEOF'
bar
dir/bar
dir/foo
foo
_ATEOF

$at_traceoff
echo "t_ls_known.at:37: cmp stdout ls_foobar_dir"
echo t_ls_known.at:37 >$at_check_line_file
( $at_traceon; cmp stdout ls_foobar_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:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_ls_known.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_ls_known.at:39: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR --branch=testbranch commit --message='committed'"
echo t_ls_known.at:39 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR --branch=testbranch commit --message='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_known.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_ls_known.at:41: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls known | sort"
echo t_ls_known.at:41 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR ls known | sort ) >$at_stdout 2>$at_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_ls_known.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_ls_known.at:42:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_ls_known.at:42 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_known.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_ls_known.at:43: cmp stdout ls_foobar_dir"
echo t_ls_known.at:43 >$at_check_line_file
( $at_traceon; cmp stdout ls_foobar_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:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_ls_known.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_ls_known.at:45: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR drop foo"
echo t_ls_known.at:45 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR 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_known.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_ls_known.at:46: mv dir dir2"
echo t_ls_known.at:46 >$at_check_line_file
( $at_traceon; mv dir dir2 ) >$at_stdout 2>$at_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_known.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_ls_known.at:47: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename dir dir2"
echo t_ls_known.at:47 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename dir dir2 ) >$at_stdout 2>$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_known.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_ls_known.at:48: mv bar baz"
echo t_ls_known.at:48 >$at_check_line_file
( $at_traceon; mv bar baz ) >$at_stdout 2>$at_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_known.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_ls_known.at:49: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR rename bar baz"
echo t_ls_known.at:49 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR rename bar baz ) >$at_stdout 2>$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_known.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_ls_known.at:51: \$PREEXECUTE \$_MT_EXEC --rcfile=\$_ROOT_DIR/test_hooks.lua --nostd --norc --db=\$_ROOT_DIR/test.db --key=tester@test.net --root=\$_ROOT_DIR ls known | sort"
echo t_ls_known.at:51 >$at_check_line_file
( $at_traceon; $PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --key=tester@test.net --root=$_ROOT_DIR ls known | sort ) >$at_stdout 2>$at_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_ls_known.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_ls_known.at:52:
if test \"\$OSTYPE\" == \"msys\"; then
  dos2unix -q -o stdout
fi
"
echo t_ls_known.at:52 >$at_check_line_file
( $at_traceon;
if test "$OSTYPE" == "msys"; then
  dos2unix -q -o stdout
fi
 ) >$at_stdout 2>$at_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_known.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

cat >ls_baz_dir <<'_ATEOF'
baz
dir2/bar
dir2/foo
_ATEOF

$at_traceoff
echo "t_ls_known.at:57: cmp stdout ls_baz_dir"
echo t_ls_known.at:57 >$at_check_line_file
( $at_traceon; cmp stdout ls_baz_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:; cat $at_stdout
case $at_status in
   77) echo 77 > $at_status_file
            exit 77;;
   0) ;;
   *) echo "t_ls_known.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
      $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 <monotone-devel@nongnu.org>.
_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: <monotone-devel@nongnu.org>"
  echo "   Subject: [monotone 0.18] $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


