mirror of
https://github.com/stephenenelson/convert-binhex.git
synced 2025-01-13 20:31:56 +00:00
Initial import
This commit is contained in:
commit
3c2245dbec
248
COPYING
Normal file
248
COPYING
Normal file
@ -0,0 +1,248 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 1, February 1989
|
||||
|
||||
Copyright (C) 1989 Free Software Foundation, Inc.
|
||||
675 Mass Ave, Cambridge, MA 02139, USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The license agreements of most software companies try to keep users
|
||||
at the mercy of those companies. By contrast, our General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. The
|
||||
General Public License applies to the Free Software Foundation's
|
||||
software and to any other program whose authors commit to using it.
|
||||
You can use it for your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Specifically, the General Public License is designed to make
|
||||
sure that you have the freedom to give away or sell copies of free
|
||||
software, that you receive source code or can get it if you want it,
|
||||
that you can change the software or use pieces of it in new free
|
||||
programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of a such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must tell them their rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any program or other work which
|
||||
contains a notice placed by the copyright holder saying it may be
|
||||
distributed under the terms of this General Public License. The
|
||||
"Program", below, refers to any such program or work, and a "work based
|
||||
on the Program" means either the Program or any work containing the
|
||||
Program or a portion of it, either verbatim or with modifications. Each
|
||||
licensee is addressed as "you".
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's source
|
||||
code as you receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice and
|
||||
disclaimer of warranty; keep intact all the notices that refer to this
|
||||
General Public License and to the absence of any warranty; and give any
|
||||
other recipients of the Program a copy of this General Public License
|
||||
along with the Program. You may charge a fee for the physical act of
|
||||
transferring a copy.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion of
|
||||
it, and copy and distribute such modifications under the terms of Paragraph
|
||||
1 above, provided that you also do the following:
|
||||
|
||||
a) cause the modified files to carry prominent notices stating that
|
||||
you changed the files and the date of any change; and
|
||||
|
||||
b) cause the whole of any work that you distribute or publish, that
|
||||
in whole or in part contains the Program or any part thereof, either
|
||||
with or without modifications, to be licensed at no charge to all
|
||||
third parties under the terms of this General Public License (except
|
||||
that you may choose to grant warranty protection to some or all
|
||||
third parties, at your option).
|
||||
|
||||
c) If the modified program normally reads commands interactively when
|
||||
run, you must cause it, when started running for such interactive use
|
||||
in the simplest and most usual way, to print or display an
|
||||
announcement including an appropriate copyright notice and a notice
|
||||
that there is no warranty (or else, saying that you provide a
|
||||
warranty) and that users may redistribute the program under these
|
||||
conditions, and telling the user how to view a copy of this General
|
||||
Public License.
|
||||
|
||||
d) You may charge a fee for the physical act of transferring a
|
||||
copy, and you may at your option offer warranty protection in
|
||||
exchange for a fee.
|
||||
|
||||
Mere aggregation of another independent work with the Program (or its
|
||||
derivative) on a volume of a storage or distribution medium does not bring
|
||||
the other work under the scope of these terms.
|
||||
|
||||
3. You may copy and distribute the Program (or a portion or derivative of
|
||||
it, under Paragraph 2) in object code or executable form under the terms of
|
||||
Paragraphs 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of
|
||||
Paragraphs 1 and 2 above; or,
|
||||
|
||||
b) accompany it with a written offer, valid for at least three
|
||||
years, to give any third party free (except for a nominal charge
|
||||
for the cost of distribution) a complete machine-readable copy of the
|
||||
corresponding source code, to be distributed under the terms of
|
||||
Paragraphs 1 and 2 above; or,
|
||||
|
||||
c) accompany it with the information you received as to where the
|
||||
corresponding source code may be obtained. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form alone.)
|
||||
|
||||
Source code for a work means the preferred form of the work for making
|
||||
modifications to it. For an executable file, complete source code means
|
||||
all the source code for all modules it contains; but, as a special
|
||||
exception, it need not include source code for modules which are standard
|
||||
libraries that accompany the operating system on which the executable
|
||||
file runs, or for standard header files or definitions files that
|
||||
accompany that operating system.
|
||||
|
||||
4. You may not copy, modify, sublicense, distribute or transfer the
|
||||
Program except as expressly provided under this General Public License.
|
||||
Any attempt otherwise to copy, modify, sublicense, distribute or transfer
|
||||
the Program is void, and will automatically terminate your rights to use
|
||||
the Program under this License. However, parties who have received
|
||||
copies, or rights to use copies, from you under this General Public
|
||||
License will not have their licenses terminated so long as such parties
|
||||
remain in full compliance.
|
||||
|
||||
5. By copying, distributing or modifying the Program (or any work based
|
||||
on the Program) you indicate your acceptance of this license to do so,
|
||||
and all its terms and conditions.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the original
|
||||
licensor to copy, distribute or modify the Program subject to these
|
||||
terms and conditions. You may not impose any further restrictions on the
|
||||
recipients' exercise of the rights granted herein.
|
||||
|
||||
7. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of the license which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
the license, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
8. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
Appendix: How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to humanity, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these
|
||||
terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest to
|
||||
attach them to the start of each source file to most effectively convey
|
||||
the exclusion of warranty; and each file should have at least the
|
||||
"copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) 19yy <name of author>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 1, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) 19xx name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the
|
||||
appropriate parts of the General Public License. Of course, the
|
||||
commands you use may be called something other than `show w' and `show
|
||||
c'; they could even be mouse-clicks or menu items--whatever suits your
|
||||
program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||
program `Gnomovision' (a program to direct compilers to make passes
|
||||
at assemblers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
21
MANIFEST
Normal file
21
MANIFEST
Normal file
@ -0,0 +1,21 @@
|
||||
COPYING
|
||||
MANIFEST
|
||||
Makefile.PL
|
||||
README
|
||||
README-TOO
|
||||
bin/binhex.pl
|
||||
bin/debinhex.pl
|
||||
docs/Convert/BinHex.pm.html
|
||||
docs/Convert/BinHex/hqxred.gif
|
||||
docs/Convert/BinHex/redapple-sm.gif
|
||||
docs/Convert/BinHex/redapple-tiny.gif
|
||||
docs/Convert/BinHex/redapple.gif
|
||||
lib/Convert/BinHex.pm
|
||||
t/Checker.pm
|
||||
t/comp2bin.t
|
||||
test/hexbin
|
||||
testin/eyeball.gif
|
||||
testin/eyeball.gif.hqx
|
||||
testin/hands_m.eps.hqx
|
||||
testin/pbs_mac.eps.hqx
|
||||
testout/README
|
20
Makefile.PL
Normal file
20
Makefile.PL
Normal file
@ -0,0 +1,20 @@
|
||||
#!/usr/bin/perl
|
||||
use ExtUtils::MakeMaker;
|
||||
|
||||
#------------------------------------------------------------
|
||||
# Makefile:
|
||||
#------------------------------------------------------------
|
||||
|
||||
# Write the Makefile:
|
||||
WriteMakefile(
|
||||
NAME => 'Convert::BinHex',
|
||||
VERSION_FROM => "./lib/Convert/BinHex.pm",
|
||||
DISTNAME => "Convert-BinHex",
|
||||
EXE_FILES => [@EXES],
|
||||
'dist' => {
|
||||
PREOP => "cd docs ; make",
|
||||
COMPRESS => 'gzip',
|
||||
SUFFIX => 'gz',
|
||||
}
|
||||
);
|
||||
|
93
README
Normal file
93
README
Normal file
@ -0,0 +1,93 @@
|
||||
NAME
|
||||
Convert::BinHex - extract data from Macintosh BinHex files
|
||||
|
||||
*ALPHA WARNING: this code is currently in its Alpha release. Things may
|
||||
change drastically until the interface is hammered out: if you have
|
||||
suggestions or objections, please speak up now!*
|
||||
|
||||
SYNOPSIS
|
||||
Simple functions:
|
||||
|
||||
use Convert::BinHex qw(binhex_crc macbinary_crc);
|
||||
|
||||
# Compute HQX7-style CRC for data, pumping in old CRC if desired:
|
||||
$crc = binhex_crc($data, $crc);
|
||||
|
||||
# Compute the MacBinary-II-style CRC for the data:
|
||||
$crc = macbinary_crc($data, $crc);
|
||||
|
||||
|
||||
Hex to bin, low-level interface. Conversion is actually done via an
|
||||
object (the section on "Convert::BinHex::Hex2Bin") which keeps internal
|
||||
conversion state:
|
||||
|
||||
# Create and use a "translator" object:
|
||||
my $H2B = Convert::BinHex->hex2bin; # get a converter object
|
||||
while (<STDIN>) {
|
||||
print $STDOUT $H2B->next($_); # convert some more input
|
||||
}
|
||||
print $STDOUT $H2B->done; # no more input: finish up
|
||||
|
||||
|
||||
Hex to bin, OO interface. The following operations *must* be done in the
|
||||
order shown!
|
||||
|
||||
# Read data in piecemeal:
|
||||
$HQX = Convert::BinHex->open(FH=>\*STDIN) || die "open: $!";
|
||||
$HQX->read_header; # read header info
|
||||
@data = $HQX->read_data; # read in all the data
|
||||
@rsrc = $HQX->read_resource; # read in all the resource
|
||||
|
||||
|
||||
Bin to hex, low-level interface. Conversion is actually done via an
|
||||
object (the section on "Convert::BinHex::Bin2Hex") which keeps internal
|
||||
conversion state:
|
||||
|
||||
# Create and use a "translator" object:
|
||||
my $B2H = Convert::BinHex->bin2hex; # get a converter object
|
||||
while (<STDIN>) {
|
||||
print $STDOUT $B2H->next($_); # convert some more input
|
||||
}
|
||||
print $STDOUT $B2H->done; # no more input: finish up
|
||||
|
||||
|
||||
Bin to hex, file interface. Yes, you can convert *to* BinHex as well as
|
||||
from it!
|
||||
|
||||
# Create new, empty object:
|
||||
my $HQX = Convert::BinHex->new;
|
||||
|
||||
# Set header attributes:
|
||||
$HQX->filename("logo.gif");
|
||||
$HQX->type("GIFA");
|
||||
$HQX->creator("CNVS");
|
||||
|
||||
# Give it the data and resource forks (either can be absent):
|
||||
$HQX->data(Path => "/path/to/data"); # here, data is on disk
|
||||
$HQX->resource(Data => $resourcefork); # here, resource is in core
|
||||
|
||||
# Output as a BinHex stream, complete with leading comment:
|
||||
$HQX->encode(\*STDOUT);
|
||||
|
||||
|
||||
PLANNED!!!! Bin to hex, "CAP" interface. *Thanks to Ken Lunde for
|
||||
suggesting this*.
|
||||
|
||||
# Create new, empty object from CAP tree:
|
||||
my $HQX = Convert::BinHex->from_cap("/path/to/root/file");
|
||||
$HQX->encode(\*STDOUT);
|
||||
|
||||
|
||||
DESCRIPTION
|
||||
BinHex is a format used by Macintosh for transporting Mac files safely
|
||||
through electronic mail, as short-lined, 7-bit, semi-compressed data
|
||||
streams. Ths module provides a means of converting those data streams
|
||||
back into into binary data.
|
||||
|
||||
CHANGES
|
||||
Version 1.118
|
||||
|
||||
Ready to go public (with Paul's version, patched for native Mac
|
||||
support)! Warnings have been suppressed in a few places where undefined
|
||||
values appear.
|
||||
|
13
README-TOO
Normal file
13
README-TOO
Normal file
@ -0,0 +1,13 @@
|
||||
|
||||
In this toolkit are the modules:
|
||||
|
||||
Convert::BinHex (in ./lib)
|
||||
|
||||
And the sample programs:
|
||||
|
||||
binhex.pl (in ./bin)
|
||||
debinhex.pl (in ./bin)
|
||||
|
||||
Knock yourself out.
|
||||
|
||||
|
169
bin/binhex.pl
Normal file
169
bin/binhex.pl
Normal file
@ -0,0 +1,169 @@
|
||||
#!/usr/bin/perl -w
|
||||
|
||||
|
||||
=head1 NAME
|
||||
|
||||
binhex.pl - use Convert::BinHex to encode files as BinHex
|
||||
|
||||
|
||||
=head1 USAGE
|
||||
|
||||
Usage:
|
||||
|
||||
binhex.pl [options] file ... file
|
||||
|
||||
Where the options are:
|
||||
|
||||
-o dir Output in given directory (default outputs in file's directory)
|
||||
-v Verbose output (normally just one line per file is shown)
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Each file is converted to file.hqx.
|
||||
|
||||
|
||||
=head1 WARNINGS
|
||||
|
||||
Largely untested.
|
||||
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Paul J. Schinder (NASA/GSFC) mostly, though Eryq can't seem to keep
|
||||
his grubby paws off anything...
|
||||
|
||||
|
||||
=cut
|
||||
|
||||
use lib "./lib";
|
||||
|
||||
use Getopt::Std;
|
||||
use Convert::BinHex;
|
||||
use POSIX;
|
||||
use Fcntl;
|
||||
use File::Basename;
|
||||
use Carp;
|
||||
require Mac::Files if (($^O||'') eq "MacOS");
|
||||
|
||||
use strict;
|
||||
use vars qw(
|
||||
$opt_o
|
||||
$opt_v
|
||||
);
|
||||
|
||||
my $DEBUG = 0;
|
||||
|
||||
#------------------------------------------------------------
|
||||
# main
|
||||
#------------------------------------------------------------
|
||||
sub main {
|
||||
|
||||
# What usage?
|
||||
@ARGV or usage();
|
||||
getopts('o:v');
|
||||
$DEBUG = $opt_v;
|
||||
|
||||
# Process files:
|
||||
my $file;
|
||||
foreach $file (@ARGV) {
|
||||
binhex($file);
|
||||
}
|
||||
}
|
||||
exit(&main ? 0 : -1);
|
||||
|
||||
#------------------------------------------------------------
|
||||
# usage
|
||||
#------------------------------------------------------------
|
||||
# Get usage from me.
|
||||
|
||||
sub usage {
|
||||
my $msg = shift || '';
|
||||
my $usage = '';
|
||||
if (open(USAGE, "<$0")) {
|
||||
while ($_ = <USAGE> and !/^=head1 USAGE/) {};
|
||||
while ($_ = <USAGE> and !/^=head1/) {$usage .= $_};
|
||||
close USAGE;
|
||||
}
|
||||
else {
|
||||
$usage = "Usage unavailable; please see the script itself.";
|
||||
}
|
||||
print STDERR "\n$msg$usage";
|
||||
exit -1;
|
||||
}
|
||||
|
||||
#------------------------------------------------------------
|
||||
# binhex FILE
|
||||
#------------------------------------------------------------
|
||||
# Encode the given FILE.
|
||||
#
|
||||
sub binhex {
|
||||
my $inpath = shift || die "No filename given $!";
|
||||
local *BHEX;
|
||||
my ($has, $dlength, $rlength, $finfo, $flags);
|
||||
|
||||
# Create new BinHex interface:
|
||||
my $hqx = Convert::BinHex->new;
|
||||
|
||||
# Get input directory/filename:
|
||||
my ($inname, $indir) = fileparse($inpath);
|
||||
die "filename $inname too long!" if ((length($inname)+4) > 31);
|
||||
$hqx->filename($inname);
|
||||
|
||||
# Set up output directory/filename:
|
||||
my $outname = "$inname.hqx";
|
||||
my $outdir = $opt_o || $indir;
|
||||
my $outpath = "$outdir/$outname"; $outpath =~ s{/+}{/}g;
|
||||
|
||||
# If we're on a Mac, we can get the real resource info:
|
||||
if ($^O||'' eq "MacOS") {
|
||||
|
||||
# Get and set up type, creator, flags:
|
||||
$has = Mac::Files::FSpGetCatInfo($inpath);
|
||||
$finfo = $has->{ioFlFndrInfo};
|
||||
$dlength = $has->{ioFlLgLen};
|
||||
$rlength = $has->{ioFlRLgLen};
|
||||
$hqx->type($finfo->{fdType});
|
||||
$hqx->creator($finfo->{fdCreator});
|
||||
$hqx->flags($finfo->{fdFlags} & 0xfeff); # turn off inited bit
|
||||
|
||||
# Set up data fork:
|
||||
$hqx->data(Path=>$inpath);
|
||||
$hqx->data->length($dlength);
|
||||
|
||||
# Set up resource fork:
|
||||
$hqx->resource(Path=>$inpath, Fork => "RSRC");
|
||||
$hqx->resource->length($rlength);
|
||||
}
|
||||
else { # not a Mac: fake it...
|
||||
# Set up data fork:
|
||||
$hqx->data(Path => $inpath);
|
||||
$dlength = (-s $inpath);
|
||||
|
||||
# Set up resource fork:
|
||||
if (-e "$inpath.rsrc") {
|
||||
$hqx->resource(Path => "$inpath.rsrc");
|
||||
$rlength = (-s "$inpath.rsrc");
|
||||
}
|
||||
else {
|
||||
$hqx->resource(Data => '');
|
||||
$rlength = 0;
|
||||
}
|
||||
}
|
||||
|
||||
# Ready!
|
||||
print "BinHexing: $inpath\n";
|
||||
if ($DEBUG) {
|
||||
print " Resource size: $rlength\n" if defined($rlength);
|
||||
print " Data size: $dlength\n" if defined($dlength);
|
||||
}
|
||||
open BHEX, ">$outpath" or croak("Unable to open $outpath");
|
||||
$hqx->encode(\*BHEX);
|
||||
close BHEX;
|
||||
print "Wrote: $outpath\n";
|
||||
}
|
||||
#------------------------------------------------------------
|
||||
1;
|
||||
|
||||
|
||||
|
||||
|
211
bin/debinhex.pl
Normal file
211
bin/debinhex.pl
Normal file
@ -0,0 +1,211 @@
|
||||
#!/usr/bin/perl -w
|
||||
|
||||
|
||||
=head1 NAME
|
||||
|
||||
debinhex.pl - use Convert::BinHex to decode BinHex files
|
||||
|
||||
|
||||
=head1 USAGE
|
||||
|
||||
Usage:
|
||||
|
||||
debinhex.pl [options] file ... file
|
||||
|
||||
Where the options are:
|
||||
|
||||
-o dir Output in given directory (default outputs in file's directory)
|
||||
-v Verbose output (normally just one line per file is shown)
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Each file is expected to be a BinHex file. By default, the output file is
|
||||
given the name that the BinHex file dictates, regardless of the name of
|
||||
the BinHex file.
|
||||
|
||||
|
||||
=head1 WARNINGS
|
||||
|
||||
Largely untested.
|
||||
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Paul J. Schinder (NASA/GSFC) mostly, though Eryq can't seem to keep
|
||||
his grubby paws off anything...
|
||||
|
||||
|
||||
=cut
|
||||
|
||||
use lib "./lib";
|
||||
|
||||
use Getopt::Std;
|
||||
use Convert::BinHex;
|
||||
use POSIX;
|
||||
use Fcntl;
|
||||
use File::Basename;
|
||||
use Carp;
|
||||
require Mac::Files if ($^O||'' eq "MacOS");
|
||||
|
||||
use strict;
|
||||
use vars qw(
|
||||
$opt_o
|
||||
$opt_v
|
||||
);
|
||||
|
||||
my $DEBUG = 0;
|
||||
|
||||
#------------------------------------------------------------
|
||||
# main
|
||||
#------------------------------------------------------------
|
||||
sub main {
|
||||
|
||||
# What usage?
|
||||
@ARGV or usage();
|
||||
getopts('o:v');
|
||||
$DEBUG = $opt_v;
|
||||
|
||||
# Process files:
|
||||
my $file;
|
||||
foreach $file (@ARGV) {
|
||||
debinhex($file);
|
||||
}
|
||||
}
|
||||
exit(&main ? 0 : -1);
|
||||
|
||||
#------------------------------------------------------------
|
||||
# usage
|
||||
#------------------------------------------------------------
|
||||
# Get usage from me.
|
||||
|
||||
sub usage {
|
||||
my $msg = shift || '';
|
||||
my $usage = '';
|
||||
if (open(USAGE, "<$0")) {
|
||||
while ($_ = <USAGE> and !/^=head1 USAGE/) {};
|
||||
while ($_ = <USAGE> and !/^=head1/) {$usage .= $_};
|
||||
close USAGE;
|
||||
}
|
||||
else {
|
||||
$usage = "Usage unavailable; please see the script itself.";
|
||||
}
|
||||
print STDERR "\n$msg$usage";
|
||||
exit -1;
|
||||
}
|
||||
|
||||
#------------------------------------------------------------
|
||||
# debinhex FILE
|
||||
#------------------------------------------------------------
|
||||
# Decode the given FILE.
|
||||
#
|
||||
sub debinhex {
|
||||
my $inpath = shift || croak("No filename given $!");
|
||||
local *BHEX;
|
||||
my ($data, $testlength, $length, $fd);
|
||||
|
||||
print "DeBinHexing: $inpath\n";
|
||||
|
||||
# Open BinHex file:
|
||||
open(BHEX,"<$inpath") || croak("Unable to open $inpath: $!");
|
||||
|
||||
# Create converter interface on stream:
|
||||
my $hqx = Convert::BinHex->open(FH => \*BHEX);
|
||||
|
||||
# Read header, and output as string if debugging:
|
||||
$hqx->read_header;
|
||||
print $hqx->header_as_string if $DEBUG;
|
||||
|
||||
# Get output directory/filename:
|
||||
my ($inname, $indir) = fileparse($inpath);
|
||||
my $outname = $hqx->filename || 'NONAME';
|
||||
my $outdir = $opt_o || $indir;
|
||||
my $outpath = "$outdir/$outname"; $outpath =~ s{/+}{/}g;
|
||||
|
||||
# Create Mac file:
|
||||
if ($^O||'' eq "MacOS") {
|
||||
Mac::Files::FSpCreate($outpath, $hqx->creator, $hqx->type)
|
||||
or croak("Unable to create Mac file $outpath");
|
||||
}
|
||||
|
||||
# Get lengths of forks:
|
||||
my $dlength = $hqx->data_length;
|
||||
my $rlength = $hqx->resource_length;
|
||||
|
||||
# Write data fork:
|
||||
print "Writing: $outpath\n";
|
||||
$fd = POSIX::open($outpath, (&POSIX::O_WRONLY | &POSIX::O_CREAT), 0755);
|
||||
$testlength = 0;
|
||||
while (defined($data = $hqx->read_data)) {
|
||||
$length = length($data);
|
||||
POSIX::write($fd, $data, $length)
|
||||
or croak("couldn't write $length bytes: $!");
|
||||
$testlength += $length;
|
||||
}
|
||||
POSIX::close($fd) or croak "Unable to close $outpath";
|
||||
croak("Data fork length mismatch: ".
|
||||
"expected $dlength, wrote $testlength")
|
||||
if $dlength != $testlength;
|
||||
|
||||
# Write resource fork?
|
||||
if ($rlength) {
|
||||
|
||||
# Determine how to open fork file appropriately:
|
||||
my ($rpath, $rflags);
|
||||
if (($^O||'') eq "MacOS") {
|
||||
$rpath = $outpath;
|
||||
$rflags = (&POSIX::O_WRONLY | &POSIX::O_CREAT | &Fcntl::O_RSRC);
|
||||
}
|
||||
else {
|
||||
$rpath = "$outpath.rsrc";
|
||||
$rflags = (&POSIX::O_WRONLY | &POSIX::O_CREAT);
|
||||
}
|
||||
|
||||
# Write resource fork...
|
||||
$fd = POSIX::open($rpath, $rflags, 0755);
|
||||
$testlength = 0;
|
||||
while (defined($data = $hqx->read_resource)) {
|
||||
$length = length($data);
|
||||
POSIX::write($fd,$data,$length)
|
||||
or croak "Couldn't write $length bytes: $!";
|
||||
$testlength += $length;
|
||||
}
|
||||
POSIX::close($fd) or croak "Unable to close $rpath";
|
||||
croak("Resource fork length mismatch: ".
|
||||
"expected $rlength, wrote $testlength")
|
||||
if $testlength != $rlength;
|
||||
}
|
||||
|
||||
# Set Mac attributes:
|
||||
if (($^O||'') eq "MacOS") {
|
||||
my $has = Mac::Files::FSpGetCatInfo($outpath);
|
||||
my $finfo = $has->{ioFlFndrInfo};
|
||||
$finfo->{fdFlags} = $hqx->flags & 0xfeff; #turn off inited bit
|
||||
$finfo->{fdType} = $hqx->type || "????";
|
||||
$finfo->{fdCreator} = $hqx->creator || "????";
|
||||
|
||||
# Turn on the bundle bit if it's an application:
|
||||
### $finfo->{fdFlags} |= 0x2000 if $finfo->{fdType} eq "APPL";
|
||||
|
||||
if ($DEBUG) {
|
||||
printf("%x\n",$finfo->{fdFlags});
|
||||
printf("%s\n",$finfo->{fdType});
|
||||
printf("%s\n",$finfo->{fdCreator});
|
||||
}
|
||||
$has->{ioFlFndrInfo} = $finfo;
|
||||
Mac::Files::FSpSetCatInfo($outpath, $has)
|
||||
or croak "Unable to set catalog info $^E";
|
||||
if ($DEBUG) {
|
||||
$has = Mac::Files::FSpGetCatInfo ($outpath);
|
||||
printf("%x\n",$has->{ioFlFndrInfo}->{fdFlags});
|
||||
printf("%s\n",$has->{ioFlFndrInfo}->{fdType});
|
||||
printf("%s\n",$has->{ioFlFndrInfo}->{fdCreator});
|
||||
}
|
||||
}
|
||||
1;
|
||||
}
|
||||
|
||||
#------------------------------------------------------------
|
||||
1;
|
||||
|
||||
|
||||
|
1059
docs/Convert/BinHex.pm.html
Normal file
1059
docs/Convert/BinHex.pm.html
Normal file
File diff suppressed because it is too large
Load Diff
BIN
docs/Convert/BinHex/hqxred.gif
Normal file
BIN
docs/Convert/BinHex/hqxred.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.4 KiB |
BIN
docs/Convert/BinHex/redapple-sm.gif
Normal file
BIN
docs/Convert/BinHex/redapple-sm.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 149 B |
BIN
docs/Convert/BinHex/redapple-tiny.gif
Normal file
BIN
docs/Convert/BinHex/redapple-tiny.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 82 B |
BIN
docs/Convert/BinHex/redapple.gif
Normal file
BIN
docs/Convert/BinHex/redapple.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 982 B |
1741
lib/Convert/BinHex.pm
Normal file
1741
lib/Convert/BinHex.pm
Normal file
File diff suppressed because it is too large
Load Diff
33
t/Checker.pm
Normal file
33
t/Checker.pm
Normal file
@ -0,0 +1,33 @@
|
||||
package Checker;
|
||||
|
||||
@ISA = qw(Exporter);
|
||||
@EXPORT = qw($CHECK okay_if note check filter_warnings);
|
||||
|
||||
$Checker::OUTPUT = 1;
|
||||
$Checker::CHECK = 0;
|
||||
|
||||
# Only lets through warnings that originate outside our toolkit:
|
||||
sub filter_warnings {
|
||||
$SIG{'__WARN__'} = sub {
|
||||
print STDERR $_[0] if ($_[0] !~ /^MIME:/);
|
||||
};
|
||||
}
|
||||
|
||||
sub okay_if {
|
||||
print( ($_[0] ? "ok\n" : "not ok\n"))
|
||||
}
|
||||
|
||||
sub note {
|
||||
print STDOUT " ## ", @_, "\n" if $OUTPUT;
|
||||
}
|
||||
|
||||
sub check {
|
||||
++$CHECK;
|
||||
my ($ok, $note) = @_;
|
||||
$note = ($note ? ": $note" : '');
|
||||
my $stat = ($ok ? 'OK ' : 'ERR');
|
||||
printf STDOUT " Test %2d$note\n", $CHECK if $OUTPUT;
|
||||
print(($ok ? "ok $CHECK\n" : "not ok $CHECK\n"));
|
||||
}
|
||||
1;
|
||||
|
85
t/comp2bin.t
Normal file
85
t/comp2bin.t
Normal file
@ -0,0 +1,85 @@
|
||||
use lib "./blib/lib", "./lib", "./t";
|
||||
|
||||
use Checker;
|
||||
use Convert::BinHex;
|
||||
|
||||
%TEST = (
|
||||
PIVOT_3 => {
|
||||
COMP => ["90 00 01 02 03 04 00",
|
||||
"90 00 03"],
|
||||
BIN => "90 01 02 03 04 00 90 03",
|
||||
},
|
||||
PIVOT_2 => {
|
||||
COMP => ["90 00 01 02 03 04 00 90",
|
||||
"00 03"],
|
||||
BIN => "90 01 02 03 04 00 90 03",
|
||||
},
|
||||
PIVOT_1 => {
|
||||
COMP => ["90 00 01 02 03 04 00 90 00",
|
||||
"03"],
|
||||
BIN => "90 01 02 03 04 00 90 03",
|
||||
},
|
||||
CHOPPY => {
|
||||
COMP => ["90",
|
||||
"00",
|
||||
"01 02 03 04",
|
||||
"00",
|
||||
"90",
|
||||
"00",
|
||||
"03"],
|
||||
BIN => "90 01 02 03 04 00 90 03",
|
||||
},
|
||||
FOUR_FIVES => {
|
||||
COMP => ["01 02 03 04 05 90 04"],
|
||||
BIN => "01 02 03 04 05 05 05 05",
|
||||
},
|
||||
FOUR_FIVES_AND_A_SIX => {
|
||||
COMP => ["01 02 03 04 05 90 04 06"],
|
||||
BIN => "01 02 03 04 05 05 05 05 06",
|
||||
},
|
||||
FOUR_MARKS => {
|
||||
COMP => ["01 02 03 04 90 00 90 04"],
|
||||
BIN => "01 02 03 04 90 90 90 90",
|
||||
},
|
||||
FOUR_MARKS_AND_A_SIX => {
|
||||
COMP => ["01 02 03 04 90 00 90 04 06"],
|
||||
BIN => "01 02 03 04 90 90 90 90 06",
|
||||
},
|
||||
FIVE_ONES_AND_TWOS => {
|
||||
COMP => ["01 90 05 02 90 05"],
|
||||
BIN => "01 01 01 01 01 02 02 02 02 02",
|
||||
},
|
||||
);
|
||||
|
||||
sub str2hex {
|
||||
my $str = shift;
|
||||
eval '"\x' . join('\x', split(/\s+/,$str)) . '"';
|
||||
}
|
||||
|
||||
#------------------------------------------------------------
|
||||
# BEGIN
|
||||
#------------------------------------------------------------
|
||||
print "1..9\n";
|
||||
my $TESTKEY;
|
||||
foreach $TESTKEY (sort keys %TEST) {
|
||||
my $test = $TEST{$TESTKEY};
|
||||
my @comps = map { str2hex($_) } @{$test->{COMP}};
|
||||
my $bin = str2hex($test->{BIN});
|
||||
|
||||
my $comp;
|
||||
my $rbin = '';
|
||||
my $H2B = Convert::BinHex->hex2bin;
|
||||
foreach $comp (@comps) {
|
||||
$rbin .= $H2B->comp2bin_next($comp);
|
||||
}
|
||||
check(($rbin eq $bin), "test $TESTKEY");
|
||||
}
|
||||
1;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
81
test/hexbin
Normal file
81
test/hexbin
Normal file
@ -0,0 +1,81 @@
|
||||
#!/usr/bin/perl
|
||||
use lib "./lib";
|
||||
use Convert::BinHex;
|
||||
use Getopt::Std;
|
||||
|
||||
my $bytes;
|
||||
|
||||
@ARGV or usage();
|
||||
|
||||
|
||||
# Get options:
|
||||
getopts("vhn:o:");
|
||||
my $dir = $opt_o ||= ".";
|
||||
|
||||
# Process files:
|
||||
my $infile;
|
||||
my $nfiles = int(@ARGV);
|
||||
my $file_i = 0;
|
||||
foreach $infile (@ARGV) {
|
||||
++$file_i;
|
||||
|
||||
# Read header:
|
||||
print STDERR "\nReading $infile\n";
|
||||
my $HQX = Convert::BinHex->open(Expr=>"<$infile")
|
||||
|| die "open $ARGV[0]: ";
|
||||
|
||||
$HQX->read_header;
|
||||
print STDERR $HQX->header_as_string if ($opt_v or $opt_h);
|
||||
next if $opt_h;
|
||||
|
||||
# Get output filename:
|
||||
my $name;
|
||||
if ($opt_n) {
|
||||
$name = $opt_n . (($nfiles > 1) ? "-$file_i" : '');
|
||||
}
|
||||
else {
|
||||
($name = $HQX->filename) =~ s/[^A-Za-z0-9_\.-]/_/g;
|
||||
}
|
||||
my $fname;
|
||||
|
||||
# Output data fork:
|
||||
$fname = "$dir/$name";
|
||||
print STDERR "Writing $fname (data fork)\n";
|
||||
printf STDERR "Expecting: %6d bytes\n", $HQX->data_length if $opt_v;
|
||||
open DATA, ">$fname" or die "open $fname: $!";
|
||||
while ($bytes = $HQX->read_data) {
|
||||
print DATA $bytes;
|
||||
}
|
||||
close DATA;
|
||||
printf STDERR "Wrote: %6d bytes\n", (-s $fname) if $opt_v;
|
||||
|
||||
# Output resource fork:
|
||||
$fname = "$dir/$name.rsrc";
|
||||
print STDERR "Writing $fname (resource fork)\n";
|
||||
printf STDERR "Expecting: %6d bytes\n", $HQX->resource_length if $opt_v;
|
||||
open RESOURCE, ">$fname" or die "open $fname: $!";
|
||||
while ($bytes = $HQX->read_resource) {
|
||||
print RESOURCE $bytes;
|
||||
}
|
||||
close RESOURCE;
|
||||
printf STDERR "Wrote: %6d bytes\n", (-s $fname) if $opt_v;
|
||||
1;
|
||||
}
|
||||
exit(0);
|
||||
|
||||
sub usage {
|
||||
print STDERR <<EOF;
|
||||
|
||||
Usage: hexbin [opts] [-] file.hqx
|
||||
-h output header information only; don't convert
|
||||
-n name name output files (default taken from .hqx)
|
||||
-o dir output directory
|
||||
-v verbose output
|
||||
|
||||
EOF
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
|
||||
__END__
|
||||
1;
|
BIN
testin/eyeball.gif
Normal file
BIN
testin/eyeball.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.7 KiB |
60
testin/eyeball.gif.hqx
Normal file
60
testin/eyeball.gif.hqx
Normal file
@ -0,0 +1,60 @@
|
||||
(This file must be converted with BinHex 4.0)
|
||||
:#f9jC@*KE'`ZCfPQ!$mr2cmr2cmr!!!!!!V$!!!!!'Q'4dP'1$PK2!!k!2Ir!!J
|
||||
)#"!3%"JB'#%K)5NT+6%a-6Nj18*#3NT+5P*58PTD@Q0MBh0cFi5%K)b-M*58P*b
|
||||
FR+@PTDfYVE@eYEfp[FE'aXl1cYE@eYlHhZIRjqr[lrIhpml'aVfeYDfPTE@YVFD
|
||||
p[C5-M*b8P+@FR,fYVFDeYFkp[E@PT@0D@UfFR*b-M+@8P%T#3T5%K)alHi4cFlf
|
||||
PTFDYVAYVDl@FR+f8P*b%K)acFkf-M"J3%'0#3PSj13J!!%)3#$N)!'-j-9)T)8)
|
||||
B%'Y+3PSj-9)a+@0#1BacDi4VBh0D8QY55Q0+3NSB#%)3!(YM@PSa)8)B#$N3!&)
|
||||
T'%SK%+@8M)alFi4cDfYD8N)a+9Sj+9)a)8SB!*b-K(YVBf0#-8ST'*5%Hh0M@M%
|
||||
K'%)B!(0D5PSa'&)T%%SK#&T#-9)K!'Y+-9)a'&Sa%&)T#%SK!-DpYD@FP-DeTBa
|
||||
lDh0D3N)a)5%3!0E1aV@YTCb8M*5-K*b-Hh0M8RYM5QY51@Y++4J3#'0#)9Sj'&)
|
||||
a%%ST#&Sa#"!)!&)T!-l'[DfPR)b%Hf0#'&)a#%ST!&Sa!)alBhYM3R0D1@Y5-@0
|
||||
++6NK!)4c@Q0#%&Sj#&)a!(YV8QY5+@0+)6%K#%)T!-DpV@0##&Sj!,feTCb8K(0
|
||||
M3QYD1@0+'&T#%"J3!'0#!,@YR)b%Ff0+%&)j!'Y+!%)a#&T##'0+#$NT!&T#!'0
|
||||
+!-l1aYE@cUfYTFE'[EfpVFE'YFE'V8*#1F$!`"JB%!J)!2IrcZrhaZI[aYEHYGl
|
||||
R[GEH[FE1YFE1[FlH[FE1aXl@cVh'[Eh1[FE1cXl@eYEHhV@p[D@YVDfeYEh'aJJ
|
||||
3%-E'cXl1eYE@hU@PVEfpaTbFT@YVFd*#5L%K+3J)%!!!#,@YYFDpaTb8R+@FTDf
|
||||
FTBalK0l1eVfYYCb-P*5%M-De[E@FTC4lK,fPVCb%M-DYYDf8R+@-P)acHlfFTCa
|
||||
lK0De[E@8R+f-P+@%M*4cHjacH`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#(
|
||||
j"!%!!,N!,!!!!!!m!$S!3!Mr!(-*(%L`S-'$#"-UA'K3@#`+%#05k$#K)S8*+6S
|
||||
`LkK4BX5+(BEpBQM3ei8+&6J8Xf#KJS9N&U69F,+%$5'EP3K9@P3TCmj!DB3NfI,
|
||||
K)i86*M4X`)$5JX)flbadH`H$TB8,4fSUkS5)MaJMM&!Bb"B!`,fcD$@9J[@U9#G
|
||||
"DFcSH$&"JPd*&LP81'D`Pbb8,PeD80D"6"LGR9ja3L8+$$3!CY%#%%$J3))YN[3
|
||||
m3N3TCjJd%#+%MQ#hiS4K#BpGR0F"F0-+4(VBY,RS9DIETA,ElT56c4Nf6iK%%!d
|
||||
"`S2L%%E!Dc15j%"KYNUE6X(1Y1N2cZj+L&"M"2)(i--rrlK&c,RjmqM6+r6PN!!
|
||||
#-q[XES#cEV%3-Q(U%`Vl#k*$ZK-cb$1$AUiP8md%(S```L`6!#C4"aq-!i)b'@4
|
||||
`!3JIa!)-54Dm8i*9)&T`a4+%P(KE*k@dY4BX+DD)@bH8T%(%&Lf-F*&THV@%NLd
|
||||
(!I15B&CGS!@*PA3bb59-i1''!``N8)!!NCd&J$B"##!++Ue``PXPCI$JJM2$h@@
|
||||
4,$dqj&T,9iRaa%f,,))LLVQPiXUFUi`LbL@BB1,(**5``BBL5b"K$33Ke+21D#1
|
||||
X`0G#`K6b`3359D!A40&8%%%H6C5aa+C2E+S%&NH))%%c%B``U('S(JF"-[N9j-X
|
||||
YY86r3)iphT4U$A()H4111`mii%#[j2(5DRkm!21,--JLqiX[`kEA#c+&8%6IHar
|
||||
--d&(N!"#HU0Tpc8l8!9[M$0T"Fpip+#jk,i'85ciS@F-B"`%9N'P&8K633XMpV"
|
||||
%'&RiQF@q5`#"K!J892-4#HE%%im''$`6#fS,pA,55L&He8)2BILQL*YZk3E,EDq
|
||||
mdP-89b$aJKhC6[$""a9FJ-&*&8"m%$)@R,01a4a!FGJCP9$b"b*kSJ*)*U3--XJ
|
||||
FND55fjZGU&(b&Lj8p%&T%XR55emR9Ab""dli9XQ4NRaLbJJ0+'$!!&'LG8mQ,,E
|
||||
955*4G2%$"(9*Tke6VVB8,jTAUIq`K#)pF5,+)ie8JB!""%!T@C8%&)",()pJ-NT
|
||||
RPE#aK![E4G#-G"6%FY!`VM9P`646p(!')4bhU-J1DQmc'3%Xj*(C(RkS8ERP@a!
|
||||
hR!Gh8G"F3j+#3-%i+('3!-`&TII,"XFSU[J+LbQbdJSPEFkfK!bL2H!0F[#S)m%
|
||||
`c#SdM#hc325-T2"'3i@QIZS%H%q9pfCj'9Z3!2UGFDT'X-Q'jSf29ei3k8!!0d+
|
||||
"FMeM)qqabh#'8aca(1F"qfY@-)B4*JR3SahDdFi#Ki11FMJ32,83aY@mT4"J%+-
|
||||
@Yh#JVa`3$Nr8BPNNM+%-[G@,B`f$$K3S"J8q8"h9&+)3b!VI$2m4!JaKd-)d'U%
|
||||
)0fl!M@YPDeX6q+%`K$A%Aa6L)PLX#$1N0B%E3+SM4S')DH`c`QBe#Pe'Z4B"d4J
|
||||
4P)La'1e5Md0S))m6N!"!A##3!"5kRQ'`FV'4!PHj3%XQ%)[I1HFA1TbADrV6M4`
|
||||
pB`9-i!)8SK!'*84"4PZ`N4il`!iDd-"$#S["$$U!0j)-)aBZJ8NbM"H[BLM$%$l
|
||||
SP%d8`3DIh)33DiME%'5J,@e9B"hLf)!',%!"@I"2)F+`!!HL`4,"Z13#F0"AqhE
|
||||
bTK5jL5H%)!-@F[!&&a4PLmbB36SZS!%,&G13!!hC@m@8N3)HC)`f)@[,mjD@Qe+
|
||||
d+4&U%-)A@Z$r"ShJU'8R+DB3#r+,#m#!P#&D4K'Hd,lEF')8R'M&LZUT#VDia6C
|
||||
U`%)5U1!#$p#(3"!TC8''-B-C[!1K,&Q'#KLUNd3JiK+KF-3MV+!iY3&!%@aT(L8
|
||||
!8E)UM'!#fIPI4#b!cPcdJJiJB!N(eZ%5CA"J$,9F"#8`!3SiI1)16AT5fXibL1C
|
||||
C%bir3%)'rbQcJIL#+4@EKK4USK-eS%%58UL$04U`J,0Yp4lEk%0%1I'aR*!!!3J
|
||||
K'"A[rJFT-K&8Q6!"d6,`3#3MBD)4M$M&044`!!,SBKZ,%m!!#)#*5iK#SMbah"6
|
||||
!4"V#6X#`"1P&5f!#T!ZNS#CR3"&M,J'*![m-S+C5#J!"$)!0&&J#&(a!K#!)FBB
|
||||
XP1%1T)V!B2(5ZB2m"6"mZd!3`Y#6jN@8%P[GaHX1J!*'5%)-Pd!&0TH3!!4U&'F
|
||||
iQf-ZUp*j*X&dS!`i58aLeP+*1E"15ML3!--M("'(28"#$BNS84LL)!))L+$!&Ba
|
||||
L'3Z55!+jT"M5k!!Pi`Xb&,&)&4KZ"5`Q-BP4m+NhBB##UL"J"h4d6adA[%9#MJU
|
||||
4Fj`!*C9Lb4&NJj-LYDKj(h2,E5T"bb`m!3Qi8Y8)[&%$$k`h)Ek)4E8JNNIS9N!
|
||||
-'*XPkYSNXNkdU83h#81J'0K!j)3'(M`Lb6(DS5d+J+"FChD*)B+JK(hp"U$,0f'
|
||||
$PXX3""'!k4[hHb!%E"&(NKJ44fKdi`Lmm!)M')%+Ki#!"*a"fY"dqB(J%FC!cA1
|
||||
-k&KR0Bpk$aIaFKF2I'1"$G3cH$C4RQ&"4cX)SSGT1+h"iG4!"D&fS+4Pf![SN!!
|
||||
$([$ScRDDiB%0%NF%p3M""i94e"R@fKDQJ,@AmGFV&pMJ9l8J"M%@2%5&p1,D[[!
|
||||
&-)$KLfY6ZpVJ9Np!!!!lGXX!!!!!:
|
1521
testin/hands_m.eps.hqx
Normal file
1521
testin/hands_m.eps.hqx
Normal file
File diff suppressed because it is too large
Load Diff
208
testin/pbs_mac.eps.hqx
Normal file
208
testin/pbs_mac.eps.hqx
Normal file
@ -0,0 +1,208 @@
|
||||
(This file must be converted with BinHex 4.0)
|
||||
|
||||
:#e"#8epYB@-ZCA"c!%938dC"8P4C!!!!!"cF!!!*Ma+D*5&38be"C'pLC5db,M!
|
||||
J49"64Lda,M)0*59$FQ9KG'pb1N&NEf*P)%PXE(9cG(*KG'pb+&40+5!a,M%0*59
|
||||
'Eh)k)#K$Efe`GA4PFL"6CA*fD@0PFbNJ+&"#8bN0*598DA4XC6SJ+&"#8b"XEfG
|
||||
[,QeKBbN0*59$FQ9KG'P[EN4KG'8k)#Ja-5ma-bmj0LNJ+$3k-6)J8%dT$58P4'p
|
||||
MG@ePER43FQpMCA0c3fpXEh*c1L"#E'&MD`dP*84[Bh9YC@jd8(*[Be0PG(-k)%&
|
||||
NEf*PAdPXE(9cG(*KG'pbAc%Z-5!`)$!0*59%Ef0eE@9ZG&0eF("XD@9N8(*[Be0
|
||||
PG(-k)%&NEf*PAdPXE(9cG(*KG'pbAc%Z-5!`)$!0*59#Eh9ZC'PZCd*[H$Sb0$F
|
||||
J-cFd)$-`05!d0$F0*59$Efa[FP9cB@GP1L"#E'&MDbCAD'PdC3dP*94PEA"XBA4
|
||||
P3Qpi1M)i1#!c0M!J-MJi)$-f-!dP*94TE'9#EhJk)$%b)#dc)$8f0#!h-M80*59
|
||||
%Ef0eE@9ZG&"bCACTCAFk)%eKBfPZG'pcD&p3D@-0*59&EQ4$EfeYC@jdF`dP*8*
|
||||
PCfPZ8(*[Be0PG$T"C'pLC9p*E'aeFh4bBA4[FPma,M%J-#!`$5p"C'pLC9p*E'a
|
||||
eFh4bBA4[FPma,M%JC(9`)$%`-#"ND@0d)'4PCL"XEf&N)'*PCfPZ$5p@CA*cD@p
|
||||
Z)$!JC'9Q$5p5CACTFfP[EL!`)'4PCJd[BQ4PCL"lBQPZC#"NC@Cp)'*TEQ3JC'9
|
||||
Q$5pXC'9Q)(YXEf&N)'4PCRdJBQ4PCJd[H'4PCL"lCAKMD#"NC@Cp)'*NC@B0,ep
|
||||
,)(Xc)'PZC'9i)'&NC#"ZC@FJC(9`)$!JE(3JHh"[F#!`I5"TCL!c)$%JFQpXE(d
|
||||
JBQ4PCJd[AfXJ,h0PG'0YH@*MEfa[FL"hD'9bC5!0HbpcCA4MEAPLBfpXEh)JCf9
|
||||
dI5"lHc%JFh9L)$3J-5"bEfaX)&p,)&p,)&p,)(0PG(*RBQ0[E'pb)("[F(dJBQP
|
||||
ZC(dJD@CPE(0P)'4PCJd[Cb"l,epL)(KNC@BJ,h!JHepL)(0PG'GbBAPp)'4PCRd
|
||||
JBQ4PCJd[4b"l,ep#)(KNC@BJ,e!JHep#)(0PG'GbBAPp)'4PCRdJBQ4PCJd[Db"
|
||||
l,epL)(KNC@BJ,epj)(KNC@BJ,epY)(KNC@BJ,epM)(KNC@BJ,h!JHepM)&pY)&p
|
||||
j)&pL)&pVI5"NC@Cp)'*NC@B0,dXJHbpI3L"iC'9Q)#pI@5"iC'9Q)#pI65"iC'9
|
||||
Q)#pI3b"iC'9Q)#p3)(YI3b"I65"I@5"I3L"IDhdJC'9QI5"LC'9Q$5pN)#pcCA4
|
||||
NBA0S)'aNC@B0,epT)'0eFR*PER4QE'&d)'4PCJd[D5"lC(9`)$!JCA%JHh"[F#"
|
||||
IDAdJD@BJFf9dCQaKG(dJBQ4PCJd[DL![Ff9dE'PZC@T[D@iJE'4PCJd[5L![Ff9
|
||||
dE'PZC@0KF#"XC'9Q$5p0)#pcCA4YDA4PFQaTE@Pd)'aNC@B0,hFJ,h0PG'aTEQ9
|
||||
hD@4dD#"XC'9Q$5pI8L"l,M)e)(0eBL"bEh9ZC#!Z-M8JB@4NI5"LC'9Q$5pIFL"
|
||||
lG(*KER0QEh*Y)&p5)'9iBfJJAe)JCAKMD#"TG(*KER0QEh*YI5"LC'9Q$5pM)(Y
|
||||
IFL"MGA*fCA4[I5"LC'9Q$5p$)#pM)'aNC@B0,hBJHf0eFR*PER4`EfPZG#!f)$)
|
||||
JFQpXE#"IFL"MGA*fCA4[I5"LC'9Q$5p@)#pf)'aNC@B0,hNJHepb)$)JBfp`H5"
|
||||
MGA*fCA4[I5"LC'9Q$5pC)#pj)'aNC@B0,f`JHepb)'aTEQ9dEhdJBQ4PCJd[6#!
|
||||
[E#"XC'9Q$5pY)(YIFL"YEhCPG'pp)'*NC@B0,epP)&YG)'4PCJd[Ad8JHepP)'a
|
||||
PEQGdD#!`)'jP)(YRFf&fC5!`)'FJ-#"()$!JD5!`)%SJ-#"U)$%JGb!a-#"0)&Y
|
||||
G)$!JC!d[3fpeFQPPFL!b-#!`)$!J-5"k)&X`,MNf0L!`,M)e15!Y-#ib06NJ-#i
|
||||
j0MB0Af8J-#"RCA3JAf8J-L"RCA3JB@4N)$)JC'Pf)&pP)$%JCf9d)&pP)$-JCf9
|
||||
d)'&NC#!b)'4TGPdJC5"ICL"d)&3JCh*PFh4[FQ9p)'PQI5"LC'9Q$5pICQPXE#"
|
||||
lHfCTE'ap)(0dEh"`C@30HbpIC5"EF'&dD'*LEhKG)'4PCL![AfBJ+%958Np51L"
|
||||
MB@iRG#"QD@aX,#"TEQ0bC@&cC5"QE'&dEQ9cFbNJC'9Q)'iJAd9p)'PQI5"LC'9
|
||||
Q$5pIFh4bEfYP)(YlFh4bEfYPI5"cG'p`F'9N$AX[Af8J@h"KG'KLBQpiA5"NC@B
|
||||
J,epQ)#K&8P*28MSJBf&Z*h3JFh4bEfYP,#"TEQ0bC@&cC5"QE'&dEQ9cFbNJC'9
|
||||
Q)'iJAd9p)'PQI5"LC'9Q$5pZ)#pZCAG`BA4S)'aNC@B0,diJ,fiJE'4PCJd[4L"
|
||||
lF#"ICQPXE(dJBQ4PCJd[CL"lBfa[Ff9`BA4S)%Cp)'*NC@B0,e-JHe!JAh0dFQp
|
||||
VCAdJBQ4PCJd[Fb"lBfa[Ff9`BA4S)&0p)'*NC@B0,d)JHfGcBACP)%BJCh*PFh4
|
||||
[FQ8J8hdJBQ4PCJd[BL"lBfa[Ff9`BA4S)%*p)'*NC@B0,epc)#pKFfK[Gb"XC'9
|
||||
Q$5pI8b"l+$mT)'9iBfJJHc)JBfp`H5!`)'9iBfJJF(9d)("[F#"NGA!JCQ&XFf8
|
||||
JBfKKFR"KG'JJBh9bFQ9ZG("[D@jd)&pR)(0PG'eKG(*TH!eIFh4bEfYP)&p()(0
|
||||
PG'eKG(*TH#"YEhCPG'mJ-b"MEh"j)("[F#"bE@pfCA4[I5"QEh*KE'`JF'p`)("
|
||||
[F#"`Eh!JERdJBQ4PCJd[Ad%JHepK)'e[GQ9dEb"IG#"PH'0S)$!JCAKMD(dJBQ4
|
||||
PCJd[Ad`JHc!JAf`JEQ9R)(4bB@jcE'&dC5"I4b"MGA*bC@jdE@&dFQPi)("[F(d
|
||||
JBQ4PCJd[AhFJHf4eF#"cG(*TEQGhD@4dD#"PH'0S)$-J,6%JFQpXE#"XC@jRG'J
|
||||
J-5"cG@)JAh3JEA9X)'&NC#"PH'0SI5"LC'9Q$5pIHL"EHc!J-(dJBQPZC#"lC(9
|
||||
`)&ph)'9iBfJJEQ9R)$)JC'Pf)'9iBfJJEQ9R)$)JC'PfI5"LD@jN)(YNGA!JAhF
|
||||
JCAKMD#"ZC@FJCAKMD#"ZC@Gp)'*TEQ4G)'4PCJd[HL"lAhSJCAKMD#"RCA3J,ep
|
||||
K)(KNC@BJ,epd)(KNC@BJ,epX)(KNC@BJCAKMD#"QD@jNCQpZG#"PH'0S)(0MB@a
|
||||
PCQpZG#"cCA4QEfjdI5"LC'9Q$5pICb"YBA4bDAJJC'9Q$5pI4b"YBA4bDAJJC'9
|
||||
Q$5pI4#"lAfFJBh9bFQ9ZG'eKG(*TH#"`Eh!JCh0KGQ8JBfpZBf&d)&p()'0eFR*
|
||||
PER4YBA4bDAJJF'p`I5"LC'9Q$5pP)(YI4#"`)#pd)(YI35"IFb"I6(dJC'9QI5"
|
||||
LC'9Q$5pb)(YI4#"3)#pd)(YI35"I8b"I6(dJC'9QI5"LC'9Q$5pK)(YI4#![G#"
|
||||
lC(9`)(!JAd%JAh-J8#"I35"I8b"I6(dJC'9QI5"LC'9Q$5p[)(YI4#![G#"lF'p
|
||||
`)&p-I5"NC@Cp)'*NC@B0,e3JHfGbCA0dEh*PI5"LC'9Q$5pe)(Yp)'*NC@B0,e8
|
||||
JHhdJBQ4PCJd[@L"lCQPZC'C[ER3JBQ9RD@iJBh9bFQ9ZG'4TBh3JC(9`)'aPEQG
|
||||
dD#"ND@0d)'*PCfPZ$AXa)'PZC'9i)#p'583JEQ8JHf4PCRdJHh"[F#"`Eh"p)'P
|
||||
QC@acCAdJCQpbB@aX)#p'Efjd6Q&YC5"PH'0S)'4PCL"NGA!JE'9ZCh4S)$!JEQ8
|
||||
0Hbp&EQ0[C'PZCb"&EQ0[C'PZCb!b06BJBA*bBANJBfp`H5"NC@BJ-#"PH'0S)(Y
|
||||
NGA!JG(P`C5![EQ&YCA4jF'8JCA%0Hd9ZBfpND@jR)$)JD@jNCAJJ-L"TEQ4PH#"
|
||||
`GA3JF'p`)$%JB@4NI5"lCAKMD#"`Eh"p)'PQC@acCAdJCQpbB@aXI5"TCL"`Eh!
|
||||
0Bh9bFQ9ZG'4TBh3JC(9`)'9ZC#"PEQ3J,dC[ER41B@eP)'GPG#"PH'0S)'4PCQP
|
||||
ZC@C[ER3JF'p`I5"LC'9Q$@9ZC!dP*89ZC&"bEf06CA30*59&EQ43FQpXEfF0*59
|
||||
#C@GTEP0PG(9`$8&NEf*PAdPXE(9cG(*KG'pbAc%Z-5"LC@GTEJeZ$58P4@jN8f9
|
||||
dGA!0G3ee$6!JC`d`)'N0-#"+)$!JDL!`,M)e)(FJ-6!J65"EA6!JC!dP*8j[G'8
|
||||
k$6)j15ij-M3d)$3a05ie1$NJE3db16NZ1$Ji15!d-6)Z0$)c0#!b16FZ-6Nd-5!
|
||||
d-6!Z1$Jb15!b168Z-6Jf05!d-6!Z16-f05"$$6)j-Lij-6%j)$3a-#ij-cBe)%`
|
||||
0-MNb,MNc0$BJ-cNi,M8b-b"-$6)i05id0$!i)$-j1#ie-M-J6!db1$8Z0$3`1#!
|
||||
d-6!Z1$)j-b"-$6)j-#ih-$-h)$3a-#ih0M!h)$)j-Lic-M-e)$3a-Lid-c3h)$)
|
||||
j-Lic-6!f)$3a0Lic-6!c)%-0-MNb,M-a-$BJ0$)b,MFd-MBJ6!db16FZ-63`05!
|
||||
d-M)Z0c3b0L"X$6)i0Lie0$-J0$3f,MFd-6JJ6!db163Z-$Jj0L!d0$BZ0c3a1#"
|
||||
-$6-`0#if0$8h)$3b-Lif-c8d)'`0-MNj,MNf06NJ0$)b,MBc063J6!db16NZ16B
|
||||
e15!d-6BZ-c%`-b"-$6)j15ij-M3d)$3a05ie1$NJ6!eQ$6%JGb!d)%d0-MBa,M!
|
||||
j-cFJ-cJi,MFj06-JE3db0M%Z-$Nc0b!c1$8Z0c)h1#"-$6)f-5id168a)$-i05i
|
||||
h-MFi)$)f-Lie16-e)$-i05if16Bj)$)f-bib-c3i)$-i05ih-c3f)'-0-MBd,M!
|
||||
c0c8J-cJe,MFi-63J-MBe,M)h0cJJ-cJf,M%c-MNJ-MBe,MFh0c)J-cJh,M!f0M)
|
||||
JB`db0MBZ-6Nj0b!c1$FZ1$8f-5!b0MBZ-MJe0b!c1$JZ16%b-b!b0MBZ-$Ff)$-
|
||||
i15ie-6Ji)'-0-MBe,M3d15!c16%Z-c-e05!b0M-Z0M!j0b!c16%Z-MBh0L!b0M%
|
||||
Z-$Nc0b!c16%Z-M3`0#"$$6)f-5i`16-h)$-i1#if16JJ6!db06FZ06Ba05!c1$J
|
||||
Z0MNi)%`0-M8h,M8f-68J-cNa,M-`-$JJ6!db068Z-$)e1#!c16%Z-c!`1#"-$6)
|
||||
e05i`-M8i)$-j0#ic16%h)%`0-MBa,M)`-$JJ-cNd,M-j1$8J6!db0MBZ-M!e)$-
|
||||
j0#ie06Nb)$)f1#ia-$8d)$-j-bia163d)$)f15ib16Bh)$-j-#ie16-b)'-0-MF
|
||||
`,M!h0c8J-cJi,MJi0c3J-MBj,MFc1$JJ-cJf,MBd16FJ-MBi,MFe0M8J-cJe,M)
|
||||
e0b"M$6)f0Lij-$!f)$-i-Lif-M-c)$)f0#i`-6%a)$-i-Lie-6Bj)$)f-5i`16-
|
||||
h)$-i-Lie-MNi)%-0-MBa,M!j-cFJ-cFh,MJ`0b"-$6)f0#i`0M3h)$-h0bii-$F
|
||||
JE!db0M3Z-$Bd0b!c0c3Z0c8f-5"-$6)e0#ij16)f)$-h0#ih06Ba)%`0-M8d,MN
|
||||
j-MBJ-cFh,MJ`0b"-$6)e0bie0M%e)$-h0bii-$FJ6!db06FZ06Ba05!c1$JZ0cN
|
||||
b-b"-$6)f-5i`16-h)$-i1#ih168c)%`0CJda-#"0$6)i-#ie-cFh)$3c-5ib16%
|
||||
i)'d0-MJ`,M3d-6NJ0$-a,MFa-$8J-MJ`,M-a06)J0$-b,M!j-cJJ-MJ`,M%a-68
|
||||
J0$-b,M3e1$)J3`db1$BZ-$!i-5!d-c)Z0$-a1#"-$6)i0Lie-MNd)$3c-5ib0c3
|
||||
e)%`0-MJf,MNd0$3J0$-`,M-c0c8J6!db16!Z-c-d1#!d-M)Z0c)`0b"X$6)i05i
|
||||
f063c)$3b-Lih-M!h)%`0-MJe,MBe0$-J0$%f,M)i1$3J6!db1$8Z0M%b1#!d-68
|
||||
Z06Bf0#"-$6)i05ie1$3a)$3a-Lij0c)h)$)i-bih-$Bc)$3a-5i`0$-f)$)i-#i
|
||||
j-6%j)$3a-#ih0MNh)%-0-MFi,M8a0MBJ0$%`,MFf16FJ6!db0cJZ06%f0L!c16J
|
||||
Z06!a-5"-$6)f-5ib0c%i)$-j1#ie-$%a)%`0-MBa,M)e0$3J0$%a,M!h)%`0-MB
|
||||
a,M)d0M%J0$%a,M-d0cBJ6!db0$!Z-c8d-b!d-6FZ0$%b05!b0$3Z-M!i)$3d05i
|
||||
h0cJd)$)f05ie-cNf)$3d0Lih-MBJ3`db0c)Z-cJc)$3d0Lih-MBJ6!db0cNZ0M-
|
||||
j-L!d0$BZ0c)f)%`0-MJe,MNf-MJJ0$-b,M8c-MJJE!db1$FZ-$Fa15!d-c!Z-$8
|
||||
J6!db1$!Z0c!j)$3b15ij0M-c)%`0-MJ`,MFc0M%J0$-`,M3d0$BJ-MJ`,MBd-MB
|
||||
J0$-`,MNe-c%J-MJ`,M8b163J0$-a,M-d0MNJB`db1$!Z0$%a0b!d-c%Z0cB`-b!
|
||||
b1$!Z-MFh0#!d-c)Z-6F`0b!b1$!Z-$Fc0b!d-c)Z06-e15"M$6)h15ic-c3d)$3
|
||||
c-bii06Nb)$)h0bij-c3b)$3c0#ih06Nb)$)h0Lib0$!e)$3c0#ih06Nb)'-0-MF
|
||||
c,MFa-6BJ0$-d,MFe16)J-MFa,MJc1$3J0$-b,MFe-c)J-MFa,MJc1$3J0$-`,M-
|
||||
b1$3JB`db0c%Z1$-i0#!d-MFZ16!d0#!b0c-Z0c%a0L!d-M8Z1$Ni0#!b0cBZ-M3
|
||||
`05!d-M8Z1$Ni0#"M$6)h1#ih0MNc)$3b05ii16Jd)$)i-#ih-M)f)$3b0bii-6!
|
||||
j)$)i-#ih-M)f)$3c-#ib-c3i)%-0-MJ`,MF`15!d-c!Z06%i05!b1$!Z0M8c15!
|
||||
d-c!Z1$)`-b!b1$!Z06-h0b!d-c%Z-MNa1#"$$@B00#"0$6)h0bii0$8j)$-h0#i
|
||||
h06Ba)'d0-MJ`,M8h068J-cFd,M8f15!b1$)Z0M3i0L!c0c8Z1$Nc1#!b1$-Z0M-
|
||||
`15!c0cFZ0$3f0#"M$6)i05ic1$-d)$-i-#ib-6Bh)$)i0#ic0$Na)$-i0#ib-$)
|
||||
c)$)i-5id-$8c)$-i05ic1#"$$6)i-bi`0M3c)$-i0Lic-6Bc)$)i-bii16-d)$-
|
||||
i0bii1$Bb)$)i-bih06!j)$-i15if-c3c)'-0-MJc,MB`-68J-cNa,M3h16BJ-MJ
|
||||
b,M3f-M-J-cNc,M%a0L!b1$!Z0c8`05!c16-Z0cFh0L"M$6)h1#ie0M!c)$-j0#i
|
||||
f-M3a)$)h0Lii-MJj)$-j0#ie06Nb)$)h-Lif1$%a)$-j0#ic16Je)'-0-MBj,M3
|
||||
h0M)J-cNd,M-j-6FJ6!db0MNZ0$Ff-L!c16%Z-c!`1#"-$6)h-Li`-6%j)$-j-5i
|
||||
c-$!i)%`0-MFb,M!a-6NJ-cJi,MBj1#"-$6)h05if06%c)$-i1#ih0cJh)%`0-MF
|
||||
e,MBe-6-J-cNa,M-b-6)J6!db0cJZ0c!b-L!c16%Z0$8d0b!b0cNZ0$8a-b!c16%
|
||||
Z-$Fj1#!b1$!Z-6)`05!c1$NZ06!a05"M$6)i-#ic0c%J-cJi,MNa-$JJ-MFj,MN
|
||||
i0b!c1$FZ1$Bi15!b0cNZ0$Fi05!c1$FZ-MFj0b"M$6)h1#ii0$Fi)$-i0Lie0$N
|
||||
d)$)h0bif1$8b)$-i0Lie-$3a)$)h0Lih0c8d)$-i0Lie-$3a)%-0-MFe,MBe-6-
|
||||
J-cJf,M3j0c-J6!db0c8Z0M8a-b!c1$JZ1$Fe-b"-$6)h-Li`-6%j)$-i1#ih16)
|
||||
c)%`0-MFb,M!`1$JJ-cJ`,MNe0MJJ6!db0c8Z0MFd0L!c1$!Z168f1#"-$6)h05i
|
||||
f0c3f)$-i-bid16Nb)%`0-MFi,M8a06%J-cJc,M8c-cNJ-MJ`,M!d-$BJ-cJc,M3
|
||||
b0MJJ-MJ`,MBe0cFJ-cJa,MFh0cBJB`db1$!Z1$Ja0b!c1$%Z-6Fh-5!b1$!Z1$N
|
||||
f1#!c1$!Z-$)i-5!b1$!Z-cJi-b!c0cNZ-M8a1#"M$6)h15ii-$Jb)$-h1#ic0MB
|
||||
i)$)h1#ij-c-J-cFh,MNa0$%J-MFh,MFh1$JJ-cFh,MNa0$%JB`db0cFZ0M%i1#!
|
||||
c0cFZ16%d-5!b0cFZ0M%i1#!c0cFZ1$Fc0#!b0c8Z0MFi0#!c0cFZ16!h0#"$$6)
|
||||
h05if0c3f)$-i-5i`063a)%`0-MFb,M!`1$JJ-cJa,M!e-$-J6!db0c)Z-$%a15!
|
||||
c0cFZ16%d-5"-$6)f15id0$-J-cFh,MNa0$%J6!db0MNZ0$3c)$-h0#ih06Ba)%`
|
||||
0-MFh,MJd06NJ-cFd,MFe0M%JE!eQ$6)i05if-c-b)$-i-#ii-$-f)'d0-MJe,MB
|
||||
c-c)J-cFd,MFe0M%JE!db1$JZ0$Nh)$-h0#ih06Ba)'`0-MJi,M3j0b!c0c8Z1$%
|
||||
c)%`0-MJj,MNa0$BJ-cFd,M3b-6NJ-MNa,MNe-b!c0c3Z-M8i-L!b16-Z0c!j0#!
|
||||
c0c3Z0$Ja05"M$6)j05ij-$!b)$-h0#ih06Nj)$)j0bii1$)j)$-h0Lia-M3f)$)
|
||||
j1#ih-M%i)$-h1#ia16%JB`db16NZ06!d15!c1$!Z-6)`-5!b16NZ-MJb0#!c1$)
|
||||
Z-M8f0b!b16FZ16Fi)$-i-bij0$Fc)'-0-MNe,MNd-5!c1$BZ06Jj0#!b16)Z-M)
|
||||
`-5!c1$BZ-cBJ-MJj,MNj-b!c1$FZ0c3h0#"M$6)i15ic16FJ-cJi,M%a163J-MJ
|
||||
j,M%a0c%J-cJi,MJa0$)J-MJj,M)c0cJJ-cJj,M8b0$NJB`db1$NZ-cJe)$-j-#i
|
||||
c1$Ne)$)i15ii0cFf)$-j-5i`0MBb)$)j-#ih-M3i)$-j-5ic-M3j)'-0-MNa,M8
|
||||
e0M)J-cNa,M8h16)J-MNb,M-j0$3J-cNa,M3i0c)J-MNc,M%f0cFJ-cNa,M%`1$3
|
||||
JB`db16-Z0L!c16!Z1$Nf0#!b16-Z16-d-L!c16!Z068d0b!b163Z-M-f0b!c16!
|
||||
Z-6B`-5"M$6)j0#ie0M%a)$-i15ih-cFf)$)j0#if06%h)$-i15i`-6Nd)$)j0#i
|
||||
f0cJa)$-i1#ii-c)c)%-0-MNi,M%`-cNJ-cJi,MJc-M-JE!db16JZ-6!c15!c163
|
||||
Z0$)d15"X$6)j0#ij0M)e)$-j0#id-M3j)'`0-MNd,MNh-M-J-cNc,MBb-M)J-MN
|
||||
d,MNf-M8J-cNc,M8i0c8J9Jdb16)Z-6)`05!c168Z0M!a1#!b1$JZ-M3h-b!c163
|
||||
Z16Bi-5!b1$BZ0$3d15!c16)Z-$Na05"M$6)i05ih-M8b)$-j-#ij0$%h)$)i05i
|
||||
e0M3e)$-i15if0$%J-MJe,MFa-M3J-cJi,M-e-c)JB`db1$BZ-6Nj0b!c1$3Z-6)
|
||||
b0#!b16!Z0$Fa-b!c1$-Z1$Jd0b!b16-Z0MNe)$-i-Lih-MNh)'-0-MNd,MJh-6)
|
||||
J-cJb,M-`1$FJ-MNe,M8b-cJJ-cJa,M%`-c%J-MNe,M)e-cFJ-cFj,MFi0c3JB`d
|
||||
b163Z16)f-b!c0cJZ-6Na1#!b16-Z-cFb-5!c0cFZ0$Nj-L!b16%Z1$Ni)$-h0bi
|
||||
f0c!e)'-0-MN`,M)i06JJ-cFh,MJe1$-J-MJj,M!a0MJJ-cFj,M%i-cJJ-MJi,MJ
|
||||
a0cBJ-cJ`,MJ`-cBJ3`db1$8Z0M-c-L!c1$!Z1$!c0L"-$@B093e9$58P8'&RC94
|
||||
bB@PXCA)0*598FQ&TE'9b$9p&)'9ZC!dP*8924JhJV3!!!3!!!!L"!!!(J3!!!3j
|
||||
P)#K38%3T)&0PE'9MG'9N1J!!!!!!K3&X!*B"YB!!!!a33P-JE'pREbjYB@0R!J!
|
||||
!!%938dC"8P4C!!!!!!!!!!"&8&0'39*8@3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!+k[T!N!!"cF!!!*MfB!2J"k!+S%$&"bD@jdCA)J5@jQE`!!!!!!2J&V!&)"YJ3
|
||||
%5'9XF!!!!!!!!!!!!!!!!)%%!!(`%3!!!"8!03!M!3i"kJ!"!!!!!!!!!!$`%J!
|
||||
!!!$L!!J!!!!!!,`"DJ$3!EJ%!Np,!!!!!!!0!!d!,3!YS!,J!!!!!!!![!$T!0!
|
||||
!!!"i!!-!!!")!%J!!!!!!YJ#+2rKrq)#q3*'!dF&+!2m!!)!!!")!%J!!!!!!YJ
|
||||
#+!!"!!!!C!!!!!%!!`-$!!!!!5F2!!%!!3!!!!!!!!!!!!!!!(!)!"N"N!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Errrrr!!!!!!!)rrd!!!!
|
||||
-!!!!!!!("NY,G@9SEJ!!!!)!!!!!!!!!!!"HVUqN#J!"!!!!!!!!!!5ZVk3+3A9
|
||||
dD&088L!"!!!!!!!!!+k[T!T,CAPA8e45)`%!!!!!!!!!VUqN#N4PFf0849K8!3!
|
||||
!!!!!!!#ZVk3+8(*PGP"*3e3"!!!!!!!!!!!!"R3'G!!!!!!!53!k!"%#r``!rrr
|
||||
rr`!!!!!!!!!!!$S!!!"*!!!!!!!!!"i!!3!+!!!!!!"*!$S!#J!!!!!!!!!!!$6
|
||||
rrrrr!!!!!!#BJ!J!!!!!!%N!1J!!!!!!!!!!!%J!!!")!!!!!!!"!!%!!3!!!!!
|
||||
!drk%!!!!!!!!!!'!!!!"!!$rrrrrrrm!!!!!!!!!!!!!!!!!53!k!!!!!!"*!$S
|
||||
!!`N(!!Irri(r!$d*"`!rrrr"r`!I#3F!Irrr`2q!!!N!!Ilr!q$rJ!!*!!2qr`2
|
||||
JIm!!#3!(r[m$m(r!!!N!$rlr!r!ri!!*!"rqr`2i2q!`#3!Ir[m$q$rJ!!N!2rl
|
||||
r!rJIm!S*!(rqr`2m(r!!#3"rr[m$r!ri#JN!Irlr!ri2q!!)r[m%iIi(r!!)r[m
|
||||
%`2m(r$B)r[m%`(m$r$N)r[m%J(q$rMd)r[m%`(q$rJN)r[m%`(q"rc%)r[m%i2r
|
||||
"rcm)r[m%qrr!rld'r2m#i2qP"[cr!Z"rm3J!Irhr!["rr`J!Irhr![Irr3N!Irl
|
||||
r!ri(q!%*!$rqr`2q"rJa#3!rr[m$rJIi2`N!(rlr!ri(q"S*!!rqr`2q"rJc#3!
|
||||
2r[m$rJIi!!N!"rlr!ri(q$X*!!(qr`2q"rJp#3!!r[m$rJri-`N(!$rrrr`Iq!!
|
||||
*"`!2rrriIr!D#3F!!rrrmrq!23N(!!2rr`2m!"N*"`!$rrm$r!!!#3F!!rrr!r`
|
||||
!#!N(!!2rr`2m!"3*"`!$rrm$r!!!#3F!!rrr!r`!"!N(!!2rr`2m!!!*"`!$rrm
|
||||
$r!!"#3F!!rrr!r`!!!N(!!2rr`2m!!!*"`!$rrm$r!!i#3F!!rrr!r`!!!,j!!6
|
||||
k!!!`"2S!!!%*"`$rirr!Ir!!#3F!rr[rm2r`!!N!!2lr!r(rm$`*!!$qr`2lrr!
|
||||
!#3F!2Rjjqr2`!!N(!$iqH2[Km$!*"`!q2RMliI!"#3F!2MjjqrJ!!!N(!$lqIrR
|
||||
r!!!*"`!rrRrarm!%#3F!2rarq2rJ!!N(!$riIrJrm!!*"`!ri(Mm!r![#3F!2J"
|
||||
iI!(i!!N(!$i!H(rJq#N*"`!q!(KriIJ!#3F!2J"jrr2`!!N(!Ir$rr[rm!%*"`(
|
||||
r`rrlrr!L#3F"rm2rmrrJ#!N(!Ir$rm2rJ!!!!*L!#!!!!!!!53!k!!!!!!!!!!!
|
||||
!5!!!!%J!!!!!!!%!!3!"!!!!!!$6rS3!!!!!!!!!!B!!!!%!!2rrrrrrr`!!!!!
|
||||
!!!!!!!!!!!"*!$S!!!!!!%N!1J!N#3F!"rrrJIm!23N(!$rrrm(r!"m*"`"rrrr
|
||||
!ri!!#3!"r[m$i2q!!!N!!rlr!q"r`!!*!!Iqr`2`Im!!#3!2r[m$m$rJ!!N!(rl
|
||||
r!rJri$!*!"rqr`2i2q!!#3!rr[m$q"r`#JN!Irlr!r`Im!!*!(rqr`2m$rJ+#3"
|
||||
rr[m$rJri!!Mqr`6KrJIm!!Mqr`6!r`Im0JMqr`6!I`2m13Mqr`5!Ii2q23Mqr`6
|
||||
!Ii2q#3Mqr`6!Ii(r-3Mqr`6Jrm(r2`Mqr`6lrm$r[3Emr`,Jrk8'r2m#i(ra#!"
|
||||
rrIm#m(rr#!"rrIm#prrp#3"rr[m$rJIi!3N!2rlr!ri(q$%*!$rqr`2q"rJr#3!
|
||||
Ir[m$rJIi'JN!$rlr!ri(q$-*!!rqr`2q"rJ!#3!(r[m$rJIi1`N!!Ilr!ri(q$d
|
||||
*!!$qr`2q$rJc#3F!2rrrr"ri!!N(!!rrrrKrm"S*"`!$rrrcri!p#3F!!rrr!r`
|
||||
!'3N(!!2rr`2m!!!*"`!$rrm$r!!)#3F!!rrr!r`!&!N(!!2rr`2m!!!*"`!$rrm
|
||||
$r!!%#3F!!rrr!r`!!!N(!!2rr`2m!!%*"`!$rrm$r!!!#3F!!rrr!r`!!!N(!!2
|
||||
rr`2m!$J*"`!$rrm$r!!!![N!"2S!!$!%qJ!!!3N(!2rMrm"rm!!*"`$rqrr`rr!
|
||||
!#3!!r[m$mIr`2!N!!2lr!r[rm!!*"`!qIRRlmr!!#3F!2Mjiqq(`-!N(!$iqH2[
|
||||
Km!%*"`!q2RRlq!!!#3F!2[jrqIm!!!N(!$rqIr(r`!3*"`!rr(rirq!!#3F!2rK
|
||||
rq$r`!!N(!$rJH2`$m#m*"`!q!(Km!IJ!#3F!2J"iIq$i+3N(!$i!H(rKq!!*"`!
|
||||
q!(Rrmr!!#3F"rm2rqrr`!3N(!Ir$rr[rm#)*"`(r`rrcrq!)#3F"rm2r`rq!!!!
|
||||
!r`!!!3!!!!L"!!!(J3!!!3i!e#3%)Z3!!!!F!,i!"e"548-!!!"#9%908!!!!%j
|
||||
338G&!!!!@P088L!!!!"Q8e45)`!!!(*849K8!!!!IR"ZEh3!!!#+8%P$9!!!!*B
|
||||
"!!!!!!!!!!$6re!"!!!0!!!!I!$8!!J"!!!@!!!!KJ$6rm3"!!!J!!!!NJ$6rh`
|
||||
"!!!R!!!!R3$6rp!"!!!`!!!!S`$6rq3!!!!m!!!!T`$8!'!"!!")!!!"#3$6r[3
|
||||
-8(*TER3J8Q9MEh*N#&4PEA"XBA4P#9"KCf8J8fPkC3C"GA4SEh))5f9jGfpbC(-
|
||||
,4'9cBh*TF(4TEfi,5@jQEh*YBA4TEfi(8(*PGQPPGqlU:
|
1
testout/README
Normal file
1
testout/README
Normal file
@ -0,0 +1 @@
|
||||
The test output directory.
|
Loading…
x
Reference in New Issue
Block a user