#!/usr/bin/perl
#
# This is a X11 replay program. It will replay a session using
# the timestamps from the packet log, and transpose the X11 protocol so
# that it can be redisplayed. You must have captured from the start
# of the connection for this to work.
#
# USAGE: ./session_0001.X11.replay [-d destination host] [-p port] factor 
#
#	just run the script as normal. You can provide a factor as an
#	argument, eg "2" to run twice as fast, or "0.5" to run
#	at half time. eg,
# 		./session_0002.X11.replay 2
#	a different host and port can be specified if needed. eg,
#		./session_0002.X11.replay -d 192.168.1.5 -p 6001
#
# PROBLEMS: you may need to authorise this connection to the X11 server
#	before it works. You could run "xhost +hostname" beforehand.
# 	The playback needs to have captured the start of the connection.
#	Check you support the same colour depth as the playback. And check
#	the playback file simply isn't too big! (more than 500 Kb is 
#	currently problematic).
#	
#
# Auto generated by Chaosreader.
#

use IO::Socket;
use Getopt::Std;

if ($ARGV[0] =~ /^-h$|^--help$/) { &help(); }

# Try fetching values from $DISPLAY
($hostdef,$portdef) = $ENV{DISPLAY} =~ /([^:]*):(\d*)/;
$hostdef = "127.0.0.1" if $hostdef eq "";
$portdef += 6000;

# Command line options take preference
&getopts('d:p:');
if (defined $opt_d) { $host = $opt_d; } else { $host = $hostdef; }
if (defined $opt_p) { $port = $opt_p; } else { $port = $portdef; }
$factor = $ARGV[0] || 1;
$DEBUG = 0;
$| = 1;

print "Chaosreader X11 Replay (experimental)\n\n";
print "Connecting to $host:$port\n";
print "(problems? try running \"xhost +hostname\" first).\n\n";


# --- Open Socket ---
#
$remote = IO::Socket::INET->new( Proto => "tcp",
				PeerAddr  => $host,
				PeerPort  => $port,
				);
unless ($remote) { die "ERROR31: Can't connect to X11 daemon on $host:$port"; }
$remote->autoflush(1);


# --- Subroutines ---
#

# ms - sleeps for specified milliseconds
#
sub ms {
	$ms = shift;
	$ms = $ms / $factor;
	select(undef, undef, undef, $ms);
}
# help - print help
#
sub help {
        open (MYSELF,"$0") || die "ERROR8: I can't see myself: $!\n";
        @Myself = <MYSELF>;
        close MYSELF;
        ### Print comment from top of code
        foreach $line (@Myself) {
                last if $line !~ /^#/;
                next if $line =~ m:^#!/usr/bin/perl:;
                $line =~ s/^#/ /;
                print $line;
        }
        print "\n";
        exit(0);
}
# R - recalculates and prints a resourse setting
#     The single character subroutine name saves on file space below.
#
sub R {
	#$offset = shift;
	#$new = $res + $offset;
	my $rid = shift;
	my $new;

	# final checks
	$diff = $rid - $ridbaseold;
	$diff = -$diff if $diff < 0;
	if ((($rid < $ridbaseold) && ($rid < 8196)) || ($diff > 8196)) {
	   if ($msb) { return pack('N',$rid); } 
		else { return pack('V',$rid); }
	}
	
	$new = $rid & $ridmaskold;
	$new = $new | $ridbase;
	if ($msb) { return pack('N',$new); } 
	     else { return pack('V',$new); }
}
# D - prints the new Drawable, usually the rootid.
#
sub D {
	my $rid = shift;
	
	# final checks
	if ($rid >= $ridbaseold) {
		# return mapped resource id
		return R($rid);
	}
	# return rootid
	if ($msb) { return pack('N',$rootid); } 
	     else { return pack('V',$rootid); }
}
# C - prints the new Colour map.
#
sub C {
	my $rid = shift;
	
	# final checks
	if ($rid >= $ridbaseold) {
		# return mapped resource id
		return R($rid);
	}
	# return colour map
	if ($msb) { return pack('N',$colour); }
	     else { return pack('V',$colour); }
}
# M - Returns a generic mapped id. Can be rootid, colour, or resource.
#     These are used in Xcodes involving a mask.
#
sub M {
	my $rid = shift;
	
	# final checks
	if ($rid >= $ridbaseold) {
		# return mapped resource id
		return R($rid);
	}
	# return rootid map
	if ($rid == $rootidold) {
	   if ($msb) { return pack('N',$rootid); } 
		else { return pack('V',$rootid); }
	}
	# return colour map
	if ($rid == $colourold) {
	   if ($msb) { return pack('N',$colour); } 
		else { return pack('V',$colour); }
	}
	# return other
	if ($msb) { return pack('N',$rid); } 
		else { return pack('V',$rid); }
}
# P - Check depth pixels, print warning if there is a mismatch.
#
sub P {
	my $depth = shift;
	if (! defined $Depth{$depth}) {
		print "\nWARNING: requested depth $depth may not be ". 
		 "supported by the server?\n";
	}
}
# debug - print out a value
#
sub debug {
	my $word = shift;
	my $num = shift;
	my $pack = pack("N",$num);
	print "$word: $num ",
	 sprintf("%2.2x%2.2x%2.2x%2.2x\n",unpack("C*",$pack));
}


