Image-Info-1.42/0000755000175000017500000000000013552530424012716 5ustar eserteeserteImage-Info-1.42/lib/0000755000175000017500000000000013552530422013462 5ustar eserteeserteImage-Info-1.42/lib/Bundle/0000755000175000017500000000000013552530422014673 5ustar eserteeserteImage-Info-1.42/lib/Bundle/Image/0000755000175000017500000000000013552530422015715 5ustar eserteeserteImage-Info-1.42/lib/Bundle/Image/Info/0000755000175000017500000000000013552530422016610 5ustar eserteeserteImage-Info-1.42/lib/Bundle/Image/Info/XPM.pm0000644000175000017500000000110513063563214017611 0ustar eserteeserte# -*- perl -*- package Bundle::Image::Info::XPM; use strict; use vars qw($VERSION); $VERSION = '0.02'; 1; __END__ =head1 NAME Bundle::Image::Info::XPM - XPM (X11 pixmap) support for Image::Info =head1 SYNOPSIS =for test_synopsis BEGIN { die "SKIP: shell code\n"; } perl -MCPAN -e 'install Bundle::Image::Info::XPM' =head1 CONTENTS Image::Info 1.31 - the base Image::Info module Image::Xpm 1.10 - reading XPM files =head1 DESCRIPTION This bundle installs everything needed to get XPM support into L. =head1 AUTHOR Slaven Rezic =cut Image-Info-1.42/lib/Bundle/Image/Info/SVG.pm0000644000175000017500000000121713063563223017610 0ustar eserteeserte# -*- perl -*- package Bundle::Image::Info::SVG; use strict; use vars qw($VERSION); $VERSION = '0.02'; 1; __END__ =head1 NAME Bundle::Image::Info::SVG - SVG support for Image::Info =head1 SYNOPSIS =for test_synopsis BEGIN { die "SKIP: shell code\n"; } perl -MCPAN -e 'install Bundle::Image::Info::SVG' =head1 CONTENTS Image::Info - the base Image::Info module XML::LibXML::Reader - parsing the SVG file as XML data XML::Simple - convert SVG description elements into perl data structures =head1 DESCRIPTION This bundle installs everything needed to get SVG support into L. =head1 AUTHOR Slaven Rezic =cut Image-Info-1.42/lib/Bundle/Image/Info/XBM.pm0000644000175000017500000000107713063563163017606 0ustar eserteeserte# -*- perl -*- package Bundle::Image::Info::XBM; use strict; use vars qw($VERSION); $VERSION = '0.02'; 1; __END__ =head1 NAME Bundle::Image::Info::XBM - XBM (X11 bitmap) support for Image::Info =head1 SYNOPSIS =for test_synopsis BEGIN { die "SKIP: shell code\n"; } perl -MCPAN -e 'install Bundle::Image::Info::XBM' =head1 CONTENTS Image::Info - the base Image::Info module Image::Xbm 1.07 - reading XBM files =head1 DESCRIPTION This bundle installs everything needed to get XBM support into L. =head1 AUTHOR Slaven Rezic =cut Image-Info-1.42/lib/Bundle/Image/Info/Everything.pm0000644000175000017500000000217113063563175021303 0ustar eserteeserte# -*- perl -*- package Bundle::Image::Info::Everything; use strict; use vars qw($VERSION); $VERSION = '0.02'; 1; __END__ =head1 NAME Bundle::Image::Info::Everything - complete support for Image::Info =head1 SYNOPSIS =for test_synopsis BEGIN { die "SKIP: shell code\n"; } perl -MCPAN -e 'install Bundle::Image::Info::Everything' =head1 CONTENTS Image::Info - the base Image::Info module Compress::Zlib - everything for PNG processing XML::LibXML::Reader - everything for SVG processing XML::Simple - everything for SVG processing Image::Xbm 1.07 - everything for XBM processing Image::Xpm 1.10 - everything for XPM processing =head1 DESCRIPTION This bundle installs everything needed for L. =head2 SOURCE LIST The L list is created by manually resolving all the contents in the following Bundle files: =over =item Bundle::Image::Info::PNG =item Bundle::Image::Info::SVG =item Bundle::Image::Info::XBM =item Bundle::Image::Info::XPM =back Unfortunately the L module cannot cope with recursively defined Bundles, so this had to be done. =head1 AUTHOR Slaven Rezic =cut Image-Info-1.42/lib/Bundle/Image/Info/PNG.pm0000644000175000017500000000124113063563204017571 0ustar eserteeserte# -*- perl -*- package Bundle::Image::Info::PNG; use strict; use vars qw($VERSION); $VERSION = '0.02'; 1; __END__ =head1 NAME Bundle::Image::Info::PNG - full PNG support for Image::Info =head1 SYNOPSIS =for test_synopsis BEGIN { die "SKIP: shell code\n"; } perl -MCPAN -e 'install Bundle::Image::Info::PNG' =head1 CONTENTS Image::Info - the base Image::Info module Compress::Zlib - reading compressed zTXt chunks in PNG files =head1 DESCRIPTION This bundle installs everything needed to get full PNG support into L. Without L the ability to decompress zTXt chunks is missing. =head1 AUTHOR Slaven Rezic =cut Image-Info-1.42/lib/Image/0000755000175000017500000000000013552530422014504 5ustar eserteeserteImage-Info-1.42/lib/Image/Info/0000755000175000017500000000000013552530422015377 5ustar eserteeserteImage-Info-1.42/lib/Image/Info/XPM.pm0000644000175000017500000001402712445127561016413 0ustar eserteesertepackage Image::Info::XPM; $VERSION = '1.09'; use strict; use Image::Xpm 1.09; sub process_file{ my($info, $source, $opts) = @_; local $SIG{__WARN__} = sub { $info->push_info(0, "Warn", shift); }; my $i = Image::Xpm->new(-width => 0, -height => 0); # loading the file as a separate step avoids a "-r" test, this would # file with in-memory strings (aka fake files) $i->load($source); $info->push_info(0, "color_type" => "Indexed-RGB"); $info->push_info(0, "file_ext" => "xpm"); $info->push_info(0, "file_media_type" => "image/x-xpixmap"); $info->push_info(0, "height", $i->get(-height)); $info->push_info(0, "resolution", "1/1"); $info->push_info(0, "width", $i->get(-width)); $info->push_info(0, "BitsPerSample" => 8); $info->push_info(0, "SamplesPerPixel", 1); $info->push_info(0, "XPM_CharactersPerPixel" => $i->get(-cpp) ); # XXX is this always? $info->push_info(0, "ColorResolution", 8); $info->push_info(0, "ColorTableSize" => $i->get(-ncolours) ); if( $opts->{ColorPalette} ){ $info->push_info(0, "ColorPalette" => [keys %{$i->get(-cindex)}] ); } if( $opts->{L1D_Histogram} ){ #Do Histograms my(%RGB, @l1dhist, $R, $G, $B, $color); for(my $y=0; $y<$i->get(-height); $y++){ for(my $x=0; $x<$i->get(-width); $x++){ $color = $i->xy($x, $y); if( $color =~ /^(none|opaque)$/i ) { next; } elsif( $color !~ /^#/ ){ unless( exists($RGB{white}) ){ local $_; if( open(RGB, _get_rgb_txt()) ){ while(){ next if /^\s*!/; /(\d+)\s+(\d+)\s+(\d+)\s+(.*)/; $RGB{$4}=[$1,$2,$3]; } } else{ $RGB{white} = "0 but true"; $info->push_info(0, "Warn", "Unable to open RGB database, you may need to set \$Image::Info::XPM::RGBLIB"); } } $R = $RGB{$color}->[0]; $G = $RGB{$color}->[1]; $B = $RGB{$color}->[2]; } elsif (length $color == 7) { $R = hex(substr($color,1,2)); $G = hex(substr($color,3,2)); $B = hex(substr($color,5,2)); } elsif (length $color == 13) { $R = hex(substr($color,1,2)); $G = hex(substr($color,5,2)); $B = hex(substr($color,9,2)); } elsif (length $color == 4) { $R = hex(substr($color,1,1))*16; $G = hex(substr($color,2,1))*16; $B = hex(substr($color,3,1))*16; } else { warn "Unexpected length in color specification '$color'"; } if( $opts->{L1D_Histogram} ){ $l1dhist[(.3*$R + .59*$G + .11*$B)]++; } } } if( $opts->{L1D_Histogram} ){ $info->push_info(0, "L1D_Histogram", [@l1dhist]); } } $info->push_info(0, "HotSpotX" => $i->get(-hotx) ); $info->push_info(0, "HotSpotY" => $i->get(-hoty) ); $info->push_info(0, 'XPM_Extension-'.ucfirst($i->get(-extname)) => $i->get(-extlines)) if $i->get(-extname); for (@{$i->get(-comments)}) { $info->push_info(0, "Comment", $_); } } sub _get_rgb_txt{ return $Image::Info::XPM::RGBLIB if defined $Image::Info::XPM::RGBLIB; # list taken from Tk::ColorEditor for my $try( '/usr/local/lib/X11/rgb.txt', '/usr/lib/X11/rgb.txt', '/usr/X11R6/lib/X11/rgb.txt', '/usr/local/X11R5/lib/X11/rgb.txt', '/X11/R5/lib/X11/rgb.txt', '/X11/R4/lib/rgb/rgb.txt', '/usr/openwin/lib/X11/rgb.txt', '/usr/share/X11/rgb.txt', # This is the Debian and RH5 location '/usr/X11/share/X11/rgb.txt', # seen on a Mac OS X 10.5.1 system '/usr/X11R6/share/X11/rgb.txt', # seen on a OpenBSD 4.2 system '/etc/X11R6/rgb.txt', '/etc/X11/rgb.txt', # seen on HP-UX 11.31 ){ if( -r $try ){ $Image::Info::XPM::RGBLIB = $try; return $try; } } undef; } 1; __END__ =head1 NAME Image::Info::XPM - XPM support for Image::Info =head1 SYNOPSIS use Image::Info qw(image_info dim); my $info = image_info("image.xpm"); if (my $error = $info->{error}) { die "Can't parse image info: $error\n"; } my $color = $info->{color_type}; my($w, $h) = dim($info); =head1 DESCRIPTION This modules supplies the standard key names except for Compression, Gamma, Interlace, LastModificationTime, as well as: =over =item ColorPalette Reference to an array of all colors used. This key is only present if C is invoked as C=1)>. =item ColorTableSize The number of colors the image uses. =item HotSpotX The x-coord of the image's hotspot. Set to -1 if there is no hotspot. =item HotSpotY The y-coord of the image's hotspot. Set to -1 if there is no hotspot. =item L1D_Histogram Reference to an array representing a one dimensional luminance histogram. This key is only present if C is invoked as C1)>. The range is from 0 to 255, however auto-vivification is used so a null field is also 0, and the array may not actually contain 255 fields. =item XPM_CharactersPerPixel This is typically 1 or 2. See L. =item XPM_Extension-.* XPM Extensions (the most common is XPMEXT) if present. =back =head1 METHODS =head2 process_file() $info->process_file($source, $options); Processes one file and sets the found info fields in the C<$info> object. =head1 FILES This module requires L I<$Image::Info::XPM::RGBLIB> is set to F or an equivalent path (see the C<_get_rgb_txt> function for the complete list) by default, this is used to resolve textual color names to their RGB counterparts. =head1 SEE ALSO L, L =head1 NOTES For more information about XPM see L =head1 CAVEATS While the module attempts to be as robust as possible, it may not recognize older XPMs (Versions 1-3), if this is the case try inserting S as the first line. =head1 AUTHOR Jerrad Pierce / Tels - (c) 2006. Now maintained by Slaven Rezic . This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut =begin register MAGIC: /(^\/\* XPM \*\/)|(static\s+char\s+\*\w+\[\]\s*=\s*{\s*"\d+)/ See L for details. =end register =cut Image-Info-1.42/lib/Image/Info/PPM.pm0000644000175000017500000000522011447413663016400 0ustar eserteesertepackage Image::Info::PPM; # Copyright 2000, Gisle Aas. # # This library is free software; you can redistribute it and/or # modify it under the same terms as Perl itself. =begin register MAGIC: /^P[1-6]/ =item PBM/PGM/PPM All information available is extracted. =end register =cut use strict; use vars qw/$VERSION/; $VERSION = 0.04; sub process_file { my($info, $fh) = @_; my @header; my $type; my $num_wanted = 3; my $binary; my $read_header; local($/, $_) = ("\n"); while (<$fh>) { if (s/#\s*(.*)//) { $info->push_info(0, "Comment", $1); } push(@header, split(' ')); if (!$type && @header) { $type = shift(@header); $type =~ s/^P// || die; $binary++ if $type > 3; $type = "p" . qw/p b g/[$type % 3] . "m"; $num_wanted = 2 if $type eq "pbm"; } for (@header) { unless (/^\d+$/) { die "Badly formatted $type file"; } $_ += 0; # strip leading zeroes } next unless @header >= $num_wanted; # Now we know everything there is to know... $read_header = 1; $info->push_info(0, "file_media_type" => "image/$type"); $info->push_info(0, "file_ext" => "$type"); $info->push_info(0, "width", shift @header); $info->push_info(0, "height", shift @header); $info->push_info(0, "resolution", "1/1"); if ($type eq "ppm") { my $MSV = shift @header; $info->push_info(0, "MaxSampleValue", $MSV); $info->push_info(0, "color_type", "RGB"); $info->push_info(0, "SamplesPerPixel", 3); if ($binary) { for (1..3) { $info->push_info(0, "BitsPerSample", int(log($MSV + 1) / log(2) ) ); } } } else { $info->push_info(0, "color_type", "Gray"); $info->push_info(0, "SamplesPerPixel", 1); $info->push_info(0, "BitsPerSample", ($type eq "pbm") ? 1 : 8) if $binary; $info->push_info(0, "MaxSampleValue", shift @header) if $type ne 'pbm'; } last; } if (!$read_header) { $info->push_info(0, 'error' => 'Incomplete PBM/PGM/PPM header'); } } 1; =pod =head1 NAME Image::Info::PPM - PPM support Image::Info =head1 SYNOPSIS use Image::Info qw(image_info dim); my $info = image_info("image.ppm"); if (my $error = $info->{error}) { die "Can't parse image info: $error\n"; } my($w, $h) = dim($info); =head1 DESCRIPTION This modules adds ppm support to L. It is loaded and used automatically. =head1 METHODS =head2 process_file() $info->process_file($source, $options); Processes one file and sets the found info fields in the C<$info> object. =head1 AUTHOR Gisle Aas. =head1 LICENSE This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut Image-Info-1.42/lib/Image/Info/WEBP.pm0000644000175000017500000001362413551664101016501 0ustar eserteeserte# -*- perl -*- # # Copyright (C) 2019 Preisvergleich Internet Services AG. All rights reserved. # This package is free software; you can redistribute it and/or # modify it under the same terms as Perl itself. # # File magic is # R I F F # length (4 bytes) # WEPB =begin register MAGIC: /^RIFF.{4}WEBP/s VP8 (lossy), VP8L (lossless) and VP8X (extended) files are supported. Sets the key C to true if the file is an animation. Otherwise sets the key C to either C or C. =end register =cut package Image::Info::WEBP; use strict; use warnings; use vars qw($VERSION); $VERSION = '0.01'; sub my_read { my($source, $len) = @_; my $buf; my $n = read($source, $buf, $len); die "read failed: $!" unless defined $n; die "short read ($len/$n) at pos " . tell($source) unless $n == $len; $buf; } my @upscale = (1, 5/4, 5/3, 2); sub process_file { my($info, $fh) = @_; my $signature = my_read($fh, 16); die "Bad WEBP signature" unless $signature =~ /\ARIFF....WEBPVP8([ LX])/s; my $type = $1; $info->push_info(0, "file_media_type" => "image/webp"); $info->push_info(0, "file_ext" => "webp"); # This code is (arguably) 4 bytes out of sync with the description in the # spec, because the spec describes ChunkHeader('ABCD') as an 8-byte quantity # and we've processed the first 4 bytes above, but need to handle the second # 4 (the length) here: if ($type eq 'X') { # 32 bits of length # 8 bits of flags # 24 bits reserved # 24 bits canvas width # 24 bits canvas height # and then chunks... my ($length, $flags, $raw_width, $raw_height) = unpack 'VVVv', my_read($fh, 14); # Of the 14 bytes now read, 10 were included in length: $length -= 10; die sprintf "Bad WEBP VP8X reserved bits 0x%02X", $flags & 0xC1 if $flags & 0xC1; die sprintf "Bad WEBP VP8X reserved bits 0x%06X", $flags >> 8 if $flags >> 8; # Shuffle the 24 bit values into shape: $raw_height = ($raw_height << 8) | ($raw_width >> 24); $raw_width &= 0xFFFFFF; # Strictly this is the canvas width/height, not that of the first frame. # But 1 image, that might be animated. Hence it doesn't quite map to the # "$n images in a file" model that Image::Info::GIF provides. $info->push_info(0, "width", 1 + $raw_width); $info->push_info(0, "height", 1 + $raw_height); if ($flags & 0x02) { $info->push_info(0, "Animation", 1); } else { # Possibly could also handle EXIF chunks here, although it's unclear # how much code that should share with # Image::Info::JPEG::process_app1_exif(), as that seems to have both # JPEG-specific logic, and more generic EXIF logic. while (1) { # Spec says that length is actual length, without accounting for # padding. Odd sizes are padded to the next even size: ++$length if $length & 1; die "seek failed: $!" unless seek $fh, $length, 1; my $buf; my $n = read $fh, $buf, 8; die "read failed: $!" unless defined $n; die "No VP8 or VP8L chunk found in WEPB Extended File Format" if $n == 0; die "short read (8/$n) at pos " . tell $fh unless $n == 8; (my $chunk, $length) = unpack "a4V", $buf; if ($chunk eq 'VP8 ') { $info->push_info(0, "Compression", "VP8"); last; } elsif ($chunk eq 'VP8L') { $info->push_info(0, "Compression", "Lossless"); last; } } } } elsif ($type eq 'L') { # There doesn't seem to be a better name for this: $info->push_info(0, "Compression", "Lossless"); # Discard the 4 bytes of length; grab the next 5. my ($sig, $size_and_flags) = unpack "x4CV", my_read($fh, 9); die sprintf "Bad WEBP Lossless signature 0x%02X", $sig unless $sig == 0x2f; my $version = $size_and_flags >> 30; die "Bad WEBP Lossless version $sig" unless $version == 0; $info->push_info(0, "width", 1 + $size_and_flags & 0x3FFF); $info->push_info(0, "height", 1 + ($size_and_flags >> 14) & 0x3FFF); } else { $info->push_info(0, "Compression", "VP8"); # The fun format for a key frame is # 32 bits of length # 24 bits of frame tag # 3 signature bytes # 2+14 bits of width # 2+14 bits of height # We don't have a pack format for 3 bytes, but the bits we need can be # got by approximating it as 2, 4, 2, 2: my ($type, $start, $raw_horiz, $raw_vert) = unpack "x4vVvv", my_read($fh, 14); die "Bad WEBP VP8 type 1 (ie interframe)" if $type & 1; $start >>= 8; die sprintf "Bad WEBP VP8 key frame start signature 0x%06X", $start unless $start == 0x2a019d; # The top two bits of the raw width and height values are used as to # flag a ratio to upscale. # However, testing against dwebp and webpmux and then re-checking the # documentation, it seems that these are really intended as information # for the video hardware to render the image, because they don't change # the size of bitmap returned from the decoder library. So return them # as extra information, but don't recalculate the width and height. $info->push_info(0, "width", ($raw_horiz & 0x3FFF)); $info->push_info(0, "height", ($raw_vert & 0x3FFF)); $info->push_info(0, "Width_Upscale", $upscale[$raw_horiz >> 14]); $info->push_info(0, "Height_Upscale", $upscale[$raw_vert >> 14]); } } Image-Info-1.42/lib/Image/Info/SVG/0000755000175000017500000000000013552530422016036 5ustar eserteeserteImage-Info-1.42/lib/Image/Info/SVG/XMLLibXMLReader.pm0000644000175000017500000000525713126167702021204 0ustar eserteeserte# -*- perl -*- # # $Id: Image_Info_SVG_LibXML.pm,v 1.2 2008/11/22 14:34:16 eserte Exp eserte $ # Author: Slaven Rezic # # Copyright (C) 2008,2009,2016 Slaven Rezic. All rights reserved. # This package is free software; you can redistribute it and/or # modify it under the same terms as Perl itself. # # Mail: slaven@rezic.de # WWW: http://www.rezic.de/eserte/ # package Image::Info::SVG::XMLLibXMLReader; use strict; use vars qw($VERSION); $VERSION = '1.05'; use XML::LibXML::Reader; sub process_file { my($info, $source) = @_; local $_; my(@comments, @warnings); local $SIG{__WARN__} = sub { push(@warnings, @_); }; my $reader = XML::LibXML::Reader->new(IO => $source, load_ext_dtd => 0, expand_entities => 0) or die "Cannot read SVG from handle '$source'"; while($reader->read) { last if $reader->nodeType == XML_READER_TYPE_ELEMENT; } # first XML element my $root_name = $reader->name; if ($root_name eq 'svg') { $info->push_info(0, 'height', $reader->getAttribute('height')); $info->push_info(0, 'width', $reader->getAttribute('width')); my $version = $reader->getAttribute('version') || 'unknown'; $info->push_info(0, 'SVG_Version', $version); } else { return $info->push_info(0, "error", "Not a valid SVG image, got a <$root_name>"); } my $desc; while($reader->read) { my $type = $reader->nodeType; if ($type == XML_READER_TYPE_COMMENT) { push @comments, $reader->value; } elsif ($type == XML_READER_TYPE_ELEMENT) { my $name = $reader->name; if (!$desc && $name eq 'desc') { require XML::Simple; # Don't take any chances which XML::SAX is defaulted # by the user. We know that we have XML::LibXML, so # use this one. local $XML::Simple::PREFERRED_PARSER = 'XML::LibXML::SAX::Parser'; my $xs = XML::Simple->new; my $desc_xml = $reader->readOuterXml; $desc = $xs->XMLin($desc_xml); } elsif ($name eq 'title') { my $title = $reader->copyCurrentNode(1)->textContent; $info->push_info(0, 'SVG_Title', $title) if $title; } elsif ($name eq 'image') { my $href = $reader->getAttribute('xlink:href'); $info->push_info(0, 'SVG_Image', $href) if $href; } } } $info->push_info(0, 'SVG_StandAlone', $reader->standalone == 1 ? "yes" : "no"); $info->push_info(0, 'ImageDescription', $desc) if $desc; $info->push_info(0, "color_type" => "sRGB"); $info->push_info(0, "file_ext" => "svg"); # "image/svg+xml" is the official MIME type $info->push_info(0, "file_media_type" => "image/svg+xml"); # XXX how to determine images? for (@comments) { $info->push_info(0, "Comment", $_); } for (@warnings) { $info->push_info(0, "Warn", $_); } } 1; __END__ Image-Info-1.42/lib/Image/Info/SVG/XMLSimple.pm0000644000175000017500000000455613221765740020226 0ustar eserteesertepackage Image::Info::SVG::XMLSimple; $VERSION = '1.05'; use strict; no strict 'refs'; use XML::Simple; sub process_file { my($info, $source) = @_; my(@comments, @warnings, %info, $comment, $img, $imgdata, $xs); local($_); while(<$source>){ if( ! exists($info{standalone}) && /standalone="(.+?)"/ ){ $info{standalone} = $1; } if( // ){ $comment .= $_; } if( /-->/ ){ $comment =~ s///; chomp($comment); push @comments, $comment; $comment = ''; } $imgdata .= $_; } if( $imgdata !~ /push_info(0, "error", "Not a valid SVG image"); } local $SIG{__WARN__} = sub { push(@warnings, @_); }; # XML::SAX::PurePerl is the only SAX parser which is not capable # of expanding external entities, so it's the only one not # vulnerable against XXE processing. On the other hand, # XML::SAX::PurePerl is probably the slowest parser, but for # speed one should use XML::LibXML instead. local $XML::Simple::PREFERRED_PARSER = 'XML::SAX::PurePerl'; $xs = XML::Simple->new; $img = $xs->XMLin($imgdata); # use Data::Dumper; print Dumper($img); $info->push_info(0, "color_type" => "sRGB"); $info->push_info(0, "file_ext" => "svg"); # "image/svg+xml" is the official MIME type $info->push_info(0, "file_media_type" => "image/svg+xml"); $info->push_info(0, "height", $img->{height}); $info->push_info(0, "width", $img->{width}); $info->push_info(0, "SVG_StandAlone", $info{standalone}); $info->push_info(0, "SVG_Version", $img->{version} || 'unknown'); # XXX Description, title etc. could be tucked away in a :-( $info->push_info(0, "ImageDescription", $img->{desc}) if $img->{desc}; $info->push_info(0, "SVG_Title", $img->{title}) if $img->{title}; # $info->push_info(0, "SamplesPerPixel", -1); # $info->push_info(0, "resolution", "1/1"); # $info->push_info(0, "BitsPerSample", 8); if( $img->{image} ){ if( ref($img->{image}) eq 'ARRAY' ){ foreach my $img (@{$img->{image}}){ $info->push_info(0, "SVG_Image", $img->{'xlink:href'}); } } else{ $info->push_info(0, "SVG_Image", $img->{image}->{'xlink:href'}); } } for (@comments) { $info->push_info(0, "Comment", $_); } for (@warnings) { $info->push_info(0, "Warn", $_); } } 1; __END__ ��������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/lib/Image/Info/TIFF.pm��������������������������������������������������������������0000644�0001750�0001750�00000015570�13131776466�016512� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������package Image::Info::TIFF; $VERSION = 0.05; use strict; use Config; use Carp qw(confess); use Image::TIFF; my @types = ( [ "ERROR INVALID TYPE", "?", 0], [ "BYTE", "C", 1], [ "ASCII", "A", 1], [ "SHORT", "S", 2], [ "LONG", "L", 4], [ "RATIONAL", "N2", 8], [ "SBYTE", "c", 1], [ "UNDEFINED", "a", 1], [ "SSHORT", "s", 2], [ "SLONG", "l", 4], [ "SRATIONAL", "N2", 8], [ "FLOAT", "f", 4], [ "DOUBLE", "d", 8], ); sub _hostbyteorder { my $hbo = $Config{byteorder}; # we only care about the order, not the length (for 64 bit, it might # be 12345678) if ($hbo =~ /^1234/) { return '1234' } if ($hbo =~ /4321$/) { return '4321' } die "Unexpected host byteorder: $hbo"; } sub _read { # read bytes, and move the file pointer forward my($source, $len) = @_; my $buf; my $n = read($source, $buf, $len); die "read failed: $!" unless defined $n; die "short read ($len/$n) at pos " . tell($source) unless $n == $len; $buf; } sub _readbytes { # read bytes, but make the file pointer stand still my ($fh,$offset,$len) = @_; my $curoffset = tell($fh); my $buf; seek($fh,$offset,0); my $n = read($fh,$buf,$len); confess("short read($n/$len)") unless $n == $len; # back to before. seek($fh,$curoffset,0); return $buf; } sub _readrational { my ($fh,$offset,$byteorder,$count,$ar,$signed) = @_; my $curoffset = tell($fh); my $buf; seek($fh,$offset,0); while ($count > 0) { my $num; my $denom; if ($signed) { $num = unpack("l",_read_order($fh,4,$byteorder)); $denom = unpack("l",_read_order($fh,4,$byteorder)); } else { $num = unpack("L",_read_order($fh,4,$byteorder)); $denom = unpack("L",_read_order($fh,4,$byteorder)); } push(@{$ar},new Image::TIFF::Rational($num,$denom)); $count--; } # back to before. seek($fh,$curoffset,0); } sub _read_order { my($source, $len,$byteorder) = @_; my $buf = _read($source,$len); # maybe reverse the read data? if ($byteorder ne _hostbyteorder()) { my @bytes = unpack("C$len",$buf); my @newbytes; # swap bytes for (my $i = $len-1; $i >= 0; $i--) { push(@newbytes,$bytes[$i]); } $buf = pack("C$len",@newbytes); } $buf; } my %order = ( "MM\x00\x2a" => '4321', "II\x2a\x00" => '1234', ); sub process_file { my($info, $fh) = @_; my $soi = _read($fh, 4); die "TIFF: SOI missing" unless (defined($order{$soi})); # XXX: should put this info in all pages? $info->push_info(0, "file_media_type" => "image/tiff"); $info->push_info(0, "file_ext" => "tif"); my $byteorder = $order{$soi}; my $ifdoff = unpack("L",_read_order($fh,4,$byteorder)); my $page = 0; do { # print "TIFF Directory at $ifdoff\n"; $ifdoff = _process_ifds($info,$fh,$page,0,$byteorder,$ifdoff); $page++; } while ($ifdoff); } sub _process_ifds { my($info, $fh, $page, $tagsseen, $byteorder, $ifdoffset) = @_; my $curpos = tell($fh); seek($fh,$ifdoffset,0); my $n = unpack("S",_read_order($fh, 2, $byteorder)); ## Number of entries my $i = 1; while ($n > 0) { # process one IFD entry my $tag = unpack("S",_read_order($fh,2,$byteorder)); my $fieldtype = unpack("S",_read_order($fh,2,$byteorder)); unless ($types[$fieldtype]) { my $warnmsg = "Unrecognised fieldtype $fieldtype, ignoring following entries"; warn "$warnmsg\n"; $info->push_info($page, "Warn" => $warnmsg); return 0; } my ($typename, $typepack, $typelen) = @{$types[$fieldtype]}; my $count = unpack("L",_read_order($fh,4,$byteorder)); my $value_offset_orig = _read_order($fh,4,$byteorder); my $value_offset = unpack("L", $value_offset_orig); my $val; ## The 4 bytes of $value_offset may actually contains the value itself, ## if it fits into 4 bytes. my $len = $typelen * $count; if ($len <= 4) { if (($byteorder ne _hostbyteorder()) && ($len != 4)) { my @bytes = unpack("C4", $value_offset_orig); for (my $i=0; $i < 4 - $len; $i++) { shift @bytes; } $value_offset_orig = pack("C$len", @bytes); } @$val = unpack($typepack x $count, $value_offset_orig); } elsif ($fieldtype == 2) { ## ASCII text. The last byte is a NUL, which we don't need ## to include in the Perl string, so read one less than the count. @$val = _readbytes($fh, $value_offset, $count - 1); } elsif ($fieldtype == 5) { ## Unsigned Rational $val = []; _readrational($fh,$value_offset,$byteorder,$count,$val,0); } elsif ($fieldtype == 10) { ## Signed Rational $val = []; _readrational($fh,$value_offset,$byteorder,$count,$val,1); } else { ## Just read $count thingies from the offset @$val = unpack($typepack x $count, _readbytes($fh, $value_offset, $typelen * $count)); } #look up tag my $tn = Image::TIFF->exif_tagname($tag); foreach my $v (@$val) { if (ref($tn)) { $v = $$tn{$v}; $tn = $$tn{__TAG__}; } } if ($tn eq "NewSubfileType") { # start new page if necessary if ($tagsseen) { $page++; $tagsseen = 0; } } else { $tagsseen = 1; } my $vval; ## If only one value, use direct if (@$val <= 1) { $val = $val->[0] || ''; $vval = $val; } else { $vval = '(' . join(',',@$val) . ')'; } # print "$page/$i:$value_offset:$tag ($tn), fieldtype: $fieldtype, count: $count = $vval\n"; if ($tn eq "ExifOffset") { # parse ExifSubIFD # print "ExifSubIFD at $value_offset\n"; _process_ifds($info,$fh,$page,$tagsseen,$byteorder,$value_offset); } $info->push_info($page, $tn => $val); $n--; $i++; } my $ifdoff = unpack("L",_read_order($fh,4,$byteorder)); #print "next dir at $ifdoff\n"; seek($fh,$curpos,0); return $ifdoff if $ifdoff; 0; } 1; __END__ =pod =head1 NAME Image::Info::TIFF - TIFF support for Image::Info =head1 SYNOPSIS use Image::Info qw(image_info dim); my $info = image_info("image.tif"); if (my $error = $info->{error}) { die "Can't parse image info: $error\n"; } print $info->{BitPerSample}; my($w, $h) = dim($info); =head1 DESCRIPTION This module adds TIFF support for Image::Info. =head1 METHODS =head2 process_file() $info->process_file($source, $options); Processes one file and sets the found info fields in the C<$info> object. =head1 SEE ALSO L =head1 AUTHOR Jerrad Pierce / Patches and fixes by Ben Wheeler. This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =begin register MAGIC: /^MM\x00\x2a/ MAGIC: /^II\x2a\x00/ The C spec can be found at: L The EXIF spec can be found at: L =end register =cut ����������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/lib/Image/Info/BMP.pm���������������������������������������������������������������0000644�0001750�0001750�00000013075�12507510212�016353� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������package Image::Info::BMP; $VERSION = '1.04'; use strict; use constant _CAN_LITTLE_ENDIAN_PACK => $] >= 5.009002; sub process_file { my($info, $source, $opts) = @_; my(@comments, @warnings, @header, %info, $buf, $total); read($source, $buf, 54) == 54 or die "Can't reread BMP header: $!"; @header = unpack((_CAN_LITTLE_ENDIAN_PACK ? "vVv2V2Vlpush_info(0, "color_type" => "Indexed-RGB"); } else{ $info->push_info(0, "color_type" => "RGB"); } $info->push_info(0, "file_media_type" => "image/bmp"); if( $header[10] == 1 || $header[10] == 2){ $info->push_info(0, "file_ext" => "rle"); } else{ $info->push_info(0, "file_ext" => "bmp"); # || dib } $info->push_info(0, "height", (_CAN_LITTLE_ENDIAN_PACK ? abs($header[7]) : ($header[7] >= 2**31 ? 2**32 - $header[7] : $header[7]) )); $info->push_info(0, "resolution", "$header[12]/$header[13]"); $info->push_info(0, "width", $header[6]); $info->push_info(0, "BitsPerSample" => $header[9]); $info->push_info(0, "SamplesPerPixel", $header[8]); $info->push_info(0, "BMP_ColorsImportant", $header[15]); $info->push_info(0, "BMP_Origin", $header[7]>1 ? 1 : 0 ); $info->push_info(0, "ColorTableSize", $header[14]); $info->push_info(0, "Compression", [ 'none', 'RLE8', 'RLE4', 'BITFIELDS', #V4 'JPEG', #V5 'PNG', #V5 ]->[$header[10]]); #Version 5 Header amendments # XXX Discard for now, need a test image if( $header[5] > 40 ){ read($source, $buf, $header[5]-40); # XXX test $total += length($buf); my @v5 = unpack("V38", $buf); splice(@v5, 5, 27); $info->push_info(0, "BMP_MaskRed", $v5[0]); $info->push_info(0, "BMP_MaskGreen", $v5[1]); $info->push_info(0, "BMP_MaskBlue", $v5[2]); $info->push_info(0, "BMP_MaskAlpha", $v5[3]); # $info->push_info(0, "BMP_color_type", $v5[4]); $info->push_info(0, "BMP_GammaRed", $v5[5]); $info->push_info(0, "BMP_GammaGreen", $v5[6]); $info->push_info(0, "BMP_GammaBlue", $v5[7]); } if( $header[9] < 24 && $opts->{ColorPalette} ){ my(@color, @palette); for(my $i=0; $i<$header[14]; $i++){ read($source, $buf, 4) == 4 or die "Can't read: $!"; $total += length($buf); @color = unpack("C3", $buf); # Damn M$, BGR instead of RGB push @palette, sprintf("#%02x%02x%02x", $color[2], $color[1], $color[0]); } $info->push_info(0, "ColorPalette", @palette); } #Verify size # XXX Cheat and do -s if it's an actual file? while( read($source, $buf, 1024) ){ $total += length($buf); } if( $header[1] != $total ){ push @warnings, "Size mismatch." } for (@comments) { $info->push_info(0, "Comment", $_); } for (@warnings) { $info->push_info(0, "Warn", $_); } } 1; __END__ =pod =head1 NAME Image::Info::BMP - Windows Device Independent Bitmap support for Image::Info =head1 SYNOPSIS use Image::Info qw(image_info dim); my $info = image_info("image.bmp"); if (my $error = $info->{error}) { die "Can't parse image info: $error\n"; } my $color = $info->{color_type}; my($w, $h) = dim($info); =head1 DESCRIPTION This module supplies the standard key names except for Gamma, Interlace, LastModificationTime, as well as: =over =item BMP_ColorsImportant Specifies the number of color indexes that are required for displaying the bitmap. If this value is zero, all colors are required. =item BMP_Origin If true the bitmap is a bottom-up DIB and its origin is the lower-left corner. Otherwise, the bitmap is a top-down DIB and its origin is the upper-left corner. =item ColorPalette Reference to an array of all colors used. This key is only present if C is invoked as C1)>. =item ColorTableSize The number of colors the image uses. If 0 then this is a true color image. The number of colors I is 2 ^ B. =back =head1 METHODS =head2 process_file() $info->process_file($source, $options); Processes one file and sets the found info fields in the C<$info> object. =head1 SEE ALSO L =head1 NOTES For more information about BMP see L. Random notes: warn if height is negative and compress is not RGB or BITFILEDS (0 or 3) ICO and CUR support? ### v5 If bit depth is 0, it relies upon underlying JPG/PNG :-( Extra Information DWORD bV5RedMask; DWORD bV5GreenMask; DWORD bV5BlueMask; DWORD bV5AlphaMask; DWORD bV5CSType; CIEXYZTRIPLE bV5EndPoints; #3*CIEXYZ #CIEXYZ = 3*FXPT2DOT30#FXPT2DOT30 = long DWORD bV5GammaRed; DWORD bV5GammaGreen; DWORD bV5GammaBlue; DWORD bV5Intent; DWORD bV5ProfileData; DWORD bV5ProfileSize; =head1 DIAGNOSTICS =over =item Size mismatch The image may be correct, but the filesize does not match the internally stored value. =back =head1 BUGS The current implementation only functions on little-endian architectures. Consequently erroneous data concerning compression (including B and B) may be reported. =head1 AUTHOR Jerrad Pierce / This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =begin register MAGIC: /^BM/ This module supports the Microsoft Device Independent Bitmap format (BMP, DIB, RLE). For more information see L. =end register =cut �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/lib/Image/Info/GIF.pm���������������������������������������������������������������0000644�0001750�0001750�00000014477�12507510212�016351� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������package Image::Info::GIF; $VERSION = '1.02'; # Copyright 1999-2000, Gisle Aas. # # This library is free software; you can redistribute it and/or # modify it under the same terms as Perl itself. =begin register MAGIC: /^GIF8[79]a/ Both GIF87a and GIF89a are supported and the version number is found as C for the first image. GIF files can contain multiple images, and information for all images will be returned if image_info() is called in list context. The Netscape-2.0 extension to loop animation sequences is represented by the C key for the first image. The value is either "forever" or a number indicating loop count. =end register =cut use strict; sub my_read { my($source, $len) = @_; my $buf; my $n = read($source, $buf, $len); die "read failed: $!" unless defined $n; die "short read ($len/$n) at pos " . tell($source) unless $n == $len; $buf; } sub read_data_blocks { my $source = shift; my @data; while (my $len = ord(my_read($source, 1))) { push(@data, my_read($source, $len)); } join("", @data); } sub seek_data_blocks { my $source = shift; while (my $len = ord(my_read($source, 1))) { seek($source, $len, 1); } } sub process_file { my($info, $fh) = @_; my $header = my_read($fh, 13); die "Bad GIF signature" unless $header =~ s/^GIF(8[79]a)//; my $version = $1; $info->push_info(0, "GIF_Version" => $version); # process logical screen descriptor my($sw, $sh, $packed, $bg, $aspect) = unpack("vvCCC", $header); $info->push_info(0, "ScreenWidth" => $sw); $info->push_info(0, "ScreenHeight" => $sh); my $color_table_size = 1 << (($packed & 0x07) + 1); $info->push_info(0, "ColorTableSize" => $color_table_size); $info->push_info(0, "SortedColors" => ($packed & 0x08) ? 1 : 0) if $version eq "89a"; $info->push_info(0, "ColorResolution", (($packed & 0x70) >> 4) + 1); my $global_color_table = $packed & 0x80; $info->push_info(0, "GlobalColorTableFlag" => $global_color_table ? 1 : 0); if ($global_color_table) { $info->push_info(0, "BackgroundColor", $bg); } if ($aspect) { $aspect = ($aspect + 15) / 64; $info->push_info(0, "PixelAspectRatio" => $aspect); # XXX is this correct???? $info->push_info(0, "resolution", "1/$aspect"); } else { $info->push_info(0, "resolution", "1/1"); } $info->push_info(0, "file_media_type" => "image/gif"); $info->push_info(0, "file_ext" => "gif"); # more?? if ($global_color_table) { my $color_table = my_read($fh, $color_table_size * 3); #$info->push_info(0, "GlobalColorTable", color_table($color_table)); } my $img_no = 0; my @comments; my @warnings; while (1) { last if eof($fh); # EOF my $intro = ord(my_read($fh, 1)); if ($intro == 0x3B) { # trailer (end of image) last; } elsif ($intro == 0x2C) { # new image if (@comments) { for (@comments) { $info->push_info(0, "Comment", $_); } @comments = (); } $info->push_info($img_no, "color_type" => "Indexed-RGB"); my($x_pos, $y_pos, $w, $h, $packed) = unpack("vvvvC", my_read($fh, 9)); $info->push_info($img_no, "XPosition", $x_pos); $info->push_info($img_no, "YPosition", $y_pos); $info->push_info($img_no, "width", $w); $info->push_info($img_no, "height", $h); if ($packed & 0x80) { # yes, we have a local color table my $ct_size = 1 << (($packed & 0x07) + 1); $info->push_info($img_no, "LColorTableSize" => $ct_size); my $color_table = my_read($fh, $ct_size * 3); } $info->push_info($img_no, "Interlace" => "GIF") if $packed & 0x40; my $lzw_code_size = ord(my_read($fh, 1)); #$info->push_info($img_no, "LZW_MininmCodeSize", $lzw_code_size); seek_data_blocks($fh); # skip image data $img_no++; } elsif ($intro == 0x21) { # GIF89a extension push(@warnings, "GIF 89a extensions in 87a") if $version eq "87a"; my $label = ord(my_read($fh, 1)); my $data = read_data_blocks($fh); if ($label == 0xF9 && length($data) == 4) { # Graphic Control my($packed, $delay, $trans_color) = unpack("CvC", $data); my $disposal_method = ($packed >> 2) & 0x07; $info->push_info($img_no, "DisposalMethod", $disposal_method) if $disposal_method; $info->push_info($img_no, "UserInput", 1) if $packed & 0x02; $info->push_info($img_no, "Delay" => $delay/100) if $delay; $info->push_info($img_no, "TransparencyIndex" => $trans_color) if $packed & 0x01; } elsif ($label == 0xFE) { # Comment $data =~ s/\0+$//; # is often NUL-terminated push(@comments, $data); } elsif ($label == 0xFF) { # Application my $app = substr($data, 0, 11, ""); my $auth = substr($app, -3, 3, ""); if ($app eq "NETSCAPE" && $auth eq "2.0" && $data =~ /^\01/) { my $loop = unpack("xv", $data); $loop = "forever" unless $loop; $info->push_info(0, "GIF_Loop" => $loop); } else { $info->push_info(0, "APP-$app-$auth" => $data); } } else { $info->push_info($img_no, "GIF_Extension-$label" => $data); } } else { push @warnings, "Unknown introduced code $intro, ignoring following chunks"; last; } } for (@comments) { $info->push_info(0, "Comment", $_); } for (@warnings) { $info->push_info(0, "Warn", $_); } } sub color_table { my @n = unpack("C*", shift); die "Color table not a multiple of 3" if @n % 3; my @table; while (@n) { my @triple = splice(@n, -3); push(@table, sprintf("#%02x%02x%02x", @triple)); } [reverse @table]; } 1; __END__ =pod =head1 NAME Image::Info::GIF - Graphics Interchange Format support for Image::Info =head1 SYNOPSIS use Image::Info qw(image_info dim); my $info = image_info("image.gif"); if (my $error = $info->{error}) { die "Can't parse image info: $error\n"; } my $color = $info->{color_type}; my($w, $h) = dim($info); =head1 DESCRIPTION This module supplies the standard key names as well as =over =item GIF_Loop The Netscape-2.0 extension to loop animation sequences is represented by the GIF_Loop key for the first image. The value is either "forever" or a number indicating loop count. =back head1 METHODS =head2 process_file() $info->process_file($source, $options); Processes one file and sets the found info fields in the C<$info> object. =head1 SEE ALSO L =cut �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/lib/Image/Info/JPEG.pm��������������������������������������������������������������0000644�0001750�0001750�00000021640�12231140626�016461� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������package Image::Info::JPEG; # Copyright 1999-2000, Gisle Aas. # # This library is free software; you can redistribute it and/or # modify it under the same terms as Perl itself. # maintained by Tels 2007 - 2008 $VERSION = 0.05; =begin register MAGIC: /^\xFF\xD8/ For JPEG files we extract information both from C and C application chunks. C is the file format written by most digital cameras. This encode things like timestamp, camera model, focal length, exposure time, aperture, flash usage, GPS position, etc. The C spec can be found at: L. The C element may have the following values: C, C, and C. Note that detecting C and C currently does not work, but will hopefully in future. =end register =cut use strict; my %sof = ( 0xC0 => "Baseline", 0xC1 => "Extended sequential", 0xC2 => "Progressive", 0xC3 => "Lossless", 0xC5 => "Differential sequential", 0xC6 => "Differential progressive", 0xC7 => "Differential lossless", 0xC9 => "Extended sequential, arithmetic coding", 0xCA => "Progressive, arithmetic coding", 0xCB => "Lossless, arithmetic coding", 0xCD => "Differential sequential, arithmetic coding", 0xCE => "Differential progressive, arithmetic coding", 0xCF => "Differential lossless, arithmetic coding", ); sub my_read { my($source, $len) = @_; my $buf; my $n = read($source, $buf, $len); die "read failed: $!" unless defined $n; die "short read ($len/$n) at pos " . tell($source) unless $n == $len; $buf; } BEGIN { my $f = ($] >= 5.008) ? <<'EOT' : <<'EOT'; sub with_io_string (&$) { open(my $fh, "<", \$_[1]); local $_ = $fh; &{$_[0]}; } EOT sub with_io_string (&$) { require IO::String; local $_ = IO::String->new($_[1]); &{$_[0]}; $_->close; } EOT #print $f; eval $f; die $@ if $@; } sub process_file { my($info, $fh, $cnf) = @_; _process_file($info, $fh, 0); } sub _process_file { my($info, $fh, $img_no) = @_; my $soi = my_read($fh, 2); unless ($soi eq "\xFF\xD8") { my $ofs = tell() - 2; die "SOI missing in JPEG file at offset $ofs"; } $info->push_info($img_no, "file_media_type" => "image/jpeg"); $info->push_info($img_no, "file_ext" => "jpg"); while (1) { my($ff, $mark) = unpack("CC", my_read($fh, 2)); last if !defined $ff; if ($ff != 0xFF) { my $corrupt_bytes = 2; while(1) { my($ff) = unpack("C", my_read($fh,1)); return if !defined $ff; last if $ff == 0xFF; $corrupt_bytes++; } $mark = unpack("C", my_read($fh,1)); $info->push_info($img_no, "Warn", sprintf("Corrupt JPEG data, $corrupt_bytes extraneous bytes before marker 0x%02x", $mark)); } if ($mark == 0xFF) { # JPEG markers can be padded with unlimited 0xFF's for (;;) { ($mark) = unpack("C", my_read($fh, 1)); last if $mark != 0xFF; } } last if $mark == 0xDA || $mark == 0xD9; # SOS/EOI my($len) = unpack("n", my_read($fh, 2)); last if $len < 2; process_chunk($info, $img_no, $mark, my_read($fh, $len - 2)); } } sub process_chunk { my($info, $img_no, $mark, $data) = @_; #printf "MARK 0x%02X, len=%d\n", $mark, length($data); if ($mark == 0xFE) { $info->push_info($img_no, Comment => $data); } elsif ($mark >= 0xE0 && $mark <= 0xEF) { process_app($info, $mark, $data) if $img_no == 0; } elsif ($sof{$mark}) { my($precision, $height, $width, $num_comp) = unpack("CnnC", substr($data, 0, 6, "")); $info->push_info($img_no, "JPEG_Type", $sof{$mark}); # fix bug #15167 by keeping the highest values my $old_w = $info->get_info($img_no, "width") || -1; my $old_h = $info->get_info($img_no, "height") || -1; $info->replace_info($img_no, "width", $width) if $old_w < $width; $info->replace_info($img_no, "height", $height) if $old_h < $height; for (1..$num_comp) { $info->push_info($img_no, "BitsPerSample", $precision); } $info->push_info($img_no, "SamplesPerPixel" => $num_comp); # XXX need to consider JFIF/Adobe markers to determine this... if ($num_comp == 1) { $info->push_info($img_no, "color_type" => "Gray"); } elsif ($num_comp == 3) { $info->push_info($img_no, "color_type" => "YCbCr"); # or RGB ? } elsif ($num_comp == 4) { $info->push_info($img_no, "color_type" => "CMYK"); # or YCCK ? } if (1) { my %comp_id_lookup = ( 1 => "Y", 2 => "Cb", 3 => "Cr", 82 => "R", 71 => "G", 66 => "B" ); while (length($data)) { my($comp_id, $hv, $qtable) = unpack("CCC", substr($data, 0, 3, "")); my $horiz_sf = $hv >> 4 & 0x0f; my $vert_sf = $hv & 0x0f; $comp_id = $comp_id_lookup{$comp_id} || $comp_id; $info->push_info($img_no, "ColorComponents", [$comp_id, $hv, $qtable]); $info->push_info($img_no, "ColorComponentsDecoded", { ComponentIdentifier => $comp_id, HorizontalSamplingFactor => $horiz_sf, VerticalSamplingFactor => $vert_sf, QuantizationTableDesignator => $qtable } ); } } } } sub process_app { my($info, $mark, $data) = @_; my $app = $mark - 0xE0; my $id = substr($data, 0, 5, ""); #$info->push_info(0, "Debug", "APP$app $id"); $id = "$app-$id"; if ($id eq "0-JFIF\0") { process_app0_jfif($info, $data); } elsif ($id eq "0-JFXX\0") { process_app0_jfxx($info, $data); } elsif ($id eq "1-Exif\0") { process_app1_exif($info, $data); } elsif ($id eq "14-Adobe") { process_app14_adobe($info, $data); } else { $info->push_info(0, "App$id", $data); #printf " %s\n", Data::Dump::dump($data); } } sub process_app0_jfif { my($info, $data) = @_; if (length $data < 9) { $info->push_info(0, "Debug", "Short JFIF chunk"); return; } my($ver_hi, $ver_lo, $unit, $x_density, $y_density, $x_thumb, $y_thumb) = unpack("CC C nn CC", substr($data, 0, 9, "")); $info->push_info(0, "JFIF_Version", sprintf("%d.%02d", $ver_hi, $ver_lo)); my $res = $x_density != $y_density || !$unit ? "$x_density/$y_density" : $x_density; if ($unit) { $unit = { 0 => "pixels", 1 => "dpi", 2 => "dpcm" }->{$unit} || "jfif-unit-$unit"; $res .= " $unit"; } $info->push_info(0, "resolution", $res); if ($x_thumb || $y_thumb) { $info->push_info(1, "width", $x_thumb); $info->push_info(1, "height", $y_thumb); $info->push_info(1, "ByteCount", length($data)); } } sub process_app0_jfxx { my($info, $data) = @_; my($code) = ord(substr($data, 0, 1, "")); $info->push_info(1, "JFXX_ImageType", { 0x10 => "JPEG thumbnail", 0x11 => "Bitmap thumbnail", 0x13 => "RGB thumbnail", }->{$code} || "Unknown extension code $code"); if ($code == 0x10) { eval { with_io_string { _process_file($info, $_, 1); } $data; }; $info->push_info(1, "error" => $@) if $@; } } sub process_app1_exif { my($info, $data) = @_; my $null = substr($data, 0, 1, ""); if ($null ne "\0") { $info->push_info(0, "Debug", "Exif chunk does not start with \\0"); return; } require Image::TIFF; my $t = Image::TIFF->new(\$data); for my $i (0 .. $t->num_ifds - 1) { my $ifd = $t->ifd($i); # use Data::Dumper; # print STDERR Dumper($ifd); for (@$ifd) { # use Devel::Peek; # print STDERR "# pushing info $i $_->[0] $_->[3]\n"; # print STDERR Devel::Peek::Dump($_->[3]),"\n" if $_->[0] =~ /Olympus-/; $info->push_info($i, $_->[0], $_->[3]); } # If we find JPEGInterchangeFormat/JPEGInterchangeFormatLngth, # then we should apply process_file kind of recursively to extract # information of this (thumbnail) image file... if (my($ipos) = $info->get_info($i, "JPEGInterchangeFormat", 1)) { my($ilen) = $info->get_info($i, "JPEGInterchangeFormatLength", 1); if ($ilen) { my $jdata = substr($data, $ipos, $ilen); #$info->push_info($i, "JPEGImage" => $jdata); if ($jdata) { with_io_string { _process_file($info, $_, $i); } $jdata; } } } # Turn XResolution/YResolution into 'resolution' my($xres) = $info->get_info($i, "XResolution", 1); my($yres) = $info->get_info($i, "YResolution", 1); # Samsung Digimax 200 is a totally confused camera that # puts rational numbers with 0 as denominator and they # also seem to not understand what resolution means. for ($xres, $yres) { $_ += 0 if ref($_) eq "Image::TIFF::Rational"; } my($unit) = $info->get_info($i, "ResolutionUnit", 1); my $res = "1/1"; # default; if ($xres && $yres) { $res = ($xres == $yres) ? $xres : "$xres/$yres"; } $res .= " $unit" if $unit && $unit ne "pixels"; $info->push_info($i, "resolution", $res); } } sub process_app14_adobe { my($info, $data) = @_; my($version, $flags0, $flags1, $transform) = unpack("nnnC", $data); $info->push_info(0, "AdobeTransformVersion" => $version); $info->push_info(0, "AdobeTransformFlags" => [$flags0, $flags1]); $info->push_info(0, "AdobeTransform" => $transform); } 1; ������������������������������������������������������������������������������������������������Image-Info-1.42/lib/Image/Info/SVG.pm���������������������������������������������������������������0000644�0001750�0001750�00000010054�13063563265�016404� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- perl -*- # # Author: Slaven Rezic # # Copyright (C) 2009,2011,2016,2017 Slaven Rezic. All rights reserved. # This package is free software; you can redistribute it and/or # modify it under the same terms as Perl itself. # package Image::Info::SVG; use strict; use vars qw($VERSION @PREFER_MODULE $USING_MODULE); $VERSION = '2.04'; @PREFER_MODULE = qw(Image::Info::SVG::XMLLibXMLReader Image::Info::SVG::XMLSimple ) if !@PREFER_MODULE; TRY_MODULE: { for my $try_module (@PREFER_MODULE) { if (eval qq{ require $try_module; 1 }) { my $sub = $try_module . '::process_file'; no strict 'refs'; *process_file = \&{$sub}; $USING_MODULE = $try_module; last TRY_MODULE; } } die "Cannot require any of @PREFER_MODULE...\n"; } 1; __END__ =pod =head1 NAME Image::Info::SVG - SVG support for Image::Info =head1 SYNOPSIS use Image::Info qw(image_info dim); my $info = image_info("image.svg"); if (my $error = $info->{error}) { die "Can't parse image info: $error\n"; } my $title = $info->{SVG_Title}; my($w, $h) = dim($info); =head1 DESCRIPTION This modules supplies the standard key names except for BitsPerSample, Compression, Gamma, Interlace, LastModificationTime, as well as: =over =item ImageDescription The image description, corresponds to . =item SVG_Image A scalar or reference to an array of scalars containing the URI's of embedded images (JPG or PNG) that are embedded in the image. =item SVG_StandAlone Whether or not the image is standalone. =item SVG_Title The image title, corresponds to =item SVG_Version The URI of the DTD the image conforms to. =back =head1 METHODS =head2 process_file() $info->process_file($source, $options); Processes one file and sets the found info fields in the C<$info> object. =head1 FILES This module requires either L<XML::LibXML::Reader> or L<XML::Simple>. =head1 COMPATIBILITY Previous versions (until Image-Info-1.28) used L<XML::Simple> as the underlying parser. Since Image-Info-1.29 the default parser is L<XML::LibXML::Reader> which is much more faster, memory-efficient, and does not rely on regular expressions for some aspects of XML parsing. If for some reason you need the old parser, you can force it by setting the variable C<@Image::Info::SVG::PREFER_MODULE> as early as possible: use Image::Info; @Image::Info::SVG::PREFER_MODULE = qw(Image::Info::SVG::XMLSimple Image::Info::SVG::XMLLibXMLReader); The variable C<$Image::Info::SVG::USING_MODULE> can be queried to see which parser is in use (after B<Image::Info::SVG> is required). Since 1.38_50 processing of XML external entities (XXE) is not done anymore for security reasons in both backends (B<Image::Info::SVG::XMLLibXMLReader> and B<Image::Info::SVG::XMLSimple>). Controlling XXE processing behavior in B<XML::Simple> is not really possible (see L<https://rt.cpan.org/Ticket/Display.html?id=83794>), so as a workaround the underlying SAX parser is fixed to L<XML::SAX::PurePerl> which is uncapable of processing external entities E<0x2014> but unfortunately it is also a slow parser. =head1 SEE ALSO L<Image::Info>, L<XML::LibXML::Reader>, L<XML::Simple>, L<XML::SAX::PurePerl> =head1 NOTES For more information about SVG see L<http://www.w3.org/Graphics/SVG/> Random notes: Colors # iterate over polygon,rect,circle,ellipse,line,polyline,text for style->stroke: style->fill:? # and iterate over each of these within <g> too?! and recurse?! # append <color>'s # perhaps even deep recursion through <svg>'s? ColorProfile <color-profile> RenderingIntent ? requiredFeatures requiredExtensions systemLanguage =head1 AUTHOR Jerrad Pierce <belg4mit@mit.edu>/<webmaster@pthbb.org> wrote the original code based on L<XML::Simple> Slaven Rezic <srezic@cpan.org> wrote the code using L<XML::LibXML::Reader> This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =begin register MAGIC: /^(<\?xml|[\012\015\t ]*<svg\b)/ Provides a plethora of attributes and metadata of an SVG vector graphic. =end register =cut ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/lib/Image/Info/XBM.pm���������������������������������������������������������������0000644�0001750�0001750�00000005323�12445127553�016375� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������package Image::Info::XBM; $VERSION = '1.08'; use strict; use Image::Xbm 1.07; sub process_file { my($info, $source, $opts) = @_; local $SIG{__WARN__} = sub { $info->push_info(0, "Warn", shift); }; my $i = Image::Xbm->new(-width => 0, -height => 0); # loading the file as a separate step avoids a "-r" test, this would # file with in-memory strings (aka fake files) $i->load($source); $info->push_info(0, "color_type" => "Grey"); $info->push_info(0, "file_ext" => "xbm"); $info->push_info(0, "file_media_type" => "image/x-xbitmap"); $info->push_info(0, "height", $i->get(-height)); $info->push_info(0, "resolution", "1/1"); $info->push_info(0, "width", $i->get(-width)); $info->push_info(0, "BitsPerSample" => 1); $info->push_info(0, "SamplesPerPixel", 1); $info->push_info(0, "ColorTableSize" => 2 ); if( $opts->{L1D_Histogram} ){ #Do Histogram my $imgdata = $i->as_binstring(); $info->push_info(0, "L1D_Histogram", [$imgdata =~ tr/0//d, $imgdata =~ tr/1//d ]); } $info->push_info(0, "HotSpotX" => $i->get(-hotx) ); $info->push_info(0, "HotSpotY" => $i->get(-hoty) ); } 1; __END__ =head1 NAME Image::Info::XBM - XBM support for Image::Info =head1 SYNOPSIS use Image::Info qw(image_info dim); my $info = image_info("image.xbm"); if (my $error = $info->{error}) { die "Can't parse image info: $error\n"; } my $color = $info->{color_type}; my($w, $h) = dim($info); =head1 DESCRIPTION This modules supplies the standard key names except for Compression, Gamma, Interlace, LastModificationTime, as well as: =over =item HotSpotX The x-coord of the image's hotspot. Set to -1 if there is no hotspot. =item HotSpotY The y-coord of the image's hotspot. Set to -1 if there is no hotspot. =item L1D_Histogram Reference to an array representing a one dimensional luminance histogram. This key is only present if C<image_info> is invoked as C<image_info($file, L1D_Histogram=E<gt>1)>. The range is from 0 to 1. =back =head1 METHODS =head2 process_file() $info->process_file($source, $options); Processes one file and sets the found info fields in the C<$info> object. =head1 AUTHOR =head1 FILES This module requires L<Image::Xbm> =head1 SEE ALSO L<Image::Info>, L<Image::Xbm> =head1 NOTES For more information about XBM see L<http://www.martinreddy.net/gfx/2d/XBM.txt>. =head1 AUTHOR Jerrad Pierce <belg4mit@mit.edu>/<webmaster@pthbb.org> Tels - (c) 2006 Current maintainer: Slaven Rezic <srezic@cpan.org> This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut =begin register MAGIC: /^(?:\/\*.*\*\/\n)?#define\s/ See L<Image::Info::XBM> for details. =end register =cut �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/lib/Image/Info/ICO.pm���������������������������������������������������������������0000644�0001750�0001750�00000003134�11302305677�016353� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������package Image::Info::ICO; $VERSION = '0.02'; # Copyright (C) 2009 Slaven Rezic. All rights reserved. # This package is free software; you can redistribute it and/or # modify it under the same terms as Perl itself. use strict; sub process_file { my($info, $fh) = @_; my $buf; if (read($fh, $buf, 6) != 6) { $info->push_info(0, 'error' => 'Short read (expected at least 6 bytes)'); return; } $info->push_info(0, 'file_media_type' => 'image/x-icon'); # XXX or is there already an official vnd format? $info->push_info(0, 'file_ext' => 'ico'); my($no_icons) = unpack('v', substr($buf, 4, 2)); for my $img_no (0 .. $no_icons-1) { if (read($fh, $buf, 16) != 16) { $info->push_info(0, 'error' => "Short read while getting information for image at index $img_no"); return; } my($width, $height, $colors, undef, # reserved undef, # $planes undef, # $bitcount undef, # $size_in_bytes undef, # $file_offset ) = unpack('CCCCvvVV', $buf); if ($colors == 0) { $colors = 256 } $info->push_info($img_no, 'width', $width); $info->push_info($img_no, 'height', $height); $info->push_info($img_no, 'color_type', 'Indexed-RGB'); $info->push_info($img_no, 'colors', $colors); } } 1; __END__ =head1 NAME Image::Info::ICO - Microsoft ICO support for Image::Info =head1 NOTES This module adds only support for MS Icon files, but not for cursor files. =head1 AUTHOR Slaven Rezic =head1 SEE ALSO L<Image::Info> =begin register MAGIC: /^\000\000\001\000/ This module supports the Microsoft Windows Icon Resource format (.ico). =end register =cut ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/lib/Image/Info/WBMP.pm��������������������������������������������������������������0000644�0001750�0001750�00000005140�12101452256�016477� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- perl -*- # # Copyright (C) 2013 Slaven Rezic. All rights reserved. # This package is free software; you can redistribute it and/or # modify it under the same terms as Perl itself. # package Image::Info::WBMP; use strict; use vars qw($VERSION @EXPORT_OK); $VERSION = '0.01'; require Exporter; *import = \&Exporter::import; @EXPORT_OK = qw(wbmp_image_info); sub process_file { my($info, $fh) = @_; # wbmp files have no magic, so no signature check $info->push_info(0, 'file_media_type' => 'image/vnd.wap.wbmp'); $info->push_info(0, 'file_ext' => 'wbmp'); # logic taken from netpbm's wbmptopbm.c and adapted to perl my $readint = sub { my $sum = 0; my $pos = 0; my $c; do { $c = ord(getc $fh); $sum = ($sum << 7*$pos++) | ($c & 0x7f); } while($c & 0x80); return $sum; }; my $readheader = sub { my $h = shift; if ($h & 0x60 == 0) { # type 00: read multi-byte bitfield my $c; do { $c = ord(getc $fh) } while($c & 0x80); } elsif ($h & 0x60 == 0x60) { # type 11: read name/value pair for(my $i=0; $i < (($h & 0x70) >> 4) + ($h & 0x0f); $i++) { getc $fh } } }; my $c; $c = $readint->(); $c == 0 or die "Unrecognized WBMP type (got $c)"; $c = ord(getc $fh); # FixHeaderField while($c & 0x80) { # ExtheaderFields $c = ord(getc $fh); $readheader->($c); } my $w = $readint->(); my $h = $readint->(); $info->push_info(0, 'width', $w); $info->push_info(0, 'height', $h); } sub wbmp_image_info { my $source = Image::Info::_source(shift); return $source if ref $source eq 'HASH'; # Pass on errors return Image::Info::_image_info_for_format('WBMP', $source); } 1; __END__ =head1 NAME Image::Info::WBMP - WBMP support for Image::Info =head1 SYNOPSIS use Image::Info qw(dim); use Image::Info::WBMP qw(wbmp_image_info); my $info = wbmp_image_info("image.xpm"); if (my $error = $info->{error}) { die "Can't parse image info: $error\n"; } my($w, $h) = dim($info); =head1 DESCRIPTION wbmp is a magic-less file format, so using L<Image::Info>'s C<image_info> or C<image_type> does not work here. Instead, the user has to determine the file type himself, e.g. by relying on the file suffix or mime type, and use the C<wbmp_image_info> function instead. The returned value looks the same like L<Image::Info>'s C<image_info> and may be used in a call to the C<dim> function. =head1 AUTHOR Slaven Rezic <srezic@cpan.org> =begin register NO MAGIC: true wbmp files have no magic, so cannot be used with the normal Image::Info functions. See L<Image::Info::WBMP> for more information. =end register =cut ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/lib/Image/Info/PNG.pm���������������������������������������������������������������0000644�0001750�0001750�00000011751�13125503601�016361� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������package Image::Info::PNG; # Copyright 1999-2000, Gisle Aas. # # This library is free software; you can redistribute it and/or # modify it under the same terms as Perl itself. =begin register MAGIC: /^\x89PNG\x0d\x0a\x1a\x0a/ Information from IHDR, PLTE, gAMA, pHYs, tEXt, tIME chunks are extracted. The sequence of chunks are also given by the C<PNG_Chunks> key. =end register =cut use strict; use vars qw/$VERSION/; $VERSION = 1.03; # Test for Compress::Zlib (for reading zTXt chunks) my $have_zlib = 0; eval { require Compress::Zlib; $have_zlib++; }; # Test for Encode (for reading iTXt chunks) my $have_encode = 0; eval { require Encode; $have_encode++; }; sub my_read { my($source, $len) = @_; my $buf; my $n = read($source, $buf, $len); die "read failed: $!" unless defined $n; die "short read ($len/$n) at pos " . tell($source) unless $n == $len; $buf; } sub process_file { my($info, $fh) = @_; my $signature = my_read($fh, 8); die "Bad PNG signature" unless $signature eq "\x89PNG\x0d\x0a\x1a\x0a"; $info->push_info(0, "file_media_type" => "image/png"); $info->push_info(0, "file_ext" => "png"); my @chunks; while (1) { my($len, $type) = unpack("Na4", my_read($fh, 8)); if (@chunks) { my $last = $chunks[-1]; my $count = 1; $count = $1 if $last =~ s/\s(\d+)$//; if ($last eq $type) { $count++; $chunks[-1] = "$type $count"; } else { push(@chunks, $type); } } else { push(@chunks, $type); } last if $type eq "IEND"; my $data = my_read($fh, $len + 4); my $crc = unpack("N", substr($data, -4, 4, "")); if ($type eq "IHDR" && $len == 13) { my($w, $h, $depth, $ctype, $compression, $filter, $interlace) = unpack("NNCCCCC", $data); $ctype = { 0 => "Gray", 2 => "RGB", 3 => "Indexed-RGB", 4 => "GrayA", 6 => "RGBA", }->{$ctype} || "PNG-$ctype"; $compression = "Deflate" if $compression == 0; $filter = "Adaptive" if $filter == 0; $interlace = "Adam7" if $interlace == 1; $info->push_info(0, "width", $w); $info->push_info(0, "height", $h); $info->push_info(0, "SampleFormat", "U$depth"); $info->push_info(0, "color_type", $ctype); $info->push_info(0, "Compression", $compression); $info->push_info(0, "PNG_Filter", $filter); $info->push_info(0, "Interlace", $interlace) if $interlace; } elsif ($type eq "PLTE") { my @table; while (length $data) { push(@table, sprintf("#%02x%02x%02x", unpack("C3", substr($data, 0, 3, "")))); } $info->push_info(0, "ColorPalette" => \@table); } elsif ($type eq "gAMA" && $len == 4) { $info->push_info(0, "Gamma", unpack("N", $data)/100_000); } elsif ($type eq "pHYs" && $len == 9) { my $res; my($res_x, $res_y, $unit) = unpack("NNC", $data); if (0 && $unit == 1) { # convert to dpi $unit = "dpi"; for ($res_x, $res_y) { $_ *= 0.0254; } } $res = ($res_x == $res_y) ? $res_x : "$res_x/$res_y"; if ($unit) { if ($unit == 1) { $res .= " dpm"; } else { $res .= " png-unit-$unit"; } } $info->push_info(0, "resolution" => $res) } elsif ($type eq "tEXt" || $type eq "zTXt" || $type eq "iTXt") { my($key, $val) = split(/\0/, $data, 2); my($method,$ctext,$is_i); if ($type eq "iTXt") { ++$is_i; (my $compressed, $method, my $lang, my $trans, $ctext) = unpack "CaZ*Z*a*", $val; unless ($compressed) { undef $method; $val = $ctext; } } elsif ($type eq "zTXt") { ($method,$ctext) = split(//, $val, 2); } if (defined $method) { if ($have_zlib && $method eq "\0") { $val = Compress::Zlib::uncompress($ctext); } else { undef $val; } } if ($is_i) { if ($have_encode) { $val = Encode::decode("UTF-8", $val); } else { undef $val; } } if (defined $val) { # XXX should make sure $key is not in conflict with any # other key we might generate $info->push_info(0, $key, $val); } else { $info->push_info(0, "Chunk-$type" => $data); } } elsif ($type eq "tIME" && $len == 7) { $info->push_info(0, "LastModificationTime", sprintf("%04d-%02d-%02d %02d:%02d:%02d", unpack("nC5", $data))); } elsif ($type eq "sBIT") { $info->push_info(0, "SignificantBits" => unpack("C*", $data)); } elsif ($type eq "IDAT") { # ignore } else { $info->push_info(0, "Chunk-$type" => $data); } } $info->push_info(0, "PNG_Chunks", @chunks); unless ($info->get_info(0, "resolution")) { $info->push_info(0, "resolution", "1/1"); } } 1; �����������������������Image-Info-1.42/lib/Image/TIFF.pm�������������������������������������������������������������������0000644�0001750�0001750�00000077762�13551665273�015631� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������package Image::TIFF; # Copyright 1999-2001, Gisle Aas. # Copyright 2006, 2007 Tels # # This library is free software; you can redistribute it and/or # modify it under the same terms as Perl v5.8.8 itself. use strict; use vars qw($VERSION); $VERSION = '1.10'; my @types = ( [ "BYTE", "C1", 1], [ "ASCII", "A1", 1], [ "SHORT", "n1", 2], [ "LONG", "N1", 4], [ "RATIONAL", "N2", 8], [ "SBYTE", "c1", 1], [ "UNDEFINED", "a1", 1], [ "BINARY", "a1", 1], # treat binary data as UNDEFINED [ "SSHORT", "n1", 2], [ "SLONG", "N1", 4], [ "SRATIONAL", "N2", 8], [ "FLOAT", "f1", 4], # XXX 4-byte IEEE format [ "DOUBLE", "d1", 8], # XXX 8-byte IEEE format # XXX TODO: # [ "IFD", "??", ?], # See ExifTool ); my %nikon1_tags = ( 0x0003 => "Quality", 0x0004 => "ColorMode", 0x0005 => "ImageAdjustment", 0x0006 => "CCDSensitivity", 0x0007 => "Whitebalance", 0x0008 => "Focus", 0x000A => "DigitalZoom", 0x000B => "Converter", ); my %nikon2_tags = ( 0x0001 => "NikonVersion", 0x0002 => "ISOSetting", 0x0003 => "ColorMode", 0x0004 => "Quality", 0x0005 => "Whitebalance", 0x0006 => "ImageSharpening", 0x0007 => "FocusMode", 0x0008 => "FlashSetting", 0x0009 => "FlashMetering", 0x000B => "WBAdjustment", 0x000F => "ISOSelection", 0x0080 => "ImageAdjustment", 0x0082 => "AuxiliaryLens", 0x0084 => "Lens", 0x0085 => "ManualFocusDistance", 0x0086 => "DigitalZoom", 0x0088 => { __TAG__ => "AFFocusPosition", pack("xCxx",0) => "Center", pack("xCxx",1) => "Top", pack("xCxx",2) => "Bottom", pack("xCxx",3) => "Left", pack("xCxx",4) => "Right", }, 0x008d => "ColorMode", 0x0090 => "FlashType", 0x0095 => "NoiseReduction", 0x0010 => "DataDump", ); my %olympus_tags = ( 0x0200 => "SpecialMode", 0x0201 => { __TAG__ => "JpegQual", 0 => "SQ", 1 => "HQ", 2 => "SHQ" }, 0x0202 => { __TAG__ => "Macro", 0 => "Normal", 1 => "Macro" }, 0x0204 => "DigiZoom", 0x0207 => "SoftwareRelease", 0x0208 => "PictInfo", 0x0209 => "CameraID", 0x0f00 => "DataDump", ); my %fujifilm_tags = ( 0x0000 => "Version", 0x1000 => "Quality", 0x1001 => { __TAG__ => "Sharpness", 1 => "Very Soft", 2 => "Soft", 3 => "Normal", 4 => "Hard", 5 => "Very Hard", }, 0x1002 => { __TAG__ => "WhiteBalance", 0 => "Auto", 256 => "Daylight", 512 => "Cloudy", 768 => "DaylightColor-fluorescence", 769 => "DaywhiteColor-fluorescence", 770 => "White-fluorescence", 1024 => "Incandenscense", 3840 => "Custom white balance", }, 0x1003 => { __TAG__ => "Color", 0 => "Normal", 256 => "High", 512 => "Low" }, 0x1004 => { __TAG__ => "Tone" , 0 => "Normal", 256 => "High", 512 => "Low" }, 0x1010 => { __TAG__ => "FlashMode", 0 => "Auto", 1 => "On", 2 => "Off", 3 => "Red-eye reduction" }, 0x1011 => "FlashStrength", 0x1020 => { __TAG__ => "Macro", 0 => "Off", 1 => "On"}, 0x1021 => { __TAG__ => "FocusMode", 0 => "Auto", 1 => "Manual" }, 0x1030 => { __TAG__ => "SlowSync", 0 => "Off", 1 => "On"}, 0x1031 => { __TAG__ => "PictureMode", 0 => "Auto", 1 => "Portrait", 2 => "Landscape", 4 => "Sports", 5 => "Night", 6 => "Program AE", 256 => "Aperture priority", 512 => "Shutter priority", 768 => "Manual", }, 0x1100 => { __TAG__ => "AutoBracketing", 0 => "Off", 1 => "On"}, 0x1300 => { __TAG__ => "BlurWarning", 0 => "No", 1 => "Yes"}, 0x1301 => { __TAG__ => "FocusWarning", 0 => "No", 1 => "Yes"}, 0x1302 => { __TAG__ => "AEWarning", 0 => "No", 1 => "Yes"}, ); my %casio_tags = ( 0x0001 => { __TAG__ => "RecordingMode", 1 => "SingleShutter", 2 => "Panorama", 3 => "Night scene", 4 => "Portrait", 5 => "Landscape", }, 0x0002 => { __TAG__ => "Quality", 1 => "Economy", 2 => "Normal", 3 => "Fine" }, 0x0003 => { __TAG__ => "FocusingMode", 2 => "Macro", 3 => "Auto", 4 => "Manual", 5 => "Infinity", }, 0x0004 => { __TAG__ => "FlashMode", 1 => "Auto", 2 => "On", 3 => "Off", 4 => "Red-eye reduction" }, 0x0005 => { __TAG__ => "FlashIntensity", 11 => "Weak", 13 => "Normal", 15 => "Strong" }, 0x0006 => "ObjectDistance", 0x0007 => { __TAG__ => "WhiteBalance", 1 => "Auto", 2 => "Tungsten", 3 => "Daylight", 4 => "Fluorescent", 5 => "Shade", 129 => "Manual", }, 0x000a => { __TAG__ => "DigitalZoom", 65536 => "Off", 65537 => "2X" }, 0x000b => { __TAG__ => "Sharpness", 0 => "Normal", 1 => "Soft", 2 => "Hard" }, 0x000c => { __TAG__ => "Contrast" , 0 => "Normal", 1 => "Low", 2 => "High" }, 0x000d => { __TAG__ => "Saturation", 0 => "Normal", 1 => "Low", 2 => "High" }, 0x0014 => { __TAG__ => "CCDSensitivity", 64 => "Normal", 125 => "+1.0", 250 => "+2.0", 244 => "+3.0", 80 => "Normal", 100 => "High", }, ); my %canon_0x0001_tags = ( 0 => { __TAG__ => "MacroMode", 1 => "Macro", 2 => "Normal" }, 1 => "SelfTimer", 2 => { __TAG__ => "Quality", 2 => "Normal", 3 => "Fine", 5 => "SuperFine" }, 3 => 'Tag-0x0001-03', 4 => { __TAG__ => 'FlashMode', 0 => 'Flash Not Fired', 1 => 'Auto', 2 => 'On', 3 => 'Red-Eye Reduction', 4 => 'Slow Synchro', 5 => 'Auto + Red-Eye Reduction', 6 => 'On + Red-Eye Reduction', 16 => 'External Flash' }, 5 => { __TAG__ => 'ContinuousDriveMode', 0 => 'Single Or Timer', 1 => 'Continuous' }, 6 => 'Tag-0x0001-06', 7 => { __TAG__ => 'FocusMode', 0 => 'One-Shot', 1 => 'AI Servo', 2 => 'AI Focus', 3 => 'MF', 4 => 'Single', 5 => 'Continuous', 6 => 'MF' }, 8 => 'Tag-0x0001-08', 9 => 'Tag-0x0001-09', 10 => { __TAG__ => 'ImageSize', 0 => 'Large', 1 => 'Medium', 2 => 'Small' }, 11 => { __TAG__ => 'EasyShootingMode', 0 => 'Full Auto', 1 => 'Manual', 2 => 'Landscape', 3 => 'Fast Shutter', 4 => 'Slow Shutter', 5 => 'Night', 6 => 'B&W', 7 => 'Sepia', 8 => 'Portrait', 9 => 'Sports', 10 => 'Macro/Close-Up', 11 => 'Pan Focus' }, 12 => { __TAG__ => 'DigitalZoom', 0 => 'None', 1 => '2x', 2 => '4x' }, 13 => { __TAG__ => 'Contrast', 0xFFFF => 'Low', 0 => 'Normal', 1 => 'High' }, 14 => { __TAG__ => 'Saturation', 0xFFFF => 'Low', 0 => 'Normal', 1 => 'High' }, 15 => { __TAG__ => 'Sharpness', 0xFFFF => 'Low', 0 => 'Normal', 1 => 'High' }, 16 => { __TAG__ => 'ISO', 0 => 'See ISOSpeedRatings Tag', 15 => 'Auto', 16 => '50', 17 => '100', 18 => '200', 19 => '400' }, 17 => { __TAG__ => 'MeteringMode', 3 => 'Evaluative', 4 => 'Partial', 5 => 'Center-Weighted' }, 18 => { __TAG__ => 'FocusType', 0 => 'Manual', 1 => 'Auto', 3 => 'Close-Up (Macro)', 8 => 'Locked (Pan Mode)' }, 19 => { __TAG__ => 'AFPointSelected', 0x3000 => 'None { __TAG__ => MF)', 0x3001 => 'Auto-Selected', 0x3002 => 'Right', 0x3003 => 'Center', 0x3004 => 'Left' }, 20 => { __TAG__ => 'ExposureMode', 0 => 'Easy Shooting', 1 => 'Program', 2 => 'Tv-priority', 3 => 'Av-priority', 4 => 'Manual', 5 => 'A-DEP' }, 21 => 'Tag-0x0001-21', 22 => 'Tag-0x0001-22', 23 => 'LongFocalLengthOfLensInFocalUnits', 24 => 'ShortFocalLengthOfLensInFocalUnits', 25 => 'FocalUnitsPerMM', 26 => 'Tag-0x0001-26', 27 => 'Tag-0x0001-27', 28 => { __TAG__ => 'FlashActivity', 0 => 'Did Not Fire', 1 => 'Fired' }, 29 => { __TAG__ => 'FlashDetails', 14 => 'External E-TTL', 13 => 'Internal Flash', 11 => 'FP Sync Used', 7 => '2nd ("Rear")-Curtain Sync Used', 4 => 'FP Sync Enabled' }, 30 => 'Tag-0x0001-30', 31 => 'Tag-0x0001-31', 32 => { __TAG__ => 'FocusMode', 0 => 'Single', 1 => 'Continuous' }, ); my %canon_0x0004_tags = ( 7 => { __TAG__ => 'WhiteBalance', 0 => 'Auto', 1 => 'Sunny', 2 => 'Cloudy', 3 => 'Tungsten', 4 => 'Fluorescent', 5 => 'Flash', 6 => 'Custom' }, 9 => 'SequenceNumber', 14 => 'AFPointUsed', 15 => { __TAG__ => 'FlashBias', 0xFFC0 => '-2 EV', 0xFFCC => '-1.67 EV', 0xFFD0 => '-1.50 EV', 0xFFD4 => '-1.33 EV', 0xFFE0 => '-1 EV', 0xFFEC => '-0.67 EV', 0xFFF0 => '-0.50 EV', 0xFFF4 => '-0.33 EV', 0x0000 => '0 EV', 0x000C => '0.33 EV', 0x0010 => '0.50 EV', 0x0014 => '0.67 EV', 0x0020 => '1 EV', 0x002C => '1.33 EV', 0x0030 => '1.50 EV', 0x0034 => '1.67 EV', 0x0040 => '2 EV', }, 19 => 'SubjectDistance' ); my %canon_tags = ( 0x0001 => { __TAG__ => "Custom_0x0001", __ARRAYOFFSET__ => \%canon_0x0001_tags }, 0x0004 => { __TAG__ => "Custom_0x0004", __ARRAYOFFSET__ => \%canon_0x0004_tags }, 0x0006 => "ImageType", 0x0007 => "FirmwareVersion", 0x0008 => "ImageNumber", 0x0009 => "OwnerName", 0x000c => "SerialNumber", ); # see http://www.compton.nu/panasonic.html my %panasonic_tags = ( 0x0001 => { __TAG__ => "ImageQuality", 2 => 'High', 3 => 'Normal', 6 => 'Very High', #3 (Leica) 7 => 'Raw', #3 (Leica) }, 0x0002 => "FirmwareVersion", 0x0003 => { __TAG__ => "WhiteBalance", 1 => 'Auto', 2 => 'Daylight', 3 => 'Cloudy', 4 => 'Halogen', 5 => 'Manual', 8 => 'Flash', 10 => 'Black & White', #3 (Leica) }, 0x0007 => { __TAG__ => "FocusMode", 1 => 'Auto', 2 => 'Manual', 5 => 'Auto, Continuous', 4 => 'Auto, Focus button', }, 0x000f => { __TAG__ => "SpotMode", # XXX TODO: does not decode properly "0,1" => 'On', "0,16" => 'Off', }, 0x001a => { __TAG__ => "ImageStabilizer", 2 => 'On, Mode 1', 3 => 'Off', 4 => 'On, Mode 2', }, 0x001c => { __TAG__ => "MacroMode", 1 => 'On', 2 => 'Off', }, 0x001f => { __TAG__ => "ShootingMode", 1 => 'Normal', 2 => 'Portrait', 3 => 'Scenery', 4 => 'Sports', 5 => 'Night Portrait', 6 => 'Program', 7 => 'Aperture Priority', 8 => 'Shutter Priority', 9 => 'Macro', 11 => 'Manual', 13 => 'Panning', 18 => 'Fireworks', 19 => 'Party', 20 => 'Snow', 21 => 'Night Scenery', }, 0x0020 => { __TAG__ => "Audio", 1 => 'Yes', 2 => 'No', }, 0x0021 => "DataDump", 0x0022 => "Panasonic 0x0022", 0x0023 => "WhiteBalanceBias", 0x0024 => "FlashBias", 0x0025 => "SerialNumber", 0x0026 => "Panasonic 0x0026", 0x0027 => "Panasonic 0x0027", 0x0028 => { __TAG__ => "ColorEffect", 1 => 'Off', 2 => 'Warm', 3 => 'Cool', 4 => 'Black & White', 5 => 'Sepia', }, 0x0029 => "Panasonic 0x0029", 0x002a => { __TAG__ => "BurstMode", 0 => 'Off', 1 => 'Low/High Quality', 2 => 'Infinite', }, 0x002b => "ImageSequenceNumber", 0x002c => { __TAG__ => "Contrast", 0 => 'Normal', 1 => 'Low', 2 => 'High', 0x100 => 'Low', # Leica 0x110 => 'Normal', # Leica 0x120 => 'High', # Leica }, 0x002d => { __TAG__ => "NoiseReduction", 0 => 'Standard', 1 => 'Low', 2 => 'High', }, 0x002e => { __TAG__ => "SelfTimer", 1 => 'Off', 2 => '10s', 3 => '2s', }, 0x002f => "Panasonic 0x002f", 0x0030 => "Panasonic 0x0030", 0x0031 => "Panasonic 0x0031", 0x0032 => "Panasonic 0x0032", ); # format: # "Make Model" => [ Offset, 'Tag_prefix', ptr to tags ] # Offset is either 0, or a positive number of Bytes. # Offset -1 or -2 means a kludge for Fuji or Nikon my %makernotes = ( "NIKON CORPORATION NIKON D1" => [0, 'NikonD1', \%nikon2_tags], "NIKON CORPORATION NIKON D70" => [-2, 'NikonD1', \%nikon2_tags], "NIKON CORPORATION NIKON D100" => [-2, 'NikonD1', \%nikon2_tags], # For the following manufacturers we simple discard the model and always # decode the MakerNote in the same manner. This makes it work with all # models, even yet unreleased ones. (That's better than the very limited # list of models we previously had) "CANON" => [0, 'Canon', \%canon_tags], 'PANASONIC' => [12, 'Panasonic', \%panasonic_tags], "FUJIFILM" => [-1, 'FinePix', \%fujifilm_tags], "CASIO" => [0, 'Casio', \%casio_tags], "OLYMPUS" => [8, 'Olympus', \%olympus_tags], ); BEGIN { # add some Nikon cameras for my $model (qw/E700 E800 E900 E900S E910 E950/) { $makernotes{'NIKON ' . $model} = [8, 'CoolPix', \%nikon1_tags]; } for my $model (qw/E880 E990 E995/) { $makernotes{'NIKON ' . $model} = [0, 'CoolPix', \%nikon2_tags]; } } my %exif_intr_tags = ( 0x1 => "InteroperabilityIndex", 0x2 => "InteroperabilityVersion", 0x1000 => "RelatedImageFileFormat", 0x1001 => "RelatedImageWidth", 0x1002 => "RelatedImageLength", ); # Tag decode helpers sub components_configuration_decoder; sub file_source_decoder; sub scene_type_decoder; my %exif_tags = ( 0x828D => "CFARepeatPatternDim", 0x828E => "CFAPattern", 0x828F => "BatteryLevel", 0x8298 => "Copyright", 0x829A => "ExposureTime", 0x829D => "FNumber", 0x83BB => "IPTC/NAA", 0x8769 => "ExifOffset", 0x8773 => "InterColorProfile", 0x8822 => { __TAG__ => "ExposureProgram", 0 => "unknown", 1 => "Manual", 2 => "Program", 3 => "Aperture priority", 4 => "Shutter priority", 5 => "Program creative", 6 => "Program action", 7 => "Portrait", 8 => "Landscape", # 9 .. 255 reserved }, 0x8824 => "SpectralSensitivity", 0x8827 => "ISOSpeedRatings", 0x8828 => "OECF", 0x9000 => "ExifVersion", 0x9003 => "DateTimeOriginal", 0x9004 => "DateTimeDigitized", 0x9101 => { __TAG__ => "ComponentsConfiguration", DECODER => \&components_configuration_decoder, }, 0x9102 => "CompressedBitsPerPixel", 0x9201 => "ShutterSpeedValue", 0x9202 => "ApertureValue", 0x9203 => "BrightnessValue", 0x9204 => "ExposureBiasValue", 0x9205 => "MaxApertureValue", 0x9206 => "SubjectDistance", 0x9207 => { __TAG__ => "MeteringMode", 0 => "unknown", 1 => "Average", 2 => "CenterWeightedAverage", 3 => "Spot", 4 => "MultiSpot", 5 => "Pattern", 6 => "Partial", # 7 .. 254 reserved in EXIF 1.2 255 => "other", }, 0x9208 => { __TAG__ => "LightSource", 0 => "unknown", 1 => "Daylight", 2 => "Fluorescent", 3 => "Tungsten", 4 => "Flash", # 5 .. 8 reserved in EXIF 2.2 9 => "Fine weather", 10 => "Cloudy weather", 11 => "Shade", 12 => "Daylight fluorescent (D 5700-7100K)", 13 => "Day white fluorescent (N 4600-5400K)", 14 => "Cool white fluorescent (W 3900-4500K)", 15 => "White fluorescent (WW 3200-3700K)", 17 => "Standard light A", 18 => "Standard light B", 19 => "Standard light C", 20 => "D55", 21 => "D65", 22 => "D75", 23 => "D50", 24 => "ISO studio tungesten", # 25 .. 254 reserved in EXIF 2.2 255 => "other light source", }, 0x9209 => { __TAG__ => "Flash", 0x0000 => "Flash did not fire", 0x0001 => "Flash fired", 0x0005 => "Strobe return light not detected", 0x0007 => "Strobe return light detected", 0x0009 => "Flash fired, compulsory flash mode", 0x000D => "Flash fired, compulsory flash mode, return light not detected", 0x000F => "Flash fired, compulsory flash mode, return light detected", 0x0010 => "Flash did not fire, compulsory flash mode", 0x0018 => "Flash did not fire, auto mode", 0x0019 => "Flash fired, auto mode", 0x001D => "Flash fired, auto mode, return light not detected", 0x001F => "Flash fired, auto mode, return light detected", 0x0020 => "No flash function", 0x0041 => "Flash fired, red-eye reduction mode", 0x0045 => "Flash fired, red-eye reduction mode, return light not detected", 0x0047 => "Flash fired, red-eye reduction mode, return light detected", 0x0049 => "Flash fired, compulsory flash mode, red-eye reduction mode", 0x004D => "Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected", 0x004F => "Flash fired, compulsory flash mode, red-eye reduction mode, return light detected", 0x0059 => "Flash fired, auto mode, red-eye reduction mode", 0x005D => "Flash fired, auto mode, return light not detected, red-eye reduction mode", 0x005F => "Flash fired, auto mode, return light detected, red-eye reduction mode" }, 0x920A => "FocalLength", 0x9214 => "SubjectArea", 0x927C => "MakerNote", 0x9286 => "UserComment", 0x9290 => "SubSecTime", 0x9291 => "SubSecTimeOriginal", 0x9292 => "SubSecTimeDigitized", 0xA000 => "FlashPixVersion", 0xA001 => "ColorSpace", 0xA002 => "ExifImageWidth", 0xA003 => "ExifImageLength", 0xA004 => "RelatedAudioFile", 0xA005 => {__TAG__ => "InteroperabilityOffset", __SUBIFD__ => \%exif_intr_tags, }, 0xA20B => "FlashEnergy", # 0x920B in TIFF/EP 0xA20C => "SpatialFrequencyResponse", # 0x920C - - 0xA20E => "FocalPlaneXResolution", # 0x920E - - 0xA20F => "FocalPlaneYResolution", # 0x920F - - 0xA210 => { __TAG__ => "FocalPlaneResolutionUnit", # 0x9210 - - 1 => "pixels", 2 => "dpi", 3 => "dpcm", }, 0xA214 => "SubjectLocation", # 0x9214 - - 0xA215 => "ExposureIndex", # 0x9215 - - 0xA217 => {__TAG__ => "SensingMethod", 1 => "Not defined", 2 => "One-chip color area sensor", 3 => "Two-chip color area sensor", 4 => "Three-chip color area sensor", 5 => "Color sequential area sensor", 7 => "Trilinear sensor", 8 => "Color sequential linear sensor" }, 0xA300 => {__TAG__ => "FileSource", DECODER => \&file_source_decoder, }, 0xA301 => {__TAG__ => "SceneType", DECODER => \&scene_type_decoder, }, 0xA302 => "CFAPattern", 0xA401 => {__TAG__ => "CustomRendered", 0 => "Normal process", 1 => "Custom process" }, 0xA402 => {__TAG__ => "ExposureMode", 0 => "Auto exposure", 1 => "Manual exposure", 2 => "Auto bracket" }, 0xA403 => {__TAG__ => "WhiteBalance", 0 => "Auto white balance", 1 => "Manual white balance" }, 0xA404 => "DigitalZoomRatio", 0xA405 => "FocalLengthIn35mmFilm", 0xA406 => {__TAG__ => "SceneCaptureType", 0 => "Standard", 1 => "Landscape", 2 => "Portrait", 3 => "Night Scene" }, 0xA407 => {__TAG__ => "GainControl", 0 => "None", 1 => "Low gain up", 2 => "High gain up", 3 => "Low gain down", 4 => "High gain down" }, 0xA408 => {__TAG__ => "Contrast", 0 => "Normal", 1 => "Soft", 2 => "Hard" }, 0xA409 => {__TAG__ => "Saturation", 0 => "Normal", 1 => "Low saturation", 2 => "High saturation" }, 0xA40A => {__TAG__ => "Sharpness", 0 => "Normal", 1 => "Soft", 2 => "Hard" }, 0xA40B => "DeviceSettingDescription", 0xA40C => {__TAG__ => "SubjectDistanceRange", 0 => "Unknown", 1 => "Macro", 2 => "Close view", 3 => "Distant view" }, 0xA420 => "ImageUniqueID", ); my %gps_tags = ( 0x0000 => 'GPSVersionID', 0x0001 => 'GPSLatitudeRef', 0x0002 => 'GPSLatitude', 0x0003 => 'GPSLongitudeRef', 0x0004 => 'GPSLongitude', 0x0005 => 'GPSAltitudeRef', 0x0006 => 'GPSAltitude', 0x0007 => 'GPSTimeStamp', 0x0008 => 'GPSSatellites', 0x0009 => 'GPSStatus', 0x000A => 'GPSMeasureMode', 0x000B => 'GPSDOP', 0x000C => 'GPSSpeedRef', 0x000D => 'GPSSpeed', 0x000E => 'GPSTrackRef', 0x000F => 'GPSTrack', 0x0010 => 'GPSImgDirectionRef', 0x0011 => 'GPSImgDirection', 0x0012 => 'GPSMapDatum', 0x0013 => 'GPSDestLatitudeRef', 0x0014 => 'GPSDestLatitude', 0x0015 => 'GPSDestLongitudeRef', 0x0016 => 'GPSDestLongitude', 0x0017 => 'GPSDestBearingRef', 0x0018 => 'GPSDestBearing', 0x0019 => 'GPSDestDistanceRef', 0x001A => 'GPSDestDistance', 0x001B => 'GPSProcessingMethod', 0x001C => 'GPSAreaInformation', 0x001D => 'GPSDateStamp', 0x001E => 'GPSDifferential', ); my %tiff_tags = ( 254 => { __TAG__ => "NewSubfileType", 1 => "ReducedResolution", 2 => "SinglePage", 4 => "TransparencyMask", }, 255 => { __TAG__ => "SubfileType", 1 => "FullResolution", 2 => "ReducedResolution", 3 => "SinglePage", }, 256 => "width", 257 => "height", 258 => "BitsPerSample", 259 => { __TAG__ => "Compression", 1 => "PackBytes", 2 => "CCITT Group3", 3 => "CCITT T4", 4 => "CCITT T6", 5 => "LZW", 6 => "JPEG", 7 => "JPEG DCT", 8 => "Deflate (Adobe)", 32766 => "NeXT 2-bit RLE", 32771 => "#1 w/ word alignment", 32773 => "PackBits (Macintosh RLE)", 32809 => "ThunderScan RLE", 32895 => "IT8 CT w/padding", 32896 => "IT8 Linework RLE", 32897 => "IT8 Monochrome picture", 32898 => "IT8 Binary line art", 32908 => "Pixar companded 10bit LZW", 32909 => "Pixar companded 11bit ZIP", 32946 => "Deflate", }, 262 => { __TAG__ => "PhotometricInterpretation", 0 => "WhiteIsZero", 1 => "BlackIsZero", 2 => "RGB", 3 => "RGB Palette", 4 => "Transparency Mask", 5 => "CMYK", 6 => "YCbCr", 8 => "CIELab", }, 263 => { __TAG__ => "Threshholding", 1 => "NoDithering", 2 => "OrderedDither", 3 => "Randomized", }, 266 => { __TAG__ => "FillOrder", 1 => "LowInHigh", 2 => "HighInLow", }, 269 => "DocumentName", 270 => "ImageDescription", 271 => "Make", 272 => "Model", 273 => "StripOffsets", 274 => { __TAG__ => "Orientation", 1 => "top_left", 2 => "top_right", 3 => "bot_right", 4 => "bot_left", 5 => "left_top", 6 => "right_top", 7 => "right_bot", 8 => "left_bot", }, 277 => "SamplesPerPixel", 278 => "RowsPerStrip", 279 => "StripByteCounts", 282 => "XResolution", 283 => "YResolution", 284 => {__TAG__ => "PlanarConfiguration", 1 => "Chunky", 2 => "Planar", }, 296 => {__TAG__ => "ResolutionUnit", 1 => "pixels", 2 => "dpi", 3 => "dpcm", }, 297 => "PageNumber", 301 => "TransferFunction", 305 => "Software", 306 => "DateTime", 315 => "Artist", 316 => "Host", 318 => "WhitePoint", 319 => "PrimaryChromaticities", 320 => "ColorMap", 513 => "JPEGInterchangeFormat", 514 => "JPEGInterchangeFormatLength", 529 => "YCbCrCoefficients", 530 => "YCbCrSubSampling", 531 => "YCbCrPositioning", 532 => "ReferenceBlackWhite", 33432 => "Copyright", 34665 => { __TAG__ => "ExifOffset", __SUBIFD__ => \%exif_tags, }, 34853 => { __TAG__ => "GPSInfo", __SUBIFD__ => \%gps_tags, }, ); sub new { my $class = shift; my $source = shift; if (!ref($source)) { local(*F); open(F, $source) || return; binmode(F); $source = \*F; } if (ref($source) ne "SCALAR") { # XXX should really only read the file on demand local($/); # slurp mode my $data = <$source>; $source = \$data; } my $self = bless { source => $source }, $class; for ($$source) { my $byte_order = substr($_, 0, 2); $self->{little_endian} = ($byte_order eq "II"); $self->{version} = $self->unpack("n", substr($_, 2, 2)); my $ifd = $self->unpack("N", substr($_, 4, 4)); while ($ifd) { push(@{$self->{ifd}}, $ifd); my($num_fields) = $self->unpack("x$ifd n", $_); my $substr_ifd = substr($_, $ifd + 2 + $num_fields*12, 4); last unless defined $substr_ifd; # bad TIFF header, eg: substr idx > length($substr_ifd) my $next_ifd = $self->unpack("N", $substr_ifd); # guard against (bug #26127) $next_ifd = 0 if $next_ifd > length($_); # guard against looping ifd (bug #26130) if ($next_ifd <= $ifd) { # bad TIFF header - would cause a loop or strange results last; } $ifd = $next_ifd; } } $self; } sub unpack { my $self = shift; my $template = shift; if ($self->{little_endian}) { $template =~ tr/nN/vV/; } #print "UNPACK $template\n"; CORE::unpack($template, $_[0]); } sub num_ifds { my $self = shift; scalar @{$self->{ifd}}; } sub ifd { my $self = shift; my $num = shift || 0; my @ifd; $self->add_fields($self->{ifd}[$num], \@ifd); } sub tagname { $tiff_tags{$_[1]} || sprintf "Tag-0x%04x",$_[1]; } sub exif_tagname { $tiff_tags{$_[1]} || $exif_tags{$_[1]} || sprintf "Tag-0x%04x",$_[1]; } sub add_fields { my($self, $offset, $ifds, $tags, $voff_plus) = @_; return unless $offset; # guard against finding the same offset twice (bug #29088) return if $self->{seen_offset}{$offset}++; $tags ||= \%tiff_tags; for (${$self->{source}}) { # alias as $_ last if $offset > length($_) - 2; # bad offset my $entries = $self->unpack("x$offset n", $_); my $max_entries = int((length($_) - $offset - 2) / 12); # print "ENTRIES $entries $max_entries\n"; if ($entries > $max_entries) { # Hmmm, something smells bad here... parsing garbage $entries = $max_entries; last; } FIELD: for my $i (0 .. $entries-1) { my $entry_offset = 2 + $offset + $i*12; my($tag, $type, $count, $voff) = $self->unpack("nnNN", substr($_, $entry_offset, 12)); #print STDERR "TAG $tag $type $count $voff\n"; if ($type == 0 || $type > @types) { # unknown type code might indicate that we are parsing garbage print STDERR "# Ignoring unknown type code $type\n"; next; } # extract type information my($tmpl, $vlen); ($type, $tmpl, $vlen) = @{$types[$type-1]}; die "Undefined type while parsing" unless $type; if ($count * $vlen <= 4) { $voff = $entry_offset + 8; } elsif ($voff + $count * $vlen > length($_)) { # offset points outside of string, corrupt entry ignore print STDERR "# ignoring offset pointer outside of string\n"; next; } else { $voff += $voff_plus || 0; } $tmpl =~ s/(\d+)$/$count*$1/e; my @v = $self->unpack("x$voff $tmpl", $_); if ($type =~ /^S(SHORT|LONG|RATIONAL)/) { my $max = 2 ** ($1 eq "SHORT" ? 15 : 31); $v[0] -= ($max * 2) if $v[0] >= $max; } my $val = (@v > 1) ? \@v : $v[0]; bless $val, "Image::TIFF::Rational" if $type =~ /^S?RATIONAL$/; if ($type eq 'ASCII' || $type eq 'UNDEFINED') { if ($val =~ /\0[^\0]+\z/) { # cut out the first "ASCII\0" and take the remaining text # (fix bug #29243 parsing of UserComment) # XXX TODO: this needs to handle UNICODE, too: $val =~ /\0([^\0]+)/; $val = '' . ($1 || ''); } else { # avoid things like "Foo\x00\x00\x00" by removing trailing nulls # this needs to handle UNICODE, too: $val =~ /^([^\0]*)/; $val = '' . ($1 || ''); } } $tag = $tags->{$tag} || $self->tagname($tag); if ($tag eq 'MakerNote') { my $maker = uc($self->{Make} || ''); $maker =~ /^([A-Z]+)/; $maker = $1 || ''; # "OLYMPUS ..." > "OLYMPUS" # if 'Panasonic' doesn't exist, try 'Panasonic DMC-FZ5' $maker = join " " => grep m/\S/ => $self->{Make}, $self->{Model} unless exists $makernotes{$maker}; if (exists $makernotes{$maker}) { my ($ifd_off, $tag_prefix, $sub) = @{$makernotes{$maker}}; #print STDERR "# Decoding Makernotes from $maker\n"; $self->{tag_prefix} = $tag_prefix; if ($ifd_off == -1 && length($val) >= 12) { # fuji kludge - http://www.butaman.ne.jp/~tsuruzoh/Computer/Digicams/exif-e.html#APP4 my $save_endian = $self->{little_endian}; $self->{little_endian} = 1; $ifd_off = $self->unpack("N", substr($val, 8, 4)); $self->add_fields($voff+$ifd_off, $ifds, $sub, $voff); $self->{little_endian} = $save_endian; } elsif ($ifd_off == -2) { # Nikon D70/D100 kludge -- word "Nikon" and 5 # bytes of data is tacked to the front of MakerNote; # all EXIF offsets are relative to MakerNote section my ($nikon_voff); $nikon_voff = 0; if (substr($val, 0, 5) eq 'Nikon') { $nikon_voff = $voff+10; } #print "IFD_OFF $ifd_off NIKON_VOFF $nikon_voff\n"; $self->add_fields($voff+18, $ifds, $sub, $nikon_voff); } else { $self->add_fields($voff+$ifd_off, $ifds, $sub) } delete $self->{tag_prefix}; next FIELD; } } if (ref($tag)) { die "Assert" unless ref($tag) eq "HASH"; if (my $sub = $tag->{__SUBIFD__}) { next if $val < 0 || $val > length($_); #print "SUBIFD $tag->{__TAG__} $val ", length($_), "\n"; $self->add_fields($val, $ifds, $sub); next FIELD; } if (my $sub = $tag->{__ARRAYOFFSET__}) { my $prefix; $prefix = $tag = $self->{tag_prefix} . '-' if $self->{tag_prefix}; for (my $i=0; $i < @$val; $i++) { if ( exists($sub->{$i}) ) { if ( ref($sub->{$i}) eq "HASH" && exists($sub->{$i}->{__TAG__}) ) { if ( exists($sub->{$i}->{$val->[$i]}) ) { push @$ifds, [ $prefix . $sub->{$i}->{__TAG__}, $type, $count, $sub->{$i}->{$val->[$i]} ]; } else { push @$ifds, [ $prefix . $sub->{$i}->{__TAG__}, $type, $count, "Unknown (" . $val->[$i] . ")" ]; } } else { push @$ifds, [ $prefix . $sub->{$i}, $type, $count, $val->[$i] ]; } } } next FIELD; } #hack for UNDEFINED values, they all have different #meanings depending on tag $val = &{$tag->{DECODER}}($self,$val) if defined($tag->{DECODER}); $val = $tag->{$val} if exists $tag->{$val}; $tag = $tag->{__TAG__}; } $tag = $self->{tag_prefix} . '-' . $tag if $self->{tag_prefix}; #if ( $val =~ m/ARRAY/ ) { $val = join(', ',@$val); } push @$ifds, [ $tag, $type, $count, $val ]; $self->{$tag} = $val if ($tag eq 'Make' or $tag eq 'Model'); } } $ifds; } sub components_configuration_decoder { my $self = shift; my $val = shift; my $rv = ""; my %v = ( 0 => undef, 1 => 'Y', 2 => 'Cb', 3 => 'Cr', 4 => 'R', 5 => 'G', 6 => 'B', ); return join ( '', map { $v{$_} if defined($v{$_}) } $self->unpack('c4',$val) ); } sub file_source_decoder { my $self = shift; my $val = shift; my %v = ( 3 => "(DSC) Digital Still Camera", ); $val = $self->unpack('c',$val); return $v{$val} if $v{$val}; "Other"; } sub scene_type_decoder { my $self = shift; my $val = shift; my %v = ( 1 => "Directly Photographed Image", ); $val = $self->unpack('c',$val); return $v{$val} if $v{$val}; "Other"; } package Image::TIFF::Rational; use overload '""' => \&as_string, '0+' => \&as_float, fallback => 1; sub new { my($class, $a, $b) = @_; bless [$a, $b], $class; } sub as_string { my $self = shift; #warn "@$self"; "$self->[0]/$self->[1]"; } sub as_float { my $self = shift; # We check here because some stupid cameras (Samsung Digimax 200) # use rationals with 0 denominator (found in thumbnail resolution spec). if ($self->[1]) { return $self->[0] / $self->[1]; } else { return $self->[0]; } } 1; ��������������Image-Info-1.42/lib/Image/Info.pm�������������������������������������������������������������������0000644�0001750�0001750�00000035255�13552530374�015755� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ############################################################################# # # ATTENTION! This file is autogenerated from dev/Info.pm.tmpl - DO NOT EDIT! # ############################################################################# package Image::Info; # Copyright 1999-2004, Gisle Aas. # # This library is free software; you can redistribute it and/or # modify it under the same terms as Perl v5.8.8 itself. # # Previously maintained by Tels - (c) 2006 - 2008. # Currently maintained by Slaven Rezic - (c) 2008 - 2019. use strict; use vars qw($VERSION @EXPORT_OK); $VERSION = '1.42'; require Exporter; *import = \&Exporter::import; @EXPORT_OK = qw(image_info dim html_dim image_type determine_file_format); # already required and failed sub-modules are remembered here my %mod_failure; sub image_info { my $source = _source(shift); return $source if ref $source eq 'HASH'; # Pass on errors # What sort of file is it? my $head = _head($source); return $head if ref($head) eq 'HASH'; # error? my $format = determine_file_format($head) or return { error => 'Unrecognized file format' }; return _image_info_for_format($format, $source); } # Note: this function is private, but may be used by Image::Info::* # implementations (i.e. the WBMP implementation) sub _image_info_for_format { my($format, $source) = @_; my $mod = "Image::Info::$format"; my $sub = "$mod\::process_file"; my $info = bless [], "Image::Info::Result"; eval { unless (defined &$sub) { # already required and failed? if (my $fail = $mod_failure{$mod}) { die $fail; } eval "require $mod"; if ($@) { $mod_failure{$mod} = $@; die $@; } die "$mod did not define &$sub" unless defined &$sub; } my %cnf = @_; { # call process_file() no strict 'refs'; &$sub($info, $source, \%cnf); } $info->clean_up; }; return { error => $@ } if $@; return wantarray ? @$info : $info->[0]; } sub image_type { my $source = _source(shift); return $source if ref $source eq 'HASH'; # Pass on errors # What sort of file is it? my $head = _head($source) or return _os_err("Can't read head"); my $format = determine_file_format($head) or return { error => "Unrecognized file format" }; return { file_type => $format }; } # Note: this function is private, but may be used by Image::Info::* # implementations (i.e. the WBMP implementation) sub _source { my $source = shift; if (!ref $source) { my $fh; if ($] < 5.006) { require Symbol; $fh = Symbol::gensym(); open($fh, $source) || return _os_err("Can't open $source"); } else { open $fh, '<', $source or return _os_err("Can't open $source"); } ${*$fh} = $source; # keep filename in case somebody wants to know binmode($fh); $source = $fh; } elsif (ref($source) eq "SCALAR") { # Earlier PerlIO::scalar versions may segfault or consume lots # of memory for some invalid images, see # RT #100847 and img/segfault.tif if (eval { require PerlIO::scalar; PerlIO::scalar->VERSION(0.21) } || !eval { require IO::Scalar; 1 }) { open(my $s, "<", $source) or return _os_err("Can't open string"); $source = $s; } else { $source = IO::Scalar->new($source); } } else { seek($source, 0, 0) or return _os_err("Can't rewind"); } $source; } sub _head { my $source = shift; my $head; # Originally was 32 bytes. # In the meantime lowered to 11 bytes. # But XBM probably need more because of a leading comment. my $to_read = 64; my $read = read($source, $head, $to_read); return _os_err("Couldn't read any bytes") if !$read; if (ref($source) eq "IO::String") { # XXX workaround until we can trap seek() with a tied file handle $source->setpos(0); } else { seek($source, 0, 0) or return _os_err("Can't rewind"); } $head; } sub _os_err { return { error => "$_[0]: $!", Errno => $!+0, }; } sub determine_file_format { local($_) = @_; return "JPEG" if /^\xFF\xD8/; return "PNG" if /^\x89PNG\x0d\x0a\x1a\x0a/; return "GIF" if /^GIF8[79]a/; return "TIFF" if /^MM\x00\x2a/; return "TIFF" if /^II\x2a\x00/; return "BMP" if /^BM/; return "ICO" if /^\000\000\001\000/; return "PPM" if /^P[1-6]/; return "XPM" if /(^\/\* XPM \*\/)|(static\s+char\s+\*\w+\[\]\s*=\s*{\s*"\d+)/; return "XBM" if /^(?:\/\*.*\*\/\n)?#define\s/; return "SVG" if /^(<\?xml|[\012\015\t ]*<svg\b)/; return "WEBP" if /^RIFF.{4}WEBP/s; return undef; } sub dim { my $img = shift || return; my $x = $img->{width} || return; my $y = $img->{height} || return; wantarray ? ($x, $y) : "${x}x$y"; } sub html_dim { my($x, $y) = dim(@_); return "" unless $x; "width=\"$x\" height=\"$y\""; } ############################################################################# package Image::Info::Result; sub push_info { my($self, $n, $key) = splice(@_, 0, 3); push(@{$self->[$n]{$key}}, @_); } sub replace_info { my($self, $n, $key) = splice(@_, 0, 3); $self->[$n]{$key}[0] = $_[0]; } sub clean_up { my $self = shift; for (@$self) { for my $k (keys %$_) { my $a = $_->{$k}; $_->{$k} = $a->[0] if @$a <= 1; } } } sub get_info { my($self, $n, $key, $delete) = @_; my $v = $delete ? delete $self->[$n]{$key} : $self->[$n]{$key}; $v ||= []; @$v; } 1; __END__ =head1 NAME Image::Info - Extract meta information from image files =head1 SYNOPSIS use Image::Info qw(image_info dim); my $info = image_info("image.jpg"); if (my $error = $info->{error}) { die "Can't parse image info: $error\n"; } my $color = $info->{color_type}; my $type = image_type("image.jpg"); if (my $error = $type->{error}) { die "Can't determine file type: $error\n"; } die "No gif files allowed!" if $type->{file_type} eq 'GIF'; my($w, $h) = dim($info); =head1 DESCRIPTION This module provides functions to extract various kinds of meta information from image files. =head2 EXPORTS Exports nothing by default, but can export the following methods on request: image_info image_type dim html_dim determine_file_type =head2 METHODS The following functions are provided by the C<Image::Info> module: =over =item image_info( $file ) =item image_info( \$imgdata ) =item image_info( $file, key => value,... ) This function takes the name of a file or a file handle as argument and will return one or more hashes (actually hash references) describing the images inside the file. If there is only one image in the file only one hash is returned. In scalar context, only the hash for the first image is returned. In case of error, a hash containing the "error" key will be returned. The corresponding value will be an appropriate error message. If a reference to a scalar is passed as an argument to this function, then it is assumed that this scalar contains the raw image data directly. The C<image_info()> function also take optional key/value style arguments that can influence what information is returned. =item image_type( $file ) =item image_type( \$imgdata ) Returns a hash with only one key, C<< file_type >>. The value will be the type of the file. On error, sets the two keys C<< error >> and C<< Errno >>. This function is a dramatically faster alternative to the image_info function for situations in which you B<only> need to find the image type. It uses only the internal file-type detection to do this, and thus does not need to load any of the image type-specific driver modules, and does not access to entire file. It also only needs access to the first 11 bytes of the file. To maintain some level of compatibility with image_info, image_type returns in the same format, with the same error message style. That is, it returns a HASH reference, with the C<< $type->{error} >> key set if there was an error. On success, the HASH reference will contain the single key C<< file_type >>, which represents the type of the file, expressed as the type code used for the various drivers ('GIF', 'JPEG', 'TIFF' and so on). If there are multiple images within the file they will be ignored, as this function provides only the type of the overall file, not of the various images within it. This function will not return multiple hashes if the file contains multiple images. Of course, in all (or at least effectively all) cases the type of the images inside the file is going to be the same as that of the file itself. =item dim( $info_hash ) Takes an hash as returned from C<image_info()> and returns the dimensions ($width, $height) of the image. In scalar context returns the dimensions as a string. =item html_dim( $info_hash ) Returns the dimensions as a string suitable for embedding directly into HTML or SVG <img>-tags. E.g.: print "<img src="..." @{[html_dim($info)]}>\n"; =item determine_file_format( $filedata ) Determines the file format from the passed file data (a normal Perl scalar containing the first bytes of the file), and returns either undef for an unknown file format, or a string describing the format, like "BMP" or "JPEG". =back =head1 Image descriptions The C<image_info()> function returns meta information about each image in the form of a reference to a hash. The hash keys used are in most cases based on the TIFF element names. All lower case keys are mandatory for all file formats and will always be there unless an error occurred (in which case the "error" key will be present.) Mixed case keys will only be present when the corresponding information element is available in the image. The following key names are common for any image format: =over =item file_media_type This is the MIME type that is appropriate for the given file format. The corresponding value is a string like: "image/png" or "image/jpeg". =item file_ext The is the suggested file name extension for a file of the given file format. The value is a 3 letter, lowercase string like "png", "jpg". =item width This is the number of pixels horizontally in the image. =item height This is the number of pixels vertically in the image. (TIFF uses the name ImageLength for this field.) =item color_type The value is a short string describing what kind of values the pixels encode. The value can be one of the following: Gray GrayA RGB RGBA CMYK YCbCr CIELab These names can also be prefixed by "Indexed-" if the image is composed of indexes into a palette. Of these, only "Indexed-RGB" is likely to occur. It is similar to the TIFF field "PhotometricInterpretation", but this name was found to be too long, so we used the PNG inspired term instead. =item resolution The value of this field normally gives the physical size of the image on screen or paper. When the unit specifier is missing then this field denotes the squareness of pixels in the image. The syntax of this field is: <res> <unit> <xres> "/" <yres> <unit> <xres> "/" <yres> The <res>, <xres> and <yres> fields are numbers. The <unit> is a string like C<dpi>, C<dpm> or C<dpcm> (denoting "dots per inch/cm/meter). =item SamplesPerPixel This says how many channels there are in the image. For some image formats this number might be higher than the number implied from the C<color_type>. =item BitsPerSample This says how many bits are used to encode each of samples. The value is a reference to an array containing numbers. The number of elements in the array should be the same as C<SamplesPerPixel>. =item Comment Textual comments found in the file. The value is a reference to an array if there are multiple comments found. =item Interlace If the image is interlaced, then this tells which interlace method is used. =item Compression This tells you which compression algorithm is used. =item Gamma A number. =item LastModificationTime A ISO date string =back =head1 Supported Image Formats The following image file formats are supported: =over =item BMP This module supports the Microsoft Device Independent Bitmap format (BMP, DIB, RLE). For more information see L<Image::Info::BMP>. =item GIF Both GIF87a and GIF89a are supported and the version number is found as C<GIF_Version> for the first image. GIF files can contain multiple images, and information for all images will be returned if image_info() is called in list context. The Netscape-2.0 extension to loop animation sequences is represented by the C<GIF_Loop> key for the first image. The value is either "forever" or a number indicating loop count. =item ICO This module supports the Microsoft Windows Icon Resource format (.ico). =item JPEG For JPEG files we extract information both from C<JFIF> and C<Exif> application chunks. C<Exif> is the file format written by most digital cameras. This encode things like timestamp, camera model, focal length, exposure time, aperture, flash usage, GPS position, etc. The C<Exif> spec can be found at: L<http://www.exif.org/specifications.html>. The C<color_type> element may have the following values: C<Gray>, C<YCbCr>, and C<CMYK>. Note that detecting C<RGB> and C<YCCK> currently does not work, but will hopefully in future. =item PNG Information from IHDR, PLTE, gAMA, pHYs, tEXt, tIME chunks are extracted. The sequence of chunks are also given by the C<PNG_Chunks> key. =item PBM/PGM/PPM All information available is extracted. =item SVG Provides a plethora of attributes and metadata of an SVG vector graphic. =item TIFF The C<TIFF> spec can be found at: L<http://partners.adobe.com/public/developer/tiff/> The EXIF spec can be found at: L<http://www.exif.org/specifications.html> =item WBMP wbmp files have no magic, so cannot be used with the normal Image::Info functions. See L<Image::Info::WBMP> for more information. =item WEBP VP8 (lossy), VP8L (lossless) and VP8X (extended) files are supported. Sets the key C<Animation> to true if the file is an animation. Otherwise sets the key C<Compression> to either C<VP8> or C<Lossless>. =item XBM See L<Image::Info::XBM> for details. =item XPM See L<Image::Info::XPM> for details. =back =head1 CAVEATS While this module is fine for parsing basic image information like image type, dimensions and color depth, it is probably not good enough for parsing out more advanced information like EXIF data. If you want an up-to-date and tested EXIF parsing library, please use L<Image::ExifTool>. =head1 SEE ALSO L<Image::Size>, L<Image::ExifTool> =head1 AUTHORS Copyright 1999-2004 Gisle Aas. See the CREDITS file for a list of contributors and authors. Tels - (c) 2006 - 2008. Current maintainer: Slaven Rezic - (c) 2008 - 2015. =head1 LICENSE This library is free software; you can redistribute it and/or modify it under the same terms as Perl v5.8.8 itself. =cut # Local Variables: # mode: cperl # End: ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/META.json���������������������������������������������������������������������������0000644�0001750�0001750�00000002511�13552530422�014334� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "abstract" : "Extract meta information from image files", "author" : [ "Slaven Rezic <srezic@cpan.org>", "Gisle Aas <gisle@ActiveState.com", "Tels" ], "dynamic_config" : 1, "generated_by" : "ExtUtils::MakeMaker version 6.98, CPAN::Meta::Converter version 2.142690", "license" : [ "perl_5" ], "meta-spec" : { "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", "version" : "2" }, "name" : "Image-Info", "no_index" : { "directory" : [ "t", "inc", "dev", "img", "xt" ] }, "prereqs" : { "build" : { "requires" : { "ExtUtils::MakeMaker" : "0" } }, "configure" : { "requires" : { "ExtUtils::MakeMaker" : "0" } }, "runtime" : { "recommends" : { "Bundle::Image::Info::PNG" : "0", "Bundle::Image::Info::SVG" : "0", "Bundle::Image::Info::XBM" : "0", "Bundle::Image::Info::XPM" : "0" }, "requires" : { "IO::Scalar" : "0", "perl" : "5.006" } } }, "release_status" : "stable", "resources" : { "repository" : { "url" : "git://github.com/eserte/image-info.git" } }, "version" : "1.42" } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/MANIFEST.SKIP�����������������������������������������������������������������������0000644�0001750�0001750�00000000426�12650712413�014614� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.*\.tar\.gz ^blib.* ^\w+\.(html|txt|dot|pl|old|bak|org) ^Makefile\z ^Makefile.(old|bak)\z pm_to_blib ^\.git/ ^\.prove\z ^\.travis\.yml\z ^appveyor\.yml\z ^MYMETA.json$ ^MYMETA.yml$ # Temporarily, until Module::Install is fixed (0.93 is broken) xt/bench.t xt/compare.t xt/mass.t ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/xt/���������������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13552530422�013347� 5����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/xt/synopsis.t�����������������������������������������������������������������������0000755�0001750�0001750�00000000305�12650713457�015435� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # -*- perl -*- # # Author: Peter Mayr # use strict; use Test::More; eval "use Test::Synopsis"; plan skip_all => "Test::Synopsis required for testing" if $@; all_synopsis_ok(); ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/xt/strict.t�������������������������������������������������������������������������0000755�0001750�0001750�00000000161�12515005705�015044� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # -*- perl -*- # # Author: Peter Mayr # use strict; use Test::Strict; all_perl_files_ok(); ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/xt/rt118099.t�����������������������������������������������������������������������0000644�0001750�0001750�00000003534�12773752746�014705� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # -*- cperl -*- # # Author: Slaven Rezic # use strict; use FindBin; use IPC::Run 'run'; use List::Util 'sum'; use Test::More; plan skip_all => "Works only on linux (using strace)" if $^O ne 'linux'; my %impl2opts = ( 'Image::Info::SVG::XMLSimple' => [ {XML_SAX_Parser => 'XML::Parser'}, {XML_SAX_Parser => 'XML::SAX::Expat'}, {XML_SAX_Parser => 'XML::SAX::ExpatXS'}, {XML_SAX_Parser => 'XML::SAX::PurePerl'}, {XML_SAX_Parser => 'XML::LibXML::SAX::Parser'}, {XML_SAX_Parser => 'XML::LibXML::SAX'}, ], 'Image::Info::SVG::XMLLibXMLReader' => [{}], ); plan tests => 2 * sum map { scalar @$_ } values(%impl2opts); for my $impl (keys %impl2opts) { my $testname = $impl; my @opts = @{ $impl2opts{$impl} }; for my $opt (@opts) { my $testname = $testname . (%$opt ? ", " . join(", ", map { "$_ => $opt->{$_}" } keys %$opt) : ''); my @cmd = ( $^X, "-I$FindBin::RealBin/../lib", '-MImage::Info=image_info', '-e', ($opt->{XML_SAX_Parser} ? 'require XML::Simple; $XML::Simple::PREFERRED_PARSER = shift; ' : '') . '@Image::Info::SVG::PREFER_MODULE=shift; my $info = image_info(shift); die $info->{error} if $info->{error};', ($opt->{XML_SAX_Parser} ? $opt->{XML_SAX_Parser} : ()), $impl, "$FindBin::RealBin/../img/xxe.svg", ); { my $stderr; ok run(\@cmd, '2>', \$stderr), "Run @cmd" or diag $stderr; } { my $success = run(["strace", "-eopen,stat", @cmd], '2>', \my $strace); if (!$success) { if (($opt->{XML_SAX_Parser}||'') eq 'XML::SAX::ExpatXS') { # ignore error } else { die "Error running @cmd with strace"; } } my @matching_lines = $strace =~ m{.*/etc/passwd.*}g; is scalar(@matching_lines), 0, "No XXE with $testname" or diag explain \@matching_lines; } } } done_testing; __END__ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/xt/kwalitee.t�����������������������������������������������������������������������0000755�0001750�0001750�00000000230�12515005700�015331� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # -*- perl -*- # # Author: Peter Mayr # use strict; use Test::More; use Test::Kwalitee 'kwalitee_ok'; kwalitee_ok(); done_testing; ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/TODO��������������������������������������������������������������������������������0000644�0001750�0001750�00000001251�11302320062�013367� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� * Image::TIFF should not need to slurp * convert the EXIF parsing code to just use something like Image::Exiftool - our code is way to complicated, outdated, and it's double work to maintain it * Get rid of XML::Simple dependency in Image::Info::SVG::XMLLibXMLReader * determining XBM files fail if a long comment precedes the "pseudo magic" Seen with /usr/local/include/X11/bitmaps/mouse.xbm. Possible solutions: * read more than 64 bytes for magic checks * make the file detection mechanism two-step: first step with a small buffer for file formats which have a real magic at beginning of the file, and if this fails following a second step for stuff like xbm �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/.gitignore��������������������������������������������������������������������������0000644�0001750�0001750�00000000217�12507510212�014676� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������*~ /.prove /blib /cover_db /Image-Info-*.tar.gz /MANIFEST.bak /MYMETA.json /MYMETA.yml /Makefile /Makefile.old /pm_to_blib /nytprof.out \#*\# ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/SIGNATURE���������������������������������������������������������������������������0000644�0001750�0001750�00000016174�13552530424�014213� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������This file contains message digests of all files listed in MANIFEST, signed via the Module::Signature module, version 0.73. To verify the content in this distribution, first make sure you have Module::Signature installed, then type: % cpansign -v It will check each file's integrity, as well as the signature's validity. If "==> Signature verified OK! <==" is not displayed, the distribution may already have been compromised, and you should not run its Makefile.PL or Build.PL. -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 SHA1 c82d6187bf83f92dcd4a4ba9ab8341c3edcc094a .gitignore SHA1 e3115e22a27fdd5134a59970fbc5e7529a5ddf3e CHANGES SHA1 517bff80bcf518746150086148acaf8cfa37a17d CREDITS SHA1 5ca9bb45657728092eb1aa886e1e2b1826136c70 MANIFEST SHA1 7508fd127843a69e30ba4f58f4b4e769f20d49e2 MANIFEST.SKIP SHA1 30e7384a7dea93c40bd5f5dbb82dadc73e1302a8 META.json SHA1 e46bc208078209dc13f72b8cd6e1b4a53dad5a9b META.yml SHA1 fd14642d591e132078fc91a8e54a4a4fed927f46 Makefile.PL SHA1 2223f7e51619714199f2d5cc232b5aa0e514364f README SHA1 36ea8eabe5ac80acc416411aae77b60e1480de1b TODO SHA1 d377efc30a865c1b5e811b383f7363abc92b1fb5 dev/Info.pm.tmpl SHA1 c11e7408bd16d35b2116ee47eaac4f08266be902 dev/build.pl SHA1 38b386e67725abff64ea00abb8e92c46f38e2f59 exifdump SHA1 fdf710d6580548b5fe62be0fd9151bc196537c17 img/anim.webp SHA1 0e2ed058a8e6b748c639b08064f6782c4f51d643 img/bad-exif-1.jpg SHA1 c11f86df48ca57d0364c9afd1449683ebf1979f4 img/be.tif SHA1 951a303482fb78bc02c65e8310854a7be975bfca img/cynic_hang.jpg SHA1 49a6dcd04263d15377be6e7ced44f4e3ce01437c img/gps.jpg SHA1 4243d003552c27c110b75ca121294d5edddc62a8 img/graph.svg SHA1 07f4778b513d5c951c1878c376fba49ff0ecd644 img/interlace.png SHA1 33558c6666a3e1918b80d3a4d644a186d0e44b0d img/itxt.png SHA1 4a3ce1019593f1f1334f02a0722cba6e22a2b3e4 img/itxt2.png SHA1 402ba907d6dcb2c27e1b9a57268b387bc7c00eab img/itxt3.png SHA1 979ea4a5afe76a6532fe21a2724c3dfc8405bb2a img/le.tif SHA1 5274644b89b81daafccd469ff024e9b22a677db1 img/no-thumbnail.jpg SHA1 acccfe940ec2abc5bb18787c212f1ba2340793a1 img/segfault.tif SHA1 2cda53a351b2c683e154e82caf843e3e630804f3 img/test-corruptchunk.jpg SHA1 feb2bf35dbbcb5ce477fe946c17beea9f15aec21 img/test-exif.webp SHA1 feaec718770ec0de7fc1010827425eca5b268fb8 img/test-gimp.xbm SHA1 1c06aac0845d63d93dc09ca3ab7a03a6b309a68a img/test-lossless.webp SHA1 1f561889c44c24dae57de74f65401ca7bc089a87 img/test-multi0xff.jpg SHA1 44e527641f2af0aadfb1dcc9a7f301f258d8f77d img/test-notrailer.gif SHA1 75da6beb9439bc07a0cd8537ce21689d560452da img/test-unknowncode.gif SHA1 5d3db653df616830a6a135d862e30e355464a43a img/test.gif SHA1 11f4a1f61f932b1eb96d1ab45beb681488e4c13d img/test.ico SHA1 6299f38bf7c592409362601fe34a5b0baafdcf47 img/test.jpg SHA1 3ffdf0d8f92b3548aefe19e88ba7365b98315377 img/test.pbm SHA1 ded4506e3a536c422794966d685141cd868b4f08 img/test.pgm SHA1 9edfc7ab4cb4808f70d1fea5aa7cc74694c36d6e img/test.png SHA1 cc4e7c8487ba03b141b24983650549e3bed22abf img/test.ppm SHA1 1e4af5ca289c895e0499d40b04781afc3e748ca4 img/test.rle SHA1 b51c0ee17e88970b032f96026119d16ab667b686 img/test.svg SHA1 f345165b605868be0b843fe6f98e5243a449b7d4 img/test.tif SHA1 1cce96f5245e8ea5c13dccb34a44d73de8c4bc4a img/test.wbmp SHA1 ebe53d208fc0fa62603bd87f412fc818a1e03c45 img/test.webp SHA1 8a8f9bfb0a791f01f5aeecb29d095bdb94b16d43 img/test.xbm SHA1 d7ead6bd7acf3aa703424697913c5a0e9c2e9244 img/test.xpm SHA1 2d2565cc6074fc831924dd378a4a579415505cfb img/test0-fuji.jpg SHA1 603d6eed47d8822cf4bae53bafa18b8044c035a6 img/test1-fuji.jpg SHA1 d33e338aa7a45dc6fa4cefcdd376916e2267f3f9 img/tiny.pgm SHA1 e403a1722e5d26002d8afbf29bd497c60f8ee05f img/upside-down.bmp SHA1 5023229b3010b9e9ec663ce10e29bd3cbe5486c8 img/xxe.svg SHA1 684ef627299906409c258ed2a66990a26dd13794 img/ztxt.png SHA1 376cc1bd8424b1123f0073df81ce5433be4df58e imgdump SHA1 9e668ca8d7f8778315883dc8f9cb751cbfcae51e lib/Bundle/Image/Info/Everything.pm SHA1 222dd2400f89771096842e1a5b4264534aee5935 lib/Bundle/Image/Info/PNG.pm SHA1 e6fe98aa5a30dbd290668cffa515aebaf14828fa lib/Bundle/Image/Info/SVG.pm SHA1 fa3a601365ec108901e991a8148b62c2bf3dd62b lib/Bundle/Image/Info/XBM.pm SHA1 7ae5950ba4474e8099068ca6122e67cadce60842 lib/Bundle/Image/Info/XPM.pm SHA1 231dd1bff79a57b155571eb5b0b604616a890ed0 lib/Image/Info.pm SHA1 6991a957bacde9d3b873184d90d910d083f5f403 lib/Image/Info/BMP.pm SHA1 0996bffe073126dceb72c04dc5b3002c78c24d56 lib/Image/Info/GIF.pm SHA1 fb628cb66c566ab66a1b7953a1bb29cfde1c79c7 lib/Image/Info/ICO.pm SHA1 cb662c31e3429214bdc9f1e7b65fac2c4198f689 lib/Image/Info/JPEG.pm SHA1 9aaff0bcddae56a1da3bc7dd04e5086760e5fe4c lib/Image/Info/PNG.pm SHA1 1b69276ab386d1795469773d6af70ff510c15feb lib/Image/Info/PPM.pm SHA1 badd075bff5f88975bcbff1eb2d4cdf84fe5a2ca lib/Image/Info/SVG.pm SHA1 c8aa83ad22ff1684a40bae3f37fccc358842b1d1 lib/Image/Info/SVG/XMLLibXMLReader.pm SHA1 c1fe64b6ad5faeeab7d690cd44fd0feaf56952ee lib/Image/Info/SVG/XMLSimple.pm SHA1 04be3e8792943ab9b61dcdc89e1f31b70dc60996 lib/Image/Info/TIFF.pm SHA1 ed6fde11752d6450756c815b2dca25f9ad1740d9 lib/Image/Info/WBMP.pm SHA1 d4a5013ec81db219edd32f273d1be370b5cda9fd lib/Image/Info/WEBP.pm SHA1 5c896ca4cc89715527f4207bae3c1e3c7a26286a lib/Image/Info/XBM.pm SHA1 4a5050fdcef00704e7d1fa2ae8751aa34a866f63 lib/Image/Info/XPM.pm SHA1 e87d3595864dcd02e59c86fc6e8aa50fb7a283d1 lib/Image/TIFF.pm SHA1 34e6def40374dc924ea7ef58c5aa04e04a783295 t/00_basics.t SHA1 38883a0d98f01e4e749168369848f3ab5b5c7660 t/bad_exif.t SHA1 aaf002b3e5103e15dad27d59bbf2ce7d84caf79e t/bmp.t SHA1 7cddff7d8bccd9b2e303554d31ad6f8891b7705b t/exif.t SHA1 86a7363e633fe7635f623f8a31cadebde585d0b3 t/fuji_s1000fd_substr_outside_of_string.t SHA1 919ad6c0fc44c3458cfd6cce90c665cecf83c287 t/ico.t SHA1 ba1cf7c01b0de6f449a90815bf7db5a3b1645e3d t/jpg_corruptchunk.t SHA1 3443c36fd2dbc7f58599cf175e0793c5e8601ea9 t/jpg_hang.t SHA1 026bdd691c1971289451e147b8ecf1c99463e74d t/jpg_ignore_thumbnail.t SHA1 79380e179b840468bef4ab231f1bc7ac93081ed2 t/png.t SHA1 cc217a37ee14356bb57e4ea32c1eda94d1a2d8c9 t/pod.t SHA1 ddac1596c132f80e81355cc048def2733163a9aa t/pod_cov.t SHA1 710bb49a5428b9b0301ec451f8d869b58937b746 t/string.t SHA1 2cf4f2b872c4217539c325173110d196ea7c3070 t/svg.t SHA1 1e8a42e9b7d911936853446ef907f8f74072d08f t/tiff.t SHA1 76e7e08522799dc0f39896c8925aff1d42b09da4 t/tiff_e.t SHA1 c08bf003a891603d6f5f098425a70680a699e31a t/tiff_segfault.t SHA1 0a5f7c518af4b72fd76fa8def1f51e8691727bdd t/tiny-pgm.t SHA1 7d7708b0392491f75eb9b68289469c1a488453ca t/wbmp.t SHA1 8f93c43d2d328e2ed79b8bbf817cc073d491a53f t/webp.t SHA1 cea87cb4a68f31dd245d911d0c43b581939c3f34 t/xbm.t SHA1 982933644977d3879d1b2a269bdfb1ef45723481 t/xpm.t SHA1 4396e44dfbfe4c2ff26d115bc0eadbce507b7bf0 xt/kwalitee.t SHA1 14f51fc143d06dad6d47a810596799652928221e xt/rt118099.t SHA1 6ef907e37bb4840f96f8d5b16b47991806f21f31 xt/strict.t SHA1 776c2c96e3155a622221cb1c4989579a652452d7 xt/synopsis.t -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAEBAgAGBQJdqrESAAoJEN1GkmBlfE8/+O8H/3p3MDZNqc91mqBBEExjwDPv ifXolC7lea2ZXn5s6i3VJArYmCD7a1g3SCCxJnN0IXfQirNWgjTuX4k3+PVRX57p ce7zpGNxhklprIkdlJd077SSnTVcyzcoJKZ4Ym3bW4GrPotrco/FfDCuADoOwhmw DcfID/PEcvGLi6cRH1soaTHlhiNhmI4xfeCe7V0IF+Cz2v3XhSIiKh4AFaa2dZkZ 9qOWZ6BgnHK5m2aQhZNvhiHfdWLoWxS243VcZ9IjEi9FLmN78FmbSag+zZ4FAgsZ 90wosyPcs0i41u8gsnpN434yJkWqOYDeh9S567g/YzEZi3uQoD/7RGJoCm0mTy0= =T0QP -----END PGP SIGNATURE----- ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/META.yml����������������������������������������������������������������������������0000644�0001750�0001750�00000001444�13552530422�014170� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������--- abstract: 'Extract meta information from image files' author: - 'Slaven Rezic <srezic@cpan.org>' - 'Gisle Aas <gisle@ActiveState.com' - Tels build_requires: ExtUtils::MakeMaker: '0' configure_requires: ExtUtils::MakeMaker: '0' dynamic_config: 1 generated_by: 'ExtUtils::MakeMaker version 6.98, CPAN::Meta::Converter version 2.142690' license: perl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: '1.4' name: Image-Info no_index: directory: - t - inc - dev - img - xt recommends: Bundle::Image::Info::PNG: '0' Bundle::Image::Info::SVG: '0' Bundle::Image::Info::XBM: '0' Bundle::Image::Info::XPM: '0' requires: IO::Scalar: '0' perl: '5.006' resources: repository: git://github.com/eserte/image-info.git version: '1.42' ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/CHANGES�����������������������������������������������������������������������������0000644�0001750�0001750�00000052302�13552530277�013721� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Revision history for Image::Info 2019-10-19 Slaven Rezic <slaven@rezic.de> Release 1.42 Stable release with all changes in 1.41_50 2019-10-16 Slaven Rezic <slaven@rezic.de> Release 1.41_50 Support for WEBP files (RT #130529) (by Nicolas Clark) Cease a warning (by H.Merijn Brand) Various minor test and CI polishing 2017-07-12 Slaven Rezic <slaven@rezic.de> Release 1.41 Stable release with the change in 1.40_50 Additionally more diagnostics in t/string.t 2017-06-30 Slaven Rezic <slaven@rezic.de> Release 1.40_50 Support iTXt chunks in PNGs (RT #122285) (by Nicholas Clark) 2017-03-21 Slaven Rezic <slaven@rezic.de> Release 1.40 Stable release with the change in 1.39_50 2017-03-19 Slaven Rezic <slaven@rezic.de> Release 1.39_50 Rational values work again (RT #117480) Fix warnings while processing PNGs (RT #118495) (by Johan Vromans) Pod spelling fixes (by Salvatore Bonaccorso and Slaven Rezic) 2016-10-08 Slaven Rezic <slaven@rezic.de> Release 1.39 Stable release with all changes in 1.38_50..1.38_51 2016-10-01 Slaven Rezic <slaven@rezic.de> Release 1.38_51 Just recreated distribution with a changed SIGNATURE. Release 1.38_50 Don't allow XXE (XML External Entities) processing while parsing SVG files. Addresses RT #118205. This is a potentially incompatible change; however usually SVG files do not rely on XXE. 2015-04-19 Slaven Rezic <slaven@rezic.de> Release 1.38 Pod typo fixes (by hatorikibble) New xt tests (synopsis, strict, kwalitee, by hatorikibble) 2014-12-31 Slaven Rezic <slaven@rezic.de> Release 1.37 Stable release with all changes in 1.36_51..1.36_52 2014-12-29 Slaven Rezic <slaven@rezic.de> Release 1.36_52 Handle invalid TIFF chunks: stop processing if an unrecognized fieldtype is encountered. This is an additional fix for RT #100847. 2014-12-19 Slaven Rezic <slaven@rezic.de> Release 1.36_51 Use IO::Scalar instead of opening a scalar, for all perls < 5.21.7. This is to prevent possible segmentation faults with faulty images. See RT #100847 and https://rt.perl.org/Ticket/Display.html?id=123443 Fix a "Variable declared in conditional statement" error. Fix a couple of typos. 2012-07-05 Slaven Rezic <slaven@rezic.de> Release 1.36 Stable release with all changes in 1.35_50..1.35_51 2013-06-28 Slaven Rezic <slaven@rezic.de> Release 1.35_51 Ignore reading jpeg thumbnail image with no content, patch provided by Kosei Moriyama, https://github.com/eserte/image-info/pull/2) 2013-05-06 Slaven Rezic <slaven@rezic.de> Release 1.35_50 Fixed pod_cov.t test. 2013-04-10 Slaven Rezic <slaven@rezic.de> Release 1.35 Stable release with the change in 1.34_50 2013-04-03 Slaven Rezic <slaven@rezic.de> Release 1.34_50 image_info on Jpeg with bad EXIF data produced "substr outside of string" exception in Image::TIFF (RT #84122, patch provided by Steve Purkis) 2013-02-29 Slaven Rezic <slaven@rezic.de> Release 1.34 Stable release with all changes in 1.33_50..1.33_51 2013-01-28 Slaven Rezic <slaven@rezic.de> Release 1.33_51 Handle corrupt JPEG files with extraneous bytes 2013-01-25 Slaven Rezic <slaven@rezic.de> Release 1.33_50 Limited support for WBMP files. 2012-11-03 Slaven Rezic <slaven@rezic.de> Release 1.33 Added test image for RT #78471. 2012-10-25 Slaven Rezic <slaven@rezic.de> Release 1.32_52 Handle BMP files with negative heights (RT #78471). 2012-10-24 Slaven Rezic <slaven@rezic.de> Release 1.32_51 Signature fix. 2012-10-23 Slaven Rezic <slaven@rezic.de> Release 1.32_50 Repacked because of Module::Install 1.04 problems (see mail from Miyagawa). Now Image::Info is again using good old EUMM. 2012-02-21 Slaven Rezic <slaven@rezic.de> Release 1.32 Stable release with all changes in 1.31_50..1.31_51 2011-12-28 Slaven Rezic <slaven@rezic.de> Release 1.31_51 Release 1.31_50 SVG files without XML preamble are now also recognized. Bundled Module::Install 1.04. 2010-09-25 Slaven Rezic <slaven@rezic.de> Release 1.31 Stable release with all changes in 1.30_50..1.30_53 Patch by Tony Hook to fix handling of PPM files with 2 bytes/sample. 2010-02-09 Slaven Rezic <slaven@rezic.de> Release 1.30_53 Repacked because Module::Install 0.93 does not ignore xt tests. See https://rt.cpan.org/Ticket/Display.html?id=54450 2010-02-09 Slaven Rezic <slaven@rezic.de> Release 1.30_52 Force using libxml's SAX parser. Fixed some PPM issues (e.g. incomplete header, numify width/height...) 2009-11-22 Slaven Rezic <slaven@rezic.de> Release 1.30_51 Fixes in GIF reader (unknown intro codes are now only warnings, application chunks are forced into the first image data) Added some test images for previous fixes. 2009-11-14 Slaven Rezic <slaven@rezic.de> Release 1.30_50 Support for Microsoft .ico files (Image::Info::ICO). Fixes in JPEG parsing (skip pad 0xFF in markers). Fixes in GIF reader ("trailer" seems to be optional). Somewhat better recognition of XBM files. XPM handling: Corrected color parsing. Try harder to find X11's rgb.txt. Ignore comments in rgb.txt. Reordered magic checks to have more common image formats first. Introduced Bundles. Some Pod cleanups. Additional author tests in xt. 2009-10-31 Slaven Rezic <srezic@cpan.org> Release 1.30 Stable release with all changes in 1.29_51..1.29_53 2009-09-23 Slaven Rezic <srezic@cpan.org> Release 1.29_53 SVG parsing: load_ext_dtd is now set to false, to avoid unnecessary possible network connections; this is also ceasing errors with libxml 2.7.x. 2009-09-16 Slaven Rezic <srezic@cpan.org> Release 1.29_52 More diagnostics in failing tests. Added tests cases for RT #49546. 2009-09-14 Slaven Rezic <srezic@cpan.org> Release 1.29_51 Fixed "substr outside of string" problem with Fujifilm FinePix S1000fd images (RT #49546) 2009-08-14 Slaven Rezic <srezic@cpan.org> Release 1.29_50 Marked Compress::Zlib as recommended module and skip a test if it is not installed (RT #48415) 2009-07-31 Slaven Rezic <srezic@cpan.org> Release 1.29 SVG parsing is now done by XML::LibXML::Reader, if available, otherwise the old XML::Simple-based code is used. Using the new code is much more memory efficient and faster. The old module can still be used by setting @Image::Info::SVG::PREFER_MODULE Removed deprecation notice. Bundled Module::Install 0.91. Ceased a warning in the JPEG parsing code with perl 5.6.x. Lowered minimum required Perl version to 5.6.0 (There's no evidence that it does not work with that Perl version). Ceased warnings when reading PNG files with ztxt (compressed comment) chunk (RT #28054) 2008-03-30 v1.28 Tels 128 tests * raise minimum required Perl version to v5.6.2 (it doesn't work on 5.005 anyway, open() with three arguments is not supported there and I don't have time to rewrite the code for outdated Perl versions. If you need it to run on 5.005, write a patch and file a bug report please.) * fix bug #15167: Incorrect width and height for JPG files (the fix now keeps the highest value for width/height, instead of creating an array ref with all the values) * remove Build.PL (bundle Module::Install 0.71) 2007-12-15 v1.27 Tels 128 tests * add both main authors to META.yml (does not work yet due to bug in Module::Install) * fix bug #30890: [PATCH] Transposed lines in documentation * fix bug #31165: Add attribute for parsing TIFF images (Thanx Adam Witney!) 2007-09-09 v1.26 Tels 128 tests * clarify the license by adding "v5.8.8" (otherwise it is quite unclear which Perl version, release or product the license text refers to) * fix bug #29088 - Another hanging image * fix bug #29243 - Exiftext fields (like UserComment) not parsed correctly 2007-05-25 v1.25 Tels 127 tests * fix bug #26130 - hang in parsing JPG/TIFF images with repeating block numbers 2007-02-24 v1.24 Tels 125 tests * fix bug #22507: add missing compression modes for TIFF * fix bug #25032: fix TIFF ASCII text field handling (Thanx BJWHEELER!) (This enables, among other things the ImageDescription tag for TIFF files) 2006-09-30 v1.23 Tels 122 tests * regenerate the stale META.yml file * fix svg.t failing if no XML::Simple was installed (bug #21166) * fix _process_ifds call (missing underscore) (Thanx to Dermot Paikkos!) 2006-07-16 v1.22 Tels 123 tests * fix bug #19071: byteorder for TIFF on 64-bit systems broken * better error message in case SOI is missing in a JPEG (still no fix for #20183) * SVG: + use the correct MIME type "image/svg+xml" + version extraction was broken + comments had too much whitespace at front/end (these should be ignored and not extracted anyway) * add svg.t * resize test.jpg and test.png to make dist smaller * add interlace.png and beef up t/png.t 2006-05-01 v1.21 Tels 96 tests * move the code to build Info.pm to dev/build.pl * include a pre-generated Info.pm into MANIFEST (fixes the indexing issue with CPAN) * dont use Symbol(), it is required before its usage anyway * allow exporting of determine_file_type and image_type * remove a needless diag message in string.t (Thanx jpo!) * add two test TIFFs (little/big endian) and a test file (Thanx jpo!) * create a new, much smaller test.rle file * more tests in t/bmp.t 2006-03-13 v1.20 Tels 74 tests * a few additions to Panasonic MakerNote in EXIF parsing * use Module::Install 0.60 to fix breakage from 0.58 * fix bug #8193: Adds direct access to the determine_file_format logic With the following changes: + read only 11 bytes to determine file format (tiny.pgm is 11 bytes long) + fix provided patch to really work * fix bug #18147: + new TIFF code failed if the system endianness didn't match the TIFF image endianness - thanx jpo! * replace the link to the TIFF spec with a public link - thanx jpo! 2006-03-05 v1.19 Tels 74 tests * finally fix bug #6558: (Thanx jpo!) + fix typos: Image::X(B|P)M must be Image::X(p|b)m (Thanx jpo!) + fix missing semicolon in Image/Info/XPM.pm + Image::Info::XPM and Image::Info::XBM: add -width and -height to new() * add POD for process_file() into SVG, Xbm and Xpm * a few additions to Panasonic MakerNote in EXIF parsing * add doc about EXIF being wholly incomplete and using Image::ExifTool * apply patch, tests and add test.tif from Ben Wheeler, Thanx!: + fix bug #7442 Infinite loop of errors in Image::Info::TIFF + fix bug #3698 Broken BitsPerSample handling in TIFFs 2006-03-03 v1.18 Tels 61 tests * fix bug #6558: Image::Info 1.16 -> fails two tests (Thanx jpo!) + make string.t use strict, Test::More and simplify it + let string.t skip tests if Image::Xpm, Image::Xbm or XML::Simple are not installed (these would formerly silently fail) + Image::Info::XPM and Image::Info::XBM now handle in-memory files better + fix also pod_cov.t warnings (was "Image::Info.pm" vs "Image::Info") * reduce img/test.gif in size, it did eat up 1/3 of the entire dist size * reducing test.jpg with GIMP reveals a bug in EXIF parsing (not yet fixed) * MakerNote parsing: + add support for Panasonic cameras + for the following manufacturers we do not check the camera model, this gets all cameras, even yet unreleased ones to work: + Canon + Panasonic + Casio + Olympus + Fujifilm + UNDEFINED/ASCII strings from MakeNotes might have wrong length due to trailing \x00 chars, so we remove them and set the correct length * update one more URL for EXIF specs * imgdump uses Data::Dumper (not Data::Dump) * Install/build: + use Module::Install and bundle it, clean Makefile.PL up + add a compat Build.PL file * add a CREDITS file * PPM.pm: add VERSION, and POD * various POD fixes and additions * various small code cleanups 2006-01-28 v1.17 Tels 48 tests * new maintainer: TELS * signed with my key * convert tests to Test::More * add pod.t and pod_cover.t * fix all POD errors * use strict in Makefile.PL and generate custom META.yml * don't include lib/Image/Info.pm - it is autogenerated anyway * html_dim() returns lowercase and properly quoted, for SVG/XHTML etc., e.g. you get now 'width="900" height="800"' * fix bug #8136: update URL for EXIF standard * fix bug #8522 - dies at JPEGInterchangeFormatLngth (Thanx srezic@cpan.org) * fix also: EXIF says it is "JPEGInterchangeFormatLength", and not "...Lngth" * fix bug #5165: (duplicate of #8522) * fix bug #6018: FocalPlaneResolutionUnit decoded wrongly * fix bug #6083: add support for MakerNote for Nikon D70/D100 * fix bug #16161: netpbm images may have more than 8bit/channel 2004-01-07 Gisle Aas <gisle@ActiveState.com> Release 1.16 Support for Canon 300D/Digital Rebel. Patch contributed by Karl Palsson <kpalsson@cisco.com>. Cleaned up SVG/XPM/XBM implementations so that they don't try to override carp/croak in other modules. 2003-10-06 Gisle Aas <gisle@ActiveState.com> Release 1.15 Avoid IO::String dependency for perl-5.8. It was supposed to work but did not. 2003-10-06 Gisle Aas <gisle@ActiveState.com> Release 1.14 Support TIFF/Exif GPS tags. 2003-10-06 Gisle Aas <gisle@ActiveState.com> Release 1.13 The module reported the SamplesPerPixel field as SamlesPerPixel for PPM files. Patch contributed by Geoff Richards <qef@ungwe.org>. Image::Info was not able to handle files smaller than 32 bytes. Support for Olympus C-700UZ and fix for the Olympus-JpegQual attribute contributed by Nick Hibma <n_hibma@van-laarhoven.org>. Support for Canon makernote. Contributed by John Cavanaugh <john-cavanaugh@attbi.com>. IO::String v1.02 core dumps fixed by depending on v1.03. 2002-12-30 Gisle Aas <gisle@ActiveState.com> Release 1.12 Don't require IO::String for perl-5.8 as it has that feature built in. Based on patch by Slaven Rezic <slaven.rezic@berlin.de>. Looks like the TIFF support that was really functional because I forgot to add lib/Image/Info/TIFF.pm to the MANIFEST :-( Support for Exif 2.2 tags contributed by Stephane Bailliez <sbailliez@apache.org>. Support Olympus C4000Z MakerNote also from Stephane Bailliez. 2002-07-04 Gisle Aas <gisle@ActiveState.com> Release 1.11 More robust TIFF parser that keeps on going if some of the fields appears to be garbage. Workaround for "Samsung Digimax 200"'s brain-dead resolution values. Updated some tags based on the Exif 1.2 spec. Minor fix to exifdump example program so that it can actually dump the test.jpg 2002-05-28 Gisle Aas <gisle@ActiveState.com> Release 1.10 Support for "FUJIFILM FinePix6900ZOOM" and "Canon Canon EOS D60". The Fuji support was contributed by Cyril L. Pertsev <kika@kika.ru> and also included infrastructure for decoding of EXIF tags with UNKNOWN value types. Deal with signed TIFF values. 2001-12-14 Gisle Aas <gisle@ActiveState.com> Release 1.09 Use File::Spec in Makefile.PL to improve portability. Patch by Chris Nandor <pudge@pobox.com>. Extended support for decoding of maker specific tags for Nikon E995 and Olympus 3040Z. TIFF support contributed by <clarsen@emf.net>. Decoding of JPEG color components by <tkil@scrye.com>. 2001-08-24 Gisle Aas <gisle@ActiveState.com> Release 1.08 The html_dim() function did not work at all. Patch by Hans-Georg <hgf@berlin.snafu.de>. Removed ASCII image support. TIFF rational numbers are now blessed and use overloading to convert themselves to strings and numbers in a more sensible way. They are still references to arrays containing 2 numbers. GIF global color table reading fix. Patch by Tom Hargreaves <admin@traderwebs.co.uk>. Support for zTXt chunks in PNG. This only works when the Compress::Zlib module is available. Contributed by Chip Marshall <chip@setzer.chocobo.cx> Updated Exif URIs in documentation 2001-04-10 Gisle Aas <gisle@ActiveState.com> Release 1.07 Image::Info::BMP should not use architecture-dependent unpack descriptors. Fix by <Jost.Krieger@ruhr-uni-bochum.de>. 2001-03-26 Gisle Aas <gisle@ActiveState.com> Release 1.06 Avoid using sysread in Image::Info::BMP. Avoids failures because of mixing of hi- and low-level file reading operations. 2001-03-24 Gisle Aas <gisle@ActiveState.com> Release 1.05 Exif MakerNote decoding implemented by Jay Soffian <jay@loudcloud.com>. His patch support the following camera models: NIKON E700 NIKON E800 NIKON E900 NIKON E900S NIKON E910 NIKON E950 NIKON E880 NIKON E990 NIKON CORPORATION NIKON D1 OLYMPUS OPTICAL CO.,LTD C2000Z OLYMPUS OPTICAL CO.,LTD C2100UZ OLYMPUS OPTICAL CO.,LTD C2500L OLYMPUS OPTICAL CO.,LTD C3030Z OLYMPUS OPTICAL CO.,LTD E-10 FUJIFILM FinePix4900ZOOM FUJIFILM FinePix40i FUJIFILM FinePix4700 ZOOM FUJIFILM FinePixS1Pro CASIO QV-3000EX Canon Canon EOS D30 Canon Canon DIGITAL IXUS Canon Canon DIGITAL IXUS 300 Canon Canon PowerShot G1 Canon Canon PowerShot Pro90 IS Canon Canon PowerShot S10 Canon Canon PowerShot S20 Jay's exifdump program included. 2000-11-30 Gisle Aas <gisle@ActiveState.com> Release 1.04 Allow extra image_info() arguments to pass through to the image format handlers. This make the histogram and color palette returns functional again. Distribute a copy of lib/Image/Info.pm so that search.cpan.org finds it. 2000-11-13 Gisle Aas <gisle@ActiveState.com> Release 1.03 Support for even more image formats added by Jerrad Pierce: - Added support for ASCII and BMP/DIB/RLE - Palettes are only returned if requested (see documentation) - Added Luminance Histogram for ASCII, XBM, XPM 2000-11-10 Gisle Aas <gisle@ActiveState.com> Release 1.02 Avoid direct hardcoding of image file magic and doc by generating lib/Image/Info.pm in Makefile.PL XBM/XPM/SVG support contributed by Jerrad Pierce <belg4mit@mit.edu>/<webmaster@pthbb.org> 2000-10-31 Gisle Aas <gisle@ActiveState.com> Release 1.01 GIF parsing fixes from Ralf Steines <metamonk@yahoo.com>: - GIF 'DisposalMethod' and 'UserInput' now show proper values. - GIF 'TransparencyIndex' now appears in the info hash. - GIF anims with local color tables don't fail anymore (table size calculation bug). - Added: GIFs marked as 87a which contain graphics control extension blocks don't fail anymore, GIF is parsed anyway but $info->{warn} contains 'GIF 89a extensions in 87a'. 2000-10-18 Gisle Aas <gisle@ActiveState.com> Release 1.00 IO::String is now a PREREQ module. Added PPM/PGM/PBM support Improved documentation. Standardized on how "resolution" is expressed. The field in now mandatory. All comments are now found as "Comment" tag. Pick up data about thumbnails embedded in JPEG Exif files. 2000-08-24 Gisle Aas <gisle@ActiveState.com> Release 0.05 Passing a reference to a scalar as argument to img_info() indicates that this scalar contains raw image data. If you want to use this feature, you need to install the IO::String module first. 2000-01-04 Gisle Aas <gisle@aas.no> Release 0.04 Renaming of keys for things that are common across file formats. Common things now use lowercase keys. Better support for JPEG JFXX chunks Better determination of color_type for JPEG Partial support for App14-Adobe chunks in JPEG Support sBIT chunks for PNG 1999-12-25 Gisle Aas <gisle@aas.no> Release 0.03 Eliminated Image::TIFF::Exif. The TIFF module now knows about the Exif tags by itself. Errors are returned as a hash too. Start on Image::Info POD Various tweaks to the reported info keys for JPEG/PNG/GIF. Support Netscape's Loop extension to GIF. Support ColorTable dump for GIF and PNG. Support FileMediaType/FileExt for all image formats. Report number of repeated chunks in PNG_Chunks values. 1999-12-22 Gisle Aas <gisle@aas.no> Release 0.02 Removed external OO interface. The main interface is now an plain function called image_info() that returns one or more hashes. One hash per image found in the file. Exif/TIFF integer that are codes representing something else are now expaned. TIFF Rational values are reduced to plain integers when possible. Added GIF support Added some test scripts 1999-12-19 Gisle Aas <gisle@aas.no> Release 0.01 (now Image-Info) New common framwork that can support many image formats. Added JPEG support Added PNG support 1999-12-14 Gisle Aas <gisle@aas.no> First try, released as Image-Exif-0.01 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/exifdump����������������������������������������������������������������������������0000755�0001750�0001750�00000001471�11253753022�014465� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w use lib 'lib'; use strict; use Image::Info qw(image_info); my $i=image_info($ARGV[0]); foreach (sort keys %$i) { if ($i->{$_} =~ /[\001-\037\177-\377]/ && !/error/) { printf "%s ->\n" ,$_; hex_print($i->{$_}); next; } $i->{$_} =~ s/\000//g; printf "%s -> %s\n" ,$_, ref($i->{$_}) ? deref(@{$i->{$_}}) : $i->{$_} }; sub deref { my @args; if (ref($_[0]) eq 'ARRAY') { foreach my $ref (@_) { push(@args, deref(@{$ref})) } } else { @args = @_; } '[' . join(',',@args) . ']'; } sub hex_print { for (my $i=0; $i<length $_[0];$i+=16) { my $ss = substr($_[0],$i,16); printf " %04x: %s ", $i, join(' ',grep !/^$/,split(/(..)/,unpack("H*",$ss))); $ss =~ tr /\000-\037\177-\377/./; print $ss,"\n"; } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/MANIFEST����������������������������������������������������������������������������0000644�0001750�0001750�00000004417�13552530422�014053� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.gitignore CHANGES CREDITS dev/build.pl dev/Info.pm.tmpl Will become lib/Image/Info.pm exifdump Test driver script img/anim.webp WebP animation img/bad-exif-1.jpg img/be.tif img/cynic_hang.jpg cycle in IFD's causing hangs in older than v1.25 img/gps.jpg img/graph.svg img/interlace.png Interlaced PNG example img/itxt.png img/itxt2.png img/itxt3.png img/le.tif img/no-thumbnail.jpg img/segfault.tif img/test-corruptchunk.jpg img/test-gimp.xbm img/test-multi0xff.jpg img/test-notrailer.gif img/test-unknowncode.gif img/test.gif An GIF example img/test.ico img/test.jpg An Exif example from my Digicam img/test.pbm img/test.pgm img/test.png An PNG example img/test.ppm img/test.rle img/test.svg img/test.tif img/test.wbmp img/test.webp WebP lossy img/test-exif.webp WebP "extended format" img/test-lossless.webp WebP lossless img/test.xbm img/test.xpm img/test0-fuji.jpg Testcase for RT #49546 img/test1-fuji.jpg Testcase for RT #49546 img/tiny.pgm img/upside-down.bmp img/xxe.svg Testcase for RT #118099 img/ztxt.png PNG example with ztxt chunk imgdump Test driver script lib/Bundle/Image/Info/Everything.pm lib/Bundle/Image/Info/PNG.pm lib/Bundle/Image/Info/SVG.pm lib/Bundle/Image/Info/XBM.pm lib/Bundle/Image/Info/XPM.pm lib/Image/Info.pm lib/Image/Info/BMP.pm lib/Image/Info/GIF.pm lib/Image/Info/ICO.pm lib/Image/Info/JPEG.pm lib/Image/Info/PNG.pm lib/Image/Info/PPM.pm lib/Image/Info/SVG.pm lib/Image/Info/SVG/XMLLibXMLReader.pm lib/Image/Info/SVG/XMLSimple.pm lib/Image/Info/TIFF.pm lib/Image/Info/WBMP.pm lib/Image/Info/WEBP.pm lib/Image/Info/XBM.pm lib/Image/Info/XPM.pm lib/Image/TIFF.pm Parse TIFF tags Makefile.PL MANIFEST MANIFEST.SKIP README t/00_basics.t t/bad_exif.t t/bmp.t t/exif.t t/fuji_s1000fd_substr_outside_of_string.t Testcase for RT #49546 t/ico.t t/jpg_corruptchunk.t t/jpg_hang.t t/jpg_ignore_thumbnail.t t/png.t t/pod.t t/pod_cov.t t/string.t t/svg.t t/tiff.t t/tiff_e.t t/tiff_segfault.t t/tiny-pgm.t t/wbmp.t t/webp.t t/xbm.t t/xpm.t TODO xt/kwalitee.t xt/rt118099.t xt/strict.t xt/synopsis.t META.yml Module YAML meta-data (added by MakeMaker) META.json Module JSON meta-data (added by MakeMaker) SIGNATURE Public-key signature (added by MakeMaker) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/imgdump�����������������������������������������������������������������������������0000755�0001750�0001750�00000000262�11253753022�014303� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w use lib "./lib"; use strict; use Image::Info qw(image_info); use Data::Dumper; while (@ARGV) { print Data::Dumper::Dumper(image_info(shift)), "\n"; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/CREDITS�����������������������������������������������������������������������������0000644�0001750�0001750�00000002451�11302305677�013741� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� Special thanx go to Gisle Aas, the main author and contributor. The Exif code is written based on TsuruZoh Tachibanaya's "Description of Exif file format" and Thierry Bousch's Python module 'exifdump.py' http://www.butaman.ne.jp/~tsuruzoh/Computer/Digicams/exif-e.html http://topo.math.u-psud.fr/~bousch/exifdump.py The following list is in alphabetical order. If you contributed to Image::Info and miss your name on the list, please file a bug report at https://rt.cpan.org or send email to the current maintainer: Adam Kennedy <cpan@ali.as> image_type() Ben Wheeler <b.wheeler@ulcc.ac.uk> TIFF bugfixes and patches <clarsen@emf.net> TIFF support Doug Larrick <doug@ties.org> Nikon D70/D100 MakerNote patch Gisle Aas Main author and contributor H.Merijn Brand <h.m.brand@xs4all.nl> 64 bit patches, tests & feedback Jay Soffian <jay@loudcloud.com> Exif MakerNote decoding Jerrad Pierce <belg4mit@mit.edu> ASCII, BMP SVG, XPM and XBM support José Pedro Oliveira <jpo@di.uminho.pt> XBM/XPM/TIFF bug reports and patches TIFF endian tests Testing on Mac and PPC Phil Harvey <phil@owl.phy.queensu.ca> Panasonic Exif MakerNotes Ralf Steines <metamonk@yahoo.com> GIF fixes Slaven Rezić <srezic@cpan.org> Maintainer from 2008 on Tels <http://www.bloodgate.com> Maintainer between 2006 and 2008 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/README������������������������������������������������������������������������������0000644�0001750�0001750�00000001174�13551664101�013600� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������This Perl extension allows you to extract meta information from various types of image files. The following file formats are supported: JPEG (plain JFIF and Exif) PNG GIF PBM/PGM/PPM SVG XBM/XPM BMP/DIB/RLE WEBP Usage is something like this: use Image::Info qw(image_info); @info = image_info("filename"); $refto_hash_describing_1st_image = $info[0]; $refto_hash_describing_2nd_image = $info[1]; Copyright 1999-2004 Gisle Aas. Now maintained by Slaven Rezic <srezic@cpan.org> This library is free software; you can redistribute it and/or modify it under the same terms as Perl v5.8.8 itself. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/dev/��������������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13552530422�013472� 5����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/dev/Info.pm.tmpl��������������������������������������������������������������������0000755�0001750�0001750�00000030112�13552530317�015701� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ############################################################################# # # ATTENTION! This file is autogenerated from dev/Info.pm.tmpl - DO NOT EDIT! # ############################################################################# package Image::Info; # Copyright 1999-2004, Gisle Aas. # # This library is free software; you can redistribute it and/or # modify it under the same terms as Perl v5.8.8 itself. # # Previously maintained by Tels - (c) 2006 - 2008. # Currently maintained by Slaven Rezic - (c) 2008 - 2019. use strict; use vars qw($VERSION @EXPORT_OK); $VERSION = '1.42'; require Exporter; *import = \&Exporter::import; @EXPORT_OK = qw(image_info dim html_dim image_type determine_file_format); # already required and failed sub-modules are remembered here my %mod_failure; sub image_info { my $source = _source(shift); return $source if ref $source eq 'HASH'; # Pass on errors # What sort of file is it? my $head = _head($source); return $head if ref($head) eq 'HASH'; # error? my $format = determine_file_format($head) or return { error => 'Unrecognized file format' }; return _image_info_for_format($format, $source); } # Note: this function is private, but may be used by Image::Info::* # implementations (i.e. the WBMP implementation) sub _image_info_for_format { my($format, $source) = @_; my $mod = "Image::Info::$format"; my $sub = "$mod\::process_file"; my $info = bless [], "Image::Info::Result"; eval { unless (defined &$sub) { # already required and failed? if (my $fail = $mod_failure{$mod}) { die $fail; } eval "require $mod"; if ($@) { $mod_failure{$mod} = $@; die $@; } die "$mod did not define &$sub" unless defined &$sub; } my %cnf = @_; { # call process_file() no strict 'refs'; &$sub($info, $source, \%cnf); } $info->clean_up; }; return { error => $@ } if $@; return wantarray ? @$info : $info->[0]; } sub image_type { my $source = _source(shift); return $source if ref $source eq 'HASH'; # Pass on errors # What sort of file is it? my $head = _head($source) or return _os_err("Can't read head"); my $format = determine_file_format($head) or return { error => "Unrecognized file format" }; return { file_type => $format }; } # Note: this function is private, but may be used by Image::Info::* # implementations (i.e. the WBMP implementation) sub _source { my $source = shift; if (!ref $source) { my $fh; if ($] < 5.006) { require Symbol; $fh = Symbol::gensym(); open($fh, $source) || return _os_err("Can't open $source"); } else { open $fh, '<', $source or return _os_err("Can't open $source"); } ${*$fh} = $source; # keep filename in case somebody wants to know binmode($fh); $source = $fh; } elsif (ref($source) eq "SCALAR") { # Earlier PerlIO::scalar versions may segfault or consume lots # of memory for some invalid images, see # RT #100847 and img/segfault.tif if (eval { require PerlIO::scalar; PerlIO::scalar->VERSION(0.21) } || !eval { require IO::Scalar; 1 }) { open(my $s, "<", $source) or return _os_err("Can't open string"); $source = $s; } else { $source = IO::Scalar->new($source); } } else { seek($source, 0, 0) or return _os_err("Can't rewind"); } $source; } sub _head { my $source = shift; my $head; # Originally was 32 bytes. # In the meantime lowered to 11 bytes. # But XBM probably need more because of a leading comment. my $to_read = 64; my $read = read($source, $head, $to_read); return _os_err("Couldn't read any bytes") if !$read; if (ref($source) eq "IO::String") { # XXX workaround until we can trap seek() with a tied file handle $source->setpos(0); } else { seek($source, 0, 0) or return _os_err("Can't rewind"); } $head; } sub _os_err { return { error => "$_[0]: $!", Errno => $!+0, }; } %%DETERMINE_FILE_FORMAT%% sub dim { my $img = shift || return; my $x = $img->{width} || return; my $y = $img->{height} || return; wantarray ? ($x, $y) : "${x}x$y"; } sub html_dim { my($x, $y) = dim(@_); return "" unless $x; "width=\"$x\" height=\"$y\""; } ############################################################################# package Image::Info::Result; sub push_info { my($self, $n, $key) = splice(@_, 0, 3); push(@{$self->[$n]{$key}}, @_); } sub replace_info { my($self, $n, $key) = splice(@_, 0, 3); $self->[$n]{$key}[0] = $_[0]; } sub clean_up { my $self = shift; for (@$self) { for my $k (keys %$_) { my $a = $_->{$k}; $_->{$k} = $a->[0] if @$a <= 1; } } } sub get_info { my($self, $n, $key, $delete) = @_; my $v = $delete ? delete $self->[$n]{$key} : $self->[$n]{$key}; $v ||= []; @$v; } 1; __END__ =head1 NAME Image::Info - Extract meta information from image files =head1 SYNOPSIS use Image::Info qw(image_info dim); my $info = image_info("image.jpg"); if (my $error = $info->{error}) { die "Can't parse image info: $error\n"; } my $color = $info->{color_type}; my $type = image_type("image.jpg"); if (my $error = $type->{error}) { die "Can't determine file type: $error\n"; } die "No gif files allowed!" if $type->{file_type} eq 'GIF'; my($w, $h) = dim($info); =head1 DESCRIPTION This module provides functions to extract various kinds of meta information from image files. =head2 EXPORTS Exports nothing by default, but can export the following methods on request: image_info image_type dim html_dim determine_file_type =head2 METHODS The following functions are provided by the C<Image::Info> module: =over =item image_info( $file ) =item image_info( \$imgdata ) =item image_info( $file, key => value,... ) This function takes the name of a file or a file handle as argument and will return one or more hashes (actually hash references) describing the images inside the file. If there is only one image in the file only one hash is returned. In scalar context, only the hash for the first image is returned. In case of error, a hash containing the "error" key will be returned. The corresponding value will be an appropriate error message. If a reference to a scalar is passed as an argument to this function, then it is assumed that this scalar contains the raw image data directly. The C<image_info()> function also take optional key/value style arguments that can influence what information is returned. =item image_type( $file ) =item image_type( \$imgdata ) Returns a hash with only one key, C<< file_type >>. The value will be the type of the file. On error, sets the two keys C<< error >> and C<< Errno >>. This function is a dramatically faster alternative to the image_info function for situations in which you B<only> need to find the image type. It uses only the internal file-type detection to do this, and thus does not need to load any of the image type-specific driver modules, and does not access to entire file. It also only needs access to the first 11 bytes of the file. To maintain some level of compatibility with image_info, image_type returns in the same format, with the same error message style. That is, it returns a HASH reference, with the C<< $type->{error} >> key set if there was an error. On success, the HASH reference will contain the single key C<< file_type >>, which represents the type of the file, expressed as the type code used for the various drivers ('GIF', 'JPEG', 'TIFF' and so on). If there are multiple images within the file they will be ignored, as this function provides only the type of the overall file, not of the various images within it. This function will not return multiple hashes if the file contains multiple images. Of course, in all (or at least effectively all) cases the type of the images inside the file is going to be the same as that of the file itself. =item dim( $info_hash ) Takes an hash as returned from C<image_info()> and returns the dimensions ($width, $height) of the image. In scalar context returns the dimensions as a string. =item html_dim( $info_hash ) Returns the dimensions as a string suitable for embedding directly into HTML or SVG <img>-tags. E.g.: print "<img src="..." @{[html_dim($info)]}>\n"; =item determine_file_format( $filedata ) Determines the file format from the passed file data (a normal Perl scalar containing the first bytes of the file), and returns either undef for an unknown file format, or a string describing the format, like "BMP" or "JPEG". =back =head1 Image descriptions The C<image_info()> function returns meta information about each image in the form of a reference to a hash. The hash keys used are in most cases based on the TIFF element names. All lower case keys are mandatory for all file formats and will always be there unless an error occurred (in which case the "error" key will be present.) Mixed case keys will only be present when the corresponding information element is available in the image. The following key names are common for any image format: =over =item file_media_type This is the MIME type that is appropriate for the given file format. The corresponding value is a string like: "image/png" or "image/jpeg". =item file_ext The is the suggested file name extension for a file of the given file format. The value is a 3 letter, lowercase string like "png", "jpg". =item width This is the number of pixels horizontally in the image. =item height This is the number of pixels vertically in the image. (TIFF uses the name ImageLength for this field.) =item color_type The value is a short string describing what kind of values the pixels encode. The value can be one of the following: Gray GrayA RGB RGBA CMYK YCbCr CIELab These names can also be prefixed by "Indexed-" if the image is composed of indexes into a palette. Of these, only "Indexed-RGB" is likely to occur. It is similar to the TIFF field "PhotometricInterpretation", but this name was found to be too long, so we used the PNG inspired term instead. =item resolution The value of this field normally gives the physical size of the image on screen or paper. When the unit specifier is missing then this field denotes the squareness of pixels in the image. The syntax of this field is: <res> <unit> <xres> "/" <yres> <unit> <xres> "/" <yres> The <res>, <xres> and <yres> fields are numbers. The <unit> is a string like C<dpi>, C<dpm> or C<dpcm> (denoting "dots per inch/cm/meter). =item SamplesPerPixel This says how many channels there are in the image. For some image formats this number might be higher than the number implied from the C<color_type>. =item BitsPerSample This says how many bits are used to encode each of samples. The value is a reference to an array containing numbers. The number of elements in the array should be the same as C<SamplesPerPixel>. =item Comment Textual comments found in the file. The value is a reference to an array if there are multiple comments found. =item Interlace If the image is interlaced, then this tells which interlace method is used. =item Compression This tells you which compression algorithm is used. =item Gamma A number. =item LastModificationTime A ISO date string =back =head1 Supported Image Formats The following image file formats are supported: =over %%FORMAT_DESC%% =back =head1 CAVEATS While this module is fine for parsing basic image information like image type, dimensions and color depth, it is probably not good enough for parsing out more advanced information like EXIF data. If you want an up-to-date and tested EXIF parsing library, please use L<Image::ExifTool>. =head1 SEE ALSO L<Image::Size>, L<Image::ExifTool> =head1 AUTHORS Copyright 1999-2004 Gisle Aas. See the CREDITS file for a list of contributors and authors. Tels - (c) 2006 - 2008. Current maintainer: Slaven Rezic - (c) 2008 - 2015. =head1 LICENSE This library is free software; you can redistribute it and/or modify it under the same terms as Perl v5.8.8 itself. =cut # Local Variables: # mode: cperl # End: ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/dev/build.pl������������������������������������������������������������������������0000755�0001750�0001750�00000005734�12101227372�015136� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w use strict; use File::Spec; use Getopt::Long; ############################################################################# ############################################################################# # Write the Info.pm file with system specific code from Info.pm.tmpl: # This is run by the developer, and there is no need to rerun this at build # time. BEGIN { chdir 'dev' if -d 'dev'; } # Sort order for image formats. This is just used to have more common # (where the "more common" is currently a subjective guess by the # author) image formats in front of the magic list. # # The list was setup like following: the popular image formats in the # web (jpeg, png, gif) at the front. Microsoft formats like bmp and # ico are probably in wider use than X11 formats like xpm and xbm. svg # is quite different from other formats in this list as it is a vector # format, not a raster format. my @format_priority = qw(JPEG PNG GIF TIFF BMP ICO PPM XPM XBM SVG); my %format_to_priority = do { my $priority = 0; map { ($_ => $priority++) } reverse @format_priority; }; my $updir = File::Spec->updir(); my $tmpl = File::Spec->catfile("Info.pm.tmpl"); my $info_pm = File::Spec->catfile($updir,"lib", "Image", "Info.pm"); my $idir = File::Spec->catdir($updir,"lib", "Image", "Info"); GetOptions("o=s" => \$info_pm) or die "Usage: $0 [-o output]"; opendir(DIR, $idir) || die "Can't opendir $idir: $!"; my (@code,@desc, $desc); for my $file (sort readdir(DIR)) { next unless $file =~ /^([a-zA-Z]\w*)\.pm$/; my $format = $1; open(F, File::Spec->catfile($idir, $file)) || die "Can't open '$idir/$file': $!"; my @magic; my $no_magic; my @desc; while (<F>) { if (/^=begin\s+register\b/ ... /^=end\s+register\b/) { next if /^=(begin|end)/; if (/^MAGIC:\s+(.*)/) { push(@magic, $1); next; } elsif (/^NO MAGIC:\s+true/) { $no_magic = 1; next; } push(@desc, $_); } } if (!$no_magic) { die "Missing magic for $format" unless @magic; for (@magic) { if (m:^/:) { push(@code, [$format_to_priority{$format}||0, qq(return "$format" if $_;)]); } else { push(@code, [$format_to_priority{$format}||0, qq(return "$format" if \$_ eq $_;)]); } } } # trim shift(@desc) while @desc && $desc[0] =~ /^\s*$/; pop(@desc) while @desc && $desc[-1] =~ /^\s*$/; $desc .= "\n=item $format\n" unless @desc && $desc[0] =~ /^=item/; $desc .= "\n" . join("", @desc); } closedir(DIR); my $code = "sub determine_file_format { local(\$_) = \@_; " . join("\n ", map { $_->[1] } sort { $b->[0] <=> $a->[0] } @code) . " return undef; } "; # Copy template to top level module with substitutions open(TMPL, $tmpl) || die "Can't open $tmpl: $!"; open(INFO, ">$info_pm") || die "Can't create $info_pm: $!"; while (<TMPL>) { if (/^%%DETERMINE_FILE_FORMAT%%/) { $_ = $code; } elsif (/^%%FORMAT_DESC%%/) { $_ = $desc; } print INFO $_; } close(INFO); close(TMPL); ������������������������������������Image-Info-1.42/Makefile.PL�������������������������������������������������������������������������0000644�0001750�0001750�00000005206�13131776475�014706� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env perl # -*- cperl -*- ############################################################################# require 5.006; use strict; use ExtUtils::MakeMaker; my $is_author_env = defined $ENV{USER} && $ENV{USER} =~ m{^(eserte|slavenr)}; # fill in the developer's user names here if ($is_author_env) { require File::Compare; require File::Temp; my($tmpfh,$tmpfile) = File::Temp::tempfile(SUFFIX => '.pm', UNLINK => 1); system("./dev/build.pl", "-o", $tmpfile); if (File::Compare::compare($tmpfile, 'lib/Image/Info.pm') != 0) { warn <<EOF; ********************************************************************** *** WARNING *** *** Changes in dev/Info.pm.tmpl detected, please run dev/build.pl! *** ********************************************************************** EOF } *MY::postamble = sub { <<EOF; predist: ./dev/build.pl rm -rf inc \$(PERL) Makefile.PL \$(MAKE) distcheck \$(MAKE) disttest \$(MAKE) distclean \$(PERL) Makefile.PL git status \$(NOECHO) \$(ECHO) "*** Consider also calling cpan_check_versions and" \$(NOECHO) \$(ECHO) "*** cpan_check_unauthorized (on an older version)" postdist: \$(NOECHO) \$(ECHO) "*** Run the following commands:" \$(NOECHO) \$(ECHO) cpan-upload \$(DISTVNAME).tar\$(SUFFIX) \$(NOECHO) \$(ECHO) "git tag -a -m '* \$(VERSION)' \$(VERSION)" \$(NOECHO) \$(ECHO) git push \$(NOECHO) \$(ECHO) git push --tags EOF }; } my $eumm_recent_enough = $ExtUtils::MakeMaker::VERSION >= 6.54; if (!$eumm_recent_enough) { *MY::dist_core = sub { <<'EOF'; dist : $(NOECHO) $(ECHO) "Sorry, use a newer EUMM!" EOF }; } WriteMakefile( AUTHOR => 'Slaven Rezic <srezic@cpan.org>', # previous authors: # - Gisle Aas <gisle@ActiveState.com # - Tels NAME => 'Image::Info', VERSION_FROM => 'lib/Image/Info.pm', ABSTRACT_FROM => 'lib/Image/Info.pm', PREREQ_PM => { # PerlIO::scalar 0.21 appears first in perl 5.21.7 (!eval { require PerlIO::scalar; PerlIO::scalar->VERSION(0.21) } ? ('IO::Scalar' => 0) : ()), }, LICENSE => 'perl', MIN_PERL_VERSION => 5.006, SIGN => 1, ($eumm_recent_enough ? (META_MERGE => { resources => { repository => 'git://github.com/eserte/image-info.git' }, no_index => { directory => [qw(dev img xt)] }, recommends => { 'Bundle::Image::Info::PNG' => 0, 'Bundle::Image::Info::XPM' => 0, 'Bundle::Image::Info::XBM' => 0, 'Bundle::Image::Info::SVG' => 0, }, author => ['Gisle Aas <gisle@ActiveState.com', 'Tels'], }, META_ADD => { }, ) : () ), ); ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/img/��������������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13552530422�013470� 5����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/img/itxt2.png�����������������������������������������������������������������������0000644�0001750�0001750�00000000160�13125503327�015245� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR����������:~U��� IDAT[c`����b@Oh���!iTXtComment���‽� H-Q*I-�����IENDB`����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/img/anim.webp�����������������������������������������������������������������������0000644�0001750�0001750�00000000422�13551664101�015272� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������RIFF ��WEBPVP8X ������������ANIM�����ANMF&���������������*���VP8L���/����DDANMF&���������������*���VP8L���/����DDANMF&���������������*���VP8L���/����DDANMF&���������������*���VP8L���/����DDANMF&���������������*���VP8L���/����DD����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/img/tiny.pgm������������������������������������������������������������������������0000644�0001750�0001750�00000000013�11253753022�015151� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������P2 1 1 1 1 ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/img/test-lossless.webp��������������������������������������������������������������0000644�0001750�0001750�00000013212�13551664101�017173� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������RIFF��WEBPVP8Lu��/��`ضmOwvBDL�Rڞy}TǶTYjլxEquO3nK!x @|ړFm۶m1Q,,$ 3zuԿK 2@F QdR,3�F qIVr?rH$w߈RڃZhƀAFm 7@3h@�11@$I-|e$ȏp!@X F IS-X 8`6? h?%) d}%/m͖Shf~5PErP_(j�N)@(<6co@"im@@k۔6mR"!@Cc6ipMj) )/ihv6mDP4 mr$M7 IDi˷6m/$ϵVJN}VQB{_L)TE** @[Zڦ PM[@ӶJ])m&}b۵}u1@T|) "6;mm'ٮxjm 0 �_"~ (@[s MJ6.o3m70 xKoypTh|Y ۸%- on3#@okD<|7M}z%mzn�ۖq 7LHNG -@APNQR*Vޖ$hRj(ױ\IZ-; HZ=P8TTmVڭHkω"(%A�QQ�Q""Y |Z~g DU~mIXZTQJYIm>`4Bņ# !_5t{FTJPId$n!l1&@*6(؁1[7^Hiy|F�=|e; 4l�B4uLbHխ}~޾||>x"UEV`#q9'眳{vލP׍X -qJzVʄ^zڷY뛳Zt\IڝܝrEDe93sN}b9̞"gf jZ8oѶ_VBl$ș} }&0{o&$(;3$f^[- `[md!%+ BlEDJkˎj |m;d2!#&,08}o蹫q&g$iU[+M;Vks}"e?}߷L2¶W$<lnzZ577E7V߶-Z1i%NG[^]+I$[y{(Xmj[bmk }TuSXQW3KҞ{ͥ/"^&y 4K[uڲ$6;*IKyk}Z`6JU׳[;;U{Vwf ģmJc}Kew2ے,YG[ve#?KWYe5AI̾wvv.Fږjݷ5RX+ 2ǹ}?~:۬$%IFt< V™`ڶg~o$)-D~Q2&䏯Ga<k1`_Ւmߒly}UkHi5eccIϷ{=Iwwն<OA4&7O ϳ7xEށbkfw&f~.zfn<ͻy{mC͘IND+*7BֈҾ}DiH ;[bFzfFbjeLBf_< hg%< #ĕڒ<5b ciz<vSܚCԓ>YO!$ֶ^8wۨ̈jz"ĉl^_+OS߽t!ֶZ5e]dn΍"# G/ o/ ٛE?ֶIݏ_-6D#ЪjF-oV gBoƪ>xh=[3!8.!*͓=ck6tC4uc:|}sD<=0NmKk޾f_6n>,V7mu6M&bkTlW[q&r0uDӳXӅK?!ތj*4z!_6D51FIKAyK(G8<,f6&Ocf$- i~Wk)$y̞!2]1Zg vH[fjUVUlIoO*FW۽w`HXU?0{d>PViQZm%9A:i2<@B?c@8 ~D@<Tv6HHr~#o>9ZmDM\s@{uB}C^ۊ9<Yy.dV ҫ'm+"puQI-~=8k=]\y,tIi;pLɈLl2vSmktU_} ]J-$vB+l_U*Hm;|T:/OPU�iF+/;QϮʬ`*iUZu<QG;*cW͛-ZϟF2\WVk$Υv@9R82;3|6*Zmd2\+Y@s,sZ�s;\Y¯2,Xla;6o*Qw!].5'uGKGIUittxq[Ť@hVV `$Dޝ-d ]d{ZZjQXy�<oNv(z1%YN;OXLז;̶ŢT1֎e(%cs<WQ/ܝj]w-$ۺBp>\ACu[j=EֳZsl|26>q[/lDs(KjnƜG&E fg�朕0ôA@|Ћdpj P[`gVQCȜU#"e0; ]"I`>6@3,Xڞ @7EtZ)(9@ Yǝ%,]vfN.$kLwe ԌJ^եu $cQ]ϵ./ݠ|pw wVeRmԖ$b*"^hJ� AVڋ`&(~> Cv4e귫4�\lVt!ۉ`olИ$c;%j3$̏x؟$38"IԢJJDx]Iy9۴p$V}O1FMk.y!K'IZIog.46x<;h] ,fO\.%x@#G3/ꦜv r"}sTQ˃Zm[dGݡ<瘶R'My! Rmm{=pce(?#.zy7r>UUG%17�c SrVKP ywס?XH-&#Zfo'$p:)L־דּ1 mHCÑBpυicv'j v↔=kI:C,NhGސ){1v>ptuU+U ۶l̽,~ UIٵ-Uݽa-[j"ju1Q} וǭ{˺NP.uVf}Dŝ;,޻9̒莮TbOMv݋6jeF;7T ۲°g10Hн}7{v:6<H@vktn{ZFZۮS§bK E)y`wBl{{{[}]@eZ!D|HbvF{@EmU@d`370y ƈԃ&L(˵\Zud6VM͈3dXvm)6 jE2xSNԅҞZ,yvV<Zy-rI V9;sC|2cXB-_#huےc\{͖]gEs%'{wBQR>E31NU�/ϽR8ORġ8n.#]SM^-DM[% XZEm#si?[ :|dԮϿa- / #hu\]$XNjU禮c8C.xw>yɷ}A%_c}dohQw­zad7 k �'3A2 ΅oH\}t%:5cG[gU(;{0{r}yNv%Yk%JRrK!fA݅[ܒ~o!@}?6#O_$omowu ntjU5`6Ftf;[^;NPя \N]>~l1�NQδ{#o&g(R!V* nLVkt}W5ݨŤi{;vlƳQAi8p$ʾ^GRyQwkswfײ@RRтvgCSV͊ B#VFcv\ɝ<MI:sɮ mfH2J堝**hrv̽V\ D-,BDm׵ys1NkqR3yd7 vF rݔQœ`M*93/ifh3*,xBm@T)u^iNDla?4g7NEgh: )F>@Zĉ`Vw&%| 换ZOf LC.Xx <p0TF]AA'D@ Q;5QtvwL LHvƭ*h3I@$G[gQb q2@^$&#w5"�sq9AEN33Q%QԪٗgHw f7Nmx7iYxJ45'mIEXj7�UmFBm߾ܻ@`fw҆ӯ%XQ$:"eE"FV)_lfakafURmL='ͳhs'"SE9,zQt G ,i@Bf&L vQjR|%Z=L0-~Phw]*gYtPLEn+c.VTGyAm (*-tg3n$. 8P錏A`_ϴ2-!w6Kx<L"UjEuB-퐤&4Madv�ٟ{[#0 RN Xϙ*()ܲ`]LNֶj=lh+* :3m@8`e쀎SIwudx\YZQRE@@AlZL���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/img/test-notrailer.gif��������������������������������������������������������������0000644�0001750�0001750�00000000061�11302320062�017114� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a�������!�����,������� `d��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/img/test-multi0xff.jpg��������������������������������������������������������������0000644�0001750�0001750�00000005567�11302320062�017066� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������JFIF��H�H�� Exif��II*������ ���������������������������(�������1� �����2�����������������(��i����J���������������������������������� �������� ������������.����FUJIFILM��FinePix S1000fd ��H������H������GIMP 2.6.6��2009:09:14 21:37:15� ��PrintIM�0250������������������������"�������'������������0220����������������������� ������������ ������ ���������� ����������������� ������� ������|�b���������0100����������� ������� �������~����������������������������������������� ��� ��J��d���2008:09:10 15:54:01�2008:09:10 15:54:01�(��� ���u��d���X��d�����d�������d���)��d������ ���FUJIFILM ��� �������0130����� �������*�������������������������������� ����2�� ��������!��������"�������#���� L0��������1��������2����������������������������������������������������������������������S100 ����S100 ��������@��������@����:��@��������@�������� @���������A���������B����������������4C3133302020080324A4E58SQ09933��FINE �����������������������������������������������������(������������������������������H������H�������JFIF�������C�    $.' ",#(7),01444'9=82<.342�C  2!!22222222222222222222222222222222222222222222222222�� �"������������ ����}�!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz�������� ���w�!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz� ��?�؅{}2rF0hEi݁<\_^E#�C�    �C   �� � �����������������%�����������q!"1AQ����������������%�����������!Q"12q� ��?�$td[K`y9=ǤD,>*TnftYA*/Jbr3#U>R-&H6滷6T}:UTJř[#qG:n'nK愰, DM|đgXUJ9{ ,u�����������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/img/xxe.svg�������������������������������������������������������������������������0000644�0001750�0001750�00000000544�12773752746�015043� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE foo [ <!ELEMENT foo ANY > <!ENTITY xxe SYSTEM "file:///etc/passwd" >]> <svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.0" width="864" height="648"> <path d="M 432,0 L 594,0 L 594,36 L 432,36 L 432,0 z"/> &xxe; </svg> ������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/img/be.tif��������������������������������������������������������������������������0000644�0001750�0001750�00000000612�11253753022�014560� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MM�*���FxԱ � 1~a �[$1zA�x�MQ#����������������������0�������������� ������� ������8�����������������������������������=������@������H�������(�������1����:��P=�������R���������������be.tif��H������H������ImageMagick 6.2.7 04/30/06 Q16 http://www.imagemagick.org�����������������������������������������������������������������������������������������������������������������������Image-Info-1.42/img/test0-fuji.jpg������������������������������������������������������������������0000644�0001750�0001750�00000005566�11302305677�016203� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������JFIF��H�H�� Exif��II*������ ���������������������������(�������1� �����2�����������������(��i����J���������������������������������� �������� ������������.����FUJIFILM��FinePix S1000fd ��H������H������GIMP 2.6.6��2009:09:14 21:37:15� ��PrintIM�0250������������������������"�������'������������0220����������������������� ������������ ������ ���������� ����������������� ������� ������|�b���������0100����������� ������� �������~����������������������������������������� ��� ��J��d���2008:09:10 15:54:01�2008:09:10 15:54:01�(��� ���u��d���X��d�����d�������d���)��d������ ���FUJIFILM ��� �������0130����� �������*�������������������������������� ����2�� ��������!��������"�������#���� L0��������1��������2����������������������������������������������������������������������S100 ����S100 ��������@��������@����:��@��������@�������� @���������A���������B����������������4C3133302020080324A4E58SQ09933��FINE �����������������������������������������������������(������������������������������H������H�������JFIF�������C�    $.' ",#(7),01444'9=82<.342�C  2!!22222222222222222222222222222222222222222222222222�� �"������������ ����}�!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz�������� ���w�!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz� ��?�؅{}2rF0hEi݁<\_^E#�C�    �C   �� � �����������������%�����������q!"1AQ����������������%�����������!Q"12q� ��?�$td[K`y9=ǤD,>*TnftYA*/Jbr3#U>R-&H6滷6T}:UTJř[#qG:n'nK愰, DM|đgXUJ9{ ,u������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/img/test.webp�����������������������������������������������������������������������0000644�0001750�0001750�00000042256�13551664101�015340� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������RIFFD��WEBPVP8 D��0�*@�>i,G"!? A�1uYok-<o fUρOチQ~|?:5 N->o~zKC??rw__}9[�V4)t GV j wd[3~GKS2*d"ځV\89B=a2%;n[HF+-U_$+  f9c51&m|?~^Yx Zkd5 PrƯAZVؾPA Hgd̦̬u@MycYF>VOD6Jt%@f%'l&?[+)A`*Ѹݸoք-~_!  r&(vc ۺ tDeκRZc \aE+\p&w;mW(oULit7zφb]iMTf–CyF<ܷpY/~.&/I8d PHxK�k>s>x1!fL-"n NW1dPjnU68v}0Mp H|{f$^'ueofܫ q�DtQDPޒ*v{@XSU,b3)W榅 Wm+UVW!6^,=q$]MTO4v'=t,y6|y`P,vP@r<X ݋#RizE̼~LL|Bo{T Ӓ -fTŧB5[Wq1:I5MvIfC؁R"_s�2K4*JEg߃CM ʅ ?B$#ɰqڔ *mdG|VpzXǜ "}V)ir:m 3jmZ2373r[{άwݏ_AkjP4e <5Pϴ$2 noUW3 k5k�54Ꚍk݆#eI)`BR%S_QܙutTj~߸ ^{@nbU&Gb%ݹIY˹ozm- k FL DWNynf-;ΟH}:v0ȱ4u‒1]9-^dFQ Lj:9G땖&uK ڝTw>cvZou_/$nûHd)F `/!{{+fn|}VsoSCm6Jf~o}x3ZqJ�c0G0< qrٖC'ʑ&7AV '~í7Ib?{8*<9k�AZH(N&F2_ ]Om=Hr К0Ufݙ$i>xk9~E]:E1X�;S`<Lws ڶ)L ]~ &`q;@t(c˾D{ \V-.ZSq;E(t 9$fM'dȨ w4kW[ZgJ#I~"N&Xf8 ⏵5F%J7̧$P(Yl<4Gzgmt e23 j=| aVrkP7 1wY5euw6gjcs{(+?Xx.6C&Ǘ{[$QߎV)4Lsm#߸W2k=edYݘx=FnYԭ͙hzN&SNj-vB$\/cTِJ*xh٩M9%kؚĮ_`BWF;s.h8_ov蒫3)gE8.DUg$q34J9Y륶%5D,z4+_29`OrIc1Z ]|yp,6GZ\nfxƁA\wss~_XUeVwissvSj㜳p3B0 Xyh)j 9\%՜7-EC_]QM?'.6å>@ӊ:2R$k:| FЄ 2&!"5rGKX?Im^0=9SI{i <*;f& O=ù1Tv36.leٺf`bsƴq1R|dF z* y{76* .Ӝb�VU٥Y 6x ky: Y?KϤe?RG!Rruuo�"g݉N$ ۳yj{9͈$o�#QLfs-[$$Fa^uf_J1Pl6c␨/s".z@ C?i_93Clg{nr1V?UXGPi< mvJrosdk m<IM5Qv>}Pb6d\(N`[c|}%.c$AHEd}A()S'hhri)2guٓfB3i2nMxy1Ԯi�=xh5ʇUA"m2ђ@oxb88B=z$x>fe/EY_ίL[Qʂl ߐ.*%ː %:ts-ʈ18 8?h̋kl34ܹfrm93:+uP=d[. �אGOf:`>䱾O';JytX4\7\ՆN.pK{ [P!n%Z,߀Okznc1L%rHݟ9sA6Qa_K */[F'wF?ȠuJjGF%fք!0穾qQ"3.(4`ĝ.QlyQaܜ.;C86]\_<} (/K=wlQc;f享#f }3 qi Z�sR[{WunH]G* -i�+>9J4I�TX/> TL8Csq"Tvp?"O0ȅ/hUvk Eb/4Lw_c*!  X OzcFCFU/\&S㯨K^K| ¶ŭI¢3W[ָb52ड़mn;c7a�6{"P-:ϸ?Q{}Zt5`9]o1~A?i8>&%UM矓Cشm=Jo*pW:Q"x}!!76n,#ݦ_L9&5 ~F`(b>wQ^4t2zۅoxKCўb�`'{ z%¾y)hi .w"kJVYkT^_/:k^[ 7l'ߐk�a),nkVFnb."\_$/>^/ J#.rT͵ ѱ.cK$s�_QQh;qc6o Yc+q^y=xt|eI F[NܷԦ7ԠT݁ 68iKmOU-Mi%wO?d‰n& :q݅"'." %;}?@«D`{KFD3罨nUz9.whO2ULi#엇ǖDiɏ69�vr \f~<!5da޾/Wъ6G;$ MG=}M:v_{*Zm(1i]ï}5J'F@"%5FG׉LaNR)V"m2wcopLXJ*jX AC,,fߧc3 =ڨvG/PZPoq!(<C \Kn~f̰&4֍4ZĤGU{g0ue0ax|)ӏx͸$|fxdI@�9<,KF-D?lbp�و}>wkn/0o'(׷s@a`߰/=uM 0ިCYh^(\Ѷ [x@C.}rYˤ2(5{6SG�vI:=*~fr SE#u,!H >lP1ZK,h GGU,PYA Rbݎa(8:~K�W.fo9Shݒ F޹K Dpd07pEN3.8 }w ~aGf@x~@҆_/?liKD \ uD%gE+Gh i=YUiŸZQ"ƽCi|RdI? +)z qXsʖV>{+( 2^?l7M9/ji)+0]{z #@mcN'$ɤxz n8S_&Y/}^UtvBp?t.^铏9m><=hLj #f3wx3CqWoxϪWIxD&7VI^ʼ6ݖ _)>sö-M $z{I! pZF+qZHQA[a&sg!UY+1=Ӈξ=!cw6%H-EJ/�SxY_xJ m犂@`9^ y櫴n2A"onD.SZ.n>zQƳ?Iv|,6dvyfs&LtͪTU~7K,+u!]=+W y>UJ3vi:V=7dGKGcȹjq}X'xy=B4 @kiIA54WZKo筜kh42{oxC9O׻m2){K}mAhhD^3hV腣n7|x.>s6\eb _P<Pk0ʔHV/X*OcM<]^]sh}~w_XT6hPD}~i¼x=(Ne|FǏ<maJIBEՎ/L uRfLtP U~$R�6t<@U3Q8sn`~8WWa&Xb%5ҳ.jC6@WR `mG2L60ѨTާv}F.*Mx &l"SzGZcBݰwmK\XegQmiHzn^t 71?6iua�F{ۋG*snALzfa|^ ᒚL\tl-:+&:iofILZ͊BقjuJD8n?p4` VS^I�8{=O"2.dOvtwRIi]TJ0r?*ٸC65.OaGPCn̨c 8mdkڃ-#l9^%IjE)]ݮZ^ ohk85եW^%SO ]),[!vdkx&d-2„U0*c�T-$ANBA3n W;�[{)�Y"Q J%Na͹SŅ^C` *@ѷ-4x8ۺo?(]d< $*z3.f7U;NJ}l/xc }♷LI޼F :0 CTh2:^vC$yekwthTMx0OF0e  #hm%ZqԦtacϛ(0/)K]cW \P V+VSn:#GzRkɍk(rEwk,\p jMSUfM wjY˺H!:!EV[?? DwG_kλK'|:&l<H$ FBv\&O*=1$#bGOx:`_)o7Q<khw>uvyny+FckŮW(d"ubL8rAOKޜh29'Rk,5}Ɠ|H K7BgxFkUZ>`\](?=LtpSQw$OLp+ko9sjI ̸ !{瞺TLc4P,yK{�~Jv-Ƿc,^Yh%A}<љl?E*˨v`熯SIlݟS+**r4'r@t]kˎZm-mhJZ]~]RD,(鉶-Q#͝BuWuy ' )m/A/L2~F+$@٨4aO7=[EvH.]VJқҔDX޽k@= TdC*v,[RUyu1 p-JPD w#5w"k΅96:ArW:4I7;nəᠭx |4D Od)P'~p?rԊѺx8)}o}5$y겺/be[*.JFNTJZ}1)Ƒ*Fvf:TT&.Qp}+J~núiiٽa`'NFN}6}\ J{3gAA\d):s |Wc- H3Š/tlI%ȫMv"KcAk,?O[] ƬhA,T~dcr|qWKX:co,lN~>h*sT -]0~rnct�g 5zh/k^c6T)͎ϱlÅ/*JDcꮦ\m@:#I^fTbi5.'U %y>#QPJMgys#,(-�oyS eԜYaDqriˠjA</nh˓Vfٛzʏ VXz E� ҏ3.CS C܃WSŨ.HNN'M(tZm63TU0.1e.B:D˞d~?mz^TDa= 6@ԲFne_qIΖ@BDYUb,�װTL5NdW+}ݯ:YO||+nXt5`|H<fPKmH8]40. w"zCzGrc1foq 1ptH lRC$eu"hU`v,L4a^[m| ^| FЕЅz QO VoS!̼0:F$I�UfgxGI~R}ϫġкan"tj 5\<>3:ބ&[]_ V 9 6uzPd3Ⲓw'"RHIaxP- bOG�Nٶ`BLƁ�)z-) bR9͟KƊjPڣczav n7~5A>JgE0ةK`MϝjYOڪxi@N*WΟ2Gsۓ>8߾z|~\8tE{#GCހ ٳY8!(0(Z ^6=u;χ#rt=8/|i@{{Ga)L_;i[p(pКyr 偩rNnmOC3uIYJ[VT2<}�ܩIg<]w!sP6?3Hmlƛ FʚӪ^} ٤ |\W>z+u5OD od1@7$ ^#U� OpodNB3ZдP֮yȄ%.H&A8ܜHJY6 ѻx9>;Y q$icF@V$|BN dGlo[0L*1嗣3`|tRk ȳ+_d<gǏ+|uh2-Wâͨͯ~f9o( _ yvjv:NđiZ!zJΩvc, G/(m; IRoR˦yT'g# Wj2,2^wPA�F%'l6h�XurKo=wtRziۙp"iu`~|q{=ThVcU4"&2@Ҿ~'W@@#pS߳[f;,$L�)VAo3HMpŔy-֦$utVlnx]:>,Ffםex5R�a^rU3%)9}�]4,ybHFS; 1schmbqҡ(nisxJ,Ճ\rƹ:Þς^NܫBڗA P$, M/K#@=M{A ƺ?Ӥ|U |n9mš+yܜ%Zsxz1/ڱApu뭑07kC yQ)>腖CC#S-‹Na_-ÞpP4?tz:/=6rzbgaʠ1g6,UV% jO Z#8ҩ1jOC)CN&Mjh< Fa! ȼڰO? HZX;K˭7 t p R%m `X@ɧ�_b zL<&:T69CIv̧ 792H}@oX}TO:F`s>{רٻ{\=YY Q"/bMldbFyrS<bP{54TfSP1sa X; Ѽfq;XKCO.-` 7nƃK M!Y\(m<_o^˭C{ݘ40tVH͋PYFAJ@B2%?jUℳ],pB-h |1WRH-PIY9i/`6¦xO],YIZx#EB}?|͂?hq(C%79:ʑ ITEdΙ@m$3f&YV}hUVV^oͲtuJ9NsFfbV.+}?01sVxH`hLEվWiQ7~/ !-쾈YiKx3T'#j/[hen9T%nRB@ʮ aa?mkܷq azHl�7PިcIClNڧxeA9ρbvęrx:#~'7\Pgy>WnE_E85%IsA)an DHVC ~0>ƻK_TՊ|l}N7g[͇~4Ь"d<I5սzP&NzV>0Z*]AZHgZ3t&N"v)yR$j;JU7<d]:ܱhf`_ȕJ<-?">v^ɞD-֌Fxf^ٲ\|0B&Z\LrOSuE4qE8";F1dIuaKۣ 葄u(/q9H$6e%4/r;Yj_5ղ*!sKF$)-n%;k3+/@;.lQ (2.:j}6yWdXw_H"5@$"tvhi),79oNQ/y@tubGVߕU(Q*E8vN&h ?x&eqx_ l}D"r}|0h.寘Uމ͟ĶRGf0gc0rr,.cs8%pt +bc ĕVmm;uT {$X)h˓lQP^NX5?=Eyws,7k""f:3f/'aICtb' [IgYP h`ZMmfE:e6Qhi#Vgk[N6<4\kPg#Q\9�c;\[<B׳ T"ê,,~!bK7=lF?Kzs@%|coʿpE:6@<;TEGPG"hOoIxu"</,a=#nNNs,&#hc}B Hw `d"| (Օ#ĝ.j-!!>gFLi) w*E0= [xSj2"jɘkY9 ȝbBQgҒ ㆀ8$?vMc}wD>=fsl޴W;c.nwKdײ ":Hɯ_㡵UrȈڎ#bQ~~vƿЦ t aN44NzNBS~%6䵵Q޹ZO#rM6<_Lz o:v~�ќ4bڹD7eRxA~R6htFhץ|=9Ç|@Fch.VhyP@MpSߖL C;n;*jJ{ qC~At<ϩl^#O=36k1w73jZ?ܫw7p/ CdX\֡pݮR$o`N&8 <`LimDE"Kc2&B5 9ͩ7pkJ"iXޑ*xvg V9tg' -˰f<C.(d񳩨BwnGGRq>HyhƉQ~LlVoSI*T?ouǃ8rd:ɻp^,y0j-l1OĮÏZb@ Ԑ&5XfhgXxzx Ir܎l�q"4*]sj5n6׶V^ gᱽ=Jֹ Wj1 +_6—~6D*Km!HmX{I'SGc/~&#7lQ|zڧ.fq2X z*#& fuxbBFI`�'n@M"66`Aq$m,cq̭I$c?EIہ Q!+{/ϭ 'h[3EIwPO/%WZ4U>ar2L_ Ș迶G~Q;zJTtnU?Q9 MDF|b+&LA*|x7QWG 廟] Vc_1~듕`cXUY,YN?a?rY;`d||y:g>jtsp)`ϬŴ%bL$MB5_XZ3" [sRhE%w'B8bz Emf Q+ԄR%C oGl9zq?p+nb),>tr�61jf;e "D>G<TL 7cnvTJs!` H gr[{J7Q3}6 TىšSoWe0B-<ywI!C !c.\DiM?V<J6ò{Oa:myyσ'j`f7[~ɻ ~6Z�F/P#V �|J +ˇ"O{X`<i ^XȞo:*uyTUɏZ;CdQ&050 G-( ?3r#2GAxa,�F.0 ( W`(F~ĽE""c23՞ \5.U։H|r.̀fRg-FD9%b81VuXU(7 gA^8 \GR*8RAd/+[/ܾ_Ba㶂0%B/:K,Ic-nk$%Szچb*z8ékzJ!̸XXp8OG$䷇[zzV)c3yXy;{>7#e0rh3v~<V2Ӯ}_[QkV5}GYl+Eϩd'U!_h<5N =ywWVLnjVE f?;m} l"Df.爟1ň[I!�yUM0ׇX ɬjr収s_p,a* *.Y +>YYCkwOO}d~Q@}~v *raI’\`m7,eѯ{Уn\) XQ!3ݡA41`~JNT+{LE.Du]}NI Ŋ0tu}=doJ3TF'O(<a+Wmۤ.B3cG*Sy#=Mu;+ʎ lX[+fs<>G#7**ӏԣfǰw5WC핬ef"GX\upj1$2Վko77)`]36m:Q]n:gka#JCJlo|%t8 C_oh3->D0?Ԭb #A70P7`1wY[t%T*w*7Jbw2wEh]8dx1} ';m(qC-YX�\D{HPLl,գm<c.|4zȮM2upIE9bm.BdYpSv@ 33<CijB=E! N mV$ [t)Edgb L^|çЏ�,c*�aH~Q"@Ž;9aCF@!?͵,\+}^Ryg 9n{ry(vwy!ÐyGd`2pichI߱爍#fR&�$V  J8fzi&T4_?ʢcy\(dj6=={L`݂xQr` JS3!b'"K8y�o[D BQhz1) [^E 'j#pGZ-hOެ_ar_?ㅧuYahO> 6#2܂Qa(@+7%oQr љK@b$4ȜW1Jz@*He#}0ʽq3B^>Ts`(O<Y#ǠߗPp %bܫņz[BpxtdKtoYfV`Q<p&Zu7Ue FL+{tghwꍞxae["̜-u_tH<0,3iWP^;>9V |�^| {ʑUgn%L}ܵ:`V 8fb ][I\fQK{观?.8JsSTl5W3n+$_r,YcxM)esh@[ƖƏ}*u9:Kj(J`*1Ӡ61|[TMBv/Gs]zKEJE2Q6}Jɣe"Ʀ<a^0ir`1G:~rKGO!h'@(=>5^n/г2fKP=1 y,;X<gxx +_O\BI˲֙5T]S2v!XKuoυ(x&çE30 %xٸXA aBiUyY?YB -FFt]=ufB B%$XiNźo\oa@)-ɒ8>?6 5|sZTqgN}is}`F A1\\YgZ6F`|يN0 Wb%FSߕ"#nrЀ80z}<F2T?WhT>D6F5l3!]?f#NGu d >nIz5+9}&mbF`YF'vlKQ HQՏhb~TxsR*;J/eb|g@Vꈖ6�Ⱥ| Y�'O :;MLݞ9m%Kvk;oW޵VcBPGHz8Q\=�L" RtGQw 6uCHo1M>c2tcx9Wa{y'&HP'yY]eBRvMr"W糷Ds)eIWF5pXQH mW.,T=U[hFuN^ k[W,כo33Š٭VM0[Cg'=]c/vXL80~m %H @DS>~=wb Eɥmyw9�oEJ:|qSQ dzA]Zf|;3u֐Oپ=ډEA7\ ?f7Xe_GÀ qQ}C3.? n'L@f\%wT&0 ))P50/JX4더/YӳgRf*2 }#h٤b Y,�-aug–`qq/"T뷥=VU\AckqV5x z9)~>EHR:\:4CِT~޹xm"Jtg9HBO̫Tn!nmhZq\WwHCU܏ٖkn  Rd}'4^ ټvoeĎĊݠ_p0ݎ \fn;y܏tt=>gn+hԲq2G~k? f[l5t}7b&-_y(mɉ@`&EjTsb3a@  !DNEUӫ4gGI0@I3fkxntUv<gXl%ì0RAZ28+mܘG@dVcO)XG^++IY3b~:U]䧀;e18a)NJWڣmO1Z/TA뷮,V:l�o,/=a][zv_|7-C ǾmI}`ә:naaB@NMD2U~-U˾2˿rY?9y^ʖBFǍ:t|o~}E83cl tNŏ6ЕZHE:G49ȪJyctɖ;Wn F312ea9]/ UߗȓA d-`xd`[qB5ɼt۝\`n8F'WpT_kDSxW<>2X􊖓�9ݑ=63Yr9XdшiLzrBeE#̓g xz 9 ͢veEu)|瓷pWŠ p Cc1E@xKur:tgNf0fHD*o4AZ(e/b� ,B 1 DžM}|cgyW2b8Kg G8&[F@71%fʕ*j{nȁ#qWj(5rx'm;NXyՁb@Hu4 5B׶ ]L Æs6u, :ܚ9BԸZEZhjAvd"r.` 94gaa`vZ@Bۅ�-?OAst v`zLӆ+T`g nDq/v+]b_M,zfެɣWkgut[mRF1:*Wy�e)BSb.<gi$ڠ46 mIr6!£ɉ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/img/test.pgm������������������������������������������������������������������������0000644�0001750�0001750�00000025076�11253753022�015165� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������P5 120 90 255 EEME@MD:+-.ENMu}j;4+**/89O[h5<=60-5-&'&&%*AK3.+('''4ABD2447J4/,%""%)(" $1=EJMA(+%'*E@+29D@;2R5./!%%*."1LW=RD-U`&!!%)***3;H?=422G緵پ#""%*$9LLBQE>4GQ>.%$&(:?9MNL@>2037=ACJV\QMLRMOP[# #,$18EEDQ96EPUQ*##(,FIDMHDEDA<AF9,14?DMOKOUQOQUc#'")(!%=BHS6-6OFV`'!$'.@IGI;35?79/1/-,..9HGLWOPPOJKTXWX|$(%-,"-?GH'#5),LZ, $(27462,0@6.+,-)01-*2>BNMKELJIIMNNROYǬ)0,2%#&-53,$$"%HM4  &%'.--)-3/.60/)6:,-()2?AF9=@@>HNMJMKM\⾷-3.4'"!(+&#($#):NP"$(+(*4.+)')+-31;;,"$!)39:>6B<>?NSFCFFJ\Տ{xut}ȱ+24,"# &'$'()-'.9<,-(%(*(2=*!!&&#&01)$+69<4==TijHN]WSCDEIQotonkihpqzrktv|yy{2-2.# $!!"'"&)#'&",=WQ+-(&'$""(,36@<7=6731/.,.6A<?CQ<JQwyvQCDCHXzǽ̣tnlhhidhhirjfjnivptvv|~51:63+$!''& %'$'%&//=-',/,./',.1;+! &,70*0.,)+*0+.+200=:GW|^JF?DIVpsprihhcaaeegbeiajqmlmrqyz}}~A?:5/1,*+)')'%&%-:FKE80-%!)3=207+!##"('(#&+,*,5.*)/&-79<7Kv]KDCDKRcx~uynqkmmjcofzihjmstuy|yyyʢ\P>,(*''%%*&&../3=85+%%'$&*'88)'!*& #$&(1,4@99),/*)=@E<HWkUbVMWdtxw|xv~yysyxzp|yvuz{r~KKOA,**,0,,(!',()($$$.2.&,4$'(% ""%"!$*JbM>*+.),23=:>vx}~|yv{zy~xvz~~z{tzrzzrpgfmumn{}zjfnp~76.+,(" %&"&&&!./HF:3+/2/0+$""$)-&,$-@KRG2;306505><Tolhrmwg^f}}}yx~w~xtxvbpfaksŸRfV-*')%%#&44-@2C>8/2+'(&&"#!"#$(>3.'2.8<1+*8/+/4DH_SKG\][cepcgpr|xxqu|qln{}xu~qnmi|hkbmxttxxzvvmyvԗA0')%;uaMJQQM3)&"$"698))#%')+(&*,#%04'-1GLnM$)LYWIH[qxYURRVutaj^U^[Wa[m|zmon{\eetv{~|zrxotuéO0PΟhO)3?H}û[2RamU?3+&(+.,1;JC)**,7;15=\ggWSS[koo~}ze]\_kkgx{fcxo{mipur{vwuplxǽ¾K),++.448<5,-+-20.5KYcig_{Ƶݱtxwv}vxurĽקīźϰm;.+0A:9=B@;;B=0-)&O=LNYmſĦӶyԍ÷s<22G?:?NVDF=192'(%#(),C))5JjzɔĸȿѰڤǦ¸ϭjCACE8A7A>&80FxG,'3*-EKE:4<Z_OHοѺѸӴٻ͹ϲǺǸĶðhLD.919INX]cOMFK\Y@5AFSD_[O>ȾΊџ~iqoŲ´ίͻͶM<.:NLQZs}mOFPF69<:I>MA5:@;>]t[azҫ}qzDz˾WGjnrTRöֶöi96F/4)C9DzdCKVEA4053(75495:87I<6Q4AЂ[VjƿªqfUvi 6W^XQronYnxp  %r8 68^[1<5AOTA@F[x^jccK[ĵ˳wh/FRRhmn~ƽľ¯{h# <=>;=QO:)KǾκ¸ĸV S?+ );VcIJKgeSu^uh}OM*a. !(DDLƽRn" +#  ##&= 1yºǔ¶\   ,=!dk\_WOYUtfdFyskʭܰN()e_|rj .  ! &Mjmͥ W- X^U[]dv[jzviA{yUm)#cO[IyqOn|ɿ ( (+V~ʷB a CxhpmYurfSG]aSupoI**zZnxdzг3 %$*$ -  +kКu}ɹptg  4 *\~X|o}qkXOjh;_hzvĩ>,## Hò̭'  UN PhwbvmF\VL¯|h|d[´ŧÕM D) '()#' UƯ{   >oS\O 2w{{eiHvoste~uQ{̵̺8 ) +((3 tŸ¥ʜ  $$ #7.uttscJorJrvu~ćvM- !ch^]   =@$/ (kbŚdc\x[ȻÙÛgoǾűƼĹ̲F0'%  ;nhvI_RdɛfuW.  "2B .O&|קkdmandhڣ_k}y~ȶn6"&&(, >YRunq7Qm:9TK>;  &/2y@+6a0aȴźʷưÖo|ÚĽpfNc^O+  DvrbSRinLvl7/ $a#  &gsG)!8A-rsfeeOb^̭ˬǮU÷tvpi^~iYYA   $JRMibHPli_f360>3  D_aaN½znWR7>l{Vtæe^d[wyv^NI\njz9Ca~^L-  0D6Ca]17FYqpwvf&D7G  #1*V|nKtU ̿rt»ǭ{ϸBHw~}ZNYLQNN7P.fðtX944&$8PRP\m*1<:<KHJWcM* MepxmfS%%&((/`tΔ˸vú*BUz~m4Cžŏi~~D<8,>ES&[Uye0()'GV6#>DRkTUp&!8E1==<K\_3  5\cSKY_M$>—֮yˮF^s^ϧzpIN)#&-,)6jF1:F`u<"2;aR-,EXUecZ^",<+045JURI *JnzY8ż\ŲЮ}Wc~kT͆[GwO20&&-Fj~u2CwqfM(1E=56AZXfruW-=#$",;HEG   *[K-Dv{}ycj©y~q\LaiΝvmVQpbAAD^jňwfX2/!,L.;<ASZmkP,26"4=785& /.]\xxkC,3XUnrg92ZuHZl^trĭm{{|P|?g|}ƻwdZs{xQXV~|ŧzaL(@G*;V>SOP:4#72&#'HEHJ5 $5^systuwzPZy^_MYS.9I>5qy_[pu6Qlô~gUK|_vNA'5IjUrt`K..4CG69<]?>992*-0( 1.53RUpvo|V8Pvs;sL3z^ggnrgLągQO.7f]qixgMIKM=B.SJN5+770 ".((7'#'I0BcxnZ(4axkq›hglomû~5 GRyDYM_s_NKQ8?FQML60220-)+"#wg"-Sp@(32 P?MhrW0eZɿ~C,=|}mxvxgWmho8kcJ:$suqZUkTXnYK=Y:IQE;15BF;3/'%#[lh<3$H;.Roxy~4 1ѹšVŞ|pZ_YSWjDj\fnZ;2Y]Ur9Ljt\22vef<=7JB?>/48<HQJ<0 9{tQkB'! %?Ulzn~~s^ !sȔdHEws`SWZVLyM 6g^MI=/8XnjoNS6eB:48A/*0?EPXKB- #MEKfD4 .  %+J_kjtt~vB  pQɼm¶”zlie=tnrXgX7=7=)0*"4\br[+,tXZ-/:(&3>GQRI>/ DxHo`,  '&#+'$:HY^rl|}sF  -ȸʶrhmL<Jm`{{fGY4<3*?/;H-f|R!<tXP=3D/(10<NPMD7* (F;B/ 4NB #1"*;Hi^tmb6  0nmeŲwƢPbQF3PRie-3)3#eC,%P,-"08^IFSs`L/'<9354KQGEC9+ ;;G6%7@MQKA<1*%'(WLfL &;+*pZltKl@IwD.E0%(Q^J/0-+5EWueg`mSL8&2;4;B<973) -8i~nqva[V/H<>0C3LK(==<%6FcT=_Ļftſ4=es2LeQ)-+/$sU<D%1_Ie`A691 '?98:33.-.%34#'&[<qbod(8:ANt=b@9F4(=Xlge̹ft@**]095H9;R8BW9,%-vpC"*L\NxlmfN6*/'*3AMJNE3-1E;WeQSZlOl~mgC890h)W]4M71(/+%+:Ho|9ΦcqkΣ˽$ +/,*7KR`E692EH]\>N3VA[zMU[`U<% !$?^_Q8149iVfǚ5~aT}rAKcg]tUK;88;^y?Ǟ{`ʩͯ)#4A\N4<v^LkNDRfE70EPPgvTNugO5$#'YqmC>c]A388mzzyo5=;?vPBwg}tnXKCCISv`ķγǗigdsv4)2IuqfV}v4GKZ~azmYB<!8xzm[JR=7BJneCA>8Fn̤RSЎĴlµºqF5%@Zgy;(!7_dG~~ayz_kpSj|vk?@1(0mddM]88I}uj_qhhK>NwTOɮz˥ß}ʫg) *;dq6&/6DrT{d]nuRtnEEK#/owO72)/`O`bNE;=)]ufY?yYJo|`od̴Ѭ¨VөȻi2[&#+2dpEAL3K}SZStU:LNly^<SwlG8NL_G|^D*)%\zg}UfOF.12Lou~\QF\kvXWv~i{ǷɸZH1'#08>\U5PvSeB2V325OB2htZ|B%14U<onT3!**RmmGC(/7Nzy~yzggvҿɲenFQcrɹǹǡɵ\N,80* %+F6C|aMi>$+S*M>M=+KGCP&)<=B6j]S-*>rtW`^(.)O;PTwyspf[3WZ_o_R~jܶewp`VN[Ƚɓzh?B*%(+EHC04K7!#;$_M_D -6:TJ1$JP>>bF2 ,<YWW6*&O;VZt̄cPJI~f./V|oV?Ty~MVkжzV{WFDZaȮrR>8E((/>]cJS3G'"! ,984):A-aU70R),I+%!Ls`pL?DOTtZnTJcH6!_RHyJ)#xmk8@fmZ]}HD=A|SdOhI*H_[&1=bii]0H H,$( &c^0+Z1XU;75Y)YI1-%9jk`FK^x`j~KjO`FQdUNrIyMaA=`/1Cx5DFQ7._hfVyb`RVfjrsRZMhV]|yB)67^ReV,*2'"&"AUgCFS==&027F)3J.F;5R\TuhuRLNU`>3_+:,ˢbPTGWED:681.Z=MjtIOrizk[[<4;]vE!6T|f6%#8SZa/u1HY;!/!)E-0D@R,( K/?C/EBG.FHIyIewsVX@kXlLJPD4 0or_=Q,-?74034)2?7EQiUA6oVv]tx7(6DVnK/9bA+5&Q9&+"&#-.,?!*AQ$NM0-0W1R@jJ:Qw0Di['vgeN^Y? 3./J&.;8+E;8B7*'*/I;?WpA;.CMg}{gG7$-.Xm@!553,!w8T&%!=Z%S0F:=PxrC?G^]dm?LrV2VmFFH^.'K^]&Pa-HHE?7*/8-(78_=A5P?)fmrcng|{}xUn%,y9}M1"2,'wL6:3@<-YzDdy.:6jsvdui<)6RD_vSNN>FSN;"QJG4:E;,1>)5n1??\oG1;)$#/:MG!2Vjn7VHtxfwo~lP&A07\]H.)2g]TG>E(41<)G@FE<5'/-Yf4UA@IBDVyonjKK""F&,!N681"/,*2+92<]BC3:15+\V)+&')?Sdsgj^nhac}erz=30QDi-'+> 6A>UR.D?,J^c[G06WR1v|eTX'->CKDm^>Twx_+/2(u:A1I4'$++#$ %==2A%!CV//5$(25Y\ttYMI,IeuZ~}stY`DAXj]=)"6$* S4HC0#N1D6EWBPY[x6BM^ZSPA;lYge3H[yV ;31K6=3&.$ $!=:AB912/78=7XMX?("&gn<QvmF9~}VrfwhF51WG)%!pVW8HmN-MH:,B1->RzKTFNX6RG]P.:qUSOI)8^xa*=?9P0".<C ! $;=EI#),)##A;25)Q*+(<rTcskymeIF<'$&%+"&+6PIMLJ,'2Oa!=POjmZIB??EaZS?[fUZh|ohENDX66)58-(3OD%CJ(0()E$()hJ&-E!>ISb^vA>O8mO>n@0%B$#24>(!??>@E-071\dtjUF0XA[j;=XrhnSCifN>2.7($/L+%'*%"' ->##a+)<&69D<ZNe|dX>5m*3CCnfd_|ZsGS.#!&# -&!:"I7., @5>F/D_RxwA0?=RXO83Wzd\`RF/E/1"% 8''IL":5##/[_/=aq@J~h_JD68 (HHNTfX[]oI;R(E*,%&%%7"+,)/*9""D86ECTY:0/75+I_a8pmYjRFC4,*'!HP?7,4*&0:&'6%.?0(;LlsK|hFZsPZbb&#"(-8huPSNb=>2((#/1,(F6) !0+.&7!!%3@;@9EI%'<n~{Q^uS\;1%57*!-(BS/&$'!&%P/&&#.+9,*_~S?<L|Z833F)(!:v3tw^'M*:;=, &2ZW*.414-.&#&$$4<XVfX>c]_JqxtTHVWI7%3,.,*:gfG;1* :?^$ 'A;<5:/x?MdCJa]9&(#"5&tP^Y@"6GgDIF+,/Z/ "++% 3+3+*T~`\vtqm}ZcM|FHbPX.">GR\G:8%DE1! %#9:B:N~soLIU6:lP8!!/#/D~i{E1/:L2+"#HdG:':&&}9')!$'+$0,"12'&$2?iQlyviVqlcsXrb]'1[eoA("Bab(()/0-TI ',""9TSÔTCKZpS=H*!!&4*K7mc2?163(&$0eYU85(x63"%(,A.*# ("';V*OwobHEFRD<mYRqL2-M@L}R>:+UpvWbtlvgJF)E^,%2#<ddfvc2+.,*'*D)+W]3-"/I, B+0EIW@"J")<)"%( A1)0004)G=-kyV9_KK;2&MOgL=]]7sj/=oiyWfSRD41)9,Keeo*[M>SpV8,&4#3:,. % C#.bL(>B4>������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/img/test.svg������������������������������������������������������������������������0000644�0001750�0001750�00000000631�11253753022�015167� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" standalone="yes"?> <svg width="4in" height="3in" xmlns="http://www.w3.org/2000/svg"> <desc xmlns:mydoc="http://example.org/mydoc"> <mydoc:title>This is an example SVG file</mydoc:title> <mydoc:para>The global description uses markup from the <mydoc:emph>mydoc</mydoc:emph> namespace.</mydoc:para> </desc> <g> <!-- the picture goes here --> </g> </svg>�������������������������������������������������������������������������������������������������������Image-Info-1.42/img/test1-fuji.jpg������������������������������������������������������������������0000644�0001750�0001750�00000005533�11302305677�016176� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������JFIF��H�H�� Exif��II*���� �� ����������������������������������(�������1� ������2���������������������i���������������FUJIFILM��FinePix S1000fd ��H������H������GIMP 2.6.6��2009:09:14 21:37:41� ��PrintIM�0250�����������$�������������"�������'������������0220����������������������� ���������� �� ������ ����������$����������������� ������� ����,��|�b��4�������0100����������� ���������������������������������������������������������������������������������������� �������� ������������ �������d���2008:12:27 18:49:37�2008:12:27 18:49:37�(��� ���)��d���)��d�����d�������d���)��d���;��� ���FUJIFILM ��� �������0130����� �������*�������������������������������� ����2�� ��������!��������"�������#���� L0��������1�������2����������������������������������������������������������������������S100 ����S100 ��������@��������@����:��@��������@�������� @���������A���������B����������������4C3133302020081028B2858WA28674��FINE ��������������������������������R98������0100�����������������������*������2��(�����������:�������������������H������H�������JFIF�������C�    $.' ",#(7),01444'9=82<.342�C  2!!22222222222222222222222222222222222222222222222222���"������������ ����}�!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz�������� ���w�!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz� ��?�+HŲygM�0##9QE��C��C��� ����������������� �#������������!"����������������������������������� ��?�\-M� U7�![?Y&Dѱ@pdKhne:;1-_:b-6d?$%O���������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/img/test-gimp.xbm�������������������������������������������������������������������0000644�0001750�0001750�00000000224�11302305677�016112� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Created with The GIMP */ #define test_width 6 #define test_height 6 static unsigned char test_bits[] = { 0x1f, 0x07, 0x07, 0x09, 0x11, 0x20 } ; ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/img/test.ppm������������������������������������������������������������������������0000644�0001750�0001750�00000077236�11253753022�015203� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������P6 120 90 255 :IR>HSEO\;HU6CODP\;FR,@I".9#/?%0A9HRAS[BSSk|qlqZtd,D:+7?#.5!-5"-9&2<38G1<DESWT`^bjm/7D4>H5?J/9>'3;'/9+9C 2=(1*4(3)2'3$+;=?V@N]+4D(0:"/4,2)1*5+2-5H9BV4FR8IN)4A,5D+7A/;<FMM/4C&4:"/;'.#,$/&7$)6!)5$0 2&8)1E7>R;GYCLZFMc;BU+5 06(0*3",9;FW5DI!/5-3B29I?DZ7BO3=I-4;LUVʽ,8B&1='1?%)&2'0!,@#2@$/)1OBMeMXq2>WEUi7HT$/CMUlNfs*1#0#/&1!+5",/%,5%+7-4A6<OBI^8@U2@Q+6@+4;+59<NEӨͱ߫ͳ%+ )%* %#0'3%*:&038TCMcBNc7DUAWe5KW3BQ-5H<I`ESh2@Q&1='.&,'/#)399I:@P69IFO^FPaANa6BS8>O*4?,0=04=58;8@?6HD7IGDL\OWgU^iIT]FO^EM]JT_@SXBTZIQ_P_`$0!*!*!,%1#.<'1(2D/:M<F]8IZ7HXETi-<J07I=E`ERgJWmDUe",5$+$,"*0(-6CFPBJZ=FTEO^@H]7GV>GY:FU;BT5>F9COAGM4:?*.2-34/67:AI:GQEN_GPfBM_FPdJVlGSeFRbGT`NWdYgg̼$/ )3#+"*8")8#-"$'64?S3FV;JdEWk'<G!2:.7OASe9I]IZmOfs-0#.%.!(3)/7>?LDHYCHU>LZ2?G+5@.8>7AP.:E0;G'1;*3;)18'/5(,7+/6*/43;?CHXBGYAO`MXnEQcFReFReGPg@L_CM[MUdSYdPZ[J`Yr{%.")3&5'-<".9!$ ($.'.=5BT:K\8NZ!)1$.15B-1$/9?QaM]t26 &$'()!*--47/:@,7B/7C)5@%-6,1?<@P-9E&19#-6'-8&/:$+2,0>*2=)/4$,3/458@G<AUCPd@PdBMb;GZDN`AL^AJYBKXGOZIN^JO\LSaJO^P]`¬Ⱦ%*6*2?$.@)4F*/ ( (&- (3"/>-6F+6>'.3$%%#%% "%!%4?I_CNd(7F$$!$"$#', ',#()*/1'/4*.7&)1'0:)7=)0<'/=17B)3=+0=%)626F5:J(-9&/7#*0"+1.49;>O8BS;H]/;L2@O6AV7AT6@PBIWJO_IM^EKZGN]ELZJMZV^a޺·(.:/4A+-?*6D)5%1$(!. *4&-6'%*!$&+'*#%+"#))(16;MCPeBTd"#* %+"*3'-/!,,(++34;,/3)+3$+2)-",+(.0).41590185<F2=H%.7%,&+$)#+524869E4:N6?P06K;CV5<P9?Q8@QJO]PRb@FY;DS?GT>HSEKYW_^Ҋw{uyst~rs|}ʿ)+7)4>+6C!0?%0,%3+#(!*$&1)')("),%&*'+/('1,0'(),.;0:L7;P'-9'.< *2&1$)/&+2")1037:>@$+1#$!#$"()#),%&"'),25/25%*3!'&.&,936B5:G9<E35<;=K7?MNUgbi}fj~@IXLM_[[nRVjNSi?CX>EV@EXDIYMQ[npoȾ͹Ϸڪqu{mn}jn{gkxciybhvlpnpvypqijxqusvz{yyvy{{Ѽ)5B&/=/1A&/=$5",%5#."2%5$(2""%)%'3&)&#"/$$,$&#!'++8:<SPXoET_(,3&.:%(4!'."*-'*$&$($)2*-413646=9BG5>F58?:<I17A68>/5</28+05)/<$/8&1646:@@J:<?=@E@DJMRZ:=DJJSPQ^wv~vzutOPbACU@CT>DQDHWTZ]{{xúºƸ͹ųɵԿ̶̹տԾ̸rt{ml|jlzeguehwgiwabyefzcg{ghwor~gjxcftjiumnxhisvtpoxsu}wv|xv{}{~~Ư25C,2@3;G17F-4B$-7&1#/"'3%)*$'-!!#)#$-%"'$!-&&*$"'&(2.10/39?E)0/$)*(-1)17%02*/7+07#(2'.6+.5,2<8:H#.2% "##)#(/,197-23(+*.23,01+-.(*-*+.'+,)35*,,.0.*-,132-24,24;>H7<=DILSY`z{^]hJJVDEU:?OADQGISXU\orqŲépronqpgixefyfgw_bv\`t]aoaeqbetgfsaaodenhiub`gkipprymmunmlnlpsqwups{xy}x|}~|{|{{:BK:?M6;F17=./4.1;*.6+**.*,+)*(&%0'&-& *$%*&%'$%.-29:;FFNHMQ@FP3;B'4;)/4"'$"$%+..5;5?L,3>,1<.;B&-.#!" !$$%%%$%**#*'#+(%$$(&(-*+--)+)+.,466-01(+.)*'/0-''%,.-688;9:<<?888JKPtv}^\iJKUDCN@CPBDQJKWRQ\dcgyxy~}vs|wmmwun{mjtmlvmmtnhohafsmtjdl}y|jiniglminqlrustwtwxux}xx{~wz~xtws̾V^cLQ]=>C/++-(#-)(+'"+'#'%"&%%0(&-%*&&/./1-///0624==<88?/7:$/)(&"''%)+&$!*'%,+$*)39C/;?!-/+,!"!#%$-.!))"! %""&$$(&'+&.33+.,554B?@::;7:7'+*'.+0/0)+))+%?=;D@=GEF==<HGMUX]oirXS]g`kXT^OLXZU_jak}pwux{uz~{{tyxu}~~yyyx~urt|x{~vw|zysno}}{x|vwxxuz~x|y~uqs~|MM@LJTPNYCA>5)*4&*1(&1*)4/,0,+1*'/'"$!'(',-,*(%.(%,'!$&$% %%$*0-/46./4!)+*-045:'%#)*!,-!'( ##%%$"""! #%%%' $!##""'"&-+LKIdbdONL?>?%,/*,0./1')+)-+134441@<8;9;>>=|tl~wpy{y{{|vxyuv}z|~{ywz}wx~yu||zz~~{y~{{tswzz|trt{zz}zzxplspokeghgcnnqztxnlrpmq~zz|}|y}gju_khmmtpqqv?39B075++3)'5)%.'"$#"""+%)'"#''"('$%')#$,00,13FHPCHI=:=81/,**.01324*20,25*,/ &'%#"!"!##&(*$,.,%'&+-0"%#---=A@MKKQRRIFK0458<A146/20667366-21651E=<E88ZSNrpg}zuielhewpu}wslosrkehc[`ldi~{~|}}wz~wy~}}~wwz}}u{utwzxyxuxh``tpoodeea]pjjvsu~~wxӶĆ^LYp`m^SZ2+0,*'+'!0'!*%!(%&$$#%''.6=/5=*//>AE034ACL?>E89<2/-52/*+(&)&%)(%'(#('$"&# #!%"% &!()%?>;063,/.&)&.55+1-7:67=C-36'.'*+%5:8/0.+-)/0-924JAEMFHg[aXQTKLEHGHZ\dZ]cW\cackcfmqnubclfihqpwqsuz|ux~uzxnpsv{~|~tpolmomotz|~}zxzvuv{vntqmnnlmjjfz|nffojccb`qllxzwyrsvtrxxz{xu{{z|vvtvvxqml|xuyvqݘL?7>,&*( +)'&$*?5Qvr`aiRJWOHNVN_YL\TJQ531+)$('# %"%$ %# "64C>7D77?((.'**%(#("#)*'**&./&*&$',(+/*-."#%%&$/1/355((&3,'8/-GIDPKMgqsMNR#%&(+'KNNYY_WV^IIOHHM[[`uot}uxXZ\SW\OSXPSWVV[wszvs{b_gmipa\bTUZ]_baYY[VVbad`YZlnn{}~zzyyjahLunf{{ya[\efgefhtusyuv||z}{}zzwvsrryxznqpzq{vs|΢ͱʝXLI7-.YHcՙmfmULS.'-915C=FLDSyϷǠ[Yf31;TN`g\ooiyYR\<?E.4?+,-$($'((-+'5,(5+%8/,D93NJICCE*)**++)+*,-,:59=;<121363:@<Y]aehlggkYU]URYVRYeWYrhmvlmroq|}{wuxp`beY`gX\lY_ugjshjhgg|xu}{yxbWpaRvovni{urlkjigspqwuwsrrz|{sxy}vxz|rpwmpqlmtwռ̾μʺŮ͗NJQ+**1*..,$1)&6+*>00=2-<73A;:936.,*-./-+,0-,42/5/-0/(652LLLcTYgbemhnnefc]a|{{˺ƶϺ͹DZɸ˹Ŭż~qiwwy}vw{uwzx~tuuxttsp}Ȼ枬ƪʗӶݫnlt;<>0.,0+$5/*G?>D70?85F:;DAAB@A8;@:;DDAF=<C1//1,-*)('($SNJ;>=KNINOM[ZXhqg˷ռű˾վȿȹƯѼѸμɶǷʶ˷Ĵ±̾wyÿָܒˢӾϲûƹ°ōƯɥvrw==961-611KFHG=9D77E>>SNJZUYDDHCFKB<;024;8;225('*')-$&'#%!(*&)*(,-,IB=-)&*+$:5.KKBll`~~dxԻìɱ˶dzïƶȱɾǼϷֿӽӽлŸζúĺ㠨Τë̴óܬ˺͐phjIA@I>BHADMCC>73G@=?54CAAA=;''$;773//IEKxuFFT,,.&(*42:**-..)EFJPJNKCDA87920F:0cYJf`TXLITF<tĬêη;ĸι̶ʶʴҼֿ־ԽҼԼѼٿŮ۱ڿԶܩҷӸηȱtcgUHMM@@2-+=859.+@75OGJNNS\V[[]fbcpMO]PJSDGLKKOZ\c^W\G?9>3/M=7PBB[PRIBA_`a`ZTUNBD?1úh|µȱʾǯͳθԾѻкιιϺϺ̸·ѢۂlmjboUlSȳƲƨխѾ׾Խѿջӷĩ[HEF885,*E70SMMOKOSPSYYcktqȳnlwRNVLDEZMMQB@>4/J5)I83D85OGC@@:NMRF@@<31?91I>4A:6C>4g\OutvaYWfaOv|eqDzȴͷѻҼԿսӽԽѼy}orwzwɬįʛկ|`cVBUD3}gMkOpsspWUQdLEzȧȶи˻ȯƭǼ෶˶ǽ}agG33A30MED5.&844+*)=EH87@CFCxxcdhEBCLKL[STMC?H@;A/,=,';3-<1+,'#86::46:30C60@2+B93=70B3.KIKB:;;7/SPU841DB8tįʶʶ̸˷ккӼӼӼԾϺZ]ZTWVih{ö˚ѷȹФƺǬ̫zo`ngRhQ>pVxsiY  G1"qP;xWAtQ9jJ5jLfLeGtR;slnrz~ ¶ylr"!   &'!sp{88< ?3-@6.a^]bZ[7/.I82<32BABPPMWTOL=<L<:RB@][Yvy~`\ihjqealaekOJM[_Kűʶyzc{jkPm2.2GFOMUSVLgѴȣdiphn|hqtzɻι̿ʱ˳yophW$$ J8,J:.O:,K7+L71oG8pE0T3"7%&cD7ѻ¾ͲŴŧܿжUVa   NWO=?J-++  .($G80[VSka_NGITGIQIFggjdggWROvvwa\crvdjmu~ǴϰƍUNLPMB*, XiW//( !$)*JD6IF6PFaҳš°ǴɴȵMTWrk|½ó¸ĩƒ$!  8( (# $ *"-!1"W4$ K)q\µŸŪՎ˸ǞӵZ\a     )/-;=J#!" gcemjvbY`a^c_TWVMMYY^WUVttzidsgdiJFCr{rrbnzˬ˾ۢù泬QK[''0&,%ZkiZ^o{}~rrtnfxĬʬɱǪ~ ;+#  ,& 6!pC,rhbukiڣɠ"       WV_F%/[VWd[bZSW`Y]^]`icdswY[ekitv}}{skgpI?;{{yxTWZǥžļtg~-&0! "%$bcdTK_Lb`JHNywmtuPMYmn{{{ŨϿƵ˕ 2% #8$ #;&tM5ǥ|{ҶȵİBAI       bag   LA7}v|nfjtoqrjv]WY~ttrqzeerTRYLFF\]_a_lNWQmwgs|vi}NFP,(1(++x|y\Y\llwxβ۲ùͿ*93 )%%#$3(&,"   A' ):'`?Ьҙytux~ιqoztt|Ødgs      =13$ 6(cZ[}^V\x}pns}~qq|jjw\W^TOKhjmgikz=:BQeeͨȻo`zwxu~ɠѤŸy I:70-% "*!.* p<#ț{ǣγėа('+         QVZ`GG) )\LFoeouve`fuvolqIFBeZPXS`IOOӺդz|eil{{~ddf]Ydʟѳ̦̯˔CRO NB6*)& ')&(1% 9$+!2$  H+̛x~Ьx      ;?Bnn{SRWa[^cI> <.,zuz˯x~z}kbklhjMH;uwzulymtkv[iv|~|~swvQQS}v¬ǨѰôڶƪŌ2<< .)   5(7$%1%!=0% %.ybzsqϘϡΟ      *# $$) $"#?6,9+)qrruzvtwssyfai{QGKopvrqxwIKLpsxsw{rttǿxvx­ȥʡƙLOG6+' *!!.V1ihjX_hy[]gì     /O7/B?E%$#~A)# 3% mjsg`b~Ɯ`eo`ej`Z`wxz^[]zշȻӓƙ\jyzpm~ռΰͼÿ͸ԱƪIF>8/'+'! 3 !  W3VvipwekkŹ̆qw~FISW`xJTa\euُ]jkuuzWWY0-.  -9H+D@I" "./3pC:.$x~ܨjksiadmmpȱg^dkpufdcajs妡[_oƶ¬`mx}txy~ڪvpnj=6,$$#%&+&''2&@& _4}UuKtR?RQYĬrudoeu49=HS`cp}8:B7:;OV`KKO?>>>9;    !>I&G+"xxB>J*+0778XG7.-b_ox̚ӯѽ¤۳ȟӬҔoo{u~ȯͲмؿњ˽±ɤ¦esz~`ipJN^`bw̋Z^qUOH+,+   %m8kEd;Q&D"mK3lijiov@Ocjxbn{29A,16!# "#$$`bg$"(       +9 fihqtyLFK,(-!!#=86]9$-.+to}gvyfekwdcv`hew|KN`\di]^d}٪֧ͮZRaխ̤mvnypn~`i|Xagwaj{VXj}\XTCA=      3!t= E"|>Y.P&4>`<`DUB^QF/!C1.-179?H148       $(O@@h\^b`gbaezlF3лʖwzgp{TViKT\:5:@@8dpoĪq}XT_ovx̴͢âdcx\]gcdm^[\ww{{{tzuwb]bMNKJJBcXbnlzlg~r|7<5JB=ɢx`bf{Ӹͱΐa^[MMK+.-  K'h9S.m7R*M$h n$ |4G!c<dCjAh>[@6!?FL77=DHP       !- C+5'M{tuklQID}rmkNA ۽͞~spz{ozд̵Үzz߰ʤAD=OFIxw{y}|V^RVLI_V]KNLWNSIRLMPH:75JTO//&hdoԫuutZXS8;9!650;2./#0!P0mH/uI)sF%Q)a9Q c k,i*r* :|7:G%T+lC0.*(       PNIke^tpf|ylsm^oeXdO>;:/#/&,' <+$``bss|ƕڔ۹¨õȟtv~ּձ,+$L@8\RYyyz~|iot46)J>TָǏekg||EEA<>4@9(0-$@>9CGBVSM#)#Y\^TV\sydgc/2/!&)*(+))''IGGZVO<5/+!T8"a<"rJ-bDuL*zL(f@>= a+k:]# p,l-j.~;J!O%M+        653]]Z}~zwpaQbP@UI>^YMf^V^I:0 @>;ħ|ɻє婭wyݯHGCd]]xp}ϫǡ`^aݟszmsfJIMHRO++ #$&(4- .-!-("<45ijqDHE12*<:8EGCb_d}vvq>;7%!#125=;9db]XRI8+ :(\?'uP4sN.^B]@zS4T13'I#]2J!^" b%d'}:EBt<        ),,HMJnqg|zx}jSI986оٶτ}R_iԿիɑެ~w~VUfsѻacp~zϑlg}~ST\{S^eIEPszvMPR05-12)'',%2,"KF;nftvrxt44)EE=zt|o^oeWUMA$'841.HF=E=/F1M0W<%rT:mS;ybLnRpRsP3'#D'Z5;B B R f-x9r8t9    %,.W^]JLK|}}7*&CEJsw{zw}tx[cvǔ^lķ٤vxv~ɵopzY[j}?RUa\ydiyݘqx{knoTYWNQ]jryad_CA?DA;NB;b\]phjŲ̄xw~sscRfV@;0%//,!"0,&VK;7-!P6!Q6#W<&eQ8mV@jRhMlI0A'&J,O0)(? \(h0[,Z-S+-$ /1/-/,[_Y\^Xwyvxyu||lmcJA@-,0152~QYkNUdgo~jt`iz:6M.42S^bqsBG[L]pwekV_nkxkuŽШjkkt|v{KRZ{y7CBgct~}zںص˖twbfeX[\qsv~xxzORTUY]UUby~{|Ĺ˻ע~{rj`P_H3 ))%I>4OG85(I8,dTBM;+cP:aK7gK2W2N,+1 K1F-'!&+?:> ^A8Z>6JHGDLS25: ($ 95/[b]stsyzttukuuowwnwxq{|q|x~UOLX\\wx]^pSekNJ]QZjQQe,-35;=EJU<=L(:?y~dutyY`pȪȫťQ]net|rs|36?MPfcm֧ufhjTUZLIW|z[^rkzMNPBA?*'#:33MGLkhvSV[pq|vugh`S[H46-"2.$850KC2VC4@5%A7-F:-j[KP<(S:$Q2W0Q)>$<)B,9#*2)! 6/1,/1268443RSNTWSqsivwqqpgzz~r|bRO=74NQQvtfv=9KhvVE`,67vzzZ]u`hz`hveqyʑßymsbisys@O_~~ï~ggmSPRRNJ4.%B5/gdna\anq]ns{ynhhbTL>QH=NL?QNBC=3JA54.&ZREWH7^J8G0A%O0U.K($ - <*8%)$ +'+­57='(("$#'''HJK30-EB=bfZzxrooiz{~~|gUR,'(264[dmsx‡¤hkzgvwѓdf|_hz`pyİ̶҈ïkoËlj׳ȏ|~97*#!JFGRRXzxFCGYZ_GPT]]nxslh]PTNANLBTQK:9/C@9GGAVRHVK>^H3J0F*N*O*O'A'7&8), $'%"%swfgs""#+.2UQ\ko<AM$*+.4:.49 !OQQ?@>MOEiidttg~zx}]UR9.,]huWYg˵սΕ|ʪu~~B@W),53ADt}oʥ{eo~~m|tsǨm|YmsUVemkhgv|qmv=78ng}|ZfnHLJ9<5(# yorwzuoxV[^WUUnlmMW\TYasnfgWGSK:A=6\ZO<;2MJDVQHPC6P6"H+P-]:!d>$[1S*F(2%1$!&"X]fembhz:=A237#%)"DHR !  8<=-00NTRppmwywz{rv>10 ".17⵺ƽգQVdםt~grɪƊP\oSbtQYpIUivyTX^bly@FEig~{W]cdglknLa`?:852.ZY^W^pMY\oq}8<3PLIjhxnvz]\a.41413svbflih[@=1D=/@6*QIAEC>B?7E>2<,I.P1Y4g@#pJ*kA"Z3H)%':9:r|ivJR_dmz:DP &)*#"   !%  #&(?@>WUQmnhw{xook~{twtgjZW  %%|ltĶΛ̽܌µѩ•ʷէə^c~BG^?GQj{vjxx]_lPTWWTjɋS^^VXXHPLtzGQM"!:49chtY_mGQLLHO=>:3/+<65ZW]fp{fjvfr{HPUMWU<36ie]DB@<:484-<81DB;11*#2(=-R:%]?&kH,uQ5lC#a:C' !$'INTDFIHKW_f{?DP14=  "-00  " #'&*,+JKG^`^llcjkctvovun}yywpK?<    auHRgܿڱѧƟӚԠhlԬȸՏsy^p{{nei{^hk@:ElvljlrR[^ffvSZ`497"><A4898>B',)20+/)%##930\[e^bqopR`e*,+1*+vtlXYVW]Y/-+3/+?96+($*&>1"R9&`A)nJ/oJ-l?!`4D) ACPqyCJQmpzXao+,/  $(-&&)$%+,+%()$$";;8IIC[YV]`]ssnlnh|}}|~}vstNCB    &04ǨLJܶʀݫʧňmp_jyǯ̋ˮiosLJV?;=LIPjmxfZs}w{r~`jiFHGV[W454<<B342+*-9BB-0/<<;GIN!"0+4devy|KU\ !#C:<}rlZXUQQR?=<334DED/1/*)%80&:/&I:+fG2kH/mE(c;!T/;$ ((0DFP:<B@BL,0/ 24<JN\=DK ! $#%/16"$",+'<<;HHEijg^`\qvrlnmead;45$  *36jm~]rưвԬac}ٮtwؚ~{BTaxʨȿ``oORWEHE706POWTP_\ns\ii+0'351'+&351'"%_fo?CM(/,)$$KRY+.(+/($#-1188?Y^jCJPBGKVSWyshgaROMD/0+''&<<<9;8432:5->1&WI<dM6c@&d;"a9'R1!>&"  9>:=<5@KI18=#&(39>>@FMMSKQ_CL]<AQ8>G+29)*1'%&('('($SZXMLMcghLMO  -%W3;&(+,fstӶյցuòZYdbpyŴԽغot×PISji:CCMFV}vv;HI,02CFG.2+'%#"+(&"OQXVanFLP/0//2/-/(*,&943CFEVVaqu[hrbhy\biwk]`QCVJB=73'&%22/=<2<4(J7'Y;$\2Y/S.L+9$)  .-)4:9aktpfnirnwZbqV\jRW`+0<@KZ8=E;>J/16>EM/49DNZGMP%)*8@@=>C;=>&$' I0%d=&W0H(G:4WapȲԽڷԹױј̖ffodz{߼ںشҘ253?<Ddbkww226KLYbdwKTS**'+/-*,( 0/-!&"rrPWb=<=DFB'%%10:UdgEJUbfou\CY;$G0"B8.32- "((%D?6E6,J5"V2P*T)N%H$F&4!;1+357 $&#(( %'&W^_<>;ģjrVdv~hpado&(*78?6<C;BOIP[mu8=KXeu6DJ5:B?HQ06<B!Q9&{O.a>`Tbfk׶ֹؾܿ߱ї_gtru=BC~հЯ϶,+)',&$X]m+3-:99179@LH5;65@8MVS/>6D@LTX_4=:*/''%&/+<sudt|AEF #!)+'JLUX^bMMV~vvjlswkc{aKfH.I17'7.&,'"/)&<1+R=+fG-kA&nE&i;O*B(>/"IDI8;ELZlZhuKS]HWdP]kboMPQektcoajsBCL39E6:E+2:ydf}')3LYhU^o,6ABQ\/9A+47&)--12,+)1"F$I6&OH8cBvuB7*d_thu~jjxۜѱڷ͠&$!"'-).1.+/'*+(598GMVNQbxYcg@GJ37>5:>/44@HJKFSZ\hW]j6A@JOO241ZS`?AI[Yj|{sXL@eQFsU<x[AjP:O7%/#!" "!&$I=/tY@zX?kJ3U/N(I.>:1ejuQWd`fy|žאћ745y~a_lST]{|kt:DN@N\Xeyy_h|T`nyhxzSSbINHK7'U0L3 D:+U9rsE?3ٜo[akȫӫ٭-+ &%541<BGV_cHQR361<<BqwRd^MJVcmvFPXBEKOS]eer?HG785-2-DELKRXMO_agyrwzSVT]K9qXwdN`L4B3$*#$$##(/O\nduaq{?DGK:1|]DwW>W<(K,O2E4,kmuq|u|Ƶҝqzkn~860==B<:@B>@{txXNNBBFҵΫƯnx^gs}nsʟǴѯͣlm{YXUTHD_:+U?*OI:oK5rq`a\ӲܬƂȾٔqeqndkgchlu|xr13>+*'81/FJRmuxaw}_g|PVmͰѠ‡~|w}e~068>JNFKZU[iw}[clxf{jUkVCN?1C;0#"69Aul|rz~uk_mWB_D2iL4W5 M1S=4JINklЬ̈gde?EJ;E?<?>69:DGGsltդQSTOUTɬі׿቎ɿ˱ĹqkfxγԭڹխɡºַհΦöslFEN<40)%!<C@T[jahtxv<9H)*' #!47@[]{VirCE\qvƲӤu`^{n{p|UbkckgsKVaehr~unzhRJ=-J?252.*(&-1:fozraTy_I`I7rXAI3%L2!TG<y~mvͰφ~fkvd]`so{diqfinGMJ;@@MMQ{t|RUVOOSէɞ­̾zxܡΚt~Ϲٿܢəƅ||cgy,)+"!),(6?5\himq46=$'&)1537;?CYkpIWcvws_dvV]smjwqs{}HUcmurin|<HR>FSBM\$-,.?oort`]M9>6*44,)*))1;{W`{yPOQt[Kx^F^J9TB.H8'H;,.'&][lxƵkxcgn]YUJ=2tz]W_MJMpnsr^admpwceh۬̏υֿۧ۸ԡLYeħŸԻѵȡ⠪’Ļھ۱НҳӱұѴՠef)5=V\f*%# & )/%/5+\hfipBEX<AOAPV/57KHat}HXVT\eMRjhySU[6<9NJUIMfekqyW`lA9H~KUel{hjEGK3:=FQWEM_OepEGLzepZDRB-.*$))&%&%W[sm|\i{pdQB~`HbJ8VB44.!.3+.45FNXjoxpwwV^fNRUKCFX\fcmvquVVbZVW~~vtʫŎըz}eisv|ѽۯʿݽܭΣêɶӹڸյիȤP]lAJT40/+&&#$-2.78=9@IT]pGZf/7BHQaoxKWYaflABG"135VWS531/4325<IRVAD<317egwnuXYc{y>DH#' /3-259RU`6=KylgiSiN7<2##!**.&,7LRjcnkmyVC9PA31'9.%>62ѮǝДNMYͰwy|x{{}vyvzbgwgfrytƞ׼ڬ^gvgo{BFUOQZacomt{ܳͧ۬ʹռۭٙΠS\}EPd'-45;8+35(-*$ !'$*-*;JP17E?AZmYcmKKYghz:B8&$.**TST1(!KMS;?DFPQ;>?1(,KKLAJJADFLQX")$-)=>9:>A;EG866wiTqXDgN73-++%<>GgtkvQXdi_Qb^\.'3.#,*"NO\z{~ܶϧǡMRWSUZvvyxrrkpgfi_ZV93*`TPXYb``]ooya_bWQI}ngqᲷÞfekm{kp]bdYUUMNUW\eʸԪƞ߿۳ӿݐwxʟ`h;?MABB()8!(%#*, '.,:IW;NR8FY*46346IKT5:,##&" <<9%%"]_lMLSWbiAED",..8598<:SSeAOM03*$$!EMFITSE=4K<-w]FSC573'!,.%9;HQ\fWWXaUE96,.*!*'MPN<:BQX^ZYbtsz\enPPQQHMFKN|~|ehb4.!5/![UT{}ppoWWOD?3YSNt{{}XIJ`SNjkpԷw~QWas}^TZMCCGC>]YZZckҐҳԺ׾ۦŞop}}SOg<>F4:9<IN #,$)*#10)>?=S^tVgr=PRIVd.3@>LO&*$"#!#"!!0,';8:59:06<'+, 5<A?BD1.)a_nNWd0<520.LT^w(+ 0,$TG90+!%'"#OJMpr`_epo{LMO=A?@EIKP]MW[ouĎT\eiovVTTLINcajKHD68.#"_aYSQVLGCywNJE.)&#wvqjsoimF5&I?0hfeim{W[c}]]czIFPGCCG<2>BI~ȰШƦĠu{VOiaeo}|GNi|fcIHU**,@KQUbio\Xp,$#40-===[bw\k]nwSaj+33ALN !EJF(0$(%&*!!!*%(YfrQbp/1..*-P_\411TWiQUa7<>59382;^WR.*VY`DLJ32)//('&";99pfvcot[`nBGQKLOTamux^ahfj~|EMNdlvHP[__hBHKPQYddlXUPSMKvprQHAx{zNOEbaa:CI?>6^bc00'71(DD;vw73=?EMOCAVQMB5&9,]`_djneggPX^t|g`gc`_VQQMXcagrw~ªʯϘciksmsOS[ZXjEPT^iwURv !NciivwI=M.("96095?uTasEW`bc{F]\'/,&,%044"*&$$)&"#@@LNWf`f?EHHEIOTX<<A6?B'&+.221410<7EHD)+%13>DKQ*2+BIH:<9269QP^S^lQSgruchtnuNS[KMQMM\WU[_adA?625+^a^/- <:7--)ښbddSOSVVJIJ7WXRCFG?EO:<9<7(C7'90 7-X]X<?9JPNelqlwHIQPNOvpvnfpldl|ŦÚR[tR]l?9K4486>?Z^`jzBD\ !'/;9NUaoecy;47-#(!992JTlN]qPig0-;ov*5-FF[P[i3@9""20-# .(+BDS*//./7FCHB?COR[*.,')(" #KLM/00=AA@EG+2/AGK@AOBIK/./GEHBKHHHSs{DI^acqujv{ĦOVjTXb@@Hkkn[XYmktNJSJJNKSOGE;65."!12'rnrsqya\i@<CPQT-,$//!A?949834811.;3"@1"3&73&@@77:+CGFNRZbkv}UT`CAF579gpTVbuvw[[rlxwu75A&*'19:AFIL[bdp}GLT+2-5:EXeq}C?J0+$>5*+%!FVV6:A")%'..#$'&'&#--."#,/1*,05DE #-(-B>SEUZ!'$KOQHOS,22+.0*25SY_-35IWZ?AEcltHKQ4<<TMdpy(3=ACUЏÁ`k}R^e"*'tw{gep_gpJQR\_eZX]<B:"25,.0%00)GLJ&'(*009<A894,,"JE@?<4998CBE:7..* -&,+.2&JKB7=B<@DOZ`no@@K8<C0--@DGJOO`koyqp}dcCGV86<#$.+./-..Fa[eqw͚A?H #37447903<,,2 %!!ɢ™i~~/>5 NUf")$'& # <<CvKb^&%*ROgw/26BGS::@<=COOX~|ozfuAEH:AEKDO\[sW]pZfx|ĕhm7AJJJ^msTV]-4:}SVehn{EHHFGJHHM[_g-0+$*#GMPY^l]]_&'#OQT_ak,/)FKHMGEFF@A>B68;-+'4/+7:<+/1')$8821;<[bd<=>>AR25?ISZ??E+*'cfkhnwnq\dvklee|us~s|qsvKVfjo|#&-&/+q}89<wu~~zKK\21."$532*/-&&,hz<Q[2956;@+78>@C;@30,4WWnxzDBPca{q{,/47:A66;hiylv~}lyf`xlwaku<=9%++389LTW@EQTayouMU^LM`JMa?=GGFKPS^JOV7<B!##KScDLYEIN.696<AMCH<:?*.+!.3-=>A))*57/lpm02.=@C???Z]bonvLFH221=;7-()#%&##(00-9;8FOVCIN"$*5<MYe^mzho~777UVXHGRjw}qz}ffkÒ{pyiq}uhl{IR\!)(>AL10349=V]d_W{IFX+1+**&227_gR_vEYj<MI4C?AGG$*&-92 3038@:*)"IENB?HKCQCEI<;H654'(',1.-,5UVs\it359YRZ?BK<BDFIS;GCAEOQVitwhm{gmanwCNSDMV $#$""AHR"(0&/0#!JOT/9>58<214#" 2./-,.'-&05/*.(:9;32/;=<dZ]J?@DBG338;:@312<44-,+U^bUW_+)*)+.&&&%()')-;BCKV[Xirhv`h|ejZ^lkosjgoa`gcbpw~cetnpq|9=N/5:/20JURCDKnd|.-5&'%'-%;@B"!  08;8EH5AIMXcGWT!*/9<HH:C>!! /+,LKG]^caeaV]_FGP,40865QYaJVV/1@mwu|`d~LWaQ\]"*(,.(9@E;EPIKU<FSfnS`q:@JPU`pwn{X`o%.-+14-45$)/iy/?C;DJ+35CKQ077$)("' )-'.+("% '$!)%C<;@==</*ABB#&(#"=FHUVX /04./046;"%'$*-,4909:UZcU]qkvkuSXqJN[EIZ+,1LHMednstU[ix~z}qspv~SZiwuYbo;GS>CDQ\^gkx|`Wv;==()) $#36>$$"(.$!!GYV,86?KQ5IJ(5.!""0?VO+4/CEC468IDH]T[BBKISWS\ZYYjn|.9=<CNINX]\sO]lKUdLQ\9EF;:DfmQZiagyƆYim147DHVT[nk~K[] "7=?/64,1:BNW18<7@D/57 )))11"' !%%!'!M8/=98C@BEBD@82$31.046 !,1358;69;9>C39?RZ`IOTTY\9AH#)2!#)"(-[k{do5>NFT\iyfoxDFO<7;tqQWdlt|~[ivk{aiyxBGX:55133J\bDE_%*+$&)"#bwuYScI]a3;6DIYdo?UT#3-$ KK`CHZ3?<(..;FG03.1++F:=VO\s|GMQRTcx>JNKQUQ[_27?JU\DGTW^nIS]'1289IkqKWeNRgKNh=NV#,.49=Y^sozYcm)++9?A<@E4:CGR^(46 ##)/66>H?EJ" !#!" !*# E69G97IDISFG!%!(*$)/)(+&!$& %(9EE9=>/3735='*/QQX(+/(-1$*-1@E||hvSUXXfr}itgkl|~|zxel\g{CH\>HV;=?&()!&&%&*!($&-4 $ %(&',-36>HQgAMOFOXGL^BL\$1-#).01=DR_Thi%!!  A:FQOZNM`dls~aq{O`aALQ=DL:@H9CDDEH_alR\kIV_<>PWYr^hwLXhM^n_is|cq]kz=IOGP\@CUPYn18=17<&*124B.:F$21$+*-5<IQ\<HO$&'BCHKIJ.&%7/*%*&'+&GE='$#++!,-^mtDKW$'( +.3DEL !%5AGAJVz|yQRe\bqX^rnvA@G=>@HPd/9Mx]q{GNn4BIdqxB>H,24*&=CL$$'#$%142/5<6AG#+( -7CG9@N8@J>@L?HN*./2/6:6=7-<]Xqc`}lv^oyLX]AGL.06TXdE?BYZgclu7<G8?DSWplr~\jepJTgBBQdju_hvLM_5AL'7=(0419C#*+!&%,07GL^&,5"')&(' &+.%%&%"+'# "-/-D<:&#%)w\bo',0$*.<<A#'*.9@0=>>EM;<ITZjKO\\gvr}z^cSYeA=?653hn|0)*14,@EH@DKap]fZdS`zqK`kiuBHRIV]-//#$$#%&/& ('/1).#)2=E""!'=L]29?,//,,.!!:CF/8:=<K8KP-/<BBWX_xKRhnyk{9DH-0:9@J;>AVOZSYiGQ`0;?32;TUmm~[f{O`nRfnKRfDET..5>FW(27+28#'',"&29F%(0%(-BKWGNQ%$!3=F+9< $# "%*23TZv\_q(1@5?HXfgjty=AI=O[|}~wbiwZ`lJJMHCD;556:: !!+($@LOAKPDPcGUmZh~K[pN]wR^whoFH`7;BJSc'). ;L?)+-&/4,! )'(- &*/;?&%&,7'.6&*.-11&-.59B$"## $ACY2;?65>?FW;ESMSoN\n/<J+1:*0339=:24*+,?MWRdpQfo0;Ejo~boSZmakGUe?GX9FS.6E&-5'+/"*/"%AJUES^:@L19>*--14C&+3$('+323>?%'&%'-27C'%)/9:>T..B(&74=K@Pafl~qsIJZqdg{CFQXXfkuNP_[Wed^qe`l$ &(#%#""#!)('---1<;ZkymvKOiRScHQRZel;><@>@.54#,) !!+*"&&5-*54,+3 !!,+:JO08?!.,! " "&'42%,3*0.&''29? "& !&#&)23;=@J2@D9@V5:G=FW?LX!'*&'';<@doqo}GS[S`rtixKUcO`m2=H,28!&-.7?/:@&,/"))-7#)-9DWKTe,09$'.!%)&(+#$#(+',FTY*2-,%,%$$+01"%//4:D*,5 $*)2SclvNT]>?B7>CHMXy|W[g5:=630633FEO(***)# !#6:Dtsu239e|ttwRbn"'2ATP&*<3=>6>:8@>(-0! %(&'73KadI[f#0'!+/7.6>$*3=&:9'1--.4")&!%!!*%#%#"%#15=4?JOZjGZkVlwJ]f2APVhrQahSdgGIViroykwHVm~{;L]KYkN[c>MW-<=(-.4>&/3(0;$0/&+34:K\i[h}BHQ8<B.2=',0#!!3<B3DHY^l!&&!! "),7EN7<E4?G07<4==,00l{A=HONJadm@DOCLWZcmQbm6;=#((')& %" $# 086%(#kx||KP^_[pTZd=AG$"!/9=7L\Wly:FUAKT?JN'--).+)26K`e$45!!# #&#%,:)+-$&&"+67)-& 153'-+&,0RRnqUdpT\tkyhvgr~dp~tQ\oTirENbwyi>HX@I[UdvHR]K]d'08"!*8?JAHVGTfS]s?H]7:I!#0<?('<GO=GU*38"  !""$),!$%7:C9;?BCA=97SNH}qqjmJMWHILLXg19<4=:em}KPe3:D##" *09 $!)319HPxci}q}ACY00=0->=8BHNO028".3%"!$'8MZSi~;J\1=F%'12>;$')#()i(C8$""*)$++#$ '$#(-',5&/'3>"02#"022032"*'")%%%!,56;?PcfEUdbnozgz^kOVqjqelYexktOYngu]auNau +-/0=T[sYhzbs}7DO&)-#):CSVbwTd{")7"+,!!!-**15-26(/2HYa@MR"#)-'.7!#,""#B7.WSR[QNĔSTaK?FSHKN_e^wKUf;<IAJV'): #!#$$&( #*7>'.'HMK199eo]b~uv/3@;AA/280:821:&)/!(/&+*1@RlyOXwFYh28M!369&)(h)=:")79%&! !"'$!#*.!&-;8EK&12%-( %# ')(!$#'(*9;DNYb**2JP_kycqYcx@JY<JOCEWMR^?DP8<LflP[nHSodtANi+2K$0:ASY6CMDMas~ITa5AM->M#-6LWjcrd|G\jTfufxcojy]i{ELX=JO",,>EWV_q(-4!'+-4<"%#ФA:=ld[[gn]flxVgw.3>(-.(04$/7$,,!*'(*0:HS%+3%/,RWaS`k02B%'-+>#+,/:GIT+-- !#"#4JE'-3+18;GXAHkI\m4BZ! %!?K]&$",01A@ .)'%((!$+)$" $;BT+36$-&-10/13*34169%,)CIJ:>B-./kfpzKXi1:MRauAPRGLV:<;52/&&%KL]FQaUmz=Oc1@UJepzPbk1:>iu^ny}&1>8<Tep]kl{qJ[lYi~MSbLSb=EQ13C//?&*08;6.,,!=QU`hkw\j{ir1)%S^fIMa7?VIXXjtkMYZ987,.- %!&.+7B!$%,5;79J*-.,00!! !'-!'@DE'#$33RgwBMi&)4#7?P6EZ)8F8=V������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/img/test.xbm������������������������������������������������������������������������0000644�0001750�0001750�00000000170�11253753022�015154� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#define test_width 6 #define test_height 6 static unsigned char test_bits[] = { 0x1f, 0x07, 0x07, 0x09, 0x11, 0x20 } ; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/img/upside-down.bmp�����������������������������������������������������������������0000644�0001750�0001750�00000000116�12045265271�016427� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BMN�������6���(��������������� �� ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/img/itxt.png������������������������������������������������������������������������0000644�0001750�0001750�00000000141�13125503327�015162� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR����������:~U��� IDAT[c`����b@Oh���iTXtComment���en��🐪d����IENDB`�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/img/gps.jpg�������������������������������������������������������������������������0000644�0001750�0001750�00000020117�11253753022�014763� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(Exif��MM�*���� ������������������������������������������(��������������i�������%������"����030524_2221~01�KDDI-TS�A5301T����H������H���������0220����������������0100�������������������������2003:05:24 22:21:01�� �������������N���������������E���������������������������������������������������� ���������#������$��������d���������)��������d���N���������������������WGS-84�ASCII���HYBRID-FIX2003:05:24��C�     �C   ����������� �������� ����}�!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz���w�!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz���!�� ��?�)T}(ٓҿ:LpZwٟ.hcXH?Zq;cjʓUa :\z-RŻ{<rkۢ7^:V7/[}le4[ڭjWRZHN9qXպ0nW}=&7k:3.}iH&"s[5" q^uӚ"RGlcڽ.Xhb)Kt(-";ȤFָmtѧ);-Ct$0LAkHmu8w6UKKntQ,ϽJpU|E~52ʶ/E;iQVcPf?٨xϥ\Vh b#%(JB5tg8a]j:RK {} }+С,*EcFnw֮Q,@6It\?ú;ڂPss]BT9srGau#õ|_Z�N6v:W,a*d`L[z8k_.Զ~^ }OOA ;ai{ht@gDKAo{pٿyoFFnNEyթY&xht|y|枆Z~z!^o'd;-!ta[F+7҆^ьu]qcXOgkXBvM}޾os(Nõ]l,eIJ~f8|i}ŕY,׫Ϥb|/jzWsd=+mvf;c޾sk, )gf!p wjRRk[W!E}'W┉qmԻd+ӌcϭı # [V¾YE'fzcN `@^mb1-.rCfLߏh p g<&reNVF[|⟈kiwV#� mDEmw +~{@O|osxV`1߷=ֵ|OlwiNq奱c6nÚ,Ks.8ڦ9QvGf�> 'OUeyi LpNFYȽӀBNEzMU" qJ'R3 j>.c?*K.3՞V?wں ?Fi:/Ojo3$dO A&]z5^04Gx8jX>"NH1~q8Ԫ7e)iez.L�+o>;\WxG~{5v.7Z3> ISr{cj6bl=+ ()33'Wxnsӽ&|eK1;wZ^�Yyy1W]hM1O5z {8ZWqGQ Fڒҕ5N<V>C;ߵ7xNtn�_O7?b sό.~"kk;Ha#۸W� 5if #NuJV*`1JuW>M)-lY�%`Wʫ>[DSJB?aWzhX`ּKf_GfyzWeR2[�9~}57UJwʖq}o5 ҕySXEXTv8 ϛϚZpe*Kݦ{[w LMZxrP#<Wq_ *#RSb}rxh7(k7gMfxYv)יpzpu*C q&|Ct˩;j߆5(M6*e%8ڜkLW#kw`K�kpR9ۑb%>NX6gXtĉ[>oh�\zsשth{5oc줞O [/̫{/?^XFY#}]+ tZdw}e5: \*J>ipF+ϠP(47ViZk>mu8|CɫZpy7V3@۹GO~{ ӎQ΢xwSWEysBNs�_ m,K5k*t!9ux-ͤ[YTa֤^]1{p<$}xnREiWX5ǁQ6wh9Ffi-w<CtWz,^^t9yʏo{\ѯV<%AӢ`xeR;�,sw^pw:sWqңܤžƞSIj>q3]?!ӮdIg %wZG2f} qr'ܑCƜ;WޟՅ ixuK0:Wk I{R ޿|-*죫><ܱ`xTסEz`MK{zײuol4vuU>hFU;#];QZtglWg<Q$_gf0t/PʌZXm6+6G=m{V{C\ʸzW*m>:Ѧz?Y s񎇯]8Q9~*>f)^{ c&Sgk-Q$Vm9zVIxKֱtV[ nB;ߵN'K{u^>o&ܘ˫H&!xNXt;?WYw+Uޗa+w[綊qp)P�3b) mZUF5X;E+ۭ8^Os Dv]^J_-Z`2޶)]#KSY+td�^;#6ucGO|3z~ϥf>B.S+?{<*v)6NMzGMoȒ�uwq].MNJG? ?lЬ,,5 ׷xg> ^}M1"qױ)~Z3eh-Q> ^Yr�E,cԭš�gվKC�ѓgkGS|+m<\x ߝ�!15Q}knd�?J:tb}žoVUm%ZOڹ[)hʞ]7񏙫͢�}Nv]eI�ߚ歪3!E=}jm<mi H힀W'w?w6�[]CXFY|G]$E|1jyϭ{1mR~QT#tmέ5_uIGNgw=_�xF%\Oe+ɼ[+9U:gĬvm_Z|AV[nO)Ohk-4dbl躋/-_fxˌ�z#|W=h}N]w6z9\ſ=燬aW2Dh<vȒ׿5O&*Mߜ[=J\KMZD<ޭ\C ё+dvN^Os0tmd}}{T\ǧŀTVqS7TUkĞ(+xx1`0?PN|U6v"}5L6=}N-'?_m=:4t?ĭ�-n|? 4oIvLۋ/0&~_Mф�#0,=8?&[cX.EA%cٍ|/Œ�vfXZthw�92tsjQя|@5˘eQge�w|Ux [L.`9}!~a~s]Ow_i}2�<]?ϦG8CSs#Zm𶶒B~XОkzĻt w(_:CŝM4G?y?P^[r|!R m N3k1!;>E񷝵}/2BxJ+I♥}_+�+!K_2jΥNM󯴍,2OU+Ė:to>U^ҴcH6gW6)bcͰa=_Cꎶֿ87Ye_˦0I[#dfl85c,<lzxVHM=oƻDgt>Cv_1)_ln~GZ~wOj�`W 7Q-7W%Q#ҹ~3]OR.<s09g#+VV=^]Gž <il-/qܧ摎yO\6f5 r0W{za)j}^hXgi('oWr"LwVCF%yKMD.ͷ v?zf?\ey5۾Ѓ>c7Gz8zti޹Z3<IJy㏗>.m--(df#+1).c*GsXIpnDh�6\W%-ǎ|]Ai<}ծ 8 rk#ԭꤷG'| ?J+˙S|]ݿ uAFÜ}k%0'#-˜x5�hCΰ~_?h!k{GZ> nZ,r௨5|Y1elM{HG| inLk-5OM͗kF�bL|b� {x^ƅS"O7Ws�LtU ZxUFWW9vfX8sIA`c,xL4G"nǖ^7� vr^B 89޾_ N2QVN1wG+3Y9ҡٰިLv]U"EkB9,R^<Rj._yß#ӭSD4C~PG_S]\,-<oձO|c.mey*3)2 zW捡x[6ɹC`xX=: )byF Id``|C�knFp+ ssH1;΅ww5i7­kbB4ꨞLe y~z<[>@j^iSW#e!^;Ck,{bgm^w;.';'TZkQ{[ߜ?-�"C\߇<x`<nwsWή~{|Dpc)=x'Japcc+u7CWF=kGkdrb!S`S}TU)_hO�h}R~wyJBfiwĝWŤF{\�_]qnyͦb;zSؿ_[%q]� Csxno;ky>6>'k;vchSstϮUZ fIV[}=u~vgAt>?x5ku>dW0-,m /m+-m:kVkXcڿfo?xU;Z_"=V�>*|p֊~lTh|wؾ�$y j6D1Ý»^ŎPCo/[kA�e3\DI#/r<<K |S4%O;JFEi[xZnQKZmVʤtaɱ@{[9}fIOXu?maUku�*2^"gJ^&^1c`,]㻹ўzVU|ǫ: IǛ >4[V5wh$|_~XB5ozDž o*>wKvP+0=N*׮T_%ؘvV58+;e c\sS> ⯨ O"woqR+n�ZEsC/|6OW7~!p<1L<ndU9einv6_(|+rԖ'IՍ<mڶ>]{n~;qrԡ ' #p<Q[@ńyקv(�>gmZk;UͶ4};N# =%uML]/2*^zUWZ< H=ENSl4e� _3ZuxY򯦬5kxQfqRI3MI'5;;Vl%!O|0Ԓ�jZ$?G]&cFl3V&jeQ5**Rb8{XxC$ W {Mkxt7C3s m< AD+ΈJ:V('IژW=tR=&zzUX{Wq Wx�{z0ӒǫK=o4]ަe~ {e%lRC6~^ZgJ=xmB:t &r椴rR{QQ=>VYfm+ҵ7^o.f)%-N:ܹpn.|"| 8{\ڱeҰ8[q@7J1[ON=OqHp.×>kĖ'Gz¥5QZF*OC +@Vr^\(p+玘Ӽ۾�)t5mm9%u1\t~Qp\T>w. lV4I- n�HdOS]a'5$qb%d�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/img/test.ico������������������������������������������������������������������������0000644�0001750�0001750�00000006126�11302305677�015153� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������&�������h����(������0���������@���������������������v�x�f���W�V�s�܁+��~�i�B���|�߄2�"��b�X�eV�r�w�8�T�R����j��x�{�ރ/�x�x�[70�I�~�~�$�d�c��V�U� ���`�m�6�z�فq�k�pa�@����!�\R��݂,�w��F�j��i�R�Q��[�3�_�x�ـ"�h��w�{��{JB�W�s�x�H�~� �c�]S�T�܁)�C����y�|��Y�VL�߄i�w�w�d�k^���XN�q�F�E���}�|�X�Q�P�ۀ&���{����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������III��������� ����������dIS�������C���������\)%qQ*�����2fBP���������* WuFI��01mB�����������T ikI�o:vB<������������Z9zMOIhB.B=�������������?nNcpVBLBl��������������I-BHB,/B!���������������IByBk]BI��������������&Bw4B+BIa����������@7YgDB}RBYYA{����������IC;#K>B55rI����������I"'[eGW;sb����������I8M^| Exj��������������I3I�Ex$`���������������IBXIb6Ja����������������I_BUIt������������������Ij'[I�������������������P %(I�������������������IIIII�����������������������������������������������������������������������������������������������������(������ ��������������������������������{�݁,�܁+�D($�`�K.(�l��x�L��|\�X�݂-�z �z �݃Y�QH�{a�2�܁0�u�݁.�@&"�e��`��N.*�S2,���|�Z�v�?%"� �րa�z�U�݂,�܂+�r�}c�a�}�`��݃0�H�h�{�{�T�s�nb�b�n�m�B���z�y���?�|�Z�X�݂.�d�8��[�k���{��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������1@ ����� 1�����=& ���.?������76)9C������� '5FEL+%��������<$E���������!A$E0*K��������3-PD81������,2J/ 1������ "NO#HO���������:1;GB���������1I(M>�����������1#6#1������������141�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/img/test.png������������������������������������������������������������������������0000644�0001750�0001750�00000014140�11253753022�015154� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR������q���nG���$PLTE֍uxVYa/03a>/@FM]KI}��� pHYs�� �� ~���tIME w��IDAThޝzs֖5Ɨ@y#�d �P$0b[bUjR/Vemz7vy %69R`L‡;90JJX1pU;P>Ǡ)kX4 CHi'I<?EE@)s=DWġ"{O~,IN줩K(yi<sq߃@%qznlӸȆv8V/Q=i!^I։}EHDI{&%< ȥqˉ;'_/ѸA&rH"3G5@տ]@ YD)`p&6=:?Eoj;^ (ةbZn&"I550 ^_ay)D8aID%`Kf>1?ĠeKsFS;/O'=AR!b-m$? N&'V˲LӺ4MU-Vf gb,t�:֊e9Y@i\UUG bysn#0-e9Vٺ4/�*zmn] qP e: jiV4/U|5ga@H@޸Yt:T<j)j�\PP`inj9C"H gq#o󛹪�4zL 7vӿ;[uI)WA4.r,15k7ss@E&pHE p@-hBCv`7!6e¼ЌTֵ0 Բ^FX~!i"z}*nbtzZ.V/b>kZBGf ArBiyf-fSeeCmvnn7K{zyy1ksdXe,?c9 ZPN?F:S/s6Mc|c`8ԟO|'Bg.lPOsӸjje|R7M5PKp~8?>UΪ LP~Tݣ{tn~Og3\\h(fjV|~Ox%OS&t_|&$SRL}."Oj"p f ٚfAW}]=l>X V&pM&pE۶zEeA~4G<*! &ùۊjO'ty!O^?)J�/XG!L~<9 x|_?V7M," my`<L_I>wgɩYƮfnlaZاۋ8He~'iUpuXr)?dBtkh0{z+ dcor0W {&3uE״;/V}{Hw)pnwXn\= d2RK9sO�;y29ƧO?^ﻯ7 /KYv  >y/NNS~dž&_^|~0bqQy""B<ϝ>O>6|ޟ^`߼b{rC :&z'nWOVkc9z,.eON]Y`-{9=ߐ>"d|_> d6rkN@hc-g+#e{<t. E+K'ВZ*ܬő/dEbV=nc-}N{kU):r?ZqUյ(7na&ˊ/75^ pr ARձͳC�}];c3o᫧jNgO?)8cg�"- 7#z֒ƪ~]t>`@QnumՔJqh ![?7(#wXW.ڿ̏f~c2 BG~L֋yXQ#m;q %"@cW=?4Gml m]f+k<X#xlek G2_WGU,oHf$Sf6*UAKbrc~ oU)$e,(aKUd/?'|'wأU,[M.vdy\V {(v(x$q80oAEW4vij H%ꙊƱ\@x6^Y ]_ /PCҭ-y(b`1/wJp{k~rd qI#هv+9w蝼�VwڣMUPƠBz7(Pjg)[o}�Ue;i-,"@ 1B;Bue9bZ$6֭ߡTY AJ3�k=_/l C[p3Px\߂L9foO?w_ q !?wP" !/&aßosuh\Ŵ{ec{ؿaeg ~wOT票1UD[}ᑷ%C-;a b򅱱DҶ\~Ky ɳPCI/[ 9 8-Vk `[Fjj`wly3,gbRx; ;{B0š^f5< 5nںt=Fo)}m~ [0ښjBe@إE2E1QUdEMFl+Dp%Ҧ,k:Ch)*lV K8x#%/~۰B�&TfR}i| ܶN?#Cg3uLwP1_$Jm>svBFh-K08rgg}xoV{̟k' ޙ`{ㄐy%h\_}6:KߵGB"':vki4@m; +6jNّ4"TGhUAmf̃ r;$w77*EW 6Tɂ_:�% ?`o٩+ &:^yl\Oa_8P*+h]MEl09loك[<uwu̖^r ^3+0V?H6]bWCA:DzNgĹ,k\EVXNCPa(vYDΧkS${ʴmEP)b,6 ʳ=ERlĽpj҉`r\X&]R$[oo"W7Tjy=ZޏN?k򁛀ûA4NŷMKgr+u*FkK@kQ$mw&8-'ģR#~ ){B_Q<~ 4-*ZkBD;CƑG~Qny* ]q +xN#ՍAuYcf+T5mb̵z8(%9^P!ق;C( H-t{{NBEA f0CοqߪJP⢾=[v(Zbd>ݜyndu# Gކ8|:ܿñr[?˹{b&n6ND9\ڻ0a=lFK;39]&|By7qG[o3C}+[rL3[rײ7ᖜq 7o㽽gqo͟Uvk(P@QQoeߔöYҩtab2d'E1\K2·ktH}V2F>]ͫ?ͦBX9I{nOaG0  m"mN}02{6Cpj(59~Pj|l\cg`@ FiK}\P_JO\,Rl>Y5:;'Ξ+y݆ &.3V$$ZEKR2U0/ɠw4?ggܺ@"U9]@>7€-lgOQ+Q<2RZ$ov=8s{OK˥z!LZ&nX·WC t 12U )o-==$% yj-8#`x5ja)r*$IHk"XjRq,Fi¸&)z$YnrXn3zǍC -AB7>q{mmG:MBq\-Tj'^.! 꺇kF HIfDm-6:bP_!-Ϛz<_5JGg* jR9D Ty-SGNb5ϤZ[)k'rE;}6je:b@+JDf4#jI 2emyoZ GfQ~˲>jT((9@杤$}$ql':kI?ߧ(x٣tٗ^ӋϪ5: P'Q4"A=*P\t?|Q;Q\Ay=JFAu Rqo5Y$J3n@aLo{ .KDי$Fxu$+1~7 X{,@r ĉ*hzI-pCN$QK\WwgQe`aWfzFAl ErImh$,KTw~D$*4$7Eg:9 Gip<*%A=HvFam讇,7 2K&MThVG3 w oQ~O.YF4>I%ԒM$n 5^~LK:j<KiOL+궺T]>/9I"1#0T0-! Z3jS'Zl !Ħגi ϢW)&jÅկ't։T-45=F2 HX2Cgjê'"$uHC$DM :5f+;M4\4rFDI+x5Q/e=bԈb@F^~>]n'ZzZ2'r Ռ鶬~sD{އQwbZo@Avb$ o%܅ }[i~73ȉ]4$=DT52g5홥|<*F54K^4E.5P~&%QBd&LgBЀBB4nuPJ(jZh0_&EU$X%l@SSR.E7*05SE90Pܷa4ӏ@LTbRji,�eԛƬߣYfDTGBb $Uh/'?tc \\kTr~$B""[hS$La G\NԢ%3Ioo@[j&;F^&NlpooHQOr Rㆣ-V`g⏔?"bh�8 T8Z[b&'.PFZf&Dʭg#DKFIwa-~eZ4⏢Y4s[<zQ,D0n5/!lLIބI4 srxR7©.EfC XmEjM{~&qԍ%S`ZNy.xKbxq@N"D�>|h_����IENDB`��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/img/test-exif.webp������������������������������������������������������������������0000644�0001750�0001750�00000064740�13551664101�016273� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������RIFFi��WEBPVP8X ������?���VP8 D��0�*@�>i,G"!? A�1uYok-<o fUρOチQ~|?:5 N->o~zKC??rw__}9[�V4)t GV j wd[3~GKS2*d"ځV\89B=a2%;n[HF+-U_$+  f9c51&m|?~^Yx Zkd5 PrƯAZVؾPA Hgd̦̬u@MycYF>VOD6Jt%@f%'l&?[+)A`*Ѹݸoք-~_!  r&(vc ۺ tDeκRZc \aE+\p&w;mW(oULit7zφb]iMTf–CyF<ܷpY/~.&/I8d PHxK�k>s>x1!fL-"n NW1dPjnU68v}0Mp H|{f$^'ueofܫ q�DtQDPޒ*v{@XSU,b3)W榅 Wm+UVW!6^,=q$]MTO4v'=t,y6|y`P,vP@r<X ݋#RizE̼~LL|Bo{T Ӓ -fTŧB5[Wq1:I5MvIfC؁R"_s�2K4*JEg߃CM ʅ ?B$#ɰqڔ *mdG|VpzXǜ "}V)ir:m 3jmZ2373r[{άwݏ_AkjP4e <5Pϴ$2 noUW3 k5k�54Ꚍk݆#eI)`BR%S_QܙutTj~߸ ^{@nbU&Gb%ݹIY˹ozm- k FL DWNynf-;ΟH}:v0ȱ4u‒1]9-^dFQ Lj:9G땖&uK ڝTw>cvZou_/$nûHd)F `/!{{+fn|}VsoSCm6Jf~o}x3ZqJ�c0G0< qrٖC'ʑ&7AV '~í7Ib?{8*<9k�AZH(N&F2_ ]Om=Hr К0Ufݙ$i>xk9~E]:E1X�;S`<Lws ڶ)L ]~ &`q;@t(c˾D{ \V-.ZSq;E(t 9$fM'dȨ w4kW[ZgJ#I~"N&Xf8 ⏵5F%J7̧$P(Yl<4Gzgmt e23 j=| aVrkP7 1wY5euw6gjcs{(+?Xx.6C&Ǘ{[$QߎV)4Lsm#߸W2k=edYݘx=FnYԭ͙hzN&SNj-vB$\/cTِJ*xh٩M9%kؚĮ_`BWF;s.h8_ov蒫3)gE8.DUg$q34J9Y륶%5D,z4+_29`OrIc1Z ]|yp,6GZ\nfxƁA\wss~_XUeVwissvSj㜳p3B0 Xyh)j 9\%՜7-EC_]QM?'.6å>@ӊ:2R$k:| FЄ 2&!"5rGKX?Im^0=9SI{i <*;f& O=ù1Tv36.leٺf`bsƴq1R|dF z* y{76* .Ӝb�VU٥Y 6x ky: Y?KϤe?RG!Rruuo�"g݉N$ ۳yj{9͈$o�#QLfs-[$$Fa^uf_J1Pl6c␨/s".z@ C?i_93Clg{nr1V?UXGPi< mvJrosdk m<IM5Qv>}Pb6d\(N`[c|}%.c$AHEd}A()S'hhri)2guٓfB3i2nMxy1Ԯi�=xh5ʇUA"m2ђ@oxb88B=z$x>fe/EY_ίL[Qʂl ߐ.*%ː %:ts-ʈ18 8?h̋kl34ܹfrm93:+uP=d[. �אGOf:`>䱾O';JytX4\7\ՆN.pK{ [P!n%Z,߀Okznc1L%rHݟ9sA6Qa_K */[F'wF?ȠuJjGF%fք!0穾qQ"3.(4`ĝ.QlyQaܜ.;C86]\_<} (/K=wlQc;f享#f }3 qi Z�sR[{WunH]G* -i�+>9J4I�TX/> TL8Csq"Tvp?"O0ȅ/hUvk Eb/4Lw_c*!  X OzcFCFU/\&S㯨K^K| ¶ŭI¢3W[ָb52ड़mn;c7a�6{"P-:ϸ?Q{}Zt5`9]o1~A?i8>&%UM矓Cشm=Jo*pW:Q"x}!!76n,#ݦ_L9&5 ~F`(b>wQ^4t2zۅoxKCўb�`'{ z%¾y)hi .w"kJVYkT^_/:k^[ 7l'ߐk�a),nkVFnb."\_$/>^/ J#.rT͵ ѱ.cK$s�_QQh;qc6o Yc+q^y=xt|eI F[NܷԦ7ԠT݁ 68iKmOU-Mi%wO?d‰n& :q݅"'." %;}?@«D`{KFD3罨nUz9.whO2ULi#엇ǖDiɏ69�vr \f~<!5da޾/Wъ6G;$ MG=}M:v_{*Zm(1i]ï}5J'F@"%5FG׉LaNR)V"m2wcopLXJ*jX AC,,fߧc3 =ڨvG/PZPoq!(<C \Kn~f̰&4֍4ZĤGU{g0ue0ax|)ӏx͸$|fxdI@�9<,KF-D?lbp�و}>wkn/0o'(׷s@a`߰/=uM 0ިCYh^(\Ѷ [x@C.}rYˤ2(5{6SG�vI:=*~fr SE#u,!H >lP1ZK,h GGU,PYA Rbݎa(8:~K�W.fo9Shݒ F޹K Dpd07pEN3.8 }w ~aGf@x~@҆_/?liKD \ uD%gE+Gh i=YUiŸZQ"ƽCi|RdI? +)z qXsʖV>{+( 2^?l7M9/ji)+0]{z #@mcN'$ɤxz n8S_&Y/}^UtvBp?t.^铏9m><=hLj #f3wx3CqWoxϪWIxD&7VI^ʼ6ݖ _)>sö-M $z{I! pZF+qZHQA[a&sg!UY+1=Ӈξ=!cw6%H-EJ/�SxY_xJ m犂@`9^ y櫴n2A"onD.SZ.n>zQƳ?Iv|,6dvyfs&LtͪTU~7K,+u!]=+W y>UJ3vi:V=7dGKGcȹjq}X'xy=B4 @kiIA54WZKo筜kh42{oxC9O׻m2){K}mAhhD^3hV腣n7|x.>s6\eb _P<Pk0ʔHV/X*OcM<]^]sh}~w_XT6hPD}~i¼x=(Ne|FǏ<maJIBEՎ/L uRfLtP U~$R�6t<@U3Q8sn`~8WWa&Xb%5ҳ.jC6@WR `mG2L60ѨTާv}F.*Mx &l"SzGZcBݰwmK\XegQmiHzn^t 71?6iua�F{ۋG*snALzfa|^ ᒚL\tl-:+&:iofILZ͊BقjuJD8n?p4` VS^I�8{=O"2.dOvtwRIi]TJ0r?*ٸC65.OaGPCn̨c 8mdkڃ-#l9^%IjE)]ݮZ^ ohk85եW^%SO ]),[!vdkx&d-2„U0*c�T-$ANBA3n W;�[{)�Y"Q J%Na͹SŅ^C` *@ѷ-4x8ۺo?(]d< $*z3.f7U;NJ}l/xc }♷LI޼F :0 CTh2:^vC$yekwthTMx0OF0e  #hm%ZqԦtacϛ(0/)K]cW \P V+VSn:#GzRkɍk(rEwk,\p jMSUfM wjY˺H!:!EV[?? DwG_kλK'|:&l<H$ FBv\&O*=1$#bGOx:`_)o7Q<khw>uvyny+FckŮW(d"ubL8rAOKޜh29'Rk,5}Ɠ|H K7BgxFkUZ>`\](?=LtpSQw$OLp+ko9sjI ̸ !{瞺TLc4P,yK{�~Jv-Ƿc,^Yh%A}<љl?E*˨v`熯SIlݟS+**r4'r@t]kˎZm-mhJZ]~]RD,(鉶-Q#͝BuWuy ' )m/A/L2~F+$@٨4aO7=[EvH.]VJқҔDX޽k@= TdC*v,[RUyu1 p-JPD w#5w"k΅96:ArW:4I7;nəᠭx |4D Od)P'~p?rԊѺx8)}o}5$y겺/be[*.JFNTJZ}1)Ƒ*Fvf:TT&.Qp}+J~núiiٽa`'NFN}6}\ J{3gAA\d):s |Wc- H3Š/tlI%ȫMv"KcAk,?O[] ƬhA,T~dcr|qWKX:co,lN~>h*sT -]0~rnct�g 5zh/k^c6T)͎ϱlÅ/*JDcꮦ\m@:#I^fTbi5.'U %y>#QPJMgys#,(-�oyS eԜYaDqriˠjA</nh˓Vfٛzʏ VXz E� ҏ3.CS C܃WSŨ.HNN'M(tZm63TU0.1e.B:D˞d~?mz^TDa= 6@ԲFne_qIΖ@BDYUb,�װTL5NdW+}ݯ:YO||+nXt5`|H<fPKmH8]40. w"zCzGrc1foq 1ptH lRC$eu"hU`v,L4a^[m| ^| FЕЅz QO VoS!̼0:F$I�UfgxGI~R}ϫġкan"tj 5\<>3:ބ&[]_ V 9 6uzPd3Ⲓw'"RHIaxP- bOG�Nٶ`BLƁ�)z-) bR9͟KƊjPڣczav n7~5A>JgE0ةK`MϝjYOڪxi@N*WΟ2Gsۓ>8߾z|~\8tE{#GCހ ٳY8!(0(Z ^6=u;χ#rt=8/|i@{{Ga)L_;i[p(pКyr 偩rNnmOC3uIYJ[VT2<}�ܩIg<]w!sP6?3Hmlƛ FʚӪ^} ٤ |\W>z+u5OD od1@7$ ^#U� OpodNB3ZдP֮yȄ%.H&A8ܜHJY6 ѻx9>;Y q$icF@V$|BN dGlo[0L*1嗣3`|tRk ȳ+_d<gǏ+|uh2-Wâͨͯ~f9o( _ yvjv:NđiZ!zJΩvc, G/(m; IRoR˦yT'g# Wj2,2^wPA�F%'l6h�XurKo=wtRziۙp"iu`~|q{=ThVcU4"&2@Ҿ~'W@@#pS߳[f;,$L�)VAo3HMpŔy-֦$utVlnx]:>,Ffםex5R�a^rU3%)9}�]4,ybHFS; 1schmbqҡ(nisxJ,Ճ\rƹ:Þς^NܫBڗA P$, M/K#@=M{A ƺ?Ӥ|U |n9mš+yܜ%Zsxz1/ڱApu뭑07kC yQ)>腖CC#S-‹Na_-ÞpP4?tz:/=6rzbgaʠ1g6,UV% jO Z#8ҩ1jOC)CN&Mjh< Fa! ȼڰO? HZX;K˭7 t p R%m `X@ɧ�_b zL<&:T69CIv̧ 792H}@oX}TO:F`s>{רٻ{\=YY Q"/bMldbFyrS<bP{54TfSP1sa X; Ѽfq;XKCO.-` 7nƃK M!Y\(m<_o^˭C{ݘ40tVH͋PYFAJ@B2%?jUℳ],pB-h |1WRH-PIY9i/`6¦xO],YIZx#EB}?|͂?hq(C%79:ʑ ITEdΙ@m$3f&YV}hUVV^oͲtuJ9NsFfbV.+}?01sVxH`hLEվWiQ7~/ !-쾈YiKx3T'#j/[hen9T%nRB@ʮ aa?mkܷq azHl�7PިcIClNڧxeA9ρbvęrx:#~'7\Pgy>WnE_E85%IsA)an DHVC ~0>ƻK_TՊ|l}N7g[͇~4Ь"d<I5սzP&NzV>0Z*]AZHgZ3t&N"v)yR$j;JU7<d]:ܱhf`_ȕJ<-?">v^ɞD-֌Fxf^ٲ\|0B&Z\LrOSuE4qE8";F1dIuaKۣ 葄u(/q9H$6e%4/r;Yj_5ղ*!sKF$)-n%;k3+/@;.lQ (2.:j}6yWdXw_H"5@$"tvhi),79oNQ/y@tubGVߕU(Q*E8vN&h ?x&eqx_ l}D"r}|0h.寘Uމ͟ĶRGf0gc0rr,.cs8%pt +bc ĕVmm;uT {$X)h˓lQP^NX5?=Eyws,7k""f:3f/'aICtb' [IgYP h`ZMmfE:e6Qhi#Vgk[N6<4\kPg#Q\9�c;\[<B׳ T"ê,,~!bK7=lF?Kzs@%|coʿpE:6@<;TEGPG"hOoIxu"</,a=#nNNs,&#hc}B Hw `d"| (Օ#ĝ.j-!!>gFLi) w*E0= [xSj2"jɘkY9 ȝbBQgҒ ㆀ8$?vMc}wD>=fsl޴W;c.nwKdײ ":Hɯ_㡵UrȈڎ#bQ~~vƿЦ t aN44NzNBS~%6䵵Q޹ZO#rM6<_Lz o:v~�ќ4bڹD7eRxA~R6htFhץ|=9Ç|@Fch.VhyP@MpSߖL C;n;*jJ{ qC~At<ϩl^#O=36k1w73jZ?ܫw7p/ CdX\֡pݮR$o`N&8 <`LimDE"Kc2&B5 9ͩ7pkJ"iXޑ*xvg V9tg' -˰f<C.(d񳩨BwnGGRq>HyhƉQ~LlVoSI*T?ouǃ8rd:ɻp^,y0j-l1OĮÏZb@ Ԑ&5XfhgXxzx Ir܎l�q"4*]sj5n6׶V^ gᱽ=Jֹ Wj1 +_6—~6D*Km!HmX{I'SGc/~&#7lQ|zڧ.fq2X z*#& fuxbBFI`�'n@M"66`Aq$m,cq̭I$c?EIہ Q!+{/ϭ 'h[3EIwPO/%WZ4U>ar2L_ Ș迶G~Q;zJTtnU?Q9 MDF|b+&LA*|x7QWG 廟] Vc_1~듕`cXUY,YN?a?rY;`d||y:g>jtsp)`ϬŴ%bL$MB5_XZ3" [sRhE%w'B8bz Emf Q+ԄR%C oGl9zq?p+nb),>tr�61jf;e "D>G<TL 7cnvTJs!` H gr[{J7Q3}6 TىšSoWe0B-<ywI!C !c.\DiM?V<J6ò{Oa:myyσ'j`f7[~ɻ ~6Z�F/P#V �|J +ˇ"O{X`<i ^XȞo:*uyTUɏZ;CdQ&050 G-( ?3r#2GAxa,�F.0 ( W`(F~ĽE""c23՞ \5.U։H|r.̀fRg-FD9%b81VuXU(7 gA^8 \GR*8RAd/+[/ܾ_Ba㶂0%B/:K,Ic-nk$%Szچb*z8ékzJ!̸XXp8OG$䷇[zzV)c3yXy;{>7#e0rh3v~<V2Ӯ}_[QkV5}GYl+Eϩd'U!_h<5N =ywWVLnjVE f?;m} l"Df.爟1ň[I!�yUM0ׇX ɬjr収s_p,a* *.Y +>YYCkwOO}d~Q@}~v *raI’\`m7,eѯ{Уn\) XQ!3ݡA41`~JNT+{LE.Du]}NI Ŋ0tu}=doJ3TF'O(<a+Wmۤ.B3cG*Sy#=Mu;+ʎ lX[+fs<>G#7**ӏԣfǰw5WC핬ef"GX\upj1$2Վko77)`]36m:Q]n:gka#JCJlo|%t8 C_oh3->D0?Ԭb #A70P7`1wY[t%T*w*7Jbw2wEh]8dx1} ';m(qC-YX�\D{HPLl,գm<c.|4zȮM2upIE9bm.BdYpSv@ 33<CijB=E! N mV$ [t)Edgb L^|çЏ�,c*�aH~Q"@Ž;9aCF@!?͵,\+}^Ryg 9n{ry(vwy!ÐyGd`2pichI߱爍#fR&�$V  J8fzi&T4_?ʢcy\(dj6=={L`݂xQr` JS3!b'"K8y�o[D BQhz1) [^E 'j#pGZ-hOެ_ar_?ㅧuYahO> 6#2܂Qa(@+7%oQr љK@b$4ȜW1Jz@*He#}0ʽq3B^>Ts`(O<Y#ǠߗPp %bܫņz[BpxtdKtoYfV`Q<p&Zu7Ue FL+{tghwꍞxae["̜-u_tH<0,3iWP^;>9V |�^| {ʑUgn%L}ܵ:`V 8fb ][I\fQK{观?.8JsSTl5W3n+$_r,YcxM)esh@[ƖƏ}*u9:Kj(J`*1Ӡ61|[TMBv/Gs]zKEJE2Q6}Jɣe"Ʀ<a^0ir`1G:~rKGO!h'@(=>5^n/г2fKP=1 y,;X<gxx +_O\BI˲֙5T]S2v!XKuoυ(x&çE30 %xٸXA aBiUyY?YB -FFt]=ufB B%$XiNźo\oa@)-ɒ8>?6 5|sZTqgN}is}`F A1\\YgZ6F`|يN0 Wb%FSߕ"#nrЀ80z}<F2T?WhT>D6F5l3!]?f#NGu d >nIz5+9}&mbF`YF'vlKQ HQՏhb~TxsR*;J/eb|g@Vꈖ6�Ⱥ| Y�'O :;MLݞ9m%Kvk;oW޵VcBPGHz8Q\=�L" RtGQw 6uCHo1M>c2tcx9Wa{y'&HP'yY]eBRvMr"W糷Ds)eIWF5pXQH mW.,T=U[hFuN^ k[W,כo33Š٭VM0[Cg'=]c/vXL80~m %H @DS>~=wb Eɥmyw9�oEJ:|qSQ dzA]Zf|;3u֐Oپ=ډEA7\ ?f7Xe_GÀ qQ}C3.? n'L@f\%wT&0 ))P50/JX4더/YӳgRf*2 }#h٤b Y,�-aug–`qq/"T뷥=VU\AckqV5x z9)~>EHR:\:4CِT~޹xm"Jtg9HBO̫Tn!nmhZq\WwHCU܏ٖkn  Rd}'4^ ټvoeĎĊݠ_p0ݎ \fn;y܏tt=>gn+hԲq2G~k? f[l5t}7b&-_y(mɉ@`&EjTsb3a@  !DNEUӫ4gGI0@I3fkxntUv<gXl%ì0RAZ28+mܘG@dVcO)XG^++IY3b~:U]䧀;e18a)NJWڣmO1Z/TA뷮,V:l�o,/=a][zv_|7-C ǾmI}`ә:naaB@NMD2U~-U˾2˿rY?9y^ʖBFǍ:t|o~}E83cl tNŏ6ЕZHE:G49ȪJyctɖ;Wn F312ea9]/ UߗȓA d-`xd`[qB5ɼt۝\`n8F'WpT_kDSxW<>2X􊖓�9ݑ=63Yr9XdшiLzrBeE#̓g xz 9 ͢veEu)|瓷pWŠ p Cc1E@xKur:tgNf0fHD*o4AZ(e/b� ,B 1 DžM}|cgyW2b8Kg G8&[F@71%fʕ*j{nȁ#qWj(5rx'm;NXyՁb@Hu4 5B׶ ]L Æs6u, :ܚ9BԸZEZhjAvd"r.` 94gaa`vZ@Bۅ�-?OAst v`zLӆ+T`g nDq/v+]b_M,zfެɣWkgut[mRF1:*Wy�e)BSb.<gi$ڠ46 mIr6!£ɉ��EXIF%��II*���� �� �����������������������������������������(�������1� ������2��������������i���������OLYMPUS DIGITAL CAMERA �OLYMPUS OPTICAL CO.,LTD�C2000Z��H������H������v951p-80��1999:12:06 16:38:40������&������.��"�������'����d��������0210����6������J�����������^�� ����f������n����������������� ������� ����v��|���~���}����������0100�������������������������������������������� ���,����� ���1999:12:06 16:38:40�1999:12:06 16:38:40����������� ������ ���F��� ���OLYMP��� ������ ����������������������������������� ������(������4���4���9�� � ���m�������������������������d��� ��d���)|^GSR951[pictureInfo] Resolution=1 [Camera Info] Type=SR951�OLYMPUS DIGITAL CAMERA�������������������������y�����y���r��y;�m���D��Z �������������ua���� �������������������� )� _da�BOS2 P���ASCII��� �������R98������0100������������������������(������������������ ������H������H�������JFIF�������C�    $.' ",#(7),01444'9=82<.342�C  2!!22222222222222222222222222222222222222222222222222���"������������ ����}�!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz�������� ���w�!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz� ��?�;RKqxF O?h#^iMV 2|4vGR/z!Ԥk&`7c N3ϵxNfG<=2M jz|^hF'ZYk+o#s+zox-\^c+=sR}! kp XP;gG3_aQFkh5tAAr?%/lw52V$P*7#GL)ޫ,f8"1Z$Nϰ>/n<sWE#ffr*? ҵhJlé>WO;Er{=_v= K.nCjYv,\w_)F$+8aj.ˈ}OJ{+˩iF^e9c;Mђi|ڷ]A[v8GҖXƑO$\lcm#nq䴶9ɍC<L;K,&(ng=C>^!J3Z&TOx{LW/szh8�}k2Y!/6e{-R0z" W]9z6�lhO9BQcqО&.;!$OX0ўy6@mݼl�,s" `2g ]$ ;TeUǚ 8؞"6d8 VaX\H'''A^LB@w!SJOcIwoƠeO+c˄cW=A犙cwU;OJC+Ioc-éłʾdg ִQ [x =jJ A+6XS'84T@Pht3,,$l!=^M1bmWFsPyk@dcz>kYs+9+oen7z$`Ib)2ȅ[UK/̏Eôp Eo-ı] yr{ɮ5eK۶ WLa(RܣSFj5EO[vȖ<bb`,qMufVIlICޤDvט䀗yqZEƬm#9Ӟ|%5`giSF\#FĹ<,K(@A =Z nB>Ȼrj=b+.NVvu2TLK;jblq)<~Ml\4p^6o fG>UKOEG#o({U5rl Xsɮg1ǧM<,s~s8kfDmEk/5-np2x³ U<6*pԥy(RFH횆8]mRMh*'۽tVcЫ�$~?z)C}Y$ri@}?ZK=6,P{7ِ�ĚhfٕwoPs ϿYYbcn~98�_;Q̌=8~~Ub$r�צ-|`ۻ!" 3C;<q2g$1XKH*s#3c#q5~e^9.7p˩c8�"^F#cr}ZC4P}qQM=IeXսi&${E{W~LA/c4¹ɵ.cfڊ솆ԁ:(s31�Mji7OBU߽ ryTL顴|Q lr-9UB"s^}kQfϠSUmqL&X$}חJ[¶DDF:iF ĆDƒJޞ�1v=i9X4]48X̤ >n5g 4A �D̎b.ҥ7UFo";MFJ$�[_Jֺ}Uڇ@}j;Mky$}r>xmym7<^{Ja#Ic,6]!}ɦD+fmFN@;CMs /!ZT۝ S9nKy�[Z]jYœkZɵDƹO)Yس$8CHy CLC 1~<UyV�~8 D*0Y0OPI4x~1i UNcmsِ6Jbzi5&xJ=Gi$*ܓIH쬮̲ ݾe B?z|]i~^qmהgzUi d`sOS;Ke:Oo QO֝#<,A{rqai-ͰAUܦ$�5In.>I =qIi}-H;cjmw;!_>'H̠(8{/"b̳Cz}MqײŕW!$�A+ӭ,2S1=OХht,#9tWxtkSB<G_I2^$ej7JF ͺ7 ڒL^V"ˁ/.[mD=ͺ@߭yVORJtGV nD�'j({$r 8q hKyi<ik J1i#R brĂ5̏{k%䅤$ױ5|_6*V+H>w'ҽwKimHU@@=EuQ?W{_H5 G@>B)s[^�M2gNxuח]saQ,+oRĖRC:�YNׄ{e=֋y#b7=<TZҸͯk*r; {YR pv> ዳ\p3.|ii4 I6u<Ly 7U2ČFpzEs g{tX` BF#+Ht�WsM9Pb--`ڔI�5V5V^0=1Rكhr-?k[^|,rG_W9 ڻY+ϖ;%B7u䕉@7s+g!�-bh:{[XĄlTPBz[b00{lQ]Jzct:}jF[ ߜTأEU E#8SE>Eb4z*V4"Z)P$2;uǥ_m&.6^o$Sx&3V=ӥt7,@0N@t3ОYũAm] Ҧx8}A7X�ǘ]v=~#,v- 뮋m&/Dң]=?�GZꭼO[,KyXLDkשx{CMB%ikM3QT�8h'&[.6;֐PJD`xi<29=N=>Ѧ/@OxKOm8r$$T]Xm{佦ʱ'v#^k;ybHLgd *)g=1T<:gIv*1ےRx.Ծ)iy 29zLG�ᐯ'(]+ 4Woe=fw9X�~k Qwu$D'#�vM,4ř<sLe"Q|mN mۀ`z*Ň#g  8n:Z\ۉf%ia#<=׶*1Ay?8=&I/`? !p{H1 {TR=Ʌ$$ʺp*4N8J+2Hq"n sEeq!z*E^' .c-H<R F({3�KWe%W<wH&F8 O^9JN>ay= `$m횥>asy괐!e+_BQdA6o y9`8RLNOzjQ[](F<NopN# ΄]�BwVXJ0L#[Vɑ6AW==jUhH*}ӱ8#|K0:փV3_PYhzsV1qMtݱ͍9?+cϡJvرN4LyePxׄ5 y|Ku$vnCԟfM.(O0?:5"CmsJrjG՚2w=Z6ڡkl)*ISyZ|Mq3E�ff**8�?J|O,V{z_I ԰ECdeu(rqi]Wy;O^)zlNd_%FwzZ� :̭WC rߵ]c~0*Í=ndmr`.=k6]F+#9kļmA矯nli6 6y ׎׀+4p#{cઞ}sӬg| ︜)??UhK=OgO-L@Tkf[ܓ?+'Oԧ])Ps�Y\] (-Yj9ۜ=R"N ʼ37DS=^+,C̐eU6 :�baϷҚuK9EQOΫh}‘ 'dW%6�},3  3$ tEr^(<ٟh\`u89-;Sh0܏('vnE YAᛨ)$/Ҵyjv2;^\.heN �מ+ǩ)gBgjEk#,9VaK+,c^6(KlIF>^�'vw6F1(8I=g*ycVvV:Cܘw߆$<zQyyl:JDřKs(ǵdIn%ԭ$NHckE6P�jF9$бubQ%6 s n'w7Xhg% QtϵI Xu?+Pvʹ0u?b!VTݛ><?vHKb~Y@\fQo|W՚mn˂>hyu;K|#7TܒWy<wግ`k$d'kԴ&_.@20 jYV7Eާ[:VM @䟯\O-d44)Ȗdp:�=*%w<(K|`sTbKIDn6r%ZY;y#U8! IM-n&-U8bI>? G�_MzeɌ-1]IhQ{Z>,c{< 4է͎W7`Oc�J[>H!r;?B"d{'n<ǓD�\Nab%\7{ hj:e6|Ït kE7epsӑ?*ԕ=:Q\5I!gI:CbiτВ>O-Bsӭi [O1|ۉ9Nk6%Pݩ-57"F_`xq^#IꖇPWz~q]GpF]`벲fTd*`^jVRy$*@n:օƒ<�EUlxS]{X+ St6HO *ލ-ďs={ZGܧ`qXL6lI%dGƵ4_L ]q֬iF$Њ"S} F2]y`qүA4-H̹9KkIg>m1 b'_!GRcadd!)9$h$Nw)Yj# .ӑes+,ԮluWV8$>NGju4HF.a1{W F0*&IbA$8u"FVI͊NOCV(sGs]Vm=*ewMûY'մ&!cOo$lW%̑dJ2LŦ\!'ZP0 )0gR2I ?7`p}{vv-r8VI:-3sUn.J@qңP 20/Lq@Ϳ';a3FUI~�Oʟ0H <K:f|EʮK1��><ˤ\[_ # sұIX['8+:?ݜzӽk%5ܩ$0@s݉±Rf`Đs9�3403/o~ W[yx9zQU~�R3-Q]q�ZXbyr5Fzc-F0H)%Υ#䎋Jy.d+;q"5étѵyeb 6y9翧55~D#ʌu[U BG ~+\xlQK[ UYe@u:x5t�%܄9:kYR5ܤJu:[x [Ё'xr<5WQ- 1JfY9W#z(5w�L,<n⯶`O a'8Gm'Nk2ʚ묨)K]uoja ?tNT}+29XXڵlOk-)Y65''6Ys1]g4rB1#RNr�M,.S <. qW#wR<[)傏S UYkgzptԣM;Q$ryǵ{vs,|W->˵�Jg|&pzs&Fl٩\7D['k0:R [^}qN}:_1bX>r\ș d.|NHp~i5:/'28$x�y4f$<aw�qڤG^5"miJY'<tήA|,2 L�Z2}h6}E*I#*b9$t0MI-'#3{Eu<m[3ٗ<>KXn1)luڽZOs[F 0 SP~R =k2~cfbr=EWϛcynPG3@$V*QErGgDcY4Q\Էf-xA㎵u)is<j(?Cs13UK8YP.5 shQZ#7Ey,�T5n*7yE]$tQW3"cUޢ$RwuRBS$3`h ?���������������������������������Image-Info-1.42/img/test.gif������������������������������������������������������������������������0000644�0001750�0001750�00000071320�11253753022�015140� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a��� 8Ho$Jhű>uO+̍hFD1~oWl %ɶDgBEJ`C,$H|`XqnwT(hx@0V( cst)%tlWY.FU8JeqqoHVd rUC̈́v;_߆ovV<.4!Stvf0\F/l6| 8@:8+ F#FG5^,+HZYe;W.VmDdӫɵ[9 @LWKctbPZtvz08IZVOQt` /pA0ί(2TLodo &+Թ))-?/3@<S_guBnR񇡘pXJH\Z䷒]eHZ ')DGK Ň,H\t,f4ļ˕.D/ϖlQbL\zpGd Yؤs.dLb6Ϟwл7F)DX<[R'ú(Z,ͽWr`,bdbFvoGUbvG4DȈuE!ڦyUa~q 5*鹯ŵX/6{|vl2.E*ij̸2EMocu{xX|O{}Y/t[L? +|LdvyYqH0.q<X<4o}nHw<8pWIe`KH+ ,rGUPKY}/5693)hϯDh29e3U_aj_eaqdd7ele#(Go^`u^ 2&,վ򧋀q51Ѣ!Created with The GIMP�,������@�Av `ҜRKC vD0#zI±Ѐ,s^2(ʓۉhɜI͛8sɳϟ@w<]RrȉnNxF%4\6$ `%L@8hjC} !sh!@(Eǐ2ޥy޷x>|s+t@=<$yg6oI}0mL?{6Ԩ^&8OLaL`Z4qСaOTzecFA!iРL3+`aР_igA V2 ZQ s4ԢNLd!WM|e!2e|vF|�\y7TnexM%d#8 lFRbURJ<D;6$gNWD *LA LqE,`1PAE:Mql<YD-Ll@>fPa XX!G2Ԣ ~X)w,p~cg~Tfx@tFGERG{C>xDpOm�mEvs fP(=<nPLd8$J(Ԉ{IoE+ng)gX^e$PF)Ghf0ǰa E ~8 XVP!12ܡi0a 8.wPQpb fXN:3a[Ԑ-Ԡ%rDAzl Һ nmN?pm0uzD-[цd!wEL-RlFl-|x@L '81E  rg`F<Dp .xXPDyXzdC7yte g$CdbC:-�@c > 3O,cM'?b/^lC ?4ٖPC@aj! 2( E@:`*XA 85 j0C4<` 3ܣJ^@�V(xa`Lt `�4Q4PC <8 4 <5x0CП-]f@]:\W1 48ED�1 hp i |< -n@ \A 7ծ  AnQ:/̰F#De&t#qOԀ!C= a >B4 �QW(Џ ԣ>` (BD>A`�& f y�C4ad!E͐` ``-j2p�]a t!p AE8�c (1Phl`-@R4 > TE٤ծ9 [^a,Ԁ <P�RG т<x*=# oǰ6u X�wF}70�x%Q`�MP@;5e`Wp�F-P0bD5 ݺC obBΐOH{(B,z0Q&x-D 05(Ch*͂(XLC{ Na O0Ai l�4Hse�\Pǰ~<cq� Ƒ�Ȉ 6H�x`��wT^,y[' "8(Fq�WbJW�"]1^YЎ,qF&;V, P|0j [A {@8G iԡ-L ,D԰a`-Pt! -Y 0}!? a! lCkq^AA H�! /h8~:ஐai? Z� [ \vs;�i6n^\)!X B2M*Q?P!h� ^pi0`f{� hC0CE<�78pq(7b, H7ч3t 6Rp$ @Z|cXF b<zp hbYC: (.u�+p5o #��o4(5@0|�ٴ$1A=phbPc{2pTU t W R`!8B<{)7oAP3z^�^܉m6ll߈l,g+FV^._ס>`C\!]GÍF@fP�yy` c 9j (h-`{pM65�t.E-ڥ+r�i C@z7@ro,i=L  � *r=P\@iv Gpp@�ld+ui   -�TkҀ4yGihPPwleIy!qǐ�{ q@h=  zi.Eg \"-�KV�ao态Wxpr n6"e H0gC8 034C�Fؐ�۠BcVV6T .4"xyt� y`X�f�6Rc=p||L 2ph@rL`# L [4ra P '+fPQQAt@ٰ 4%`eI̦+ƊHgr�qj Pvp ^3D;p pG^0J""t-��`f<pHtB1(\V`IpΠP8R�R0<H݀ tbPP;Pb92EgPrfye{P|p x0$ ��b0h{6   ts�\"@-BFFhqH\ paYwiq1m^P}R{ "1 {3M< |� P;�� E # M6R(p\{0C{q p gHi P��Ö(Сy6#(p`(!Cj4gyG %� à(1p@, @v a Rp�pi0fQ��CСfIaPaߠBŗM(:<6 Jp8%p '!h�< a PRyw W`;<00 !v _B*FhxM6 G(hqXs��p}v�G �G j4(pp  $  iV9BfItW (Qm�yį8Bea#z#V� -`]Jew E0 vp*�\0 �nMh qW*TE%FWAtZ:t WP0,1R ݰ Vpߚ$0W GjirM�0rL}L`!ma(��p7p<f9p c0#@WC iв'0P1 ۺ�!єq eДoG?p $ (!!{AC�h�:Cp Pdy`~Q!uai1 .1{9P |-G0�| 0y1"34"qQuQa%LCyE1m%#"(�S%z16 b0S'p ` �& ?D Y�AP ?D߁ P i PiqEY 3q24V@ i 3s2 *q<'@ ap �E @B$55 gPwy/qajY01;I;Gyj\2-Yx,W^6QE02Pb04Y)Ab @fP JS `DmȌ VX 2*34nasb@-p Π w@E-�xG [54 | bV � |@ $ p,2 R|0 4+be5p#7 (@[ 7e[jY% t Pe0<YR<zB"IpH��Q & S)`&WP C\ Cl΀ٰ ^Ci >n 2 ` W�0g_` S{p # @l(P TP @ MP "Kfy o p-7ܠ0-^ce62]:XPW:MM6L  #ԧ:շ2tPԣ<<<0g:y V 10?m?pwc4ovg [| AT[(EdjE�+Ȋ@[?uW ��Ukٝ6Pg x�bn'MzG�g*9'jhc�%Z�`0MPҒGL,#ʐ�� ,,�-2.dm P ` Vנ`L`�Rr âohv & p߰E${p CwC/M=cV}v�`�y0 <`9' \@)m@S`}�b�g0Ft~kii4W=(sihJ P [5pS@`# @R�g0PKQH�f0 �¢02< P `@GWP7P)VͶ4@G`P d#Ou~P  pF �3 8f 0 +��|HmqwRNz !E̐` R40K2= % g 3$ @*V0i.Ep p{ y U`6,�=xppVtaE0y�`e[�z5b@+ 9OÏkL6 lP pW}kuOϯ , P>Gm8Z s!sbd;'y @Wiq I\i��BB=\ �bz謜=$03,_%�9uD?@'K,Hc*x4Ƒ"- CKbXK4+݆9b:pxCa`ɑCĚ"ܶe @0"Nj^ �+>;��s=1™+w<{NhXeƊ40}�!L#RäF-rY&u-jAGBRAg /Ö(�2g&-sS$WlJ7,Ǣ۫2�0ʸ p(Œ 8t4ʠ0xxby WD.Lw@w(CnA{�"A!`裌oI,Ҁ Hǂ"p1c+0E?`d QC0AC9Ցa.ASo>‹3ʸK2ĈPB0aC4 " ,ȁ V>x]3F9`@6J>8D x`A248΀�4ha+J: ȣ N{@}� 0olul`J7mm|j ;B|Pc <A_Ԉc&z@Lk<g-މ8ȃ`At�B=D7»sA8N8?6l(%?8QF"lAwF4`bLMg}\{hB4e8F3 Ni98q$T @e F 3$聉=Q;dauv=P^BMC oH "?HP8NJy蕢 'K 10,c8fZ>=Qt.%# DZ!| P& XrZ@<Db0,^Rl?ø�3� `"| N!S�e /0! F40H))rRo(=�?D81!h D,;m7 `"\�9z5"2huPJ7 e!V� S@NaL%=� }`P\h@,12#=ZP�`/7P$4 Lтy$ (Cƒ4Hy@=,/@� rg8pÝ{8pxAq@0!X "AAL`B ^@E(h<]qB� l\! p4KEyàAC!Ђ;$F:P C,= )�beS#b  y8`EI9A:,彥 qS2䊇!FP �!Gƒx<ܣ hx*S�Gcal0'ce v�`):�7Ue yx9 $ )YsGrկ۞ p 83Nq t x2+` � N�C a^?))�0ħW(p R9޵P=Z+EQ ep=<n@�|eX p>cߘR0\aq~|�ѴA?W|mH1Z{#@~<;�g,$x2paA~X@�,0!h,:H  8GXLwpNj0h{}ax��iSwa<@/\;[�8 84B)U'Tnpt E7!t5^�%p+\G*%[0lK� G?я2(YepzЏ! ?87px>pGx �1cq Jpo�>G#.<HPwc0؅n` G`�Õt7q-n֢�dotC(t A+Y>쩮0$`\G]3ԛil)xq0ֻޱcщp鏇<�}^$.8v~o@\#V i᜺ s֞P6x7.qsW8Յ9n<q?*h2&l ן<&| Bn& uG%e4( (U#3@)+p:ƙ)ЯϣLo83`7c) +1wZ>T@kT D_h�|A_xAh�2ll|k (4PB%%\B)9J 8(\)) ?`,90l9}*k)Ey?ػn!I4(Y;,Cop8z:pj7!s09Ch{skH<`9 A'4`<(*?!y bTȂM>( [R  bt)a*"�1XF+8+tHf #8pk<Ty(z�=X2 @xh6t EުÕ+8 L˔8(yYè=$,,hjH#36(h}8tc)gy#gl<acZ` Ґ?L4u*H,(�fyc8hX+Љ=543�5&-Puhh@|P6[G<„yyw!%1,l62 K{P̼(EZ2e&,H6lB"РT4@,�k(>3(ܜ,<ltNqF (#cSzJj<I?hlZ0ʗҘn0z @Pn؇y"`؃p1؂K6O؂||53P"H"K`ȓm pȇ?h9݂yĆJ�,DػHSv�1*PZ؃J Ȇl0MM� A BT04D *ȂWЅ!dR_؄,'%؀c`F?< >`L=8&`S|| |  SԈ `Cз  �pTz3H"=8E>P)u5Ӹ̗ h2iPrH�eڐv,ah4x,p8H38#p,h� ]pk J JB|`W2xvM7X,8O -�uȆ<& x<PBK�>%P|Ѓ`'� !�6-=_m["`d >)P[`-HQS&-`m `O�&ipi3pcȃˀ�8Ev,3@JĂ< X[K<Co}xm܄ mW_=4`Z@ h#+؀t& =Ѓ<p؀q,2W_8�QHدZSPgȁhN�Ѓ?@?X ڃ xY>ՃpP|8U=Xɒ,C� [FhJPڦ2]E ?ȇK88p؃L!Tw(_!PH� ؇LhS3#xͣ2`^`Xc`+TуyوR8>@&@b e��5M,',-؃<8![S# :I0x3P$N18膦LD;Ȁo`fh2tPPP?W)P*\nU, +L0+H7 =`j|p[\lP|xcazv&gbH'Pdb0)xg@&Ȃ-��8=@t"�1 Ѓ[)؃#@9V_p `X�x)vDeZ+؀4]$�mȄ�;@6ЉА Upw(XO- [w�@qTpc))Q&Ȃl(|�Hd)zXȑYgv5)mN>0\bx8Wh|(nH(8pk5S> %Yg~F8>*Ѐ^!P4<XS8ۛƂ_؅@8xPu;8ȃ=H腗94/=؝6p9|` zY6mK&h5I;X# 5 v(LIb5%bn̕]:+ڋ)_A& chT.8=hЃJ+؁({uP45[nHd:b$ fd9= <2(,cHU؂v䐑4oK 0oh 6�2,pKe�;p" ; h= 8)5i@ܰk)P3c�CM)a P?OPi9&o0T0#�9s#*H�h�pcEp~6e/ 10���00 h`!؁H@PI;_;�t " 8� HK@`YtȔO�T+q_q/: 3 p)�~Xhc y Ou@@m+�2@sf[axWT%ЄOxx0TpHsvl*ٌf'frt�! K1?zh 8Z@}h$(=ȆݠaS4P[t PX;P`*ђb?ª؃`P! (g gBY޴Z6PЄ'0p `Y:0]8xMH8w3S H >8 r�R\yV|%v1O J^@h]~mHoa�*5@Su؃X`�4h9eS7Xh�(KgТ~xS&&;H� 9rZXX:X'@ ' "YSGĚ'">(w��PDD �XHgŊgVNh|,XgJRI�?2H8?h RdHMii#vJ?,#550]V5-`i1 y&E{y*e̴$&APvIQ$Ұ$a:  > n}\Iy|'"�^Hn tXiQehǢel1e}xrD̩=f2ٓDW %^j<P;{!=\)!A,Xb 8S ؠa04�GH!G�G LQ|`5QFÁQD%W\bE- $PZP7y�=B"m`|`f GHq'q (; Gr};`X!VDMI q r1~2uJTv؁97j07':!jH9' HAC{\2A'`1A= 3 X� yDm=AexShHD^Q tX1N-F&X>s@ODoD|ӂy|@:$4Z4�PFDQЂA; yxFE%guY�8Z$<qڨцbyᄳE zVHH {xc"r#G pNx/[�PD|`SqiOgXFۂB SD'P qyqKcB."4(Fu|%Ġ i�sQp7$$9A7st k-0G O,iRܠ:r�p2ZqK>55kChk 6l녜an L5@0p?/d �hpha-~� xF2' (!%<a;PS~poBA?@-8B4Z� `G { PKtPq>g׬!";F1 TP!pQznl0< h6 0L2(6z@[(�oX`b $#'`ԂpE�)X! WX*_ʃ�(H) du L>jpe7Ą-<` g(7dȮ�` r)9i"Ѕ:p�gT<|[DZ.QzxE<p1hVX'! < gq $C`?+_!Bk`+ hJPS�ŠB:FmA* 6�K6 TEt\Z1D`'X �,!J  L(C =X@(qCjzU%,rk6<Y5d z34 b;C W(C:p\uE@6, x|A4`g�␆=� `D̖>�.Aє@0v`#pA @-|@yjJm0rPG т|Xb  >P Ol ,(E 6� zB |=0?�,@ ! dXc0`iX )TG:ؘ3lg2x=6�cMsva'@VqRl^J�y4r�0 4h7<bDpQPa<lށ tb xlă[N W@P0z% &i@6X@[V-P&Xß3� /LD&@|@h@#~dB:a>B y0 |S/ Oo 0}( tC/3HEơWяoMmRgqC X8F4-!xi97Q4|# ޑ} ̀Ohڀ{0_aEhh0}`xMWa }p5h, "gH)fE+|<2p(�H=P\) Dc@n3\B�Ppmc p4.AtH0zۆ8A3� hH$n� CN<@z|�Ё7p ,H,Zp @O A{x LЏh8Pɩd#<U& Go qpY,XM<mxE A7I�ψ:(Hl|I͐E_SB?�=G| lKd�=0`AdY�e�ā˵�`�m]� (�80SYF2;T7HϰIwUMs(Z$;$[57DQT0 ,CAG`8ox<@ Cl� 0d%Z؀(^ ÜF,Cp;lwh@41d@-\)�@pCIOVXC( 8\ @b78| A\Av}`F$@qÍmA@! p A4HA?y]:@�Cl+50W:A\ 8X@\�BG0pk2$pkxT C7@@,=@"pE$wAy 7 Ă# ApCYL])0d7t$A&A0E5 W%Aq Tn� ø �PD$qx (6J\y0@r%^ H$C&@2�0p� P& `�Ǭ=˔ 79Y% 7$|CMD@N\DEx $=܃!;7HRt@() :8=0A�Q9\B`=�O 208 EV=8ԣlL7A7H�;�78!) 4(@ ,08�.TF]J?2Yn@kFyAflTq0` <D6)\ `%p%)B)x؅TYK�:t!hExp G 7A6t A?�B؀qE@0 E( C Hptp9XA?l(ن;Zل=A/, &``C|]B|!�@ MP ppNsy\T=G kM\&=' 0\A W(p 95a5DC,b^ 0R!6@,e,C(YDpf Ƽ\q@ì�XA/<Z4@ 2Aq0gXډ;7>`9dl7tR@� �fq r0ʆ/Iv~z"%LRKCp<V0k?|0-֭--޲ApC|fg`؂ChN�< V@+ my] j? AQ�Cm]!�.ꦮnbd <y=UAn9Wp& \=%@>N/VnƀmRf$0\ @xxANR A@c/�0\'¦!<mMA4Nn/$Q>0O=VB�oE( @'B7@C\  QAAQ.ڀ7@@]o�D/ޮN7\ mVѼ'�6\8Cx=Adg^A@VpoR%t-jRx`7{Cߜ�M `wg@0D$(*ؚ<x1pv8b'.0W†RS0KxnR!0h0p$d%0rCv DC{ LA-A-(8\/<0=c!g.Cf\c0=Ay9@ ._ .tCd d1N7A)83^ұK@Jl0l@JD�4AmD8�=q=@h;j(|$+� jjV>ҳTgL� v.œ6 }zD_A6c1X@\*0*4@d>4^g&�`^6b&(�H�cA XA Hv C,Htuh1d(@ 4L]@G1&4TsZĴK(nk%7 M06,V!X!á54A@4X\0d`\<*7$[<wz53T1B%/u/4�Kd-?Ȥޤ2OGw-@%,e&3ℐQr]4 Nq ,IA$El$EXmy�s4ɴí@tC>v%�9BhB|?$@XCvLЬ4K�Kй0H 9K anY@L8)X@IxI 5(J! h�5m<+ӎı ]bP!~="mApƉ`=Nss|.s!PAx'swF(A-0Ww Þl2l)PGKovlI)X2)l7gw{X@GP:dݟ KHDg.; d�us$(p RD@s噹HaUױ6 wInss=s~C@;}!˥N:?`,<,C[C;In̓A-Iw;H28lXvJX@w �lL7Ё [v[Kޡ1hH,DB C>XXjx0y|ΈtCXX+6I䉮g`zFC7hD]r&cA0Cࣞ7,�`,X81 Ȁ3lwoe[ p$1D?JGl7u,X<I d$& ,-0}C @Y- sLD|L4ha !hhey7/KP䝍w<D޻f{p%2$y]?O~0<i["ZDʝ;V`%"ݼwjXt,M[Z(  GdIg YL۰?Gơ3`E6xRuPWCͭp xOP$<\8=fQ;ֽį+N2 )+ݻDFe<3<`Isz~߰ 4>*AA> <ȣ4da/ Ĉ&8@B8X�"҉fh&@Q(<8 ,b+i`h0CZc J)6g&#Hc+OԀr,Ր 5 У>xf lM6$�5x=,ؠ&NӓpC?uG=PC`iȇ9=~I'<P>/(F>I@]*|* f!_^;0ct(}vdSÚc)K jQ+h}91٣yI4 7ܠh<Óhz԰ē|T7J"D-MR=`&0 +`ȧ-PYDI'5jcXROp)ԓJ!{�'TÂ�Lz@) *hMeJL@e'׮$ZP,6?Ƈ |&\=ho{$,y; `&zأOZa|٣Qa8aNt9H-Ãi9©<>@nO@X?(mQ&0YyI)xF>FNoʃ<)N*gLe<kh@MLJ]�Xcn&no|376[ e[`I [/jA #r*J�cAR眔,ϱBʜC)X"`B~؂=x±YA H Geah(<'2o|  b#,0i`aXP@0 K3@A]5B� R fȇef~aF 8a9RCjAL *�<[@|G><E>x e3y.Ԡ? 6`B =HEC4(2 4VC <�Lci(>'"H@g̸| XlٰF6xMtՓ`cY8-@2cj8p@A 7,ߘRuNX?lA�Q@j�dLȎ OA ˈ6H3E0A_]:Rt>u<A)4q <EiXHd K'F ha ă: UO3u1'X@B°Npy��` Ȇ60=! rj`2) v3pX~�Q 6zD1XbZ# �.u+xX'1Q�8-iK5 Wp NW,`e�P � B-B<dH ƨ4Hy1z1޳ fC $O(yThpFw o348˱e4 .A{� 0DF;lzv%S5 4(.Ic@e< &Dc @Tv(-}Gf @CSk]|( ~<ʐ<$ !F8CZtGH*LH&Tr�}  aTG8P[vDPG)0I݂<�f<`T;(ÉQx!p',"p:h|l!Y0BPh ؃iA?!up\(6Dǻq g�CQ828CXB (!,epp�prPQ;v 0/d-FCX E@q<Th.=z4c7p,c �BʤڂT81l�g1K` ȑ`Z!.q>|RDzTG 0kX�@AtFC;, )S e`H# c@z2Y c*n"`< ! f` a FM NnQZ ǚ e | 6[ 6,'8P pK怤j0l H� n�`N�<<` � z D��.> b`@ dU6� . a �Xv*bri%@-(`JP`K,`O@�KHnA2h7J(.l,!H �x �Pp➏�,ᛶ)7H ` R $0p��a jN xjArP!KhAA`m Fv RQx͊` h@ 1Z7A J ! v� mJ@T X  'Q `>�$X׀x�`  lGe* ".d ,��@a#"aPŔ! <p5L>�2e? ``< 27f& SX` 0KPԠ,  6@&+ �Z6`7[ Rb�3Mf ! %N  @ Pd:` 4<v³kѼ`h4`7 A h  ` <�xd Z ~*5�60 X RJM77j  <@AnA$A<�NA /$�F ~Gn  ,2@F&P` 5`n!߂Aʀ 8� �;k�RdrL < [L?�G:>A ^fA  o P@\ ڡ`x] za@ Gl`Ezdj0 O�Dd� A@|I9P` �&D J X`7".A0H ~@PBA> 5� 4̀Aiޡ ֡ N@  z!^V M2QTT @XԘ3 D $n�@ $ $' N�2aA VZY@\e|^Ir7t7qS(#a. Ra6N($�W N %_w3\ � aSx`�T6`3H@4l�@E@,`^( �! 4 ,!@60 uG``ҁ% xЁE/! @9 ~x�,`` v�Yn$ W<D`\ R!@�x& (`P <Np~ou_@ F 0 * d6@@f>᫰ KN` A ,!*ހ.MIF`  !fazAΈ Aa6>! !raH `$tCpbM> l]@#!&A">A�\!`5a&DN Рp0" NZOr,¡ �+5ě<6�0jf@ $/<$F7,~2zN` z! l %^ B ᢡ a �F(`y(@   㚮 ޗ5 rm\�@ �Y�D`  D vw֠pa~$H$-R2 DUOx >u Ġ� ЁB3K�vCXԡn l i|ed dOH!Qa`n eOhl� l pp='l rC  4[-�n"r l�4a@ ` ,Z�`RAz@-,EAja9 jb>ahh :ϦzG_sԡ�Ֆ:o i&NaNtX`�ՀO a Z�@&lI5@!:� @"I�&�F.M. `r`?k�]/5/`\X ,D\`Ϣ rY,?6�A J`AdV dHR !c nQ� @AǏ y{7Ƞ N,N .��` jjF%�l V` @�04 # (TE_w/N_ ΈO;�-Z`bB* L%N"  <�Ll h�:7  Jnh�Z@ �ā`v\�8sˀH�t| (6ONE?T @>@*, (K=3 uAH�S-YNչ]AS:i<\PA$ ThV�a d J�ľʓL x4K b R fٹ� ĠʄH @&Fψ#0A d naE� >ćZ �� B-/N2,pJ(x�,Ā-,-GV!�ȿ$ `7Dɪ�dA <A |s`F_�<�,Prv` � ̊LT/4A �ʻwҴRcp'.,Xc18XбbEֈ b͚`$-b^�Sw^�\ �>|@ܹV-VhhB7?*@@-.q=j1ʏ| KF 9=H#԰{0(sJPrsҞ"GwYen{$ƛeX� 1/h`"/ޝ)GXs k?T`ɑ@xo(IIٟ2>6#dڧe#WGw}�S~^x^XM4BDsrFCC~7v0F [XR:pqjx� H)=Ge%q7GH&Aq^SX!,VQd|;E>id-x=݀a|A|s1 FSa1<$x+Ow*-L`($PR�x~ߔQ~JTQW a XBWauܱ27Fvh-H 0! ({ r�Ӄj!%W�̏B WQ0 fSeҍ|=}�|S(A1<2qJ5@7^M7Sp"GD9< >JJ>DRyX0E VE� @4!TRhXPFyA3X!k4±~�R p15XLB {h[:rı rP {P@�ݼ;pI\H0ȡκ6 `EO'AB Џ �h@PB0}QK:Ng$q4+.E~q0'LKZ�KsqT~1�G7bѪR@=G^A0 =G�b# ȁj/S ֶ! ?!Re0q8؀,=A#^ >0}@fv/ r�@^1HFF`0$"6H!<gwȁ cGч)Rqg0F7"$fwXSxpϼ<#>)%�(0�laj.ma\Ա"DanD)Z QzSh]�OxXxޑʽ)^8A L 2cꡛc@{pL<�$j;,?L}dx `%N# ^a 4Cx > @4:g4&Q= ?g"0l5,>Ѐ,F!sHZ�<gV.F�( Q` `<He9o 4Fp!d`x3?5H$'QJVP(7~4 eX  90N<|#x7Ґ ('@xT`'(ahzRHŀ  $ 'a&bl!VB:mQpfq| (C4@hCt<؃fLd/R@>Ljǀ� tUlFBL6<Q Ohp>"ZJ), S<Ac}�)\ (@A =bsbø= Є>P䡵"j:< Ru =>pi`hQCn-x`jBW-&h 7 a u-@?!n�EX~CԡG�!+b]�L^CpQPa @ ,ѐ 9Ԡ 0X3AJ,A% L5�vєX�XL,h2;0Y%ԡJsz�ц(YqP,` AR(>A8aHځ PبFC0�i(0z  �`n,B7'}7БtiB>0j$qjj ajH\ZaE~!q?8V>?a`0Xs!D`:`@!¡ݰ9?$%"0CjH,d<`3G%C8Π�q�[`ѹk~.$)`p# � hq4ș H&tV!}CiXN j, BKVdqXa:,a:@q`NDfS&6$R9kӯ^dnqcNV:& �H`r P =$ Kc�vW00� 5y\ p  +0 +@9ʀCg}BWv%F\p jp2< j PRn}L0leI hIQ#QuPVvpRt/77h-QwNb6`R`pCpP`nEunP6"Spz G@w N�Ks% %��])w&e`Ђ`O@4(i% ,$SjP|mR0jpؐSG$P9, |j tL ߠV@,-m(!PhgGyP!xvT-l_trv� PKX% h 6P�h0S@'(� 2 x\B^t|0 CSp`](X7p} #Kpqp�pGgPpg'PosL�@{q$b } y`| hP`=#{B-j ||p �[ z` sf@!YrV1, SP+� ' iKV � (p@xB C<q GSgN A@X`ϐp1C0,$W�Up` @,j� 0-0{5'kp!p!`p 6 Eˀ#R` U- 5@p=fpU � V%bH-? uI0%pzhp ߀D)A1y�x� (B`pg^pFJW<`$2`\��9dd 9@�DL0,*P\fmtP0<p yjp!Pj�;hx E 1a �Ѡ*:wp !@g!R�rt Voj|,"kn`@ `GP!Q@^qP R`$e:;` h`[t$[*2<;c$CV0HCxOy�]P #t S1�@O p&%04* s4pVhWq]g`S�y j`V'} fM*fVy�f`h ^:3P&tS"G 0 WijV �% � p y0?r�b�<qdp �q*NWG9Ve{v0(�Jeqn&C !K9S@j0 G��iP #`0UGy`YL0PY CtgYk krGP-0 SPjð{@ g BGcĂYwcmpS� \;6!``i gp G�"Dp@cx1<7RCW��� 3S 0ə:,pT�*eR%�P̲b�1dQ}0yX;#bpe=dcP9p$fÀԻ `1O �yG;~Qr ,nR`e@pCpdfP""ts?Pj?l?}>c5`x 4w`" Lp iA,w!,P\7oqa��_j(`G%)/0V2D D�P2%zV't0cF 4;( G Ёun@ E `f` !WpBg=ް @}w̽4% f�� PSJV`{� G@&;24pq`i0 {,x� %C(){zl5}DQ90`‰(B$F.p1D^V:P#y Pp ܐx `{ Lp L`n`;�x0|=hW{ x0YM2 p w`$p `$2y<p`Ii�*t1f!2pـu@} rp ppy10>30RG:B ' e�o]XPKpUp1EvVE _P'PGbVp {�"0PsLep �� c]9(K�e?eYdOnp4dX K(G <d$`ԑKʛh0 r�cu`c*0G*xD+#)p}x 8f0g�v PT'}4O%f 'h`Q�p E &C F IJW� @Z0�.~:Og�q@G� E0EFC7~ �'I*�=pDV <r`o}s)k4^=DU b C w{UG5Ep<Qy1#C7GS$q~gn Jo vT;0 E ��l%)<`@ m#E!f<PVp"pps%q t`Gn z-i` �pWp  hipc5 [g<=pdpE Kp 3�`0= KW@(n>J,A*{cWyP iNS)m>zo� .9 v-~H *g�G=S&x�c� kZ<P:nBW4_R7hPJ3b~I`_PJr m<ʮ<l�X`}pU<={$KQCGU'9>x+)W[ݠE� c;h<x䡡,{,:qܸp6 t>(ظ䥏w'�Ew(A LY2ez)s_?/2Ӑo$ f2$>)+s Riqꆝ}|˃'Nw b+P]txa�w#/^7�qYvi1Ĭ&|Qg\$\)Rݼ^+Б� ‰Kq]w%!�bn'AqeoZC y,[(A�Lm^ ."PSH@P?А`0<y/+P��ÆI3��`4 Q�0FZ$ 00( 8"=) 4Œ3PZɋ6,؁#2 41 wPp13o꫺> ;01Ɛw�0ƺɣ+P/b)nZ@&8Ž$XnNC:A{ʘ��BwDh. g*̲&{No8 o[(Ê<@*<9!>0%o pc&7)6"%p:@ z  ""Ckmƺ3L@9e}SJZ�\VQYCIÂ4N3!4ҸGXFǜn%R߹‚2a%D\<.@F/αh) >p4KN #,pccɤc]bwbia+4C3>˸m#P!1!/Cƀ.?ۮɲ0@"nf@ 8#~4�!@8P`�>n@9Fܽ81D$<N:Hn��" >!(kaKxL8E7P\D J<DfD P:xAnØE`= @+d * PPs?b$4pGNɼ?}. D@n7.ap��8Gn%7�s 80, !0t�Q9XSWB&�6}\"+ܢ  ɂ �q|+�0}` NO$^8^5 N�h� vp<G7 Q>)*fRC(ĜP  �2sy@>,a(�D"Ihv�E?l=@B$8N�A '850$H)aR8,q ,Ty-0!(zqgTZ;�c1#@:(ȇ@Qq4' @9��L I�;����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/img/test.wbmp�����������������������������������������������������������������������0000644�0001750�0001750�00000000014�12101452256�015326� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������c��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Image-Info-1.42/img/graph.svg�����������������������������������������������������������������������0000644�0001750�0001750�00000003040�11253753022�015306� 0����������������������������������������������������������������������������������������������������ustar �eserte��������������������������eserte�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" standalone="yes"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg width="209" height="51" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <!-- Generated at Sun Jul 16 13:33:40 2006 by: Graph::Easy v0.44 Graph::Easy::As_svg v0.18 --> <title>Untitled graph Image::Info Info Image-Info-1.42/img/no-thumbnail.jpg0000644000175000017500000011064212163245220016567 0ustar eserteeserteJFIFHH2ExifII*bj(1r2iHHAdobe Photoshop CS4 Windows2013:04:22 11:41:26P"(* 2HHC   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((P" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?R߇E5d'8 <8HX8< W_‡{IJisniI68:^?)?ᗼ{=O "+Q|W+c{^vph^*g~^tdji ߓg/x{hEqx7zc+b_1![A8=F+/쯈Sh~%omܗI\坂܌oˊ顙{NgRe~ER;Z/]O o? Wmv[x#,V  rN+X_ I?|hoimg% pD`l 9B\϶΢HGo ?dl]s[m?h>M{-/h^> ֡|֒ʕych=1зzĺFeq`1!.XzJ+=KJ4v宴 %yNv9.b=^q?kOzґiF՛?8{6[keG̒`?LqXD]B8瓩!T*+Pp+|6Y]ƥLHdpt2G.b=^q?kOzґiF՛?8{6[keG̒`?LqXD]B8瓩!T*+Pp+|6Y]ƥLHdpt2G^)Ed§6\qEMޢd@Nʮ2s_nHVzc~v0jZuՍ}USGяjv{B}waRva(} DEm|7΋Ĵ];SK8H׫/Y(1H{ ߏhn"l̏=51T,%\0Rc Tr׷v|kCS.Kf8&W K-*VӦ)X:R++Х )x{5\M4$f=s~C\--O݅Nz{P;׃< ?q<"vP͹u<im Ok+hDV$QRMcí3xG@X㵁=Y@aЃcxwi×H|:4";yf;Q?j}HQ^SG'R׼o c޼Au?mmgړwq{bB3$)I77nYeǖO_)~K7р;<>zZ/p樼6'<'e9a@>p'Ri9@+56=UHf .pD˲5U#ױ_JU~ԟ4`_r#oῃ|9xH(ed 2Y=fxn{X%I#*$@G6#*]4,2Çٯ|_qӕ<4y_?fiQ^QE|\H"Tk)ՈWn}kq'/og,2,H   `Gh^?>Wv1U}"`7'Ǯ90G׻6sҏ\x a)a]2yW֩͆|ϿR|{-t5k@kE若$ȝw$3WtOӿ@.KִR 3~*ZWZh>_V%GgooL`gAQQjZցu"i:uOiB UW~.XpcEv~-th-gTTo;$c"ySGZti>ԅ%B(fuw?Gswj4z^D% A񟆼[2NC;ssmu jgEnTyPg-QԤdLG ]Mx{B-2j6 ɴ `OuV]4w8ZEKGwkU鯡MY'A*ؼLnTzVs3,g|ҬOP+4-\]0FU)nZxڕh L{`~kaդ*~[=&'F(yd}|u 7ei>wyҩ?.m2{3Fz{VwoZw;m/},(H! w8W 7} DEm|7΋Ĵ];SK8H׫/Y(1H{ ߏhn"l̏=51T.&ѫu2q У}0:: 4!1FiP۵xoƭjE6KnO$q l! '9|qs^ǯjq-2Kh%ۢ,@k份~eKK3P[2u~t3rPn:SWH.X[9]D ) `q`t\PIz|+OZ%A +l/WXb2:ƙ[W׭<]^z%hQf,ٲ !ת9#5h:(Ye4~{֘!n=s“ fPuI.OC3~2Hm$HW|`xçY.C83ql>)JNG>a:mҧ_amEkHCoa;;^UEGυQ@Q@bS߇?6׺0ܺcІ8g>+_nV۩ q? -Z4NQ\O!YGcI{JHj,>nucs,BkNN^]_?FW?FWs?f4ĚӬ+ +Dˑב^9WD#̏voOlOQw } oUX~|!-Tm!g =?d~&iCNTj+4֗zuLʿf[-VeC ?{$77@v]K>ҟeۃs>.+s..oQX\BZmEMlw:3..FԪ6Ԓ}6>>670Ci#n1˜ǞˁⶵKoxwQNd0,Ac=k3E&j.t=JJ+2uTZ񤚭hP5݇|&tEMq~/F0⿫mO kXd[;w28?:%ho$3e"FprC+~s?f?šeާ yBBط+psӸxrX^Rgf:.u߶h 4hv;;֕eb wFrv`OSZ?~KEȜq|d 煴{[?.ɁE^VLiʽI}OSg0($ҷW~-wp̉y)hnDP qzx:~Q4K9I_.Sw SxΕy5tVHg$oa}?о+?i6ē@0|B4GTW}¼s|<5x32jkCnm1 9¾AR~VYX|9|M8o*󏧽d7/>xR30 3yqq3^C^QX,3^㸟8ѡ7km}IxcOMouxնƏyXۀsV-<+sA'=>khKnAO~:]5D= !o t_~i>,ljw3ib` 9%1F3ɚX< OP\Fպ1Kei-N>&}[aDFv"$>= xG6㉭/ywM"ŇWqXu`T_ksµ4똮Ṕn+ǡkǒ\h-ew'}?NsЃ\UEЫ .[OCzsԧ_tl|H$~/30i _MJC9PÆbG'#XihH)[V( evд ZAep\=I]6-ZtYmobR(zɹMݾQ4L"Sw넼ЩX y܂G]7m 14,W-8Y^[S$.cR}5'ů 5ڌkV?r-GCɘFw} ARɊM#I¯My bAY`iI**̋knA  YϨ9 .b=^q?kOzґiF՛?8{6[keG̒`?LqXD]B8瓩!T*+Pp+|6Y]ƥLHdpt2G^)Ed§6\qEMޢd@Nʮ2s_nHVzc~v0jZuՍ}USGяjv{B}waRva(} DEm|7΋Ĵ]My bAY`iI**̋knA  YϨ9 .b=^q?kOzґiF՛?8{6[keG̒`?LqXD]B8瓩!T*+Pp+|6Y]ƥLHdpt2G^)Ed§6\qEMޢd@Nʮ2s_nHVzc~v0jZuՍ}USGяjv{B}waRva(} DEm|7΋Ĵ]/{,8ѳռ߻~9םJv^Z[$j蘃xfɏĕ5~YGFOIU|Ev Pm.qGV>k7Kc7XP x?3/_J^61}nj˗vRn X"]uHԳڪ$ڦ{ۉn˳``dOR<2$w+) jpѡvl^'5Wa|3H,\]<ۦ{AǦ{ׂ|TK"\]\egrI? {8ΨY+cԙ؟U&YfIso\~UgUKuouэA]/o[om&Ou^.} DEm|7΋Ĵ]~~ x~k^J 9t:E}>} DEm|7΋Ĵ]Eŝ~] DN}}?J\f8ϨM5u~A㊡̺.*/٤pj|/9+7ӃS(?c? Fcc0 $õx}{/I}!iΠbUܸ9=NtF獺wdnWGsewjmgI2FT]o<{MQmV(WɌOrUVPh.}U5+Sw^jŵӯZ8Yܘ"m1]ͷvëƖ_c[b;mw\{W K:rK],u碰ƒ}X m)1l½gʴ )WX"VV W|[ViKj;9 0Euu3~#3OF_F}WsPRvw/۹݇K UE'US+Oå6үN!ҡ%8u:v@umPiƎdDD \\RATv6W:r7%* O[6jR_\\Jҹf$z k[V|;*(=K1Տ⟄z$My bAY`iI**̋knA  YϨ9 .b=^q?kOzґiF՛?8{6[keG̒`?LqXD]B8瓩!T*+Pp+|6Y]ƥLHdpt2G^)Ed§6\qEMޢd@Nʮ2s_nHVzc~v0jZuՍ}USGяjv{B}waRva(} DEm|7΋Ĵ]My bAY`iI**̋knA  YϨ9 .b=^q?kOzґiF՛?8{6[keG̒`?LqXD]B8瓩!T*+Pp+|6Y]ƥLHdpt2G^)Ed§6\qEMޢd@Nʮ2s_nHVzc~v0jZuՍ}USGяjv{B}waRva(} DEm|7΋Ĵ]~,A'\gmi 4P~# \tZgG*} nzC!}{Vw%Km+Cs 209}{P0M.81V?ImyNZAu9|N\o?H');q:|$* V-/8W#؞U~!no OX[@;O 8I^_Oɍ=ZIhZ84=:U-~㊣]QY1N'kZtz|Ǘ#Gaռ7_xL7uمp>of z})0w_y}{$OGjLZ7A_RGNk>s>֋j ol/DwA_Hjz?>_GM#B$ßu+tov}IJ;mϖB7@==lMa;?fQjv enNp;aҼ(B^ƝIivݭ{ZfIN}i}s̾ K}Z?FUҠh:y<`We߇΁Ee 6iB|b9}ֻcCix!Qr}8{dw,v_4-G+؆MckwI>2>:s&G*7$v܅Ӿ7kKs}Dh,c)8`qq׌Wi:񎣤iZUƗiJ,r|;T(/|~)U<}Wo/>z:P>xV|UYUQƺ?^+6\$ ulbvZIV|3M[ėi@` u=¾ҺS ]+C:I{=._W_ G$ř8bzqɬܚ%[H_nq]N:Ck-Ԝ E?ǠW'K\c#e۩5w9\k'Oq qe>5ȖOأEp쥤8MQ XmJ%5pi[nܮ}D`uGg{w+"JiTSZQT{8r@Ws⟄ZNGG7NK/1=g$.oQ֯t*m AؗM܅܏|8?[lE*qEޜ5G]Kj2w}CӅ5k9 My bAY`iI**̋knA  YϨ9 .b=^q?kOzґiF՛?8{6[keG̒`?LqXD]B8瓩!T*+Pp+|6Y]ƥLHdpt2G^)Ed§6\qEMޢd@Nʮ2s_nHVzc~v0jZuՍ}USGяjv{B}waRva(} DEm|7΋Ĵ]q&wO^xoZvI̶,A=Z~~ x~k^J 9t:E}>} DEm|7΋Ĵ]\J߀ j;okm;v}̃j?W8+~9k0 pZi+Q1O{DmRYY?_NVOh?gO.. A}3۵zwO2l9Te\nh +4Ӎ: >)|p CT:I%A@8Z2p 峟J|TsLmВ@e'8WY[Fedaf} wjïN=x5^]&fI/f{utGkK[֢v\6>U_7GW5HMs3K3^ۊ^2\"tA?5,wInmDr{=}5ٵws&gd Fڟ]힗kQYG?"udB{뢹E~Ti՜׋$u&;WuXмQGVbpljLnu ;W{{?Q] 6 NX[ٶ"=?&ɉCV04뷺~A{hIwsfI&䑀~n: "kOliָf&I ^lח] }.ڭ˃[݂"$5Y!-C`Gс-m߆?c]FE| R?}II🆅Π,7P ծJ9S]#tǩꩶ[Eg78Ld.HXzZm9-Mua+[\,qQkߎ~/VF-&^~ ^/GkJHL=@p~M~"6Լ-} k- P|F% uⴥxI>g_ =zHxB7KW~5{úť̓ٹ[JBdR8 ^6fo8ZUx躊ǟ+tthƓ A!gd6h0Fޤq^30h լ]}&kanQiLvᇄ=WP W/y_ }WP2uU3ۛ_J6T3۴0ۇv gdݵd }bb,O95[Rir\*a'?} DEm|7΋Ĵ]_4|b+Kq׳%lsT9P`H# mEj7(G~䌩Qb)}ǎ>&.qs"@'8<)|CJTиyynap$3pqMK~1@] NoQe=8R2`ЏJ[揳N+:5 sŴ?5/>vd)2~`yzWJsKh$w-%$}C\ψWK+HݲH_Y{s*Xsw{L>JGס :q\dӮ^Uq"y`vptyeqct؟,,ee?5k2~q4/cQk0?'QŋG0"yK{=vZ::,0rqhуVwG=u)DR9Ug@?Zds2@|e;T =V !ZR ʂ;e۸΍.$8E`⧃ڛj8iՌ35ޭ[PzݛGrH8Wξ!RvZE(tbw.aIUp} 4XW.صO*SS-טSEQm/>}\jXQk)y`} DEm|7΋Ĵ]&wO^xoZvI̶,A=Z~~ x~k^J 9t:E}>} DEm|7΋Ĵ]IǗؑ^Q&i⋿>Hp`5i_WHiW.M+ +ξ W+-X@Zn L9~Wh=/nϨ7ᇄ4{>WIup~ :U|.|0cJؿtQ_;#>~okVWӎD䌎 NFz C>fYֵEzkL%La#׌q8%[һ2H?ʯJe Ŷs3B}[{֛m8Ki{:}go^' 8K*Hb'?4n&V$#Wcdan{I*֓mpʲ37im-s0Tí(M2st囈bh9YO/ᮭ5[[h[q`}y{ֲW+iD\3wk^ \jشc̓7O8<Ғg:1eZ}w`Bmԓo]\Ƨ{Y_'RzO=:?DR>f(w%Y!8f'aGLajdDsR){pZƍR(ՁxZLWV5~ͣ&#Uq𯏵{WIeR~_1ǹx'V8RIr۩.º>DŽy3#7+~ Pּ|mX䥼eB$p84tI!a;>=m\qEMޢd@Nʮ2s_nHVzc~v0jZuՍ}USGяjv{B}waRva(} DEm|7΋Ĵ];=b8$q%yVQt EdǛi:{zwϦ_m.b=^q?kOzґiF՛?8{6[keG̒`?LqXD]B8瓩!T*+Pp+|6Y]ƥLHdpt2G^)Ed§6\qEMޢd@Nʮ2s_nHVzc~v0jZuՍ}USGяjv{B}waRva(} DEm|7΋Ĵ];SK8H׫/Y(1H{ ߏhn"l̏=51TxᗈxClie OF=q\h7zƁYRcb8NΗ[onXGq}ɳ 9y\? .u-EˋF'Ȼ~u|ubefF56~7|MWi zRc_>WM;^k; X5"[F9bG||3xxz5dRQ򰲤JZQJ[jk -ogh2KIn08̠=Ytl-^X;X[Hmr;rW@_MtMt]2+jwb"-Nv~csH;5Լ?e~ؚS,DR0Qy眎iWVG̒ܵ;;%t˥*5qTJ캵Y>f@ouGKg3y'Hu׆4[HIcwsZ吞q`IqRc_>WM;^k; X5"[F9bG||3xxz5dRQ򰲤JZQJ[jk -ogh2KIn08̠=Ytl-^X;X[Hmr;rW@_MtMt]2+jwb"-Nv~csH;5Լ?e~ؚS,DR0Qy眎iWVG̒ܵ;;%t˥*5qTJ캵Y>f@ouGKg3y'Hu׆4[HIcwsZ吞q`IqRc_>WM;^k; X5"[F9bG||3xxz5dRQ򰲤JZQJ[jk -ogh2KIn08̠=Ytl-^X;X[Hmr;rW@_MtMt]2+jwb"-Nv\qEMޢd@Nʮ2s_nHVzc~v0jZuՍ}USGяjv{B}waRva(} DEm|7΋Ĵ];;=:q^|ի+#Hէ;kϭI;W%oMʰk)OܻN=\{'d1Fh,@]{Sܞ>.kiM+4伦5iI=z_Rc_>WM;^k; X5"[F9bG||3xxz5dRQ򰲤JZQJ[jk -ogh2KIn08̠=Ytl-^X;X[Hmr;rW@_MtMt]2+jwb"-Nv~csH;5Լ?e~ؚS,DR0Qy眎iWVG̒ܵ;;%t˥*5qTJ캵Y>f@ouGKg3y'Hu׆4[HIcwsZ吞q`IqL4gUGQS.x9śM|<3Ү1oc Vw}AtQLXO$֯iz.Z|@$?_8#BKrI5DdկfyE)ot MԂ2LJ{sU ҃s[tiS4vmf㷏j4$Rׯ4r˹K 횟ğic:έrp0GNOU&6{Pi34#ӹr䟸8~?TsnyA# E}z2\ [0=)RX+30A>؍ 7'0{%zcg8{a{GmkPM2O[*\lEmIaFC_&.֙P̳rk-O73[iy _nkyuu]#NO:f~C_qN=1޸N}WWS 7F+[78b0AfGUҧhݿ>"x4tYx3Nc XB E{kk'B$ +j@pG"WGG='@~h18Q?5@e٩xn6N}*{_cКk }TdBFY1=?3o`|Alt B:/5\RA}@3Ai!8l5Vx^ʠ[M8dՀ[hCq䊧+:ӣ9=gouN(<$vY<}AU>hkVL֤/ ~p~ʀz VL%N&@z=+? kpf.n,\O)'! ՘FRɸִ؝-8Pؘ 1Oчҡ΋qm4wq([2:0<:W%sanwAt qd ?]Z,9uДj^3;<[ه4Ճ  jc 5O6OqUh/Wkٿ5 ׷<#}j{#O"TP*PMє+]ּW"[;i ۭywq]W;]@2#w`À3c׷[\oMZi-k6]6P˸)IG~UJߊv-anTЬrv??:[{E*ʸ#<~_x jM()sqC}?MNk;3w?ϸr#۩=WM4lG<ԑwJbIeRF-"R5sVu95/A[n-DIi,9N=@WM;^k; X5"[F9bG||3xxz5dRQ򰲤JZQJ[jk -ogh2KIn08̠=Ytl-^X;X[Hmr;rW@_MtMt]2+jwb"-Nv~csH;5Լ?e~ؚS,DR0Qy眎iWVG̒ܵ;;%t˥*5qTJ캵Y>f@ouGKg3y'Hu׆4[H7uمp>of );q:|$* V-/8W#؞U~!no OX[@;O 8I^_Oɍ=ZIhZ84=:U-~㊣]QY1N'kZtz|Ǘ#Gaռ7_xL7uمp>of z})0w_y}{$OGjLZ7A_RGNk>s>֋j ol/{Ń͏Rb+3dKdE1_3ifFnk|;a?rk_LRKY%YN~@8Wӭ/*E bdڑ,@DRþ$]9H?ZZcfjHE.5E*(\K-|e\BJ} C~(wn;pN^m4Fхm? 3}CIioG6xOM3e kpIXJ@R2 x>i3["|;,,f=< >vkҼc%zxj +›y͂q;ڽ V:ip6"T_&7 gqsF>Vցōmy؅ؼ^CczZ#:&#I^}N=n,cu;]<#28Ǹ7p,Yz7uمp>of );q:|$* V-/8W#؞U~!no OX[@;O 8I^_Oɍ=ZIhZ84=:U-~㊣]QY1N'kZtz|Ǘ#Gaռ7_xL7uمp>of z})0w_y}{$OGjLZ7A_RGNk>s>֋j ol/} DEm|7΋Ĵ];⣸oi> ѵu߲W;I2F: i>׫7uمp>of );q:|$* V-/8W#؞U~!no OX[@;O 8I^_Oɍ=ZIhZ84=:U-~㊣]QY1N'kZtz|Ǘ#Gaռ7_xL7uمp>of z})0w_y}{$OGjLZ7A_RGNk>s>֋j ol/of );q:|$* V-/8W#؞U~!no OX[@;O 8I^_Oɍ=ZIhZ84=:U-~㊣]QY1N'kZtz|Ǘ#Gaռ7_xL7uمp>of z})0w_y}{$OGjLZ7A_RGNk>s>֋j ol/a'KѴ)XFkcadl *k[7X#}=H>+ ]Z?S{׃,_ibYI==eu12JTy`䠑gT|:Tċg_| u ?秽x!){N=F*܎S>һՊ^/G N_}$)o@kBd62>oWG۞:8V`ce?^,OZ.!?ܾC~W\cr ߈A>.k\qxš@yq8)aW_Hx-SWz4`{+3=PitPJLc=8ǯiBQݜc:}LTabɑC}|4t2ioh .ky2A2 @umzC*FxzJmsnz>3D*5B;Sz!teP'X/}C?Z_\ܚ]=8zM[ҶY&.;V_ _޿omt,pʲm1sQV&ibx¼n ЍKہc9Ңm$q0΅7uمp>of );q:|$* V-/8W#؞U~!no OX[@;O 8I^_Oɍ=ZIhZ84=:U-~㊣]QY1N'kZtz|Ǘ#Gaռ7_xL7uمp>of z})0w_y}{$OGjLZ7A_RGNk>s>֋j ol/7U=Zf#>ԼNq}%ݭʐ"P >j6Q\Oΰ)4$g+> Xk/#ú?_-du%W0#|1uSݍĖs&D,@s:UV.$v4;>Ӽ[Yֺar v v;v<Sе;S>!׵& >"C8ªrk4s⤾$න/'̧&|@5"^ 5]O]|A"ٵ_sd' (@PzTܤΜ„!N4ndtZE׊Ub执x@.C^I5 r['9G{"wawz,j[uk[ƾ2LQĚucK0 u/!v&#JEݴp2W)#ڸ'(R-yZE='\'g^8|۶4ҳ * Ǡ7uمp>of );q:|$* V-/8W#؞U~!no OX[@;O 8I^_Oɍ=ZIhZ84=:U-~㊣]QY1N'kZtz|Ǘ#Gaռ7_xL7uمp>of z})0w_y}{$OGjLZ7A_RGNk>s>֋j ol/>:_[<^9E﷒դ6M?Ogƅ߉ƒ%N^03SPOo+%B*0Vվoo~Zޢym`d-țcS+wsîkYLf ?*y=>oNw3m\ e(d]0C엾8<-/g`Ǟw#'}8Tv6]uNh.d&ߛvV4?);q:|$* V-/8W#؞U~!no OX[@;O 8I^_Oɍ=ZIhZ84=:U-~㊣]QY1N'kZtz|Ǘ#Gaռ7_xL7uمp>of z})0w_y}{$OGjLZ7A_RGNk>s>֋j ol/of );q:|$* V-/8W#؞U~!no OX[@;O 8I^_Oɍ=ZIhZ84=:U-~㊣]QY1N'kZtz|Ǘ#Gaռ7_xL7uمp>of z})0w_y}{$OGjLZ7A_RGNk>s>֋j ol/of z})0w_y}{$OGjLZ7A_RGNk>s>֋j ol/WM;^k; X5"[F9bG||3xxz5dRQ򰲤JZQJ[jk -ogh2KIn08̠=Ytl-^X;X[Hmr;rW@_MtMt]2+jwb"-Nv~csH;5Լ?e~ؚS,DR0Qy眎iWVG̒ܵ;;%t˥*5qTJ캵Y>f@ouGKg3y'Hu׆4[HIcwsZ吞q`IqYeuq]:K6PW֧:3hZ~/7\Q)!z5>}t >]C>oHk4{vc wdx\1_ךbkvϟ>ƺׅWKiWsb8Exɀ1s 2JcQu[j+wᗍ⾎WH18^y/Y7K.)5 -G1 D%ʷ:zWi OOg(F_:)՝'M&?Mu2;Nj Ӓ;;9^=2}MR˧' ?r6|I£ñbxmͿmq[]E?GspPHR~[S`8Ok0{y{oxo"MsKemk ljw,x>Փ dVn] C' t{v=]G++ۤU"U$ $ГPMOÚ"xK^6%ܲc3$Ǯ=}r2п2|@_7G.Ze Z^ާ?|šU}#ºLJ|5өĩÉ6Wg89.iZ4B|Gͪj0m,K}8$s?` nR0GC]W4 ig^ ^^iw}2Y@5DJL[ ąGZʮTc-$ܯi [gKP| Y LɖH8;O]Ip);q:|$* V-/8W#؞U~!no OX[@;O 8I^_"2(84=:U-~㊣]QY1N'kZtz|Ǘ#Gaռ7_xL7uمp>of );q:|$* V-/8W#؞U~!no OX[@;O 8I^_Oɍ=ZIhZ84=:U-~㊣]QY1N'kZtz|Ǘ#Gaռ7_xL7uمp>of z})0w_y}{$OGjLZ7A_RGNk>s>֋j ol/f@ouGKg3y'Hu׆4[HIcwsZ吞q`IqI^ˢߚe,'>a + Ze"ngɕӉ"|20I3[O`]Z{`}O|Ͻ ,M$`yۿ-9=ۡ D2?۵mS#:3շ6붝g%UM'kYXMo8K4P`3gX_ Z__uՆd"ٶ2Tބv=ko(PI-?__z u:BH=rZbrL%HNM6_3*YhFڳVPL:\ıwrsm{;syoe {=T@q##s_7.v| s%Dw?/OjRHqٮݎ\&%Rn_ sþS/复a_,0d< +j-#_Of"I7:_?@I(u}Twpݿ4J{{w *ͽON5z1*dNϵSk&?OK78ۍ6 2&7tXĚج"w}N3߭|7gBzNӳ?k\3/Ö:&uh̎4lOxg5x|#% [C%Ӧi̜Ё9&&]q{}?"Cga@>]UUYԳIj+_棘B9#kؚ4Z$zN ^JG`JO#'^ #' em@{Bw1&G<Аnj|IA!fa qTQXJO֣ _kZZQσٟ9u{no.ohǜ9w 9«4VIz8_[Q\FEPEPEPEP^oOGmK,᳒XibϖdDX$Q@7??h>]%Mݿ*o`FpA?cqc-5125#/c[&p#yhYK*|Q@v1'ug&Z%qyL1@ DVSM\p5yqn(Ǟ%^?&O)Ol"hը"{Id7u?/&_3^E}R/vH>-tTk]? E}N/v=~3xzk *Ezx>C܃O$~""+7N~##?m袏_a}=njܿکUwVLhpNޫDx`rmZahbܹomv{   ˵˽    ˽ Ѷ͵ ± ˵ !±{_gή±aPggܽ Ȇld{_BJὢ  z{aE39J ˵wSFAHlbCg3Bg ήmSFFAl?X{EBJܽwqq}rqw mSFHA1d,3Jg ˽zzy\VyXXrqwwmSF 51*!3BJo xv\e/WWeMe`WW\\V\mSFFAA/*'BJoðukOZZOO`eD2& (WOThhmSFFA?5/'gg̼~~kZ`Oe2&&  2Gcffs imSFA5".BĴZZ=eD& &;;cf|mmF?1"9ĺk~e~&&  4;Ycn|iSFFA/" BJgļ~~kZZ2&  0;Gc|iSH?* $33gļkZZD& &(;;f||tiiS5"3g̼ĴkZeO2& &-G|F1*+)$3JJo߰~ekOMe& &4ffs|tX7bbN))%.3Bg vekO`O<=& (GYGhc[zzdbbRPE3B3JggŇy\``Me&--4GfnttilXddaNPP9B3Bgg ˦xV\MMO,=2# &-44Gffnntm?:1XddaRPB33BBJggҿxy\WWMMOM`M2& ! #-6Ys|nnpF?:1X7@aREB3JBJJo̲~kee`OOMO<=OW(&#6Tfn |t]A??>1>@NP83 9JIJ~e~`OOMMOM&WDI@7V6TTfnnfn[KA??:1>aCE93399gğZZ`MOO`M`OMW\[[hh[hh[]HAA?5>@",B..3g ĺ~ZkO``O``M e\Vlt[ KKFA??1*!%$.39Bg ~ZeZ`OOM`MO`OMWVtp][KLA??1*..3JJg,~uZZ`MOOZMMeZeWtp]]KUHA??/$39939JJgu~`~t]KUS?1"..3JJ]UHA^5>*..99.393JBgĺ  ^^>/)..393393BJBg ̼ļ ±z{R8939933.3B33BBJoļļ¶NP893993B9339BJg ļ ǹgoggJgJBB9BJ  ƹggo g   ƹ    C)  C    R  '     C  C     )j R)   +   @@@@Image-Info-1.42/img/itxt3.png0000644000175000017500000000016213125503327015250 0ustar eserteesertePNG  IHDR:~U IDAT[c`b@Oh#iTXtCommenten{cFpirrjq񣆽2+^UIENDB`Image-Info-1.42/img/segfault.tif0000644000175000017500000000044212445121674016013 0ustar eserteeserteII* @(/home/eserte/trash/1px.tiffCreated with GIMPHHImage-Info-1.42/img/test-corruptchunk.jpg0000644000175000017500000000047412101456522017700 0ustar eserteeserteJFIFHHThis is a corrupt file.XXXXC  !"$"$C" ?Image-Info-1.42/img/cynic_hang.jpg0000644000175000017500000003052411253753022016277 0ustar eserteeserteJFIFHHPhotoshop 3.08BIMExifMM*bj(1r2iHHAdobe Photoshop CS Windows2007:03:16 16:44:02C    $.' "+"(6(+/1343&8<82<.231C  1!!11111111111111111111111111111111111111111111111111" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ;KIfϗ m#d R^ FPơmm aMjiNrJ)$a9xH 3j2(aYt PڥәK!?jץUx UXE+g+kzoo$گ3dKv9#z+/I揣i|63HaCR)ʒ58N}QEQQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEG~Ak9X_W>5󞭨WrL)$,kx6kWVo?Oʰ0ᣧ%vz|3{㋿kH#ɤ\8Pu ?碎?QǦ>D56 +3Wu}+ꏅO{ۜƤw$ 3丂iWRSK:忇4KJ "z&5E//%2V1(^@j,Lӕ^w׌1\U9VN W=k >=LBZ^H~mݑ|=sj.d! ? H)M0`>'# fl7c( (\eAfJd|#5jnxEmu=ƊW)sG,R_&~ _G4WKAK?eGף0F~&xiMii]~vy\k,ZN/#ߨC~:"}SȮ)XH:0e9R5 ї,(1 ( ( ( ( ( ( +<]FmėjZL@EL{3|b=-*v=Xe8I-WƗ*tEh{ԟ@=+s&7-qF蠨wj~,!]P{~'GEx|Z֏ݞQ*6rgW/סzK#?>|?EH~*G}~+G-Oߘ—0^ė%ЮԤfh\zkZX՗*Mج^W#+B(((((((/|'ɣ+XEtG|{f>,1}yypKqgi@0ϏRrG+`xՕϨʪƮ/Egꆿ5I>J]F鸡X!bOj;O"kWDa >@8&qwlx\cMnwHFJꈣ,p&dEt`!#ָ:>`Zh $s(2ü!px=Gލ{f(; p]Mɫh|4#QNmw:O}+ _|+#/Oh/kvds,-u ; y]%g^ 3PofA_[^cO #hO!k]Rwedy泤h[[{Ҕ>$tQQNW![9 Jc v;MFAKr@O r+)#'V:pè:}Ŵr7Ԩ&׺ϥ8En"_;1%}%M5}2FhgR[GW]9{QwBE ( (lFMKEB.z ⦥{Mn|?J]WICJ]f:?B=cw\bКOo?_7w\bКOo?_B7}c$.|jXS"7[ $Q,{\' I_e};VZ֝-o()AGx vr~Xo.U?^> ,zwV=>XO?^=J*esfY'M;ytF\wLe9Su(5*j650c;W+~6MW H~ǧ#t붵Og<<UTF⦩VyH rxXٮDY#(x>i;!F8rB)/7n<]]&˫24kM#F ySҸ-)A62zTk}O:@V$ri(oݗEEl=kv\bm]' W:KZ1M]' WOϗz>wWsO#+z[ßXid@e t^?k _½8)$>BS%}WEy+K\ϰBir^ 1Ue);'3)EYy=E(v8W10#wHtQk5M:_;V ,P4wifcI5[qǧ#ȪVt^ u;<6BbuEV>⛻><nbp 1]o~'<5/dz}+ \י|cxd]c2۹{*~4ڥK#%ecWz懩èiҘ=wׇkf+ō^2B=^$0pW-b~| 6??G$گ\Ch|FZ {YO9^OX5ם*|jucV pٞOƒ^6)̶X'z|i^cIz^B>լ]V G?p^6/TZ4r/OmZ'*^Ov?u5^5;1e=O>fԓІ >?_]j&7 s1B.ZYղ8P H׵{}7OMAݏt O hi#e܏G=XtahsK<44ӿQEzƞ#@> N?WW~v5-6$4YV^BkïYem<]Ku_>#Lpx[_Ȳ|7.yL{J{0B9b!*Up͚ࡉݵ[gQX>׏+{'@OkGSli 9+nOۿm{\VUNMv;1N{9+_<$I#wc&SXi-ժe}A9>?χpC}& |gͯz~ku?R~fO_`ik (PF` .~U %(Ae |GJ_*/O-w ok 4jGf>W}E+k^EbA՚ffMn%%-RT։ 33M CAfc'ҽׁ꺬{5+ڱG`Z)]֭er)٣zwiEi{9&ån Z^upukJFkSPUԮu =ԍ+rz~+_iPI?`O |᚜\lTSv$Sz)sq3I+xy^)tzFP@TV\r{z\\tjWNV#Ed(HpExƯZQ.@@T' qXkGYoO  >!_jUΟw=ܱ\&ҮGoS3 WTSSV뾧},lUԂ}j:+ǼERoG 1dnv$~`nyIbܞ䜚mIxdf&rQ<*3_w8_Z[c2)onNuf|+4D@mǩ? )ky"thf٩m閰HcRWᮛi趑ju՟@'CB2VhjX׃h&]b1Go:ïJBjqR]OZ?%WeIvCֿ_ͫ$Ci8Xι744EnZx+׶]ZhsA2E WcRZ9z'F{Ů;2~$&@|[B?ƻ?YOtˈZ 27P;1Vy59qSd3Wצ<ܻci'{v 7Ko>v"(t;7`щKdտ> ##&ץF0Sq>YZ=_ t ^Ιn]I!B}:c^X\ZŅF+w)"zY]"6sUGXEGS*nykտgté^s7phμ0Q(toZZ,q ˖i6Bq}#jZu )Fz_1ju֑\imܣA+~2(ka4:䏨?]=iN+##O}#W?os,3+ٌTJ (~*xuCYV7>:̿|"c_aW|MXڄE!D!}fG„~]^mE캿?OD=KLyPp,ui3pWxpzدn5Ƿy>ڕhւvfRSж۷cҾmMF׍luSzbLw |d9w~URfrOҼ~8:-DY~*iV}Ls75k\RsdviB { nk~x]̖ſPyOs*RQnǣ*THoѱɯ6/GX>9tdac]R¨M~Sױ|dV0-Y3~4a=ziBU^;_Q\|Sk]kM)~z)IE])NB ?|NKRDrf}BJ$ұy$bǹ'$+œlq䂇ecg/ k_/|qyw]qj~9<b yx/XΔf4f}SDmEoV?A^>|oՅyI IHoW?B?+VtF'@=P?55W45ϓ >̵%*]BVE'Qg4uU!2Aw;;k}kEHSSA8t#ԁٯDjSWGW:p o g]kQس^ jAd|*ސP=kkzXx_@=+QYAn{96Nnh𒴞+zq}ʮڗ 4%-K\ 8NJJR}>2%}\H뛧SʩYZlgza}_PPii;]Rk[]xF bm/̫#n9)fl}-+^.~K9E,j0ºCCW9/ 뷞֭K'BxOU>[ѩ~; Tz(kV~!ѭ==C:7u>Z5'}Q2iQE1Q@u=Kնji֗> >Wĺ凅t7 Ļ!078U౳A!ws|>(ZLkV ?ˈGMd /Szֳ_^ɾysz`8RI94ɭU/ .#9vNpU"-??;+BkVhb翡wS\X]E{P6ӟ \27KȘtH1vboh4^ wΪ( {Mok{]o/ɊQƗ_5|6?]n?($5GSrEQ^f_4Ohw:]e\caX{_,kMޅ隂l}чfs_]ל|jWŝJ eQu+͈ήGb3tRzyէmO5},ϑZEЯz}>><ܾ5֜||g="xqT;\VysBnc׿FK'6KC0h$2Uw{G[ۯ{?>nZmY\$, ;xSXكWdL.nOCX%GN=6-62 Fߙp}]}Pwd}3IءSVRk[&/,W̮?co"z.-g%|}x7Mc+,hOs~G7<O{ pFbE0|Ï]l"F3[7cr? _ a[NG={玛W=5$nOcYүMBK Vc<U:z3#=z>Oʹja?x\nkO=ԲHrLYk:iZun72,h?S= F֗ܭEu_|*Ҭ nddB0=~UJ..)ԍHGfz!oEڻN?7p\m]O'w W|?9| ⒌ל}=Ϫȏה_">^1"ڇIzuWFG=s'g~)2ڿfUZVź;X_43Q;.;n|qb{^]z.cׂgIbOƫ| d kmٞVO\鵯ꖞKwo<]ҹJ` 3I>VB׺УIa/73ëx Y8=wokŭyEt{Io]ivթwy?.#W#%rQyUa=MrŘ4f{S݊Q[EguHԻ $ >=FzHg}NkW/ψmhmU/v/o{wiu>25:Om_cVGdu*He#LץuVx8o_ yrNgBkU#[Y-iW };o}C)GC_׸| -Zsg#:{{}+ Vф$ܙ2HƔQE"k_ /ji30inA8>)8ni c?xoRҬ.B$AO޺*U8-R4&ݽB(9Š(o&{[g.Trp; τ?z cb9y) jt].E)onP1=j#tQZrmA - I4N0"V#,~J[g!>cXaXr? /sHZRS V@?1ֽJSGE,Mj*Е- kJG5xw:?:5VMkQDi; UZrm|xX\a_*]nId') vOWC㊭o#-̚@ tddhx@.&yg[*r9J)՛o^–?GZR(PoG󲮓aZX(`dժ(VwaEP mແຆ9qE =h68=_i!OvYpO:qo뗊Ztidq؈+)/L p?#&/+!2(M? ߢi;"*bVW.޹OޥОv9ʮ}vUJ1Νjy) rOQ c_ݾTT(v6#Um+NEmn#AV9[mݔ5_gu(i0r=5—訔#-Z6IZiy _~֩u {7"I ~QKCojl( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?Image-Info-1.42/img/test-unknowncode.gif0000755000175000017500000000005311302320062017453 0ustar eserteeserteGIF89a!,D Image-Info-1.42/img/test.tif0000644000175000017500000000542011253753022015153 0ustar eserteeserteII*J?@$ BaPd6DbQ8"cQv=R9$MRdQLfS8܆i7Nee6PhR:GQid*MSiUOj޷]K$eHdSmQ-uRn>}/}>  rT.N{Gjm6$,|>)(=;PieX8FKdBveS# ˱D9xwv  t0~@ A ?˜Ƽi{8;{#P?/%ۺ/}A]Gv]&ɲ~'0>x*=GlJR1~;~`*&Pty%3N2E`."9;< /vDd3K"\!.BXx9uχ(6q:n[t{&#;i5`C0 b]b {fY:J @ Kb mCEK)B( (0'i8A`"HG81Q8P0L` Np0ŴD`PH޹edH)<-+5,`K{X7Hx!MGzgdk@*:8NCv2Kka<S 6 . ughs< %Yy+ʂ'ང,@ tD5yqq2L$ v 9gaG8xUqjrđ53rY7Z[4ېK| A }Z+@pP ($>]"|xXA0 0:P 0!0 Y} =Eh*`'4( TsP(fS,%zmiҧ927 ޛvH@>#:+zRypFH)7R`<<6:k ?br̻V2 3@{a C}X{H9/Ŵ&cA38Mmٚ'th3yN=KL}O?g] ?@$ BaPd6DbQ8"cQv=R9$MRdQLfS8<24   :F\-dlt(1:|=bbcolor.tifCreated with The GIMP =HHImageMagick 6.0.6 01/25/06 Q16 http://www.imagemagick.org&Y<2   (2(1: bb1bit.tifDithered B&W version of /tmp/aa1bit.tifHHImageMagick 6.0.6 01/25/06 Q16 http://www.imagemagick.orgxQ0 F/?j AXx ƭw])Vq'~}緯_{?XvOLjkcJDl'737*2:Ov\MpppHpPp΅+L{YO}|47>3Qn^~/_ޟ8v4"v[Vzgzx;8sUq!mwv蒪D]y/???.vMz} Iͮ7|zss{өs_?\՟+!G_w#hHntx\ѤCjNkCq"0%78yL &N7Q0@( <2    &2  (1: bbgrey.tifCreated with The GIMPHHImageMagick 6.0.6 01/25/06 Q16 http://www.imagemagick.orgImage-Info-1.42/img/test.pbm0000644000175000017500000003524311253753022015155 0ustar eserteeserteP4 400 300 jnݐݻ]u_wwogwoտkpwmݶ߿{o뾷~o۽Um\{Wۭ?8`m~m߾n}Wo[[uvw{@{n{ڭu`{߻޻߻o[u{]wo}{o_^kujnm޽k߷{vkݵ{}^m{ݭݺ@unonkkWh  @~֮ݽj eRuv}۫n{^{vw@o}_﮺m:R(߭}omwowmkmDPm>ݷ_X@ZT }wowx UUUQjH[_ݬjUVUTZoo{{ڠUZJ<onjVݮwUU+Bn}{i!UTR@UUUUUUT@o^UݮJH"@[U[ZU(ov[~5[]l@@A %TjUfoknz~o%%%P UU[kVVUJ^w_ZoRRR$PBmU͵UUUImwjjۿԉJR"UZڵjUj_޽_^*}T$Q*ڶVjI$]{")RHUIk]]UUUI^{wwݽj{@HRjnkUT޽ݵVڽvV"T*WkU]mUUUTݻ{m}o}Vi(UU%RUVnժUZUIwUkvڨ(RUT۪ZjRU.~vk{k}۷VJ$UKIUU[[VUUJ _U{ﵮmRjUVZRVmm{߮{zUV+UVVRҪZZ]ڕUZUUVֺUVw{ڿmu^Y6UjhVUUJRPݷo[w[~TJJUURmJj ڿmկUh֪JZ[ZUZU٪-m߿vu]Z*UU*ҪZZJ2?[~wU*UuJBEUZj]jJ}۾߯}jTZ֪ZUMZU*"vo_mZUEUUUU*UUU6UUVk߷w○}RUUUZ&UJRRJIMR_n]UڪUUjUUW~ڶVUUUVeVVUU*Bo?wUMVTںUUumVJYdu}エحRVkUՕUU]mSUUjۑBB"$_m}vmۿ[Vݺozjjꪬm$""uvwj[kURUUP l׀+w_[nJݶkSU$նJJZ&DB'}}{jU-jUmZ*"EnJ)!H\@7]ߵZ֪vnJյUUUU)*B61 @ ukUJJ*ժeUUj T$ S\!LyPU okoݶv % UZڢUUZYQUET ~ov P T Eڭ$UjhV"D 5 Hv޿!  *@%UMJZRD$$o(H"P`)A )!2@Q@A( [o]@@P$ "-URVDR%I U oڿ{_D (D@*UJA*A HJ( &! BI Rj$A BZIH]owm_sB@ B+ J,@ *I  }*H Ҡ) Q*%B!@H P *JQU H_Vw{ @" HXJDI%(( Ґ+CuM۵'T"D@Az "*PT [onޮoB@J@$I ȐUu_o+JPD(2E("@`@RR}wWUUQ*" A$@$H@HDBU*D-C)W^um[ 0EHDEH )PAA (=W߷m{!*"AJ(A  *JB"$T%ݷԚеu۴E{$T )R?}Q[_TP"BAPBD @ ]U"QR T"a$խb o[](@4J @+KJE@@(R oZm}_T H@5` nd$5@@($&Q *@MUm]J SU[Zo"  ){oJ{_}h$ ;vF ZտuUH,% ℀Iހ@$ %ڵUo֕Rr$ۻqwTO J JJVҿovݩTE f@ڸ7j(Ra I"оmJ @]/W}QX*gm!*p@IR^P $RJBڪYY%_)@m% o/MZV@~UAVhIb_$ `R)V$/Tɛ*_{$R!_ @nm;+B*v$}DBCP IUD [/MU@ P-QID@)"(^G()QP*bR$b?/UmMA2UH *"*KA$QmڪZ7Y RnMJ%{=FޯDM '\ӄ$JKE*E$ njӻt[JߛlS&hR*0U!~оIT J&۽iބn}JTޕwJ$J$EC_kB*"A?SRh)(%A!)IP (JEU]:j7 H ۔ҤR~T(DVD%[j-J$.}%DAA`P %w$ZǶ iVRJR$vNdI>EVodA&HTRT@5ZO"j|[P i fETEQ "E(M i ځ׈欯IjK$f ;6*R_oS6[)QP+T"(,a( E$hHP{ffrҪDlVR3Ћ6U}QD?/jhԩ$!R_0 $/-[gY^$ ubPQ (I RR2Ⱦ) +%@ j%$$"׿ Ѣ?"o)v̌* m+ xDJ%JoT JI]e UGEPДUh(YH!-_ŽI?$+UܜXWDT%*u *H*Jo} \ ( b B,2R{o$A_$UA% $JDUI@KFi?_yʨP'QD@\hF)oP$]TEw,VndRE%d1JBZdF+δdk_ۉ^JS]濵Z*ʂ*Q$_{~iyaXK~Uw*Rv dJ"6ǬVR!(6x_ZE_ߨ  &t ) !aM)]@UNT@+eE` GQQeKn+ԿwwR?2  (FBZTY U1ڷA~mJQ Ob I*kmt!VU[mЪTr&QT0֥lD S^FU%:VRաJ`%F"UUR̕Qou)}zU Z(kJڐ$TI_DDFVoKӿuQvmURd+CH;7HλSBZU•#@5o)oem_گ] vTI(YU}fjޭ߀M^EU@QFAZ g+Kovu? kFR QZ휲m_Uﺪ-@+"Q:`YLe.+_Ԡw}uZUARAi$tM+D ݷyoWU&L$HQ*a$սޫk@oڵm]u_ߵWߩ#e 4" jJ%RBvmw奪BUhZ$V:kovۭuR*(!N%_ZmwC*0 TS1渀&BVWjr[1T!*b!"ҕwY_nnmUUUm]ԓPPHi@CDA>EUo{oUj]U;5 (5 ֨@Yy嚯[m+U@UH o}(U׾eUm^~{*T_*ꂈ4B@Hh[۵Wo}uU_nUJJ"ʒnIe*SMy֪URUIzRj DbAQt^V}U_RRKƬФVVHN[w_TU+U[KBR"ӊR7ャtm{UUkUR*PTmMPW̾*O%J̻-Wv_xYUI{e}MJJMSk^o{[O]ݖU-H?v}-.EE@6JAJ߶ջ{{jVҢW*Ze"%ZkShH+mn}WkUVUT_šr^tM*V^UZk{{{~UVU%V/D%=+H&ֵB(+]}ުڪTJ;ڪ\BD2\߻.V׽{~}o֪UUJ"Pj%ejgM+]a-m~|'}ZUIETeu=H|n qO<ު}vUUTUew[%^*DVwJ^;WݷCڵVUU#jT}%H'ChRKyR]XUuUUUZXxU%IL(I-zT4*ФUUVnKJ*d%4"%u5M !]:V^jU%V]Hu"}R!*TZN'mU_~]TTQANUJV%Q TEڽVVnU+JʪPP(-&#$ )\%}v^omUVU%^H KF%\MRDJtmJkv_eknTԕDPEW/e)d)u[S[-Nu߻_UVR(G-] U5U.iYǎZֵwUUJJ_⪄HS'eUPuy]cejﮪUTԒQ!* "iuJױ `ǯv_n߿mrUJZJ }ujhԵO}~z꟟ݪ%(JP*jR/_mkW۶UR)A*(%N}JH׏m[[zmZU(HTZuJޮ]w?UUVV%T%TRԋ HfwH5ҫ{߶k;vݵUTB UK2N*K?]m׿5_nU_ RU"$RS=vUjխUU)IڋꪥݿW׽]/kUPRHU@=Jhwom_k_^eoUUMI4AM$BԖk߷뭻v"@ JSUwկ_oZ}jUADP;[ݻﺻ{wuT-(*@Cʁ8־zk[6AMHZ8hR~ou{Roݷ}tۿd*%ziBBh Wmvu]ۿwD! AXwBUmԪ׿zR]mmRR"Ъ(" u]I3w.گ}_X8?UZ׷Jm]JФ !֙m_tWY5mjڈ(-ZJPGm^¾"ZWޯojڵH. V~o[_wD r׷y'[mZT g**B$wW/[ʽW{)vOڴ@Q $~Zu^WeȊ)wOk{_HbVmtۊw߷{׉(֯ۼڶI.Y(zzTʵjֻnoM-#NQ[z'}P* PXWUm[oV4VjDg~@V ET$߿`ݮ۪տk^;T${]E)]Z!J3S!JAw־mڶBGjE(~vH&QTIZ@߻{k B`͈zh(VB J *}][T]ROm?H%*Dm}zBEJm*߯}v_X*蒦&(@\T Ud[j7&kmQ{=[rZB" ;z%}\¨[XUUۻ>huP(Lު+ڲQ*n%YwWij䂱ik))ADb"T}XibR}֭W{սUu^y.u@T@H dTTHBhmrP(eJ뷥jZֿy$y*(/ݻ_) 2R]UU 5\ճ1 jQPh%)(SԈB5vޫ5wv_-TBR&)H(ֿmp˥wխDUմY1ńH"!"!JД+߭ZMIVa[zw9Q"F Q %EPP_knkh)[oVYժB[WV@J%"J Swݗ5|/.fjq^KBJDTR E@(y\۪ԕdnw[{7 ;u]r(Q %7ov_z뛭R R.RJ3j{f $ U_5{rcWAXj;EkaPIjJK/_ﷷv o٥oWjTV$*UMU8մ!J%DDU{ړzseb@ΪJ&a${,H"nʷػ$JRSP imԈ*!mԒQ)Uo[oժz>BB R-dVE$B m!b @U۫^;?o֯V*!CK+ҥW4hAH"Tzϻ}ۿY;{r]龔-VR%j* T+w׭o= ;A5U֠OwDIUJ~ݛjڻUݯ (B]KO*Z!_˿ݷ_/ﲥ<{hWm)RHT )IVw[^ۥmVBں̝#E겥涵!Ul5_{۾DY~onr+Xl"Fu*ULVIk{WwwYjUړ}wwnI@jWnk[F#"Z̤/zvz"eJLuDW]}޷u-HDڕ-{ijҮժJR\)o^}oF^vmIH^սmkd\]UEksl׽jkn־.EKa]?UV;(&l]iv{{Յwb'UUmk2H}kWxAGQkWwݗcԨTԻ].kjTF( ~kjY~_KcY5zP w_UJETw?۟l޿j멖/گ*}oY/쭬)"ի;{vVD-zg0\eV$H/j5ުUUokz[kWm$Zߥ.TU-o[lnhm~tUS^WMu۷ou6tVU"?}'.Jۻ+]۾]UzvڰDMUZ~Uo9~MKɺۿ߿�d$5+5wJVoo(Okmnu+ڿjdll*{=ߖշSQ_o߿~~_}~kWT,Tz>o?{SO}nVnwꪭu咬-m*_V^{ԷoU]ԶVܪtzYջrʜO{o{Roj ϭ}U_m2nUYWt;m~rQz߻j+}ڻ}~-W.:n2LizjۿO]U$ۿwju%=߿mwZoeuUz&JJ[Iݶ_Z[IUm߾~}ݻJlRJ~eue}{ooT[5l%KUwj{^Jkw着ZXjJ߿oUoovJRTUjRU}/Wҭ_D^jnɿszj[__;T*iV%jko<߫[5Rݫ[uojҽyJʾ߿z~mojY'ޯv7uu}Z{mRWm_qN~nmI{]-n~vj~ݻ߾nվ߭_WhuM{v׻{[o$]_~Zww__﷿jo^{7}]o~u_tګWKm\VwwWwﶵj߻ߺVdkZ{ovޭU]~~TWm_kozw~U^k~V /i}W}{{vmo߷nWw{n^Uֿzګ+^rMwݫ[v}|ֿ?-S߷}UZ{vZۭ齾]wwn[o^uݿw}޶Y[VuڵԫU^{mk+!^ꪫZz^g[o}VݿU[+Z[e޺k]mj]޻_zUMZ"~~ۻ_}57_mYzWnݫoFuTwj_-Z6wmjݺ{z_U훭W׾}jjK߿A[k}kwݿzW~j覆߿V{j"{"߾wݽݶ?o-V~Zj[vJUjݷ__}om{߫UuKuu]_N߶Tۻֶ߽Tj_}ԥcf]߿[_|WjRubH~[uo[_TIZ]Qn[^m~EzURVjUlz{oImage-Info-1.42/img/test.xpm0000644000175000017500000000337011253753022015177 0ustar eserteeserte/* XPM */ static char * test_xpm[] = { "127 13 2 1", " c None", ". c SkyBlue", "...............................................................................................................................", "...............................................................................................................................", "...............................................................................................................................", "...............................................................................................................................", "...............................................................................................................................", "...............................................................................................................................", "...............................................................................................................................", "...............................................................................................................................", "...............................................................................................................................", "...............................................................................................................................", "...............................................................................................................................", "...............................................................................................................................", "..............................................................................................................................."}; Image-Info-1.42/img/le.tif0000644000175000017500000000064011253753022014573 0ustar eserteeserteII*FxԱ 1~a [$1zAxMQ#0  8=@H(1PP=Rle.tifHHImageMagick 6.2.5 02/13/06 Q16 file:/usr/share/ImageMagick-6.2.5/doc/index.htmlImage-Info-1.42/img/bad-exif-1.jpg0000644000175000017500000007257612127107667016040 0ustar eserteeserteJFIFKK HExifII*V 0100 N F 'P02210  (            | 0100    2012:11:22 02:58:23- =0("I   4&1BJJ Ej " # ' ( -. / `@`8x5DI IMG:PowerShot A3100 IS JPEGFirmware Version 1.00sl t [z0n0nueud@] ub[b[UZ`TTkYWU85:-p ,(b  dd  Qg."II*5  2012:11:22 02:58:23n } "       (2 i2@ 2012:11:22 02:58:23Canon PowerShot A3100 ISCanon C     C   ,," }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?X&*&G^JGzm^O1a ܎*')k7> WqSYϠ>Ɋj2#/Fi_s 5рwКby$|_k?*]i %W;]S5{Ws>@!{zu+q$~**T}s|B;XoKABc+ςZ >-֓+VVBvq}^Q]0pÉ++*R-"y1K(XknW掝я*C#5'=(ؒcN\֧(0ħ0$&Fʟ&3T槍Dc5K^kCjXrMh+sBoaY25ȫN ahWTzҋqڧ}8"6+ pGJzk@p+>k(|S:Ui5 F*(ﳐ9ʝUR+i!j{Ԓ)aF1y{)۹P:qփD!@GJ4hcAkKt0:SP(Үcʁ#!OG0KI8V9^hXpF+nnr6S]:o@==M.k k/qB3>ϹZ1-NN68Op_?\ +ƹURKdRF rς_yc=B;",=v>n:Rӱ9l =l²yz.ȷ w$_V7՟Zvd@ ?|^YRw>nKC hc1Ƭ7ިIP?ZcxC\[I\ :%'2 k"[voP @~MKB·FJ:5PXOsz(B/}ʖ?t-cs ӭɴ1g_\%y|=Ļ;+vi84U=3N0~\ysZO^((<  n*1M4]X[`P:ՐOJp \cϽ4ǎժ,sHmҗ:cfgHS{Vt) fÔn9*D/jr8m(؋ ֜Y@18,@7Eܑb:5 u\ln7$eWM4hw(IնQL'NSE(cS ~tJojOZ[3J$T8GVv)1SvRF9OfK}Mp֣|9Ol[΍u^1ۦ1w'X . kڢ{-˼\};*KO0W$ X۩)\v9%5_P-Gs[/꒰$me8\mE 5K=<K>p3?=?!rO65XIe|3ƺ_?hjPmc# +'\>/Ks˴-m> ^YGI9+~gqQgm!&6YocdGn}^8/8CZe@SQ; sL9uSc}R?2h3vj5@MW0P6 p9=}zӖu=i2yJjEgBiBХSRu, 1wOJxlլ)I=qUv+x,XLShp : h@3ץD [Ihj34ۓ5x!x_5]IqSWL&RBc&D5e: nH)݁OJ_'#RO|})zhoE&qC!=nԎKM"ăM7Kq1d~}+\00c?Ғ+,n a!4A ҧŁ,E%3*vZ%E޶çk3Run*$v޻s?o*I=~jO:8y¶Q=o_ĉ(,DK p}ߠXm㕆'eߡ}8tR7u\o#{CCc\漌֯>"Yøt**/|7aF8[;?5A\#uդ?t*Gl֖Owe$\qP_r@yfɤ;/Zm83xT滜E,A?F+SUR\qaNG*4XC~d=c+xw]m4r|:1I3kjE-Mf8y-|+]xci%5oo5ao +A2©Vs_wX6MIլ~HGſCrN]ڶ WlFO ~}OWhd 93 W}ƞq\̋ 4xע)e`ggڟ/,2XZXƓ_ K]<ÿ|5e+kAq]*ndy>|.6}+\׀m'ޥ3WS{`*"{jK#/gugd]5=KUЮnkmgSv:۱ܸwFg`Np)$Mgy"qlLuC|>x{`2\-&lHN=oHeNI 't +dDтH%O(.^cN֝W?m40-#xZ-"Ν c&4 nV 챕 x{q5ۊUx|MjjVpYaQו5'wڻ]t<߳ &h7kbl0V+]V1%ɚ< `+~jex,,*jn㧝f4:Sm;;)m/&Ǐci=z|8OeRj.K=54H䀆$<ׯ!^:8{'Ir<5_PO]yI>RI%/~Z?5[F/&?Fyme^+B)DE@{{iDAғ_+KMg9XLU~CE-k_qswag!̶6w8=ST|7Mse6"Par?Mz(G@  Фۯrg!VOY7/ٳB6%WQ2Z@8KOk.KUڷPi݋^mM7< 'J>Do88^ k-v_qz' WZ+..rfKJMC|s᧏ 3^ LhP\Kt;e_׿S^5{3_x\ݞ:^nEnPѭ?t\MEa'nrBsޢ}%E,X{k>Jla[@8z* _>UficiƾwB2^Iz3}7OjSUh%޾ҿi9#X8=_"(gӭq|NQQgkj`E fIq]OM1 \ZSc+;O]6]SwnC$wP~#`zlo:=K|X¾?= :SQnszf-{sM?njXE/驋08AZ n )!4Sێ08*3mhV~t®}kTZ QiAٍv 3?Zҝ2GB}/jSl[ij zBu*EC0_15weY]xYqEpiBW(ٯS`7:nWꕅ>G~Z" vőɯS#h66wZ_*y#Dg1L[kmnh~dJŪN3?W+6z î H?;;8S#^}k xhA"03VE[{Sc$ZR s3Hc4{$cfJ?G57'i`HrpUҴޔ}#{%h;SqWEN^ȣt*(SQ^ȡHb'ִ˃K~):f_h>-(0~='կeԟeL{#+ɣɭCn%;.hȯfey\t/Zf{39miүM?LT:("=M>-9&E֧!"!iDYԁ vIW:ZO"rta|/2&&~V6[A=_`v|!x^Ni+漏e˜PoSgPg5ki~qdʏ ־'jpG2֫ukKfICWϗ _ß3dٮ-)ykϾ>D?w?W[B;SdμNG41?t G' ᦼ(t~r|WԿ~;xyʹbQW랃qi׶Aq2zο">$j#"0 ‰HK Ζ9-wwe%K*n8*kZi//[_ԗ61^o*e1@5e\v_+gcE&|fs/ΑpiL!Oߊp(M)bAB?Bzg=H%-+y?a.3%/!OZS H#')+Kab4 cÔpK{~?,:ʊ?QJbi@LiAOGB7 S{ V1IOސk3G0rr݇VFXQ!O4B p}}rsPpVfnIb!x&R4lx'5J-dFEeiQDs7h}*ұ*lGAumAvIP\jc54g,גއ 4_^1KL4ޘڭڽ)aGWbW[꒿cY_9[Ii,kGN{WV.mom|dk 1H,NXc?Q=-G>gxT>}Uqb/K*qלFu%, ;|+aOPOaL!#UqU9hϬp~QimO.?hB1աhO*R'#'_F=#Mon+R׼?.t0_;`iμTx4{Li`cjr-ru5-.NHlnpY0aWN~-z+3Cܥcă鰓 o'$V-w0 )T~UY!n;MƋr֙=^.⦪61wܙwMM1ִ.0xkئ!폭;.݈b2.zӌczڗSt |==žumԜ ֹ9b;Ily!5[IAv> h\fiԍJjo4xӻ<2 Lj:Ԃ(Ӡ_4VR@bib=i'MMz҅g58')EcTO,[/)Yү-,=?i?g6e#I4޶?ZZKa^OsHb^SI¨i:ELVrr>;nҡ<y4~(!~"FSV5MTqfSQJ # ,.EΩjHWҬXX0GN:l)kOfځiAҼB:qGSb(aS愯{|U?.-y\}LgOvcC<$W#pi޽|+uߧs7;3ڲ K _ɐT2 ]|<dy w'9cF<=VAÏnAb+y!qC@l՞@ c69s^;3~~ʭxJno ~CTᾹ]%{z(K9xadd*?#{3|ٍ|_doKT¾}߲9(+("#8D4|Mt{Kx~u#;Sˀ:Ro"b?Sfӻ :ҚYi wWhRH|OMZȣsl9i<2m^a hpg4Mp)Sn"H"%Ԋ;w%8,}CsJPd=16^GDz2_EB|mRW+*O_zg7N몲I \D,7WW?Aot蚮,)2 Ew`^_yC<}o?%f_X4lW' ,ie{oc`X9__퐁,gpۿ_=l7aqP+s#XF"#cנ:p ;x|{NMCUS$2<25hfX9`x8#{{e<5jtqcqL]iֿ+--䴹 qQUU đB \*_I9$y#ӞաgPjt%V4b8,0ABJR[L; ³i~R}BҮm~n8(Ϲ_cJĩ}vmipl|) U=:ҪpХ$s.#0jVg6FaXpBj\ibPeN@=ּNiQX:%?jINh X1玕?YY3&ӯ%! 15)nE&B*NzVmfF1mĿj]AV"p>mMhUZXjӒOۣ#q=j n|)u\/ 4rrsOZtoz8XܢS)Ne3[^& 8"zul?:|"񟈾kW.!wJY vߴ_/DY>Lه͜pOlxb]+Ro&1r7Oegs4hlUZ桄\<u&H&윎3TWžn-EڮIA\ _x[[;l40[,!YS*⼷Ru?Ee(˖}֞ψM]n@ cWz'=mBUO9p[!.@ͼ`kZY"<珂{Wu q>G?RFskljOJY`&վA(Vhn'eԭ`IKX|U3GΤ }&fZϭ7= Ԟu9M'}j<)G=+ë́.vDHT'L/lW־& xD2 ZխȣrSџ.b6-d8?Pd]+[' }5:U UC"X**Ƥ~nk~gzUϘUc|Tvuٖ]I<> ṃxK$9'bZ0 }k'IhhRNpQ2M*ALMiP Jz*]va6+7D OiRtX溚e^@Ǹ5K⾫E(hx.~iWE ˬc~khD`9+UVիQ4=gsg%inG_x^N2P0_:k u-9fdf34/{ΒC$ֲ.<{TZ]iJǬ,]8b!x}/2(`3c^1ֺ-"h+$ &yR)qѬn8jX!"_2NNNsY}^Tb-,f66Aп dsҹ|?t*ƥsI$c?wY\FmE6d Y+;U2%|^_Xjd^aop6/$O8Y76t?fq H-]ݎ*s ~ך>lEϑ1^/s~ [ 4ycc~e.P"oIpA1^1 ' 勂Hh:3ZZ\w?H`nt(&l7>7z~l/ 6  tm/Pt2r##/W?I>)Ek~\Od)_3 \nO0gg>]z'RPRoCOz}W3`cmV |F,íبUSWi}g֐^6٢P&9#Ҹ~7kgH|ƈ?.IƪNt>׭4]Cl-+V?vχQz-kO$b M`` n;27h krbfł ],v 8Ŵ+A@I#5Ջ^'e$on-N$7_j'ecl)f܎ÑکcJWOsl\pzji6P`y˂8ȯ!4-`A 1־T]N(e<믱M*+)Ƿ)Y\׫Z\!$|J."6q>(O g~z;<k,r#ʺK שR^jE#|m֚ e4&XNѳֲieTY>pwv+7ijOo{o8y$3E5gc'?i$=GZF #<*v~lp)3()f<cs{YݮZz< fw]'!N;UkP{X.-B&.~Ś%χ"6>pGAkZi)UP7=q] xN Qו(_䯰uFsZ~iaգN'zv%'s]Oj{dX؍PW~k7:e m?wxzLZnqDL"Iأz$枻bhO7֭_RXem>H$ B>맸֙ +{xʨ\ym9۽qY Nǜg++U,oe34HdhIz*ZQ|Dm%=7tkC0X(*[F[jtydIaNx=8͚?r]e#+"G&ϾsV`Kc5muI˝ffjl%ij;SpFfN|'iXs&W]uv F/m1,O?Ujo>$1i+ !5ޱtR:8u:5cUѢTϯ֯5|#ڼ W9[2܃&`项n>D=C<9X7#Q+?(#Awf8\W^f.d3ƹUrc3^]-zN-,go̚vs&-߹y6}ViA\ߋvCP4f,{ f-l4XCgu%Ο$ nI1Htj_3"G6$>ҽG·Z9{2]Y\|B YJ*xZ5)bf'VVR[d׺ğ:tɒ^mm/I"۷.DϾNyng ^h{pAbֹvfm 9~۸>ZtR캷ݝ\>' S|u*5-ҍW?auBDʩK;^-oo/M±vbpG8 >:h#6)-lCG ^6޿J54=)!'EY^C14"v ?|ڽLSMꏖ-jYeN7|B&wH@l}]RePOج!oֺk_kRi3_Y9uIl R0qڥG_i^ZOɎK HxW/z6dm8M? 5uOjvOk2mzN+wC:X%܄i,5xΣWk:6OS K&U q ?AHIoo(DG#^k"<#_͋ "Nvc"kS,n ~odRf/e/ZI.%Y\H${qXm P\:zc8 /&Ԭ~q)1Oj0Ј]]ʥ?gklXR;^Sm3jFsnYm8=^Zsrieԍ T% [q?7/P˘姚@C"G^gfKJbm PF pW eAXs_I~^g3*+tpm8m*)$ O j7<ROM{|gFHyKjgAbV7+O a z^>[~ތxF'2ڸ"[qʗ֗ ]銗Fm6_m}q]P%E<.TT/yy~.rS]"ܰiEmw*FP/@R8늄EujvY㶐pgQGhvs$IƼė>R| 5[wFI+9;t!Np쏖19G}5Hx淣.qk\]— q8lחCʰ|&)KeYeU?.Mr؈Z#G|ԍq HK0[yzҾzR)rXxUpScWtAB*n\z%a' mVoSI ͂OW:uCN[Erp>6zòx gRT늚X[j,%ZNQc[y#]߅q"Mn`i9qWt_WKxkf#Br*f]PۅB#T)rpa+4z3L@eaHt6_<_ۋKOR>+c&P"56CYsq ЂW+UQΎ;\Fy#=il0c?"ׂOǵ}=8saӦsR8#Z6^2:ㆳlkf4eH tz *"F#;=yK ?F{\-m̏$W*ǁzvnGֹ}{? -JB| 3[<񖭯iZ3Ym kB] $x͂0OV)Ꞟ8uZ#-ͺpcMԚ1`r+>Oؓ7wwS[x٣9a 3ȍ 0SIi]n@osPym|ȿt_[fbnq?-\~)Yi1^Bm˿lfW,EGe)xʒU!Ч%(_|y v ,V!+Q50i @H J sq![7mÑQw|ٗ}bv,\gL)cdv9[zU6D֫c$25+-W.JTuhzM䳆WKy*c:v\Ԋ.WE3G,{CnTjF1 <s^9NfRSvra)t]uMQ}{k)[7xn6PB\,r2ǫGi) (י>yMiOص*nϺ;˫][KH]tC$b5GMy-/=q[V~# c\Tʧ4w}Hf`cVѴc3.-~٣BA^Ķ8' sɬdKv̸ME:}*]2] = ̟w\]3VGmFJ#b`@#ڴA`COXxvIBˡX5at9sږ̚HoCn`֜7Q $S0yUe6kx2_C[y$aSq\N@rB y,Nzծo|ėS8<}=ZHY7nv`Bz1sWJ;=OJa(ٻ-=>tMhgkkIrNz<WzzZXr]^Vּ+[Nh̓/%3)~@=?*t}utYٕd 1^wI '.f$ onѵ_:Ljyj8@c8T|P`Huqq(3!|sֹk}V]^lh[Sb7M[kom&pnGR$xwO]JF #! 6nyi a ԜdjսTo-K>D2qN{n匫R6z5Ӭ:<*LHHdYVyo+#0EF__zu GJ.A o֥kMD W= K7`9*ZJ:{}3ڤ FxLT8ӌr>lK}5ˉgIPOlu&4'k?:ÒӍjR垇Im#$UoA%ꖐd\q\gMFdCi Rft$=&]Bw@[$hg({7}ipp@pZ.GkcwjXRa}M [E^_qեZ]ʌFzn@oi\L d)"e7'zc{tw`JRR2eji>:$]yv A켎=tڵn9- EHm}Ƹ=KUF*HK-YTTVF/nmGs w7P$lg*Y%m-OOcx.iב х\G;WOfӼ=siq9yBUNSݪeN0՝Z:S: k%M[/g0Fx85&j.myUĤWX`Al#!PC7=A乺HnP\k O=)# oInϫ%K3FfgmI0ȯQukۍI昉/dsNdEg#ڳ 0+c Vu+[S~ 6\z~J Do5[;Ge#!Q?^q:syG!ExϊlSŏ)t23k-wˈ6}yϥsf6Te_M~U }0JMZw\j ÆX+YGH7<Ȩw\]ǂϴ"I1ÎsJ}NdNq]dIgXv}kgMUfVy:?8GC+91=~siTdji}kx m|g/PKSJT,~]]|;-u)q,oOה,~Ni:*/(s.fMwxO[UO1,}sJ)4Yˡ1gs|׬fV,Qc|6/w(ea,RUmǭoW}>-cr"H'TC*Nd'"z/8$WMi*5HI7YR9e&Ifff c5rMsJKGz>_Z6myrMŤ l,#'u+~m-3ӟz  è.$K+dU@_xU$J'<=:ʭцgu :{|&w=͜vo tn}N6Y~#㞘+NH,iZ9aޙ1wEO|&(mGvծGweIl3m<AZ/r"bn6 aҼ*i4 ]Էl#FGo1MkW fy8_a]J.jE5 AwevkpG}+7źm Ku'r S[ڔK04Q5.e}Qȕx?1SE)^vмNYJ.qקiZֹ+q m7e?I9'w:vkGrmIYøuW MҮb.~Zo%4b![v^R쟽]m;$q7.oE nt zdc=ig/+jPw`c [3m-p SRm^q+yly`>eԄ_6czV塞WkʎH'ީ53ldOZkۉ ̬i4z߲OS\Fh >R;k4)x6X2]Ks$e5Ӷo'85 SՎKȣլs)Eo2MŴ"dec{+ LI8K2QV<3<7RMl}~Tm:˸4EY%VBDCgU/e꫈.;S?)}Da ya֤60;[D!Uu\_5辗(Oss[YMxw ,:gԵ3;ԟg`v8=~vaAIG:nEQu@XWu2U1loOmole\7q|AE:[DD $ؑpnwu}' @+;Mgy s,-#o_ֹV}-O2\i`4^RsS'}V7FvdXI+(?\Ԯ$կ፰7s5)t6i\Image-Info-1.42/img/interlace.png0000644000175000017500000001134011253753022016142 0ustar eserteesertePNG  IHDRd; pHYs  tIME +ڨtEXtCommentCreated with The GIMPd%nVIDATx]ixU%IgCBB. "\."\|D8L3:::3þ zȾ LسKz_8N:NөGΩS_|9_a4MA]ue.@E!:MKJJMNk)*mgX'Ϟ]aA_WwR[5թ];kWDsɇmAoO~1:8,zvi:sD&E䞺CxQ| <] ݺg٣o%/2jP_2.|TA\H_qFѹmnsIe@=kچ 0# xw)>m~ofb̗F/hև3A`!*}Y;7tLOiQ1nXLWPS|Փۛ.d>X*Hn'4BF dЬnաpvTBS{l1MCJ=rMbbՋڊXBꙶ 5Sfe܉h>5+ھڳڿy f՗PiIyzjo2{3+65.^-Va{bK1* ;[u6Nm3H笈ޏ܈F3Z&U:B f#_{Ёk] 9P@L- *t*J2iäU#i8#u!vϬ2Ce5w`S vAܦSm hד k>h6pm1/jۜyPQBѬ2fEb@4k4.E"uw4xG]gc|.i{(dPIƉy-ͭEE>?g)`b wVz>E3 ^w) ~ڈ_#{v:^|SZWKe177i C9vY7;ֵN_ڑ!.~HtaMë 1'%,*m蒬.힋`>]<|T@Iei8'HV.BV>2KvgHm1Q<n?sjʂH:0tŵ?&;k|(m=xr+߾S˾}$L!ڧG);ö㽃W~V m 7hlN]>D]?C-ZeXCS/\ZZzN6b{C^D&q ac0pf$}ʋrSwC4"+~v:I[ҭY_w =m?,gWK*ik_%bRMϣ},Cvf{brxǐ7Zȳqq2AfrHo 3 Y%ɛsOK9|4E1لda",,6bbbbŒŒrFxY}܍=$N_dt != 'PyIg:,tKvy.;lmުd.$PzCv"S Rf=MaF_/P>Lֽf>$hdž}u@Ez(},!ȱd YEǒ.,w!3 |og kB;6}χ^#kdODc~ݛu@o )%c|`_{l85br/W-~$8LqFi;z tGkm<  S'7t7[>Ο\ x"]eW]HMS'NYrSm҉YҡFp]ƒ"8&X`ł VX,Xb +,,xpQ`恡QH!zls6~g;˻_8R$%f30L29P6nߡ3 }_[>Ӆ#c}pvb3 Qvڨ#$!,Y|bKRInU#/la6PV3$w$|555 i}Ʋf2esN%>\8﹪|*,GJ酼^cCos ,cyJS_nRY-&J^dS|gߊz޹b *Tmkmk0ximnҠ?cO0\tyls} wgoӬQBXU _-/{ a=Sv'[㰆ʶU>󃊚bST"oҜhnIF]3ª7Ok7.R 6 Tاd86/?n7b:CCOVUO)(2*ɭ~ʚk-B r{:A` [TC欈owG Wu6+!8;;Y,w10 <3iڻZ0/Y:R> ԆnҎ1mMQ܅ /c` +,NIu&BaQ*,J 4>" EcpG"x*Xz@ >U8c5̔gW5<`T\it?h0wZ?-ҞTm(" 2qǯ}IX57 Łog#mi$- p+U^l(4ɀ31D $]NB%0u8PXB Jd!r0.Nk.Q a&ͧ͘/|@܊i JU1oQM w)=+,2.0ՋPCi++,gTIYaKz,Ĩ#,2.%qab`[AXa!/qKDž|MAX np 36E1Npcޞ@Msc. l"t`‘?/]L\'bL?bC6ftS ksf9 8c)? qgD=Ae_1H\W]:ek/n<sWE#ffr*? ҵhJlé>WO;Er{=_v= K.nCjYv,\w_)F$+8aj.ˈ}OJ{+˩iF^e9c;Mђi|ڷ]A[v8GҖXƑO$\lcm#nq䴶9ɍC^!J3Z&TOx{LW/szh8}k2Y!/6e{-R0z" W]9z6lhO9BQcqО&.;!$OX0ўy6@mݼl,s" `2g ]$ ;TeUǚ 8؞"6d8 VaX\H'''A^LB@w!SJOcIwoƠeO+c˄cW=A犙cwU;OJC+Ioc-éłʾdg ִQ [x =jJ A+6XS'84T@Pht3,,$l!=^M1bmWFsPyk@dcz>kYs+9+oen7z$`Ib)2ȅ[UK/̏Eôp Eo-ı] yr{ɮ5eK۶ WLa(RܣSFj5EO[vȖȻrj=b+.NVvu2TLK;jblq)<~Ml\4p^6o fG>UKOEG#o({U5rl Xsɮg1ǧM<,s~s8kfDmEk/5-np2x³ U<6*pԥy(RFH횆8]mRMh*'۽tVcЫ$~?z)C}Y$ri@}?ZK=6,P{7ِĚhfٕwoPs ϿYYbcn~98_;Q̌=8~~Ub$rצ-|`ۻ!" 3C;n5g 4A D̎b.ҥ7UFo";MFJ$[_Jֺ}Uڇ@}j;Mky$}r>xmym7<^{Ja#Ic,6]!}ɦD+fmFN@;CMs /!ZT۝ S9nKy[Z]jYœkZɵDƹO)Yس$8CHy CLC 1~I =qIi}-H;cjmw;!_>'H̠(8{/"b̳Cz}MqײŕW!$A+ӭ,2S1=OХht,#9tWxtkSBw'ҽwKimHU@@=EuQ?W{_H5 G@>B)s[^M2gNxuח]saQ,+oRĖRC:YNׄ{e=֋y#b7=<TZҸͯk*r; {YR pv> ዳ\p3.|ii4 I6uEb4z*V4"Z)P$2;uǥ_m&.6^o$Sx&3V=ӥt7,@0N@t3ОYũAm] Ҧx8}A7Xǘ]v=~#,v- 뮋m&/Dң]=?GZꭼO[,KyXLDkשx{CMB%ikM3QT8h'&[.6;֐PJD`xi<29=N=>Ѧ/@OxKOm8r$$T]Xm{佦ʱ'v#^k;ybHLgd *)g=1T<:gIv*1ےRx.Ծ)iy 29zLGᐯ'(]+ 4Woe=fw9X~k Qwu$D'#vM,4řay= `$m횥>asy괐!e+_BQdA6o y9`8RLNOzjQ[](F^'vw6F1(8I=g*ycVvV:Cܘw߆$hyu;K|#7TܒWy? G_MzeɌ-1]IhQ{Z>,c{< 4է͎W7`OcJ[>H!r;?B"d{'n<ǓD\Nab%\7{ hj:e6|Ït kE7epsӑ?*ԕ=:Q\5I!gI:CbiτВ>O-Bsӭi [O1|ۉ9Nk6%Pݩ-57"F_`xq^#IꖇPWz~q]GpF]`벲fTd*`^jVRy$*@n:օƒ<EUlxS]{X+ St6HO *ލ-ďs={ZGܧ`qXL6lI%dGƵ4_L ]q֬iF$Њ"S} F2]y`qүA4-H̹9KkIg>m1 b'_!GRcadd!)9$h$Nw)Yj# .ӑes+,ԮluWV8$>NGju4HF.a1{W F0*&IbA$8u"FVI͊NOCV(sGs]Vm=*ewMûY'մ&!cOo$lW%̑dJ2LŦ\!'ZP0 )0gR2I ?7`p}{vv-r8VI:-3sUn.J@qңP 20/Lq@Ϳ';a3FUI~Oʟ0H <ˤ\[_ # sұIX['8+:?ݜzӽk%5ܩ$0@s݉±Rf`Đs93403/o~ W[yx9zQU~R3-Q]qZXbyr5Fzc-F0H)%Υ#䎋Jy.d+;q"5étѵyeb 6y9翧55~D#ʌu[U BG ~+\xlQK[ UYe@u:x5t%܄9:kYR5ܤJu:[x [Ё'xr<5WQ- 1JfY9W#z(5wL,˵Jg|&pzs&Fl٩\7D['k0:R [^}qN}:_1bX>r\ș d.|NHp~i5:/'28$xy4f$KXn1)luڽZOs[F 0 SP~R =k2~cfbr=EWϛcynPG3@$V*QErGgDcY4Q\Էf-xA㎵u)is2S/~[4+f%[Ae;[5]̮fGPW5`V+vL=aҫj&6DO(f ӽ9w9псʵ(N[E/ny^? Z `UzPZ v)'0E4aX:rGe&?Wu8ƹ|_ЍkTHowSO l9f:of]XWܿM2~3{ӜqKuk3oHwl|~0<^J1{I]'Lz}^=@I C5)ſob0xpxk|7F<DcsAamèMo+p]֞^F4@ՠÈ$G-X_긦5>rڪ˵d]~C-O'O=rh,auk5VrVqv%UJ+fjuVgUg';K\;Z٣lk!ņ=mwNe pzmBkC\w4g2tq_]ch`t==t'#';TAaFԓ.6 "n?c 9z٭Fea5mWA ,Yn^va@lUNGϋkV @$u.8a 1'F6LwAs)>[( *^+j;c;S=lݔxu5Gk&$M|\k*!"1 #2A$3B04[y?O"qڨaGV.-R*V iaCjګlSx[UiM+،sD:kބLej'QYEnO*'d%`3_K!hzU̖5`k 􀩖xu\xu=;ۮBD鼌'2ey&*QC3znC^ %80>/mmN 6͠V1NAoRq7 2zNgBQ_~ kwJV0V/FC jfa+$Q- e|c|38|6WEv*@1 9^5kbbW8g71p&s܏&.W6~#)»ߝ|s4Ze+ʪ+;51-h9'?y41kZR= clG#^O0frmZ_m1 :'\RC6n~S&݆[܌NBzqII-.p[KjAzG ȃ/\QˋTt 켮wGꝏfZ6}v3ۜKa8]9zga8,<8LjfѪ!zXA3ٰܪFnKEh !ݑs }&c&<,o0BVqX͛ C[#vD<k*g\8e(@+V`=TBn=dz "=U7R&b -ӟUSU,3 ^grճn+a 'S{}2SBǥh+l[ f=׎[ 5_\3JrA3o4_棟>PlI,8[w)}a,OQqIQƖ˴27Ld3Kt yk[nO[kVK~ֲN5T Bq6،䮞W>q4f&?=|rh4Y]ޭh\ۏ-o T;%qXϖ:GSU30ZMf>s&! 01A"2Qaq?\ [&Eb1]ybfL{'P !c0 J.:lfeу".qhcXw 3eS u<GkL|}*sjgu:ԵdJ V{ܩl˲\0} ,.@. KWN3|q*ܮ۷s"ANMW|6I*fGŏfecMXFkIfAN_ cוWruŋ MORNAa%r bVM%aKSt瑸VeꯉҚtθ$A]P{NOQh|Х ґz໚\qf]ȩgZQԩ6yk):E_ {S'.xink[EDbuʏO U+:4Ԝq!C=M4FgWde7's5XDui}0{?|,4;^pRS-:a.5O7U:b^:eW<?!^θAtB;5ؒ4PPiQp*)SaSNzT*iJfgVjū,hE\ElE: K\qe>Orx'$z*ߩ)Z?ԣ1m KByr^'b'\; edV$ SQL3E0zK-1nŶU5ti}t)^[ֈ: ݍ!xu3= Ƅ[SGƕϭOfKy52Q~+Qs-Kf9DE=a_~EEg*fZl^푌]Rz-oɜ]:fGJ̐[tKԏ,; M7™+h^ <l*iQ;\N=Uzk8ͿHG ԡZSt%|?a_mFG|t(d|اRd,ńT~>Dlf\}J;܊k3NꡚHrִ]jHR+JI3B&!WIzv\rariiBl'̤USi[VG8v>x[Ve\&%SZIݕaং갫{<]UER.%<[%#DZ$OQ' }2R1J݈hYcДyx?q.t{~E+6qRK5\(ߓl mmH(jk4ei35?D2~GW).TyiZp)-WFjT`ᒮHD'$f.ǡn=3o >Ҫd [NGTߧn[D2I&fX+m.2Nq{Uʶ3OVܨŒ8F^*ǚ%j_aMJ(6M ]EN-, ukԯ\д]zzIӽ6WUY$z y58 *U "L_Mӛ5Vt5 S6g[N1܈,Wo{NR{ .w$xHqTRQD{M.ZϮ~8G$a =]cv*tzeɭ}=;u\eўtO Q4Z{T_^̦W|SPyY8jDgVcu{Sc[ 9t#rYv_N}V/d˿.%GU-jNQeJV{ᡗR8Нq[v-t''!1AQaq ?! C4s*ic9PG#h*2y ؅u9&L2єqU#C 2r \JHXZ"j%iu0BRHuun"dj+*klnep_EbqFIp+ȶt5Pъb yO-lؖqMJr0m)G rK xWQS/8azԱD[t#䜰qh"x\Bgq1lGt KìGJh*40'iX2ڮ%i9fPl{[ay [*%pƂ\D|k^Qp b.~Q˓ Ks1_,*Q):E=`z&Lt+2 wK$\0YJ$-s:07f=ez}Pڶ jR0cRFj _j s?;a3- NFTOHYKᅾ,n Y߬$ze+~y%C%t=085\9{A(\AmA Xh,,~/V LgslUX,˂5lYP„/ܘ!>ef 9ATB"f%D59cwH7*S6~à"/=~EweP&HdWD|Cvk{PoM}p BT%Ł"ΐFj>D6YL</Q®eDt5,ܤu"5(fiW_䀷Afڟ}!Zz#[5[ \-p&At*T/hgDlg7EhKpaVyb;ЧGVLL/)~5JYj\̸넦QݦËZ讑@Bڢl}ctofaZ!ۧBFGmqhXEˏDbqŁHa'xQ/KSM*f)GSr)p6bߓ_D1Y ^[2ܼ( > e$sJNQee#Vs.rXOXEe}UGl_^fTV}& Xff%]Ⱥuny/lT"PkJLb^/,纕^c 6|*wf Cm)z"g$s [Kl,pCd'#\3>ciEœc7-Y3d]MKD*ufEf D ׇ~pmvŅf]FGo3DӺagEm[տ&t,Vow@Ǭ?2>0s)urg {H4":AU&5Z#rc‡rLeᦺHd)\aľڙzȈukPpֿKeJS59rDŽ:PvI1ŒႷY 3ms *_ꔄc TTWzA`I,*!~"wX.fO (K`@+pNX0m=(+DSZu\Xtb3#?t @Ekr"铥*ψZ.Peh9,5J r0 KU tW1Vy+ZxJ,fpE4K3-44^_.nf s_20J\ٯ%W,e;kqc 3v[ɕ8JS ?PufҢRd:= LNps.6<2JTSd^ҒiCƙQdWTٚֆ*ғݟ17 xh\(X>!w\ 53iBޱ+ELBµNΧ{@107rʢm*L;Jw9pc &֚wƴ˞iGC[YL]%>"(e9w~ _n(uMeWX<_(g;#s5oi!lJ8n^5\%>y*UP[IыT!hpB/^%[3\KT38,56dq@I'dx0slcf8v;T*q30#=.sfa;{Y ^-HlpеHc/&ZlcGI6IA1(f"HFk=A /A2V:E jޖq 闘yohU҄{#UCh5-rM/ Rh*鷴`7g!WvB;ژWOxd`52ra/OBQrZDc+͟W͓!q7hy{{C@U]`uB RSЅ03V xeO82,;FʔT=|ܰ_,d9&QbzDo .paYg38!H5f"a̩_Q_OIUh_S*̹QVsLG";`@5!Bp -p{17Ms=Nuy OǔO`-C%M>+NpBv0^&E luQGD"eg0$ǖP)V=YbP2Eq bQ=DB͗ qH;*Xq=) 鸚w97,R! W\#KK20ǫ-OwRBFo_I#RpJ\Zd7ڈG*P b+(4n:|9H,r9 }`V:ìb,Q K2& 2%0wek(S*[jmzv%^`T1 rP.dbB1ZP )rshf[39XՋes+J3=F^]EXf|)6a&FK3P[ u \[L#ksҹEX'HL%,n yv}]fq>#M6>g.ffA9ec <"]흢.рE"t1l\KD σܷ64cC G?4{c|S0w.؄UefJ]#9"ap[s{G-emap\DL`ٖ6AejRhP@7s&wu5@#Н8q&k sϣRD{{ UP{W7*F2̪.`/4F=RGr؆em[sJDs7*k .Дu}RR%9fPW*_e1ie(p2SCht#t镹(n7;J-9~Ga!P6|/vw9ǤlIN{ń;{a I!~5j27geE$ӬGrIʅ JCCslgYR _hs1~ u'1.#e:;To!?$Og!!1Aa Qq?~ o1crU$RAn% OiQ P¨"n:-/ ^< A7FbhpF gb[pٺ&ĺ4aexn6bFz(_oh鰢i2d_W:Eo%Kȸ ΊQ!6?3F?c.#UTO_HH8͎S1 'iyP%+@tɩ"N'F_*u Bmml*:Q󉭖^7^r l*SQԢv/ !;rnӦ3)BTWO=Ch3]8) k@G,"Jb4Q+t]~1):~%u)C^1 Ulh򚠠x`!xFz#4vD53:3 G\/|d Blz:"Ģ=O5 85#u;L i.'JYFVmu\P`LE'K;b+"t(z=]魊& ` }{ûQ7Ӭ5<ੂql_y2*I΂t PREC`t&7a$JW(4_˯"w_GF-c uُF MqM! xqxUoNgzoa:k_ 6 NGpro2\нƓolYrN]xPB즓(^9qf/-k HD/Рn: s}*@iZK"te SJ̔^&sE?,17B1F4t r/ғȞߌ ZT 8MqM9o* y&(>AA2$F'n~3_S"߳`SfgɄ'ְp4 (ȆQ) \YVKFSs"pT q2w:&X(u6wQ%f(G# E; jp^^U?9 M+q[YwqCГ2ы]=KAw/`)5?P m^\ֈ}_U=m>$.ߍR^^ɔ ?+H/(n=^v~pg@<͏iV/Oo8e*d?)SW ߮9BsB6W"-)! k{ 'xC`'-ykoI.w%E Cl1s9ST!:ӎB k/k ZO+'IGWNl:g/}^Fu×pEW>ivtDy" ?|J役RHk2R0c{Q,_8JVVw|Nr7S_ ( BA 4!?KAx|OjB^p{lCv~B ;=5;t2!P5K×@O:T FNBkA2茷xdR]IvP-e@{bVȅ<q|cPǎ(ޯ>ZdsxHCףu[O]I0;y=<;?n@\h0i݀PC_KEQ0 yW@~!Gg\@SbdtMN].l=|k}\C-Ӧqɑly{<~pB~>$F~ƛT;+Eʜ㾥Kd>c 4_9Ҋ԰N6ӻ ]?:|k%6l8MP\\x u}z)fR~1H<׼ePOY v8X^?͝QE^| z{d;eXR"`J֩y{D˾nF=,];]~ v6sޜ=2)EaV/xO0!CO$`=‰DR-\Td,t4][7g) W.zow:}ɉoS8'K۱Y[ʚ=!Ƽ?&/C-.8vuˊh^l頑p66{ ScBw)gwx𨅅0pHpt0GbYzJT-Hh3[FdtN3-4,4FqshfL/tҋ|9rmOߜ60 `w|umUqa|‹:"=*/Rq^t` 4^ʕ2GGC&hXD7v C^D\EP}m%&$BhLU2˹|Q`&LSLcil|̣M?~i:/U SN84:/_lF܋Q#TOLN's'42x6ZG7~@qj-zlHө}~:^HZ/W#3ҩ8ӕKJ_]PC vp('aדYQQ;r\y&mJL9RbQ2B:`X}>;ή:c((9~8nSi "As*?MA֠G허<)^sO;ޓDC?q뀪_zyNAa^ rF!�J6mC.[)7.0iTv_킇BSǣXw֡o1I7*DO8#*7NѬꐪWufoؒy6QvǜT/s\%G`{^Ū }!MlA᤹A[]N0~?0^#斞sXENfI~Pb^Y(jOtE88wCoS.ITj=pfB*o^GݬBQ Eu鯳(4 FeuTޢO}]A_$${au `l) N"`#g\PݓDsΊt2ԊclGկɦ.ʉQ4 pzc$Xr/Q1ӣwE]_^\"#qî|'n?iz}bEkp\(SU7+D^u1Wz8}>Sˊ(9} <&"'A~pC^$zҘ[7+A-5"”T{1CBaNqzɄ]t[ay:X7@%PEqbagrY"m(sdMY]m04m${r~nq#KqREj!4gɣi]W`5}5Viļ,LzФh;j`AKO 6w?zv{{ o8J6%j|1 TN>bKY>ir$ zehwצySX2=e]pp"ht(PU:8U/Zx.gL 3:ƫcS"#L[@]״(N2Nx^}xd05L9C5ns0=̪5B#Bk1Tjmվ}l]V=DްVX,jֿ(P2BZzƢvNzAQ> ߩK,#èzJvZ/n3+_&Q)AS6t@H|K@*2ao:%s5kWB|bBj9S޾rˡ oS9Ngmhj!5l Muz)OS?aVfDR qHTqJ'}^4k^ ~i?^i'{5Ԡe_p#O1Wu_5}òM @pvtw vO,n #΃3 pݡ,F/'8]Q7PB/ 4(B >$tK n:G&l b86X"}E/Yg% y;p&DR*r8% ħ%vK­LIqg<]p>@'3$A O>~xPRN{1% w( M8 DL[wc^&hDwH~2}"fUtN|aHQKߧ'J8@1Vt̕sM9&0p2PjSW&<|uȂ7:*Mkhv^b]^‘X2bb&0 MoD;:>[6שpA9dX@JvǾbAt<+'H`7.J*Pw?yTu󍆽_>=rPI G_!6#?F9!^2eyƷE5ra`lN jrz?e'N tg%Kj8rc9AѶ-dN0Usֺh5͈KfiO(u⮨JdHl.F#bmt~1Z'PZWX%jy{\!W@;;Vk^ p8\.`fXn!T*<8Cf@>;7,2[X,|?@2L&kkH$i&DhzdTUUUJRTfA> sf@xkZmus\en /˲,"dX,9|a(aRE$i,e0(ii麮:dgg4BOO,tll1EQ&D$i{`kz޹xVBh4jm0EQY`0`Y)Ai= >?OV\8|~xI'eCj "zTXtSoftwarex+//.NN,H/J6XS\IENDB`Image-Info-1.42/t/0000755000175000017500000000000013552530422013157 5ustar eserteeserteImage-Info-1.42/t/fuji_s1000fd_substr_outside_of_string.t0000755000175000017500000000051511302305677022655 0ustar eserteeserteuse strict; use FindBin; use Test::More tests => 5; BEGIN { use_ok( 'Image::Info' ) } my @widths = qw/10 10/; for(0..1) { my $info = Image::Info::image_info("$FindBin::Bin/../img/test$_-fuji.jpg"); is($info->{error}, undef, "No error for test$_-fuji.jpg"); is($info->{width}, $widths[$_], "Correct width detected"); } Image-Info-1.42/t/pod_cov.t0000755000175000017500000000155512151042374015004 0ustar eserteeserte#!/usr/bin/perl -w use Test::More; use strict; if (!eval q{ use Test::Pod::Coverage 1.00; 1 }) { plan skip_all => "Test::Pod::Coverage 1.00 required for testing POD coverage"; exit 0; } my @mod_defs = ( ['Info'], ['Info::BMP'], ['Info::PPM'], ['Info::SVG'], ['Info::XBM'], ['Info::XPM'], ['Info::TIFF'], ['TIFF', uncovered => 1], ['Info::GIF', uncovered => 1], ['Info::PNG', uncovered => 1], ['Info::JPEG', uncovered => 1], ); plan tests => scalar @mod_defs; for my $mod_def (@mod_defs) { my $mod = 'Image::' . shift(@$mod_def); my %test_opts = @$mod_def; local $TODO; if ($test_opts{uncovered}) { $TODO = "$mod is not yet covered"; } SKIP: { skip "Cannot test Pod coverage of $mod, maybe prereqs are missing", 1 if !eval qq{ require $mod; 1 }; pod_coverage_ok($mod, "$mod is covered"); } } Image-Info-1.42/t/webp.t0000644000175000017500000000305613551664101014306 0ustar eserteeserte#!/usr/bin/perl -w use strict; use FindBin; use Test::More; use Image::Info qw(image_info); plan tests => 21; my $img_dir = "$FindBin::RealBin/../img"; my $i = image_info("$img_dir/test.webp") || die ("Couldn't read test.webp: $!"); is ($i->{file_ext}, 'webp', 'WebP'); is ($i->{file_media_type}, 'image/webp', 'media_type'); is ($i->{Compression}, 'VP8', 'lossy compression'); is ($i->{width}, 320, 'width'); is ($i->{height}, 240, 'height'); $i = image_info("$img_dir/test-lossless.webp") || die ("Couldn't read test-lossless.webp: $!"); is ($i->{file_ext}, 'webp', 'WebP'); is ($i->{file_media_type}, 'image/webp', 'media_type'); is ($i->{Compression}, 'Lossless', 'lossless compression'); is ($i->{width}, 150, 'width'); is ($i->{height}, 113, 'height'); $i = image_info("$img_dir/test-exif.webp") || die ("Couldn't read test-exif.webp: $!"); is ($i->{file_ext}, 'webp', 'WebP'); is ($i->{file_media_type}, 'image/webp', 'media_type'); is ($i->{Compression}, 'VP8', 'lossy compression'); is ($i->{width}, 320, 'width'); is ($i->{height}, 240, 'height'); # Note that this file has a length header where one octet is 0x0A, meaning that # it will fail the file magic test if the //s flag is removed from the regex. $i = image_info("$img_dir/anim.webp") || die ("Couldn't read test-exif.webp: $!"); is ($i->{file_ext}, 'webp', 'WebP'); is ($i->{file_media_type}, 'image/webp', 'media_type'); is ($i->{Animation}, 1, 'animation'); is ($i->{Compression}, undef, 'no compression given for animations'); is ($i->{width}, 1, 'width'); is ($i->{height}, 1, 'height'); Image-Info-1.42/t/pod.t0000644000175000017500000000106611253753022014130 0ustar eserteeserte#!/usr/bin/perl -w use Test::More; use strict; my $tests; BEGIN { $tests = 11; plan tests => $tests; chdir 't' if -d 't'; use lib '../lib'; }; SKIP: { skip( 'Test::Pod not installed on this system', $tests ) unless do { eval ("use Test::Pod;"); $@ ? 0 : 1; }; for my $m (qw[ Info.pm TIFF.pm Info/BMP.pm Info/GIF.pm Info/JPEG.pm Info/PNG.pm Info/PPM.pm Info/SVG.pm Info/TIFF.pm Info/XBM.pm Info/XPM.pm ]) { pod_file_ok( '../lib/Image/' . $m ); } } Image-Info-1.42/t/bmp.t0000644000175000017500000000200612045265412014120 0ustar eserteeserte#!/usr/bin/perl -w use Test::More; use strict; BEGIN { plan tests => 11; chdir 't' if -d 't'; use lib '../lib'; use lib '../blib'; use_ok ("Image::Info") or die($@); }; use Image::Info qw(image_info dim); { # test RLE encoded bitmaps my $i = image_info("../img/test.rle") || die ("Couldn't read test.rle: $!"); #use Data::Dumper; print Dumper($i), "\n"; is ($i->{Compression}, 'RLE8', 'Compression'); is ($i->{BitsPerSample}, '8', 'BitsPerSample'); is ($i->{SamplesPerPixel}, 1, 'SamplesPerPixel'); is ($i->{file_media_type}, 'image/bmp', 'image/bmp'); is ($i->{BMP_ColorsImportant}, 255, '255 colors'); is ($i->{ColorTableSize}, 255, '255 colors'); is ($i->{BMP_Origin}, 1, 'BMP_Origin'); is ($i->{color_type}, 'Indexed-RGB', 'color_type'); is (dim($i), '64x64', 'dim()'); } { # test bitmap with negative height (https://rt.cpan.org/Ticket/Display.html?id=78471) my $i = image_info("../img/upside-down.bmp") || die ("Couldn't read test.rle: $!"); is (dim($i), '2x3', 'dim() (negative height)'); } Image-Info-1.42/t/xpm.t0000755000175000017500000000147112726316652014167 0ustar eserteeserte#!/usr/bin/perl use warnings; use strict; use Test::More; BEGIN { plan tests => 9; chdir 't' if -d 't'; use lib '../lib'; use lib '../blib'; use_ok ("Image::Info") or die $@; }; use Image::Info qw(image_info dim); SKIP: { skip 'Image::Xpm needed for the test', 8 unless eval { require Image::Xpm }; my $i = image_info("../img/test.xpm") || die ("Couldn't read test.xpm: $!"); # use Data::Dumper; print Dumper($i), "\n"; is ($i->{ColorResolution}, 8, 'ColorResoltuion'); is ($i->{BitsPerSample}, 8, 'BitsPerSample'); is ($i->{SamplesPerPixel}, 1, 'SamplesPerPixel'); is ($i->{file_media_type}, 'image/x-xpixmap', 'media type'); is ($i->{ColorTableSize}, 2, '2 colors'); is ($i->{color_type}, 'Indexed-RGB', 'color_type'); is ($i->{file_ext}, 'xpm', 'file_ext'); is (dim($i), '127x13', 'dim()'); } Image-Info-1.42/t/png.t0000755000175000017500000000540413221676045014143 0ustar eserteeserte#!/usr/bin/perl -w use Test::More; use strict; # test PNG files BEGIN { plan tests => 22; chdir 't' if -d 't'; use lib '../lib'; use_ok ("Image::Info") or die($@); }; use Image::Info qw(image_info dim); my $i = image_info("../img/test.png") || die ("Couldn't read test.png: $!"); is ($i->{color_type}, 'Indexed-RGB', 'color_type'); is ($i->{LastModificationTime}, "2006-07-16 12:28:31", 'LastModificationTime'); is ($i->{file_ext}, 'png', 'png'); is ($i->{file_media_type}, 'image/png', 'media_type'); is ($i->{SampleFormat}, 'U4', 'SampleFormat'); is (dim($i), '150x113', 'dim()'); is_deeply ( $i->{ColorPalette}, [ '#171617', '#c8ced6', '#8d929b', '#75787f', '#565961', '#2f3033', '#fefefd', '#613e2f', '#a6acb6', '#e6ecf2', '#40464d', '#805d4b' ], 'ColorPalette' ); ############################################################################# # interlace test $i = image_info("../img/interlace.png") || die ("Couldn't read interlace.png: $!"); is ($i->{color_type}, 'RGB', 'color_type'); is ($i->{LastModificationTime}, "2006-07-16 12:32:43", 'LastModificationTime'); is ($i->{SampleFormat}, 'U8', 'SampleFormat'); is ($i->{Interlace}, 'Adam7', 'Interlace'); is ($i->{Compression}, 'Deflate', 'Compression'); is ($i->{PNG_Filter}, 'Adaptive', 'PNG_Filter'); is ($i->{file_ext}, 'png', 'png'); is ($i->{file_media_type}, 'image/png', 'media_type'); is ($i->{Comment}, 'Created with The GIMP', 'Comment'); is (dim($i), '200x100', 'dim()'); ############################################################################# # ztxt test SKIP: { skip 'Need Compress::Zlib for this ztxt test', 1 if !eval { require Compress::Zlib; 1 }; # Used to emit warnings (https://rt.cpan.org/Ticket/Display.html?id=28054) $i = image_info("../img/ztxt.png") || die ("Couldn't read ztxt.png: $!"); is ($i->{comment}, "some image comment\n", 'ztxt comment'); } ############################################################################# # itxt tests SKIP: { skip 'Need Encode for this itxt test', 3 if !eval { require Encode; 1 }; # test files generated with pngcrush, which actually honours the spec: $i = image_info("../img/itxt.png") || die ("Couldn't read itxt.png: $!"); is ($i->{Comment}, "\x{1F42A}", 'itxt comment'); # keywords such as Comment are case sensitive. skip 'Need Compress::Zlib for this itxt test', 2 if !eval { require Compress::Zlib; 1 }; $i = image_info("../img/itxt2.png") || die ("Couldn't read itxt2.png: $!"); is ($i->{Comment}, "Perl Rules", 'compressed itxt comment'); $i = image_info("../img/itxt3.png") || die ("Couldn't read itxt3.png: $!"); is ($i->{Comment}, "\x{2E18}Success\x{203D}", 'compressed itxt comment'); } Image-Info-1.42/t/xbm.t0000755000175000017500000000137412726316652014153 0ustar eserteeserte#!/usr/bin/perl use warnings; use strict; use Test::More; BEGIN { plan tests => 8; chdir 't' if -d 't'; use lib '../lib'; use lib '../blib'; use_ok ("Image::Info") or die $@; }; use Image::Info qw(image_info dim); SKIP: { skip 'Image::Xbm needed for the test', 7 unless eval { require Image::Xbm }; my $i = image_info("../img/test.xbm") || die ("Couldn't read test.xbm: $!"); # use Data::Dumper; diag Dumper($i), "\n"; is ($i->{BitsPerSample}, 1, 'BitsPerSample'); is ($i->{SamplesPerPixel}, 1, 'SamplesPerPixel'); is ($i->{file_media_type}, 'image/x-xbitmap', 'media type'); is ($i->{ColorTableSize}, 2, '2 colors'); is ($i->{color_type}, 'Grey', 'color_type'); is ($i->{file_ext}, 'xbm', 'file_ext'); is (dim($i), '6x6', 'dim()'); } Image-Info-1.42/t/00_basics.t0000644000175000017500000000273211253753022015112 0ustar eserteeserte#!/usr/bin/perl -w use Test::More; use strict; use File::Spec; # test exporting of functions plus the basics BEGIN { plan tests => 11; chdir 't' if -d 't'; use lib '../lib'; use_ok ("Image::Info") or die($@); }; use Image::Info qw(image_info dim html_dim determine_file_format image_type); my $test = File::Spec->catfile( File::Spec->updir(), 'img', 'test.gif'); my $info = image_info($test); ############################################################################# # dim, html_dim my @dim = dim($info); is (join(" ", @dim), "200 150", 'dim()'); is (dim($info), '200x150', 'dim($info)'); is (html_dim($info), 'width="200" height="150"', 'html_dim()'); is (html_dim(image_info('README')), '', 'no README in info'); ############################################################################# # image_type my $type = image_type($test); if (is (ref($type), 'HASH', 'got hash from image_type')) { is ($type->{file_type}, 'GIF', 'image_type is GIF'); } else { fail ('image_type'); } $type = image_type($test.'non-existant'); if (is (ref($type), 'HASH', 'got hash from image_type')) { ok (exists $type->{error}, '{error} got set'); ok (exists $type->{Errno}, '{Errno} got set'); } else { fail ('image_type with error'); fail ('image_type with error'); } ############################################################################# # determine_file_format is (determine_file_format('GIF87a'), 'GIF', 'determine_file_format is GIF'); Image-Info-1.42/t/tiff_segfault.t0000755000175000017500000000051512445124505016173 0ustar eserteeserte#!/usr/bin/perl -w use strict; use FindBin; use Test::More 'no_plan'; use Image::Info qw(image_info); sub slurp ($) { open my $fh, shift or die $!; local $/; <$fh> } # test case for RT #100847 my $imgdata = slurp "$FindBin::RealBin/../img/segfault.tif"; my $info = image_info \$imgdata; ok $info->{error}, 'should not segfault'; Image-Info-1.42/t/exif.t0000644000175000017500000000150111253753022014273 0ustar eserteeserte#!/usr/bin/perl -w use Test::More; use strict; # Some basic tests for Exif extraction. Highly incomplete. BEGIN { plan tests => 7; chdir 't' if -d 't'; use lib '../lib'; use_ok ("Image::Info") or die($@); }; use Image::Info qw(image_info dim); my $i = image_info("../img/test.jpg") || die; #use Data::Dumper; print Dumper($i), "\n"; is ($i->{DateTimeDigitized}, "1999:12:06 16:38:40", 'DateTimeDigitized'); is ($i->{Make}, "OLYMPUS OPTICAL CO.,LTD", 'Make'); # test parsing of MakerNote (especially that there are no trailing \x00): # this is a "UNDEFINED" value with trailing zeros \x00: is ($i->{'Olympus-CameraID'}, 'OLYMPUS DIGITAL CAMERA', 'Olympus-CameraID'); isnt ($i->{UserComment}, "ASCII", 'UserComment'); like ($i->{UserComment}, qr/^\s+\z/, 'UserComment'); is (dim($i), '320x240', 'dim()'); Image-Info-1.42/t/string.t0000755000175000017500000000434413126167624014671 0ustar eserteeserte#!/usr/bin/perl -w # Load file into a string into memory and then test it use strict; use Test::More; use File::Basename qw(basename); use File::Spec; my $tests_per_file; BEGIN { $tests_per_file = 3 } my (@tests, $tests); BEGIN { @tests = grep { !/\.wbmp$/ } glob("img/test*"); $tests = (scalar @tests) * $tests_per_file; plan tests => $tests; chdir 't' if -d 't'; use lib '../lib'; }; my $requires = { xpm => ['Image::Xpm'], xbm => ['Image::Xbm'], svg => ['XML::LibXML::Reader', 'XML::Simple'], }; my $expected_warnings = { 'test-unknowncode.gif' => 'Unknown introduced code 10, ignoring following chunks', 'test-corruptchunk.jpg' => 'Corrupt JPEG data, 4 extraneous bytes before marker 0xdb', }; SKIP: { skip( 'Need either Perl 5.008 or greater, or IO::String for these tests', $tests ) unless $] >= 5.008 || do { eval "use IO::String;"; $@ ? 0 : 1; }; use Image::Info qw(image_info); my $updir = File::Spec->updir(); TESTFILES: for my $f (@tests) { # extract the extension of the image file $f =~ /\.([a-z]+)\z/i; my $x = lc($1 || ''); SKIP: { # test for loading the nec. library if (exists $requires->{$x}) { for my $r (@{ $requires->{$x} }) { skip( "Need $r for this test", $tests_per_file ) && next TESTFILES unless do { eval "use $r;"; $@ ? 0 : 1; }; } } # 2 tests follow: my $file = File::Spec->catfile($updir,$f); my $base = basename $file; my $h1 = image_info($file); is ($h1->{error}, undef, "no error with $base"); my $expected_warning = $expected_warnings->{$base}; is ($h1->{Warn}, $expected_warning, "no/expected warning with $base") or do { require Data::Dumper; diag Data::Dumper::Dumper($h1->{Warn}) }; my $img = cat($file); my $h2 = image_info(\$img); is_deeply ($h1, $h2, "image_info for $file on file and string yields the same"); } # end inner SKIP } # end for each file } # end SKIP all block sub cat { my $file = shift; local(*F, $/); open(F, $file) || die "Can't open $file: $!"; binmode F; my $c = ; close(F); $c; } Image-Info-1.42/t/tiny-pgm.t0000644000175000017500000000140411334747267015124 0ustar eserteeserte#!/usr/bin/perl -w use Test::More; use strict; # test dim(), html_dim() and image_info() BEGIN { plan tests => 7; chdir 't' if -d 't'; use lib '../lib'; use_ok ("Image::Info") or die($@); }; use Image::Info qw(image_info); my $h = image_info("../img/tiny.pgm") || die ("Cannot read tiny.pgm: $!"); #use Data::Dumper; print STDERR "# ", Data::Dumper::Dumper($h), "\n"; is ($h->{file_media_type}, "image/pgm", 'file_media_type'); is ($h->{width}, 1, 'width=1'); is ($h->{height}, 1, 'height=1'); { my $ppm16data = "P6 1 1 65535\nxxxxxx"; my $i = image_info(\$ppm16data); ok($i, "read 16-bit/sample ppm"); is_deeply ($i->{BitsPerSample}, [ 16, 16, 16 ], "BitsPerSample=16,16,16"); is ($i->{SamplesPerPixel}, 3, "SamplesPerPixel=3"); } Image-Info-1.42/t/svg.t0000755000175000017500000000461313221676045014157 0ustar eserteeserte#!/usr/bin/perl -w use Test::More; use strict; # test SVG images BEGIN { chdir 't' if -d 't'; use lib '../lib'; if (!eval { require XML::LibXML::Reader; require XML::Simple; 1 } && !eval { require XML::Simple; 1 } ) { plan skip_all => "Need XML::Simple or XML::LibXML::Reader for this test"; } plan tests => 13; } use Image::Info qw(image_info dim); my $i = image_info("../img/test.svg") || die ("Couldn't read test.svg: $!"); { no warnings 'once'; diag "Using SVG module $Image::Info::SVG::USING_MODULE"; diag "XML::Simple $XML::Simple::VERSION" if defined $XML::Simple::VERSION; if (defined $XML::SAX::ParserPackage) { no strict 'refs'; my $ver = ${ $XML::SAX::ParserPackage . "::VERSION" }; diag "XML::SAX::ParserPackage $XML::SAX::ParserPackage $ver"; } diag "XML::LibXML::Reader $XML::LibXML::Reader::VERSION" if defined $XML::LibXML::Reader::VERSION; diag "Compiled against libxml2 version: " . XML::LibXML::LIBXML_VERSION() if defined &XML::LibXML::LIBXML_VERSION; diag "Running libxml2 version: " . XML::LibXML::LIBXML_RUNTIME_VERSION() if defined &XML::LibXML::LIBXML_VERSION; } #use Data::Dumper; print Dumper($i), "\n"; is ($i->{color_type}, 'sRGB', 'color_type'); is ($i->{file_media_type}, 'image/svg+xml', 'file_media_type'); is ($i->{SVG_StandAlone}, 'yes', 'SVG_StandAlone'); is ($i->{file_ext}, 'svg', 'file_ext'); is ($i->{SVG_Version}, 'unknown', 'SVG_Version unknown'); is (dim($i), '4inx3in', 'dim()'); ############################################################################# # second test file $i = image_info("../img/graph.svg") || die ("Couldn't read graph.svg: $!"); #use Data::Dumper; print Dumper($i), "\n"; is ($i->{SVG_StandAlone}, 'yes', 'SVG_StandAlone'); is ($i->{file_ext}, 'svg', 'file_ext'); is ($i->{file_media_type}, 'image/svg+xml', 'file_media_type'); is ($i->{SVG_Title}, 'Untitled graph', 'title'); is ($i->{SVG_Version}, '1.1', 'SVG_Version 1.1'); is (dim($i), '209x51', 'dim()'); ############################################################################# # first file without xml preamble { my $buf; { open my $fh, "../img/test.svg" or die $!; local $/ = \4096; while (<$fh>) { $buf .= $_; } } $buf =~ s{^<\?xml.*?>}{}; # strip XML preamble $i = image_info(\$buf); is ($i->{file_media_type}, 'image/svg+xml', 'file_media_type (svg without xml preamble)'); } Image-Info-1.42/t/bad_exif.t0000644000175000017500000000076212231141447015110 0ustar eserteeserteuse strict; use warnings; use FindBin qw( $Bin ); use Test::More tests => 3; use Image::Info; { my @warnings; local $SIG{__WARN__} = sub { push @warnings, @_ }; local $^W = 1; my $info = Image::Info::image_info("$Bin/../img/bad-exif-1.jpg"); ok( ! $info->{error}, "no error on bad EXIF data" ) or diag( "Got Error: $info->{error}" ); is( join("\n", @{ $info->{resolution} }), "75 dpi\n3314/3306 dpi", "resolution as expected" ); isnt "@warnings", "", 'seen expected warnings'; } Image-Info-1.42/t/jpg_corruptchunk.t0000644000175000017500000000073312101456522016733 0ustar eserteeserteuse strict; use FindBin; use Test::More; plan tests => 3; use Image::Info 'dim', 'image_info'; my $img_dir = "$FindBin::RealBin/../img"; my $info = image_info "$img_dir/test-corruptchunk.jpg"; is $info->{Warn}, "Corrupt JPEG data, 4 extraneous bytes before marker 0xdb", 'found warn entry' or do { require Data::Dumper; diag(Data::Dumper->new([$info],[qw()])->Indent(1)->Useqq(1)->Dump) }; my($w,$h) = dim $info; is $w, 8, 'dimensions could still be read'; is $h, 8; Image-Info-1.42/t/wbmp.t0000644000175000017500000000052512101452256014310 0ustar eserteeserteuse strict; use FindBin; use Test::More; plan tests => 4; use Image::Info 'dim'; use Image::Info::WBMP 'wbmp_image_info'; my $img_dir = "$FindBin::RealBin/../img"; my $info = wbmp_image_info "$img_dir/test.wbmp"; my($w,$h) = dim $info; is $info->{file_media_type}, "image/vnd.wap.wbmp"; is $info->{file_ext}, "wbmp"; is $w, 8; is $h, 8; Image-Info-1.42/t/jpg_ignore_thumbnail.t0000644000175000017500000000041112163245220017522 0ustar eserteeserteuse strict; use warnings; use FindBin qw( $Bin ); use Test::More tests => 1; use Image::Info; { my $info = Image::Info::image_info("$Bin/../img/no-thumbnail.jpg"); ok( ! $info->{error}, "no error on bad thumbnail" ) or diag( "Got Error: $info->{error}" ); } Image-Info-1.42/t/jpg_hang.t0000644000175000017500000000114711253753022015123 0ustar eserteeserte#!/usr/bin/perl -w use Test::More; use strict; BEGIN { chdir 't' if -d 't'; use lib '../blib/'; use lib '../lib/'; plan tests => 2; } use Image::Info qw(image_info dim); # This image caused hangs in earlier versions (bug #26127/#26130) due to # a cycle in the IFDs: eval { local $SIG{ALRM} = sub { die "oops - did hang\n" }; alarm 5; my $i = image_info("../img/cynic_hang.jpg"); is (ref($i), 'HASH', 'image_info ran'); ok (!exists $i->{error}, 'image_info ran ok'); alarm 0; }; if ($@) { # propagate unexpected errors die unless $@ eq "oops - did hang\n"; # timed out } 1; Image-Info-1.42/t/tiff_e.t0000644000175000017500000000162311253753022014601 0ustar eserteeserte#!/usr/bin/perl -w # Test the same TIFF file in little and big endian use Test::More; use strict; BEGIN { chdir 't' if -d 't'; use lib '../blib/'; use lib '../lib/'; plan tests => 10; } use Image::Info qw(image_info); ## ## TIFF Little Endian file ## my @le = image_info("../img/le.tif"); ok ( @le, 'TIFF Little Endian: image_info ran ok'); is ( @le, 1, 'One image found' ); is ( $le[0]->{SamplesPerPixel}, 4, 'SamplesPerPixel is 4' ); is ( $le[0]->{width}, 260, 'Width is right for the image'); is ( $le[0]->{height}, 6, 'Height is right for the image'); ## ## TIFF Big Endian file ## my @be = image_info("../img/be.tif"); ok ( @be, 'TIFF Big Endian: image_info ran ok'); is ( @be, 1, 'One image found' ); is ( $be[0]->{SamplesPerPixel}, 4, 'SamplesPerPixel is 4' ); is ( $be[0]->{width}, 260, 'Width is right for the image'); is ( $be[0]->{height}, 6, 'Height is right for the image'); 1; Image-Info-1.42/t/ico.t0000755000175000017500000000074311302305677014130 0ustar eserteeserte#!/usr/bin/perl -w use strict; use FindBin; use Test::More; plan tests => 5; use Image::Info qw(image_info dim); my(@i) = image_info("$FindBin::RealBin/../img/test.ico") or die "Couldn't read test.ico: $!"; #use Data::Dumper; print Dumper(\@i), "\n"; is($i[0]->{file_ext}, 'ico', 'ext'); is($i[0]->{file_media_type}, 'image/x-icon', 'media type'); is($i[0]->{colors}, 256); is(dim($i[0]), '24x24', 'dim() of first image'); is(dim($i[1]), '16x16', 'dim() of second image'); Image-Info-1.42/t/tiff.t0000644000175000017500000000451713007033324014275 0ustar eserteeserte#!/usr/bin/perl -w use Test::More; use strict; BEGIN { chdir 't' if -d 't'; use lib '../blib/'; use lib '../lib/'; plan tests => 19; } use Image::Info qw(image_info dim); ## This TIFF file has 3 images, in 24-bit colour, 1-bit mono and 8-bit grey. my @i = image_info("../img/test.tif"); ok ( @i, 'image_info ran ok'); is ( @i, 3, 'Right number of images found' ); ## First image is ( scalar @{$i[0]->{BitsPerSample}}, 3 , 'Three lots of BitsPerSample for full-colour image' ); is ( $i[0]->{SamplesPerPixel}, 3, 'SamplesPerPixel is 3 for full-colour image' ); is ( $i[0]->{width}, 60, 'width is right for full-colour image'); is ( $i[0]->{height}, 50, 'height is right for full-colour image'); my $soft_text = "ImageMagick 6.0.6 01/25/06 Q16 http://www.imagemagick.org"; if ( $i[0]->{Software} eq $soft_text ) { ok (1, "Software text tag read correctly" ); } else { ok (0, "Software text tag read correctly" ); my @tagc = split //,$i[0]->{Software}; my @tstc = split //,$soft_text; printf "Tag string is %d characters, Test string is %d characters\n", scalar(@tagc), scalar(@tstc); for (my $i = 0; defined $tagc[$i] or defined $tstc[$i]; $i++) { $tagc[$i] = '[undef]' if ! defined $tagc[$i]; $tstc[$i] = '[undef]' if ! defined $tstc[$i]; if ($tagc[$i] ne $tstc[$i]) { warn sprintf("Strings differ at offset $i (expected: %s / found: %s)\n", $tagc[$i], $tstc[$i]); } } } { my($xres,$yres) = ($i[0]->{XResolution}, $i[0]->{YResolution}); isa_ok $xres, 'Image::TIFF::Rational'; isa_ok $yres, 'Image::TIFF::Rational'; is "$xres", "1207959552/16777216", 'XResolution, stringified'; is "$yres", "1207959552/16777216", 'YResolution, stringified'; } ## Second image is ( $i[1]->{BitsPerSample}, 1, 'BitsPerSample right for 1-bit image' ); is ( $i[1]->{SamplesPerPixel}, 1, 'BitsPerSample right for 1-bit image' ); is ( $i[1]->{Compression}, 'CCITT T6', 'Compression right for 1-bit image' ); is ( $i[1]->{DocumentName}, "bb1bit.tif", "DocumentName text tag read correctly" ); ## Third image is ( $i[2]->{BitsPerSample}, 8, 'Bit depth right for greyscale image' ); is ( $i[2]->{SamplesPerPixel}, 1, 'Bit depth right for greyscale image' ); is ( dim($i[2]), '60x50' , 'dim() function is right for greyscale image' ); is ( $i[2]->{ImageDescription}, "Created with The GIMP", "ImageDescription text tag read correctly" ); 1;