Thanks to Justin Davis.
https://rt.cpan.org/Ticket/Display.html?id=60491
- - moved the GIF file handling code into a sub-module in preparation
+ - moved GIF, TIFF file handling code into sub-modules in preparation
for separate distribution.
https://rt.cpan.org/Ticket/Display.html?id=49616 (partial)
i_readjpeg_wiol
i_writejpeg_wiol
- i_readtiff_wiol
- i_writetiff_wiol
- i_writetiff_wiol_faxable
-
i_readpnm_wiol
i_writeppm_wiol
my $allow_incomplete = $input{allow_incomplete};
defined $allow_incomplete or $allow_incomplete = 0;
- if ( $input{'type'} eq 'tiff' ) {
- my $page = $input{'page'};
- defined $page or $page = 0;
- $self->{IMG}=i_readtiff_wiol( $IO, $allow_incomplete, $page );
- if ( !defined($self->{IMG}) ) {
- $self->{ERRSTR}=$self->_error_as_msg(); return undef;
- }
- $self->{DEBUG} && print "loading a tiff file\n";
- return $self;
- }
-
if ( $input{'type'} eq 'pnm' ) {
$self->{IMG}=i_readpnm_wiol( $IO, $allow_incomplete );
if ( !defined($self->{IMG}) ) {
($IO, $fh) = $self->_get_writer_io(\%input, $input{'type'})
or return undef;
- if ($input{'type'} eq 'tiff') {
- $self->_set_opts(\%input, "tiff_", $self)
- or return undef;
- $self->_set_opts(\%input, "exif_", $self)
- or return undef;
-
- if (defined $input{class} && $input{class} eq 'fax') {
- if (!i_writetiff_wiol_faxable($self->{IMG}, $IO, $input{fax_fine})) {
- $self->{ERRSTR} = $self->_error_as_msg();
- return undef;
- }
- } else {
- if (!i_writetiff_wiol($self->{IMG}, $IO)) {
- $self->{ERRSTR} = $self->_error_as_msg();
- return undef;
- }
- }
- } elsif ( $input{'type'} eq 'pnm' ) {
+ if ( $input{'type'} eq 'pnm' ) {
$self->_set_opts(\%input, "pnm_", $self)
or return undef;
if ( ! i_writeppm_wiol($self->{IMG},$IO) ) {
return undef;
}
$self->{DEBUG} && print "writing a raw file\n";
- } elsif ( $input{'type'} eq 'png' ) {
- $self->_set_opts(\%input, "png_", $self)
- or return undef;
- if ( !i_writepng_wiol($self->{IMG}, $IO) ) {
- $self->{ERRSTR}='unable to write png image';
- return undef;
- }
- $self->{DEBUG} && print "writing a png file\n";
} elsif ( $input{'type'} eq 'jpeg' ) {
$self->_set_opts(\%input, "jpeg_", $self)
or return undef;
($IO, $file) = $class->_get_writer_io($opts, $type)
or return undef;
- if ($type eq 'tiff') {
- $class->_set_opts($opts, "tiff_", @images)
- or return;
- $class->_set_opts($opts, "exif_", @images)
- or return;
- my $res;
- $opts->{fax_fine} = 1 unless exists $opts->{fax_fine};
- if ($opts->{'class'} && $opts->{'class'} eq 'fax') {
- $res = i_writetiff_multi_wiol_faxable($IO, $opts->{fax_fine}, @work);
- }
- else {
- $res = i_writetiff_multi_wiol($IO, @work);
- }
- unless ($res) {
- $class->_set_error($class->_error_as_msg());
- return undef;
- }
+ if (0) { # eventually PNM in here, now that TIFF/GIF are elsewhere
}
else {
if (@images == 1) {
return;
}
- my @imgs;
- if ($type eq 'gif') {
- @imgs = i_readgif_multi_wiol($IO);
- }
- elsif ($type eq 'tiff') {
- @imgs = i_readtiff_multi_wiol($IO, -1);
- }
- elsif ($type eq 'pnm') {
+ my @imgs;
+ if ($type eq 'pnm') {
@imgs = i_readpnm_multi_wiol($IO, $opts{allow_incomplete}||0);
}
else {
static struct value_name translate_names[] =
{
-#ifdef HAVE_LIBGIF
{ "giflib", pt_giflib, },
-#endif
{ "closest", pt_closest, },
{ "perturb", pt_perturb, },
{ "errdiff", pt_errdiff, },
-#ifdef HAVE_LIBTIFF
-
-Imager::ImgRaw
-i_readtiff_wiol(ig, allow_incomplete, page=0)
- Imager::IO ig
- int allow_incomplete
- int page
-
-void
-i_readtiff_multi_wiol(ig, length)
- Imager::IO ig
- int length
- PREINIT:
- i_img **imgs;
- int count;
- int i;
- PPCODE:
- imgs = i_readtiff_multi_wiol(ig, length, &count);
- if (imgs) {
- EXTEND(SP, count);
- for (i = 0; i < count; ++i) {
- SV *sv = sv_newmortal();
- sv_setref_pv(sv, "Imager::ImgRaw", (void *)imgs[i]);
- PUSHs(sv);
- }
- myfree(imgs);
- }
-
-
-undef_int
-i_writetiff_wiol(im, ig)
- Imager::ImgRaw im
- Imager::IO ig
-
-undef_int
-i_writetiff_multi_wiol(ig, ...)
- Imager::IO ig
- PREINIT:
- int i;
- int img_count;
- i_img **imgs;
- CODE:
- if (items < 2)
- croak("Usage: i_writetiff_multi_wiol(ig, images...)");
- img_count = items - 1;
- RETVAL = 1;
- if (img_count < 1) {
- RETVAL = 0;
- i_clear_error();
- i_push_error(0, "You need to specify images to save");
- }
- else {
- imgs = mymalloc(sizeof(i_img *) * img_count);
- for (i = 0; i < img_count; ++i) {
- SV *sv = ST(1+i);
- imgs[i] = NULL;
- if (SvROK(sv) && sv_derived_from(sv, "Imager::ImgRaw")) {
- imgs[i] = INT2PTR(i_img *, SvIV((SV*)SvRV(sv)));
- }
- else {
- i_clear_error();
- i_push_error(0, "Only images can be saved");
- myfree(imgs);
- RETVAL = 0;
- break;
- }
- }
- if (RETVAL) {
- RETVAL = i_writetiff_multi_wiol(ig, imgs, img_count);
- }
- myfree(imgs);
- }
- OUTPUT:
- RETVAL
-
-undef_int
-i_writetiff_wiol_faxable(im, ig, fine)
- Imager::ImgRaw im
- Imager::IO ig
- int fine
-
-undef_int
-i_writetiff_multi_wiol_faxable(ig, fine, ...)
- Imager::IO ig
- int fine
- PREINIT:
- int i;
- int img_count;
- i_img **imgs;
- CODE:
- if (items < 3)
- croak("Usage: i_writetiff_multi_wiol_faxable(ig, fine, images...)");
- img_count = items - 2;
- RETVAL = 1;
- if (img_count < 1) {
- RETVAL = 0;
- i_clear_error();
- i_push_error(0, "You need to specify images to save");
- }
- else {
- imgs = mymalloc(sizeof(i_img *) * img_count);
- for (i = 0; i < img_count; ++i) {
- SV *sv = ST(2+i);
- imgs[i] = NULL;
- if (SvROK(sv) && sv_derived_from(sv, "Imager::ImgRaw")) {
- imgs[i] = INT2PTR(i_img *, SvIV((SV*)SvRV(sv)));
- }
- else {
- i_clear_error();
- i_push_error(0, "Only images can be saved");
- myfree(imgs);
- RETVAL = 0;
- break;
- }
- }
- if (RETVAL) {
- RETVAL = i_writetiff_multi_wiol_faxable(ig, imgs, img_count, fine);
- }
- myfree(imgs);
- }
- OUTPUT:
- RETVAL
-
-const char *
-i_tiff_libversion()
-
-bool
-i_tiff_has_compression(name)
- const char *name
-
-#endif /* HAVE_LIBTIFF */
-
-
-#ifdef HAVE_LIBPNG
-
-#endif
SGI/testimg/verb12.rgb
SGI/testimg/verb16.rgb
SGI/testimg/verb6.rgb
+TIFF/Makefile.PL
+TIFF/TIFF.pm
+TIFF/TIFF.xs
+TIFF/imtiff.c
+TIFF/imtiff.h
+TIFF/testimg/alpha.tif Alpha scaling test image
+TIFF/testimg/comp4.bmp Compressed 4-bit/pixel BMP
+TIFF/testimg/comp4.tif 4-bit/pixel paletted TIFF
+TIFF/testimg/comp4bad.tif corrupted 4-bit/pixel paletted TIFF
+TIFF/testimg/comp4t.tif 4-bit/pixel paletted TIFF (tiled)
+TIFF/testimg/comp8.bmp Compressed 8-bit/pixel BMP
+TIFF/testimg/comp8.tif 8-bit/pixel paletted TIFF
+TIFF/testimg/gralpha.tif Grey alpha test image
+TIFF/testimg/grey16.tif 16-bit/sample greyscale TIFF
+TIFF/testimg/grey32.tif 32-bit/sample greyscale+alpha TIFF
+TIFF/testimg/imager.pbm Test bi-level
+TIFF/testimg/imager.tif Test bi-level
+TIFF/testimg/penguin-base.ppm
+TIFF/testimg/pengtile.tif Tiled tiff image, same as penguin-base.ppm
+TIFF/testimg/rgb16.tif 16-bit/sample RGB image - strips
+TIFF/testimg/rgb16t.tif 16-bit/sample RGB image - tiled
+TIFF/testimg/rgbatsep.tif Tiled/separated for testing RGBA codepath
+TIFF/testimg/scmyk.tif Simple CMYK TIFF image
+TIFF/testimg/scmyka.tif CMYK with one alpha channel
+TIFF/testimg/scmyka16.tif CMYK with one alpha channel (16-bit)
+TIFF/testimg/scmykaa.tif CMYK with 2 alpha channels
+TIFF/testimg/slab.tif Lab color image
+TIFF/testimg/srgb.tif Simple RGB image
+TIFF/testimg/srgba.tif RGB with one alpha
+TIFF/testimg/srgba16.tif
+TIFF/testimg/srgba32.tif
+TIFF/testimg/srgbaa.tif RGB with 2 alpha
+TIFF/testimg/tiffwarn.tif Generates a warning while being read
apidocs.perl Build lib/Imager/APIRef.pm
bigtest.perl Library selection tester
bmp.c Reading and writing Windows BMP files
t/tr18561b.t
tags.c
testimg/209_yonge.jpg Regression test: #17981
-testimg/alpha.tif Alpha scaling test image
testimg/alpha16.tga 16-bit/pixel TGA with alpha "channel" RT 32926
testimg/bad1oflow.bmp 1-bit/pixel, overflow integer on 32-bit machines
testimg/bad1wid0.bmp 1-bit/pixel, zero width
testimg/bad_asc.ppm ASCII PPM with invalid image data
testimg/base.jpg Base JPEG test image
testimg/comp4.bmp Compressed 4-bit/pixel BMP
-testimg/comp4.tif 4-bit/pixel paletted TIFF
-testimg/comp4bad.tif corrupted 4-bit/pixel paletted TIFF
-testimg/comp4t.tif 4-bit/pixel paletted TIFF (tiled)
testimg/comp8.bmp Compressed 8-bit/pixel BMP
-testimg/comp8.tif 8-bit/pixel paletted TIFF
testimg/exiftest.jpg Test image for EXIF parsing
testimg/gimpgrad A GIMP gradient file
-testimg/gralpha.tif Grey alpha test image
-testimg/grey16.tif 16-bit/sample greyscale TIFF
-testimg/grey32.tif 32-bit/sample greyscale+alpha TIFF
testimg/imager.pbm Test bi-level
-testimg/imager.tif Test bi-level
testimg/junk.ppm
testimg/longid.tga Test TGA with a long id string
testimg/maxval.ppm For ppm file maxval handling
testimg/multiple.ppm Test multiple PPM reading
testimg/newgimpgrad.ggr Test GIMP Gradient file (newer type)
testimg/penguin-base.ppm
-testimg/pengtile.tif Tiled tiff image, same as penguin-base.ppm
testimg/pgm.pgm Simple pgm for testing the right sample is in the right place
-testimg/rgb16.tif 16-bit/sample RGB image - strips
-testimg/rgb16t.tif 16-bit/sample RGB image - tiled
-testimg/rgbatsep.tif Tiled/separated for testing RGBA codepath
testimg/scale.ppm
-testimg/scmyk.tif Simple CMYK TIFF image
testimg/scmyk.jpg Simple CMYK JPEG image
-testimg/scmyka.tif CMYK with one alpha channel
-testimg/scmyka16.tif CMYK with one alpha channel (16-bit)
-testimg/scmykaa.tif CMYK with 2 alpha channels
testimg/short1.bmp 1-bit/pixel, data missing from EOF
testimg/short24.bmp 24-bit/pixel, data missing from EOF
testimg/short4.bmp truncated 4bit/pixel uncompressed BMP
testimg/short_bin16.pgm 16-bit Bin PGM with short image section
testimg/short_bin16.ppm 16-bit Bin PPM with short image section
testimg/simple.pbm
-testimg/slab.tif Lab color image
-testimg/srgb.tif Simple RGB image
-testimg/srgba.tif RGB with one alpha
-testimg/srgba16.tif
-testimg/srgba32.tif
-testimg/srgbaa.tif RGB with 2 alpha
testimg/test.png Standard test image as PNG
testimg/test.raw Standard test image as RAW
testimg/test.tga Standard test image as TGA
testimg/test_gimp_pal A simple GIMP palette file
-testimg/tiffwarn.tif Generates a warning while being read
testimg/winrgb2.bmp 1-bit bmp base
testimg/winrgb24.bmp 24-bit bmp base
testimg/winrgb24off.bmp 24-bit bmp with image data offset from header
testimg/winrgb8off.bmp 8-bit bmp with image data offset from header
testimg/zerotype.jpg Image with a zero type entry in the EXIF data
tga.c Reading and writing Targa files
-tiff.c
trans2.c
transform.perl Shell interface to Imager::Transform
typemap
installed on your computer}
};
- $formats{'tiff'}={
- order=>'23',
- def=>'HAVE_LIBTIFF',
- inccheck=>sub { -e catfile($_[0], 'tiffio.h') },
- libcheck=>sub { $_[0] eq "libtiff$aext" or $_ eq "libtiff.$lext" },
- libfiles=>'-ltiff',
- objfiles=>'tiff.o',
- docs=>q{
- In order to use tiff with this module you need to have libtiff
- installed on your computer},
- postcheck => \&postcheck_tiff,
- };
+# $formats{'tiff'}={
+# order=>'23',
+# def=>'HAVE_LIBTIFF',
+# inccheck=>sub { -e catfile($_[0], 'tiffio.h') },
+# libcheck=>sub { $_[0] eq "libtiff$aext" or $_ eq "libtiff.$lext" },
+# libfiles=>'-ltiff',
+# objfiles=>'tiff.o',
+# docs=>q{
+# In order to use tiff with this module you need to have libtiff
+# installed on your computer},
+# postcheck => \&postcheck_tiff,
+# };
# $formats{'png'}={
# order=>'22',
$0 [--disable feature1,feature2,...] [other options]
$0 --help
Possible feature names are:
- jpeg tiff T1-fonts TT-fonts freetype2
+ jpeg T1-fonts TT-fonts freetype2
Other options:
--verbose | -v
Verbose library probing (or set IM_VERBOSE in the environment)
$path;
}
-sub postcheck_tiff {
- my ($format, $frm) = @_;
-
- -d "probe" or mkdir "probe";
+# sub postcheck_tiff {
+# my ($format, $frm) = @_;
- my $tiffver_name = "probe/tiffver.txt";
+# -d "probe" or mkdir "probe";
- my $lib;
- if ($Config{cc} =~ /\b(cl|bcc)\b/) {
- $lib = "libtiff";
- }
- else {
- $lib = "tiff";
- }
+# my $tiffver_name = "probe/tiffver.txt";
- # setup LD_RUN_PATH to match link time
- my $lopts = join " " , map("-L$_", @{$format->{libdir}}), " -ltiff";
- my ($extra, $bs_load, $ld_load, $ld_run_path) =
- ExtUtils::Liblist->ext($lopts, $VERBOSE);
- local $ENV{LD_RUN_PATH};
+# my $lib;
+# if ($Config{cc} =~ /\b(cl|bcc)\b/) {
+# $lib = "libtiff";
+# }
+# else {
+# $lib = "tiff";
+# }
- if ($ld_run_path) {
- print "Setting LD_RUN_PATH=$ld_run_path for TIFF probe\n" if $VERBOSE;
- $ENV{LD_RUN_PATH} = $ld_run_path;
- }
+# # setup LD_RUN_PATH to match link time
+# my $lopts = join " " , map("-L$_", @{$format->{libdir}}), " -ltiff";
+# my ($extra, $bs_load, $ld_load, $ld_run_path) =
+# ExtUtils::Liblist->ext($lopts, $VERBOSE);
+# local $ENV{LD_RUN_PATH};
- my $good =
- eval {
- assert_lib
- (
- debug => $VERBOSE,
- incpath => $format->{incdir},
- libpath => $format->{libdir},
- lib => $lib,
- header => [ qw(stdio.h tiffio.h) ],
- function => <<FUNCTION,
- {
- const char *vers = TIFFGetVersion();
- FILE *f = fopen("$tiffver_name", "wb");
- if (!f)
- return 1;
- fputs(vers, f);
- if (fclose(f))
- return 1;
- return 0;
- }
-FUNCTION
- );
- 1;
- };
+# if ($ld_run_path) {
+# print "Setting LD_RUN_PATH=$ld_run_path for TIFF probe\n" if $VERBOSE;
+# $ENV{LD_RUN_PATH} = $ld_run_path;
+# }
- unless ($good && -s $tiffver_name
- && open(VERS, "< $tiffver_name")) {
- unlink $tiffver_name unless $KEEP_FILES;
- print <<EOS;
- **tiff: cannot determine libtiff version number
- tiff: DISABLED
-EOS
- return;
- }
+# my $good =
+# eval {
+# assert_lib
+# (
+# debug => $VERBOSE,
+# incpath => $format->{incdir},
+# libpath => $format->{libdir},
+# lib => $lib,
+# header => [ qw(stdio.h tiffio.h) ],
+# function => <<FUNCTION,
+# {
+# const char *vers = TIFFGetVersion();
+# FILE *f = fopen("$tiffver_name", "wb");
+# if (!f)
+# return 1;
+# fputs(vers, f);
+# if (fclose(f))
+# return 1;
+# return 0;
+# }
+# FUNCTION
+# );
+# 1;
+# };
+
+# unless ($good && -s $tiffver_name
+# && open(VERS, "< $tiffver_name")) {
+# unlink $tiffver_name unless $KEEP_FILES;
+# print <<EOS;
+# **tiff: cannot determine libtiff version number
+# tiff: DISABLED
+# EOS
+# return;
+# }
- # version file seems to be there, load it up
- my $ver_str = do { local $/; <VERS> };
- close VERS;
- unlink $tiffver_name unless $KEEP_FILES;
+# # version file seems to be there, load it up
+# my $ver_str = do { local $/; <VERS> };
+# close VERS;
+# unlink $tiffver_name unless $KEEP_FILES;
- my ($version) = $ver_str =~ /(\d+\.\d+\.\d+)/;
+# my ($version) = $ver_str =~ /(\d+\.\d+\.\d+)/;
- if ($version eq '3.9.0') {
- print <<EOS;
- **tiff: libtiff 3.9.0 introduced a serious bug, please install 3.9.1
- tiff: DISABLED
-EOS
- return;
- }
+# if ($version eq '3.9.0') {
+# print <<EOS;
+# **tiff: libtiff 3.9.0 introduced a serious bug, please install 3.9.1
+# tiff: DISABLED
+# EOS
+# return;
+# }
- return 1;
-}
+# return 1;
+# }
# This isn't a module, but some broken tools, like
# Module::Depends::Instrusive insist on treating it like one.
--- /dev/null
+#!perl -w
+use strict;
+use ExtUtils::MakeMaker qw(WriteMakefile WriteEmptyMakefile);
+use Getopt::Long;
+use Config;
+
+my $verbose = $ENV{IM_VERBOSE};
+my @libpaths;
+my @incpaths;
+
+GetOptions("incpath=s", \@incpaths,
+ "libpath=s" => \@libpaths,
+ "verbose|v" => \$verbose);
+
+our $BUILDING_IMAGER;
+
+my $MM_ver = eval $ExtUtils::MakeMaker::VERSION;
+
+my %opts =
+ (
+ NAME => 'Imager::File::TIFF',
+ VERSION_FROM => 'TIFF.pm',
+ OBJECT => 'TIFF.o imtiff.o',
+ );
+
+my @inc;
+if ($BUILDING_IMAGER) {
+ push @inc, "-I..";
+ unshift @INC, "../lib";
+}
+else {
+ unshift @INC, "inc";
+ print "TIFF: building independently\n";
+ require Imager::ExtUtils;
+ push @inc, Imager::ExtUtils->includes;
+ $opts{TYPEMAPS} = [ Imager::ExtUtils->typemap ];
+
+ # Imager required configure through use
+ my @Imager_req = ( Imager => "0.77" );
+ if ($MM_ver >= 6.46) {
+ $opts{META_MERGE} =
+ {
+ configure_requires =>
+ {
+ @Imager_req,
+ },
+ build_requires =>
+ {
+ @Imager_req,
+ "Test::More" => "0.47",
+ },
+ resources =>
+ {
+ homepage => "http://imager.perl.org/",
+ repository =>
+ {
+ url => "http://imager.perl.org/svn/trunk/Imager-File-TIFF",
+ web => "http://imager.perl.org/svnweb/public/browse/trunk/Imager-File-TIFF",
+ type => "svn",
+ },
+ },
+ };
+ $opts{PREREQ_PM} =
+ {
+ @Imager_req,
+ };
+ }
+}
+
+require Imager::Probe;
+
+my %probe =
+ (
+ name => "TIFF",
+ inccheck => sub { -e File::Spec->catfile($_[0], "tiffio.h") },
+ libbase => "tiff",
+ testcode => _tiff_test_code(),
+ testcodeheaders => [ "tiffio.h", "stdio.h", "string.h" ],
+ incpath => join($Config{path_sep}, @incpaths),
+ libpath => join($Config{path_sep}, @libpaths),
+ );
+
+my $probe_res = Imager::Probe->probe(\%probe);
+if ($probe_res) {
+ push @inc, $probe_res->{INC};
+ $opts{LIBS} = $probe_res->{LIBS};
+
+ $opts{INC} = "@inc";
+
+ if ($MM_ver > 6.06) {
+ $opts{AUTHOR} = 'Tony Cook <tony@imager.perl.org>';
+ $opts{ABSTRACT} = 'TIFF image file support for Imager';
+ }
+
+ WriteMakefile(%opts);
+}
+else {
+ if ($BUILDING_IMAGER) {
+ WriteEmptyMakefile(%opts);
+ }
+ else {
+ # fail in good way
+ die "OS unsupported: TIFF libraries or headers not found\n";
+ }
+}
+
+sub _tiff_test_code {
+ return <<'CODE';
+static const char ver_base[] = ", Version ";
+static const size_t ver_base_len = sizeof(ver_base) - 1;
+const char *ver_str = TIFFGetVersion();
+const char *ver_start = strstr(ver_str, ver_base);
+const char *ver_end;
+int ver_len;
+
+if (ver_start && ver_start[ver_base_len] >= '3' && ver_start[ver_base_len] < '9') {
+ ver_start += ver_base_len;
+ ver_end = ver_start;
+ while (*ver_end && (*ver_end == '.' || *ver_end >= '0' && *ver_end <= '9'))
+ ++ver_end;
+ ver_len = ver_end - ver_start;
+}
+else {
+ ver_start = "(unknown)";
+ ver_len = strlen(ver_start);
+}
+
+fprintf(stderr, "TIFF: library version %.*s, header version %ld\n", ver_len, ver_start, TIFFLIB_VERSION);
+if (TIFFLIB_VERSION == 20090820) {
+ fprintf(stderr, "TIFF: this appears to be libtiff 3.9.0 which introduced a serious bug\n");
+ fprintf(stderr, "TIFF: please install 3.9.1\n");
+ return 1;
+}
+return 0;
+CODE
+}
--- /dev/null
+package Imager::File::TIFF;
+use strict;
+use Imager;
+use vars qw($VERSION @ISA);
+
+BEGIN {
+ $VERSION = "0.77";
+
+ eval {
+ require XSLoader;
+ XSLoader::load('Imager::File::TIFF', $VERSION);
+ 1;
+ } or do {
+print STDERR "Falling back to DynaLoader ($@)\n";
+ require DynaLoader;
+ push @ISA, 'DynaLoader';
+ bootstrap Imager::File::TIFF $VERSION;
+ };
+}
+
+Imager->register_reader
+ (
+ type=>'tiff',
+ single =>
+ sub {
+ my ($im, $io, %hsh) = @_;
+
+ my $allow_incomplete = $hsh{allow_incomplete};
+ defined $allow_incomplete or $allow_incomplete = 0;
+
+ my $page = $hsh{page};
+ defined $page or $page = 0;
+ $im->{IMG} = i_readtiff_wiol($io, $allow_incomplete, $page);
+
+ unless ($im->{IMG}) {
+ $im->_set_error(Imager->_error_as_msg);
+ return;
+ }
+
+ return $im;
+ },
+ multiple =>
+ sub {
+ my ($io, %hsh) = @_;
+
+ my @imgs = i_readtiff_multi_wiol($io);
+ unless (@imgs) {
+ Imager->_set_error(Imager->_error_as_msg);
+ return;
+ }
+
+ return map bless({ IMG => $_, ERRSTR => undef }, "Imager"), @imgs;
+ },
+ );
+
+Imager->register_writer
+ (
+ type=>'tiff',
+ single =>
+ sub {
+ my ($im, $io, %hsh) = @_;
+
+ $im->_set_opts(\%hsh, "i_", $im);
+ $im->_set_opts(\%hsh, "tiff_", $im);
+ $im->_set_opts(\%hsh, "exif_", $im);
+
+ if (defined $hsh{class} && $hsh{class} eq "fax") {
+ my $fax_fine = $hsh{fax_fine};
+ defined $fax_fine or $fax_fine = 1;
+ if (!i_writetiff_wiol_faxable($im->{IMG}, $io, $fax_fine)) {
+ $im->{ERRSTR} = Imager->_error_as_msg();
+ return undef;
+ }
+ }
+ else {
+ unless (i_writetiff_wiol($im->{IMG}, $io)) {
+ $im->_set_error(Imager->_error_as_msg);
+ return;
+ }
+ }
+ return $im;
+ },
+ multiple =>
+ sub {
+ my ($class, $io, $opts, @ims) = @_;
+
+ Imager->_set_opts($opts, "tiff_", @ims);
+ Imager->_set_opts($opts, "exif_", @ims);
+
+ my @work = map $_->{IMG}, @ims;
+ my $tiff_class = $opts->{class};
+ defined $tiff_class or $tiff_class = "";
+
+ my $result;
+ if ($tiff_class eq "fax") {
+ my $fax_fine = $opts->{fax_fine};
+ defined $fax_fine or $fax_fine = 1;
+ $result = i_writetiff_multi_wiol_faxable($io, $fax_fine, @work);
+ }
+ else {
+ $result = i_writetiff_multi_wiol($io, @work);
+ }
+ unless ($result) {
+ $class->_set_error($class->_error_as_msg);
+ return;
+ }
+
+ return 1;
+ },
+ );
+
+__END__
+
+=head1 NAME
+
+Imager::File::TIFF - read and write TIFF files
+
+=head1 SYNOPSIS
+
+ use Imager;
+
+ my $img = Imager->new;
+ $img->read(file=>"foo.tiff")
+ or die $img->errstr;
+
+ $img->write(file => "foo.tif")
+ or die $img->errstr;
+
+=head1 DESCRIPTION
+
+Imager's TIFF support is documented in L<Imager::Files>.
+
+=head1 AUTHOR
+
+Tony Cook <tony@imager.perl.org>
+
+=head1 SEE ALSO
+
+Imager, Imager::Files.
+
+=cut
--- /dev/null
+#define PERL_NO_GET_CONTEXT
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+#include "imext.h"
+#include "imperl.h"
+#include "imtiff.h"
+
+DEFINE_IMAGER_CALLBACKS;
+
+MODULE = Imager::File::TIFF PACKAGE = Imager::File::TIFF
+
+Imager::ImgRaw
+i_readtiff_wiol(ig, allow_incomplete=0, page=0)
+ Imager::IO ig
+ int allow_incomplete
+ int page
+
+void
+i_readtiff_multi_wiol(ig)
+ Imager::IO ig
+ PREINIT:
+ i_img **imgs;
+ int count;
+ int i;
+ PPCODE:
+ imgs = i_readtiff_multi_wiol(ig, &count);
+ if (imgs) {
+ EXTEND(SP, count);
+ for (i = 0; i < count; ++i) {
+ SV *sv = sv_newmortal();
+ sv_setref_pv(sv, "Imager::ImgRaw", (void *)imgs[i]);
+ PUSHs(sv);
+ }
+ myfree(imgs);
+ }
+
+
+undef_int
+i_writetiff_wiol(im, ig)
+ Imager::ImgRaw im
+ Imager::IO ig
+
+undef_int
+i_writetiff_multi_wiol(ig, ...)
+ Imager::IO ig
+ PREINIT:
+ int i;
+ int img_count;
+ i_img **imgs;
+ CODE:
+ if (items < 2)
+ croak("Usage: i_writetiff_multi_wiol(ig, images...)");
+ img_count = items - 1;
+ RETVAL = 1;
+ if (img_count < 1) {
+ RETVAL = 0;
+ i_clear_error();
+ i_push_error(0, "You need to specify images to save");
+ }
+ else {
+ imgs = mymalloc(sizeof(i_img *) * img_count);
+ for (i = 0; i < img_count; ++i) {
+ SV *sv = ST(1+i);
+ imgs[i] = NULL;
+ if (SvROK(sv) && sv_derived_from(sv, "Imager::ImgRaw")) {
+ imgs[i] = INT2PTR(i_img *, SvIV((SV*)SvRV(sv)));
+ }
+ else {
+ i_clear_error();
+ i_push_error(0, "Only images can be saved");
+ myfree(imgs);
+ RETVAL = 0;
+ break;
+ }
+ }
+ if (RETVAL) {
+ RETVAL = i_writetiff_multi_wiol(ig, imgs, img_count);
+ }
+ myfree(imgs);
+ }
+ OUTPUT:
+ RETVAL
+
+undef_int
+i_writetiff_wiol_faxable(im, ig, fine)
+ Imager::ImgRaw im
+ Imager::IO ig
+ int fine
+
+undef_int
+i_writetiff_multi_wiol_faxable(ig, fine, ...)
+ Imager::IO ig
+ int fine
+ PREINIT:
+ int i;
+ int img_count;
+ i_img **imgs;
+ CODE:
+ if (items < 3)
+ croak("Usage: i_writetiff_multi_wiol_faxable(ig, fine, images...)");
+ img_count = items - 2;
+ RETVAL = 1;
+ if (img_count < 1) {
+ RETVAL = 0;
+ i_clear_error();
+ i_push_error(0, "You need to specify images to save");
+ }
+ else {
+ imgs = mymalloc(sizeof(i_img *) * img_count);
+ for (i = 0; i < img_count; ++i) {
+ SV *sv = ST(2+i);
+ imgs[i] = NULL;
+ if (SvROK(sv) && sv_derived_from(sv, "Imager::ImgRaw")) {
+ imgs[i] = INT2PTR(i_img *, SvIV((SV*)SvRV(sv)));
+ }
+ else {
+ i_clear_error();
+ i_push_error(0, "Only images can be saved");
+ myfree(imgs);
+ RETVAL = 0;
+ break;
+ }
+ }
+ if (RETVAL) {
+ RETVAL = i_writetiff_multi_wiol_faxable(ig, imgs, img_count, fine);
+ }
+ myfree(imgs);
+ }
+ OUTPUT:
+ RETVAL
+
+const char *
+i_tiff_libversion()
+
+bool
+i_tiff_has_compression(name)
+ const char *name
+
+
+BOOT:
+ PERL_INITIALIZE_IMAGER_CALLBACKS;
--- /dev/null
+#include <tiffio.h>
+#include <string.h>
+#include "imtiff.h"
+#include "imext.h"
+
+/* needed to implement our substitute TIFFIsCODECConfigured */
+#if TIFFLIB_VERSION < 20031121
+static int TIFFIsCODECConfigured(uint16 scheme);
+#endif
+
+/*
+=head1 NAME
+
+tiff.c - implements reading and writing tiff files, uses io layer.
+
+=head1 SYNOPSIS
+
+ io_glue *ig = io_new_fd( fd );
+ i_img *im = i_readtiff_wiol(ig, -1); // no limit on how much is read
+ // or
+ io_glue *ig = io_new_fd( fd );
+ return_code = i_writetiff_wiol(im, ig);
+
+=head1 DESCRIPTION
+
+tiff.c implements the basic functions to read and write tiff files.
+It uses the iolayer and needs either a seekable source or an entire
+memory mapped buffer.
+
+=head1 FUNCTION REFERENCE
+
+Some of these functions are internal.
+
+=over
+
+=cut
+*/
+
+#define byteswap_macro(x) \
+ ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | \
+ (((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24))
+
+#define CLAMP8(x) ((x) < 0 ? 0 : (x) > 255 ? 255 : (x))
+#define CLAMP16(x) ((x) < 0 ? 0 : (x) > 65535 ? 65535 : (x))
+
+#define Sample16To8(num) ((num) / 257)
+
+struct tag_name {
+ char *name;
+ uint32 tag;
+};
+
+static i_img *read_one_rgb_tiled(TIFF *tif, int width, int height, int allow_incomplete);
+static i_img *read_one_rgb_lines(TIFF *tif, int width, int height, int allow_incomplete);
+
+static struct tag_name text_tag_names[] =
+{
+ { "tiff_documentname", TIFFTAG_DOCUMENTNAME, },
+ { "tiff_imagedescription", TIFFTAG_IMAGEDESCRIPTION, },
+ { "tiff_make", TIFFTAG_MAKE, },
+ { "tiff_model", TIFFTAG_MODEL, },
+ { "tiff_pagename", TIFFTAG_PAGENAME, },
+ { "tiff_software", TIFFTAG_SOFTWARE, },
+ { "tiff_datetime", TIFFTAG_DATETIME, },
+ { "tiff_artist", TIFFTAG_ARTIST, },
+ { "tiff_hostcomputer", TIFFTAG_HOSTCOMPUTER, },
+};
+
+static struct tag_name
+compress_values[] =
+ {
+ { "none", COMPRESSION_NONE },
+ { "ccittrle", COMPRESSION_CCITTRLE },
+ { "fax3", COMPRESSION_CCITTFAX3 },
+ { "t4", COMPRESSION_CCITTFAX3 },
+ { "fax4", COMPRESSION_CCITTFAX4 },
+ { "t6", COMPRESSION_CCITTFAX4 },
+ { "lzw", COMPRESSION_LZW },
+ { "jpeg", COMPRESSION_JPEG },
+ { "packbits", COMPRESSION_PACKBITS },
+ { "deflate", COMPRESSION_ADOBE_DEFLATE },
+ { "zip", COMPRESSION_ADOBE_DEFLATE },
+ { "oldzip", COMPRESSION_DEFLATE },
+ { "ccittrlew", COMPRESSION_CCITTRLEW },
+ };
+
+static const int compress_value_count =
+ sizeof(compress_values) / sizeof(*compress_values);
+
+static int
+myTIFFIsCODECConfigured(uint16 scheme);
+
+typedef struct read_state_tag read_state_t;
+/* the setup function creates the image object, allocates the line buffer */
+typedef int (*read_setup_t)(read_state_t *state);
+
+/* the putter writes the image data provided by the getter to the
+ image, x, y, width, height describe the target area of the image,
+ extras is the extra number of pixels stored for each scanline in
+ the raster buffer, (for tiles against the right side of the
+ image) */
+
+typedef int (*read_putter_t)(read_state_t *state, int x, int y, int width,
+ int height, int extras);
+
+/* reads from a tiled or strip image and calls the putter.
+ This may need a second type for handling non-contiguous images
+ at some point */
+typedef int (*read_getter_t)(read_state_t *state, read_putter_t putter);
+
+struct read_state_tag {
+ TIFF *tif;
+ i_img *img;
+ void *raster;
+ unsigned long pixels_read;
+ int allow_incomplete;
+ void *line_buf;
+ uint32 width, height;
+ uint16 bits_per_sample;
+ uint16 photometric;
+
+ /* the total number of channels (samples per pixel) */
+ int samples_per_pixel;
+
+ /* if non-zero, which channel is the alpha channel, typically 3 for rgb */
+ int alpha_chan;
+
+ /* whether or not to scale the color channels based on the alpha
+ channel. TIFF has 2 types of alpha channel, if the alpha channel
+ we use is EXTRASAMPLE_ASSOCALPHA then the color data will need to
+ be scaled to match Imager's conventions */
+ int scale_alpha;
+};
+
+static int tile_contig_getter(read_state_t *state, read_putter_t putter);
+static int strip_contig_getter(read_state_t *state, read_putter_t putter);
+
+static int setup_paletted(read_state_t *state);
+static int paletted_putter8(read_state_t *, int, int, int, int, int);
+static int paletted_putter4(read_state_t *, int, int, int, int, int);
+
+static int setup_16_rgb(read_state_t *state);
+static int setup_16_grey(read_state_t *state);
+static int putter_16(read_state_t *, int, int, int, int, int);
+
+static int setup_8_rgb(read_state_t *state);
+static int setup_8_grey(read_state_t *state);
+static int putter_8(read_state_t *, int, int, int, int, int);
+
+static int setup_32_rgb(read_state_t *state);
+static int setup_32_grey(read_state_t *state);
+static int putter_32(read_state_t *, int, int, int, int, int);
+
+static int setup_bilevel(read_state_t *state);
+static int putter_bilevel(read_state_t *, int, int, int, int, int);
+
+static int setup_cmyk8(read_state_t *state);
+static int putter_cmyk8(read_state_t *, int, int, int, int, int);
+
+static int setup_cmyk16(read_state_t *state);
+static int putter_cmyk16(read_state_t *, int, int, int, int, int);
+
+static const int text_tag_count =
+ sizeof(text_tag_names) / sizeof(*text_tag_names);
+
+static void error_handler(char const *module, char const *fmt, va_list ap) {
+ mm_log((1, "tiff error fmt %s\n", fmt));
+ i_push_errorvf(0, fmt, ap);
+}
+
+#define WARN_BUFFER_LIMIT 10000
+static char *warn_buffer = NULL;
+static int warn_buffer_size = 0;
+
+static void warn_handler(char const *module, char const *fmt, va_list ap) {
+ char buf[1000];
+
+ buf[0] = '\0';
+#ifdef HAVE_SNPRINTF
+ vsnprintf(buf, sizeof(buf), fmt, ap);
+#else
+ vsprintf(buf, fmt, ap);
+#endif
+ mm_log((1, "tiff warning %s\n", buf));
+
+ if (!warn_buffer || strlen(warn_buffer)+strlen(buf)+2 > warn_buffer_size) {
+ int new_size = warn_buffer_size + strlen(buf) + 2;
+ char *old_buffer = warn_buffer;
+ if (new_size > WARN_BUFFER_LIMIT) {
+ new_size = WARN_BUFFER_LIMIT;
+ }
+ warn_buffer = myrealloc(warn_buffer, new_size);
+ if (!old_buffer) *warn_buffer = '\0';
+ warn_buffer_size = new_size;
+ }
+ if (strlen(warn_buffer)+strlen(buf)+2 <= warn_buffer_size) {
+ strcat(warn_buffer, buf);
+ strcat(warn_buffer, "\n");
+ }
+}
+
+static int save_tiff_tags(TIFF *tif, i_img *im);
+
+static void
+pack_4bit_to(unsigned char *dest, const unsigned char *src, int count);
+
+
+static toff_t sizeproc(thandle_t x) {
+ return 0;
+}
+
+
+/*
+=item comp_seek(h, o, w)
+
+Compatability for 64 bit systems like latest freebsd (internal)
+
+ h - tiff handle, cast an io_glue object
+ o - offset
+ w - whence
+
+=cut
+*/
+
+static
+toff_t
+comp_seek(thandle_t h, toff_t o, int w) {
+ io_glue *ig = (io_glue*)h;
+ return (toff_t) ig->seekcb(ig, o, w);
+}
+
+/*
+=item comp_mmap(thandle_t, tdata_t*, toff_t*)
+
+Dummy mmap stub.
+
+This shouldn't ever be called but newer tifflibs want it anyway.
+
+=cut
+*/
+
+static
+int
+comp_mmap(thandle_t h, tdata_t*p, toff_t*off) {
+ return -1;
+}
+
+/*
+=item comp_munmap(thandle_t h, tdata_t p, toff_t off)
+
+Dummy munmap stub.
+
+This shouldn't ever be called but newer tifflibs want it anyway.
+
+=cut
+*/
+
+static void
+comp_munmap(thandle_t h, tdata_t p, toff_t off) {
+ /* do nothing */
+}
+
+static i_img *read_one_tiff(TIFF *tif, int allow_incomplete) {
+ i_img *im;
+ uint32 width, height;
+ uint16 samples_per_pixel;
+ int tiled, error;
+ float xres, yres;
+ uint16 resunit;
+ int gotXres, gotYres;
+ uint16 photometric;
+ uint16 bits_per_sample;
+ uint16 planar_config;
+ uint16 inkset;
+ uint16 compress;
+ int i;
+ read_state_t state;
+ read_setup_t setupf = NULL;
+ read_getter_t getterf = NULL;
+ read_putter_t putterf = NULL;
+
+ error = 0;
+
+ TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &width);
+ TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &height);
+ TIFFGetFieldDefaulted(tif, TIFFTAG_SAMPLESPERPIXEL, &samples_per_pixel);
+ tiled = TIFFIsTiled(tif);
+ TIFFGetFieldDefaulted(tif, TIFFTAG_PHOTOMETRIC, &photometric);
+ TIFFGetFieldDefaulted(tif, TIFFTAG_BITSPERSAMPLE, &bits_per_sample);
+ TIFFGetFieldDefaulted(tif, TIFFTAG_PLANARCONFIG, &planar_config);
+ TIFFGetFieldDefaulted(tif, TIFFTAG_INKSET, &inkset);
+
+ mm_log((1, "i_readtiff_wiol: width=%d, height=%d, channels=%d\n", width, height, samples_per_pixel));
+ mm_log((1, "i_readtiff_wiol: %stiled\n", tiled?"":"not "));
+ mm_log((1, "i_readtiff_wiol: %sbyte swapped\n", TIFFIsByteSwapped(tif)?"":"not "));
+
+ /* yes, this if() is horrible */
+ if (photometric == PHOTOMETRIC_PALETTE && bits_per_sample <= 8) {
+ setupf = setup_paletted;
+ if (bits_per_sample == 8)
+ putterf = paletted_putter8;
+ else if (bits_per_sample == 4)
+ putterf = paletted_putter4;
+ else
+ mm_log((1, "unsupported paletted bits_per_sample %d\n", bits_per_sample));
+ }
+ else if (bits_per_sample == 16
+ && photometric == PHOTOMETRIC_RGB
+ && samples_per_pixel >= 3) {
+ setupf = setup_16_rgb;
+ putterf = putter_16;
+ }
+ else if (bits_per_sample == 16
+ && photometric == PHOTOMETRIC_MINISBLACK) {
+ setupf = setup_16_grey;
+ putterf = putter_16;
+ }
+ else if (bits_per_sample == 8
+ && photometric == PHOTOMETRIC_MINISBLACK) {
+ setupf = setup_8_grey;
+ putterf = putter_8;
+ }
+ else if (bits_per_sample == 8
+ && photometric == PHOTOMETRIC_RGB) {
+ setupf = setup_8_rgb;
+ putterf = putter_8;
+ }
+ else if (bits_per_sample == 32
+ && photometric == PHOTOMETRIC_RGB
+ && samples_per_pixel >= 3) {
+ setupf = setup_32_rgb;
+ putterf = putter_32;
+ }
+ else if (bits_per_sample == 32
+ && photometric == PHOTOMETRIC_MINISBLACK) {
+ setupf = setup_32_grey;
+ putterf = putter_32;
+ }
+ else if (bits_per_sample == 1
+ && (photometric == PHOTOMETRIC_MINISBLACK
+ || photometric == PHOTOMETRIC_MINISWHITE)
+ && samples_per_pixel == 1) {
+ setupf = setup_bilevel;
+ putterf = putter_bilevel;
+ }
+ else if (bits_per_sample == 8
+ && photometric == PHOTOMETRIC_SEPARATED
+ && inkset == INKSET_CMYK
+ && samples_per_pixel >= 4) {
+ setupf = setup_cmyk8;
+ putterf = putter_cmyk8;
+ }
+ else if (bits_per_sample == 16
+ && photometric == PHOTOMETRIC_SEPARATED
+ && inkset == INKSET_CMYK
+ && samples_per_pixel >= 4) {
+ setupf = setup_cmyk16;
+ putterf = putter_cmyk16;
+ }
+ if (tiled) {
+ if (planar_config == PLANARCONFIG_CONTIG)
+ getterf = tile_contig_getter;
+ }
+ else {
+ if (planar_config == PLANARCONFIG_CONTIG)
+ getterf = strip_contig_getter;
+ }
+ if (setupf && getterf && putterf) {
+ unsigned long total_pixels = (unsigned long)width * height;
+ memset(&state, 0, sizeof(state));
+ state.tif = tif;
+ state.allow_incomplete = allow_incomplete;
+ state.width = width;
+ state.height = height;
+ state.bits_per_sample = bits_per_sample;
+ state.samples_per_pixel = samples_per_pixel;
+ state.photometric = photometric;
+
+ if (!setupf(&state))
+ return NULL;
+ if (!getterf(&state, putterf) || !state.pixels_read) {
+ if (state.img)
+ i_img_destroy(state.img);
+ if (state.raster)
+ _TIFFfree(state.raster);
+ if (state.line_buf)
+ myfree(state.line_buf);
+
+ return NULL;
+ }
+
+ if (allow_incomplete && state.pixels_read < total_pixels) {
+ i_tags_setn(&(state.img->tags), "i_incomplete", 1);
+ i_tags_setn(&(state.img->tags), "i_lines_read",
+ state.pixels_read / width);
+ }
+ im = state.img;
+
+ if (state.raster)
+ _TIFFfree(state.raster);
+ if (state.line_buf)
+ myfree(state.line_buf);
+ }
+ else {
+ if (tiled) {
+ im = read_one_rgb_tiled(tif, width, height, allow_incomplete);
+ }
+ else {
+ im = read_one_rgb_lines(tif, width, height, allow_incomplete);
+ }
+ }
+
+ if (!im)
+ return NULL;
+
+ /* general metadata */
+ i_tags_setn(&im->tags, "tiff_bitspersample", bits_per_sample);
+ i_tags_setn(&im->tags, "tiff_photometric", photometric);
+ TIFFGetFieldDefaulted(tif, TIFFTAG_COMPRESSION, &compress);
+
+ /* resolution tags */
+ TIFFGetFieldDefaulted(tif, TIFFTAG_RESOLUTIONUNIT, &resunit);
+ gotXres = TIFFGetField(tif, TIFFTAG_XRESOLUTION, &xres);
+ gotYres = TIFFGetField(tif, TIFFTAG_YRESOLUTION, &yres);
+ if (gotXres || gotYres) {
+ if (!gotXres)
+ xres = yres;
+ else if (!gotYres)
+ yres = xres;
+ i_tags_setn(&im->tags, "tiff_resolutionunit", resunit);
+ if (resunit == RESUNIT_CENTIMETER) {
+ /* from dots per cm to dpi */
+ xres *= 2.54;
+ yres *= 2.54;
+ i_tags_set(&im->tags, "tiff_resolutionunit_name", "centimeter", -1);
+ }
+ else if (resunit == RESUNIT_NONE) {
+ i_tags_setn(&im->tags, "i_aspect_only", 1);
+ i_tags_set(&im->tags, "tiff_resolutionunit_name", "none", -1);
+ }
+ else if (resunit == RESUNIT_INCH) {
+ i_tags_set(&im->tags, "tiff_resolutionunit_name", "inch", -1);
+ }
+ else {
+ i_tags_set(&im->tags, "tiff_resolutionunit_name", "unknown", -1);
+ }
+ /* tifflib doesn't seem to provide a way to get to the original rational
+ value of these, which would let me provide a more reasonable
+ precision. So make up a number. */
+ i_tags_set_float2(&im->tags, "i_xres", 0, xres, 6);
+ i_tags_set_float2(&im->tags, "i_yres", 0, yres, 6);
+ }
+
+ /* Text tags */
+ for (i = 0; i < text_tag_count; ++i) {
+ char *data;
+ if (TIFFGetField(tif, text_tag_names[i].tag, &data)) {
+ mm_log((1, "i_readtiff_wiol: tag %d has value %s\n",
+ text_tag_names[i].tag, data));
+ i_tags_set(&im->tags, text_tag_names[i].name, data, -1);
+ }
+ }
+
+ i_tags_set(&im->tags, "i_format", "tiff", 4);
+ if (warn_buffer && *warn_buffer) {
+ i_tags_set(&im->tags, "i_warning", warn_buffer, -1);
+ *warn_buffer = '\0';
+ }
+
+ for (i = 0; i < compress_value_count; ++i) {
+ if (compress_values[i].tag == compress) {
+ i_tags_set(&im->tags, "tiff_compression", compress_values[i].name, -1);
+ break;
+ }
+ }
+
+ return im;
+}
+
+/*
+=item i_readtiff_wiol(im, ig)
+
+=cut
+*/
+i_img*
+i_readtiff_wiol(io_glue *ig, int allow_incomplete, int page) {
+ TIFF* tif;
+ TIFFErrorHandler old_handler;
+ TIFFErrorHandler old_warn_handler;
+ i_img *im;
+
+ i_clear_error();
+ old_handler = TIFFSetErrorHandler(error_handler);
+ old_warn_handler = TIFFSetWarningHandler(warn_handler);
+ if (warn_buffer)
+ *warn_buffer = '\0';
+
+ /* Add code to get the filename info from the iolayer */
+ /* Also add code to check for mmapped code */
+
+ mm_log((1, "i_readtiff_wiol(ig %p, allow_incomplete %d, page %d)\n", ig, allow_incomplete, page));
+
+ tif = TIFFClientOpen("(Iolayer)",
+ "rm",
+ (thandle_t) ig,
+ (TIFFReadWriteProc) ig->readcb,
+ (TIFFReadWriteProc) ig->writecb,
+ (TIFFSeekProc) comp_seek,
+ (TIFFCloseProc) ig->closecb,
+ ig->sizecb ? (TIFFSizeProc) ig->sizecb : (TIFFSizeProc) sizeproc,
+ (TIFFMapFileProc) comp_mmap,
+ (TIFFUnmapFileProc) comp_munmap);
+
+ if (!tif) {
+ mm_log((1, "i_readtiff_wiol: Unable to open tif file\n"));
+ i_push_error(0, "Error opening file");
+ TIFFSetErrorHandler(old_handler);
+ TIFFSetWarningHandler(old_warn_handler);
+ return NULL;
+ }
+
+ if (page != 0) {
+ if (!TIFFSetDirectory(tif, page)) {
+ mm_log((1, "i_readtiff_wiol: Unable to switch to directory %d\n", page));
+ i_push_errorf(0, "could not switch to page %d", page);
+ TIFFSetErrorHandler(old_handler);
+ TIFFSetWarningHandler(old_warn_handler);
+ TIFFClose(tif);
+ return NULL;
+ }
+ }
+
+ im = read_one_tiff(tif, allow_incomplete);
+
+ if (TIFFLastDirectory(tif)) mm_log((1, "Last directory of tiff file\n"));
+ TIFFSetErrorHandler(old_handler);
+ TIFFSetWarningHandler(old_warn_handler);
+ TIFFClose(tif);
+ return im;
+}
+
+/*
+=item i_readtiff_multi_wiol(ig, *count)
+
+Reads multiple images from a TIFF.
+
+=cut
+*/
+i_img**
+i_readtiff_multi_wiol(io_glue *ig, int *count) {
+ TIFF* tif;
+ TIFFErrorHandler old_handler;
+ TIFFErrorHandler old_warn_handler;
+ i_img **results = NULL;
+ int result_alloc = 0;
+ int dirnum = 0;
+
+ i_clear_error();
+ old_handler = TIFFSetErrorHandler(error_handler);
+ old_warn_handler = TIFFSetWarningHandler(warn_handler);
+ if (warn_buffer)
+ *warn_buffer = '\0';
+
+ /* Add code to get the filename info from the iolayer */
+ /* Also add code to check for mmapped code */
+
+ mm_log((1, "i_readtiff_wiol(ig %p, length %d)\n", ig));
+
+ tif = TIFFClientOpen("(Iolayer)",
+ "rm",
+ (thandle_t) ig,
+ (TIFFReadWriteProc) ig->readcb,
+ (TIFFReadWriteProc) ig->writecb,
+ (TIFFSeekProc) comp_seek,
+ (TIFFCloseProc) ig->closecb,
+ ig->sizecb ? (TIFFSizeProc) ig->sizecb : (TIFFSizeProc) sizeproc,
+ (TIFFMapFileProc) comp_mmap,
+ (TIFFUnmapFileProc) comp_munmap);
+
+ if (!tif) {
+ mm_log((1, "i_readtiff_wiol: Unable to open tif file\n"));
+ i_push_error(0, "Error opening file");
+ TIFFSetErrorHandler(old_handler);
+ TIFFSetWarningHandler(old_warn_handler);
+ return NULL;
+ }
+
+ *count = 0;
+ do {
+ i_img *im = read_one_tiff(tif, 0);
+ if (!im)
+ break;
+ if (++*count > result_alloc) {
+ if (result_alloc == 0) {
+ result_alloc = 5;
+ results = mymalloc(result_alloc * sizeof(i_img *));
+ }
+ else {
+ i_img **newresults;
+ result_alloc *= 2;
+ newresults = myrealloc(results, result_alloc * sizeof(i_img *));
+ if (!newresults) {
+ i_img_destroy(im); /* don't leak it */
+ break;
+ }
+ results = newresults;
+ }
+ }
+ results[*count-1] = im;
+ } while (TIFFSetDirectory(tif, ++dirnum));
+
+ TIFFSetWarningHandler(old_warn_handler);
+ TIFFSetErrorHandler(old_handler);
+ TIFFClose(tif);
+ return results;
+}
+
+undef_int
+i_writetiff_low_faxable(TIFF *tif, i_img *im, int fine) {
+ uint32 width, height;
+ unsigned char *linebuf = NULL;
+ uint32 y;
+ int rc;
+ uint32 x;
+ uint32 rowsperstrip;
+ float vres = fine ? 196 : 98;
+ int luma_chan;
+
+ width = im->xsize;
+ height = im->ysize;
+
+ switch (im->channels) {
+ case 1:
+ case 2:
+ luma_chan = 0;
+ break;
+ case 3:
+ case 4:
+ luma_chan = 1;
+ break;
+ default:
+ /* This means a colorspace we don't handle yet */
+ mm_log((1, "i_writetiff_wiol_faxable: don't handle %d channel images.\n", im->channels));
+ return 0;
+ }
+
+ /* Add code to get the filename info from the iolayer */
+ /* Also add code to check for mmapped code */
+
+
+ mm_log((1, "i_writetiff_wiol_faxable: width=%d, height=%d, channels=%d\n", width, height, im->channels));
+
+ if (!TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, width) )
+ { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField width=%d failed\n", width)); return 0; }
+ if (!TIFFSetField(tif, TIFFTAG_IMAGELENGTH, height) )
+ { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField length=%d failed\n", height)); return 0; }
+ if (!TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1))
+ { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField samplesperpixel=1 failed\n")); return 0; }
+ if (!TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT))
+ { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField Orientation=topleft\n")); return 0; }
+ if (!TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 1) )
+ { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField bitpersample=1\n")); return 0; }
+ if (!TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG))
+ { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField planarconfig\n")); return 0; }
+ if (!TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISWHITE))
+ { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField photometric=%d\n", PHOTOMETRIC_MINISBLACK)); return 0; }
+ if (!TIFFSetField(tif, TIFFTAG_COMPRESSION, 3))
+ { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField compression=3\n")); return 0; }
+
+ linebuf = (unsigned char *)_TIFFmalloc( TIFFScanlineSize(tif) );
+
+ if (!TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(tif, -1))) {
+ mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField rowsperstrip=-1\n")); return 0; }
+
+ TIFFGetField(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip);
+ TIFFGetField(tif, TIFFTAG_ROWSPERSTRIP, &rc);
+
+ mm_log((1, "i_writetiff_wiol_faxable: TIFFGetField rowsperstrip=%d\n", rowsperstrip));
+ mm_log((1, "i_writetiff_wiol_faxable: TIFFGetField scanlinesize=%d\n", TIFFScanlineSize(tif) ));
+ mm_log((1, "i_writetiff_wiol_faxable: TIFFGetField planarconfig=%d == %d\n", rc, PLANARCONFIG_CONTIG));
+
+ if (!TIFFSetField(tif, TIFFTAG_XRESOLUTION, (float)204))
+ { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField Xresolution=204\n")); return 0; }
+ if (!TIFFSetField(tif, TIFFTAG_YRESOLUTION, vres))
+ { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField Yresolution=196\n")); return 0; }
+ if (!TIFFSetField(tif, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH)) {
+ mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField ResolutionUnit=%d\n", RESUNIT_INCH)); return 0;
+ }
+
+ if (!save_tiff_tags(tif, im)) {
+ return 0;
+ }
+
+ for (y=0; y<height; y++) {
+ int linebufpos=0;
+ for(x=0; x<width; x+=8) {
+ int bits;
+ int bitpos;
+ i_sample_t luma[8];
+ uint8 bitval = 128;
+ linebuf[linebufpos]=0;
+ bits = width-x; if(bits>8) bits=8;
+ i_gsamp(im, x, x+8, y, luma, &luma_chan, 1);
+ for(bitpos=0;bitpos<bits;bitpos++) {
+ linebuf[linebufpos] |= ((luma[bitpos] < 128) ? bitval : 0);
+ bitval >>= 1;
+ }
+ linebufpos++;
+ }
+ if (TIFFWriteScanline(tif, linebuf, y, 0) < 0) {
+ mm_log((1, "i_writetiff_wiol_faxable: TIFFWriteScanline failed.\n"));
+ break;
+ }
+ }
+ if (linebuf) _TIFFfree(linebuf);
+
+ return 1;
+}
+
+static uint16
+find_compression(char const *name, uint16 *compress) {
+ int i;
+
+ for (i = 0; i < compress_value_count; ++i) {
+ if (strcmp(compress_values[i].name, name) == 0) {
+ *compress = (uint16)compress_values[i].tag;
+ return 1;
+ }
+ }
+ *compress = COMPRESSION_NONE;
+
+ return 0;
+}
+
+static uint16
+get_compression(i_img *im, uint16 def_compress) {
+ int entry;
+ int value;
+
+ if (i_tags_find(&im->tags, "tiff_compression", 0, &entry)
+ && im->tags.tags[entry].data) {
+ uint16 compress;
+ if (find_compression(im->tags.tags[entry].data, &compress)
+ && myTIFFIsCODECConfigured(compress))
+ return compress;
+ }
+ if (i_tags_get_int(&im->tags, "tiff_compression", 0, &value)) {
+ if ((uint16)value == value
+ && myTIFFIsCODECConfigured((uint16)value))
+ return (uint16)value;
+ }
+
+ return def_compress;
+}
+
+int
+i_tiff_has_compression(const char *name) {
+ uint16 compress;
+
+ if (!find_compression(name, &compress))
+ return 0;
+
+ return myTIFFIsCODECConfigured(compress);
+}
+
+static int
+set_base_tags(TIFF *tif, i_img *im, uint16 compress, uint16 photometric,
+ uint16 bits_per_sample, uint16 samples_per_pixel) {
+ double xres, yres;
+ int resunit;
+ int got_xres, got_yres;
+ int aspect_only;
+
+ if (!TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, im->xsize)) {
+ i_push_error(0, "write TIFF: setting width tag");
+ return 0;
+ }
+ if (!TIFFSetField(tif, TIFFTAG_IMAGELENGTH, im->ysize)) {
+ i_push_error(0, "write TIFF: setting length tag");
+ return 0;
+ }
+ if (!TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT)) {
+ i_push_error(0, "write TIFF: setting orientation tag");
+ return 0;
+ }
+ if (!TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG)) {
+ i_push_error(0, "write TIFF: setting planar configuration tag");
+ return 0;
+ }
+ if (!TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, photometric)) {
+ i_push_error(0, "write TIFF: setting photometric tag");
+ return 0;
+ }
+ if (!TIFFSetField(tif, TIFFTAG_COMPRESSION, compress)) {
+ i_push_error(0, "write TIFF: setting compression tag");
+ return 0;
+ }
+ if (!TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, bits_per_sample)) {
+ i_push_error(0, "write TIFF: setting bits per sample tag");
+ return 0;
+ }
+ if (!TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, samples_per_pixel)) {
+ i_push_error(0, "write TIFF: setting samples per pixel tag");
+ return 0;
+ }
+
+ got_xres = i_tags_get_float(&im->tags, "i_xres", 0, &xres);
+ got_yres = i_tags_get_float(&im->tags, "i_yres", 0, &yres);
+ if (!i_tags_get_int(&im->tags, "i_aspect_only", 0,&aspect_only))
+ aspect_only = 0;
+ if (!i_tags_get_int(&im->tags, "tiff_resolutionunit", 0, &resunit))
+ resunit = RESUNIT_INCH;
+ if (got_xres || got_yres) {
+ if (!got_xres)
+ xres = yres;
+ else if (!got_yres)
+ yres = xres;
+ if (aspect_only) {
+ resunit = RESUNIT_NONE;
+ }
+ else {
+ if (resunit == RESUNIT_CENTIMETER) {
+ xres /= 2.54;
+ yres /= 2.54;
+ }
+ else {
+ resunit = RESUNIT_INCH;
+ }
+ }
+ if (!TIFFSetField(tif, TIFFTAG_XRESOLUTION, (float)xres)) {
+ i_push_error(0, "write TIFF: setting xresolution tag");
+ return 0;
+ }
+ if (!TIFFSetField(tif, TIFFTAG_YRESOLUTION, (float)yres)) {
+ i_push_error(0, "write TIFF: setting yresolution tag");
+ return 0;
+ }
+ if (!TIFFSetField(tif, TIFFTAG_RESOLUTIONUNIT, (uint16)resunit)) {
+ i_push_error(0, "write TIFF: setting resolutionunit tag");
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+static int
+write_one_bilevel(TIFF *tif, i_img *im, int zero_is_white) {
+ uint16 compress = get_compression(im, COMPRESSION_PACKBITS);
+ uint16 photometric;
+ unsigned char *in_row;
+ unsigned char *out_row;
+ unsigned out_size;
+ int x, y;
+ int invert;
+
+ mm_log((1, "tiff - write_one_bilevel(tif %p, im %p, zero_is_white %d)\n",
+ tif, im, zero_is_white));
+
+ /* ignore a silly choice */
+ if (compress == COMPRESSION_JPEG)
+ compress = COMPRESSION_PACKBITS;
+
+ switch (compress) {
+ case COMPRESSION_CCITTRLE:
+ case COMPRESSION_CCITTFAX3:
+ case COMPRESSION_CCITTFAX4:
+ /* natural fax photometric */
+ photometric = PHOTOMETRIC_MINISWHITE;
+ break;
+
+ default:
+ /* natural for most computer images */
+ photometric = PHOTOMETRIC_MINISBLACK;
+ break;
+ }
+
+ if (!set_base_tags(tif, im, compress, photometric, 1, 1))
+ return 0;
+
+ if (!TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(tif, -1))) {
+ i_push_error(0, "write TIFF: setting rows per strip tag");
+ return 0;
+ }
+
+ out_size = TIFFScanlineSize(tif);
+ out_row = (unsigned char *)_TIFFmalloc( out_size );
+ in_row = mymalloc(im->xsize);
+
+ invert = (photometric == PHOTOMETRIC_MINISWHITE) != (zero_is_white != 0);
+
+ for (y = 0; y < im->ysize; ++y) {
+ int mask = 0x80;
+ unsigned char *outp = out_row;
+ memset(out_row, 0, out_size);
+ i_gpal(im, 0, im->xsize, y, in_row);
+ for (x = 0; x < im->xsize; ++x) {
+ if (invert ? !in_row[x] : in_row[x]) {
+ *outp |= mask;
+ }
+ mask >>= 1;
+ if (!mask) {
+ ++outp;
+ mask = 0x80;
+ }
+ }
+ if (TIFFWriteScanline(tif, out_row, y, 0) < 0) {
+ _TIFFfree(out_row);
+ myfree(in_row);
+ i_push_error(0, "write TIFF: write scan line failed");
+ return 0;
+ }
+ }
+
+ _TIFFfree(out_row);
+ myfree(in_row);
+
+ return 1;
+}
+
+static int
+set_palette(TIFF *tif, i_img *im, int size) {
+ int count;
+ uint16 *colors;
+ uint16 *out[3];
+ i_color c;
+ int i, ch;
+
+ colors = (uint16 *)_TIFFmalloc(sizeof(uint16) * 3 * size);
+ out[0] = colors;
+ out[1] = colors + size;
+ out[2] = colors + 2 * size;
+
+ count = i_colorcount(im);
+ for (i = 0; i < count; ++i) {
+ i_getcolors(im, i, &c, 1);
+ for (ch = 0; ch < 3; ++ch)
+ out[ch][i] = c.channel[ch] * 257;
+ }
+ for (; i < size; ++i) {
+ for (ch = 0; ch < 3; ++ch)
+ out[ch][i] = 0;
+ }
+ if (!TIFFSetField(tif, TIFFTAG_COLORMAP, out[0], out[1], out[2])) {
+ _TIFFfree(colors);
+ i_push_error(0, "write TIFF: setting color map");
+ return 0;
+ }
+ _TIFFfree(colors);
+
+ return 1;
+}
+
+static int
+write_one_paletted8(TIFF *tif, i_img *im) {
+ uint16 compress = get_compression(im, COMPRESSION_PACKBITS);
+ unsigned char *out_row;
+ unsigned out_size;
+ int y;
+
+ mm_log((1, "tiff - write_one_paletted8(tif %p, im %p)\n", tif, im));
+
+ /* ignore a silly choice */
+ if (compress == COMPRESSION_JPEG ||
+ compress == COMPRESSION_CCITTRLE ||
+ compress == COMPRESSION_CCITTFAX3 ||
+ compress == COMPRESSION_CCITTFAX4)
+ compress = COMPRESSION_PACKBITS;
+
+ if (!TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(tif, -1))) {
+ i_push_error(0, "write TIFF: setting rows per strip tag");
+ return 0;
+ }
+
+ if (!set_base_tags(tif, im, compress, PHOTOMETRIC_PALETTE, 8, 1))
+ return 0;
+
+ if (!set_palette(tif, im, 256))
+ return 0;
+
+ out_size = TIFFScanlineSize(tif);
+ out_row = (unsigned char *)_TIFFmalloc( out_size );
+
+ for (y = 0; y < im->ysize; ++y) {
+ i_gpal(im, 0, im->xsize, y, out_row);
+ if (TIFFWriteScanline(tif, out_row, y, 0) < 0) {
+ _TIFFfree(out_row);
+ i_push_error(0, "write TIFF: write scan line failed");
+ return 0;
+ }
+ }
+
+ _TIFFfree(out_row);
+
+ return 1;
+}
+
+static int
+write_one_paletted4(TIFF *tif, i_img *im) {
+ uint16 compress = get_compression(im, COMPRESSION_PACKBITS);
+ unsigned char *in_row;
+ unsigned char *out_row;
+ unsigned out_size;
+ int y;
+
+ mm_log((1, "tiff - write_one_paletted4(tif %p, im %p)\n", tif, im));
+
+ /* ignore a silly choice */
+ if (compress == COMPRESSION_JPEG ||
+ compress == COMPRESSION_CCITTRLE ||
+ compress == COMPRESSION_CCITTFAX3 ||
+ compress == COMPRESSION_CCITTFAX4)
+ compress = COMPRESSION_PACKBITS;
+
+ if (!set_base_tags(tif, im, compress, PHOTOMETRIC_PALETTE, 4, 1))
+ return 0;
+
+ if (!set_palette(tif, im, 16))
+ return 0;
+
+ if (!TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(tif, -1))) {
+ i_push_error(0, "write TIFF: setting rows per strip tag");
+ return 0;
+ }
+
+ in_row = mymalloc(im->xsize);
+ out_size = TIFFScanlineSize(tif);
+ out_row = (unsigned char *)_TIFFmalloc( out_size );
+
+ for (y = 0; y < im->ysize; ++y) {
+ i_gpal(im, 0, im->xsize, y, in_row);
+ memset(out_row, 0, out_size);
+ pack_4bit_to(out_row, in_row, im->xsize);
+ if (TIFFWriteScanline(tif, out_row, y, 0) < 0) {
+ _TIFFfree(out_row);
+ i_push_error(0, "write TIFF: write scan line failed");
+ return 0;
+ }
+ }
+
+ myfree(in_row);
+ _TIFFfree(out_row);
+
+ return 1;
+}
+
+static int
+set_direct_tags(TIFF *tif, i_img *im, uint16 compress,
+ uint16 bits_per_sample) {
+ uint16 extras = EXTRASAMPLE_ASSOCALPHA;
+ uint16 extra_count = im->channels == 2 || im->channels == 4;
+ uint16 photometric = im->channels >= 3 ?
+ PHOTOMETRIC_RGB : PHOTOMETRIC_MINISBLACK;
+
+ if (!set_base_tags(tif, im, compress, photometric, bits_per_sample,
+ im->channels)) {
+ return 0;
+ }
+
+ if (extra_count) {
+ if (!TIFFSetField(tif, TIFFTAG_EXTRASAMPLES, extra_count, &extras)) {
+ i_push_error(0, "write TIFF: setting extra samples tag");
+ return 0;
+ }
+ }
+
+ if (compress == COMPRESSION_JPEG) {
+ int jpeg_quality;
+ if (i_tags_get_int(&im->tags, "tiff_jpegquality", 0, &jpeg_quality)
+ && jpeg_quality >= 0 && jpeg_quality <= 100) {
+ if (!TIFFSetField(tif, TIFFTAG_JPEGQUALITY, jpeg_quality)) {
+ i_push_error(0, "write TIFF: setting jpeg quality pseudo-tag");
+ return 0;
+ }
+ }
+ }
+
+ return 1;
+}
+
+static int
+write_one_32(TIFF *tif, i_img *im) {
+ uint16 compress = get_compression(im, COMPRESSION_PACKBITS);
+ unsigned *in_row;
+ size_t out_size;
+ uint32 *out_row;
+ int y;
+ size_t sample_count = im->xsize * im->channels;
+ size_t sample_index;
+
+ mm_log((1, "tiff - write_one_32(tif %p, im %p)\n", tif, im));
+
+ /* only 8 and 12 bit samples are supported by jpeg compression */
+ if (compress == COMPRESSION_JPEG)
+ compress = COMPRESSION_PACKBITS;
+
+ if (!set_direct_tags(tif, im, compress, 32))
+ return 0;
+
+ in_row = mymalloc(sample_count * sizeof(unsigned));
+ out_size = TIFFScanlineSize(tif);
+ out_row = (uint32 *)_TIFFmalloc( out_size );
+
+ for (y = 0; y < im->ysize; ++y) {
+ if (i_gsamp_bits(im, 0, im->xsize, y, in_row, NULL, im->channels, 32) <= 0) {
+ i_push_error(0, "Cannot read 32-bit samples");
+ return 0;
+ }
+ for (sample_index = 0; sample_index < sample_count; ++sample_index)
+ out_row[sample_index] = in_row[sample_index];
+ if (TIFFWriteScanline(tif, out_row, y, 0) < 0) {
+ myfree(in_row);
+ _TIFFfree(out_row);
+ i_push_error(0, "write TIFF: write scan line failed");
+ return 0;
+ }
+ }
+
+ myfree(in_row);
+ _TIFFfree(out_row);
+
+ return 1;
+}
+
+static int
+write_one_16(TIFF *tif, i_img *im) {
+ uint16 compress = get_compression(im, COMPRESSION_PACKBITS);
+ unsigned *in_row;
+ size_t out_size;
+ uint16 *out_row;
+ int y;
+ size_t sample_count = im->xsize * im->channels;
+ size_t sample_index;
+
+ mm_log((1, "tiff - write_one_16(tif %p, im %p)\n", tif, im));
+
+ /* only 8 and 12 bit samples are supported by jpeg compression */
+ if (compress == COMPRESSION_JPEG)
+ compress = COMPRESSION_PACKBITS;
+
+ if (!set_direct_tags(tif, im, compress, 16))
+ return 0;
+
+ in_row = mymalloc(sample_count * sizeof(unsigned));
+ out_size = TIFFScanlineSize(tif);
+ out_row = (uint16 *)_TIFFmalloc( out_size );
+
+ for (y = 0; y < im->ysize; ++y) {
+ if (i_gsamp_bits(im, 0, im->xsize, y, in_row, NULL, im->channels, 16) <= 0) {
+ i_push_error(0, "Cannot read 16-bit samples");
+ return 0;
+ }
+ for (sample_index = 0; sample_index < sample_count; ++sample_index)
+ out_row[sample_index] = in_row[sample_index];
+ if (TIFFWriteScanline(tif, out_row, y, 0) < 0) {
+ myfree(in_row);
+ _TIFFfree(out_row);
+ i_push_error(0, "write TIFF: write scan line failed");
+ return 0;
+ }
+ }
+
+ myfree(in_row);
+ _TIFFfree(out_row);
+
+ return 1;
+}
+
+static int
+write_one_8(TIFF *tif, i_img *im) {
+ uint16 compress = get_compression(im, COMPRESSION_PACKBITS);
+ size_t out_size;
+ unsigned char *out_row;
+ int y;
+ size_t sample_count = im->xsize * im->channels;
+
+ mm_log((1, "tiff - write_one_8(tif %p, im %p)\n", tif, im));
+
+ if (!set_direct_tags(tif, im, compress, 8))
+ return 0;
+
+ out_size = TIFFScanlineSize(tif);
+ if (out_size < sample_count)
+ out_size = sample_count;
+ out_row = (unsigned char *)_TIFFmalloc( out_size );
+
+ for (y = 0; y < im->ysize; ++y) {
+ if (i_gsamp(im, 0, im->xsize, y, out_row, NULL, im->channels) <= 0) {
+ i_push_error(0, "Cannot read 8-bit samples");
+ return 0;
+ }
+ if (TIFFWriteScanline(tif, out_row, y, 0) < 0) {
+ _TIFFfree(out_row);
+ i_push_error(0, "write TIFF: write scan line failed");
+ return 0;
+ }
+ }
+ _TIFFfree(out_row);
+
+ return 1;
+}
+
+static int
+i_writetiff_low(TIFF *tif, i_img *im) {
+ uint32 width, height;
+ uint16 channels;
+ int zero_is_white;
+
+ width = im->xsize;
+ height = im->ysize;
+ channels = im->channels;
+
+ mm_log((1, "i_writetiff_low: width=%d, height=%d, channels=%d, bits=%d\n", width, height, channels, im->bits));
+ if (im->type == i_palette_type) {
+ mm_log((1, "i_writetiff_low: paletted, colors=%d\n", i_colorcount(im)));
+ }
+
+ if (i_img_is_monochrome(im, &zero_is_white)) {
+ if (!write_one_bilevel(tif, im, zero_is_white))
+ return 0;
+ }
+ else if (im->type == i_palette_type) {
+ if (i_colorcount(im) <= 16) {
+ if (!write_one_paletted4(tif, im))
+ return 0;
+ }
+ else {
+ if (!write_one_paletted8(tif, im))
+ return 0;
+ }
+ }
+ else if (im->bits > 16) {
+ if (!write_one_32(tif, im))
+ return 0;
+ }
+ else if (im->bits > 8) {
+ if (!write_one_16(tif, im))
+ return 0;
+ }
+ else {
+ if (!write_one_8(tif, im))
+ return 0;
+ }
+
+ if (!save_tiff_tags(tif, im))
+ return 0;
+
+ return 1;
+}
+
+/*
+=item i_writetiff_multi_wiol(ig, imgs, count, fine_mode)
+
+Stores an image in the iolayer object.
+
+ ig - io_object that defines source to write to
+ imgs,count - the images to write
+
+=cut
+*/
+
+undef_int
+i_writetiff_multi_wiol(io_glue *ig, i_img **imgs, int count) {
+ TIFF* tif;
+ TIFFErrorHandler old_handler;
+ int i;
+
+ old_handler = TIFFSetErrorHandler(error_handler);
+
+ i_clear_error();
+ mm_log((1, "i_writetiff_multi_wiol(ig 0x%p, imgs 0x%p, count %d)\n",
+ ig, imgs, count));
+
+ /* FIXME: Enable the mmap interface */
+
+ tif = TIFFClientOpen("No name",
+ "wm",
+ (thandle_t) ig,
+ (TIFFReadWriteProc) ig->readcb,
+ (TIFFReadWriteProc) ig->writecb,
+ (TIFFSeekProc) comp_seek,
+ (TIFFCloseProc) ig->closecb,
+ ig->sizecb ? (TIFFSizeProc) ig->sizecb : (TIFFSizeProc) sizeproc,
+ (TIFFMapFileProc) comp_mmap,
+ (TIFFUnmapFileProc) comp_munmap);
+
+
+
+ if (!tif) {
+ mm_log((1, "i_writetiff_multi_wiol: Unable to open tif file for writing\n"));
+ i_push_error(0, "Could not create TIFF object");
+ TIFFSetErrorHandler(old_handler);
+ return 0;
+ }
+
+ for (i = 0; i < count; ++i) {
+ if (!i_writetiff_low(tif, imgs[i])) {
+ TIFFClose(tif);
+ TIFFSetErrorHandler(old_handler);
+ return 0;
+ }
+
+ if (!TIFFWriteDirectory(tif)) {
+ i_push_error(0, "Cannot write TIFF directory");
+ TIFFClose(tif);
+ TIFFSetErrorHandler(old_handler);
+ return 0;
+ }
+ }
+
+ TIFFSetErrorHandler(old_handler);
+ (void) TIFFClose(tif);
+
+ return 1;
+}
+
+/*
+=item i_writetiff_multi_wiol_faxable(ig, imgs, count, fine_mode)
+
+Stores an image in the iolayer object.
+
+ ig - io_object that defines source to write to
+ imgs,count - the images to write
+ fine_mode - select fine or normal mode fax images
+
+=cut
+*/
+
+
+undef_int
+i_writetiff_multi_wiol_faxable(io_glue *ig, i_img **imgs, int count, int fine) {
+ TIFF* tif;
+ int i;
+ TIFFErrorHandler old_handler;
+
+ old_handler = TIFFSetErrorHandler(error_handler);
+
+ i_clear_error();
+ mm_log((1, "i_writetiff_multi_wiol(ig 0x%p, imgs 0x%p, count %d)\n",
+ ig, imgs, count));
+
+ /* FIXME: Enable the mmap interface */
+
+ tif = TIFFClientOpen("No name",
+ "wm",
+ (thandle_t) ig,
+ (TIFFReadWriteProc) ig->readcb,
+ (TIFFReadWriteProc) ig->writecb,
+ (TIFFSeekProc) comp_seek,
+ (TIFFCloseProc) ig->closecb,
+ ig->sizecb ? (TIFFSizeProc) ig->sizecb : (TIFFSizeProc) sizeproc,
+ (TIFFMapFileProc) comp_mmap,
+ (TIFFUnmapFileProc) comp_munmap);
+
+
+
+ if (!tif) {
+ mm_log((1, "i_writetiff_mulit_wiol: Unable to open tif file for writing\n"));
+ i_push_error(0, "Could not create TIFF object");
+ TIFFSetErrorHandler(old_handler);
+ return 0;
+ }
+
+ for (i = 0; i < count; ++i) {
+ if (!i_writetiff_low_faxable(tif, imgs[i], fine)) {
+ TIFFClose(tif);
+ TIFFSetErrorHandler(old_handler);
+ return 0;
+ }
+
+ if (!TIFFWriteDirectory(tif)) {
+ i_push_error(0, "Cannot write TIFF directory");
+ TIFFClose(tif);
+ TIFFSetErrorHandler(old_handler);
+ return 0;
+ }
+ }
+
+ (void) TIFFClose(tif);
+ TIFFSetErrorHandler(old_handler);
+
+ return 1;
+}
+
+/*
+=item i_writetiff_wiol(im, ig)
+
+Stores an image in the iolayer object.
+
+ im - image object to write out
+ ig - io_object that defines source to write to
+
+=cut
+*/
+undef_int
+i_writetiff_wiol(i_img *img, io_glue *ig) {
+ TIFF* tif;
+ TIFFErrorHandler old_handler;
+
+ old_handler = TIFFSetErrorHandler(error_handler);
+
+ i_clear_error();
+ mm_log((1, "i_writetiff_wiol(img %p, ig 0x%p)\n", img, ig));
+
+ /* FIXME: Enable the mmap interface */
+
+ tif = TIFFClientOpen("No name",
+ "wm",
+ (thandle_t) ig,
+ (TIFFReadWriteProc) ig->readcb,
+ (TIFFReadWriteProc) ig->writecb,
+ (TIFFSeekProc) comp_seek,
+ (TIFFCloseProc) ig->closecb,
+ ig->sizecb ? (TIFFSizeProc) ig->sizecb : (TIFFSizeProc) sizeproc,
+ (TIFFMapFileProc) comp_mmap,
+ (TIFFUnmapFileProc) comp_munmap);
+
+
+
+ if (!tif) {
+ mm_log((1, "i_writetiff_wiol: Unable to open tif file for writing\n"));
+ i_push_error(0, "Could not create TIFF object");
+ TIFFSetErrorHandler(old_handler);
+ return 0;
+ }
+
+ if (!i_writetiff_low(tif, img)) {
+ TIFFClose(tif);
+ TIFFSetErrorHandler(old_handler);
+ return 0;
+ }
+
+ (void) TIFFClose(tif);
+ TIFFSetErrorHandler(old_handler);
+
+ return 1;
+}
+
+
+
+/*
+=item i_writetiff_wiol_faxable(i_img *, io_glue *)
+
+Stores an image in the iolayer object in faxable tiff format.
+
+ im - image object to write out
+ ig - io_object that defines source to write to
+
+Note, this may be rewritten to use to simply be a call to a
+lower-level function that gives more options for writing tiff at some
+point.
+
+=cut
+*/
+
+undef_int
+i_writetiff_wiol_faxable(i_img *im, io_glue *ig, int fine) {
+ TIFF* tif;
+ TIFFErrorHandler old_handler;
+
+ old_handler = TIFFSetErrorHandler(error_handler);
+
+ i_clear_error();
+ mm_log((1, "i_writetiff_wiol(img %p, ig 0x%p)\n", im, ig));
+
+ /* FIXME: Enable the mmap interface */
+
+ tif = TIFFClientOpen("No name",
+ "wm",
+ (thandle_t) ig,
+ (TIFFReadWriteProc) ig->readcb,
+ (TIFFReadWriteProc) ig->writecb,
+ (TIFFSeekProc) comp_seek,
+ (TIFFCloseProc) ig->closecb,
+ ig->sizecb ? (TIFFSizeProc) ig->sizecb : (TIFFSizeProc) sizeproc,
+ (TIFFMapFileProc) comp_mmap,
+ (TIFFUnmapFileProc) comp_munmap);
+
+
+
+ if (!tif) {
+ mm_log((1, "i_writetiff_wiol: Unable to open tif file for writing\n"));
+ i_push_error(0, "Could not create TIFF object");
+ TIFFSetErrorHandler(old_handler);
+ return 0;
+ }
+
+ if (!i_writetiff_low_faxable(tif, im, fine)) {
+ TIFFClose(tif);
+ TIFFSetErrorHandler(old_handler);
+ return 0;
+ }
+
+ (void) TIFFClose(tif);
+ TIFFSetErrorHandler(old_handler);
+
+ return 1;
+}
+
+static int save_tiff_tags(TIFF *tif, i_img *im) {
+ int i;
+
+ for (i = 0; i < text_tag_count; ++i) {
+ int entry;
+ if (i_tags_find(&im->tags, text_tag_names[i].name, 0, &entry)) {
+ if (!TIFFSetField(tif, text_tag_names[i].tag,
+ im->tags.tags[entry].data)) {
+ i_push_errorf(0, "cannot save %s to TIFF", text_tag_names[i].name);
+ return 0;
+ }
+ }
+ }
+
+ return 1;
+}
+
+
+static void
+unpack_4bit_to(unsigned char *dest, const unsigned char *src,
+ int src_byte_count) {
+ while (src_byte_count > 0) {
+ *dest++ = *src >> 4;
+ *dest++ = *src++ & 0xf;
+ --src_byte_count;
+ }
+}
+
+static void pack_4bit_to(unsigned char *dest, const unsigned char *src,
+ int pixel_count) {
+ int i = 0;
+ while (i < pixel_count) {
+ if ((i & 1) == 0) {
+ *dest = *src++ << 4;
+ }
+ else {
+ *dest++ |= *src++;
+ }
+ ++i;
+ }
+}
+
+static i_img *
+make_rgb(TIFF *tif, int width, int height, int *alpha_chan) {
+ uint16 photometric;
+ uint16 channels, in_channels;
+ uint16 extra_count;
+ uint16 *extras;
+
+ TIFFGetFieldDefaulted(tif, TIFFTAG_SAMPLESPERPIXEL, &in_channels);
+ TIFFGetFieldDefaulted(tif, TIFFTAG_PHOTOMETRIC, &photometric);
+
+ switch (photometric) {
+ case PHOTOMETRIC_SEPARATED:
+ channels = 3;
+ break;
+
+ case PHOTOMETRIC_MINISWHITE:
+ case PHOTOMETRIC_MINISBLACK:
+ /* the TIFF RGBA functions expand single channel grey into RGB,
+ so reduce it, we move the alpha channel into the right place
+ if needed */
+ channels = 1;
+ break;
+
+ default:
+ channels = 3;
+ break;
+ }
+ /* TIFF images can have more than one alpha channel, but Imager can't
+ this ignores the possibility of 2 channel images with 2 alpha,
+ but there's not much I can do about that */
+ *alpha_chan = 0;
+ if (TIFFGetField(tif, TIFFTAG_EXTRASAMPLES, &extra_count, &extras)
+ && extra_count) {
+ *alpha_chan = channels++;
+ }
+
+ return i_img_8_new(width, height, channels);
+}
+
+static i_img *
+read_one_rgb_lines(TIFF *tif, int width, int height, int allow_incomplete) {
+ i_img *im;
+ uint32* raster = NULL;
+ uint32 rowsperstrip, row;
+ i_color *line_buf;
+ int alpha_chan;
+ int rc;
+
+ im = make_rgb(tif, width, height, &alpha_chan);
+ if (!im)
+ return NULL;
+
+ rc = TIFFGetField(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip);
+ mm_log((1, "i_readtiff_wiol: rowsperstrip=%d rc = %d\n", rowsperstrip, rc));
+
+ if (rc != 1 || rowsperstrip==-1) {
+ rowsperstrip = height;
+ }
+
+ raster = (uint32*)_TIFFmalloc(width * rowsperstrip * sizeof (uint32));
+ if (!raster) {
+ i_img_destroy(im);
+ i_push_error(0, "No space for raster buffer");
+ return NULL;
+ }
+
+ line_buf = mymalloc(sizeof(i_color) * width);
+
+ for( row = 0; row < height; row += rowsperstrip ) {
+ uint32 newrows, i_row;
+
+ if (!TIFFReadRGBAStrip(tif, row, raster)) {
+ if (allow_incomplete) {
+ i_tags_setn(&im->tags, "i_lines_read", row);
+ i_tags_setn(&im->tags, "i_incomplete", 1);
+ break;
+ }
+ else {
+ i_push_error(0, "could not read TIFF image strip");
+ _TIFFfree(raster);
+ i_img_destroy(im);
+ return NULL;
+ }
+ }
+
+ newrows = (row+rowsperstrip > height) ? height-row : rowsperstrip;
+ mm_log((1, "newrows=%d\n", newrows));
+
+ for( i_row = 0; i_row < newrows; i_row++ ) {
+ uint32 x;
+ i_color *outp = line_buf;
+
+ for(x = 0; x<width; x++) {
+ uint32 temp = raster[x+width*(newrows-i_row-1)];
+ outp->rgba.r = TIFFGetR(temp);
+ outp->rgba.g = TIFFGetG(temp);
+ outp->rgba.b = TIFFGetB(temp);
+
+ if (alpha_chan) {
+ /* the libtiff RGBA code expands greyscale into RGBA, so put the
+ alpha in the right place and scale it */
+ int ch;
+ outp->channel[alpha_chan] = TIFFGetA(temp);
+ if (outp->channel[alpha_chan]) {
+ for (ch = 0; ch < alpha_chan; ++ch) {
+ outp->channel[ch] = outp->channel[ch] * 255 / outp->channel[alpha_chan];
+ }
+ }
+ }
+
+ outp++;
+ }
+ i_plin(im, 0, width, i_row+row, line_buf);
+ }
+ }
+
+ myfree(line_buf);
+ _TIFFfree(raster);
+
+ return im;
+}
+
+/* adapted from libtiff
+
+ libtiff's TIFFReadRGBATile succeeds even when asked to read an
+ invalid tile, which means we have no way of knowing whether the data
+ we received from it is valid or not.
+
+ So the caller here has set stoponerror to 1 so that
+ TIFFRGBAImageGet() will fail.
+
+ read_one_rgb_tiled() then takes that into account for i_incomplete
+ or failure.
+ */
+static int
+myTIFFReadRGBATile(TIFFRGBAImage *img, uint32 col, uint32 row, uint32 * raster)
+
+{
+ int ok;
+ uint32 tile_xsize, tile_ysize;
+ uint32 read_xsize, read_ysize;
+ uint32 i_row;
+
+ /*
+ * Verify that our request is legal - on a tile file, and on a
+ * tile boundary.
+ */
+
+ TIFFGetFieldDefaulted(img->tif, TIFFTAG_TILEWIDTH, &tile_xsize);
+ TIFFGetFieldDefaulted(img->tif, TIFFTAG_TILELENGTH, &tile_ysize);
+ if( (col % tile_xsize) != 0 || (row % tile_ysize) != 0 )
+ {
+ i_push_errorf(0, "Row/col passed to myTIFFReadRGBATile() must be top"
+ "left corner of a tile.");
+ return 0;
+ }
+
+ /*
+ * The TIFFRGBAImageGet() function doesn't allow us to get off the
+ * edge of the image, even to fill an otherwise valid tile. So we
+ * figure out how much we can read, and fix up the tile buffer to
+ * a full tile configuration afterwards.
+ */
+
+ if( row + tile_ysize > img->height )
+ read_ysize = img->height - row;
+ else
+ read_ysize = tile_ysize;
+
+ if( col + tile_xsize > img->width )
+ read_xsize = img->width - col;
+ else
+ read_xsize = tile_xsize;
+
+ /*
+ * Read the chunk of imagery.
+ */
+
+ img->row_offset = row;
+ img->col_offset = col;
+
+ ok = TIFFRGBAImageGet(img, raster, read_xsize, read_ysize );
+
+ /*
+ * If our read was incomplete we will need to fix up the tile by
+ * shifting the data around as if a full tile of data is being returned.
+ *
+ * This is all the more complicated because the image is organized in
+ * bottom to top format.
+ */
+
+ if( read_xsize == tile_xsize && read_ysize == tile_ysize )
+ return( ok );
+
+ for( i_row = 0; i_row < read_ysize; i_row++ ) {
+ memmove( raster + (tile_ysize - i_row - 1) * tile_xsize,
+ raster + (read_ysize - i_row - 1) * read_xsize,
+ read_xsize * sizeof(uint32) );
+ _TIFFmemset( raster + (tile_ysize - i_row - 1) * tile_xsize+read_xsize,
+ 0, sizeof(uint32) * (tile_xsize - read_xsize) );
+ }
+
+ for( i_row = read_ysize; i_row < tile_ysize; i_row++ ) {
+ _TIFFmemset( raster + (tile_ysize - i_row - 1) * tile_xsize,
+ 0, sizeof(uint32) * tile_xsize );
+ }
+
+ return (ok);
+}
+
+static i_img *
+read_one_rgb_tiled(TIFF *tif, int width, int height, int allow_incomplete) {
+ i_img *im;
+ uint32* raster = NULL;
+ int ok = 1;
+ uint32 row, col;
+ uint32 tile_width, tile_height;
+ unsigned long pixels = 0;
+ char emsg[1024] = "";
+ TIFFRGBAImage img;
+ i_color *line;
+ int alpha_chan;
+
+ im = make_rgb(tif, width, height, &alpha_chan);
+ if (!im)
+ return NULL;
+
+ if (!TIFFRGBAImageOK(tif, emsg)
+ || !TIFFRGBAImageBegin(&img, tif, 1, emsg)) {
+ i_push_error(0, emsg);
+ i_img_destroy(im);
+ return( 0 );
+ }
+
+ TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tile_width);
+ TIFFGetField(tif, TIFFTAG_TILELENGTH, &tile_height);
+ mm_log((1, "i_readtiff_wiol: tile_width=%d, tile_height=%d\n", tile_width, tile_height));
+
+ raster = (uint32*)_TIFFmalloc(tile_width * tile_height * sizeof (uint32));
+ if (!raster) {
+ i_img_destroy(im);
+ i_push_error(0, "No space for raster buffer");
+ TIFFRGBAImageEnd(&img);
+ return NULL;
+ }
+ line = mymalloc(tile_width * sizeof(i_color));
+
+ for( row = 0; row < height; row += tile_height ) {
+ for( col = 0; col < width; col += tile_width ) {
+
+ /* Read the tile into an RGBA array */
+ if (myTIFFReadRGBATile(&img, col, row, raster)) {
+ uint32 i_row, x;
+ uint32 newrows = (row+tile_height > height) ? height-row : tile_height;
+ uint32 newcols = (col+tile_width > width ) ? width-col : tile_width;
+
+ mm_log((1, "i_readtiff_wiol: tile(%d, %d) newcols=%d newrows=%d\n", col, row, newcols, newrows));
+ for( i_row = 0; i_row < newrows; i_row++ ) {
+ i_color *outp = line;
+ for(x = 0; x < newcols; x++) {
+ uint32 temp = raster[x+tile_width*(tile_height-i_row-1)];
+ outp->rgba.r = TIFFGetR(temp);
+ outp->rgba.g = TIFFGetG(temp);
+ outp->rgba.b = TIFFGetB(temp);
+ outp->rgba.a = TIFFGetA(temp);
+
+ if (alpha_chan) {
+ /* the libtiff RGBA code expands greyscale into RGBA, so put the
+ alpha in the right place and scale it */
+ int ch;
+ outp->channel[alpha_chan] = TIFFGetA(temp);
+
+ if (outp->channel[alpha_chan]) {
+ for (ch = 0; ch < alpha_chan; ++ch) {
+ outp->channel[ch] = outp->channel[ch] * 255 / outp->channel[alpha_chan];
+ }
+ }
+ }
+
+ ++outp;
+ }
+ i_plin(im, col, col+newcols, row+i_row, line);
+ }
+ pixels += newrows * newcols;
+ }
+ else {
+ if (allow_incomplete) {
+ ok = 0;
+ }
+ else {
+ goto error;
+ }
+ }
+ }
+ }
+
+ if (!ok) {
+ if (pixels == 0) {
+ i_push_error(0, "TIFF: No image data could be read from the image");
+ goto error;
+ }
+
+ /* incomplete image */
+ i_tags_setn(&im->tags, "i_incomplete", 1);
+ i_tags_setn(&im->tags, "i_lines_read", pixels / width);
+ }
+
+ myfree(line);
+ TIFFRGBAImageEnd(&img);
+ _TIFFfree(raster);
+
+ return im;
+
+ error:
+ myfree(line);
+ _TIFFfree(raster);
+ TIFFRGBAImageEnd(&img);
+ i_img_destroy(im);
+ return NULL;
+}
+
+char const *
+i_tiff_libversion(void) {
+ return TIFFGetVersion();
+}
+
+static int
+setup_paletted(read_state_t *state) {
+ uint16 *maps[3];
+ int i, ch;
+ int color_count = 1 << state->bits_per_sample;
+
+ state->img = i_img_pal_new(state->width, state->height, 3, 256);
+ if (!state->img)
+ return 0;
+
+ /* setup the color map */
+ if (!TIFFGetField(state->tif, TIFFTAG_COLORMAP, maps+0, maps+1, maps+2)) {
+ i_push_error(0, "Cannot get colormap for paletted image");
+ i_img_destroy(state->img);
+ return 0;
+ }
+ for (i = 0; i < color_count; ++i) {
+ i_color c;
+ for (ch = 0; ch < 3; ++ch) {
+ c.channel[ch] = Sample16To8(maps[ch][i]);
+ }
+ i_addcolors(state->img, &c, 1);
+ }
+
+ return 1;
+}
+
+static int
+tile_contig_getter(read_state_t *state, read_putter_t putter) {
+ uint32 tile_width, tile_height;
+ uint32 this_tile_height, this_tile_width;
+ uint32 rows_left, cols_left;
+ uint32 x, y;
+
+ state->raster = _TIFFmalloc(TIFFTileSize(state->tif));
+ if (!state->raster) {
+ i_push_error(0, "tiff: Out of memory allocating tile buffer");
+ return 0;
+ }
+
+ TIFFGetField(state->tif, TIFFTAG_TILEWIDTH, &tile_width);
+ TIFFGetField(state->tif, TIFFTAG_TILELENGTH, &tile_height);
+ rows_left = state->height;
+ for (y = 0; y < state->height; y += this_tile_height) {
+ this_tile_height = rows_left > tile_height ? tile_height : rows_left;
+
+ cols_left = state->width;
+ for (x = 0; x < state->width; x += this_tile_width) {
+ this_tile_width = cols_left > tile_width ? tile_width : cols_left;
+
+ if (TIFFReadTile(state->tif,
+ state->raster,
+ x, y, 0, 0) < 0) {
+ if (!state->allow_incomplete) {
+ return 0;
+ }
+ }
+ else {
+ putter(state, x, y, this_tile_width, this_tile_height, tile_width - this_tile_width);
+ }
+
+ cols_left -= this_tile_width;
+ }
+
+ rows_left -= this_tile_height;
+ }
+
+ return 1;
+}
+
+static int
+strip_contig_getter(read_state_t *state, read_putter_t putter) {
+ uint32 rows_per_strip;
+ tsize_t strip_size = TIFFStripSize(state->tif);
+ uint32 y, strip_rows, rows_left;
+
+ state->raster = _TIFFmalloc(strip_size);
+ if (!state->raster) {
+ i_push_error(0, "tiff: Out of memory allocating strip buffer");
+ return 0;
+ }
+
+ TIFFGetFieldDefaulted(state->tif, TIFFTAG_ROWSPERSTRIP, &rows_per_strip);
+ rows_left = state->height;
+ for (y = 0; y < state->height; y += strip_rows) {
+ strip_rows = rows_left > rows_per_strip ? rows_per_strip : rows_left;
+ if (TIFFReadEncodedStrip(state->tif,
+ TIFFComputeStrip(state->tif, y, 0),
+ state->raster,
+ strip_size) < 0) {
+ if (!state->allow_incomplete)
+ return 0;
+ }
+ else {
+ putter(state, 0, y, state->width, strip_rows, 0);
+ }
+ rows_left -= strip_rows;
+ }
+
+ return 1;
+}
+
+static int
+paletted_putter8(read_state_t *state, int x, int y, int width, int height, int extras) {
+ unsigned char *p = state->raster;
+
+ state->pixels_read += (unsigned long) width * height;
+ while (height > 0) {
+ i_ppal(state->img, x, x + width, y, p);
+ p += width + extras;
+ --height;
+ ++y;
+ }
+
+ return 1;
+}
+
+static int
+paletted_putter4(read_state_t *state, int x, int y, int width, int height, int extras) {
+ uint32 img_line_size = (width + 1) / 2;
+ uint32 skip_line_size = (width + extras + 1) / 2;
+ unsigned char *p = state->raster;
+
+ if (!state->line_buf)
+ state->line_buf = mymalloc(state->width);
+
+ state->pixels_read += (unsigned long) width * height;
+ while (height > 0) {
+ unpack_4bit_to(state->line_buf, p, img_line_size);
+ i_ppal(state->img, x, x + width, y, state->line_buf);
+ p += skip_line_size;
+ --height;
+ ++y;
+ }
+
+ return 1;
+}
+
+static void
+rgb_channels(read_state_t *state, int *out_channels) {
+ uint16 extra_count;
+ uint16 *extras;
+
+ /* safe defaults */
+ *out_channels = 3;
+ state->alpha_chan = 0;
+ state->scale_alpha = 0;
+
+ /* plain RGB */
+ if (state->samples_per_pixel == 3)
+ return;
+
+ if (!TIFFGetField(state->tif, TIFFTAG_EXTRASAMPLES, &extra_count, &extras)) {
+ mm_log((1, "tiff: samples != 3 but no extra samples tag\n"));
+ return;
+ }
+
+ if (!extra_count) {
+ mm_log((1, "tiff: samples != 3 but no extra samples listed"));
+ return;
+ }
+
+ ++*out_channels;
+ state->alpha_chan = 3;
+ switch (*extras) {
+ case EXTRASAMPLE_UNSPECIFIED:
+ case EXTRASAMPLE_ASSOCALPHA:
+ state->scale_alpha = 1;
+ break;
+
+ case EXTRASAMPLE_UNASSALPHA:
+ state->scale_alpha = 0;
+ break;
+
+ default:
+ mm_log((1, "tiff: unknown extra sample type %d, treating as assoc alpha\n",
+ *extras));
+ state->scale_alpha = 1;
+ break;
+ }
+ mm_log((1, "tiff alpha channel %d scale %d\n", state->alpha_chan, state->scale_alpha));
+}
+
+static void
+grey_channels(read_state_t *state, int *out_channels) {
+ uint16 extra_count;
+ uint16 *extras;
+
+ /* safe defaults */
+ *out_channels = 1;
+ state->alpha_chan = 0;
+ state->scale_alpha = 0;
+
+ /* plain grey */
+ if (state->samples_per_pixel == 1)
+ return;
+
+ if (!TIFFGetField(state->tif, TIFFTAG_EXTRASAMPLES, &extra_count, &extras)) {
+ mm_log((1, "tiff: samples != 1 but no extra samples tag\n"));
+ return;
+ }
+
+ if (!extra_count) {
+ mm_log((1, "tiff: samples != 1 but no extra samples listed"));
+ return;
+ }
+
+ ++*out_channels;
+ state->alpha_chan = 1;
+ switch (*extras) {
+ case EXTRASAMPLE_UNSPECIFIED:
+ case EXTRASAMPLE_ASSOCALPHA:
+ state->scale_alpha = 1;
+ break;
+
+ case EXTRASAMPLE_UNASSALPHA:
+ state->scale_alpha = 0;
+ break;
+
+ default:
+ mm_log((1, "tiff: unknown extra sample type %d, treating as assoc alpha\n",
+ *extras));
+ state->scale_alpha = 1;
+ break;
+ }
+}
+
+static int
+setup_16_rgb(read_state_t *state) {
+ int out_channels;
+
+ rgb_channels(state, &out_channels);
+
+ state->img = i_img_16_new(state->width, state->height, out_channels);
+ if (!state->img)
+ return 0;
+ state->line_buf = mymalloc(sizeof(unsigned) * state->width * out_channels);
+
+ return 1;
+}
+
+static int
+setup_16_grey(read_state_t *state) {
+ int out_channels;
+
+ grey_channels(state, &out_channels);
+
+ state->img = i_img_16_new(state->width, state->height, out_channels);
+ if (!state->img)
+ return 0;
+ state->line_buf = mymalloc(sizeof(unsigned) * state->width * out_channels);
+
+ return 1;
+}
+
+static int
+putter_16(read_state_t *state, int x, int y, int width, int height,
+ int row_extras) {
+ uint16 *p = state->raster;
+ int out_chan = state->img->channels;
+
+ state->pixels_read += (unsigned long) width * height;
+ while (height > 0) {
+ int i;
+ int ch;
+ unsigned *outp = state->line_buf;
+
+ for (i = 0; i < width; ++i) {
+ for (ch = 0; ch < out_chan; ++ch) {
+ outp[ch] = p[ch];
+ }
+ if (state->alpha_chan && state->scale_alpha && outp[state->alpha_chan]) {
+ for (ch = 0; ch < state->alpha_chan; ++ch) {
+ int result = 0.5 + (outp[ch] * 65535.0 / outp[state->alpha_chan]);
+ outp[ch] = CLAMP16(result);
+ }
+ }
+ p += state->samples_per_pixel;
+ outp += out_chan;
+ }
+
+ i_psamp_bits(state->img, x, x + width, y, state->line_buf, NULL, out_chan, 16);
+
+ p += row_extras * state->samples_per_pixel;
+ --height;
+ ++y;
+ }
+
+ return 1;
+}
+
+static int
+setup_8_rgb(read_state_t *state) {
+ int out_channels;
+
+ rgb_channels(state, &out_channels);
+
+ state->img = i_img_8_new(state->width, state->height, out_channels);
+ if (!state->img)
+ return 0;
+ state->line_buf = mymalloc(sizeof(unsigned) * state->width * out_channels);
+
+ return 1;
+}
+
+static int
+setup_8_grey(read_state_t *state) {
+ int out_channels;
+
+ grey_channels(state, &out_channels);
+
+ state->img = i_img_8_new(state->width, state->height, out_channels);
+ if (!state->img)
+ return 0;
+ state->line_buf = mymalloc(sizeof(i_color) * state->width * out_channels);
+
+ return 1;
+}
+
+static int
+putter_8(read_state_t *state, int x, int y, int width, int height,
+ int row_extras) {
+ unsigned char *p = state->raster;
+ int out_chan = state->img->channels;
+
+ state->pixels_read += (unsigned long) width * height;
+ while (height > 0) {
+ int i;
+ int ch;
+ i_color *outp = state->line_buf;
+
+ for (i = 0; i < width; ++i) {
+ for (ch = 0; ch < out_chan; ++ch) {
+ outp->channel[ch] = p[ch];
+ }
+ if (state->alpha_chan && state->scale_alpha
+ && outp->channel[state->alpha_chan]) {
+ for (ch = 0; ch < state->alpha_chan; ++ch) {
+ int result = (outp->channel[ch] * 255 + 127) / outp->channel[state->alpha_chan];
+
+ outp->channel[ch] = CLAMP8(result);
+ }
+ }
+ p += state->samples_per_pixel;
+ outp++;
+ }
+
+ i_plin(state->img, x, x + width, y, state->line_buf);
+
+ p += row_extras * state->samples_per_pixel;
+ --height;
+ ++y;
+ }
+
+ return 1;
+}
+
+static int
+setup_32_rgb(read_state_t *state) {
+ int out_channels;
+
+ rgb_channels(state, &out_channels);
+
+ state->img = i_img_double_new(state->width, state->height, out_channels);
+ if (!state->img)
+ return 0;
+ state->line_buf = mymalloc(sizeof(i_fcolor) * state->width);
+
+ return 1;
+}
+
+static int
+setup_32_grey(read_state_t *state) {
+ int out_channels;
+
+ grey_channels(state, &out_channels);
+
+ state->img = i_img_double_new(state->width, state->height, out_channels);
+ if (!state->img)
+ return 0;
+ state->line_buf = mymalloc(sizeof(i_fcolor) * state->width);
+
+ return 1;
+}
+
+static int
+putter_32(read_state_t *state, int x, int y, int width, int height,
+ int row_extras) {
+ uint32 *p = state->raster;
+ int out_chan = state->img->channels;
+
+ state->pixels_read += (unsigned long) width * height;
+ while (height > 0) {
+ int i;
+ int ch;
+ i_fcolor *outp = state->line_buf;
+
+ for (i = 0; i < width; ++i) {
+ for (ch = 0; ch < out_chan; ++ch) {
+ outp->channel[ch] = p[ch] / 4294967295.0;
+ }
+ if (state->alpha_chan && state->scale_alpha && outp->channel[state->alpha_chan]) {
+ for (ch = 0; ch < state->alpha_chan; ++ch)
+ outp->channel[ch] /= outp->channel[state->alpha_chan];
+ }
+ p += state->samples_per_pixel;
+ outp++;
+ }
+
+ i_plinf(state->img, x, x + width, y, state->line_buf);
+
+ p += row_extras * state->samples_per_pixel;
+ --height;
+ ++y;
+ }
+
+ return 1;
+}
+
+static int
+setup_bilevel(read_state_t *state) {
+ i_color black, white;
+ state->img = i_img_pal_new(state->width, state->height, 1, 256);
+ if (!state->img)
+ return 0;
+ black.channel[0] = black.channel[1] = black.channel[2] =
+ black.channel[3] = 0;
+ white.channel[0] = white.channel[1] = white.channel[2] =
+ white.channel[3] = 255;
+ if (state->photometric == PHOTOMETRIC_MINISBLACK) {
+ i_addcolors(state->img, &black, 1);
+ i_addcolors(state->img, &white, 1);
+ }
+ else {
+ i_addcolors(state->img, &white, 1);
+ i_addcolors(state->img, &black, 1);
+ }
+ state->line_buf = mymalloc(state->width);
+
+ return 1;
+}
+
+static int
+putter_bilevel(read_state_t *state, int x, int y, int width, int height,
+ int row_extras) {
+ unsigned char *line_in = state->raster;
+ size_t line_size = (width + row_extras + 7) / 8;
+
+ /* tifflib returns the bits in MSB2LSB order even when the file is
+ in LSB2MSB, so we only need to handle MSB2LSB */
+ state->pixels_read += (unsigned long) width * height;
+ while (height > 0) {
+ int i;
+ unsigned char *outp = state->line_buf;
+ unsigned char *inp = line_in;
+ unsigned mask = 0x80;
+
+ for (i = 0; i < width; ++i) {
+ *outp++ = *inp & mask ? 1 : 0;
+ mask >>= 1;
+ if (!mask) {
+ ++inp;
+ mask = 0x80;
+ }
+ }
+
+ i_ppal(state->img, x, x + width, y, state->line_buf);
+
+ line_in += line_size;
+ --height;
+ ++y;
+ }
+
+ return 1;
+}
+
+static void
+cmyk_channels(read_state_t *state, int *out_channels) {
+ uint16 extra_count;
+ uint16 *extras;
+
+ /* safe defaults */
+ *out_channels = 3;
+ state->alpha_chan = 0;
+ state->scale_alpha = 0;
+
+ /* plain CMYK */
+ if (state->samples_per_pixel == 4)
+ return;
+
+ if (!TIFFGetField(state->tif, TIFFTAG_EXTRASAMPLES, &extra_count, &extras)) {
+ mm_log((1, "tiff: CMYK samples != 4 but no extra samples tag\n"));
+ return;
+ }
+
+ if (!extra_count) {
+ mm_log((1, "tiff: CMYK samples != 4 but no extra samples listed"));
+ return;
+ }
+
+ ++*out_channels;
+ state->alpha_chan = 4;
+ switch (*extras) {
+ case EXTRASAMPLE_UNSPECIFIED:
+ case EXTRASAMPLE_ASSOCALPHA:
+ state->scale_alpha = 1;
+ break;
+
+ case EXTRASAMPLE_UNASSALPHA:
+ state->scale_alpha = 0;
+ break;
+
+ default:
+ mm_log((1, "tiff: unknown extra sample type %d, treating as assoc alpha\n",
+ *extras));
+ state->scale_alpha = 1;
+ break;
+ }
+}
+
+static int
+setup_cmyk8(read_state_t *state) {
+ int channels;
+
+ cmyk_channels(state, &channels);
+ state->img = i_img_8_new(state->width, state->height, channels);
+
+ state->line_buf = mymalloc(sizeof(i_color) * state->width);
+
+ return 1;
+}
+
+static int
+putter_cmyk8(read_state_t *state, int x, int y, int width, int height,
+ int row_extras) {
+ unsigned char *p = state->raster;
+
+ state->pixels_read += (unsigned long) width * height;
+ while (height > 0) {
+ int i;
+ int ch;
+ i_color *outp = state->line_buf;
+
+ for (i = 0; i < width; ++i) {
+ unsigned char c, m, y, k;
+ c = p[0];
+ m = p[1];
+ y = p[2];
+ k = 255 - p[3];
+ outp->rgba.r = (k * (255 - c)) / 255;
+ outp->rgba.g = (k * (255 - m)) / 255;
+ outp->rgba.b = (k * (255 - y)) / 255;
+ if (state->alpha_chan) {
+ outp->rgba.a = p[state->alpha_chan];
+ if (state->scale_alpha
+ && outp->rgba.a) {
+ for (ch = 0; ch < 3; ++ch) {
+ int result = (outp->channel[ch] * 255 + 127) / outp->rgba.a;
+ outp->channel[ch] = CLAMP8(result);
+ }
+ }
+ }
+ p += state->samples_per_pixel;
+ outp++;
+ }
+
+ i_plin(state->img, x, x + width, y, state->line_buf);
+
+ p += row_extras * state->samples_per_pixel;
+ --height;
+ ++y;
+ }
+
+ return 1;
+}
+
+static int
+setup_cmyk16(read_state_t *state) {
+ int channels;
+
+ cmyk_channels(state, &channels);
+ state->img = i_img_16_new(state->width, state->height, channels);
+
+ state->line_buf = mymalloc(sizeof(unsigned) * state->width * channels);
+
+ return 1;
+}
+
+static int
+putter_cmyk16(read_state_t *state, int x, int y, int width, int height,
+ int row_extras) {
+ uint16 *p = state->raster;
+ int out_chan = state->img->channels;
+
+ mm_log((4, "putter_cmyk16(%p, %d, %d, %d, %d, %d)\n", x, y, width, height, row_extras));
+
+ state->pixels_read += (unsigned long) width * height;
+ while (height > 0) {
+ int i;
+ int ch;
+ unsigned *outp = state->line_buf;
+
+ for (i = 0; i < width; ++i) {
+ unsigned c, m, y, k;
+ c = p[0];
+ m = p[1];
+ y = p[2];
+ k = 65535 - p[3];
+ outp[0] = (k * (65535U - c)) / 65535U;
+ outp[1] = (k * (65535U - m)) / 65535U;
+ outp[2] = (k * (65535U - y)) / 65535U;
+ if (state->alpha_chan) {
+ outp[3] = p[state->alpha_chan];
+ if (state->scale_alpha
+ && outp[3]) {
+ for (ch = 0; ch < 3; ++ch) {
+ int result = (outp[ch] * 65535 + 32767) / outp[3];
+ outp[3] = CLAMP16(result);
+ }
+ }
+ }
+ p += state->samples_per_pixel;
+ outp += out_chan;
+ }
+
+ i_psamp_bits(state->img, x, x + width, y, state->line_buf, NULL, out_chan, 16);
+
+ p += row_extras * state->samples_per_pixel;
+ --height;
+ ++y;
+ }
+
+ return 1;
+}
+
+/*
+
+ Older versions of tifflib we support don't define this, so define it
+ ourselves.
+
+ If you want this detection to do anything useful, use a newer
+ release of tifflib.
+
+ */
+#if TIFFLIB_VERSION < 20031121
+
+int
+TIFFIsCODECConfigured(uint16 scheme) {
+ switch (scheme) {
+ /* these schemes are all shipped with tifflib */
+ case COMPRESSION_NONE:
+ case COMPRESSION_PACKBITS:
+ case COMPRESSION_CCITTRLE:
+ case COMPRESSION_CCITTRLEW:
+ case COMPRESSION_CCITTFAX3:
+ case COMPRESSION_CCITTFAX4:
+ return 1;
+
+ /* these require external library support */
+ default:
+ case COMPRESSION_JPEG:
+ case COMPRESSION_LZW:
+ case COMPRESSION_DEFLATE:
+ case COMPRESSION_ADOBE_DEFLATE:
+ return 0;
+ }
+}
+
+#endif
+
+static int
+myTIFFIsCODECConfigured(uint16 scheme) {
+#if TIFFLIB_VERSION < 20040724
+ if (scheme == COMPRESSION_LZW)
+ return 0;
+#endif
+
+ return TIFFIsCODECConfigured(scheme);
+}
+
+/*
+=back
+
+=head1 AUTHOR
+
+Arnar M. Hrafnkelsson <addi@umich.edu>, Tony Cook <tony@imager.perl.org>
+
+=head1 SEE ALSO
+
+Imager(3)
+
+=cut
+*/
--- /dev/null
+#ifndef IMAGER_IMTIFF_H
+#define IMAGER_IMTIFF_H
+
+#include "imdatatypes.h"
+
+i_img * i_readtiff_wiol(io_glue *ig, int allow_incomplete, int page);
+i_img ** i_readtiff_multi_wiol(io_glue *ig, int *count);
+undef_int i_writetiff_wiol(i_img *im, io_glue *ig);
+undef_int i_writetiff_multi_wiol(io_glue *ig, i_img **imgs, int count);
+undef_int i_writetiff_wiol_faxable(i_img *im, io_glue *ig, int fine);
+undef_int i_writetiff_multi_wiol_faxable(io_glue *ig, i_img **imgs, int count, int fine);
+char const * i_tiff_libversion(void);
+int i_tiff_has_compression(char const *name);
+
+#endif
--- /dev/null
+#!perl -w
+use strict;
+use Test::More tests => 216;
+use Imager qw(:all);
+use Imager::Test qw(is_image is_image_similar test_image test_image_16 test_image_double test_image_raw);
+
+BEGIN { use_ok("Imager::File::TIFF"); }
+
+-d "testout"
+ or mkdir "testout";
+
+$|=1; # give us some progress in the test harness
+init_log("testout/t106tiff.log",1);
+
+my $green=i_color_new(0,255,0,255);
+my $blue=i_color_new(0,0,255,255);
+my $red=i_color_new(255,0,0,255);
+
+my $img=test_image_raw();
+
+my $ver_string = Imager::File::TIFF::i_tiff_libversion();
+ok(my ($full, $major, $minor, $point) =
+ $ver_string =~ /Version +((\d+)\.(\d+).(\d+))/,
+ "extract library version")
+ or diag("Could not extract from:\n$ver_string");
+diag("libtiff release $full") if $full;
+# make something we can compare
+my $cmp_ver = sprintf("%03d%03d%03d", $major, $minor, $point);
+if ($cmp_ver lt '003007000') {
+ diag("You have an old version of libtiff - $full, some tests will be skipped");
+}
+
+Imager::i_tags_add($img, "i_xres", 0, "300", 0);
+Imager::i_tags_add($img, "i_yres", 0, undef, 250);
+# resolutionunit is centimeters
+Imager::i_tags_add($img, "tiff_resolutionunit", 0, undef, 3);
+Imager::i_tags_add($img, "tiff_software", 0, "t106tiff.t", 0);
+open(FH,">testout/t106.tiff") || die "cannot open testout/t106.tiff for writing\n";
+binmode(FH);
+my $IO = Imager::io_new_fd(fileno(FH));
+ok(Imager::File::TIFF::i_writetiff_wiol($img, $IO), "write low level")
+ or print "# ", Imager->_error_as_msg, "\n";
+close(FH);
+
+open(FH,"testout/t106.tiff") or die "cannot open testout/t106.tiff\n";
+binmode(FH);
+$IO = Imager::io_new_fd(fileno(FH));
+my $cmpimg = Imager::File::TIFF::i_readtiff_wiol($IO);
+ok($cmpimg, "read low-level");
+
+close(FH);
+
+print "# tiff average mean square pixel difference: ",sqrt(i_img_diff($img,$cmpimg))/150*150,"\n";
+
+ok(!i_img_diff($img, $cmpimg), "compare written and read image");
+
+# check the tags are ok
+my %tags = map { Imager::i_tags_get($cmpimg, $_) }
+ 0 .. Imager::i_tags_count($cmpimg) - 1;
+ok(abs($tags{i_xres} - 300) < 0.5, "i_xres in range");
+ok(abs($tags{i_yres} - 250) < 0.5, "i_yres in range");
+is($tags{tiff_resolutionunit}, 3, "tiff_resolutionunit");
+is($tags{tiff_software}, 't106tiff.t', "tiff_software");
+is($tags{tiff_photometric}, 2, "tiff_photometric"); # PHOTOMETRIC_RGB is 2
+is($tags{tiff_bitspersample}, 8, "tiff_bitspersample");
+
+$IO = Imager::io_new_bufchain();
+
+ok(Imager::File::TIFF::i_writetiff_wiol($img, $IO), "write to buffer chain");
+my $tiffdata = Imager::io_slurp($IO);
+
+open(FH,"testout/t106.tiff");
+binmode FH;
+my $odata;
+{ local $/;
+ $odata = <FH>;
+}
+
+is($odata, $tiffdata, "same data in file as in memory");
+
+# test Micksa's tiff writer
+# a shortish fax page
+my $faximg = Imager::ImgRaw::new(1728, 2000, 1);
+my $black = i_color_new(0,0,0,255);
+my $white = i_color_new(255,255,255,255);
+# vaguely test-patterny
+i_box_filled($faximg, 0, 0, 1728, 2000, $white);
+i_box_filled($faximg, 100,100,1628, 200, $black);
+my $width = 1;
+my $pos = 100;
+while ($width+$pos < 1628) {
+ i_box_filled($faximg, $pos, 300, $pos+$width-1, 400, $black);
+ $pos += $width + 20;
+ $width += 2;
+}
+open FH, "> testout/t106tiff_fax.tiff"
+ or die "Cannot create testout/t106tiff_fax.tiff: $!";
+binmode FH;
+$IO = Imager::io_new_fd(fileno(FH));
+ok(Imager::File::TIFF::i_writetiff_wiol_faxable($faximg, $IO, 1), "write faxable, low level");
+close FH;
+
+# test the OO interface
+my $ooim = Imager->new;
+ok($ooim->read(file=>'testout/t106.tiff'), "read OO");
+ok($ooim->write(file=>'testout/t106_oo.tiff'), "write OO");
+
+# OO with the fax image
+my $oofim = Imager->new;
+ok($oofim->read(file=>'testout/t106tiff_fax.tiff'),
+ "read fax OO");
+
+# this should have tags set for the resolution
+%tags = map @$_, $oofim->tags;
+is($tags{i_xres}, 204, "fax i_xres");
+is($tags{i_yres}, 196, "fax i_yres");
+ok(!$tags{i_aspect_only}, "i_aspect_only");
+# resunit_inches
+is($tags{tiff_resolutionunit}, 2, "tiff_resolutionunit");
+is($tags{tiff_bitspersample}, 1, "tiff_bitspersample");
+is($tags{tiff_photometric}, 0, "tiff_photometric");
+
+ok($oofim->write(file=>'testout/t106_oo_fax.tiff', class=>'fax'),
+ "write OO, faxable");
+
+# the following should fail since there's no type and no filename
+my $oodata;
+ok(!$ooim->write(data=>\$oodata), "write with no type and no filename to guess with");
+
+# OO to data
+ok($ooim->write(data=>\$oodata, type=>'tiff'), "write to data")
+ or print "# ",$ooim->errstr, "\n";
+is($oodata, $tiffdata, "check data matches between memory and file");
+
+# make sure we can write non-fine mode
+ok($oofim->write(file=>'testout/t106_oo_faxlo.tiff', class=>'fax', fax_fine=>0), "write OO, fax standard mode");
+
+# paletted reads
+my $img4 = Imager->new;
+ok($img4->read(file=>'testimg/comp4.tif'), "reading 4-bit paletted")
+ or print "# ", $img4->errstr, "\n";
+is($img4->type, 'paletted', "image isn't paletted");
+print "# colors: ", $img4->colorcount,"\n";
+ cmp_ok($img4->colorcount, '<=', 16, "more than 16 colors!");
+#ok($img4->write(file=>'testout/t106_was4.ppm'),
+# "Cannot write img4");
+# I know I'm using BMP before it's test, but comp4.tif started life
+# as comp4.bmp
+my $bmp4 = Imager->new;
+ok($bmp4->read(file=>'testimg/comp4.bmp'), "reading 4-bit bmp!");
+my $diff = i_img_diff($img4->{IMG}, $bmp4->{IMG});
+print "# diff $diff\n";
+ok($diff == 0, "image mismatch");
+my $img4t = Imager->new;
+ok($img4t->read(file => 'testimg/comp4t.tif'), "read 4-bit paletted, tiled")
+ or print "# ", $img4t->errstr, "\n";
+is_image($bmp4, $img4t, "check tiled version matches");
+my $img8 = Imager->new;
+ok($img8->read(file=>'testimg/comp8.tif'), "reading 8-bit paletted");
+is($img8->type, 'paletted', "image isn't paletted");
+print "# colors: ", $img8->colorcount,"\n";
+#ok($img8->write(file=>'testout/t106_was8.ppm'),
+# "Cannot write img8");
+ok($img8->colorcount == 256, "more colors than expected");
+my $bmp8 = Imager->new;
+ok($bmp8->read(file=>'testimg/comp8.bmp'), "reading 8-bit bmp!");
+$diff = i_img_diff($img8->{IMG}, $bmp8->{IMG});
+print "# diff $diff\n";
+ok($diff == 0, "image mismatch");
+my $bad = Imager->new;
+ok($bad->read(file=>'testimg/comp4bad.tif',
+ allow_incomplete=>1), "bad image not returned");
+ok(scalar $bad->tags(name=>'i_incomplete'), "incomplete tag not set");
+ok($img8->write(file=>'testout/t106_pal8.tif'), "writing 8-bit paletted");
+my $cmp8 = Imager->new;
+ok($cmp8->read(file=>'testout/t106_pal8.tif'),
+ "reading 8-bit paletted");
+#print "# ",$cmp8->errstr,"\n";
+is($cmp8->type, 'paletted', "pal8 isn't paletted");
+is($cmp8->colorcount, 256, "pal8 bad colorcount");
+$diff = i_img_diff($img8->{IMG}, $cmp8->{IMG});
+print "# diff $diff\n";
+ok($diff == 0, "written image doesn't match read");
+ok($img4->write(file=>'testout/t106_pal4.tif'), "writing 4-bit paletted");
+ok(my $cmp4 = Imager->new->read(file=>'testout/t106_pal4.tif'),
+ "reading 4-bit paletted");
+is($cmp4->type, 'paletted', "pal4 isn't paletted");
+is($cmp4->colorcount, 16, "pal4 bad colorcount");
+$diff = i_img_diff($img4->{IMG}, $cmp4->{IMG});
+print "# diff $diff\n";
+ok($diff == 0, "written image doesn't match read");
+
+my $work;
+my $seekpos;
+sub io_writer {
+ my ($what) = @_;
+ if ($seekpos > length $work) {
+ $work .= "\0" x ($seekpos - length $work);
+ }
+ substr($work, $seekpos, length $what) = $what;
+ $seekpos += length $what;
+
+ 1;
+}
+sub io_reader {
+ my ($size, $maxread) = @_;
+ #print "io_reader($size, $maxread) pos $seekpos\n";
+ my $out = substr($work, $seekpos, $maxread);
+ $seekpos += length $out;
+ $out;
+}
+sub io_reader2 {
+ my ($size, $maxread) = @_;
+ #print "io_reader2($size, $maxread) pos $seekpos\n";
+ my $out = substr($work, $seekpos, $size);
+ $seekpos += length $out;
+ $out;
+}
+use IO::Seekable;
+sub io_seeker {
+ my ($offset, $whence) = @_;
+ #print "io_seeker($offset, $whence)\n";
+ if ($whence == SEEK_SET) {
+ $seekpos = $offset;
+ }
+ elsif ($whence == SEEK_CUR) {
+ $seekpos += $offset;
+ }
+ else { # SEEK_END
+ $seekpos = length($work) + $offset;
+ }
+ #print "-> $seekpos\n";
+ $seekpos;
+}
+my $did_close;
+sub io_closer {
+ ++$did_close;
+}
+
+# read via cb
+$work = $tiffdata;
+$seekpos = 0;
+my $IO2 = Imager::io_new_cb(undef, \&io_reader, \&io_seeker, undef);
+ok($IO2, "new readcb obj");
+my $img5 = Imager::File::TIFF::i_readtiff_wiol($IO2);
+ok($img5, "read via cb");
+ok(i_img_diff($img5, $img) == 0, "read from cb diff");
+
+# read via cb2
+$work = $tiffdata;
+$seekpos = 0;
+my $IO3 = Imager::io_new_cb(undef, \&io_reader2, \&io_seeker, undef);
+ok($IO3, "new readcb2 obj");
+my $img6 = Imager::File::TIFF::i_readtiff_wiol($IO3);
+ok($img6, "read via cb2");
+ok(i_img_diff($img6, $img) == 0, "read from cb2 diff");
+
+# write via cb
+$work = '';
+$seekpos = 0;
+my $IO4 = Imager::io_new_cb(\&io_writer, \&io_reader, \&io_seeker,
+ \&io_closer);
+ok($IO4, "new writecb obj");
+ok(Imager::File::TIFF::i_writetiff_wiol($img, $IO4), "write to cb");
+is($work, $odata, "write cb match");
+ok($did_close, "write cb did close");
+open D1, ">testout/d1.tiff" or die;
+print D1 $work;
+close D1;
+open D2, ">testout/d2.tiff" or die;
+print D2 $tiffdata;
+close D2;
+
+# write via cb2
+$work = '';
+$seekpos = 0;
+$did_close = 0;
+my $IO5 = Imager::io_new_cb(\&io_writer, \&io_reader, \&io_seeker,
+ \&io_closer, 1);
+ok($IO5, "new writecb obj 2");
+ok(Imager::File::TIFF::i_writetiff_wiol($img, $IO5), "write to cb2");
+is($work, $odata, "write cb2 match");
+ok($did_close, "write cb2 did close");
+
+open D3, ">testout/d3.tiff" or die;
+print D3 $work;
+close D3;
+
+# multi-image write/read
+my @imgs;
+push(@imgs, map $ooim->copy(), 1..3);
+for my $i (0..$#imgs) {
+ $imgs[$i]->addtag(name=>"tiff_pagename", value=>"Page ".($i+1));
+}
+my $rc = Imager->write_multi({file=>'testout/t106_multi.tif'}, @imgs);
+ok($rc, "writing multiple images to tiff");
+my @out = Imager->read_multi(file=>'testout/t106_multi.tif');
+ok(@out == @imgs, "reading multiple images from tiff");
+@out == @imgs or print "# ",scalar @out, " ",Imager->errstr,"\n";
+for my $i (0..$#imgs) {
+ ok(i_img_diff($imgs[$i]{IMG}, $out[$i]{IMG}) == 0,
+ "comparing image $i");
+ my ($tag) = $out[$i]->tags(name=>'tiff_pagename');
+ is($tag, "Page ".($i+1),
+ "tag doesn't match original image");
+}
+
+# writing even more images to tiff - we weren't handling more than five
+# correctly on read
+@imgs = map $ooim->copy(), 1..40;
+$rc = Imager->write_multi({file=>'testout/t106_multi2.tif'}, @imgs);
+ok($rc, "writing 40 images to tiff");
+@out = Imager->read_multi(file=>'testout/t106_multi2.tif');
+ok(@imgs == @out, "reading 40 images from tiff");
+# force some allocation activity - helps crash here if it's the problem
+@out = @imgs = ();
+
+# multi-image fax files
+ok(Imager->write_multi({file=>'testout/t106_faxmulti.tiff', class=>'fax'},
+ $oofim, $oofim), "write multi fax image");
+@imgs = Imager->read_multi(file=>'testout/t106_faxmulti.tiff');
+ok(@imgs == 2, "reading multipage fax");
+ok(Imager::i_img_diff($imgs[0]{IMG}, $oofim->{IMG}) == 0,
+ "compare first fax image");
+ok(Imager::i_img_diff($imgs[1]{IMG}, $oofim->{IMG}) == 0,
+ "compare second fax image");
+
+my ($format) = $imgs[0]->tags(name=>'i_format');
+is($format, 'tiff', "check i_format tag");
+
+my $unit = $imgs[0]->tags(name=>'tiff_resolutionunit');
+ok(defined $unit && $unit == 2, "check tiff_resolutionunit tag");
+my $unitname = $imgs[0]->tags(name=>'tiff_resolutionunit_name');
+is($unitname, 'inch', "check tiff_resolutionunit_name tag");
+
+my $warned = Imager->new;
+ok($warned->read(file=>"testimg/tiffwarn.tif"), "read tiffwarn.tif");
+my ($warning) = $warned->tags(name=>'i_warning');
+ok(defined $warning && $warning =~ /unknown field with tag 28712/,
+ "check that warning tag set and correct");
+
+{ # support for reading a given page
+ # first build a simple test image
+ my $im1 = Imager->new(xsize=>50, ysize=>50);
+ $im1->box(filled=>1, color=>$blue);
+ $im1->addtag(name=>'tiff_pagename', value => "Page One");
+ my $im2 = Imager->new(xsize=>60, ysize=>60);
+ $im2->box(filled=>1, color=>$green);
+ $im2->addtag(name=>'tiff_pagename', value=>"Page Two");
+
+ # read second page
+ my $page_file = 'testout/t106_pages.tif';
+ ok(Imager->write_multi({ file=> $page_file}, $im1, $im2),
+ "build simple multiimage for page tests");
+ my $imwork = Imager->new;
+ ok($imwork->read(file=>$page_file, page=>1),
+ "read second page");
+ is($im2->getwidth, $imwork->getwidth, "check width");
+ is($im2->getwidth, $imwork->getheight, "check height");
+ is(i_img_diff($imwork->{IMG}, $im2->{IMG}), 0,
+ "check image content");
+ my ($page_name) = $imwork->tags(name=>'tiff_pagename');
+ is($page_name, 'Page Two', "check tag we set");
+
+ # try an out of range page
+ ok(!$imwork->read(file=>$page_file, page=>2),
+ "check out of range page");
+ is($imwork->errstr, "could not switch to page 2", "check message");
+}
+
+{ # test writing returns an error message correctly
+ # open a file read only and try to write to it
+ open TIFF, "> testout/t106_empty.tif" or die;
+ close TIFF;
+ open TIFF, "< testout/t106_empty.tif"
+ or skip "Cannot open testout/t106_empty.tif for reading", 8;
+ binmode TIFF;
+ my $im = Imager->new(xsize=>100, ysize=>100);
+ ok(!$im->write(fh => \*TIFF, type=>'tiff'),
+ "fail to write to read only handle");
+ cmp_ok($im->errstr, '=~', 'Could not create TIFF object: Error writing TIFF header: write\(\)',
+ "check error message");
+ ok(!Imager->write_multi({ type => 'tiff', fh => \*TIFF }, $im),
+ "fail to write multi to read only handle");
+ cmp_ok(Imager->errstr, '=~', 'Could not create TIFF object: Error writing TIFF header: write\(\)',
+ "check error message");
+ ok(!$im->write(fh => \*TIFF, type=>'tiff', class=>'fax'),
+ "fail to write to read only handle (fax)");
+ cmp_ok($im->errstr, '=~', 'Could not create TIFF object: Error writing TIFF header: write\(\)',
+ "check error message");
+ ok(!Imager->write_multi({ type => 'tiff', fh => \*TIFF, class=>'fax' }, $im),
+ "fail to write multi to read only handle (fax)");
+ cmp_ok(Imager->errstr, '=~', 'Could not create TIFF object: Error writing TIFF header: write\(\)',
+ "check error message");
+}
+
+{ # test reading returns an error correctly - use test script as an
+ # invalid TIFF file
+ my $im = Imager->new;
+ ok(!$im->read(file=>'t/t10tiff.t', type=>'tiff'),
+ "fail to read script as image");
+ # we get different magic number values depending on the platform
+ # byte ordering
+ cmp_ok($im->errstr, '=~',
+ "Error opening file: Not a TIFF (?:or MDI )?file, bad magic number (8483 \\(0x2123\\)|8993 \\(0x2321\\))",
+ "check error message");
+ my @ims = Imager->read_multi(file =>'t/t106tiff.t', type=>'tiff');
+ ok(!@ims, "fail to read_multi script as image");
+ cmp_ok($im->errstr, '=~',
+ "Error opening file: Not a TIFF (?:or MDI )?file, bad magic number (8483 \\(0x2123\\)|8993 \\(0x2321\\))",
+ "check error message");
+}
+
+{ # write_multi to data
+ my $data;
+ my $im = Imager->new(xsize => 50, ysize => 50);
+ ok(Imager->write_multi({ data => \$data, type=>'tiff' }, $im, $im),
+ "write multi to in memory");
+ ok(length $data, "make sure something written");
+ my @im = Imager->read_multi(data => $data);
+ is(@im, 2, "make sure we can read it back");
+ is(Imager::i_img_diff($im[0]{IMG}, $im->{IMG}), 0,
+ "check first image");
+ is(Imager::i_img_diff($im[1]{IMG}, $im->{IMG}), 0,
+ "check second image");
+}
+
+{ # handling of an alpha channel for various images
+ my $photo_rgb = 2;
+ my $photo_cmyk = 5;
+ my $photo_cielab = 8;
+ my @alpha_images =
+ (
+ [ 'srgb.tif', 3, $photo_rgb, '003005005' ],
+ [ 'srgba.tif', 4, $photo_rgb, '003005005' ],
+ [ 'srgbaa.tif', 4, $photo_rgb, '003005005' ],
+ [ 'scmyk.tif', 3, $photo_cmyk, '003005005' ],
+ [ 'scmyka.tif', 4, $photo_cmyk, '003005005' ],
+ [ 'scmykaa.tif', 4, $photo_cmyk, '003005005' ],
+ [ 'slab.tif', 3, $photo_cielab, '003006001' ],
+ );
+
+ for my $test (@alpha_images) {
+ my ($input, $channels, $photo, $need_ver) = @$test;
+
+ SKIP: {
+ my $skipped = $channels == 4 ? 4 : 3;
+ $need_ver le $cmp_ver
+ or skip("Your ancient tifflib is buggy/limited for this test", $skipped);
+ my $im = Imager->new;
+ ok($im->read(file => "testimg/$input"),
+ "read alpha test $input")
+ or print "# ", $im->errstr, "\n";
+ is($im->getchannels, $channels, "channels for $input match");
+ is($im->tags(name=>'tiff_photometric'), $photo,
+ "photometric for $input match");
+ $channels == 4
+ or next;
+ my $c = $im->getpixel(x => 0, 'y' => 7);
+ is(($c->rgba)[3], 0, "bottom row should have 0 alpha");
+ }
+ }
+}
+
+{
+ ok(grep($_ eq 'tiff', Imager->read_types), "check tiff in read types");
+ ok(grep($_ eq 'tiff', Imager->write_types), "check tiff in write types");
+}
+
+{ # reading tile based images
+ my $im = Imager->new;
+ ok($im->read(file => 'testimg/pengtile.tif'), "read tiled image")
+ or print "# ", $im->errstr, "\n";
+ # compare it
+ my $comp = Imager->new;
+ ok($comp->read(file => 'testimg/penguin-base.ppm'), 'read comparison image');
+ is_image($im, $comp, 'compare them');
+}
+
+SKIP:
+{ # failing to read tile based images
+ # we grab our tiled image and patch a tile offset to nowhere
+ ok(open(TIFF, '< testimg/pengtile.tif'), 'open pengtile.tif')
+ or skip 'cannot open testimg/pengtile.tif', 4;
+
+ $cmp_ver ge '003005007'
+ or skip("Your ancient tifflib has bad error handling", 4);
+ binmode TIFF;
+ my $data = do { local $/; <TIFF>; };
+
+ # patch a tile offset
+ substr($data, 0x1AFA0, 4) = pack("H*", "00000200");
+
+ #open PIPE, "| bytedump -a | less" or die;
+ #print PIPE $data;
+ #close PIPE;
+
+ my $allow = Imager->new;
+ ok($allow->read(data => $data, allow_incomplete => 1),
+ "read incomplete tiled");
+ ok($allow->tags(name => 'i_incomplete'), 'i_incomplete set');
+ is($allow->tags(name => 'i_lines_read'), 173,
+ 'check i_lines_read set appropriately');
+
+ my $fail = Imager->new;
+ ok(!$fail->read(data => $data), "read fail tiled");
+}
+
+{ # read 16-bit/sample
+ my $im16 = Imager->new;
+ ok($im16->read(file => 'testimg/rgb16.tif'), "read 16-bit rgb");
+ is($im16->bits, 16, 'got a 16-bit image');
+ my $im16t = Imager->new;
+ ok($im16t->read(file => 'testimg/rgb16t.tif'), "read 16-bit rgb tiled");
+ is($im16t->bits, 16, 'got a 16-bit image');
+ is_image($im16, $im16t, 'check they match');
+
+ my $grey16 = Imager->new;
+ ok($grey16->read(file => 'testimg/grey16.tif'), "read 16-bit grey")
+ or print "# ", $grey16->errstr, "\n";
+ is($grey16->bits, 16, 'got a 16-bit image');
+ is($grey16->getchannels, 1, 'and its grey');
+ my $comp16 = $im16->convert(matrix => [ [ 0.299, 0.587, 0.114 ] ]);
+ is_image($grey16, $comp16, 'compare grey to converted');
+
+ my $grey32 = Imager->new;
+ ok($grey32->read(file => 'testimg/grey32.tif'), "read 32-bit grey")
+ or print "# ", $grey32->errstr, "\n";
+ is($grey32->bits, 'double', 'got a double image');
+ is($grey32->getchannels, 2, 'and its grey + alpha');
+ is($grey32->tags(name => 'tiff_bitspersample'), 32,
+ "check bits per sample");
+ my $base = test_image_double->convert(preset =>'grey')
+ ->convert(preset => 'addalpha');
+ is_image($grey32, $base, 'compare to original');
+}
+
+{ # read 16, 32-bit/sample and compare to the original
+ my $rgba = Imager->new;
+ ok($rgba->read(file => 'testimg/srgba.tif'),
+ "read base rgba image");
+ my $rgba16 = Imager->new;
+ ok($rgba16->read(file => 'testimg/srgba16.tif'),
+ "read 16-bit/sample rgba image");
+ is_image($rgba, $rgba16, "check they match");
+ is($rgba16->bits, 16, 'check we got the right type');
+
+ my $rgba32 = Imager->new;
+ ok($rgba32->read(file => 'testimg/srgba32.tif'),
+ "read 32-bit/sample rgba image");
+ is_image($rgba, $rgba32, "check they match");
+ is($rgba32->bits, 'double', 'check we got the right type');
+
+ my $cmyka16 = Imager->new;
+ ok($cmyka16->read(file => 'testimg/scmyka16.tif'),
+ "read cmyk 16-bit")
+ or print "# ", $cmyka16->errstr, "\n";
+ is($cmyka16->bits, 16, "check we got the right type");
+ is_image_similar($rgba, $cmyka16, 10, "check image data");
+
+ # tiled, non-contig, should fallback to RGBA code
+ my $rgbatsep = Imager->new;
+ ok($rgbatsep->read(file => 'testimg/rgbatsep.tif'),
+ "read tiled, separated rgba image")
+ or diag($rgbatsep->errstr);
+ is_image($rgba, $rgbatsep, "check they match");
+}
+{ # read bi-level
+ my $pbm = Imager->new;
+ ok($pbm->read(file => 'testimg/imager.pbm'), "read original pbm");
+ my $tif = Imager->new;
+ ok($tif->read(file => 'testimg/imager.tif'), "read mono tif");
+ is_image($pbm, $tif, "compare them");
+ is($tif->type, 'paletted', 'check image type');
+ is($tif->colorcount, 2, 'check we got a "mono" image');
+}
+
+{ # check alpha channels scaled correctly for fallback handler
+ my $im = Imager->new;
+ ok($im->read(file=>'testimg/alpha.tif'), 'read alpha check image');
+ my @colors =
+ (
+ [ 0, 0, 0 ],
+ [ 255, 255, 255 ],
+ [ 127, 0, 127 ],
+ [ 127, 127, 0 ],
+ );
+ my @alphas = ( 255, 191, 127, 63 );
+ my $ok = 1;
+ my $msg = 'alpha check ok';
+ CHECKER:
+ for my $y (0 .. 3) {
+ for my $x (0 .. 3) {
+ my $c = $im->getpixel(x => $x, 'y' => $y);
+ my @c = $c->rgba;
+ my $alpha = pop @c;
+ if ($alpha != $alphas[$y]) {
+ $ok = 0;
+ $msg = "($x,$y) alpha mismatch $alpha vs $alphas[$y]";
+ last CHECKER;
+ }
+ my $expect = $colors[$x];
+ for my $ch (0 .. 2) {
+ if (abs($expect->[$ch]-$c[$ch]) > 3) {
+ $ok = 0;
+ $msg = "($x,$y)[$ch] color mismatch got $c[$ch] vs expected $expect->[$ch]";
+ last CHECKER;
+ }
+ }
+ }
+ }
+ ok($ok, $msg);
+}
+
+{ # check alpha channels scaled correctly for greyscale
+ my $im = Imager->new;
+ ok($im->read(file=>'testimg/gralpha.tif'), 'read alpha check grey image');
+ my @greys = ( 0, 255, 52, 112 );
+ my @alphas = ( 255, 191, 127, 63 );
+ my $ok = 1;
+ my $msg = 'alpha check ok';
+ CHECKER:
+ for my $y (0 .. 3) {
+ for my $x (0 .. 3) {
+ my $c = $im->getpixel(x => $x, 'y' => $y);
+ my ($grey, $alpha) = $c->rgba;
+ if ($alpha != $alphas[$y]) {
+ $ok = 0;
+ $msg = "($x,$y) alpha mismatch $alpha vs $alphas[$y]";
+ last CHECKER;
+ }
+ if (abs($greys[$x] - $grey) > 3) {
+ $ok = 0;
+ $msg = "($x,$y) grey mismatch $grey vs $greys[$x]";
+ last CHECKER;
+ }
+ }
+ }
+ ok($ok, $msg);
+}
+
+{ # 16-bit writes
+ my $orig = test_image_16();
+ my $data;
+ ok($orig->write(data => \$data, type => 'tiff',
+ tiff_compression => 'none'), "write 16-bit/sample");
+ my $im = Imager->new;
+ ok($im->read(data => $data), "read it back");
+ is_image($im, $orig, "check read data matches");
+ is($im->tags(name => 'tiff_bitspersample'), 16, "correct bits");
+ is($im->bits, 16, 'check image bits');
+ is($im->tags(name => 'tiff_photometric'), 2, "correct photometric");
+ is($im->tags(name => 'tiff_compression'), 'none', "no compression");
+ is($im->getchannels, 3, 'correct channels');
+}
+
+{ # 8-bit writes
+ # and check compression
+ my $compress = Imager::File::TIFF::i_tiff_has_compression('lzw') ? 'lzw' : 'packbits';
+ my $orig = test_image()->convert(preset=>'grey')
+ ->convert(preset => 'addalpha');
+ my $data;
+ ok($orig->write(data => \$data, type => 'tiff',
+ tiff_compression=> $compress),
+ "write 8 bit")
+ or print "# ", $orig->errstr, "\n";
+ my $im = Imager->new;
+ ok($im->read(data => $data), "read it back");
+ is_image($im, $orig, "check read data matches");
+ is($im->tags(name => 'tiff_bitspersample'), 8, 'correct bits');
+ is($im->bits, 8, 'check image bits');
+ is($im->tags(name => 'tiff_photometric'), 1, 'correct photometric');
+ is($im->tags(name => 'tiff_compression'), $compress,
+ "$compress compression");
+ is($im->getchannels, 2, 'correct channels');
+}
+
+{ # double writes
+ my $orig = test_image_double()->convert(preset=>'addalpha');
+ my $data;
+ ok($orig->write(data => \$data, type => 'tiff',
+ tiff_compression => 'none'),
+ "write 32-bit/sample from double")
+ or print "# ", $orig->errstr, "\n";
+ my $im = Imager->new;
+ ok($im->read(data => $data), "read it back");
+ is_image($im, $orig, "check read data matches");
+ is($im->tags(name => 'tiff_bitspersample'), 32, "correct bits");
+ is($im->bits, 'double', 'check image bits');
+ is($im->tags(name => 'tiff_photometric'), 2, "correct photometric");
+ is($im->tags(name => 'tiff_compression'), 'none', "no compression");
+ is($im->getchannels, 4, 'correct channels');
+}
+
+{ # bilevel
+ my $im = test_image()->convert(preset => 'grey')
+ ->to_paletted(make_colors => 'mono',
+ translate => 'errdiff');
+ my $faxdata;
+
+ # fax compression is written as miniswhite
+ ok($im->write(data => \$faxdata, type => 'tiff',
+ tiff_compression => 'fax3'),
+ "write bilevel fax compressed");
+ my $fax = Imager->new;
+ ok($fax->read(data => $faxdata), "read it back");
+ ok($fax->is_bilevel, "got a bi-level image back");
+ is($fax->tags(name => 'tiff_compression'), 'fax3',
+ "check fax compression used");
+ is_image($fax, $im, "compare to original");
+
+ # other compresion written as minisblack
+ my $packdata;
+ ok($im->write(data => \$packdata, type => 'tiff',
+ tiff_compression => 'jpeg'),
+ "write bilevel packbits compressed");
+ my $packim = Imager->new;
+ ok($packim->read(data => $packdata), "read it back");
+ ok($packim->is_bilevel, "got a bi-level image back");
+ is($packim->tags(name => 'tiff_compression'), 'packbits',
+ "check fallback compression used");
+ is_image($packim, $im, "compare to original");
+}
+
+{ # fallback handling of tiff
+ is(Imager::File::TIFF::i_tiff_has_compression('none'), 1, "can always do uncompresed");
+ is(Imager::File::TIFF::i_tiff_has_compression('xxx'), '', "can't do xxx compression");
+}
+
+
--- /dev/null
+P6
+# CREATOR: The GIMP's PNM Filter Version 1.0
+164 180
+255
+þþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûþþúýþùýþùýþûýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûþþüýýûüüúþþüþþüþþüþþüþþüýýûýýûýýûýýûþþüýýûþþüýýûüüúýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýýýýýþþþýýý\9a\9a\9a\80\80\80\80\80\80\80\80\80\80\80\80\1f\1f\1f%%%\81\81\81\7f\7f\7f\80\80\80   þþþýýýýýýýýýþþýþþüþþüþÿûþÿúþþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþþýýþÃÃÃZZ\\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5\ 5\ 5\a\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5aabÃÃÃýýýþþýþþüþÿûþÿúþþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüüüúþþüýýûþþüþþüýýüþþþ\98\98\98\e\e\1c\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5!!"\9e\9e\9eþþüýýûýþúþþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûýýûýýûýýûþþýÃÃÃYYY\ 3\ 3\ 3\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 4\ 1\ 1\ 1!!!\9e\9e\9cþþüýýûýýûýýûýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûýýûþþüýýüÃÃÃ\1a\1a\1a\ 4\ 4\ 6\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 4\ 4\ 6\ 3\ 3\ 5\ 1\ 1\ 2\ 4\ 4\ 4\ 3\ 3\ 3\1e\1e\1eÃÃÃüüúþþüýýûýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþünnn\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3\ 4\ 4\ 4\ 3\ 3\ 3\ 5\ 5\ 6\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5\ 2\ 2\ 3\ 3\ 3\ 3zzyýýüþþýþþýþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýû¬¬¬\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 4\10\10\10\1f\1f\1f\1f\1f\1f\13\13\13\b\b\b\ 3\ 3\ 3\ 2\ 2\ 2\ 2\ 2\ 3\ 3\ 2\ 6]]`ÃÃÃþþÿþþÿýýýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÃÃÃ\19\19\19\ 2\ 2\ 2\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 4\ 4\ 6\ 2\ 2\ 4\ 2\ 2\ 4
+
+
+\1e\1e\1e333CCC???---\14\14\14\ 5\ 5\ 5\ 1\ 1\ 3\ 2\ 2\ 4\ 3\ 3\a\1f\1e"ÃÃÃýýþüüüýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýý...\ 1\ 1\ 1\ 2\ 2\ 2\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 5\ 5\a\r\r\ e%%%BBB___cccPPP222\19\19\19\b\b\b\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5xxyýýþýýûýýûýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþü««ª\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\f\f\r'''MMMoooyyydddCCC(((\15\15\15\a\a\a\ 1\ 1\ 1\ 3\ 3\ 4\ 2\ 2\ 2wwwýýüýþúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûüüúýýû---\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ e\ e\ e+++OOOqqqtttbbbGGG333!!\1f\ f\ f\ f\ 3\ 3\ 3\ 2\ 2\ 2\ 2\ 2\ 2\1d\1d\1dÃÃÃþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûþþüüüúªª¨\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ f\ f\10---OOOggg]]]LLL888///%%%\16\16\16\ 6\ 6\ 6\ 2\ 2\ 3\ 2\ 2\ 4\ 3\ 3\ 3777ýýüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýû--,\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 5\ 5\a\12\12\13(((AAAFFF<<<---!!!\19\19\19\17\17\17\v\v\v\ 3\ 3\ 5\ 3\ 3\ 5\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 2´´´þþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÃÃÃ\17\17\17\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 3\ 3\ 5\ 3\ 3\ 5\ f\ f\ f ***%%%\1a\1a\1a\10\10\10\a\a\a\ 4\ 4\ 4\ 5\ 5\ 5\ 3\ 3\ 5\ 2\ 2\ 4\ 3\ 2\ 6\ 2\ 1\ 6\ 2\ 2\ 5\ 3\ 3\ 5668ýýüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûýýýªª«\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5
+\10\10\10\13\13\13
+
+
+\ 3\ 3\ 3\ 2\ 2\ 2\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5³³´ýýûþþüýýûþþüþþüþþýþþþþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüûûû--.\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 6\ 6\ 6\ 5\ 5\ 5\ 3\ 3\ 3\ 3\ 3\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4667ýýüüüúüüúþþüþþüþþýþþþþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûýýý++-\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 1\ 1\ 3\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 1\ 5\ 2\ 2\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\1c\1c\1dÃÃÃýýüþþüþþüþþüþþüþþýþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûýýý,,.\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 1\ 6\ 2\ 1\ 6\ 2\ 1\ 6\ 2\ 1\ 6\ 2\ 2\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 2³³³ýýüþþûþþüþþüþþüþþýþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþü©©©\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 4\ 4\ 6\ 3\ 3\ 5\ 2\ 2\ 4\ 3\ 2\ 6\ 2\ 2\ 6\ 2\ 2\ 6\ 3\ 3\a\ 2\ 2\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4556üüûýýûþÿûþþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþü©©©\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 3\ 3\ 3\ 3\ 2\ 2\ 2\ 3\ 3\ 3\a\a\a\a\a\a\r\r\r\ e\ e\ e\b\b \ 3\ 3\ 5\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 4\ 4\ 6
+
+\f\14\14\16 "\1f\1f!\b\b
+\ 2\ 2\ 4\ 2\ 2\ 6\ 2\ 2\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4555ýýûýýûþþúþÿúþþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþü©©©\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3\ 1\ 1\ 1\a\a\a\v\v\v\a\a\a\ 6\ 6\ 6\14\14\14...++-\r\r\ f\ 4\ 4\ 6\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 2\ 2\ 2\ 2\ 3\ 3\ 3\12\12\12>>@FFH\12\12\14\ 2\ 2\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5556ýýýüüûþþúþÿúþþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþü©©©\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 2\ 4\ 4\ 4\ 6\ 6\ 6\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 3\ 3\ 3
+
+
+!!"224\11\11\13\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 3\ 3\ 3\ 4\15\15\17335EEE;;;\16\16\16\ 2\ 2\ 2 444889\ 6\ 6\b\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 4\ 4\ 6²²²þþýþÿûþÿúþÿúþþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿúþþü©©§\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ f\ f\11224PPP<<<\10\10\10\ 4\ 4\ 4&&&224
+
+\f\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 2\a\ 4\ 3\ 6\ 2\ 2\ 3\ 3\ 3\ 3\1e\1e\1dRRQttr\85\85\84\95\95\95\99\99\99\94\94\94\\\\ e\ e\ e\ 6\ 6\ 6...\1f\1f\1f\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4±±²ýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿúþþü©©§\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 4\ 2\ 2\ 4\1c\1c\1eggh\97\97\97³³³ÂÂÂyyy)))\ 5\ 5\ 5\13\13\15\10\10\12\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 2\ 6\ 4\ 4\ 6\ 5\ 5\ 5000iig\83\83\81\92\92\90\9f\9f\9fªªª²²²¾¾¾¿¿¿qqq\11\11\11\a\a\a\11\11\11
+\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 4\ 4\ 6²²³þþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþü©©§\ 2\ 2\ 2\ 2\ 2\ 4\ 2\ 2\ 2
+
+
+\\\\93\93\93´´´ÃÃÃÃÃë~~},,,\ 6\ 6\ 6\b\b
+\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 4\ 3\a\ 2\ 2\ 4(()lll\93\93\91¦¦¤³³±¸¸·¿¿¿ÃÃÃÃÃÃÃÃ⢢RRR\b\b\b\ 5\ 5\ 5\f\f\r\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5²²²ýýüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþü©©©\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 2'''\7f\7f\7f¥¥£ÃÿÃÃÃÃÃÃÃÃìyyy\13\13\13\ 2\ 2\ 2\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\r\r\ f]]]\99\99\97ÃÃÃ
ââà ìììòòòôôôóóóÃÃÃÃÃî®®{{{%%%\ 2\ 2\ 2\ 3\ 3\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4sstýýüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþü©©©\ 2\ 2\ 4\ 2\ 2\ 5\ 4\ 4\ 5OOO¬¬¬ÃÃÃôôòûûùüüúüüúûûûãããDDD\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4((*§§¨ææäýýûþþýþþþÃÃÃÃÃÃçççýýýúúúñññ···YYY\ 6\ 6\ 6\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4444þþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþþ©©©\ 1\ 1\ 3\ 2\ 2\ 6\b\b |||èèèõõõ¢¢¢qqo  \9eððîýýüüüü\93\93\93\ 6\ 6\ 6\ 2\ 2\ 2\ 2\ 2\ 2\ 3\ 3\ 4\ 3\ 3\ 5\ 3\ 3\ 5JJJÃÃÃööôýýûûûú¨¨¨$$&\f\f\r'''\8a\8a\8aôôôýýýùùùÂÂÂ\16\16\16\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4444þþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþþ©©ª\ 2\ 1\ 5\ 2\ 1\ 6\12\11\14¯¯±÷÷ù\90\90\90 ***===kkkññïýýûÃÃÃ\18\18\18\ 6\ 6\ 6\ 3\ 3\ 3
+
+
+\ 5\ 5\ 5\ 2\ 2\ 3VVWÃÃÃûûùüüúººº\15\15\15\ 2\ 2\ 4888zzzGGGzzzõõõýýýååå777\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4444þþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþýªª«\ 3\ 2\a\ 2\ 1\a\1a\1a\1cÃÃÃìëÃ436\ 3\ 2\ 4:::xxw443\9b\9c\9aýýûÃÃÃ)))\ f\ f\ f\r\r\ e\1d\1d\1d\ f\ e\ e\ 4\ 3\ 3``aÃÃÃûûúóóòIII\ 2\ 2\ 1\ 2\ 2\ 2\r\r\rSSS}}}///ÃÃÃþþþ÷ø÷_`^\ 6\ 6\a\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4444þþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýû¨¨¨\ 2\ 2\ 4\ 2\ 2\ 4\1c\1f\1eÃÃÃÃÃÃ\15\11\17\ 6\ 2\ 5\ f\ e\rYYUKLHTWVóöõà à Ã331\16\17\18\1f ";;;HDC0,*`^bÃÃÃøüüÃÃÃ\15\15\16\ 3\ 3\0\ 3\ 3\ 1\ 6\ 5\ 4"!\1fYWW/.0\8c\8c\8eúýýøýù\81\88\80\ 4\ 6\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4444þþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûÃÃÃ\16\16\17\ 3\ 2\ 5\1d\e!ÃÃÃ
º¹µ\10\11\ e\ 1\ 4\ 3\ 3\ 6\ 4+,*HDF.-.ääáÃÃÃ(#\1d
+\a\ 4\ 6\ 6\ 5\ 6\b\ 6\ e\ e\f\16\1a\14'+,³³¶ôôô¶¶º
+\ e\ 2\ 2\ 4\ 5\ 3\v \b\r\a\a\ 6\r\r\v\1e\1c\1cqnqûøüüøü\96\92\97\ 5\ 3\ 6\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4444þþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüüüü,,.\ 3\ 2\ 5\1e\18\1dý¼ÃÃÃ
\e\1e\1c\ 1\ 2\ 5\ 3\ 3\ 5\12\12\13)+-"%)ÃÃÃ\8e\88{\1a\ f\ 4 \14\0&\e\ 1$\19\0\1f\13\0\1a\12\ 2\16\ e\a\81wrðëæ¸·´ \v \ 2\ 3\ 2\ 1\ 1
+\ 1\ 2\f\ 1\ 3\ 6\ 2\ 5\ 1\ 1\ 4\0qslüû÷úùö\94\92\8f\a\ 6\ 6\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4444þþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûýýý**,\ 3\ 2\ 4\10\ e\ e«¬¬áäå.//\a\ 1\ 5\b\0\ 6\ 4\ 3\a\0\a\ 4#"\1d²¨\86\80m%Â¥\8a\eá\19â\14Ã\9c\16Ã\9d\1eÃ\96\18\97v\16rc#þ\9dÃÃÃ\19\17\15\ 3\ 2\0\ 2\ 2\ 2\ 3\ 3\ 2\ 2\ 2\ 6\ 2\ 1\f\ 2\ 3\v\96\9a\98ûýõ÷ùð\82\83\7f\ 5\ 5\ 6\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4444þþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþþ,,-\ 2\ 2\ 4\ 2\ 4\ 4\86\88\8cðñõ\8b\8a\87\11\r\f\a\0\a\b\ 1\ 2\14\v\0eF\v®\82\eÃ\9a\16êµ\17ì¸\fæ¶ à ´\rì\ fÃ
\9e\10Ã\9b\13î#æ2ùuQF.\a\ 1\ 1\b\ 1\ 1\ 6\0\ 4\ 5\ 2\ 6\ 3\ 2\ 5/0/âåâýÿüëëëXVZ\ 5\ 4\a\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5444ýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþþ,,-\ 2\ 2\ 3\0\ 4\ 1SSTåà äïîïSTV\b\ 2\ 36!\ 6\89e\16±\83\14°|\ 2ã\ fî¸\ fî»
+é¼
+á¹ ÃÂ\ 6´\93
+\9dx\ 2Ã\9c\rè½\18ä»\17à\19mV\10"\13\ 2\b\ 2\ 2\ 3\ 3\ 1%'#ÃÃ
ÃúÿþøüýÃ
ÃÃ"!%\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\e\e\1cÃÃÃþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþþ,,-\ 2\ 2\ 3\ 4\ 2\ 1"!\1fÃÃÃøöùëæÃzg7\9ar\16¿\89
+Ã\9f\ 4ç¯ ðµ\fñ·\fï¹\ eë½\ fèÃ\ fÃ¥Ã\räÃ\17á¾\1cçÃ\eîÃ\17êÃ\14çÃ\16ã¿\1cé\1a\8fx\15o^ ÃæþùõýûúëÃç|\7fz\ 3\ 5\a\ 2\ 2\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 4\ 4\ 4±±°ýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþþ,,-\ 2\ 2\ 5\ 5\ 1\a\a\ 6
+twxâÃÃù\87¬\83\1d½\88\ 3Ã\99\ eãÂ\15éµ\11ì¸\fë¹\bé¼\bç¿ ëÃ\ eîÃ\11îÃ\1eñÃ+ôÃ/÷Ã0öÃ.øÃ%öÃ\14óÃ\rî¿\14ð\1cá*áKÃ
°v¦\97r*!\14\ 5\ 2\ 1\ 3\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 2±±°þþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿúþÿúþþüýýûýýý//0\ 1\ 1\ 4\ 1\ 3\ 1\ 2\ 3\ 22(\1d£\87Vª}!¿\86
+Ð\aܤ
+ç°\rëµ\fù
+ì¼ ê¾
+êÃ\rìÃ\11ïÃ\13ðà òÃ/ôÃ>÷ÃDöÃ4õÃ\1aöÃ\vöÃ\fôÃ\16òÃ\14ðÃ\ fë¿\16ð\1aÃ\99\19{W\ f\16\ e\0\ 1\ 3\ 1\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4±±±þþþþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿúþÿúþþüýýûüüü++-\ 3\ 2\a\ 3\ 2 \11\a\ 1YC\ e\9bx\13µ\84\aÃ\8d\ 6Ã\9b\ eâ«\fê´\vê´ ë·
+ì¼\rëÃ\fìÃ\ eîÃ\10ðÃ\15óÃ*õÃ>÷ÃA÷Ã=ôÃ,öÃ\e÷Ã\14ùÃ\ føÃ\ fùÃ\12öÃ\12÷Ã\12öÃ\1eòÃ
+ç)bL\ e
+\a\ 1\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5±±²ýýýþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýý,,.\ 2\ 2\ 5 \ 1\ 4L2\f u\13²\80\ 6¿\88\ 4Ã\95\râ¡\13ä¯\ 4êµ\ 5ì¶\vú\10ë¾\ fëÃ\fìÃ\rìÃ\12ïÃ\1côÃ9øÃGùÃBöÃ*õÃ\16õÃ\15õÃ\14õÃ\13õÃ\ eøÃ\10ôÃ\12ëÃ\12ãÃ\15ôÃ+î»"\93s\19\14\r\ 1\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5rrsþþþþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûþþýªª«\ 5\ 4\ 5\1c\10\ 3\85`\16¶x\b¿\80\ 3Ã\8f\ 3Ã\9c\rç¦\13ç±\vì¸ ë·\vü\11ìÃ\ fêÃ\bêÃ\fÃÃ\eòÃ/÷ÃAøÃ@öÃ-öÃ\19öÃ\ e÷Ã\ eôÃ\10ôÃ\ e÷Ã\ föÃ\16áº\15±\87\ 5Â\82\0ê\rà ¯\11~_\11\ f\b\ 1\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4445ýýýþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþýªª«\ 3\ 2\ 3, \a\94o\11¸w\ 3Ã
\82\ 5Ã\96\ 5á\vè«\vé´\rë·\fú\ eê½\rëÃ\vêÃ\aìÃ\10ðÃ'òÃ<õÃ7õÃ%óÃ\13öÃ\11÷Ã\12öÃ\ fôÃ\ eóÃ\ fìÃ\18Ã\9b\rµ\84\ 3Ã\8e\fÃ\9d á Ã\9c\12fL\v
+\ 5\ 1\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 3\ 3\ 5\e\e\1cÃÃÃþþüýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþþþþüþþüþþüþþüþþýªªª\ 3\ 2\ 2( \90s\1a´}\fÃ\8c\rÃ\9c æ ç®\ 3î¹ Ã¹\rì»\rë¿\vêÃ
\bìÃ
+îÃ\15òÃ+÷Ã=õÃ*õÃ\16ôÃ\10öÃ\ e÷Ã\rõÃ\ fôÃ\17õ\16ª\84\ 5·\8a\ 6Ã\98\ 6Ã\9b\ 5à\bÃ\9b\bÃ\9c\11dK\v
+\ 5\ 1\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 3\ 3\ 5\ 1\ 1\ 3\ 3\ 3\ 5\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 4qqqþþýþþüýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþþþþþþþüþþüþþüþþýªªª\ 2\ 2\ 3\12\v\ 4T>\10\86_\v½\8d\16ä\13à ¬\ 5ë´
+ï·\ fîº\rý\fìÃ\fÃÃ\ eÃÃ\12ïÃ\19óÃ#ôÃ&öÃ\1a÷Ã\15ôÃ\ fñÃ\10ñÃ\17êÃ\19Ã\97\r«y\ 1Ã\91\ 4Ã\9a Ã\9b\rÃ\9c\rÃ\9d\ eÃ\9a\ eÃ\92\1aL7\b\ 4\ 2\ 1\ 3\ 3\ 5\ 3\ 3\ 5\ 3\ 3\ 5\ e\ e\10\f\f\ e\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 4\ 4\ 6\ 3\ 3\ 3333þþüýýûýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþþþþþþþüþþüþþüþþýªªª\ 2\ 2\ 3\ 5\ 1\ 1\1c\ e\ 3Z>\a\7fS\ 3·\85\11î\10ë·\12ò·\11ï¼\fîÃ\fîÃ
\10ñÃ\19ïÃ\eñÃ\eóÃ\18óÃ\12öÃ\11õÃ\ fÃÃ\rãÃ\14¿\98\13\9fo\ 6±|\vÃ\92\vÃ\97 Ã\98\rÃ\9a\fÃ\9d\vÃ\98\ 5Ã\90\ e\8fc\1d\1a\v\ 1\ 3\ 3\ 3\ 3\ 3\ 5\ 2\ 2\ 4\b\b
+SSUhhj'')\ 5\ 5\a\ 2\ 2\ 3\ 3\ 3\ 4\ 2\ 2\ 4\ 3\ 3\ 4\ 2\ 2\ 2±±°ýýûýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþýªª«\ 2\ 2\ 3\ 1\ 4\ 1
+\ 5\ 1C)\10vM\14\80U\ 3§\81\rî\18ñ·\17ï¿\13îÃ\15ñÃ\1fóÃ'ôÃ%ñÃ\19ïÃ\14ïÃ\19èÃ\15ô\12¬\8b\10\8ce\ 5\9bm\a¼\87 Ã\94 Ã\99
+×
+Ã\9f\ fÃ\9d\12Ã\94\13¶\88\eÂ\89?yfC\15\14\ e\ 1\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 6\ 6\b;;;yyyyyyQQQ**)
+
+\b\ 2\ 2\ 2\ 3\ 3\ 4\ 2\ 2\ 4qqqþþüýþúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþýªª«\ 2\ 2\ 4\0\ 1\ 5\ 5\ 6\ 5("\1e\90\7fg\83h%~W\ 4\8b\\ 3©{\fà\fñ\10ø\17ü\1fñ\12ÃÂ\ fÃ\9c\12¨|\ e¡o\ 2\9di\ 6«v\rº\82\ eÃ\8c\vÃ\91\fÃ\93\vÃ\97\bÃ\97\fÃ
\90\r»\8e!à\ñ\94ú°¸³®QQL\ 6\a\ 6\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 4\e\e\eccc\80\80\80\81\81\81zzy442\ 2\ 2\ 3\ 2\ 2\ 4\ 3\ 3\ 5\1a\1a\1cÃÃÃýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþýªª«\ 2\ 2\ 4\ 2\ 2\ 6\ 3\ 4\ 4<A>³µ«³¨\83\8dl&\95h\ f\93i\f\98o ¦~
+Â¥\7f\ 5£}\ 6¢y\b§z\b°\7f\ 6º\85\bÃ\89\12Ã\87\ eÃ\8d\vÃ\92\aÃ\94\aÃ\92\fÃ\8c\ fÃ\87\11¸\84\1a»\94Mõ\97ÃûÃÃþ½º¿¿¿\94\96\99\ f\ f\12\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 3\ 4\ 4\ 4777}}}\81\81\81\80\80\7faa` !\ 3\ 3\ 5\ 2\ 2\ 4\ 3\ 3\ 5pppþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþýªª«\ 2\ 2\ 4\ 3\ 2\ 2\ f\v\v\ZS¾¾¹¾·³®\99u\90l\19\98i\ 4¢p\ 6Ã\92\ eò\13ô\ fë\11Ã\9f\11Ã\96\ eÃ\95\10Ã\96\rÃ\93\vÃ\90\vÃ\8e\aÃ\90\ 5Ã\8b\bµ\83\14±\850¾¦~üªÃ
ùÃÃÃÃÃÃÃÃý¾¹©§§! "\ 3\ 3\ 4\ 2\ 2\ 2\ 3\ 3\ 3\ 3\ 3\ 3\13\13\13]]]\80\80\80~~}mmm445\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\1a\1a\1aÃÃÃþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüüüúþþþjjl\ 2\ 2\ 4\ 4\ 2\ 2\13\10\13[XZ½¹º½»¾Ãº³°\97p\96i\18\9ad\b¬w
+È\11Ò\12Ô\10Ò
+Ã\94\bÃ\90\bÃ\8e\aÃ\8c\ 4¿\87\ 5½~\b¾|\f·\81\e´\96Q½´\99º»¶»½¸¹½¶ÃÃÃÃÃÃÃÃÃÃÃÃ
¼º¹TSS\ 6\ 6\ 6\ 3\ 3\ 3\ 2\ 2\ 2\ 3\ 3\ 3\ 4\ 4\ 4;;;oopqqqBBB\v\v\r\ 2\ 2\ 4\ 2\ 2\ 4\ 4\ 4\ 6\ 3\ 3\ 4000ýýüþþüýýûýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿÿýýýü,,.\ 2\ 2\ 4\ 3\ 2\ 2\ e\12\rU[W¸º·»½¸»¼ºÃ·®¶\9av\91g'\93e
+Â¥u\ 3¶\81\ 6¾\84 Ã\85 Ã\85\v½\82\f·y\b°p\ 4°o\ 4°w\r²\84/¼\9emû¦»½±¾¹·Ã¼¾ÃÃÃÃÃÃèèêõï÷õó÷ÃÃÃ\9f¡\9e\14\14\14\ 1\ 1\ 1\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 3 \v\16\16\18,,.\11\11\13\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4®®Âþþüýýûüüúýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüüüújjj\ 3\ 3\ 5\ 3\ 3\ 5\ 2\ 2\ 3 \ e\bOTK¹½¶Ãÿ¿¿¸¿½´Ãº³º¨\8c\93{@\83d\ f\91h\a\9ah\b\9ei\b\9dh\a\9bi \98e \98e\f\9an\e¬\8eK¿±\8bý³»º»¿»¹Ã¿ÃÃÃÃçäç÷õûûüýûþøúý÷÷øøÃÃÃOOO\ 4\ 4\ 4\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 3\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 4\ 4\ 5333þþüýýûüüúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÃÃÃ\16\16\15\ 2\ 2\ 4\ 2\ 2\ 4\0\ 3\a\r
+\ fb[_ÃÃÃÃÃÃÃÃ
Ãýº¼½¼¾¼ºÃ»¬µ¢\83 \82V\94n4\95l%\93l"\99t0¦\84K±\99m¼³\98ÿ´¾»µ¾º±¾¼µÃÃÃÃÃÃâçáò÷÷ýþýÿýùÿüöþýùýþýö÷÷²²²\17\17\17\ 2\ 2\ 2\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 3\ 3\ 5\ 2\ 2\ 4\ 3\ 3\ 5\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5\ 3\ 3\ 5 ®®Âþþüýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýþúüýøiig\ 2\ 2\ 2\ 3\ 3\ 5\ 2\ 2\ 6\ 2\ 3\ 5%$%ÃÃÃîÃÃáááÃÃÿ¾¾¼¼¼½¼½Ã½½Ã½¹Ã¼´¿¸Â¾¶§½µ¤¾¶§Ã»²Ã½¶Ã¼¹½¼º¼»¹ÃþÃÃ
ÃÃÃÃãäáôõòþÿýýþüÿþüþþûþþüþþüýþûôôô[[[\ 6\ 6\ 6\ 3\ 3\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 1\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 5\ 5\a""#ÃÃÃýýüýþúþþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûüüúüüú¨¨¦\ 4\ 4\ 2\ 3\ 3\ 3\ 2\ 2\ 4\ 3\ 3\ 6\ 6\ 6\ 6\8c\8c\8cúúúöööëëëÃÃÃÃÃþ¾¾¿½¾¿¾¼¾½»¾½º½¼¸Ã¾¹Ã¾ºÃ¾¸Ã¼¹¿»º¼º¹¿¾¼ÃÃ
ÃÃÃÃÃÃÃçççòòðýýûýýûÿÿýþþüþþüþþüþþüþþüüüüÃÃÃ\1c\1c\1c\ 3\ 3\ 5\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ f\ f\11rrsýýüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûÃÃÃ\1f\1f\1d\15\15\13\f\f\v\ 2\ 2\ 4\ 4\ 4\ 5DDEÃÃÃýýýýýýùùùìììÃÃý½½¾½¼¾½»¾½»Ã¿»¿¾º¾½¹¾¼¸¾½¹Ã½»¿½»ÃþÃÃÃÃÃÃääâïïï÷÷÷üüûýýûþþüýýûþþüþþüþþüþþüþþüþþüõõônnn\a\a\a\ 2\ 2\ 4\ 3\ 3\ 5\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 6\ 6\b\1e\1e\1fÃÃÃþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýýþþþ+++\16\16\16\1c\1c\1c\r\r\r\ 4\ 4\ 4\13\13\13µµ´÷÷õýýûþþüýýûúúøååãÃÃþ½º¾½¹¾½»¾¾»¾½¼¾¾»¾¾»¾½»¾½»ÃÃÃÃÃÃà ÃÃìëéööôûûùýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüûûúÃÃÃ&&&\ 4\ 4\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 4---þþþþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûýýûþþüýýýggg\ 2\ 2\ 2\ 5\ 5\ 5
+
+
+\ 5\ 5\ 5\ 5\ 5\ 5nnnïïÃýýûþþüþþüþþüýýûóóñÃÃÃÿ½¾½»¾½»¿¾¼¾½»¾½»¾¼¼¾¼½ÃÃÃ
ÃÃÃèçåóóñúúøûûùüüúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûøøøkkk\ 5\ 5\ 5\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3ªªªþþþýýüýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûýýûýýû¥¥¦\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3))'ÃÃÃýýûýýûþþüþþüþþüþþüûûùììêÃÃÃÃÃ
ÃÃÿ½¼º¾½½½½½ÃÃÃÃÃÃâââñññùùøûûùþþüþþüýýûýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýýÃÃÃ\11\11\11\ 2\ 2\ 3\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\17\17\19ÃÃÃýýüýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûüüúýýûÃÃÃ\15\15\16\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5\ 2\ 2\ 4\b\b \8c\8c\8aö÷óþþüÿÿýþþüþþüþþüþþüÿÿýüüúù÷÷ÃëìÃÃÃÃÃÃÃÃÃÃÃÃççåòòðùùøþþþýýýýýûþþüþþüþþüÿÿýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüôôóJJJ\ 2\ 2\ 2\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4kklþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûÃÃÃ\14\14\13\ 3\ 3\ 4\ 2\ 2\ 4\ 4\ 3\b\ 2\ 2\ 6\ 2\ 2\ 4888ääãýýùþþûþþüþþüþþüþþüþþüþþüþþüÿýþýüýòðñëêëðððøøøûûùûýúýþýþþþýýýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿûþþûþþüþþüýýý\8c\8c\8c\ 6\ 6\ 6\ 3\ 3\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 1\ 5\ 2\ 2\ 5\ 4\ 4\ 4kkjþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûþþüýþùüüúýýýeef\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 2\a\a\a\9c\9c\9bûûùýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüúúøööôýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿûþÿüþþüþþüýýü¼¼¼\ e\ e\10\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5jjjýýüüüúþþüýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûüüúýýûþþüddd\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 2>>>ÃÃÃøøöüüúýýûþþüþþüþþüþþüþþüþþüþþüýýûýýûúúøüüúþþüþþüþþüÿÿýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿûþþûþþüþþüûûúâââ++-\ 4\ 4\ 6\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 4\ 4\ 6\ 3\ 3\ 5\16\16\18ÃÃÃþþüýýûÿÿýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüüüúþþüþþüýýû¢¢¡\ 2\ 2\ 2\ 4\ 4\ 6\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4 \89\89\89ççåøøöüüúþþüþþüþþüþþüþþüþþüþþüþþüýýûþþüüüúûûùþþüÿÿýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿÿýþþüüüúùùùîîîMMM\ 5\ 5\a\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\15\15\16ÃÃÃüüúýýûýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûþþüýýûÃÃÃ\13\13\13\ 2\ 2\ 2\ 4\ 4\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 5\ 5\ 5---²²²æææõõóýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüùù÷ûûùþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüüüúùù÷÷÷õñññóóó\87\87\87\ 5\ 5\ 5\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 4\ 4\ 6\ 4\ 4\ 6\ 2\ 2\ 3\15\15\15ÃÃÃüüüþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûýýûÃÃÃ\13\13\13\ 2\ 2\ 2\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 2\ 2\ 2\ 2\ 5\ 5\ 5???´´´ÃÃÃôôôûûûþþýþþüþþüþþüýýûýýûýýûýýûþþüýýûûûùôôòööôûûùýýûþþüþþüýýûþþüþþüþþüþþüýýûýýûþþüþþüþþüþþüüüúýýûüüúúúøøøöððîêêèììëìììììì°°°\ e\ e\ e\ 5\ 5\ 6\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3\ 3\ 3\ 3\15\15\15ÃÃÃþþþýýüýýûýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýû###\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 2\ 3\ 3\ 3\ 6\ 6\ 6XXX©©©ÃÃÃìììøøøùùùüüüþþþþþþþþþýýýüüüúúú÷÷÷òòòñññêêêèèèðððöööùùùúúùüüúýýûûûùüüúúúøýýûýýûûûûûûûúúúùùùøøøøøøòòòïïïééçããâÃÃÃÃÃÃÃÃÃäääÃÃÃ\e\e\e \v\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 3\ 3\ 3(((üüüþþýþþüþþüýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüaa_\ 1\ 1\ 1\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 2\ 3\ 3\ 3
+
+
+ttt¢¢¢¶¶¶ÃÃÃçççðððñññöööúúúùùùùùùøøøòòòéééâââÃÃÃäääà à à ÃÃÃåååïïïööõùù÷øøö÷÷õùù÷ùù÷øøöóóñéééåååáááÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃNNN\f\f\r\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 2fffüüûýýûýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÃÃÃ\11\11\11\ 3\ 3\ 3\ 3\ 3\ 4\ 2\ 1\ 6\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 2\a\a\a\19\19\19\85\85\85\9e\9e\9e¨¨¨ºººÃÃÃÃÃÃäääîîî÷÷÷úúúùùùúúúùùù÷÷÷ÃÃÃÃÃÃÃÃÃåååïïïñññøøøýýûýýûüüúýýûýýûúúøøøöóóñææåÃÃÃÃÃÃÃÃÃÃ
Ã
Ã
ÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃ001\ 3\ 3\ 5\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5\ 3\ 3\ 5\ 3\ 3\ 3\ 2\ 2\ 2££¢þþüüüúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿúþþüþþüþþþýýýaab\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ f\ f\11&&&\8e\8e\8e¡¡¡¯¯¯ÃÃÃÃÃÃà à Ãééçóóñûûùýýûþþüýýûþþüýýýöööåååæææ÷÷÷ýýýþþþþþþþþüýýûþþüþþüýýûþþüþþüýýûööõÃÃÃæææÃÃÃÃÃÃÃÃÃÃÃÃÃ
Ã
Ã
ÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃåååÃÃÃ""!\ 3\ 3\ 3\ 3\ 3\ 4\ 3\ 3\ 5$$&556\16\16\16\ 4\ 4\ 4\ 2\ 2\ 2\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3\ 2\ 2\ 2%%%ýýüýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿúýýûþþüýýýÃÃÃ\12\12\14\ 2\ 2\ 4\ 1\ 1\ 3\ 3\ 3\ 5\ 1\ 1\ 3\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\11\11\13---\98\98\98¶¶¶ÃÃÃÃÃÃÃÃÃ÷÷öýýûýýûüüúýýûüüúþþüýýûþþþöööèèèôôôýýýþþþþþþþþþÿÿýýýûüüúýýûþþüþþüüüúýýûûûúüüüüüü÷÷÷ôôôìììäääÃÃÃÃÃÃÃÃÃÃ
Ã
Ã
ÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃðð¡\f\f\f\ 2\ 2\ 3\ 4\ 4\ 6\v\v\r::;@@@"""
+
+
+\ 3\ 3\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 2\ 2\ 2\ 2££¢üüúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿúþþüþþüþþþ___\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 4\ 4\ 5\e\e\eaaa¸¸¸ÃÃÃæææööôüüúþþüþþüýýûýýûüüúýýûûûùýýûýýý÷÷÷ëëëõõõüüüýýýûûûûûûüüúûûùýýûûûùüüúüüúþþüýýûþþýþþþþþþúúúýýýýýýüüüúúúñññçççÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃà à Ãððïlll\ 3\ 3\ 5\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5\f\f\r222444\18\18\18\a\a\b\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 4\ 2\ 2\ 2$$$üüüýýüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿúþþüýýûýýý"""\ 3\ 3\ 5\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4
+
+\f\17\17\19\ 5\ 5\a\ 2\ 2\ 4\v\v\v222¬¬¬ÃÃÃëëëøøöüüúûûùûûùýýûûûùýýûþþüüüúýýûýýûýýûúúøõõóøøöýýûþþüþþüþþüþþüþþüýýûüüúþþüýýûýýûüüúüüúûûùûûùþþüüüúýýûüüúýýûþþýýýý÷÷÷ìììÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃëëëÃÃÃ)))\ 1\ 1\ 2\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\a\a\a%%%@@@\1d\1d\1d\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 4\ 4\ 4\13\13\13ÃÃÃþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿúþþüþþüÃÃÃ\12\12\12\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\18\18\1a668\e\e\1d\ 3\ 3\ 5\ 2\ 2\ 4\15\15\15\86\86\86ÃÃÃÃÃÃúúøþþüýýûþþüûûùþþüýýûúúøýýûþþüýýûýýûüüúüüúûûùýýûûûùúúøýýûýýûûûùüüúüüúýýûüüúûûùýýûüüúûûùýýûüüúýýûþþüþþüýýûûûùþþýýýýþþþüüü÷÷÷èèèÃÃÃÃÃÃÃÃÃÃÃÃôôô\94\94\94\ 4\ 4\ 4\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 2\ 4\ 4\ 4\1c\1c\1c@@@\15\15\15\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5ccdüüûýýûýýûþþüýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿúþþüüüú\9e\9e\9e\ 2\ 2\ 2\ 2\ 2\ 4\ 2\ 2\ 4
+
+\f??A\18\18\1a\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4:::ÃÃÃòòòúúùýýûûûùüüúýýûþþüûûùýýûýýûüüúüüúþþüþþüþþüüüúüüúþþüþþüþþüþþüýýûÿÿýþþüýýûþþüþþüýýûþþüþþüþþüûûùüüúýýûûûùüüúþþüýýûýýûýýûüüúýýûüüúúúøÃÃëÃÃÃÃÃÃÃÃÃáááããã000\ 3\ 3\ 3\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 3\ 2\ 2\ 2\ 4\ 4\ 4\1c\1c\1c444\b\b\b\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 4\ 4\ 6\ 3\ 3\ 5\13\13\15ÃÃÃýýûþþüýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿúþþüýýû]]]\ 2\ 2\ 2\ 2\ 2\ 3\ 1\ 1\ 3 "99;\ 4\ 4\ 6\ 2\ 2\ 4\ 1\ 1\ 3\ 6\ 6\b\94\94\95ùùùüüûýýûþþüýýûýýûûûùýýûüüúýýûûûùýýûýýûýýûúúøýýûþþüýýûüüúûûùüüúüüúûûùüüúüüúüüúüüúüüúüüúüüúüüúþþüýýûþþüýýûþþüýýûüüúýýûüüúûûùýýûüüúþþüþþüýýûððîÃÃÃÃÃÃÃÃÃïïî\8f\8f\8f\ 3\ 3\ 3\ 3\ 3\ 4\ 3\ 2\ 6\ 3\ 3\ 4\r\r\v
+
+
+\a\a\a***(((\ 4\ 4\ 4\ 3\ 3\ 3\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4¡¡ üüúýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿúýþûüüú\1f\1f\1f\ 3\ 3\ 3\ 3\ 3\ 5\a\a 668\18\18\1a\ 2\ 2\ 4\ 3\ 3\ 5\ 5\ 5\a668ãããüüüþþüýýûûûùüüúýýûýýûþþüýýûüüúýýûýýûýýûþþüþþüýýûýýûûûùþþüýýûþþüüüúþþüþþüýýûýýûþþüýýûþþüþþüýýûüüúüüúüüúûûùýýûüüúþþüüüúýýûþþüþþüýýûýýûûûùþþüýýûðððÃÃÃÃÃÃÃÃÃááá***\ 2\ 2\ 4\ 3\ 3\ 6\r\r\ e\e\e\19!! \19\19\19\10\10\10888\1a\1a\1a\ 4\ 4\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 4\ 4\ 6\ 4\ 4\ 6$$$þþüüüúüüúýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýû\9e\9e\9d\ 2\ 2\ 4\ 4\ 3\ 6\ 2\ 2\ 2\1e\1e\1e777\ 5\ 5\ 6\ 2\ 2\ 4\ 2\ 2\ 2\b\b\b«««ýýüþþüüüúýýûýýûûûùýýûýýûüüúþþüþþüüüúüüúüüúýýûüüúýýûþþüýýûûûùýýûýýûþþüýýûýýûýýûýýûüüúýýûüüúûûùþþüþþüþþüþþüþþüþþüýýûýýûþþüþþüýýûüüúþþüþþüþþüüüúýýûýýûóóñââà ÃÃÃññîqqo\ 2\ 2\ 1\ 4\ 4\ 4\15\15\15...<<<000\19\19\19\1e\1e\1e777\ 6\ 6\ 6\ 2\ 2\ 2\ 1\ 1\ 1\ 2\ 2\ 2\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\13\13\14ÃÃÃýýüüüúþÿûþþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýû]]]\ 4\ 4\ 6\ 2\ 2\ 4 \bFFF\1c\1c\1c\ 1\ 1\ 3\ 3\ 3\ 5\ 3\ 3\ 3DDDëëéþþüþþüüüúýýûþþüþþüþþüüüúþþüûûùüüúüüúÿÿýþþüþþüüüúýýûûûùýýûýýûüüúüüúýýûúúøþþüþþüýýûþþüüüúýýûýýûüüúýýûýýûûûùüüúüüúûûùþþüúúøýýûþþüüüúüüúýýûüüúýýûûûùüüúþþüûûùúúöýýû»»¹\v\v
+\ 5\ 5\ 5\1c\1c\1c777FFF;;;###\v\v\v111$$$\ 3\ 3\ 3\ 3\ 3\ 3\ 2\ 2\ 2\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 4bbbüüûýýûýýùþþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþü \ 4\ 4\ 5\ 3\ 3\ 4\1f\1f\1e==<\ 5\ 5\ 5\ 2\ 2\ 4\ 1\ 1\ 3\ e\ e\ e¨¨¨ûûúýýûýýûüüúýýûûûùýýûüüúüüúþþüýýûþþüýýûûûùüüúüüúýýûûûùüüúûûùýýûüüúþþüþþüþþüúúøýýûûûùþþüþþüþþüþþüüüúþþüüüúýýûúúøþþüüüúýýûýýûýýûþþüüüúüüúüüúþþüþþüþþüüüúýýûýýûþÿûþþûççå000\ f\ f\ f"""999@@@000\1d\1d\1d\b\b\b\16\16\16@@@\v\v\v\ 2\ 2\ 2\ 3\ 3\ 3\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4""#þþýüüúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþü\9d\9d\9c\ 2\ 2\ 2\ 2\ 2\ 4\ 4\ 4\ 6;;;\15\15\15\ 2\ 2\ 2\ 2\ 2\ 4\ 4\ 4\ 6HHHîîìýýûûûùþþüûûùþþüýýûýýûýýûýýûüüúüüúýýûúúøþþüþþüýýûüüúùù÷øøöýýûûûùýýûüüúüüúþþüþþüþþüþþüûûùýýûüüúþþüýýûýýûþþüýýûþþüüüúþþüýýûüüúüüúýýûþþüüüúüüúûûùüüúüüúýýûüüúûûùýýùüüùùù÷__^\11\11\11\1c\1c\1c%%%###\19\19\19\f\f\f\ 4\ 4\ 4\ 5\ 5\ 5???(((\ 2\ 2\ 2\ 2\ 2\ 2\ 3\ 3\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5   ýýüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýþúþþûþþüýýý^^^\ 2\ 2\ 2\ 3\ 3\ 3\13\13\15<<<\ 6\ 6\ 6\ 2\ 2\ 4\ 2\ 2\ 4\ f\ f\11¢¢¢ýýûýýûüüúýýûþþüûûùüüúýýûþþüýýûýýûÿÿýýýûþþüüüúüüúûûùööôëëéùù÷ýýûþþüûûùüüúûûùýýûýýûûûùþþüþþüþþüüüúýýûûûùüüúýýûüüúýýûþþüüüúýýûþþüûûùüüúþþüýýûþþüýýûþþüüüúüüúþþüþþüýþúüýúüüú\96\96\95
+
+
+\b\b\b
+
+
+\a\a\a\ 3\ 3\ 3\ 1\ 1\ 1\ 1\ 1\ 1\ 2\ 2\ 2\1c\1c\1cBBB\ 4\ 4\ 4\ 2\ 2\ 2\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 5\ 2\ 2\ 5aabþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýþùýýûþþüÃÃÃ\10\10\10\ 4\ 4\ 4\ 3\ 3\ 3666###\ 1\ 1\ 3\ 2\ 2\ 4\ 3\ 3\ 5000äääûûùýþúþþüüüúýýûþþüûûùýýûýýûþþüüüúýýûüüúüüúýýûýýûüüúòòðççåóóñýýûýýûýýûüüúÿÿýþþüýýûýýûûûùýýûýýûþþüþþüþþüýýûþþüþþüüüúþþüýýûýýûüüúþþüýýûýýûûûùüüúüüúüüúýýûþþüûûùýýûþþûýýúþþüÃÃÃ
+
+
+\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 4\ 2\ 2\ 4
+
+\f=== \ 2\ 2\ 2\ 2\ 2\ 3\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 1\ 5\ 3\ 2\ 5""$ýýýþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüüýøþÿúýýû\9c\9c\9b\ 3\ 3\ 5\ 4\ 4\ 6
+
+
+AAA
+
+
+\ 3\ 3\ 5\ 2\ 2\ 4\ f\ f\11\84\84\84úúúþþüýýùþþüþþüüüúþþüýýûýýûýýûüüúüüúüüúýýûüüúýýûýýûüüúïïÃååãùù÷þþüüüúþþüýýûýýûýýûþþüüüúýýûûûùýýûýýûýýûýýûûûùýýûüüúþþüûûùýýûýýûýýûûûùýýûûûùþþüýýûþþüýýûüüúûûùþþüýýûýýùüýúýýûååä)))\ 2\ 2\ 3\ 1\ 1\ 4\ 1\ 1\ 3\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 5\ 5\a;;;\17\17\17\ 2\ 2\ 2\ 2\ 2\ 3\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 1\ 5\ 2\ 2\ 6\ 2\ 2\ 5\9e\9e\9fýýüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýþúýýúþþü\1d\1d\1d\ 3\ 3\ 4\ 4\ 4\ 6"""000\ 3\ 3\ 4\ 3\ 3\ 5\ 2\ 2\ 4'')ÃÃÃüüüüüúúûöýýûûûùþþüûûùýýûýýûýýûþþüýýûûûùýýûþþüüüúýýûúúøììêééçùù÷þþüýýûüüúýýûüüúüüúüüúþþüþþüýýûûûùþþüýýûÿÿýþþüþþüýýûûûùþþüþþüûûùþþüþþüþþüþþüûûùýýûüüúþþüþþüþþüýýûþþüýýúüýúüüúòòòDDD\ 3\ 3\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4666***\ 4\ 4\ 4\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 1\ 5\ 3\ 2\a\ 3\ 2\ 5\9f\9f þþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýüýýý\9b\9b\9b\ 3\ 3\ 3\ 3\ 3\ 5\ 4\ 4\ 6AAC\19\19\e\ 2\ 2\ 4\ 2\ 2\ 4
+
+\v``_ööôþþüþþüþþüüüúþþüûûùþþüüüúüüúýýûüüúüüúýýûýýûüüúþþüýýûûûùééçÃÃìúúúûûûýýüþþüþþüþþüþþüüüúüüúüüúýýûþþüüüúýýûûûùýýûûûùýýûýýûüüúþþüýýûüüúýýûüüúþþüþþüþþüüüúúúøýýûýýûüüúüüúüüúþþüýýýüüü^^^\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4333)))\ 2\ 2\ 2\ 3\ 3\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 3\ 3\ 5!!"ýýýþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþþþþþ\1c\1c\1c\ 2\ 2\ 2\ 3\ 3\ 3
+
+\vCCE \v\ 3\ 3\ 5\ 2\ 2\ 4\a\a\a®®Âüüúûûùüüúýýûýýûýýûþþüþþüþþüüüúýýûþþüüüúþþüþþüýýûýýûúúøøøöääâçççúúúýýýýýûýýûüüúûûùüüúýýûþþüýýûûûùüüúýýûþþüüüúýýûýýûüüúþþüýýûûûùÿÿýþþüþþüýýûûûùýýûýýûÿÿýýýûþþüüüúüüúþþüýýûûûùûûûüüü~~~\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4445$$$\ 3\ 3\ 3\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 4\ 4\ 6\ 2\ 2\ 4 !þþþþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýý\99\99\99\ 3\ 3\ 3\ 3\ 3\ 3\ 2\ 2\ 2\1a\1a\1c--/\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4../ÃÃÃýýûþþüþþüüüúýýûüüúüüúûûùþþüþþüüüúþþüýýûûûùýýûüüúþþüþþüööôââà èèçúúúüüüýýûüüúüüúýýûüüúþþüûûùýýûþþüþþüýýûüüúýýûüüúþþüûûùüüúüüúýýûûûùüüúüüúÿÿýþþüýýûüüúüüúüüúüüúþþüýýûüüúûûùýýûþþþùùù\97\97\97\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 1\ 1\ 3\ 1\ 1\ 3223\1f\1f\1f\ 3\ 3\ 3\ 1\ 1\ 2\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\12\12\13ÃÃÃþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþþ\1c\1c\1c\ 3\ 3\ 3\ 2\ 2\ 2\ 3\ 3\ 3444\17\17\17\ 3\ 3\ 4\ 2\ 2\ 4\ 6\ 6\bZZ[ôôóûûùýýûüüúþþüüüúýýûþþüþþüüüúûûùýýûüüúüüúüüúýýûüüúûûùþþüôôòà à Ãæææøøøþþþýýüþþüþþüýýûþþüûûùýýûüüúüüúýýûþþüþþüþþüüüúþþüýýûþþüýýûþþüþþüýýûýýûýýûüüúþþüþþüýýûüüúýýûüüúþþüÿÿýþþüûûùýýüýýý¥¥¥\ 3\ 3\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 1\ 1\ 3\ 3\ 3\ 5--.\16\16\16\ 3\ 3\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 1\ 1\ 2\9f\9f\9fþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿÿýþþüýýûýýûZZ[\ 3\ 3\ 3\ 2\ 2\ 2\ 2\ 2\ 2\ 5\ 5\ 5888\ e\ e\ e\ 2\ 2\ 2\ 3\ 3\ 5\ 5\ 5\a\88\88\89ýýûþþüýýûüüúýýûýýûýýûüüúþþüþþüþþüýýûüüúþþüüüúýýûüüúüüúþþüööôÃÃÃééé÷÷÷ýýýüüûüüúüüúüüúýýûûûùüüúýýûþþüýýûüüúüüúþþüýýûýýûûûùýýûýýûýýûýýûþþüýýûüüúýýûþþüüüúýýûþþüþþüüüúüüúûûùýýûüüúýýüþþþ¸¸¸\ 5\ 5\ 6\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 5\ 5\a223\ e\ e\ e\ 2\ 2\ 2\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3\9e\9e\9eÿÿýýýûüüúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüüüúýýûÃÃÃ\ f\ f\10\ 2\ 2\ 4\ 1\ 1\ 3\ 3\ 3\ 3\a\a\a>>>\ e\ e\ e\ 1\ 1\ 1\ 2\ 2\ 4\11\11\13ÃÃÃûûùýýûýýûþþüþþüýýûþþüþþüûûùüüúýýûýýûýýûýýûþþüüüúýýûûûùýýûòòðÃÃÃçççøøøýýýýýûþþüþþüýýûüüúþþüþþüüüúýýûúúøþþüüüúýýûýýûþþüþþüýýûûûùýýûüüúûûùþþüýýûþþüþþüþþüûûùýýûýýûüüúüüúýýûþþüþþüüüûýýýÃ
Ã
Ã
\a\a \ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\b\b
+777\ 6\ 6\ 6\ 2\ 2\ 2\ 2\ 2\ 3\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3___ýýüýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûýýûþþüYYW\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5\ 2\ 2\ 3 BBB\13\13\13\ 2\ 2\ 2\ 2\ 2\ 4((*ÃÃÃþþüüüúþþüüüúüüúýýûûûùüüúýýûþþüýýûýýûþþüüüúýýûûûùþþüþþüüüúîîìÃÃÃççæ÷÷÷üüüûûúüüúûûùýýûýýûýýûýýûüüúþþüþþüûûùýýûüüúýýûüüúûûùþþüûûùûûùýýûüüúüüúýýûýýûýýûüüúþþüüüúþþüýýûÿÿýýýûúúøýýûüüüýýýÃÃÃ\v\v\r\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 1\ 1\ 3\ 3\ 3\ 5\f\f\ e667\ 2\ 2\ 2\ 1\ 1\ 1\ 3\ 3\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3 þþüþþüüüúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûýýû\97\97\95\ 2\ 2\ 2\ 3\ 3\ 5\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4
+
+
+GGG\14\14\14\ 2\ 2\ 2\ 2\ 2\ 4556ÃÃÃþþüþþüûûùþþüÿÿýûûùþþüþþüüüúýýûþþüýýûýýûþþüýýûþþüýýûþþüþþüððîÃÃÃçççùùùüüüýýûýýûýýûûûùüüúýýûýýûýýûüüúþþüþþüþþüýýûýýûýýûýýûþþüýýûþþüþþüþþüýýûýýûûûùþþüþþüþþüýýûüüúýýûüüúýýûýýûÿÿýþþýþþþÃÃÃ\ e\ e\10\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\14\14\16445\ 5\ 5\ 5\ 3\ 3\ 3\ 1\ 1\ 2\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3!!!ýýüýýûýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþþ\1c\1c\1c\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 1\ 1\ 3\ e\ e\10FFF\18\18\18\ 2\ 2\ 2\ 3\ 3\ 3FFFèèçúúøýþúÿÿüúúøþþüþþüüüúýýûûûùüüúýýûúúøüüúûûùýýûüüúüüúúúøýýûîîìÃÃÃççæúúúüüüýýûûûùþþüþþüþþüûûùýýûüüúþþüûûùýýûüüúüüúþþüýýûûûùüüúýýûýýûüüúýýûüüúýýûþþüüüúýýûúúøýýûþþüýýûýýûüüúýýûüüúüüûþþþÃÃÃ\13\12\15\ 2\ 1\ 6\ 2\ 1\ 6\ 2\ 2\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4##%##%\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3 þþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýû\97\97\97\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 3\ 3\ 5\19\19\eKKK \ 2\ 2\ 2\ 2\ 2\ 2WWWïïÃýýûüüøüüúýýûüüúüüúýýûþþüþþüüüúýýûþþüþþüþþüþþüþþüþþüþþüûûùÃÃëÃÃÃëëêúúúþþþþþüþþüûûùüüúýýûþþüüüúýýûûûùþþüýýûýýûýýûüüúûûùþþüýýûûûùüüúýýûýýûþþüûûùýýûýýûþþüýýûûûùüüúþþüþþüþþüýýûýýûýýüýýýÃÃÃ\15\14\18\ 2\ 1\ 6\ 2\ 2\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5--/\r\r\ f\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3 þþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýû\96\96\96\ 3\ 3\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 4\ 4\ 6\13\13\15,,.PPP888\ 2\ 2\ 2\ 2\ 2\ 2cccññïþþüþþúýýúýýûüüúüüúýýûýýûþþüþþüûûùýýûüüúýýûúúøýýûüüúýýûýýûììêÃÃÃÃÃÃûûûüüüüüúüüúýýûÿÿýúúøþþüýýûýýûûûùýýûüüúüüúýýûýýûþþüûûùþþüþþüýýûüüúýýûûûùýýûýýûýýûüüúýýûþþüýýûýýûüüúýýûýýûüüúþþýüüüÃÃÃ\17\17\1a\ 2\ 2\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\v\v\r668\ 5\ 5\a\ 2\ 2\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3 þþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüVVV\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 4\ 4\ 6\17\17\19;;=___NNN\ 3\ 3\ 3 \81\81\81òòñûûùüüøþþûüüúýýûýýûþþüþþüûûùüüúþþüýýûýýûþþüþþüþþüýýûýýûûûùèèæÃÃÃÃÃÃüüüþþþýýüþþüýýûüüúþþüùù÷ýýûûûùþþüþþüýýûýýûüüúþþüüüúýýûüüúýýûüüúþþüþþüûûùþþüþþüýýûûûùýýûýýûýýûþþüþþüûûùþþüýýûûûûþþþÃÃÃ\17\17\19\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\17\17\18%%%\ 4\ 4\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3 þþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþü\18\18\18\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 1\ 1\ 3\ 5\ 5\a\15\15\17CCCXXX\ 5\ 5\ 5 \82\82\82ôôòýýûþþúþþûþþüüüúýýûûûùþþüþþüûûùüüúýýûýýûüüúýýûûûùüüúýýûüüúêêèÃÃÃìììúúúüüüúúøýýûýýûýýûþþüýýûýýûÿÿýüüúüüúýýûþþüþþüûûùþþüþþüþþüýýûüüúúúøþþüýýûûûùüüúþþüþþüýýûýýûýýûüüúýýûýýûûûùýýûüüüýýýÃÃÃ\15\15\17\ 2\ 2\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 6\ 6\ 6,,,\ f\ f\ f\ 2\ 2\ 4\ 1\ 1\ 3\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3!!!ýýüýýûýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþü\18\18\18\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\a\a \19\19\19JJJ\v\v\v\v\v\v\8a\8a\8aööôüüúüýùýýúþþüþþüüüúýýûûûùüüúýýûüüúýýûýýûþþüþþüþþüýýûýýûüüúêêèááÃïïîúúúþþþþþüýýûýýûûûùüüúþþüüüúüüúüüúýýûüüúýýûûûùþþüüüúüüúûûùýýûýýûýýûûûùýýûýýûüüúûûùýýûüüúüüúýýûüüúüüúýýûþþüþþüúúúþþþÃÃÃ\v\v\f\ 3\ 3\ 5\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 3\13\13\13///\ 6\ 6\ 6\ 3\ 3\ 3\ 3\ 3\ 3\ 2\ 2\ 2\ 3\ 3\ 3\ 3\ 3\ 3\ 2\ 2\ 2\ 2\ 2\ 2\ 3\ 3\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3 þþüþþüüüúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþü\18\18\18\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 3\ 3\ 5\a\a\a***\1f\1f\1f\r\r\r\85\85\85øøöþþüþÿûþþûüüúüüúýýûûûùþþüýýûýýûýýûüüúüüúýýûúúøýýûýýûüüúýýûêêèââà òòñúúúýýýýýüþþüÿÿýþþüþþüýýûþþüþþüýýûüüúýýûþþüýýûüüúüüúýýûüüúýýûýýûþþüýýûûûùþþüÿÿýýýûþþüþþüþþüþþüþþüþþüûûùýýûþþüþþþýýý¯¯¯\ 6\ 6\a\ 2\ 2\ 4\ 3\ 3\ 5\ 6\ 6\a\1a\1a\1a///###\v\v\v\12\12\12\19\19\19\14\14\14
+
+
+\ 4\ 4\ 4\ 2\ 2\ 2\ 3\ 3\ 3\ 2\ 2\ 2\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3___ýýüýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþýþþûþþüþþý\18\19\18\ 2\ 2\ 3\ 4\ 1\ 2\ 6\ 2\ 2\ 6\ 1\ 2
+\ 4\ 2 \ 5\ 3\ 4\ 2\ 1\ 3\ 3\ 2\ 4\ 4\ 5/./212xxxööôûüûüýùýþúþþüþþýýýûþþüüüúüüúûûùüüúýýûþþüþþüþþüüüúüüúüüúýýûëëéà à Ãññðýýýþþþûûúýýûüüúüüúýýûûûùýýûýýûþþüýýûýýûûûùýýûüüúýýûýýûýýûúúøýýûüüúúúøþþüýýûûûùüüúýýûûûùüüúýýûûûúýüûýýúüýùûüøýýüüüü\8c\8d\8c\ 2\ 3\ 3\ 3\ 3\ 5\17\17\19333'''\e\e\e\v\v\v\ 4\ 4\ 4\11\11\11\16\16\16"""***&&&\1e\1e\1e\12\12\12\a\a\a\ 2\ 2\ 3\ 2\ 2\ 5\ 2\ 2\ 5\ 2\ 2\ 2\9e\9e\9dÿÿþýýûýüùþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþþÿýÿþÿùûÿþüþÿ\94\96\96\ 6\ 3\ 1#\10\ 2eG\10\9ew\17·\8e\18¡\80\18YG\10\ f \0\ 4\ 2\ 4\b\ 4\f96;yywÃîÃúþþúýùüý÷ýûýþýÿúúùýýûþþüýýûþþüþþüüüúúúøýýûýýûüüúýýûþþüüüüéééà à à òòñûûùüüúþþüþþüýýûþþüýýûüüúüüúüüúûûùýýûüüúþþüþþüþþüýýûýýûýýûýýûüüúýýûþþüüüúþþüþþüüüúþþüþþüþþüüýûúýýýýýÿýùýÿ÷ùÿøüþúùúùbdd\ 2\ 3\ 2\15\13\12!\1f\1f\ e\ e\ f\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5
+
+\f\19\19\e,,-EEEKKK\19\18\18\ 2\ 4\b\ 2\ 2\a\ 6\ 1\ 1  \9bþýþÿýûþÿøýÿûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüúÿôüÿûÿþúýü÷ÿýôcO$«\85\18ÃÂ¥\17ï¼\1añ¾\18ñ½\18æ· \9ax\1d!\11\ 2\ 3\ 4\ 1\ 4\b\ 4HIKÃÃÃúûûûýùþþüþýþýþûüýúýýûüüúüüúýýûþþüþþüýýûüüúýýûþþüýýûýýûüüüëëëà à à òòñüüúüüúýýûûûùýýûüüúþþüüüúýýûýýûþþüüüúþþüüüúýýûýýûýýûýýûüüúþþüýýûüüúþþüþþüüüúþþüþþüûûùýýûüüúþþüûþøüûùýùùûúôúýóüýôèâÃ4..\12\ f\r\e\1a\18\ 5\ 4\ 4\ 3\ 3\ 5\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 3\ 3\ 4\1e\1e\1eZZZbb\\e \e\ 2\ 6\b$!"þüþÿüÿÿýúüÿüüÿþþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþûúÿùýþüÿûÿÿûùë⻵\8c ä\ròµ\11ô½\rõ¿\fú»\12þ·\14ðµ\16Â¥\85\19 \15\ 2\ 2\ 5\ 3\f\r ROSÃÃÃùûõýýýúûøùý÷üýúüüúýýûýýûüüúýýûüüúþþüþþüýýûýýûýýûüüúûûûêêêÃÃÃóóñûûùýýûþþüýýûüüúýýûýýûþþüþþüûûùýýûýýûþþüýýûýýûýýûýýûýýûýýûüüúýýûýýûûûùþþüýýûûûùýýûüüúûûùýýûüüúýüôýöÃïîîãÃâîÃ\9fø\845"
+%\1d\15\f\v \ 3\ 2\ 2\ 2\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3\ e\ e\ e888GG?32.\a \f""&ýþùûÿôþþøýþùüÿûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþûÿÿøÿüÿÿüÿýÿøÿýîñ]Ã\98\11å®\10î·\ eñ¾\vð¾\fõ¼\14ú¼\ eø¿\ 4ê»\16©\82\e)\16\ 2\a\ 2\0
+\f\b:>3¿¿¼úøûýþüýþüþþüýýûüüúýýûþþüþþüýýûüüúþþüýýûüüúýýûþþüýýüêêêà à à óóñýýûýýûüüúþþüýýûþþüüüúüüúûûùýýûúúøýýûûûùýýûüüúþþüþþüûûùþþüýýûþþüüüúüüúûûùþþüþþüþþüþþüýýûýýûýüøûÃÃóQó ë¾\1cÃÃ\1fÃÃ\1då»\1eâ$PB\16\ 3\ 2\ 1\ 4\ 3\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5\ 5\ 5\ 6\1d\1d\1d7770,-\1a\13\12\13\f\ 6e`aüþûøÿúûÿýÿýüÿþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýþüÿüúüþûûþïÃÃ\92¼\8a\17Ã\9c\fæ¯\rð¸\ fò¾ ñÃ\vñÃ
+òÃ\ 2ó¿\ 5ö½\14ò¹\1e¬\82\1d%\14\ 2\ 1\ 5\ 2\a\f\ 2855´²´õöøþýýüûùþþüýýûüüúýýûüüúýýûþþüûûùüüúýýûûûùýýûûûúèèèÃÃÃ÷÷õüüúüüúýýûüüúýýûüüúýýûþþüýýûþþüþþüýýûüüúýýûüüúüüúûûùþþüüüúýýûüüúþþüþþüþþüûûùýýûüüúúúøýýûüüúýûóëÃ|â³\16ôà ÷Ã\vôÃ\10öÃ\16õÃ\17å¾#RB\r\ 3\ 2\ 1\ 3\ 1\ 1\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 5\ 5\ 5"""%%%\1a\19\18\18\10\ 3\80l\18ÃÃ
yÿýâýýðùÿùûüþÿüþþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüûÿþüþüúþ÷þûç·\90.Ã\91\ eã\aï®\11ö²\12ø¹\10÷½\rô½\rö¼\ f÷½\rõ¾\fô¾\16ê´\1e\90r\17\16\ f\ 2\ 4\ 2\a\v
+-.*¢£\9föòôýüüúúøýýûþþüþþüþþüüüúüüúüüúüüúýýûüüúþþüûûûëëëà à à ññïýýûþþüþþüüüúýýûýýûüüúýýûûûùüüúýýûþþüýýûüüúþþüýýûþþüýýûüüúþþüýýûþþüüüúýýûýýûýýûýýûþþüýýûýýûþüôä½kâ¥\rò·\ròÃ\10óÃ\10õÃ\f÷Ã\ fï\16?.\0\ 3\ 2\ 1\ 3\ 1\ 1\ 2\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\11\11\12 \11\11\11
+\ 6<-\ 5ç\1dðÃ"æÃ=õð¹ûþûúÿúüþùþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþûûÿöýýøÿûëêgÃ\89\11Ã\9a\và §\vï®\10÷µ\rùº\rø¼\ e÷¼\10÷¼\11÷¾\fô¿\ 6óÃ\aõÃ\10õ\13uW\r\12\ 4\ 3\ 3\ 3\ 5\ 5\a\ 4"$\e\83\83\85ÃÃÃýýûûûùüüúûûùýýûýýûþþüüüúüüúýýûûûùýýûüüüêêêÃÃÃëëéøøöûûùþþüýýûýýûýýûþþüÿÿýýýûýýûüüúýýûüüúýýûüüúûûùýýûüüúýýûüüúýýûþþüüüúýýûüüúýýûüüúüüúýýûûûùþýõãÃrÃÂ¥\ eñ²\ fõ»\12òà óÃ\bìÃ
\ f»\98\172$\0\ 3\ 2\0\ 3\ 1\ 2\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 5\ 5\ 6\ 6\ 6\ 6\ 3\ 3\ 2\1a\ e\ 2\91q\16êÃ\18ôÃ\ 6úÃ\16éÃkÿýéúýýüÿüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþûþþýþþýþþüþþûþþüþþüþþüþþøþþóþþïþþÃþþìþþÃþþïÿýéìå¿ÃÂ¥[¿\86\11Ã\95\ fã\ 5æ¬\vî¶\10ò½\10ôÃ\vó¾ ó¿\ eò¿\ fò¿\ eö¾\fø¾
+òÃ\aó½\10á\19M6
+\ 5\ 3\ 6\ 2\ 5\ 4\ 4\ 5\ 2\14\15\18UVUÃÃÃúúøüüúýýûþþüýýûýýûýýûýýûþþüýýûûûùüüüöööêêêÃÃëúúøþþüûûùýýûüüúýýûýýûüüúþþüýýûþþüþþüþþüûûùýýûýýûþþüýýûüüúýýûýýûþþüýýûýýûüüúýýûýýûþþüýýûüüúýüôãÃpã\rî±\ eö¾\rñÃ\ 4ÿ\ eã¶\18®\85\141 \0\ 5\ 3\ 1\ 3\ 2\ 3\ 2\ 1\ 3\ 2\ 2\ 3\ 2\ 2\ 3\ 2\ 2\ 3\ 1\ 2\ 4\ 2\ 2\ 5\ 2\ 2\ 4\ 2\ 2\ 5\ 2\ 2\ 4\ 1\ 2\ 2\ 2\ 2\ 3\ 3\ 2\ 3\b\ 5\ 1`E õ\19îÃ
îÃ
+îÃ\10äÃ<Ãè¾üüúÿþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿþùýÿøþþÿûÿþÿüýþý÷øÿþÿûöÿüêÿ\98ÃÃy°\88%¶\86\16¶\85\16±\83\eÂ\80 °\80\18¶\82\13Ã\8b\10Ã\96\rÃ\9e\vãª\vê±\vòº\ fó½\fô¾\võ¾\fõ¾\fô¾\fô¾\fõ¾\fõ¾\fòÃ
+ó½\13ð»\15´\90\13(\1c\ 2 \ 3\ 2\ 2\ 1\ 1\ 3\ 4\v
+\f??>ÃÃÃüûùüüøýþùýþúûýúýýûúúøüüúüüúýýûþþþýýýùùùøø÷úúøýýûýýûûûùþþüüüúþþüþþüûûùýýûüüúûûùüüúýýûüüúýýûýýûûûùþþüûûùüüúüüúþþüþþüþþüþþüýýûúúøüüüýýýüúôæÃwâ\11î²\ fô¼\rñ¿
+î¹\ráÂ\11µ\84\ eB+\ 1
+\ 4\0\ 5\ 1\ 5\ 2\ 2\ 3\ 2\ 3\0\ 2\ 3\0\0\ 4\ 1\0\ 5\ 3\0\ 3\a\ 3\ 2\a\ 5\0\ 6\ 3\ 1\ 4\ 2\ 5\0\ 2\ 4\ 6\b\ 1\ 51 \ 3º\94\18îÃ\11ÃÃ\aîÃ
+ðÃ\fäµ!ÃÃ\97ýþÿÿýþþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþûþÿøýÿùþÿùýÿûþûÿÿýúýþøç÷¯\84!¾\8c\12Ã\97\10Ã\9c\vÃ\9c\vÃ\9a\rÃ\96\ eÃ\90\fÃ\8f\fÃ\95\ eÃ\9c\ fà\fã¨\fê°\fòº\ fô¼\ eõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fò¾\bõ½\ fò¾\11ù\1e\88j\15\11\a\0\ 6\ 2\ 2\ 2\ 2\ 4\ 1\ 2\ 2\ 6\ 6\ 6###\97\96\95ñðîýýûüýûýÿüþþüýýûþþüþþüüüúúúùûûûýýýýýüüüúýýûýýûÿÿýþþüýýûüüúýýûþþüþþüüüúþþüüüúýýûýýûþþüýýûþþüýýûþþüýýûýýûýýûüüúýýûýýûþþüýýûøøøîîîãà Ãúiã\13ì°\rô»\ fï»\fç±\aæ\vÃ\8b\11eC\r\16\b\0\ 5\ 3\ 3\ 1\ 4\ 4\ 1\ 2\ 4\ 5\0\ 6\ 6\0
+\ 3\0 \0\ 4\ 6\ 1\ 3\ 1\ 5\ 2\ 2\ 2\ 3\ 3\0\ 6\ 3\ 3\ 3\ 2$\ f\ 1\9aq\16ÃÂ\13ê¼\fé»\rú\rô½\vêµ\1cÃÃ\96ýþüÿýüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýþþýýÿÿüþþÿùýþöþüúÿùîÂ\89*Ã\8f
+Ú
+Ý
+á¨\ eá¨\ fà §\rã\aä\aä\fà ¦\ eå«\ fé¯\ fî³\ eó¹\ eô½\fô½\võ¾\fõ¾\fô½\vô½\võ¾\fõ¾\fõ¾\fõ¾\f÷¿\b÷½\fñÃ\ eðÃ\12è\17XC\ e \ 3\0\ 3\ 1\0\ 2\ 2\ 3\ 3\ 3\ 5\ 1\ 1\ 3\14\13\14}{|éèçûûùþþüûûùüüúûûùüüúþþüýýûþþþýýýüüûüüúýýûüüúüüúûûùþþüýýûüüúýýûýýûüüúýýûþþüþþüýýûüüúûûùýýûûûùýýûýýûûûùýýûþþüýýûüüúþþüûûùáááÃÃÃÃþóaà\ fï²\ fñ·\ eì·\vå®\aâ\ 6Ã\8b \98m\14?'\ 1\10
+\ 3\ 3\a \ 1\ 2\b\ 5\0\ 5\ 6\0\ 5\ 3\ 1\ 5\ 2\ 2\ 1\ 2\ 3\ 1\0\ 1\ 5\ 2\ 4 \ 2\ 4+\12\ 4\8ec\1cÃ\99\rä± æ·
+ê·\ eîµ\fô·\rå¬\19ÃÃ\8eþþüþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüûÿÿýýÿÿüýÿþøüýúþýõÃÃ\90»\88\12Ã\99\vã\rã®\ fç´\10è´\10ê²\11ê°\ fæ«\bæ«\ 6ì±
+ñ¶\ fñ·\róº\rõ½\fõ¾\fõ¾\võ¾\fõ¾\fô½\võ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ½\bó½\ eòÃ\röÃ\ 4è¿\ f®\8b\1d$\18\ 4\ 5\ 1\ 1\ 2\ 1\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5\f
+\r][\ÃÃÃüûùþþüýýûüüúýýûûûùüüúýýûûûùýýûüüúþþüþþüþþüýýûýýûüüúþþüýýûüüúüüúüüúüüúüüúûûùþþüþþüþþüýýûûûùþþüýýûûûùýýûýýûýýûüüúèèæÃÃÃÃ
Ã
Ã
Ãýð_á\10ê¬\fï´\ fé³\rä« Ã \ 3Ã\8e\ 6¯| \8ee\14;"\ 5\r\ 3\ 1\ 6\ 1\ 3\ 5\ 1\ 2\ 4\ 1\ 2\ 1\ 3\ 1\ 6\ 2\0\b\0\ 2\v\ 1\ 4 \ e\ 1[:
+\9fo\12Ã\91\ eá\fâ¯\ eé·\fì·\vó¸\vö¹\ fç°\18ÃÃ\94ýþÿýÿüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþûüÿõþÿüÿþûÿþøüþÿþþö¾¢^Ã\8a\18à\ræ¯\ fì´\rð¶
+ó·\fóµ\rô·\12ò¶\10ñ·\vôº\rõ»\ eö¼\ eõ½\ eõ½\ eõ½\ eõ½\ eõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fô¾\fñ¼\10ò½\rôÃ\ 5ïÃ\ fñ\16u]\13\ e\ 5\ 2\ 4\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 6\ 3\ 3\ 5 \b
+423µ´³ùù÷ûûùýýûýýûþþüüüúýýûþþüûûùþþüúúøýýûûûùûûùýýûýýûýýûüüúýýûüüúýýûûûùþþüýýûûûùýýûüüúþþüþþüûûùþþüýýûýýûýýûýýûûûùÃÃÃÃÃÃÃÃÃÃþïaá\13é¬\rë°\rè±\ eäª
+â\ 4Ã\95\b»\85\b®{\ e\9fr\16tP\rK1\b8%\ 6.\1e\ 4+\1c\ 15"\ 5N3\11wV\14\9cr\13°|\ fÃ\8a à\ 2é\ 3ä°\ 6ö ó»\rõ¹\10ô»\fë¹\10êÃ\97ýüúüþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþûþÿôþÿúþþÿÿýùüÿûþýòÃ
Â¥VÃ\8d\14á\ eèÂ\ fð²\rö¶\røº\ e÷»\ró½\vñ¾ ô¼
+ö½\fõ¾\fõ¾\fõ½\ eõ½\ eõ¼\rõ¼\rõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fó¾\ fó¾\11ó»\ró¾\ fòÃ\réÃ\13¾\99\15:(\ 6\a\ 1\0\ 4\ 2\ 2\ 3\ 1\ 3\ 2\ 2\ 6\ 3\ 2\a\ 3\ 3\ 5\ 5\ 5\ 6\1f\1d\1e\91\91\91òòòûûúüüúýýûýýûüüúýýûÿÿýþþüþþüþþüþþüþþüüüúüüúûûùüüúýýûþþüýýûþþüûûùÿÿýþþüýýûýýûýýûþþüûûùüüúüüúþþüüüúüüúùù÷ÃÃÃÃÃÃÃÃÃÃÃ
¿Ã®dÃ\9a\11ã§ è¯\vé³\10å¬\vá¥\ 5Ã\9a\bÃ
\8e\v¾\84\f»}\vµz
+ªx\r v\13\9fv\16¢w\ eÂ¥x\f©z\13¬|\f·\82\aÃ\8c\rÃ\98\râª\bè³
+ï¹
+õº ôº\rõ»\12ó¼\ fð¾\ föAÿüÃÿüúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿýþýþÿûÿûÿýûüþÿÿÿì«\85(Ã\92\11ä\aê° ñ·\vôº\võ½\fô¾\fò¿
+òÃ\bõ¾\võ¾\fô½\vó¾\fó¾\fõ¾\fõ¼\võ¼\võ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fô¾\rõ½\ eô»\vó»\10ô¾\rðÃ\ eà ¹\12\8cj\11\14\b\0\ 5\ 1\0\ 3\ 1\ 1\ 3\ 3\ 4\ 3\ 3\a\ 3\ 3\a\ 3\ 3\ 5\ 4\ 4\ 5\ f\ f\ f|||ïïïýýüüüúýýûýýûüüúýýûûûùýýûýýûýýûýýûýýûþþüþþüþþüýýûüüúûûùþþüûûùýýûþþüüüúýýûýýûûûùþþüþþüýýûüüúüüúüüú÷÷õÃÃÃÃ
Ã
Ã
ÃÃÃÃþèbÃ\98\14ᥠç¯\vç³\ eç®\vä©\ 6Ã\9f Ã\97\ 4Ã\8e\ 3Ã\86 Ã
\85\vÃ\84 ¼\80\b¼\7f\r¾\7f\fÃ\82
+Ã
+Ã\8d\aÃ\95\ 5Ã\9d\vâ¦\11ñ\13ñ¸\10óº\fּ\rô¼\ fó½\ eô¾\10ó¸\ fæ¶\19ÃÃbÿýåþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿýýýþþúÿùÿþüüþúýüñà[Ã\91\ eã\rçÂ\ eìµ\fò»\rõ½\ eö¼\ fø½\10ø¼\ eö¾\fõ¾\fò½\vó¾\fó¿\võ¾\vö½\vö½\võ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fö¾
+ö½\võ½
+÷»\vô¼\ fôÃ\bëÃ\15â\1aL7\ e \ 2\0\ 5\ 1\ 1\ 2\ 2\ 4\ 1\ 1\ 5\ 2\ 2\ 6\ 2\ 2\ 4\ 3\ 3\ 4\ 3\ 3\ 3\11\11\11\86\86\86ôôóþþüýýûýýûþþüÿÿýþþüýýüýýûýýûûûùýýûüüúüüúüüúþþüþþüþþüûûùþþüýýûþþüýýûüüúþþüþþüüüúûûùúúøýýûýýûýýûööõÃÃÃÃ
Ã
Ã
ÃÃÃÃ
ýä`Ã\90\11à\bå ç³\fè¯\væ«\bä\vÃ\9b\fÃ\95\rÃ\93\ eÃ\90\aÃ\91\ 3Ã\8f\aÃ\8c\vÃ\8c\vÃ\90 Ã\91 Ã\95
+Ã\9e\aá©\bé´\ró½\ fø½\aø½\bø»\14ô¾\11ó¿\vô¾\bö¶\rô´\1aî\1fÃ¥Ã\95þþõþþüþþüþþýþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿýþüÿþüÿýÿýüýýüþþøÃÃ\89Ã\8c\14Ã\9f
+æ¬\fô\fñ¹\fõ½\ eõ½\ eõ½\ eõ½\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fö½\fö½\fõ¼\vó¼\vñ¿\vòÃ\11ç»\10§\81\13$\13\ 2\ 6\0\ 3\ 2\ 2\a\ 1\ 2\ 6\ 2\ 2\ 5\ 2\ 2\ 5\ 1\ 3\ 1\ 2\ 2\ 3\ 3\ 3\ 5\1d\1d\1e°°°úúøþþüûûùüüúüüúýýûûûùüüúýýûüüúýýüýýûüüúüüúýýûûûùþþüþþüüüúýýûûûùýýûüüúûûùüüúýýûþþüþþüþÿûþþûýûüùøúÃÃÃÃÃÃ
Ã
Ã
ÃÃ
üá]Ã\8b\13Ã\9a\vᨠç°\fê° ì¯ â¨\aä Ã\9d\bÃ\9a\bÃ\9a
+Ã\97\bÃ\96\bÃ\97 Ã\97\bÃ\98\ 6Ã\9c\aá\bã¨ ç® ï¸\rõ½\rô½
+õ½\fõ½\ eô¾\rõ¾\fõ¾\rô»\rò¸\10ìµ\11î-ðê±ýþ÷úýþþýþÿüÿüÿýûÿûüÿúþÿúþþûûÿýúÿýÿýýÿûüýþûüÿüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿýüüÿüýÿüÿþúþýûýý÷ÃÃ\8eÃ\8c\15Ã\9e\vã¨\vë²
+ñ¹\rô¼\rõ½\ eõ½\ eõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fö½\fö½\fô½\vñ¾\vñÃ\ròÃ
\13ÃÂ\16uU\ f\f\ 5\ 2\ 3\ 2\ 6\ 2\ 3\0\ 4\0\ 6\ 3\0\a\ 1\ 2\a\ 1\ 1\ 4\ 2\ 2\ 4\a\a\a[[[ÃÃëúúøþþüþþüþþüýýûüüúüüúþþüýýûüüúþþüüüúûûùýýûüüúüüúýýûýýûýýûýýûÿÿýþþüýýûþþüýýûûûùýýûüýùûüùýýüûûûåååÃÃÃÃÃÃÃþ½\9f[»\85\ eÃ\98
+à ¦ å®
+ì± î² è¯\vä«\vᦠã á
+Ú¡\fÙ\vÚ \fÙ
+â ä\båª\fç®\võ\ró»\ fõ½\rô½\võ¾\rõ½\ eõ¾\rõ¾\võ¾\fó¼\fñ¹\rñ¹\ fï³\eá.ëã±ûþøúÿúÿýüÿúÿþþúûÿùÿýÿÿýýýÿøûÿøþþþÿýüüÿùüÿûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿýúüÿúýÿúÿÿ÷þþúþýöÃÃ\96¼\88\12Ã\9a
+á¦\fë±\ eñ¸\rô¼\rõ½\ eõ½\ eõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fò½\vô½\võ¾\fö½\fõ½\vò½\vð¿\vóÃ\10é¿\11Ã\9a\12>-\b\ 5\ 2\0\ 3\ 2\ 1\ 6\ 1\0\ 3\ 1\ 4\ 2\ 1\b\ 2\ 1\ 5\ 2\ 2\ 4\ 2\ 2\ 2***ááÃýýûüüúüüúýýûþþüýýûþþüüüúûûùýýûûûùþþüþþüýýûþþüýýûýýûüüúþþüýýûýýûûûùýýûýýûýýûýýûþþüýýûþþüüýúûûùììêÃÃÃÃÃÃÃÿº\9bW»\85\10Ã\94\bã\bÃ¥Â
+î´\vñµ
+ô\fê²\fç® ã©\a⨠ã¨
+à ¦\bà ¦\bã¨
+ã©
+å«
+ç ì³\fï¶\fó»\ eô½\fõ¾\fõ¾\ eõ½\ eõ¾\rõ¾\võ¾\võ¾\fô¼\ròº\rñ¶\14î®\19Ã\9d+ñè·øÿïüÿöÿüýþþûüÿøþþüÿûÿÿýúþÿ÷ýþÿþþüýÿúýÿýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿýúýÿúþÿüþÿøþþúÿþùèù¾\8b\19Ã\99\râ\fè®\rð·\rô¼\ fô¼\ eõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fó¾\fó¾\fõ¾\fõ¾\fõ¾\fó½\vò½\vôÃ\ eõÃ\15ö\12\98v\13\17\f\ 2\ 3\ 1\ 3\ 3\ 2\ 1\ 2\ 3\0\ 3\ 1\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 4!!!ÃÃÃüüúýýûþþüüüúüüúûûùþþüþþüÿÿýþþüþþüüüúüüúüüúùù÷ýýûþþüüüúüüúþþüýýûüüúûûùýýûþþüýýûýýûüüûýýûýþùýýøîïêÃÃÃÃÃ
Ã\9f\9a\94\87f#¸\82\ fÃ\96
+ã\bå®
+ó ò· ð¸\rð·\rî´\vë° èÂ\bæ«\bå«\aå¬\bäª\ 6è¯\bé°\bì´\vî¶\fòº\rô¼\ eõ¾\rõ¾\fõ½\rõ¾\rõ¾\fõ¾\võ¾\vô½
+õ¾\vô¾\fï¹\11ù\12ë¸\11ì,òè³üþóùÿúüÿüûÿøüÿôÿüýÿûÿþþýüþÿýÿüþþýþþþþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿþüýÿþÿýÿýÿùþþþÿýüÿýâ¼\8b\1fÃ\95\râ\ fé¯\10î¶\fó»\ eõ½\ eõ¾\rõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fó¾\fò½\võ¾\fõ¾\fõ¾\fõ¾\fô½\vô¾\fïÃ\ fîÃ
\14ÃÂ¥\ ebI\r\b\ 5\ 2\ 1\ 3\a\ 2\ 2\ 5\ 3\ 2\ 1\ 2\ 2\ 2\ 3\ 3\ 5\ 3\ 3\ 3)))ÃÃÃþþüýýûýýûþþüýýûþþüûûùýýûýýûüüúýýûþþüþþüýýûþþüüüúýýûþþüüüúüüúþþüýýûþþüûûùüüúýýûüüúüüüþþüýþøüü÷ÃîêÃÃù¶´IB:sS\10·\81\ eÃ\94 ã\bä¬ ïµ\võº\vòº\ròº\ fò¸\ eð¶\rïµ\fó\vó\vó\vó
+õ ï·\vï·
+òº\fòº\vô¼\rõ¾\rõ¾\fõ½\rõ¾\rõ¾\fõ¾\võ¾\võ¾\võ¾\fõ¾\fó¾\fî¼
+î¾\vî¹\ fä°"ükþþÃýý÷üüÿúÿúúýúýýÿüþþüÿýýÿûÿýûÿýýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿþüýÿþÿýÿûÿúÿþÿÿýÿÿýú\8a!Ã\94\rà\ eç¬\ eñ¸\ eó»\rô¼\rõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fó¼
+õ¾\fô½\võ¾\fô¿\fëà óÃ
\vÃÃ\14¿\98\198,\ 6\ 2\ 2\ 4\ 5\0\ f\ 2\ 1\ 3\ 3\ 3\ 4\ 3\ 3\ 5 \83\83\83÷÷õýýûýýûüüúýýûüüúüüúýýûýýûüüúüüúüüúýýûûûùûûùüüúþþüüüúüüúûûùýýûýýûüüúýýûýýûýýûüüúüüúýýýüýûûý÷üþùðñðÃÃÃLHD\1e\16\ayY\11º\84\10Ã\96\vä
+å®\vî´ ô¸ òº\ró¼\ fô¼\ fó»\ eòº\ eó¹\ eó¹\ eó¹\ eó¹\ eò¹\fô¼\fó¼
+ô½\vô½\võ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fö¾\ eô½\fõ¾\ f÷¼\föº\ fñº\19ë,ÃÃ\8cÿüïýüýúþúøþ÷ýÿúýÿúþÿùÿþ÷ÿþùþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿþúýÿýÿýÿúÿ÷þþýÿýþÿþñº\8b#Ã\92\vÃ\9e\vè®\ eï¶\fô¼\ eõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fö½\fö½\fö½\fó¼
+õ¾\fõ¾\fó¼
+õ¿\fîÃ\bòÃ\fòÃ\11áµ\r\8eq\v\1a\f\ 1\ 6\0\a\ 2\ 2\ 2\ 2\ 2\ 2\1c\1c\1e\88\88\88óóóþþüüüúüüúüüúýýûüüúýýûýýûýýûýýûýýûüüúýýûýýûþþüýýûýýûúúøþþüýýûþþüþþüþþüþþüüüúüüúýýûýýûýýüýýûýÿùúüúÃÃÃD@D\ f \a\1c\14\ 3xX\f¸\82\rÃ\96
+â äÂ
+ðµ\fô¹
+òº\rô½\ fõ½\ eõ½\rõ½\rõ½\rö½\rö½\rö½\rõ½\fö¿\rõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ½\rõ½\ eõ½\ eõ½\ eõ¾\vø½\ e÷½\r÷¼\11ú¼\12õº
+ð½\14æµ Ã¤Cÿûâüýûûÿöþþûÿýüþÿúþÿûþþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþûÿþùþÿûÿýÿúÿ÷þþýÿüûþþò½\8f$Ã\92
+Ú
+å«
+ð·\fô¼\fô¾\fõ¾\fô½\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fö½\fõ¼\vö½\fö½\fõ¾\fö¿\rö¿\rô½\vò¿
+î¾\10ôÃ\11ðÃ\ fä\12gH\f4,\1fVWR\9b\9c\9bçççþþþûûüüýûûûùýýüýþûþþüýýûüüúüüúüüúüüúüüúýýûûûùüüúüüúûûùýýûýýûüüúüüúýýûüüúüüúýýûûûùüüúýýûüüúüüúúúøüýùÃÃÃ337\ 4\ 2\ 6\a\ 2\0#\1a\ 3~\\ e¶\81\vÃ\97\vä
+ç¯\rð¶\fô¹\vô¼\ eó¾\ró¿\vó¿\vô¾\võ¾
+ö¾\vö¾\vö¾\vö¾\fô½\võ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ½\rõ½\ eõ½\ eõ½\ eõ½\ eò¾\10ôÃ\vö¾\bõ½
+òà óÃ\v÷½\10õ¸\10â²\19æÃ\96þüýûþúÿýýÿüÿþþþûþÿýþþþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿþûÿýþûÿýýÿûÿûþÿû÷ýýå¼\8c\1dÃ\91 Ã\9d\fæª
+ò¸\ eóº\võ¼\rô¼\ eô¼\10õ½\rõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fó½\ 6ò»\11ë½\12êÃ\vå¿\v¿\8e\16¬\8bWöôéùýùûýùûûýþüÿþýùþþúúúûûý÷üþùþþüþþüþþüþþüýýûþþüþþüþþüþþüÿÿýþþüûûùþþüþþüûûùýýùüýøýþùþþúýýûýýûýýûýýûýþûø÷ø¯¯Â###\ 3\ 1\ 4\ 1\ 2\a\ 4\ 3\ 40\1f\ 1\86]\f¶\82\rÃ\99
+ÃÂ¥\bè®\vîµ\vó»\fô»\rô¼\rõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\võ¾\võ¾\võ¾\fõ¾\fõ¾\fõ¾\fõ¾\fð¿\11ñ¿ ù½\ 5ú»\ fõ½\ fñ¿\vñ¼\ eõ·\11ê¬\ eìÃ\94üýúüþøþþûþýýÿýýûÿüüÿüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿúÿþüüÿüþÿûÿüþþýùçâ¹¾\8b\19Ã\91 Ã\9e
+èÂ\fó¹\ eô»\vô»\fõ½\ fó»\ eõ½\rõ¾\fõ¾\fõ¾\fô½\vô½\võ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ½\fõ½\ fõ¼\rï½\vèÃ\fèÃ\ eé\13 y\1cù\98üüøûüûüüúüüùüü÷þýúþþþýþûüüùüüúûûùüüúüüúúúøýýûüüúüüúýýûýýûýýûþþüüüúýýûÿÿýþþúýþùýþùüüúüüúûûùüüúüüúóôò\83\81\84\11\10\10\ 3\ 3\ 2\ 3\ 2\ 4\ 1\ 2\ 6\ 6\ 4\ 2:&\ 2\89_\f¶\82\rÃ\9a
+à ¦\bé®\vï¶\vó¼\fõ¼\ eõ½\rõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\rõ¾\fõ½\rõ¾\rõ¾\fõ¾\fõ¾\fö½\ f÷½\vö¾\ 5ô½\võº\13ó¸\11ó¹\12è³\ eê\11çÃ\94üüúþýÿýýþþþýÿþýýþþýþþþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿúþþüþÿúþþþûþøÃÃ\84¾\87\12Ã\91\bÃ\9f
+èÂ\fñ·\fô»\vô»\fõ½\ eõ½\ eõ¾\fõ¾\fõ¾\fõ¾\fô½\vô½\võ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ½\ró»\12ö» õ½\bê½\ eìÃ\12ç¹\vÃ\9e\16\95w/èÃÃüùûüý÷ýÿôýþùýüýýýýûüüúûùüüúýýûûûùþþüþþüýýûýýûýýûþþüýýûüüúýýûüüúüüúüüúüüúüüúýýûÿÿýüüúýýûýýûáááXYY\ 6\ 5 \ 3\ 2\ 3\ 2\ 2\ 3\ 3\ 1\ 3\ 2\ 2\ 5 \ 5\ 1D/\ 6\89^
+³\7f
+Ã\99 â§ ê¯\rï¶\fô¼\fõ½\ eõ½\rõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ½\ eõ½\10õ½\ eõ½\ eõ½\ eõ¾\fõ¾\fõ¾\fø½\ 6÷¾\ 6ó¿\ró½\ eô¹\ fõ\vè²\vä§\vÃÂ¥-ïê»ýÿýþüÿþþýüÿýþþýþþýþþþþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýÿþýÿùÿýüÿþýúýüýþòÃ
¤PÃ\85\rÃ\90\ 5á é®\vó¹\rô»\võ¼\vó¼
+õ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fô¾\fñ½\ fö»\v÷»\fî¼\ eè¾ ÃÃ\vì\ fÂ\83\15\98\83Y÷òîýüûùýóûýøýüþûûûýÿýýýûýýûþþüûûùüüúüüúüüúþþüüüúüüúüüúýýûþþüþþüýýûþþüþþüýýûüüúþþüþþýööö\9f\9f\9f$$$\ 2\ 3\ 3\ 4\ 3\a\ 5\ 4\ 6\ 2\ 2\ 4\ 3\ 1\ 2\ 3\ 2\ 3\v\ 6\0J3\ 6\87\\ 5°|\aÃ\98\bã¨\vë°\rï¶\fó»\vô¼\fõ½\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ½\ eõ½\ eõ½\ eõ¾\fõ¾\võ¾\võ¾\võ¾\vö¾\fõ¾\ eó¾\ fîº\ eìµ\10åª\vá\vÃ\97\1cäÃ\8eþýóüÿüþûüþþøûÿûýÿüÿþ÷ÿþùþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþýýþÿýÿúÿýþþþÿýþùÿýø\84 Ã\86
+Ã\96\ 6å«\ eñ¶\11óº\rõ¼\rõ¼\rõ¾\fõ¾\võ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fô½\vô½\võ¾\fõ¾\fö¿\rõ¾\fó½\vñÃ\fó¼\v÷»\ fï¼\ fæ½\ 6è¿ á±\ eÃ\91\r\83e\15¬\9b\83ýøùûþûüþúþýþýýþûüøüüùýýûýýûýýûþþüüüúýýûûûùüüúýýûþþüýýûüüúúúøüüúüüúüüúýýûýýüööö¹¹¹BBB\a\a\a\ 1\ 1\ 1\ 1\ 2\ 2\ 3\ 1\ 6\ 3\ 1\ 4\ 2\ 2\ 4\ 3\ 1\ 3\ 3\ 1\ 1\ e\b\ 1Q9\ 6\89\\ 6±}\bÃ\98\bã©\vë°\rð·\ró»\võ¼\fõ¾\rõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾
+õ¾ õ¾
+ö¾\fõ¾\ró»\10öº\17ó·\11õ\ fâ¦\12Ã\99\12Ã\94 ëmÿúòþýÿýÿüÿýýþþøúÿûüÿýÿþ÷ÿÿøþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþýýþÿþþûÿýþþýÿþýïÃÃ\84¼\81\rÃ\8c
+àì²\11ó¹\10óº\fô»\fõ¼\rõ¾\rõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fô½\vô½\võ¾\fõ¾\fõ¾\fõ¾\fõ¾\fó½\vñ¿\vó¾\vô¼\fðº\ fä¶\aå¹\bï\fÃ\96\v x\ eZ>\ f£\97\92óôõûþûûúûýýýûý÷ýþúüüúýýûüüúýýûýýûüüúþþüþþüýýûýýûþþüüüúüüúüüúýýûýýüûûûÃÃÃSSS \ 4\ 4\ 5\ 3\ 3\ 5\ 4\ 4\ 6\ 1\ 3\ 3\ 3\ 1\ 6\ 3\ 1\ 4\ 1\ 2\ 4\ 3\ 1\ 4\ 4\ 2\ 1\15\ e\ 2W<\a\88[\ 3±| Ã\96\bâ§
+ê¯\fñ¸\ eó¼
+õ½\rö¾\rõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\võ¾
+õ¾\võ½\fó»\róº\ fñ·\12ïµ\ eé®\bã¢
+Ã\96\10Ã\95+ÃÃ\89ÿþìýÿüþÿúþþüþüÿÿýþûÿýýþÿÿýüþþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýÿüÿþúÿþûýþÿÿýæ¯\84(Ã\89 Ã\97
+â¨\vñ¸\12ó¹\róº\võ¼\rö¼\ fö¾\ fõ¾\rõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fô½\ eô½\võ¼\fóº\ fè´\bâ±\ 5ê
+Ã\9b\10°}\vwR\a.\1e\ 5\ZWÃÃÃüûøúúùùüøúüùþþüüüúüüúüüúýýûüüúüüúüüúýýûýýûüüúüüúýýûüüúééçÂÂÂSSS\f\f\f\ 2\ 2\ 2\ 4\ 4\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 3\ 3\ 3\ 1\ 5\ 2\ 2\ 4\ 1\ 2\ 4\ 3\ 1\ 3\ 3\ 1\0\1c\14\ 5Y=\a\8a\\ 5²}
+Ã\96 ᦠê¯\fð·\ró¼
+õ½\fõ¾\rõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fô¼\rô¼\11ð·\10ì³\10èÂ\ eâ
+Ã\9e\ eÃ
\92\18çXìã½úÿîüÿöüþ÷þþøþþûýþþÿýþüÿýþþÿþýýþÿúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþûýÿùÿþùþÿùüÿýäû»\86\13Ã\8b\ 3Ã\9e\f⨠ë²
+ôº\róº ô»\fõ»\ eô¼\ eô¼\rõ¾\rõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fô½\võ¾\fõ¾\fõ¾\fõ¾\fõ¼\rö¼\ fõº\ e÷»\ eð·\vâ¬\ 6ÃÂ¥\vÃ\99\f¹\7f\f\8db\bN:\b\13\r\ 3\ f\ e\ eSRO¡¡ ÃÃÃìÃìøøöûûùýýûûûùûûùüüúüüúùù÷ùù÷ññïÃÃü¼º\89\89\87PPN\16\16\14\ 4\ 4\ 4\ 2\ 2\ 2\ 3\ 3\ 3\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5\ 2\ 2\ 4\ 3\ 3\ 4\ 1\ 3\ 2\ 3\ 1\ 5\ 2\ 2\ 4\ 1\ 2\ 4\ 3\ 2\ 3\ 4\ 1\0#\17\b\=\ 6\8e`\ 6´\7f\vÃ\96\bá¦
+é¯\vð·\fó¼\võ½\fö¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\rõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fô¼\vó»\vóº\vô¼\rô½\ eò¼\rï¸\ré±\rÃÂ¥\bÃ\9f Ã\99\ eÃ\92\14³\87,îâ¿ýýôûü÷ÿýûþûþþüÿÿûÿþþûüÿ÷ÿþùþÿúþýþþþúþÿøþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüúÿúÿþýÿþûÿýúÃÃ\8c¼\88\ fÃ\8a\ 4Ã\9a\aâ¤\fè¬\vïµ\fò¹\vòº\róº\10ôº\13ô¹\12öº\ e÷¼\fö½\vó¼
+ô¼\rö½\r÷½\f÷½\vô½\vó¿\vó¿
+õ¾
+õ¾
+õ¾\võ¾\vö½\võ¾\võ¾\võ¾\fõ¾\fõ¾\fõ¾\fô½\vö¿\rô½\võ½\fö½\ eóº\vð¸\væ®\bÃÂ¥
+Ó
+¼\83\b\98f iG\v'\16\ 1\ 5\ 2\ 3\ 1\ 2 \ 2\ 4\ 5\14\13\14*))GGGaaawww\82\82\82wwwfffXXXPPPEEE$$$\v\v\v\a\a\a\ 3\ 3\ 3\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 2\ 4\ 3\ 1\ 5\ 3\ 1\ 6\ 1\ 2\ 4\0\ 3\ 2\a\ 5\02!\ 5eB\ 6\96e\ 5·\80
+Ì\fݤ
+è° ñ·\fô»\rô¼\rõ¾\fõ¾\vô½
+õ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ½\ eö½\fø½ ø½\vö½\ eõ¼\ eôº\ fóµ\11õ¶\10ó¸\10î¸\12è´\fá¬\ 6Ã\9e\ 6Ã\94\13¾\89\1c¿¦_èä½ÿüçÿýùýýþþÿûþþûÿýþþþÿþþýþþûþþûþþüþþüþþýþþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþþÿûÿÿþóÿþñÃÃ\8d·\85\14Ã\86\10Ã\93\rÃ\9f\ 6è\bç°\fé°\vîµ\10ï¶\ eñ¸\rò¸\vò¶\fò¸\ró»\rô¼\ eô¼\10ó»\ eö½\ fö½\fõ½\ fõ½\ eõ¾\fõ¾\fõ¾\fö½\fõ¼\fõ¼\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ½\ eõ½\ eö¾\ fö¾\rõ½\ eö½\ eôº\ eï¶\fè®\vâ Ã\98\v»\81\b\9di\frL\v<&\ 5
+\ 4\ 2\ 1\ 2\a\ 2\ 3\ 5\ 3\ 2\ 4\ 3\ 3\ 4\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 1\ 1\ 1\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 3\ 3\ 3\ 2\ 2\ 2\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 3\ 3\ 2\ 1\ 5\ 3\ 1\ 6\ 1\ 2\ 5\ 1\ 3\ 3\v\a\ 1;( kH\b\99g\ 6·\80\vÃ\92\vã
+çÂ\bî´
+ö¼\ fõ½\rõ¾\fõ¾\fõ¾\fô½\võ¾\fõ¾\fõ¾\fõ¾\fõ¾
+õ½
+ö½\fõ½\fó½\fï¹\fî¶\ fî³\ eï²\12ê¯\ e㬠â\vÃ\94\11»\82\19º\98QçúÿüçÿýïþýùüüþþÿþþÿúþÿúÿýýþþþþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýÿúÿüÿÿüþÿýöÃÃ\93³\81\18Ã\86\ 6Ã\8b\ 4Ã\95\ 6Ã\9b\aá ã¦\rã¨\vä«\vã®\aå±\ 6è¯\fê¯\fë³\vîµ\fî¸\10î¸\10ò¹\ fòº\ fôº\ fôº\10ôº\ eô»\ eõ¼\ eö½\ e÷½\10ö¼\ fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fö¾\ eõ½\ eõ½\ eö½\f÷¾\ eö½\10ó¹\ fó\fäª\và\rÃ\95\r¶}\ 6\9af\auL\ 6M4 \15
+\ 1\ 2\ 1\ 4\ 1\ 3\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 3\ 2\ 2\ 2\ 4\ 3\0\a\ 2\ 1\ 6\ 1\ 2\ 4\v\ 6\ 1?) oJ\b\99g\a¶\7f\fÃ\8e
+Ù
+åª ï´\fóº\ eõ¼\ eö½\ eö½\ eö½\ eö½\ eö½\ eö½\ eö½\ eö½\ eö½\aô½
+ô»\14ñ¸\13ëµ\fç±\ 6ä¬\bã©\rà ¦\fÃ\9d\bÃ\92\vÃ\86\14\9cs'æÃ¼þýøþþûþý÷ÿüúþýÿüüþüþýþÿùþÿùÿþýþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþûúÿõûþÿýÿøþÿõçý§}&¹}\10¾\82 ¾\86\vÃ\8b
+Ã\90 Ã\95 Ã\99 Ã\9c\vÃ\9f á\bá\và ¤
+⦠㩠åª\vè®\ eê°\ eî´\ fñ¶\ fó¶\ eô·\ eó¸\ eôº\ fò¸\fóº\fö½\ eõ¾\fõ¾\fõ¾\võ¾\vô½
+õ¾\fô½\vô¼\fõ½\võ¼\vôº\ eó¹\ fé°\væ
+Ã\9a\vÃ\8b ¯w\ 4\96b\ 4zP\ 6Y<\f%\15\a\ 5\ 1\ 2\ 1\ 2\ 2\ 1\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 3\ 2\ 2\ 2\ 4\ 3\0\a\ 2\ 1\ 6\ 2\ 2\ 4\ e\a\ 1B,\vnH\ 5\96c\ 4²{\vÃ\89 Ã\99 ä\aë®\vò·\ eó¹\fô»\fõ¼\rö½\ eö½\rõ¼\vô»
+óº
+ò¹
+ò¹ ñ·\ fîµ\16é¯\11ä©\vâ¥
+Ü
+Ã\9a Ã\94\aÃ\8a\r©{!ø\89þüîüýùúýùûÿüüýýýýþýýÿûüýýÿûþÿøþÿùÿþýþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüüþþýþÿüÿùþÿùÿûöèö\9dy% x\r«z
+°z\a·~\b¹~\ 6¿\81
+\85\fÄ\fÉ\rÍ
+Ó
+Ã\97\bÃ\98\ 6Ã\9a\aÃ\9f\fá\và ¥\fä© æ«
+èÂ\vê¯\vî´\rñ¸\ eòº\ fòº\ró»\rö¾\ fó¼\vô½\vô½\võ¾\fô½\vô½\vóº õ¼\vó¹\rïµ\ e㪠Ã\9e Ã\90\b¹\80\ 5¦p\ 5\92_\ 6zP\ 5[>\v'\17\a\ 6\ 1\ 2\ 2\ 2\ 2\ 2\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 1\ 1\ 3\ 3\ 3\ 5\ 1\ 3\ 2\ 2\ 2\ 4\ 4\0\ 6\ 3\ 1\ 6\ 3\ 2\ 4\r\ 6\ 2@*\viD\ 4\90^\ 4¬t
+¼\83
+Î
+à\vå©\fî³\ fñ·\ eò¹\fóº\vô»\vô»
+ô»
+ò¹
+ôº\ eó¹\ eñ¶\ eë±\ fæ¬\fá¥\ 6Ã\9e\ 6Ã\94\vÃ\91\10Ã\8d\vµ\82\17¶\9bTãúýýôþýúÿþ÷ýÿöúÿùüÿüýÿýýÿüýÿúýÿøþÿùþÿûÿýþþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþýÿüÿÿüþÿÿóþÿöþýýÿûôÿûéáøî\80«\8fQ\8di\18\97o\ f\9fr\b¦t\ 6®w ´z\v¸}\f½\81
+Ã\84\aÃ\88\aÃ\87\ 6Ã\8a Ã\8d\bÃ\91 Ã\98\bÃ\9b Ã\9f\fã\rÃÂ¥\fã¨\fçÂ\fì²\ fñ·\11ò·\10ó¹\10óº\rôº\fóº\fò¹\vôº\ eóº\rò¸\ eï´\ eçÂ\râ
+Ã\94\b¾\85\b¬t\ 4\9be\ 6\8b[\bsK\ 4V:\b%\16\ 6\ 5\ 1\ 3\ 2\ 3\ 4\ 2\ 3\ 4\ 3\ 3\ 5\ 3\ 3\ 5\ 2\ 2\ 4\ 3\ 3\ 5\ 1\ 1\ 3\ 2\ 2\ 4\ 1\ 1\ 3\ 1\ 1\ 3\ 1\ 1\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 1\ 1\ 3\ 1\ 1\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 1\ 1\ 3\ 1\ 1\ 3\ 2\ 2\ 4\ 1\ 1\ 3\ 1\ 1\ 3\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5\ 3\ 3\ 5\ 1\ 2\ 4\ 2\ 1\ 6\ 4\0\ 6\ 3\ 1\ 3\ 2\ 2\ 1\ e\b\ 3=(\vb@\ 3\88W\ 3Â¥n\v³{ Ã\8a Ã\99\fàæª\fë°\fïµ\fñ·\fò¸\róº\ró¹\rò¸\rñ¶\ fë±\fèÂ
+ã¨\ 6ä\aÃ\9a\vÃ\8f\aÃ\88\ 2·\83\v©\7f(ù\8cÿüèÿÿòøþøùÿýþýþÿüýÿýüþÿúþÿúþÿùþÿøþÿùþÿúþþýþþþþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿýüÿýûÿüÿÿýÿûüùüþýüþûýüúýýöþþòþþëâüï\82ª\8eK\90e\v\9ak\ 5¢n\f¨s\ f®w\f®v\a³y
+³y
+¶{ ¸~ º\81\a½\84\bÃ\88 Ã\8d\vÃ\91\vÃ\97\vÃ\9e\rã\ eâ¦\rè«\ fë¯\ fï´\11ó¹\12ñ¶\ eó¸\11ò¸\11ï´\ eì±\ fç¬\ fã\ eÃ\98\vÃ\8b\v³{\v¡i\ 6\92\\a\7fQ\ 5iE\ 3M7\b \14\a\ 4\ 1\ 6\ 2\ 2\ 4\ 3\ 1\ 2\ 3\ 3\ 3\ 2\ 2\ 2\ 3\ 3\ 3\ 3\ 3\ 3\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 5\ 1\ 2\ 6\ 2\ 1\a\ 4\0\ 6\ 3\ 1\ 1\ 2\ 3\0\r \ 38&\v[:\ 3\80R\ 2\9be\b«t\bº\81\aÃ\8f Ã\9b
+ߤ
+äª
+è®
+ì³\rì³\fì³\fî´\ fê°\ eç¬\ eã¨\rá Ã\9a\ 5Ã\95 Ã\8b\11º}\v¨w\b\96w$èüÿû÷ýüûúþúùþýüþÿþþÿÿýþÿýþÿýýþþûþÿûþÿúþþûþþýþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþûûÿøûÿ÷ýþþÿýÿýþøûþúüýþþüüÿýúýýúýýúþþüþýùÿüñÿýå¿´\8eª\8bI\87]\ f\8c`\v\97g\f\9bh
+\9dh\a¡k\ 6£l\ 5§o\ 6©q\aÂt\a²y\b·}\b½\82\ 6Ã\89\bÃ\92\vÃ\96
+Ã\9c\vÃ\9e\bâ\bâ§
+ç«\vè¬\fé®\ fåª\rà ¥\fÃ\9c
+Ã\92\aÃ\88\ 6·~\b¦n\b\94]\ 4\86S\ 4uI\ 4^=\ 2B-\a\13
+\ 2\ 4\ 2\a\ 2\ 2\ 5\ 3\ 1\ 2\ 2\ 1\ 2\ 3\ 3\ 3\ 3\ 3\ 3ggg\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\81\80\80\81\80\80\81\80\80\81\81\81\82\80\80\81\80\80\81$$&\ 3\ 3\b\ 3\ 1\b\ 4\0\ 5\ 2\ 1\ 1\ 1\ 3\0
+\a\ 23#
+V7\ 4|N\ 3\96a\bÂ¥o\b´{\ 6Ã\85\ 4Ã\91\ 5Ã\9c\bâ\aá§
+ᨠãª\vä«\vãª\vÃÂ¥
+Û
+Ö\bÐ
+Ã\8b\ f¼\81\f±y\ 6\9cj \86`&äÃÃûýùùþüýýüýûüÿüýþýûþÿúýÿúûÿûýþþÿýÿÿýþÿýþÿýþþþÿþþýþÿûþþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþûþþûþþüþþýþþûþþüþþýþþüþþüþþüþþüþþýþþýþþüþþûþþùÿýôþýïÿý庮\89\9a\85SvS\13\84X\f\8b[ \8d[\ 6\91]\ 4\97b\ 4\9eg\ 4¢l\ 5§p\ 4«v\ 4²~\ 6º\84 ¾\88 Ã\8c\bÃ\91 Ã\95\aÃ\98\bÃ\9d\vÃ\9b\vÃ\97\fÃ\92\vÃ\8a
+¾\82 ±x\a¢l\ 6\91]\ 4\84T\ 3wJ\ 1fA\ 5O5\r+\1d
+\a\ 3\0ghhåææýûüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþýþþýþþýþþýþþýþþýþþýýþýþþýþüüãâã\80\80\82\82\81|QD+N3\ 4qG\ 5\8d\
+\9dh\ 6¬t\ 5¶|\ 6¾\86 Ã\8c\aÃ\93\ 5Ã\98
+Ã\99\vÃ\9a Ã\9a\ 5Ã\99\ 6Ã\94\ 6Ã\8d\ 5Ã\86\ 4º\81\b³{
+¨q\ 6\92e\11¨\93hÿýðüþüýþÿþþýþþüþþüþþüþþüþþüþþüþþüþþýþþýþþüþþüþþüþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýÿþûýûýþúýüöþþòÿýìÃÃÃÂ\9e\85\8f{PcG\12oP\ f{W\v\84Y \8bZ\ 5\97a\a\9de\aÂ¥l\ 2ªq\ 4®u\b²y\f¶}\v¹\80 ½\83 ¿\86\a½\85\ 5¹\81\ 6±y\ 5§o\ 4\9ad\ 2\8dZ\ 3\80P\ 5vH\biB\ 6W9\b?*\v\14
+\ 1,*(åæåüýüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüüýûýþûþýûýüýýýÿþþù¥\9d\87G0\be@\ 3\81S\ 5\94a\ 4¤l\ 4Âu\a³{
+¶~\a»\82\ 4Ã\85\ 4Ã\87\aÃ
\88 Ã\88 Ã\87
+»\84
+³} ®x\b¨q\b\99h\ 3\83] ¦\92hÿûïýüùüýûýþùþÿûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýüøþþúýþûüþüúþüüýúýþùþý÷þüôÿýñÃÃë \81\8dxQa@\fpG\a\80Q\ 6\8bX\ 5\90[\ 5\98b
+\9ce
+Â i
+£l
+£o ¡o\a\9el\ 3\9dj\ 4\94a\ 1\8e\\ 2\86V\ 3{N\ 3pE\ 6e=\bV9\vF3\ f\85zgêçÃýþüüþþþÿýþþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýþýþýüýüùýýüüþþüýøÃÃÃ>,\ fU7\ 6pI\ 5\87X\ 6\98d\ 5£l\b©r\fªt
+Âv\b²y\ 6µz\a·{
+¶y\f´w\r®u\ e¥p
+\9dl\b\93c
+wS\f\9d\8efþþñýþûüûüýûþþÿùýÿøþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿýþÿüÿþüþýüýþýþýüúÿýùÿþùÿþùþýøÿÿúþüøÿüõÿû\89\87uQ`A\ fpK\ fzR\v\83V\ 5\87W\0\8aY\ 1\8bZ\ 2\8aY\ 4\8aX\ 5\88U\ 6\85S\ 6~N\ 5wK\ 4nH\ 5`?\ 4W9\a@/\10«¥\91ÿýôýýüûýþýþþýþúÿþúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþýýüûÿþûýþûúýüüýúÿýõ¥\9d\8eA.\fV9\ 6mG\ 5\85V\ 6\93`\ 6\9cf\b\9fj\b¢l\a£p\a¢o\ 4§q\ 6¦m\ 3¥l\ 6\9fi \93a\ 6\87Y\ 4oJ
+\9a\88lþûõøþùúþúýüþþûþýýüýþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþûýÿüýÿýýÿþþþþþþþþþþÿýþÿüýÿýûþÿúüÿûüÿýýÿþþþüÿþ÷ÃÃæ\9a|]H\1d^A hE\ 4oF\ 1uI\ 2zK\ 5|K\ 6yH\ 4tD\ 4rG
+hC\bY<\ 6N6\bA- ª¤\92ÿýöýýüüþÿûÿÿýÿýþÿúÿýúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþýþþýþÿûýÿúýÿûþþüÿþúÿýö¢\9d\89?/\ fP4\ad?\ 2wL\ 3\85W\ 4\8e^\ 5\95b\ 6\98g
+\96f\a\94d\ 3\94c\ 2\8e_\ 4\82X oK\v`A\r\97\88mÿüõþüýýþüýþýþþþÿþûþþþþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþûþÿùþþøþÿøýÿùüÿùûÿùûÿùûÿúþýþÿýþýÿýüÿýüÿþüÿýýÿúþÿ÷þþ÷þýôÿýï¢\8f\84rVP5\10Z:\fa>
+c>\ 6a<\ 4_;\bX8 P5\fF2\10\N6ºµ¥þüõüüûþþÿüýÿýþþýÿûþÿúÿþúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþûþþöìêÃXK2G0\vR6\ 5^>\ 3iE\ 3oH\ 4wL\axM\auK\ 4mH\ 3bC\bS;\ f\83v[ÃÃÃýüøûýùÿýýÿûÿÿýýþþüþþþÿþùþÿùþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿýþÿüþÿýþÿýýÿþûþþûþþûýÿúýÿøýÿøýÿùþþýþýÿþýÿÿþýÿþúþþüýýýýüûþþüýü÷ÿýð£\90¡\96|M=\1c>-\f>,\ f^O6\9d\94\7fïìÃÿûõþýüýüüýüüýüýûûüþÿûþÿùþÿúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿûþþûýÿýþþþÿþýÿþüþþüþþýýÿüþþúÿýöëèÃ\9b\93}\N1?-\fF0\ eI0\rI0\fE/\f\85vV\9e\95}ÃÃÃþüøýýþúþýûþúüúúþüþÿþüüÿúüÿýÿþúþþúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüüÿýüÿýüÿýýÿþþþþÿýþÿýþÿýÿþþÿþþþÿþúÿþøÿþùÿþüþþþþþþÿüüýûúýþûúþúùÿúùþùûþùýþùþþ÷þý÷ÿýöÿüõÿþöþþ÷üþüûýþþýûÿýûþüüþýýÿþúþÿùþÿúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿûþþüýþþþþÿÿþýÿýûþþûýÿýúþûüýüüüüüüüþþûýü÷ÿþöÿüöÿýôþýóþþ÷ýýøþþûýýúþþûýþúüþüüþûýþùüþúüþýüÿ÷ýÿôÿýýþýÿþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýþüþþüþþüþþüþþüþþýþþýþþýþþýþþüþþûþþûþþüþþüþþüþþüþþüþþüþþüýþüþþüþþüþþüþþüþþüþþüþþüþþûþþûþþüþþýþþüþþüþþüþþüþþüþþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþýþþüþþüþþüþþüþþüþþüþþýþþýþþüþþüþþüþþüþþûþþûþþüþþüþþüþþüþþüþþûþþüþþüþþûþþüþþüþþûþþûþþýþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþü
\ No newline at end of file
/*
=item i_img_is_monochrome(img, &zero_is_white)
+=category Image Information
+
Tests an image to check it meets our monochrome tests.
The idea is that a file writer can use this to test where it should
-write the image in whatever bi-level format it uses, eg. pbm for pnm.
+write the image in whatever bi-level format it uses, eg. C<pbm> for
+C<pnm>.
For performance of encoders we require monochrome images:
=item *
-have a palette of two colors, containing only (0,0,0) and
-(255,255,255) in either order.
+have a palette of two colors, containing only C<(0,0,0)> and
+C<(255,255,255)> in either order.
=back
-zero_is_white is set to non-zero iff the first palette entry is white.
+C<zero_is_white> is set to non-zero if the first palette entry is white.
=cut
*/
undef_int i_writejpeg_wiol(i_img *im, io_glue *ig, int qfactor);
#endif /* HAVE_LIBJPEG */
-#ifdef HAVE_LIBTIFF
-i_img * i_readtiff_wiol(io_glue *ig, int allow_incomplete, int page);
-i_img ** i_readtiff_multi_wiol(io_glue *ig, int length, int *count);
-undef_int i_writetiff_wiol(i_img *im, io_glue *ig);
-undef_int i_writetiff_multi_wiol(io_glue *ig, i_img **imgs, int count);
-undef_int i_writetiff_wiol_faxable(i_img *im, io_glue *ig, int fine);
-undef_int i_writetiff_multi_wiol_faxable(io_glue *ig, i_img **imgs, int count, int fine);
-char const * i_tiff_libversion(void);
-int i_tiff_has_compression(char const *name);
-
-#endif /* HAVE_LIBTIFF */
-
-#ifdef HAVE_LIBGIF
-i_img *i_readgif(int fd, int **colour_table, int *colours);
-i_img *i_readgif_wiol(io_glue *ig, int **colour_table, int *colours);
-i_img *i_readgif_scalar(char *data, int length, int **colour_table, int *colours);
-i_img *i_readgif_callback(i_read_callback_t callback, char *userdata, int **colour_table, int *colours);
-i_img *i_readgif_single_wiol(io_glue *ig, int page);
-extern i_img **i_readgif_multi(int fd, int *count);
-extern i_img **i_readgif_multi_scalar(char *data, int length, int *count);
-extern i_img **i_readgif_multi_callback(i_read_callback_t callback, char *userdata, int *count);
-extern i_img **i_readgif_multi_wiol(io_glue *ig, int *count);
-undef_int i_writegif(i_img *im,int fd,int colors,int pixdev,int fixedlen,i_color fixed[]);
-undef_int i_writegifmc(i_img *im,int fd,int colors);
-undef_int i_writegifex(i_img *im,int fd);
-undef_int i_writegif_gen(i_quantize *quant, int fd, i_img **imgs, int count);
-undef_int i_writegif_callback(i_quantize *quant, i_write_callback_t cb, char *userdata, int maxbuffer, i_img **imgs, int count);
-undef_int i_writegif_wiol(io_glue *ig, i_quantize *quant,
- i_img **imgs, int count);
-void i_qdist(i_img *im);
-
-#endif /* HAVE_LIBGIF */
-
i_img * i_readraw_wiol(io_glue *ig, int x, int y, int datachannels, int storechannels, int intrl);
undef_int i_writeraw_wiol(i_img* im, io_glue *ig);
/* IMAGER_API_LEVEL 4 functions */
i_img_alloc,
i_img_init,
+
+ /* IMAGER_API_LEVEL 5 functions */
+ i_img_is_monochrome
};
/* in general these functions aren't called by Imager internally, but
#endif
+#define i_gsamp_bits(im, l, r, y, samps, chans, count, bits) \
+ (((im)->i_f_gsamp_bits) ? ((im)->i_f_gsamp_bits)((im), (l), (r), (y), (samps), (chans), (count), (bits)) : -1)
+#define i_psamp_bits(im, l, r, y, samps, chans, count, bits) \
+ (((im)->i_f_psamp_bits) ? ((im)->i_f_psamp_bits)((im), (l), (r), (y), (samps), (chans), (count), (bits)) : -1)
+
#define i_new_fill_solid(c, combine) ((im_extt->f_i_new_fill_solid)((c), (combine)))
#define i_new_fill_solidf(c, combine) ((im_extt->f_i_new_fill_solidf)((c), (combine)))
#define i_new_fill_hatch(fg, bg, combine, hatch, cust_hatch, dx, dy) \
#define i_img_alloc() ((im_extt->f_i_img_alloc)())
#define i_img_init(img) ((im_extt->f_i_img_init)(img))
+#define i_img_is_monochrome(img, zero_is_white) ((im_extt->f_i_img_is_monochrome)((img), (zero_is_white)))
+
#endif
will result in an increment of IMAGER_API_LEVEL.
*/
-#define IMAGER_API_LEVEL 4
+#define IMAGER_API_LEVEL 6
typedef struct {
int version;
void (*f_i_img_init)(i_img *);
/* IMAGER_API_LEVEL 5 functions will be added here */
+ /* added i_psampf?_bits macros */
+ int (*f_i_img_is_monochrome)(i_img *, int *zero_is_white);
+
+ /* IMAGER_API_LEVEL 6 functions will be added here */
} im_ext_funcs;
#define PERL_FUNCTION_TABLE_NAME "Imager::__ext_func_table"
=for comment
From: File immacros.h
+=item i_img_is_monochrome(img, &zero_is_white)
+
+
+Tests an image to check it meets our monochrome tests.
+
+The idea is that a file writer can use this to test where it should
+write the image in whatever bi-level format it uses, eg. C<pbm> for
+C<pnm>.
+
+For performance of encoders we require monochrome images:
+
+=over
+
+=item *
+
+be paletted
+
+=item *
+
+have a palette of two colors, containing only C<(0,0,0)> and
+C<(255,255,255)> in either order.
+
+=back
+
+C<zero_is_white> is set to non-zero if the first palette entry is white.
+
+
+=for comment
+From: File image.c
+
=item i_img_setmask(C<im>, C<ch_mask>)
Set the image channel mask for C<im> to C<ch_mask>.
use Test::More;
use Imager qw(:all);
-i_has_format("tiff")
+$Imager::formats{"tiff"}
and plan skip_all => "tiff support available - this tests the lack of it";
plan tests => 12;
+++ /dev/null
-#!perl -w
-use strict;
-use Test::More;
-use Imager qw(:all);
-use Imager::Test qw(is_image is_image_similar test_image test_image_16 test_image_double test_image_raw);
-
-i_has_format("tiff")
- or plan skip_all => "no tiff support";
-
-plan tests => 215;
-
-$|=1; # give us some progress in the test harness
-init_log("testout/t106tiff.log",1);
-
-my $green=i_color_new(0,255,0,255);
-my $blue=i_color_new(0,0,255,255);
-my $red=i_color_new(255,0,0,255);
-
-my $img=test_image_raw();
-
-my $ver_string = Imager::i_tiff_libversion();
-ok(my ($full, $major, $minor, $point) =
- $ver_string =~ /Version +((\d+)\.(\d+).(\d+))/,
- "extract library version")
- or diag("Could not extract from:\n$ver_string");
-diag("libtiff release $full") if $full;
-# make something we can compare
-my $cmp_ver = sprintf("%03d%03d%03d", $major, $minor, $point);
-if ($cmp_ver lt '003007000') {
- diag("You have an old version of libtiff - $full, some tests will be skipped");
-}
-
-Imager::i_tags_add($img, "i_xres", 0, "300", 0);
-Imager::i_tags_add($img, "i_yres", 0, undef, 250);
-# resolutionunit is centimeters
-Imager::i_tags_add($img, "tiff_resolutionunit", 0, undef, 3);
-Imager::i_tags_add($img, "tiff_software", 0, "t106tiff.t", 0);
-open(FH,">testout/t106.tiff") || die "cannot open testout/t106.tiff for writing\n";
-binmode(FH);
-my $IO = Imager::io_new_fd(fileno(FH));
-ok(i_writetiff_wiol($img, $IO), "write low level")
- or print "# ", Imager->_error_as_msg, "\n";
-close(FH);
-
-open(FH,"testout/t106.tiff") or die "cannot open testout/t106.tiff\n";
-binmode(FH);
-$IO = Imager::io_new_fd(fileno(FH));
-my $cmpimg = i_readtiff_wiol($IO, -1);
-ok($cmpimg, "read low-level");
-
-close(FH);
-
-print "# tiff average mean square pixel difference: ",sqrt(i_img_diff($img,$cmpimg))/150*150,"\n";
-
-ok(!i_img_diff($img, $cmpimg), "compare written and read image");
-
-# check the tags are ok
-my %tags = map { Imager::i_tags_get($cmpimg, $_) }
- 0 .. Imager::i_tags_count($cmpimg) - 1;
-ok(abs($tags{i_xres} - 300) < 0.5, "i_xres in range");
-ok(abs($tags{i_yres} - 250) < 0.5, "i_yres in range");
-is($tags{tiff_resolutionunit}, 3, "tiff_resolutionunit");
-is($tags{tiff_software}, 't106tiff.t', "tiff_software");
-is($tags{tiff_photometric}, 2, "tiff_photometric"); # PHOTOMETRIC_RGB is 2
-is($tags{tiff_bitspersample}, 8, "tiff_bitspersample");
-
-$IO = Imager::io_new_bufchain();
-
-ok(Imager::i_writetiff_wiol($img, $IO), "write to buffer chain");
-my $tiffdata = Imager::io_slurp($IO);
-
-open(FH,"testout/t106.tiff");
-binmode FH;
-my $odata;
-{ local $/;
- $odata = <FH>;
-}
-
-is($odata, $tiffdata, "same data in file as in memory");
-
-# test Micksa's tiff writer
-# a shortish fax page
-my $faximg = Imager::ImgRaw::new(1728, 2000, 1);
-my $black = i_color_new(0,0,0,255);
-my $white = i_color_new(255,255,255,255);
-# vaguely test-patterny
-i_box_filled($faximg, 0, 0, 1728, 2000, $white);
-i_box_filled($faximg, 100,100,1628, 200, $black);
-my $width = 1;
-my $pos = 100;
-while ($width+$pos < 1628) {
- i_box_filled($faximg, $pos, 300, $pos+$width-1, 400, $black);
- $pos += $width + 20;
- $width += 2;
-}
-open FH, "> testout/t106tiff_fax.tiff"
- or die "Cannot create testout/t106tiff_fax.tiff: $!";
-binmode FH;
-$IO = Imager::io_new_fd(fileno(FH));
-ok(i_writetiff_wiol_faxable($faximg, $IO, 1), "write faxable, low level");
-close FH;
-
-# test the OO interface
-my $ooim = Imager->new;
-ok($ooim->read(file=>'testout/t106.tiff'), "read OO");
-ok($ooim->write(file=>'testout/t106_oo.tiff'), "write OO");
-
-# OO with the fax image
-my $oofim = Imager->new;
-ok($oofim->read(file=>'testout/t106tiff_fax.tiff'),
- "read fax OO");
-
-# this should have tags set for the resolution
-%tags = map @$_, $oofim->tags;
-is($tags{i_xres}, 204, "fax i_xres");
-is($tags{i_yres}, 196, "fax i_yres");
-ok(!$tags{i_aspect_only}, "i_aspect_only");
-# resunit_inches
-is($tags{tiff_resolutionunit}, 2, "tiff_resolutionunit");
-is($tags{tiff_bitspersample}, 1, "tiff_bitspersample");
-is($tags{tiff_photometric}, 0, "tiff_photometric");
-
-ok($oofim->write(file=>'testout/t106_oo_fax.tiff', class=>'fax'),
- "write OO, faxable");
-
-# the following should fail since there's no type and no filename
-my $oodata;
-ok(!$ooim->write(data=>\$oodata), "write with no type and no filename to guess with");
-
-# OO to data
-ok($ooim->write(data=>\$oodata, type=>'tiff'), "write to data")
- or print "# ",$ooim->errstr, "\n";
-is($oodata, $tiffdata, "check data matches between memory and file");
-
-# make sure we can write non-fine mode
-ok($oofim->write(file=>'testout/t106_oo_faxlo.tiff', class=>'fax', fax_fine=>0), "write OO, fax standard mode");
-
-# paletted reads
-my $img4 = Imager->new;
-ok($img4->read(file=>'testimg/comp4.tif'), "reading 4-bit paletted")
- or print "# ", $img4->errstr, "\n";
-is($img4->type, 'paletted', "image isn't paletted");
-print "# colors: ", $img4->colorcount,"\n";
- cmp_ok($img4->colorcount, '<=', 16, "more than 16 colors!");
-#ok($img4->write(file=>'testout/t106_was4.ppm'),
-# "Cannot write img4");
-# I know I'm using BMP before it's test, but comp4.tif started life
-# as comp4.bmp
-my $bmp4 = Imager->new;
-ok($bmp4->read(file=>'testimg/comp4.bmp'), "reading 4-bit bmp!");
-my $diff = i_img_diff($img4->{IMG}, $bmp4->{IMG});
-print "# diff $diff\n";
-ok($diff == 0, "image mismatch");
-my $img4t = Imager->new;
-ok($img4t->read(file => 'testimg/comp4t.tif'), "read 4-bit paletted, tiled")
- or print "# ", $img4t->errstr, "\n";
-is_image($bmp4, $img4t, "check tiled version matches");
-my $img8 = Imager->new;
-ok($img8->read(file=>'testimg/comp8.tif'), "reading 8-bit paletted");
-is($img8->type, 'paletted', "image isn't paletted");
-print "# colors: ", $img8->colorcount,"\n";
-#ok($img8->write(file=>'testout/t106_was8.ppm'),
-# "Cannot write img8");
-ok($img8->colorcount == 256, "more colors than expected");
-my $bmp8 = Imager->new;
-ok($bmp8->read(file=>'testimg/comp8.bmp'), "reading 8-bit bmp!");
-$diff = i_img_diff($img8->{IMG}, $bmp8->{IMG});
-print "# diff $diff\n";
-ok($diff == 0, "image mismatch");
-my $bad = Imager->new;
-ok($bad->read(file=>'testimg/comp4bad.tif',
- allow_incomplete=>1), "bad image not returned");
-ok(scalar $bad->tags(name=>'i_incomplete'), "incomplete tag not set");
-ok($img8->write(file=>'testout/t106_pal8.tif'), "writing 8-bit paletted");
-my $cmp8 = Imager->new;
-ok($cmp8->read(file=>'testout/t106_pal8.tif'),
- "reading 8-bit paletted");
-#print "# ",$cmp8->errstr,"\n";
-is($cmp8->type, 'paletted', "pal8 isn't paletted");
-is($cmp8->colorcount, 256, "pal8 bad colorcount");
-$diff = i_img_diff($img8->{IMG}, $cmp8->{IMG});
-print "# diff $diff\n";
-ok($diff == 0, "written image doesn't match read");
-ok($img4->write(file=>'testout/t106_pal4.tif'), "writing 4-bit paletted");
-ok(my $cmp4 = Imager->new->read(file=>'testout/t106_pal4.tif'),
- "reading 4-bit paletted");
-is($cmp4->type, 'paletted', "pal4 isn't paletted");
-is($cmp4->colorcount, 16, "pal4 bad colorcount");
-$diff = i_img_diff($img4->{IMG}, $cmp4->{IMG});
-print "# diff $diff\n";
-ok($diff == 0, "written image doesn't match read");
-
-my $work;
-my $seekpos;
-sub io_writer {
- my ($what) = @_;
- if ($seekpos > length $work) {
- $work .= "\0" x ($seekpos - length $work);
- }
- substr($work, $seekpos, length $what) = $what;
- $seekpos += length $what;
-
- 1;
-}
-sub io_reader {
- my ($size, $maxread) = @_;
- #print "io_reader($size, $maxread) pos $seekpos\n";
- my $out = substr($work, $seekpos, $maxread);
- $seekpos += length $out;
- $out;
-}
-sub io_reader2 {
- my ($size, $maxread) = @_;
- #print "io_reader2($size, $maxread) pos $seekpos\n";
- my $out = substr($work, $seekpos, $size);
- $seekpos += length $out;
- $out;
-}
-use IO::Seekable;
-sub io_seeker {
- my ($offset, $whence) = @_;
- #print "io_seeker($offset, $whence)\n";
- if ($whence == SEEK_SET) {
- $seekpos = $offset;
- }
- elsif ($whence == SEEK_CUR) {
- $seekpos += $offset;
- }
- else { # SEEK_END
- $seekpos = length($work) + $offset;
- }
- #print "-> $seekpos\n";
- $seekpos;
-}
-my $did_close;
-sub io_closer {
- ++$did_close;
-}
-
-# read via cb
-$work = $tiffdata;
-$seekpos = 0;
-my $IO2 = Imager::io_new_cb(undef, \&io_reader, \&io_seeker, undef);
-ok($IO2, "new readcb obj");
-my $img5 = i_readtiff_wiol($IO2, -1);
-ok($img5, "read via cb");
-ok(i_img_diff($img5, $img) == 0, "read from cb diff");
-
-# read via cb2
-$work = $tiffdata;
-$seekpos = 0;
-my $IO3 = Imager::io_new_cb(undef, \&io_reader2, \&io_seeker, undef);
-ok($IO3, "new readcb2 obj");
-my $img6 = i_readtiff_wiol($IO3, -1);
-ok($img6, "read via cb2");
-ok(i_img_diff($img6, $img) == 0, "read from cb2 diff");
-
-# write via cb
-$work = '';
-$seekpos = 0;
-my $IO4 = Imager::io_new_cb(\&io_writer, \&io_reader, \&io_seeker,
- \&io_closer);
-ok($IO4, "new writecb obj");
-ok(i_writetiff_wiol($img, $IO4), "write to cb");
-is($work, $odata, "write cb match");
-ok($did_close, "write cb did close");
-open D1, ">testout/d1.tiff" or die;
-print D1 $work;
-close D1;
-open D2, ">testout/d2.tiff" or die;
-print D2 $tiffdata;
-close D2;
-
-# write via cb2
-$work = '';
-$seekpos = 0;
-$did_close = 0;
-my $IO5 = Imager::io_new_cb(\&io_writer, \&io_reader, \&io_seeker,
- \&io_closer, 1);
-ok($IO5, "new writecb obj 2");
-ok(i_writetiff_wiol($img, $IO5), "write to cb2");
-is($work, $odata, "write cb2 match");
-ok($did_close, "write cb2 did close");
-
-open D3, ">testout/d3.tiff" or die;
-print D3 $work;
-close D3;
-
-# multi-image write/read
-my @imgs;
-push(@imgs, map $ooim->copy(), 1..3);
-for my $i (0..$#imgs) {
- $imgs[$i]->addtag(name=>"tiff_pagename", value=>"Page ".($i+1));
-}
-my $rc = Imager->write_multi({file=>'testout/t106_multi.tif'}, @imgs);
-ok($rc, "writing multiple images to tiff");
-my @out = Imager->read_multi(file=>'testout/t106_multi.tif');
-ok(@out == @imgs, "reading multiple images from tiff");
-@out == @imgs or print "# ",scalar @out, " ",Imager->errstr,"\n";
-for my $i (0..$#imgs) {
- ok(i_img_diff($imgs[$i]{IMG}, $out[$i]{IMG}) == 0,
- "comparing image $i");
- my ($tag) = $out[$i]->tags(name=>'tiff_pagename');
- is($tag, "Page ".($i+1),
- "tag doesn't match original image");
-}
-
-# writing even more images to tiff - we weren't handling more than five
-# correctly on read
-@imgs = map $ooim->copy(), 1..40;
-$rc = Imager->write_multi({file=>'testout/t106_multi2.tif'}, @imgs);
-ok($rc, "writing 40 images to tiff");
-@out = Imager->read_multi(file=>'testout/t106_multi2.tif');
-ok(@imgs == @out, "reading 40 images from tiff");
-# force some allocation activity - helps crash here if it's the problem
-@out = @imgs = ();
-
-# multi-image fax files
-ok(Imager->write_multi({file=>'testout/t106_faxmulti.tiff', class=>'fax'},
- $oofim, $oofim), "write multi fax image");
-@imgs = Imager->read_multi(file=>'testout/t106_faxmulti.tiff');
-ok(@imgs == 2, "reading multipage fax");
-ok(Imager::i_img_diff($imgs[0]{IMG}, $oofim->{IMG}) == 0,
- "compare first fax image");
-ok(Imager::i_img_diff($imgs[1]{IMG}, $oofim->{IMG}) == 0,
- "compare second fax image");
-
-my ($format) = $imgs[0]->tags(name=>'i_format');
-is($format, 'tiff', "check i_format tag");
-
-my $unit = $imgs[0]->tags(name=>'tiff_resolutionunit');
-ok(defined $unit && $unit == 2, "check tiff_resolutionunit tag");
-my $unitname = $imgs[0]->tags(name=>'tiff_resolutionunit_name');
-is($unitname, 'inch', "check tiff_resolutionunit_name tag");
-
-my $warned = Imager->new;
-ok($warned->read(file=>"testimg/tiffwarn.tif"), "read tiffwarn.tif");
-my ($warning) = $warned->tags(name=>'i_warning');
-ok(defined $warning && $warning =~ /unknown field with tag 28712/,
- "check that warning tag set and correct");
-
-{ # support for reading a given page
- # first build a simple test image
- my $im1 = Imager->new(xsize=>50, ysize=>50);
- $im1->box(filled=>1, color=>$blue);
- $im1->addtag(name=>'tiff_pagename', value => "Page One");
- my $im2 = Imager->new(xsize=>60, ysize=>60);
- $im2->box(filled=>1, color=>$green);
- $im2->addtag(name=>'tiff_pagename', value=>"Page Two");
-
- # read second page
- my $page_file = 'testout/t106_pages.tif';
- ok(Imager->write_multi({ file=> $page_file}, $im1, $im2),
- "build simple multiimage for page tests");
- my $imwork = Imager->new;
- ok($imwork->read(file=>$page_file, page=>1),
- "read second page");
- is($im2->getwidth, $imwork->getwidth, "check width");
- is($im2->getwidth, $imwork->getheight, "check height");
- is(i_img_diff($imwork->{IMG}, $im2->{IMG}), 0,
- "check image content");
- my ($page_name) = $imwork->tags(name=>'tiff_pagename');
- is($page_name, 'Page Two', "check tag we set");
-
- # try an out of range page
- ok(!$imwork->read(file=>$page_file, page=>2),
- "check out of range page");
- is($imwork->errstr, "could not switch to page 2", "check message");
-}
-
-{ # test writing returns an error message correctly
- # open a file read only and try to write to it
- open TIFF, "> testout/t106_empty.tif" or die;
- close TIFF;
- open TIFF, "< testout/t106_empty.tif"
- or skip "Cannot open testout/t106_empty.tif for reading", 8;
- binmode TIFF;
- my $im = Imager->new(xsize=>100, ysize=>100);
- ok(!$im->write(fh => \*TIFF, type=>'tiff'),
- "fail to write to read only handle");
- cmp_ok($im->errstr, '=~', 'Could not create TIFF object: Error writing TIFF header: write\(\)',
- "check error message");
- ok(!Imager->write_multi({ type => 'tiff', fh => \*TIFF }, $im),
- "fail to write multi to read only handle");
- cmp_ok(Imager->errstr, '=~', 'Could not create TIFF object: Error writing TIFF header: write\(\)',
- "check error message");
- ok(!$im->write(fh => \*TIFF, type=>'tiff', class=>'fax'),
- "fail to write to read only handle (fax)");
- cmp_ok($im->errstr, '=~', 'Could not create TIFF object: Error writing TIFF header: write\(\)',
- "check error message");
- ok(!Imager->write_multi({ type => 'tiff', fh => \*TIFF, class=>'fax' }, $im),
- "fail to write multi to read only handle (fax)");
- cmp_ok(Imager->errstr, '=~', 'Could not create TIFF object: Error writing TIFF header: write\(\)',
- "check error message");
-}
-
-{ # test reading returns an error correctly - use test script as an
- # invalid TIFF file
- my $im = Imager->new;
- ok(!$im->read(file=>'t/t106tiff.t', type=>'tiff'),
- "fail to read script as image");
- # we get different magic number values depending on the platform
- # byte ordering
- cmp_ok($im->errstr, '=~',
- "Error opening file: Not a TIFF (?:or MDI )?file, bad magic number (8483 \\(0x2123\\)|8993 \\(0x2321\\))",
- "check error message");
- my @ims = Imager->read_multi(file =>'t/t106tiff.t', type=>'tiff');
- ok(!@ims, "fail to read_multi script as image");
- cmp_ok($im->errstr, '=~',
- "Error opening file: Not a TIFF (?:or MDI )?file, bad magic number (8483 \\(0x2123\\)|8993 \\(0x2321\\))",
- "check error message");
-}
-
-{ # write_multi to data
- my $data;
- my $im = Imager->new(xsize => 50, ysize => 50);
- ok(Imager->write_multi({ data => \$data, type=>'tiff' }, $im, $im),
- "write multi to in memory");
- ok(length $data, "make sure something written");
- my @im = Imager->read_multi(data => $data);
- is(@im, 2, "make sure we can read it back");
- is(Imager::i_img_diff($im[0]{IMG}, $im->{IMG}), 0,
- "check first image");
- is(Imager::i_img_diff($im[1]{IMG}, $im->{IMG}), 0,
- "check second image");
-}
-
-{ # handling of an alpha channel for various images
- my $photo_rgb = 2;
- my $photo_cmyk = 5;
- my $photo_cielab = 8;
- my @alpha_images =
- (
- [ 'srgb.tif', 3, $photo_rgb, '003005005' ],
- [ 'srgba.tif', 4, $photo_rgb, '003005005' ],
- [ 'srgbaa.tif', 4, $photo_rgb, '003005005' ],
- [ 'scmyk.tif', 3, $photo_cmyk, '003005005' ],
- [ 'scmyka.tif', 4, $photo_cmyk, '003005005' ],
- [ 'scmykaa.tif', 4, $photo_cmyk, '003005005' ],
- [ 'slab.tif', 3, $photo_cielab, '003006001' ],
- );
-
- for my $test (@alpha_images) {
- my ($input, $channels, $photo, $need_ver) = @$test;
-
- SKIP: {
- my $skipped = $channels == 4 ? 4 : 3;
- $need_ver le $cmp_ver
- or skip("Your ancient tifflib is buggy/limited for this test", $skipped);
- my $im = Imager->new;
- ok($im->read(file => "testimg/$input"),
- "read alpha test $input")
- or print "# ", $im->errstr, "\n";
- is($im->getchannels, $channels, "channels for $input match");
- is($im->tags(name=>'tiff_photometric'), $photo,
- "photometric for $input match");
- $channels == 4
- or next;
- my $c = $im->getpixel(x => 0, 'y' => 7);
- is(($c->rgba)[3], 0, "bottom row should have 0 alpha");
- }
- }
-}
-
-{
- ok(grep($_ eq 'tiff', Imager->read_types), "check tiff in read types");
- ok(grep($_ eq 'tiff', Imager->write_types), "check tiff in write types");
-}
-
-{ # reading tile based images
- my $im = Imager->new;
- ok($im->read(file => 'testimg/pengtile.tif'), "read tiled image")
- or print "# ", $im->errstr, "\n";
- # compare it
- my $comp = Imager->new;
- ok($comp->read(file => 'testimg/penguin-base.ppm'), 'read comparison image');
- is_image($im, $comp, 'compare them');
-}
-
-SKIP:
-{ # failing to read tile based images
- # we grab our tiled image and patch a tile offset to nowhere
- ok(open(TIFF, '< testimg/pengtile.tif'), 'open pengtile.tif')
- or skip 'cannot open testimg/pengtile.tif', 4;
-
- $cmp_ver ge '003005007'
- or skip("Your ancient tifflib has bad error handling", 4);
- binmode TIFF;
- my $data = do { local $/; <TIFF>; };
-
- # patch a tile offset
- substr($data, 0x1AFA0, 4) = pack("H*", "00000200");
-
- #open PIPE, "| bytedump -a | less" or die;
- #print PIPE $data;
- #close PIPE;
-
- my $allow = Imager->new;
- ok($allow->read(data => $data, allow_incomplete => 1),
- "read incomplete tiled");
- ok($allow->tags(name => 'i_incomplete'), 'i_incomplete set');
- is($allow->tags(name => 'i_lines_read'), 173,
- 'check i_lines_read set appropriately');
-
- my $fail = Imager->new;
- ok(!$fail->read(data => $data), "read fail tiled");
-}
-
-{ # read 16-bit/sample
- my $im16 = Imager->new;
- ok($im16->read(file => 'testimg/rgb16.tif'), "read 16-bit rgb");
- is($im16->bits, 16, 'got a 16-bit image');
- my $im16t = Imager->new;
- ok($im16t->read(file => 'testimg/rgb16t.tif'), "read 16-bit rgb tiled");
- is($im16t->bits, 16, 'got a 16-bit image');
- is_image($im16, $im16t, 'check they match');
-
- my $grey16 = Imager->new;
- ok($grey16->read(file => 'testimg/grey16.tif'), "read 16-bit grey")
- or print "# ", $grey16->errstr, "\n";
- is($grey16->bits, 16, 'got a 16-bit image');
- is($grey16->getchannels, 1, 'and its grey');
- my $comp16 = $im16->convert(matrix => [ [ 0.299, 0.587, 0.114 ] ]);
- is_image($grey16, $comp16, 'compare grey to converted');
-
- my $grey32 = Imager->new;
- ok($grey32->read(file => 'testimg/grey32.tif'), "read 32-bit grey")
- or print "# ", $grey32->errstr, "\n";
- is($grey32->bits, 'double', 'got a double image');
- is($grey32->getchannels, 2, 'and its grey + alpha');
- is($grey32->tags(name => 'tiff_bitspersample'), 32,
- "check bits per sample");
- my $base = test_image_double->convert(preset =>'grey')
- ->convert(preset => 'addalpha');
- is_image($grey32, $base, 'compare to original');
-}
-
-{ # read 16, 32-bit/sample and compare to the original
- my $rgba = Imager->new;
- ok($rgba->read(file => 'testimg/srgba.tif'),
- "read base rgba image");
- my $rgba16 = Imager->new;
- ok($rgba16->read(file => 'testimg/srgba16.tif'),
- "read 16-bit/sample rgba image");
- is_image($rgba, $rgba16, "check they match");
- is($rgba16->bits, 16, 'check we got the right type');
-
- my $rgba32 = Imager->new;
- ok($rgba32->read(file => 'testimg/srgba32.tif'),
- "read 32-bit/sample rgba image");
- is_image($rgba, $rgba32, "check they match");
- is($rgba32->bits, 'double', 'check we got the right type');
-
- my $cmyka16 = Imager->new;
- ok($cmyka16->read(file => 'testimg/scmyka16.tif'),
- "read cmyk 16-bit")
- or print "# ", $cmyka16->errstr, "\n";
- is($cmyka16->bits, 16, "check we got the right type");
- is_image_similar($rgba, $cmyka16, 10, "check image data");
-
- # tiled, non-contig, should fallback to RGBA code
- my $rgbatsep = Imager->new;
- ok($rgbatsep->read(file => 'testimg/rgbatsep.tif'),
- "read tiled, separated rgba image")
- or diag($rgbatsep->errstr);
- is_image($rgba, $rgbatsep, "check they match");
-}
-{ # read bi-level
- my $pbm = Imager->new;
- ok($pbm->read(file => 'testimg/imager.pbm'), "read original pbm");
- my $tif = Imager->new;
- ok($tif->read(file => 'testimg/imager.tif'), "read mono tif");
- is_image($pbm, $tif, "compare them");
- is($tif->type, 'paletted', 'check image type');
- is($tif->colorcount, 2, 'check we got a "mono" image');
-}
-
-{ # check alpha channels scaled correctly for fallback handler
- my $im = Imager->new;
- ok($im->read(file=>'testimg/alpha.tif'), 'read alpha check image');
- my @colors =
- (
- [ 0, 0, 0 ],
- [ 255, 255, 255 ],
- [ 127, 0, 127 ],
- [ 127, 127, 0 ],
- );
- my @alphas = ( 255, 191, 127, 63 );
- my $ok = 1;
- my $msg = 'alpha check ok';
- CHECKER:
- for my $y (0 .. 3) {
- for my $x (0 .. 3) {
- my $c = $im->getpixel(x => $x, 'y' => $y);
- my @c = $c->rgba;
- my $alpha = pop @c;
- if ($alpha != $alphas[$y]) {
- $ok = 0;
- $msg = "($x,$y) alpha mismatch $alpha vs $alphas[$y]";
- last CHECKER;
- }
- my $expect = $colors[$x];
- for my $ch (0 .. 2) {
- if (abs($expect->[$ch]-$c[$ch]) > 3) {
- $ok = 0;
- $msg = "($x,$y)[$ch] color mismatch got $c[$ch] vs expected $expect->[$ch]";
- last CHECKER;
- }
- }
- }
- }
- ok($ok, $msg);
-}
-
-{ # check alpha channels scaled correctly for greyscale
- my $im = Imager->new;
- ok($im->read(file=>'testimg/gralpha.tif'), 'read alpha check grey image');
- my @greys = ( 0, 255, 52, 112 );
- my @alphas = ( 255, 191, 127, 63 );
- my $ok = 1;
- my $msg = 'alpha check ok';
- CHECKER:
- for my $y (0 .. 3) {
- for my $x (0 .. 3) {
- my $c = $im->getpixel(x => $x, 'y' => $y);
- my ($grey, $alpha) = $c->rgba;
- if ($alpha != $alphas[$y]) {
- $ok = 0;
- $msg = "($x,$y) alpha mismatch $alpha vs $alphas[$y]";
- last CHECKER;
- }
- if (abs($greys[$x] - $grey) > 3) {
- $ok = 0;
- $msg = "($x,$y) grey mismatch $grey vs $greys[$x]";
- last CHECKER;
- }
- }
- }
- ok($ok, $msg);
-}
-
-{ # 16-bit writes
- my $orig = test_image_16();
- my $data;
- ok($orig->write(data => \$data, type => 'tiff',
- tiff_compression => 'none'), "write 16-bit/sample");
- my $im = Imager->new;
- ok($im->read(data => $data), "read it back");
- is_image($im, $orig, "check read data matches");
- is($im->tags(name => 'tiff_bitspersample'), 16, "correct bits");
- is($im->bits, 16, 'check image bits');
- is($im->tags(name => 'tiff_photometric'), 2, "correct photometric");
- is($im->tags(name => 'tiff_compression'), 'none', "no compression");
- is($im->getchannels, 3, 'correct channels');
-}
-
-{ # 8-bit writes
- # and check compression
- my $compress = Imager::i_tiff_has_compression('lzw') ? 'lzw' : 'packbits';
- my $orig = test_image()->convert(preset=>'grey')
- ->convert(preset => 'addalpha');
- my $data;
- ok($orig->write(data => \$data, type => 'tiff',
- tiff_compression=> $compress),
- "write 8 bit")
- or print "# ", $orig->errstr, "\n";
- my $im = Imager->new;
- ok($im->read(data => $data), "read it back");
- is_image($im, $orig, "check read data matches");
- is($im->tags(name => 'tiff_bitspersample'), 8, 'correct bits');
- is($im->bits, 8, 'check image bits');
- is($im->tags(name => 'tiff_photometric'), 1, 'correct photometric');
- is($im->tags(name => 'tiff_compression'), $compress,
- "$compress compression");
- is($im->getchannels, 2, 'correct channels');
-}
-
-{ # double writes
- my $orig = test_image_double()->convert(preset=>'addalpha');
- my $data;
- ok($orig->write(data => \$data, type => 'tiff',
- tiff_compression => 'none'),
- "write 32-bit/sample from double")
- or print "# ", $orig->errstr, "\n";
- my $im = Imager->new;
- ok($im->read(data => $data), "read it back");
- is_image($im, $orig, "check read data matches");
- is($im->tags(name => 'tiff_bitspersample'), 32, "correct bits");
- is($im->bits, 'double', 'check image bits');
- is($im->tags(name => 'tiff_photometric'), 2, "correct photometric");
- is($im->tags(name => 'tiff_compression'), 'none', "no compression");
- is($im->getchannels, 4, 'correct channels');
-}
-
-{ # bilevel
- my $im = test_image()->convert(preset => 'grey')
- ->to_paletted(make_colors => 'mono',
- translate => 'errdiff');
- my $faxdata;
-
- # fax compression is written as miniswhite
- ok($im->write(data => \$faxdata, type => 'tiff',
- tiff_compression => 'fax3'),
- "write bilevel fax compressed");
- my $fax = Imager->new;
- ok($fax->read(data => $faxdata), "read it back");
- ok($fax->is_bilevel, "got a bi-level image back");
- is($fax->tags(name => 'tiff_compression'), 'fax3',
- "check fax compression used");
- is_image($fax, $im, "compare to original");
-
- # other compresion written as minisblack
- my $packdata;
- ok($im->write(data => \$packdata, type => 'tiff',
- tiff_compression => 'jpeg'),
- "write bilevel packbits compressed");
- my $packim = Imager->new;
- ok($packim->read(data => $packdata), "read it back");
- ok($packim->is_bilevel, "got a bi-level image back");
- is($packim->tags(name => 'tiff_compression'), 'packbits',
- "check fallback compression used");
- is_image($packim, $im, "compare to original");
-}
-
-{ # fallback handling of tiff
- is(Imager::i_tiff_has_compression('none'), 1, "can always do uncompresed");
- is(Imager::i_tiff_has_compression('xxx'), '', "can't do xxx compression");
-}
-
-
{ file => "testimg/test.raw", xsize=>150, ysize=>150, type=>'raw', interleave => 0},
{ file => "testimg/penguin-base.ppm" },
{ file => "GIF/testimg/expected.gif" },
- { file => "testimg/comp8.tif" },
+ { file => "TIFF/testimg/comp8.tif" },
{ file => "testimg/winrgb24.bmp" },
{ file => "testimg/test.tga" }, );
my %writeopts =
use Imager::Test qw(is_image);
use Test::More;
-Imager::i_has_format("tiff")
+$Imager::formats{"tiff"}
or plan skip_all => "no tiff support";
plan tests => 2;
+++ /dev/null
-#include "imager.h"
-#include <tiffio.h>
-#include "iolayer.h"
-#include "imageri.h"
-
-/* needed to implement our substitute TIFFIsCODECConfigured */
-#if TIFFLIB_VERSION < 20031121
-static int TIFFIsCODECConfigured(uint16 scheme);
-#endif
-
-/*
-=head1 NAME
-
-tiff.c - implements reading and writing tiff files, uses io layer.
-
-=head1 SYNOPSIS
-
- io_glue *ig = io_new_fd( fd );
- i_img *im = i_readtiff_wiol(ig, -1); // no limit on how much is read
- // or
- io_glue *ig = io_new_fd( fd );
- return_code = i_writetiff_wiol(im, ig);
-
-=head1 DESCRIPTION
-
-tiff.c implements the basic functions to read and write tiff files.
-It uses the iolayer and needs either a seekable source or an entire
-memory mapped buffer.
-
-=head1 FUNCTION REFERENCE
-
-Some of these functions are internal.
-
-=over
-
-=cut
-*/
-
-#define byteswap_macro(x) \
- ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | \
- (((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24))
-
-#define CLAMP8(x) ((x) < 0 ? 0 : (x) > 255 ? 255 : (x))
-#define CLAMP16(x) ((x) < 0 ? 0 : (x) > 65535 ? 65535 : (x))
-
-struct tag_name {
- char *name;
- uint32 tag;
-};
-
-static i_img *read_one_rgb_tiled(TIFF *tif, int width, int height, int allow_incomplete);
-static i_img *read_one_rgb_lines(TIFF *tif, int width, int height, int allow_incomplete);
-
-static struct tag_name text_tag_names[] =
-{
- { "tiff_documentname", TIFFTAG_DOCUMENTNAME, },
- { "tiff_imagedescription", TIFFTAG_IMAGEDESCRIPTION, },
- { "tiff_make", TIFFTAG_MAKE, },
- { "tiff_model", TIFFTAG_MODEL, },
- { "tiff_pagename", TIFFTAG_PAGENAME, },
- { "tiff_software", TIFFTAG_SOFTWARE, },
- { "tiff_datetime", TIFFTAG_DATETIME, },
- { "tiff_artist", TIFFTAG_ARTIST, },
- { "tiff_hostcomputer", TIFFTAG_HOSTCOMPUTER, },
-};
-
-static struct tag_name
-compress_values[] =
- {
- { "none", COMPRESSION_NONE },
- { "ccittrle", COMPRESSION_CCITTRLE },
- { "fax3", COMPRESSION_CCITTFAX3 },
- { "t4", COMPRESSION_CCITTFAX3 },
- { "fax4", COMPRESSION_CCITTFAX4 },
- { "t6", COMPRESSION_CCITTFAX4 },
- { "lzw", COMPRESSION_LZW },
- { "jpeg", COMPRESSION_JPEG },
- { "packbits", COMPRESSION_PACKBITS },
- { "deflate", COMPRESSION_ADOBE_DEFLATE },
- { "zip", COMPRESSION_ADOBE_DEFLATE },
- { "oldzip", COMPRESSION_DEFLATE },
- { "ccittrlew", COMPRESSION_CCITTRLEW },
- };
-
-static const int compress_value_count =
- sizeof(compress_values) / sizeof(*compress_values);
-
-static int
-myTIFFIsCODECConfigured(uint16 scheme);
-
-typedef struct read_state_tag read_state_t;
-/* the setup function creates the image object, allocates the line buffer */
-typedef int (*read_setup_t)(read_state_t *state);
-
-/* the putter writes the image data provided by the getter to the
- image, x, y, width, height describe the target area of the image,
- extras is the extra number of pixels stored for each scanline in
- the raster buffer, (for tiles against the right side of the
- image) */
-
-typedef int (*read_putter_t)(read_state_t *state, int x, int y, int width,
- int height, int extras);
-
-/* reads from a tiled or strip image and calls the putter.
- This may need a second type for handling non-contiguous images
- at some point */
-typedef int (*read_getter_t)(read_state_t *state, read_putter_t putter);
-
-struct read_state_tag {
- TIFF *tif;
- i_img *img;
- void *raster;
- unsigned long pixels_read;
- int allow_incomplete;
- void *line_buf;
- uint32 width, height;
- uint16 bits_per_sample;
- uint16 photometric;
-
- /* the total number of channels (samples per pixel) */
- int samples_per_pixel;
-
- /* if non-zero, which channel is the alpha channel, typically 3 for rgb */
- int alpha_chan;
-
- /* whether or not to scale the color channels based on the alpha
- channel. TIFF has 2 types of alpha channel, if the alpha channel
- we use is EXTRASAMPLE_ASSOCALPHA then the color data will need to
- be scaled to match Imager's conventions */
- int scale_alpha;
-};
-
-static int tile_contig_getter(read_state_t *state, read_putter_t putter);
-static int strip_contig_getter(read_state_t *state, read_putter_t putter);
-
-static int setup_paletted(read_state_t *state);
-static int paletted_putter8(read_state_t *, int, int, int, int, int);
-static int paletted_putter4(read_state_t *, int, int, int, int, int);
-
-static int setup_16_rgb(read_state_t *state);
-static int setup_16_grey(read_state_t *state);
-static int putter_16(read_state_t *, int, int, int, int, int);
-
-static int setup_8_rgb(read_state_t *state);
-static int setup_8_grey(read_state_t *state);
-static int putter_8(read_state_t *, int, int, int, int, int);
-
-static int setup_32_rgb(read_state_t *state);
-static int setup_32_grey(read_state_t *state);
-static int putter_32(read_state_t *, int, int, int, int, int);
-
-static int setup_bilevel(read_state_t *state);
-static int putter_bilevel(read_state_t *, int, int, int, int, int);
-
-static int setup_cmyk8(read_state_t *state);
-static int putter_cmyk8(read_state_t *, int, int, int, int, int);
-
-static int setup_cmyk16(read_state_t *state);
-static int putter_cmyk16(read_state_t *, int, int, int, int, int);
-
-static const int text_tag_count =
- sizeof(text_tag_names) / sizeof(*text_tag_names);
-
-static void error_handler(char const *module, char const *fmt, va_list ap) {
- mm_log((1, "tiff error fmt %s\n", fmt));
- i_push_errorvf(0, fmt, ap);
-}
-
-#define WARN_BUFFER_LIMIT 10000
-static char *warn_buffer = NULL;
-static int warn_buffer_size = 0;
-
-static void warn_handler(char const *module, char const *fmt, va_list ap) {
- char buf[1000];
-
- buf[0] = '\0';
-#ifdef HAVE_SNPRINTF
- vsnprintf(buf, sizeof(buf), fmt, ap);
-#else
- vsprintf(buf, fmt, ap);
-#endif
- mm_log((1, "tiff warning %s\n", buf));
-
- if (!warn_buffer || strlen(warn_buffer)+strlen(buf)+2 > warn_buffer_size) {
- int new_size = warn_buffer_size + strlen(buf) + 2;
- char *old_buffer = warn_buffer;
- if (new_size > WARN_BUFFER_LIMIT) {
- new_size = WARN_BUFFER_LIMIT;
- }
- warn_buffer = myrealloc(warn_buffer, new_size);
- if (!old_buffer) *warn_buffer = '\0';
- warn_buffer_size = new_size;
- }
- if (strlen(warn_buffer)+strlen(buf)+2 <= warn_buffer_size) {
- strcat(warn_buffer, buf);
- strcat(warn_buffer, "\n");
- }
-}
-
-static int save_tiff_tags(TIFF *tif, i_img *im);
-
-static void
-pack_4bit_to(unsigned char *dest, const unsigned char *src, int count);
-
-
-static toff_t sizeproc(thandle_t x) {
- return 0;
-}
-
-
-/*
-=item comp_seek(h, o, w)
-
-Compatability for 64 bit systems like latest freebsd (internal)
-
- h - tiff handle, cast an io_glue object
- o - offset
- w - whence
-
-=cut
-*/
-
-static
-toff_t
-comp_seek(thandle_t h, toff_t o, int w) {
- io_glue *ig = (io_glue*)h;
- return (toff_t) ig->seekcb(ig, o, w);
-}
-
-/*
-=item comp_mmap(thandle_t, tdata_t*, toff_t*)
-
-Dummy mmap stub.
-
-This shouldn't ever be called but newer tifflibs want it anyway.
-
-=cut
-*/
-
-static
-int
-comp_mmap(thandle_t h, tdata_t*p, toff_t*off) {
- return -1;
-}
-
-/*
-=item comp_munmap(thandle_t h, tdata_t p, toff_t off)
-
-Dummy munmap stub.
-
-This shouldn't ever be called but newer tifflibs want it anyway.
-
-=cut
-*/
-
-static void
-comp_munmap(thandle_t h, tdata_t p, toff_t off) {
- /* do nothing */
-}
-
-static i_img *read_one_tiff(TIFF *tif, int allow_incomplete) {
- i_img *im;
- uint32 width, height;
- uint16 samples_per_pixel;
- int tiled, error;
- float xres, yres;
- uint16 resunit;
- int gotXres, gotYres;
- uint16 photometric;
- uint16 bits_per_sample;
- uint16 planar_config;
- uint16 inkset;
- uint16 compress;
- int i;
- read_state_t state;
- read_setup_t setupf = NULL;
- read_getter_t getterf = NULL;
- read_putter_t putterf = NULL;
-
- error = 0;
-
- TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &width);
- TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &height);
- TIFFGetFieldDefaulted(tif, TIFFTAG_SAMPLESPERPIXEL, &samples_per_pixel);
- tiled = TIFFIsTiled(tif);
- TIFFGetFieldDefaulted(tif, TIFFTAG_PHOTOMETRIC, &photometric);
- TIFFGetFieldDefaulted(tif, TIFFTAG_BITSPERSAMPLE, &bits_per_sample);
- TIFFGetFieldDefaulted(tif, TIFFTAG_PLANARCONFIG, &planar_config);
- TIFFGetFieldDefaulted(tif, TIFFTAG_INKSET, &inkset);
-
- mm_log((1, "i_readtiff_wiol: width=%d, height=%d, channels=%d\n", width, height, samples_per_pixel));
- mm_log((1, "i_readtiff_wiol: %stiled\n", tiled?"":"not "));
- mm_log((1, "i_readtiff_wiol: %sbyte swapped\n", TIFFIsByteSwapped(tif)?"":"not "));
-
- /* yes, this if() is horrible */
- if (photometric == PHOTOMETRIC_PALETTE && bits_per_sample <= 8) {
- setupf = setup_paletted;
- if (bits_per_sample == 8)
- putterf = paletted_putter8;
- else if (bits_per_sample == 4)
- putterf = paletted_putter4;
- else
- mm_log((1, "unsupported paletted bits_per_sample %d\n", bits_per_sample));
- }
- else if (bits_per_sample == 16
- && photometric == PHOTOMETRIC_RGB
- && samples_per_pixel >= 3) {
- setupf = setup_16_rgb;
- putterf = putter_16;
- }
- else if (bits_per_sample == 16
- && photometric == PHOTOMETRIC_MINISBLACK) {
- setupf = setup_16_grey;
- putterf = putter_16;
- }
- else if (bits_per_sample == 8
- && photometric == PHOTOMETRIC_MINISBLACK) {
- setupf = setup_8_grey;
- putterf = putter_8;
- }
- else if (bits_per_sample == 8
- && photometric == PHOTOMETRIC_RGB) {
- setupf = setup_8_rgb;
- putterf = putter_8;
- }
- else if (bits_per_sample == 32
- && photometric == PHOTOMETRIC_RGB
- && samples_per_pixel >= 3) {
- setupf = setup_32_rgb;
- putterf = putter_32;
- }
- else if (bits_per_sample == 32
- && photometric == PHOTOMETRIC_MINISBLACK) {
- setupf = setup_32_grey;
- putterf = putter_32;
- }
- else if (bits_per_sample == 1
- && (photometric == PHOTOMETRIC_MINISBLACK
- || photometric == PHOTOMETRIC_MINISWHITE)
- && samples_per_pixel == 1) {
- setupf = setup_bilevel;
- putterf = putter_bilevel;
- }
- else if (bits_per_sample == 8
- && photometric == PHOTOMETRIC_SEPARATED
- && inkset == INKSET_CMYK
- && samples_per_pixel >= 4) {
- setupf = setup_cmyk8;
- putterf = putter_cmyk8;
- }
- else if (bits_per_sample == 16
- && photometric == PHOTOMETRIC_SEPARATED
- && inkset == INKSET_CMYK
- && samples_per_pixel >= 4) {
- setupf = setup_cmyk16;
- putterf = putter_cmyk16;
- }
- if (tiled) {
- if (planar_config == PLANARCONFIG_CONTIG)
- getterf = tile_contig_getter;
- }
- else {
- if (planar_config == PLANARCONFIG_CONTIG)
- getterf = strip_contig_getter;
- }
- if (setupf && getterf && putterf) {
- unsigned long total_pixels = (unsigned long)width * height;
- memset(&state, 0, sizeof(state));
- state.tif = tif;
- state.allow_incomplete = allow_incomplete;
- state.width = width;
- state.height = height;
- state.bits_per_sample = bits_per_sample;
- state.samples_per_pixel = samples_per_pixel;
- state.photometric = photometric;
-
- if (!setupf(&state))
- return NULL;
- if (!getterf(&state, putterf) || !state.pixels_read) {
- if (state.img)
- i_img_destroy(state.img);
- if (state.raster)
- _TIFFfree(state.raster);
- if (state.line_buf)
- myfree(state.line_buf);
-
- return NULL;
- }
-
- if (allow_incomplete && state.pixels_read < total_pixels) {
- i_tags_setn(&(state.img->tags), "i_incomplete", 1);
- i_tags_setn(&(state.img->tags), "i_lines_read",
- state.pixels_read / width);
- }
- im = state.img;
-
- if (state.raster)
- _TIFFfree(state.raster);
- if (state.line_buf)
- myfree(state.line_buf);
- }
- else {
- if (tiled) {
- im = read_one_rgb_tiled(tif, width, height, allow_incomplete);
- }
- else {
- im = read_one_rgb_lines(tif, width, height, allow_incomplete);
- }
- }
-
- if (!im)
- return NULL;
-
- /* general metadata */
- i_tags_addn(&im->tags, "tiff_bitspersample", 0, bits_per_sample);
- i_tags_addn(&im->tags, "tiff_photometric", 0, photometric);
- TIFFGetFieldDefaulted(tif, TIFFTAG_COMPRESSION, &compress);
-
- /* resolution tags */
- TIFFGetFieldDefaulted(tif, TIFFTAG_RESOLUTIONUNIT, &resunit);
- gotXres = TIFFGetField(tif, TIFFTAG_XRESOLUTION, &xres);
- gotYres = TIFFGetField(tif, TIFFTAG_YRESOLUTION, &yres);
- if (gotXres || gotYres) {
- if (!gotXres)
- xres = yres;
- else if (!gotYres)
- yres = xres;
- i_tags_addn(&im->tags, "tiff_resolutionunit", 0, resunit);
- if (resunit == RESUNIT_CENTIMETER) {
- /* from dots per cm to dpi */
- xres *= 2.54;
- yres *= 2.54;
- i_tags_add(&im->tags, "tiff_resolutionunit_name", 0, "centimeter", -1, 0);
- }
- else if (resunit == RESUNIT_NONE) {
- i_tags_addn(&im->tags, "i_aspect_only", 0, 1);
- i_tags_add(&im->tags, "tiff_resolutionunit_name", 0, "none", -1, 0);
- }
- else if (resunit == RESUNIT_INCH) {
- i_tags_add(&im->tags, "tiff_resolutionunit_name", 0, "inch", -1, 0);
- }
- else {
- i_tags_add(&im->tags, "tiff_resolutionunit_name", 0, "unknown", -1, 0);
- }
- /* tifflib doesn't seem to provide a way to get to the original rational
- value of these, which would let me provide a more reasonable
- precision. So make up a number. */
- i_tags_set_float2(&im->tags, "i_xres", 0, xres, 6);
- i_tags_set_float2(&im->tags, "i_yres", 0, yres, 6);
- }
-
- /* Text tags */
- for (i = 0; i < text_tag_count; ++i) {
- char *data;
- if (TIFFGetField(tif, text_tag_names[i].tag, &data)) {
- mm_log((1, "i_readtiff_wiol: tag %d has value %s\n",
- text_tag_names[i].tag, data));
- i_tags_add(&im->tags, text_tag_names[i].name, 0, data,
- strlen(data), 0);
- }
- }
-
- i_tags_add(&im->tags, "i_format", 0, "tiff", -1, 0);
- if (warn_buffer && *warn_buffer) {
- i_tags_add(&im->tags, "i_warning", 0, warn_buffer, -1, 0);
- *warn_buffer = '\0';
- }
-
- for (i = 0; i < compress_value_count; ++i) {
- if (compress_values[i].tag == compress) {
- i_tags_add(&im->tags, "tiff_compression", 0, compress_values[i].name, -1, 0);
- break;
- }
- }
-
- return im;
-}
-
-/*
-=item i_readtiff_wiol(im, ig)
-
-=cut
-*/
-i_img*
-i_readtiff_wiol(io_glue *ig, int allow_incomplete, int page) {
- TIFF* tif;
- TIFFErrorHandler old_handler;
- TIFFErrorHandler old_warn_handler;
- i_img *im;
-
- i_clear_error();
- old_handler = TIFFSetErrorHandler(error_handler);
- old_warn_handler = TIFFSetWarningHandler(warn_handler);
- if (warn_buffer)
- *warn_buffer = '\0';
-
- /* Add code to get the filename info from the iolayer */
- /* Also add code to check for mmapped code */
-
- io_glue_commit_types(ig);
- mm_log((1, "i_readtiff_wiol(ig %p, allow_incomplete %d, page %d)\n", ig, allow_incomplete, page));
-
- tif = TIFFClientOpen("(Iolayer)",
- "rm",
- (thandle_t) ig,
- (TIFFReadWriteProc) ig->readcb,
- (TIFFReadWriteProc) ig->writecb,
- (TIFFSeekProc) comp_seek,
- (TIFFCloseProc) ig->closecb,
- ig->sizecb ? (TIFFSizeProc) ig->sizecb : (TIFFSizeProc) sizeproc,
- (TIFFMapFileProc) comp_mmap,
- (TIFFUnmapFileProc) comp_munmap);
-
- if (!tif) {
- mm_log((1, "i_readtiff_wiol: Unable to open tif file\n"));
- i_push_error(0, "Error opening file");
- TIFFSetErrorHandler(old_handler);
- TIFFSetWarningHandler(old_warn_handler);
- return NULL;
- }
-
- if (page != 0) {
- if (!TIFFSetDirectory(tif, page)) {
- mm_log((1, "i_readtiff_wiol: Unable to switch to directory %d\n", page));
- i_push_errorf(0, "could not switch to page %d", page);
- TIFFSetErrorHandler(old_handler);
- TIFFSetWarningHandler(old_warn_handler);
- TIFFClose(tif);
- return NULL;
- }
- }
-
- im = read_one_tiff(tif, allow_incomplete);
-
- if (TIFFLastDirectory(tif)) mm_log((1, "Last directory of tiff file\n"));
- TIFFSetErrorHandler(old_handler);
- TIFFSetWarningHandler(old_warn_handler);
- TIFFClose(tif);
- return im;
-}
-
-/*
-=item i_readtiff_multi_wiol(ig, length, *count)
-
-Reads multiple images from a TIFF.
-
-=cut
-*/
-i_img**
-i_readtiff_multi_wiol(io_glue *ig, int length, int *count) {
- TIFF* tif;
- TIFFErrorHandler old_handler;
- TIFFErrorHandler old_warn_handler;
- i_img **results = NULL;
- int result_alloc = 0;
- int dirnum = 0;
-
- i_clear_error();
- old_handler = TIFFSetErrorHandler(error_handler);
- old_warn_handler = TIFFSetWarningHandler(warn_handler);
- if (warn_buffer)
- *warn_buffer = '\0';
-
- /* Add code to get the filename info from the iolayer */
- /* Also add code to check for mmapped code */
-
- io_glue_commit_types(ig);
- mm_log((1, "i_readtiff_wiol(ig %p, length %d)\n", ig, length));
-
- tif = TIFFClientOpen("(Iolayer)",
- "rm",
- (thandle_t) ig,
- (TIFFReadWriteProc) ig->readcb,
- (TIFFReadWriteProc) ig->writecb,
- (TIFFSeekProc) comp_seek,
- (TIFFCloseProc) ig->closecb,
- ig->sizecb ? (TIFFSizeProc) ig->sizecb : (TIFFSizeProc) sizeproc,
- (TIFFMapFileProc) comp_mmap,
- (TIFFUnmapFileProc) comp_munmap);
-
- if (!tif) {
- mm_log((1, "i_readtiff_wiol: Unable to open tif file\n"));
- i_push_error(0, "Error opening file");
- TIFFSetErrorHandler(old_handler);
- TIFFSetWarningHandler(old_warn_handler);
- return NULL;
- }
-
- *count = 0;
- do {
- i_img *im = read_one_tiff(tif, 0);
- if (!im)
- break;
- if (++*count > result_alloc) {
- if (result_alloc == 0) {
- result_alloc = 5;
- results = mymalloc(result_alloc * sizeof(i_img *));
- }
- else {
- i_img **newresults;
- result_alloc *= 2;
- newresults = myrealloc(results, result_alloc * sizeof(i_img *));
- if (!newresults) {
- i_img_destroy(im); /* don't leak it */
- break;
- }
- results = newresults;
- }
- }
- results[*count-1] = im;
- } while (TIFFSetDirectory(tif, ++dirnum));
-
- TIFFSetWarningHandler(old_warn_handler);
- TIFFSetErrorHandler(old_handler);
- TIFFClose(tif);
- return results;
-}
-
-undef_int
-i_writetiff_low_faxable(TIFF *tif, i_img *im, int fine) {
- uint32 width, height;
- unsigned char *linebuf = NULL;
- uint32 y;
- int rc;
- uint32 x;
- uint32 rowsperstrip;
- float vres = fine ? 196 : 98;
- int luma_chan;
-
- width = im->xsize;
- height = im->ysize;
-
- switch (im->channels) {
- case 1:
- case 2:
- luma_chan = 0;
- break;
- case 3:
- case 4:
- luma_chan = 1;
- break;
- default:
- /* This means a colorspace we don't handle yet */
- mm_log((1, "i_writetiff_wiol_faxable: don't handle %d channel images.\n", im->channels));
- return 0;
- }
-
- /* Add code to get the filename info from the iolayer */
- /* Also add code to check for mmapped code */
-
-
- mm_log((1, "i_writetiff_wiol_faxable: width=%d, height=%d, channels=%d\n", width, height, im->channels));
-
- if (!TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, width) )
- { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField width=%d failed\n", width)); return 0; }
- if (!TIFFSetField(tif, TIFFTAG_IMAGELENGTH, height) )
- { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField length=%d failed\n", height)); return 0; }
- if (!TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1))
- { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField samplesperpixel=1 failed\n")); return 0; }
- if (!TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT))
- { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField Orientation=topleft\n")); return 0; }
- if (!TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 1) )
- { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField bitpersample=1\n")); return 0; }
- if (!TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG))
- { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField planarconfig\n")); return 0; }
- if (!TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISWHITE))
- { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField photometric=%d\n", PHOTOMETRIC_MINISBLACK)); return 0; }
- if (!TIFFSetField(tif, TIFFTAG_COMPRESSION, 3))
- { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField compression=3\n")); return 0; }
-
- linebuf = (unsigned char *)_TIFFmalloc( TIFFScanlineSize(tif) );
-
- if (!TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(tif, -1))) {
- mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField rowsperstrip=-1\n")); return 0; }
-
- TIFFGetField(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip);
- TIFFGetField(tif, TIFFTAG_ROWSPERSTRIP, &rc);
-
- mm_log((1, "i_writetiff_wiol_faxable: TIFFGetField rowsperstrip=%d\n", rowsperstrip));
- mm_log((1, "i_writetiff_wiol_faxable: TIFFGetField scanlinesize=%d\n", TIFFScanlineSize(tif) ));
- mm_log((1, "i_writetiff_wiol_faxable: TIFFGetField planarconfig=%d == %d\n", rc, PLANARCONFIG_CONTIG));
-
- if (!TIFFSetField(tif, TIFFTAG_XRESOLUTION, (float)204))
- { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField Xresolution=204\n")); return 0; }
- if (!TIFFSetField(tif, TIFFTAG_YRESOLUTION, vres))
- { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField Yresolution=196\n")); return 0; }
- if (!TIFFSetField(tif, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH)) {
- mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField ResolutionUnit=%d\n", RESUNIT_INCH)); return 0;
- }
-
- if (!save_tiff_tags(tif, im)) {
- return 0;
- }
-
- for (y=0; y<height; y++) {
- int linebufpos=0;
- for(x=0; x<width; x+=8) {
- int bits;
- int bitpos;
- i_sample_t luma[8];
- uint8 bitval = 128;
- linebuf[linebufpos]=0;
- bits = width-x; if(bits>8) bits=8;
- i_gsamp(im, x, x+8, y, luma, &luma_chan, 1);
- for(bitpos=0;bitpos<bits;bitpos++) {
- linebuf[linebufpos] |= ((luma[bitpos] < 128) ? bitval : 0);
- bitval >>= 1;
- }
- linebufpos++;
- }
- if (TIFFWriteScanline(tif, linebuf, y, 0) < 0) {
- mm_log((1, "i_writetiff_wiol_faxable: TIFFWriteScanline failed.\n"));
- break;
- }
- }
- if (linebuf) _TIFFfree(linebuf);
-
- return 1;
-}
-
-static uint16
-find_compression(char const *name, uint16 *compress) {
- int i;
-
- for (i = 0; i < compress_value_count; ++i) {
- if (strcmp(compress_values[i].name, name) == 0) {
- *compress = (uint16)compress_values[i].tag;
- return 1;
- }
- }
- *compress = COMPRESSION_NONE;
-
- return 0;
-}
-
-static uint16
-get_compression(i_img *im, uint16 def_compress) {
- int entry;
- int value;
-
- if (i_tags_find(&im->tags, "tiff_compression", 0, &entry)
- && im->tags.tags[entry].data) {
- uint16 compress;
- if (find_compression(im->tags.tags[entry].data, &compress)
- && myTIFFIsCODECConfigured(compress))
- return compress;
- }
- if (i_tags_get_int(&im->tags, "tiff_compression", 0, &value)) {
- if ((uint16)value == value
- && myTIFFIsCODECConfigured((uint16)value))
- return (uint16)value;
- }
-
- return def_compress;
-}
-
-int
-i_tiff_has_compression(const char *name) {
- uint16 compress;
-
- if (!find_compression(name, &compress))
- return 0;
-
- return myTIFFIsCODECConfigured(compress);
-}
-
-static int
-set_base_tags(TIFF *tif, i_img *im, uint16 compress, uint16 photometric,
- uint16 bits_per_sample, uint16 samples_per_pixel) {
- double xres, yres;
- int resunit;
- int got_xres, got_yres;
- int aspect_only;
-
- if (!TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, im->xsize)) {
- i_push_error(0, "write TIFF: setting width tag");
- return 0;
- }
- if (!TIFFSetField(tif, TIFFTAG_IMAGELENGTH, im->ysize)) {
- i_push_error(0, "write TIFF: setting length tag");
- return 0;
- }
- if (!TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT)) {
- i_push_error(0, "write TIFF: setting orientation tag");
- return 0;
- }
- if (!TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG)) {
- i_push_error(0, "write TIFF: setting planar configuration tag");
- return 0;
- }
- if (!TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, photometric)) {
- i_push_error(0, "write TIFF: setting photometric tag");
- return 0;
- }
- if (!TIFFSetField(tif, TIFFTAG_COMPRESSION, compress)) {
- i_push_error(0, "write TIFF: setting compression tag");
- return 0;
- }
- if (!TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, bits_per_sample)) {
- i_push_error(0, "write TIFF: setting bits per sample tag");
- return 0;
- }
- if (!TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, samples_per_pixel)) {
- i_push_error(0, "write TIFF: setting samples per pixel tag");
- return 0;
- }
-
- got_xres = i_tags_get_float(&im->tags, "i_xres", 0, &xres);
- got_yres = i_tags_get_float(&im->tags, "i_yres", 0, &yres);
- if (!i_tags_get_int(&im->tags, "i_aspect_only", 0,&aspect_only))
- aspect_only = 0;
- if (!i_tags_get_int(&im->tags, "tiff_resolutionunit", 0, &resunit))
- resunit = RESUNIT_INCH;
- if (got_xres || got_yres) {
- if (!got_xres)
- xres = yres;
- else if (!got_yres)
- yres = xres;
- if (aspect_only) {
- resunit = RESUNIT_NONE;
- }
- else {
- if (resunit == RESUNIT_CENTIMETER) {
- xres /= 2.54;
- yres /= 2.54;
- }
- else {
- resunit = RESUNIT_INCH;
- }
- }
- if (!TIFFSetField(tif, TIFFTAG_XRESOLUTION, (float)xres)) {
- i_push_error(0, "write TIFF: setting xresolution tag");
- return 0;
- }
- if (!TIFFSetField(tif, TIFFTAG_YRESOLUTION, (float)yres)) {
- i_push_error(0, "write TIFF: setting yresolution tag");
- return 0;
- }
- if (!TIFFSetField(tif, TIFFTAG_RESOLUTIONUNIT, (uint16)resunit)) {
- i_push_error(0, "write TIFF: setting resolutionunit tag");
- return 0;
- }
- }
-
- return 1;
-}
-
-static int
-write_one_bilevel(TIFF *tif, i_img *im, int zero_is_white) {
- uint16 compress = get_compression(im, COMPRESSION_PACKBITS);
- uint16 photometric;
- unsigned char *in_row;
- unsigned char *out_row;
- unsigned out_size;
- int x, y;
- int invert;
-
- mm_log((1, "tiff - write_one_bilevel(tif %p, im %p, zero_is_white %d)\n",
- tif, im, zero_is_white));
-
- /* ignore a silly choice */
- if (compress == COMPRESSION_JPEG)
- compress = COMPRESSION_PACKBITS;
-
- switch (compress) {
- case COMPRESSION_CCITTRLE:
- case COMPRESSION_CCITTFAX3:
- case COMPRESSION_CCITTFAX4:
- /* natural fax photometric */
- photometric = PHOTOMETRIC_MINISWHITE;
- break;
-
- default:
- /* natural for most computer images */
- photometric = PHOTOMETRIC_MINISBLACK;
- break;
- }
-
- if (!set_base_tags(tif, im, compress, photometric, 1, 1))
- return 0;
-
- if (!TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(tif, -1))) {
- i_push_error(0, "write TIFF: setting rows per strip tag");
- return 0;
- }
-
- out_size = TIFFScanlineSize(tif);
- out_row = (unsigned char *)_TIFFmalloc( out_size );
- in_row = mymalloc(im->xsize);
-
- invert = (photometric == PHOTOMETRIC_MINISWHITE) != (zero_is_white != 0);
-
- for (y = 0; y < im->ysize; ++y) {
- int mask = 0x80;
- unsigned char *outp = out_row;
- memset(out_row, 0, out_size);
- i_gpal(im, 0, im->xsize, y, in_row);
- for (x = 0; x < im->xsize; ++x) {
- if (invert ? !in_row[x] : in_row[x]) {
- *outp |= mask;
- }
- mask >>= 1;
- if (!mask) {
- ++outp;
- mask = 0x80;
- }
- }
- if (TIFFWriteScanline(tif, out_row, y, 0) < 0) {
- _TIFFfree(out_row);
- myfree(in_row);
- i_push_error(0, "write TIFF: write scan line failed");
- return 0;
- }
- }
-
- _TIFFfree(out_row);
- myfree(in_row);
-
- return 1;
-}
-
-static int
-set_palette(TIFF *tif, i_img *im, int size) {
- int count;
- uint16 *colors;
- uint16 *out[3];
- i_color c;
- int i, ch;
-
- colors = (uint16 *)_TIFFmalloc(sizeof(uint16) * 3 * size);
- out[0] = colors;
- out[1] = colors + size;
- out[2] = colors + 2 * size;
-
- count = i_colorcount(im);
- for (i = 0; i < count; ++i) {
- i_getcolors(im, i, &c, 1);
- for (ch = 0; ch < 3; ++ch)
- out[ch][i] = c.channel[ch] * 257;
- }
- for (; i < size; ++i) {
- for (ch = 0; ch < 3; ++ch)
- out[ch][i] = 0;
- }
- if (!TIFFSetField(tif, TIFFTAG_COLORMAP, out[0], out[1], out[2])) {
- _TIFFfree(colors);
- i_push_error(0, "write TIFF: setting color map");
- return 0;
- }
- _TIFFfree(colors);
-
- return 1;
-}
-
-static int
-write_one_paletted8(TIFF *tif, i_img *im) {
- uint16 compress = get_compression(im, COMPRESSION_PACKBITS);
- unsigned char *out_row;
- unsigned out_size;
- int y;
-
- mm_log((1, "tiff - write_one_paletted8(tif %p, im %p)\n", tif, im));
-
- /* ignore a silly choice */
- if (compress == COMPRESSION_JPEG ||
- compress == COMPRESSION_CCITTRLE ||
- compress == COMPRESSION_CCITTFAX3 ||
- compress == COMPRESSION_CCITTFAX4)
- compress = COMPRESSION_PACKBITS;
-
- if (!TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(tif, -1))) {
- i_push_error(0, "write TIFF: setting rows per strip tag");
- return 0;
- }
-
- if (!set_base_tags(tif, im, compress, PHOTOMETRIC_PALETTE, 8, 1))
- return 0;
-
- if (!set_palette(tif, im, 256))
- return 0;
-
- out_size = TIFFScanlineSize(tif);
- out_row = (unsigned char *)_TIFFmalloc( out_size );
-
- for (y = 0; y < im->ysize; ++y) {
- i_gpal(im, 0, im->xsize, y, out_row);
- if (TIFFWriteScanline(tif, out_row, y, 0) < 0) {
- _TIFFfree(out_row);
- i_push_error(0, "write TIFF: write scan line failed");
- return 0;
- }
- }
-
- _TIFFfree(out_row);
-
- return 1;
-}
-
-static int
-write_one_paletted4(TIFF *tif, i_img *im) {
- uint16 compress = get_compression(im, COMPRESSION_PACKBITS);
- unsigned char *in_row;
- unsigned char *out_row;
- unsigned out_size;
- int y;
-
- mm_log((1, "tiff - write_one_paletted4(tif %p, im %p)\n", tif, im));
-
- /* ignore a silly choice */
- if (compress == COMPRESSION_JPEG ||
- compress == COMPRESSION_CCITTRLE ||
- compress == COMPRESSION_CCITTFAX3 ||
- compress == COMPRESSION_CCITTFAX4)
- compress = COMPRESSION_PACKBITS;
-
- if (!set_base_tags(tif, im, compress, PHOTOMETRIC_PALETTE, 4, 1))
- return 0;
-
- if (!set_palette(tif, im, 16))
- return 0;
-
- if (!TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(tif, -1))) {
- i_push_error(0, "write TIFF: setting rows per strip tag");
- return 0;
- }
-
- in_row = mymalloc(im->xsize);
- out_size = TIFFScanlineSize(tif);
- out_row = (unsigned char *)_TIFFmalloc( out_size );
-
- for (y = 0; y < im->ysize; ++y) {
- i_gpal(im, 0, im->xsize, y, in_row);
- memset(out_row, 0, out_size);
- pack_4bit_to(out_row, in_row, im->xsize);
- if (TIFFWriteScanline(tif, out_row, y, 0) < 0) {
- _TIFFfree(out_row);
- i_push_error(0, "write TIFF: write scan line failed");
- return 0;
- }
- }
-
- myfree(in_row);
- _TIFFfree(out_row);
-
- return 1;
-}
-
-static int
-set_direct_tags(TIFF *tif, i_img *im, uint16 compress,
- uint16 bits_per_sample) {
- uint16 extras = EXTRASAMPLE_ASSOCALPHA;
- uint16 extra_count = im->channels == 2 || im->channels == 4;
- uint16 photometric = im->channels >= 3 ?
- PHOTOMETRIC_RGB : PHOTOMETRIC_MINISBLACK;
-
- if (!set_base_tags(tif, im, compress, photometric, bits_per_sample,
- im->channels)) {
- return 0;
- }
-
- if (extra_count) {
- if (!TIFFSetField(tif, TIFFTAG_EXTRASAMPLES, extra_count, &extras)) {
- i_push_error(0, "write TIFF: setting extra samples tag");
- return 0;
- }
- }
-
- if (compress == COMPRESSION_JPEG) {
- int jpeg_quality;
- if (i_tags_get_int(&im->tags, "tiff_jpegquality", 0, &jpeg_quality)
- && jpeg_quality >= 0 && jpeg_quality <= 100) {
- if (!TIFFSetField(tif, TIFFTAG_JPEGQUALITY, jpeg_quality)) {
- i_push_error(0, "write TIFF: setting jpeg quality pseudo-tag");
- return 0;
- }
- }
- }
-
- return 1;
-}
-
-static int
-write_one_32(TIFF *tif, i_img *im) {
- uint16 compress = get_compression(im, COMPRESSION_PACKBITS);
- unsigned *in_row;
- size_t out_size;
- uint32 *out_row;
- int y;
- size_t sample_count = im->xsize * im->channels;
- size_t sample_index;
-
- mm_log((1, "tiff - write_one_32(tif %p, im %p)\n", tif, im));
-
- /* only 8 and 12 bit samples are supported by jpeg compression */
- if (compress == COMPRESSION_JPEG)
- compress = COMPRESSION_PACKBITS;
-
- if (!set_direct_tags(tif, im, compress, 32))
- return 0;
-
- in_row = mymalloc(sample_count * sizeof(unsigned));
- out_size = TIFFScanlineSize(tif);
- out_row = (uint32 *)_TIFFmalloc( out_size );
-
- for (y = 0; y < im->ysize; ++y) {
- if (i_gsamp_bits(im, 0, im->xsize, y, in_row, NULL, im->channels, 32) <= 0) {
- i_push_error(0, "Cannot read 32-bit samples");
- return 0;
- }
- for (sample_index = 0; sample_index < sample_count; ++sample_index)
- out_row[sample_index] = in_row[sample_index];
- if (TIFFWriteScanline(tif, out_row, y, 0) < 0) {
- myfree(in_row);
- _TIFFfree(out_row);
- i_push_error(0, "write TIFF: write scan line failed");
- return 0;
- }
- }
-
- myfree(in_row);
- _TIFFfree(out_row);
-
- return 1;
-}
-
-static int
-write_one_16(TIFF *tif, i_img *im) {
- uint16 compress = get_compression(im, COMPRESSION_PACKBITS);
- unsigned *in_row;
- size_t out_size;
- uint16 *out_row;
- int y;
- size_t sample_count = im->xsize * im->channels;
- size_t sample_index;
-
- mm_log((1, "tiff - write_one_16(tif %p, im %p)\n", tif, im));
-
- /* only 8 and 12 bit samples are supported by jpeg compression */
- if (compress == COMPRESSION_JPEG)
- compress = COMPRESSION_PACKBITS;
-
- if (!set_direct_tags(tif, im, compress, 16))
- return 0;
-
- in_row = mymalloc(sample_count * sizeof(unsigned));
- out_size = TIFFScanlineSize(tif);
- out_row = (uint16 *)_TIFFmalloc( out_size );
-
- for (y = 0; y < im->ysize; ++y) {
- if (i_gsamp_bits(im, 0, im->xsize, y, in_row, NULL, im->channels, 16) <= 0) {
- i_push_error(0, "Cannot read 16-bit samples");
- return 0;
- }
- for (sample_index = 0; sample_index < sample_count; ++sample_index)
- out_row[sample_index] = in_row[sample_index];
- if (TIFFWriteScanline(tif, out_row, y, 0) < 0) {
- myfree(in_row);
- _TIFFfree(out_row);
- i_push_error(0, "write TIFF: write scan line failed");
- return 0;
- }
- }
-
- myfree(in_row);
- _TIFFfree(out_row);
-
- return 1;
-}
-
-static int
-write_one_8(TIFF *tif, i_img *im) {
- uint16 compress = get_compression(im, COMPRESSION_PACKBITS);
- size_t out_size;
- unsigned char *out_row;
- int y;
- size_t sample_count = im->xsize * im->channels;
-
- mm_log((1, "tiff - write_one_8(tif %p, im %p)\n", tif, im));
-
- if (!set_direct_tags(tif, im, compress, 8))
- return 0;
-
- out_size = TIFFScanlineSize(tif);
- if (out_size < sample_count)
- out_size = sample_count;
- out_row = (unsigned char *)_TIFFmalloc( out_size );
-
- for (y = 0; y < im->ysize; ++y) {
- if (i_gsamp(im, 0, im->xsize, y, out_row, NULL, im->channels) <= 0) {
- i_push_error(0, "Cannot read 8-bit samples");
- return 0;
- }
- if (TIFFWriteScanline(tif, out_row, y, 0) < 0) {
- _TIFFfree(out_row);
- i_push_error(0, "write TIFF: write scan line failed");
- return 0;
- }
- }
- _TIFFfree(out_row);
-
- return 1;
-}
-
-static int
-i_writetiff_low(TIFF *tif, i_img *im) {
- uint32 width, height;
- uint16 channels;
- int zero_is_white;
-
- width = im->xsize;
- height = im->ysize;
- channels = im->channels;
-
- mm_log((1, "i_writetiff_low: width=%d, height=%d, channels=%d, bits=%d\n", width, height, channels, im->bits));
- if (im->type == i_palette_type) {
- mm_log((1, "i_writetiff_low: paletted, colors=%d\n", i_colorcount(im)));
- }
-
- if (i_img_is_monochrome(im, &zero_is_white)) {
- if (!write_one_bilevel(tif, im, zero_is_white))
- return 0;
- }
- else if (im->type == i_palette_type) {
- if (i_colorcount(im) <= 16) {
- if (!write_one_paletted4(tif, im))
- return 0;
- }
- else {
- if (!write_one_paletted8(tif, im))
- return 0;
- }
- }
- else if (im->bits > 16) {
- if (!write_one_32(tif, im))
- return 0;
- }
- else if (im->bits > 8) {
- if (!write_one_16(tif, im))
- return 0;
- }
- else {
- if (!write_one_8(tif, im))
- return 0;
- }
-
- if (!save_tiff_tags(tif, im))
- return 0;
-
- return 1;
-}
-
-/*
-=item i_writetiff_multi_wiol(ig, imgs, count, fine_mode)
-
-Stores an image in the iolayer object.
-
- ig - io_object that defines source to write to
- imgs,count - the images to write
-
-=cut
-*/
-
-undef_int
-i_writetiff_multi_wiol(io_glue *ig, i_img **imgs, int count) {
- TIFF* tif;
- TIFFErrorHandler old_handler;
- int i;
-
- old_handler = TIFFSetErrorHandler(error_handler);
-
- io_glue_commit_types(ig);
- i_clear_error();
- mm_log((1, "i_writetiff_multi_wiol(ig 0x%p, imgs 0x%p, count %d)\n",
- ig, imgs, count));
-
- /* FIXME: Enable the mmap interface */
-
- tif = TIFFClientOpen("No name",
- "wm",
- (thandle_t) ig,
- (TIFFReadWriteProc) ig->readcb,
- (TIFFReadWriteProc) ig->writecb,
- (TIFFSeekProc) comp_seek,
- (TIFFCloseProc) ig->closecb,
- ig->sizecb ? (TIFFSizeProc) ig->sizecb : (TIFFSizeProc) sizeproc,
- (TIFFMapFileProc) comp_mmap,
- (TIFFUnmapFileProc) comp_munmap);
-
-
-
- if (!tif) {
- mm_log((1, "i_writetiff_multi_wiol: Unable to open tif file for writing\n"));
- i_push_error(0, "Could not create TIFF object");
- TIFFSetErrorHandler(old_handler);
- return 0;
- }
-
- for (i = 0; i < count; ++i) {
- if (!i_writetiff_low(tif, imgs[i])) {
- TIFFClose(tif);
- TIFFSetErrorHandler(old_handler);
- return 0;
- }
-
- if (!TIFFWriteDirectory(tif)) {
- i_push_error(0, "Cannot write TIFF directory");
- TIFFClose(tif);
- TIFFSetErrorHandler(old_handler);
- return 0;
- }
- }
-
- TIFFSetErrorHandler(old_handler);
- (void) TIFFClose(tif);
-
- return 1;
-}
-
-/*
-=item i_writetiff_multi_wiol_faxable(ig, imgs, count, fine_mode)
-
-Stores an image in the iolayer object.
-
- ig - io_object that defines source to write to
- imgs,count - the images to write
- fine_mode - select fine or normal mode fax images
-
-=cut
-*/
-
-
-undef_int
-i_writetiff_multi_wiol_faxable(io_glue *ig, i_img **imgs, int count, int fine) {
- TIFF* tif;
- int i;
- TIFFErrorHandler old_handler;
-
- old_handler = TIFFSetErrorHandler(error_handler);
-
- io_glue_commit_types(ig);
- i_clear_error();
- mm_log((1, "i_writetiff_multi_wiol(ig 0x%p, imgs 0x%p, count %d)\n",
- ig, imgs, count));
-
- /* FIXME: Enable the mmap interface */
-
- tif = TIFFClientOpen("No name",
- "wm",
- (thandle_t) ig,
- (TIFFReadWriteProc) ig->readcb,
- (TIFFReadWriteProc) ig->writecb,
- (TIFFSeekProc) comp_seek,
- (TIFFCloseProc) ig->closecb,
- ig->sizecb ? (TIFFSizeProc) ig->sizecb : (TIFFSizeProc) sizeproc,
- (TIFFMapFileProc) comp_mmap,
- (TIFFUnmapFileProc) comp_munmap);
-
-
-
- if (!tif) {
- mm_log((1, "i_writetiff_mulit_wiol: Unable to open tif file for writing\n"));
- i_push_error(0, "Could not create TIFF object");
- TIFFSetErrorHandler(old_handler);
- return 0;
- }
-
- for (i = 0; i < count; ++i) {
- if (!i_writetiff_low_faxable(tif, imgs[i], fine)) {
- TIFFClose(tif);
- TIFFSetErrorHandler(old_handler);
- return 0;
- }
-
- if (!TIFFWriteDirectory(tif)) {
- i_push_error(0, "Cannot write TIFF directory");
- TIFFClose(tif);
- TIFFSetErrorHandler(old_handler);
- return 0;
- }
- }
-
- (void) TIFFClose(tif);
- TIFFSetErrorHandler(old_handler);
-
- return 1;
-}
-
-/*
-=item i_writetiff_wiol(im, ig)
-
-Stores an image in the iolayer object.
-
- im - image object to write out
- ig - io_object that defines source to write to
-
-=cut
-*/
-undef_int
-i_writetiff_wiol(i_img *img, io_glue *ig) {
- TIFF* tif;
- TIFFErrorHandler old_handler;
-
- old_handler = TIFFSetErrorHandler(error_handler);
-
- io_glue_commit_types(ig);
- i_clear_error();
- mm_log((1, "i_writetiff_wiol(img %p, ig 0x%p)\n", img, ig));
-
- /* FIXME: Enable the mmap interface */
-
- tif = TIFFClientOpen("No name",
- "wm",
- (thandle_t) ig,
- (TIFFReadWriteProc) ig->readcb,
- (TIFFReadWriteProc) ig->writecb,
- (TIFFSeekProc) comp_seek,
- (TIFFCloseProc) ig->closecb,
- ig->sizecb ? (TIFFSizeProc) ig->sizecb : (TIFFSizeProc) sizeproc,
- (TIFFMapFileProc) comp_mmap,
- (TIFFUnmapFileProc) comp_munmap);
-
-
-
- if (!tif) {
- mm_log((1, "i_writetiff_wiol: Unable to open tif file for writing\n"));
- i_push_error(0, "Could not create TIFF object");
- TIFFSetErrorHandler(old_handler);
- return 0;
- }
-
- if (!i_writetiff_low(tif, img)) {
- TIFFClose(tif);
- TIFFSetErrorHandler(old_handler);
- return 0;
- }
-
- (void) TIFFClose(tif);
- TIFFSetErrorHandler(old_handler);
-
- return 1;
-}
-
-
-
-/*
-=item i_writetiff_wiol_faxable(i_img *, io_glue *)
-
-Stores an image in the iolayer object in faxable tiff format.
-
- im - image object to write out
- ig - io_object that defines source to write to
-
-Note, this may be rewritten to use to simply be a call to a
-lower-level function that gives more options for writing tiff at some
-point.
-
-=cut
-*/
-
-undef_int
-i_writetiff_wiol_faxable(i_img *im, io_glue *ig, int fine) {
- TIFF* tif;
- TIFFErrorHandler old_handler;
-
- old_handler = TIFFSetErrorHandler(error_handler);
-
- io_glue_commit_types(ig);
- i_clear_error();
- mm_log((1, "i_writetiff_wiol(img %p, ig 0x%p)\n", im, ig));
-
- /* FIXME: Enable the mmap interface */
-
- tif = TIFFClientOpen("No name",
- "wm",
- (thandle_t) ig,
- (TIFFReadWriteProc) ig->readcb,
- (TIFFReadWriteProc) ig->writecb,
- (TIFFSeekProc) comp_seek,
- (TIFFCloseProc) ig->closecb,
- ig->sizecb ? (TIFFSizeProc) ig->sizecb : (TIFFSizeProc) sizeproc,
- (TIFFMapFileProc) comp_mmap,
- (TIFFUnmapFileProc) comp_munmap);
-
-
-
- if (!tif) {
- mm_log((1, "i_writetiff_wiol: Unable to open tif file for writing\n"));
- i_push_error(0, "Could not create TIFF object");
- TIFFSetErrorHandler(old_handler);
- return 0;
- }
-
- if (!i_writetiff_low_faxable(tif, im, fine)) {
- TIFFClose(tif);
- TIFFSetErrorHandler(old_handler);
- return 0;
- }
-
- (void) TIFFClose(tif);
- TIFFSetErrorHandler(old_handler);
-
- return 1;
-}
-
-static int save_tiff_tags(TIFF *tif, i_img *im) {
- int i;
-
- for (i = 0; i < text_tag_count; ++i) {
- int entry;
- if (i_tags_find(&im->tags, text_tag_names[i].name, 0, &entry)) {
- if (!TIFFSetField(tif, text_tag_names[i].tag,
- im->tags.tags[entry].data)) {
- i_push_errorf(0, "cannot save %s to TIFF", text_tag_names[i].name);
- return 0;
- }
- }
- }
-
- return 1;
-}
-
-
-static void
-unpack_4bit_to(unsigned char *dest, const unsigned char *src,
- int src_byte_count) {
- while (src_byte_count > 0) {
- *dest++ = *src >> 4;
- *dest++ = *src++ & 0xf;
- --src_byte_count;
- }
-}
-
-static void pack_4bit_to(unsigned char *dest, const unsigned char *src,
- int pixel_count) {
- int i = 0;
- while (i < pixel_count) {
- if ((i & 1) == 0) {
- *dest = *src++ << 4;
- }
- else {
- *dest++ |= *src++;
- }
- ++i;
- }
-}
-
-static i_img *
-make_rgb(TIFF *tif, int width, int height, int *alpha_chan) {
- uint16 photometric;
- uint16 channels, in_channels;
- uint16 extra_count;
- uint16 *extras;
-
- TIFFGetFieldDefaulted(tif, TIFFTAG_SAMPLESPERPIXEL, &in_channels);
- TIFFGetFieldDefaulted(tif, TIFFTAG_PHOTOMETRIC, &photometric);
-
- switch (photometric) {
- case PHOTOMETRIC_SEPARATED:
- channels = 3;
- break;
-
- case PHOTOMETRIC_MINISWHITE:
- case PHOTOMETRIC_MINISBLACK:
- /* the TIFF RGBA functions expand single channel grey into RGB,
- so reduce it, we move the alpha channel into the right place
- if needed */
- channels = 1;
- break;
-
- default:
- channels = 3;
- break;
- }
- /* TIFF images can have more than one alpha channel, but Imager can't
- this ignores the possibility of 2 channel images with 2 alpha,
- but there's not much I can do about that */
- *alpha_chan = 0;
- if (TIFFGetField(tif, TIFFTAG_EXTRASAMPLES, &extra_count, &extras)
- && extra_count) {
- *alpha_chan = channels++;
- }
-
- return i_img_8_new(width, height, channels);
-}
-
-static i_img *
-read_one_rgb_lines(TIFF *tif, int width, int height, int allow_incomplete) {
- i_img *im;
- uint32* raster = NULL;
- uint32 rowsperstrip, row;
- i_color *line_buf;
- int alpha_chan;
- int rc;
-
- im = make_rgb(tif, width, height, &alpha_chan);
- if (!im)
- return NULL;
-
- rc = TIFFGetField(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip);
- mm_log((1, "i_readtiff_wiol: rowsperstrip=%d rc = %d\n", rowsperstrip, rc));
-
- if (rc != 1 || rowsperstrip==-1) {
- rowsperstrip = height;
- }
-
- raster = (uint32*)_TIFFmalloc(width * rowsperstrip * sizeof (uint32));
- if (!raster) {
- i_img_destroy(im);
- i_push_error(0, "No space for raster buffer");
- return NULL;
- }
-
- line_buf = mymalloc(sizeof(i_color) * width);
-
- for( row = 0; row < height; row += rowsperstrip ) {
- uint32 newrows, i_row;
-
- if (!TIFFReadRGBAStrip(tif, row, raster)) {
- if (allow_incomplete) {
- i_tags_setn(&im->tags, "i_lines_read", row);
- i_tags_setn(&im->tags, "i_incomplete", 1);
- break;
- }
- else {
- i_push_error(0, "could not read TIFF image strip");
- _TIFFfree(raster);
- i_img_destroy(im);
- return NULL;
- }
- }
-
- newrows = (row+rowsperstrip > height) ? height-row : rowsperstrip;
- mm_log((1, "newrows=%d\n", newrows));
-
- for( i_row = 0; i_row < newrows; i_row++ ) {
- uint32 x;
- i_color *outp = line_buf;
-
- for(x = 0; x<width; x++) {
- uint32 temp = raster[x+width*(newrows-i_row-1)];
- outp->rgba.r = TIFFGetR(temp);
- outp->rgba.g = TIFFGetG(temp);
- outp->rgba.b = TIFFGetB(temp);
-
- if (alpha_chan) {
- /* the libtiff RGBA code expands greyscale into RGBA, so put the
- alpha in the right place and scale it */
- int ch;
- outp->channel[alpha_chan] = TIFFGetA(temp);
- if (outp->channel[alpha_chan]) {
- for (ch = 0; ch < alpha_chan; ++ch) {
- outp->channel[ch] = outp->channel[ch] * 255 / outp->channel[alpha_chan];
- }
- }
- }
-
- outp++;
- }
- i_plin(im, 0, width, i_row+row, line_buf);
- }
- }
-
- myfree(line_buf);
- _TIFFfree(raster);
-
- return im;
-}
-
-/* adapted from libtiff
-
- libtiff's TIFFReadRGBATile succeeds even when asked to read an
- invalid tile, which means we have no way of knowing whether the data
- we received from it is valid or not.
-
- So the caller here has set stoponerror to 1 so that
- TIFFRGBAImageGet() will fail.
-
- read_one_rgb_tiled() then takes that into account for i_incomplete
- or failure.
- */
-static int
-myTIFFReadRGBATile(TIFFRGBAImage *img, uint32 col, uint32 row, uint32 * raster)
-
-{
- int ok;
- uint32 tile_xsize, tile_ysize;
- uint32 read_xsize, read_ysize;
- uint32 i_row;
-
- /*
- * Verify that our request is legal - on a tile file, and on a
- * tile boundary.
- */
-
- TIFFGetFieldDefaulted(img->tif, TIFFTAG_TILEWIDTH, &tile_xsize);
- TIFFGetFieldDefaulted(img->tif, TIFFTAG_TILELENGTH, &tile_ysize);
- if( (col % tile_xsize) != 0 || (row % tile_ysize) != 0 )
- {
- i_push_errorf(0, "Row/col passed to myTIFFReadRGBATile() must be top"
- "left corner of a tile.");
- return 0;
- }
-
- /*
- * The TIFFRGBAImageGet() function doesn't allow us to get off the
- * edge of the image, even to fill an otherwise valid tile. So we
- * figure out how much we can read, and fix up the tile buffer to
- * a full tile configuration afterwards.
- */
-
- if( row + tile_ysize > img->height )
- read_ysize = img->height - row;
- else
- read_ysize = tile_ysize;
-
- if( col + tile_xsize > img->width )
- read_xsize = img->width - col;
- else
- read_xsize = tile_xsize;
-
- /*
- * Read the chunk of imagery.
- */
-
- img->row_offset = row;
- img->col_offset = col;
-
- ok = TIFFRGBAImageGet(img, raster, read_xsize, read_ysize );
-
- /*
- * If our read was incomplete we will need to fix up the tile by
- * shifting the data around as if a full tile of data is being returned.
- *
- * This is all the more complicated because the image is organized in
- * bottom to top format.
- */
-
- if( read_xsize == tile_xsize && read_ysize == tile_ysize )
- return( ok );
-
- for( i_row = 0; i_row < read_ysize; i_row++ ) {
- memmove( raster + (tile_ysize - i_row - 1) * tile_xsize,
- raster + (read_ysize - i_row - 1) * read_xsize,
- read_xsize * sizeof(uint32) );
- _TIFFmemset( raster + (tile_ysize - i_row - 1) * tile_xsize+read_xsize,
- 0, sizeof(uint32) * (tile_xsize - read_xsize) );
- }
-
- for( i_row = read_ysize; i_row < tile_ysize; i_row++ ) {
- _TIFFmemset( raster + (tile_ysize - i_row - 1) * tile_xsize,
- 0, sizeof(uint32) * tile_xsize );
- }
-
- return (ok);
-}
-
-static i_img *
-read_one_rgb_tiled(TIFF *tif, int width, int height, int allow_incomplete) {
- i_img *im;
- uint32* raster = NULL;
- int ok = 1;
- uint32 row, col;
- uint32 tile_width, tile_height;
- unsigned long pixels = 0;
- char emsg[1024] = "";
- TIFFRGBAImage img;
- i_color *line;
- int alpha_chan;
-
- im = make_rgb(tif, width, height, &alpha_chan);
- if (!im)
- return NULL;
-
- if (!TIFFRGBAImageOK(tif, emsg)
- || !TIFFRGBAImageBegin(&img, tif, 1, emsg)) {
- i_push_error(0, emsg);
- i_img_destroy(im);
- return( 0 );
- }
-
- TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tile_width);
- TIFFGetField(tif, TIFFTAG_TILELENGTH, &tile_height);
- mm_log((1, "i_readtiff_wiol: tile_width=%d, tile_height=%d\n", tile_width, tile_height));
-
- raster = (uint32*)_TIFFmalloc(tile_width * tile_height * sizeof (uint32));
- if (!raster) {
- i_img_destroy(im);
- i_push_error(0, "No space for raster buffer");
- TIFFRGBAImageEnd(&img);
- return NULL;
- }
- line = mymalloc(tile_width * sizeof(i_color));
-
- for( row = 0; row < height; row += tile_height ) {
- for( col = 0; col < width; col += tile_width ) {
-
- /* Read the tile into an RGBA array */
- if (myTIFFReadRGBATile(&img, col, row, raster)) {
- uint32 i_row, x;
- uint32 newrows = (row+tile_height > height) ? height-row : tile_height;
- uint32 newcols = (col+tile_width > width ) ? width-col : tile_width;
-
- mm_log((1, "i_readtiff_wiol: tile(%d, %d) newcols=%d newrows=%d\n", col, row, newcols, newrows));
- for( i_row = 0; i_row < newrows; i_row++ ) {
- i_color *outp = line;
- for(x = 0; x < newcols; x++) {
- uint32 temp = raster[x+tile_width*(tile_height-i_row-1)];
- outp->rgba.r = TIFFGetR(temp);
- outp->rgba.g = TIFFGetG(temp);
- outp->rgba.b = TIFFGetB(temp);
- outp->rgba.a = TIFFGetA(temp);
-
- if (alpha_chan) {
- /* the libtiff RGBA code expands greyscale into RGBA, so put the
- alpha in the right place and scale it */
- int ch;
- outp->channel[alpha_chan] = TIFFGetA(temp);
-
- if (outp->channel[alpha_chan]) {
- for (ch = 0; ch < alpha_chan; ++ch) {
- outp->channel[ch] = outp->channel[ch] * 255 / outp->channel[alpha_chan];
- }
- }
- }
-
- ++outp;
- }
- i_plin(im, col, col+newcols, row+i_row, line);
- }
- pixels += newrows * newcols;
- }
- else {
- if (allow_incomplete) {
- ok = 0;
- }
- else {
- goto error;
- }
- }
- }
- }
-
- if (!ok) {
- if (pixels == 0) {
- i_push_error(0, "TIFF: No image data could be read from the image");
- goto error;
- }
-
- /* incomplete image */
- i_tags_setn(&im->tags, "i_incomplete", 1);
- i_tags_setn(&im->tags, "i_lines_read", pixels / width);
- }
-
- myfree(line);
- TIFFRGBAImageEnd(&img);
- _TIFFfree(raster);
-
- return im;
-
- error:
- myfree(line);
- _TIFFfree(raster);
- TIFFRGBAImageEnd(&img);
- i_img_destroy(im);
- return NULL;
-}
-
-char const *
-i_tiff_libversion(void) {
- return TIFFGetVersion();
-}
-
-static int
-setup_paletted(read_state_t *state) {
- uint16 *maps[3];
- int i, ch;
- int color_count = 1 << state->bits_per_sample;
-
- state->img = i_img_pal_new(state->width, state->height, 3, 256);
- if (!state->img)
- return 0;
-
- /* setup the color map */
- if (!TIFFGetField(state->tif, TIFFTAG_COLORMAP, maps+0, maps+1, maps+2)) {
- i_push_error(0, "Cannot get colormap for paletted image");
- i_img_destroy(state->img);
- return 0;
- }
- for (i = 0; i < color_count; ++i) {
- i_color c;
- for (ch = 0; ch < 3; ++ch) {
- c.channel[ch] = Sample16To8(maps[ch][i]);
- }
- i_addcolors(state->img, &c, 1);
- }
-
- return 1;
-}
-
-static int
-tile_contig_getter(read_state_t *state, read_putter_t putter) {
- uint32 tile_width, tile_height;
- uint32 this_tile_height, this_tile_width;
- uint32 rows_left, cols_left;
- uint32 x, y;
-
- state->raster = _TIFFmalloc(TIFFTileSize(state->tif));
- if (!state->raster) {
- i_push_error(0, "tiff: Out of memory allocating tile buffer");
- return 0;
- }
-
- TIFFGetField(state->tif, TIFFTAG_TILEWIDTH, &tile_width);
- TIFFGetField(state->tif, TIFFTAG_TILELENGTH, &tile_height);
- rows_left = state->height;
- for (y = 0; y < state->height; y += this_tile_height) {
- this_tile_height = rows_left > tile_height ? tile_height : rows_left;
-
- cols_left = state->width;
- for (x = 0; x < state->width; x += this_tile_width) {
- this_tile_width = cols_left > tile_width ? tile_width : cols_left;
-
- if (TIFFReadTile(state->tif,
- state->raster,
- x, y, 0, 0) < 0) {
- if (!state->allow_incomplete) {
- return 0;
- }
- }
- else {
- putter(state, x, y, this_tile_width, this_tile_height, tile_width - this_tile_width);
- }
-
- cols_left -= this_tile_width;
- }
-
- rows_left -= this_tile_height;
- }
-
- return 1;
-}
-
-static int
-strip_contig_getter(read_state_t *state, read_putter_t putter) {
- uint32 rows_per_strip;
- tsize_t strip_size = TIFFStripSize(state->tif);
- uint32 y, strip_rows, rows_left;
-
- state->raster = _TIFFmalloc(strip_size);
- if (!state->raster) {
- i_push_error(0, "tiff: Out of memory allocating strip buffer");
- return 0;
- }
-
- TIFFGetFieldDefaulted(state->tif, TIFFTAG_ROWSPERSTRIP, &rows_per_strip);
- rows_left = state->height;
- for (y = 0; y < state->height; y += strip_rows) {
- strip_rows = rows_left > rows_per_strip ? rows_per_strip : rows_left;
- if (TIFFReadEncodedStrip(state->tif,
- TIFFComputeStrip(state->tif, y, 0),
- state->raster,
- strip_size) < 0) {
- if (!state->allow_incomplete)
- return 0;
- }
- else {
- putter(state, 0, y, state->width, strip_rows, 0);
- }
- rows_left -= strip_rows;
- }
-
- return 1;
-}
-
-static int
-paletted_putter8(read_state_t *state, int x, int y, int width, int height, int extras) {
- unsigned char *p = state->raster;
-
- state->pixels_read += (unsigned long) width * height;
- while (height > 0) {
- i_ppal(state->img, x, x + width, y, p);
- p += width + extras;
- --height;
- ++y;
- }
-
- return 1;
-}
-
-static int
-paletted_putter4(read_state_t *state, int x, int y, int width, int height, int extras) {
- uint32 img_line_size = (width + 1) / 2;
- uint32 skip_line_size = (width + extras + 1) / 2;
- unsigned char *p = state->raster;
-
- if (!state->line_buf)
- state->line_buf = mymalloc(state->width);
-
- state->pixels_read += (unsigned long) width * height;
- while (height > 0) {
- unpack_4bit_to(state->line_buf, p, img_line_size);
- i_ppal(state->img, x, x + width, y, state->line_buf);
- p += skip_line_size;
- --height;
- ++y;
- }
-
- return 1;
-}
-
-static void
-rgb_channels(read_state_t *state, int *out_channels) {
- uint16 extra_count;
- uint16 *extras;
-
- /* safe defaults */
- *out_channels = 3;
- state->alpha_chan = 0;
- state->scale_alpha = 0;
-
- /* plain RGB */
- if (state->samples_per_pixel == 3)
- return;
-
- if (!TIFFGetField(state->tif, TIFFTAG_EXTRASAMPLES, &extra_count, &extras)) {
- mm_log((1, "tiff: samples != 3 but no extra samples tag\n"));
- return;
- }
-
- if (!extra_count) {
- mm_log((1, "tiff: samples != 3 but no extra samples listed"));
- return;
- }
-
- ++*out_channels;
- state->alpha_chan = 3;
- switch (*extras) {
- case EXTRASAMPLE_UNSPECIFIED:
- case EXTRASAMPLE_ASSOCALPHA:
- state->scale_alpha = 1;
- break;
-
- case EXTRASAMPLE_UNASSALPHA:
- state->scale_alpha = 0;
- break;
-
- default:
- mm_log((1, "tiff: unknown extra sample type %d, treating as assoc alpha\n",
- *extras));
- state->scale_alpha = 1;
- break;
- }
- mm_log((1, "tiff alpha channel %d scale %d\n", state->alpha_chan, state->scale_alpha));
-}
-
-static void
-grey_channels(read_state_t *state, int *out_channels) {
- uint16 extra_count;
- uint16 *extras;
-
- /* safe defaults */
- *out_channels = 1;
- state->alpha_chan = 0;
- state->scale_alpha = 0;
-
- /* plain grey */
- if (state->samples_per_pixel == 1)
- return;
-
- if (!TIFFGetField(state->tif, TIFFTAG_EXTRASAMPLES, &extra_count, &extras)) {
- mm_log((1, "tiff: samples != 1 but no extra samples tag\n"));
- return;
- }
-
- if (!extra_count) {
- mm_log((1, "tiff: samples != 1 but no extra samples listed"));
- return;
- }
-
- ++*out_channels;
- state->alpha_chan = 1;
- switch (*extras) {
- case EXTRASAMPLE_UNSPECIFIED:
- case EXTRASAMPLE_ASSOCALPHA:
- state->scale_alpha = 1;
- break;
-
- case EXTRASAMPLE_UNASSALPHA:
- state->scale_alpha = 0;
- break;
-
- default:
- mm_log((1, "tiff: unknown extra sample type %d, treating as assoc alpha\n",
- *extras));
- state->scale_alpha = 1;
- break;
- }
-}
-
-static int
-setup_16_rgb(read_state_t *state) {
- int out_channels;
-
- rgb_channels(state, &out_channels);
-
- state->img = i_img_16_new(state->width, state->height, out_channels);
- if (!state->img)
- return 0;
- state->line_buf = mymalloc(sizeof(unsigned) * state->width * out_channels);
-
- return 1;
-}
-
-static int
-setup_16_grey(read_state_t *state) {
- int out_channels;
-
- grey_channels(state, &out_channels);
-
- state->img = i_img_16_new(state->width, state->height, out_channels);
- if (!state->img)
- return 0;
- state->line_buf = mymalloc(sizeof(unsigned) * state->width * out_channels);
-
- return 1;
-}
-
-static int
-putter_16(read_state_t *state, int x, int y, int width, int height,
- int row_extras) {
- uint16 *p = state->raster;
- int out_chan = state->img->channels;
-
- state->pixels_read += (unsigned long) width * height;
- while (height > 0) {
- int i;
- int ch;
- unsigned *outp = state->line_buf;
-
- for (i = 0; i < width; ++i) {
- for (ch = 0; ch < out_chan; ++ch) {
- outp[ch] = p[ch];
- }
- if (state->alpha_chan && state->scale_alpha && outp[state->alpha_chan]) {
- for (ch = 0; ch < state->alpha_chan; ++ch) {
- int result = 0.5 + (outp[ch] * 65535.0 / outp[state->alpha_chan]);
- outp[ch] = CLAMP16(result);
- }
- }
- p += state->samples_per_pixel;
- outp += out_chan;
- }
-
- i_psamp_bits(state->img, x, x + width, y, state->line_buf, NULL, out_chan, 16);
-
- p += row_extras * state->samples_per_pixel;
- --height;
- ++y;
- }
-
- return 1;
-}
-
-static int
-setup_8_rgb(read_state_t *state) {
- int out_channels;
-
- rgb_channels(state, &out_channels);
-
- state->img = i_img_8_new(state->width, state->height, out_channels);
- if (!state->img)
- return 0;
- state->line_buf = mymalloc(sizeof(unsigned) * state->width * out_channels);
-
- return 1;
-}
-
-static int
-setup_8_grey(read_state_t *state) {
- int out_channels;
-
- grey_channels(state, &out_channels);
-
- state->img = i_img_8_new(state->width, state->height, out_channels);
- if (!state->img)
- return 0;
- state->line_buf = mymalloc(sizeof(i_color) * state->width * out_channels);
-
- return 1;
-}
-
-static int
-putter_8(read_state_t *state, int x, int y, int width, int height,
- int row_extras) {
- unsigned char *p = state->raster;
- int out_chan = state->img->channels;
-
- state->pixels_read += (unsigned long) width * height;
- while (height > 0) {
- int i;
- int ch;
- i_color *outp = state->line_buf;
-
- for (i = 0; i < width; ++i) {
- for (ch = 0; ch < out_chan; ++ch) {
- outp->channel[ch] = p[ch];
- }
- if (state->alpha_chan && state->scale_alpha
- && outp->channel[state->alpha_chan]) {
- for (ch = 0; ch < state->alpha_chan; ++ch) {
- int result = (outp->channel[ch] * 255 + 127) / outp->channel[state->alpha_chan];
-
- outp->channel[ch] = CLAMP8(result);
- }
- }
- p += state->samples_per_pixel;
- outp++;
- }
-
- i_plin(state->img, x, x + width, y, state->line_buf);
-
- p += row_extras * state->samples_per_pixel;
- --height;
- ++y;
- }
-
- return 1;
-}
-
-static int
-setup_32_rgb(read_state_t *state) {
- int out_channels;
-
- rgb_channels(state, &out_channels);
-
- state->img = i_img_double_new(state->width, state->height, out_channels);
- if (!state->img)
- return 0;
- state->line_buf = mymalloc(sizeof(i_fcolor) * state->width);
-
- return 1;
-}
-
-static int
-setup_32_grey(read_state_t *state) {
- int out_channels;
-
- grey_channels(state, &out_channels);
-
- state->img = i_img_double_new(state->width, state->height, out_channels);
- if (!state->img)
- return 0;
- state->line_buf = mymalloc(sizeof(i_fcolor) * state->width);
-
- return 1;
-}
-
-static int
-putter_32(read_state_t *state, int x, int y, int width, int height,
- int row_extras) {
- uint32 *p = state->raster;
- int out_chan = state->img->channels;
-
- state->pixels_read += (unsigned long) width * height;
- while (height > 0) {
- int i;
- int ch;
- i_fcolor *outp = state->line_buf;
-
- for (i = 0; i < width; ++i) {
- for (ch = 0; ch < out_chan; ++ch) {
- outp->channel[ch] = p[ch] / 4294967295.0;
- }
- if (state->alpha_chan && state->scale_alpha && outp->channel[state->alpha_chan]) {
- for (ch = 0; ch < state->alpha_chan; ++ch)
- outp->channel[ch] /= outp->channel[state->alpha_chan];
- }
- p += state->samples_per_pixel;
- outp++;
- }
-
- i_plinf(state->img, x, x + width, y, state->line_buf);
-
- p += row_extras * state->samples_per_pixel;
- --height;
- ++y;
- }
-
- return 1;
-}
-
-static int
-setup_bilevel(read_state_t *state) {
- i_color black, white;
- state->img = i_img_pal_new(state->width, state->height, 1, 256);
- if (!state->img)
- return 0;
- black.channel[0] = black.channel[1] = black.channel[2] =
- black.channel[3] = 0;
- white.channel[0] = white.channel[1] = white.channel[2] =
- white.channel[3] = 255;
- if (state->photometric == PHOTOMETRIC_MINISBLACK) {
- i_addcolors(state->img, &black, 1);
- i_addcolors(state->img, &white, 1);
- }
- else {
- i_addcolors(state->img, &white, 1);
- i_addcolors(state->img, &black, 1);
- }
- state->line_buf = mymalloc(state->width);
-
- return 1;
-}
-
-static int
-putter_bilevel(read_state_t *state, int x, int y, int width, int height,
- int row_extras) {
- unsigned char *line_in = state->raster;
- size_t line_size = (width + row_extras + 7) / 8;
-
- /* tifflib returns the bits in MSB2LSB order even when the file is
- in LSB2MSB, so we only need to handle MSB2LSB */
- state->pixels_read += (unsigned long) width * height;
- while (height > 0) {
- int i;
- unsigned char *outp = state->line_buf;
- unsigned char *inp = line_in;
- unsigned mask = 0x80;
-
- for (i = 0; i < width; ++i) {
- *outp++ = *inp & mask ? 1 : 0;
- mask >>= 1;
- if (!mask) {
- ++inp;
- mask = 0x80;
- }
- }
-
- i_ppal(state->img, x, x + width, y, state->line_buf);
-
- line_in += line_size;
- --height;
- ++y;
- }
-
- return 1;
-}
-
-static void
-cmyk_channels(read_state_t *state, int *out_channels) {
- uint16 extra_count;
- uint16 *extras;
-
- /* safe defaults */
- *out_channels = 3;
- state->alpha_chan = 0;
- state->scale_alpha = 0;
-
- /* plain CMYK */
- if (state->samples_per_pixel == 4)
- return;
-
- if (!TIFFGetField(state->tif, TIFFTAG_EXTRASAMPLES, &extra_count, &extras)) {
- mm_log((1, "tiff: CMYK samples != 4 but no extra samples tag\n"));
- return;
- }
-
- if (!extra_count) {
- mm_log((1, "tiff: CMYK samples != 4 but no extra samples listed"));
- return;
- }
-
- ++*out_channels;
- state->alpha_chan = 4;
- switch (*extras) {
- case EXTRASAMPLE_UNSPECIFIED:
- case EXTRASAMPLE_ASSOCALPHA:
- state->scale_alpha = 1;
- break;
-
- case EXTRASAMPLE_UNASSALPHA:
- state->scale_alpha = 0;
- break;
-
- default:
- mm_log((1, "tiff: unknown extra sample type %d, treating as assoc alpha\n",
- *extras));
- state->scale_alpha = 1;
- break;
- }
-}
-
-static int
-setup_cmyk8(read_state_t *state) {
- int channels;
-
- cmyk_channels(state, &channels);
- state->img = i_img_8_new(state->width, state->height, channels);
-
- state->line_buf = mymalloc(sizeof(i_color) * state->width);
-
- return 1;
-}
-
-static int
-putter_cmyk8(read_state_t *state, int x, int y, int width, int height,
- int row_extras) {
- unsigned char *p = state->raster;
-
- state->pixels_read += (unsigned long) width * height;
- while (height > 0) {
- int i;
- int ch;
- i_color *outp = state->line_buf;
-
- for (i = 0; i < width; ++i) {
- unsigned char c, m, y, k;
- c = p[0];
- m = p[1];
- y = p[2];
- k = 255 - p[3];
- outp->rgba.r = (k * (255 - c)) / 255;
- outp->rgba.g = (k * (255 - m)) / 255;
- outp->rgba.b = (k * (255 - y)) / 255;
- if (state->alpha_chan) {
- outp->rgba.a = p[state->alpha_chan];
- if (state->scale_alpha
- && outp->rgba.a) {
- for (ch = 0; ch < 3; ++ch) {
- int result = (outp->channel[ch] * 255 + 127) / outp->rgba.a;
- outp->channel[ch] = CLAMP8(result);
- }
- }
- }
- p += state->samples_per_pixel;
- outp++;
- }
-
- i_plin(state->img, x, x + width, y, state->line_buf);
-
- p += row_extras * state->samples_per_pixel;
- --height;
- ++y;
- }
-
- return 1;
-}
-
-static int
-setup_cmyk16(read_state_t *state) {
- int channels;
-
- cmyk_channels(state, &channels);
- state->img = i_img_16_new(state->width, state->height, channels);
-
- state->line_buf = mymalloc(sizeof(unsigned) * state->width * channels);
-
- return 1;
-}
-
-static int
-putter_cmyk16(read_state_t *state, int x, int y, int width, int height,
- int row_extras) {
- uint16 *p = state->raster;
- int out_chan = state->img->channels;
-
- mm_log((4, "putter_cmyk16(%p, %d, %d, %d, %d, %d)\n", x, y, width, height, row_extras));
-
- state->pixels_read += (unsigned long) width * height;
- while (height > 0) {
- int i;
- int ch;
- unsigned *outp = state->line_buf;
-
- for (i = 0; i < width; ++i) {
- unsigned c, m, y, k;
- c = p[0];
- m = p[1];
- y = p[2];
- k = 65535 - p[3];
- outp[0] = (k * (65535U - c)) / 65535U;
- outp[1] = (k * (65535U - m)) / 65535U;
- outp[2] = (k * (65535U - y)) / 65535U;
- if (state->alpha_chan) {
- outp[3] = p[state->alpha_chan];
- if (state->scale_alpha
- && outp[3]) {
- for (ch = 0; ch < 3; ++ch) {
- int result = (outp[ch] * 65535 + 32767) / outp[3];
- outp[3] = CLAMP16(result);
- }
- }
- }
- p += state->samples_per_pixel;
- outp += out_chan;
- }
-
- i_psamp_bits(state->img, x, x + width, y, state->line_buf, NULL, out_chan, 16);
-
- p += row_extras * state->samples_per_pixel;
- --height;
- ++y;
- }
-
- return 1;
-}
-
-/*
-
- Older versions of tifflib we support don't define this, so define it
- ourselves.
-
- If you want this detection to do anything useful, use a newer
- release of tifflib.
-
- */
-#if TIFFLIB_VERSION < 20031121
-
-int
-TIFFIsCODECConfigured(uint16 scheme) {
- switch (scheme) {
- /* these schemes are all shipped with tifflib */
- case COMPRESSION_NONE:
- case COMPRESSION_PACKBITS:
- case COMPRESSION_CCITTRLE:
- case COMPRESSION_CCITTRLEW:
- case COMPRESSION_CCITTFAX3:
- case COMPRESSION_CCITTFAX4:
- return 1;
-
- /* these require external library support */
- default:
- case COMPRESSION_JPEG:
- case COMPRESSION_LZW:
- case COMPRESSION_DEFLATE:
- case COMPRESSION_ADOBE_DEFLATE:
- return 0;
- }
-}
-
-#endif
-
-static int
-myTIFFIsCODECConfigured(uint16 scheme) {
-#if TIFFLIB_VERSION < 20040724
- if (scheme == COMPRESSION_LZW)
- return 0;
-#endif
-
- return TIFFIsCODECConfigured(scheme);
-}
-
-/*
-=back
-
-=head1 AUTHOR
-
-Arnar M. Hrafnkelsson <addi@umich.edu>, Tony Cook <tony@imager.perl.org>
-
-=head1 SEE ALSO
-
-Imager(3)
-
-=cut
-*/