# --- MAIN ---
#
print "Sending X11 traffic:";
print '.';
print $remote '';
print '.';
print $remote '';
print '.';
print $remote 'l          ';
$msb = 0;
$ridbaseold = 138412032;
$ridmaskold = 4194303;
$rootidold = 37;
$colourold = 33;
if ($msb) {
	$n = "n";
	$N = "N";
} else {
	$n = "v";
	$N = "V";
}


read($remote,$in,40);		# (xConnSetup)
($success,$major,$minor,$length,$release,$ridbase,$ridmask,$mbsize,$vendor,
$reqmax,$roots,$formats,$ibo,$bbo,$bslu,$bslp,$keymin,$keymax,$pad) =
unpack("a2$n$n$n$N$N$N$N$n${n}CCCCCCCC${N}a*",$in);

read($remote,$in,$vendor);
print "\nX11 Server Type: $in\n";
read($remote,$in,((4 - ($vendor % 4)) % 4));

foreach $i (1..$formats) {
	read($remote,$in,8);	# (xPixmapFormat)
	($depth,$junk) = unpack("Ca*",$in);
	$Depth{$depth} = 1;
	next if $depth == 1;
	print "X11 server supports $depth bit resolution\n";
}
read($remote,$in,8);	# (xWindowRoot)
($rootid,$colour,$junk) = unpack("$N$N",$in) unless defined $rootid;

if ($DEBUG) {
	debug("Resource ID new: ",$ridbase);
	debug("Resource ID old: ",$ridbaseold);
	debug("Root ID new: ",$rootid);
	debug("Root ID old: ",$rootidold);
	debug("Colour map new: ",$colour);
	debug("Colour map old: ",$colourold);
}
ms(0.00381994247436523);
print '.';
print $remote '';
print '.';
print $remote '7  ',R(138412032),'',D(37),'   ',M(16777215),'b  ',R(12),'BIG-REQUESTS  ',D(37),'           ';
ms(0.00576019287109375);
print '.';
print $remote '';
print '.';
print $remote '';
print '.';
print $remote '  ';
ms(0.0188601016998291);
print '.';
print $remote 'b  ',R(138412041),'XKEYBOARD   ';
print '.';
print $remote '  ',R(138412043),'Custom Init ';
ms(0.00410008430480957);
print '.';
print $remote '  ',R(138412043),'Custom Data ';
ms(0.0148899555206299);
print '.';
print $remote ' ',R(138412048),'SCREEN_RESOURCES';
print '.';
print $remote '  ',D(37),'          ';
ms(0.00282001495361328);
print '.';
print $remote '	 ',R(27),'XDCCC_LINEAR_RGB_CORRECTIONU';
print '.';
print $remote '	 ',R(25),'XDCCC_LINEAR_RGB_MATRICESONU';
print '.';
print $remote '  ',D(37),'         t  ';
print '.';
print $remote 'T  ',C(33),'  ';
ms(0.00347018241882324);
print '.';
print $remote 'T  ',C(33),'        ';
ms(0.00251984596252441);
print '.';
print $remote '-  ',R(138412033),'   cursor  b ',R(1413545990),'RENDER  ';
print '.';
print $remote '^  ',R(138412034),'',R(138412033),'',R(138412033),'        bO ',R(1398013967),'XFree86-Bigfont ';
print '.';
print $remote '-  ',R(138412035),' @nil2/  ',R(138412035),'';
ms(0.00663995742797852);
print '.';
print $remote '';
print '.';
print $remote '^  ',R(138412036),'',R(138412033),'',R(138412033),'t u       ^O ',R(138412037),'',R(138412033),'',R(138412033),'l m       ^  ',R(138412038),'',R(138412033),'',R(138412033),'r s       ^  ',R(138412039),'',R(138412033),'',R(138412033),'j k       ^  ',R(138412040),'',R(138412033),'',R(138412033),'n o       ^  ',R(138412041),'',R(138412033),'',R(138412033),'p q       5 ',R(138412042),'',D(37),'  7  ',R(138412043),'',D(138412042),'   ',M(1),'',M(0),'H  ',D(138412042),'',R(138412043),'         @      <  ',R(138412043),'7  ',R(138412044),'',D(37),'	  ',M(12825262),'',M(3),'',M(138412042),'^  ',R(138412045),'',R(138412033),'',R(138412033),'D E       [  ',C(33),'     ';
ms(0.0141799449920654);
print '.';
print $remote '`  ',R(138412045),'        ',R(4294901776),'WM_DELETE_WINDOW';
ms(0.00270986557006836);
print '.';
print $remote ' ',P(24),'',D(138412046),'',D(37),'        ',R(0),'(  ',M(12825262),'',M(0),'',M(1),'',M(6422576),'',M(33),'  ',R(138412046),'\'      ',R(138412040),'   xterm s   ',R(138412046),'%      ',R(138412040),'   xterm k   ',R(138412046),'"      ',R(138412040),'   xterm o   ',R(138412046),'$      ',R(138412040),'   jupiter   ',R(138412046),'(   )   ',R(138412064),'                                                                        ',R(138412046),'#   #   ',R(32),'	                            	 ',R(138412046),'C      ',R(8),'   xterm XTerm   ',R(14),'WM_LOCALE_NAME  ';
ms(0.00846004486083984);
print '.';
print $remote ' 	 ',R(138412046),'m      ',R(65544),'   en_US.UTF-8  	 ',R(138412046),'m      ',R(524296),'   en_US.UTF-8  ',R(1919221776),'WM_CLIENT_LEADER';
ms(0.00258994102478027);
print '.';
print $remote '  ',R(138412046),'n   !   ',R(65568),'    @-. ',R(138412047),'5 	 -dt-interface user-medium-r-normal-s*-*-*-*-*-*-*-*-*DER/  ',R(138412047),'';
ms(0.00226020812988281);
print '.';
print $remote '-  ',R(138412048),'   fixed  /  ',R(138412048),'';
ms(0.00444984436035156);
print '.';
print $remote '';
print '.';
print $remote '  ',R(138412036),'FONT';
print '.';
print $remote '  d   ';
print '.';
print $remote '-  ',R(138412049),'< NT-Misc-Fixed-bold-R-SemiCondensed--13-120-75-75-C-*-ISO8859-1/l ',R(138412049),'';
ms(0.0137500762939453);
print '.';
print $remote '';
print '.';
print $remote '    ';
print '.';
print $remote '-  ',R(138412050),'5 NT-Misc-Fixed-Medium-R-*-*-13-120-75-75-C-120-ISO8859-1O88/9 ',R(138412050),'';
ms(0.0153999328613281);
print '.';
print $remote '7  ',R(138412051),'',D(37),'@  ',M(12825262),'',M(138412048),'7e ',R(138412052),'',D(37),'@  ',M(12825262),'',M(138412049),'7- ',R(138412053),'',D(37),'@  ',M(12825262),'',M(0),'',M(138412048),'7  ',R(138412054),'',D(37),'@  ',M(12825262),'',M(0),'',M(138412049),'[  ',C(33),'     ';
ms(0.0231599807739258);
print '.';
print $remote '`  ',R(138412034),'        ',R(138412046),' @',M(499),'',M(316),'  ',R(138412046),'(   )   ',R(32),'               <                                                     ';
ms(0.0131199359893799);
print '.';
print $remote '  ',R(138412046),'(   )   ',R(4294967072),'   X          <                                                ';
ms(0.0387601852416992);
print '.';
print $remote '';
ms(0.0586400032043457);
print '.';
print $remote ' ',D(138412055),'',D(138412046),'    <   ',R(0),'(  ',M(12825262),'',M(0),'',M(0),'',M(4359437),'',M(33),'  ',R(138412055),'  ',D(138412055),'';
ms(0.0029599666595459);
print '.';
print $remote '';
print '.';
print $remote ' ',R(138412055),'  ',D(138412055),'';
print '.';
print $remote 'w ';
ms(0.00200009346008301);
print '.';
print $remote 'e ',R(138475528),'';
ms(0.00619983673095703);
print '.';
print $remote '';
print '.';
print $remote 'w ';
print '.';
print $remote ' ',R(138412046),' @   @ ',D(138412056),'',D(138412055),' <  ',R(0),'
h  ',M(12825262),'',M(0),'',M(33293),'',M(33),'',M(138412036),'  ',D(138412046),'(   )          ';
print '.';
print $remote '  ',R(138412046),'(   )   ',R(858144),'   X            <                                               +  ';
print '.';
print $remote '  ',R(138412046),'(   )   ',R(858144),'   X          <                                                  ',R(138412056),' ',R(138412055),' ',R(0),'       ',R(138412055),' ',R(0),'      e  ',R(63496),'';
ms(0.00334000587463379);
print '.';
print $remote '';
print '.';
print $remote 'w  ';
print '.';
print $remote ' ',R(138412055),' ',R(0),'       ',R(138412055),' ',R(0),'       ',R(138412055),' ',R(0),'       ',R(138412055),' ',R(0),'      	  ',R(138412046),' ',R(138412046),'   0 b   ',R(262156),'WM_PROTOCOLS';
ms(0.00956988334655762);
print '.';
print $remote '  ',R(138412046),'s      ',R(32),'   r     ',R(138412046),'s      ',R(393248),'   r     ',R(138412046),'M ',D(138412055),'',R(138412051),'    A ',D(138412055),'',R(138412051),'            ';
print '.';
print $remote '  ',R(138412046),'   1 b  ',R(138412055),' ',R(0),'       ',R(138412055),' ',R(0),'       ',R(138412055),' ',R(0),'      ',R(138412055),' ',R(0),'      ',R(138412055),' ',R(0),'    O  ',R(138412055),' ',R(0),'       ',R(138412055),'   @ ';
ms(0.0387699604034424);
print '.';
print $remote '';
ms(0.00432014465332031);
print '.';
print $remote '';
ms(0.0290398597717285);
print '.';
print $remote '';
print '.';
print $remote 'F  ',D(138412056),'',R(138412044),'   :';
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :A ',D(138412055),'',R(138412051),'            ';
ms(0.00411009788513184);
print '.';
print $remote 'M ',D(138412055),'',R(138412053),'    :';
ms(0.0236198902130127);
print '.';
print $remote '  ',R(138412046),'%      ',R(20586504),'   brendan@jupiter:~    ',R(138412046),'\'      ',R(262152),'   brendan@jupiter:~ ';
ms(0.00655007362365723);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   [ b r e n d a n @ j u p i t e r   b r e n d a n ] $   M ',D(138412055),'',R(138412053),'     ';
ms(0.61161994934082);
print '.';
print $remote '';
ms(0.563390016555786);
print '.';
print $remote '';
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :';
print '.';
print $remote 'M ',D(138412055),'',R(138412053),'    :';
ms(1.76959013938904);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412053),'     b';
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   [ b r e n d a n @ j u p i t e r   b r e n d a n ] $   M ',D(138412055),'',R(138412053),'     ';
ms(0.906929969787598);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412053),' \'    b';
print '.';
print $remote 'M ',D(138412055),'',R(138412051),' \'   :M ',D(138412055),'',R(138412051),' \'  [ b r e n d a n @ j u p i t e r   b r e n d a n ] $   M ',D(138412055),'',R(138412053),' \'    ';
ms(0.210129976272583);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),' \'   :M ',D(138412055),'',R(138412051),' \'  d bM ',D(138412055),'',R(138412053),' \'    p';
ms(0.0514800548553467);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),' \'   :M ',D(138412055),'',R(138412051),' \'  a bM ',D(138412055),'',R(138412053),' \'    p';
ms(0.116859912872314);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),' \'   :M ',D(138412055),'',R(138412051),' \'  t bM ',D(138412055),'',R(138412053),' \'    p';
ms(0.0879600048065186);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),' \'   :M ',D(138412055),'',R(138412051),' \'  e bM ',D(138412055),'',R(138412053),' \'    p';
ms(0.288850069046021);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),' \'   :M ',D(138412055),'',R(138412053),' 4    b';
ms(0.00344991683959961);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),' 4   :M ',D(138412055),'',R(138412051),' 4  T u e   J a n   2 7   1 4 : 0 1 : 4 0   E S T   2 0 0 4';
print '.';
print $remote 'M ',D(138412055),'',R(138412053),' A   :';
print '.';
print $remote 'M ',D(138412055),'',R(138412051),' A   :M ',D(138412055),'',R(138412051),' A  [ b r e n d a n @ j u p i t e r   b r e n d a n ] $   4M ',D(138412055),'',R(138412053),' A    ';
ms(0.120290040969849);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),' A   :M ',D(138412055),'',R(138412053),' N    b';
print '.';
print $remote 'M ',D(138412055),'',R(138412051),' N   :M ',D(138412055),'',R(138412051),' N  [ b r e n d a n @ j u p i t e r   b r e n d a n ] $   4M ',D(138412055),'',R(138412053),' N    ';
ms(0.977269887924194);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),' N   :M ',D(138412055),'',R(138412051),' N  s bM ',D(138412055),'',R(138412053),' N    p';
ms(0.135440111160278);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),' N   :M ',D(138412055),'',R(138412051),' N  u bM ',D(138412055),'',R(138412053),' N    p';
ms(0.147229909896851);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),' N   :M ',D(138412055),'',R(138412051),' N    bM ',D(138412055),'',R(138412053),' N    p';
ms(0.173029899597168);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),' N   :M ',D(138412055),'',R(138412051),' N  - bM ',D(138412055),'',R(138412053),' N    p';
ms(0.141390085220337);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),' N   :M ',D(138412055),'',R(138412051),' N    bM ',D(138412055),'',R(138412053),' N    p';
ms(0.246229887008667);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),' N   :M ',D(138412055),'',R(138412051),' N  f bM ',D(138412055),'',R(138412053),' N    p';
ms(0.178400039672852);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),' N   :M ',D(138412055),'',R(138412051),' N  r bM ',D(138412055),'',R(138412053),' N    p';
ms(0.180150032043457);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),' N   :M ',D(138412055),'',R(138412051),' N  e bM ',D(138412055),'',R(138412053),' N    p';
ms(0.225950002670288);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),' N   :M ',D(138412055),'',R(138412051),' N  d bM ',D(138412055),'',R(138412053),' N    p';
ms(0.361079931259155);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),' N   :M ',D(138412055),'',R(138412053),' [    b';
ms(0.00697016716003418);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),' [   :M
	 ',D(138412055),'',R(138412051),' [  P a s s w o r d :  M ',D(138412055),'',R(138412053),'M [    e';
ms(0.790469884872437);
print '.';
print $remote '';
ms(0.154970169067383);
print '.';
print $remote '';
ms(0.196329832077026);
print '.';
print $remote '';
ms(0.220350027084351);
print '.';
print $remote '';
ms(0.258330106735229);
print '.';
print $remote '';
ms(0.186489820480347);
print '.';
print $remote '';
ms(0.202230215072632);
print '.';
print $remote '';
ms(0.329059839248657);
print '.';
print $remote '';
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'M [   :M ',D(138412055),'',R(138412053),' h    a';
ms(0.129460096359253);
print '.';
print $remote ' 
 ',R(138412046),'%      ',R(20586504),'   fred@jupiter:~ a 
 ',R(138412046),'\'      ',R(327944),'   fred@jupiter:~ d';
ms(0.00641989707946777);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),' h   :M ',D(138412055),'',R(138412051),' h  [ f r e d @ j u p i t e r   f r e d ] $   dM ',D(138412055),'',R(138412053),' h   @';
ms(0.462549924850464);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),' h   :M ',D(138412055),'',R(138412053),' u    f';
print '.';
print $remote 'M ',D(138412055),'',R(138412051),' u   :M ',D(138412055),'',R(138412051),' u  [ f r e d @ j u p i t e r   f r e d ] $   dM ',D(138412055),'',R(138412053),' u   @';
ms(0.131380081176758);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),' u   :M ',D(138412055),'',R(138412053),'     f';
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   [ f r e d @ j u p i t e r   f r e d ] $   dM ',D(138412055),'',R(138412053),'    @';
ms(0.627170085906982);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   d fM ',D(138412055),'',R(138412053),'     e';
ms(0.0509798526763916);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   a fM ',D(138412055),'',R(138412053),'     e';
ms(0.123820066452026);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   t fM ',D(138412055),'',R(138412053),'     e';
ms(0.0621199607849121);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   e fM ',D(138412055),'',R(138412053),'     e';
ms(0.16483998298645);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412053),'     f';
ms(0.00335001945495605);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   T u e   J a n   2 7   1 4 : 0 1 : 4 7   E S T   2 0 0 4';
print '.';
print $remote 'M ',D(138412055),'',R(138412053),'    :';
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   [ f r e d @ j u p i t e r   f r e d ] $   SM ',D(138412055),'',R(138412053),'    @';
ms(0.499899864196777);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412053),'     f';
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   [ f r e d @ j u p i t e r   f r e d ] $   SM ',D(138412055),'',R(138412053),'    @';
ms(0.309040069580078);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   u fM ',D(138412055),'',R(138412053),'     e';
ms(0.0440700054168701);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   n fM ',D(138412055),'',R(138412053),'     e';
ms(0.0672500133514404);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   a fM ',D(138412055),'',R(138412053),'     e';
ms(0.110619783401489);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   m fM ',D(138412055),'',R(138412053),'     e';
ms(0.0664200782775879);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   e fM ',D(138412055),'',R(138412053),'     e';
ms(0.089479923248291);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'     fM ',D(138412055),'',R(138412053),'     e';
ms(0.377300024032593);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   - fM ',D(138412055),'',R(138412053),'     e';
ms(0.0731301307678223);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   a fM ',D(138412055),'',R(138412053),'     e';
ms(0.127719879150391);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412053),'     f';
ms(0.00289011001586914);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :MO, ',D(138412055),'',R(138412051),'   L i n u x   j u p i t e r   2 . 4 . 2 0 - 8   # 1   T h u   M a r   1 3   1 7 : 5 4 : 2 8   E S T   2 0 0 3   i 6 8 6   i 6 8 6   i 3 8 6   G N U / L i n u x  ';
print '.';
print $remote 'M ',D(138412055),'',R(138412053),'    :';
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   [ f r e d @ j u p i t e r   f r e d ] $   8M ',D(138412055),'',R(138412053),'     a';
ms(0.83144998550415);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412053),'     f';
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   [ f r e d @ j u p i t e r   f r e d ] $   8M ',D(138412055),'',R(138412053),'     a';
ms(0.0767700672149658);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   c fM ',D(138412055),'',R(138412053),'     e';
ms(0.090789794921875);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   a fM ',D(138412055),'',R(138412053),'     e';
ms(0.120670080184937);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   t fM ',D(138412055),'',R(138412053),'     e';
ms(0.101670026779175);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'     fM ',D(138412055),'',R(138412053),'     e';
ms(0.191299915313721);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   / fM ',D(138412055),'',R(138412053),'     e';
ms(0.491120100021362);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   e fM ',D(138412055),'',R(138412053),'     e';
ms(0.07423996925354);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   t fM ',D(138412055),'',R(138412053),'     e';
ms(0.217469930648804);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   c fM ',D(138412055),'',R(138412053),'     e';
ms(0.0925700664520264);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   / fM ',D(138412055),'',R(138412053),'     e';
ms(0.191410064697266);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   r fM ',D(138412055),'',R(138412053),'     e';
ms(0.0655899047851562);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   e fM ',D(138412055),'',R(138412053),'     e';
ms(0.286640167236328);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   d fM ',D(138412055),'',R(138412053),'     e';
ms(0.37007999420166);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   h fM ',D(138412055),'',R(138412053),'     e';
ms(0.138099908828735);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   a fM ',D(138412055),'',R(138412053),'     e';
ms(0.118449926376343);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   t fM ',D(138412055),'',R(138412053),'     e';
ms(0.356709957122803);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   - fM ',D(138412055),'',R(138412053),'     e';
ms(0.124360084533691);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   r fM ',D(138412055),'',R(138412053),'     e';
ms(0.236999988555908);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   e l e a s e  @M ',D(138412055),'',R(138412053),'    d';
ms(0.385240077972412);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'   :M ',D(138412055),'',R(138412053),'     l';
ms(0.00436997413635254);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M  ',D(138412055),'',R(138412051),'   R e d   H a t   L i n u x   r e l e a s e   9   ( S h r i k e )';
print '.';
print $remote 'M ',D(138412055),'',R(138412053),'    :';
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   [ f r e d @ j u p i t e r   f r e d ] $    M ',D(138412055),'',R(138412053),'     )';
ms(1.72868990898132);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412053),'     f';
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   [ f r e d @ j u p i t e r   f r e d ] $    M ',D(138412055),'',R(138412053),'     )';
ms(0.171289920806885);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   c fM ',D(138412055),'',R(138412053),'     e';
ms(0.0791399478912354);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   a fM ',D(138412055),'',R(138412053),'     e';
ms(0.0470600128173828);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412051),'   l fM ',D(138412055),'',R(138412053),'     e';
ms(0.66471004486084);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'    :M ',D(138412055),'',R(138412053),'    f';
ms(0.00314998626708984);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'   :M ',D(138412055),'',R(138412051),'          J a n u a r y   2 0 0 4';
print '.';
print $remote 'M ',D(138412055),'',R(138412053),'   :M ',D(138412055),'',R(138412051),'   :M ',D(138412055),'',R(138412051),'  S u   M o   T u   W e   T h   F r   S a    M ',D(138412055),'',R(138412053),'   :M ',D(138412055),'',R(138412051),'   :M ',D(138412055),'',R(138412051),'                            1     2     3M ',D(138412055),'',R(138412053),' +  :M ',D(138412055),'',R(138412051),' +  :M ',D(138412055),'',R(138412051),' +   4     5     6     7     8     9   1 0M ',D(138412055),'',R(138412053),' 8  :M ',D(138412055),'',R(138412051),' 8  :M ',D(138412055),'',R(138412051),' 8 1 1   1 2   1 3   1 4   1 5   1 6   1 7';
print '.';
print $remote '=  ',R(138412056),'    >  ',D(138412055),'',D(138412055),'',R(138412051),'    +2 ',R(138412055),'    =  ',R(138412055),' -   ',R(138412055),'    M ',D(138412055),'',R(138412053),' 8   1';
print '.';
print $remote 'M ',D(138412055),'',R(138412051),' 8   M ',D(138412055),'',R(138412051),' 8 1 8   1 9   2 0   2 1   2 2   2 3   2 4';
print '.';
print $remote '=  ',R(138412056),'    ';
ms(0.0073699951171875);
print '.';
print $remote '>  ',D(138412055),'',D(138412055),'',R(138412051),'    +  ',R(138412055),'    =  ',R(138412055),' - 2 ',R(138412055),'    M ',D(138412055),'',R(138412053),' 8   ';
print '.';
print $remote 'M ',D(138412055),'',R(138412051),' 8   M ',D(138412055),'',R(138412051),' 8 2 5   2 6   2 7   2 8   2 9   3 0   3 1';
print '.';
print $remote '=  ',R(138412056),'    ';
ms(0.0047001838684082);
print '.';
print $remote '>  ',D(138412055),'',D(138412055),'',R(138412051),'      ',R(138412055),'    =  ',R(138412055),'   2 ',R(138412055),'    M ',D(138412055),'',R(138412053),' 8   ';
print '.';
print $remote 'M ',D(138412055),'',R(138412051),' 8   M ',D(138412055),'',R(138412051),' 8 [ f r e d @ j u p i t e r   f r e d ] $   M ',D(138412055),'',R(138412053),' 8  @';
ms(0.0440900325775146);
print '.';
print $remote '';
ms(0.693330049514771);
print '.';
print $remote '';
print '.';
print $remote 'M ',D(138412055),'',R(138412051),' 8   M ',D(138412055),'',R(138412051),' 8 e fM ',D(138412055),'',R(138412053),' 8   e';
ms(0.0500001907348633);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),' 8   M ',D(138412055),'',R(138412051),' 8 x fM ',D(138412055),'',R(138412053),' 8   e';
ms(0.144569873809814);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),' 8   M ',D(138412055),'',R(138412051),' 8 i fM ',D(138412055),'',R(138412053),' 8   e';
ms(0.0751299858093262);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),' 8   M ',D(138412055),'',R(138412051),' 8 t fM ',D(138412055),'',R(138412053),' 8   e';
ms(1.33067011833191);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),' 8   ';
print '.';
print $remote '=  ',R(138412056),' -  	 >  ',D(138412055),'',D(138412055),'',R(138412051),'    +  ',R(138412055),'    =  ',R(138412055),' -   ',R(138412055),'    M ',D(138412055),'',R(138412053),' 8   1';
print '.';
print $remote 'M ',D(138412055),'',R(138412051),' 8   M ',D(138412055),'',R(138412051),' 8 l o g o u t';
print '.';
print $remote '=  ',R(138412056),' 6  	 ';
ms(0.00533008575439453);
print '.';
print $remote '>  ',D(138412055),'',D(138412055),'',R(138412051),'    +  ',R(138412055),'    =  ',R(138412055),' -   ',R(138412055),'    M ',D(138412055),'',R(138412053),' 8   ';
print '.';
print $remote 'M ',D(138412055),'',R(138412051),' 8     ',R(138412055),'    =  ',R(138412055),'  8  ',R(138412055),'      ',R(138412046),'%      ',R(138412040),'   brendan@jupiter:~  1  ',R(138412046),'\'      ',R(1392526600),'   brendan@jupiter:~6  M ',D(138412055),'',R(138412053),'      ';
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'     M ',D(138412055),'',R(138412051),'   [ b r e n d a n @ j u p i t e r   b r e n d a n ] $    M ',D(138412055),'',R(138412053),'     1';
ms(0.0373001098632812);
print '.';
print $remote '';
ms(1.32705998420715);
print '.';
print $remote '';
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'     M ',D(138412055),'',R(138412051),'   e bM ',D(138412055),'',R(138412053),'     p';
ms(0.0426499843597412);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'     M ',D(138412055),'',R(138412051),'   x bM ',D(138412055),'',R(138412053),'     p';
ms(0.115630149841309);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'     M ',D(138412055),'',R(138412051),'   i bM ',D(138412055),'',R(138412053),'     p';
ms(0.0923898220062256);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'     M ',D(138412055),'',R(138412051),'   t bM ',D(138412055),'',R(138412053),'     p';
ms(0.119040012359619);
print '.';
print $remote 'M ',D(138412055),'',R(138412051),'     M ',D(138412055),'',R(138412053),'     b';
ms(0.00558996200561523);
print '.';
print $remote '';
print '.';
print $remote '';
print "
";
close $remote;
